aboutsummaryrefslogtreecommitdiff
path: root/queen
diff options
context:
space:
mode:
authorGregory Montoir2003-11-03 14:47:22 +0000
committerGregory Montoir2003-11-03 14:47:22 +0000
commitac47dbeee8508a18bc062117ddd7ece5a1d699a6 (patch)
tree9860fdfd8b2b5ab93033b6f7698bb4eae384255e /queen
parentb6d8e8187bb9011dd4501adf8ba2fe2e905f96da (diff)
downloadscummvm-rg350-ac47dbeee8508a18bc062117ddd7ece5a1d699a6.tar.gz
scummvm-rg350-ac47dbeee8508a18bc062117ddd7ece5a1d699a6.tar.bz2
scummvm-rg350-ac47dbeee8508a18bc062117ddd7ece5a1d699a6.zip
cleanup / enable cutaway calls
svn-id: r11090
Diffstat (limited to 'queen')
-rw-r--r--queen/command.cpp432
-rw-r--r--queen/command.h48
2 files changed, 233 insertions, 247 deletions
diff --git a/queen/command.cpp b/queen/command.cpp
index 8500f3b7ee..870d33276f 100644
--- a/queen/command.cpp
+++ b/queen/command.cpp
@@ -111,12 +111,13 @@ void Command::clear(bool clearTexts) {
_graphics->textClear(151, 151);
}
_parse = false;
- _commandLevel = 1;
- _oldVerb = _verb = Verb(VERB_NONE);
- _oldNoun = _noun = _selectedNoun = 0;
- _currentAction = Verb(VERB_NONE);
- _selectedAction = Verb(VERB_NONE);
- _subject1 = _subject2 = 0;
+
+ _curCmd.commandLevel = 1;
+ _curCmd.oldVerb = _curCmd.verb = _curCmd.action = Verb(VERB_NONE);
+ _curCmd.oldNoun = _curCmd.noun = 0;
+
+ _selCmd.action = _selCmd.defaultVerb = Verb(VERB_NONE);
+ _selCmd.noun = _selCmd.subject1 = _selCmd.subject2 = 0;
}
@@ -127,7 +128,7 @@ void Command::executeCurrentAction(bool walk) {
const char *obj1Name = NULL;
const char *obj2Name = NULL;
- if (_commandLevel == 2 && _mouseKey == Input::MOUSE_RBUTTON) {
+ if (_curCmd.commandLevel == 2 && _mouseKey == Input::MOUSE_RBUTTON) {
_mouseKey = Input::MOUSE_LBUTTON;
}
@@ -136,43 +137,43 @@ void Command::executeCurrentAction(bool walk) {
uint16 objMax = _logic->currentRoomObjMax();
uint16 roomData = _logic->currentRoomData();
- if (_mouseKey == Input::MOUSE_RBUTTON && _subject1 != 0) {
+ if (_mouseKey == Input::MOUSE_RBUTTON && _selCmd.subject1 != 0) {
// check to see if selecting default command for object/item
- if (_subject1 > 0) {
+ if (_selCmd.subject1 > 0) {
// an object
- int16 i = _subject1;
- if (_noun > objMax) {
- int16 aObj = _logic->currentRoomArea(_noun - objMax)->object;
+ int16 i = _selCmd.subject1;
+ if (_curCmd.noun > objMax) {
+ int16 aObj = _logic->currentRoomArea(_curCmd.noun - objMax)->object;
int16 aObjName = _logic->objectData(aObj)->name;
if (aObjName > 0) {
- _noun = objMax;
+ _curCmd.noun = objMax;
i = aObj;
}
}
ObjectData *od = _logic->objectData(ABS(i));
obj1Name = _logic->objectName(od->name);
- if (_noun == 0 || _noun > objMax || _logic->objectData(i)->name <= 0) {
+ if (_curCmd.noun == 0 || _curCmd.noun > objMax || _logic->objectData(i)->name <= 0) {
cleanupCurrentAction();
return;
}
- uint16 obj = roomData + _noun;
- _verb = findDefault(obj, false);
- if (_verb.isNone()) {
+ uint16 obj = roomData + _curCmd.noun;
+ _curCmd.verb = findDefault(obj, false);
+ if (_curCmd.verb.isNone()) {
// no match made, so command not yet completed, redefine as WALK_TO
_cmdText.setVerb(Verb(VERB_WALK_TO));
- _selectedAction = Verb(VERB_WALK_TO);
+ _selCmd.action = Verb(VERB_WALK_TO);
}
else {
- _cmdText.setVerb(_verb);
- _selectedAction = _verb;
+ _cmdText.setVerb(_curCmd.verb);
+ _selCmd.action = _curCmd.verb;
}
_cmdText.addObject(_logic->objectName(_logic->objectData(obj)->name));
}
else {
// an item
- int16 name = _logic->itemData(ABS(_subject1))->name;
+ int16 name = _logic->itemData(ABS(_selCmd.subject1))->name;
obj1Name = _logic->objectName(name);
}
}
@@ -180,14 +181,14 @@ void Command::executeCurrentAction(bool walk) {
// make sure that command is always highlighted when actioned!
_cmdText.display(INK_CMD_SELECT);
- _selectedNoun = _noun;
- _commandLevel = 1;
+ _selCmd.noun = _curCmd.noun;
+ _curCmd.commandLevel = 1;
// XXX SUBJECT[2]=0;
// get objects names
- obj1Name = _logic->objectOrItemName(_subject1);
- obj2Name = _logic->objectOrItemName(_subject2);
+ obj1Name = _logic->objectOrItemName(_selCmd.subject1);
+ obj2Name = _logic->objectOrItemName(_selCmd.subject2);
if (handleBadCommand(walk)) {
cleanupCurrentAction();
@@ -195,12 +196,12 @@ void Command::executeCurrentAction(bool walk) {
}
// get the number of commands associated with Object/Item
- uint16 comMax = countAssociatedCommands(_selectedAction, _subject1, _subject2);
+ uint16 comMax = countAssociatedCommands(_selCmd.action, _selCmd.subject1, _selCmd.subject2);
if (comMax == 0) {
// no command match was found, so exit
// pass ACTION2 as paramater, as a new Command (and a new ACTION2)
// can be constructed while Joe speaks
- executeStandardStuff(_selectedAction, _subject1, _subject2);
+ executeStandardStuff(_selCmd.action, _selCmd.subject1, _selCmd.subject2);
cleanupCurrentAction();
return;
}
@@ -216,7 +217,7 @@ void Command::executeCurrentAction(bool walk) {
++comId;
// try to find a match for the command in COM_LIST
for (; comId <= _numCmdList; ++comId, ++com) {
- if (com->match(_selectedAction, _subject1, _subject2)) {
+ if (com->match(_selCmd.action, _selCmd.subject1, _selCmd.subject2)) {
break;
}
}
@@ -230,7 +231,7 @@ void Command::executeCurrentAction(bool walk) {
if (cond == -1 && curCommand == comMax) {
// only exit on a condition fail if at last command
// Joe hasnt spoken, so do normal LOOK command
- if (_selectedAction.value() == VERB_LOOK_AT) {
+ if (_selCmd.action.value() == VERB_LOOK_AT) {
// Look At, do standard look at routine
look();
cleanupCurrentAction();
@@ -256,12 +257,12 @@ void Command::executeCurrentAction(bool walk) {
}
// Don't grab if action is TALK or WALK
- if (_selectedAction.value() != VERB_TALK_TO && _selectedAction.value() != VERB_WALK_TO) {
- if (_subject1 > 0) {
- _logic->joeGrab(_logic->objectData(_subject1)->state, 0);
+ if (_selCmd.action.value() != VERB_TALK_TO && _selCmd.action.value() != VERB_WALK_TO) {
+ if (_selCmd.subject1 > 0) {
+ _logic->joeGrab(_logic->objectData(_selCmd.subject1)->state, 0);
}
- if (_subject2 > 0) {
- _logic->joeGrab(_logic->objectData(_subject2)->state, 0);
+ if (_selCmd.subject2 > 0) {
+ _logic->joeGrab(_logic->objectData(_selCmd.subject2)->state, 0);
}
}
@@ -294,9 +295,9 @@ void Command::executeCurrentAction(bool walk) {
}
int16 oldImage = 0;
- if (_subject1 > 0) {
+ if (_selCmd.subject1 > 0) {
// an object (not an item)
- oldImage = _logic->objectData(_subject1)->image;
+ oldImage = _logic->objectData(_selCmd.subject1)->image;
}
if (com->setObjects) {
@@ -307,7 +308,7 @@ void Command::executeCurrentAction(bool walk) {
}
if (com->imageOrder != 0) {
- ObjectData* od = _logic->objectData(_subject1);
+ ObjectData* od = _logic->objectData(_selCmd.subject1);
// we must update the graphic image of the object
if (com->imageOrder < 0) {
// instead of setting to -1 or -2, flag as negative
@@ -319,21 +320,21 @@ void Command::executeCurrentAction(bool walk) {
else {
od->image = com->imageOrder;
}
- _logic->roomRefreshObject(_subject1);
+ _logic->roomRefreshObject(_selCmd.subject1);
}
else {
// this object is not being updated by command list, see if
// it has another image copied to it
- if (_subject1 > 0) {
+ if (_selCmd.subject1 > 0) {
// an object (not an item)
- if (_logic->objectData(_subject1)->image != oldImage) {
- _logic->roomRefreshObject(_subject1);
+ if (_logic->objectData(_selCmd.subject1)->image != oldImage) {
+ _logic->roomRefreshObject(_selCmd.subject1);
}
}
}
// don't play music on an OPEN/CLOSE command - in case the command fails
- if (_selectedAction.value() != VERB_OPEN && _selectedAction.value() != VERB_CLOSE) {
+ if (_selCmd.action.value() != VERB_OPEN && _selCmd.action.value() != VERB_CLOSE) {
// only play song if it's a PLAY BEFORE type
if (com->song > 0) {
// XXX playsong(com->song);
@@ -360,9 +361,9 @@ void Command::executeCurrentAction(bool walk) {
break;
}
- changeObjectState(_selectedAction, _subject1, com->song, cutDone);
+ changeObjectState(_selCmd.action, _selCmd.subject1, com->song, cutDone);
- if (_selectedAction.value() == VERB_TALK_TO && cond > 0) {
+ if (_selCmd.action.value() == VERB_TALK_TO && cond > 0) {
if (executeIfDialog(_logic->objectTextualDescription(cond))) {
cleanupCurrentAction();
return;
@@ -387,7 +388,7 @@ void Command::executeCurrentAction(bool walk) {
}
else {
// we've failed commands with nothing to say
- if (_selectedAction.value() == VERB_LOOK_AT) {
+ if (_selCmd.action.value() == VERB_LOOK_AT) {
// Look At, do standard look at routine
look();
cleanupCurrentAction();
@@ -419,15 +420,15 @@ void Command::updatePlayer() {
warning("Command::updatePlayer() - Journal not implemented");
}
else if (!_input->keyVerb().isSkipText()) {
- _verb = _input->keyVerb();
- if (_verb.isInventory()) {
- _noun = _selectedNoun = 0;
+ _curCmd.verb = _input->keyVerb();
+ if (_curCmd.verb.isInventory()) {
+ _curCmd.noun = _selCmd.noun = 0;
// Clear old noun and old verb in case we're pointing at an
// object (noun) or item (verb) and we want to use an item
// on it. This was the command will be redisplayed with the
// object/item that the cursor is currently on.
- _oldNoun = 0;
- _oldVerb = Verb(VERB_NONE);
+ _curCmd.oldNoun = 0;
+ _curCmd.oldVerb = Verb(VERB_NONE);
grabSelectedItem();
}
else {
@@ -501,22 +502,22 @@ void Command::grabCurrentSelection() {
_selPosY = _input->mousePosY();
uint16 zone = _logic->findObjectUnderCursor(_selPosX, _selPosY);
- _noun = _logic->findObjectRoomNumber(zone);
- _verb = _logic->findVerbUnderCursor(_selPosX, _selPosY);
+ _curCmd.noun = _logic->findObjectRoomNumber(zone);
+ _curCmd.verb = _logic->findVerbUnderCursor(_selPosX, _selPosY);
_selPosX += _logic->display()->horizontalScroll();
- debug(0, "Command::grabCurrentSelection() - _noun = %d, _verb = %d", _noun, _verb.value());
- if (_verb.isAction()) {
+ debug(0, "Command::grabCurrentSelection() - _curCmd.noun = %d, _curCmd.verb = %d", _curCmd.noun, _curCmd.verb.value());
+ if (_curCmd.verb.isAction()) {
grabSelectedVerb();
}
- else if (_verb.isInventory()) {
+ else if (_curCmd.verb.isInventory()) {
grabSelectedItem();
}
- else if (_noun > 0 && _noun <= _logic->currentRoomObjMax()) {
+ else if (_curCmd.noun > 0 && _curCmd.noun <= _logic->currentRoomObjMax()) {
grabSelectedNoun();
}
- else if (_selPosY < ROOM_ZONE_HEIGHT && _verb.isNone()) {
+ else if (_selPosY < ROOM_ZONE_HEIGHT && _curCmd.verb.isNone()) {
// select without a command, do a WALK
clear(true);
_logic->joeWalk(2);
@@ -531,7 +532,7 @@ void Command::grabSelectedItem() {
// Set PARSE to TRUE, default FALSE if command half complete
_parse = true;
- uint16 item = _logic->findInventoryItem(_verb.inventoryItem());
+ uint16 item = _logic->findInventoryItem(_curCmd.verb.inventoryItem());
if (item == 0 || _logic->itemData(item)->name == 0) {
return;
}
@@ -540,95 +541,95 @@ void Command::grabSelectedItem() {
// the ITEMs default, otherwise keep constructing!
if (_mouseKey == Input::MOUSE_LBUTTON ||
- (!_input->keyVerb().isNone() && !_verb.isNone())) {
- if (_currentAction.isNone()) {
+ (!_input->keyVerb().isNone() && !_curCmd.verb.isNone())) {
+ if (_curCmd.action.isNone()) {
if (!_input->keyVerb().isNone()) {
/* 2 - We've selected via the keyboard, no command is being */
/* constructed, so we shall find the item's default */
- _verb = findDefault(item, true);
- if (_verb.isNone()) {
+ _curCmd.verb = findDefault(item, true);
+ if (_curCmd.verb.isNone()) {
// set to Look At
- _verb = Verb(VERB_LOOK_AT);
+ _curCmd.verb = Verb(VERB_LOOK_AT);
_cmdText.setVerb(Verb(VERB_LOOK_AT));
}
- _currentAction = _verb;
+ _curCmd.action = _curCmd.verb;
}
else {
// Action>0 ONLY if command has been constructed
// Left Mouse Button pressed just do Look At
- _verb = Verb(VERB_LOOK_AT);
- _currentAction = Verb(VERB_LOOK_AT);
+ _curCmd.verb = Verb(VERB_LOOK_AT);
+ _curCmd.action = Verb(VERB_LOOK_AT);
_cmdText.setVerb(Verb(VERB_LOOK_AT));
}
}
- _verb = Verb(VERB_NONE);
+ _curCmd.verb = Verb(VERB_NONE);
}
else {
if (_logic->joeWalk() == 1) {
_cmdText.clear();
- _commandLevel = 1;
+ _curCmd.commandLevel = 1;
_logic->joeWalk(0);
- _currentAction = Verb(VERB_NONE);
+ _curCmd.action = Verb(VERB_NONE);
lookCurrentIcon();
}
- if (!_defaultVerb.isNone()) {
- alterDefault(_defaultVerb, true);
- _defaultVerb = Verb(VERB_NONE);
+ if (!_selCmd.defaultVerb.isNone()) {
+ alterDefault(_selCmd.defaultVerb, true);
+ _selCmd.defaultVerb = Verb(VERB_NONE);
clear(true);
return;
}
if (_cmdText.isEmpty()) {
- _verb = Verb(VERB_LOOK_AT);
- _currentAction = Verb(VERB_LOOK_AT);
+ _curCmd.verb = Verb(VERB_LOOK_AT);
+ _curCmd.action = Verb(VERB_LOOK_AT);
_cmdText.setVerb(Verb(VERB_LOOK_AT));
}
else {
- if (_commandLevel == 2 && _parse) {
- _verb = _currentAction;
+ if (_curCmd.commandLevel == 2 && _parse) {
+ _curCmd.verb = _curCmd.action;
}
else {
- _verb = findDefault(item, true);
+ _curCmd.verb = findDefault(item, true);
}
- if (!_verb.isNone()) {
+ if (!_curCmd.verb.isNone()) {
// No match made, so command not yet completed. Redefine as LOOK AT
- _verb = Verb(VERB_LOOK_AT);
+ _curCmd.verb = Verb(VERB_LOOK_AT);
_cmdText.setVerb(Verb(VERB_LOOK_AT));
}
- _currentAction = _verb;
+ _curCmd.action = _curCmd.verb;
}
}
- if (_currentAction.isTwoLevelsCommand() && _commandLevel == 1) {
+ if (_curCmd.action.isTwoLevelsCommand() && _curCmd.commandLevel == 1) {
_parse = false;
}
- if (!_currentAction.isNone()) {
+ if (!_curCmd.action.isNone()) {
_cmdText.addObject(_logic->objectName(_logic->itemData(item)->name));
}
- switch (_commandLevel) {
+ switch (_curCmd.commandLevel) {
case 1:
- _subject1 = -item;
+ _selCmd.subject1 = -item;
break;
case 2:
- _subject2 = -item;
+ _selCmd.subject2 = -item;
break;
}
- if (_currentAction.value() == VERB_USE && _commandLevel == 1) {
+ if (_curCmd.action.value() == VERB_USE && _curCmd.commandLevel == 1) {
if (State::findUse(_logic->itemData(item)->state) == STATE_USE_ON) {
_cmdText.addLinkWord(Verb(VERB_PREP_WITH));
- _commandLevel = 2;
+ _curCmd.commandLevel = 2;
}
else {
_parse = true;
}
_cmdText.display(INK_CMD_NORMAL);
}
- else if (_currentAction.value() == VERB_GIVE && _commandLevel == 1) {
+ else if (_curCmd.action.value() == VERB_GIVE && _curCmd.commandLevel == 1) {
_cmdText.addLinkWord(Verb(VERB_PREP_TO));
- _commandLevel = 2;
+ _curCmd.commandLevel = 2;
_cmdText.display(INK_CMD_NORMAL);
}
else {
@@ -636,10 +637,10 @@ void Command::grabSelectedItem() {
}
if (_parse) {
- _verb = Verb(VERB_NONE);
+ _curCmd.verb = Verb(VERB_NONE);
_logic->joeWalk(2); // set JOEWALK flag to perform EXECUTE_ACTION procedure
- _selectedAction = _currentAction;
- _currentAction = Verb(VERB_NONE);
+ _selCmd.action = _curCmd.action;
+ _curCmd.action = Verb(VERB_NONE);
}
}
@@ -652,75 +653,75 @@ void Command::grabSelectedNoun() {
// click object without a command, if DEFAULT then
// do that, otherwise do a WALK!
- uint16 objNum = _logic->currentRoomData() + _noun;
+ uint16 objNum = _logic->currentRoomData() + _curCmd.noun;
int16 objName = _logic->objectData(objNum)->name;
if (objName < 0) {
// selected a turned off object, so just walk
- _noun = 0;
+ _curCmd.noun = 0;
clear(true);
_logic->joeWalk(2);
return;
}
- if (_verb.isNone()) {
+ if (_curCmd.verb.isNone()) {
if (_mouseKey == Input::MOUSE_LBUTTON) {
- if ((_commandLevel != 2 && _currentAction.isNone()) ||
- (_commandLevel == 2 && _parse)) {
+ if ((_curCmd.commandLevel != 2 && _curCmd.action.isNone()) ||
+ (_curCmd.commandLevel == 2 && _parse)) {
// action2 > 0 only if command has been constructed
// lmb pressed, just walk
- _verb = Verb(VERB_WALK_TO);
- _currentAction = Verb(VERB_WALK_TO);
+ _curCmd.verb = Verb(VERB_WALK_TO);
+ _curCmd.action = Verb(VERB_WALK_TO);
_cmdText.setVerb(Verb(VERB_WALK_TO));
}
}
else if (_mouseKey == Input::MOUSE_RBUTTON) {
// rmb pressed, do default if one exists
- if (!_defaultVerb.isNone()) {
+ if (!_selCmd.defaultVerb.isNone()) {
// change default of command
- alterDefault(_defaultVerb, false);
- _defaultVerb = Verb(VERB_NONE);
+ alterDefault(_selCmd.defaultVerb, false);
+ _selCmd.defaultVerb = Verb(VERB_NONE);
clear(true);
return;
}
if (_cmdText.isEmpty()) {
// Ensures that Right Mkey will select correct default
- _verb = findDefault(objNum, false);
- if (!_verb.isNone()) {
+ _curCmd.verb = findDefault(objNum, false);
+ if (!_curCmd.verb.isNone()) {
// no match made, redefine as Walk To
- _selectedAction = Verb(VERB_WALK_TO);
+ _selCmd.action = Verb(VERB_WALK_TO);
}
else {
- _selectedAction = _verb;
+ _selCmd.action = _curCmd.verb;
}
- _cmdText.setVerb(_selectedAction);
+ _cmdText.setVerb(_selCmd.action);
_cmdText.addObject(_logic->objectName(_logic->objectData(objNum)->name));
}
else {
- _verb = Verb(VERB_NONE);
- if ((_commandLevel == 2 && !_parse) || !_currentAction.isNone()) {
- _verb = _currentAction;
+ _curCmd.verb = Verb(VERB_NONE);
+ if ((_curCmd.commandLevel == 2 && !_parse) || !_curCmd.action.isNone()) {
+ _curCmd.verb = _curCmd.action;
}
else {
- _verb = findDefault(objNum, false);
+ _curCmd.verb = findDefault(objNum, false);
}
- if (_verb.value() == VERB_NONE) {
- _currentAction = Verb(VERB_WALK_TO);
+ if (_curCmd.verb.value() == VERB_NONE) {
+ _curCmd.action = Verb(VERB_WALK_TO);
_cmdText.setVerb(Verb(VERB_WALK_TO));
}
else {
- _currentAction = _verb;
+ _curCmd.action = _curCmd.verb;
}
- _verb = Verb(VERB_NONE);
+ _curCmd.verb = Verb(VERB_NONE);
}
}
}
- _selectedNoun = 0;
+ _selCmd.noun = 0;
- if (_currentAction.isTwoLevelsCommand() && _commandLevel == 1) {
+ if (_curCmd.action.isTwoLevelsCommand() && _curCmd.commandLevel == 1) {
// command not fully constructed
_parse = false;
}
@@ -728,25 +729,25 @@ void Command::grabSelectedNoun() {
_parse = true;
}
- if (!_currentAction.isNone()) {
+ if (!_curCmd.action.isNone()) {
_cmdText.addObject(_logic->objectName(objName));
}
- switch (_commandLevel) {
+ switch (_curCmd.commandLevel) {
case 1:
- _subject1 = objNum;
+ _selCmd.subject1 = objNum;
break;
case 2:
- _subject2 = objNum;
+ _selCmd.subject2 = objNum;
break;
}
// if first noun and it's a 2 level command then set up action word
- if (_currentAction.value() == VERB_USE && _commandLevel == 1) {
+ if (_curCmd.action.value() == VERB_USE && _curCmd.commandLevel == 1) {
if (State::findUse(_logic->objectData(objNum)->state) == STATE_USE_ON) {
_cmdText.addLinkWord(Verb(VERB_PREP_WITH));
- _commandLevel = 2;
+ _curCmd.commandLevel = 2;
}
else {
// object does not support 2nd level
@@ -754,7 +755,7 @@ void Command::grabSelectedNoun() {
}
_cmdText.display(INK_CMD_NORMAL);
}
- else if (_currentAction.value() == VERB_GIVE && _commandLevel == 1) {
+ else if (_curCmd.action.value() == VERB_GIVE && _curCmd.commandLevel == 1) {
_cmdText.addLinkWord(Verb(VERB_PREP_TO));
_cmdText.display(INK_CMD_NORMAL);
}
@@ -763,41 +764,40 @@ void Command::grabSelectedNoun() {
}
if (_parse) {
- _verb = Verb(VERB_NONE);
+ _curCmd.verb = Verb(VERB_NONE);
_logic->joeWalk(2); // set JOEWALK flag to perform EXECUTE_ACTION procedure
- _selectedAction = _currentAction;
- _currentAction = Verb(VERB_NONE);
+ _selCmd.action = _curCmd.action;
+ _curCmd.action = Verb(VERB_NONE);
}
}
void Command::grabSelectedVerb() {
- if (_verb.isScrollInventory()) {
+ if (_curCmd.verb.isScrollInventory()) {
// move through inventory (by four if right mouse button)
uint16 scroll = _mouseKey == Input::MOUSE_RBUTTON ? 4 : 1;
- _logic->inventoryScroll(scroll, _verb.value() == VERB_SCROLL_UP);
-
+ _logic->inventoryScroll(scroll, _curCmd.verb.value() == VERB_SCROLL_UP);
}
- else if (_verb.isPanelCommand() || _verb.value() == VERB_WALK_TO) {
- _currentAction = _verb;
- _subject1 = 0;
- _subject2 = 0;
+ else if (_curCmd.verb.isPanelCommand() || _curCmd.verb.value() == VERB_WALK_TO) {
+ _curCmd.action = _curCmd.verb;
+ _selCmd.subject1 = 0;
+ _selCmd.subject2 = 0;
// if right mouse key selected, then store command VERB
if (_mouseKey == Input::MOUSE_RBUTTON) {
- _defaultVerb = _verb;
- _cmdText.displayTemp(11, true, _verb);
+ _selCmd.defaultVerb = _curCmd.verb;
+ _cmdText.displayTemp(11, true, _curCmd.verb);
}
else {
- _defaultVerb = Verb(VERB_NONE);
- if (_logic->joeWalk() == 1 && !_verb.isNone()) {
+ _selCmd.defaultVerb = Verb(VERB_NONE);
+ if (_logic->joeWalk() == 1 && !_curCmd.verb.isNone()) {
_logic->joeWalk(0);
}
- _commandLevel = 1;
- _oldVerb = Verb(VERB_NONE);
- _oldNoun = 0;
- _cmdText.setVerb(_verb);
+ _curCmd.commandLevel = 1;
+ _curCmd.oldVerb = Verb(VERB_NONE);
+ _curCmd.oldNoun = 0;
+ _cmdText.setVerb(_curCmd.verb);
_cmdText.display(INK_CMD_NORMAL);
}
}
@@ -806,17 +806,14 @@ void Command::grabSelectedVerb() {
bool Command::executeIfCutaway(const char *description) {
- warning("Command::executeIfCutaway(%s) unimplemented", description);
-
if (strlen(description) > 4 &&
scumm_stricmp(description + strlen(description) - 4, ".cut") == 0) {
- /* XXX
- CUTAWAY(description);
- strcpy(Kstr,Paramstr);
- while(Kstr[0]) {
- CUTAWAY(Kstr);
- strcpy(Kstr,Paramstr);
- }*/
+ char nextCutaway[20];
+ memset(nextCutaway, 0, sizeof(nextCutaway));
+ _logic->playCutaway(description, nextCutaway);
+ while (nextCutaway[0] != '\0') {
+ _logic->playCutaway(nextCutaway, nextCutaway);
+ }
return true;
}
return false;
@@ -864,31 +861,31 @@ bool Command::handleBadCommand(bool walk) {
uint16 roomData = _logic->roomData(_logic->currentRoom());
// select without a command or WALK TO ; do a WALK
- if ((_selectedAction.value() == VERB_WALK_TO || _selectedAction.isNone()) &&
- (_selectedNoun > objMax || _selectedNoun == 0)) {
- if (_selectedAction.isNone()) {
+ if ((_selCmd.action.value() == VERB_WALK_TO || _selCmd.action.isNone()) &&
+ (_selCmd.noun > objMax || _selCmd.noun == 0)) {
+ if (_selCmd.action.isNone()) {
_graphics->textClear(151, 151);
}
_walk->joeMove(0, _selPosX, _selPosY, false); // XXX inCutaway parameter
return true;
}
// check to see if one of the objects is hidden
- if (_subject1 > 0 && _logic->objectData(_subject1)->name <= 0) {
+ if (_selCmd.subject1 > 0 && _logic->objectData(_selCmd.subject1)->name <= 0) {
return true;
}
- if (_selectedAction.value() == VERB_GIVE && _subject2 > 0 && _logic->objectData(_subject2)->name <= 0) {
+ if (_selCmd.action.value() == VERB_GIVE && _selCmd.subject2 > 0 && _logic->objectData(_selCmd.subject2)->name <= 0) {
return true;
}
// check for USE command on exists
- if (_selectedAction.value() == VERB_USE && _subject1 > 0 && _logic->objectData(_subject1)->entryObj > 0) {
- _selectedAction = Verb(VERB_WALK_TO);
+ if (_selCmd.action.value() == VERB_USE && _selCmd.subject1 > 0 && _logic->objectData(_selCmd.subject1)->entryObj > 0) {
+ _selCmd.action = Verb(VERB_WALK_TO);
}
- if (_selectedNoun > 0 && _selectedNoun <= objMax) {
+ if (_selCmd.noun > 0 && _selCmd.noun <= objMax) {
int16 p = _logic->joeWalkTo(_selPosX, _selPosY, walk);
if (p != 0) {
return true;
}
- if (_selectedAction.value() == VERB_WALK_TO && _logic->objectData(roomData + _selectedNoun)->entryObj < 0) {
+ if (_selCmd.action.value() == VERB_WALK_TO && _logic->objectData(roomData + _selCmd.noun)->entryObj < 0) {
return true;
}
}
@@ -1068,8 +1065,8 @@ void Command::cleanupCurrentAction() {
// l.595-597 execute.c
_logic->joeFace();
- _oldNoun = 0;
- _oldVerb = Verb(VERB_NONE);
+ _curCmd.oldNoun = 0;
+ _curCmd.oldVerb = Verb(VERB_NONE);
}
@@ -1085,12 +1082,12 @@ void Command::alterDefault(const Verb& def, bool itemType) {
uint16 *newDefaultState = 0;
const char *name = NULL;
- _noun = _logic->findObjectUnderCursor(_selPosX, _selPosY);
+ _curCmd.noun = _logic->findObjectUnderCursor(_selPosX, _selPosY);
if (!itemType) {
- if (_noun == 0) {
+ if (_curCmd.noun == 0) {
return;
}
- uint16 i = _logic->findObjectGlobalNumber(_noun);
+ uint16 i = _logic->findObjectGlobalNumber(_curCmd.noun);
ObjectData *od = _logic->objectData(i);
if (od->name < 0) {
return;
@@ -1099,7 +1096,7 @@ void Command::alterDefault(const Verb& def, bool itemType) {
name = _logic->objectTextualDescription(od->name);
}
else {
- uint16 item = _logic->findInventoryItem(_verb.inventoryItem());
+ uint16 item = _logic->findInventoryItem(_curCmd.verb.inventoryItem());
if (item == 0 || _logic->itemData(item)->name == 0) {
return;
}
@@ -1109,14 +1106,14 @@ void Command::alterDefault(const Verb& def, bool itemType) {
}
State::alterDefaultVerb(newDefaultState, def);
- if (_noun == 0) {
+ if (_curCmd.noun == 0) {
_cmdText.clear();
}
else {
_cmdText.setVerb(def.isNone() ? Verb(VERB_WALK_TO) : def);
}
_cmdText.displayTemp(INK_CMD_NORMAL, name);
- _oldNoun = _noun;
+ _curCmd.oldNoun = _curCmd.noun;
}
@@ -1281,7 +1278,7 @@ void Command::setObjects(uint16 command) {
// turning off graphic image
objData->name = 0;
if (objData->room == _logic->currentRoom()) {
- if (dstObj != _subject1) {
+ if (dstObj != _selCmd.subject1) {
// if the new object we have updated is on screen and is not the
// current object, then we can update. This is because we turn
// current object off ourselves by COM_LIST(com, 8)
@@ -1310,7 +1307,7 @@ void Command::setObjects(uint16 command) {
}
}
- if (dstObj != _subject1) {
+ if (dstObj != _selCmd.subject1) {
// if the new object we have updated is on screen and
// is not current object then update it
_logic->roomRefreshObject(dstObj);
@@ -1418,9 +1415,9 @@ uint16 Command::nextObjectDescription(ObjectDescription* objDesc, uint16 firstDe
void Command::look() {
- if (_selectedNoun > 0 && _selectedNoun <= _logic->currentRoomObjMax()) {
+ if (_selCmd.noun > 0 && _selCmd.noun <= _logic->currentRoomObjMax()) {
uint16 k = _logic->currentRoomData();
- if (_logic->objectData(k + _selectedNoun)->entryObj == 0) {
+ if (_logic->objectData(k + _selCmd.noun)->entryObj == 0) {
if (_logic->joeWalkTo(_selPosX, _selPosY, true) == -2) {
// 'I can't get close enough to have a look.'
_logic->joeSpeak(13);
@@ -1429,25 +1426,25 @@ void Command::look() {
}
// if object type and disabled, don't look
- if (_subject1 > 0 && _logic->objectData(_subject1)->name <= 0) {
+ if (_selCmd.subject1 > 0 && _logic->objectData(_selCmd.subject1)->name <= 0) {
return;
}
uint16 desc;
- if (_subject1 < 0) {
- desc = _logic->itemData(ABS(_subject1))->description;
+ if (_selCmd.subject1 < 0) {
+ desc = _logic->itemData(ABS(_selCmd.subject1))->description;
}
else {
- desc = _logic->objectData(_subject1)->description;
+ desc = _logic->objectData(_selCmd.subject1)->description;
}
- debug(0, "Command::look() - desc = %X, _subject1 = %X", desc, _subject1);
+ debug(0, "Command::look() - desc = %X, _selCmd.subject1 = %X", desc, _selCmd.subject1);
// check to see if the object/item has a series of description
ObjectDescription *objDesc = _logic->objectDescription(1);
uint16 i;
for (i = 1; i <= _logic->objectDescriptionCount(); ++i, ++objDesc) {
- if (objDesc->object == _subject1) {
+ if (objDesc->object == _selCmd.subject1) {
desc = nextObjectDescription(objDesc, desc);
break;
}
@@ -1460,23 +1457,23 @@ void Command::look() {
void Command::lookCurrentItem() {
- if (_verb.isInventory()) {
- uint16 item = _logic->findInventoryItem(_verb.inventoryItem());
+ if (_curCmd.verb.isInventory()) {
+ uint16 item = _logic->findInventoryItem(_curCmd.verb.inventoryItem());
if (item != 0) {
ItemData *itemData = _logic->itemData(item);
const char *name = _logic->objectName(itemData->name);
- if (_currentAction.isNone()) {
+ if (_curCmd.action.isNone()) {
Verb v = State::findDefaultVerb(itemData->state);
_cmdText.setVerb(v.isNone() ? Verb(VERB_LOOK_AT) : v);
}
- if (!_defaultVerb.isNone()) {
- _cmdText.displayTemp(INK_CMD_LOCK, true, _defaultVerb, name);
+ if (!_selCmd.defaultVerb.isNone()) {
+ _cmdText.displayTemp(INK_CMD_LOCK, true, _selCmd.defaultVerb, name);
}
else {
_cmdText.displayTemp(INK_CMD_NORMAL, name);
}
- _oldVerb = _verb;
+ _curCmd.oldVerb = _curCmd.verb;
}
}
}
@@ -1485,7 +1482,7 @@ void Command::lookCurrentItem() {
void Command::lookCurrentRoom() {
- _noun = _logic->findObjectUnderCursor(_input->mousePosX(), _input->mousePosY());
+ _curCmd.noun = _logic->findObjectUnderCursor(_input->mousePosX(), _input->mousePosY());
if (_logic->joeWalk() == 1) {
return;
@@ -1494,19 +1491,19 @@ void Command::lookCurrentRoom() {
int16 aObjName = 0;
uint16 k = _logic->currentRoomData();
int16 i = 0;
- if (_noun > _logic->currentRoomObjMax()) {
- uint16 obj = _logic->currentRoomArea(_noun - _logic->currentRoomObjMax())->object;
+ if (_curCmd.noun > _logic->currentRoomObjMax()) {
+ uint16 obj = _logic->currentRoomArea(_curCmd.noun - _logic->currentRoomObjMax())->object;
aObjName = _logic->objectData(obj)->name;
if (aObjName > 0) {
i = aObjName;
- _noun = obj - k;
+ _curCmd.noun = obj - k;
}
}
else {
- i = _logic->objectData(k + _noun)->name;
+ i = _logic->objectData(k + _curCmd.noun)->name;
}
- if (_oldNoun == _noun) {
+ if (_curCmd.oldNoun == _curCmd.noun) {
return;
}
@@ -1514,79 +1511,76 @@ void Command::lookCurrentRoom() {
// if the AREA is linked to an object, then dont exit. Find
// the object its linked to && store in AOBJ
- if (_noun > _logic->currentRoomObjMax() && aObjName <= 0) {
- if (_oldNoun != 0) {
- if (!_defaultVerb.isNone()) {
- _cmdText.displayTemp(INK_CMD_LOCK, true, _defaultVerb);
+ if (_curCmd.noun > _logic->currentRoomObjMax() && aObjName <= 0) {
+ if (_curCmd.oldNoun != 0) {
+ if (!_selCmd.defaultVerb.isNone()) {
+ _cmdText.displayTemp(INK_CMD_LOCK, true, _selCmd.defaultVerb);
}
- else if (!_currentAction.isNone()) {
+ else if (!_curCmd.action.isNone()) {
_cmdText.display(INK_CMD_NORMAL);
}
- _oldNoun = 0;
+ _curCmd.oldNoun = 0;
return;
}
}
-// cyx: useless as (_oldNoun==_noun) already tested
-// if (i <= 0 && _oldNoun == _noun) { return; }
-
if (i <= 0) {
- _oldNoun = _noun;
+ _curCmd.oldNoun = _curCmd.noun;
_graphics->textClear(151, 151);
- if (!_defaultVerb.isNone()) {
- _cmdText.displayTemp(INK_CMD_LOCK, true, _defaultVerb);
+ if (!_selCmd.defaultVerb.isNone()) {
+ _cmdText.displayTemp(INK_CMD_LOCK, true, _selCmd.defaultVerb);
}
- else if (!_currentAction.isNone()) {
+ else if (!_curCmd.action.isNone()) {
_cmdText.display(INK_CMD_NORMAL);
}
return;
}
// if no command yet selected, then use DEFAULT command, if any
- if (_currentAction.isNone()) {
- Verb v = State::findDefaultVerb(_logic->objectData(k + _noun)->state);
+ if (_curCmd.action.isNone()) {
+ Verb v = State::findDefaultVerb(_logic->objectData(k + _curCmd.noun)->state);
_cmdText.setVerb(v.isNone() ? Verb(VERB_WALK_TO) : v);
- if (_noun == 0) {
+ if (_curCmd.noun == 0) {
_cmdText.clear();
}
}
const char *objName = "";
- if (_noun > 0) {
+ if (_curCmd.noun > 0) {
objName = _logic->objectName(i);
}
- if (!_defaultVerb.isNone()) {
- _cmdText.displayTemp(INK_CMD_LOCK, true, _defaultVerb, objName);
+ if (!_selCmd.defaultVerb.isNone()) {
+ _cmdText.displayTemp(INK_CMD_LOCK, true, _selCmd.defaultVerb, objName);
}
else {
_cmdText.displayTemp(INK_CMD_NORMAL, objName);
}
- _oldNoun = _noun;
+ _curCmd.oldNoun = _curCmd.noun;
}
void Command::lookCurrentIcon() {
- _verb = _logic->findVerbUnderCursor(_input->mousePosX(), _input->mousePosY());
- if (_verb != _oldVerb && _logic->joeWalk() != 1) {
+ _curCmd.verb = _logic->findVerbUnderCursor(_input->mousePosX(), _input->mousePosY());
+ if (_curCmd.verb != _curCmd.oldVerb && _logic->joeWalk() != 1) {
- if (_currentAction.isNone()) {
+ if (_curCmd.action.isNone()) {
_cmdText.clear();
}
_graphics->textClear(151, 151);
lookCurrentItem();
// ensure that registers when move to top screen
- if (_noun > 0) {
- _oldNoun = -1;
+ if (_curCmd.noun > 0) {
+ _curCmd.oldNoun = -1;
}
- _oldVerb = _verb;
- if (_verb.isPanelCommand() || _verb.value() == VERB_WALK_TO) {
- if (_verb.isNone()) {
+ _curCmd.oldVerb = _curCmd.verb;
+ if (_curCmd.verb.isPanelCommand() || _curCmd.verb.value() == VERB_WALK_TO) {
+ if (_curCmd.verb.isNone()) {
_cmdText.display(INK_CMD_NORMAL);
}
else {
- _cmdText.displayTemp(INK_CMD_NORMAL, false, _verb);
+ _cmdText.displayTemp(INK_CMD_NORMAL, false, _curCmd.verb);
}
}
}
diff --git a/queen/command.h b/queen/command.h
index dfda64af5e..5e2dae618a 100644
--- a/queen/command.h
+++ b/queen/command.h
@@ -69,8 +69,8 @@ public:
void readCommandsFrom(byte *&ptr);
- Verb selectedAction() const { return _selectedAction; }
- int16 selectedNoun() const { return _selectedNoun; }
+ Verb selectedAction() const { return _selCmd.action; }
+ int16 selectedNoun() const { return _selCmd.noun; }
bool parse() const { return _parse; }
private:
@@ -80,8 +80,8 @@ private:
void grabSelectedNoun();
void grabSelectedVerb();
- bool executeIfCutaway(const char* description);
- bool executeIfDialog(const char* description);
+ bool executeIfCutaway(const char *description);
+ bool executeIfDialog(const char *description);
uint16 countAssociatedCommands(const Verb& verb, int16 subj1, int16 subj2);
bool handleBadCommand(bool walk);
@@ -107,7 +107,7 @@ private:
//! Inserts/deletes items (inventory) - P4_SET_ITEMS
void setItems(uint16 command);
- uint16 nextObjectDescription(ObjectDescription* objDesc, uint16 firstDesc);
+ uint16 nextObjectDescription(ObjectDescription *objDesc, uint16 firstDesc);
//! Look at Objects/Items and speak their description
void look();
@@ -134,32 +134,24 @@ private:
//! Textual form of the command (displayed between room and panel areas)
CmdText _cmdText;
- //! Locked verb (using 2nd mouse button)
- Verb _defaultVerb;
-
- //! OLDVERB, VERB
- Verb _oldVerb, _verb;
-
- //! OLDNOUN, NOUN
- int16 _oldNoun, _noun;
-
//! If true, command string is executed
bool _parse;
- //! Current level of the command (max=2 for GIVE and USE verbs)
- int _commandLevel;
-
- //! Object selected for action
- int16 _selectedNoun;
-
- //! Last selected action
- Verb _currentAction;
-
- //! Action to perform
- Verb _selectedAction;
-
- //! SUBJECT[3]
- int16 _subject1, _subject2;
+ struct {
+ Verb oldVerb, verb;
+ Verb action;
+ int16 oldNoun, noun;
+ //! Current level of the command (max=2 for GIVE and USE verbs)
+ int commandLevel;
+ } _curCmd;
+
+ struct {
+ //! Locked verb (using 2nd mouse button)
+ Verb defaultVerb;
+ Verb action;
+ int16 noun;
+ int16 subject1, subject2;
+ } _selCmd;
//! MKEY
int _mouseKey;