aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/m4/console.cpp8
-rw-r--r--engines/m4/hotspot.h1
-rw-r--r--engines/m4/m4_scene.cpp12
-rw-r--r--engines/m4/mads_logic.cpp6
-rw-r--r--engines/m4/mads_logic.h1
-rw-r--r--engines/m4/mads_menus.cpp2
-rw-r--r--engines/m4/mads_menus.h2
-rw-r--r--engines/m4/mads_scene.cpp45
-rw-r--r--engines/m4/mads_scene.h4
-rw-r--r--engines/m4/mads_views.cpp111
-rw-r--r--engines/m4/mads_views.h33
-rw-r--r--engines/m4/scene.cpp10
-rw-r--r--engines/m4/scene.h7
13 files changed, 190 insertions, 52 deletions
diff --git a/engines/m4/console.cpp b/engines/m4/console.cpp
index 19fbf6e852..71c70e3e1b 100644
--- a/engines/m4/console.cpp
+++ b/engines/m4/console.cpp
@@ -103,8 +103,8 @@ bool Console::cmdListHotSpots(int argc, const char **argv) {
if (_vm->isM4()) {
DebugPrintf("Scene parallax\n");
_m4Vm->scene()->getSceneResources().parallax->dump();
- DebugPrintf("Scene props\n");
- _vm->_scene->getSceneResources().props->dump();
+ DebugPrintf("Scene dynamic hotspots\n");
+ _vm->_scene->getSceneResources().dynamicHotspots->dump();
}
return true;
}
@@ -400,9 +400,9 @@ bool M4Console::cmdSceneInfo(int argc, const char **argv) {
DebugPrintf("Scene resources:\n");
DebugPrintf("artBase: %s\n", _m4Vm->scene()->getSceneResources().artBase);
DebugPrintf("pictureBase: %s\n", _m4Vm->scene()->getSceneResources().pictureBase);
- DebugPrintf("hotspotCount: %i\n", _m4Vm->scene()->getSceneResources().hotspotCount);
+ DebugPrintf("hotspotCount: %i\n", _m4Vm->scene()->getSceneResources().hotspots->size());
DebugPrintf("parallaxCount: %i\n", _m4Vm->scene()->getSceneResources().parallaxCount);
- DebugPrintf("propsCount: %i\n", _m4Vm->scene()->getSceneResources().propsCount);
+ DebugPrintf("dynHotspotCount: %i\n", _m4Vm->scene()->getSceneResources().dynamicHotspots->size());
DebugPrintf("frontY: %i\n", _m4Vm->scene()->getSceneResources().frontY);
DebugPrintf("backY: %i\n", _m4Vm->scene()->getSceneResources().backY);
DebugPrintf("frontScale: %i\n", _m4Vm->scene()->getSceneResources().frontScale);
diff --git a/engines/m4/hotspot.h b/engines/m4/hotspot.h
index b06865c39a..f650d5ff54 100644
--- a/engines/m4/hotspot.h
+++ b/engines/m4/hotspot.h
@@ -104,6 +104,7 @@ public:
int add(HotSpot *hotspot, bool head = false);
HotSpot *get(int index) { return _hotspots[index]; }
HotSpot &operator[](int idx) { return *get(idx); }
+ int size() const { return _hotspots.size(); }
void remove(HotSpot *hotspot);
void unlinkItem(HotSpot *hotspot);
void clear();
diff --git a/engines/m4/m4_scene.cpp b/engines/m4/m4_scene.cpp
index 0c984af448..475fdba653 100644
--- a/engines/m4/m4_scene.cpp
+++ b/engines/m4/m4_scene.cpp
@@ -45,7 +45,7 @@ M4Scene::M4Scene(M4Engine *vm): _sceneResources(), Scene(vm, &_sceneResources) {
_sceneResources.hotspots = new HotSpotList();
_sceneResources.parallax = new HotSpotList();
- _sceneResources.props = new HotSpotList();
+ _sceneResources.dynamicHotspots = new HotSpotList();
_interfaceSurface = new M4InterfaceView(vm);
}
@@ -74,9 +74,9 @@ void M4Scene::loadSceneResources(int sceneNumber) {
if (sceneS != NULL) {
sceneS->read(_sceneResources.artBase, MAX_CHK_FILENAME_SIZE);
sceneS->read(_sceneResources.pictureBase, MAX_CHK_FILENAME_SIZE);
- _sceneResources.hotspotCount = sceneS->readUint32LE();
+ int hotspotCount = sceneS->readUint32LE();
_sceneResources.parallaxCount = sceneS->readUint32LE();
- _sceneResources.propsCount = sceneS->readUint32LE();
+ int dynHotspotCount = sceneS->readUint32LE();
_sceneResources.frontY = sceneS->readUint32LE();
_sceneResources.backY = sceneS->readUint32LE();
_sceneResources.frontScale = sceneS->readUint32LE();
@@ -99,11 +99,11 @@ void M4Scene::loadSceneResources(int sceneNumber) {
// Clear current hotspot lists
_sceneResources.hotspots->clear();
_sceneResources.parallax->clear();
- _sceneResources.props->clear();
+ _sceneResources.dynamicHotspots->clear();
- _sceneResources.hotspots->loadHotSpots(sceneS, _sceneResources.hotspotCount);
+ _sceneResources.hotspots->loadHotSpots(sceneS, hotspotCount);
_sceneResources.parallax->loadHotSpots(sceneS, _sceneResources.parallaxCount);
- _sceneResources.props->loadHotSpots(sceneS, _sceneResources.propsCount);
+ _sceneResources.dynamicHotspots->loadHotSpots(sceneS, dynHotspotCount);
// Note that toss() deletes the MemoryReadStream
_vm->res()->toss(filename);
diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp
index e451a306ef..f3f284d1a3 100644
--- a/engines/m4/mads_logic.cpp
+++ b/engines/m4/mads_logic.cpp
@@ -418,8 +418,12 @@ void MadsSceneLogic::enterScene() {
lowRoomsEntrySound();
}
-void MadsSceneLogic::doAction() {
+void MadsSceneLogic::doPreactions() {
+ warning("Still to do preactions logic");
+}
+void MadsSceneLogic::doAction() {
+ warning("Still to do actions logic");
}
void MadsSceneLogic::sceneStep() {
diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h
index 98d6df6163..28120377e2 100644
--- a/engines/m4/mads_logic.h
+++ b/engines/m4/mads_logic.h
@@ -59,6 +59,7 @@ public:
void setupScene();
void enterScene();
+ void doPreactions();
void doAction();
void sceneStep();
};
diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp
index d7d9cf4150..810acb04fb 100644
--- a/engines/m4/mads_menus.cpp
+++ b/engines/m4/mads_menus.cpp
@@ -809,7 +809,7 @@ void RexDialogView::setFrame(int frameNumber, int depth) {
}
void RexDialogView::initVars() {
- _word_8502C = -1;
+ _v8502C = -1;
_selectedLine = -1;
_lineIndex = 0;
_enterFlag = false;
diff --git a/engines/m4/mads_menus.h b/engines/m4/mads_menus.h
index e964c5866d..a0fc6fb3bc 100644
--- a/engines/m4/mads_menus.h
+++ b/engines/m4/mads_menus.h
@@ -136,7 +136,7 @@ protected:
int _dialogSelectedLine;
Common::StringArray _saveList;
- int _word_8502C;
+ int _v8502C;
int _selectedLine;
int _lineIndex;
bool _enterFlag;
diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp
index c459a2a58a..1f43f73cc0 100644
--- a/engines/m4/mads_scene.cpp
+++ b/engines/m4/mads_scene.cpp
@@ -195,24 +195,21 @@ void MadsScene::loadSceneHotspots(int sceneNumber) {
int hotspotCount = hotspotStream->readUint16LE();
delete hotspotStream;
- _sceneResources.hotspotCount = hotspotCount;
-
hotspotStream = hotSpotData.getItemStream(1);
// Clear current hotspot lists
_sceneResources.hotspots->clear();
-
- _sceneResources.hotspots->loadHotSpots(hotspotStream, _sceneResources.hotspotCount);
+ _sceneResources.hotspots->loadHotSpots(hotspotStream, hotspotCount);
delete hotspotStream;
}
void MadsScene::leaveScene() {
_sceneResources.hotspots->clear();
- _sceneResources.props->clear();
+ _sceneResources.dynamicHotspots->clear();
delete _sceneResources.hotspots;
- delete _sceneResources.props;
+ delete _sceneResources.dynamicHotspots;
delete _walkSurface;
if (_activeAnimation) {
@@ -322,6 +319,21 @@ void MadsScene::updateState() {
// _screenObjects.check(v, false);
}
+ // Handle starting off any selected action
+ bool lookFlag = false;
+ if ((_action._selectedAction != 0) && _madsVm->_player._stepEnabled &&
+ !_action._verbNounFlag && !_abortTimers && !_madsVm->_player._unk3) {
+ // Start the action
+ _action.startAction();
+
+ lookFlag = (_action._action.verbId == kVerbLookAt) || (_action._action.verbId == kVerbLook);
+ }
+ if (lookFlag || ((_abortTimers != 0) && (_abortTimersMode == ABORTMODE_2)))
+ doPreactions();
+
+ checkStartWalk();
+
+ // Update the player
_madsVm->_player.update();
// Handle refreshing the mouse position display
@@ -364,6 +376,25 @@ void MadsScene::updateState() {
freeAnimation();
}
+void MadsScene::checkStartWalk() {
+ if (_action._verbNounFlag && _action._walkFlag) {
+ _madsVm->_player.setDest(_destPos.x, _destPos.y, _destFacing);
+ _action._verbNounFlag = false;
+ }
+}
+
+void MadsScene::doPreactions() {
+ if ((_screenObjects._v832EC == 0) || (_screenObjects._v832EC == 2)) {
+ _abortTimersMode2 = ABORTMODE_2;
+ _action.checkAction();
+
+ _sceneLogic.doPreactions();
+
+ if (_abortTimersMode == ABORTMODE_2)
+ _abortTimers = 0;
+ }
+}
+
/**
* Does extra work at cleaning up the animation, and then deletes it
*/
@@ -999,7 +1030,7 @@ bool MadsInterfaceView::onEvent(M4EventType eventType, int32 param1, int x, int
act._flags1 = obj->vocabList[1].flags1;
act._flags2 = obj->vocabList[1].flags2;
- act._action.hotspotId = _selectedObject;
+ act._action.verbId = _selectedObject;
act._articleNumber = act._flags2;
}
}
diff --git a/engines/m4/mads_scene.h b/engines/m4/mads_scene.h
index 2bd38aff6f..baa6a67861 100644
--- a/engines/m4/mads_scene.h
+++ b/engines/m4/mads_scene.h
@@ -98,9 +98,13 @@ private:
void clearAction();
void appendActionVocab(int vocabId, bool capitalise);
void setAction();
+ void checkStartWalk();
+ void doPreactions();
public:
char _aaName[100];
bool _showMousePos;
+ Common::Point _destPos;
+ int _destFacing;
public:
MadsScene(MadsEngine *vm);
virtual ~MadsScene();
diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp
index 34218cebfd..a8a8e09105 100644
--- a/engines/m4/mads_views.cpp
+++ b/engines/m4/mads_views.cpp
@@ -49,20 +49,21 @@ void MadsAction::clear() {
_v83338 = 1;
_actionMode = ACTMODE_NONE;
_actionMode2 = ACTMODE2_0;
- _word_86F42 = 0;
- _word_86F4E = 0;
+ _v86F42 = 0;
+ _v86F4E = 0;
_articleNumber = 0;
_lookFlag = false;
- _word_86F4A = 0;
+ _v86F4A = 0;
_statusText[0] = '\0';
_selectedRow = -1;
_hotspotId = -1;
- _word_86F3A = -1;
- _word_86F4C = -1;
- _action.hotspotId = -1;
+ _v86F3A = -1;
+ _v86F4C = -1;
+ _action.verbId = -1;
_action.objectNameId = -1;
_action.indirectObjectId = -1;
_textChanged = true;
+ _walkFlag = false;
}
void MadsAction::appendVocab(int vocabId, bool capitalise) {
@@ -76,7 +77,7 @@ void MadsAction::appendVocab(int vocabId, bool capitalise) {
}
void MadsAction::set() {
- int hotspotCount = _madsVm->scene()->getSceneResources().hotspotCount;
+ int hotspotCount = _madsVm->scene()->getSceneResources().hotspots->size();
bool flag = false;
strcpy(_statusText, "");
@@ -148,7 +149,7 @@ void MadsAction::set() {
verbId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVerbID();
} else {
// Get the verb Id from the scene object
- verbId = (*_madsVm->scene()->getSceneResources().props)[_hotspotId - hotspotCount].getVerbID();
+ verbId = (*_madsVm->scene()->getSceneResources().dynamicHotspots)[_hotspotId - hotspotCount].getVerbID();
}
if (verbId > 0) {
@@ -171,7 +172,7 @@ void MadsAction::set() {
_action.objectNameId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVocabID();
} else {
// Get name from temporary scene hotspot
- _action.objectNameId = (*_madsVm->scene()->getSceneResources().props)[_hotspotId].getVocabID();
+ _action.objectNameId = (*_madsVm->scene()->getSceneResources().dynamicHotspots)[_hotspotId].getVocabID();
}
appendVocab(_action.objectNameId);
}
@@ -179,13 +180,13 @@ void MadsAction::set() {
if ((_hotspotId >= 0) && (_articleNumber > 0) && !flag) {
if (_articleNumber == -1) {
- if (_word_86F3A >= 0) {
+ if (_v86F3A >= 0) {
int articleNum = 0;
- if ((_word_86F42 == 2) || (_word_86F42 == 5)) {
+ if ((_v86F42 == 2) || (_v86F42 == 5)) {
int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_hotspotId);
articleNum = _madsVm->globals()->getObject(objectId)->article;
- } else if (_word_86F3A < hotspotCount) {
+ } else if (_v86F3A < hotspotCount) {
articleNum = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getArticle();
} else {
@@ -205,7 +206,7 @@ void MadsAction::set() {
}
// Append object description if necessary
- if (_word_86F3A >= 0)
+ if (_v86F3A >= 0)
appendVocab(_action.indirectObjectId);
// Remove any trailing space character
@@ -252,6 +253,86 @@ void MadsAction::refresh() {
_textChanged = false;
}
+void MadsAction::startAction() {
+ _madsVm->_player.moveComplete();
+
+ _v84538 = -1;
+ _v8453A = 0;
+ _savedFields.selectedRow = _selectedRow;
+ _savedFields.articleNumber = _articleNumber;
+ _savedFields.actionMode = _actionMode;
+ _savedFields.actionMode2 = _actionMode2;
+ _savedFields.lookFlag = _lookFlag;
+ int savedHotspotId = _hotspotId;
+ int savedV86F3A = _v86F3A;
+ int savedV86F42 = _v86F42;
+
+ // Copy the action to be active
+ _activeAction = _action;
+ strcpy(_dialogTitle, _statusText);
+
+ if ((_savedFields.actionMode2 == ACTMODE2_4) && (savedV86F42 == 0))
+ _v8453A = true;
+
+ _verbNounFlag = false;
+ int hotspotId = -1;
+ HotSpotList &dynHotspots = *_madsVm->scene()->getSceneResources().dynamicHotspots;
+ HotSpotList &hotspots = *_madsVm->scene()->getSceneResources().hotspots;
+
+ if (!_savedFields.lookFlag && (_madsVm->scene()->_screenObjects._v832EC != 1)) {
+ if (_savedFields.actionMode2 == ACTMODE2_4)
+ hotspotId = savedHotspotId;
+ else if (savedV86F42 == 4)
+ hotspotId = savedV86F3A;
+
+ if (hotspotId >= hotspots.size()) {
+ HotSpot &hs = dynHotspots[hotspotId - hotspots.size()];
+ if ((hs.getFeetX() == -1) || (hs.getFeetX() == -3)) {
+ if (_v86F4A && ((hs.getFeetX() == -3) || (_savedFields.selectedRow < 0))) {
+ _verbNounFlag = true;
+ _madsVm->scene()->_destPos = _customDest;
+ }
+ } else if ((hs.getFeetX() >= 0) && ((_savedFields.actionMode == ACTMODE_NONE) || (hs.getCursor() < 2))) {
+ _verbNounFlag = true;
+ _madsVm->scene()->_destPos.x = hs.getFeetX();
+ _madsVm->scene()->_destPos.y = hs.getFeetY();
+ }
+ _madsVm->scene()->_destFacing = hs.getFacing();
+ }
+ hotspotId = -1;
+ }
+
+ if (hotspotId >= 0) {
+ HotSpot &hs = hotspots[hotspotId];
+ if ((hs.getFeetX() == -1) || (hs.getFeetX() == -3)) {
+ if (_v86F4A && ((hs.getFeetX() == -3) || (_savedFields.selectedRow < 0))) {
+ _verbNounFlag = true;
+ _madsVm->scene()->_destPos = _customDest;
+ }
+ } else if ((hs.getFeetX() >= 0) && ((_savedFields.actionMode == ACTMODE_NONE) || (hs.getCursor() < 2))) {
+ _verbNounFlag = true;
+ _madsVm->scene()->_destPos.x = hs.getFeetX();
+ _madsVm->scene()->_destPos.y = hs.getFeetY();
+ }
+ _madsVm->scene()->_destFacing = hs.getFacing();
+ }
+}
+
+void MadsAction::checkAction() {
+ if (isAction(kVerbLookAt) || isAction(kVerbThrow))
+ _verbNounFlag = 0;
+}
+
+bool MadsAction::isAction(int verbId, int objectNameId, int indirectObjectId) {
+ if (_activeAction.verbId != verbId)
+ return false;
+ if ((objectNameId != 0) && (_activeAction.objectNameId != objectNameId))
+ return false;
+ if ((indirectObjectId != 0) && (_activeAction.indirectObjectId != indirectObjectId))
+ return false;
+ return true;
+}
+
//--------------------------------------------------------------------------
bool MadsSpriteSlot::operator==(const SpriteSlotSubset &other) const {
@@ -407,8 +488,8 @@ void MadsSpriteSlots::drawForeground(M4Surface *viewport) {
// Get a list of sprite object depths for active objects
for (int i = 0; i < startIndex; ++i) {
- if (_entries[i].spriteType >= 0) {
- DepthEntry rec(_entries[i].depth, i);
+ if (_entries[i].spriteType >= SPRITE_ZERO) {
+ DepthEntry rec(16 - _entries[i].depth, i);
depthList.push_back(rec);
}
}
diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h
index d29947390a..3f5615ee37 100644
--- a/engines/m4/mads_views.h
+++ b/engines/m4/mads_views.h
@@ -37,22 +37,31 @@ namespace M4 {
class MadsView;
enum MadsActionMode {ACTMODE_NONE = 0, ACTMODE_VERB = 1, ACTMODE_OBJECT = 3, ACTMODE_TALK = 6};
-enum MAdsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_5 = 5};
+enum MAdsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_4 = 4, ACTMODE2_5 = 5};
struct ActionDetails {
- int hotspotId;
+ int verbId;
int objectNameId;
int indirectObjectId;
};
+struct MadsActionSavedFields {
+ int articleNumber;
+ int actionMode;
+ int actionMode2;
+ bool lookFlag;
+ int selectedRow;
+};
+
class MadsAction {
private:
MadsView &_owner;
char _statusText[100];
+ char _dialogTitle[100];
void appendVocab(int vocabId, bool capitalise = false);
public:
- ActionDetails _action;
+ ActionDetails _action, _activeAction;
int _currentAction;
int8 _flags1, _flags2;
MadsActionMode _actionMode;
@@ -65,14 +74,19 @@ public:
bool _verbNounFlag;
int _statusTextIndex;
int _hotspotId;
+ MadsActionSavedFields _savedFields;
+ bool _walkFlag;
+ Common::Point _customDest;
// Unknown fields
- int16 _word_86F3A;
- int16 _word_86F42;
- int16 _word_86F4E;
- int16 _word_86F4A;
- int16 _word_86F4C;
+ int16 _v86F3A;
+ int16 _v86F42;
+ int16 _v86F4E;
+ bool _v86F4A;
+ int16 _v86F4C;
int _v83338;
+ int _v84538;
+ bool _v8453A;
public:
MadsAction(MadsView &owner);
@@ -81,6 +95,9 @@ public:
void set();
const char *statusText() const { return _statusText; }
void refresh();
+ void startAction();
+ void checkAction();
+ bool isAction(int verbId, int objectNameId = 0, int indirectObjectId = 0);
};
enum AbortTimerMode {ABORTMODE_0 = 0, ABORTMODE_1 = 1, ABORTMODE_2 = 2};
diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp
index 08d79f0f66..361d1bad47 100644
--- a/engines/m4/scene.cpp
+++ b/engines/m4/scene.cpp
@@ -44,7 +44,7 @@ Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0,
_screenType = VIEWID_SCENE;
_sceneResources->hotspots = new HotSpotList();
- _sceneResources->props = new HotSpotList();
+ _sceneResources->dynamicHotspots = new HotSpotList();
_backgroundSurface = new M4Surface();
_walkSurface = new M4Surface();
_palData = NULL;
@@ -123,14 +123,14 @@ void Scene::showHotSpots() {
HotSpot *currentHotSpot;
// hotspots (green)
- for (i = 0; i < _sceneResources->hotspotCount; i++) {
+ for (i = 0; i < _sceneResources->hotspots->size(); i++) {
currentHotSpot = _sceneResources->hotspots->get(i);
_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->GREEN);
}
- // props (red)
- for (i = 0; i < _sceneResources->propsCount; i++) {
- currentHotSpot = _sceneResources->props->get(i);
+ // Dynamic hotspots (red)
+ for (i = 0; i < _sceneResources->dynamicHotspots->size(); i++) {
+ currentHotSpot = _sceneResources->dynamicHotspots->get(i);
_backgroundSurface->frameRect(currentHotSpot->getRect(), _vm->_palette->RED);
}
}
diff --git a/engines/m4/scene.h b/engines/m4/scene.h
index 76b99a7bcd..e6eaed0ab9 100644
--- a/engines/m4/scene.h
+++ b/engines/m4/scene.h
@@ -53,17 +53,16 @@ enum MADSVerbs {
kVerbPull = 10,
kVerbClose = 11,
kVerbThrow = 12,
- kVerbWalkTo = 13
+ kVerbWalkTo = 13,
+ kVerbLookAt = 209
};
class SceneResources {
public:
char artBase[MAX_CHK_FILENAME_SIZE];
char pictureBase[MAX_CHK_FILENAME_SIZE];
- int32 hotspotCount;
HotSpotList *hotspots;
- int32 propsCount;
- HotSpotList *props;
+ HotSpotList *dynamicHotspots;
int32 frontY, backY;
int32 frontScale, backScale;
int16 depthTable[16];