diff options
| -rw-r--r-- | saga/actor.cpp | 47 | ||||
| -rw-r--r-- | saga/animation.cpp | 2 | ||||
| -rw-r--r-- | saga/font.cpp | 27 | ||||
| -rw-r--r-- | saga/font.h | 4 | ||||
| -rw-r--r-- | saga/sfuncs.cpp | 2 | 
5 files changed, 51 insertions, 31 deletions
| diff --git a/saga/actor.cpp b/saga/actor.cpp index 73bc427f21..4b0fbf4189 100644 --- a/saga/actor.cpp +++ b/saga/actor.cpp @@ -1017,34 +1017,41 @@ void Actor::handleSpeech(int msec) {  	}  	if (_activeSpeech.actorsCount == 1) { -		width = _activeSpeech.speechBox.width(); -		height = _vm->_font->getHeight(kMediumFont, _activeSpeech.strings[0], width - 2, _activeSpeech.getFontFlags(0)) + 1; - -		if (height > 40 && width < _vm->getDisplayWidth() - 100) { -			width = _vm->getDisplayWidth() - 100; +		if (_speechBoxScript.width() > 0) { +			_activeSpeech.drawRect.left = _speechBoxScript.left; +			_activeSpeech.drawRect.right = _speechBoxScript.right; +			_activeSpeech.drawRect.top = _speechBoxScript.top; +			_activeSpeech.drawRect.bottom = _speechBoxScript.bottom; +		} else { +			width = _activeSpeech.speechBox.width();  			height = _vm->_font->getHeight(kMediumFont, _activeSpeech.strings[0], width - 2, _activeSpeech.getFontFlags(0)) + 1; -		} -		_activeSpeech.speechBox.setWidth(width); +			if (height > 40 && width < _vm->getDisplayWidth() - 100) { +				width = _vm->getDisplayWidth() - 100; +				height = _vm->_font->getHeight(kMediumFont, _activeSpeech.strings[0], width - 2, _activeSpeech.getFontFlags(0)) + 1; +			} + +			_activeSpeech.speechBox.setWidth(width); + +			if (_activeSpeech.actorIds[0] != 0) { +				actor = getActor(_activeSpeech.actorIds[0]); +				_activeSpeech.speechBox.setHeight(height); -		if (_activeSpeech.actorIds[0] != 0) { -			actor = getActor(_activeSpeech.actorIds[0]); -			_activeSpeech.speechBox.setHeight(height); +				if (_activeSpeech.speechBox.right > _vm->getDisplayWidth() - 10) { +					_activeSpeech.drawRect.left = _vm->getDisplayWidth() - 10 - width; +				} else { +					_activeSpeech.drawRect.left = _activeSpeech.speechBox.left; +				} -			if (_activeSpeech.speechBox.right > _vm->getDisplayWidth() - 10) { -				_activeSpeech.drawRect.left = _vm->getDisplayWidth() - 10 - width; +				height2 =  actor->_screenPosition.y - 50; +				_activeSpeech.speechBox.top = _activeSpeech.drawRect.top = MAX(10, (height2 - height) / 2);  			} else {  				_activeSpeech.drawRect.left = _activeSpeech.speechBox.left; +				_activeSpeech.drawRect.top = _activeSpeech.speechBox.top + (_activeSpeech.speechBox.height() - height) / 2;  			} - -			height2 =  actor->_screenPosition.y - 50; -			_activeSpeech.speechBox.top = _activeSpeech.drawRect.top = MAX(10, (height2 - height) / 2); -		} else { -			_activeSpeech.drawRect.left = _activeSpeech.speechBox.left; -			_activeSpeech.drawRect.top = _activeSpeech.speechBox.top + (_activeSpeech.speechBox.height() - height) / 2; +			_activeSpeech.drawRect.setWidth(width); +			_activeSpeech.drawRect.setHeight(height);  		} -		_activeSpeech.drawRect.setWidth(width); -		_activeSpeech.drawRect.setHeight(height);  	}  	_activeSpeech.playing = true; diff --git a/saga/animation.cpp b/saga/animation.cpp index a5f6e9bd68..04f383aac7 100644 --- a/saga/animation.cpp +++ b/saga/animation.cpp @@ -119,6 +119,8 @@ void Anim::playCutaway(int cut, bool fade) {  	free(buf);  	free(resourceData); +	// Play the animation +  	int cutawaySlot = -1;  	for (int i = 0; i < ARRAYSIZE(_cutawayAnimations); i++) { diff --git a/saga/font.cpp b/saga/font.cpp index 649feb6e00..bcd9b785a8 100644 --- a/saga/font.cpp +++ b/saga/font.cpp @@ -62,6 +62,10 @@ Font::~Font(void) {  	}  } +FontData *Font::getFont(FontId fontId) { +	return _fonts[fontId]; +} +  void Font::loadFont(uint32 fontResourceId) {  	FontData *font;  	byte *fontResourcePointer; @@ -70,7 +74,6 @@ void Font::loadFont(uint32 fontResourceId) {  	int c;  	ResourceContext *fontContext; -  	debug(1, "Font::loadFont(): Reading fontResourceId %d...", fontResourceId);  	fontContext = _vm->_resource->getContext(GAME_RESOURCEFILE); @@ -134,7 +137,6 @@ void Font::loadFont(uint32 fontResourceId) {  	_fonts[_loadedFonts++] = font;  } -  void Font::createOutline(FontData *font) {  	int i;  	int row; @@ -249,7 +251,7 @@ int Font::getStringWidth(FontId fontId, const char *text, size_t count, FontEffe  	validate(fontId); -	font = _fonts[fontId]; +	font = getFont(fontId);  	txt = (const byte *) text; @@ -273,7 +275,7 @@ int Font::getHeight(FontId fontId) {  	validate(fontId); -	font = _fonts[fontId]; +	font = getFont(fontId);  	return font->normal.header.charHeight;  } @@ -285,7 +287,7 @@ void Font::draw(FontId fontId, Surface *ds, const char *text, size_t count, cons  	validate(fontId); -	font = _fonts[fontId]; +	font = getFont(fontId);  	if (flags & kFontOutline) {  		offsetPoint.x--; @@ -554,7 +556,7 @@ void Font::textDrawRect(FontId fontId, Surface *ds, const char *text, const Comm  	textPoint.y = rect.top;  	if (fitWidth >= textWidth) { -	// Entire string fits, draw it +		// Entire string fits, draw it  		textPoint.x -= (textWidth / 2);  		draw(fontId, ds, text, textLength, textPoint, color, effectColor, flags);  		return; @@ -604,6 +606,19 @@ void Font::textDrawRect(FontId fontId, Surface *ds, const char *text, const Comm  				searchPointer = measurePointer + 1;  			}  			wc = 0; + +			// Advance the search pointer to the next non-space. +			// Otherwise, the first "word" to be measured will be +			// an empty string. Measuring or drawing a string of +			// length 0 is interpreted as measure/draw the entire +			// buffer, which certainly is not what we want here. +			// +			// This happes because a string may contain several +			// spaces in a row, e.g. after a period. + +			while (*searchPointer == ' ') +				searchPointer++; +  			measurePointer = searchPointer;  			startPointer = searchPointer;  		} else { diff --git a/saga/font.h b/saga/font.h index 9ef83bb50f..46d6d229a3 100644 --- a/saga/font.h +++ b/saga/font.h @@ -76,7 +76,6 @@ public:  	}  }; -  struct FontHeader {  	int charHeight;  	int charWidth; @@ -106,6 +105,7 @@ class Font {   public:  	Font(SagaEngine *vm);  	~Font(void); +	FontData *getFont(FontId fontId);  	int getStringWidth(FontId fontId, const char *text, size_t count, FontEffectFlags flags);  	int getHeight(FontId fontId);  	int getHeight(FontId fontId, const char *text, int width, FontEffectFlags flags); @@ -124,7 +124,6 @@ class Font {  	}   private: -  	void loadFont(uint32 fontResourceId);  	void createOutline(FontData *font);  	void draw(FontId fontId, Surface *ds, const char *text, size_t count, const Common::Point &point, int color, int effectColor, FontEffectFlags flags); @@ -139,7 +138,6 @@ class Font {  		return byteLength;  	} -  	static const int _charMap[256];  	SagaEngine *_vm; diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index b64be9bdc6..d5b2f1caa3 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -1970,8 +1970,6 @@ void Script::sfSetSpeechBox(SCRIPTFUNC_PARAMS) {  	_vm->_actor->_speechBoxScript.top = param2;  	_vm->_actor->_speechBoxScript.setWidth(param3);  	_vm->_actor->_speechBoxScript.setHeight(param4); - -	debug(0, "STUB: sfSetSpeechBox(%d, %d, %d, %d)", param1, param2, param3, param4);  }  void Script::sfDebugShowData(SCRIPTFUNC_PARAMS) { | 
