[Scummvm-cvs-logs] CVS: scummvm/queen command.h,1.2,1.3 command.cpp,1.2,1.3

Gregory Montoir cyx at users.sourceforge.net
Mon Nov 3 06:48:08 CET 2003


Update of /cvsroot/scummvm/scummvm/queen
In directory sc8-pr-cvs1:/tmp/cvs-serv16235

Modified Files:
	command.h command.cpp 
Log Message:
cleanup / enable cutaway calls

Index: command.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/command.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- command.h	2 Nov 2003 16:46:12 -0000	1.2
+++ command.h	3 Nov 2003 14:47:22 -0000	1.3
@@ -69,8 +69,8 @@
 
 	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 @@
 	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 @@
 	//! 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 @@
 	//! 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;
+	struct {
+		Verb oldVerb, verb;
+		Verb action;
+		int16 oldNoun, noun;
+		//! Current level of the command (max=2 for GIVE and USE verbs)
+		int commandLevel;
+	} _curCmd;
 
-	//! Action to perform
-	Verb _selectedAction;
-		
-	//! SUBJECT[3]
-	int16 _subject1, _subject2;
+	struct {
+		//! Locked verb (using 2nd mouse button)
+		Verb defaultVerb;
+		Verb action;
+		int16 noun;
+		int16 subject1, subject2;
+	} _selCmd;
 
 	//! MKEY
 	int _mouseKey;

Index: command.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/command.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- command.cpp	2 Nov 2003 16:46:12 -0000	1.2
+++ command.cpp	3 Nov 2003 14:47:22 -0000	1.3
@@ -111,12 +111,13 @@
 		_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 @@
 	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 @@
 	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 @@
 	// 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 @@
 	}
 
 	// 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 @@
 		++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 @@
 		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 @@
 	}
 
 	// 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 @@
 	}
 
 	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 @@
 	}
 
 	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 @@
 		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 @@
 		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 @@
 	}
 	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 @@
 			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 @@
 	_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 @@
 	// 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 @@
 	// 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 @@
 	}
 
 	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 @@
     // 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 @@
 		_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 @@
 		}
 		_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 @@
 	}
 
 	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 @@
 
 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 @@
 	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 @@
 
 	// 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 @@
 	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 @@
 		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 @@
 	}
 
 	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 @@
 					// 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 @@
 					}
 				}
 
-				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 @@
 
 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 @@
 	}
 
 	// 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::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::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 @@
 	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 @@
 	// 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);
 			}
 		}
 	}





More information about the Scummvm-git-logs mailing list