2013-07-03 22:50:40 +00:00
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers , whose names
* are too numerous to list here . Please refer to the COPYRIGHT
* file distributed with this source distribution .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
*/
# include "common/scummsys.h"
# include "common/config-manager.h"
# include "common/debug.h"
# include "common/debug-channels.h"
2013-07-06 06:52:45 +00:00
# include "common/textconsole.h"
2013-07-03 22:50:40 +00:00
# include "common/error.h"
# include "common/system.h"
# include "common/file.h"
# include "engines/util.h"
2013-08-05 04:10:27 +00:00
# include "audio/mixer.h"
2013-07-03 22:50:40 +00:00
# include "zvision/zvision.h"
2013-07-06 06:52:45 +00:00
# include "zvision/console.h"
2013-07-03 22:50:40 +00:00
# include "zvision/script_manager.h"
2013-07-19 16:07:58 +00:00
# include "zvision/render_manager.h"
2013-08-09 23:33:15 +00:00
# include "zvision/cursor_manager.h"
2013-07-03 22:50:40 +00:00
# include "zvision/zfs_archive.h"
2013-07-16 21:52:46 +00:00
# include "zvision/detection.h"
2013-07-03 22:50:40 +00:00
2013-07-06 05:26:01 +00:00
# include "zvision/utility.h"
2013-07-03 22:50:40 +00:00
namespace ZVision {
2013-07-08 21:04:18 +00:00
ZVision : : ZVision ( OSystem * syst , const ZVisionGameDescription * gameDesc )
: Engine ( syst ) ,
_gameDescription ( gameDesc ) ,
2013-08-14 15:25:50 +00:00
_workingWindow ( ( WINDOW_WIDTH - WORKING_WINDOW_WIDTH ) / 2 , ( WINDOW_HEIGHT - WORKING_WINDOW_HEIGHT ) / 2 , ( ( WINDOW_WIDTH - WORKING_WINDOW_WIDTH ) / 2 ) + WORKING_WINDOW_WIDTH , ( ( WINDOW_HEIGHT - WORKING_WINDOW_HEIGHT ) / 2 ) + WORKING_WINDOW_HEIGHT ) ,
2013-08-29 07:04:06 +00:00
_pixelFormat ( 2 , 5 , 6 , 5 , 0 , 11 , 5 , 0 , 0 ) , /*RGB 565*/
2013-08-05 04:54:53 +00:00
_desiredFrameTime ( 33 ) , /* ~30 fps */
_clock ( _system ) {
2013-08-29 07:04:06 +00:00
2013-07-03 22:50:40 +00:00
// Put your engine in a sane state, but do nothing big yet;
// in particular, do not load data from files; rather, if you
// need to do such things, do them from run().
// Do not initialize graphics here
// Here is the right place to set up the engine specific debug channels
//DebugMan.addDebugChannel(kZVisionDebugExample, "example", "this is just an example for a engine specific debug channel");
//DebugMan.addDebugChannel(kZVisionDebugExample2, "example2", "also an example");
// Register random source
_rnd = new Common : : RandomSource ( " zvision " ) ;
// Create managers
2013-07-11 05:26:32 +00:00
_scriptManager = new ScriptManager ( this ) ;
2013-09-07 03:29:19 +00:00
_renderManager = new RenderManager ( _system , WINDOW_WIDTH , WINDOW_HEIGHT , _workingWindow , _pixelFormat ) ;
2013-07-03 22:50:40 +00:00
debug ( " ZVision::ZVision " ) ;
}
2013-08-05 04:10:27 +00:00
2013-07-03 22:50:40 +00:00
ZVision : : ~ ZVision ( ) {
debug ( " ZVision::~ZVision " ) ;
// Dispose of resources
2013-07-06 06:52:45 +00:00
delete _console ;
2013-08-09 23:33:15 +00:00
delete _cursorManager ;
2013-08-05 04:10:27 +00:00
delete _renderManager ;
2013-07-03 22:50:40 +00:00
delete _scriptManager ;
delete _rnd ;
// Remove all of our debug levels
DebugMan . clearAllDebugChannels ( ) ;
}
void ZVision : : initialize ( ) {
2013-08-11 20:08:22 +00:00
const Common : : FSNode gameDataDir ( ConfMan . get ( " path " ) ) ;
// TODO: There are 10 file clashes when we flatten the directories. From a quick look, the files are exactly the same, so it shouldn't matter. But I'm noting it here just in-case it does become a problem.
SearchMan . addSubDirectoryMatching ( gameDataDir , " data1 " , 0 , 4 , true ) ;
SearchMan . addSubDirectoryMatching ( gameDataDir , " data2 " , 0 , 4 , true ) ;
SearchMan . addSubDirectoryMatching ( gameDataDir , " data3 " , 0 , 4 , true ) ;
SearchMan . addSubDirectoryMatching ( gameDataDir , " zassets1 " , 0 , 2 , true ) ;
SearchMan . addSubDirectoryMatching ( gameDataDir , " zassets2 " , 0 , 2 , true ) ;
SearchMan . addSubDirectoryMatching ( gameDataDir , " znemmx " , 0 , 1 , true ) ;
SearchMan . addSubDirectoryMatching ( gameDataDir , " zgi " , 0 , 4 , true ) ;
2013-07-03 22:50:40 +00:00
// Find zfs archive files
Common : : ArchiveMemberList list ;
SearchMan . listMatchingMembers ( list , " *.zfs " ) ;
// Register the file entries within the zfs archives with the SearchMan
for ( Common : : ArchiveMemberList : : iterator iter = list . begin ( ) ; iter ! = list . end ( ) ; + + iter ) {
Common : : String name = ( * iter ) - > getName ( ) ;
2013-08-11 21:44:52 +00:00
Common : : SeekableReadStream * stream = ( * iter ) - > createReadStream ( ) ;
ZfsArchive * archive = new ZfsArchive ( name , stream ) ;
delete stream ;
2013-07-03 22:50:40 +00:00
SearchMan . add ( name , archive ) ;
}
2013-08-14 15:25:50 +00:00
initGraphics ( WINDOW_WIDTH , WINDOW_HEIGHT , true , & _pixelFormat ) ;
2013-07-03 22:50:40 +00:00
2013-08-16 17:17:29 +00:00
// CursorManager must be created after all the directories have been added
_cursorManager = new CursorManager ( this , & _pixelFormat ) ;
2013-08-09 23:33:15 +00:00
_cursorManager - > initialize ( ) ;
2013-08-14 15:46:12 +00:00
_scriptManager - > initialize ( ) ;
2013-07-03 22:50:40 +00:00
// Create debugger console. It requires GFX to be initialized
_console = new Console ( this ) ;
}
Common : : Error ZVision : : run ( ) {
initialize ( ) ;
// Main loop
while ( ! shouldQuit ( ) ) {
2013-08-05 04:54:53 +00:00
_clock . update ( ) ;
uint32 currentTime = _clock . getLastMeasuredTime ( ) ;
2013-08-14 15:46:12 +00:00
uint32 deltaTime = _clock . getDeltaTime ( ) ;
2013-08-05 04:10:27 +00:00
processEvents ( ) ;
2013-07-08 21:08:16 +00:00
2013-08-20 04:55:36 +00:00
// Call _renderManager->update() first so the background renders
// before anything that puzzles/controls will render
2013-08-14 15:46:12 +00:00
_renderManager - > update ( deltaTime ) ;
2013-08-20 04:55:36 +00:00
_scriptManager - > update ( deltaTime ) ;
2013-07-24 16:33:58 +00:00
2013-09-07 03:29:19 +00:00
// Render the backBuffer to the screen
_renderManager - > renderBackbufferToScreen ( ) ;
2013-08-09 17:16:43 +00:00
// Update the screen
_system - > updateScreen ( ) ;
2013-07-24 16:33:58 +00:00
// Calculate the frame delay based off a desired frame time
2013-08-06 00:07:55 +00:00
int delay = _desiredFrameTime - int32 ( _system - > getMillis ( ) - currentTime ) ;
2013-07-03 22:50:40 +00:00
// Ensure non-negative
delay = delay < 0 ? 0 : delay ;
_system - > delayMillis ( delay ) ;
}
return Common : : kNoError ;
}
2013-08-05 04:55:36 +00:00
void ZVision : : pauseEngineIntern ( bool pause ) {
_mixer - > pauseAll ( pause ) ;
if ( pause ) {
_clock . stop ( ) ;
} else {
_clock . start ( ) ;
}
}
2013-09-04 05:12:41 +00:00
Common : : String ZVision : : generateSaveFileName ( uint slot ) {
return Common : : String : : format ( " %s.%02u " , _targetName . c_str ( ) , slot ) ;
2013-07-03 22:50:40 +00:00
}
2013-09-04 05:12:41 +00:00
Common : : String ZVision : : generateAutoSaveFileName ( ) {
return Common : : String : : format ( " %s.auto " , _targetName . c_str ( ) ) ;
2013-07-13 16:34:28 +00:00
}
2013-07-03 22:50:40 +00:00
} // End of namespace ZVision