diff options
| -rw-r--r-- | gob/goblin.cpp | 81 | ||||
| -rw-r--r-- | gob/goblin.h | 2 | ||||
| -rw-r--r-- | gob/map.cpp | 21 | ||||
| -rw-r--r-- | gob/sound.cpp | 13 | 
4 files changed, 45 insertions, 72 deletions
| diff --git a/gob/goblin.cpp b/gob/goblin.cpp index 45779846c5..cb704fdf3e 100644 --- a/gob/goblin.cpp +++ b/gob/goblin.cpp @@ -213,10 +213,6 @@ void gob_playSound(Snd_SoundDesc *snd, int16 repCount, int16 freq) {  }  void gob_drawObjects(void) { -	int16 tmp; -	int16 sndItem; -	int16 freq; -	int16 repCount;  	Util_ListNode *ptr;  	Util_ListNode *ptr2; @@ -368,61 +364,50 @@ void gob_drawObjects(void) {  		if (objDesc->toRedraw == 0 || objDesc->type == 1)  			continue; -		tmp = -		    objDesc->stateMach[objDesc->state][objDesc->stateColumn]-> -		    unk2; - -		if ((tmp >> 8) != 0) { -			if (objDesc->curFrame == (tmp >> 8)) { -				sndItem = -				    objDesc->stateMach[objDesc-> -				    state][objDesc->stateColumn]->sndItem >> 8; -				if (sndItem != -1) { -					freq = -					    (objDesc->stateMach[objDesc-> -						state][objDesc->stateColumn]-> -					    freq >> 8) * 100; -					repCount = -					    (objDesc->stateMach[objDesc-> -						state][objDesc->stateColumn]-> -					    repCount >> 8); +		Gob_State *state = objDesc->stateMach[objDesc->state][objDesc->stateColumn]; +		int16 sndFrame; +		int16 sndItem; +		int16 freq; +		int16 repCount; + +		if (state->sndFrame & 0xff00) { +			// There are two frames which trigger a sound effect, +			// so everything has to be encoded in one byte each. +			// Note that the frequency is multiplied by 100, not - +			// as I would have thought, 0x100. + +			sndFrame = (state->sndFrame >> 8) & 0xff; +			sndItem = (state->sndItem >> 8) & 0xff; +			freq = 100 * ((state->freq >> 8) & 0xff); +			repCount = (state->repCount >> 8) & 0xff; + +			if (objDesc->curFrame == sndFrame) { +				if (sndItem != 0xff) {  					gob_playSound(gob_soundData[sndItem],  					    repCount, freq);  				}  			} -			if (objDesc->curFrame == (tmp & 0xff)) { -				sndItem = -				    objDesc->stateMach[objDesc-> -				    state][objDesc->stateColumn]-> -				    sndItem & 0xff; -				if (sndItem != -1) { -					freq = -					    (objDesc->stateMach[objDesc-> -						state][objDesc->stateColumn]-> -					    freq & 0xff) * 100; -					repCount = -					    (objDesc->stateMach[objDesc-> -						state][objDesc->stateColumn]-> -					    repCount & 0xff); +			sndFrame = state->sndFrame & 0xff; +			sndItem = state->sndItem & 0xff; +			freq = 100 * (state->freq & 0xff); +			repCount = state->repCount & 0xff; + +			if (objDesc->curFrame == sndFrame) { +				if (sndItem != 0xff) {  					gob_playSound(gob_soundData[sndItem],  					    repCount, freq);  				}  			}  		} else { -			if (objDesc->curFrame == tmp) { -				sndItem = -				    objDesc->stateMach[objDesc-> -				    state][objDesc->stateColumn]->sndItem; +			// There is only one, so frequency etc. are used as is. +			sndFrame = state->sndFrame; +			sndItem = state->sndItem; +			freq = state->freq; +			repCount = state->repCount; + +			if (objDesc->curFrame == sndFrame) {  				if (sndItem != -1) { -					freq = -					    objDesc->stateMach[objDesc-> -					    state][objDesc->stateColumn]-> -					    freq * 100; -					repCount = -					    objDesc->stateMach[objDesc-> -					    state][objDesc->stateColumn]-> -					    repCount;  					gob_playSound(gob_soundData[sndItem],  					    repCount, freq);  				} diff --git a/gob/goblin.h b/gob/goblin.h index 31bbca0bc9..13862c1701 100644 --- a/gob/goblin.h +++ b/gob/goblin.h @@ -40,7 +40,7 @@ typedef struct Gob_State {  	int16 sndItem;	// +8h, high/low byte - sound sample index  	int16 freq;		// +Ah, high/low byte * 100 - frequency  	int16 repCount;	// +Ch high/low byte - repeat count -	int16 unk2;		// +Eh +	int16 sndFrame;		// +Eh  } GCC_PACK Gob_State;  typedef struct Gob_State *Gob_PState; diff --git a/gob/map.cpp b/gob/map.cpp index a947996ff8..6671e33895 100644 --- a/gob/map.cpp +++ b/gob/map.cpp @@ -554,7 +554,7 @@ void map_loadMapObjects(char *avjFile) {  				}  				tmpState->freq = map_loadFromAvo_LE_UINT16();  				tmpState->repCount = map_loadFromAvo_LE_UINT16(); -				tmpState->unk2 = map_loadFromAvo_LE_UINT16(); +				tmpState->sndFrame = map_loadFromAvo_LE_UINT16();  			}  		}  	} @@ -583,13 +583,13 @@ void map_loadMapObjects(char *avjFile) {  	pState->unk1 = 0;  	pState->sndItem = -1; -	gob_goblins[2]->stateMach[10][0]->unk2 = 13; -	gob_goblins[2]->stateMach[11][0]->unk2 = 13; -	gob_goblins[2]->stateMach[28][0]->unk2 = 13; -	gob_goblins[2]->stateMach[29][0]->unk2 = 13; +	gob_goblins[2]->stateMach[10][0]->sndFrame = 13; +	gob_goblins[2]->stateMach[11][0]->sndFrame = 13; +	gob_goblins[2]->stateMach[28][0]->sndFrame = 13; +	gob_goblins[2]->stateMach[29][0]->sndFrame = 13; -	gob_goblins[1]->stateMach[10][0]->unk2 = 13; -	gob_goblins[1]->stateMach[11][0]->unk2 = 13; +	gob_goblins[1]->stateMach[10][0]->sndFrame = 13; +	gob_goblins[1]->stateMach[11][0]->sndFrame = 13;  	for (state = 40; state < 70; state++) {  		pState = (Gob_State *)malloc(sizeof(Gob_State)); @@ -599,7 +599,7 @@ void map_loadMapObjects(char *avjFile) {  		pState->animation = 9;  		pState->layer = state - 40;  		pState->sndItem = -1; -		pState->unk2 = 0; +		pState->sndFrame = 0;  	}  	gob_objCount = map_loadFromAvo_LE_UINT16(); @@ -651,10 +651,9 @@ void map_loadMapObjects(char *avjFile) {  				}  				tmpState->freq = map_loadFromAvo_LE_UINT16();  				tmpState->repCount = map_loadFromAvo_LE_UINT16(); -				tmpState->unk2 = map_loadFromAvo_LE_UINT16(); +				tmpState->sndFrame = map_loadFromAvo_LE_UINT16();  			}  		} -  	}  	gob_objects[10] = (Gob_Object *)malloc(sizeof(Gob_Object)); @@ -672,7 +671,7 @@ void map_loadMapObjects(char *avjFile) {  	pState->unk0 = 0;  	pState->unk1 = 0;  	pState->sndItem = -1; -	pState->unk2 = 0; +	pState->sndFrame = 0;  	gob_placeObject(gob_objects[10], 1); diff --git a/gob/sound.cpp b/gob/sound.cpp index 023384c2ba..17e0570aff 100644 --- a/gob/sound.cpp +++ b/gob/sound.cpp @@ -53,19 +53,8 @@ void snd_speakerOff(void) {return;}  void snd_stopSound(int16 arg){return;}  void snd_setResetTimerFlag(char flag){return;} -// This is mostly to see if we are interpreting the sound effects correctly. If -// we want to implement looping etc. we're probably going to need something a -// bit more elaborate. -// -// Currently we ignore looping completely. We also ignore samples with negative -// sample frequency. Something wacky is going on here, and I don't think it's -// a simple signed/unsigned issue. -  void snd_playSample(Snd_SoundDesc *sndDesc, int16 repCount, int16 frequency) { -	if (frequency < 0) { -		warning("snd_playSample: frequency = %d - this is weird", frequency); -		return; -	} +	assert(frequency > 0);  	if (!_vm->_mixer->isSoundHandleActive(sndDesc->handle)) {  		_vm->_mixer->playRaw(&sndDesc->handle, sndDesc->data, sndDesc->size, frequency, 0); | 
