aboutsummaryrefslogtreecommitdiff
path: root/saga/gamedesc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'saga/gamedesc.cpp')
-rw-r--r--saga/gamedesc.cpp474
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;
+}