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' // Two 'look' actions in succession, so the action becomes 'Look around'
_statusText = kLookAroundStr; _statusText = kLookAroundStr;
} else { } 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 // Use/to action
int invIndex = userInterface._selectedInvIndex; int invIndex = userInterface._selectedInvIndex;
InventoryObject &objEntry = _vm->_game->_objects.getItem(invIndex); InventoryObject &objEntry = _vm->_game->_objects.getItem(invIndex);
@ -142,7 +143,7 @@ void MADSAction::set() {
} }
// Handling for if a hotspot has been selected/highlighted // 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; flag = true;
_statusText += kArticleList[_articleNumber]; _statusText += kArticleList[_articleNumber];
@ -379,8 +380,8 @@ void MADSAction::checkActionAtMousePos() {
if (userInterface._selectedActionIndex >= 0) { if (userInterface._selectedActionIndex >= 0) {
_commandSource = ACTIONMODE_VERB; _commandSource = ACTIONMODE_VERB;
_selectedRow = userInterface._selectedActionIndex; _selectedRow = userInterface._selectedActionIndex;
_flags1 = scene._verbList[_selectedRow]._action1; _verbType = scene._verbList[_selectedRow]._verbType;
_flags2 = scene._verbList[_selectedRow]._action2; _prepType = scene._verbList[_selectedRow]._prepType;
_interAwaiting = AWAITING_THIS; _interAwaiting = AWAITING_THIS;
} else if (userInterface._selectedItemVocabIdx >= 0) { } else if (userInterface._selectedItemVocabIdx >= 0) {
_commandSource = ACTIONMODE_OBJECT; _commandSource = ACTIONMODE_OBJECT;
@ -388,13 +389,14 @@ void MADSAction::checkActionAtMousePos() {
int objectId = _vm->_game->_objects._inventoryList[_selectedRow]; int objectId = _vm->_game->_objects._inventoryList[_selectedRow];
InventoryObject &invObject = _vm->_game->_objects[objectId]; InventoryObject &invObject = _vm->_game->_objects[objectId];
_flags1 = invObject._vocabList[_selectedRow - 1]._actionFlags1; _verbType = invObject._vocabList[_selectedRow - 1]._verbType;
_flags2 = invObject._vocabList[_selectedRow - 1]._actionFlags2; _prepType = invObject._vocabList[_selectedRow - 1]._prepType;
_mainObjectSource = ACTIONMODE2_2; _mainObjectSource = ACTIONMODE2_2;
_hotspotId = userInterface._selectedInvIndex; _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; _interAwaiting = AWAITING_RIGHT_MOUSE;
else else
_interAwaiting = AWAITING_THAT; _interAwaiting = AWAITING_THAT;
@ -412,8 +414,8 @@ void MADSAction::checkActionAtMousePos() {
_commandSource = ACTIONMODE_VERB; _commandSource = ACTIONMODE_VERB;
_selectedRow = _pickedWord; _selectedRow = _pickedWord;
if (_selectedRow >= 0) { if (_selectedRow >= 0) {
_flags1 = scene._verbList[_selectedRow]._action1; _verbType = scene._verbList[_selectedRow]._verbType;
_flags2 = scene._verbList[_selectedRow]._action2; _prepType = scene._verbList[_selectedRow]._prepType;
} }
break; break;
@ -427,13 +429,13 @@ void MADSAction::checkActionAtMousePos() {
int objectId = _vm->_game->_objects._inventoryList[_selectedRow]; int objectId = _vm->_game->_objects._inventoryList[_selectedRow];
InventoryObject &invObject = _vm->_game->_objects[objectId]; InventoryObject &invObject = _vm->_game->_objects[objectId];
_flags1 = invObject._vocabList[_selectedRow - 2]._actionFlags1; _verbType = invObject._vocabList[_selectedRow - 2]._verbType;
_flags2 = invObject._vocabList[_selectedRow - 2]._actionFlags2; _prepType = invObject._vocabList[_selectedRow - 2]._prepType;
_hotspotId = userInterface._selectedInvIndex; _hotspotId = userInterface._selectedInvIndex;
_mainObjectSource = ACTIONMODE2_2; _mainObjectSource = ACTIONMODE2_2;
if (_flags1 == 2) if (_verbType == VERB_THAT)
_articleNumber = _flags2; _articleNumber = _prepType;
} }
break; break;
@ -516,7 +518,7 @@ void MADSAction::leftClick() {
switch (userInterface._category) { switch (userInterface._category) {
case CAT_COMMAND: case CAT_COMMAND:
if (_selectedRow >= 0) { if (_selectedRow >= 0) {
if (!_flags1) { if (_verbType == VERB_ONLY) {
_selectedAction = -1; _selectedAction = -1;
} }
else { else {
@ -535,17 +537,15 @@ void MADSAction::leftClick() {
case CAT_INV_VOCAB: case CAT_INV_VOCAB:
if (_selectedRow >= 0) { if (_selectedRow >= 0) {
if (_flags1 != 1 || _flags2 != 0) { if (_verbType != VERB_THIS || _prepType != PREP_NONE) {
if (_flags1 != 2 || _flags2 == 0) { if (_verbType != VERB_THAT || _prepType == PREP_NONE) {
_interAwaiting = AWAITING_THAT; _interAwaiting = AWAITING_THAT;
_articleNumber = _flags2; _articleNumber = _prepType;
} } else {
else { _articleNumber = _prepType;
_articleNumber = _flags2;
_selectedAction = -1; _selectedAction = -1;
} }
} } else {
else {
_selectedAction = -1; _selectedAction = -1;
} }
@ -581,8 +581,8 @@ void MADSAction::leftClick() {
case CAT_HOTSPOT: case CAT_HOTSPOT:
case CAT_INV_ANIM: case CAT_INV_ANIM:
if (_hotspotId >= 0) { if (_hotspotId >= 0) {
if (_flags2) { if (_prepType) {
_articleNumber = _flags2; _articleNumber = _prepType;
_interAwaiting = AWAITING_THAT; _interAwaiting = AWAITING_THAT;
} }
else { else {

View file

@ -60,6 +60,12 @@ enum {
VERB_WALKTO = 13 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; class MADSEngine;
@ -91,7 +97,8 @@ private:
void startWalkingDirectly(int walkType); void startWalkingDirectly(int walkType);
public: public:
ActionDetails _action, _activeAction; ActionDetails _action, _activeAction;
int8 _flags1, _flags2; VerbType _verbType;
PrepType _prepType;
int _commandSource; int _commandSource;
int _mainObjectSource; int _mainObjectSource;
int _articleNumber; int _articleNumber;

View file

@ -33,8 +33,8 @@ void InventoryObject::load(Common::SeekableReadStream &f) {
_vocabCount = f.readByte(); _vocabCount = f.readByte();
for (int i = 0; i < 3; ++i) { for (int i = 0; i < 3; ++i) {
_vocabList[i]._actionFlags1 = f.readByte(); _vocabList[i]._verbType = (VerbType)f.readByte();
_vocabList[i]._actionFlags2 = f.readByte(); _vocabList[i]._prepType = (PrepType)f.readByte();
_vocabList[i]._vocabId = f.readUint16LE(); _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 // more of the engine is implemented
for (int i = 0; i < (int)size(); ++i) { for (int i = 0; i < (int)size(); ++i) {
InventoryObject &obj = (*this)[i]; InventoryObject &obj = (*this)[i];
if (obj._vocabList[0]._actionFlags1 <= i) if (obj._vocabList[0]._verbType <= i)
break; break;
if (obj._mutilateString[6 + i] == id) { if (obj._mutilateString[6 + i] == id) {

View file

@ -41,8 +41,8 @@ public:
int _article; int _article;
int _vocabCount; int _vocabCount;
struct { struct {
int _actionFlags1; VerbType _verbType;
int _actionFlags2; PrepType _prepType;
int _vocabId; int _vocabId;
} _vocabList[3]; } _vocabList[3];
char _mutilateString[10]; // ??? char _mutilateString[10]; // ???

View file

@ -50,16 +50,16 @@ Scene::Scene(MADSEngine *vm): _vm(vm), _action(_vm), _depthSurface(vm),
_layer = LAYER_GUI; _layer = LAYER_GUI;
_lookFlag = false; _lookFlag = false;
_verbList.push_back(VerbInit(VERB_LOOK, 2, 0)); _verbList.push_back(VerbInit(VERB_LOOK, VERB_THAT, PREP_NONE));
_verbList.push_back(VerbInit(VERB_TAKE, 2, 0)); _verbList.push_back(VerbInit(VERB_TAKE, VERB_THAT, PREP_NONE));
_verbList.push_back(VerbInit(VERB_PUSH, 2, 0)); _verbList.push_back(VerbInit(VERB_PUSH, VERB_THAT, PREP_NONE));
_verbList.push_back(VerbInit(VERB_OPEN, 2, 0)); _verbList.push_back(VerbInit(VERB_OPEN, VERB_THAT, PREP_NONE));
_verbList.push_back(VerbInit(VERB_PUT, 1, -1)); _verbList.push_back(VerbInit(VERB_PUT, VERB_THIS, PREP_RELATIONAL));
_verbList.push_back(VerbInit(VERB_TALKTO, 2, 0)); _verbList.push_back(VerbInit(VERB_TALKTO, VERB_THAT, PREP_NONE));
_verbList.push_back(VerbInit(VERB_GIVE, 1, 2)); _verbList.push_back(VerbInit(VERB_GIVE, VERB_THIS, PREP_TO));
_verbList.push_back(VerbInit(VERB_PULL, 2, 0)); _verbList.push_back(VerbInit(VERB_PULL, VERB_THAT, PREP_NONE));
_verbList.push_back(VerbInit(VERB_CLOSE, 2, 0)); _verbList.push_back(VerbInit(VERB_CLOSE, VERB_THAT, PREP_NONE));
_verbList.push_back(VerbInit(VERB_THROW, 1, 2)); _verbList.push_back(VerbInit(VERB_THROW, VERB_THIS, PREP_TO));
} }
Scene::~Scene() { Scene::~Scene() {

View file

@ -60,11 +60,12 @@ enum {
class VerbInit { class VerbInit {
public: public:
int _id; int _id;
int _action1; VerbType _verbType;
int _action2; PrepType _prepType;
VerbInit() {} 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 { class SceneLogic {