diff options
Diffstat (limited to 'engines/hugo/parser_v1d.cpp')
| -rw-r--r-- | engines/hugo/parser_v1d.cpp | 129 | 
1 files changed, 65 insertions, 64 deletions
| diff --git a/engines/hugo/parser_v1d.cpp b/engines/hugo/parser_v1d.cpp index 9364cd9532..dcdc2c74ac 100644 --- a/engines/hugo/parser_v1d.cpp +++ b/engines/hugo/parser_v1d.cpp @@ -39,10 +39,11 @@  #include "hugo/file.h"  #include "hugo/schedule.h"  #include "hugo/util.h" +#include "hugo/object.h"  namespace Hugo { -Parser_v1d::Parser_v1d(HugoEngine &vm) : Parser(vm) { +Parser_v1d::Parser_v1d(HugoEngine *vm) : Parser(vm) {  }  Parser_v1d::~Parser_v1d() { @@ -55,15 +56,15 @@ char *Parser_v1d::findNextNoun(char *noun) {  	int currNounIndex = -1;  	if (noun) {                                        // If noun not NULL, find index -		for (currNounIndex = 0; _vm._arrayNouns[currNounIndex]; currNounIndex++) { -			if (noun == _vm._arrayNouns[currNounIndex][0]) +		for (currNounIndex = 0; _vm->_arrayNouns[currNounIndex]; currNounIndex++) { +			if (noun == _vm->_arrayNouns[currNounIndex][0])  				break;  		}  	} -	for (int i = currNounIndex + 1; _vm._arrayNouns[i]; i++) { -		for (int j = 0; strlen(_vm._arrayNouns[i][j]); j++) { -			if (strstr(_line, _vm._arrayNouns[i][j])) -				return _vm._arrayNouns[i][0]; +	for (int i = currNounIndex + 1; _vm->_arrayNouns[i]; i++) { +		for (int j = 0; strlen(_vm->_arrayNouns[i][j]); j++) { +			if (strstr(_line, _vm->_arrayNouns[i][j])) +				return _vm->_arrayNouns[i][0];  		}  	}  	return 0; @@ -78,33 +79,33 @@ bool Parser_v1d::isNear(char *verb, char *noun, object_t *obj, char *comment) {  	if (!noun && !obj->verbOnlyFl) {                // No noun specified & object not context senesitive  		return false; -	} else if (noun && (noun != _vm._arrayNouns[obj->nounIndex][0])) { // Noun specified & not same as object +	} else if (noun && (noun != _vm->_arrayNouns[obj->nounIndex][0])) { // Noun specified & not same as object  		return false;  	} else if (obj->carriedFl) {                    // Object is being carried  		return true; -	} else if (obj->screenIndex != *_vm._screen_p) { // Not in same screen +	} else if (obj->screenIndex != *_vm->_screen_p) { // Not in same screen  		if (obj->objValue) -			strcpy (comment, _vm._textParser[kCmtAny4]); +			strcpy (comment, _vm->_textParser[kCmtAny4]);  		return false;  	}  	if (obj->cycling == INVISIBLE) {  		if (obj->seqNumb) {                         // There is an image -			strcpy(comment, _vm._textParser[kCmtAny5]); +			strcpy(comment, _vm->_textParser[kCmtAny5]);  			return false;  		} else {                                    // No image, assume visible  			if ((obj->radius < 0) || -			   ((abs(obj->x - _vm._hero->x) <= obj->radius) && -			   (abs(obj->y - _vm._hero->y - _vm._hero->currImagePtr->y2) <= obj->radius))) { +			   ((abs(obj->x - _vm->_hero->x) <= obj->radius) && +			   (abs(obj->y - _vm->_hero->y - _vm->_hero->currImagePtr->y2) <= obj->radius))) {  			   return true;  			} else {  				// User is either not close enough (stationary, valueless objects)  				// or is not carrying it (small, portable objects of value)  				if (noun) {                         // Don't say unless object specified -					if (obj->objValue && (verb != _vm._arrayVerbs[_vm._take][0])) -						strcpy(comment, _vm._textParser[kCmtAny4]); +					if (obj->objValue && (verb != _vm->_arrayVerbs[_vm->_take][0])) +						strcpy(comment, _vm->_textParser[kCmtAny4]);  					else -						strcpy(comment, _vm._textParser[kCmtClose]); +						strcpy(comment, _vm->_textParser[kCmtClose]);  					}  				return false;  			} @@ -112,17 +113,17 @@ bool Parser_v1d::isNear(char *verb, char *noun, object_t *obj, char *comment) {  	}  	if ((obj->radius < 0) || -	    ((abs(obj->x - _vm._hero->x) <= obj->radius) && -	    (abs(obj->y + obj->currImagePtr->y2 - _vm._hero->y - _vm._hero->currImagePtr->y2) <= obj->radius))) { +	    ((abs(obj->x - _vm->_hero->x) <= obj->radius) && +	    (abs(obj->y + obj->currImagePtr->y2 - _vm->_hero->y - _vm->_hero->currImagePtr->y2) <= obj->radius))) {  	   return true;  	} else {  		// User is either not close enough (stationary, valueless objects)  		// or is not carrying it (small, portable objects of value)  		if (noun) {                                 // Don't say unless object specified -			if (obj->objValue && (verb != _vm._arrayVerbs[_vm._take][0])) -				strcpy(comment, _vm._textParser[kCmtAny4]); +			if (obj->objValue && (verb != _vm->_arrayVerbs[_vm->_take][0])) +				strcpy(comment, _vm->_textParser[kCmtAny4]);  			else -				strcpy(comment, _vm._textParser[kCmtClose]); +				strcpy(comment, _vm->_textParser[kCmtClose]);  		}  		return false;  	} @@ -140,27 +141,27 @@ bool Parser_v1d::isGenericVerb(char *word, object_t *obj) {  		return false;  	// Following is equivalent to switch, but couldn't do one -	if (word == _vm._arrayVerbs[_vm._look][0]) { +	if (word == _vm->_arrayVerbs[_vm->_look][0]) {  		if ((LOOK & obj->genericCmd) == LOOK) -			Utils::Box(BOX_ANY, "%s", _vm._textData[obj->dataIndex]); +			Utils::Box(BOX_ANY, "%s", _vm->_textData[obj->dataIndex]);  		else -			Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBUnusual_1d]); -	} else if (word == _vm._arrayVerbs[_vm._take][0]) { +			Utils::Box(BOX_ANY, "%s", _vm->_textParser[kTBUnusual_1d]); +	} else if (word == _vm->_arrayVerbs[_vm->_take][0]) {  		if (obj->carriedFl) -			Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBHave]); +			Utils::Box(BOX_ANY, "%s", _vm->_textParser[kTBHave]);  		else if ((TAKE & obj->genericCmd) == TAKE)  			takeObject(obj);  		else if (!obj->verbOnlyFl)                  // Make sure not taking object in context! -			Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBNoUse]); +			Utils::Box(BOX_ANY, "%s", _vm->_textParser[kTBNoUse]);  		else  			return false; -	} else if (word == _vm._arrayVerbs[_vm._drop][0]) { +	} else if (word == _vm->_arrayVerbs[_vm->_drop][0]) {  		if (!obj->carriedFl) -			Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBDontHave]); +			Utils::Box(BOX_ANY, "%s", _vm->_textParser[kTBDontHave]);  		else if ((DROP & obj->genericCmd) == DROP)  			dropObject(obj);  		else -			Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBNeed]); +			Utils::Box(BOX_ANY, "%s", _vm->_textParser[kTBNeed]);  	} else {                                        // It was not a generic cmd  		return false;  	} @@ -181,21 +182,21 @@ bool Parser_v1d::isObjectVerb(char *word, object_t *obj) {  		return false;  	int i; -	for (i = 0; _vm._cmdList[cmdIndex][i].verbIndex != 0; i++) { // For each cmd -		if (!strcmp(word, _vm._arrayVerbs[_vm._cmdList[cmdIndex][i].verbIndex][0])) // Is this verb catered for? +	for (i = 0; _vm->_cmdList[cmdIndex][i].verbIndex != 0; i++) { // For each cmd +		if (!strcmp(word, _vm->_arrayVerbs[_vm->_cmdList[cmdIndex][i].verbIndex][0])) // Is this verb catered for?  			break;  	} -	if (_vm._cmdList[cmdIndex][i].verbIndex == 0)   // No +	if (_vm->_cmdList[cmdIndex][i].verbIndex == 0)   // No  		return false;  	// Verb match found, check all required objects are being carried -	cmd *cmnd = &_vm._cmdList[cmdIndex][i];         // ptr to struct cmd +	cmd *cmnd = &_vm->_cmdList[cmdIndex][i];         // ptr to struct cmd  	if (cmnd->reqIndex) {                           // At least 1 thing in list -		uint16 *reqs = _vm._arrayReqs[cmnd->reqIndex]; // ptr to list of required objects +		uint16 *reqs = _vm->_arrayReqs[cmnd->reqIndex]; // ptr to list of required objects  		for (i = 0; reqs[i]; i++) {                 // for each obj -			if (!isCarrying(reqs[i])) { -				Utils::Box(BOX_ANY, "%s", _vm._textData[cmnd->textDataNoCarryIndex]); +			if (!_vm->_object->isCarrying(reqs[i])) { +				Utils::Box(BOX_ANY, "%s", _vm->_textData[cmnd->textDataNoCarryIndex]);  				return true;  			}  		} @@ -203,17 +204,17 @@ bool Parser_v1d::isObjectVerb(char *word, object_t *obj) {  	// Required objects are present, now check state is correct  	if ((obj->state != cmnd->reqState) && (cmnd->reqState != DONT_CARE)){ -		Utils::Box(BOX_ANY, "%s", _vm._textData[cmnd->textDataWrongIndex]); +		Utils::Box(BOX_ANY, "%s", _vm->_textData[cmnd->textDataWrongIndex]);  		return true;  	}  	// Everything checked.  Change the state and carry out any actions  	if (cmnd->reqState != DONT_CARE)                // Don't change new state if required state didn't care  		obj->state = cmnd->newState; -	Utils::Box(BOX_ANY, "%s", _vm._textData[cmnd->textDataDoneIndex]); -	_vm.scheduler().insertActionList(cmnd->actIndex); +	Utils::Box(BOX_ANY, "%s", _vm->_textData[cmnd->textDataDoneIndex]); +	_vm->_scheduler->insertActionList(cmnd->actIndex);  	// Special case if verb is Take or Drop.  Assume additional generic actions -	if ((word == _vm._arrayVerbs[_vm._take][0]) || (word == _vm._arrayVerbs[_vm._drop][0])) +	if ((word == _vm->_arrayVerbs[_vm->_take][0]) || (word == _vm->_arrayVerbs[_vm->_drop][0]))  		isGenericVerb(word, obj);  	return true;  } @@ -227,8 +228,8 @@ bool Parser_v1d::isBackgroundWord(char *noun, char *verb, objectList_t obj) {  		return false;  	for (int i = 0; obj[i].verbIndex; i++) { -		if ((verb == _vm._arrayVerbs[obj[i].verbIndex][0]) && (noun == _vm._arrayNouns[obj[i].nounIndex][0])) { -			Utils::Box(BOX_ANY, "%s", _vm.file().fetchString(obj[i].commentIndex)); +		if ((verb == _vm->_arrayVerbs[obj[i].verbIndex][0]) && (noun == _vm->_arrayNouns[obj[i].nounIndex][0])) { +			Utils::Box(BOX_ANY, "%s", _vm->_file->fetchString(obj[i].commentIndex));  			return true;  		}  	} @@ -243,9 +244,9 @@ void Parser_v1d::takeObject(object_t *obj) {  	if (obj->seqNumb)                               // Don't change if no image to display  		obj->cycling = ALMOST_INVISIBLE; -	_vm.adjustScore(obj->objValue); +	_vm->adjustScore(obj->objValue); -	Utils::Box(BOX_ANY, TAKE_TEXT, _vm._arrayNouns[obj->nounIndex][TAKE_NAME]); +	Utils::Box(BOX_ANY, TAKE_TEXT, _vm->_arrayNouns[obj->nounIndex][TAKE_NAME]);  }  // Do all necessary things to drop an object @@ -253,13 +254,13 @@ void Parser_v1d::dropObject(object_t *obj) {  	debugC(1, kDebugParser, "dropObject(object_t *obj)");  	obj->carriedFl = false; -	obj->screenIndex = *_vm._screen_p; +	obj->screenIndex = *_vm->_screen_p;  	if (obj->seqNumb)                               // Don't change if no image to display  		obj->cycling = NOT_CYCLING; -	obj->x = _vm._hero->x - 1; -	obj->y = _vm._hero->y + _vm._hero->currImagePtr->y2 - 1; -	_vm.adjustScore(-obj->objValue); -	Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBOk]); +	obj->x = _vm->_hero->x - 1; +	obj->y = _vm->_hero->y + _vm->_hero->currImagePtr->y2 - 1; +	_vm->adjustScore(-obj->objValue); +	Utils::Box(BOX_ANY, "%s", _vm->_textParser[kTBOk]);  }  // Print text for possible background object.  Return TRUE if match found @@ -271,8 +272,8 @@ bool Parser_v1d::isCatchallVerb(bool testNounFl, char *noun, char *verb, objectL  		return false;  	for (int i = 0; obj[i].verbIndex; i++) { -		if ((verb == _vm._arrayVerbs[obj[i].verbIndex][0]) && ((noun == _vm._arrayNouns[obj[i].nounIndex][0]) || (obj[i].nounIndex == 0))) { -			Utils::Box(BOX_ANY, "%s", _vm.file().fetchString(obj[i].commentIndex)); +		if ((verb == _vm->_arrayVerbs[obj[i].verbIndex][0]) && ((noun == _vm->_arrayNouns[obj[i].nounIndex][0]) || (obj[i].nounIndex == 0))) { +			Utils::Box(BOX_ANY, "%s", _vm->_file->fetchString(obj[i].commentIndex));  			return true;  		}  	} @@ -284,15 +285,15 @@ void Parser_v1d::lineHandler() {  	debugC(1, kDebugParser, "lineHandler()");  	object_t    *obj; -	status_t &gameStatus = _vm.getGameStatus(); +	status_t &gameStatus = _vm->getGameStatus();  	char        farComment[XBYTES * 5] = "";        // hold 5 line comment if object not nearby  //	Reset_prompt_line ();  	Utils::strlwr(_line);                           // Convert to lower case  	if (!strcmp("exit", _line) || strstr(_line, "quit")) { -		if (Utils::Box(BOX_YESNO, "%s", _vm._textParser[kTBExit_1d]) != 0) -			_vm.endGame(); +		if (Utils::Box(BOX_YESNO, "%s", _vm->_textParser[kTBExit_1d]) != 0) +			_vm->endGame();  		return;  	} @@ -301,13 +302,13 @@ void Parser_v1d::lineHandler() {  		if (gameStatus.gameOverFl)  			Utils::gameOverMsg();  		else -//			_vm.file().saveOrRestore(true); +//			_vm->_file->saveOrRestore(true);  			warning("STUB: saveOrRestore()");  		return;  	}  	if (!strcmp("restore", _line)) { -//		_vm.file().saveOrRestore(false); +//		_vm->_file->saveOrRestore(false);  		warning("STUB: saveOrRestore()");  		return;  	} @@ -331,25 +332,25 @@ void Parser_v1d::lineHandler() {  		do {  			noun = findNextNoun(noun);              // Find a noun in the line  			// Must try at least once for objects allowing verb-context -			for (int i = 0; i < _vm._numObj; i++) { -				obj = &_vm._objects[i]; +			for (int i = 0; i < _vm->_numObj; i++) { +				obj = &_vm->_object->_objects[i];  				if (isNear(verb, noun, obj, farComment)) {  					if (isObjectVerb(verb, obj)     // Foreground object  					 || isGenericVerb(verb, obj))   // Common action type  						return;  				}  			} -			if ((*farComment == '\0') && isBackgroundWord(noun, verb, _vm._backgroundObjects[*_vm._screen_p])) +			if ((*farComment == '\0') && isBackgroundWord(noun, verb, _vm->_backgroundObjects[*_vm->_screen_p]))  				return;  		} while (noun);  	}  	noun = findNextNoun(noun);  	if (*farComment != '\0')                        // An object matched but not near enough  		Utils::Box(BOX_ANY, "%s", farComment); -	else if (!isCatchallVerb(true, noun, verb, _vm._catchallList) && -		     !isCatchallVerb(false, noun, verb, _vm._backgroundObjects[*_vm._screen_p])  && -			 !isCatchallVerb(false, noun, verb, _vm._catchallList)) -		Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBEh_1d]); +	else if (!isCatchallVerb(true, noun, verb, _vm->_catchallList) && +		     !isCatchallVerb(false, noun, verb, _vm->_backgroundObjects[*_vm->_screen_p])  && +			 !isCatchallVerb(false, noun, verb, _vm->_catchallList)) +		Utils::Box(BOX_ANY, "%s", _vm->_textParser[kTBEh_1d]);  }  } // End of namespace Hugo | 
