diff options
| author | James Brown | 2004-01-16 10:45:56 +0000 | 
|---|---|---|
| committer | James Brown | 2004-01-16 10:45:56 +0000 | 
| commit | ac5b7036c28a4137d4b7af7385d97e6e485f0767 (patch) | |
| tree | b9453259912d5f2c462d8107280ef83303e5fd14 | |
| parent | bd3f51dfdfd563532a7cc228139dd60d8f6451a4 (diff) | |
| download | scummvm-rg350-ac5b7036c28a4137d4b7af7385d97e6e485f0767.tar.gz scummvm-rg350-ac5b7036c28a4137d4b7af7385d97e6e485f0767.tar.bz2 scummvm-rg350-ac5b7036c28a4137d4b7af7385d97e6e485f0767.zip | |
Fix for bug #862263 - Maniac actors never stop talking. I know this could probably be neater :)
svn-id: r12430
| -rw-r--r-- | scumm/actor.cpp | 32 | ||||
| -rw-r--r-- | scumm/debugger.cpp | 2 | ||||
| -rw-r--r-- | scumm/script_v5.cpp | 2 | ||||
| -rw-r--r-- | scumm/script_v6.cpp | 2 | ||||
| -rw-r--r-- | scumm/scumm.h | 6 | ||||
| -rw-r--r-- | scumm/scummvm.cpp | 2 | ||||
| -rw-r--r-- | scumm/sound.cpp | 2 | ||||
| -rw-r--r-- | scumm/string.cpp | 6 | 
8 files changed, 36 insertions, 18 deletions
| diff --git a/scumm/actor.cpp b/scumm/actor.cpp index b2b5b2cf28..7018c980b8 100644 --- a/scumm/actor.cpp +++ b/scumm/actor.cpp @@ -561,7 +561,7 @@ void Actor::setDirection(int direction) {  }  void Actor::putActor(int dstX, int dstY, byte newRoom) { -	if (visible && _vm->_currentRoom != newRoom && _vm->VAR(_vm->VAR_TALK_ACTOR) == number) { +	if (visible && _vm->_currentRoom != newRoom && _vm->talkingActor() == number) {  		_vm->clearMsgQueue();  	} @@ -781,6 +781,22 @@ void Actor::showActor() {  	needRedraw = true;  } +// Maniac doesn't have a ScummVar for VAR_TALK_ACTOR, and just uses +// an internal variable. Emulate this to prevent overwriting script vars... +int ScummEngine::talkingActor() { +	if (_gameId == GID_MANIAC) +		return _V1_talkingActor; +	else +		return VAR(VAR_TALK_ACTOR); +}; + +void ScummEngine::talkingActor(int value) { +	if (_gameId == GID_MANIAC) +		_V1_talkingActor = value; +	else +		VAR(VAR_TALK_ACTOR) = value; +}; +  void ScummEngine::showActors() {  	int i; @@ -1138,7 +1154,7 @@ void ScummEngine::actorTalk() {  	if (_actorToPrintStrFor == 0xFF) {  		if (!_keepText)  			stopTalk(); -		VAR(VAR_TALK_ACTOR) = 0xFF; +		talkingActor(0xFF);  	} else {  		int oldact; @@ -1154,21 +1170,21 @@ void ScummEngine::actorTalk() {  		} else {  			if (!_keepText)  				stopTalk(); -			VAR(VAR_TALK_ACTOR) = a->number; +			talkingActor(a->number);  			if (!_string[0].no_talk_anim) {  				a->startAnimActor(a->talkStartFrame);  				_useTalkAnims = true;  			} -			oldact = VAR(VAR_TALK_ACTOR); +			oldact = talkingActor();  		}  		if (oldact >= 0x80)  			return;  	} -	if (((_gameId == GID_MANIAC) && (_version == 1)) || VAR(VAR_TALK_ACTOR) > 0x7F) { +	if (((_gameId == GID_MANIAC) && (_version == 1)) || talkingActor() > 0x7F) {  		_charsetColor = (byte)_string[0].color;  	} else { -		a = derefActor(VAR(VAR_TALK_ACTOR), "actorTalk(2)"); +		a = derefActor(talkingActor(), "actorTalk(2)");  		_charsetColor = a->talkColor;  	}  	_charsetBufPos = 0; @@ -1188,14 +1204,14 @@ void ScummEngine::stopTalk() {  	_haveMsg = 0;  	_talkDelay = 0; -	act = VAR(VAR_TALK_ACTOR); +	act = talkingActor();  	if (act && act < 0x80) {  		Actor *a = derefActor(act, "stopTalk");  		if ((a->isInCurrentRoom() && _useTalkAnims) || (_features & GF_NEW_COSTUMES)) {  			a->startAnimActor(a->talkStopFrame);  			_useTalkAnims = false;  		} -		VAR(VAR_TALK_ACTOR) = 0xFF; +		talkingActor(0xFF);  	}  	_keepText = false;  	_charset->restoreCharsetBg(); diff --git a/scumm/debugger.cpp b/scumm/debugger.cpp index 065474be20..f8484ee0d9 100644 --- a/scumm/debugger.cpp +++ b/scumm/debugger.cpp @@ -56,7 +56,7 @@ void CDECL debugC(int channel, const char *s, ...) {  	vsprintf(buf, s, va);  	va_end(va); -	debug(g_debugLevel, buf); +	debug(buf);  };  ScummDebugger::ScummDebugger(ScummEngine *s) diff --git a/scumm/script_v5.cpp b/scumm/script_v5.cpp index 9d93ac4b93..52343096f4 100644 --- a/scumm/script_v5.cpp +++ b/scumm/script_v5.cpp @@ -1648,7 +1648,7 @@ void ScummEngine_v5::o5_putActorInRoom() {  	a = derefActor(act, "o5_putActorInRoom"); -	if (a->visible && _currentRoom != room && VAR(VAR_TALK_ACTOR) == a->number) { +	if (a->visible && _currentRoom != room && talkingActor() == a->number) {  		clearMsgQueue();  	}  	a->room = room; diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index a8ccf68e6e..722afbcccd 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -1069,7 +1069,7 @@ void ScummEngine_v6::o6_putActorAtXY() {  	if (room == 0xFF || room == 0x7FFFFFFF) {  		room = a->room;  	} else { -		if (a->visible && _currentRoom != room && VAR(VAR_TALK_ACTOR) == a->number) { +		if (a->visible && _currentRoom != room && talkingActor() == a->number) {  			clearMsgQueue();  		}  		if (room != 0) diff --git a/scumm/scumm.h b/scumm/scumm.h index 1c4545b2d7..af0110d60a 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -771,14 +771,16 @@ protected:  public:  	/* Actor talking stuff */ -	byte _actorToPrintStrFor; +	byte _actorToPrintStrFor, _V1_talkingActor;  	int _sentenceNum;  	SentenceTab _sentence[NUM_SENTENCE];  	StringTab _string[6];  	int16 _talkDelay;  	void actorTalk();  	void stopTalk(); -	 +	int talkingActor();		// Wrapper around VAR_TALK_ACTOR for V1/V2 purposes +	void talkingActor(int variable); +  	// Costume class  	void cost_decodeData(Actor *a, int frame, uint usemask);  	int cost_frameToAnim(Actor *a, int frame); diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp index 139748189c..70e46b323b 100644 --- a/scumm/scummvm.cpp +++ b/scumm/scummvm.cpp @@ -1237,7 +1237,7 @@ void ScummEngine::initScummVars() {  	}  	VAR(VAR_CHARINC) = 4; -	VAR(VAR_TALK_ACTOR) = 0; +	talkingActor(0);  }  #pragma mark - diff --git a/scumm/sound.cpp b/scumm/sound.cpp index 5f6c6c711f..5b7b7d13d3 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -414,7 +414,7 @@ void Sound::processSfxQueues() {  		_talk_sound_mode = 0;  	} -	const int act = _vm->VAR(_vm->VAR_TALK_ACTOR); +	const int act = _vm->talkingActor();  	if ((_sfxMode & 2) && act != 0) {  		Actor *a;  		bool b, finished; diff --git a/scumm/string.cpp b/scumm/string.cpp index 56a67d787b..64aca168fb 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -103,14 +103,14 @@ void ScummEngine::CHARSET_1() {  	if (!_haveMsg)  		return; -	if (!(_features & GF_NEW_CAMERA) && !(_gameId == GID_ZAK256 && VAR(VAR_TALK_ACTOR) == 0xff)) { +	if (!(_features & GF_NEW_CAMERA) && !(_gameId == GID_ZAK256 && talkingActor() == 0xFF)) {  		if ((camera._dest.x / 8) != (camera._cur.x / 8) || camera._cur.x != camera._last.x)  			return;  	}  	a = NULL; -	if (VAR(VAR_TALK_ACTOR) != 0xFF) -		a = derefActorSafe(VAR(VAR_TALK_ACTOR), "CHARSET_1"); +	if (talkingActor() != 0xFF) +		a = derefActorSafe(talkingActor(), "CHARSET_1");  	if (a && _string[0].overhead != 0) {  		if (_version <= 5) { | 
