aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/m4/console.cpp14
-rw-r--r--engines/m4/globals.cpp24
-rw-r--r--engines/m4/globals.h15
-rw-r--r--engines/m4/mads_logic.cpp10
-rw-r--r--engines/m4/mads_scene.cpp42
-rw-r--r--engines/m4/mads_views.cpp14
-rw-r--r--engines/m4/mads_views.h9
7 files changed, 81 insertions, 47 deletions
diff --git a/engines/m4/console.cpp b/engines/m4/console.cpp
index 6f45f11f5a..fa4ca6d121 100644
--- a/engines/m4/console.cpp
+++ b/engines/m4/console.cpp
@@ -267,7 +267,7 @@ bool MadsConsole::cmdObject(int argc, const char **argv) {
DebugPrintf("%2d - ", objStart);
for (uint objId = objStart; objId < MIN<uint>(_vm->globals()->getObjectsSize(), objStart + 5); ++objId) {
if (objId != objStart) DebugPrintf(", ");
- uint16 descId = _vm->globals()->getObject(objId)->descId;
+ uint16 descId = _vm->globals()->getObject(objId)->_descId;
DebugPrintf("%s", _vm->globals()->getVocab(descId));
}
@@ -297,15 +297,15 @@ bool MadsConsole::cmdObject(int argc, const char **argv) {
else {
const MadsObject *obj = _vm->globals()->getObject(objNum);
- DebugPrintf("Object #%d (%s) room=%d article=%d/%s vocabs=%d", objNum, _vm->globals()->getVocab(obj->descId),
- obj->roomNumber, (int)obj->article, englishMADSArticleList[obj->article], obj->vocabCount);
+ DebugPrintf("Object #%d (%s) room=%d article=%d/%s vocabs=%d", objNum, _vm->globals()->getVocab(obj->_descId),
+ obj->_roomNumber, (int)obj->_article, englishMADSArticleList[obj->_article], obj->_vocabCount);
- if (obj->vocabCount > 0) {
+ if (obj->_vocabCount > 0) {
DebugPrintf(" - ");
- for (int i = 0; i < obj->vocabCount; ++i) {
+ for (int i = 0; i < obj->_vocabCount; ++i) {
if (i != 0) DebugPrintf(", ");
- DebugPrintf("%s (%d)/%d,%d", _vm->globals()->getVocab(obj->vocabList[i].vocabId),
- obj->vocabList[i].vocabId, obj->vocabList[i].flags1, obj->vocabList[i].flags2);
+ DebugPrintf("%s (%d)/%d,%d", _vm->globals()->getVocab(obj->_vocabList[i].vocabId),
+ obj->_vocabList[i].vocabId, obj->_vocabList[i].flags1, obj->_vocabList[i].flags2);
}
}
DebugPrintf("\n");
diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp
index 58cadb3c9f..8787f89d04 100644
--- a/engines/m4/globals.cpp
+++ b/engines/m4/globals.cpp
@@ -523,19 +523,23 @@ void MadsObject::load(Common::SeekableReadStream *stream) {
stream->read(obj, 0x30);
// Extract object data fields
- descId = READ_LE_UINT16(&obj[0]);
- roomNumber = READ_LE_UINT16(&obj[2]);
- article = (MADSArticles)obj[4];
- vocabCount = obj[5] & 0x7f;
+ _descId = READ_LE_UINT16(&obj[0]);
+ _roomNumber = READ_LE_UINT16(&obj[2]);
+ _article = (MADSArticles)obj[4];
+ _vocabCount = obj[5] & 0x7f;
// Phantom / Dragon
- if (vocabCount > 3)
- warning("MadsObject::load(), vocab cound > 3 (it's %d)", vocabCount);
+ if (_vocabCount > 3)
+ warning("MadsObject::load(), vocab cound > 3 (it's %d)", _vocabCount);
- for (int i = 0; i < vocabCount; ++i) {
- vocabList[i].flags1 = obj[6 + i * 4];
- vocabList[i].flags2 = obj[7 + i * 4];
- vocabList[i].vocabId = READ_LE_UINT16(&obj[8 + i * 4]);
+ for (int i = 0; i < _vocabCount; ++i) {
+ _vocabList[i].flags1 = obj[6 + i * 4];
+ _vocabList[i].flags2 = obj[7 + i * 4];
+ _vocabList[i].vocabId = READ_LE_UINT16(&obj[8 + i * 4]);
}
}
+void MadsObject::setRoom(int roomNumber) {
+
+}
+
} // End of namespace M4
diff --git a/engines/m4/globals.h b/engines/m4/globals.h
index a95e5169be..ae2941c169 100644
--- a/engines/m4/globals.h
+++ b/engines/m4/globals.h
@@ -177,13 +177,14 @@ public:
MadsObject() {}
MadsObject(Common::SeekableReadStream *stream);
void load(Common::SeekableReadStream *stream);
- bool isInInventory() const { return roomNumber == PLAYER_INVENTORY; }
-
- uint16 descId;
- uint16 roomNumber;
- MADSArticles article;
- uint8 vocabCount;
- VocabEntry vocabList[3];
+ bool isInInventory() const { return _roomNumber == PLAYER_INVENTORY; }
+ void setRoom(int roomNumber);
+
+ uint16 _descId;
+ uint16 _roomNumber;
+ MADSArticles _article;
+ uint8 _vocabCount;
+ VocabEntry _vocabList[3];
};
typedef Common::Array<Common::SharedPtr<MadsObject> > MadsObjectArray;
diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp
index a73e943f4f..b1e57bd7f3 100644
--- a/engines/m4/mads_logic.cpp
+++ b/engines/m4/mads_logic.cpp
@@ -951,7 +951,7 @@ void MadsSceneLogic::callSubroutine(int subIndex, Common::Stack<ScriptVar> &stac
// object_is_present
EXTRACT_PARAMS(1);
const MadsObject *obj = _madsVm->globals()->getObject(p[0]);
- stack.push(ScriptVar((obj->roomNumber == _madsVm->scene()->_currentScene)));
+ stack.push(ScriptVar((obj->_roomNumber == _madsVm->scene()->_currentScene)));
break;
}
@@ -978,6 +978,14 @@ void MadsSceneLogic::callSubroutine(int subIndex, Common::Stack<ScriptVar> &stac
break;
}
+ case 26: {
+ // object_set_room
+ EXTRACT_PARAMS(2);
+ MadsObject *obj = _madsVm->globals()->getObject(p[0]);
+ obj->setRoom(p[1]);
+ break;
+ }
+
default:
error("Unknown subroutine %d called", subIndex);
break;
diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp
index 1a44c49f00..a0acbdd69d 100644
--- a/engines/m4/mads_scene.cpp
+++ b/engines/m4/mads_scene.cpp
@@ -428,7 +428,29 @@ void MadsScene::doSceneStep() {
}
void MadsScene::doAction() {
- warning("TODO MadsScene::doAction");
+ AbortTimerMode mode = ABORTMODE_0;
+ _abortTimersMode2 = mode;
+
+ if ((_action._inProgress || (_abortTimers != 0)) && !_action._v8453A) {
+ _sceneLogic.doAction();
+ mode = _action._inProgress ? ABORTMODE_0 : ABORTMODE_1;
+ }
+
+ if (_screenObjects._v832EC)
+ _action._inProgress = false;
+ else {
+ if ((_action._inProgress || (_abortTimers != 0)) && (mode == ABORTMODE_0) && (_action._v8453A == mode)) {
+ // TODO: sound_fn_p();
+ mode = _action._inProgress ? ABORTMODE_0 : ABORTMODE_1;
+
+ }
+
+ if ((_action._inProgress || (_abortTimers != 0)) && (mode == ABORTMODE_0) && (_action._v8453A == mode)) {
+ // Perform a core scene-indepedant action on an object
+ // object_do_action
+ }
+ }
+
}
@@ -870,7 +892,7 @@ void MadsInterfaceView::initialize() {
for (uint i = 0; i < _madsVm->globals()->getObjectsSize(); ++i) {
MadsObject *obj = _madsVm->globals()->getObject(i);
- if (obj->roomNumber == PLAYER_INVENTORY)
+ if (obj->_roomNumber == PLAYER_INVENTORY)
_inventoryList.push_back(i);
}
@@ -919,7 +941,7 @@ void MadsInterfaceView::setSelectedObject(int objectNumber) {
void MadsInterfaceView::addObjectToInventory(int objectNumber) {
if (_inventoryList.indexOf(objectNumber) == -1) {
- _madsVm->globals()->getObject(objectNumber)->roomNumber = PLAYER_INVENTORY;
+ _madsVm->globals()->getObject(objectNumber)->_roomNumber = PLAYER_INVENTORY;
_inventoryList.push_back(objectNumber);
}
@@ -972,7 +994,7 @@ void MadsInterfaceView::onRefresh(RectList *rects, M4Surface *destSurface) {
break;
const char *descStr = _madsVm->globals()->getVocab(_madsVm->globals()->getObject(
- _inventoryList[_topIndex + i])->descId);
+ _inventoryList[_topIndex + i])->_descId);
strcpy(buffer, descStr);
if ((buffer[0] >= 'a') && (buffer[0] <= 'z')) buffer[0] -= 'a' - 'A';
@@ -1002,13 +1024,13 @@ void MadsInterfaceView::onRefresh(RectList *rects, M4Surface *destSurface) {
// List the vocab actions for the currently selected object
MadsObject *obj = _madsVm->globals()->getObject(_selectedObject);
- int yIndex = MIN(_highlightedElement - VOCAB_START, obj->vocabCount - 1);
+ int yIndex = MIN(_highlightedElement - VOCAB_START, obj->_vocabCount - 1);
- for (int i = 0; i < obj->vocabCount; ++i) {
+ for (int i = 0; i < obj->_vocabCount; ++i) {
const Common::Rect r(_screenObjects[VOCAB_START + i]);
// Get the vocab description and capitalise it
- const char *descStr = _madsVm->globals()->getVocab(obj->vocabList[i].vocabId);
+ const char *descStr = _madsVm->globals()->getVocab(obj->_vocabList[i].vocabId);
strcpy(buffer, descStr);
if ((buffer[0] >= 'a') && (buffer[0] <= 'z')) buffer[0] -= 'a' - 'A';
@@ -1060,12 +1082,12 @@ bool MadsInterfaceView::onEvent(M4EventType eventType, int32 param1, int x, int
} else if ((_highlightedElement >= VOCAB_START) && (_highlightedElement < (VOCAB_START + 5))) {
// A vocab action was selected
MadsObject *obj = _madsVm->globals()->getObject(_selectedObject);
- int vocabIndex = MIN(_highlightedElement - VOCAB_START, obj->vocabCount - 1);
+ int vocabIndex = MIN(_highlightedElement - VOCAB_START, obj->_vocabCount - 1);
if (vocabIndex >= 0) {
act._actionMode = ACTMODE_OBJECT;
act._actionMode2 = ACTMODE2_2;
- act._flags1 = obj->vocabList[1].flags1;
- act._flags2 = obj->vocabList[1].flags2;
+ act._flags1 = obj->_vocabList[1].flags1;
+ act._flags2 = obj->_vocabList[1].flags2;
act._action.verbId = _selectedObject;
act._articleNumber = act._flags2;
diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp
index 7628c0d650..b66591a207 100644
--- a/engines/m4/mads_views.cpp
+++ b/engines/m4/mads_views.cpp
@@ -100,8 +100,8 @@ void MadsAction::set() {
int selectedObject = _madsVm->scene()->getInterface()->getSelectedObject();
MadsObject *objEntry = _madsVm->globals()->getObject(selectedObject);
- _action.objectNameId = objEntry->descId;
- _currentAction = objEntry->vocabList[_selectedRow].vocabId;
+ _action.objectNameId = objEntry->_descId;
+ _currentAction = objEntry->_vocabList[_selectedRow].vocabId;
// Set up the status text stirng
strcpy(_statusText, useStr);
@@ -119,7 +119,7 @@ void MadsAction::set() {
int selectedObject = _madsVm->scene()->getInterface()->getSelectedObject();
MadsObject *objEntry = _madsVm->globals()->getObject(selectedObject);
- _currentAction = objEntry->vocabList[_selectedRow].vocabId;
+ _currentAction = objEntry->_vocabList[_selectedRow].vocabId;
}
appendVocab(_currentAction, true);
@@ -165,7 +165,7 @@ void MadsAction::set() {
if ((_actionMode2 == ACTMODE2_2) || (_actionMode2 == ACTMODE2_5)) {
// Get name from given inventory object
int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_hotspotId);
- _action.objectNameId = _madsVm->globals()->getObject(objectId)->descId;
+ _action.objectNameId = _madsVm->globals()->getObject(objectId)->_descId;
} else if (_hotspotId < hotspotCount) {
// Get name from scene hotspot
_action.objectNameId = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getVocabID();
@@ -184,7 +184,7 @@ void MadsAction::set() {
if ((_v86F42 == 2) || (_v86F42 == 5)) {
int objectId = _madsVm->scene()->getInterface()->getInventoryObject(_hotspotId);
- articleNum = _madsVm->globals()->getObject(objectId)->article;
+ articleNum = _madsVm->globals()->getObject(objectId)->_article;
} else if (_v86F3A < hotspotCount) {
articleNum = (*_madsVm->scene()->getSceneResources().hotspots)[_hotspotId].getArticle();
} else {
@@ -256,7 +256,7 @@ void MadsAction::startAction() {
_madsVm->_player.moveComplete();
_inProgress = true;
- _v8453A = 0;
+ _v8453A = ABORTMODE_0;
_savedFields.selectedRow = _selectedRow;
_savedFields.articleNumber = _articleNumber;
_savedFields.actionMode = _actionMode;
@@ -271,7 +271,7 @@ void MadsAction::startAction() {
strcpy(_dialogTitle, _statusText);
if ((_savedFields.actionMode2 == ACTMODE2_4) && (savedV86F42 == 0))
- _v8453A = true;
+ _v8453A = ABORTMODE_1;
_startWalkFlag = false;
int hotspotId = -1;
diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h
index e49c9e6d94..6be2283a32 100644
--- a/engines/m4/mads_views.h
+++ b/engines/m4/mads_views.h
@@ -34,7 +34,8 @@ 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_4 = 4, ACTMODE2_5 = 5};
+enum MadsActionMode2 {ACTMODE2_0 = 0, ACTMODE2_2 = 2, ACTMODE2_4 = 4, ACTMODE2_5 = 5};
+enum AbortTimerMode {ABORTMODE_0 = 0, ABORTMODE_1 = 1, ABORTMODE_2 = 2};
struct ActionDetails {
int verbId;
@@ -62,7 +63,7 @@ public:
int _currentAction;
int8 _flags1, _flags2;
MadsActionMode _actionMode;
- MAdsActionMode2 _actionMode2;
+ MadsActionMode2 _actionMode2;
int _articleNumber;
bool _lookFlag;
int _selectedRow;
@@ -82,7 +83,7 @@ public:
int16 _v86F4C;
int _v83338;
bool _inProgress;
- bool _v8453A;
+ AbortTimerMode _v8453A;
public:
MadsAction(MadsView &owner);
@@ -96,8 +97,6 @@ public:
bool isAction(int verbId, int objectNameId = 0, int indirectObjectId = 0);
};
-enum AbortTimerMode {ABORTMODE_0 = 0, ABORTMODE_1 = 1, ABORTMODE_2 = 2};
-
class SpriteSlotSubset {
public:
int spriteListIndex;