MADS: Cleanup of verb/preposition flags handling

This commit is contained in:
Paul Gilbert 2014-04-08 23:01:46 -04:00
parent 21a0e38f34
commit 09adb571d3
6 changed files with 52 additions and 44 deletions

View file

@ -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 {

View file

@ -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;

View file

@ -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) {

View file

@ -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]; // ???

View file

@ -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() {

View file

@ -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 {