diff options
| author | Willem Jan Palenstijn | 2015-07-22 22:37:40 +0200 | 
|---|---|---|
| committer | Willem Jan Palenstijn | 2015-07-22 22:43:42 +0200 | 
| commit | 6ec9c81b575f13b2c4b30aeac592ebf2557b5890 (patch) | |
| tree | 503d50902bad2d800165593039d08d5ccf0c98ab /engines/zvision/scripting/controls | |
| parent | 5ec05f6b647c5ea41418be7ed19ad381f97cabd8 (diff) | |
| parent | 4e5c8d35f7e133e2e72a846fdbd54900c91eeb73 (diff) | |
| download | scummvm-rg350-6ec9c81b575f13b2c4b30aeac592ebf2557b5890.tar.gz scummvm-rg350-6ec9c81b575f13b2c4b30aeac592ebf2557b5890.tar.bz2 scummvm-rg350-6ec9c81b575f13b2c4b30aeac592ebf2557b5890.zip | |
Merge branch 'master' into mm
Conflicts:
	engines/access/access.cpp
	engines/access/asurface.h
	engines/access/bubble_box.cpp
	engines/access/bubble_box.h
	engines/access/martian/martian_game.cpp
	engines/access/player.cpp
	engines/access/player.h
	engines/access/resources.cpp
	engines/access/screen.cpp
	engines/access/screen.h
	engines/access/sound.cpp
	engines/access/sound.h
