diff options
172 files changed, 1097 insertions, 627 deletions
@@ -6,6 +6,7 @@ For a more comprehensive changelog of the latest experimental code, see: - Added support for 3 Skulls of the Toltecs. - Added support for Eye of the Beholder. - Added support for Eye of the Beholder II: The Legend of Darkmoon. + - Added support for Hopkins FBI. - Added support for Tony Tough and the Night of Roasted Moths. - Added support for The Journeyman Project: Pegasus Prime. - Added support for the Macintosh version of Discworld 1. @@ -76,6 +77,11 @@ For a more comprehensive changelog of the latest experimental code, see: - Handle double-clicking in the Macintosh version of Loom. - Major bugfixes in INSANE (the Full Throttle bike fights). + TOUCHE: + - Added support for Enhanced Music by James Woodcock + (http://www.jameswoodcock.co.uk/category/scummvm-music-enhancement-project/). + + 1.5.0 (2012-07-27) New Games: - Added support for Backyard Baseball 2003. diff --git a/audio/audiostream.cpp b/audio/audiostream.cpp index 2d65d4afef..8bd4b95c49 100644 --- a/audio/audiostream.cpp +++ b/audio/audiostream.cpp @@ -98,6 +98,10 @@ LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops // TODO: Properly indicate error _loops = _completeIterations = 1; } + if (stream->endOfData()) { + // Apparently this is an empty stream + _loops = _completeIterations = 1; + } } int LoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) { @@ -118,6 +122,10 @@ int LoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) { _loops = _completeIterations = 1; return samplesRead; } + if (_parent->endOfData()) { + // Apparently this is an empty stream + _loops = _completeIterations = 1; + } return samplesRead + readBuffer(buffer + samplesRead, remainingSamples); } diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp index f069ee3417..61b0abaaca 100644 --- a/audio/decoders/adpcm.cpp +++ b/audio/decoders/adpcm.cpp @@ -433,7 +433,7 @@ int16 Ima_ADPCMStream::decodeIMA(byte code, int channel) { return samp; } -RewindableAudioStream *makeADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, typesADPCM type, int rate, int channels, uint32 blockAlign) { +RewindableAudioStream *makeADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, ADPCMType type, int rate, int channels, uint32 blockAlign) { // If size is 0, report the entire size of the stream if (!size) size = stream->size(); diff --git a/audio/decoders/adpcm.h b/audio/decoders/adpcm.h index ac8d529917..d3c46574bf 100644 --- a/audio/decoders/adpcm.h +++ b/audio/decoders/adpcm.h @@ -51,7 +51,7 @@ class RewindableAudioStream; // http://wiki.multimedia.cx/index.php?title=Category:ADPCM_Audio_Codecs // Usually, if the audio stream we're trying to play has the FourCC header // string intact, it's easy to discern which encoding is used -enum typesADPCM { +enum ADPCMType { kADPCMOki, // Dialogic/Oki ADPCM (aka VOX) kADPCMMSIma, // Microsoft IMA ADPCM kADPCMMS, // Microsoft ADPCM @@ -76,9 +76,9 @@ enum typesADPCM { RewindableAudioStream *makeADPCMStream( Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, - uint32 size, typesADPCM type, - int rate = 22050, - int channels = 2, + uint32 size, ADPCMType type, + int rate, + int channels, uint32 blockAlign = 0); } // End of namespace Audio diff --git a/audio/mixer.cpp b/audio/mixer.cpp index 965766170d..5ea05174eb 100644 --- a/audio/mixer.cpp +++ b/audio/mixer.cpp @@ -171,9 +171,9 @@ private: #pragma mark --- Mixer --- #pragma mark - - +// TODO: parameter "system" is unused MixerImpl::MixerImpl(OSystem *system, uint sampleRate) - : _syst(system), _mutex(), _sampleRate(sampleRate), _mixerReady(false), _handleSeed(0), _soundTypeSettings() { + : _mutex(), _sampleRate(sampleRate), _mixerReady(false), _handleSeed(0), _soundTypeSettings() { assert(sampleRate > 0); diff --git a/audio/mixer_intern.h b/audio/mixer_intern.h index c6dfa55ada..fce13a9812 100644 --- a/audio/mixer_intern.h +++ b/audio/mixer_intern.h @@ -54,7 +54,6 @@ private: NUM_CHANNELS = 16 }; - OSystem *_syst; Common::Mutex _mutex; const uint _sampleRate; diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp index 99d12c73dc..38a0c8d46f 100644 --- a/backends/events/default/default-events.cpp +++ b/backends/events/default/default-events.cpp @@ -51,6 +51,8 @@ DefaultEventManager::DefaultEventManager(Common::EventSource *boss) : // Reset key repeat _currentKeyDown.keycode = 0; + _currentKeyDown.ascii = 0; + _currentKeyDown.flags = 0; #ifdef ENABLE_VKEYBD _vk = new Common::VirtualKeyboard(); diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp index d48b80c40b..37986520bf 100644 --- a/backends/midi/seq.cpp +++ b/backends/midi/seq.cpp @@ -88,12 +88,9 @@ int MidiDriver_SEQ::open() { device = ::open((device_name), O_RDWR, 0); - if ((device_name == NULL) || (device < 0)) { - if (device_name == NULL) - warning("Opening /dev/null (no music will be heard)"); - else - warning("Cannot open rawmidi device %s - using /dev/null (no music will be heard)", - device_name); + if (device < 0) { + warning("Cannot open rawmidi device %s - using /dev/null (no music will be heard)", + device_name); device = (::open(("/dev/null"), O_RDWR, 0)); if (device < 0) error("Cannot open /dev/null to dump midi output"); diff --git a/common/config-file.cpp b/common/config-file.cpp index fe042e9eda..0ce6dcf0c8 100644 --- a/common/config-file.cpp +++ b/common/config-file.cpp @@ -226,6 +226,15 @@ bool ConfigFile::saveToStream(WriteStream &stream) { return !stream.err(); } +void ConfigFile::addSection(const String §ion) { + Section *s = getSection(section); + if (s) + return; + + Section newSection; + newSection.name = section; + _sections.push_back(newSection); +} void ConfigFile::removeSection(const String §ion) { assert(isValidName(section)); diff --git a/common/config-file.h b/common/config-file.h index 8bd731c038..8bba851110 100644 --- a/common/config-file.h +++ b/common/config-file.h @@ -106,6 +106,7 @@ public: bool saveToStream(WriteStream &stream); bool hasSection(const String §ion) const; + void addSection(const String §ion); void removeSection(const String §ion); void renameSection(const String &oldName, const String &newName); diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 98ffca22ed..f79dfa35c2 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -513,10 +513,7 @@ AgiBase::AgiBase(OSystem *syst, const AGIGameDescription *gameDesc) : Engine(sys AgiBase::~AgiBase() { delete _rnd; - if (_sound) { - _sound->deinitSound(); - delete _sound; - } + delete _sound; } void AgiBase::initRenderMode() { @@ -650,7 +647,6 @@ void AgiEngine::initialize() { _game.sbuf = _game.sbuf16c; // Make sbuf point to the 16 color (+control line & priority info) AGI screen by default _gfx->initVideo(); - _sound->initSound(); _lastSaveTime = 0; diff --git a/engines/agi/loader_v1.cpp b/engines/agi/loader_v1.cpp index 189c98ee98..33e956af41 100644 --- a/engines/agi/loader_v1.cpp +++ b/engines/agi/loader_v1.cpp @@ -254,7 +254,7 @@ int AgiLoader_v1::loadResource(int t, int n) { if (data != NULL) { // Freeing of the raw resource from memory is delegated to the createFromRawResource-function - _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, *_vm->_sound, _vm->_soundemu); + _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, _vm->_soundemu); _vm->_game.dirSound[n].flags |= RES_LOADED; } else { ec = errBadResource; diff --git a/engines/agi/loader_v2.cpp b/engines/agi/loader_v2.cpp index a2ac6f0111..ee69bb5b27 100644 --- a/engines/agi/loader_v2.cpp +++ b/engines/agi/loader_v2.cpp @@ -230,7 +230,7 @@ int AgiLoader_v2::loadResource(int t, int n) { if (data != NULL) { // Freeing of the raw resource from memory is delegated to the createFromRawResource-function - _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, *_vm->_sound, _vm->_soundemu); + _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, _vm->_soundemu); _vm->_game.dirSound[n].flags |= RES_LOADED; } else { ec = errBadResource; diff --git a/engines/agi/loader_v3.cpp b/engines/agi/loader_v3.cpp index 29635f935b..250d8e7615 100644 --- a/engines/agi/loader_v3.cpp +++ b/engines/agi/loader_v3.cpp @@ -314,7 +314,7 @@ int AgiLoader_v3::loadResource(int t, int n) { data = loadVolRes(&_vm->_game.dirSound[n]); if (data != NULL) { // Freeing of the raw resource from memory is delegated to the createFromRawResource-function - _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, *_vm->_sound, _vm->_soundemu); + _vm->_game.sounds[n] = AgiSound::createFromRawResource(data, _vm->_game.dirSound[n].len, n, _vm->_soundemu); _vm->_game.dirSound[n].flags |= RES_LOADED; } else { ec = errBadResource; diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index 9d899b1855..0245f3936a 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -1705,7 +1705,9 @@ void cmdCallV1(AgiGame *state, uint8 *p) { // FIXME: The following instruction looks incomplete. // Maybe something is meant to be assigned to, or read from, // the logic_list entry? - state->logic_list[++state->max_logics]; +// state->logic_list[++state->max_logics]; + // For now, just do the increment, to silence a clang warning + ++state->max_logics; _v[13] = 1; } diff --git a/engines/agi/preagi_winnie.cpp b/engines/agi/preagi_winnie.cpp index 53863a8c7e..06a6988bc5 100644 --- a/engines/agi/preagi_winnie.cpp +++ b/engines/agi/preagi_winnie.cpp @@ -1134,7 +1134,7 @@ bool WinnieEngine::playSound(ENUM_WTP_SOUND iSound) { file.read(data, size); file.close(); - _game.sounds[0] = AgiSound::createFromRawResource(data, size, 0, *_sound, _soundemu); + _game.sounds[0] = AgiSound::createFromRawResource(data, size, 0, _soundemu); _sound->startSound(0, 0); bool cursorShowing = CursorMan.showMouse(false); @@ -1334,7 +1334,6 @@ void WinnieEngine::init() { } _sound = new SoundMgr(this, _mixer); - _sound->initSound(); setflag(fSoundOn, true); // enable sound memset(&_gameStateWinnie, 0, sizeof(_gameStateWinnie)); diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index ca3d799ecc..56c7ebcb0b 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -36,25 +36,25 @@ namespace Agi { // TODO: add support for variable sampling rate in the output device // -AgiSound *AgiSound::createFromRawResource(uint8 *data, uint32 len, int resnum, SoundMgr &manager, int soundemu) { +AgiSound *AgiSound::createFromRawResource(uint8 *data, uint32 len, int resnum, int soundemu) { if (data == NULL || len < 2) // Check for too small resource or no resource at all return NULL; uint16 type = READ_LE_UINT16(data); // For V1 sound resources if (type != AGI_SOUND_SAMPLE && (type & 0xFF) == 0x01) - return new PCjrSound(data, len, resnum, manager); + return new PCjrSound(data, len, resnum); switch (type) { // Create a sound object based on the type case AGI_SOUND_SAMPLE: - return new IIgsSample(data, len, resnum, manager); + return new IIgsSample(data, len, resnum); case AGI_SOUND_MIDI: - return new IIgsMidi(data, len, resnum, manager); + return new IIgsMidi(data, len, resnum); case AGI_SOUND_4CHN: if (soundemu == SOUND_EMU_MIDI) { - return new MIDISound(data, len, resnum, manager); + return new MIDISound(data, len, resnum); } else { - return new PCjrSound(data, len, resnum, manager); + return new PCjrSound(data, len, resnum); } } @@ -62,7 +62,7 @@ AgiSound *AgiSound::createFromRawResource(uint8 *data, uint32 len, int resnum, S return NULL; } -PCjrSound::PCjrSound(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { +PCjrSound::PCjrSound(uint8 *data, uint32 len, int resnum) : AgiSound() { _data = data; // Save the resource pointer _len = len; // Save the resource's length _type = READ_LE_UINT16(data); // Read sound resource's type @@ -167,16 +167,6 @@ void SoundMgr::stopSound() { _endflag = -1; } -int SoundMgr::initSound() { - return -1; -} - -void SoundMgr::deinitSound() { - stopSound(); - - delete _soundGen; -} - void SoundMgr::soundIsFinished() { if (_endflag != -1) _vm->setflag(_endflag, true); @@ -219,6 +209,9 @@ void SoundMgr::setVolume(uint8 volume) { } SoundMgr::~SoundMgr() { + stopSound(); + + delete _soundGen; } } // End of namespace Agi diff --git a/engines/agi/sound.h b/engines/agi/sound.h index 6fd8dd516e..f300af83a3 100644 --- a/engines/agi/sound.h +++ b/engines/agi/sound.h @@ -93,7 +93,7 @@ public: */ class AgiSound { public: - AgiSound(SoundMgr &manager) : _manager(manager), _isPlaying(false), _isValid(false) {} + AgiSound() : _isPlaying(false), _isValid(false) {} virtual ~AgiSound() {} virtual void play() { _isPlaying = true; } virtual void stop() { _isPlaying = false; } @@ -108,17 +108,16 @@ public: * from memory using free() or delegate the responsibility onwards to some other * function! */ - static AgiSound *createFromRawResource(uint8 *data, uint32 len, int resnum, SoundMgr &manager, int soundemu); + static AgiSound *createFromRawResource(uint8 *data, uint32 len, int resnum, int soundemu); protected: - SoundMgr &_manager; ///< AGI sound manager object bool _isPlaying; ///< Is the sound playing? bool _isValid; ///< Is this a valid sound object? }; class PCjrSound : public AgiSound { public: - PCjrSound(uint8 *data, uint32 len, int resnum, SoundMgr &manager); + PCjrSound(uint8 *data, uint32 len, int resnum); ~PCjrSound() { free(_data); } virtual uint16 type() { return _type; } const uint8 *getVoicePointer(uint voiceNum); @@ -140,8 +139,6 @@ public: void unloadSound(int); void playSound(); - int initSound(); - void deinitSound(); void startSound(int, int); void stopSound(); diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index bfc8d4d8f3..f088ad3a01 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -447,7 +447,7 @@ void SoundGen2GS::setProgramChangeMapping(const IIgsMidiProgramMapping *mapping) _progToInst = mapping; } -IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { +IIgsMidi::IIgsMidi(uint8 *data, uint32 len, int resnum) : AgiSound() { _data = data; // Save the resource pointer _ptr = _data + 2; // Set current position to just after the header _len = len; // Save the resource's length @@ -472,7 +472,7 @@ static bool convertWave(Common::SeekableReadStream &source, int8 *dest, uint len return !(source.eos() || source.err()); } -IIgsSample::IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { +IIgsSample::IIgsSample(uint8 *data, uint32 len, int resnum) : AgiSound() { Common::MemoryReadStream stream(data, len, DisposeAfterUse::YES); // Check that the header was read ok and that it's of the correct type diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h index 404f4a47a1..12e7b7b951 100644 --- a/engines/agi/sound_2gs.h +++ b/engines/agi/sound_2gs.h @@ -144,7 +144,7 @@ public: class IIgsMidi : public AgiSound { public: - IIgsMidi(uint8 *data, uint32 len, int resnum, SoundMgr &manager); + IIgsMidi(uint8 *data, uint32 len, int resnum); ~IIgsMidi() { if (_data != NULL) free(_data); } virtual uint16 type() { return _type; } virtual const uint8 *getPtr() { return _ptr; } @@ -161,7 +161,7 @@ public: class IIgsSample : public AgiSound { public: - IIgsSample(uint8 *data, uint32 len, int resnum, SoundMgr &manager); + IIgsSample(uint8 *data, uint32 len, int resnum); ~IIgsSample() { delete[] _sample; } virtual uint16 type() { return _header.type; } const IIgsSampleHeader &getHeader() const { return _header; } diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp index 47d354093b..24e3ca8fb7 100644 --- a/engines/agi/sound_midi.cpp +++ b/engines/agi/sound_midi.cpp @@ -59,7 +59,7 @@ namespace Agi { static uint32 convertSND2MIDI(byte *snddata, byte **data); -MIDISound::MIDISound(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : AgiSound(manager) { +MIDISound::MIDISound(uint8 *data, uint32 len, int resnum) : AgiSound() { _data = data; // Save the resource pointer _len = len; // Save the resource's length _type = READ_LE_UINT16(data); // Read sound resource's type diff --git a/engines/agi/sound_midi.h b/engines/agi/sound_midi.h index 36bd66ee76..ac1b100b12 100644 --- a/engines/agi/sound_midi.h +++ b/engines/agi/sound_midi.h @@ -33,7 +33,7 @@ namespace Agi { class MIDISound : public AgiSound { public: - MIDISound(uint8 *data, uint32 len, int resnum, SoundMgr &manager); + MIDISound(uint8 *data, uint32 len, int resnum); ~MIDISound() { free(_data); } virtual uint16 type() { return _type; } uint8 *_data; ///< Raw sound resource data @@ -61,8 +61,6 @@ public: private: bool _isGM; - - SoundMgr *_manager; }; } // End of namespace Agi diff --git a/engines/agi/wagparser.cpp b/engines/agi/wagparser.cpp index 61feac5d17..8dee6545c0 100644 --- a/engines/agi/wagparser.cpp +++ b/engines/agi/wagparser.cpp @@ -98,7 +98,7 @@ void WagProperty::setDefaults() { } void WagProperty::deleteData() { - delete _propData; + delete[] _propData; _propData = NULL; } diff --git a/engines/cine/console.cpp b/engines/cine/console.cpp index 4af28592e7..46f0ea61d3 100644 --- a/engines/cine/console.cpp +++ b/engines/cine/console.cpp @@ -28,6 +28,7 @@ namespace Cine { bool labyrinthCheat; CineConsole::CineConsole(CineEngine *vm) : GUI::Debugger(), _vm(vm) { + assert(_vm); DCmd_Register("labyrinthCheat", WRAP_METHOD(CineConsole, Cmd_LabyrinthCheat)); labyrinthCheat = false; diff --git a/engines/configure.engines b/engines/configure.engines index db01777a62..a52276130a 100644 --- a/engines/configure.engines +++ b/engines/configure.engines @@ -16,7 +16,7 @@ add_engine dreamweb "Dreamweb" yes add_engine gob "Gobli*ns" yes add_engine groovie "Groovie" yes "groovie2" "7th Guest" add_engine groovie2 "Groovie 2 games" no -add_engine hopkins "Hopkins FBI" no "" "" "16bit" +add_engine hopkins "Hopkins FBI" yes "" "" "16bit" add_engine hugo "Hugo Trilogy" yes add_engine kyra "Kyra" yes "lol eob" "Legend of Kyrandia 1-3" add_engine lol "Lands of Lore" yes diff --git a/engines/draci/console.cpp b/engines/draci/console.cpp index a0013c59fe..07f0ff5542 100644 --- a/engines/draci/console.cpp +++ b/engines/draci/console.cpp @@ -26,6 +26,7 @@ namespace Draci { DraciConsole::DraciConsole(DraciEngine *vm) : GUI::Debugger(), _vm(vm) { + assert(_vm); } DraciConsole::~DraciConsole() { diff --git a/engines/dreamweb/console.cpp b/engines/dreamweb/console.cpp index d415089a48..532bf815ef 100644 --- a/engines/dreamweb/console.cpp +++ b/engines/dreamweb/console.cpp @@ -25,6 +25,7 @@ namespace DreamWeb { DreamWebConsole::DreamWebConsole(DreamWebEngine *vm) : GUI::Debugger(), _vm(vm) { + assert(_vm); } DreamWebConsole::~DreamWebConsole() { diff --git a/engines/gob/hotspots.cpp b/engines/gob/hotspots.cpp index 11b6150626..cd00cd13d7 100644 --- a/engines/gob/hotspots.cpp +++ b/engines/gob/hotspots.cpp @@ -1995,6 +1995,7 @@ bool Hotspots::leaveNthPlain(uint16 n, uint16 startIndex, int16 timeVal, const u // Call the leave and time it startTime = _vm->_util->getTimeKey(); call(spot.funcLeave); + _vm->_inter->animPalette(); callTime = _vm->_util->getTimeKey() - startTime; // Remove the time it took from the time we have available diff --git a/engines/gob/pregob/onceupon/stork.h b/engines/gob/pregob/onceupon/stork.h index 756f5258c7..ae57983000 100644 --- a/engines/gob/pregob/onceupon/stork.h +++ b/engines/gob/pregob/onceupon/stork.h @@ -79,8 +79,6 @@ private: }; - GobEngine *_vm; - Surface *_frame; ANIObject *_bundle; diff --git a/engines/groovie/vdx.h b/engines/groovie/vdx.h index ebe58cb119..a9bfaa1eb4 100644 --- a/engines/groovie/vdx.h +++ b/engines/groovie/vdx.h @@ -62,11 +62,11 @@ private: bool _flagEight; bool _flagNine; - bool _flagSkipStill; + //bool _flagSkipStill; bool _flagSkipPalette; bool _flagFirstFrame; - bool _flagTransparent; - bool _flagUpdateStill; + //bool _flagTransparent; + //bool _flagUpdateStill; void getStill(Common::ReadStream *in); void getDelta(Common::ReadStream *in); diff --git a/engines/hopkins/anim.cpp b/engines/hopkins/anim.cpp index 007197090f..e332d9910f 100644 --- a/engines/hopkins/anim.cpp +++ b/engines/hopkins/anim.cpp @@ -675,42 +675,39 @@ void AnimationManager::playSequence2(const Common::String &file, uint32 rate1, u int frameNumber; Common::File f; - for (;;) { - if (_vm->shouldQuit()) - return; + if (_vm->shouldQuit()) + return; - _vm->_events->_mouseFl = false; - screenP = _vm->_graphicsMan->_backBuffer; + _vm->_events->_mouseFl = false; + screenP = _vm->_graphicsMan->_backBuffer; - if (!f.open(file)) - error("File not found - %s", file.c_str()); + if (!f.open(file)) + error("File not found - %s", file.c_str()); - f.skip(6); - f.read(_vm->_graphicsMan->_palette, 800); - f.skip(4); - size_t nbytes = f.readUint32LE(); - f.skip(14); - f.read(screenP, nbytes); + f.skip(6); + f.read(_vm->_graphicsMan->_palette, 800); + f.skip(4); + size_t nbytes = f.readUint32LE(); + f.skip(14); + f.read(screenP, nbytes); - if (skipSeqFl) { - _vm->_graphicsMan->setPaletteVGA256(_vm->_graphicsMan->_palette); - } else { - _vm->_graphicsMan->setPaletteVGA256(_vm->_graphicsMan->_palette); - _vm->_graphicsMan->display8BitRect(screenP, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + if (skipSeqFl) { + _vm->_graphicsMan->setPaletteVGA256(_vm->_graphicsMan->_palette); + } else { + _vm->_graphicsMan->setPaletteVGA256(_vm->_graphicsMan->_palette); + _vm->_graphicsMan->display8BitRect(screenP, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); - _vm->_graphicsMan->addRefreshRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - _vm->_graphicsMan->updateScreen(); - } - _vm->_events->_rateCounter = 0; - _vm->_events->_escKeyFl = false; - _vm->_soundMan->loadAnimSound(); - if (_vm->_globals->_eventMode == EVENTMODE_IGNORE) { - do { - _vm->_events->refreshEvents(); - _vm->_soundMan->checkSoundEnd(); - } while (!_vm->shouldQuit() && !_vm->_events->_escKeyFl && _vm->_events->_rateCounter < rate1); - } - break; + _vm->_graphicsMan->addRefreshRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + _vm->_graphicsMan->updateScreen(); + } + _vm->_events->_rateCounter = 0; + _vm->_events->_escKeyFl = false; + _vm->_soundMan->loadAnimSound(); + if (_vm->_globals->_eventMode == EVENTMODE_IGNORE) { + do { + _vm->_events->refreshEvents(); + _vm->_soundMan->checkSoundEnd(); + } while (!_vm->shouldQuit() && !_vm->_events->_escKeyFl && _vm->_events->_rateCounter < rate1); } if (!_vm->_events->_escKeyFl) { @@ -760,7 +757,7 @@ void AnimationManager::playSequence2(const Common::String &file, uint32 rate1, u f.seek(6); f.read(_vm->_graphicsMan->_palette, 800); f.skip(4); - size_t nbytes = f.readUint32LE(); + nbytes = f.readUint32LE(); f.skip(14); f.read(screenP, nbytes); diff --git a/engines/hopkins/computer.cpp b/engines/hopkins/computer.cpp index 467153e4dd..253d849286 100644 --- a/engines/hopkins/computer.cpp +++ b/engines/hopkins/computer.cpp @@ -326,13 +326,13 @@ static const char _spanishText[] = "% **** ORDENADOR DEL FBI NUMERO 4985 **** ORDENADOR J.HOPKINS *****\n" "% **** ORDENADOR DEL FBI NUMERO 4998 **** ORDENADOR S.COLLINS *****\n" "% *** ORDENADOR DEL FBI NUMERO 4997 *** ORDENADOR DE ACCESO LIBRE ***\n" -"% LA CONTRASE¥A ES: ALLFREE\n" -"% ESCRIBE CONTRASE¥A ACTUAL\n" +"% LA CONTRASE\0245A ES: ALLFREE\n" +"% ESCRIBE CONTRASE\0245A ACTUAL\n" "% **** ACCESO DENEGADO ****\n" "% 1) *** JUEGO ***\n" "% 0) SALIR DEL ORDENADOR\n" -"% 2) CADAVER EXTRA¥O\n" -"% 3) CADAVER EXTRA¥O\n" +"% 2) CADAVER EXTRA\0245O\n" +"% 3) CADAVER EXTRA\0245O\n" "% 4) SENADOR FERGUSSON\n" "% 5) MATAPERROS\n" "% 2) CIENTIFICO SECUESTRADO.\n" diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp index f978a5803f..c2c8b426e6 100644 --- a/engines/hopkins/graphics.cpp +++ b/engines/hopkins/graphics.cpp @@ -1012,7 +1012,7 @@ void GraphicsManager::endDisplayBob() { _vm->_objectsMan->resetBob(idx); } - for (int idx = 1; idx <= 29; ++idx) { + for (int idx = 1; idx < 36; ++idx) { _vm->_objectsMan->_lockedAnims[idx]._enableFl = false; } diff --git a/engines/hopkins/hopkins.h b/engines/hopkins/hopkins.h index 499f0c466d..b5de387894 100644 --- a/engines/hopkins/hopkins.h +++ b/engines/hopkins/hopkins.h @@ -74,8 +74,6 @@ enum { #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 -#define MAX_LINES 400 - /** * A wrapper macro used around three character constants, like 'END', to * ensure portability. Typical usage: MKTAG24('E','N','D'). diff --git a/engines/hopkins/lines.cpp b/engines/hopkins/lines.cpp index 6603708449..6bb6e0a47b 100644 --- a/engines/hopkins/lines.cpp +++ b/engines/hopkins/lines.cpp @@ -33,10 +33,11 @@ namespace Hopkins { LinesManager::LinesManager(HopkinsEngine *vm) { _vm = vm; - for (int i = 0; i < MAX_LINES; ++i) { + for (int i = 0; i < MAX_LINES + 1; ++i) Common::fill((byte *)&_zoneLine[i], (byte *)&_zoneLine[i] + sizeof(LigneZoneItem), 0); + + for (int i = 0; i < MAX_LINES; ++i) Common::fill((byte *)&_lineItem[i], (byte *)&_lineItem[i] + sizeof(LigneItem), 0); - } for (int i = 0; i < 4000; ++i) Common::fill((byte *)&_smoothRoute[i], (byte *)&_smoothRoute[i] + sizeof(SmoothItem), 0); @@ -208,7 +209,7 @@ void LinesManager::addZoneLine(int idx, int fromX, int fromY, int destX, int des _bobZoneFl[bobZoneIdx] = true; _bobZone[bobZoneIdx] = fromY; } else { - assert (idx <= MAX_LINES); + assert(idx < MAX_LINES + 1); _zoneLine[idx]._zoneData = (int16 *)_vm->_globals->freeMemory((byte *)_zoneLine[idx]._zoneData); int distX = abs(fromX - destX); @@ -252,7 +253,7 @@ void LinesManager::addZoneLine(int idx, int fromX, int fromY, int destX, int des * Add Line */ void LinesManager::addLine(int lineIdx, Directions direction, int fromX, int fromY, int destX, int destY) { - assert (lineIdx <= MAX_LINES); + assert(lineIdx < MAX_LINES); if (_linesNumb < lineIdx) _linesNumb = lineIdx; @@ -265,7 +266,7 @@ void LinesManager::addLine(int lineIdx, Directions direction, int fromX, int fro maxDist = distX; byte *zoneData = _vm->_globals->allocMemory(4 * maxDist + 8); - assert (zoneData); + assert(zoneData); Common::fill(zoneData, zoneData + 4 * maxDist + 8, 0); _lineItem[lineIdx]._lineData = (int16 *)zoneData; @@ -1561,6 +1562,7 @@ int LinesManager::characterRoute(int fromX, int fromY, int destX, int destY, int case DIR_DOWN_RIGHT: curY += 2; curX += 2; + break; case DIR_DOWN: curY += 2; break; @@ -2439,21 +2441,22 @@ int LinesManager::testLine(int paramX, int paramY, int *testValue, int *foundLin for (int idx = _lastLine + 1; idx < _linesNumb + 1; idx++) { lineData = _lineItem[idx]._lineData; lineDataEndIdx = _lineItem[idx]._lineDataEndIdx; - if (lineData) { - if (lineData[0] == paramX && lineData[1] == paramY) { - *testValue = 1; - int posX = lineData[2 * (lineDataEndIdx - 1)]; - int posY = lineData[2 * (lineDataEndIdx - 1) + 1]; - if (_lineItem[idx]._directionRouteInc == DIR_DOWN || _lineItem[idx]._directionRouteInc == DIR_UP) - posY += 2; - if (_lineItem[idx]._directionRouteInc == DIR_RIGHT || _lineItem[idx]._directionRouteDec == DIR_LEFT) - posX += 2; - if (!checkCollisionLine(posX, posY, &collDataIdx, &collLineIdx, 0, _lastLine)) - error("Error in test line"); - *foundLineIdx = collLineIdx; - *foundDataIdx = collDataIdx; - return idx; - } + if (!lineData) + continue; + + if (lineData[0] == paramX && lineData[1] == paramY) { + *testValue = 1; + int posX = lineData[2 * (lineDataEndIdx - 1)]; + int posY = lineData[2 * (lineDataEndIdx - 1) + 1]; + if (_lineItem[idx]._directionRouteInc == DIR_DOWN || _lineItem[idx]._directionRouteInc == DIR_UP) + posY += 2; + if (_lineItem[idx]._directionRouteInc == DIR_RIGHT || _lineItem[idx]._directionRouteDec == DIR_LEFT) + posX += 2; + if (!checkCollisionLine(posX, posY, &collDataIdx, &collLineIdx, 0, _lastLine)) + error("Error in test line"); + *foundLineIdx = collLineIdx; + *foundDataIdx = collDataIdx; + return idx; } if (lineDataEndIdx > 0) { @@ -2693,7 +2696,7 @@ void LinesManager::initSquareZones() { curZone->_maxZoneLineIdx = 0; } - for (int idx = 0; idx < MAX_LINES; ++idx) { + for (int idx = 0; idx < MAX_LINES + 1; ++idx) { int16 *dataP = _zoneLine[idx]._zoneData; if (dataP == NULL) continue; @@ -2776,7 +2779,7 @@ void LinesManager::clearAllZones() { * Remove Zone Line */ void LinesManager::removeZoneLine(int idx) { - assert (idx <= MAX_LINES); + assert(idx < MAX_LINES + 1); _zoneLine[idx]._zoneData = (int16 *)_vm->_globals->freeMemory((byte *)_zoneLine[idx]._zoneData); } @@ -2790,8 +2793,7 @@ void LinesManager::resetLines() { // Remove Line void LinesManager::removeLine(int idx) { - if (idx > MAX_LINES) - error("Attempting to add a line obstacle > MAX_LIGNE."); + assert(idx < MAX_LINES); _lineItem[idx]._lineData = (int16 *)_vm->_globals->freeMemory((byte *)_lineItem[idx]._lineData); } diff --git a/engines/hopkins/lines.h b/engines/hopkins/lines.h index 9e397cca3d..2eeafdac09 100644 --- a/engines/hopkins/lines.h +++ b/engines/hopkins/lines.h @@ -40,6 +40,8 @@ struct LigneZoneItem { #define INVALID_LINE_VALUE 1300 +#define MAX_LINES 400 + struct RouteItem; struct LigneItem { @@ -111,7 +113,7 @@ private: int _pathFindingMaxDepth; SmoothItem _smoothRoute[4000]; Directions _smoothMoveDirection; - LigneZoneItem _zoneLine[401]; + LigneZoneItem _zoneLine[MAX_LINES+1]; SegmentItem _segment[101]; SquareZoneItem _squareZone[101]; int _currentSegmentId; @@ -134,7 +136,7 @@ private: RouteItem *_testRoute0; RouteItem *_testRoute1; int16 *_lineBuf; - LigneItem _lineItem[400]; + LigneItem _lineItem[MAX_LINES]; RouteItem _bestRoute[8001]; int _zoneSkipCount; int _oldMouseZoneId; diff --git a/engines/hopkins/objects.cpp b/engines/hopkins/objects.cpp index f139ee55ab..6a2f4eb9f4 100644 --- a/engines/hopkins/objects.cpp +++ b/engines/hopkins/objects.cpp @@ -41,12 +41,13 @@ ObjectsManager::ObjectsManager(HopkinsEngine *vm) { for (int i = 0; i < 6; ++i) Common::fill((byte *)&_sprite[i], (byte *)&_sprite[i] + sizeof(SpriteItem), 0); - for (int i = 0; i < 36; ++i) + for (int i = 0; i < 36; ++i) { Common::fill((byte *)&_bob[i], (byte *)&_bob[i] + sizeof(BobItem), 0); + Common::fill((byte *)&_lockedAnims[i], (byte *)&_lockedAnims[i] + sizeof(LockAnimItem), 0); + } for (int i = 0; i < 30; ++i) { Common::fill((byte *)&_vBob[i], (byte *)&_vBob[i] + sizeof(VBobItem), 0); - Common::fill((byte *)&_lockedAnims[i], (byte *)&_lockedAnims[i] + sizeof(LockAnimItem), 0); } for (int i = 0; i < 300; ++i) @@ -987,7 +988,7 @@ void ObjectsManager::computeSprite(int idx) { // Before Sort void ObjectsManager::beforeSort(SortMode sortMode, int index, int priority) { ++_sortedDisplayCount; - assert (_sortedDisplayCount <= 48); + assert(_sortedDisplayCount <= 48); _sortedDisplay[_sortedDisplayCount]._sortMode = sortMode; _sortedDisplay[_sortedDisplayCount]._index = index; @@ -1228,7 +1229,7 @@ void ObjectsManager::displayVBob() { * Get Sprite X coordinate */ int ObjectsManager::getSpriteX(int idx) { - assert (idx <= MAX_SPRITE); + assert(idx <= MAX_SPRITE); return _sprite[idx]._spritePos.x; } @@ -1236,7 +1237,7 @@ int ObjectsManager::getSpriteX(int idx) { * Get Sprite Y coordinate */ int ObjectsManager::getSpriteY(int idx) { - assert (idx <= MAX_SPRITE); + assert(idx <= MAX_SPRITE); return _sprite[idx]._spritePos.y; } @@ -1260,12 +1261,12 @@ void ObjectsManager::clearSprite() { } void ObjectsManager::animateSprite(int idx) { - assert (idx <= MAX_SPRITE); + assert(idx <= MAX_SPRITE); _sprite[idx]._animationType = 1; } void ObjectsManager::addStaticSprite(const byte *spriteData, Common::Point pos, int idx, int spriteIndex, int zoomFactor, bool flipFl, int deltaX, int deltaY) { - assert (idx <= MAX_SPRITE); + assert(idx <= MAX_SPRITE); SpriteItem *spr = &_sprite[idx]; spr->_spriteData = spriteData; @@ -1298,7 +1299,7 @@ void ObjectsManager::removeSprite(int idx) { * Set Sprite X coordinate */ void ObjectsManager::setSpriteX(int idx, int xp) { - assert (idx <= MAX_SPRITE); + assert(idx <= MAX_SPRITE); _sprite[idx]._spritePos.x = xp; } @@ -1306,7 +1307,7 @@ void ObjectsManager::setSpriteX(int idx, int xp) { * Set Sprite Y coordinate */ void ObjectsManager::setSpriteY(int idx, int yp) { - assert (idx <= MAX_SPRITE); + assert(idx <= MAX_SPRITE); _sprite[idx]._spritePos.y = yp; } @@ -1314,19 +1315,19 @@ void ObjectsManager::setSpriteY(int idx, int yp) { * Set Sprite Index */ void ObjectsManager::setSpriteIndex(int idx, int spriteIndex) { - assert (idx <= MAX_SPRITE); + assert(idx <= MAX_SPRITE); _sprite[idx]._spriteIndex = spriteIndex; } // Set Sprite Size void ObjectsManager::setSpriteZoom(int idx, int zoomFactor) { - assert (idx <= MAX_SPRITE); + assert(idx <= MAX_SPRITE); if (!_sprite[idx]._rleFl) _sprite[idx]._zoomFactor = zoomFactor; } void ObjectsManager::setFlipSprite(int idx, bool flipFl) { - assert (idx <= MAX_SPRITE); + assert(idx <= MAX_SPRITE); if (!_sprite[idx]._rleFl) _sprite[idx]._flipFl = flipFl; } @@ -3087,6 +3088,7 @@ void ObjectsManager::setBobAnimDataIdx(int idx, int animIdx) { * Set Hopkins animation */ void ObjectsManager::setBobAnimation(int idx) { + assert(idx < 36); BobItem *bob = &_bob[idx]; if (!bob->_disabledAnimationFl) return; @@ -3102,6 +3104,7 @@ void ObjectsManager::setBobAnimation(int idx) { * Stop Hopkins animation */ void ObjectsManager::stopBobAnimation(int idx) { + assert(idx < 36); _bob[idx]._disabledAnimationFl = true; } @@ -3438,6 +3441,7 @@ void ObjectsManager::disableVerb(int idx, int a2) { case 13: case 22: curZone->_verbFl8 = 0; + break; case 14: case 21: case 25: diff --git a/engines/hopkins/objects.h b/engines/hopkins/objects.h index a5e309344b..5f1f5b1f59 100644 --- a/engines/hopkins/objects.h +++ b/engines/hopkins/objects.h @@ -239,7 +239,7 @@ public: byte *_headSprites; SpriteItem _sprite[6]; BobItem _bob[36]; - LockAnimItem _lockedAnims[30]; + LockAnimItem _lockedAnims[36]; bool _charactersEnabledFl; bool _refreshBobMode10Fl; diff --git a/engines/hopkins/script.cpp b/engines/hopkins/script.cpp index 6167ac4c23..941f23442d 100644 --- a/engines/hopkins/script.cpp +++ b/engines/hopkins/script.cpp @@ -65,8 +65,6 @@ int ScriptManager::handleOpcode(const byte *dataP) { mesgId = 639; if (mesgId == 8) mesgId = 637; - if (mesgId == 53) - mesgId = 644; if (mesgId == 557) mesgId = 636; if (mesgId == 51) @@ -99,8 +97,6 @@ int ScriptManager::handleOpcode(const byte *dataP) { mesgId = 646; if (mesgId == 604) mesgId = 647; - if (mesgId == 51) - mesgId = 644; if (mesgId == 607) mesgId = 650; if (mesgId == 605) @@ -1071,6 +1067,7 @@ int ScriptManager::handleOpcode(const byte *dataP) { _vm->_soundMan->playWav(2); playFl = true; } + break; case 6: playFl = false; break; diff --git a/engines/hopkins/sound.cpp b/engines/hopkins/sound.cpp index d8dfba5246..94f90f7971 100644 --- a/engines/hopkins/sound.cpp +++ b/engines/hopkins/sound.cpp @@ -456,10 +456,8 @@ void SoundManager::checkSounds() { void SoundManager::checkVoiceActivity() { // Check the status of each voice. bool hasActiveVoice = false; - for (int i = 0; i < VOICE_COUNT; ++i) { - checkVoiceStatus(i); - hasActiveVoice |= _voice[i]._status; - } + for (int i = 0; i < VOICE_COUNT; ++i) + hasActiveVoice |= checkVoiceStatus(i); if (!hasActiveVoice && _soundFl) { _soundFl = false; @@ -634,8 +632,6 @@ void SoundManager::removeSample(int soundIndex) { stopVoice(1); if (checkVoiceStatus(2)) stopVoice(2); - if (checkVoiceStatus(3)) - stopVoice(3); removeWavSample(soundIndex); _sound[soundIndex]._active = false; } @@ -703,7 +699,6 @@ void SoundManager::playSample(int wavIndex, int voiceMode) { switch (voiceMode) { case 5: - case 8: // Case added to identify the former PLAY_SAMPLE2 calls case 9: if (checkVoiceStatus(1)) @@ -715,11 +710,6 @@ void SoundManager::playSample(int wavIndex, int voiceMode) { stopVoice(1); playWavSample(2, wavIndex); break; - case 7: - if (checkVoiceStatus(3)) - stopVoice(1); - playWavSample(3, wavIndex); - break; default: break; } diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index 9d28e0ac69..bcf06055f8 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -66,6 +66,33 @@ HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(sy _console = new HugoConsole(this); _rnd = 0; + + _screen = NULL; + _mouse = NULL; + _inventory = NULL; + _parser = NULL; + _route = NULL; + _sound = NULL; + _intro = NULL; + _object = NULL; + _text = NULL; + _topMenu = NULL; + _status._storyModeFl = false; + _status._gameOverFl = false; + _status._lookFl = false; + _status._recallFl = false; + _status._newScreenFl = false; + _status._godModeFl = false; + _status._showBoundariesFl = false; + _status._doQuitFl = false; + _status._skipIntroFl = false; + _status._helpFl = false; + _status._tick = 0; + _status._viewState = kViewIntroInit; + _status._song = 0; + _gameType = kGameTypeNone; + _platform = Common::kPlatformUnknown; + _packedFl = false; } HugoEngine::~HugoEngine() { diff --git a/engines/hugo/intro.cpp b/engines/hugo/intro.cpp index f2ae06eb39..505e356049 100644 --- a/engines/hugo/intro.cpp +++ b/engines/hugo/intro.cpp @@ -41,6 +41,7 @@ namespace Hugo { IntroHandler::IntroHandler(HugoEngine *vm) : _vm(vm), _introX(0), _introY(0) { _introXSize = 0; + _introTicks = 0; } IntroHandler::~IntroHandler() { @@ -76,6 +77,7 @@ void IntroHandler::freeIntroData() { } intro_v1d::intro_v1d(HugoEngine *vm) : IntroHandler(vm) { + _introState = 0; } intro_v1d::~intro_v1d() { diff --git a/engines/kyra/darkmoon.cpp b/engines/kyra/darkmoon.cpp index 130fb10df3..a694a4aba5 100644 --- a/engines/kyra/darkmoon.cpp +++ b/engines/kyra/darkmoon.cpp @@ -243,6 +243,17 @@ void DarkMoonEngine::replaceMonster(int unit, uint16 block, int pos, int dir, in if (_monsters[i].flags & 0x40) continue; + // WORKAROUND for bug #3611077 (Dran's dragon transformation sequence triggered prematurely): + // The boss level and the mindflayer level share the same monster data. If you hang around + // long enough in the mindflayer level all 30 monster slots will be used up. When this + // happens it will trigger the dragon transformation sequence when Dran is moved around by script. + // We avoid removing Dran here by prefering monster slots occupied by monsters from another + // sub level. + if (_monsters[i].sub != _currentSub) { + index = i; + break; + } + int dist = getBlockDistance(_monsters[i].block, _currentBlock); if (dist > maxDist) { @@ -261,7 +272,10 @@ void DarkMoonEngine::replaceMonster(int unit, uint16 block, int pos, int dir, in } bool DarkMoonEngine::killMonsterExtra(EoBMonsterInPlay *m) { - if (_currentLevel == 16 && _currentSub == 1 && (_monsterProps[m->type].capsFlags & 4)) { + // WORKAROUND for bug #3611077 (see DarkMoonEngine::replaceMonster()) + // The mindflayers have monster type 0, just like Dran. Using a monster slot occupied by a mindflayer would trigger the dragon transformation + // sequence when all 30 monster slots are used up. We avoid this by checking for m->sub == 1. + if (_currentLevel == 16 && _currentSub == 1 && m->sub == 1 && (_monsterProps[m->type].capsFlags & 4)) { if (m->type) { _playFinale = true; _runFlag = false; diff --git a/engines/kyra/debugger.cpp b/engines/kyra/debugger.cpp index 75981958d6..84f956f28c 100644 --- a/engines/kyra/debugger.cpp +++ b/engines/kyra/debugger.cpp @@ -482,8 +482,13 @@ Debugger_EoB::Debugger_EoB(EoBCoreEngine *vm) : Debugger(vm), _vm(vm) { } void Debugger_EoB::initialize() { - DCmd_Register("import_savefile", WRAP_METHOD(Debugger_EoB, cmd_importSaveFile)); - DCmd_Register("save_original", WRAP_METHOD(Debugger_EoB, cmd_saveOriginal)); + DCmd_Register("import_savefile", WRAP_METHOD(Debugger_EoB, cmd_importSaveFile)); + DCmd_Register("save_original", WRAP_METHOD(Debugger_EoB, cmd_saveOriginal)); + DCmd_Register("list_monsters", WRAP_METHOD(Debugger_EoB, cmd_listMonsters)); + DCmd_Register("show_position", WRAP_METHOD(Debugger_EoB, cmd_showPosition)); + DCmd_Register("set_position", WRAP_METHOD(Debugger_EoB, cmd_setPosition)); + DCmd_Register("open_door", WRAP_METHOD(Debugger_EoB, cmd_openDoor)); + DCmd_Register("close_door", WRAP_METHOD(Debugger_EoB, cmd_closeDoor)); } bool Debugger_EoB::cmd_importSaveFile(int argc, const char **argv) { @@ -558,6 +563,91 @@ bool Debugger_EoB::cmd_saveOriginal(int argc, const char **argv) { return true; } +bool Debugger_EoB::cmd_listMonsters(int, const char **) { + DebugPrintf("\nCurrent level: %d\n----------------------\n\n", _vm->_currentLevel); + DebugPrintf("Id Type Unit Block Position Direction Sub Level Mode Dst.block HP Flags\n--------------------------------------------------------------------------------------------------------------\n"); + + for (int i = 0; i < 30; i++) { + EoBMonsterInPlay *m = &_vm->_monsters[i]; + DebugPrintf("%.02d %.02d %.02d 0x%.04x %d %d %d %.02d 0x%.04x %.03d/%.03d 0x%.02x\n", i, m->type, m->unit, m->block, m->pos, m->dir, m->sub, m->mode, m->dest, m->hitPointsCur, m->hitPointsMax, m->flags); + } + + DebugPrintf("\n"); + + return true; +} + +bool Debugger_EoB::cmd_showPosition(int, const char **) { + DebugPrintf("\nCurrent level: %d\nCurrent Sub Level: %d\nCurrent block: %d (0x%.04x)\nNext block: %d (0x%.04x)\nCurrent direction: %d\n\n", _vm->_currentLevel, _vm->_currentSub, _vm->_currentBlock, _vm->_currentBlock, _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection), _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection), _vm->_currentDirection); + return true; +} + +bool Debugger_EoB::cmd_setPosition(int argc, const char **argv) { + if (argc == 4) { + _vm->_currentBlock = atoi(argv[3]); + int sub = atoi(argv[2]); + int level = atoi(argv[1]); + + int maxLevel = (_vm->game() == GI_EOB1) ? 12 : 16; + if (level < 1 || level > maxLevel) { + DebugPrintf("<level> must be a value from 1 to %d.\n\n", maxLevel); + return true; + } + + if (level != _vm->_currentLevel || sub != _vm->_currentSub) { + _vm->completeDoorOperations(); + _vm->generateTempData(); + _vm->txt()->removePageBreakFlag(); + _vm->screen()->setScreenDim(7); + + _vm->loadLevel(level, sub); + + if (_vm->_dialogueField) + _vm->restoreAfterDialogueSequence(); + } + + _vm->moveParty(_vm->_currentBlock); + + _vm->_sceneUpdateRequired = true; + _vm->gui_drawAllCharPortraitsWithStats(); + DebugPrintf("Success.\n\n"); + + } else { + DebugPrintf("Syntax: set_position <level>, <sub level>, <block>\n"); + DebugPrintf(" (Warning: The sub level and block position parameters will not be checked. Invalid parameters may cause problems.)\n\n"); + } + return true; +} + +bool Debugger_EoB::cmd_openDoor(int, const char **) { + DebugPrintf("Warning: Using this command may cause glitches.\n"); + uint16 block = _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection); + int c = (_vm->_wllWallFlags[_vm->_levelBlockProperties[block].walls[0]] & 8) ? 0 : 1; + int v = _vm->_levelBlockProperties[block].walls[c]; + int flg = (_vm->_flags.gameID == GI_EOB1) ? 1 : 0x10; + if (_vm->_wllWallFlags[v] & flg) { + DebugPrintf("Couldn't open any door. Make sure you're facing the door you wish to open and standing right in front of it.\n\n"); + } else { + _vm->openDoor(block); + DebugPrintf("Trying to open door at block %d.\n\n", block); + } + return true; +} + +bool Debugger_EoB::cmd_closeDoor(int, const char **) { + DebugPrintf("Warning: Using this command may cause glitches.\n"); + uint16 block = _vm->calcNewBlockPosition(_vm->_currentBlock, _vm->_currentDirection); + int c = (_vm->_wllWallFlags[_vm->_levelBlockProperties[block].walls[0]] & 8) ? 0 : 1; + int v = _vm->_levelBlockProperties[block].walls[c]; + if ((_vm->_flags.gameID == GI_EOB1 && !(_vm->_wllWallFlags[v] & 1)) || (_vm->_flags.gameID == GI_EOB2 && (_vm->_wllWallFlags[v] & 0x20))) { + DebugPrintf("Couldn't close any door. Make sure you're facing the door you wish to open and standing right in front of it.\n\n"); + } else { + _vm->closeDoor(block); + DebugPrintf("Trying to close door at block %d.\n\n", block); + } + return true; +} + #endif // ENABLE_EOB } // End of namespace Kyra diff --git a/engines/kyra/debugger.h b/engines/kyra/debugger.h index e4ab39102a..76264ec8e2 100644 --- a/engines/kyra/debugger.h +++ b/engines/kyra/debugger.h @@ -121,6 +121,11 @@ protected: bool cmd_importSaveFile(int argc, const char **argv); bool cmd_saveOriginal(int argc, const char **argv); + bool cmd_listMonsters(int argc, const char **argv); + bool cmd_showPosition(int argc, const char **argv); + bool cmd_setPosition(int argc, const char **argv); + bool cmd_openDoor(int argc, const char **argv); + bool cmd_closeDoor(int argc, const char **argv); }; #endif // ENABLE_EOB diff --git a/engines/kyra/eob.cpp b/engines/kyra/eob.cpp index 1fb4d0a790..05b1e03b96 100644 --- a/engines/kyra/eob.cpp +++ b/engines/kyra/eob.cpp @@ -338,6 +338,14 @@ void EoBEngine::replaceMonster(int unit, uint16 block, int pos, int dir, int typ } } +bool EoBEngine::killMonsterExtra(EoBMonsterInPlay *m) { + if (m->type == 21) { + _playFinale = true; + _runFlag = false; + } + return true; +} + void EoBEngine::updateScriptTimersExtra() { int cnt = 0; for (int i = 1; i < 30; i++) { diff --git a/engines/kyra/eob.h b/engines/kyra/eob.h index bf5440b942..b423b0da9d 100644 --- a/engines/kyra/eob.h +++ b/engines/kyra/eob.h @@ -74,6 +74,7 @@ private: // Monsters void replaceMonster(int unit, uint16 block, int d, int dir, int type, int shpIndex, int mode, int h2, int randItem, int fixedItem); + bool killMonsterExtra(EoBMonsterInPlay *m); void updateScriptTimersExtra(); // Level diff --git a/engines/kyra/eobcommon.h b/engines/kyra/eobcommon.h index 1a74321364..6421159dbe 100644 --- a/engines/kyra/eobcommon.h +++ b/engines/kyra/eobcommon.h @@ -487,7 +487,7 @@ protected: void placeMonster(EoBMonsterInPlay *m, uint16 block, int dir); virtual void replaceMonster(int b, uint16 block, int pos, int dir, int type, int shpIndex, int mode, int h2, int randItem, int fixedItem) = 0; void killMonster(EoBMonsterInPlay *m, bool giveExperience); - virtual bool killMonsterExtra(EoBMonsterInPlay *m); + virtual bool killMonsterExtra(EoBMonsterInPlay *m) = 0; int countSpecificMonsters(int type); void updateAttackingMonsterFlags(); diff --git a/engines/kyra/scene_eob.cpp b/engines/kyra/scene_eob.cpp index 45de232cb6..cfac5db8b3 100644 --- a/engines/kyra/scene_eob.cpp +++ b/engines/kyra/scene_eob.cpp @@ -86,6 +86,10 @@ void EoBCoreEngine::loadLevel(int level, int sub) { pos += 2; } + // WORKAROUND for bug #3596547 (EOB1: Door Buttons Don't Work) + if (_flags.gameID == GI_EOB1 && level == 7 && _levelBlockProperties[0x035C].assignedObjects == 0x0E89) + _levelBlockProperties[0x035C].assignedObjects = 0x0E8D; + loadVcnData(gfxFile.c_str(), (_flags.gameID == GI_EOB1) ? _cgaMappingLevel[_cgaLevelMappingIndex[level - 1]] : 0); _screen->loadEoBBitmap("INVENT", _cgaMappingInv, 5, 3, 2); delayUntil(end); diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index c8618bc3bb..154606d46f 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -315,7 +315,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight if (_lastSpecialColor == 1) _lastSpecialColor = 0x44; else if (_lastSpecialColor == 0x66) - _lastSpecialColor = file ? (scumm_stricmp(file, "YVEL2") ? 0xCC : 0x44) : 0x44; + _lastSpecialColor = scumm_stricmp(_lastBlockDataFile, "YVEL2") ? 0xCC : 0x44; else if (_lastSpecialColor == 0x6B) _lastSpecialColor = 0xCC; else diff --git a/engines/kyra/scene_rpg.cpp b/engines/kyra/scene_rpg.cpp index 6d724efed0..927d891a5f 100644 --- a/engines/kyra/scene_rpg.cpp +++ b/engines/kyra/scene_rpg.cpp @@ -563,9 +563,9 @@ void KyraRpgEngine::openCloseDoor(int block, int openClose) { int c = (_wllWallFlags[_levelBlockProperties[block].walls[0]] & 8) ? 0 : 1; int v = _levelBlockProperties[block].walls[c]; - int flg = (openClose == 1) ? 0x10 : (openClose == -1 ? 0x20 : 0); + int flg = (_flags.gameID == GI_EOB1) ? 1 : ((openClose == 1) ? 0x10 : (openClose == -1 ? 0x20 : 0)); - if (_wllWallFlags[v] & flg) + if ((_flags.gameID == GI_EOB1 && openClose == -1 && !(_wllWallFlags[v] & flg)) || (!(_flags.gameID == GI_EOB1 && openClose == -1) && (_wllWallFlags[v] & flg))) return; for (int i = 0; i < 3; i++) { diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp index b93b42fa9c..fc6e92abd9 100644 --- a/engines/kyra/sound_midi.cpp +++ b/engines/kyra/sound_midi.cpp @@ -323,7 +323,7 @@ void MidiOutput::setSourceVolume(int source, int volume, bool apply) { for (int i = 0; i < 16; ++i) { // Controller 0 in the state table should always be '7' aka // volume control - byte realVol = (_channels[i].controllers[0].value * volume) >> 8; + byte realVol = (_sources[source].controllers[i][0].value * volume) >> 8; sendIntern(0xB0, i, 0x07, realVol); } } diff --git a/engines/kyra/sprites_eob.cpp b/engines/kyra/sprites_eob.cpp index 1d4c143185..b96f2eca08 100644 --- a/engines/kyra/sprites_eob.cpp +++ b/engines/kyra/sprites_eob.cpp @@ -213,20 +213,11 @@ void EoBCoreEngine::killMonster(EoBMonsterInPlay *m, bool giveExperience) { if (killMonsterExtra(m)) { placeMonster(m, 0, -1); - if ((_flags.gameID == GI_EOB1) && (m->type == 21)) { - _playFinale = true; - _runFlag = false; - } - if (m->mode == 8) updateAttackingMonsterFlags(); } } -bool EoBCoreEngine::killMonsterExtra(EoBMonsterInPlay *) { - return true; -} - int EoBCoreEngine::countSpecificMonsters(int type) { int res = 0; for (int i = 0; i < 30; i++) { diff --git a/engines/made/console.cpp b/engines/made/console.cpp index c835988788..0076b6a4f9 100644 --- a/engines/made/console.cpp +++ b/engines/made/console.cpp @@ -26,6 +26,7 @@ namespace Made { MadeConsole::MadeConsole(MadeEngine *vm) : GUI::Debugger(), _vm(vm) { + assert(_vm); } MadeConsole::~MadeConsole() { diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h index 87635bfc6a..0d5dc1a405 100644 --- a/engines/mohawk/detection_tables.h +++ b/engines/mohawk/detection_tables.h @@ -1361,6 +1361,23 @@ static const MohawkGameDescription gameDescriptions[] = { "GRANDMA.EXE" }, + // Just Grandma and Me 1.1 Mac + // From eisnerguy1 in bug#3610725 + { + { + "grandma", + "v1.1", + AD_ENTRY1("BookOutline", "76eb265ec5fe42bc5b07f2bb418bd871"), + Common::EN_ANY, + Common::kPlatformMacintosh, + ADGF_NO_FLAGS, + GUIO1(GUIO_NOASPECT) + }, + GType_LIVINGBOOKSV1, + 0, + 0 + }, + // from jjnryan in bug #3389857 { { diff --git a/engines/mohawk/livingbooks.cpp b/engines/mohawk/livingbooks.cpp index 2b0a45d4e6..a8b8c6a5d3 100644 --- a/engines/mohawk/livingbooks.cpp +++ b/engines/mohawk/livingbooks.cpp @@ -245,6 +245,8 @@ Common::Error MohawkEngine_LivingBooks::run() { case Common::KEYCODE_ESCAPE: if (_curMode == kLBIntroMode) tryLoadPageStart(kLBControlMode, 1); + else + _video->stopVideos(); break; case Common::KEYCODE_LEFT: @@ -1356,8 +1358,9 @@ void MohawkEngine_LivingBooks::handleNotify(NotifyEvent &event) { if (!loadPage((LBMode)event.newMode, event.newPage, event.newSubpage)) { if (event.newPage != 0 || !loadPage((LBMode)event.newMode, _curPage, event.newSubpage)) if (event.newSubpage != 0 || !loadPage((LBMode)event.newMode, event.newPage, 1)) - error("kLBNotifyChangeMode failed to move to mode %d, page %d.%d", - event.newMode, event.newPage, event.newSubpage); + if (event.newSubpage != 1 || !loadPage((LBMode)event.newMode, event.newPage, 0)) + error("kLBNotifyChangeMode failed to move to mode %d, page %d.%d", + event.newMode, event.newPage, event.newSubpage); } break; case 3: @@ -3775,7 +3778,7 @@ LBMovieItem::~LBMovieItem() { void LBMovieItem::update() { if (_playing) { VideoHandle videoHandle = _vm->_video->findVideoHandle(_resourceId); - if (_vm->_video->endOfVideo(videoHandle)) + if (videoHandle == NULL_VID_HANDLE || _vm->_video->endOfVideo(videoHandle)) done(true); } @@ -3785,6 +3788,7 @@ void LBMovieItem::update() { bool LBMovieItem::togglePlaying(bool playing, bool restart) { if (playing) { if ((_loaded && _enabled && _globalEnabled) || _phase == kLBPhaseNone) { + debug("toggled video for phase %d", _phase); _vm->_video->playMovie(_resourceId, _rect.left, _rect.top); return true; diff --git a/engines/mohawk/livingbooks_code.cpp b/engines/mohawk/livingbooks_code.cpp index bb8f7a0d05..c45efb2c39 100644 --- a/engines/mohawk/livingbooks_code.cpp +++ b/engines/mohawk/livingbooks_code.cpp @@ -519,9 +519,17 @@ void LBCode::parseMain() { *val = _stack.pop(); _stack.push(*val); } else - _stack.push(LBValue()); - } else if (_currToken == kTokenAndEquals) { - debugN(" &= "); + error("assignment failed, no dest"); +// _stack.push(LBValue()); + } else if (_currToken == kTokenPlusEquals || _currToken == kTokenMinusEquals || _currToken == kTokenAndEquals) { + // FIXME: do +=/-= belong here? + byte token = _currToken; + if (_currToken == kTokenPlusEquals) + debugN(" += "); + else if (_currToken == kTokenMinusEquals) + debugN(" -= "); + else if (_currToken == kTokenAndEquals) + debugN(" &= "); nextToken(); parseStatement(); if (!_stack.size()) @@ -532,9 +540,19 @@ void LBCode::parseMain() { else val = &_vm->_variables[varname]; if (val) { - if (val->type != kLBValueString) - error("operator &= used on non-string"); - val->string = val->string + _stack.pop().toString(); + if (token == kTokenAndEquals) { + if (val->type != kLBValueString) + error("operator &= used on non-string"); + val->string = val->string + _stack.pop().toString(); + } else { + // FIXME: non-integers + if (val->type != kLBValueInteger) + error("operator used on non-integer"); + if (token == kTokenPlusEquals) + val->integer = val->integer + _stack.pop().toInt(); + else + val->integer = val->integer - _stack.pop().toInt(); + } _stack.push(*val); } else _stack.push(LBValue()); @@ -581,6 +599,7 @@ void LBCode::parseMain() { debugN("--"); nextToken(); + // FIXME: do we need to handle indexing? if (_currToken != kTokenIdentifier) error("expected identifier"); assert(_currValue.type == kLBValueString); @@ -669,6 +688,24 @@ void LBCode::parseMain() { _stack.push(_stack.pop().isZero() ? 1 : 0); break; + case kTokenEval: + // FIXME: original token? + debugN(".."); + nextToken(); + parseStatement(); + if (!_stack.size()) + error("eval op failed"); + { + // FIXME: XXX + LBValue in = _stack.pop(); + if (in.type != kLBValueString) + error("eval op on non-string"); + Common::String varname = in.string; + LBValue &val = _vm->_variables[varname]; + _stack.push(val); + } + break; + case kTokenGeneralCommand: runGeneralCommand(); break; @@ -692,9 +729,7 @@ void LBCode::parseMain() { assert(val.isNumeric()); // FIXME if (prefix == kTokenMinus) - val.integer--; - else - val.integer++; + val.integer = -val.integer; _stack.push(val); } } @@ -1554,12 +1589,32 @@ uint LBCode::nextFreeString() { error("nextFreeString couldn't find a space"); } +static const char *const functionNameAliases[][2] = { + { "makerect", "getRect" }, + { "makepair", "makePt" }, + { "getframerect", "getFrameBounds" }, + { "dragbegin", "dragBeginFrom" }, + { "x", "xpos" }, + { "y", "ypos" } +}; + /* * Helper function for parseCode: * Given a name, appends the appropriate data to the provided code array and * returns true if it's a function, or false otherwise. */ -bool LBCode::parseCodeSymbol(const Common::String &name, uint &pos, Common::Array<byte> &code) { +bool LBCode::parseCodeSymbol(Common::String name, uint &pos, Common::Array<byte> &code, bool useAllAliases) { + // Check to see if we have one of the older function names + // and remap it to the newer function names + for (uint i = 0; i < ARRAYSIZE(functionNameAliases); i++) { + if (name.equalsIgnoreCase(functionNameAliases[i][0])) { + if (name.size() == 1 && !useAllAliases) + continue; + name = functionNameAliases[i][1]; + break; + } + } + // first, check whether the name matches a known function for (uint i = 0; i < 2; i++) { byte cmdToken; @@ -1770,7 +1825,7 @@ uint LBCode::parseCode(const Common::String &source) { break; tempString += source[pos++]; } - wasFunction = parseCodeSymbol(tempString, pos, code); + wasFunction = parseCodeSymbol(tempString, pos, code, true); if (!wasFunction) error("while parsing script '%s', encountered explicit function call to unknown function '%s'", source.c_str(), tempString.c_str()); @@ -1805,7 +1860,7 @@ uint LBCode::parseCode(const Common::String &source) { } else if (tempString.equalsIgnoreCase("false")) { code.push_back(kTokenFalse); } else { - wasFunction = parseCodeSymbol(tempString, pos, code); + wasFunction = parseCodeSymbol(tempString, pos, code, false); } } else { error("while parsing script '%s', couldn't parse '%c'", source.c_str(), token); diff --git a/engines/mohawk/livingbooks_code.h b/engines/mohawk/livingbooks_code.h index 47dd90f814..c9d9ae06e6 100644 --- a/engines/mohawk/livingbooks_code.h +++ b/engines/mohawk/livingbooks_code.h @@ -188,6 +188,7 @@ enum { kTokenConstEventId = 0x42, kTokenConstScriptOpcode = 0x43, // ?? kTokenConstScriptParam = 0x44, // ?? + kTokenEval = 0x4b, kTokenGeneralCommand = 0x4d, kTokenItemCommand = 0x4e, kTokenNotifyCommand = 0x4f, @@ -242,7 +243,7 @@ protected: void runNotifyCommand(); uint nextFreeString(); - bool parseCodeSymbol(const Common::String &name, uint &pos, Common::Array<byte> &code); + bool parseCodeSymbol(Common::String name, uint &pos, Common::Array<byte> &code, bool useAllAliases); public: void cmdUnimplemented(const Common::Array<LBValue> ¶ms); diff --git a/engines/mohawk/livingbooks_lbx.cpp b/engines/mohawk/livingbooks_lbx.cpp index 9628e06294..2b8b22ec81 100644 --- a/engines/mohawk/livingbooks_lbx.cpp +++ b/engines/mohawk/livingbooks_lbx.cpp @@ -48,8 +48,10 @@ LBXDataFile::~LBXDataFile() { enum { kLBXDataFileOpen = 1, + kLBXDataFileAddSection = 3, kLBXDataFileGetSectionList = 4, kLBXDataFileSetCurSection = 5, + kLBXDataFileSetKey = 7, kLBXDataFileLoadCurSectionVars = 8, kLBXDataFileDeleteCurSection = 10, kLBXDataFileSectionExists = 14 @@ -64,6 +66,14 @@ bool LBXDataFile::call(uint callId, const Common::Array<LBValue> ¶ms, LBValu open(params[0].toString()); return false; + case kLBXDataFileAddSection: + if (params.size() != 1) + error("incorrect number of parameters (%d) to LBXDataFile::addSection", params.size()); + + _dataFile.addSection(params[0].toString()); + _curSection = params[0].toString(); + return false; + case kLBXDataFileGetSectionList: { Common::SharedPtr<LBList> list = Common::SharedPtr<LBList>(new LBList); @@ -81,6 +91,13 @@ bool LBXDataFile::call(uint callId, const Common::Array<LBValue> ¶ms, LBValu _curSection = params[0].toString(); return false; + case kLBXDataFileSetKey: + if (params.size() != 2) + error("incorrect number of parameters (%d) to LBXDataFile::setKey", params.size()); + + _dataFile.setKey(params[0].toString(), _curSection, params[1].toString()); + return false; + case kLBXDataFileLoadCurSectionVars: if (params.size() != 0) error("incorrect number of parameters (%d) to LBXDataFile::loadCurSectionVars", params.size()); diff --git a/engines/mohawk/view.cpp b/engines/mohawk/view.cpp index 36e8f8466e..719c288af5 100644 --- a/engines/mohawk/view.cpp +++ b/engines/mohawk/view.cpp @@ -361,8 +361,8 @@ void View::idleView() { void View::setModule(Module *module) { if (_currentModule) { - module->shutdown(); - delete module; + _currentModule->shutdown(); + delete _currentModule; } _currentModule = NULL; diff --git a/engines/parallaction/gfxbase.cpp b/engines/parallaction/gfxbase.cpp index a9889cc7af..e2d9532c8a 100644 --- a/engines/parallaction/gfxbase.cpp +++ b/engines/parallaction/gfxbase.cpp @@ -31,7 +31,7 @@ namespace Parallaction { GfxObj::GfxObj(uint objType, Frames *frames, const char* name) : - _frames(frames), _keep(true), x(0), y(0), z(0), _prog(0), _flags(0), + _frames(frames), x(0), y(0), z(0), _prog(0), _flags(0), type(objType), frame(0), layer(3), scale(100), _hasMask(false), _hasPath(false) { if (name) { diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h index e9daabb194..55c1c0c04e 100644 --- a/engines/parallaction/graphics.h +++ b/engines/parallaction/graphics.h @@ -289,8 +289,6 @@ class GfxObj { char *_name; Frames *_frames; - bool _keep; - public: int16 x, y; diff --git a/engines/queen/input.cpp b/engines/queen/input.cpp index 30bf681e63..dd10e7ad46 100644 --- a/engines/queen/input.cpp +++ b/engines/queen/input.cpp @@ -50,12 +50,12 @@ const Verb Input::_verbKeys[] = { VERB_USE }; -Input::Input(Common::Language language, OSystem *system, QueenEngine *vm) : +Input::Input(Common::Language language, OSystem *system) : _system(system), _eventMan(system->getEventManager()), _fastMode(false), _keyVerb(VERB_NONE), _cutawayRunning(false), _canQuit(false), _cutawayQuit(false), _dialogueRunning(false), _talkQuit(false), _quickSave(false), _quickLoad(false), _debugger(false), _inKey(Common::KEYCODE_INVALID), - _mouseButton(0), _idleTime(0) , _vm(vm) { + _mouseButton(0), _idleTime(0) { switch (language) { case Common::EN_ANY: diff --git a/engines/queen/input.h b/engines/queen/input.h index b3bf811cd1..f04ecb24f7 100644 --- a/engines/queen/input.h +++ b/engines/queen/input.h @@ -46,7 +46,7 @@ public: MOUSE_RBUTTON = 2 }; - Input(Common::Language language, OSystem *system, QueenEngine *vm); + Input(Common::Language language, OSystem *system); void delay(uint amount); @@ -96,8 +96,6 @@ private: Common::EventManager *_eventMan; - QueenEngine *_vm; - //! some cutaways require update() run faster bool _fastMode; diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp index c403536e22..08fc594560 100644 --- a/engines/queen/queen.cpp +++ b/engines/queen/queen.cpp @@ -500,7 +500,7 @@ Common::Error QueenEngine::run() { _display = new Display(this, _system); _graphics = new Graphics(this); _grid = new Grid(this); - _input = new Input(_resource->getLanguage(), _system, this); + _input = new Input(_resource->getLanguage(), _system); if (_resource->isDemo()) { _logic = new LogicDemo(this); diff --git a/engines/queen/talk.h b/engines/queen/talk.h index 68196784b1..cba77cc255 100644 --- a/engines/queen/talk.h +++ b/engines/queen/talk.h @@ -88,8 +88,6 @@ private: QueenEngine *_vm; - bool _wasFullscren; - //! Raw .dog file data (without 20 byte header) byte *_fileData; diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp index 342fa95eda..7e6c112b9f 100644 --- a/engines/sci/engine/klists.cpp +++ b/engines/sci/engine/klists.cpp @@ -801,7 +801,8 @@ reg_t kArray(EngineState *s, int argc, reg_t *argv) { #endif return NULL_REG; } - if (s->_segMan->getSegmentObj(argv[1].getSegment())->getType() != SEG_TYPE_ARRAY) + SegmentObj *sobj = s->_segMan->getSegmentObj(argv[1].getSegment()); + if (!sobj || sobj->getType() != SEG_TYPE_ARRAY) error("kArray(Dup): Request to duplicate a segment which isn't an array"); reg_t arrayHandle; diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index c928cf3569..5273ed3648 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -23,6 +23,7 @@ #include "sci/sci.h" #include "sci/engine/script.h" #include "sci/engine/state.h" +#include "sci/engine/features.h" #include "common/util.h" @@ -590,6 +591,34 @@ const uint16 kq5PatchWitchCageInit[] = { PATCH_END }; + +// In the final battle, the DOS version uses signals in the music to handle +// timing, while in the Windows version another method is used and the GM +// tracks do not contain these signals. +// The original kq5 interpreter used global 400 to distinguish between +// Windows (1) and DOS (0) versions. +// We replace the 4 relevant checks for global 400 by a fixed true when +// we use these GM tracks. +// +// Instead, we could have set global 400, but this has the possibly unwanted +// side effects of switching to black&white cursors (which also needs complex +// changes to GameFeatures::detectsetCursorType() ) and breaking savegame +// compatibilty between the DOS and Windows CD versions of KQ5. +// TODO: Investigate these side effects more closely. +const byte kq5SignatureWinGMSignals[] = { + 9, + 0x80, 0x90, 0x01, // lag 0x190 + 0x18, // not + 0x30, 0x1b, 0x00, // bnt +0x001B + 0x89, 0x57, // lsg 0x57 + 0 +}; + +const uint16 kq5PatchWinGMSignals[] = { + 0x34, 0x01, 0x00, // ldi 0x0001 + PATCH_END +}; + // script, description, magic DWORD, adjust const SciScriptSignature kq5Signatures[] = { { 0, "CD: harpy volume change", 1, PATCH_MAGICDWORD(0x80, 0x91, 0x01, 0x18), 0, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume }, @@ -597,6 +626,13 @@ const SciScriptSignature kq5Signatures[] = { SCI_SIGNATUREENTRY_TERMINATOR }; +const SciScriptSignature kq5WinGMSignatures[] = { + { 0, "CD: harpy volume change", 1, PATCH_MAGICDWORD(0x80, 0x91, 0x01, 0x18), 0, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume }, + { 200, "CD: witch cage init", 1, PATCH_MAGICDWORD(0x7a, 0x00, 0xc8, 0x00), -10, kq5SignatureWitchCageInit, kq5PatchWitchCageInit }, + { 124, "Win: GM Music signal checks", 4, PATCH_MAGICDWORD(0x80, 0x90, 0x01, 0x18), 0, kq5SignatureWinGMSignals, kq5PatchWinGMSignals }, + SCI_SIGNATUREENTRY_TERMINATOR +}; + // =========================================================================== // When giving the milk bottle to one of the babies in the garden in KQ6 (room // 480), script 481 starts a looping baby cry sound. However, that particular @@ -1317,7 +1353,11 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uin signatureTable = gk1Signatures; break; case GID_KQ5: - signatureTable = kq5Signatures; + // See the explanation in the kq5SignatureWinGMSignals comment + if (g_sci->_features->useAltWinGMSound()) + signatureTable = kq5WinGMSignatures; + else + signatureTable = kq5Signatures; break; case GID_KQ6: signatureTable = kq6Signatures; diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp index 70dff15a86..b42063b119 100644 --- a/engines/sci/graphics/compare.cpp +++ b/engines/sci/graphics/compare.cpp @@ -37,8 +37,8 @@ namespace Sci { -GfxCompare::GfxCompare(SegManager *segMan, Kernel *kernel, GfxCache *cache, GfxScreen *screen, GfxCoordAdjuster *coordAdjuster) - : _segMan(segMan), _kernel(kernel), _cache(cache), _screen(screen), _coordAdjuster(coordAdjuster) { +GfxCompare::GfxCompare(SegManager *segMan, GfxCache *cache, GfxScreen *screen, GfxCoordAdjuster *coordAdjuster) + : _segMan(segMan), _cache(cache), _screen(screen), _coordAdjuster(coordAdjuster) { } GfxCompare::~GfxCompare() { diff --git a/engines/sci/graphics/compare.h b/engines/sci/graphics/compare.h index 91e3b90fdb..0080406a3b 100644 --- a/engines/sci/graphics/compare.h +++ b/engines/sci/graphics/compare.h @@ -34,7 +34,7 @@ class Screen; */ class GfxCompare { public: - GfxCompare(SegManager *segMan, Kernel *kernel, GfxCache *cache, GfxScreen *screen, GfxCoordAdjuster *coordAdjuster); + GfxCompare(SegManager *segMan, GfxCache *cache, GfxScreen *screen, GfxCoordAdjuster *coordAdjuster); ~GfxCompare(); uint16 kernelOnControl(byte screenMask, const Common::Rect &rect); @@ -47,7 +47,6 @@ public: private: SegManager *_segMan; - Kernel *_kernel; GfxCache *_cache; GfxScreen *_screen; GfxCoordAdjuster *_coordAdjuster; diff --git a/engines/sci/graphics/controls32.cpp b/engines/sci/graphics/controls32.cpp index 5535a7408a..5b61e1a86a 100644 --- a/engines/sci/graphics/controls32.cpp +++ b/engines/sci/graphics/controls32.cpp @@ -35,8 +35,8 @@ namespace Sci { -GfxControls32::GfxControls32(SegManager *segMan, GfxCache *cache, GfxScreen *screen, GfxText32 *text) - : _segMan(segMan), _cache(cache), _screen(screen), _text(text) { +GfxControls32::GfxControls32(SegManager *segMan, GfxCache *cache, GfxText32 *text) + : _segMan(segMan), _cache(cache), _text(text) { } GfxControls32::~GfxControls32() { diff --git a/engines/sci/graphics/controls32.h b/engines/sci/graphics/controls32.h index 68dca59462..1b705988c2 100644 --- a/engines/sci/graphics/controls32.h +++ b/engines/sci/graphics/controls32.h @@ -34,7 +34,7 @@ class GfxText32; */ class GfxControls32 { public: - GfxControls32(SegManager *segMan, GfxCache *cache, GfxScreen *screen, GfxText32 *text); + GfxControls32(SegManager *segMan, GfxCache *cache, GfxText32 *text); ~GfxControls32(); void kernelTexteditChange(reg_t controlObject); @@ -42,7 +42,6 @@ public: private: SegManager *_segMan; GfxCache *_cache; - GfxScreen *_screen; GfxText32 *_text; }; diff --git a/engines/sci/graphics/coordadjuster.h b/engines/sci/graphics/coordadjuster.h index 63f608be6b..25279b34b1 100644 --- a/engines/sci/graphics/coordadjuster.h +++ b/engines/sci/graphics/coordadjuster.h @@ -71,8 +71,6 @@ public: private: GfxPorts *_ports; - - Port *backuppedPort; }; #ifdef ENABLE_SCI32 diff --git a/engines/sci/graphics/fontsjis.h b/engines/sci/graphics/fontsjis.h index c4ae4ab580..ae5eaa43f9 100644 --- a/engines/sci/graphics/fontsjis.h +++ b/engines/sci/graphics/fontsjis.h @@ -50,9 +50,6 @@ private: GuiResourceId _resourceId; Graphics::FontSJIS *_commonFont; - - byte _lastForDoubleByteWidth; - byte _lastForDoubleByteDraw; }; } // End of namespace Sci diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index d20aa80c77..25b373a011 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -41,8 +41,8 @@ namespace Sci { -GfxPaint16::GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio) - : _resMan(resMan), _segMan(segMan), _kernel(kernel), _cache(cache), _ports(ports), _coordAdjuster(coordAdjuster), _screen(screen), _palette(palette), _transitions(transitions), _audio(audio) { +GfxPaint16::GfxPaint16(ResourceManager *resMan, SegManager *segMan, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio) + : _resMan(resMan), _segMan(segMan), _cache(cache), _ports(ports), _coordAdjuster(coordAdjuster), _screen(screen), _palette(palette), _transitions(transitions), _audio(audio) { } GfxPaint16::~GfxPaint16() { diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h index 46df203200..e06021c3e7 100644 --- a/engines/sci/graphics/paint16.h +++ b/engines/sci/graphics/paint16.h @@ -38,7 +38,7 @@ class GfxView; */ class GfxPaint16 : public GfxPaint { public: - GfxPaint16(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio); + GfxPaint16(ResourceManager *resMan, SegManager *segMan, GfxCache *cache, GfxPorts *ports, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette, GfxTransitions *transitions, AudioPlayer *audio); ~GfxPaint16(); void init(GfxAnimate *animate, GfxText16 *text16); @@ -89,7 +89,6 @@ public: private: ResourceManager *_resMan; SegManager *_segMan; - Kernel *_kernel; AudioPlayer *_audio; GfxAnimate *_animate; GfxCache *_cache; diff --git a/engines/sci/graphics/paint32.cpp b/engines/sci/graphics/paint32.cpp index a9590c829a..a03e77dfa6 100644 --- a/engines/sci/graphics/paint32.cpp +++ b/engines/sci/graphics/paint32.cpp @@ -34,8 +34,8 @@ namespace Sci { -GfxPaint32::GfxPaint32(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, GfxCoordAdjuster *coordAdjuster, GfxCache *cache, GfxScreen *screen, GfxPalette *palette) - : _resMan(resMan), _segMan(segMan), _kernel(kernel), _coordAdjuster(coordAdjuster), _cache(cache), _screen(screen), _palette(palette) { +GfxPaint32::GfxPaint32(ResourceManager *resMan, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette) + : _resMan(resMan), _coordAdjuster(coordAdjuster), _screen(screen), _palette(palette) { } GfxPaint32::~GfxPaint32() { diff --git a/engines/sci/graphics/paint32.h b/engines/sci/graphics/paint32.h index 66b31de282..81e355f77f 100644 --- a/engines/sci/graphics/paint32.h +++ b/engines/sci/graphics/paint32.h @@ -34,7 +34,7 @@ class GfxPorts; */ class GfxPaint32 : public GfxPaint { public: - GfxPaint32(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, GfxCoordAdjuster *coordAdjuster, GfxCache *cache, GfxScreen *screen, GfxPalette *palette); + GfxPaint32(ResourceManager *resMan, GfxCoordAdjuster *coordAdjuster, GfxScreen *screen, GfxPalette *palette); ~GfxPaint32(); void fillRect(Common::Rect rect, byte color); @@ -44,10 +44,7 @@ public: private: ResourceManager *_resMan; - SegManager *_segMan; - Kernel *_kernel; GfxCoordAdjuster *_coordAdjuster; - GfxCache *_cache; GfxScreen *_screen; GfxPalette *_palette; }; diff --git a/engines/sci/graphics/text16.cpp b/engines/sci/graphics/text16.cpp index 7eaa0168b8..56e9ea8b69 100644 --- a/engines/sci/graphics/text16.cpp +++ b/engines/sci/graphics/text16.cpp @@ -36,8 +36,8 @@ namespace Sci { -GfxText16::GfxText16(ResourceManager *resMan, GfxCache *cache, GfxPorts *ports, GfxPaint16 *paint16, GfxScreen *screen) - : _resMan(resMan), _cache(cache), _ports(ports), _paint16(paint16), _screen(screen) { +GfxText16::GfxText16(GfxCache *cache, GfxPorts *ports, GfxPaint16 *paint16, GfxScreen *screen) + : _cache(cache), _ports(ports), _paint16(paint16), _screen(screen) { init(); } diff --git a/engines/sci/graphics/text16.h b/engines/sci/graphics/text16.h index b33c2c4df0..321c7fc25e 100644 --- a/engines/sci/graphics/text16.h +++ b/engines/sci/graphics/text16.h @@ -40,7 +40,7 @@ class GfxFont; */ class GfxText16 { public: - GfxText16(ResourceManager *_resMan, GfxCache *fonts, GfxPorts *ports, GfxPaint16 *paint16, GfxScreen *screen); + GfxText16(GfxCache *fonts, GfxPorts *ports, GfxPaint16 *paint16, GfxScreen *screen); ~GfxText16(); GuiResourceId GetFontId(); @@ -75,7 +75,6 @@ private: void init(); bool SwitchToFont900OnSjis(const char *text); - ResourceManager *_resMan; GfxCache *_cache; GfxPorts *_ports; GfxPaint16 *_paint16; diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 1da0c5dccc..d14c965ebb 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -158,24 +158,24 @@ static const ResourceType s_resTypeMapSci21[] = { ResourceType ResourceManager::convertResType(byte type) { type &= 0x7f; - if (_mapVersion < kResVersionSci2) { + bool forceSci0 = false; + + // LSL6 hires doesn't have the chunk resource type, to match + // the resource types of the lowres version, thus we use the + // older resource types here. + // PQ4 CD and QFG4 CD are SCI2.1, but use the resource types of the + // corresponding SCI2 floppy disk versions. + if (g_sci && (g_sci->getGameId() == GID_LSL6HIRES || + g_sci->getGameId() == GID_QFG4 || g_sci->getGameId() == GID_PQ4)) + forceSci0 = true; + + if (_mapVersion < kResVersionSci2 || forceSci0) { // SCI0 - SCI2 if (type < ARRAYSIZE(s_resTypeMapSci0)) return s_resTypeMapSci0[type]; } else { - // SCI2.1+ - if (type < ARRAYSIZE(s_resTypeMapSci21)) { - // LSL6 hires doesn't have the chunk resource type, to match - // the resource types of the lowres version, thus we use the - // older resource types here. - // PQ4 CD and QFG4 CD are SCI2.1, but use the resource types of the - // corresponding SCI2 floppy disk versions. - if (g_sci && (g_sci->getGameId() == GID_LSL6HIRES || - g_sci->getGameId() == GID_QFG4 || g_sci->getGameId() == GID_PQ4)) - return s_resTypeMapSci0[type]; - else - return s_resTypeMapSci21[type]; - } + if (type < ARRAYSIZE(s_resTypeMapSci21)) + return s_resTypeMapSci21[type]; } return kResourceTypeInvalid; diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 684e1a1d0d..744f05f2b9 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -75,6 +75,10 @@ AudioVolumeResourceSource::AudioVolumeResourceSource(ResourceManager *resMan, co delete fileStream; } +AudioVolumeResourceSource::~AudioVolumeResourceSource() { + delete[] _audioCompressionOffsetMapping; +} + bool Resource::loadFromWaveFile(Common::SeekableReadStream *file) { data = new byte[size]; diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index e8e66503d8..c256c9d156 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -149,6 +149,8 @@ protected: public: AudioVolumeResourceSource(ResourceManager *resMan, const Common::String &name, ResourceSource *map, int volNum); + virtual ~AudioVolumeResourceSource(); + virtual void loadResource(ResourceManager *resMan, Resource *res); virtual uint32 getAudioCompressionType() const; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 1f5c354d1f..caba2c33cc 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -627,11 +627,11 @@ void SciEngine::initGraphics() { // SCI32 graphic objects creation _gfxCoordAdjuster = new GfxCoordAdjuster32(_gamestate->_segMan); _gfxCursor->init(_gfxCoordAdjuster, _eventMan); - _gfxCompare = new GfxCompare(_gamestate->_segMan, _kernel, _gfxCache, _gfxScreen, _gfxCoordAdjuster); - _gfxPaint32 = new GfxPaint32(_resMan, _gamestate->_segMan, _kernel, _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette); + _gfxCompare = new GfxCompare(_gamestate->_segMan, _gfxCache, _gfxScreen, _gfxCoordAdjuster); + _gfxPaint32 = new GfxPaint32(_resMan, _gfxCoordAdjuster, _gfxScreen, _gfxPalette); _gfxPaint = _gfxPaint32; _gfxText32 = new GfxText32(_gamestate->_segMan, _gfxCache, _gfxScreen); - _gfxControls32 = new GfxControls32(_gamestate->_segMan, _gfxCache, _gfxScreen, _gfxText32); + _gfxControls32 = new GfxControls32(_gamestate->_segMan, _gfxCache, _gfxText32); _robotDecoder = new RobotDecoder(getPlatform() == Common::kPlatformMacintosh); _gfxFrameout = new GfxFrameout(_gamestate->_segMan, _resMan, _gfxCoordAdjuster, _gfxCache, _gfxScreen, _gfxPalette, _gfxPaint32); } else { @@ -640,24 +640,24 @@ void SciEngine::initGraphics() { _gfxPorts = new GfxPorts(_gamestate->_segMan, _gfxScreen); _gfxCoordAdjuster = new GfxCoordAdjuster16(_gfxPorts); _gfxCursor->init(_gfxCoordAdjuster, _eventMan); - _gfxCompare = new GfxCompare(_gamestate->_segMan, _kernel, _gfxCache, _gfxScreen, _gfxCoordAdjuster); + _gfxCompare = new GfxCompare(_gamestate->_segMan, _gfxCache, _gfxScreen, _gfxCoordAdjuster); _gfxTransitions = new GfxTransitions(_gfxScreen, _gfxPalette); - _gfxPaint16 = new GfxPaint16(_resMan, _gamestate->_segMan, _kernel, _gfxCache, _gfxPorts, _gfxCoordAdjuster, _gfxScreen, _gfxPalette, _gfxTransitions, _audio); + _gfxPaint16 = new GfxPaint16(_resMan, _gamestate->_segMan, _gfxCache, _gfxPorts, _gfxCoordAdjuster, _gfxScreen, _gfxPalette, _gfxTransitions, _audio); _gfxPaint = _gfxPaint16; _gfxAnimate = new GfxAnimate(_gamestate, _gfxCache, _gfxPorts, _gfxPaint16, _gfxScreen, _gfxPalette, _gfxCursor, _gfxTransitions); - _gfxText16 = new GfxText16(_resMan, _gfxCache, _gfxPorts, _gfxPaint16, _gfxScreen); + _gfxText16 = new GfxText16(_gfxCache, _gfxPorts, _gfxPaint16, _gfxScreen); _gfxControls16 = new GfxControls16(_gamestate->_segMan, _gfxPorts, _gfxPaint16, _gfxText16, _gfxScreen); _gfxMenu = new GfxMenu(_eventMan, _gamestate->_segMan, _gfxPorts, _gfxPaint16, _gfxText16, _gfxScreen, _gfxCursor); _gfxMenu->reset(); -#ifdef ENABLE_SCI32 - } -#endif - if (_gfxPorts) { _gfxPorts->init(_features->usesOldGfxFunctions(), _gfxPaint16, _gfxText16); _gfxPaint16->init(_gfxAnimate, _gfxText16); + +#ifdef ENABLE_SCI32 } +#endif + // Set default (EGA, amiga or resource 999) palette _gfxPalette->setDefault(); } diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 528bb51393..8f405b0fa5 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -324,7 +324,10 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 // Calculate samplelen from WAVE header int waveSize = 0, waveRate = 0; byte waveFlags = 0; - Audio::loadWAVFromStream(*waveStream, waveSize, waveRate, waveFlags); + bool ret = Audio::loadWAVFromStream(*waveStream, waveSize, waveRate, waveFlags); + if (!ret) + error("Failed to load WAV from stream"); + *sampleLen = (waveFlags & Audio::FLAG_16BITS ? waveSize >> 1 : waveSize) * 60 / waveRate; waveStream->seek(0, SEEK_SET); @@ -336,7 +339,10 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 // Calculate samplelen from AIFF header int waveSize = 0, waveRate = 0; byte waveFlags = 0; - Audio::loadAIFFFromStream(*waveStream, waveSize, waveRate, waveFlags); + bool ret = Audio::loadAIFFFromStream(*waveStream, waveSize, waveRate, waveFlags); + if (!ret) + error("Failed to load AIFF from stream"); + *sampleLen = (waveFlags & Audio::FLAG_16BITS ? waveSize >> 1 : waveSize) * 60 / waveRate; waveStream->seek(0, SEEK_SET); @@ -347,6 +353,9 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 Common::SeekableReadStream *sndStream = new Common::MemoryReadStream(audioRes->data, audioRes->size, DisposeAfterUse::NO); audioSeekStream = Audio::makeMacSndStream(sndStream, DisposeAfterUse::YES); + if (!audioSeekStream) + error("Failed to load Mac sound stream"); + } else { // SCI1 raw audio size = audioRes->size; diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index 873a16cc73..6b00f8b286 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -177,18 +177,6 @@ void SoundCommandParser::processPlaySound(reg_t obj) { writeSelectorValue(_segMan, obj, SELECTOR(state), kSoundPlaying); } - // WORKAROUND: Songs 1840, 1843 and 1849 in the Windows version of KQ5CD - // are all missing their channel 15 (all played during its ending - // sequences, when fighting with Mordack). This makes the game scripts - // wait indefinitely for the missing signals in these songs. In the - // original interpreter, this bug manifests as an "Out of heap" error. We - // signal the game scripts to stop waiting forever by setting the song's - // dataInc selector to something other than 0. This causes Mordack's - // appearing animation to occur a bit earlier than expected, but at least - // the game doesn't freeze at that point. Fixes bug #3605269. - if (g_sci->getGameId() == GID_KQ5 && (resourceId == 1840 || resourceId == 1843 || resourceId == 1849)) - musicSlot->dataInc = 1; - musicSlot->loop = readSelectorValue(_segMan, obj, SELECTOR(loop)); musicSlot->priority = readSelectorValue(_segMan, obj, SELECTOR(priority)); // Reset hold when starting a new song. kDoSoundSetHold is always called after diff --git a/engines/scumm/debugger.h b/engines/scumm/debugger.h index a9b340d691..b60a1a2f03 100644 --- a/engines/scumm/debugger.h +++ b/engines/scumm/debugger.h @@ -35,7 +35,6 @@ public: private: ScummEngine *_vm; - bool _old_soundsPaused; // Commands bool Cmd_Room(int argc, const char **argv); diff --git a/engines/scumm/he/animation_he.h b/engines/scumm/he/animation_he.h index 7fa31a195d..e17c1b9a39 100644 --- a/engines/scumm/he/animation_he.h +++ b/engines/scumm/he/animation_he.h @@ -55,7 +55,6 @@ private: Video::VideoDecoder *_video; - char baseName[40]; uint32 _flags; uint32 _wizResNum; }; diff --git a/engines/scumm/he/logic/football.cpp b/engines/scumm/he/logic/football.cpp index b405d634a4..ea990ca86b 100644 --- a/engines/scumm/he/logic/football.cpp +++ b/engines/scumm/he/logic/football.cpp @@ -218,10 +218,10 @@ int LogicHEfootball::nextPoint(int32 *args) { if (res >= (double)args[6]) { var8 = (double)args[6] * var8 / res; var10 = (double)args[6] * var10 / res; - res = (double)args[6] * var6 / res; + var6 = (double)args[6] * var6 / res; } - writeScummVar(108, (int32)res); + writeScummVar(108, (int32)var6); writeScummVar(109, (int32)var10); writeScummVar(110, (int32)var8); @@ -297,6 +297,15 @@ private: int initScreenTranslations(); int getPlaybookFiles(int32 *args); int largestFreeBlock(); + + float _var0; + float _var1; + float _var2; + float _var3; + float _var4; + float _angle; + int32 _maxX; + int32 _minX; }; int32 LogicHEfootball2002::dispatch(int op, int numArgs, int32 *args) { @@ -325,8 +334,16 @@ int32 LogicHEfootball2002::dispatch(int op, int numArgs, int32 *args) { res = 1; break; + case 1030: + // Get Computer Name (online play only) + break; + + case 1515: + // Initialize Session (online play only) + break; + case 1516: - // Start auto LAN game + // Start auto LAN game (online play only) break; default: @@ -338,13 +355,74 @@ int32 LogicHEfootball2002::dispatch(int op, int numArgs, int32 *args) { } int LogicHEfootball2002::translateWorldToScreen(int32 *args) { - // TODO: Implement modified 2002 version - return LogicHEfootball::translateWorldToScreen(args); + // While this performs the same task as football's 1006 opcode, + // the implementation is different. Note that this is also the + // same as basketball's 1006 opcode with different constants! + + double v9; + if (args[1] >= _minX) { + if (args[1] < _maxX) { + v9 = (sqrt(_var1 + args[1]) - sqrt(_var1)) / sqrt(_var0); + } else { + double v10 = sqrt(_var0 * (_maxX + _var1)); + v9 = 1.0 / (v10 + v10) * (args[1] - _maxX) + 451.0; + } + } else { + double v8 = sqrt(_var0 * (_minX + _var1)); + v9 = 1.0 / (v8 + v8) * (args[1] - _minX) - 29.0; + } + + double v11 = tan(_angle); + double v12, v13; + + if (v9 >= -29.0) { + if (v9 >= 451.0) { + v12 = 1517.0 - (451.0 / v11 + 451.0 / v11); + v13 = tan(1.570796326794895 - _angle) * 451.0; + } else { + v12 = 1517.0 - (v9 / v11 + v9 / v11); + v13 = tan(1.570796326794895 - _angle) * v9; + } + } else { + v12 = 1517.0 - (-29.0 / v11 + -29.0 / v11); + v13 = tan(1.570796326794895 - _angle) * -29.0; + } + + writeScummVar(108, scummRound(v12 * args[0] / 12200.0 + v13 + 41.0)); + writeScummVar(109, scummRound(611.0 - v9 - v12 * args[2] / 12200.0)); + + return 1; } int LogicHEfootball2002::translateScreenToWorld(int32 *args) { - // TODO: Implement modified 2002 version - return LogicHEfootball::translateScreenToWorld(args); + // While this performs the same task as football's 1010 opcode, + // the implementation is different. Note that this is also the + // same as basketball's 1010 opcode with different constants! + + double v15 = 611.0 - args[1]; + double v5 = tan(_angle); + double v4, v6, v7; + + if (v15 >= -29.0) { + if (v15 >= 451.0) { + v4 = (_var2 * 902.0 + _var3) * (v15 - 451.0) + _maxX; + v6 = 1517.0 - (451.0 / v5 + 451.0 / v5); + v7 = tan(1.570796326794895 - _angle) * 451.0; + } else { + v4 = (v15 * _var2 + _var3) * v15 + _var4; + v6 = 1517.0 - (v15 / v5 + v15 / v5); + v7 = tan(1.570796326794895 - _angle) * v15; + } + } else { + v4 = (_var3 - _var2 * 58.0) * (v15 - -29.0) + _minX; + v6 = 1517.0 - (-29.0 / v5 + -29.0 / v5); + v7 = tan(1.570796326794895 - _angle) * -29.0; + } + + writeScummVar(108, scummRound((args[0] - (v7 + 41.0)) * (12200.0 / v6))); + writeScummVar(109, scummRound(v4)); + + return 1; } int LogicHEfootball2002::getDayOfWeek() { @@ -358,7 +436,14 @@ int LogicHEfootball2002::getDayOfWeek() { } int LogicHEfootball2002::initScreenTranslations() { - // TODO: Set values used by translateWorldToScreen/translateScreenToWorld + // Set values used by translateWorldToScreen/translateScreenToWorld + _var0 = _var2 = 0.0029172597f; + _var1 = 4896.3755f; + _var3 = 7.5588355f; + _var4 = 0.0f; + _angle = (float)atan(2.899280575539569); + _maxX = 4002; + _minX = -217; return 1; } diff --git a/engines/scumm/insane/insane.cpp b/engines/scumm/insane/insane.cpp index b8089ff226..d76f7b549b 100644 --- a/engines/scumm/insane/insane.cpp +++ b/engines/scumm/insane/insane.cpp @@ -466,7 +466,7 @@ void Insane::init_enemyStruct(int n, int32 handler, int32 initializer, _enemy[n].isEmpty = isEmpty; _enemy[n].weapon = weapon; _enemy[n].sound = sound; - strncpy(_enemy[n].filename, filename, 20); + Common::strlcpy(_enemy[n].filename, filename, 20); _enemy[n].costume4 = costume4; _enemy[n].costume6 = costume6; _enemy[n].costume5 = costume5; diff --git a/engines/sword1/console.cpp b/engines/sword1/console.cpp index 603efd308e..4c55f8d990 100644 --- a/engines/sword1/console.cpp +++ b/engines/sword1/console.cpp @@ -26,6 +26,7 @@ namespace Sword1 { SwordConsole::SwordConsole(SwordEngine *vm) : GUI::Debugger(), _vm(vm) { + assert(_vm); } SwordConsole::~SwordConsole() { diff --git a/engines/sword1/control.cpp b/engines/sword1/control.cpp index 7cd85dff54..80d8edc1dd 100644 --- a/engines/sword1/control.cpp +++ b/engines/sword1/control.cpp @@ -856,10 +856,8 @@ bool Control::savegamesExist() { void Control::checkForOldSaveGames() { Common::InSaveFile *inf = _saveFileMan->openForLoading("SAVEGAME.INF"); - if (!inf) { - delete inf; + if (!inf) return; - } GUI::MessageDialog dialog0( _("ScummVM found that you have old savefiles for Broken Sword 1 that should be converted.\n" diff --git a/engines/sword2/controls.cpp b/engines/sword2/controls.cpp index 3611294eb8..a4b540ac7b 100644 --- a/engines/sword2/controls.cpp +++ b/engines/sword2/controls.cpp @@ -117,8 +117,6 @@ private: Glyph _glyph[SIZE_OF_CHAR_SET]; - int _fontId; - public: enum { kAlignLeft, @@ -142,7 +140,7 @@ public: }; FontRendererGui::FontRendererGui(Sword2Engine *vm, int fontId) - : _vm(vm), _fontId(fontId) { + : _vm(vm) { byte *font = _vm->_resman->openResource(fontId); SpriteInfo sprite; diff --git a/engines/sword2/memory.cpp b/engines/sword2/memory.cpp index 5fd2d4e78e..391983930d 100644 --- a/engines/sword2/memory.cpp +++ b/engines/sword2/memory.cpp @@ -52,7 +52,7 @@ namespace Sword2 { -MemoryManager::MemoryManager(Sword2Engine *vm) : _vm(vm) { +MemoryManager::MemoryManager() { // The id stack contains all the possible ids for the memory blocks. // We use this to ensure that no two blocks ever have the same id. diff --git a/engines/sword2/memory.h b/engines/sword2/memory.h index 3f511dd5db..250da138c2 100644 --- a/engines/sword2/memory.h +++ b/engines/sword2/memory.h @@ -40,8 +40,6 @@ struct MemBlock { class MemoryManager { private: - Sword2Engine *_vm; - MemBlock *_memBlocks; MemBlock **_memBlockIndex; int16 _numBlocks; @@ -56,7 +54,7 @@ private: int16 findInsertionPointInIndex(byte *ptr); public: - MemoryManager(Sword2Engine *vm); + MemoryManager(); ~MemoryManager(); int16 getNumBlocks() { return _numBlocks; } diff --git a/engines/sword2/palette.cpp b/engines/sword2/palette.cpp index c3a3d24075..9634d3af10 100644 --- a/engines/sword2/palette.cpp +++ b/engines/sword2/palette.cpp @@ -288,19 +288,17 @@ void Screen::fadeServer() { } void Screen::setSystemPalette(const byte *colors, uint start, uint num) { - const byte *palette; - if (_dimPalette) { byte pal[256 * 3]; for (uint i = start * 3; i < 3 * (start + num); i++) pal[i] = colors[i] / 2; - palette = pal; - } else - palette = colors; + _vm->_system->getPaletteManager()->setPalette(pal, start, num); + } else { + _vm->_system->getPaletteManager()->setPalette(colors, start, num); + } - _vm->_system->getPaletteManager()->setPalette(palette, start, num); } } // End of namespace Sword2 diff --git a/engines/sword2/sound.h b/engines/sword2/sound.h index 9a59ef27a8..e250707fb9 100644 --- a/engines/sword2/sound.h +++ b/engines/sword2/sound.h @@ -142,7 +142,6 @@ private: bool _looping; int32 _fading; int32 _fadeSamples; - bool _paused; void refill(); diff --git a/engines/sword2/sprite.cpp b/engines/sword2/sprite.cpp index 91a5e2e86b..5e25a86d75 100644 --- a/engines/sword2/sprite.cpp +++ b/engines/sword2/sprite.cpp @@ -590,8 +590,11 @@ int32 Screen::drawSprite(SpriteInfo *s) { s->w = (decompData / (s->h / 2)); sprite = (byte *)malloc(s->w * s->h); - if (!sprite) + if (!sprite) { + free(tempBuf); + return RDERR_OUTOFMEMORY; + } resizePsxSprite(sprite, tempBuf, s->w, s->h); free(tempBuf); diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index dfa6a23320..d4a564e2c0 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -450,7 +450,7 @@ Common::Error Sword2Engine::run() { _debugger = new Debugger(this); - _memory = new MemoryManager(this); + _memory = new MemoryManager(); _resman = new ResourceManager(this); if (!_resman->init()) diff --git a/engines/sword25/console.cpp b/engines/sword25/console.cpp index 5d15f189ab..f1b91d2bc2 100644 --- a/engines/sword25/console.cpp +++ b/engines/sword25/console.cpp @@ -26,6 +26,7 @@ namespace Sword25 { Sword25Console::Sword25Console(Sword25Engine *vm) : GUI::Debugger(), _vm(vm) { + assert(_vm); } Sword25Console::~Sword25Console() { diff --git a/engines/testbed/midi.cpp b/engines/testbed/midi.cpp index 69d361b0d6..70ede406d5 100644 --- a/engines/testbed/midi.cpp +++ b/engines/testbed/midi.cpp @@ -96,6 +96,10 @@ TestExitStatus MidiTests::playMidiMusic() { Common::String errMsg = MidiDriver::getErrorName(errCode); Testsuite::writeOnScreen(errMsg, Common::Point(0, 100)); Testsuite::logPrintf("Error! %s", errMsg.c_str()); + + delete smfParser; + delete driver; + return kTestFailed; } diff --git a/engines/toon/console.cpp b/engines/toon/console.cpp index 8037dca4cb..18f81e1323 100644 --- a/engines/toon/console.cpp +++ b/engines/toon/console.cpp @@ -26,6 +26,7 @@ namespace Toon { ToonConsole::ToonConsole(ToonEngine *vm) : GUI::Debugger(), _vm(vm) { + assert(_vm); } ToonConsole::~ToonConsole() { diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h index 9175b1050a..826f2fef6f 100644 --- a/engines/tsage/graphics.h +++ b/engines/tsage/graphics.h @@ -162,7 +162,6 @@ public: class GfxFontBackup { private: - GfxSurface *_surface; Common::Point _edgeSize; Common::Point _position; GfxColors _colors; diff --git a/engines/tucker/console.cpp b/engines/tucker/console.cpp index e0f2debc30..17ba2038d0 100644 --- a/engines/tucker/console.cpp +++ b/engines/tucker/console.cpp @@ -11,7 +11,7 @@ * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License @@ -26,6 +26,7 @@ namespace Tucker { TuckerConsole::TuckerConsole(TuckerEngine *vm) : _vm(vm) { + assert(_vm); } TuckerConsole::~TuckerConsole() { diff --git a/engines/wintermute/ad/ad_actor.cpp b/engines/wintermute/ad/ad_actor.cpp index 9879cc9f40..e4c18d6287 100644 --- a/engines/wintermute/ad/ad_actor.cpp +++ b/engines/wintermute/ad/ad_actor.cpp @@ -1320,23 +1320,23 @@ bool AdActor::persist(BasePersistenceManager *persistMgr) { AdTalkHolder::persist(persistMgr); persistMgr->transfer(TMEMBER_INT(_dir)); - persistMgr->transfer(TMEMBER(_path)); + persistMgr->transferPtr(TMEMBER_PTR(_path)); persistMgr->transfer(TMEMBER(_pFCount)); persistMgr->transfer(TMEMBER(_pFStepX)); persistMgr->transfer(TMEMBER(_pFStepY)); persistMgr->transfer(TMEMBER(_pFX)); persistMgr->transfer(TMEMBER(_pFY)); - persistMgr->transfer(TMEMBER(_standSprite)); + persistMgr->transferPtr(TMEMBER_PTR(_standSprite)); _talkSprites.persist(persistMgr); _talkSpritesEx.persist(persistMgr); persistMgr->transfer(TMEMBER_INT(_targetDir)); persistMgr->transfer(TMEMBER_INT(_afterWalkDir)); - persistMgr->transfer(TMEMBER(_targetPoint)); - persistMgr->transfer(TMEMBER(_turnLeftSprite)); - persistMgr->transfer(TMEMBER(_turnRightSprite)); - persistMgr->transfer(TMEMBER(_walkSprite)); + persistMgr->transferPtr(TMEMBER_PTR(_targetPoint)); + persistMgr->transferPtr(TMEMBER_PTR(_turnLeftSprite)); + persistMgr->transferPtr(TMEMBER_PTR(_turnRightSprite)); + persistMgr->transferPtr(TMEMBER_PTR(_walkSprite)); - persistMgr->transfer(TMEMBER(_animSprite2)); + persistMgr->transferPtr(TMEMBER_PTR(_animSprite2)); persistMgr->transfer(TMEMBER(_talkAnimName)); persistMgr->transfer(TMEMBER(_idleAnimName)); persistMgr->transfer(TMEMBER(_walkAnimName)); diff --git a/engines/wintermute/ad/ad_entity.cpp b/engines/wintermute/ad/ad_entity.cpp index 6e47d0f072..c43f74b620 100644 --- a/engines/wintermute/ad/ad_entity.cpp +++ b/engines/wintermute/ad/ad_entity.cpp @@ -1093,7 +1093,7 @@ bool AdEntity::persist(BasePersistenceManager *persistMgr) { AdTalkHolder::persist(persistMgr); persistMgr->transfer(TMEMBER(_item)); - persistMgr->transfer(TMEMBER(_region)); + persistMgr->transferPtr(TMEMBER_PTR(_region)); //persistMgr->transfer(TMEMBER(_sprite)); persistMgr->transfer(TMEMBER_INT(_subtype)); _talkSprites.persist(persistMgr); @@ -1103,7 +1103,7 @@ bool AdEntity::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_walkToY)); persistMgr->transfer(TMEMBER_INT(_walkToDir)); - persistMgr->transfer(TMEMBER(_theora)); + persistMgr->transferPtr(TMEMBER_PTR(_theora)); return STATUS_OK; } diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp index fac59dc473..ead68f7729 100644 --- a/engines/wintermute/ad/ad_game.cpp +++ b/engines/wintermute/ad/ad_game.cpp @@ -1413,32 +1413,32 @@ bool AdGame::persist(BasePersistenceManager *persistMgr) { _dlgPendingBranches.persist(persistMgr); _inventories.persist(persistMgr); - persistMgr->transfer(TMEMBER(_inventoryBox)); + persistMgr->transferPtr(TMEMBER_PTR(_inventoryBox)); _objects.persist(persistMgr); persistMgr->transfer(TMEMBER(_prevSceneName)); persistMgr->transfer(TMEMBER(_prevSceneFilename)); - persistMgr->transfer(TMEMBER(_responseBox)); + persistMgr->transferPtr(TMEMBER_PTR(_responseBox)); _responsesBranch.persist(persistMgr); _responsesGame.persist(persistMgr); - persistMgr->transfer(TMEMBER(_scene)); + persistMgr->transferPtr(TMEMBER_PTR(_scene)); _sceneStates.persist(persistMgr); persistMgr->transfer(TMEMBER(_scheduledFadeIn)); persistMgr->transfer(TMEMBER(_scheduledScene)); - persistMgr->transfer(TMEMBER(_selectedItem)); + persistMgr->transferPtr(TMEMBER_PTR(_selectedItem)); persistMgr->transfer(TMEMBER_INT(_talkSkipButton)); _sentences.persist(persistMgr); - persistMgr->transfer(TMEMBER(_sceneViewport)); + persistMgr->transferPtr(TMEMBER_PTR(_sceneViewport)); persistMgr->transfer(TMEMBER_INT(_stateEx)); persistMgr->transfer(TMEMBER(_initialScene)); persistMgr->transfer(TMEMBER(_debugStartupScene)); - persistMgr->transfer(TMEMBER(_invObject)); - persistMgr->transfer(TMEMBER(_inventoryOwner)); + persistMgr->transferPtr(TMEMBER_PTR(_invObject)); + persistMgr->transferPtr(TMEMBER_PTR(_inventoryOwner)); persistMgr->transfer(TMEMBER(_tempDisableSaveState)); _items.persist(persistMgr); diff --git a/engines/wintermute/ad/ad_inventory_box.cpp b/engines/wintermute/ad/ad_inventory_box.cpp index 4bb0905688..110359917b 100644 --- a/engines/wintermute/ad/ad_inventory_box.cpp +++ b/engines/wintermute/ad/ad_inventory_box.cpp @@ -84,7 +84,7 @@ bool AdInventoryBox::listen(BaseScriptHolder *param1, uint32 param2) { _visible = false; } else if (scumm_stricmp(obj->getName(), "prev") == 0) { _scrollOffset -= _scrollBy; - _scrollOffset = MAX(_scrollOffset, 0); + _scrollOffset = MAX<int32>(_scrollOffset, 0); } else if (scumm_stricmp(obj->getName(), "next") == 0) { _scrollOffset += _scrollBy; } else { @@ -371,7 +371,7 @@ bool AdInventoryBox::saveAsText(BaseDynamicBuffer *buffer, int indent) { bool AdInventoryBox::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_closeButton)); + persistMgr->transferPtr(TMEMBER_PTR(_closeButton)); persistMgr->transfer(TMEMBER(_hideSelected)); persistMgr->transfer(TMEMBER(_itemHeight)); persistMgr->transfer(TMEMBER(_itemsArea)); @@ -380,7 +380,7 @@ bool AdInventoryBox::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_scrollOffset)); persistMgr->transfer(TMEMBER(_spacing)); persistMgr->transfer(TMEMBER(_visible)); - persistMgr->transfer(TMEMBER(_window)); + persistMgr->transferPtr(TMEMBER_PTR(_window)); persistMgr->transfer(TMEMBER(_exclusive)); return STATUS_OK; diff --git a/engines/wintermute/ad/ad_item.cpp b/engines/wintermute/ad/ad_item.cpp index 578105105c..1a46eb783b 100644 --- a/engines/wintermute/ad/ad_item.cpp +++ b/engines/wintermute/ad/ad_item.cpp @@ -784,9 +784,9 @@ bool AdItem::persist(BasePersistenceManager *persistMgr) { AdTalkHolder::persist(persistMgr); persistMgr->transfer(TMEMBER(_cursorCombined)); - persistMgr->transfer(TMEMBER(_cursorHover)); - persistMgr->transfer(TMEMBER(_cursorNormal)); - persistMgr->transfer(TMEMBER(_spriteHover)); + persistMgr->transferPtr(TMEMBER_PTR(_cursorHover)); + persistMgr->transferPtr(TMEMBER_PTR(_cursorNormal)); + persistMgr->transferPtr(TMEMBER_PTR(_spriteHover)); persistMgr->transfer(TMEMBER(_inInventory)); persistMgr->transfer(TMEMBER(_displayAmount)); persistMgr->transfer(TMEMBER(_amount)); diff --git a/engines/wintermute/ad/ad_node_state.cpp b/engines/wintermute/ad/ad_node_state.cpp index c741dec54f..d52201a08d 100644 --- a/engines/wintermute/ad/ad_node_state.cpp +++ b/engines/wintermute/ad/ad_node_state.cpp @@ -93,7 +93,7 @@ void AdNodeState::setCursor(const char *filename) { ////////////////////////////////////////////////////////////////////////// bool AdNodeState::persist(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER(_active)); persistMgr->transfer(TMEMBER(_name)); diff --git a/engines/wintermute/ad/ad_object.cpp b/engines/wintermute/ad/ad_object.cpp index 9026b2849c..741d6e6fc6 100644 --- a/engines/wintermute/ad/ad_object.cpp +++ b/engines/wintermute/ad/ad_object.cpp @@ -864,14 +864,14 @@ int AdObject::getHeight() { return 0; } else { BaseFrame *frame = _currentSprite->_frames[_currentSprite->_currentFrame]; - int ret = 0; + int32 ret = 0; for (uint32 i = 0; i < frame->_subframes.size(); i++) { ret = MAX(ret, frame->_subframes[i]->_hotspotY); } if (_zoomable) { float zoom = ((AdGame *)_gameRef)->_scene->getZoomAt(_posX, _posY); - ret = (int)(ret * zoom / 100); + ret = (int32)(ret * zoom / 100); } return ret; } @@ -941,11 +941,11 @@ void AdObject::talk(const char *text, const char *sound, uint32 duration, const // set duration by text length if (_sentence->_duration <= 0) {// TODO: Avoid longs. - _sentence->_duration = MAX((size_t)1000, _gameRef->_subtitlesSpeed * strlen(_sentence->_text)); + _sentence->_duration = MAX<int32>((size_t)1000, _gameRef->_subtitlesSpeed * strlen(_sentence->_text)); } - int x, y, width, height; + int32 x, y, width, height; x = _posX; y = _posY; @@ -981,8 +981,8 @@ void AdObject::talk(const char *text, const char *sound, uint32 duration, const } - x = MIN(MAX(0, x), _gameRef->_renderer->getWidth() - width); - y = MIN(MAX(0, y), _gameRef->_renderer->getHeight() - height); + x = MIN(MAX<int32>(0, x), _gameRef->_renderer->getWidth() - width); + y = MIN(MAX<int32>(0, y), _gameRef->_renderer->getHeight() - height); _sentence->_width = width; @@ -1031,39 +1031,39 @@ bool AdObject::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); persistMgr->transfer(TMEMBER(_active)); - persistMgr->transfer(TMEMBER(_blockRegion)); - persistMgr->transfer(TMEMBER(_currentBlockRegion)); - persistMgr->transfer(TMEMBER(_currentWptGroup)); - persistMgr->transfer(TMEMBER(_currentSprite)); + persistMgr->transferPtr(TMEMBER_PTR(_blockRegion)); + persistMgr->transferPtr(TMEMBER_PTR(_currentBlockRegion)); + persistMgr->transferPtr(TMEMBER_PTR(_currentWptGroup)); + persistMgr->transferPtr(TMEMBER_PTR(_currentSprite)); persistMgr->transfer(TMEMBER(_drawn)); - persistMgr->transfer(TMEMBER(_font)); + persistMgr->transferPtr(TMEMBER_PTR(_font)); persistMgr->transfer(TMEMBER(_ignoreItems)); persistMgr->transfer(TMEMBER_INT(_nextState)); - persistMgr->transfer(TMEMBER(_sentence)); + persistMgr->transferPtr(TMEMBER_PTR(_sentence)); persistMgr->transfer(TMEMBER_INT(_state)); - persistMgr->transfer(TMEMBER(_animSprite)); + persistMgr->transferPtr(TMEMBER_PTR(_animSprite)); persistMgr->transfer(TMEMBER(_sceneIndependent)); persistMgr->transfer(TMEMBER(_forcedTalkAnimName)); persistMgr->transfer(TMEMBER(_forcedTalkAnimUsed)); - persistMgr->transfer(TMEMBER(_tempSprite2)); + persistMgr->transferPtr(TMEMBER_PTR(_tempSprite2)); persistMgr->transfer(TMEMBER_INT(_type)); - persistMgr->transfer(TMEMBER(_wptGroup)); - persistMgr->transfer(TMEMBER(_stickRegion)); + persistMgr->transferPtr(TMEMBER_PTR(_wptGroup)); + persistMgr->transferPtr(TMEMBER_PTR(_stickRegion)); persistMgr->transfer(TMEMBER(_subtitlesModRelative)); persistMgr->transfer(TMEMBER(_subtitlesModX)); persistMgr->transfer(TMEMBER(_subtitlesModY)); persistMgr->transfer(TMEMBER(_subtitlesModXCenter)); persistMgr->transfer(TMEMBER(_subtitlesWidth)); - persistMgr->transfer(TMEMBER(_inventory)); - persistMgr->transfer(TMEMBER(_partEmitter)); + persistMgr->transferPtr(TMEMBER_PTR(_inventory)); + persistMgr->transferPtr(TMEMBER_PTR(_partEmitter)); for (int i = 0; i < MAX_NUM_REGIONS; i++) { - persistMgr->transfer(TMEMBER(_currentRegions[i])); + persistMgr->transferPtr(TMEMBER_PTR(_currentRegions[i])); } _attachmentsPre.persist(persistMgr); _attachmentsPost.persist(persistMgr); - persistMgr->transfer(TMEMBER(_registerAlias)); + persistMgr->transferPtr(TMEMBER_PTR(_registerAlias)); persistMgr->transfer(TMEMBER(_partFollowParent)); persistMgr->transfer(TMEMBER(_partOffsetX)); diff --git a/engines/wintermute/ad/ad_path.cpp b/engines/wintermute/ad/ad_path.cpp index afdd29828c..5b36ed6471 100644 --- a/engines/wintermute/ad/ad_path.cpp +++ b/engines/wintermute/ad/ad_path.cpp @@ -108,7 +108,7 @@ bool AdPath::setReady(bool ready) { ////////////////////////////////////////////////////////////////////////// bool AdPath::persist(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER(_currIndex)); _points.persist(persistMgr); diff --git a/engines/wintermute/ad/ad_path_point.cpp b/engines/wintermute/ad/ad_path_point.cpp index f3ccd264b1..be4b487466 100644 --- a/engines/wintermute/ad/ad_path_point.cpp +++ b/engines/wintermute/ad/ad_path_point.cpp @@ -67,7 +67,7 @@ bool AdPathPoint::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_distance)); persistMgr->transfer(TMEMBER(_marked)); - persistMgr->transfer(TMEMBER(_origin)); + persistMgr->transferPtr(TMEMBER_PTR(_origin)); return STATUS_OK; } diff --git a/engines/wintermute/ad/ad_response.cpp b/engines/wintermute/ad/ad_response.cpp index 0e6817ae6f..4483bbc667 100644 --- a/engines/wintermute/ad/ad_response.cpp +++ b/engines/wintermute/ad/ad_response.cpp @@ -131,14 +131,14 @@ bool AdResponse::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_icon)); - persistMgr->transfer(TMEMBER(_iconHover)); - persistMgr->transfer(TMEMBER(_iconPressed)); + persistMgr->transferPtr(TMEMBER_PTR(_icon)); + persistMgr->transferPtr(TMEMBER_PTR(_iconHover)); + persistMgr->transferPtr(TMEMBER_PTR(_iconPressed)); persistMgr->transfer(TMEMBER(_iD)); persistMgr->transfer(TMEMBER(_text)); persistMgr->transfer(TMEMBER(_textOrig)); persistMgr->transfer(TMEMBER_INT(_responseType)); - persistMgr->transfer(TMEMBER(_font)); + persistMgr->transferPtr(TMEMBER_PTR(_font)); return STATUS_OK; } diff --git a/engines/wintermute/ad/ad_response_box.cpp b/engines/wintermute/ad/ad_response_box.cpp index a4e59c6a49..a589bf3a30 100644 --- a/engines/wintermute/ad/ad_response_box.cpp +++ b/engines/wintermute/ad/ad_response_box.cpp @@ -187,7 +187,7 @@ bool AdResponseBox::createButtons() { // make the responses touchable if (_gameRef->_touchInterface) { - btn->_height = MAX(btn->_height, 50); + btn->_height = MAX<int32>(btn->_height, 50); } //btn->SetListener(this, btn, _responses[i]->_iD); @@ -573,8 +573,8 @@ bool AdResponseBox::listen(BaseScriptHolder *param1, uint32 param2) { bool AdResponseBox::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_font)); - persistMgr->transfer(TMEMBER(_fontHover)); + persistMgr->transferPtr(TMEMBER_PTR(_font)); + persistMgr->transferPtr(TMEMBER_PTR(_fontHover)); persistMgr->transfer(TMEMBER(_horizontal)); persistMgr->transfer(TMEMBER(_lastResponseText)); persistMgr->transfer(TMEMBER(_lastResponseTextOrig)); @@ -582,10 +582,10 @@ bool AdResponseBox::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_responseArea)); _responses.persist(persistMgr); persistMgr->transfer(TMEMBER(_scrollOffset)); - persistMgr->transfer(TMEMBER(_shieldWindow)); + persistMgr->transferPtr(TMEMBER_PTR(_shieldWindow)); persistMgr->transfer(TMEMBER(_spacing)); - persistMgr->transfer(TMEMBER(_waitingScript)); - persistMgr->transfer(TMEMBER(_window)); + persistMgr->transferPtr(TMEMBER_PTR(_waitingScript)); + persistMgr->transferPtr(TMEMBER_PTR(_window)); persistMgr->transfer(TMEMBER_INT(_verticalAlign)); persistMgr->transfer(TMEMBER_INT(_align)); diff --git a/engines/wintermute/ad/ad_response_context.cpp b/engines/wintermute/ad/ad_response_context.cpp index d87651c178..663ef49a24 100644 --- a/engines/wintermute/ad/ad_response_context.cpp +++ b/engines/wintermute/ad/ad_response_context.cpp @@ -49,7 +49,7 @@ AdResponseContext::~AdResponseContext() { ////////////////////////////////////////////////////////////////////////// bool AdResponseContext::persist(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER(_context)); persistMgr->transfer(TMEMBER(_id)); diff --git a/engines/wintermute/ad/ad_scene.cpp b/engines/wintermute/ad/ad_scene.cpp index 699ef0685d..4d0068fad1 100644 --- a/engines/wintermute/ad/ad_scene.cpp +++ b/engines/wintermute/ad/ad_scene.cpp @@ -976,14 +976,14 @@ bool AdScene::traverseNodes(bool doUpdate) { ////////////////////////////////////////////////////////////////////////// - int viewportWidth, viewportHeight; + int32 viewportWidth, viewportHeight; getViewportSize(&viewportWidth, &viewportHeight); - int viewportX, viewportY; + int32 viewportX, viewportY; getViewportOffset(&viewportX, &viewportY); - int scrollableX = _width - viewportWidth; - int scrollableY = _height - viewportHeight; + int32 scrollableX = _width - viewportWidth; + int32 scrollableY = _height - viewportHeight; double widthRatio = scrollableX <= 0 ? 0 : ((double)(_offsetLeft) / (double)scrollableX); double heightRatio = scrollableY <= 0 ? 0 : ((double)(_offsetTop) / (double)scrollableY); @@ -1272,16 +1272,16 @@ bool AdScene::update() { ////////////////////////////////////////////////////////////////////////// void AdScene::scrollTo(int offsetX, int offsetY) { - int viewportWidth, viewportHeight; + int32 viewportWidth, viewportHeight; getViewportSize(&viewportWidth, &viewportHeight); - int origOffsetLeft = _targetOffsetLeft; - int origOffsetTop = _targetOffsetTop; + int32 origOffsetLeft = _targetOffsetLeft; + int32 origOffsetTop = _targetOffsetTop; - _targetOffsetLeft = MAX(0, offsetX - viewportWidth / 2); + _targetOffsetLeft = MAX<int32>(0, offsetX - viewportWidth / 2); _targetOffsetLeft = MIN(_targetOffsetLeft, _width - viewportWidth); - _targetOffsetTop = MAX(0, offsetY - viewportHeight / 2); + _targetOffsetTop = MAX<int32>(0, offsetY - viewportHeight / 2); _targetOffsetTop = MIN(_targetOffsetTop, _height - viewportHeight); @@ -1317,13 +1317,13 @@ void AdScene::skipToObject(BaseObject *object) { ////////////////////////////////////////////////////////////////////////// void AdScene::skipTo(int offsetX, int offsetY) { - int viewportWidth, viewportHeight; + int32 viewportWidth, viewportHeight; getViewportSize(&viewportWidth, &viewportHeight); - _offsetLeft = MAX(0, offsetX - viewportWidth / 2); + _offsetLeft = MAX<int32>(0, offsetX - viewportWidth / 2); _offsetLeft = MIN(_offsetLeft, _width - viewportWidth); - _offsetTop = MAX(0, offsetY - viewportHeight / 2); + _offsetTop = MAX<int32>(0, offsetY - viewportHeight / 2); _offsetTop = MIN(_offsetTop, _height - viewportHeight); _targetOffsetLeft = _offsetLeft; @@ -1866,7 +1866,7 @@ ScValue *AdScene::scGetProperty(const Common::String &name) { // MouseX (RO) ////////////////////////////////////////////////////////////////////////// else if (name == "MouseX") { - int viewportX; + int32 viewportX; getViewportOffset(&viewportX); _scValue->setInt(_gameRef->_mousePos.x + _offsetLeft - viewportX); @@ -1877,7 +1877,7 @@ ScValue *AdScene::scGetProperty(const Common::String &name) { // MouseY (RO) ////////////////////////////////////////////////////////////////////////// else if (name == "MouseY") { - int viewportY; + int32 viewportY; getViewportOffset(nullptr, &viewportY); _scValue->setInt(_gameRef->_mousePos.y + _offsetTop - viewportY); @@ -2057,10 +2057,10 @@ bool AdScene::scSetProperty(const char *name, ScValue *value) { else if (strcmp(name, "OffsetX") == 0) { _offsetLeft = value->getInt(); - int viewportWidth, viewportHeight; + int32 viewportWidth, viewportHeight; getViewportSize(&viewportWidth, &viewportHeight); - _offsetLeft = MAX(0, _offsetLeft - viewportWidth / 2); + _offsetLeft = MAX<int32>(0, _offsetLeft - viewportWidth / 2); _offsetLeft = MIN(_offsetLeft, _width - viewportWidth); _targetOffsetLeft = _offsetLeft; @@ -2073,10 +2073,10 @@ bool AdScene::scSetProperty(const char *name, ScValue *value) { else if (strcmp(name, "OffsetY") == 0) { _offsetTop = value->getInt(); - int viewportWidth, viewportHeight; + int32 viewportWidth, viewportHeight; getViewportSize(&viewportWidth, &viewportHeight); - _offsetTop = MAX(0, _offsetTop - viewportHeight / 2); + _offsetTop = MAX<int32>(0, _offsetTop - viewportHeight / 2); _offsetTop = MIN(_offsetTop, _height - viewportHeight); _targetOffsetTop = _offsetTop; @@ -2319,13 +2319,13 @@ bool AdScene::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_editorShowEntities)); persistMgr->transfer(TMEMBER(_editorShowRegions)); persistMgr->transfer(TMEMBER(_editorShowScale)); - persistMgr->transfer(TMEMBER(_fader)); + persistMgr->transferPtr(TMEMBER_PTR(_fader)); persistMgr->transfer(TMEMBER(_height)); persistMgr->transfer(TMEMBER(_initialized)); persistMgr->transfer(TMEMBER(_lastTimeH)); persistMgr->transfer(TMEMBER(_lastTimeV)); _layers.persist(persistMgr); - persistMgr->transfer(TMEMBER(_mainLayer)); + persistMgr->transferPtr(TMEMBER_PTR(_mainLayer)); _objects.persist(persistMgr); persistMgr->transfer(TMEMBER(_offsetLeft)); persistMgr->transfer(TMEMBER(_offsetTop)); @@ -2336,20 +2336,20 @@ bool AdScene::persist(BasePersistenceManager *persistMgr) { _pfPath.persist(persistMgr); persistMgr->transfer(TMEMBER(_pfPointsNum)); persistMgr->transfer(TMEMBER(_pfReady)); - persistMgr->transfer(TMEMBER(_pfRequester)); - persistMgr->transfer(TMEMBER(_pfTarget)); - persistMgr->transfer(TMEMBER(_pfTargetPath)); + persistMgr->transferPtr(TMEMBER_PTR(_pfRequester)); + persistMgr->transferPtr(TMEMBER_PTR(_pfTarget)); + persistMgr->transferPtr(TMEMBER_PTR(_pfTargetPath)); _rotLevels.persist(persistMgr); _scaleLevels.persist(persistMgr); persistMgr->transfer(TMEMBER(_scrollPixelsH)); persistMgr->transfer(TMEMBER(_scrollPixelsV)); persistMgr->transfer(TMEMBER(_scrollTimeH)); persistMgr->transfer(TMEMBER(_scrollTimeV)); - persistMgr->transfer(TMEMBER(_shieldWindow)); + persistMgr->transferPtr(TMEMBER_PTR(_shieldWindow)); persistMgr->transfer(TMEMBER(_targetOffsetLeft)); persistMgr->transfer(TMEMBER(_targetOffsetTop)); _waypointGroups.persist(persistMgr); - persistMgr->transfer(TMEMBER(_viewport)); + persistMgr->transferPtr(TMEMBER_PTR(_viewport)); persistMgr->transfer(TMEMBER(_width)); return STATUS_OK; @@ -2361,10 +2361,10 @@ bool AdScene::afterLoad() { } ////////////////////////////////////////////////////////////////////////// -bool AdScene::correctTargetPoint2(int startX, int startY, int *targetX, int *targetY, bool checkFreeObjects, BaseObject *requester) { +bool AdScene::correctTargetPoint2(int32 startX, int32 startY, int32 *targetX, int32 *targetY, bool checkFreeObjects, BaseObject *requester) { double xStep, yStep, x, y; - int xLength, yLength, xCount, yCount; - int x1, y1, x2, y2; + int32 xLength, yLength, xCount, yCount; + int32 x1, y1, x2, y2; x1 = *targetX; y1 = *targetY; @@ -2407,9 +2407,9 @@ bool AdScene::correctTargetPoint2(int startX, int startY, int *targetX, int *tar } ////////////////////////////////////////////////////////////////////////// -bool AdScene::correctTargetPoint(int startX, int startY, int *argX, int *argY, bool checkFreeObjects, BaseObject *requester) { - int x = *argX; - int y = *argY; +bool AdScene::correctTargetPoint(int32 startX, int32 startY, int32 *argX, int32 *argY, bool checkFreeObjects, BaseObject *requester) { + int32 x = *argX; + int32 y = *argY; if (isWalkableAt(x, y, checkFreeObjects, requester) || !_mainLayer) { return STATUS_OK; @@ -2522,7 +2522,7 @@ void AdScene::pfPointsAdd(int x, int y, int distance) { ////////////////////////////////////////////////////////////////////////// -bool AdScene::getViewportOffset(int *offsetX, int *offsetY) { +bool AdScene::getViewportOffset(int32 *offsetX, int32 *offsetY) { AdGame *adGame = (AdGame *)_gameRef; if (_viewport && !_gameRef->_editorMode) { if (offsetX) { @@ -2551,7 +2551,7 @@ bool AdScene::getViewportOffset(int *offsetX, int *offsetY) { ////////////////////////////////////////////////////////////////////////// -bool AdScene::getViewportSize(int *width, int *height) { +bool AdScene::getViewportSize(int32 *width, int32 *height) { AdGame *adGame = (AdGame *)_gameRef; if (_viewport && !_gameRef->_editorMode) { if (width) { @@ -2581,7 +2581,7 @@ bool AdScene::getViewportSize(int *width, int *height) { ////////////////////////////////////////////////////////////////////////// int AdScene::getOffsetLeft() { - int viewportX; + int32 viewportX; getViewportOffset(&viewportX); return _offsetLeft - viewportX; @@ -2590,7 +2590,7 @@ int AdScene::getOffsetLeft() { ////////////////////////////////////////////////////////////////////////// int AdScene::getOffsetTop() { - int viewportY; + int32 viewportY; getViewportOffset(nullptr, &viewportY); return _offsetTop - viewportY; @@ -2599,7 +2599,7 @@ int AdScene::getOffsetTop() { ////////////////////////////////////////////////////////////////////////// bool AdScene::pointInViewport(int x, int y) { - int left, top, width, height; + int32 left, top, width, height; getViewportOffset(&left, &top); getViewportSize(&width, &height); diff --git a/engines/wintermute/ad/ad_scene.h b/engines/wintermute/ad/ad_scene.h index 9ddef73b65..cd144b77ef 100644 --- a/engines/wintermute/ad/ad_scene.h +++ b/engines/wintermute/ad/ad_scene.h @@ -67,16 +67,16 @@ public: bool pointInViewport(int x, int y); int getOffsetTop(); int getOffsetLeft(); - bool getViewportSize(int *width = nullptr, int *height = nullptr); - bool getViewportOffset(int *offsetX = nullptr, int *offsetY = nullptr); + bool getViewportSize(int32 *width = nullptr, int32 *height = nullptr); + bool getViewportOffset(int32 *offsetX = nullptr, int32 *offsetY = nullptr); BaseViewport *_viewport; BaseFader *_fader; - int _pfPointsNum; + int32 _pfPointsNum; void pfPointsAdd(int x, int y, int distance); void pfPointsStart(); bool _initialized; - bool correctTargetPoint(int startX, int startY, int *x, int *y, bool checkFreeObjects = false, BaseObject *requester = nullptr); - bool correctTargetPoint2(int startX, int startY, int *targetX, int *targetY, bool checkFreeObjects, BaseObject *requester); + bool correctTargetPoint(int32 startX, int32 startY, int32 *x, int32 *y, bool checkFreeObjects = false, BaseObject *requester = nullptr); + bool correctTargetPoint2(int32 startX, int32 startY, int32 *targetX, int32 *targetY, bool checkFreeObjects, BaseObject *requester); DECLARE_PERSISTENT(AdScene, BaseObject) bool displayRegionContent(AdRegion *region = nullptr, bool display3DOnly = false); bool displayRegionContentOld(AdRegion *region = nullptr); @@ -98,14 +98,14 @@ public: void scrollTo(int offsetX, int offsetY); virtual bool update() override; bool _autoScroll; - int _targetOffsetTop; - int _targetOffsetLeft; + int32 _targetOffsetTop; + int32 _targetOffsetLeft; - int _scrollPixelsV; + int32 _scrollPixelsV; uint32 _scrollTimeV; uint32 _lastTimeV; - int _scrollPixelsH; + int32 _scrollPixelsH; uint32 _scrollTimeH; uint32 _lastTimeH; @@ -171,8 +171,8 @@ private: BaseObject *_pfRequester; BaseArray<AdPathPoint *> _pfPath; - int _offsetTop; - int _offsetLeft; + int32 _offsetTop; + int32 _offsetLeft; }; diff --git a/engines/wintermute/ad/ad_scene_node.cpp b/engines/wintermute/ad/ad_scene_node.cpp index f84e9212e5..e9b80b3cc8 100644 --- a/engines/wintermute/ad/ad_scene_node.cpp +++ b/engines/wintermute/ad/ad_scene_node.cpp @@ -72,8 +72,8 @@ bool AdSceneNode::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_entity)); - persistMgr->transfer(TMEMBER(_region)); + persistMgr->transferPtr(TMEMBER_PTR(_entity)); + persistMgr->transferPtr(TMEMBER_PTR(_region)); persistMgr->transfer(TMEMBER_INT(_type)); return STATUS_OK; diff --git a/engines/wintermute/ad/ad_sentence.cpp b/engines/wintermute/ad/ad_sentence.cpp index 9192b74c4e..70a57a624d 100644 --- a/engines/wintermute/ad/ad_sentence.cpp +++ b/engines/wintermute/ad/ad_sentence.cpp @@ -204,8 +204,8 @@ bool AdSentence::display() { } if (_gameRef->_subtitles) { - int x = _pos.x; - int y = _pos.y; + int32 x = _pos.x; + int32 y = _pos.y; if (!_fixedPos) { x = x - ((AdGame *)_gameRef)->_scene->getOffsetLeft(); @@ -213,9 +213,9 @@ bool AdSentence::display() { } - x = MAX(x, 0); + x = MAX<int32>(x, 0); x = MIN(x, _gameRef->_renderer->getWidth() - _width); - y = MAX(y, 0); + y = MAX<int32>(y, 0); _font->drawText((byte *)_text, x, y, _width, _align); } @@ -247,20 +247,20 @@ bool AdSentence::finish() { ////////////////////////////////////////////////////////////////////////// bool AdSentence::persist(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER_INT(_align)); persistMgr->transfer(TMEMBER(_currentStance)); - persistMgr->transfer(TMEMBER(_currentSprite)); + persistMgr->transferPtr(TMEMBER_PTR(_currentSprite)); persistMgr->transfer(TMEMBER(_currentSkelAnim)); persistMgr->transfer(TMEMBER(_duration)); - persistMgr->transfer(TMEMBER(_font)); + persistMgr->transferPtr(TMEMBER_PTR(_font)); persistMgr->transfer(TMEMBER(_pos)); - persistMgr->transfer(TMEMBER(_sound)); + persistMgr->transferPtr(TMEMBER_PTR(_sound)); persistMgr->transfer(TMEMBER(_soundStarted)); persistMgr->transfer(TMEMBER(_stances)); persistMgr->transfer(TMEMBER(_startTime)); - persistMgr->transfer(TMEMBER(_talkDef)); + persistMgr->transferPtr(TMEMBER_PTR(_talkDef)); persistMgr->transfer(TMEMBER(_tempStance)); persistMgr->transfer(TMEMBER(_text)); persistMgr->transfer(TMEMBER(_width)); diff --git a/engines/wintermute/ad/ad_sprite_set.cpp b/engines/wintermute/ad/ad_sprite_set.cpp index ffa7bb2530..6c802c4863 100644 --- a/engines/wintermute/ad/ad_sprite_set.cpp +++ b/engines/wintermute/ad/ad_sprite_set.cpp @@ -249,9 +249,9 @@ bool AdSpriteSet::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_owner)); + persistMgr->transferPtr(TMEMBER_PTR(_owner)); for (int i = 0; i < NUM_DIRECTIONS; i++) { - persistMgr->transfer("", &_sprites[i]); + persistMgr->transferPtr("", &_sprites[i]); } return STATUS_OK; diff --git a/engines/wintermute/ad/ad_talk_def.cpp b/engines/wintermute/ad/ad_talk_def.cpp index 4ad5d2ccc6..bf72b2916b 100644 --- a/engines/wintermute/ad/ad_talk_def.cpp +++ b/engines/wintermute/ad/ad_talk_def.cpp @@ -208,9 +208,9 @@ bool AdTalkDef::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_defaultSprite)); + persistMgr->transferPtr(TMEMBER_PTR(_defaultSprite)); persistMgr->transfer(TMEMBER(_defaultSpriteFilename)); - persistMgr->transfer(TMEMBER(_defaultSpriteSet)); + persistMgr->transferPtr(TMEMBER_PTR(_defaultSpriteSet)); persistMgr->transfer(TMEMBER(_defaultSpriteSetFilename)); _nodes.persist(persistMgr); diff --git a/engines/wintermute/ad/ad_talk_holder.cpp b/engines/wintermute/ad/ad_talk_holder.cpp index ed2333a345..33deab7805 100644 --- a/engines/wintermute/ad/ad_talk_holder.cpp +++ b/engines/wintermute/ad/ad_talk_holder.cpp @@ -392,7 +392,7 @@ bool AdTalkHolder::saveAsText(BaseDynamicBuffer *buffer, int indent) { bool AdTalkHolder::persist(BasePersistenceManager *persistMgr) { AdObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_sprite)); + persistMgr->transferPtr(TMEMBER_PTR(_sprite)); _talkSprites.persist(persistMgr); _talkSpritesEx.persist(persistMgr); diff --git a/engines/wintermute/ad/ad_talk_node.cpp b/engines/wintermute/ad/ad_talk_node.cpp index 2e0985ed99..f03c24ea94 100644 --- a/engines/wintermute/ad/ad_talk_node.cpp +++ b/engines/wintermute/ad/ad_talk_node.cpp @@ -195,9 +195,9 @@ bool AdTalkNode::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_startTime)); persistMgr->transfer(TMEMBER(_endTime)); persistMgr->transfer(TMEMBER(_playToEnd)); - persistMgr->transfer(TMEMBER(_sprite)); + persistMgr->transferPtr(TMEMBER_PTR(_sprite)); persistMgr->transfer(TMEMBER(_spriteFilename)); - persistMgr->transfer(TMEMBER(_spriteSet)); + persistMgr->transferPtr(TMEMBER_PTR(_spriteSet)); persistMgr->transfer(TMEMBER(_spriteSetFilename)); return STATUS_OK; diff --git a/engines/wintermute/base/base_frame.cpp b/engines/wintermute/base/base_frame.cpp index 382e8acbe0..9fb5770f79 100644 --- a/engines/wintermute/base/base_frame.cpp +++ b/engines/wintermute/base/base_frame.cpp @@ -420,7 +420,7 @@ bool BaseFrame::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_killSound)); persistMgr->transfer(TMEMBER(_moveX)); persistMgr->transfer(TMEMBER(_moveY)); - persistMgr->transfer(TMEMBER(_sound)); + persistMgr->transferPtr(TMEMBER_PTR(_sound)); _subframes.persist(persistMgr); return STATUS_OK; diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp index 0f2a3d1260..e97e342149 100644 --- a/engines/wintermute/base/base_game.cpp +++ b/engines/wintermute/base/base_game.cpp @@ -602,7 +602,7 @@ int BaseGame::getSequence() { ////////////////////////////////////////////////////////////////////////// -void BaseGame::setOffset(int offsetX, int offsetY) { +void BaseGame::setOffset(int32 offsetX, int32 offsetY) { _offsetX = offsetX; _offsetY = offsetY; } @@ -1090,11 +1090,11 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "SetMousePos") == 0) { stack->correctParams(2); - int x = stack->pop()->getInt(); - int y = stack->pop()->getInt(); - x = MAX(x, 0); + int32 x = stack->pop()->getInt(); + int32 y = stack->pop()->getInt(); + x = MAX<int32>(x, 0); x = MIN(x, _renderer->getWidth()); - y = MAX(y, 0); + y = MAX<int32>(y, 0); y = MIN(y, _renderer->getHeight()); Point32 p; p.x = x + _renderer->_drawOffsetX; @@ -2486,7 +2486,7 @@ bool BaseGame::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "SoundBufferSize") == 0) { _soundBufferSizeSec = value->getInt(); - _soundBufferSizeSec = MAX(3, _soundBufferSizeSec); + _soundBufferSizeSec = MAX<int32>(3, _soundBufferSizeSec); return STATUS_OK; } @@ -2995,7 +2995,7 @@ bool BaseGame::showCursor() { ////////////////////////////////////////////////////////////////////////// -bool BaseGame::saveGame(int slot, const char *desc, bool quickSave) { +bool BaseGame::saveGame(int32 slot, const char *desc, bool quickSave) { return SaveLoad::saveGame(slot, desc, quickSave, _gameRef); } @@ -3055,18 +3055,18 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_activeObject)); - persistMgr->transfer(TMEMBER(_capturedObject)); - persistMgr->transfer(TMEMBER(_cursorNoninteractive)); + persistMgr->transferPtr(TMEMBER_PTR(_activeObject)); + persistMgr->transferPtr(TMEMBER_PTR(_capturedObject)); + persistMgr->transferPtr(TMEMBER_PTR(_cursorNoninteractive)); persistMgr->transfer(TMEMBER(_editorMode)); - persistMgr->transfer(TMEMBER(_fader)); + persistMgr->transferPtr(TMEMBER_PTR(_fader)); persistMgr->transfer(TMEMBER(_freezeLevel)); - persistMgr->transfer(TMEMBER(_focusedWindow)); - persistMgr->transfer(TMEMBER(_fontStorage)); + persistMgr->transferPtr(TMEMBER_PTR(_focusedWindow)); + persistMgr->transferPtr(TMEMBER_PTR(_fontStorage)); persistMgr->transfer(TMEMBER(_interactive)); - persistMgr->transfer(TMEMBER(_keyboardState)); + persistMgr->transferPtr(TMEMBER_PTR(_keyboardState)); persistMgr->transfer(TMEMBER(_lastTime)); - persistMgr->transfer(TMEMBER(_mainObject)); + persistMgr->transferPtr(TMEMBER_PTR(_mainObject)); _musicSystem->persistChannels(persistMgr); _musicSystem->persistCrossfadeSettings(persistMgr); @@ -3082,14 +3082,14 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) { _regObjects.persist(persistMgr); - persistMgr->transfer(TMEMBER(_scEngine)); + persistMgr->transferPtr(TMEMBER_PTR(_scEngine)); //persistMgr->transfer(TMEMBER(_soundMgr)); persistMgr->transfer(TMEMBER_INT(_state)); //persistMgr->transfer(TMEMBER(_surfaceStorage)); persistMgr->transfer(TMEMBER(_subtitles)); persistMgr->transfer(TMEMBER(_subtitlesSpeed)); - persistMgr->transfer(TMEMBER(_systemFont)); - persistMgr->transfer(TMEMBER(_videoFont)); + persistMgr->transferPtr(TMEMBER_PTR(_systemFont)); + persistMgr->transferPtr(TMEMBER_PTR(_videoFont)); persistMgr->transfer(TMEMBER(_videoSubtitles)); _timerNormal.persist(persistMgr); @@ -3840,7 +3840,7 @@ bool BaseGame::isRightDoubleClick() { } ////////////////////////////////////////////////////////////////////////// -bool BaseGame::isDoubleClick(int buttonIndex) { +bool BaseGame::isDoubleClick(int32 buttonIndex) { uint32 maxDoubleCLickTime = 500; int maxMoveX = 4; int maxMoveY = 4; diff --git a/engines/wintermute/base/base_game_music.cpp b/engines/wintermute/base/base_game_music.cpp index a39deb8d8d..ac23801e4c 100644 --- a/engines/wintermute/base/base_game_music.cpp +++ b/engines/wintermute/base/base_game_music.cpp @@ -214,7 +214,7 @@ bool BaseGameMusic::updateMusicCrossfade() { bool BaseGameMusic::persistChannels(BasePersistenceManager *persistMgr) { for (int i = 0; i < NUM_MUSIC_CHANNELS; i++) { - persistMgr->transfer(TMEMBER(_music[i])); + persistMgr->transferPtr(TMEMBER_PTR(_music[i])); persistMgr->transfer(TMEMBER(_musicStartTime[i])); } return true; diff --git a/engines/wintermute/base/base_object.cpp b/engines/wintermute/base/base_object.cpp index 75ba4fb50f..ad181b922e 100644 --- a/engines/wintermute/base/base_object.cpp +++ b/engines/wintermute/base/base_object.cpp @@ -955,10 +955,10 @@ bool BaseObject::persist(BasePersistenceManager *persistMgr) { for (int i = 0; i < 7; i++) { persistMgr->transfer(TMEMBER(_caption[i])); } - persistMgr->transfer(TMEMBER(_activeCursor)); + persistMgr->transferPtr(TMEMBER_PTR(_activeCursor)); persistMgr->transfer(TMEMBER(_alphaColor)); persistMgr->transfer(TMEMBER(_autoSoundPanning)); - persistMgr->transfer(TMEMBER(_cursor)); + persistMgr->transferPtr(TMEMBER_PTR(_cursor)); persistMgr->transfer(TMEMBER(_sharedCursors)); persistMgr->transfer(TMEMBER(_editorAlwaysRegister)); persistMgr->transfer(TMEMBER(_editorOnly)); @@ -971,7 +971,7 @@ bool BaseObject::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_relativeScale)); persistMgr->transfer(TMEMBER(_rotatable)); persistMgr->transfer(TMEMBER(_scale)); - persistMgr->transfer(TMEMBER(_sFX)); + persistMgr->transferPtr(TMEMBER_PTR(_sFX)); persistMgr->transfer(TMEMBER(_sFXStart)); persistMgr->transfer(TMEMBER(_sFXVolume)); persistMgr->transfer(TMEMBER(_ready)); diff --git a/engines/wintermute/base/base_persistence_manager.cpp b/engines/wintermute/base/base_persistence_manager.cpp index 12bc62d5dc..5dbacb157b 100644 --- a/engines/wintermute/base/base_persistence_manager.cpp +++ b/engines/wintermute/base/base_persistence_manager.cpp @@ -533,7 +533,7 @@ TimeDate BasePersistenceManager::getTimeDate() { } void BasePersistenceManager::putFloat(float val) { - int32 exponent = 0; + int exponent = 0; float significand = frexp(val, &exponent); Common::String str = Common::String::format("FS%f", significand); _saveStream->writeUint32LE(str.size()); @@ -556,7 +556,7 @@ float BasePersistenceManager::getFloat() { } void BasePersistenceManager::putDouble(double val) { - int32 exponent = 0; + int exponent = 0; double significand = frexp(val, &exponent); Common::String str = Common::String::format("DS%f", significand); _saveStream->writeUint32LE(str.size()); @@ -599,7 +599,7 @@ bool BasePersistenceManager::transfer(const char *name, bool *val) { ////////////////////////////////////////////////////////////////////////// // int -bool BasePersistenceManager::transfer(const char *name, int *val) { +bool BasePersistenceManager::transfer(const char *name, int32 *val) { if (_saving) { _saveStream->writeSint32LE(*val); if (_saveStream->err()) { @@ -848,7 +848,8 @@ bool BasePersistenceManager::transfer(const char *name, Vector2 *val) { ////////////////////////////////////////////////////////////////////////// // generic pointer -bool BasePersistenceManager::transfer(const char *name, void *val) { + +bool BasePersistenceManager::transferPtr(const char *name, void *val) { int classID = -1, instanceID = -1; if (_saving) { @@ -869,7 +870,6 @@ bool BasePersistenceManager::transfer(const char *name, void *val) { return STATUS_OK; } - ////////////////////////////////////////////////////////////////////////// bool BasePersistenceManager::checkVersion(byte verMajor, byte verMinor, byte verBuild) { if (_saving) { diff --git a/engines/wintermute/base/base_persistence_manager.h b/engines/wintermute/base/base_persistence_manager.h index 8cc21b353b..7b578085ba 100644 --- a/engines/wintermute/base/base_persistence_manager.h +++ b/engines/wintermute/base/base_persistence_manager.h @@ -73,8 +73,8 @@ public: uint32 _richBufferSize; byte *_richBuffer; - bool transfer(const char *name, void *val); - bool transfer(const char *name, int *val); + bool transferPtr(const char *name, void *val); + bool transfer(const char *name, int32 *val); bool transfer(const char *name, uint32 *val); bool transfer(const char *name, float *val); bool transfer(const char *name, double *val); diff --git a/engines/wintermute/base/base_region.cpp b/engines/wintermute/base/base_region.cpp index 51d222be4c..2dabe6ae44 100644 --- a/engines/wintermute/base/base_region.cpp +++ b/engines/wintermute/base/base_region.cpp @@ -493,7 +493,7 @@ bool BaseRegion::getBoundingRect(Rect32 *rect) { if (_points.size() == 0) { BasePlatform::setRectEmpty(rect); } else { - int minX = INT_MAX, minY = INT_MAX, maxX = INT_MIN, maxY = INT_MIN; + int32 minX = INT_MAX, minY = INT_MAX, maxX = INT_MIN, maxY = INT_MIN; for (uint32 i = 0; i < _points.size(); i++) { minX = MIN(minX, _points[i]->x); diff --git a/engines/wintermute/base/base_scriptable.cpp b/engines/wintermute/base/base_scriptable.cpp index fca1df4c90..5753b0482b 100644 --- a/engines/wintermute/base/base_scriptable.cpp +++ b/engines/wintermute/base/base_scriptable.cpp @@ -152,10 +152,10 @@ void BaseScriptable::scSetBool(bool val) { ////////////////////////////////////////////////////////////////////////// bool BaseScriptable::persist(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER(_refCount)); - persistMgr->transfer(TMEMBER(_scProp)); - persistMgr->transfer(TMEMBER(_scValue)); + persistMgr->transferPtr(TMEMBER_PTR(_scProp)); + persistMgr->transferPtr(TMEMBER_PTR(_scValue)); return STATUS_OK; } diff --git a/engines/wintermute/base/base_sprite.cpp b/engines/wintermute/base/base_sprite.cpp index 3f809f7a46..c920da9ee9 100644 --- a/engines/wintermute/base/base_sprite.cpp +++ b/engines/wintermute/base/base_sprite.cpp @@ -298,8 +298,8 @@ bool BaseSprite::loadBuffer(byte *buffer, bool complete, int lifeTime, TSpriteCa case TOKEN_EDITOR_BG_ALPHA: parser.scanStr((char *)params, "%d", &_editorBgAlpha); - _editorBgAlpha = MIN(_editorBgAlpha, 255); - _editorBgAlpha = MAX(_editorBgAlpha, 0); + _editorBgAlpha = MIN<int32>(_editorBgAlpha, 255); + _editorBgAlpha = MAX<int32>(_editorBgAlpha, 0); break; case TOKEN_FRAME: { @@ -539,7 +539,7 @@ bool BaseSprite::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_looping)); persistMgr->transfer(TMEMBER(_moveX)); persistMgr->transfer(TMEMBER(_moveY)); - persistMgr->transfer(TMEMBER(_owner)); + persistMgr->transferPtr(TMEMBER_PTR(_owner)); persistMgr->transfer(TMEMBER(_precise)); persistMgr->transfer(TMEMBER(_streamed)); persistMgr->transfer(TMEMBER(_streamedKeepLoaded)); diff --git a/engines/wintermute/base/base_sprite.h b/engines/wintermute/base/base_sprite.h index 24c1f47755..05cb9fc936 100644 --- a/engines/wintermute/base/base_sprite.h +++ b/engines/wintermute/base/base_sprite.h @@ -56,7 +56,7 @@ public: bool loadFile(const Common::String &filename, int lifeTime = -1, TSpriteCacheType cacheType = CACHE_ALL); bool draw(int x, int y, BaseObject *Register = nullptr, float zoomX = 100, float zoomY = 100, uint32 alpha = 0xFFFFFFFF); bool _looping; - int _currentFrame; + int32 _currentFrame; bool addFrame(const char *filename, uint32 delay = 0, int hotspotX = 0, int hotspotY = 0, Rect32 *rect = nullptr); BaseSprite(BaseGame *inGame, BaseObject *owner = nullptr); virtual ~BaseSprite(); diff --git a/engines/wintermute/base/base_sub_frame.h b/engines/wintermute/base/base_sub_frame.h index 1ecf6c671d..37ba34b748 100644 --- a/engines/wintermute/base/base_sub_frame.h +++ b/engines/wintermute/base/base_sub_frame.h @@ -56,8 +56,8 @@ public: bool getBoundingRect(Rect32 *rect, int x, int y, float scaleX = 100, float scaleY = 100); const char* getSurfaceFilename(); - int _hotspotX; - int _hotspotY; + int32 _hotspotX; + int32 _hotspotY; uint32 _alpha; // These two setters and getters are rather usefull, as they allow _rect to be lazily defined // Thus we don't need to load the actual graphics before the rect is actually needed. diff --git a/engines/wintermute/base/base_viewport.cpp b/engines/wintermute/base/base_viewport.cpp index 4f62a4f6f9..f79e5c9f13 100644 --- a/engines/wintermute/base/base_viewport.cpp +++ b/engines/wintermute/base/base_viewport.cpp @@ -53,9 +53,9 @@ BaseViewport::~BaseViewport() { ////////////////////////////////////////////////////////////////////////// bool BaseViewport::persist(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); - persistMgr->transfer(TMEMBER(_mainObject)); + persistMgr->transferPtr(TMEMBER_PTR(_mainObject)); persistMgr->transfer(TMEMBER(_offsetX)); persistMgr->transfer(TMEMBER(_offsetY)); persistMgr->transfer(TMEMBER(_rect)); @@ -65,10 +65,10 @@ bool BaseViewport::persist(BasePersistenceManager *persistMgr) { ////////////////////////////////////////////////////////////////////////// -bool BaseViewport::setRect(int left, int top, int right, int bottom, bool noCheck) { +bool BaseViewport::setRect(int32 left, int32 top, int32 right, int32 bottom, bool noCheck) { if (!noCheck) { - left = MAX(left, 0); - top = MAX(top, 0); + left = MAX<int32>(left, 0); + top = MAX<int32>(top, 0); right = MIN(right, BaseEngine::instance().getRenderer()->getWidth()); bottom = MIN(bottom, BaseEngine::instance().getRenderer()->getHeight()); } diff --git a/engines/wintermute/base/base_viewport.h b/engines/wintermute/base/base_viewport.h index 75b9989080..584e5a78f9 100644 --- a/engines/wintermute/base/base_viewport.h +++ b/engines/wintermute/base/base_viewport.h @@ -41,7 +41,7 @@ public: int getHeight() const; int getWidth() const; Rect32 *getRect(); - bool setRect(int left, int top, int right, int bottom, bool noCheck = false); + bool setRect(int32 left, int32 top, int32 right, int32 bottom, bool noCheck = false); DECLARE_PERSISTENT(BaseViewport, BaseClass) int32 _offsetY; int32 _offsetX; diff --git a/engines/wintermute/base/font/base_font_bitmap.cpp b/engines/wintermute/base/font/base_font_bitmap.cpp index 5139620727..03bd471636 100644 --- a/engines/wintermute/base/font/base_font_bitmap.cpp +++ b/engines/wintermute/base/font/base_font_bitmap.cpp @@ -478,7 +478,7 @@ bool BaseFontBitmap::loadBuffer(byte *buffer) { _widths[spaceChar] = spaceWidth; } else { if (_widths[spaceChar] == expandWidth || _widths[spaceChar] == 0) { - _widths[spaceChar] = (_widths['m'] + _widths['i']) / 2; + _widths[spaceChar] = (_widths[(uint)'m'] + _widths[(uint)'i']) / 2; } } } else { @@ -498,10 +498,10 @@ bool BaseFontBitmap::persist(BasePersistenceManager *persistMgr) { BaseFont::persist(persistMgr); persistMgr->transfer(TMEMBER(_numColumns)); - persistMgr->transfer(TMEMBER(_subframe)); + persistMgr->transferPtr(TMEMBER_PTR(_subframe)); persistMgr->transfer(TMEMBER(_tileHeight)); persistMgr->transfer(TMEMBER(_tileWidth)); - persistMgr->transfer(TMEMBER(_sprite)); + persistMgr->transferPtr(TMEMBER_PTR(_sprite)); persistMgr->transfer(TMEMBER(_widthsFrame)); if (persistMgr->getIsSaving()) { diff --git a/engines/wintermute/base/font/base_font_bitmap.h b/engines/wintermute/base/font/base_font_bitmap.h index e380a949e2..0bdac64026 100644 --- a/engines/wintermute/base/font/base_font_bitmap.h +++ b/engines/wintermute/base/font/base_font_bitmap.h @@ -39,10 +39,10 @@ public: DECLARE_PERSISTENT(BaseFontBitmap, BaseFont) bool loadBuffer(byte *Buffer); bool loadFile(const Common::String &filename); - virtual int getTextWidth(const byte *text, int maxLength = -1); - virtual int getTextHeight(const byte *text, int width); - virtual void drawText(const byte *text, int x, int y, int width, TTextAlign align = TAL_LEFT, int max_height = -1, int maxLength = -1); - virtual int getLetterHeight(); + virtual int getTextWidth(const byte *text, int maxLength = -1) override; + virtual int getTextHeight(const byte *text, int width) override; + virtual void drawText(const byte *text, int x, int y, int width, TTextAlign align = TAL_LEFT, int max_height = -1, int maxLength = -1) override; + virtual int getLetterHeight() override; BaseFontBitmap(BaseGame *inGame); virtual ~BaseFontBitmap(); @@ -50,11 +50,11 @@ public: private: bool getWidths(); BaseSprite *_sprite; - int _widthsFrame; + int32 _widthsFrame; bool _fontextFix; - int _numColumns; - int _tileHeight; - int _tileWidth; + int32 _numColumns; + int32 _tileHeight; + int32 _tileWidth; byte _widths[NUM_CHARACTERS]; BaseSubFrame *_subframe; bool _wholeCell; diff --git a/engines/wintermute/base/font/base_font_storage.cpp b/engines/wintermute/base/font/base_font_storage.cpp index 6a625f30ae..3286742478 100644 --- a/engines/wintermute/base/font/base_font_storage.cpp +++ b/engines/wintermute/base/font/base_font_storage.cpp @@ -132,7 +132,7 @@ bool BaseFontStorage::persist(BasePersistenceManager *persistMgr) { cleanup(false); } - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); _fonts.persist(persistMgr); return STATUS_OK; diff --git a/engines/wintermute/base/font/base_font_truetype.cpp b/engines/wintermute/base/font/base_font_truetype.cpp index 246c6befb7..2fcdebc117 100644 --- a/engines/wintermute/base/font/base_font_truetype.cpp +++ b/engines/wintermute/base/font/base_font_truetype.cpp @@ -39,6 +39,7 @@ #include "graphics/fonts/ttf.h" #include "graphics/fontman.h" #include "common/unzip.h" +#include "common/config-manager.h" // For Scummmodern.zip #include <limits.h> namespace Wintermute { @@ -509,7 +510,7 @@ bool BaseFontTT::persist(BasePersistenceManager *persistMgr) { // persist layers - int numLayers; + int32 numLayers; if (persistMgr->getIsSaving()) { numLayers = _layers.size(); persistMgr->transfer(TMEMBER(numLayers)); @@ -566,7 +567,19 @@ bool BaseFontTT::initFont() { // Fallback2: Try to find ScummModern.zip, and get the font from there: if (!_font) { - Common::SeekableReadStream *themeFile = SearchMan.createReadStreamForMember("scummmodern.zip"); + Common::SeekableReadStream *themeFile = nullptr; + if (ConfMan.hasKey("themepath")) { + Common::FSNode themePath(ConfMan.get("themepath")); + if (themePath.exists()) { + Common::FSNode scummModern = themePath.getChild("scummmodern.zip"); + if (scummModern.exists()) { + themeFile = scummModern.createReadStream(); + } + } + } + if (!themeFile) { // Fallback 2.5: Search for ScummModern.zip in SearchMan. + themeFile = SearchMan.createReadStreamForMember("scummmodern.zip"); + } if (themeFile) { Common::Archive *themeArchive = Common::makeZipArchive(themeFile); if (themeArchive->hasFile("FreeSans.ttf")) { diff --git a/engines/wintermute/base/font/base_font_truetype.h b/engines/wintermute/base/font/base_font_truetype.h index c9ac4cd993..f93505921f 100644 --- a/engines/wintermute/base/font/base_font_truetype.h +++ b/engines/wintermute/base/font/base_font_truetype.h @@ -46,13 +46,13 @@ private: class BaseCachedTTFontText { public: WideString _text; - int _width; + int32 _width; TTextAlign _align; - int _maxHeight; - int _maxLength; + int32 _maxHeight; + int32 _maxLength; BaseSurface *_surface; - int _priority; - int _textOffset; + int32 _priority; + int32 _textOffset; bool _marked; uint32 _lastUsed; @@ -90,8 +90,8 @@ public: return STATUS_OK; } - int _offsetX; - int _offsetY; + int32 _offsetX; + int32 _offsetY; uint32 _color; }; @@ -100,10 +100,10 @@ public: BaseFontTT(BaseGame *inGame); virtual ~BaseFontTT(void); - virtual int getTextWidth(const byte *text, int maxLength = -1); - virtual int getTextHeight(const byte *text, int width); - virtual void drawText(const byte *text, int x, int y, int width, TTextAlign align = TAL_LEFT, int max_height = -1, int maxLength = -1); - virtual int getLetterHeight(); + virtual int getTextWidth(const byte *text, int maxLength = -1) override; + virtual int getTextHeight(const byte *text, int width) override; + virtual void drawText(const byte *text, int x, int y, int width, TTextAlign align = TAL_LEFT, int max_height = -1, int maxLength = -1) override; + virtual int getLetterHeight() override; bool loadBuffer(byte *buffer); bool loadFile(const Common::String &filename); @@ -140,7 +140,7 @@ public: bool _isItalic; bool _isUnderline; bool _isStriked; - int _fontHeight; + int32 _fontHeight; char *_fontFile; BaseArray<BaseTTFontLayer *> _layers; diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp index 0bb987a8b9..e1424cea87 100644 --- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp +++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp @@ -39,6 +39,8 @@ #include "common/queue.h" #include "common/config-manager.h" +#define DIRTY_RECT_LIMIT 800 + namespace Wintermute { BaseRenderer *makeOSystemRenderer(BaseGame *inGame) { @@ -62,6 +64,7 @@ BaseRenderOSystem::BaseRenderOSystem(BaseGame *inGame) : BaseRenderer(inGame) { setColorMod(255, 255, 255); _dirtyRect = nullptr; _disableDirtyRects = false; + _tempDisableDirtyRects = 0; if (ConfMan.hasKey("dirty_rects")) { _disableDirtyRects = !ConfMan.getBool("dirty_rects"); } @@ -166,6 +169,9 @@ bool BaseRenderOSystem::indicatorFlip() { } bool BaseRenderOSystem::flip() { + if (_renderQueue.size() > DIRTY_RECT_LIMIT) { + _tempDisableDirtyRects++; + } if (_skipThisFrame) { _skipThisFrame = false; delete _dirtyRect; @@ -176,7 +182,7 @@ bool BaseRenderOSystem::flip() { addDirtyRect(_renderRect); return true; } - if (!_disableDirtyRects) { + if (!_tempDisableDirtyRects && !_disableDirtyRects) { drawTickets(); } else { // Clear the scale-buffered tickets that wasn't reused. @@ -192,8 +198,8 @@ bool BaseRenderOSystem::flip() { } } } - if (_needsFlip || _disableDirtyRects) { - if (_disableDirtyRects) { + if (_needsFlip || _disableDirtyRects || _tempDisableDirtyRects) { + if (_disableDirtyRects || _tempDisableDirtyRects) { g_system->copyRectToScreen((byte *)_renderSurface->pixels, _renderSurface->pitch, 0, 0, _renderSurface->w, _renderSurface->h); } // g_system->copyRectToScreen((byte *)_renderSurface->pixels, _renderSurface->pitch, _dirtyRect->left, _dirtyRect->top, _dirtyRect->width(), _dirtyRect->height()); @@ -204,13 +210,29 @@ bool BaseRenderOSystem::flip() { } _drawNum = 1; + if (_tempDisableDirtyRects && !_disableDirtyRects) { + _tempDisableDirtyRects--; + if (!_tempDisableDirtyRects) { + Common::Rect screen(_screenRect.top, _screenRect.left, _screenRect.bottom, _screenRect.right); + addDirtyRect(screen); + + // The queue has been ignored but updated, and is guaranteed to be in draw-order when run without dirty-rects. + RenderQueueIterator it = _renderQueue.begin(); + int drawNum = 1; + while (it != _renderQueue.end()) { + (*it)->_drawNum = drawNum++; + ++it; + } + } + } + return STATUS_OK; } ////////////////////////////////////////////////////////////////////////// bool BaseRenderOSystem::fill(byte r, byte g, byte b, Common::Rect *rect) { _clearColor = _renderSurface->format.ARGBToColor(0xFF, r, g, b); - if (!_disableDirtyRects) { + if (!_disableDirtyRects && !_tempDisableDirtyRects) { return STATUS_OK; } if (!rect) { @@ -277,6 +299,15 @@ Graphics::PixelFormat BaseRenderOSystem::getPixelFormat() const { } void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, bool mirrorX, bool mirrorY, bool disableAlpha) { + if (_tempDisableDirtyRects || _disableDirtyRects) { + RenderTicket *ticket = new RenderTicket(owner, surf, srcRect, dstRect, mirrorX, mirrorY, disableAlpha); + ticket->_colorMod = _colorMod; + ticket->_wantsDraw = true; + _renderQueue.push_back(ticket); + _previousTicket = ticket; + drawFromSurface(ticket); + return; + } // Start searching from the beginning for the first and second items (since it's empty the first time around // then keep incrementing the start-position, to avoid comparing against already used tickets. if (_drawNum == 0 || _drawNum == 1) { @@ -310,6 +341,10 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S drawFromTicket(compareTicket); _previousTicket = compareTicket; } + if (_renderQueue.size() > DIRTY_RECT_LIMIT) { + drawTickets(); + _tempDisableDirtyRects = 3; + } return; } } @@ -322,6 +357,8 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S } else { ticket->_wantsDraw = true; _renderQueue.push_back(ticket); + _previousTicket = ticket; + drawFromSurface(ticket); } } @@ -330,7 +367,7 @@ void BaseRenderOSystem::repeatLastDraw(int offsetX, int offsetY, int numTimesX, RenderTicket *origTicket = _previousTicket; // Make sure drawSurface WILL start from the correct _lastAddedTicket - if (*_lastAddedTicket != origTicket) { + if (!_tempDisableDirtyRects && !_disableDirtyRects && *_lastAddedTicket != origTicket) { RenderQueueIterator it; RenderQueueIterator endIterator = _renderQueue.end(); for (it = _renderQueue.begin(); it != endIterator; ++it) { @@ -541,7 +578,7 @@ void BaseRenderOSystem::drawFromSurface(RenderTicket *ticket, Common::Rect *dstR bool BaseRenderOSystem::drawLine(int x1, int y1, int x2, int y2, uint32 color) { // This function isn't used outside of indicator-displaying, and thus quite unused in // BaseRenderOSystem when dirty-rects are enabled. - if (!_disableDirtyRects && !_indicatorDisplay) { + if (!_tempDisableDirtyRects && !_disableDirtyRects && !_indicatorDisplay) { error("BaseRenderOSystem::DrawLine - doesn't work for dirty rects yet"); } diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h index cc2ed57f9b..3cb0fa82a3 100644 --- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h +++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h @@ -108,6 +108,7 @@ private: int _borderBottom; bool _disableDirtyRects; + uint32 _tempDisableDirtyRects; bool _spriteBatch; uint32 _batchNum; float _ratioX; diff --git a/engines/wintermute/base/particles/part_emitter.cpp b/engines/wintermute/base/particles/part_emitter.cpp index d09f2215dd..c86e1ce369 100644 --- a/engines/wintermute/base/particles/part_emitter.cpp +++ b/engines/wintermute/base/particles/part_emitter.cpp @@ -1212,7 +1212,7 @@ bool PartEmitter::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER_INT(_batchesGenerated)); persistMgr->transfer(TMEMBER(_emitEvent)); - persistMgr->transfer(TMEMBER(_owner)); + persistMgr->transferPtr(TMEMBER_PTR(_owner)); _sprites.persist(persistMgr); diff --git a/engines/wintermute/base/particles/part_emitter.h b/engines/wintermute/base/particles/part_emitter.h index cbc0aa49b4..a0d701f338 100644 --- a/engines/wintermute/base/particles/part_emitter.h +++ b/engines/wintermute/base/particles/part_emitter.h @@ -94,31 +94,31 @@ private: float _scale2; bool _scaleZBased; - int _maxParticles; + int32 _maxParticles; - int _lifeTime1; - int _lifeTime2; + int32 _lifeTime1; + int32 _lifeTime2; bool _lifeTimeZBased; - int _genInterval; - int _genAmount; + int32 _genInterval; + int32 _genAmount; bool _running; - int _overheadTime; + int32 _overheadTime; - int _maxBatches; - int _batchesGenerated; + int32 _maxBatches; + int32 _batchesGenerated; Rect32 _border; - int _borderThicknessLeft; - int _borderThicknessRight; - int _borderThicknessTop; - int _borderThicknessBottom; + int32 _borderThicknessLeft; + int32 _borderThicknessRight; + int32 _borderThicknessTop; + int32 _borderThicknessBottom; - int _fadeInTime; + int32 _fadeInTime; - int _alpha1; - int _alpha2; + int32 _alpha1; + int32 _alpha2; bool _alphaTimeBased; bool _useRegion; diff --git a/engines/wintermute/base/save_thumb_helper.cpp b/engines/wintermute/base/save_thumb_helper.cpp index db6f855cc6..bab29c5cf8 100644 --- a/engines/wintermute/base/save_thumb_helper.cpp +++ b/engines/wintermute/base/save_thumb_helper.cpp @@ -35,7 +35,7 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////////// -SaveThumbHelper::SaveThumbHelper(const BaseGame *inGame) { +SaveThumbHelper::SaveThumbHelper(BaseGame *inGame) : _gameRef(inGame) { _thumbnail = nullptr; _scummVMThumb = nullptr; } diff --git a/engines/wintermute/base/save_thumb_helper.h b/engines/wintermute/base/save_thumb_helper.h index 43cc7e39a7..d3bc5f5523 100644 --- a/engines/wintermute/base/save_thumb_helper.h +++ b/engines/wintermute/base/save_thumb_helper.h @@ -35,7 +35,7 @@ class BaseGame; class SaveThumbHelper { public: - SaveThumbHelper(const BaseGame *inGame); + SaveThumbHelper(BaseGame *inGame); virtual ~SaveThumbHelper(void); bool storeThumbnail(bool doFlip = false); bool storeScummVMThumbNail(bool doFlip = false); @@ -44,7 +44,6 @@ public: BaseImage *_scummVMThumb; private: BaseImage *storeThumb(bool doFlip, int width, int height); - BaseImage *_richThumbnail; BaseGame *_gameRef; }; diff --git a/engines/wintermute/base/scriptables/script.cpp b/engines/wintermute/base/scriptables/script.cpp index 56ffbf75c5..1b945c2e1c 100644 --- a/engines/wintermute/base/scriptables/script.cpp +++ b/engines/wintermute/base/scriptables/script.cpp @@ -1243,7 +1243,7 @@ void ScScript::runtimeError(const char *fmt, ...) { ////////////////////////////////////////////////////////////////////////// bool ScScript::persist(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); // buffer if (persistMgr->getIsSaving()) { @@ -1252,7 +1252,7 @@ bool ScScript::persist(BasePersistenceManager *persistMgr) { persistMgr->putBytes(_buffer, _bufferSize); } else { // don't save idle/finished scripts - int bufferSize = 0; + int32 bufferSize = 0; persistMgr->transfer(TMEMBER(bufferSize)); } } else { @@ -1268,33 +1268,33 @@ bool ScScript::persist(BasePersistenceManager *persistMgr) { } } - persistMgr->transfer(TMEMBER(_callStack)); + persistMgr->transferPtr(TMEMBER_PTR(_callStack)); persistMgr->transfer(TMEMBER(_currentLine)); - persistMgr->transfer(TMEMBER(_engine)); + persistMgr->transferPtr(TMEMBER_PTR(_engine)); persistMgr->transfer(TMEMBER(_filename)); persistMgr->transfer(TMEMBER(_freezable)); - persistMgr->transfer(TMEMBER(_globals)); + persistMgr->transferPtr(TMEMBER_PTR(_globals)); persistMgr->transfer(TMEMBER(_iP)); - persistMgr->transfer(TMEMBER(_scopeStack)); - persistMgr->transfer(TMEMBER(_stack)); + persistMgr->transferPtr(TMEMBER_PTR(_scopeStack)); + persistMgr->transferPtr(TMEMBER_PTR(_stack)); persistMgr->transfer(TMEMBER_INT(_state)); - persistMgr->transfer(TMEMBER(_operand)); + persistMgr->transferPtr(TMEMBER_PTR(_operand)); persistMgr->transfer(TMEMBER_INT(_origState)); - persistMgr->transfer(TMEMBER(_owner)); - persistMgr->transfer(TMEMBER(_reg1)); + persistMgr->transferPtr(TMEMBER_PTR(_owner)); + persistMgr->transferPtr(TMEMBER_PTR(_reg1)); persistMgr->transfer(TMEMBER(_thread)); persistMgr->transfer(TMEMBER(_threadEvent)); - persistMgr->transfer(TMEMBER(_thisStack)); + persistMgr->transferPtr(TMEMBER_PTR(_thisStack)); persistMgr->transfer(TMEMBER(_timeSlice)); - persistMgr->transfer(TMEMBER(_waitObject)); - persistMgr->transfer(TMEMBER(_waitScript)); + persistMgr->transferPtr(TMEMBER_PTR(_waitObject)); + persistMgr->transferPtr(TMEMBER_PTR(_waitScript)); persistMgr->transfer(TMEMBER(_waitTime)); persistMgr->transfer(TMEMBER(_waitFrozen)); persistMgr->transfer(TMEMBER(_methodThread)); persistMgr->transfer(TMEMBER(_methodThread)); persistMgr->transfer(TMEMBER(_unbreakable)); - persistMgr->transfer(TMEMBER(_parentScript)); + persistMgr->transferPtr(TMEMBER_PTR(_parentScript)); if (!persistMgr->getIsSaving()) { _tracingMode = false; diff --git a/engines/wintermute/base/scriptables/script_engine.cpp b/engines/wintermute/base/scriptables/script_engine.cpp index d8f38f2f4d..f83fb36843 100644 --- a/engines/wintermute/base/scriptables/script_engine.cpp +++ b/engines/wintermute/base/scriptables/script_engine.cpp @@ -484,9 +484,9 @@ bool ScEngine::persist(BasePersistenceManager *persistMgr) { cleanup(); } - persistMgr->transfer(TMEMBER(_gameRef)); - persistMgr->transfer(TMEMBER(_currentScript)); - persistMgr->transfer(TMEMBER(_globals)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_currentScript)); + persistMgr->transferPtr(TMEMBER_PTR(_globals)); _scripts.persist(persistMgr); return STATUS_OK; diff --git a/engines/wintermute/base/scriptables/script_ext_array.cpp b/engines/wintermute/base/scriptables/script_ext_array.cpp index 892d0674ff..a466d361ec 100644 --- a/engines/wintermute/base/scriptables/script_ext_array.cpp +++ b/engines/wintermute/base/scriptables/script_ext_array.cpp @@ -215,7 +215,7 @@ bool SXArray::persist(BasePersistenceManager *persistMgr) { BaseScriptable::persist(persistMgr); persistMgr->transfer(TMEMBER(_length)); - persistMgr->transfer(TMEMBER(_values)); + persistMgr->transferPtr(TMEMBER_PTR(_values)); return STATUS_OK; } diff --git a/engines/wintermute/base/scriptables/script_ext_date.cpp b/engines/wintermute/base/scriptables/script_ext_date.cpp index 53a1d36b81..afca0c4bbf 100644 --- a/engines/wintermute/base/scriptables/script_ext_date.cpp +++ b/engines/wintermute/base/scriptables/script_ext_date.cpp @@ -237,12 +237,29 @@ bool SXDate::scSetProperty(const char *name, ScValue *value) { bool SXDate::persist(BasePersistenceManager *persistMgr) { BaseScriptable::persist(persistMgr); - persistMgr->transfer(TMEMBER(_tm.tm_year)); - persistMgr->transfer(TMEMBER(_tm.tm_mon)); - persistMgr->transfer(TMEMBER(_tm.tm_mday)); - persistMgr->transfer(TMEMBER(_tm.tm_hour)); - persistMgr->transfer(TMEMBER(_tm.tm_min)); - persistMgr->transfer(TMEMBER(_tm.tm_sec)); + int32 year = _tm.tm_year; + int32 mon = _tm.tm_mon; + int32 mday = _tm.tm_mday; + int32 hour = _tm.tm_hour; + int32 min = _tm.tm_min; + int32 sec = _tm.tm_sec; + persistMgr->transfer(TMEMBER(year)); + persistMgr->transfer(TMEMBER(mon)); + persistMgr->transfer(TMEMBER(mday)); + persistMgr->transfer(TMEMBER(hour)); + persistMgr->transfer(TMEMBER(min)); + persistMgr->transfer(TMEMBER(sec)); + if (persistMgr->checkVersion(1, 2, 1)) { + int32 wday = _tm.tm_wday; + persistMgr->transfer(TMEMBER(wday)); + _tm.tm_wday = wday; + } + _tm.tm_year = year; + _tm.tm_mon = mon; + _tm.tm_mday = mday; + _tm.tm_hour = hour; + _tm.tm_min = min; + _tm.tm_sec = sec; return STATUS_OK; } diff --git a/engines/wintermute/base/scriptables/script_stack.cpp b/engines/wintermute/base/scriptables/script_stack.cpp index 3239decae8..b53457c81b 100644 --- a/engines/wintermute/base/scriptables/script_stack.cpp +++ b/engines/wintermute/base/scriptables/script_stack.cpp @@ -184,7 +184,7 @@ void ScStack::pushNative(BaseScriptable *val, bool persistent) { ////////////////////////////////////////////////////////////////////////// bool ScStack::persist(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER(_sP)); _values.persist(persistMgr); diff --git a/engines/wintermute/base/scriptables/script_value.cpp b/engines/wintermute/base/scriptables/script_value.cpp index 46d6c25d44..5e2923e029 100644 --- a/engines/wintermute/base/scriptables/script_value.cpp +++ b/engines/wintermute/base/scriptables/script_value.cpp @@ -73,7 +73,7 @@ ScValue::ScValue(BaseGame *inGame, bool val) : BaseClass(inGame) { ////////////////////////////////////////////////////////////////////////// -ScValue::ScValue(BaseGame *inGame, int val) : BaseClass(inGame) { +ScValue::ScValue(BaseGame *inGame, int32 val) : BaseClass(inGame) { _type = VAL_INT; _valInt = val; @@ -789,7 +789,7 @@ void ScValue::setValue(ScValue *val) { ////////////////////////////////////////////////////////////////////////// bool ScValue::persist(BasePersistenceManager *persistMgr) { - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER(_persistent)); persistMgr->transfer(TMEMBER(_isConstVar)); @@ -797,9 +797,9 @@ bool ScValue::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_valBool)); persistMgr->transfer(TMEMBER(_valFloat)); persistMgr->transfer(TMEMBER(_valInt)); - persistMgr->transfer(TMEMBER(_valNative)); + persistMgr->transferPtr(TMEMBER_PTR(_valNative)); - int size; + int32 size; const char *str; if (persistMgr->getIsSaving()) { size = _valObject.size(); @@ -808,23 +808,23 @@ bool ScValue::persist(BasePersistenceManager *persistMgr) { while (_valIter != _valObject.end()) { str = _valIter->_key.c_str(); persistMgr->transfer("", &str); - persistMgr->transfer("", &_valIter->_value); + persistMgr->transferPtr("", &_valIter->_value); _valIter++; } } else { - ScValue *val; + ScValue *val = nullptr; persistMgr->transfer("", &size); for (int i = 0; i < size; i++) { persistMgr->transfer("", &str); - persistMgr->transfer("", &val); + persistMgr->transferPtr("", &val); _valObject[str] = val; delete[] str; } } - persistMgr->transfer(TMEMBER(_valRef)); + persistMgr->transferPtr(TMEMBER_PTR(_valRef)); persistMgr->transfer(TMEMBER(_valString)); /* // TODO: Convert to Debug-statements. @@ -951,7 +951,7 @@ int ScValue::compareStrict(ScValue *val1, ScValue *val2) { } ////////////////////////////////////////////////////////////////////////// -bool ScValue::setProperty(const char *propName, int value) { +bool ScValue::setProperty(const char *propName, int32 value) { ScValue *val = new ScValue(_gameRef, value); bool ret = DID_SUCCEED(setProp(propName, val)); delete val; diff --git a/engines/wintermute/base/scriptables/script_value.h b/engines/wintermute/base/scriptables/script_value.h index e8173474d6..a8e815023e 100644 --- a/engines/wintermute/base/scriptables/script_value.h +++ b/engines/wintermute/base/scriptables/script_value.h @@ -94,14 +94,14 @@ public: TValType _type; ScValue(BaseGame *inGame); ScValue(BaseGame *inGame, bool Val); - ScValue(BaseGame *inGame, int Val); + ScValue(BaseGame *inGame, int32 Val); ScValue(BaseGame *inGame, double Val); ScValue(BaseGame *inGame, const char *Val); virtual ~ScValue(); Common::HashMap<Common::String, ScValue *> _valObject; Common::HashMap<Common::String, ScValue *>::iterator _valIter; - bool setProperty(const char *propName, int value); + bool setProperty(const char *propName, int32 value); bool setProperty(const char *propName, const char *value); bool setProperty(const char *propName, double value); bool setProperty(const char *propName, bool value); diff --git a/engines/wintermute/base/sound/base_sound.cpp b/engines/wintermute/base/sound/base_sound.cpp index f246c03fe1..d027c03c8b 100644 --- a/engines/wintermute/base/sound/base_sound.cpp +++ b/engines/wintermute/base/sound/base_sound.cpp @@ -164,7 +164,7 @@ bool BaseSound::persist(BasePersistenceManager *persistMgr) { _sFXParam1 = _sFXParam2 = _sFXParam3 = _sFXParam4 = 0; } - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER(_soundFilename)); persistMgr->transfer(TMEMBER(_soundLooping)); diff --git a/engines/wintermute/base/timer.cpp b/engines/wintermute/base/timer.cpp index 590dba4655..5dfc117f48 100644 --- a/engines/wintermute/base/timer.cpp +++ b/engines/wintermute/base/timer.cpp @@ -71,4 +71,4 @@ void Timer::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_timerLast)); } -} // End of namespace Wintermute
\ No newline at end of file +} // End of namespace Wintermute diff --git a/engines/wintermute/base/timer.h b/engines/wintermute/base/timer.h index 8353b08abc..ec5477ba2e 100644 --- a/engines/wintermute/base/timer.h +++ b/engines/wintermute/base/timer.h @@ -54,4 +54,4 @@ public: } // End of namespace Wintermute -#endif
\ No newline at end of file +#endif diff --git a/engines/wintermute/coll_templ.h b/engines/wintermute/coll_templ.h index 493ea07015..4a8e92c121 100644 --- a/engines/wintermute/coll_templ.h +++ b/engines/wintermute/coll_templ.h @@ -36,48 +36,105 @@ namespace Wintermute { // Basically Common::Array with peristence-support. template<typename TYPE> -class BaseArray : public Common::Array<TYPE> { +class BaseArrayBase : public Common::Array<TYPE> { public: // TODO: Might want to make sure that destructors are called when replacing/deleting/getting destructed + int add(TYPE newElement) { + Common::Array<TYPE>::push_back(newElement); + return Common::Array<TYPE>::size() - 1; + } + void remove_at(uint32 idx) { + Common::Array<TYPE>::remove_at(idx); + } + void remove_at(uint32 idx, uint32 num) { + while (num) { + if (idx >= Common::Array<TYPE>::size()) { + break; + } + Common::Array<TYPE>::remove_at(idx); + } + } + template<typename T2> + void copy(const BaseArrayBase<T2> &src) { + Common::Array<TYPE>::insert_at(0, src); + } +}; + +template <typename TYPE> +class BaseArray : public BaseArrayBase<TYPE> { + public: bool persist(BasePersistenceManager *persistMgr) { - int j; + int32 j; if (persistMgr->getIsSaving()) { j = Common::Array<TYPE>::size(); persistMgr->transfer("ArraySize", &j); typename Common::Array<TYPE>::const_iterator it = Common::Array<TYPE>::begin(); for (; it != Common::Array<TYPE>::end(); ++it) { TYPE obj = *it; - persistMgr->transfer("", &obj); + persistMgr->transferPtr("", &obj); } } else { Common::Array<TYPE>::clear(); persistMgr->transfer("ArraySize", &j); for (int i = 0; i < j; i++) { - TYPE obj; + TYPE obj = nullptr; + persistMgr->transferPtr("", &obj); + this->add(obj); + } + } + return true; + } +}; + +template <> +class BaseArray<char *> : public BaseArrayBase<char *> { + public: + bool persist(BasePersistenceManager *persistMgr) { + int32 j; + if (persistMgr->getIsSaving()) { + j = Common::Array<char *>::size(); + persistMgr->transfer("ArraySize", &j); + Common::Array<char *>::const_iterator it = Common::Array<char *>::begin(); + for (; it != Common::Array<char *>::end(); ++it) { + char * obj = *it; + persistMgr->transfer("", &obj); + } + } else { + Common::Array<char *>::clear(); + persistMgr->transfer("ArraySize", &j); + for (int i = 0; i < j; i++) { + char * obj = nullptr; persistMgr->transfer("", &obj); add(obj); } } return true; } - int add(TYPE newElement) { - Common::Array<TYPE>::push_back(newElement); - return Common::Array<TYPE>::size() - 1; - } - void remove_at(uint32 idx) { - Common::Array<TYPE>::remove_at(idx); - } - void remove_at(uint32 idx, uint32 num) { - while (num) { - if (idx >= Common::Array<TYPE>::size()) { - break; +}; + +template <> +class BaseArray<const char *> : public BaseArrayBase<const char *> { +public: + bool persist(BasePersistenceManager *persistMgr) { + int32 j; + if (persistMgr->getIsSaving()) { + j = Common::Array<const char *>::size(); + persistMgr->transfer("ArraySize", &j); + Common::Array<const char *>::const_iterator it = Common::Array<const char *>::begin(); + for (; it != Common::Array<const char *>::end(); ++it) { + const char * obj = *it; + persistMgr->transfer("", &obj); + } + } else { + Common::Array<const char *>::clear(); + persistMgr->transfer("ArraySize", &j); + for (int i = 0; i < j; i++) { + const char * obj = nullptr; + persistMgr->transfer("", &obj); + add(obj); } - Common::Array<TYPE>::remove_at(idx); } - } - template<typename T2> - void copy(const BaseArray<T2> &src) { - Common::Array<TYPE>::insert_at(0, src); + return true; } }; diff --git a/engines/wintermute/dcgf.h b/engines/wintermute/dcgf.h index 4f8e96e0ac..fe92194443 100644 --- a/engines/wintermute/dcgf.h +++ b/engines/wintermute/dcgf.h @@ -32,7 +32,7 @@ ////////////////////////////////////////////////////////////////////////// #define DCGF_VER_MAJOR 1 -#define DCGF_VER_MINOR 1 +#define DCGF_VER_MINOR 2 #define DCGF_VER_BUILD 1 #define DCGF_VER_SUFFIX "ScummVM" #define DCGF_VER_BETA true diff --git a/engines/wintermute/detection_tables.h b/engines/wintermute/detection_tables.h index b5dbfc1a15..00ec51a715 100644 --- a/engines/wintermute/detection_tables.h +++ b/engines/wintermute/detection_tables.h @@ -162,7 +162,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("data.dcp", "ebd0915d9a12df5224be22f53bb23eb6", 7278306), Common::EN_ANY, Common::kPlatformWindows, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO0() }, // Chivalry is Not Dead (Version from deirdrakai.com) @@ -172,7 +172,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("data.dcp", "ae6d91b9517f4d2851a8ad94c96951c8", 7278302), Common::EN_ANY, Common::kPlatformWindows, - ADGF_UNSTABLE, + ADGF_TESTING, GUIO0() }, // Dead City (English) diff --git a/engines/wintermute/persistent.h b/engines/wintermute/persistent.h index ca9281f798..1464ae0fd6 100644 --- a/engines/wintermute/persistent.h +++ b/engines/wintermute/persistent.h @@ -82,7 +82,8 @@ namespace Wintermute { }\ #define TMEMBER(memberName) #memberName, &memberName -#define TMEMBER_INT(memberName) #memberName, (int*)&memberName +#define TMEMBER_PTR(memberName) #memberName, &memberName +#define TMEMBER_INT(memberName) #memberName, (int32*)&memberName } // end of namespace Wintermute diff --git a/engines/wintermute/ui/ui_button.cpp b/engines/wintermute/ui/ui_button.cpp index b638522f6e..9db1f4f4b4 100644 --- a/engines/wintermute/ui/ui_button.cpp +++ b/engines/wintermute/ui/ui_button.cpp @@ -1179,21 +1179,21 @@ bool UIButton::persist(BasePersistenceManager *persistMgr) { UIObject::persist(persistMgr); persistMgr->transfer(TMEMBER_INT(_align)); - persistMgr->transfer(TMEMBER(_backDisable)); - persistMgr->transfer(TMEMBER(_backFocus)); - persistMgr->transfer(TMEMBER(_backHover)); - persistMgr->transfer(TMEMBER(_backPress)); + persistMgr->transferPtr(TMEMBER_PTR(_backDisable)); + persistMgr->transferPtr(TMEMBER_PTR(_backFocus)); + persistMgr->transferPtr(TMEMBER_PTR(_backHover)); + persistMgr->transferPtr(TMEMBER_PTR(_backPress)); persistMgr->transfer(TMEMBER(_centerImage)); - persistMgr->transfer(TMEMBER(_fontDisable)); - persistMgr->transfer(TMEMBER(_fontFocus)); - persistMgr->transfer(TMEMBER(_fontHover)); - persistMgr->transfer(TMEMBER(_fontPress)); + persistMgr->transferPtr(TMEMBER_PTR(_fontDisable)); + persistMgr->transferPtr(TMEMBER_PTR(_fontFocus)); + persistMgr->transferPtr(TMEMBER_PTR(_fontHover)); + persistMgr->transferPtr(TMEMBER_PTR(_fontPress)); persistMgr->transfer(TMEMBER(_hover)); - persistMgr->transfer(TMEMBER(_image)); - persistMgr->transfer(TMEMBER(_imageDisable)); - persistMgr->transfer(TMEMBER(_imageFocus)); - persistMgr->transfer(TMEMBER(_imageHover)); - persistMgr->transfer(TMEMBER(_imagePress)); + persistMgr->transferPtr(TMEMBER_PTR(_image)); + persistMgr->transferPtr(TMEMBER_PTR(_imageDisable)); + persistMgr->transferPtr(TMEMBER_PTR(_imageFocus)); + persistMgr->transferPtr(TMEMBER_PTR(_imageHover)); + persistMgr->transferPtr(TMEMBER_PTR(_imagePress)); persistMgr->transfer(TMEMBER(_pixelPerfect)); persistMgr->transfer(TMEMBER(_press)); persistMgr->transfer(TMEMBER(_stayPressed)); diff --git a/engines/wintermute/ui/ui_edit.cpp b/engines/wintermute/ui/ui_edit.cpp index 7fddf59898..91ca7326cb 100644 --- a/engines/wintermute/ui/ui_edit.cpp +++ b/engines/wintermute/ui/ui_edit.cpp @@ -481,7 +481,7 @@ bool UIEdit::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// if (strcmp(name, "SelStart") == 0) { _selStart = value->getInt(); - _selStart = MAX(_selStart, 0); + _selStart = MAX<int32>(_selStart, 0); _selStart = (int)MIN((size_t)_selStart, strlen(_text)); return STATUS_OK; } @@ -491,7 +491,7 @@ bool UIEdit::scSetProperty(const char *name, ScValue *value) { ////////////////////////////////////////////////////////////////////////// else if (strcmp(name, "SelEnd") == 0) { _selEnd = value->getInt(); - _selEnd = MAX(_selEnd, 0); + _selEnd = MAX<int32>(_selEnd, 0); _selEnd = (int)MIN((size_t)_selEnd, strlen(_text)); return STATUS_OK; } @@ -600,8 +600,8 @@ bool UIEdit::display(int offsetX, int offsetY) { bool focused = isFocused(); - _selStart = MAX(_selStart, 0); - _selEnd = MAX(_selEnd, 0); + _selStart = MAX<int32>(_selStart, 0); + _selEnd = MAX<int32>(_selEnd, 0); _selStart = (int)MIN((size_t)_selStart, strlen(_text)); _selEnd = (int)MIN((size_t)_selEnd, strlen(_text)); @@ -609,11 +609,11 @@ bool UIEdit::display(int offsetX, int offsetY) { //int CursorWidth = font->GetCharWidth(_cursorChar[0]); int cursorWidth = font->getTextWidth((byte *)_cursorChar); - int s1, s2; + int32 s1, s2; bool curFirst; // modify scroll offset if (_selStart >= _selEnd) { - while (font->getTextWidth((byte *)_text + _scrollOffset, MAX(0, _selEnd - _scrollOffset)) > _width - cursorWidth - 2 * _frameWidth) { + while (font->getTextWidth((byte *)_text + _scrollOffset, MAX<int32>(0, _selEnd - _scrollOffset)) > _width - cursorWidth - 2 * _frameWidth) { _scrollOffset++; if (_scrollOffset >= (int)strlen(_text)) { break; @@ -626,8 +626,8 @@ bool UIEdit::display(int offsetX, int offsetY) { s2 = _selStart; curFirst = true; } else { - while (font->getTextWidth((byte *)_text + _scrollOffset, MAX(0, _selStart - _scrollOffset)) + - sfont->getTextWidth((byte *)(_text + MAX(_scrollOffset, _selStart)), _selEnd - MAX(_scrollOffset, _selStart)) + while (font->getTextWidth((byte *)_text + _scrollOffset, MAX<int32>(0, _selStart - _scrollOffset)) + + sfont->getTextWidth((byte *)(_text + MAX<int32>(_scrollOffset, _selStart)), _selEnd - MAX(_scrollOffset, _selStart)) > _width - cursorWidth - 2 * _frameWidth) { _scrollOffset++; @@ -766,7 +766,7 @@ bool UIEdit::handleKeypress(Common::Event *event, bool printable) { deleteChars(_selStart, _selEnd); } if (_selEnd >= _selStart) { - _selEnd -= MAX(1, _selEnd - _selStart); + _selEnd -= MAX<int32>(1, _selEnd - _selStart); } _selStart = _selEnd; @@ -934,7 +934,7 @@ bool UIEdit::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_cursorBlinkRate)); persistMgr->transfer(TMEMBER(_cursorChar)); - persistMgr->transfer(TMEMBER(_fontSelected)); + persistMgr->transferPtr(TMEMBER_PTR(_fontSelected)); persistMgr->transfer(TMEMBER(_frameWidth)); persistMgr->transfer(TMEMBER(_maxLength)); persistMgr->transfer(TMEMBER(_scrollOffset)); diff --git a/engines/wintermute/ui/ui_entity.cpp b/engines/wintermute/ui/ui_entity.cpp index 00d442e895..1872400cdd 100644 --- a/engines/wintermute/ui/ui_entity.cpp +++ b/engines/wintermute/ui/ui_entity.cpp @@ -359,7 +359,7 @@ bool UIEntity::persist(BasePersistenceManager *persistMgr) { UIObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_entity)); + persistMgr->transferPtr(TMEMBER_PTR(_entity)); return STATUS_OK; } diff --git a/engines/wintermute/ui/ui_object.cpp b/engines/wintermute/ui/ui_object.cpp index 9dea3dadf9..07efc5e4cb 100644 --- a/engines/wintermute/ui/ui_object.cpp +++ b/engines/wintermute/ui/ui_object.cpp @@ -621,17 +621,17 @@ bool UIObject::persist(BasePersistenceManager *persistMgr) { BaseObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_back)); + persistMgr->transferPtr(TMEMBER_PTR(_back)); persistMgr->transfer(TMEMBER(_canFocus)); persistMgr->transfer(TMEMBER(_disable)); - persistMgr->transfer(TMEMBER(_focusedWidget)); - persistMgr->transfer(TMEMBER(_font)); + persistMgr->transferPtr(TMEMBER_PTR(_focusedWidget)); + persistMgr->transferPtr(TMEMBER_PTR(_font)); persistMgr->transfer(TMEMBER(_height)); - persistMgr->transfer(TMEMBER(_image)); - persistMgr->transfer(TMEMBER(_listenerObject)); - persistMgr->transfer(TMEMBER(_listenerParamObject)); + persistMgr->transferPtr(TMEMBER_PTR(_image)); + persistMgr->transferPtr(TMEMBER_PTR(_listenerObject)); + persistMgr->transferPtr(TMEMBER_PTR(_listenerParamObject)); persistMgr->transfer(TMEMBER(_listenerParamDWORD)); - persistMgr->transfer(TMEMBER(_parent)); + persistMgr->transferPtr(TMEMBER_PTR(_parent)); persistMgr->transfer(TMEMBER(_parentNotify)); persistMgr->transfer(TMEMBER(_sharedFonts)); persistMgr->transfer(TMEMBER(_sharedImages)); diff --git a/engines/wintermute/ui/ui_tiled_image.cpp b/engines/wintermute/ui/ui_tiled_image.cpp index be9f87cf58..abccdd6c39 100644 --- a/engines/wintermute/ui/ui_tiled_image.cpp +++ b/engines/wintermute/ui/ui_tiled_image.cpp @@ -358,7 +358,7 @@ bool UITiledImage::saveAsText(BaseDynamicBuffer *buffer, int indent) { } ////////////////////////////////////////////////////////////////////////// -void UITiledImage::correctSize(int *width, int *height) { +void UITiledImage::correctSize(int32 *width, int32 *height) { int tileWidth = _middleMiddle.right - _middleMiddle.left; int tileHeight = _middleMiddle.bottom - _middleMiddle.top; @@ -377,7 +377,7 @@ bool UITiledImage::persist(BasePersistenceManager *persistMgr) { persistMgr->transfer(TMEMBER(_downLeft)); persistMgr->transfer(TMEMBER(_downMiddle)); persistMgr->transfer(TMEMBER(_downRight)); - persistMgr->transfer(TMEMBER(_image)); + persistMgr->transferPtr(TMEMBER_PTR(_image)); persistMgr->transfer(TMEMBER(_middleLeft)); persistMgr->transfer(TMEMBER(_middleMiddle)); persistMgr->transfer(TMEMBER(_middleRight)); diff --git a/engines/wintermute/ui/ui_tiled_image.h b/engines/wintermute/ui/ui_tiled_image.h index 4868710264..a6cd22d53d 100644 --- a/engines/wintermute/ui/ui_tiled_image.h +++ b/engines/wintermute/ui/ui_tiled_image.h @@ -38,7 +38,7 @@ class BaseSubFrame; class UITiledImage : public BaseObject { public: DECLARE_PERSISTENT(UITiledImage, BaseObject) - void correctSize(int *width, int *height); + void correctSize(int32 *width, int32 *height); bool loadFile(const char *filename); bool loadBuffer(byte *buffer, bool complete = true); virtual bool saveAsText(BaseDynamicBuffer *buffer, int indent) override; diff --git a/engines/wintermute/ui/ui_window.cpp b/engines/wintermute/ui/ui_window.cpp index 460ec1877b..2ce9f68605 100644 --- a/engines/wintermute/ui/ui_window.cpp +++ b/engines/wintermute/ui/ui_window.cpp @@ -1257,24 +1257,24 @@ bool UIWindow::persist(BasePersistenceManager *persistMgr) { UIObject::persist(persistMgr); - persistMgr->transfer(TMEMBER(_backInactive)); + persistMgr->transferPtr(TMEMBER_PTR(_backInactive)); persistMgr->transfer(TMEMBER(_clipContents)); persistMgr->transfer(TMEMBER(_dragFrom)); persistMgr->transfer(TMEMBER(_dragging)); persistMgr->transfer(TMEMBER(_dragRect)); persistMgr->transfer(TMEMBER(_fadeBackground)); persistMgr->transfer(TMEMBER(_fadeColor)); - persistMgr->transfer(TMEMBER(_fontInactive)); - persistMgr->transfer(TMEMBER(_imageInactive)); + persistMgr->transferPtr(TMEMBER_PTR(_fontInactive)); + persistMgr->transferPtr(TMEMBER_PTR(_imageInactive)); persistMgr->transfer(TMEMBER(_inGame)); persistMgr->transfer(TMEMBER(_isMenu)); persistMgr->transfer(TMEMBER_INT(_mode)); - persistMgr->transfer(TMEMBER(_shieldButton)); - persistMgr->transfer(TMEMBER(_shieldWindow)); + persistMgr->transferPtr(TMEMBER_PTR(_shieldButton)); + persistMgr->transferPtr(TMEMBER_PTR(_shieldWindow)); persistMgr->transfer(TMEMBER_INT(_titleAlign)); persistMgr->transfer(TMEMBER(_titleRect)); persistMgr->transfer(TMEMBER(_transparent)); - persistMgr->transfer(TMEMBER(_viewport)); + persistMgr->transferPtr(TMEMBER_PTR(_viewport)); persistMgr->transfer(TMEMBER(_pauseMusic)); _widgets.persist(persistMgr); diff --git a/engines/wintermute/video/video_theora_player.cpp b/engines/wintermute/video/video_theora_player.cpp index f03be9691e..8f9db8392f 100644 --- a/engines/wintermute/video/video_theora_player.cpp +++ b/engines/wintermute/video/video_theora_player.cpp @@ -491,7 +491,7 @@ bool VideoTheoraPlayer::persist(BasePersistenceManager *persistMgr) { SetDefaults(); } - persistMgr->transfer(TMEMBER(_gameRef)); + persistMgr->transferPtr(TMEMBER_PTR(_gameRef)); persistMgr->transfer(TMEMBER(_savedPos)); persistMgr->transfer(TMEMBER(_savedState)); persistMgr->transfer(TMEMBER(_filename)); diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp index 8285aff7ca..9b452607df 100644 --- a/gui/ThemeParser.cpp +++ b/gui/ThemeParser.cpp @@ -691,7 +691,7 @@ bool ThemeParser::parserCallback_layout(ParserNode *node) { return false; } - Common::parseBool(node->values["center"], center); + (void)Common::parseBool(node->values["center"], center); if (node->values["type"] == "vertical") _theme->getEvaluator()->addLayout(GUI::ThemeLayout::kLayoutVertical, spacing, center); diff --git a/video/codecs/cdtoons.h b/video/codecs/cdtoons.h index e6b7aab5f8..74d30ce8ea 100644 --- a/video/codecs/cdtoons.h +++ b/video/codecs/cdtoons.h @@ -61,7 +61,6 @@ private: bool _dirtyPalette; uint16 _currentPaletteId; - uint16 _currentFrame; Common::HashMap<uint16, CDToonsBlock> _blocks; void renderBlock(byte *data, uint size, int x, int y, uint width, uint height); |