diff options
author | Gregory Montoir | 2003-11-03 14:47:22 +0000 |
---|---|---|
committer | Gregory Montoir | 2003-11-03 14:47:22 +0000 |
commit | ac47dbeee8508a18bc062117ddd7ece5a1d699a6 (patch) | |
tree | 9860fdfd8b2b5ab93033b6f7698bb4eae384255e /queen | |
parent | b6d8e8187bb9011dd4501adf8ba2fe2e905f96da (diff) | |
download | scummvm-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.cpp | 432 | ||||
-rw-r--r-- | queen/command.h | 48 |
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; |