diff options
| author | Nicola Mettifogo | 2007-08-14 08:03:13 +0000 | 
|---|---|---|
| committer | Nicola Mettifogo | 2007-08-14 08:03:13 +0000 | 
| commit | 76e1be89c38cde652d22128f921f16c266ef7565 (patch) | |
| tree | c99916aa43a44b1363f263147242e505734f1dd2 | |
| parent | 92ea1804cab4e3b3adfdeeb1f99626eeda180f96 (diff) | |
| download | scummvm-rg350-76e1be89c38cde652d22128f921f16c266ef7565.tar.gz scummvm-rg350-76e1be89c38cde652d22128f921f16c266ef7565.tar.bz2 scummvm-rg350-76e1be89c38cde652d22128f921f16c266ef7565.zip  | |
Partially reverting commit 28568, so now engine is back in charge for parsing locations. I'm going to convert this if/else/else hell into smaller opcode-like routines to achieve more flexibility first, and then assign version-specific opcodes to subclasses.
svn-id: r28609
| -rw-r--r-- | engines/parallaction/location.cpp | 140 | ||||
| -rw-r--r-- | engines/parallaction/parallaction.h | 5 | ||||
| -rw-r--r-- | engines/parallaction/parallaction_br.cpp | 4 | ||||
| -rw-r--r-- | engines/parallaction/parallaction_ns.cpp | 44 | 
4 files changed, 88 insertions, 105 deletions
diff --git a/engines/parallaction/location.cpp b/engines/parallaction/location.cpp index 001c5a8d03..8dce3e1225 100644 --- a/engines/parallaction/location.cpp +++ b/engines/parallaction/location.cpp @@ -39,7 +39,7 @@ void Parallaction::parseLocation(const char *filename) {  	uint16 _si = 1;  	_gfx->setFont(_labelFont); -	Script *_locationScript = _disk->loadLocation(filename); +	Script *script = _disk->loadLocation(filename);  	_hasLocationSound = false;  	// WORKAROUND: the original code erroneously incremented @@ -68,71 +68,101 @@ void Parallaction::parseLocation(const char *filename) {  	} -	fillBuffers(*_locationScript, true); - -	printf("ciao (%s)\n", filename); +	fillBuffers(*script, true);  	while (scumm_stricmp(_tokens[0], "ENDLOCATION")) {  		printf("inst = %s\n", _tokens[0]); -		bool parsed = parseLocationLine(filename, _locationScript); -		if (!parsed) { +		if (!scumm_stricmp(_tokens[0], "LOCATION")) { +			// The parameter for location is 'location.mask'. +			// If mask is not present, then it is assumed +			// that path & mask are encoded in the background +			// bitmap, otherwise a separate .msk file exists. + +			char *mask = strchr(_tokens[1], '.'); +			if (mask) { +				mask[0] = '\0'; +				mask++; +			} + +			strcpy(_location._name, _tokens[1]); +			switchBackground(_location._name, mask); + +			if (_tokens[2][0] != '\0') { +				_char._ani._left = atoi(_tokens[2]); +				_char._ani._top = atoi(_tokens[3]); +			} + +			if (_tokens[4][0] != '\0') { +				_char._ani._frame = atoi(_tokens[4]); +			} +		} else +		if (!scumm_stricmp(_tokens[0], "DISK")) { +			_disk->selectArchive(_tokens[1]); +		} else +		if (!scumm_stricmp(_tokens[0], "NODES")) { +			parseWalkNodes(*script, _location._walkNodes); +		} else +		if (!scumm_stricmp(_tokens[0], "ZONE")) { +			parseZone(*script, _zones, _tokens[1]); +		} else +		if (!scumm_stricmp(_tokens[0], "ANIMATION")) { +			parseAnimation(*script, _animations, _tokens[1]); +		} else +		if (!scumm_stricmp(_tokens[0], "LOCALFLAGS")) { +			_si = 1;	// _localFlagNames[0] = 'visited' +			while (_tokens[_si][0] != '\0') { +				_localFlagNames->addData(_tokens[_si]); +				_si++; +			} +		} else +		if (!scumm_stricmp(_tokens[0], "COMMANDS")) { +			parseCommands(*script, _location._commands); +		} else +		if (!scumm_stricmp(_tokens[0], "ACOMMANDS")) { +			parseCommands(*script, _location._aCommands); +		} else +		if (!scumm_stricmp(_tokens[0], "FLAGS")) { +			if ((_localFlags[_currentLocationIndex] & kFlagsVisited) == 0) { +				// only for 1st visit +				_localFlags[_currentLocationIndex] = 0; +				_si = 1; + +				do { +					byte _al = _localFlagNames->lookup(_tokens[_si]); +					_localFlags[_currentLocationIndex] |= 1 << (_al - 1); -			if (!scumm_stricmp(_tokens[0], "LOCALFLAGS")) { -				_si = 1;	// _localFlagNames[0] = 'visited' -				while (_tokens[_si][0] != '\0') { -					_localFlagNames->addData(_tokens[_si]);  					_si++; -				} -			} else -			if (!scumm_stricmp(_tokens[0], "COMMANDS")) { -				parseCommands(*_locationScript, _location._commands); -			} else -			if (!scumm_stricmp(_tokens[0], "ACOMMANDS")) { -				parseCommands(*_locationScript, _location._aCommands); -			} else -			if (!scumm_stricmp(_tokens[0], "FLAGS")) { -				if ((_localFlags[_currentLocationIndex] & kFlagsVisited) == 0) { -					// only for 1st visit -					_localFlags[_currentLocationIndex] = 0; -					_si = 1; - -					do { -						byte _al = _localFlagNames->lookup(_tokens[_si]); -						_localFlags[_currentLocationIndex] |= 1 << (_al - 1); - -						_si++; -						if (scumm_stricmp(_tokens[_si], "|")) break; -						_si++; -					} while (true); -				} -			} else -			if (!scumm_stricmp(_tokens[0], "COMMENT")) { -				_location._comment = parseComment(*_locationScript); -			} else -			if (!scumm_stricmp(_tokens[0], "ENDCOMMENT")) { -				_location._endComment = parseComment(*_locationScript); -			} else -			if (!scumm_stricmp(_tokens[0], "SOUND")) { -				if (getPlatform() == Common::kPlatformAmiga) { -					strcpy(_locationSound, _tokens[1]); -					_hasLocationSound = true; -				} -			} else -			if (!scumm_stricmp(_tokens[0], "MUSIC")) { -				if (getPlatform() == Common::kPlatformAmiga) -					_soundMan->setMusicFile(_tokens[1]); -			} else -				error("unknown keyword '%s' in location '%s'", _tokens[0], filename); -		} - -		fillBuffers(*_locationScript, true); +					if (scumm_stricmp(_tokens[_si], "|")) break; +					_si++; +				} while (true); +			} +		} else +		if (!scumm_stricmp(_tokens[0], "COMMENT")) { +			_location._comment = parseComment(*script); +		} else +		if (!scumm_stricmp(_tokens[0], "ENDCOMMENT")) { +			_location._endComment = parseComment(*script); +		} else +		if (!scumm_stricmp(_tokens[0], "SOUND")) { +			if (getPlatform() == Common::kPlatformAmiga) { +				strcpy(_locationSound, _tokens[1]); +				_hasLocationSound = true; +			} +		} else +		if (!scumm_stricmp(_tokens[0], "MUSIC")) { +			if (getPlatform() == Common::kPlatformAmiga) +				_soundMan->setMusicFile(_tokens[1]); +		} else +			error("unknown keyword '%s' in location '%s'", _tokens[0], filename); + +		fillBuffers(*script, true);  	}  	resolveLocationForwards(); -	delete _locationScript; +	delete script;  	return;  } diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index a190feff04..7c53f74215 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -424,7 +424,7 @@ public:  	DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(end);  	void 		parseLocation(const char *filename); -	virtual bool parseLocationLine(const char *filename, Script *script) = 0; +  	void 		changeCursor(int32 index);  	void		showCursor(bool visible);  	void 		changeCharacter(const char *name); @@ -628,8 +628,6 @@ public:  	virtual	void callFunction(uint index, void* parm);  	void renderLabel(Graphics::Surface *cnv, char *text);  	void setMousePointer(int16 index); -	virtual bool parseLocationLine(const char *filename, Script *script); -  public:  	Menu*			_menu; @@ -696,7 +694,6 @@ public:  public:  	typedef void (Parallaction_br::*Callable)(void*);  	virtual	void callFunction(uint index, void* parm); -	virtual bool parseLocationLine(const char *filename, Script *script);  public:  	Table		*_countersNames; diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index 82dfd96f54..955994a307 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -350,7 +350,7 @@ void skip(Script* script, const char* endToken) {  	}  } - +#if 0  bool Parallaction_br::parseLocationLine(const char *filename, Script *script) {  	bool parsed = true; @@ -420,6 +420,6 @@ bool Parallaction_br::parseLocationLine(const char *filename, Script *script) {  	return parsed;  } - +#endif  } // namespace Parallaction diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp index 38e2d999ff..e98ef3847c 100644 --- a/engines/parallaction/parallaction_ns.cpp +++ b/engines/parallaction/parallaction_ns.cpp @@ -199,49 +199,5 @@ int Parallaction_ns::go() {  	return 0;  } -bool Parallaction_ns::parseLocationLine(const char *filename, Script *script) { - -	bool parsed = true; - -	if (!scumm_stricmp(_tokens[0], "LOCATION")) { -		// The parameter for location is 'location.mask'. -		// If mask is not present, then it is assumed -		// that path & mask are encoded in the background -		// bitmap, otherwise a separate .msk file exists. - -		char *mask = strchr(_tokens[1], '.'); -		if (mask) { -			mask[0] = '\0'; -			mask++; -		} - -		strcpy(_location._name, _tokens[1]); -		switchBackground(_location._name, mask); - -		if (_tokens[2][0] != '\0') { -			_char._ani._left = atoi(_tokens[2]); -			_char._ani._top = atoi(_tokens[3]); -		} - -		if (_tokens[4][0] != '\0') { -			_char._ani._frame = atoi(_tokens[4]); -		} -	} else -	if (!scumm_stricmp(_tokens[0], "DISK")) { -		_disk->selectArchive(_tokens[1]); -	} else -	if (!scumm_stricmp(_tokens[0], "NODES")) { -		parseWalkNodes(*script, _location._walkNodes); -	} else -	if (!scumm_stricmp(_tokens[0], "ZONE")) { -		parseZone(*script, _zones, _tokens[1]); -	} else -	if (!scumm_stricmp(_tokens[0], "ANIMATION")) { -		parseAnimation(*script, _animations, _tokens[1]); -	} else -		parsed = false; - -	return parsed; -}  } // namespace Parallaction  | 
