diff options
-rw-r--r-- | saga/animation.cpp | 15 | ||||
-rw-r--r-- | saga/font.cpp | 8 | ||||
-rw-r--r-- | saga/game.cpp | 204 | ||||
-rw-r--r-- | saga/game.h | 50 | ||||
-rw-r--r-- | saga/ihnm_introproc.cpp | 5 | ||||
-rw-r--r-- | saga/interface.cpp | 208 | ||||
-rw-r--r-- | saga/interface.h | 11 | ||||
-rw-r--r-- | saga/isomap.cpp | 6 | ||||
-rw-r--r-- | saga/ite_introproc.cpp | 4 | ||||
-rw-r--r-- | saga/render.cpp | 17 | ||||
-rw-r--r-- | saga/saga.cpp | 4 | ||||
-rw-r--r-- | saga/saga.h | 92 | ||||
-rw-r--r-- | saga/scene.cpp | 32 | ||||
-rw-r--r-- | saga/script.cpp | 6 | ||||
-rw-r--r-- | saga/sfuncs.cpp | 11 | ||||
-rw-r--r-- | saga/sndres.cpp | 2 | ||||
-rw-r--r-- | saga/sndres.h | 2 |
17 files changed, 277 insertions, 400 deletions
diff --git a/saga/animation.cpp b/saga/animation.cpp index 4233d4e7c3..a2b8181cab 100644 --- a/saga/animation.cpp +++ b/saga/animation.cpp @@ -180,14 +180,10 @@ int Anim::play(uint16 anim_id, int vector_time, bool playing) { uint16 frame; int result; - GAME_DISPLAYINFO disp_info; - if (anim_id >= _anim_count) { return FAILURE; } - _vm->getDisplayInfo(&disp_info); - _vm->_render->getBufferInfo(&buf_info); display_buf = buf_info.bg_buf; @@ -207,7 +203,7 @@ int Anim::play(uint16 anim_id, int vector_time, bool playing) { if (_vm->_gameType == GType_ITE) { // FIXME: if start > 0, then this works incorrectly result = ITE_DecodeFrame(anim->resdata, anim->resdata_len, anim->frame_offsets[frame], display_buf, - disp_info.logical_w * disp_info.logical_h); + _vm->getDisplayWidth() * _vm->getDisplayHeight()); if (result != SUCCESS) { warning("Anim::play: Error decoding frame %u", anim->current_frame); anim->state = ANIM_PAUSE; @@ -219,7 +215,7 @@ int Anim::play(uint16 anim_id, int vector_time, bool playing) { return FAILURE; } - result = IHNM_DecodeFrame(display_buf, disp_info.logical_w * disp_info.logical_h, + result = IHNM_DecodeFrame(display_buf, _vm->getDisplayWidth() * _vm->getDisplayHeight(), anim->cur_frame_p, anim->cur_frame_len, &nextf_p, &nextf_len); if (result != SUCCESS) { warning("Anim::play: Error decoding frame %u", anim->current_frame); @@ -633,9 +629,6 @@ int Anim::IHNM_DecodeFrame(byte *decode_buf, size_t decode_buf_len, const byte * byte *outbuf_endp = (decode_buf + decode_buf_len) - 1; size_t outbuf_remain = decode_buf_len; - GAME_DISPLAYINFO di; - - _vm->getDisplayInfo(&di); *nextf_p = NULL; @@ -668,7 +661,7 @@ int Anim::IHNM_DecodeFrame(byte *decode_buf, size_t decode_buf_len, const byte * x_origin = param1; y_origin = param2; - outbuf_p = decode_buf + x_origin + (y_origin * di.logical_w); + outbuf_p = decode_buf + x_origin + (y_origin * _vm->getDisplayWidth()); if (outbuf_p > outbuf_endp) { warning("0x%02X: (0x%X) Invalid output position. (x: %d, y: %d)", @@ -738,7 +731,7 @@ int Anim::IHNM_DecodeFrame(byte *decode_buf, size_t decode_buf_len, const byte * x_vector = readS.readSint16(); new_row = readS.readSint16(); - outbuf_p = decode_buf + ((y_origin + new_row) * di.logical_w) + x_origin + x_vector; + outbuf_p = decode_buf + ((y_origin + new_row) * _vm->getDisplayWidth()) + x_origin + x_vector; outbuf_remain = (outbuf_endp - outbuf_p) + 1; continue; break; diff --git a/saga/font.cpp b/saga/font.cpp index d28db992d6..0b0bc67608 100644 --- a/saga/font.cpp +++ b/saga/font.cpp @@ -33,7 +33,6 @@ namespace Saga { Font::Font(SagaEngine *vm) : _vm(vm), _initialized(false) { - GAME_FONTDESC *gamefonts; int i; // Load font module resource context @@ -42,10 +41,9 @@ Font::Font(SagaEngine *vm) : _vm(vm), _initialized(false) { error("Font::Font(): Couldn't get resource context."); } - // Allocate font table - _vm->getFontInfo(&gamefonts, &_nFonts); + assert(_vm->getFontsCount() > 0); - assert(_nFonts > 0); + _nFonts = _vm->getFontsCount(); _fonts = (FONT **)malloc(_nFonts * sizeof(*_fonts)); if (_fonts == NULL) { @@ -53,7 +51,7 @@ Font::Font(SagaEngine *vm) : _vm(vm), _initialized(false) { } for (i = 0; i < _nFonts; i++) { - loadFont(gamefonts[i].font_rn, gamefonts[i].font_id); + loadFont(_vm->getFontDescription(i)->font_rn, _vm->getFontDescription(i)->font_id); } _initialized = true; diff --git a/saga/game.cpp b/saga/game.cpp index 394243dbfa..82e2efc8d3 100644 --- a/saga/game.cpp +++ b/saga/game.cpp @@ -44,29 +44,29 @@ static int detectGame(const FSList &fslist, bool mode = false); // Inherit the Earth - DOS Demo version -static GAME_FILEDESC ITEDEMO_GameFiles[] = { +static GameFileDescription ITEDEMO_GameFiles[] = { {"ite.rsc", GAME_RESOURCEFILE}, {"ite.dmo", GAME_DEMOFILE}, {"scripts.rsc", GAME_SCRIPTFILE}, {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE} }; -static GAME_FONTDESC ITEDEMO_GameFonts[] = { +static GameFontDescription ITEDEMO_GameFonts[] = { {GAME_FONT_SMALL, 0}, {GAME_FONT_MEDIUM, 1} }; -static GAME_SOUNDINFO ITEDEMO_GameSound = { +static GameSoundInfo ITEDEMO_GameSound = { GAME_SOUND_VOC, 0, 0, 0 }; -static GAME_FONTDESC ITEMACDEMO_GameFonts[] = { +static GameFontDescription ITEMACDEMO_GameFonts[] = { {GAME_FONT_MEDIUM, 0}, {GAME_FONT_SMALL, 2} }; // Inherit the Earth - Wyrmkeep Win32 Demo version -static GAME_FILEDESC ITEWINDEMO_GameFiles[] = { +static GameFileDescription ITEWINDEMO_GameFiles[] = { {"ited.rsc", GAME_RESOURCEFILE}, {"scriptsd.rsc", GAME_SCRIPTFILE}, {"soundsd.rsc", GAME_SOUNDFILE}, @@ -74,7 +74,7 @@ static GAME_FILEDESC ITEWINDEMO_GameFiles[] = { }; // Inherit the Earth - Wyrmkeep Linux Demo version -static GAME_FILEDESC ITELINDEMO_GameFiles[] = { +static GameFileDescription ITELINDEMO_GameFiles[] = { {"ited.rsc", GAME_RESOURCEFILE}, {"scriptsd.rsc", GAME_SCRIPTFILE}, {"soundsd.rsc", GAME_SOUNDFILE}, @@ -83,7 +83,7 @@ static GAME_FILEDESC ITELINDEMO_GameFiles[] = { }; // Inherit the Earth - Wyrmkeep Linux version -static GAME_FILEDESC ITELINCD_GameFiles[] = { +static GameFileDescription ITELINCD_GameFiles[] = { {"ite.rsc", GAME_RESOURCEFILE}, {"scripts.rsc", GAME_SCRIPTFILE}, {"sounds.rsc", GAME_SOUNDFILE}, @@ -91,13 +91,13 @@ static GAME_FILEDESC ITELINCD_GameFiles[] = { {"music.rsc", GAME_MUSICFILE} }; -static GAME_FONTDESC ITEWINDEMO_GameFonts[] = { +static GameFontDescription ITEWINDEMO_GameFonts[] = { {GAME_FONT_MEDIUM, 0}, {GAME_FONT_SMALL, 2} }; // Inherit the Earth - Mac Wyrmkeep version -static GAME_FILEDESC ITEMACCD_GameFiles[] = { +static GameFileDescription ITEMACCD_GameFiles[] = { {"ite.rsc", GAME_RESOURCEFILE}, {"scripts.rsc", GAME_SCRIPTFILE}, {"sounds.rsc", GAME_SOUNDFILE}, @@ -106,44 +106,44 @@ static GAME_FILEDESC ITEMACCD_GameFiles[] = { }; // Inherit the Earth - Diskette version -static GAME_FILEDESC ITEDISK_GameFiles[] = { +static GameFileDescription ITEDISK_GameFiles[] = { {"ite.rsc", GAME_RESOURCEFILE}, {"scripts.rsc", GAME_SCRIPTFILE}, {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE} }; -static GAME_FONTDESC ITEDISK_GameFonts[] = { +static GameFontDescription ITEDISK_GameFonts[] = { {GAME_FONT_MEDIUM, 0}, {GAME_FONT_LARGE, 1}, {GAME_FONT_SMALL, 2} }; -static GAME_RESOURCEDESC ITE_Resources = { +static GameResourceDescription ITE_Resources = { RID_ITE_SCENE_LUT, // Scene lookup table RN RID_ITE_SCRIPT_LUT, // Script lookup table RN RID_ITE_COMMAND_PANEL, RID_ITE_DIALOGUE_PANEL }; -static GAME_SOUNDINFO ITE_GameSound = { +static GameSoundInfo ITE_GameSound = { GAME_SOUND_VOC, 0, 0, 0 }; // Inherit the Earth - CD Enhanced version -static GAME_FILEDESC ITECD_GameFiles[] = { +static GameFileDescription ITECD_GameFiles[] = { {"ite.rsc", GAME_RESOURCEFILE}, {"scripts.rsc", GAME_SCRIPTFILE}, {"sounds.rsc", GAME_SOUNDFILE}, {"voices.rsc", GAME_VOICEFILE} }; -static GAME_FONTDESC ITECD_GameFonts[] = { +static GameFontDescription ITECD_GameFonts[] = { {GAME_FONT_MEDIUM, 0}, {GAME_FONT_LARGE, 1}, {GAME_FONT_SMALL, 2} }; -static GAME_SOUNDINFO ITECD_GameSound = { +static GameSoundInfo ITECD_GameSound = { GAME_SOUND_PCM, 22050, 16, @@ -151,7 +151,7 @@ static GAME_SOUNDINFO ITECD_GameSound = { }; // I Have No Mouth and I Must Scream - Demo version -static GAME_FILEDESC IHNMDEMO_GameFiles[] = { +static GameFileDescription IHNMDEMO_GameFiles[] = { {"scream.res", GAME_RESOURCEFILE}, {"scripts.res", GAME_SCRIPTFILE}, {"sfx.res", GAME_SOUNDFILE}, @@ -159,7 +159,7 @@ static GAME_FILEDESC IHNMDEMO_GameFiles[] = { }; // I Have No Mouth and I Must Scream - Retail CD version -static GAME_FILEDESC IHNMCD_GameFiles[] = { +static GameFileDescription IHNMCD_GameFiles[] = { {"musicfm.res", GAME_MUSICFILE_FM}, {"musicgm.res", GAME_MUSICFILE_GM}, {"scream.res", GAME_RESOURCEFILE}, @@ -176,7 +176,7 @@ static GAME_FILEDESC IHNMCD_GameFiles[] = { }; // I Have No Mouth and I Must Scream - Retail German CD version -static GAME_FILEDESC IHNMCDDE_GameFiles[] = { +static GameFileDescription IHNMCDDE_GameFiles[] = { {"musicfm.res", GAME_MUSICFILE_FM}, {"musicgm.res", GAME_MUSICFILE_GM}, {"scream.res", GAME_RESOURCEFILE}, @@ -191,7 +191,7 @@ static GAME_FILEDESC IHNMCDDE_GameFiles[] = { {"voicess.res", GAME_VOICEFILE} }; -static GAME_FONTDESC IHNMCD_GameFonts[] = { +static GameFontDescription IHNMCD_GameFonts[] = { {GAME_FONT_MEDIUM, 2}, {GAME_FONT_LARGE, 3}, {GAME_FONT_SMALL, 4}, @@ -201,19 +201,19 @@ static GAME_FONTDESC IHNMCD_GameFonts[] = { {GAME_FONT_LARGE3, 8} }; -static GAME_RESOURCEDESC IHNM_Resources = { +static GameResourceDescription IHNM_Resources = { RID_IHNM_SCENE_LUT, // Scene lookup table RN RID_IHNM_SCRIPT_LUT, // Script lookup table RN RID_IHNM_COMMAND_PANEL, RID_IHNM_DIALOGUE_PANEL }; -static GAME_SOUNDINFO IHNM_GameSound = { +static GameSoundInfo IHNM_GameSound = { GAME_SOUND_WAV, 0, 0, 0 }; -struct GAME_MD5 { - GAME_IDS id; +struct GameMD5 { + GameIds id; const char *md5; const char *filename; bool caseSensitive; @@ -221,7 +221,7 @@ struct GAME_MD5 { #define FILE_MD5_BYTES 5000 -static GAME_MD5 game_md5[] = { +static GameMD5 gameMD5[] = { { GID_ITE_DISK_G, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", false }, { GID_ITE_DISK_G, "516f7330f8410057b834424ea719d1ef", "scripts.rsc", false }, { GID_ITE_DISK_G, "c46e4392fcd2e89bc91e5567db33b62d", "voices.rsc", false }, @@ -326,7 +326,7 @@ static GAME_MD5 game_md5[] = { { GID_IHNM_DEMO, "3bbc16a8f741dbb511da506c660a0b54", "voicesd.res", false }, }; -static GAMEDESC GameDescs[] = { +static GameDescription gameDescriptions[] = { // Inherit the earth - DOS Demo version { "ite-demo", @@ -618,18 +618,16 @@ static GAMEDESC GameDescs[] = { } }; -static GAMEMODULE GameModule; - int SagaEngine::initGame(void) { - int game_n; + int gameNumber; FSList dummy; - if ((game_n = detectGame(dummy)) == -1) { + if ((gameNumber = detectGame(dummy)) == -1) { warning("No valid games were found in the specified directory."); return FAILURE; } - if (loadGame(game_n) != SUCCESS) { + if (loadGame(gameNumber) != SUCCESS) { warning("Error loading game resource files."); return FAILURE; } @@ -642,14 +640,11 @@ int SagaEngine::initGame(void) { int SagaEngine::loadLanguage(void) { char lang_file[MAXPATH]; - uint16 game_n; - File test_file; - game_n = GameModule.game_number; - if (GameDescs[game_n].gd_game_type == GType_ITE) { - snprintf(lang_file, MAXPATH, "%s%s.%s", GAME_ITE_LANG_PREFIX, GameModule.game_language, GAME_LANG_EXT); + if (_gameType == GType_ITE) { + snprintf(lang_file, MAXPATH, "%s%s.%s", GAME_ITE_LANG_PREFIX, _gameLanguage, GAME_LANG_EXT); if (!test_file.open(lang_file)) { debug(0, "Couldn't open language file %s. Using default (US English)", lang_file); return SUCCESS; @@ -678,16 +673,15 @@ int SagaEngine::loadLanguage(void) { } RSCFILE_CONTEXT *SagaEngine::getFileContext(uint16 type, int param) { - RSCFILE_CONTEXT *found_ctxt = NULL; uint16 i; - for (i = 0; i < GameModule.gfile_n; i++) { - if (GameModule.gfile_data[i].file_types & type) { - found_ctxt = GameModule.gfile_data[i].file_ctxt; + for (i = 0; i < _gameDescription->filesCount; i++) { + if ( _gameDescription->filesDescriptions[i].fileType & type) { + return _gameFileContexts[i]; } } - return found_ctxt; + return NULL; } DetectedGameList GAME_ProbeGame(const FSList &fslist) { @@ -695,13 +689,13 @@ DetectedGameList GAME_ProbeGame(const FSList &fslist) { int game_n; if ((game_n = detectGame(fslist, true)) != -1) - detectedGames.push_back(GameDescs[game_n].toGameSettings()); + detectedGames.push_back(gameDescriptions[game_n].toGameSettings()); return detectedGames; } int detectGame(const FSList &fslist, bool mode) { - int game_count = ARRAYSIZE(GameDescs); + int game_count = ARRAYSIZE(gameDescriptions); int game_n = -1; Common::StringMap filesMD5; @@ -718,12 +712,12 @@ int detectGame(const FSList &fslist, bool mode) { uint8 md5sum[16]; // First we compose list of files which we need MD5s for - for (int i = 0; i < ARRAYSIZE(game_md5); i++) { - tstr = Common::String(game_md5[i].filename); + for (int i = 0; i < ARRAYSIZE(gameMD5); i++) { + tstr = Common::String(gameMD5[i].filename); tstr.toLowercase(); - if (game_md5[i].caseSensitive && !mode) - filesList[Common::String(game_md5[i].filename)] = true; + if (gameMD5[i].caseSensitive && !mode) + filesList[Common::String(gameMD5[i].filename)] = true; else filesList[tstr] = true; } @@ -766,12 +760,12 @@ int detectGame(const FSList &fslist, bool mode) { } for (game_n = 0; game_n < game_count; game_n++) { - file_count = GameDescs[game_n].gd_filect; + file_count = gameDescriptions[game_n].filesCount; file_missing = false; // Try to open all files for this game for (file_n = 0; file_n < file_count; file_n++) { - tstr = GameDescs[game_n].gd_filedescs[file_n].gf_fname; + tstr = gameDescriptions[game_n].filesDescriptions[file_n].fileName; if (!filesMD5.contains(tstr)) { file_missing = true; @@ -786,13 +780,13 @@ int detectGame(const FSList &fslist, bool mode) { } else { bool match = true; - debug(5, "Probing game: %s", GameDescs[game_n].gd_title); + debug(5, "Probing game: %s", gameDescriptions[game_n].title); - for (int i = 0; i < ARRAYSIZE(game_md5); i++) { - if (game_md5[i].id == GameDescs[game_n].gd_game_id) { - tstr = game_md5[i].filename; + for (int i = 0; i < ARRAYSIZE(gameMD5); i++) { + if (gameMD5[i].id == gameDescriptions[game_n].gameId) { + tstr = gameMD5[i].filename; - if (strcmp(game_md5[i].md5, filesMD5[tstr].c_str())) { + if (strcmp(gameMD5[i].md5, filesMD5[tstr].c_str())) { match = false; break; } @@ -801,7 +795,7 @@ int detectGame(const FSList &fslist, bool mode) { if (!match) continue; - debug(5, "Found game: %s", GameDescs[game_n].gd_title); + debug(5, "Found game: %s", gameDescriptions[game_n].title); return game_n; } @@ -819,70 +813,48 @@ int detectGame(const FSList &fslist, bool mode) { return -1; } -int SagaEngine::loadGame(int game_n) { - RSCFILE_CONTEXT *load_ctxt; - uint16 game_count = ARRAYSIZE(GameDescs); - const char *game_fname; - uint16 game_filect; +int SagaEngine::loadGame(int gameNumber) { + RSCFILE_CONTEXT *loadContext; + uint16 gameCount = ARRAYSIZE(gameDescriptions); + const char *gameFileName; + uint16 gameFileCount; uint16 i; - if (game_n >= game_count) { - return FAILURE; + if (gameNumber >= gameCount) { + error("SagaEngine::loadGame wrong gameNumber"); } - GameModule.game_number = game_n; - GameModule.gamedesc = &GameDescs[game_n]; + _gameNumber = gameNumber; + _gameDescription = &gameDescriptions[gameNumber]; - _gameId = GameModule.gamedesc->gd_game_id; - _gameType = GameModule.gamedesc->gd_game_type; - _features = GameModule.gamedesc->features; + _gameId = _gameDescription->gameId; + _gameType = _gameDescription->gameType; + _features = _gameDescription->features; - game_filect = GameDescs[game_n].gd_filect; + gameFileCount = _gameDescription->filesCount; - GameModule.gfile_data = (GAME_FILEDATA *)malloc(game_filect * sizeof(*GameModule.gfile_data)); - if (GameModule.gfile_data == NULL) { - return MEM; + _gameFileContexts = (RSCFILE_CONTEXT **)malloc(gameFileCount * sizeof(*_gameFileContexts)); + //TODO: on exit - FREE! + if (_gameFileContexts == NULL) { + error("SagaEngine::loadGame not enough memory"); } - GameModule.gfile_n = game_filect; // Load game resource files - for (i = 0; i < game_filect; i++) { - load_ctxt = RSC_CreateContext(); - game_fname = GameDescs[game_n].gd_filedescs[i].gf_fname; - if (RSC_OpenContext(load_ctxt, game_fname) != SUCCESS) { + for (i = 0; i < gameFileCount; i++) { + loadContext = RSC_CreateContext(); + gameFileName = _gameDescription->filesDescriptions[i].fileName; + if (RSC_OpenContext(loadContext, gameFileName) != SUCCESS) { return FAILURE; } - debug(0, "Opened resource file: %s", game_fname); - GameModule.gfile_data[i].file_ctxt = load_ctxt; - GameModule.gfile_data[i].file_types = GameDescs[game_n].gd_filedescs[i].gf_type; - GameModule.gfile_data[i].file_flags = 0; + debug(0, "Opened resource file: %s", gameFileName); + _gameFileContexts[i] = loadContext; } - // Load game font data - GameModule.gd_fontct = GameDescs[game_n].gd_fontct; - GameModule.gd_fontdescs = GameDescs[game_n].gd_fontdescs; - return SUCCESS; } -const GAME_RESOURCEDESC SagaEngine::getResourceInfo(void) { - return *GameModule.gamedesc->gd_resource_desc; -} - -const GAME_SOUNDINFO SagaEngine::getSoundInfo(void) { - return *GameModule.gamedesc->gd_soundinfo; -} - -int SagaEngine::getDisplayWidth() { - return GameDescs[GameModule.game_number].gd_logical_w; -} - -int SagaEngine::getDisplayHeight() { - return GameDescs[GameModule.game_number].gd_logical_h; -} - int SagaEngine::getPathYOffset() { //fixme: should be in GameDesc if (_gameType == GType_ITE) { return 35; @@ -899,36 +871,4 @@ int SagaEngine::getStatusYOffset() { //fixme: should be in GameDesc } } -int SagaEngine::getDisplayInfo(GAME_DISPLAYINFO *disp_info) { - int game_n; - - assert(disp_info != NULL); - - game_n = GameModule.game_number; - - disp_info->logical_w = GameDescs[game_n].gd_logical_w; - disp_info->logical_h = GameDescs[game_n].gd_logical_h; - disp_info->scene_h = GameDescs[game_n].gd_scene_h; - - return SUCCESS; -} - -int SagaEngine::getFontInfo(GAME_FONTDESC **gf_desc, int *font_n) { - assert((gf_desc != NULL) && (font_n != NULL)); - - *gf_desc = GameModule.gd_fontdescs; - *font_n = GameModule.gd_fontct; - - return SUCCESS; -} - -int SagaEngine::getSceneInfo(GAME_SCENEDESC *gs_desc) { - assert(gs_desc != NULL); - - gs_desc->first_scene = GameModule.gamedesc->gd_startscene; - gs_desc->scene_lut_rn = RSC_ConvertID(GameModule.gamedesc->gd_resource_desc->scene_lut_rn); - - return SUCCESS; -} - } // End of namespace Saga diff --git a/saga/game.h b/saga/game.h index b04380be50..850f343914 100644 --- a/saga/game.h +++ b/saga/game.h @@ -30,62 +30,12 @@ namespace Saga { -#define GAME_LANGSTR_LIMIT 3 #define GAME_PATH_LIMIT 512 -#define GAME_ITE_LANG_PREFIX "ite_" -#define GAME_LANG_EXT "lng" - // Script lookup table entry sizes for game verification #define SCR_LUT_ENTRYLEN_ITECD 22 #define SCR_LUT_ENTRYLEN_ITEDISK 16 -struct GAME_FILEDESC { - const char *gf_fname; - uint16 gf_type; -}; - -struct GAMEDESC { - const char *name; - SAGAGameType gd_game_type; - GAME_IDS gd_game_id; - const char *gd_title; - int gd_logical_w; - int gd_logical_h; - int gd_scene_h; - int gd_startscene; - GAME_RESOURCEDESC *gd_resource_desc; - int gd_filect; - GAME_FILEDESC *gd_filedescs; - int gd_fontct; - GAME_FONTDESC *gd_fontdescs; - GAME_SOUNDINFO *gd_soundinfo; - uint32 features; - - GameSettings toGameSettings() const { - GameSettings dummy = { name, gd_title, features }; - return dummy; - } -}; - -struct GAME_FILEDATA { - RSCFILE_CONTEXT *file_ctxt; - uint16 file_types; - uint16 file_flags; -}; - -struct GAMEMODULE { - int game_number; - GAMEDESC *gamedesc; - int g_skipintro; - char game_language[GAME_LANGSTR_LIMIT]; - uint16 gfile_n; - GAME_FILEDATA *gfile_data; - uint16 gd_fontct; - GAME_FONTDESC *gd_fontdescs; - int err_n; - const char *err_str; -}; DetectedGameList GAME_ProbeGame(const FSList &fslist); diff --git a/saga/ihnm_introproc.cpp b/saga/ihnm_introproc.cpp index 919169754c..643f570927 100644 --- a/saga/ihnm_introproc.cpp +++ b/saga/ihnm_introproc.cpp @@ -92,7 +92,6 @@ int Scene::IHNMStartProc() { size_t i; SCENE_QUEUE first_scene; - GAME_SCENEDESC gs_desc; n_introscenes = ARRAYSIZE(IHNM_IntroList); @@ -105,10 +104,8 @@ int Scene::IHNMStartProc() { // it will cause the end titles music to play, which is wrong. (But // hey, it's a nice piece of music!) - _vm->getSceneInfo(&gs_desc); - first_scene.load_flag = BY_SCENE; - first_scene.scene_n = gs_desc.first_scene; + first_scene.scene_n = _vm->getStartSceneNumber(); first_scene.scene_skiptarget = 1; first_scene.scene_proc = NULL; first_scene.fadeType = SCENE_FADE; diff --git a/saga/interface.cpp b/saga/interface.cpp index 57318d8785..c1369ac3f7 100644 --- a/saga/interface.cpp +++ b/saga/interface.cpp @@ -81,8 +81,8 @@ static INTERFACE_DESC ITE_interface = { ITE_INVENTORY_YSPACING }; -static INTERFACE_BUTTON ITE_c_buttons[] = { - {5, 4, 46, 47, "Portrait", 0, 0, BUTTON_NONE, 0}, +static InterfaceButton ITEMainPanel[] = { + {5, 4, 46, 47, "Portrait", 0, 0, BUTTON_NONE, 0}, //TODO: remove? // "Walk To" and "Talk To" share button sprites {52, 4, 109, 14, "Walk To", 1, 2, BUTTON_VERB, I_VERB_WALKTO}, {52, 15, 109, 25, "Look At", 3, 4, BUTTON_VERB, I_VERB_LOOKAT}, @@ -136,7 +136,7 @@ static INTERFACE_DESC IHNM_interface = { IHNM_INVENTORY_YSPACING }; -static INTERFACE_BUTTON IHNM_c_buttons[] = { +static InterfaceButton IHNMMainPanel[] = { {5, 4, 46, 47, "Portrait", 0, 0, 0, 0} }; @@ -160,8 +160,6 @@ int Interface::registerLang(void) { } Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { - GAME_RESOURCEDESC g_resdesc; - int result; if (_initialized) { @@ -183,37 +181,32 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { // Initialize interface data by game type if (_vm->_gameType == GType_ITE) { // Load Inherit the Earth interface desc - _cPanel.buttons = ITE_c_buttons; - _cPanel.nbuttons = ARRAYSIZE(ITE_c_buttons); + _mainPanel.buttons = ITEMainPanel; + _mainPanel.nbuttons = ARRAYSIZE(ITEMainPanel); _iDesc = ITE_interface; } else if (_vm->_gameType == GType_IHNM) { // Load I Have No Mouth interface desc - _cPanel.buttons = IHNM_c_buttons; - _cPanel.nbuttons = ARRAYSIZE(IHNM_c_buttons); + _mainPanel.buttons = IHNMMainPanel; + _mainPanel.nbuttons = ARRAYSIZE(IHNMMainPanel); _iDesc = IHNM_interface; } else { return; } - // Load interface resources - g_resdesc = _vm->getResourceInfo(); - // Load command panel resource - result = RSC_LoadResource(_interfaceContext, g_resdesc.command_panel_rn, - &_cPanel.res, &_cPanel.res_len); + result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->command_panel_rn, &_mainPanel.res, &_mainPanel.res_len); if (result != SUCCESS) { return; } // Load dialogue panel resource - result = RSC_LoadResource(_interfaceContext, g_resdesc.dialogue_panel_rn, - &_dPanel.res, &_dPanel.res_len); + result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->dialogue_panel_rn, &_conversePanel.res, &_conversePanel.res_len); if (result != SUCCESS) { return; } - if (_vm->_sprite->loadList(RID_ITE_COMMAND_BUTTONSPRITES, _cPanel.sprites) != SUCCESS) { + if (_vm->_sprite->loadList(RID_ITE_COMMAND_BUTTONSPRITES, _mainPanel.sprites) != SUCCESS) { error("Unable to load sprite list"); } @@ -223,20 +216,20 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { } - _vm->decodeBGImage(_cPanel.res, _cPanel.res_len, &_cPanel.img, - &_cPanel.img_len, &_cPanel.img_w, &_cPanel.img_h); + _vm->decodeBGImage(_mainPanel.res, _mainPanel.res_len, &_mainPanel.img, + &_mainPanel.img_len, &_mainPanel.img_w, &_mainPanel.img_h); - _vm->decodeBGImage(_dPanel.res, _dPanel.res_len, - &_dPanel.img, &_dPanel.img_len, - &_dPanel.img_w, &_dPanel.img_h); + _vm->decodeBGImage(_conversePanel.res, _conversePanel.res_len, + &_conversePanel.img, &_conversePanel.img_len, + &_conversePanel.img_w, &_conversePanel.img_h); - _cPanel.x = 0; - _cPanel.y = 149; + _mainPanel.x = 0; + _mainPanel.y = 149; - _dPanel.x = 0; - _dPanel.y = 149; + _conversePanel.x = 0; + _conversePanel.y = 149; - _cPanel.set_button = COMMAND_DEFAULT_BUTTON; + _mainPanel.set_button = COMMAND_DEFAULT_BUTTON; _leftPortrait = 0; _rightPortrait = 0; @@ -262,7 +255,7 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { Interface::~Interface(void) { free(_inventory); - _cPanel.sprites.freeMem(); + _mainPanel.sprites.freeMem(); _defPortraits.freeMem(); _scenePortraits.freeMem(); _initialized = false; @@ -310,23 +303,25 @@ void Interface::restoreMode() { int Interface::setMode(int mode, bool force) { // TODO: Is this where we should hide/show the mouse cursor? - int newmode = mode; + int newMode = mode; - if (mode == kPanelConverse) + if (mode == kPanelConverse) { _inMainMode = false; - else if (mode == kPanelInventory) { - _inMainMode = true; - newmode = kPanelMain; + } else { + if (mode == kPanelInventory) { + _inMainMode = true; + newMode = kPanelMain; + } } // This lets us to prevents actors to pop up during initial // scene fade in. if (_savedMode != -1 && !force) { - _savedMode = newmode; - debug(0, "Saved mode: %d. my mode is %d", newmode, _panelMode); + _savedMode = newMode; + debug(0, "Saved mode: %d. my mode is %d", newMode, _panelMode); } else - _panelMode = newmode; + _panelMode = newMode; draw(); @@ -362,71 +357,63 @@ int Interface::setRightPortrait(int portrait) { } int Interface::draw() { - GAME_DISPLAYINFO g_di; - SURFACE *back_buf; + SURFACE *backBuffer; - int xbase; - int ybase; - Point lportrait; - Point rportrait; - + Point base; + Point leftPortraitPoint; + Point rightPortraitPoint; Point origin; - back_buf = _vm->_gfx->getBackBuffer(); + backBuffer = _vm->_gfx->getBackBuffer(); if (_vm->_scene->isInDemo() || _panelMode == kPanelFade) return SUCCESS; - // Get game display info - _vm->getDisplayInfo(&g_di); - drawStatusBar(back_buf); + drawStatusBar(backBuffer); - // Draw command panel background if (_panelMode == kPanelMain) { - xbase = _cPanel.x; - ybase = _cPanel.y; + base.x = _mainPanel.x; + base.y = _mainPanel.y; origin.x = 0; - origin.y = g_di.logical_h - _cPanel.img_h; + origin.y = _vm->getDisplayHeight() - _mainPanel.img_h; - bufToSurface(back_buf, _cPanel.img, _cPanel.img_w, - _cPanel.img_h, NULL, &origin); + bufToSurface(backBuffer, _mainPanel.img, _mainPanel.img_w, _mainPanel.img_h, NULL, &origin); + } else { - xbase = _dPanel.x; - ybase = _dPanel.y; + base.x = _conversePanel.x; + base.y = _conversePanel.y; origin.x = 0; - origin.y = g_di.logical_h - _cPanel.img_h; + origin.y = _vm->getDisplayHeight() - _mainPanel.img_h; - bufToSurface(back_buf, _dPanel.img, _dPanel.img_w, - _dPanel.img_h, NULL, &origin); + bufToSurface(backBuffer, _conversePanel.img, _conversePanel.img_w, + _conversePanel.img_h, NULL, &origin); } - // Draw character portrait - lportrait.x = xbase + _iDesc.lportrait_x; - lportrait.y = ybase + _iDesc.lportrait_y; - if (_panelMode == kPanelMain || _panelMode == kPanelConverse || - _lockedMode == kPanelMain || _lockedMode == kPanelConverse) - _vm->_sprite->draw(back_buf, _defPortraits, _leftPortrait, lportrait, 256); + _lockedMode == kPanelMain || _lockedMode == kPanelConverse) { + leftPortraitPoint.x = base.x + _iDesc.lportrait_x; + leftPortraitPoint.y = base.y + _iDesc.lportrait_y; + _vm->_sprite->draw(backBuffer, _defPortraits, _leftPortrait, leftPortraitPoint, 256); + } + if (!_inMainMode && _iDesc.rportrait_x >= 0) { - rportrait.x = xbase + _iDesc.rportrait_x; - rportrait.y = ybase + _iDesc.rportrait_y; + rightPortraitPoint.x = base.x + _iDesc.rportrait_x; + rightPortraitPoint.y = base.y + _iDesc.rportrait_y; - _vm->_sprite->draw(back_buf, _scenePortraits, _rightPortrait, rportrait, 256); + _vm->_sprite->draw(backBuffer, _scenePortraits, _rightPortrait, rightPortraitPoint, 256); } - if (_inMainMode) + if (_inMainMode) { drawInventory(); - + } return SUCCESS; } int Interface::update(const Point& imousePt, int update_flag) { - GAME_DISPLAYINFO g_di; - SURFACE *back_buf; int imouse_x, imouse_y; @@ -439,12 +426,10 @@ int Interface::update(const Point& imousePt, int update_flag) { back_buf = _vm->_gfx->getBackBuffer(); - // Get game display info - _vm->getDisplayInfo(&g_di); if (_panelMode == kPanelMain) { // FIXME: HACK // Update playfield space ( only if cursor is inside ) - if (imouse_y < g_di.scene_h) { + if (imouse_y < _vm->getStatusYOffset()) { // Mouse is in playfield space if (update_flag == UPDATE_MOUSEMOVE) { handlePlayfieldUpdate(back_buf, imousePt); @@ -467,7 +452,6 @@ int Interface::update(const Point& imousePt, int update_flag) { } int Interface::drawStatusBar(SURFACE *ds) { - GAME_DISPLAYINFO g_di; Rect rect; int string_w; @@ -479,13 +463,11 @@ int Interface::drawStatusBar(SURFACE *ds) { return SUCCESS; } - // Get game display info - _vm->getDisplayInfo(&g_di); // Erase background of status bar rect.left = 0; rect.top = _iDesc.status_y; - rect.right = g_di.logical_w; + rect.right = _vm->getDisplayWidth(); rect.bottom = _iDesc.status_y + _iDesc.status_h; drawRect(ds, &rect, _iDesc.status_bgcol); @@ -516,31 +498,31 @@ int Interface::handleCommandClick(SURFACE *ds, const Point& imousePt) { return SUCCESS; } - x_base = _cPanel.x; - y_base = _cPanel.y; + x_base = _mainPanel.x; + y_base = _mainPanel.y; - if (_cPanel.buttons[ibutton_num].flags & BUTTON_SET) { - old_set_button = _cPanel.set_button; + if (_mainPanel.buttons[ibutton_num].flags & BUTTON_SET) { + old_set_button = _mainPanel.set_button; set_button = ibutton_num; - _cPanel.set_button = set_button; + _mainPanel.set_button = set_button; - if (_cPanel.buttons[set_button].flags & BUTTON_VERB) { - _activeVerb = _cPanel.buttons[ibutton_num].data; + if (_mainPanel.buttons[set_button].flags & BUTTON_VERB) { + _activeVerb = _mainPanel.buttons[ibutton_num].data; } - if (_cPanel.buttons[set_button].flags & BUTTON_BITMAP) { - button.x = x_base + _cPanel.buttons[set_button].x1; - button.y = y_base + _cPanel.buttons[set_button].y1; + if (_mainPanel.buttons[set_button].flags & BUTTON_BITMAP) { + button.x = x_base + _mainPanel.buttons[set_button].x1; + button.y = y_base + _mainPanel.buttons[set_button].y1; - _vm->_sprite->draw(ds, _cPanel.sprites, _cPanel.buttons[set_button]. + _vm->_sprite->draw(ds, _mainPanel.sprites, _mainPanel.buttons[set_button]. active_sprite - 1, button, 256); } - if (_cPanel.buttons[old_set_button].flags & BUTTON_BITMAP) { - button.x = x_base + _cPanel.buttons[old_set_button].x1; - button.y = y_base + _cPanel.buttons[old_set_button].y1; + if (_mainPanel.buttons[old_set_button].flags & BUTTON_BITMAP) { + button.x = x_base + _mainPanel.buttons[old_set_button].x1; + button.y = y_base + _mainPanel.buttons[old_set_button].y1; - _vm->_sprite->draw(ds, _cPanel.sprites, _cPanel.buttons[old_set_button]. + _vm->_sprite->draw(ds, _mainPanel.sprites, _mainPanel.buttons[old_set_button]. inactive_sprite - 1, button, 256); } } @@ -553,13 +535,12 @@ int Interface::handleCommandUpdate(SURFACE *ds, const Point& imousePt) { int ibutton_num; Point button; - int button_w = 0; +// int button_w = 0; - int verb_idx = 0; +/* int verb_idx = 0; int string_w = 0; - int color; - int i; + int i;*/ hit_button = inventoryTest(imousePt, &ibutton_num); @@ -568,21 +549,21 @@ int Interface::handleCommandUpdate(SURFACE *ds, const Point& imousePt) { return SUCCESS; } - hit_button = hitTest(imousePt, &ibutton_num); +/* hit_button = hitTest(imousePt, &ibutton_num); if (hit_button == SUCCESS) { // Hovering over a command panel button setStatusText(I_VerbData[_activeVerb].verb_str); } - for (i = 0; i < _cPanel.nbuttons; i++) { - if (!(_cPanel.buttons[i].flags & BUTTON_LABEL)) { + for (i = 0; i < _mainPanel.nbuttons; i++) { + if (!(_mainPanel.buttons[i].flags & BUTTON_LABEL)) { continue; } - button_w = _cPanel.buttons[i].x2 - _cPanel.buttons[i].x1; + button_w = _mainPanel.buttons[i].x2 - _mainPanel.buttons[i].x1; - verb_idx = _cPanel.buttons[i].data; + verb_idx = _mainPanel.buttons[i].data; string_w = _vm->_font->getStringWidth(SMALL_FONT_ID, I_VerbData[verb_idx].verb_str, 0, 0); @@ -592,19 +573,19 @@ int Interface::handleCommandUpdate(SURFACE *ds, const Point& imousePt) { color = _iDesc.cmd_txt_col; } - button.x = _cPanel.x + _cPanel.buttons[i].x1; - button.y = _cPanel.y + _cPanel.buttons[i].y1; + button.x = _mainPanel.x + _mainPanel.buttons[i].x1; + button.y = _mainPanel.y + _mainPanel.buttons[i].y1; _vm->_font->draw(SMALL_FONT_ID, ds, I_VerbData[verb_idx].verb_str, 0, button.x + ((button_w / 2) - (string_w / 2)), button.y + 1, color, _iDesc.cmd_txt_shadowcol, FONT_SHADOW); - if ((i == _cPanel.set_button) && (_cPanel.buttons[i].flags & BUTTON_BITMAP)) { - _vm->_sprite->draw(ds, _cPanel.sprites, _cPanel.buttons[i].active_sprite - 1, + if ((i == _mainPanel.set_button) && (_mainPanel.buttons[i].flags & BUTTON_BITMAP)) { + _vm->_sprite->draw(ds, _mainPanel.sprites, _mainPanel.buttons[i].active_sprite - 1, button, 256); } } - +*/ return SUCCESS; } @@ -687,7 +668,7 @@ int Interface::handlePlayfieldUpdate(SURFACE *ds, const Point& imousePt) { } int Interface::hitTest(const Point& imousePt, int *ibutton) { - INTERFACE_BUTTON *buttons; + InterfaceButton *buttons; int nbuttons; int xbase; @@ -695,11 +676,11 @@ int Interface::hitTest(const Point& imousePt, int *ibutton) { int i; - buttons = _cPanel.buttons; - nbuttons = _cPanel.nbuttons; + buttons = _mainPanel.buttons; + nbuttons = _mainPanel.nbuttons; - xbase = _cPanel.x; - ybase = _cPanel.y; + xbase = _mainPanel.x; + ybase = _mainPanel.y; for (i = 0; i < nbuttons; i++) { if ((imousePt.x >= (xbase + buttons[i].x1)) && (imousePt.x < (xbase + buttons[i].x2)) && @@ -808,4 +789,7 @@ int Interface::inventoryTest(const Point& imousePt, int *ibutton) { return FAILURE; } +void Interface::drawVerb(int verb, int state) { +} + } // End of namespace Saga diff --git a/saga/interface.h b/saga/interface.h index 313954fce2..b3edf44957 100644 --- a/saga/interface.h +++ b/saga/interface.h @@ -126,7 +126,7 @@ enum BUTTON_FLAGS { #define BUTTON_VERB ( BUTTON_LABEL | BUTTON_BITMAP | BUTTON_SET ) -struct INTERFACE_BUTTON { +struct InterfaceButton { int x1; int y1; int x2; @@ -138,7 +138,7 @@ struct INTERFACE_BUTTON { int data; }; -struct INTERFACE_PANEL { +struct InterfacePanel { byte *res; size_t res_len; int x; @@ -149,7 +149,7 @@ struct INTERFACE_PANEL { int img_h; int set_button; int nbuttons; - INTERFACE_BUTTON *buttons; + InterfaceButton *buttons; SpriteList sprites; }; @@ -235,6 +235,7 @@ private: int handleCommandClick(SURFACE *ds, const Point& imousePt); int handlePlayfieldUpdate(SURFACE *ds, const Point& imousePt); int handlePlayfieldClick(SURFACE *ds, const Point& imousePt); + void drawVerb(int verb, int state); private: SagaEngine *_vm; @@ -247,8 +248,8 @@ private: int _savedMode; int _lockedMode; bool _inMainMode; - INTERFACE_PANEL _cPanel; - INTERFACE_PANEL _dPanel; + InterfacePanel _mainPanel; + InterfacePanel _conversePanel; char _statusText[STATUS_TEXT_LEN]; int _leftPortrait; int _rightPortrait; diff --git a/saga/isomap.cpp b/saga/isomap.cpp index 6d9ac7b35f..53f963e3e6 100644 --- a/saga/isomap.cpp +++ b/saga/isomap.cpp @@ -132,13 +132,11 @@ int IsoMap::loadMetamap(const byte *mm_res_p, size_t mm_res_len) { } int IsoMap::draw(SURFACE *dst_s) { - GAME_DISPLAYINFO disp_info; - _vm->getDisplayInfo(&disp_info); - Rect iso_rect(disp_info.logical_w, disp_info.scene_h); +/* Rect iso_rect(disp_info.logical_w, disp_info.scene_h); drawRect(dst_s, &iso_rect, 0); drawMetamap(dst_s, -1000, -500); - +*/ return SUCCESS; } diff --git a/saga/ite_introproc.cpp b/saga/ite_introproc.cpp index f798e0341e..f346bb880d 100644 --- a/saga/ite_introproc.cpp +++ b/saga/ite_introproc.cpp @@ -126,7 +126,6 @@ int Scene::ITEStartProc() { SCENE_QUEUE first_scene; SCENE_QUEUE tempScene; - GAME_SCENEDESC gs_desc; n_introscenes = ARRAYSIZE(ITE_IntroList); @@ -136,10 +135,9 @@ int Scene::ITEStartProc() { _vm->_scene->queueScene(&tempScene); } - _vm->getSceneInfo(&gs_desc); first_scene.load_flag = BY_SCENE; - first_scene.scene_n = gs_desc.first_scene; + first_scene.scene_n = _vm->getStartSceneNumber(); first_scene.scene_skiptarget = 1; first_scene.scene_proc = NULL; first_scene.fadeType = SCENE_FADE; diff --git a/saga/render.cpp b/saga/render.cpp index 67409add72..69f21a943e 100644 --- a/saga/render.cpp +++ b/saga/render.cpp @@ -46,28 +46,25 @@ Render::Render(SagaEngine *vm, OSystem *system) { _system = system; _initialized = false; - GAME_DISPLAYINFO disp_info; int tmp_w, tmp_h, tmp_bytepp; - // Initialize system graphics - _vm->getDisplayInfo(&disp_info); // Initialize FPS timer callback g_timer->installTimerProc(&fpsTimerCallback, 1000000, this); // Create background buffer - _bg_buf_w = disp_info.logical_w; - _bg_buf_h = disp_info.logical_h; - _bg_buf = (byte *)calloc(disp_info.logical_w, disp_info.logical_h); + _bg_buf_w = _vm->getDisplayWidth(); + _bg_buf_h = _vm->getDisplayHeight(); + _bg_buf = (byte *)calloc(_vm->getDisplayWidth(), _vm->getDisplayHeight()); if (_bg_buf == NULL) { - return; + error("Render::Render not enough memory"); } // Allocate temp buffer for animation decoding, // graphics scalers (2xSaI), etc. - tmp_w = disp_info.logical_w; - tmp_h = disp_info.logical_h + 4; // BG unbanking requres extra rows + tmp_w = _vm->getDisplayWidth(); + tmp_h = _vm->getDisplayHeight() + 4; // BG unbanking requres extra rows tmp_bytepp = 1; _tmp_buf = (byte *)calloc(1, tmp_w * tmp_h * tmp_bytepp); @@ -98,7 +95,6 @@ bool Render::initialized() { int Render::drawScene() { SURFACE *backbuf_surface; - GAME_DISPLAYINFO disp_info; SCENE_INFO scene_info; SCENE_BGINFO bg_info; Point bg_pt; @@ -118,7 +114,6 @@ int Render::drawScene() { mouse_pt = _vm->getMousePos(); _vm->_scene->getBGInfo(&bg_info); - _vm->getDisplayInfo(&disp_info); bg_pt.x = 0; bg_pt.y = 0; diff --git a/saga/saga.cpp b/saga/saga.cpp index 5ce9f8a164..e864414e69 100644 --- a/saga/saga.cpp +++ b/saga/saga.cpp @@ -169,9 +169,7 @@ int SagaEngine::init(GameDetector &detector) { _previousTicks = _system->getMillis(); // Initialize graphics - GAME_DISPLAYINFO disp_info; - getDisplayInfo(&disp_info); - _gfx = new Gfx(_system, disp_info.logical_w, disp_info.logical_h, detector); + _gfx = new Gfx(_system, _vm->getDisplayWidth(), _vm->getDisplayHeight(), detector); // Graphics driver should be initialized before console _console = new Console(this); diff --git a/saga/saga.h b/saga/saga.h index 8e531fc861..a39fcb5c6b 100644 --- a/saga/saga.h +++ b/saga/saga.h @@ -60,6 +60,9 @@ class Console; class Events; class PalAnim; +#define GAME_LANGSTR_LIMIT 3 +#define GAME_ITE_LANG_PREFIX "ite_" +#define GAME_LANG_EXT "lng" #define PBOUNDS(n,max) (((n)>=(0))&&((n)<(max))) #define MAXPATH 512 @@ -150,7 +153,7 @@ struct CLICKAREA { Point *points; }; -enum GAME_IDS { +enum GameIds { // Dreamers Guild GID_ITE_DEMO_G = 0, GID_ITE_DISK_G, @@ -181,7 +184,7 @@ enum GAME_IDS { GID_IHNM_CD_DE // reported by mld. German retail }; -enum GAME_FILETYPES { +enum GameFileTypes { GAME_RESOURCEFILE = 1 << 0, GAME_SCRIPTFILE = 1 << 1, GAME_SOUNDFILE = 1 << 2, @@ -193,14 +196,14 @@ enum GAME_FILETYPES { GAME_PATCHFILE = 1 << 8 }; -enum GAME_SOUNDINFO_TYPES { +enum GameSoundTypes { GAME_SOUND_PCM = 0, GAME_SOUND_VOC, GAME_SOUND_WAV, GAME_SOUND_VOX }; -enum GAME_FONT_IDS { +enum GameFontIds { GAME_FONT_SMALL = 0, GAME_FONT_MEDIUM, GAME_FONT_LARGE, @@ -210,7 +213,7 @@ enum GAME_FONT_IDS { GAME_FONT_LARGE3 }; -enum GAME_FEATURES { +enum GameFeatures { GF_VOX_VOICES = 1 << 0, GF_BIG_ENDIAN_DATA = 1 << 1, GF_MAC_RESOURCES = 1 << 2, @@ -218,36 +221,60 @@ enum GAME_FEATURES { GF_WYRMKEEP = 1 << 4 }; -struct GAME_DISPLAYINFO { - int logical_w; - int logical_h; - int scene_h; -}; - -struct GAME_SOUNDINFO { +struct GameSoundInfo { int res_type; long freq; int sample_size; int stereo; }; -struct GAME_FONTDESC { +struct GameFontDescription { uint16 font_id; uint32 font_rn; }; -struct GAME_SCENEDESC { - uint32 scene_lut_rn; - uint32 first_scene; -}; - -struct GAME_RESOURCEDESC { +struct GameResourceDescription { uint32 scene_lut_rn; uint32 script_lut_rn; uint32 command_panel_rn; uint32 dialogue_panel_rn; }; +struct GameFileDescription { + const char *fileName; + uint16 fileType; +}; + +struct GameDisplayInfo { + int logicalWidth; + int logicalHeight; + int scene_h; +}; + +struct GameDescription { + const char *name; + SAGAGameType gameType; + GameIds gameId; + const char *title; + int gd_logical_w; + int gd_logical_h; + int gd_scene_h; + int startSceneNumber; + GameResourceDescription *resourceDescription; + int filesCount; + GameFileDescription *filesDescriptions; + int fontsCount; + GameFontDescription *fontDescriptions; + GameSoundInfo *soundInfo; + uint32 features; + + GameSettings toGameSettings() const { + GameSettings dummy = { name, title, features }; + return dummy; + } +}; + + inline int ticksToMSec(int tick) { return tick * 1000 / kScriptTimeTicksPerSecond; } @@ -287,10 +314,16 @@ public: int _soundEnabled; int _musicEnabled; + + char _gameLanguage[GAME_LANGSTR_LIMIT]; + RSCFILE_CONTEXT **_gameFileContexts; +//current game description int _gameId; int _gameType; uint32 _features; + int _gameNumber; + GameDescription *_gameDescription; SndRes *_sndRes; Sound *_sound; @@ -351,18 +384,23 @@ public: public: int initGame(void); RSCFILE_CONTEXT *getFileContext(uint16 type, int param); - int getFontInfo(GAME_FONTDESC **, int *); - const GAME_RESOURCEDESC getResourceInfo(void); - const GAME_SOUNDINFO getSoundInfo(void); - int getDisplayInfo(GAME_DISPLAYINFO *disp_info); - int getSceneInfo(GAME_SCENEDESC *); - int getDisplayWidth(); - int getDisplayHeight(); +public: + const GameResourceDescription *getResourceDescription() { return _gameDescription->resourceDescription; } + const GameSoundInfo *getSoundInfo() { return _gameDescription->soundInfo; } + const GameFontDescription *getFontDescription(int index) { + assert(index < _gameDescription->fontsCount); + return &_gameDescription->fontDescriptions[index]; + } + int getFontsCount() const { return _gameDescription->fontsCount; } + + int getStartSceneNumber() { return _gameDescription->startSceneNumber; } + int getDisplayWidth() { return _gameDescription->gd_logical_w; } + int getDisplayHeight() { return _gameDescription->gd_logical_h;} int getStatusYOffset(); int getPathYOffset(); private: int loadLanguage(void); - int loadGame(int game_n_p); + int loadGame(int gameNumber); }; // FIXME: Global var. We use it until everything will be turned into objects diff --git a/saga/scene.cpp b/saga/scene.cpp index 5a9d6d0247..f92e018cee 100644 --- a/saga/scene.cpp +++ b/saga/scene.cpp @@ -51,14 +51,11 @@ static int initSceneDoors[SCENE_DOORS_MAX] = { }; Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) { - GAME_SCENEDESC gs_desc; byte *scene_lut_p; size_t scene_lut_len; int result; int i; - // Load game-specific scene data - _vm->getSceneInfo(&gs_desc); // Load scene module resource context _sceneContext = _vm->getFileContext(GAME_RESOURCEFILE, 0); @@ -69,8 +66,8 @@ Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) { // Load scene lookup table - debug(0, "Loading scene LUT from resource %u.", gs_desc.scene_lut_rn); - result = RSC_LoadResource(_sceneContext, gs_desc.scene_lut_rn, &scene_lut_p, &scene_lut_len); + debug(0, "Loading scene LUT from resource %u.", _vm->getResourceDescription()->scene_lut_rn); + result = RSC_LoadResource(_sceneContext, _vm->getResourceDescription()->scene_lut_rn, &scene_lut_p, &scene_lut_len); if (result != SUCCESS) { warning("Scene::Scene(): Error: couldn't load scene LUT"); return; @@ -95,9 +92,7 @@ Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) { free(scene_lut_p); - if (gs_desc.first_scene != 0) { - _firstScene = gs_desc.first_scene; - } + _firstScene = _vm->getStartSceneNumber(); debug(0, "First scene set to %d.", _firstScene); @@ -320,7 +315,6 @@ void Scene::getSlopes(int &beginSlope, int &endSlope) { } int Scene::getBGInfo(SCENE_BGINFO *bginfo) { - GAME_DISPLAYINFO di; int x, y; assert(_initialized); @@ -331,16 +325,15 @@ int Scene::getBGInfo(SCENE_BGINFO *bginfo) { bginfo->bg_h = _bg.h; bginfo->bg_p = _bg.p; - _vm->getDisplayInfo(&di); x = 0; y = 0; - if (_bg.w < di.logical_w) { - x = (di.logical_w - _bg.w) / 2; + if (_bg.w < _vm->getDisplayWidth()) { + x = (_vm->getDisplayWidth() - _bg.w) / 2; } - if (_bg.h < di.scene_h) { - y = (di.scene_h - _bg.h) / 2; + if (_bg.h < _vm->getStatusYOffset()) { + y = (_vm->getStatusYOffset() - _bg.h) / 2; } bginfo->bg_x = x; @@ -902,23 +895,22 @@ int Scene::processSceneResources() { } int Scene::draw(SURFACE *dst_s) { - GAME_DISPLAYINFO disp_info; BUFFER_INFO buf_info; Point bg_pt; assert(_initialized); _vm->_render->getBufferInfo(&buf_info); - _vm->getDisplayInfo(&disp_info); bg_pt.x = 0; bg_pt.y = 0; - if (_vm->_scene->getFlags() & kSceneFlagISO) + if (_vm->_scene->getFlags() & kSceneFlagISO) { _vm->_isoMap->draw(dst_s); - else - bufToSurface(dst_s, buf_info.bg_buf, disp_info.logical_w, - MAX(disp_info.scene_h, _bg.h), NULL, &bg_pt); + } else { + bufToSurface(dst_s, buf_info.bg_buf, _vm->getDisplayWidth(), + MAX(_vm->getStatusYOffset(), _bg.h), NULL, &bg_pt); + } return SUCCESS; } diff --git a/saga/script.cpp b/saga/script.cpp index 260c4f8339..06b889ec37 100644 --- a/saga/script.cpp +++ b/saga/script.cpp @@ -37,7 +37,6 @@ namespace Saga { // Initializes the scripting module. // Loads script resource look-up table, initializes script data system Script::Script() { - GAME_RESOURCEDESC gr_desc; RSCFILE_CONTEXT *s_lut_ctxt; RSCFILE_CONTEXT *resourceContext; byte *rsc_ptr; @@ -71,7 +70,6 @@ Script::Script() { _dataBuf[i].data = NULL; } - gr_desc = _vm->getResourceInfo(); debug(0, "Initializing scripting subsystem"); // Load script resource file context @@ -86,8 +84,8 @@ Script::Script() { error("Couldn't get resource file context"); } - debug(0, "Loading script LUT from resource %u.", gr_desc.script_lut_rn); - result = RSC_LoadResource(s_lut_ctxt, gr_desc.script_lut_rn, &rsc_ptr, &rsc_len); + debug(0, "Loading script LUT from resource %u.", _vm->getResourceDescription()->script_lut_rn); + result = RSC_LoadResource(s_lut_ctxt, _vm->getResourceDescription()->script_lut_rn, &rsc_ptr, &rsc_len); if (result != SUCCESS) { error("Error: Couldn't load script resource look-up table"); } diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index eb2e3c9c30..9562763674 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -1005,7 +1005,6 @@ static TEXTLIST_ENTRY *placardTextEntry; // Param1: string rid int Script::sfPlacard(SCRIPTFUNC_PARAMS) { int stringId; - GAME_DISPLAYINFO disp; SURFACE *back_buf = _vm->_gfx->getBackBuffer(); static PALENTRY cur_pal[PAL_ENTRIES]; PALENTRY *pal; @@ -1017,8 +1016,6 @@ int Script::sfPlacard(SCRIPTFUNC_PARAMS) { _vm->_interface->rememberMode(); _vm->_interface->setMode(kPanelPlacard); - _vm->getDisplayInfo(&disp); - stringId = thread->pop(); event.type = ONESHOT_EVENT; @@ -1057,9 +1054,9 @@ int Script::sfPlacard(SCRIPTFUNC_PARAMS) { event.data = back_buf; event.param = 138; event.param2 = 0; - event.param3 = disp.scene_h; + event.param3 = _vm->getStatusYOffset(); event.param4 = 0; - event.param5 = disp.logical_w; + event.param5 = _vm->getDisplayWidth(); q_event = _vm->_events->chain(q_event, &event); @@ -1076,8 +1073,8 @@ int Script::sfPlacard(SCRIPTFUNC_PARAMS) { text_entry.color = _vm->_gfx->getWhite(); text_entry.effect_color = _vm->_gfx->getBlack(); - text_entry.text_x = disp.logical_w / 2; - text_entry.text_y = (disp.scene_h - _vm->_font->getHeight(MEDIUM_FONT_ID)) / 2; + text_entry.text_x = _vm->getDisplayWidth() / 2; + text_entry.text_y = (_vm->getStatusYOffset() - _vm->_font->getHeight(MEDIUM_FONT_ID)) / 2; text_entry.font_id = MEDIUM_FONT_ID; text_entry.flags = FONT_OUTLINE | FONT_CENTERED; text_entry.string = getScriptString(stringId); diff --git a/saga/sndres.cpp b/saga/sndres.cpp index 9757e3217d..de47cafc09 100644 --- a/saga/sndres.cpp +++ b/saga/sndres.cpp @@ -51,7 +51,7 @@ SndRes::SndRes(SagaEngine *vm) : _vm(vm) { } // Grab sound resource information for the current game - _snd_info = _vm->getSoundInfo(); + _snd_info = *_vm->getSoundInfo(); _init = 1; } diff --git a/saga/sndres.h b/saga/sndres.h index 5b0151504b..3ba3d3a712 100644 --- a/saga/sndres.h +++ b/saga/sndres.h @@ -51,7 +51,7 @@ public: RSCFILE_CONTEXT *_sfx_ctxt; RSCFILE_CONTEXT *_voice_ctxt; - GAME_SOUNDINFO _snd_info; + GameSoundInfo _snd_info; SagaEngine *_vm; }; |