MADS: Cleanup of verb/preposition flags handling
This commit is contained in:
parent
21a0e38f34
commit
09adb571d3
6 changed files with 52 additions and 44 deletions
|
@ -105,7 +105,8 @@ void MADSAction::set() {
|
|||
// Two 'look' actions in succession, so the action becomes 'Look around'
|
||||
_statusText = kLookAroundStr;
|
||||
} else {
|
||||
if ((_commandSource == ACTIONMODE_OBJECT) && (_selectedRow >= 0) && (_flags1 == 2) && (_flags2 == 0)) {
|
||||
if ((_commandSource == ACTIONMODE_OBJECT) && (_selectedRow >= 0)
|
||||
&& (_verbType == VERB_THAT) && (_prepType == PREP_NONE)) {
|
||||
// Use/to action
|
||||
int invIndex = userInterface._selectedInvIndex;
|
||||
InventoryObject &objEntry = _vm->_game->_objects.getItem(invIndex);
|
||||
|
@ -142,7 +143,7 @@ void MADSAction::set() {
|
|||
}
|
||||
|
||||
// Handling for if a hotspot has been selected/highlighted
|
||||
if ((_hotspotId >= 0) && (_selectedRow >= 0) && (_articleNumber > 0) && (_flags1 == 2)) {
|
||||
if ((_hotspotId >= 0) && (_selectedRow >= 0) && (_articleNumber > 0) && (_verbType == VERB_THAT)) {
|
||||
flag = true;
|
||||
|
||||
_statusText += kArticleList[_articleNumber];
|
||||
|
@ -379,8 +380,8 @@ void MADSAction::checkActionAtMousePos() {
|
|||
if (userInterface._selectedActionIndex >= 0) {
|
||||
_commandSource = ACTIONMODE_VERB;
|
||||
_selectedRow = userInterface._selectedActionIndex;
|
||||
_flags1 = scene._verbList[_selectedRow]._action1;
|
||||
_flags2 = scene._verbList[_selectedRow]._action2;
|
||||
_verbType = scene._verbList[_selectedRow]._verbType;
|
||||
_prepType = scene._verbList[_selectedRow]._prepType;
|
||||
_interAwaiting = AWAITING_THIS;
|
||||
} else if (userInterface._selectedItemVocabIdx >= 0) {
|
||||
_commandSource = ACTIONMODE_OBJECT;
|
||||
|
@ -388,13 +389,14 @@ void MADSAction::checkActionAtMousePos() {
|
|||
int objectId = _vm->_game->_objects._inventoryList[_selectedRow];
|
||||
InventoryObject &invObject = _vm->_game->_objects[objectId];
|
||||
|
||||
_flags1 = invObject._vocabList[_selectedRow - 1]._actionFlags1;
|
||||
_flags2 = invObject._vocabList[_selectedRow - 1]._actionFlags2;
|
||||
_verbType = invObject._vocabList[_selectedRow - 1]._verbType;
|
||||
_prepType = invObject._vocabList[_selectedRow - 1]._prepType;
|
||||
_mainObjectSource = ACTIONMODE2_2;
|
||||
_hotspotId = userInterface._selectedInvIndex;
|
||||
_articleNumber = _flags2;
|
||||
_articleNumber = _prepType;
|
||||
|
||||
if ((_flags1 == 1 && _flags2 == 0) || (_flags1 == 2 && _flags2 != 0))
|
||||
if ((_verbType == VERB_THIS && _prepType == PREP_NONE) ||
|
||||
(_verbType == VERB_THAT && _prepType != PREP_NONE))
|
||||
_interAwaiting = AWAITING_RIGHT_MOUSE;
|
||||
else
|
||||
_interAwaiting = AWAITING_THAT;
|
||||
|
@ -412,8 +414,8 @@ void MADSAction::checkActionAtMousePos() {
|
|||
_commandSource = ACTIONMODE_VERB;
|
||||
_selectedRow = _pickedWord;
|
||||
if (_selectedRow >= 0) {
|
||||
_flags1 = scene._verbList[_selectedRow]._action1;
|
||||
_flags2 = scene._verbList[_selectedRow]._action2;
|
||||
_verbType = scene._verbList[_selectedRow]._verbType;
|
||||
_prepType = scene._verbList[_selectedRow]._prepType;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -427,13 +429,13 @@ void MADSAction::checkActionAtMousePos() {
|
|||
int objectId = _vm->_game->_objects._inventoryList[_selectedRow];
|
||||
InventoryObject &invObject = _vm->_game->_objects[objectId];
|
||||
|
||||
_flags1 = invObject._vocabList[_selectedRow - 2]._actionFlags1;
|
||||
_flags2 = invObject._vocabList[_selectedRow - 2]._actionFlags2;
|
||||
_verbType = invObject._vocabList[_selectedRow - 2]._verbType;
|
||||
_prepType = invObject._vocabList[_selectedRow - 2]._prepType;
|
||||
_hotspotId = userInterface._selectedInvIndex;
|
||||
_mainObjectSource = ACTIONMODE2_2;
|
||||
|
||||
if (_flags1 == 2)
|
||||
_articleNumber = _flags2;
|
||||
if (_verbType == VERB_THAT)
|
||||
_articleNumber = _prepType;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -516,7 +518,7 @@ void MADSAction::leftClick() {
|
|||
switch (userInterface._category) {
|
||||
case CAT_COMMAND:
|
||||
if (_selectedRow >= 0) {
|
||||
if (!_flags1) {
|
||||
if (_verbType == VERB_ONLY) {
|
||||
_selectedAction = -1;
|
||||
}
|
||||
else {
|
||||
|
@ -535,17 +537,15 @@ void MADSAction::leftClick() {
|
|||
|
||||
case CAT_INV_VOCAB:
|
||||
if (_selectedRow >= 0) {
|
||||
if (_flags1 != 1 || _flags2 != 0) {
|
||||
if (_flags1 != 2 || _flags2 == 0) {
|
||||
if (_verbType != VERB_THIS || _prepType != PREP_NONE) {
|
||||
if (_verbType != VERB_THAT || _prepType == PREP_NONE) {
|
||||
_interAwaiting = AWAITING_THAT;
|
||||
_articleNumber = _flags2;
|
||||
}
|
||||
else {
|
||||
_articleNumber = _flags2;
|
||||
_articleNumber = _prepType;
|
||||
} else {
|
||||
_articleNumber = _prepType;
|
||||
_selectedAction = -1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
_selectedAction = -1;
|
||||
}
|
||||
|
||||
|
@ -581,8 +581,8 @@ void MADSAction::leftClick() {
|
|||
case CAT_HOTSPOT:
|
||||
case CAT_INV_ANIM:
|
||||
if (_hotspotId >= 0) {
|
||||
if (_flags2) {
|
||||
_articleNumber = _flags2;
|
||||
if (_prepType) {
|
||||
_articleNumber = _prepType;
|
||||
_interAwaiting = AWAITING_THAT;
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -60,6 +60,12 @@ enum {
|
|||
VERB_WALKTO = 13
|
||||
};
|
||||
|
||||
enum VerbType { VERB_ONLY, VERB_THIS, VERB_THAT };
|
||||
|
||||
enum PrepType {
|
||||
PREP_NONE, PREP_WITH, PREP_TO, PREP_AT, PREP_FROM, PREP_ON, PREP_IN,
|
||||
PREP_UNDER, PREP_BEHIND, PREP_RELATIONAL = -1
|
||||
};
|
||||
|
||||
class MADSEngine;
|
||||
|
||||
|
@ -91,7 +97,8 @@ private:
|
|||
void startWalkingDirectly(int walkType);
|
||||
public:
|
||||
ActionDetails _action, _activeAction;
|
||||
int8 _flags1, _flags2;
|
||||
VerbType _verbType;
|
||||
PrepType _prepType;
|
||||
int _commandSource;
|
||||
int _mainObjectSource;
|
||||
int _articleNumber;
|
||||
|
|
|
@ -33,8 +33,8 @@ void InventoryObject::load(Common::SeekableReadStream &f) {
|
|||
_vocabCount = f.readByte();
|
||||
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
_vocabList[i]._actionFlags1 = f.readByte();
|
||||
_vocabList[i]._actionFlags2 = f.readByte();
|
||||
_vocabList[i]._verbType = (VerbType)f.readByte();
|
||||
_vocabList[i]._prepType = (PrepType)f.readByte();
|
||||
_vocabList[i]._vocabId = f.readUint16LE();
|
||||
}
|
||||
|
||||
|
@ -71,7 +71,7 @@ void InventoryObjects::setQuality(int objIndex, int id, const byte *p) {
|
|||
// more of the engine is implemented
|
||||
for (int i = 0; i < (int)size(); ++i) {
|
||||
InventoryObject &obj = (*this)[i];
|
||||
if (obj._vocabList[0]._actionFlags1 <= i)
|
||||
if (obj._vocabList[0]._verbType <= i)
|
||||
break;
|
||||
|
||||
if (obj._mutilateString[6 + i] == id) {
|
||||
|
|
|
@ -41,8 +41,8 @@ public:
|
|||
int _article;
|
||||
int _vocabCount;
|
||||
struct {
|
||||
int _actionFlags1;
|
||||
int _actionFlags2;
|
||||
VerbType _verbType;
|
||||
PrepType _prepType;
|
||||
int _vocabId;
|
||||
} _vocabList[3];
|
||||
char _mutilateString[10]; // ???
|
||||
|
|
|
@ -50,16 +50,16 @@ Scene::Scene(MADSEngine *vm): _vm(vm), _action(_vm), _depthSurface(vm),
|
|||
_layer = LAYER_GUI;
|
||||
_lookFlag = false;
|
||||
|
||||
_verbList.push_back(VerbInit(VERB_LOOK, 2, 0));
|
||||
_verbList.push_back(VerbInit(VERB_TAKE, 2, 0));
|
||||
_verbList.push_back(VerbInit(VERB_PUSH, 2, 0));
|
||||
_verbList.push_back(VerbInit(VERB_OPEN, 2, 0));
|
||||
_verbList.push_back(VerbInit(VERB_PUT, 1, -1));
|
||||
_verbList.push_back(VerbInit(VERB_TALKTO, 2, 0));
|
||||
_verbList.push_back(VerbInit(VERB_GIVE, 1, 2));
|
||||
_verbList.push_back(VerbInit(VERB_PULL, 2, 0));
|
||||
_verbList.push_back(VerbInit(VERB_CLOSE, 2, 0));
|
||||
_verbList.push_back(VerbInit(VERB_THROW, 1, 2));
|
||||
_verbList.push_back(VerbInit(VERB_LOOK, VERB_THAT, PREP_NONE));
|
||||
_verbList.push_back(VerbInit(VERB_TAKE, VERB_THAT, PREP_NONE));
|
||||
_verbList.push_back(VerbInit(VERB_PUSH, VERB_THAT, PREP_NONE));
|
||||
_verbList.push_back(VerbInit(VERB_OPEN, VERB_THAT, PREP_NONE));
|
||||
_verbList.push_back(VerbInit(VERB_PUT, VERB_THIS, PREP_RELATIONAL));
|
||||
_verbList.push_back(VerbInit(VERB_TALKTO, VERB_THAT, PREP_NONE));
|
||||
_verbList.push_back(VerbInit(VERB_GIVE, VERB_THIS, PREP_TO));
|
||||
_verbList.push_back(VerbInit(VERB_PULL, VERB_THAT, PREP_NONE));
|
||||
_verbList.push_back(VerbInit(VERB_CLOSE, VERB_THAT, PREP_NONE));
|
||||
_verbList.push_back(VerbInit(VERB_THROW, VERB_THIS, PREP_TO));
|
||||
}
|
||||
|
||||
Scene::~Scene() {
|
||||
|
|
|
@ -60,11 +60,12 @@ enum {
|
|||
class VerbInit {
|
||||
public:
|
||||
int _id;
|
||||
int _action1;
|
||||
int _action2;
|
||||
VerbType _verbType;
|
||||
PrepType _prepType;
|
||||
|
||||
VerbInit() {}
|
||||
VerbInit(int id, int action1, int action2): _id(id), _action1(action1), _action2(action2) {}
|
||||
VerbInit(int id, VerbType verbType, PrepType prepType): _id(id),
|
||||
_verbType(verbType), _prepType(prepType) {}
|
||||
};
|
||||
|
||||
class SceneLogic {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue