diff options
| author | Gregory Montoir | 2004-01-08 22:46:42 +0000 | 
|---|---|---|
| committer | Gregory Montoir | 2004-01-08 22:46:42 +0000 | 
| commit | 1b1ce1faf71f1e7fca9cf030e08bffd343a2bf79 (patch) | |
| tree | 1ffb8d13a258d8626d0b99fd122b49d276c344fa | |
| parent | 65bfcb71fe7910e16b5e4e0e6665fa3b9e77510e (diff) | |
| download | scummvm-rg350-1b1ce1faf71f1e7fca9cf030e08bffd343a2bf79.tar.gz scummvm-rg350-1b1ce1faf71f1e7fca9cf030e08bffd343a2bf79.tar.bz2 scummvm-rg350-1b1ce1faf71f1e7fca9cf030e08bffd343a2bf79.zip  | |
moved the remaining 'graphics' stuff from Logic to Graphics
svn-id: r12266
| -rw-r--r-- | queen/command.cpp | 8 | ||||
| -rw-r--r-- | queen/cutaway.cpp | 14 | ||||
| -rw-r--r-- | queen/graphics.cpp | 644 | ||||
| -rw-r--r-- | queen/graphics.h | 40 | ||||
| -rw-r--r-- | queen/logic.cpp | 417 | ||||
| -rw-r--r-- | queen/logic.h | 24 | ||||
| -rw-r--r-- | queen/talk.cpp | 10 | ||||
| -rw-r--r-- | queen/xref.txt | 6 | 
8 files changed, 574 insertions, 589 deletions
diff --git a/queen/command.cpp b/queen/command.cpp index 8d2dc663a7..da1b9b0697 100644 --- a/queen/command.cpp +++ b/queen/command.cpp @@ -394,14 +394,14 @@ int16 Command::executeCommand(uint16 comId, int16 condResult) {  		} else {  			od->image = com->imageOrder;  		} -		_vm->logic()->roomRefreshObject(_state.subject[0]); +		_vm->graphics()->refreshObject(_state.subject[0]);  	} else {  		// this object is not being updated by command list, see if  		// it has another image copied to it  		if (_state.subject[0] > 0) {  			// an object (not an item)  			if (_vm->logic()->objectData(_state.subject[0])->image != oldImage) { -				_vm->logic()->roomRefreshObject(_state.subject[0]); +				_vm->graphics()->refreshObject(_state.subject[0]);  			}  		}  	} @@ -1144,7 +1144,7 @@ void Command::setObjects(uint16 command) {  				if (dstObj != _state.subject[0]) {  					// if the new object we have updated is on screen and  					// is not current object then update it -					_vm->logic()->roomRefreshObject(dstObj); +					_vm->graphics()->refreshObject(dstObj);  				}  			} else {  				// hide the object @@ -1153,7 +1153,7 @@ void Command::setObjects(uint16 command) {  					// may need to turn BOBs off for objects to be hidden on current   					// screen ! if the new object we have updated is on screen and  					// is not current object then update it -					_vm->logic()->roomRefreshObject(dstObj); +					_vm->graphics()->refreshObject(dstObj);  				}  			}  		} diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp index 43b44433a1..213a43d641 100644 --- a/queen/cutaway.cpp +++ b/queen/cutaway.cpp @@ -420,7 +420,7 @@ void Cutaway::changeRooms(CutawayObject &object) {  	_vm->logic()->roomDisplay(_vm->logic()->currentRoom(), mode, object.scale, comPanel, true); -	_currentImage = _vm->logic()->numFrames(); +	_currentImage = _vm->graphics()->numFrames();  	_temporaryRoom = _vm->logic()->currentRoom(); @@ -460,7 +460,7 @@ Cutaway::ObjectType Cutaway::getObjectType(CutawayObject &object) {  			objectData->name = ABS(objectData->name);  		} -		_vm->logic()->roomRefreshObject(object.objectNumber); +		_vm->graphics()->refreshObject(object.objectNumber);  		// Skip doing any anim stuff  		objectType = OBJECT_TYPE_NO_ANIMATION; @@ -638,7 +638,7 @@ byte *Cutaway::handleAnimation(byte *ptr, CutawayObject &object) {  		if ((_vm->logic()->currentRoom() == 47 || _vm->logic()->currentRoom() == 63) &&  			objAnim[0].object == 1) {  			//CR 2 - 3/3/95, Special harcoded section to make Oracle work... -			makeComplexAnimation(_vm->logic()->personFrames(1) - 1,  objAnim, frameCount); +			makeComplexAnimation(_vm->graphics()->personFrames(1) - 1,  objAnim, frameCount);  		}  		else {  			_currentImage = makeComplexAnimation(_currentImage, objAnim, frameCount); @@ -856,7 +856,7 @@ void Cutaway::run(char *nextFilename) {  	int i;  	nextFilename[0] = '\0'; -	_currentImage = _vm->logic()->numFrames(); +	_currentImage = _vm->graphics()->numFrames();  	BobSlot *joeBob = _vm->graphics()->bob(0);  	int initialJoeX = joeBob->x; @@ -1128,7 +1128,7 @@ void Cutaway::stop() {  				}  				if (_vm->logic()->currentRoom() == room) -					_vm->logic()->roomRefreshObject(objectIndex); +					_vm->graphics()->refreshObject(objectIndex);  			}  			if (_vm->logic()->currentRoom() == object->room) { @@ -1225,13 +1225,13 @@ void Cutaway::updateGameState() {  				objectData->name        = ABS(objectData->name);  				if (fromObject > 0)  					_vm->logic()->objectCopy(fromObject, objectIndex); -				_vm->logic()->roomRefreshObject(objectIndex); +				_vm->graphics()->refreshObject(objectIndex);  			}  			else if (objectIndex < 0) {               // Hide the object  				objectIndex             = -objectIndex;  				ObjectData *objectData  = _vm->logic()->objectData(objectIndex);  				objectData->name        = -ABS(objectData->name); -				_vm->logic()->roomRefreshObject(objectIndex); +				_vm->graphics()->refreshObject(objectIndex);  			}  			if (areaIndex > 0) { diff --git a/queen/graphics.cpp b/queen/graphics.cpp index 3f29442bae..71cce80d91 100644 --- a/queen/graphics.cpp +++ b/queen/graphics.cpp @@ -24,6 +24,7 @@  #include "queen/bankman.h"  #include "queen/display.h" +#include "queen/grid.h"  #include "queen/logic.h"  #include "queen/queen.h"  #include "queen/resource.h" @@ -501,8 +502,118 @@ void Graphics::bobCustomParallax(uint16 roomNum) {  } -void Graphics::textCurrentColor(uint8 color) { -	_curTextColor = color; +void Graphics::bobSetText( +		BobSlot *pbs,  +		const char *text,  +		int textX, int textY,  +		int color, int flags) { +	// function MAKE_SPEAK_BOB, lines 335-457 in talk.c + +	if (text[0] == '\0') +		return; + +	// debug(0, "makeSpeakBob('%s', (%i,%i), %i, %i, %i, %i);",  +	//		text, bob->x, bob->y, textX, textY, color, flags); + +	// Duplicate string and append zero if needed + +	char textCopy[MAX_STRING_SIZE]; + +	int length = strlen(text); +	memcpy(textCopy, text, length); + +	if (textCopy[length - 1] >= 'A') +		textCopy[length++] = '.'; + +	textCopy[length] = '\0'; + +	// Split text into lines + +	char lines[8][MAX_STRING_SIZE]; +	int lineCount = 0; +	int wordCount = 0; +	int lineLength = 0; +	int i; + +	for (i = 0; i < length; i++) { +		if (textCopy[i] == ' ') +			wordCount++; + +		lineLength++; + +		if ((lineLength > 20 && textCopy[i] == ' ') || i == (length-1)) { +			memcpy(lines[lineCount], textCopy + i + 1 - lineLength, lineLength); +			lines[lineCount][lineLength] = '\0'; +			lineCount++; +			lineLength = 0; +		} +	} + + +	// Plan: write each line to Screen 2, put black outline around lines and +	// pick them up as a BOB. + + +	// Find width of widest line  + +	int maxLineWidth = 0; + +	for (i = 0; i < lineCount; i++) { +		int width = textWidth(lines[i]); +		if (maxLineWidth < width) +			maxLineWidth = width; +	} + +	// Calc text position + +	short x, y, width, height; + +	if (flags) { +		if (flags == 2) +			x = 160 - maxLineWidth / 2; +		else +			x = textX; + +		y = textY; + +		width = 0; +	} else { +		x = pbs->x; +		y = pbs->y; + +		BobFrame *pbf = _vm->bankMan()->fetchFrame(pbs->frameNum); + +		width  = (pbf->width  * pbs->scale) / 100; +		height = (pbf->height * pbs->scale) / 100; + +		y = y - height - 16 - lineCount * 9; +	} + +	x -= _vm->display()->horizontalScroll(); + +	if (y < 0) { +		y = 0; + +		if (x < 160) +			x += width / 2; +		else +			x -= width / 2 + maxLineWidth; +	} else if (!flags) +		x -= maxLineWidth / 2; + +	if (x < 0) +		x = 4; +	else if ((x + maxLineWidth) > 320) +		x = 320 - maxLineWidth - 4; + +	textCurrentColor(color); + +	for (i = 0; i < lineCount; i++) { +		int lineX = x + (maxLineWidth - textWidth(lines[i])) / 2; + +		//debug(0, "Setting text '%s' at (%i, %i)", lines[i], lineX, y + 9 * i); +		textSet(lineX, y + 9 * i, lines[i]); +	}  } @@ -550,6 +661,30 @@ uint16 Graphics::textWidth(const char* text) const {  } +int Graphics::textCenterX(const char *text) const { +	return 160 - textWidth(text) / 2; +} + + +void Graphics::setupNewRoom(const char *room, uint16 roomNum, int16 *furniture, uint16 furnitureCount) { +	// reset sprites table (bounding box...) +	bobClearAll(); + +	// load/setup objects associated to this room +	char filename[20];	 +	sprintf(filename, "%s.BBK", room); +	_vm->bankMan()->load(filename, 15); + +	_numFrames = 37 + FRAMES_JOE_XTRA; +	setupRoomFurniture(furniture, furnitureCount); +	setupRoomObjects(); + +	if (roomNum >= 90) { +		putCameraOnBob(0); +	} +} + +  void Graphics::fillAnimBuffer(const char *anim, AnimFrame *af) {  	while (true) {  		sscanf(anim, "%3hu,%3hu", &af->frame, &af->speed); @@ -661,6 +796,8 @@ void Graphics::setupObjectAnim(const GraphicData *gd, uint16 firstImage, uint16  uint16 Graphics::setupPersonAnim(const ActorData *ad, const char *anim, uint16 curImage) {  	debug(9, "Graphics::setupPersonAnim(%s, %d)", anim, curImage); +	_personFrames[ad->bobNum] = curImage + 1; +  	AnimFrame *animFrames = _newAnim[ad->bobNum];  	fillAnimBuffer(anim, animFrames);  	uint16 frameCount[256]; @@ -727,6 +864,356 @@ void Graphics::eraseAllAnims() {  } +uint16 Graphics::refreshObject(uint16 obj) { +	debug(6, "Graphics::refreshObject(%X)", obj); +	uint16 curImage = _numFrames; + +	ObjectData *pod = _vm->logic()->objectData(obj); +	if (pod->image == 0) { +		return curImage; +	} + +	// check the object is in the current room +	if (pod->room != _vm->logic()->currentRoom()) { +		return curImage; +	} + +	// find bob for the object +	uint16 curBob = _vm->logic()->findBob(obj); +	BobSlot *pbs = bob(curBob); + +	if (pod->image == -3 || pod->image == -4) { +		// a person object +		if (pod->name <= 0) { +			bobClear(curBob); +		} else { +			// find person number +			uint16 pNum = _vm->logic()->findPersonNumber(obj); +			curImage = _personFrames[pNum] - 1; +			if (_personFrames[pNum] == 0) { +				_personFrames[pNum] = curImage = _numFrames; +			} +			curImage = setupPerson(obj - _vm->logic()->currentRoomData(), curImage); +		} +		return curImage; +	} + +	// find frame used for object +	curImage = _vm->logic()->findFrame(obj); + +	if (pod->name < 0 || pod->image < 0) { +		// object is hidden or disabled +		bobClear(curBob); +		return curImage; +	} + +	int image = pod->image; +	if (image > 5000) { +		image -= 5000; +	} +	 +	GraphicData *pgd = _vm->logic()->graphicData(image); +	bool rebound = false; +	int16 lastFrame = pgd->lastFrame; +	if (lastFrame < 0) { +		lastFrame = -lastFrame; +		rebound = true; +	} +	if (pgd->firstFrame < 0) { +		setupObjectAnim(pgd, curImage, curBob, pod->name != 0); +		curImage += pgd->lastFrame - 1; +	} else if (lastFrame != 0) { +		// turn on an animated bob +		_vm->bankMan()->unpack(pgd->firstFrame, 2, 15); +		pbs->animating = false; +		uint16 firstImage = curImage; +		--curImage; +		uint16 j; +		for (j = pgd->firstFrame; j <= lastFrame; ++j) { +			++curImage; +			_vm->bankMan()->unpack(j, curImage, 15); +		} +		pbs->curPos(pgd->x, pgd->y); +		pbs->frameNum = firstImage; +		if (pgd->speed > 0) { +			pbs->animNormal(firstImage, curImage, pgd->speed / 4, rebound, false); +		} +	} else { +		// frame 2 is used as a buffer frame to prevent BOB flickering +		_vm->bankMan()->unpack(pgd->firstFrame, 2, 15); +		_vm->bankMan()->unpack(pgd->firstFrame, curImage, 15); +		pbs->curPos(pgd->x, pgd->y); +		pbs->frameNum = curImage; +	} + +	return curImage; +} + + +void Graphics::setupRoomFurniture(int16 *furniture, uint16 furnitureCount) { +	uint16 i; +	uint16 curImage = 36 + FRAMES_JOE_XTRA; + +	// unpack the furniture from bank 15 +	// there are 3 kinds : +	// - static (bobs), gamestate range = ]0;5000] +	// - animated (bobs), gamestate range = ]0;5000] +	// - static (paste downs), gamestate range = [5000; [ + +	// unpack the static bobs +	_numFurnitureStatic = 0; +	for	(i = 1; i <= furnitureCount; ++i) { +		int16 obj = furniture[i]; +		if (obj > 0 && obj <= 5000) { +			GraphicData *pgd = _vm->logic()->graphicData(obj); +			if (pgd->lastFrame == 0) { +				++_numFurnitureStatic; +				++curImage; +				_vm->bankMan()->unpack(pgd->firstFrame, curImage, 15); +				++_numFrames; +				BobSlot *pbs = bob(19 + _numFurnitureStatic); +				pbs->curPos(pgd->x, pgd->y); +				pbs->frameNum = curImage; +			} +		} +	} + +	// unpack the animated bobs +	_numFurnitureAnimated = 0; +	_numFurnitureAnimatedLen = 0; +	uint16 curBob = 0; +	for  (i = 1; i <= furnitureCount; ++i) { +		int16 obj = furniture[i]; +		if (obj > 0 && obj <= 5000) { +			GraphicData *pgd = _vm->logic()->graphicData(obj); + +			bool rebound = false; +			int16 lastFrame = pgd->lastFrame; +			if (lastFrame < 0) { +				rebound = true; +				lastFrame = -lastFrame; +			} + +			if (lastFrame > 0) { +				_numFurnitureAnimatedLen += lastFrame - pgd->firstFrame + 1; +				++_numFurnitureAnimated; +				uint16 image = curImage + 1; +				int k; +				for (k = pgd->firstFrame; k <= lastFrame; ++k) { +					++curImage; +					_vm->bankMan()->unpack(k, curImage, 15); +					++_numFrames; +				} +				BobSlot *pbs = bob(5 + curBob); +				pbs->animNormal(image, curImage, pgd->speed / 4, rebound, false); +				pbs->curPos(pgd->x, pgd->y); +				++curBob; +			} +		} +	} + +	// unpack the paste downs +	for  (i = 1; i <= furnitureCount; ++i) { +		if (furniture[i] > 5000) {; +			bobPaste(furniture[i] - 5000, curImage + 1); +		} +	} +} + + +void Graphics::setupRoomObjects() { +	uint16 i; +	// furniture frames are reserved in ::setupRoomFurniture(), we append objects  +	// frames after the furniture ones. +	uint16 curImage = 36 + FRAMES_JOE_XTRA + _numFurnitureStatic + _numFurnitureAnimatedLen; +	uint16 firstRoomObj = _vm->logic()->currentRoomData() + 1; +	uint16 lastRoomObj = _vm->logic()->roomData(_vm->logic()->currentRoom() + 1); +	uint16 numObjectStatic = 0; +	uint16 numObjectAnimated = 0; +	uint16 curBob; + +	// invalidates all Bobs for persons (except Joe's one) +	for (i = 1; i <= 3; ++i) { +		_bobs[i].active = false; +	} + +	// static/animated Bobs +	for (i = firstRoomObj; i <= lastRoomObj; ++i) { +		ObjectData *pod = _vm->logic()->objectData(i); +		// setup blanks bobs for turned off objects (in case  +		// you turn them on again) +		if (pod->image == -1) { +			// static OFF Bob +			curBob = 20 + _numFurnitureStatic + numObjectStatic; +			++numObjectStatic; +			// create a blank frame for the OFF object +			++_numFrames; +			++curImage; +		} else if(pod->image == -2) { +			// animated OFF Bob +			curBob = 5 + _numFurnitureAnimated + numObjectAnimated; +			++numObjectAnimated; +		} else if(pod->image > 0 && pod->image < 5000) { +			GraphicData *pgd = _vm->logic()->graphicData(pod->image); +			int16 lastFrame = pgd->lastFrame; +			bool rebound = false; +			if (lastFrame < 0) { +				lastFrame = -lastFrame; +				rebound = true; +			} +			if (pgd->firstFrame < 0) { +				// XXX if(TEMPA[1]<0) bobs[CURRBOB].xflip=1; +				curBob = 5 + _numFurnitureAnimated; +				setupObjectAnim(pgd, curImage + 1, curBob + numObjectAnimated, pod->name > 0); +				curImage += pgd->lastFrame; +				++numObjectAnimated; +			} else if (lastFrame != 0) { +				// animated objects +				uint16 j; +				uint16 firstFrame = curImage + 1; +				for (j = pgd->firstFrame; j <= lastFrame; ++j) { +					++curImage; +					_vm->bankMan()->unpack(j, curImage, 15); +					++_numFrames; +				} +				curBob = 5 + _numFurnitureAnimated + numObjectAnimated; +				if (pod->name > 0) { +					BobSlot *pbs = bob(curBob); +					pbs->curPos(pgd->x, pgd->y); +					pbs->frameNum = firstFrame; +					if (pgd->speed > 0) { +						pbs->animNormal(firstFrame, curImage, pgd->speed / 4, rebound, false); +					} +				} +				++numObjectAnimated; +			} else { +				// static objects +				curBob = 20 + _numFurnitureStatic + numObjectStatic; +				++curImage; +				bobClear(curBob); + +				// XXX if((COMPANEL==2) && (FULLSCREEN==1)) bobs[CURRBOB].y2=199; + +				_vm->bankMan()->unpack(pgd->firstFrame, curImage, 15); +				++_numFrames; +				if (pod->name > 0) { +					BobSlot *pbs = bob(curBob); +					pbs->curPos(pgd->x, pgd->y); +					pbs->frameNum = curImage; +				} +				++numObjectStatic; +			} +		} +	} + +	// persons Bobs +	for (i = firstRoomObj; i <= lastRoomObj; ++i) { +		ObjectData *pod = _vm->logic()->objectData(i); +		if (pod->image == -3 || pod->image == -4) { +			debug(6, "Graphics::setupRoomObjects() - Setting up person %X, name=%X", i, pod->name); +			uint16 noun = i - _vm->logic()->currentRoomData(); +			if (pod->name > 0) { +				curImage = setupPerson(noun, curImage); +			} else { +				curImage = allocPerson(noun, curImage); +			} +		} +	} + +	// paste downs list +	++curImage; +	_numFrames = curImage; +	for (i = firstRoomObj; i <= lastRoomObj; ++i) { +		ObjectData *pod = _vm->logic()->objectData(i); +		if (pod->name > 0 && pod->image > 5000) { +			bobPaste(pod->image - 5000, curImage); +		} +	} +} + + +uint16 Graphics::setupPerson(uint16 noun, uint16 curImage) { +	if (noun == 0) { +		warning("Trying to setup person 0"); +		return curImage; +	} + +	Person p; +	_vm->logic()->initPerson(noun, "", true, &p); + +	const ActorData *pad = p.actor; +	uint16 scale = 100; +	uint16 a = _vm->grid()->findAreaForPos(GS_ROOM, pad->x, pad->y); +	if (a != 0) { +		// person is not standing in the area box, scale it accordingly +		scale = _vm->grid()->area(_vm->logic()->currentRoom(), a)->calcScale(pad->y); +	} + +	_vm->bankMan()->unpack(pad->bobFrameStanding, p.bobFrame, p.actor->bankNum); +	uint16 obj = _vm->logic()->currentRoomData() + noun; +	BobSlot *pbs = bob(pad->bobNum); +	pbs->curPos(pad->x, pad->y); +	pbs->scale = scale; +	pbs->frameNum = p.bobFrame; +	pbs->xflip = (_vm->logic()->objectData(obj)->image == -3); // person is facing left + +	debug(6, "Graphics::setupPerson(%d, %d) - bob = %d name = %s", noun, curImage, pad->bobNum, p.name); + +	if (p.anim != NULL) {		 +		curImage = setupPersonAnim(pad, p.anim, curImage); +	} else { +		erasePersonAnim(pad->bobNum); +	} +	return curImage; +} + + +uint16 Graphics::allocPerson(uint16 noun, uint16 curImage) { +	Person p; +	_vm->logic()->initPerson(noun, "", false, &p); +	if (p.anim != NULL) { +		curImage += countAnimFrames(p.anim); +		_personFrames[p.actor->bobNum] = curImage + 1; +	} +	return curImage; +} + + +void Graphics::update(uint16 room) { +	bobSortAll(); +	if (_cameraBob >= 0) { +		_vm->display()->horizontalScrollUpdate(_bobs[_cameraBob].x); +	} +	bobCustomParallax(room); +	_vm->display()->prepareUpdate(); +	bobDrawAll(); +	textDrawAll(); +} + + + +BamScene::BamScene(QueenEngine *vm) +	: _flag(F_STOP), _screenShaked(false), _fightData(_fight1Data), _vm(vm) { +} + + +void BamScene::prepareAnimation() { +	_obj1 = _vm->graphics()->bob(BOB_OBJ1); +	_vm->graphics()->bobClear(BOB_OBJ1); +	_obj1->active = true; + +	_obj2 = _vm->graphics()->bob(BOB_OBJ2); +	_vm->graphics()->bobClear(BOB_OBJ2); +	_obj2->active = true; + +	_objfx = _vm->graphics()->bob(BOB_FX); +	_vm->graphics()->bobClear(BOB_FX); +	_objfx->active = true; + +	_index = 0; +} + +  void BamScene::updateCarAnimation() {  	if (_flag != F_STOP) {  		const BamDataBlock *bdb = &_carData[_index]; @@ -821,159 +1308,6 @@ void BamScene::updateFightAnimation() {  } -void Graphics::update(uint16 room) { -	bobSortAll(); -	if (_cameraBob >= 0) { -		_vm->display()->horizontalScrollUpdate(_bobs[_cameraBob].x); -	} -	bobCustomParallax(room); -	_vm->display()->prepareUpdate(); -	bobDrawAll(); -	textDrawAll(); -} - -void Graphics::bobSetText( -		BobSlot *pbs,  -		const char *text,  -		int textX, int textY,  -		int color, int flags) { -	// function MAKE_SPEAK_BOB, lines 335-457 in talk.c - -	if (text[0] == '\0') -		return; - -	// debug(0, "makeSpeakBob('%s', (%i,%i), %i, %i, %i, %i);",  -	//		text, bob->x, bob->y, textX, textY, color, flags); - -	// Duplicate string and append zero if needed - -	char textCopy[MAX_STRING_SIZE]; - -	int length = strlen(text); -	memcpy(textCopy, text, length); - -	if (textCopy[length - 1] >= 'A') -		textCopy[length++] = '.'; - -	textCopy[length] = '\0'; - -	// Split text into lines - -	char lines[8][MAX_STRING_SIZE]; -	int lineCount = 0; -	int wordCount = 0; -	int lineLength = 0; -	int i; - -	for (i = 0; i < length; i++) { -		if (textCopy[i] == ' ') -			wordCount++; - -		lineLength++; - -		if ((lineLength > 20 && textCopy[i] == ' ') || i == (length-1)) { -			memcpy(lines[lineCount], textCopy + i + 1 - lineLength, lineLength); -			lines[lineCount][lineLength] = '\0'; -			lineCount++; -			lineLength = 0; -		} -	} - - -	// Plan: write each line to Screen 2, put black outline around lines and -	// pick them up as a BOB. - - -	// Find width of widest line  - -	int maxLineWidth = 0; - -	for (i = 0; i < lineCount; i++) { -		int width = textWidth(lines[i]); -		if (maxLineWidth < width) -			maxLineWidth = width; -	} - -	// Calc text position - -	short x, y, width, height; - -	if (flags) { -		if (flags == 2) -			x = 160 - maxLineWidth / 2; -		else -			x = textX; - -		y = textY; - -		width = 0; -	} else { -		x = pbs->x; -		y = pbs->y; - -		BobFrame *pbf = _vm->bankMan()->fetchFrame(pbs->frameNum); - -		width  = (pbf->width  * pbs->scale) / 100; -		height = (pbf->height * pbs->scale) / 100; - -		y = y - height - 16 - lineCount * 9; -	} - -	x -= _vm->display()->horizontalScroll(); - -	if (y < 0) { -		y = 0; - -		if (x < 160) -			x += width / 2; -		else -			x -= width / 2 + maxLineWidth; -	} else if (!flags) -		x -= maxLineWidth / 2; - -	if (x < 0) -		x = 4; -	else if ((x + maxLineWidth) > 320) -		x = 320 - maxLineWidth - 4; - -	textCurrentColor(color); - -	for (i = 0; i < lineCount; i++) { -		int lineX = x + (maxLineWidth - textWidth(lines[i])) / 2; - -		//debug(0, "Setting text '%s' at (%i, %i)", lines[i], lineX, y + 9 * i); -		textSet(lineX, y + 9 * i, lines[i]); -	} -} - -int Graphics::textCenterX(const char *text) const { -	return 160 - textWidth(text) / 2; -} - - - -BamScene::BamScene(QueenEngine *vm) -	: _flag(F_STOP), _screenShaked(false), _fightData(_fight1Data), _vm(vm) { -} - - -void BamScene::prepareAnimation() { -	_obj1 = _vm->graphics()->bob(BOB_OBJ1); -	_vm->graphics()->bobClear(BOB_OBJ1); -	_obj1->active = true; - -	_obj2 = _vm->graphics()->bob(BOB_OBJ2); -	_vm->graphics()->bobClear(BOB_OBJ2); -	_obj2->active = true; - -	_objfx = _vm->graphics()->bob(BOB_FX); -	_vm->graphics()->bobClear(BOB_FX); -	_objfx->active = true; - -	_index = 0; -} - -  const BamScene::BamDataBlock BamScene::_carData[] = {  	{ { 310, 105, 1 }, { 314, 106, 17 }, { 366, 101,  1 },  0 },  	{ { 303, 105, 1 }, { 307, 106, 17 }, { 214,   0, 10 },  0 }, diff --git a/queen/graphics.h b/queen/graphics.h index 312246b77c..007d1af81c 100644 --- a/queen/graphics.h +++ b/queen/graphics.h @@ -114,13 +114,9 @@ public:  	void bobCustomParallax(uint16 roomNum); // CHECK_PARALLAX() -	void bobSetText( -		BobSlot *bob,  -		const char *text,  -		int textX, int textY,  -		int color, int flags);	// MAKE_SPEAK_BOB +	void bobSetText(BobSlot *bob, const char *text, int textX, int textY, int color, int flags); -	void textCurrentColor(uint8 color); // ink() +	void textCurrentColor(uint8 color) { _curTextColor = color; }  	void textSet(uint16 x, uint16 y, const char *text, bool outlined = true); // text()  	void textSetCentered(uint16 y, const char *text, bool outlined = true);  	void textDrawAll(); // drawtext() @@ -129,6 +125,8 @@ public:  	int textCenterX(const char *text) const; // MIDDLE()  	void textColor(uint16 y, uint8 color) { _texts[y].color = color; } +	void setupNewRoom(const char *room, uint16 roomNum, int16 *furniture, uint16 furnitureCount); +  	void fillAnimBuffer(const char *anim, AnimFrame *af);  	uint16 countAnimFrames(const char *anim);  	void setupObjectAnim(const GraphicData *gd, uint16 firstImage, uint16 bobNum, bool visible); @@ -137,10 +135,26 @@ public:  	void erasePersonAnim(uint16 bobNum);  	void eraseAllAnims(); +	uint16 refreshObject(uint16 obj); + +	void setupRoomFurniture(int16 *furniture, uint16 furnitureCount); +	void setupRoomObjects(); + +	uint16 setupPerson(uint16 noun, uint16 curImage); +	uint16 allocPerson(uint16 noun, uint16 curImage); + +	uint16 personFrames(uint16 bobNum) const { return _personFrames[bobNum]; } +	void clearPersonFrames() { memset(_personFrames, 0, sizeof(_personFrames)); } +	uint16 numFrames() const { return _numFrames; } +	uint16 numStaticFurniture() const { return _numFurnitureStatic; } +	uint16 numAnimatedFurniture() const { return _numFurnitureAnimated; } +	uint16 numFurnitureFrames() const { return _numFurnitureStatic + _numFurnitureAnimatedLen; } +  	void putCameraOnBob(int bobNum) { _cameraBob = bobNum; }  	void update(uint16 room); +  	enum {  		MAX_BOBS_NUMBER     =  64,  		MAX_STRING_LENGTH   = 255, @@ -167,6 +181,20 @@ private:  	AnimFrame _newAnim[17][30]; +	uint16 _personFrames[4]; + +	//! Number of animated furniture in current room +	uint16 _numFurnitureAnimated; + +	//! Number of static furniture in current room +	uint16 _numFurnitureStatic; + +	//! Total number of frames for the animated furniture +	uint16 _numFurnitureAnimatedLen; + +	//! Current number of frames unpacked +	uint16 _numFrames; +  	int _cameraBob;  	QueenEngine *_vm; diff --git a/queen/logic.cpp b/queen/logic.cpp index 8918e6fa33..ca9bd4442e 100644 --- a/queen/logic.cpp +++ b/queen/logic.cpp @@ -258,10 +258,8 @@ ObjectData* Logic::objectData(int index) const {  } -uint16 Logic::findBob(uint16 obj) { -	uint16 i; +uint16 Logic::findBob(uint16 obj) {	  	uint16 bobnum = 0; -	uint16 bobtype = 0; // 1 for animated, 0 for static  	if (obj > _numObjects)  		error("Object index (%i) > _numObjects (%i)", obj, _numObjects); @@ -276,13 +274,10 @@ uint16 Logic::findBob(uint16 obj) {  	if(img != 0) {  		if(img == -3 || img == -4) {  			// a person object -			for(i = _roomData[room] + 1; i <= obj; ++i) { -				img = _objectData[i].image; -				if(img == -3 || img == -4) { -					++bobnum; -				} -			} +			bobnum = findPersonNumber(obj);  		} else { +			uint16 bobtype = 0; // 1 for animated, 0 for static +  			if(img <= -10) {  				// object has been turned off, but the image order hasn't been updated  				if(_graphicData[-(img + 10)].lastFrame != 0) { @@ -299,6 +294,7 @@ uint16 Logic::findBob(uint16 obj) {  			uint16 idxAnimated = 0;  			uint16 idxStatic = 0; +			uint16 i;  			for(i = _roomData[room] + 1; i <= obj; ++i) {  				img = _objectData[i].image;  				if(img <= -10) { @@ -329,12 +325,12 @@ uint16 Logic::findBob(uint16 obj) {  			if(bobtype == 0) {  				// static bob  				if(idxStatic > 0) { -					bobnum = 19 + _numFurnitureStatic + idxStatic; +					bobnum = 19 + _vm->graphics()->numStaticFurniture() + idxStatic;  				}  			} else {  				// animated bob  				if(idxAnimated > 0) { -					bobnum = 4 + _numFurnitureAnimated + idxAnimated; +					bobnum = 4 + _vm->graphics()->numAnimatedFurniture() + idxAnimated;  				}  			}  		} @@ -350,13 +346,7 @@ uint16 Logic::findFrame(uint16 obj) {  	uint16 room = _objectData[obj].room;  	int16 img = _objectData[obj].image;  	if(img == -3 || img == -4) { -		uint16 bobnum = 0; -		for(i = _roomData[room] + 1; i <= obj; ++i) { -			img = _objectData[i].image; -			if(img == -3 || img == -4) { -				++bobnum; -			} -		} +		uint16 bobnum = findPersonNumber(obj);  		if(bobnum <= 3) {  			framenum = 29 + FRAMES_JOE_XTRA + bobnum;  		} @@ -405,7 +395,7 @@ uint16 Logic::findFrame(uint16 obj) {  		// calculate only if there are person frames  		if(idx > 0) { -			framenum = 36 + FRAMES_JOE_XTRA + _numFurnitureStatic + _numFurnitureAnimatedLen + idx; +			framenum = 36 + FRAMES_JOE_XTRA + _vm->graphics()->numFurnitureFrames() + idx;  		}  	}  	return framenum; @@ -482,10 +472,7 @@ void Logic::roomErase() {  	}  	// invalidates all persons animations -	uint16 i; -	for (i = 0; i <= 3; ++i) { -		_personFrames[i] = 0; -	} +	_vm->graphics()->clearPersonFrames();  	_vm->graphics()->eraseAllAnims();  	uint16 cur = _roomData[_oldRoom] + 1; @@ -509,303 +496,6 @@ void Logic::roomErase() {  } -void Logic::roomSetupFurniture() { -	int16 gstate[9]; -	_numFurnitureStatic = 0; -	_numFurnitureAnimated = 0; -	_numFurnitureAnimatedLen = 0; -	uint16 curImage = 36 + FRAMES_JOE_XTRA; - -	// count the furniture and update gameState -	uint16 furnitureTotal = 0; -	uint16 i; -	for (i = 1; i <= _numFurniture; ++i) { -		if (_furnitureData[i].room == _currentRoom) { -			++furnitureTotal; -			gstate[furnitureTotal] = _furnitureData[i].gameStateValue; -		} -	} -	if (furnitureTotal == 0) { -		return; -	} - -	// unpack the furniture from the bank 15 -	// there are 3 kinds : -	// - static (bobs), gamestate range = ]0;5000] -	// - animated (bobs), gamestate range = ]0;5000] -	// - static (paste downs), gamestate range = [5000; [ - -	// unpack the static bobs -	for	(i = 1; i <= furnitureTotal; ++i) { -		int16 obj = gstate[i]; -		if (obj > 0 && obj <= 5000) { -			GraphicData *pgd = &_graphicData[obj]; -			if (pgd->lastFrame == 0) { -				++_numFurnitureStatic; -				++curImage; -				_vm->bankMan()->unpack(pgd->firstFrame, curImage, 15); -				++_numFrames; -				BobSlot *pbs = _vm->graphics()->bob(19 + _numFurnitureStatic); -				pbs->curPos(pgd->x, pgd->y); -				pbs->frameNum = curImage; -			} -		} -	} - -	// unpack the animated bobs -	uint16 curBob = 0; -	for  (i = 1; i <= furnitureTotal; ++i) { -		int16 obj = gstate[i]; -		if (obj > 0 && obj <= 5000) { -			GraphicData *pgd = &_graphicData[obj]; - -			bool rebound = false; -			int16 lastFrame = pgd->lastFrame; -			if (lastFrame < 0) { -				rebound = true; -				lastFrame = -lastFrame; -			} - -			if (lastFrame > 0) { -				_numFurnitureAnimatedLen += lastFrame - pgd->firstFrame + 1; -				++_numFurnitureAnimated; -				uint16 image = curImage + 1; -				int k; -				for (k = pgd->firstFrame; k <= lastFrame; ++k) { -					++curImage; -					_vm->bankMan()->unpack(k, curImage, 15); -					++_numFrames; -				} -				BobSlot *pbs = _vm->graphics()->bob(5 + curBob); -				pbs->animNormal(image, curImage, pgd->speed / 4, rebound, false); -				pbs->curPos(pgd->x, pgd->y); -				++curBob; -			} -		} -	} - -	// unpack the paste downs -	++curImage; -	for  (i = 1; i <= furnitureTotal; ++i) { -		if (gstate[i] > 5000) {; -			_vm->graphics()->bobPaste(gstate[i] - 5000, curImage); -		} -	} -} - - -void Logic::roomSetupObjects() { -	uint16 i; -	// furniture frames are reserved in ::roomSetupFurniture(), we append objects  -	// frames after the furniture ones. -	uint16 curImage = 36 + FRAMES_JOE_XTRA + _numFurnitureStatic + _numFurnitureAnimatedLen; -	uint16 firstRoomObj = currentRoomData() + 1; -	uint16 lastRoomObj = _roomData[_currentRoom + 1]; -	uint16 numObjectStatic = 0; -	uint16 numObjectAnimated = 0; -	uint16 curBob; - -	// invalidates all Bobs for persons (except Joe's one) -	for (i = 1; i <= 3; ++i) { -		_vm->graphics()->bob(i)->active = false; -	} - -	// static/animated Bobs -	for (i = firstRoomObj; i <= lastRoomObj; ++i) { -		ObjectData *pod = &_objectData[i]; -		// setup blanks bobs for turned off objects (in case  -		// you turn them on again) -		if (pod->image == -1) { -			// static OFF Bob -			curBob = 20 + _numFurnitureStatic + numObjectStatic; -			++numObjectStatic; -			// create a blank frame for the for the OFF object -			++_numFrames; -			++curImage; -		} else if(pod->image == -2) { -			// animated OFF Bob -			curBob = 5 + _numFurnitureAnimated + numObjectAnimated; -			++numObjectAnimated; -		} else if(pod->image > 0 && pod->image < 5000) { -			GraphicData *pgd = &_graphicData[pod->image]; -			int16 lastFrame = pgd->lastFrame; -			bool rebound = false; -			if (lastFrame < 0) { -				lastFrame = -lastFrame; -				rebound = true; -			} -			if (pgd->firstFrame < 0) { -				// FIXME: if(TEMPA[1]<0) bobs[CURRBOB].xflip=1; -				curBob = 5 + _numFurnitureAnimated; -				_vm->graphics()->setupObjectAnim(pgd, curImage + 1, curBob + numObjectAnimated, pod->name > 0); -				curImage += pgd->lastFrame; -				++numObjectAnimated; -			} else if (lastFrame != 0) { -				// animated objects -				uint16 j; -				uint16 firstFrame = curImage + 1; -				for (j = pgd->firstFrame; j <= lastFrame; ++j) { -					++curImage; -					_vm->bankMan()->unpack(j, curImage, 15); -					++_numFrames; -				} -				curBob = 5 + _numFurnitureAnimated + numObjectAnimated; -				if (pod->name > 0) { -					BobSlot *pbs = _vm->graphics()->bob(curBob); -					pbs->curPos(pgd->x, pgd->y); -					pbs->frameNum = firstFrame; -					if (pgd->speed > 0) { -						pbs->animNormal(firstFrame, curImage, pgd->speed / 4, rebound, false); -					} -				} -				++numObjectAnimated; -			} else { -				// static objects -				curBob = 20 + _numFurnitureStatic + numObjectStatic; -				++curImage; -				_vm->graphics()->bobClear(curBob); - -				// FIXME: if((COMPANEL==2) && (FULLSCREEN==1)) bobs[CURRBOB].y2=199; - -				_vm->bankMan()->unpack(pgd->firstFrame, curImage, 15); -				++_numFrames; -				if (pod->name > 0) { -					BobSlot *pbs = _vm->graphics()->bob(curBob); -					pbs->curPos(pgd->x, pgd->y); -					pbs->frameNum = curImage; -				} -				++numObjectStatic; -			} -		} -	} - -	// persons Bobs -	for (i = firstRoomObj; i <= lastRoomObj; ++i) { -		ObjectData *pod = &_objectData[i]; -		if (pod->image == -3 || pod->image == -4) { -			debug(6, "Logic::roomSetupObjects() - Setting up person %X, name=%X", i, pod->name); -			uint16 noun = i - currentRoomData(); -			if (pod->name > 0) { -				curImage = setupPersonInRoom(noun, curImage); -			} else { -				curImage = countPersonFrames(noun, curImage); -			} -		} -	} - -	// paste downs list -	++curImage; -	_numFrames = curImage; -	for (i = firstRoomObj; i <= lastRoomObj; ++i) { -		ObjectData *pod = &_objectData[i]; -		if (pod->name > 0 && pod->image > 5000) { -			_vm->graphics()->bobPaste(pod->image - 5000, curImage); -		} -	} -} - - -uint16 Logic::roomRefreshObject(uint16 obj) { -	uint16 curImage = _numFrames; - -	if (obj == 0 || obj > _numObjects) { -		warning("Invalid object number %d", obj); -		return curImage; -	} - -	ObjectData *pod = &_objectData[obj]; -	if (pod->image == 0) { -		return curImage; -	} - -	debug(6, "Logic::roomRefreshObject(%X, %s)", obj, _objName[ABS(pod->name)]); - -	// check the object is in the current room -	if (pod->room != _currentRoom) { -		debug(6, "Refreshing an object (%i=%s) not in current room (object room=%i, current room=%i)", obj, _objName[ABS(pod->name)], pod->room, _currentRoom); -		return curImage; -	} - -	// find bob for the object -	uint16 curBob = findBob(obj); -	BobSlot *pbs = _vm->graphics()->bob(curBob); - -	if (pod->image == -3 || pod->image == -4) { -		// a person object -		if (pod->name <= 0) { -			_vm->graphics()->bobClear(curBob); -		} else { -			// find person number -			uint16 pNum = 1; -			uint16 i = currentRoomData() + 1; -			while (i < obj) { -				if (_objectData[i].image == -3 || _objectData[i].image == -4) { -					++pNum; -				} -				++i; -			} -			curImage = _personFrames[pNum] - 1; -			if (_personFrames[pNum] == 0) { -				curImage = _numFrames; -				_personFrames[pNum] = curImage; -			} -			curImage = setupPersonInRoom(obj - currentRoomData(), curImage); -		} -		return curImage; -	} - -	// find frame used for object -	curImage = findFrame(obj); - -	if (pod->name < 0 || pod->image < 0) { -		// object is hidden or disabled -		_vm->graphics()->bobClear(curBob); -		return curImage; -	} - -	int image = pod->image; -	if (image > 5000) { -		image -= 5000; -	} -	 -	GraphicData *pgd = &_graphicData[image]; -	bool rebound = false; -	int16 lastFrame = pgd->lastFrame; -	if (lastFrame < 0) { -		lastFrame = -lastFrame; -		rebound = true; -	} -	if (pgd->firstFrame < 0) { -		_vm->graphics()->setupObjectAnim(pgd, curImage, curBob, pod->name != 0); -		curImage += pgd->lastFrame - 1; -	} else if (lastFrame != 0) { -		// turn on an animated bob -		_vm->bankMan()->unpack(pgd->firstFrame, 2, 15); -		pbs->animating = false; -		uint16 firstImage = curImage; -		--curImage; -		uint16 j; -		for (j = pgd->firstFrame; j <= lastFrame; ++j) { -			++curImage; -			_vm->bankMan()->unpack(j, curImage, 15); -		} -		pbs->curPos(pgd->x, pgd->y); -		pbs->frameNum = firstImage; -		if (pgd->speed > 0) { -			pbs->animNormal(firstImage, curImage, pgd->speed / 4, rebound, false); -		} -	} else { -		// frame 2 is used as a buffer frame to prevent BOB flickering -		_vm->bankMan()->unpack(pgd->firstFrame, 2, 15); -		_vm->bankMan()->unpack(pgd->firstFrame, curImage, 15); -		pbs->curPos(pgd->x, pgd->y); -		pbs->frameNum = curImage; -	} - -	return curImage; -} - -  void Logic::roomSetup(const char *room, int comPanel, bool inCutaway) {  	// load backdrop image, init dynalum, setup colors  	_vm->display()->setupNewRoom(room, _currentRoom); @@ -813,23 +503,18 @@ void Logic::roomSetup(const char *room, int comPanel, bool inCutaway) {  	// setup graphics to enter fullscreen/panel mode  	_vm->display()->screenMode(comPanel, inCutaway); -	// reset sprites table (bounding box...) -	_vm->graphics()->bobClearAll(); - -	// load/setup objects associated to this room -	char filename[20];	 -	sprintf(filename, "%s.BBK", room); -	_vm->bankMan()->load(filename, 15); - -	_numFrames = 37 + FRAMES_JOE_XTRA; -	roomSetupFurniture(); -	roomSetupObjects(); +	_vm->grid()->setupNewRoom(_currentRoom, _roomData[_currentRoom]); -	if (_currentRoom >= 90) { -		_vm->graphics()->putCameraOnBob(0); +	int16 furn[9]; +	uint16 furnTot = 0; +	for (uint16 i = 1; i <= _numFurniture; ++i) { +		if (_furnitureData[i].room == _currentRoom) { +			++furnTot; +			furn[furnTot] = _furnitureData[i].gameStateValue; +		}  	} +	_vm->graphics()->setupNewRoom(room, _currentRoom, furn, furnTot); -	_vm->grid()->setupNewRoom(_currentRoom, _roomData[_currentRoom]);  	_vm->display()->forceFullRefresh();  } @@ -869,17 +554,11 @@ ActorData *Logic::findActor(uint16 noun, const char *name) {  	}  	// search Bob number for the person -	uint16 i; -	uint16 bobNum = 0; -	for (i = currentRoomData() + 1; i <= obj; ++i) { -		img = _objectData[i].image; -		if (img == -3 || img == -4) { -			++bobNum; -		} -	} +	uint16 bobNum = findPersonNumber(obj);  	// search for a matching actor  	if (bobNum > 0) { +		uint16 i;  		for (i = 1; i <= _numActors; ++i) {  			ActorData *pad = &_actorData[i];  			if (pad->room == _currentRoom && gameState(pad->gsSlot) == pad->gsValue) { @@ -916,50 +595,16 @@ void Logic::initPerson(int16 noun, const char *actorName, bool loadBank, Person  } -uint16 Logic::setupPersonInRoom(uint16 noun, uint16 curImage) { -	if (noun == 0) { -		warning("Trying to setup person 0"); -		return curImage; -	} - -	Person p; -	initPerson(noun, "", true, &p); - -	const ActorData *pad = p.actor; -	uint16 scale = 100; -	uint16 a = _vm->grid()->findAreaForPos(GS_ROOM, pad->x, pad->y); -	if (a > 0) { -		// person is not standing in the area box, scale it accordingly -		scale = _vm->grid()->area(_currentRoom, a)->calcScale(pad->y); -	} - -	_vm->bankMan()->unpack(pad->bobFrameStanding, p.bobFrame, p.actor->bankNum); -	uint16 obj = currentRoomData() + noun; -	BobSlot *pbs = _vm->graphics()->bob(pad->bobNum); -	pbs->curPos(pad->x, pad->y); -	pbs->scale = scale; -	pbs->frameNum = p.bobFrame; -	pbs->xflip = (_objectData[obj].image == -3); // person is facing left - -	debug(6, "Logic::personSetup(%d, %d) - bob = %d name = %s", noun, curImage, pad->bobNum, p.name); - -	if (p.anim != NULL) { -		_personFrames[pad->bobNum] = curImage + 1; -		curImage = _vm->graphics()->setupPersonAnim(pad, p.anim, curImage); -	} else { -		_vm->graphics()->erasePersonAnim(pad->bobNum); -	} -	return curImage; -} - - -uint16 Logic::countPersonFrames(uint16 noun, uint16 curImage) { -	ActorData *pad = findActor(noun); -	if (pad != NULL && pad->anim != 0) { -		curImage += _vm->graphics()->countAnimFrames(_aAnim[pad->anim]); -		_personFrames[pad->bobNum] = curImage + 1; +uint16 Logic::findPersonNumber(uint16 obj) const { +	uint16 num = 0; +	uint16 i; +	for (i = currentRoomData() + 1; i <= obj; ++i) { +		int16 img = _objectData[i].image; +		if (img == -3 || img == -4) { +			++num; +		}  	} -	return curImage; +	return num;  } @@ -2231,7 +1876,7 @@ void Logic::asmMakeLightningHitPlane() {  	lightningBob->y = 0;  	// 23/2/95 - Play lightning SFX -	_vm->sound()->playSfx(_vm->logic()->currentRoomSfx()); +	_vm->sound()->playSfx(currentRoomSfx());  	_vm->bankMan()->unpack(18, lightningBob->frameNum, 15);  	_vm->bankMan()->unpack(4,  planeBob    ->frameNum, 15); diff --git a/queen/logic.h b/queen/logic.h index 1a7df1aa39..778429fcce 100644 --- a/queen/logic.h +++ b/queen/logic.h @@ -139,22 +139,15 @@ public:  	const char *objectTextualDescription(uint16 objNum) const { return _objDescription[objNum]; }  	void roomErase(); -	void roomSetupFurniture(); -	void roomSetupObjects(); -	uint16 roomRefreshObject(uint16 obj);  	void roomSetup(const char *room, int comPanel, bool inCutaway);  	void roomDisplay(uint16 room, RoomDisplayMode mode, uint16 joeScale, int comPanel, bool inCutaway);  	int16 entryObj() const { return _entryObj; }  	void entryObj(int16 obj) { _entryObj = obj; } -	uint16 numFrames() const { return _numFrames; } -  	ActorData *findActor(uint16 noun, const char *name = NULL);  	void initPerson(int16 noun, const char *actorName, bool loadBank, Person *pp); -	uint16 setupPersonInRoom(uint16 noun, uint16 curImage); -	uint16 countPersonFrames(uint16 noun, uint16 curImage); -	uint16 personFrames(uint16 bobNum) const { return _personFrames[bobNum]; } +	uint16 findPersonNumber(uint16 obj) const;  	void loadJoeBanks(const char *animBank, const char *standBank); @@ -357,21 +350,6 @@ protected:  	int16 _gameState[GAME_STATE_COUNT];  	TalkSelected _talkSelected[TALK_SELECTED_COUNT]; -	 -	//! Number of animated furniture in current room -	uint16 _numFurnitureAnimated; - -	//! Number of static furniture in current room -	uint16 _numFurnitureStatic; - -	//! Total number of frames for the animated furniture -	uint16 _numFurnitureAnimatedLen; - -	//! Current number of frames unpacked -	uint16 _numFrames; - -	//! Last frame number used for person animation -	uint16 _personFrames[4];  	//! Inventory items  	int16 _inventoryItem[4]; diff --git a/queen/talk.cpp b/queen/talk.cpp index 33b2b0bec9..8688f6328d 100644 --- a/queen/talk.cpp +++ b/queen/talk.cpp @@ -590,7 +590,7 @@ int Talk::getSpeakCommand(const Person *person, const char *sentence, unsigned &  				if (0 == strcmp(person->name, "JOE"))  					_vm->walk()->moveJoe(0, x, y, _vm->input()->cutawayRunning());  				else -					_vm->walk()->movePerson(person, x, y, _vm->logic()->numFrames(), 0); +					_vm->walk()->movePerson(person, x, y, _vm->graphics()->numFrames(), 0);  				index += 11;  				// if(JOEWALK==3) CUTQUIT=0;  				// XXX personWalking = true; @@ -737,9 +737,9 @@ void Talk::headStringAnimation(const SpeechParameters *parameters, int bobNum, i  			offset += 4; -			_vm->bankMan()->unpack(frame, _vm->logic()->numFrames(), bankNum); +			_vm->bankMan()->unpack(frame, _vm->graphics()->numFrames(), bankNum); -			bob2->frameNum = _vm->logic()->numFrames(); +			bob2->frameNum = _vm->graphics()->numFrames();  			bob2->scale = 100;  			bob2->active = true;  			bob2->x = x; @@ -984,7 +984,7 @@ void Talk::speakSegment(  			// Dont turn AMAL animation off, and dont manually anim person  			command = SPEAK_ORACLE;  			oracle = true; -			uint16 frameNum = _vm->logic()->personFrames(bobNum); +			uint16 frameNum = _vm->graphics()->personFrames(bobNum);  			for (i = 5; i <= 8; ++i) {  				_vm->bankMan()->unpack(i, frameNum, bankNum);  				++frameNum; @@ -1111,7 +1111,7 @@ void Talk::speakSegment(  	_vm->graphics()->textClear(0,198);  	if (oracle) { -		uint16 frameNum = _vm->logic()->personFrames(bobNum); +		uint16 frameNum = _vm->graphics()->personFrames(bobNum);  		for (i = 1; i <= 4; ++i) {  			_vm->bankMan()->unpack(i, frameNum, bankNum);  			++frameNum; diff --git a/queen/xref.txt b/queen/xref.txt index 6251564be6..22fb6eb9a0 100644 --- a/queen/xref.txt +++ b/queen/xref.txt @@ -124,6 +124,7 @@ Box()						Display::drawBox  CHECK_PARALLAX()			Graphics::bobCustomParallax  clearallbobs()				Graphics::bobClearAll  clearbob()					Graphics::bobClear +DISP_OBJECTS()				Graphics::setupRoomObjects  drawbobs()					Graphics::bobDrawAll  invbob()					Graphics::bobDrawInventoryItem  loadbackdrop()				*not needed* (included in Display::setupNewRoom) @@ -132,6 +133,7 @@ MAKE_SPEAK_BOB()			Graphics::bobSetText  makeanim()					BobSlot::animNormal  movebob()					BobSlot::move  pastebob()					Graphics::bobPaste +REDISP_OBJECT()				Graphics::refreshObject  requestor()  shrinkbob()					Graphics::bobShrink  sortbobs()					Graphics::bobSortAll @@ -206,17 +208,15 @@ LOGIC  =====  CHECK_PLAYER()				QueenEngine::update  CUTAWAY_SPECIAL()			Logic::removeHotelItemsFromInventory -DISP_OBJECTS()				Logic::roomSetupObjects  DISP_ROOM()					Logic::roomDisplay  FIND_BOB()					Logic::findBob  FIND_FRAME()				Logic::findFrame  FIND_GRAPHIC()				Logic::graphicData  P3_COPY_FROM()				Logic::objectCopy  R_MAP()						Logic::handlePinnacleRoom -REDISP_OBJECT()				Logic::roomRefreshObject  restart_game()  SETUP_BOBS()				Graphics::bobSetupControl -SETUP_FURNITURE()			Logic::roomSetupFurniture +SETUP_FURNITURE()			Graphics::setupRoomFurniture  SETUP_ROOM()				Logic::changeRoom  SETUP_SCREENS()				*not needed* (only calls Display::setupPanel)  SETUP_VARS()				*not needed* (equivalent to Command::clear(), SCENE=0, clear(gamestate))  | 
