diff options
Diffstat (limited to 'saga/gamedesc.cpp')
-rw-r--r-- | saga/gamedesc.cpp | 474 |
1 files changed, 474 insertions, 0 deletions
diff --git a/saga/gamedesc.cpp b/saga/gamedesc.cpp new file mode 100644 index 0000000000..b731768425 --- /dev/null +++ b/saga/gamedesc.cpp @@ -0,0 +1,474 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2003 The ScummVM project + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "stdafx.h" + +#include "common/scummsys.h" +#include "base/engine.h" +#include "common/util.h" +#include "common/file.h" + +#include "resfile.h" +#include "resnames.h" +#include "gamedesc.h" +#include "gamedesc_priv.h" + +using namespace SagaGameDesc; + +/*--------------------------------------------------------------------------*\ + * Inherit the Earth - Demo version +\*--------------------------------------------------------------------------*/ + +R_GAME_FILEDESC ITEDEMO_GameFiles[] = { + + { "ITE.RSC", R_GAME_RESOURCEFILE }, + { "ITE.DMO", R_GAME_DEMOFILE }, + { "SCRIPTS.RSC", R_GAME_SCRIPTFILE }, + { "VOICES.RSC", R_GAME_SOUNDFILE | R_GAME_VOICEFILE } +}; + +R_GAME_FONTDESC ITEDEMO_GameFonts[] = { + + { R_GAME_FONT_SMALL, 0 }, + { R_GAME_FONT_MEDIUM, 1 } +}; + +R_GAME_SOUNDINFO ITEDEMO_GameSound = { + + R_GAME_SOUND_VOC +}; + +/*--------------------------------------------------------------------------*\ + * Inherit the Earth - Diskette version +\*--------------------------------------------------------------------------*/ + +R_GAME_FILEDESC ITEDISK_GameFiles[] = { + + { "ITE.RSC", R_GAME_RESOURCEFILE }, + { "SCRIPTS.RSC", R_GAME_SCRIPTFILE }, + { "VOICES.RSC", R_GAME_SOUNDFILE | R_GAME_VOICEFILE } +}; + +R_GAME_FONTDESC ITEDISK_GameFonts[] = { + + { R_GAME_FONT_MEDIUM, 0 }, + { R_GAME_FONT_LARGE, 1 }, + { R_GAME_FONT_SMALL, 2 } +}; + +R_GAME_DISPLAYINFO ITE_DisplayInfo = { + + 320, 200, /* Logical width and height */ + 137, /* Scene playfield height */ + 0, 0 /* Overlay palette start index and length */ +}; + +R_GAME_RESOURCEINFO ITE_Resources = +{ + ITE_SCENE_LUT, /* Scene lookup table RN */ + ITE_SCRIPT_LUT, /* Script lookup table RN */ + + ITE_OVERLAY_PAL, /* Overlay palette RN */ + + ITE_COMMAND_PANEL, + ITE_COMMAND_BUTTONSPRITES, + + ITE_DIALOGUE_PANEL, + ITE_DEFAULT_PORTRAITS, + + ITE_ACTOR_PERSONA_TBL +}; + +R_GAME_SOUNDINFO ITE_GameSound = { + + R_GAME_SOUND_VOC +}; + +/*--------------------------------------------------------------------------*\ + * Inherit the Earth - CD Enhanced version +\*--------------------------------------------------------------------------*/ + +R_GAME_FILEDESC ITECD_GameFiles[] = { + + { "ITE.RSC", R_GAME_RESOURCEFILE }, + { "SCRIPTS.RSC", R_GAME_SCRIPTFILE }, + { "SOUNDS.RSC", R_GAME_SOUNDFILE }, + { "VOICES.RSC", R_GAME_VOICEFILE } +}; + +R_GAME_FONTDESC ITECD_GameFonts[] = { + + { R_GAME_FONT_MEDIUM, 0 }, + { R_GAME_FONT_LARGE, 1 }, + { R_GAME_FONT_SMALL, 2 } +}; + +R_GAME_SOUNDINFO ITECD_GameSound = { + + R_GAME_SOUND_PCM, + 22050, + 16, + 0 +}; + +/*--------------------------------------------------------------------------*\ + * I Have No Mouth and I Must Scream - Demo version +\*--------------------------------------------------------------------------*/ + +R_GAME_FILEDESC IHNMDEMO_GameFiles[] = { + + { "SCREAM.RES", R_GAME_RESOURCEFILE }, + { "SCRIPTS.RES", R_GAME_SCRIPTFILE }, + { "SFX.RES", R_GAME_SOUNDFILE }, + { "VOICESD.RES", R_GAME_VOICEFILE } +}; + +/*--------------------------------------------------------------------------*\ + * I Have No Mouth and I Must Scream - Retail CD version +\*--------------------------------------------------------------------------*/ + +R_GAME_FILEDESC IHNMCD_GameFiles[] = { + + { "MUSICFM.RES", R_GAME_MUSICFILE }, + { "MUSICGM.RES", R_GAME_MUSICFILE }, + { "SCREAM.RES", R_GAME_RESOURCEFILE }, + { "SCRIPTS.RES", R_GAME_SCRIPTFILE }, + { "SFX.RES", R_GAME_SOUNDFILE }, + { "VOICES1.RES", R_GAME_VOICEFILE }, + { "VOICES2.RES", R_GAME_VOICEFILE }, + { "VOICES3.RES", R_GAME_VOICEFILE }, + { "VOICES4.RES", R_GAME_VOICEFILE }, + { "VOICES5.RES", R_GAME_VOICEFILE }, + { "VOICES6.RES", R_GAME_VOICEFILE }, + { "VOICESS.RES", R_GAME_VOICEFILE } +}; + +R_GAME_FONTDESC IHNMCD_GameFonts[] = { + + { R_GAME_FONT_MEDIUM, 2 }, + { R_GAME_FONT_LARGE, 3 }, + { R_GAME_FONT_SMALL, 4 }, + { R_GAME_FONT_SMALL2, 5 }, + { R_GAME_FONT_MEDIUM2, 6 }, + { R_GAME_FONT_LARGE2, 7 }, + { R_GAME_FONT_LARGE3, 8 } +}; + +R_GAME_DISPLAYINFO IHNM_DisplayInfo = { + + 640, 480, /* Logical width and height */ + 304, /* Scene playfield height */ + 248, 255 /* Overlay palette start index and length */ +}; + +R_GAME_RESOURCEINFO IHNM_Resources[] = +{ + IHNM_SCENE_LUT, /* Scene lookup table RN */ + IHNM_SCRIPT_LUT, /* Script lookup table RN */ + + IHNM_OVERLAY_PAL, /* Overlay palette RN */ + + IHNM_COMMAND_PANEL, + IHNM_COMMAND_BUTTONSPRITES, + + IHNM_DIALOGUE_PANEL, + IHNM_DEFAULT_PORTRAITS, + + IHNM_ACTOR_PERSONA_TBL +}; + + +R_GAME_SOUNDINFO IHNM_GameSound = { + + R_GAME_SOUND_WAV +}; + +R_GAMEDESC GameDescs[] = { + + /* Inherit the earth - Demo version + \*-------------------------------------------------------------*/ + { + R_GAMETYPE_ITE, + R_GAME_ITE_DEMO, /* Game id */ + "Inherit the Earth - Demo version", /* Game title */ + + &ITE_DisplayInfo, + + ITE_DEFAULT_SCENE, /* Starting scene number */ + + &ITE_Resources, + + ARRAYSIZE( ITEDEMO_GameFiles ), /* Game datafiles */ + ITEDEMO_GameFiles, + + ARRAYSIZE( ITEDEMO_GameFonts ), + ITEDEMO_GameFonts, + + &ITEDEMO_GameSound, + + 0 /* Game supported flag */ + }, + + /* Inherit the earth - Disk version + \*-------------------------------------------------------------*/ + { + R_GAMETYPE_ITE, + R_GAME_ITE_DISK, + "Inherit the Earth - Disk version", + + &ITE_DisplayInfo, + + ITE_DEFAULT_SCENE, + + &ITE_Resources, + + ARRAYSIZE( ITEDISK_GameFiles ), + ITEDISK_GameFiles, + + ARRAYSIZE( ITEDISK_GameFonts ), + ITEDISK_GameFonts, + + &ITE_GameSound, + + 1 + }, + + /* Inherit the earth - CD version + \*-------------------------------------------------------------*/ + { + R_GAMETYPE_ITE, + R_GAME_ITE_CD, + "Inherit the Earth - CD version", + + &ITE_DisplayInfo, + + ITE_DEFAULT_SCENE, + + &ITE_Resources, + + ARRAYSIZE( ITECD_GameFiles ), + ITECD_GameFiles, + + ARRAYSIZE( ITECD_GameFonts ), + ITECD_GameFonts, + + &ITECD_GameSound, + + 1 + }, + + /* I Have No Mouth And I Must Scream - Demo version + \*-------------------------------------------------------------*/ + { + R_GAMETYPE_IHNM, + R_GAME_IHNM_DEMO, + "I Have No Mouth - Demo version", + + &IHNM_DisplayInfo, + + 0, + + IHNM_Resources, + + ARRAYSIZE( IHNMDEMO_GameFiles ), + IHNMDEMO_GameFiles, + + 0, + NULL, + + &IHNM_GameSound, + + 0 + }, + + /* I Have No Mouth And I Must Scream - CD version + \*-------------------------------------------------------------*/ + { + R_GAMETYPE_IHNM, + R_GAME_IHNM_CD, + "I Have No Mouth - CD version", + + &IHNM_DisplayInfo, + + 1, + + IHNM_Resources, + + ARRAYSIZE( IHNMCD_GameFiles ), + IHNMCD_GameFiles, + + ARRAYSIZE( IHNMCD_GameFonts ), + IHNMCD_GameFonts, + + &IHNM_GameSound, + + 1 + } +}; + +static R_GAMEMODULE GameModule; + +void SagaGameDesc::setGameDirectory( const char *gamedir ) { + + assert( gamedir != NULL ); + + debug( 1, "Using game data path: %s", gamedir ); + + GameModule.game_dir = gamedir; +} + +int SagaGameDesc::detectGame() { + + File test_file; + + int game_index = 0; + + bool disqualified = false; + bool found_game = false; + + int file_n; + int file_ct; + const char *file_name; + + int game_n; + int game_ct = ARRAYSIZE( GameDescs ); + + assert( GameModule.game_dir != NULL ); + + for( game_n = 0 ; game_n < game_ct ; game_n++ ) { + + disqualified = false; + + /* Attempt to open all files for this game + * If we can open them all, then try to open all files on the + * exclude list + */ + file_ct = GameDescs[game_n].gd_filect; + + for( file_n = 0; file_n < file_ct; file_n++ ) { + + file_name = GameDescs[game_n].gd_filedescs[file_n].gf_fname; + if( !test_file.open( file_name, GameModule.game_dir )) { + disqualified = true; + break; + } + + test_file.close(); + } + + if ( disqualified ) { + continue; + } + + switch ( GameDescs[game_n].gd_game_id ) { + + case R_GAME_ITE_DEMO: + disqualified = !verifyITEDEMO(); + break; + case R_GAME_ITE_DISK: + disqualified = !verifyITEDISK(); + break; + + default: + break; + } + + if( !disqualified ) { + found_game = true; + break; + } + } + + if( found_game ) { + + debug( 1, "Found SAGA game: %s\n", GameDescs[game_n].gd_title ); + return game_n; + } + + return -1; +} + +bool SagaGameDesc::openGame() { + + int game_filect; + + if(( GameModule.game_index = detectGame() ) < 0 ) { + error( "Couldn't locate any valid SAGA games" ); + return false; + } + + assert( GameModule.game_index < ARRAYSIZE(GameDescs)); + + if( !GameModule.game_dir ) { + return false; + } + + game_filect = GameDescs[ GameModule.game_index ].gd_filect; + + GameModule.gfile_data = new R_GAME_FILEDATA[ game_filect ]; + + return true; +} + +bool verifyITEDEMO() { + return true; +} + +bool verifyITEDISK() { + + ResourceFile test_file; + int32 script_lut_rn; + int32 script_lut_len; + + /* Attempt to verify the disk version of Inherit the Earth + * by examining the length of entries in the script lookup + * table, which differs from the disk version and the CD + * version. + */ + + assert( GameModule.game_dir != NULL ); + + if ( !test_file.open( "ITE.RSC", GameModule.game_dir )) { + return false; + } + + script_lut_rn = GameDescs[ R_GAME_ITE_DISK ].gd_resource_info->script_lut_rn; + + script_lut_len = test_file.getResourceLen( script_lut_rn ); + + if( script_lut_len % R_SCR_LUT_ENTRYLEN_ITEDISK == 0 ) { + return true; + } + + return false; +} + +bool verifyITECD() { + return true; +} + +bool verifyIHNMDEMO() { + return true; +} + +bool verifyIHNMCD() { + return true; +} |