aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--audio/audiostream.cpp8
-rw-r--r--audio/decoders/adpcm.cpp2
-rw-r--r--audio/decoders/adpcm.h8
-rw-r--r--audio/mixer.cpp4
-rw-r--r--audio/mixer_intern.h1
-rw-r--r--backends/events/default/default-events.cpp2
-rw-r--r--backends/midi/seq.cpp9
-rw-r--r--common/config-file.cpp9
-rw-r--r--common/config-file.h1
-rw-r--r--engines/agi/agi.cpp6
-rw-r--r--engines/agi/loader_v1.cpp2
-rw-r--r--engines/agi/loader_v2.cpp2
-rw-r--r--engines/agi/loader_v3.cpp2
-rw-r--r--engines/agi/op_cmd.cpp4
-rw-r--r--engines/agi/preagi_winnie.cpp3
-rw-r--r--engines/agi/sound.cpp27
-rw-r--r--engines/agi/sound.h9
-rw-r--r--engines/agi/sound_2gs.cpp4
-rw-r--r--engines/agi/sound_2gs.h4
-rw-r--r--engines/agi/sound_midi.cpp2
-rw-r--r--engines/agi/sound_midi.h4
-rw-r--r--engines/agi/wagparser.cpp2
-rw-r--r--engines/cine/console.cpp1
-rw-r--r--engines/configure.engines2
-rw-r--r--engines/draci/console.cpp1
-rw-r--r--engines/dreamweb/console.cpp1
-rw-r--r--engines/gob/hotspots.cpp1
-rw-r--r--engines/gob/pregob/onceupon/stork.h2
-rw-r--r--engines/groovie/vdx.h6
-rw-r--r--engines/hopkins/anim.cpp61
-rw-r--r--engines/hopkins/computer.cpp8
-rw-r--r--engines/hopkins/graphics.cpp2
-rw-r--r--engines/hopkins/hopkins.h2
-rw-r--r--engines/hopkins/lines.cpp50
-rw-r--r--engines/hopkins/lines.h6
-rw-r--r--engines/hopkins/objects.cpp28
-rw-r--r--engines/hopkins/objects.h2
-rw-r--r--engines/hopkins/script.cpp5
-rw-r--r--engines/hopkins/sound.cpp14
-rw-r--r--engines/hugo/hugo.cpp27
-rw-r--r--engines/hugo/intro.cpp2
-rw-r--r--engines/kyra/darkmoon.cpp16
-rw-r--r--engines/kyra/debugger.cpp94
-rw-r--r--engines/kyra/debugger.h5
-rw-r--r--engines/kyra/eob.cpp8
-rw-r--r--engines/kyra/eob.h1
-rw-r--r--engines/kyra/eobcommon.h2
-rw-r--r--engines/kyra/scene_eob.cpp4
-rw-r--r--engines/kyra/scene_lol.cpp2
-rw-r--r--engines/kyra/scene_rpg.cpp4
-rw-r--r--engines/kyra/sound_midi.cpp2
-rw-r--r--engines/kyra/sprites_eob.cpp9
-rw-r--r--engines/made/console.cpp1
-rw-r--r--engines/mohawk/detection_tables.h17
-rw-r--r--engines/mohawk/livingbooks.cpp10
-rw-r--r--engines/mohawk/livingbooks_code.cpp79
-rw-r--r--engines/mohawk/livingbooks_code.h3
-rw-r--r--engines/mohawk/livingbooks_lbx.cpp17
-rw-r--r--engines/mohawk/view.cpp4
-rw-r--r--engines/parallaction/gfxbase.cpp2
-rw-r--r--engines/parallaction/graphics.h2
-rw-r--r--engines/queen/input.cpp4
-rw-r--r--engines/queen/input.h4
-rw-r--r--engines/queen/queen.cpp2
-rw-r--r--engines/queen/talk.h2
-rw-r--r--engines/sci/engine/klists.cpp3
-rw-r--r--engines/sci/engine/script_patches.cpp42
-rw-r--r--engines/sci/graphics/compare.cpp4
-rw-r--r--engines/sci/graphics/compare.h3
-rw-r--r--engines/sci/graphics/controls32.cpp4
-rw-r--r--engines/sci/graphics/controls32.h3
-rw-r--r--engines/sci/graphics/coordadjuster.h2
-rw-r--r--engines/sci/graphics/fontsjis.h3
-rw-r--r--engines/sci/graphics/paint16.cpp4
-rw-r--r--engines/sci/graphics/paint16.h3
-rw-r--r--engines/sci/graphics/paint32.cpp4
-rw-r--r--engines/sci/graphics/paint32.h5
-rw-r--r--engines/sci/graphics/text16.cpp4
-rw-r--r--engines/sci/graphics/text16.h3
-rw-r--r--engines/sci/resource.cpp28
-rw-r--r--engines/sci/resource_audio.cpp4
-rw-r--r--engines/sci/resource_intern.h2
-rw-r--r--engines/sci/sci.cpp20
-rw-r--r--engines/sci/sound/audio.cpp13
-rw-r--r--engines/sci/sound/soundcmd.cpp12
-rw-r--r--engines/scumm/debugger.h1
-rw-r--r--engines/scumm/he/animation_he.h1
-rw-r--r--engines/scumm/he/logic/football.cpp101
-rw-r--r--engines/scumm/insane/insane.cpp2
-rw-r--r--engines/sword1/console.cpp1
-rw-r--r--engines/sword1/control.cpp4
-rw-r--r--engines/sword2/controls.cpp4
-rw-r--r--engines/sword2/memory.cpp2
-rw-r--r--engines/sword2/memory.h4
-rw-r--r--engines/sword2/palette.cpp10
-rw-r--r--engines/sword2/sound.h1
-rw-r--r--engines/sword2/sprite.cpp5
-rw-r--r--engines/sword2/sword2.cpp2
-rw-r--r--engines/sword25/console.cpp1
-rw-r--r--engines/testbed/midi.cpp4
-rw-r--r--engines/toon/console.cpp1
-rw-r--r--engines/tsage/graphics.h1
-rw-r--r--engines/tucker/console.cpp3
-rw-r--r--engines/wintermute/ad/ad_actor.cpp14
-rw-r--r--engines/wintermute/ad/ad_entity.cpp4
-rw-r--r--engines/wintermute/ad/ad_game.cpp14
-rw-r--r--engines/wintermute/ad/ad_inventory_box.cpp6
-rw-r--r--engines/wintermute/ad/ad_item.cpp6
-rw-r--r--engines/wintermute/ad/ad_node_state.cpp2
-rw-r--r--engines/wintermute/ad/ad_object.cpp40
-rw-r--r--engines/wintermute/ad/ad_path.cpp2
-rw-r--r--engines/wintermute/ad/ad_path_point.cpp2
-rw-r--r--engines/wintermute/ad/ad_response.cpp8
-rw-r--r--engines/wintermute/ad/ad_response_box.cpp12
-rw-r--r--engines/wintermute/ad/ad_response_context.cpp2
-rw-r--r--engines/wintermute/ad/ad_scene.cpp72
-rw-r--r--engines/wintermute/ad/ad_scene.h22
-rw-r--r--engines/wintermute/ad/ad_scene_node.cpp4
-rw-r--r--engines/wintermute/ad/ad_sentence.cpp18
-rw-r--r--engines/wintermute/ad/ad_sprite_set.cpp4
-rw-r--r--engines/wintermute/ad/ad_talk_def.cpp4
-rw-r--r--engines/wintermute/ad/ad_talk_holder.cpp2
-rw-r--r--engines/wintermute/ad/ad_talk_node.cpp4
-rw-r--r--engines/wintermute/base/base_frame.cpp2
-rw-r--r--engines/wintermute/base/base_game.cpp38
-rw-r--r--engines/wintermute/base/base_game_music.cpp2
-rw-r--r--engines/wintermute/base/base_object.cpp6
-rw-r--r--engines/wintermute/base/base_persistence_manager.cpp10
-rw-r--r--engines/wintermute/base/base_persistence_manager.h4
-rw-r--r--engines/wintermute/base/base_region.cpp2
-rw-r--r--engines/wintermute/base/base_scriptable.cpp6
-rw-r--r--engines/wintermute/base/base_sprite.cpp6
-rw-r--r--engines/wintermute/base/base_sprite.h2
-rw-r--r--engines/wintermute/base/base_sub_frame.h4
-rw-r--r--engines/wintermute/base/base_viewport.cpp10
-rw-r--r--engines/wintermute/base/base_viewport.h2
-rw-r--r--engines/wintermute/base/font/base_font_bitmap.cpp6
-rw-r--r--engines/wintermute/base/font/base_font_bitmap.h16
-rw-r--r--engines/wintermute/base/font/base_font_storage.cpp2
-rw-r--r--engines/wintermute/base/font/base_font_truetype.cpp17
-rw-r--r--engines/wintermute/base/font/base_font_truetype.h24
-rw-r--r--engines/wintermute/base/gfx/osystem/base_render_osystem.cpp49
-rw-r--r--engines/wintermute/base/gfx/osystem/base_render_osystem.h1
-rw-r--r--engines/wintermute/base/particles/part_emitter.cpp2
-rw-r--r--engines/wintermute/base/particles/part_emitter.h30
-rw-r--r--engines/wintermute/base/save_thumb_helper.cpp2
-rw-r--r--engines/wintermute/base/save_thumb_helper.h3
-rw-r--r--engines/wintermute/base/scriptables/script.cpp28
-rw-r--r--engines/wintermute/base/scriptables/script_engine.cpp6
-rw-r--r--engines/wintermute/base/scriptables/script_ext_array.cpp2
-rw-r--r--engines/wintermute/base/scriptables/script_ext_date.cpp29
-rw-r--r--engines/wintermute/base/scriptables/script_stack.cpp2
-rw-r--r--engines/wintermute/base/scriptables/script_value.cpp18
-rw-r--r--engines/wintermute/base/scriptables/script_value.h4
-rw-r--r--engines/wintermute/base/sound/base_sound.cpp2
-rw-r--r--engines/wintermute/base/timer.cpp2
-rw-r--r--engines/wintermute/base/timer.h2
-rw-r--r--engines/wintermute/coll_templ.h97
-rw-r--r--engines/wintermute/dcgf.h2
-rw-r--r--engines/wintermute/detection_tables.h4
-rw-r--r--engines/wintermute/persistent.h3
-rw-r--r--engines/wintermute/ui/ui_button.cpp26
-rw-r--r--engines/wintermute/ui/ui_edit.cpp20
-rw-r--r--engines/wintermute/ui/ui_entity.cpp2
-rw-r--r--engines/wintermute/ui/ui_object.cpp14
-rw-r--r--engines/wintermute/ui/ui_tiled_image.cpp4
-rw-r--r--engines/wintermute/ui/ui_tiled_image.h2
-rw-r--r--engines/wintermute/ui/ui_window.cpp12
-rw-r--r--engines/wintermute/video/video_theora_player.cpp2
-rw-r--r--gui/ThemeParser.cpp2
-rw-r--r--video/codecs/cdtoons.h1
172 files changed, 1097 insertions, 627 deletions
diff --git a/NEWS b/NEWS
index dcca959696..e52daeccd7 100644
--- a/NEWS
+++ b/NEWS
@@ -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 &section) {
+ Section *s = getSection(section);
+ if (s)
+ return;
+
+ Section newSection;
+ newSection.name = section;
+ _sections.push_back(newSection);
+}
void ConfigFile::removeSection(const String &section) {
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 &section) const;
+ void addSection(const String &section);
void removeSection(const String &section);
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> &params);
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> &params, 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> &params, 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);