2014-10-06 14:50:05 +02: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 .
*
*/
/*
* This code is based on Labyrinth of Time code with assistance of
*
* Copyright ( c ) 1993 Terra Nova Development
* Copyright ( c ) 2004 The Wyrmkeep Entertainment Co .
*
*/
# include "common/debug-channels.h"
2015-12-08 21:10:54 +01:00
# include "common/error.h"
2014-10-06 14:50:05 +02:00
# include "engines/util.h"
2015-02-25 03:13:26 +02:00
# include "gui/message.h"
2014-10-06 14:50:05 +02:00
# include "lab/lab.h"
2015-12-08 21:10:54 +01:00
2015-12-08 21:35:31 +01:00
# include "lab/anim.h"
2015-12-23 01:34:16 +02:00
# include "lab/console.h"
2015-12-08 21:19:41 +01:00
# include "lab/dispman.h"
# include "lab/eventman.h"
2015-12-08 20:46:13 +01:00
# include "lab/image.h"
2015-12-08 21:19:41 +01:00
# include "lab/music.h"
2015-12-08 21:47:36 +01:00
# include "lab/processroom.h"
2015-12-08 21:10:54 +01:00
# include "lab/resource.h"
2015-12-27 01:42:20 +02:00
# include "lab/speciallocks.h"
2015-12-08 21:00:50 +01:00
# include "lab/utils.h"
2014-12-27 12:23:20 +01:00
2014-10-06 14:50:05 +02:00
namespace Lab {
2014-12-27 12:23:20 +01:00
LabEngine : : LabEngine ( OSystem * syst , const ADGameDescription * gameDesc )
2015-12-14 12:40:19 +01:00
: Engine ( syst ) , _gameDescription ( gameDesc ) , _extraGameFeatures ( 0 ) {
2015-12-04 13:32:08 +01:00
_lastWaitTOFTicks = 0 ;
2015-11-24 23:59:30 +01:00
2015-11-30 00:12:01 +01:00
_isHiRes = false ;
2015-11-30 01:42:12 +01:00
_roomNum = - 1 ;
2015-11-30 07:13:09 +01:00
for ( int i = 0 ; i < MAX_CRUMBS ; i + + ) {
_breadCrumbs [ i ] . _roomNum = 0 ;
2015-12-23 22:59:59 +02:00
_breadCrumbs [ i ] . _direction = kDirectionNorth ;
2015-11-30 07:13:09 +01:00
}
_numCrumbs = 0 ;
_droppingCrumbs = false ;
_followingCrumbs = false ;
_followCrumbsFast = false ;
_isCrumbTurning = false ;
_isCrumbWaiting = false ;
2015-12-06 17:24:25 +01:00
_noUpdateDiff = false ;
_quitLab = false ;
2015-12-06 21:39:41 +01:00
_mainDisplay = true ;
2015-12-06 17:24:25 +01:00
_numInv = 0 ;
_manyRooms = 0 ;
_direction = 0 ;
_highestCondition = 0 ;
2015-12-13 20:27:34 +02:00
_crumbTimestamp = 0 ;
2015-12-09 18:09:46 +01:00
_maxRooms = 0 ;
2015-11-30 00:34:43 +01:00
_event = nullptr ;
_resource = nullptr ;
2015-11-30 01:17:05 +01:00
_music = nullptr ;
2015-12-01 20:10:42 +01:00
_anim = nullptr ;
2015-12-24 07:47:46 +01:00
_closeDataPtr = nullptr ;
_conditions = nullptr ;
2015-12-04 13:32:08 +01:00
_graphics = nullptr ;
2015-12-06 21:39:41 +01:00
_rooms = nullptr ;
2015-12-24 07:47:46 +01:00
_roomsFound = nullptr ;
2015-12-27 01:42:20 +02:00
_specialLocks = nullptr ;
2015-12-07 17:46:37 +01:00
_utils = nullptr ;
2015-12-23 01:34:16 +02:00
_console = nullptr ;
2015-12-13 22:55:10 +01:00
_journalBackImage = nullptr ;
2015-11-30 00:34:43 +01:00
2015-12-04 13:32:08 +01:00
_lastTooLong = false ;
2015-12-03 01:06:04 +01:00
_interfaceOff = false ;
_alternate = false ;
for ( int i = 0 ; i < 20 ; i + + )
2015-12-03 02:06:39 +01:00
_moveImages [ i ] = nullptr ;
2015-12-02 20:32:06 +01:00
2015-12-13 22:51:23 +01:00
for ( int i = 0 ; i < 10 ; i + + )
2015-12-03 02:06:39 +01:00
_invImages [ i ] = nullptr ;
2015-12-03 01:06:04 +01:00
2015-12-04 13:32:08 +01:00
_curFileName = " " ;
2015-12-06 17:24:25 +01:00
_msgFont = nullptr ;
_inventory = nullptr ;
2015-12-03 19:49:55 +01:00
2015-12-09 18:09:46 +01:00
_imgMap = nullptr ;
_imgRoom = nullptr ;
_imgUpArrowRoom = nullptr ;
_imgDownArrowRoom = nullptr ;
_imgBridge = nullptr ;
_imgHRoom = nullptr ;
_imgVRoom = nullptr ;
_imgMaze = nullptr ;
_imgHugeMaze = nullptr ;
_imgPath = nullptr ;
2015-12-13 20:29:58 +02:00
for ( int i = 0 ; i < 4 ; i + + )
_imgMapX [ i ] = nullptr ;
2015-12-09 18:09:46 +01:00
_maps = nullptr ;
2015-12-13 11:55:49 +01:00
_blankJournal = nullptr ;
_journalFont = nullptr ;
_journalPage = 0 ;
_lastPage = false ;
_monitorPage = 0 ;
_monitorTextFilename = " " ;
_monitorButton = nullptr ;
2015-12-13 19:36:56 +02:00
_monitorButtonHeight = 1 ;
2015-12-13 11:55:49 +01:00
for ( int i = 0 ; i < 20 ; i + + )
_highPalette [ i ] = 0 ;
2015-07-17 10:52:30 +03:00
//const Common::FSNode gameDataDir(ConfMan.get("path"));
//SearchMan.addSubDirectoryMatching(gameDataDir, "game");
//SearchMan.addSubDirectoryMatching(gameDataDir, "game/pict");
//SearchMan.addSubDirectoryMatching(gameDataDir, "game/spict");
//SearchMan.addSubDirectoryMatching(gameDataDir, "music");
2014-10-06 14:50:05 +02:00
}
LabEngine : : ~ LabEngine ( ) {
// Remove all of our debug levels here
DebugMan . clearAllDebugChannels ( ) ;
2015-11-30 00:34:43 +01:00
2015-12-13 20:28:35 +02:00
freeMapData ( ) ;
2015-12-19 02:12:42 +02:00
delete [ ] _rooms ;
2015-12-21 08:06:14 +01:00
delete [ ] _inventory ;
2015-12-19 02:12:42 +02:00
2015-12-21 08:06:14 +01:00
delete _conditions ;
delete _roomsFound ;
2015-11-30 00:34:43 +01:00
delete _event ;
delete _resource ;
2015-11-30 01:17:05 +01:00
delete _music ;
2015-12-01 20:10:42 +01:00
delete _anim ;
2015-12-04 13:32:08 +01:00
delete _graphics ;
2015-12-27 01:42:20 +02:00
delete _specialLocks ;
2015-12-07 17:46:37 +01:00
delete _utils ;
2015-12-23 01:34:16 +02:00
delete _console ;
2015-12-13 22:55:10 +01:00
delete _journalBackImage ;
2014-10-06 14:50:05 +02:00
}
Common : : Error LabEngine : : run ( ) {
2014-12-27 14:18:40 +01:00
if ( getFeatures ( ) & GF_LOWRES )
initGraphics ( 320 , 200 , false ) ;
else
initGraphics ( 640 , 480 , true ) ;
2014-10-06 14:50:05 +02:00
2015-11-29 18:10:06 +01:00
_event = new EventManager ( this ) ;
2015-11-30 00:34:43 +01:00
_resource = new Resource ( this ) ;
2015-11-30 01:17:05 +01:00
_music = new Music ( this ) ;
2015-12-04 13:32:08 +01:00
_graphics = new DisplayMan ( this ) ;
2015-12-07 11:16:49 +02:00
_anim = new Anim ( this ) ;
2015-12-27 01:42:20 +02:00
_specialLocks = new SpecialLocks ( this ) ;
2015-12-07 17:46:37 +01:00
_utils = new Utils ( this ) ;
2015-12-23 01:34:16 +02:00
_console = new Console ( this ) ;
2015-12-13 22:55:10 +01:00
_journalBackImage = new Image ( this ) ;
2014-10-06 14:50:05 +02:00
2015-02-25 03:13:26 +02:00
if ( getPlatform ( ) = = Common : : kPlatformWindows ) {
// Check if this is the Wyrmkeep trial
Common : : File roomFile ;
bool knownVersion = true ;
bool roomFileOpened = roomFile . open ( " game/rooms/48 " ) ;
if ( ! roomFileOpened )
knownVersion = false ;
else if ( roomFile . size ( ) ! = 892 )
knownVersion = false ;
else {
roomFile . seek ( 352 ) ;
byte checkByte = roomFile . readByte ( ) ;
if ( checkByte = = 0x00 ) {
// Full Windows version
} else if ( checkByte = = 0x80 ) {
// Wyrmkeep trial version
_extraGameFeatures = GF_WINDOWS_TRIAL ;
GUI : : MessageDialog trialMessage ( " This is a trial Windows version of the game. To play the full version, you will need to use the original interpreter and purchase a key from Wyrmkeep " ) ;
trialMessage . runModal ( ) ;
} else {
knownVersion = false ;
}
2015-11-23 17:34:02 +01:00
2015-02-25 03:13:26 +02:00
roomFile . close ( ) ;
if ( ! knownVersion ) {
warning ( " Unknown Windows version found, please report this version to the ScummVM team " ) ;
return Common : : kNoGameDataFoundError ;
}
}
}
2014-12-27 14:18:40 +01:00
go ( ) ;
2014-10-06 14:50:05 +02:00
return Common : : kNoError ;
}
2015-02-19 15:20:05 +02:00
Common : : String LabEngine : : generateSaveFileName ( uint slot ) {
return Common : : String : : format ( " %s.%03u " , _targetName . c_str ( ) , slot ) ;
}
2015-12-06 14:36:49 +01:00
void LabEngine : : drawStaticMessage ( byte index ) {
2015-12-23 04:19:59 +02:00
_graphics - > drawMessage ( _resource - > getStaticText ( ( StaticText ) index ) , false ) ;
2015-12-06 14:36:49 +01:00
}
2015-12-06 14:49:50 +01:00
void LabEngine : : changeVolume ( int delta ) {
2015-12-26 13:03:26 +02:00
int sfxPrev = _mixer - > getVolumeForSoundType ( Audio : : Mixer : : kSFXSoundType ) ;
int musicPrev = _mixer - > getVolumeForSoundType ( Audio : : Mixer : : kMusicSoundType ) ;
int sfxNew = ( delta > 0 ) ? MIN < int > ( sfxPrev + 10 , Audio : : Mixer : : kMaxMixerVolume ) : MAX < int > ( sfxPrev - 10 , 0 ) ;
int musicNew = ( delta > 0 ) ? MIN < int > ( musicPrev + 10 , Audio : : Mixer : : kMaxMixerVolume ) : MAX < int > ( musicPrev - 10 , 0 ) ;
_mixer - > setVolumeForSoundType ( Audio : : Mixer : : kSFXSoundType , sfxNew ) ;
_mixer - > setVolumeForSoundType ( Audio : : Mixer : : kMusicSoundType , musicNew ) ;
2015-12-06 14:49:50 +01:00
}
void LabEngine : : waitTOF ( ) {
2015-12-23 18:56:35 +01:00
_system - > copyRectToScreen ( _graphics - > _displayBuffer , _graphics - > _screenWidth , 0 , 0 , _graphics - > _screenWidth , _graphics - > _screenHeight ) ;
_system - > updateScreen ( ) ;
2015-12-06 14:49:50 +01:00
_event - > processInput ( ) ;
uint32 now ;
2015-12-23 18:56:35 +01:00
for ( now = _system - > getMillis ( ) ; now - _lastWaitTOFTicks < = 0xF ; now = _system - > getMillis ( ) )
_system - > delayMillis ( _lastWaitTOFTicks - now + 17 ) ;
2015-12-06 14:49:50 +01:00
_lastWaitTOFTicks = now ;
}
2015-12-19 12:48:12 +02:00
2015-12-22 19:40:34 +01:00
void LabEngine : : updateMusicAndEvents ( ) {
_event - > processInput ( ) ;
_event - > updateMouse ( ) ;
_music - > updateMusic ( ) ;
}
2014-10-06 14:50:05 +02:00
} // End of namespace Lab