diff options
| -rw-r--r-- | engines/titanic/core/game_object.cpp | 4 | ||||
| -rw-r--r-- | engines/titanic/core/game_object.h | 2 | ||||
| -rw-r--r-- | engines/titanic/direct_draw.cpp | 20 | ||||
| -rw-r--r-- | engines/titanic/direct_draw.h | 26 | ||||
| -rw-r--r-- | engines/titanic/game_location.cpp | 21 | ||||
| -rw-r--r-- | engines/titanic/game_location.h | 5 | ||||
| -rw-r--r-- | engines/titanic/screen_manager.cpp | 8 | ||||
| -rw-r--r-- | engines/titanic/screen_manager.h | 24 | ||||
| -rw-r--r-- | engines/titanic/true_talk/tt_named_script.cpp | 1 | ||||
| -rw-r--r-- | engines/titanic/video_surface.cpp | 37 | ||||
| -rw-r--r-- | engines/titanic/video_surface.h | 36 | 
11 files changed, 166 insertions, 18 deletions
diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp index 3238258a61..f5e9806365 100644 --- a/engines/titanic/core/game_object.cpp +++ b/engines/titanic/core/game_object.cpp @@ -118,4 +118,8 @@ void CGameObject::load(SimpleFile *file) {  	CNamedItem::load(file);  } +void CGameObject::fn2() { +	error("TODO"); +} +  } // End of namespace Titanic diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h index 3809ae38d0..c284fb4ebe 100644 --- a/engines/titanic/core/game_object.h +++ b/engines/titanic/core/game_object.h @@ -71,6 +71,8 @@ public:  	 * Load the data for the class from file  	 */  	virtual void load(SimpleFile *file); + +	void fn2();  };  } // End of namespace Titanic diff --git a/engines/titanic/direct_draw.cpp b/engines/titanic/direct_draw.cpp index d503938fe4..9691ea91f4 100644 --- a/engines/titanic/direct_draw.cpp +++ b/engines/titanic/direct_draw.cpp @@ -22,6 +22,7 @@  #include "common/debug.h"  #include "engines/util.h" +#include "graphics/pixelformat.h"  #include "titanic/titanic.h"  #include "titanic/direct_draw.h" @@ -48,6 +49,13 @@ void DirectDraw::diagnostics() {  	debugC(ERROR_BASIC, kDebugGraphics, "Running DirectDraw Diagnostic...");  } +DirectDrawSurface *DirectDraw::createSurfaceFromDesc(const DDSurfaceDesc &desc) { +	DirectDrawSurface *surface = new DirectDrawSurface(); +	surface->create(desc._w, desc._h, Graphics::PixelFormat::createFormatCLUT8()); + +	return surface; +} +  /*------------------------------------------------------------------------*/  DirectDrawManager::DirectDrawManager(TitanicEngine *vm, int v) : _directDraw(vm) { @@ -87,12 +95,20 @@ void DirectDrawManager::initSurface() {  	_directDraw.setDisplayMode(_directDraw._width, _directDraw._height,  		_directDraw._bpp, 0); -	_mainSurface = new Graphics::Surface(); +	_mainSurface = new DirectDrawSurface();  	_mainSurface->create(_directDraw._width, _directDraw._height,  		Graphics::PixelFormat::createFormatCLUT8()); -	_backSurfaces[0] = new Graphics::Surface(); +	_backSurfaces[0] = new DirectDrawSurface();  	_backSurfaces[0]->create(_directDraw._width, _directDraw._height,  		Graphics::PixelFormat::createFormatCLUT8());  } +DirectDrawSurface *DirectDrawManager::createSurface(int w, int h, int surfaceNum) { +	if (surfaceNum) +		return nullptr; + +	assert(_mainSurface); +	return _directDraw.createSurfaceFromDesc(DDSurfaceDesc(w, h)); +} +  } // End of namespace Titanic diff --git a/engines/titanic/direct_draw.h b/engines/titanic/direct_draw.h index cb49efa513..728094e7f7 100644 --- a/engines/titanic/direct_draw.h +++ b/engines/titanic/direct_draw.h @@ -31,6 +31,18 @@ namespace Titanic {  class TitanicEngine; +struct DDSurfaceDesc { +	int _w; +	int _h; +	int _flags; +	int _caps; + +	DDSurfaceDesc(int w, int h) : _w(w), _h(h), _flags(0x1006), _caps(64) {} +}; + +class DirectDrawSurface : public Graphics::Surface { +}; +  class DirectDraw {  private:  	TitanicEngine *_vm; @@ -54,13 +66,18 @@ public:  	 * Logs diagnostic information  	 */  	void diagnostics(); + +	/** +	 * Create a surface from a passed description record +	 */ +	DirectDrawSurface *createSurfaceFromDesc(const DDSurfaceDesc &desc);  };  class DirectDrawManager {  public:  	DirectDraw _directDraw; -	Graphics::Surface *_mainSurface; -	Graphics::Surface *_backSurfaces[2]; +	DirectDrawSurface *_mainSurface; +	DirectDrawSurface *_backSurfaces[2];  public:  	DirectDrawManager(TitanicEngine *vm, int v); @@ -83,6 +100,11 @@ public:  	 * Initializes the surface for the screen  	 */  	void initSurface(); + +	/** +	 * Create a surface +	 */ +	DirectDrawSurface *createSurface(int w, int h, int surfaceNum);  };  } // End of namespace Titanic diff --git a/engines/titanic/game_location.cpp b/engines/titanic/game_location.cpp index 5f87d3bc67..2a01bbf248 100644 --- a/engines/titanic/game_location.cpp +++ b/engines/titanic/game_location.cpp @@ -23,6 +23,7 @@  #include "titanic/game_location.h"  #include "titanic/game_manager.h"  #include "titanic/game_state.h" +#include "titanic/core/game_object.h"  #include "titanic/core/project_item.h"  namespace Titanic { @@ -49,6 +50,26 @@ void CGameLocation::load(SimpleFile *file) {  	_viewNumber = file->readNumber();  } +void CGameLocation::setView(CViewItem *view) { +	if (_view) { +		for (CTreeItem *treeItem = view; treeItem;  +				treeItem = treeItem->scan(_view)) { +			CGameObject *obj = dynamic_cast<CGameObject *>(treeItem); +			if (obj) +				obj->fn2(); +		} +	} + +	_view = view; +	if (_view) { +		_viewNumber = _view->_viewNumber; +		_nodeNumber = _view->findNode()->_nodeNumber; +		_roomNumber = _view->findRoom()->_roomNumber; +	} else { +		_viewNumber = _nodeNumber = _roomNumber = -1; +	} +} +  CViewItem *CGameLocation::getView() {  	if (!_view) {  		CGameManager *gm = _gameState->_gameManager; diff --git a/engines/titanic/game_location.h b/engines/titanic/game_location.h index 94cea799e8..a64a82403b 100644 --- a/engines/titanic/game_location.h +++ b/engines/titanic/game_location.h @@ -54,6 +54,11 @@ public:  	void load(SimpleFile *file);  	/** +	 * Set the current view +	 */ +	void setView(CViewItem *view); + +	/**  	 * Get the current view  	 */  	CViewItem *getView(); diff --git a/engines/titanic/screen_manager.cpp b/engines/titanic/screen_manager.cpp index 47e5d3d49a..ebde0e0a6c 100644 --- a/engines/titanic/screen_manager.cpp +++ b/engines/titanic/screen_manager.cpp @@ -126,8 +126,12 @@ void OSScreenManager::proc20() {}  void OSScreenManager::proc21() {}  CVideoSurface *OSScreenManager::createSurface(int w, int h) { -	warning("TODO"); -	return nullptr; +	DirectDrawSurface *ddSurface = _directDrawManager.createSurface(w, h, 0); +	return new OSVideoSurface(this, ddSurface); +} + +CVideoSurface *OSScreenManager::createSurface(const CResourceKey &key) { +	return new OSVideoSurface(this, key);  }  void OSScreenManager::proc23() {} diff --git a/engines/titanic/screen_manager.h b/engines/titanic/screen_manager.h index d0bcc5dbd8..0fd6bfad8b 100644 --- a/engines/titanic/screen_manager.h +++ b/engines/titanic/screen_manager.h @@ -29,6 +29,7 @@  #include "titanic/font.h"  #include "titanic/input_handler.h"  #include "titanic/video_surface.h" +#include "titanic/core/resource_key.h"  namespace Titanic { @@ -78,6 +79,8 @@ public:  	void fn1() {}  	void fn2() {} + +  	virtual void setWindowHandle(int v);  	virtual bool resetWindowHandle(int v);  	virtual void setMode(int width, int height, int bpp, uint numBackSurfaces, bool flag2) = 0; @@ -98,8 +101,17 @@ public:  	virtual void proc19() = 0;  	virtual void proc20() = 0;  	virtual void proc21() = 0; + +	/** +	 * Creates a surface of a given size +	 */  	virtual CVideoSurface *createSurface(int w, int h) = 0; -	virtual void proc23() = 0; +	 +	/** +	 * Creates a surface from a specified resource +	 */ +	virtual CVideoSurface *createSurface(const CResourceKey &key) = 0; +	  	virtual void proc24() = 0;  	virtual void proc25() = 0;  	virtual void showCursor() = 0; @@ -147,7 +159,17 @@ public:  	virtual void proc19();  	virtual void proc20();  	virtual void proc21(); + +	/** +	 * Creates a surface of a given size +	 */  	virtual CVideoSurface *createSurface(int w, int h); +	 +	/** +	 * Creates a surface from a specified resource +	 */ +	virtual CVideoSurface *createSurface(const CResourceKey &key); +  	virtual void proc23();  	virtual void proc24();  	virtual void proc25(); diff --git a/engines/titanic/true_talk/tt_named_script.cpp b/engines/titanic/true_talk/tt_named_script.cpp index 89adb16702..7f4bb5b201 100644 --- a/engines/titanic/true_talk/tt_named_script.cpp +++ b/engines/titanic/true_talk/tt_named_script.cpp @@ -93,6 +93,7 @@ int TTNamedScript::proc12() const {  bool TTNamedScript::proc13() const {  	warning("TODO"); +	return true;  }  void TTNamedScript::proc14(int v) { diff --git a/engines/titanic/video_surface.cpp b/engines/titanic/video_surface.cpp index d03e2f4525..780ea2bc9e 100644 --- a/engines/titanic/video_surface.cpp +++ b/engines/titanic/video_surface.cpp @@ -24,19 +24,46 @@  namespace Titanic { -CVideoSurface::CVideoSurface(CScreenManager *screenManager, Graphics::Surface *surface): -			_screenManager(screenManager), _surface(surface) { +int CVideoSurface::_videoSurfaceCounter = 0; + +CVideoSurface::CVideoSurface(CScreenManager *screenManager) : +		_screenManager(screenManager), _field2C(0), +		_field34(0), _field38(0), _field3C(0), _field40(0), +		_field44(4), _field48(0), _field50(1) { +	_videoSurfaceNum = _videoSurfaceCounter++;  } -void CVideoSurface::setSurface(CScreenManager *screenManager, Graphics::Surface *surface) { +void CVideoSurface::setSurface(CScreenManager *screenManager, DirectDrawSurface *surface) {  	_screenManager = screenManager;  	_surface = surface;  }  /*------------------------------------------------------------------------*/ -OSVideoSurface::OSVideoSurface(CScreenManager *screenManager, Graphics::Surface *surface): -		CVideoSurface(screenManager, surface) { +OSVideoSurface::OSVideoSurface(CScreenManager *screenManager, DirectDrawSurface *surface) : +		CVideoSurface(screenManager) { +	_surface = surface; +} + +OSVideoSurface::OSVideoSurface(CScreenManager *screenManager, const CResourceKey &key, bool flag) : +		CVideoSurface(screenManager) { +	_surface = nullptr; +	_field38 = flag; +	 +	if (_field38) { +		proc8(key); +	} else { +		_resourceKey = key; +		proc43(); +	} +} + +void OSVideoSurface::proc8(const CResourceKey &key) { +	warning("TODO"); +} + +void OSVideoSurface::proc43() { +	warning("TODO");  }  } // End of namespace Titanic diff --git a/engines/titanic/video_surface.h b/engines/titanic/video_surface.h index 978eacfbbe..04d9fa8c58 100644 --- a/engines/titanic/video_surface.h +++ b/engines/titanic/video_surface.h @@ -25,26 +25,50 @@  #include "common/scummsys.h"  #include "common/array.h" -#include "graphics/surface.h"  #include "titanic/font.h" +#include "titanic/direct_draw.h" +#include "titanic/core/list.h" +#include "titanic/core/resource_key.h"  namespace Titanic {  class CScreenManager; -class CVideoSurface { +class CVideoSurface : public ListItem {  private: +	static int _videoSurfaceCounter; +protected:  	CScreenManager *_screenManager; -	Graphics::Surface *_surface; +	CResourceKey _resourceKey; +	DirectDrawSurface *_surface; +	int _field2C; +	int _field34; +	bool _field38; +	int _field3C; +	int _field40; +	int _field44; +	int _field48; +	int _videoSurfaceNum; +	int _field50; +	int _accessCtr;  public: -	CVideoSurface(CScreenManager *screenManager, Graphics::Surface *surface); +	CVideoSurface(CScreenManager *screenManager); -	void setSurface(CScreenManager *screenManager, Graphics::Surface *surface); +	void setSurface(CScreenManager *screenManager, DirectDrawSurface *surface); + +	virtual void proc8(const CResourceKey &key) = 0; + +	virtual void proc43() = 0;  };  class OSVideoSurface : public CVideoSurface {  public: -	OSVideoSurface(CScreenManager *screenManager, Graphics::Surface *surface); +	OSVideoSurface(CScreenManager *screenManager, DirectDrawSurface *surface); +	OSVideoSurface(CScreenManager *screenManager, const CResourceKey &key, bool flag = false); + +	virtual void proc8(const CResourceKey &key); + +	virtual void proc43();  };  } // End of namespace Titanic  | 
