aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/lastexpress/data/cursor.cpp2
-rw-r--r--engines/lastexpress/data/scene.cpp12
-rw-r--r--engines/lastexpress/data/snd.cpp9
-rw-r--r--engines/lastexpress/data/subtitle.cpp2
-rw-r--r--engines/lastexpress/detection.cpp3
-rw-r--r--engines/lastexpress/fight/fight.cpp5
-rw-r--r--engines/lastexpress/fight/fighter.cpp27
-rw-r--r--engines/lastexpress/fight/fighter.h3
-rw-r--r--engines/lastexpress/game/inventory.cpp14
-rw-r--r--engines/lastexpress/game/inventory.h12
-rw-r--r--engines/lastexpress/lastexpress.cpp13
-rw-r--r--engines/lastexpress/resource.cpp5
-rw-r--r--engines/lastexpress/resource.h2
-rw-r--r--engines/lastexpress/sound/entry.cpp19
-rw-r--r--engines/lastexpress/sound/queue.cpp13
-rw-r--r--engines/lastexpress/sound/sound.cpp22
16 files changed, 98 insertions, 65 deletions
diff --git a/engines/lastexpress/data/cursor.cpp b/engines/lastexpress/data/cursor.cpp
index 205c46f667..d176d963d1 100644
--- a/engines/lastexpress/data/cursor.cpp
+++ b/engines/lastexpress/data/cursor.cpp
@@ -128,7 +128,7 @@ Common::Rect Icon::draw(Graphics::Surface *surface) {
for (int i = 0; i < 32; i++) {
// Adjust brightness
- if (_brightnessIndex == -1)
+ if (_brightnessIndex == -1 || _brightnessIndex >= ARRAYSIZE(brigthnessData))
*s = *image;
else
*s = (*image & brigthnessData[_brightnessIndex]) >> _brightnessIndex;
diff --git a/engines/lastexpress/data/scene.cpp b/engines/lastexpress/data/scene.cpp
index 79683d8067..fdb1ac6d46 100644
--- a/engines/lastexpress/data/scene.cpp
+++ b/engines/lastexpress/data/scene.cpp
@@ -121,7 +121,7 @@ bool SceneHotspot::isInside(const Common::Point &point) {
// Scene
Scene::~Scene() {
// Free the hotspots
- for (int i = 0; i < (int)_hotspots.size(); i++)
+ for (uint i = 0; i < _hotspots.size(); i++)
delete _hotspots[i];
}
@@ -171,7 +171,7 @@ bool Scene::checkHotSpot(const Common::Point &coord, SceneHotspot **hotspot) {
bool found = false;
int _location = 0;
- for (int i = 0; i < (int)_hotspots.size(); i++) {
+ for (uint i = 0; i < _hotspots.size(); i++) {
if (_hotspots[i]->isInside(coord)) {
if (_location <= _hotspots[i]->location) {
_location = _hotspots[i]->location;
@@ -223,7 +223,7 @@ Common::String Scene::toString() {
// Hotspots
if (_hotspots.size() != 0) {
output += "\nHotspots:\n";
- for (int i = 0; i < (int)_hotspots.size(); i++)
+ for (uint i = 0; i < _hotspots.size(); i++)
output += _hotspots[i]->toString() + "\n";
}
@@ -240,7 +240,7 @@ SceneLoader::~SceneLoader() {
void SceneLoader::clear() {
// Remove all scenes
- for (int i = 0; i < (int)_scenes.size(); i++)
+ for (uint i = 0; i < _scenes.size(); i++)
delete _scenes[i];
_scenes.clear();
@@ -291,9 +291,9 @@ Scene *SceneLoader::get(SceneIndex index) {
return NULL;
// Load the hotspots if needed
- _scenes[(int)index]->loadHotspots(_stream);
+ _scenes[(uint)index]->loadHotspots(_stream);
- return _scenes[(int)index];
+ return _scenes[(uint)index];
}
} // End of namespace LastExpress
diff --git a/engines/lastexpress/data/snd.cpp b/engines/lastexpress/data/snd.cpp
index 5010d6e763..6d64f6b82c 100644
--- a/engines/lastexpress/data/snd.cpp
+++ b/engines/lastexpress/data/snd.cpp
@@ -356,6 +356,8 @@ public:
Audio::ADPCMStream(stream, disposeAfterUse, size, 44100, 1, blockSize) {
_currentFilterId = -1;
_nextFilterId = filterId;
+ _stepAdjust1 = 0;
+ _stepAdjust2 = 0;
}
int readBuffer(int16 *buffer, const int numSamples) {
@@ -453,7 +455,9 @@ void SimpleSound::play(Audio::AudioStream *as) {
//////////////////////////////////////////////////////////////////////////
StreamedSound::StreamedSound() : _as(NULL), _loaded(false) {}
-StreamedSound::~StreamedSound() {}
+StreamedSound::~StreamedSound() {
+ _as = NULL;
+}
bool StreamedSound::load(Common::SeekableReadStream *stream, int32 filterId) {
if (!stream)
@@ -482,6 +486,9 @@ bool StreamedSound::isFinished() {
}
void StreamedSound::setFilterId(int32 filterId) {
+ if (_as == NULL)
+ return;
+
((LastExpress_ADPCMStream *)_as)->setFilterId(filterId);
}
diff --git a/engines/lastexpress/data/subtitle.cpp b/engines/lastexpress/data/subtitle.cpp
index 9918cf7689..a9a8284588 100644
--- a/engines/lastexpress/data/subtitle.cpp
+++ b/engines/lastexpress/data/subtitle.cpp
@@ -150,7 +150,7 @@ SubtitleManager::~SubtitleManager() {
}
void SubtitleManager::reset() {
- for (int i = 0; i < (int)_subtitles.size(); i++)
+ for (uint i = 0; i < _subtitles.size(); i++)
delete _subtitles[i];
_subtitles.clear();
diff --git a/engines/lastexpress/detection.cpp b/engines/lastexpress/detection.cpp
index 82a6520522..2fdeef910a 100644
--- a/engines/lastexpress/detection.cpp
+++ b/engines/lastexpress/detection.cpp
@@ -173,7 +173,7 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_UNSTABLE,
GUIO1(GUIO_NOASPECT)
},
-
+
// The Last Express (Russian)
// expressw.exe 1999-04-05 15:33:56
// express.exe ???
@@ -211,6 +211,7 @@ public:
return "LastExpress Engine (C) 1997 Smoking Car Productions";
}
+protected:
bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *gd) const;
};
diff --git a/engines/lastexpress/fight/fight.cpp b/engines/lastexpress/fight/fight.cpp
index be1653092f..22d9da80be 100644
--- a/engines/lastexpress/fight/fight.cpp
+++ b/engines/lastexpress/fight/fight.cpp
@@ -52,6 +52,8 @@ Fight::FightData::FightData() {
index = 0;
isFightRunning = false;
+
+ memset(&sequences, 0, sizeof(sequences));
}
Fight::FightData::~FightData() {
@@ -398,6 +400,9 @@ end_load:
}
void Fight::setOpponents() {
+ if (!_data)
+ error("[Fight::setOpponents] Data not initialized");
+
_data->player->setOpponent(_data->opponent);
_data->opponent->setOpponent(_data->player);
diff --git a/engines/lastexpress/fight/fighter.cpp b/engines/lastexpress/fight/fighter.cpp
index bae7728a2b..4b1cddabd4 100644
--- a/engines/lastexpress/fight/fighter.cpp
+++ b/engines/lastexpress/fight/fighter.cpp
@@ -53,20 +53,20 @@ Fighter::Fighter(LastExpressEngine *engine) : _engine(engine) {
}
Fighter::~Fighter() {
- clearSequences();
-}
-
-//////////////////////////////////////////////////////////////////////////
-// Cleanup
-//////////////////////////////////////////////////////////////////////////
-void Fighter::clearSequences() {
// The original game resets the function pointers to default values, just before deleting the struct
getScenes()->removeAndRedraw(&_frame, false);
// Free sequences
- for (int i = 0; i < (int)_sequences.size(); i++)
+ for (uint i = 0; i < _sequences.size(); i++)
SAFE_DELETE(_sequences[i]);
+
+ // Zero-out passed pointers
+ _sequence = NULL;
+ _opponent = NULL;
+ _fight = NULL;
+
+ _engine = NULL;
}
//////////////////////////////////////////////////////////////////////////
@@ -113,6 +113,9 @@ void Fighter::draw() {
// Processing
//////////////////////////////////////////////////////////////////////////
void Fighter::process() {
+ if (!_fight)
+ error("[Fighter::handleAction] Fighter not initialized properly");
+
if (!_sequence) {
if (_frame) {
getScenes()->removeFromQueue(_frame);
@@ -188,6 +191,9 @@ void Fighter::process() {
// Default actions
//////////////////////////////////////////////////////////////////////////
void Fighter::handleAction(FightAction action) {
+ if (!_opponent || !_fight)
+ error("[Fighter::handleAction] Fighter not initialized properly");
+
switch (action) {
default:
return;
@@ -243,7 +249,10 @@ void Opponent::update() {
// Helpers
//////////////////////////////////////////////////////////////////////////
bool Fighter::checkFrame(uint32 val) {
- return (_frame->getInfo()->field_33 & val);
+ if (!_frame)
+ error("[Fighter::checkFrame] Invalid current frame");
+
+ return (bool)(_frame->getInfo()->field_33 & val);
}
} // End of namespace LastExpress
diff --git a/engines/lastexpress/fight/fighter.h b/engines/lastexpress/fight/fighter.h
index e37fe49d86..dad95af186 100644
--- a/engines/lastexpress/fight/fighter.h
+++ b/engines/lastexpress/fight/fighter.h
@@ -99,9 +99,6 @@ protected:
void draw();
void process();
- // Cleanup
- void clearSequences();
-
// Helpers
bool checkFrame(uint32 val);
};
diff --git a/engines/lastexpress/game/inventory.cpp b/engines/lastexpress/game/inventory.cpp
index 7b803bb1ca..bb382ea38e 100644
--- a/engines/lastexpress/game/inventory.cpp
+++ b/engines/lastexpress/game/inventory.cpp
@@ -259,7 +259,7 @@ void Inventory::handleMouseEvent(const Common::Event &ev) {
// Change item highlight on list
if (getFlags()->mouseLeftPressed) {
- uint32 index = ev.mouse.y / 40;
+ uint32 index = (unsigned) (int) ev.mouse.y / 40;
if (_highlightedItemIndex && _highlightedItemIndex != index)
drawHighlight(_highlightedItemIndex, true);
@@ -416,12 +416,12 @@ void Inventory::show() {
drawEgg();
}
-void Inventory::setPortrait(InventoryItem item) {
+void Inventory::setPortrait(InventoryItem item) const {
getProgress().portrait = item;
drawItem((CursorStyle)getProgress().portrait, 0, 0);
}
-void Inventory::showHourGlass(){
+void Inventory::showHourGlass() const {
if (!getMenu()->isShown())
drawItem(kCursorHourGlass, 608, 448);
@@ -611,7 +611,7 @@ void Inventory::examine(InventoryItem item) {
}
}
-void Inventory::drawEgg() {
+void Inventory::drawEgg() const {
if (!getMenu()->isShown())
drawItem((CursorStyle)(getMenu()->getGameId() + 39), 608, 448, _eggHightlighted ? 0 : 1);
@@ -652,7 +652,7 @@ void Inventory::drawBlinkingEgg() {
askForRedraw();
}
-void Inventory::drawItem(CursorStyle id, uint16 x, uint16 y, int16 brightnessIndex) {
+void Inventory::drawItem(CursorStyle id, uint16 x, uint16 y, int16 brightnessIndex) const {
Icon icon(id);
icon.setPosition(x, y);
@@ -676,7 +676,7 @@ void Inventory::drawSelectedItem() {
}
}
-void Inventory::clearSelectedItem() {
+void Inventory::clearSelectedItem() const {
_engine->getGraphicsManager()->clear(GraphicsManager::kBackgroundInventory, Common::Rect(44, 0, 44 + 32, 32));
}
@@ -731,7 +731,7 @@ void Inventory::drawHighlight(uint32 currentIndex, bool reset) {
}
}
-uint32 Inventory::getItemIndex(uint32 currentIndex) {
+uint32 Inventory::getItemIndex(uint32 currentIndex) const {
uint32 count = 0;
for (uint32 i = 1; i < ARRAYSIZE(_entries); i++) {
diff --git a/engines/lastexpress/game/inventory.h b/engines/lastexpress/game/inventory.h
index b1995adce3..15dd29053d 100644
--- a/engines/lastexpress/game/inventory.h
+++ b/engines/lastexpress/game/inventory.h
@@ -107,9 +107,9 @@ public:
// UI Control
void show();
void blinkEgg(bool enabled);
- void showHourGlass();
- void setPortrait(InventoryItem item);
- void drawEgg();
+ void showHourGlass() const;
+ void setPortrait(InventoryItem item) const;
+ void drawEgg() const;
void drawBlinkingEgg();
// Handle inventory UI events.
@@ -168,14 +168,14 @@ private:
void close();
void examine(InventoryItem item);
void drawHighlight(uint32 currentIndex, bool reset);
- uint32 getItemIndex(uint32 currentIndex);
+ uint32 getItemIndex(uint32 currentIndex) const;
bool isItemSceneParameter(InventoryItem item) const;
- void drawItem(CursorStyle id, uint16 x, uint16 y, int16 brighnessIndex = -1);
+ void drawItem(CursorStyle id, uint16 x, uint16 y, int16 brighnessIndex = -1) const;
void drawSelectedItem();
- void clearSelectedItem();
+ void clearSelectedItem() const;
};
} // End of namespace LastExpress
diff --git a/engines/lastexpress/lastexpress.cpp b/engines/lastexpress/lastexpress.cpp
index cc3795651d..74d1969e01 100644
--- a/engines/lastexpress/lastexpress.cpp
+++ b/engines/lastexpress/lastexpress.cpp
@@ -52,18 +52,17 @@ const char *g_entityNames[] = { "Player", "Anna", "August", "Mertens", "Coudert"
namespace LastExpress {
LastExpressEngine::LastExpressEngine(OSystem *syst, const ADGameDescription *gd) :
- Engine(syst), _gameDescription(gd),
- _debugger(NULL), _cursor(NULL),
- _font(NULL), _logic(NULL), _menu(NULL),
- _frameCounter(0), _lastFrameCount(0),
+ Engine(syst), _gameDescription(gd),
+ _debugger(NULL), _random("lastexpress"), _cursor(NULL),
+ _font(NULL), _logic(NULL), _menu(NULL),
+ _frameCounter(0), _lastFrameCount(0),
_graphicsMan(NULL), _resMan(NULL),
_sceneMan(NULL), _soundMan(NULL),
_eventMouse(NULL), _eventTick(NULL),
- _eventMouseBackup(NULL), _eventTickBackup(NULL),
- _random("lastexpress")
+ _eventMouseBackup(NULL), _eventTickBackup(NULL)
{
// Setup mixer
- syncSoundSettings();
+ Engine::syncSoundSettings();
// Adding the default directories
const Common::FSNode gameDataDir(ConfMan.get("path"));
diff --git a/engines/lastexpress/resource.cpp b/engines/lastexpress/resource.cpp
index bbbd139b97..1d010355ac 100644
--- a/engines/lastexpress/resource.cpp
+++ b/engines/lastexpress/resource.cpp
@@ -128,13 +128,10 @@ bool ResourceManager::loadArchive(const Common::String &name) {
// Get a stream to file in the archive
// - same as createReadStreamForMember except it checks if the file exists and will assert / output a debug message if not
-Common::SeekableReadStream *ResourceManager::getFileStream(const Common::String &name) {
+Common::SeekableReadStream *ResourceManager::getFileStream(const Common::String &name) const {
// Check if the file exits in the archive
if (!hasFile(name)) {
-//#ifdef _DEBUG
-// error("[ResourceManager::getFileStream] Cannot open file: %s", name.c_str());
-//#endif
debugC(2, kLastExpressDebugResource, "Error opening file: %s", name.c_str());
return NULL;
}
diff --git a/engines/lastexpress/resource.h b/engines/lastexpress/resource.h
index f2f5d63bce..90ac9b87ad 100644
--- a/engines/lastexpress/resource.h
+++ b/engines/lastexpress/resource.h
@@ -42,7 +42,7 @@ public:
// Loading
bool loadArchive(ArchiveIndex type);
static bool isArchivePresent(ArchiveIndex type);
- Common::SeekableReadStream *getFileStream(const Common::String &name);
+ Common::SeekableReadStream *getFileStream(const Common::String &name) const;
// Archive functions
bool hasFile(const Common::String &name) const;
diff --git a/engines/lastexpress/sound/entry.cpp b/engines/lastexpress/sound/entry.cpp
index 85bb8eb479..3d2b05895f 100644
--- a/engines/lastexpress/sound/entry.cpp
+++ b/engines/lastexpress/sound/entry.cpp
@@ -44,6 +44,8 @@ namespace LastExpress {
SoundEntry::SoundEntry(LastExpressEngine *engine) : _engine(engine) {
_type = kSoundTypeNone;
+ _currentDataPtr = NULL;
+
_blockCount = 0;
_time = 0;
@@ -68,7 +70,13 @@ SoundEntry::~SoundEntry() {
// Entries that have been queued will have their streamed disposed automatically
if (!_soundStream)
SAFE_DELETE(_stream);
- delete _soundStream;
+
+ SAFE_DELETE(_soundStream);
+
+ free(_currentDataPtr);
+
+ _subtitle = NULL;
+ _stream = NULL;
// Zero passed pointers
_engine = NULL;
@@ -274,7 +282,7 @@ bool SoundEntry::updateSound() {
int l = strlen(sub) + 1;
if (l - 1 > 4)
- sub[l - 1 - 4] = 0;
+ sub[l - (1 + 4)] = 0;
showSubtitle(sub);
}
} else {
@@ -390,6 +398,10 @@ SubtitleEntry::SubtitleEntry(LastExpressEngine *engine) : _engine(engine) {
SubtitleEntry::~SubtitleEntry() {
SAFE_DELETE(_data);
+
+ // Zero-out passed pointers
+ _sound = NULL;
+ _engine = NULL;
}
void SubtitleEntry::load(Common::String filename, SoundEntry *soundEntry) {
@@ -420,6 +432,9 @@ void SubtitleEntry::loadData() {
}
void SubtitleEntry::setupAndDraw() {
+ if (!_sound)
+ error("[SubtitleEntry::setupAndDraw] Sound entry not initialized");
+
if (!_data) {
_data = new SubtitleManager(_engine->getFont());
_data->load(getArchive(_filename));
diff --git a/engines/lastexpress/sound/queue.cpp b/engines/lastexpress/sound/queue.cpp
index cfbb3091a4..5f3ab96d81 100644
--- a/engines/lastexpress/sound/queue.cpp
+++ b/engines/lastexpress/sound/queue.cpp
@@ -38,6 +38,7 @@ SoundQueue::SoundQueue(LastExpressEngine *engine) : _engine(engine) {
_subtitlesFlag = 0;
_currentSubtitle = NULL;
+ _soundCacheData = NULL;
}
SoundQueue::~SoundQueue() {
@@ -50,6 +51,7 @@ SoundQueue::~SoundQueue() {
_subtitles.clear();
_currentSubtitle = NULL;
+ SAFE_DELETE(_soundCacheData);
// Zero passed pointers
_engine = NULL;
@@ -133,7 +135,7 @@ void SoundQueue::updateQueue() {
// Original update the current entry, loading another set of samples to be decoded
- getFlags()->flag_3 = 0;
+ getFlags()->flag_3 = false;
--_flag;
}
@@ -339,13 +341,14 @@ void SoundQueue::updateSubtitles() {
return;
}
+ if (!subtitle)
+ return;
+
if (_subtitlesFlag & 1)
subtitle->drawOnScreen();
- if (subtitle) {
- subtitle->loadData();
- subtitle->setupAndDraw();
- }
+ subtitle->loadData();
+ subtitle->setupAndDraw();
}
//////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/sound/sound.cpp b/engines/lastexpress/sound/sound.cpp
index 17d51fe9f4..4f6a7b8f93 100644
--- a/engines/lastexpress/sound/sound.cpp
+++ b/engines/lastexpress/sound/sound.cpp
@@ -1329,23 +1329,23 @@ void SoundManager::playLoopingSound(int param) {
}
} else {
switch (getEntityData(kEntityPlayer)->car) {
- case 1:
- case 6:
+ case kCarBaggageRear:
+ case kCarBaggage:
partNumber = 4;
break;
- case 2:
- case 3:
- case 4:
- case 5:
+ case kCarKronos:
+ case kCarGreenSleeping:
+ case kCarRedSleeping:
+ case kCarRestaurant:
partNumber = 1;
break;
- case 7:
+ case kCarCoalTender:
partNumber = 5;
break;
- case 8:
+ case kCarLocomotive:
partNumber = 99;
break;
- case 9:
+ case kCar9:
partNumber = 3;
break;
default:
@@ -1356,13 +1356,13 @@ void SoundManager::playLoopingSound(int param) {
}
if (partNumber != 99)
- sprintf(tmp, "LOOP%d%c.SND", partNumber, _engine->getRandom().getRandomNumber(numLoops[partNumber] - 1) + 'A');
+ sprintf(tmp, "LOOP%d%c.SND", partNumber, (char)(_engine->getRandom().getRandomNumber(numLoops[partNumber] - 1) + 'A'));
}
if (getFlags()->flag_3)
fnameLen = 5;
- if (!entry || scumm_strnicmp(entry->getName2().c_str(), tmp, fnameLen)) {
+ if (!entry || scumm_strnicmp(entry->getName2().c_str(), tmp, (uint)fnameLen)) {
_loopingSoundDuration = _engine->getRandom().getRandomNumber(319) + 260;
if (partNumber != 99) {