Diffstat (limited to 'engines/zvision/scripting/controls')
15 files changed, 131 insertions, 167 deletions
| diff --git a/engines/zvision/scripting/controls/fist_control.cpp b/engines/zvision/scripting/controls/fist_control.cpp index 34a64b4298..f79c82dc79 100644 --- a/engines/zvision/scripting/controls/fist_control.cpp +++ b/engines/zvision/scripting/controls/fist_control.cpp @@ -46,10 +46,6 @@ FistControl::FistControl(ZVision *engine, uint32 key, Common::SeekableReadStream  	_order = 0;  	_fistnum = 0; -	_frameCur = -1; -	_frameEnd = -1; -	_frameTime = 0; -	_lastRenderedFrame = -1;  	_animationId = 0;  	clearFistArray(_fistsUp); @@ -95,41 +91,28 @@ FistControl::~FistControl() {  	_entries.clear();  } -void FistControl::renderFrame(uint frameNumber) { -	if ((int32)frameNumber == _lastRenderedFrame) -		return; - -	_lastRenderedFrame = frameNumber; - -	const Graphics::Surface *frameData; - -	if (_animation) { -		_animation->seekToFrame(frameNumber); -		frameData = _animation->decodeNextFrame(); -		if (frameData) -			_engine->getRenderManager()->blitSurfaceToBkgScaled(*frameData, _anmRect); -	} -} -  bool FistControl::process(uint32 deltaTimeInMillis) {  	if (_engine->getScriptManager()->getStateFlag(_key) & Puzzle::DISABLED)  		return false; -	if (_frameCur >= 0 && _frameEnd >= 0) -		if (_frameCur <= _frameEnd) { -			_frameTime -= deltaTimeInMillis; - -			if (_frameTime <= 0) { -				_frameTime = 1000.0 / _animation->getDuration().framerate(); - -				renderFrame(_frameCur); - -				_frameCur++; +	if (_animation && _animation->isPlaying()) { +		if (_animation->endOfVideo()) { +			_animation->stop(); +			_engine->getScriptManager()->setStateValue(_animationId, 2); +			return false; +		} -				if (_frameCur > _frameEnd) -					_engine->getScriptManager()->setStateValue(_animationId, 2); -			} +		if (_animation->needsUpdate()) { +			const Graphics::Surface *frameData = _animation->decodeNextFrame(); +			if (frameData) +				// WORKAROUND: Ignore the target frame dimensions for the finger animations. +				// The target dimensions specify an area smaller than expected, thus if we +				// scale the finger videos to fit these dimensions, they are not aligned +				// correctly. Not scaling these videos yields a result identical to the +				// original. Fixes bug #6784. +				_engine->getRenderManager()->blitSurfaceToBkg(*frameData, _anmRect.left, _anmRect.top);  		} +	}  	return false;  } @@ -160,9 +143,12 @@ bool FistControl::onMouseUp(const Common::Point &screenSpacePos, const Common::P  		for (int i = 0; i < _numEntries; i++)  			if (_entries[i]._bitsStrt == oldStatus && _entries[i]._bitsEnd == _fiststatus) { -				_frameCur = _entries[i]._anmStrt; -				_frameEnd = _entries[i]._anmEnd; -				_frameTime = 0; +				if (_animation) { +					_animation->stop(); +					_animation->seekToFrame(_entries[i]._anmStrt); +					_animation->setEndFrame(_entries[i]._anmEnd); +					_animation->start(); +				}  				_engine->getScriptManager()->setStateValue(_animationId, 1);  				_engine->getScriptManager()->setStateValue(_soundKey, _entries[i]._sound); diff --git a/engines/zvision/scripting/controls/fist_control.h b/engines/zvision/scripting/controls/fist_control.h index 0a6b977ead..d7cbcb1f71 100644 --- a/engines/zvision/scripting/controls/fist_control.h +++ b/engines/zvision/scripting/controls/fist_control.h @@ -34,6 +34,7 @@ namespace Video {  namespace ZVision { +// Only used in Zork Nemesis, handles the door lock puzzle with the skeletal fingers (td9e)  class FistControl : public Control {  public:  	FistControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream); @@ -63,10 +64,6 @@ private:  	Video::VideoDecoder *_animation;  	Common::Rect _anmRect;  	int32   _soundKey; -	int32   _frameCur; -	int32   _frameEnd; -	int32   _frameTime; -	int32   _lastRenderedFrame;  	int32   _animationId;  public: @@ -75,7 +72,6 @@ public:  	bool process(uint32 deltaTimeInMillis);  private: -	void renderFrame(uint frameNumber);  	void readDescFile(const Common::String &fileName);  	void clearFistArray(Common::Array< Common::Array<Common::Rect> > &arr);  	uint32 readBits(const char *str); diff --git a/engines/zvision/scripting/controls/hotmov_control.cpp b/engines/zvision/scripting/controls/hotmov_control.cpp index e77272ec73..182447a990 100644 --- a/engines/zvision/scripting/controls/hotmov_control.cpp +++ b/engines/zvision/scripting/controls/hotmov_control.cpp @@ -41,10 +41,7 @@ HotMovControl::HotMovControl(ZVision *engine, uint32 key, Common::SeekableReadSt  	: Control(engine, key, CONTROL_HOTMOV) {  	_animation = NULL;  	_cycle = 0; -	_curFrame = -1; -	_lastRenderedFrame = -1;  	_frames.clear(); -	_frameTime = 0;  	_cyclesCount = 0;  	_framesCount = 0; @@ -78,6 +75,7 @@ HotMovControl::HotMovControl(ZVision *engine, uint32 key, Common::SeekableReadSt  			sscanf(values.c_str(), "%s", filename);  			values = Common::String(filename);  			_animation = _engine->loadAnimation(values); +			_animation->start();  		} else if (param.matchString("venus_id", true)) {  			_venusId = atoi(values.c_str());  		} @@ -95,41 +93,26 @@ HotMovControl::~HotMovControl() {  	_frames.clear();  } -void HotMovControl::renderFrame(uint frameNumber) { -	if ((int)frameNumber == _lastRenderedFrame) -		return; - -	_lastRenderedFrame = frameNumber; - -	const Graphics::Surface *frameData; - -	if (_animation) { -		_animation->seekToFrame(frameNumber); -		frameData = _animation->decodeNextFrame(); -		if (frameData) -			_engine->getRenderManager()->blitSurfaceToBkgScaled(*frameData, _rectangle); -	} -} -  bool HotMovControl::process(uint32 deltaTimeInMillis) {  	if (_engine->getScriptManager()->getStateFlag(_key) & Puzzle::DISABLED)  		return false;  	if (_cycle < _cyclesCount) { -		_frameTime -= deltaTimeInMillis; +		if (_animation && _animation->endOfVideo()) { +			_cycle++; -		if (_frameTime <= 0) { -			_curFrame++; -			if (_curFrame >= _framesCount) { -				_curFrame = 0; -				_cycle++; -			} -			if (_cycle != _cyclesCount) -				renderFrame(_curFrame); -			else +			if (_cycle == _cyclesCount) {  				_engine->getScriptManager()->setStateValue(_key, 2); +				return false; +			} + +			_animation->rewind(); +		} -			_frameTime = 1000.0 / _animation->getDuration().framerate(); +		if (_animation && _animation->needsUpdate()) { +			const Graphics::Surface *frameData = _animation->decodeNextFrame(); +			if (frameData) +				_engine->getRenderManager()->blitSurfaceToBkgScaled(*frameData, _rectangle);  		}  	} @@ -140,8 +123,11 @@ bool HotMovControl::onMouseMove(const Common::Point &screenSpacePos, const Commo  	if (_engine->getScriptManager()->getStateFlag(_key) & Puzzle::DISABLED)  		return false; +	if (!_animation) +		return false; +  	if (_cycle < _cyclesCount) { -		if (_frames[_curFrame].contains(backgroundImageSpacePos)) { +		if (_frames[_animation->getCurFrame()].contains(backgroundImageSpacePos)) {  			_engine->getCursorManager()->changeCursor(CursorIndex_Active);  			return true;  		} @@ -154,8 +140,11 @@ bool HotMovControl::onMouseUp(const Common::Point &screenSpacePos, const Common:  	if (_engine->getScriptManager()->getStateFlag(_key) & Puzzle::DISABLED)  		return false; +	if (!_animation) +		return false; +  	if (_cycle < _cyclesCount) { -		if (_frames[_curFrame].contains(backgroundImageSpacePos)) { +		if (_frames[_animation->getCurFrame()].contains(backgroundImageSpacePos)) {  			setVenus();  			_engine->getScriptManager()->setStateValue(_key, 1);  			return true; diff --git a/engines/zvision/scripting/controls/hotmov_control.h b/engines/zvision/scripting/controls/hotmov_control.h index b18d44c7a6..99d1fd0979 100644 --- a/engines/zvision/scripting/controls/hotmov_control.h +++ b/engines/zvision/scripting/controls/hotmov_control.h @@ -34,6 +34,7 @@ namespace Video {  namespace ZVision { +// Only used in Zork Nemesis, handles movies where the player needs to click on something (mj7g, vw3g)  class HotMovControl : public Control {  public:  	HotMovControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream); @@ -41,9 +42,6 @@ public:  private:  	int32  _framesCount; -	int32  _frameTime; -	int32  _curFrame; -	int32  _lastRenderedFrame;  	int32  _cycle;  	int32  _cyclesCount;  	Video::VideoDecoder *_animation; @@ -55,7 +53,6 @@ public:  	bool process(uint32 deltaTimeInMillis);  private: -	void renderFrame(uint frameNumber);  	void readHsFile(const Common::String &fileName);  }; diff --git a/engines/zvision/scripting/controls/input_control.cpp b/engines/zvision/scripting/controls/input_control.cpp index e75cc15743..9525333ef0 100644 --- a/engines/zvision/scripting/controls/input_control.cpp +++ b/engines/zvision/scripting/controls/input_control.cpp @@ -39,16 +39,14 @@ namespace ZVision {  InputControl::InputControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream)  	: Control(engine, key, CONTROL_INPUT), +	  _background(0),  	  _nextTabstop(0),  	  _focused(false),  	  _textChanged(false), -	  _cursorOffset(0),  	  _enterPressed(false),  	  _readOnly(false),  	  _txtWidth(0), -	  _animation(NULL), -	  _frameDelay(0), -	  _frame(-1) { +	  _animation(NULL) {  	// Loop until we find the closing brace  	Common::String line = stream.readLine();  	_engine->getScriptManager()->trimCommentsAndWhiteSpace(&line); @@ -80,13 +78,13 @@ InputControl::InputControl(ZVision *engine, uint32 key, Common::SeekableReadStre  			sscanf(values.c_str(), "%u", &fontFormatNumber); -			_stringInit.readAllStyle(_engine->getStringManager()->getTextLine(fontFormatNumber)); +			_stringInit.readAllStyles(_engine->getStringManager()->getTextLine(fontFormatNumber));  		} else if (param.matchString("chooser_init_string", true)) {  			uint fontFormatNumber;  			sscanf(values.c_str(), "%u", &fontFormatNumber); -			_stringChooserInit.readAllStyle(_engine->getStringManager()->getTextLine(fontFormatNumber)); +			_stringChooserInit.readAllStyles(_engine->getStringManager()->getTextLine(fontFormatNumber));  		} else if (param.matchString("next_tabstop", true)) {  			sscanf(values.c_str(), "%u", &_nextTabstop);  		} else if (param.matchString("cursor_dimensions", true)) { @@ -96,11 +94,10 @@ InputControl::InputControl(ZVision *engine, uint32 key, Common::SeekableReadStre  		} else if (param.matchString("cursor_animation", true)) {  			char fileName[25]; -			sscanf(values.c_str(), "%25s %*u", fileName); +			sscanf(values.c_str(), "%24s %*u", fileName);  			_animation = _engine->loadAnimation(fileName); -			_frame = -1; -			_frameDelay = 0; +			_animation->start();  		} else if (param.matchString("focus", true)) {  			_focused = true;  			_engine->getScriptManager()->setFocusControlKey(_key); @@ -112,6 +109,15 @@ InputControl::InputControl(ZVision *engine, uint32 key, Common::SeekableReadStre  		_engine->getScriptManager()->trimCommentsAndWhiteSpace(&line);  		getParams(line, param, values);  	} + +	_maxTxtWidth = _textRectangle.width(); +	if (_animation) +		_maxTxtWidth -= _animation->getWidth(); +} + +InputControl::~InputControl() { +	_background->free(); +	delete _background;  }  bool InputControl::onMouseUp(const Common::Point &screenSpacePos, const Common::Point &backgroundImageSpacePos) { @@ -194,36 +200,42 @@ bool InputControl::process(uint32 deltaTimeInMillis) {  	if (_engine->getScriptManager()->getStateFlag(_key) & Puzzle::DISABLED)  		return false; +	if (!_background) { +		_background = _engine->getRenderManager()->getBkgRect(_textRectangle); +	} +  	// First see if we need to render the text  	if (_textChanged) {  		// Blit the text using the RenderManager  		Graphics::Surface txt; -		txt.create(_textRectangle.width(), _textRectangle.height(), _engine->_pixelFormat); +		txt.copyFrom(*_background); + +		int32 oldTxtWidth = _txtWidth;  		if (!_readOnly || !_focused) -			_txtWidth = _engine->getTextRenderer()->drawTxt(_currentInputText, _stringInit, txt); +			_txtWidth = _engine->getTextRenderer()->drawText(_currentInputText, _stringInit, txt);  		else -			_txtWidth = _engine->getTextRenderer()->drawTxt(_currentInputText, _stringChooserInit, txt); +			_txtWidth = _engine->getTextRenderer()->drawText(_currentInputText, _stringChooserInit, txt); -		_engine->getRenderManager()->blitSurfaceToBkg(txt, _textRectangle.left, _textRectangle.top); +		if (_readOnly || _txtWidth <= _maxTxtWidth) +			_engine->getRenderManager()->blitSurfaceToBkg(txt, _textRectangle.left, _textRectangle.top); +		else { +			// Assume the last character caused the overflow. +			_currentInputText.deleteLastChar(); +			_txtWidth = oldTxtWidth; +		}  		txt.free();  	}  	if (_animation && !_readOnly && _focused) { -		bool needDraw = true;// = _textChanged; -		_frameDelay -= deltaTimeInMillis; -		if (_frameDelay <= 0) { -			_frame = (_frame + 1) % _animation->getFrameCount(); -			_frameDelay = 1000.0 / _animation->getDuration().framerate(); -			needDraw = true; -		} +		if (_animation->endOfVideo()) +			_animation->rewind(); -		if (needDraw) { -			_animation->seekToFrame(_frame); +		if (_animation->needsUpdate()) {  			const Graphics::Surface *srf = _animation->decodeNextFrame(); -			uint32 xx = _textRectangle.left + _txtWidth; +			int16 xx = _textRectangle.left + _txtWidth;  			if (xx >= _textRectangle.left + (_textRectangle.width() - (int16)_animation->getWidth()))  				xx = _textRectangle.left + _textRectangle.width() - (int16)_animation->getWidth();  			_engine->getRenderManager()->blitSurfaceToBkg(*srf, xx, _textRectangle.top); diff --git a/engines/zvision/scripting/controls/input_control.h b/engines/zvision/scripting/controls/input_control.h index 99f7f5287d..6abdb3c692 100644 --- a/engines/zvision/scripting/controls/input_control.h +++ b/engines/zvision/scripting/controls/input_control.h @@ -38,25 +38,25 @@ namespace ZVision {  class InputControl : public Control {  public:  	InputControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream); +	~InputControl();  private: +	Graphics::Surface *_background;  	Common::Rect _textRectangle;  	Common::Rect _headerRectangle; -	cTxtStyle _stringInit; -	cTxtStyle _stringChooserInit; +	TextStyleState _stringInit; +	TextStyleState _stringChooserInit;  	uint32 _nextTabstop;  	bool _focused;  	Common::String _currentInputText;  	bool _textChanged; -	uint _cursorOffset;  	bool _enterPressed;  	bool _readOnly;  	int16 _txtWidth; +	int16 _maxTxtWidth;  	Video::VideoDecoder *_animation; -	int32 _frameDelay; -	int16 _frame;  public:  	void focus() { diff --git a/engines/zvision/scripting/controls/lever_control.cpp b/engines/zvision/scripting/controls/lever_control.cpp index 8faa18357c..0f105b424c 100644 --- a/engines/zvision/scripting/controls/lever_control.cpp +++ b/engines/zvision/scripting/controls/lever_control.cpp @@ -64,12 +64,12 @@ LeverControl::LeverControl(ZVision *engine, uint32 key, Common::SeekableReadStre  	while (!stream.eos() && !line.contains('}')) {  		if (param.matchString("descfile", true)) {  			char levFileName[25]; -			sscanf(values.c_str(), "%25s", levFileName); +			sscanf(values.c_str(), "%24s", levFileName);  			parseLevFile(levFileName);  		} else if (param.matchString("cursor", true)) {  			char cursorName[25]; -			sscanf(values.c_str(), "%25s", cursorName); +			sscanf(values.c_str(), "%24s", cursorName);  			_cursor = _engine->getCursorManager()->getCursorId(Common::String(cursorName));  		} @@ -232,10 +232,13 @@ bool LeverControl::onMouseMove(const Common::Point &screenSpacePos, const Common  				if (angle >= (int)iter->angle - ANGLE_DELTA && angle <= (int)iter->angle + ANGLE_DELTA) {  					_currentFrame = iter->toFrame;  					renderFrame(_currentFrame); +					_engine->getScriptManager()->setStateValue(_key, _currentFrame);  					break;  				}  			}  		} +		_engine->getCursorManager()->changeCursor(_cursor); +		cursorWasChanged = true;  	} else if (_frameInfo[_currentFrame].hotspot.contains(backgroundImageSpacePos)) {  		_engine->getCursorManager()->changeCursor(_cursor);  		cursorWasChanged = true; diff --git a/engines/zvision/scripting/controls/lever_control.h b/engines/zvision/scripting/controls/lever_control.h index fdf4a649dc..8787234c51 100644 --- a/engines/zvision/scripting/controls/lever_control.h +++ b/engines/zvision/scripting/controls/lever_control.h @@ -34,6 +34,7 @@ namespace Video {  namespace ZVision { +// Only used in Zork Nemesis, handles draggable levers (te2e, tm7e, tp2e, tt2e, tz2e)  class LeverControl : public Control {  public:  	LeverControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream); diff --git a/engines/zvision/scripting/controls/paint_control.cpp b/engines/zvision/scripting/controls/paint_control.cpp index df06bb814e..62dde3d170 100644 --- a/engines/zvision/scripting/controls/paint_control.cpp +++ b/engines/zvision/scripting/controls/paint_control.cpp @@ -114,12 +114,18 @@ PaintControl::PaintControl(ZVision *engine, uint32 key, Common::SeekableReadStre  PaintControl::~PaintControl() {  	// Clear the state value back to 0  	//_engine->getScriptManager()->setStateValue(_key, 0); -	if (_paint) +	if (_paint) { +		_paint->free();  		delete _paint; -	if (_brush) +	} +	if (_brush) { +		_brush->free();  		delete _brush; -	if (_bkg) +	} +	if (_bkg) { +		_bkg->free();  		delete _bkg; +	}  }  bool PaintControl::onMouseUp(const Common::Point &screenSpacePos, const Common::Point &backgroundImageSpacePos) { diff --git a/engines/zvision/scripting/controls/paint_control.h b/engines/zvision/scripting/controls/paint_control.h index 8097290ac2..8c01f0e68a 100644 --- a/engines/zvision/scripting/controls/paint_control.h +++ b/engines/zvision/scripting/controls/paint_control.h @@ -32,6 +32,7 @@  namespace ZVision { +// Only used in Zork Nemesis, handles the painting puzzle screen in Lucien's room in Irondune (ch4g)  class PaintControl : public Control {  public:  	PaintControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream); diff --git a/engines/zvision/scripting/controls/safe_control.cpp b/engines/zvision/scripting/controls/safe_control.cpp index 71be692431..4d2a91a1ad 100644 --- a/engines/zvision/scripting/controls/safe_control.cpp +++ b/engines/zvision/scripting/controls/safe_control.cpp @@ -49,10 +49,7 @@ SafeControl::SafeControl(ZVision *engine, uint32 key, Common::SeekableReadStream  	_outerRadiusSqr = 0;  	_zeroPointer = 0;  	_startPointer = 0; -	_curFrame = -1;  	_targetFrame = 0; -	_frameTime = 0; -	_lastRenderedFrame = -1;  	// Loop until we find the closing brace  	Common::String line = stream.readLine(); @@ -64,6 +61,7 @@ SafeControl::SafeControl(ZVision *engine, uint32 key, Common::SeekableReadStream  	while (!stream.eos() && !line.contains('}')) {  		if (param.matchString("animation", true)) {  			_animation = _engine->loadAnimation(values); +			_animation->start();  		} else if (param.matchString("rectangle", true)) {  			int x;  			int y; @@ -104,7 +102,9 @@ SafeControl::SafeControl(ZVision *engine, uint32 key, Common::SeekableReadStream  		_engine->getScriptManager()->trimCommentsAndWhiteSpace(&line);  		getParams(line, param, values);  	} -	renderFrame(_curState); + +	if (_animation) +		_animation->seekToFrame(_curState);  }  SafeControl::~SafeControl() { @@ -113,44 +113,22 @@ SafeControl::~SafeControl() {  } -void SafeControl::renderFrame(uint frameNumber) { -	if (frameNumber == 0) { -		_lastRenderedFrame = frameNumber; -	} else if ((int16)frameNumber < _lastRenderedFrame) { -		_lastRenderedFrame = frameNumber; -		frameNumber = (_statesCount * 2) - frameNumber; -	} else { -		_lastRenderedFrame = frameNumber; -	} - -	const Graphics::Surface *frameData; -	int x = _rectangle.left; -	int y = _rectangle.top; - -	_animation->seekToFrame(frameNumber); -	frameData = _animation->decodeNextFrame(); -	if (frameData) -		_engine->getRenderManager()->blitSurfaceToBkg(*frameData, x, y); -} -  bool SafeControl::process(uint32 deltaTimeInMillis) {  	if (_engine->getScriptManager()->getStateFlag(_key) & Puzzle::DISABLED)  		return false; -	if (_curFrame != _targetFrame) { -		_frameTime -= deltaTimeInMillis; - -		if (_frameTime <= 0) { -			if (_curFrame < _targetFrame) { -				_curFrame++; -				renderFrame(_curFrame); -			} else if (_curFrame > _targetFrame) { -				_curFrame--; -				renderFrame(_curFrame); -			} -			_frameTime = 1000.0 / _animation->getDuration().framerate(); -		} +	if (_animation && _animation->getCurFrame() != _targetFrame && _animation->needsUpdate()) { +		// If we're past the target frame, move back one +		if (_animation->getCurFrame() > _targetFrame) +			_animation->seekToFrame(_animation->getCurFrame() - 1); + +		const Graphics::Surface *frameData = _animation->decodeNextFrame(); +		if (_animation->getCurFrame() == _targetFrame) +			_engine->getScriptManager()->setStateValue(_key, _curState); +		if (frameData) +			_engine->getRenderManager()->blitSurfaceToBkg(*frameData, _rectangle.left, _rectangle.top);  	} +  	return false;  } @@ -187,13 +165,12 @@ bool SafeControl::onMouseUp(const Common::Point &screenSpacePos, const Common::P  			int16 tmp2 = (m_state + _curState - _zeroPointer + _statesCount - 1) % _statesCount; -			_curFrame = (_curState + _statesCount - _startPointer) % _statesCount; +			if (_animation) +				_animation->seekToFrame((_curState + _statesCount - _startPointer) % _statesCount);  			_curState = (_statesCount * 2 + tmp2) % _statesCount;  			_targetFrame = (_curState + _statesCount - _startPointer) % _statesCount; - -			_engine->getScriptManager()->setStateValue(_key, _curState);  			return true;  		}  	} diff --git a/engines/zvision/scripting/controls/safe_control.h b/engines/zvision/scripting/controls/safe_control.h index 6e1095e304..3e8c17635c 100644 --- a/engines/zvision/scripting/controls/safe_control.h +++ b/engines/zvision/scripting/controls/safe_control.h @@ -34,6 +34,7 @@ namespace Video {  namespace ZVision { +// Only used in Zork Nemesis, handles the safe in the Asylum (ac4g)  class SafeControl : public Control {  public:  	SafeControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream); @@ -51,19 +52,12 @@ private:  	int32  _outerRadiusSqr;  	int16  _zeroPointer;  	int16  _startPointer; -	int16  _curFrame;  	int16  _targetFrame; -	int32  _frameTime; - -	int16 _lastRenderedFrame;  public:  	bool onMouseUp(const Common::Point &screenSpacePos, const Common::Point &backgroundImageSpacePos);  	bool onMouseMove(const Common::Point &screenSpacePos, const Common::Point &backgroundImageSpacePos);  	bool process(uint32 deltaTimeInMillis); - -private: -	void renderFrame(uint frameNumber);  };  } // End of namespace ZVision diff --git a/engines/zvision/scripting/controls/save_control.cpp b/engines/zvision/scripting/controls/save_control.cpp index b35611feca..2ac77c4776 100644 --- a/engines/zvision/scripting/controls/save_control.cpp +++ b/engines/zvision/scripting/controls/save_control.cpp @@ -29,7 +29,8 @@  #include "zvision/scripting/script_manager.h"  #include "zvision/text/string_manager.h" -#include "zvision/core/save_manager.h" +#include "zvision/file/save_manager.h" +#include "zvision/graphics/render_manager.h"  #include "common/str.h"  #include "common/stream.h" @@ -97,18 +98,16 @@ bool SaveControl::process(uint32 deltaTimeInMillis) {  					if (inp->getText().size() > 0) {  						bool toSave = true;  						if (iter->exist) -							if (!_engine->askQuestion(_engine->getStringManager()->getTextLine(StringManager::ZVISION_STR_SAVEEXIST))) +							if (!_engine->getRenderManager()->askQuestion(_engine->getStringManager()->getTextLine(StringManager::ZVISION_STR_SAVEEXIST)))  								toSave = false;  						if (toSave) { -							// FIXME: At this point, the screen shows the save control, so the save game thumbnails will always -							// show the save control -							_engine->getSaveManager()->saveGameBuffered(iter->saveId, inp->getText()); -							_engine->delayedMessage(_engine->getStringManager()->getTextLine(StringManager::ZVISION_STR_SAVED), 2000); +							_engine->getSaveManager()->saveGame(iter->saveId, inp->getText(), true); +							_engine->getRenderManager()->delayedMessage(_engine->getStringManager()->getTextLine(StringManager::ZVISION_STR_SAVED), 2000);  							_engine->getScriptManager()->changeLocation(_engine->getScriptManager()->getLastMenuLocation());  						}  					} else { -						_engine->timedMessage(_engine->getStringManager()->getTextLine(StringManager::ZVISION_STR_SAVEEMPTY), 2000); +						_engine->getRenderManager()->timedMessage(_engine->getStringManager()->getTextLine(StringManager::ZVISION_STR_SAVEEMPTY), 2000);  					}  				} else {  					_engine->getSaveManager()->loadGame(iter->saveId); diff --git a/engines/zvision/scripting/controls/titler_control.cpp b/engines/zvision/scripting/controls/titler_control.cpp index 10ba0af655..683d6660af 100644 --- a/engines/zvision/scripting/controls/titler_control.cpp +++ b/engines/zvision/scripting/controls/titler_control.cpp @@ -67,20 +67,22 @@ TitlerControl::TitlerControl(ZVision *engine, uint32 key, Common::SeekableReadSt  	if (!_rectangle.isEmpty()) {  		_surface = new Graphics::Surface; -		_surface->create(_rectangle.width(), _rectangle.height(), _engine->_pixelFormat); +		_surface->create(_rectangle.width(), _rectangle.height(), _engine->_resourcePixelFormat);  		_surface->fillRect(Common::Rect(_surface->w, _surface->h), 0);  	}  }  TitlerControl::~TitlerControl() { -	if (_surface) +	if (_surface) { +		_surface->free();  		delete _surface; +	}  }  void TitlerControl::setString(int strLine) {  	if (strLine != _curString && strLine >= 0 && strLine < (int)_strings.size()) {  		_surface->fillRect(Common::Rect(_surface->w, _surface->h), 0); -		_engine->getTextRenderer()->drawTxtInOneLine(_strings[strLine], *_surface); +		_engine->getTextRenderer()->drawTextWithWordWrapping(_strings[strLine], *_surface);  		_engine->getRenderManager()->blitSurfaceToBkg(*_surface, _rectangle.left, _rectangle.top);  		_curString = strLine;  	} diff --git a/engines/zvision/scripting/controls/titler_control.h b/engines/zvision/scripting/controls/titler_control.h index 075e47c9e9..dd96e4a846 100644 --- a/engines/zvision/scripting/controls/titler_control.h +++ b/engines/zvision/scripting/controls/titler_control.h @@ -32,6 +32,7 @@  namespace ZVision { +// Only used in Zork Nemesis, handles the death screen with the Restore/Exit buttons  class TitlerControl : public Control {  public:  	TitlerControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream); | 
