- GameModule is gone

- structures renamed
- SagaEngine class gives all current game descriptions
regression : "verb" is broken cause work in  progress

svn-id: r16511
This commit is contained in:
Andrew Kurushin 2005-01-09 23:41:22 +00:00
parent 7a8e1c1efd
commit 31ceb0bb71
17 changed files with 277 additions and 400 deletions

View file

@ -180,14 +180,10 @@ int Anim::play(uint16 anim_id, int vector_time, bool playing) {
uint16 frame; uint16 frame;
int result; int result;
GAME_DISPLAYINFO disp_info;
if (anim_id >= _anim_count) { if (anim_id >= _anim_count) {
return FAILURE; return FAILURE;
} }
_vm->getDisplayInfo(&disp_info);
_vm->_render->getBufferInfo(&buf_info); _vm->_render->getBufferInfo(&buf_info);
display_buf = buf_info.bg_buf; 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) { if (_vm->_gameType == GType_ITE) {
// FIXME: if start > 0, then this works incorrectly // FIXME: if start > 0, then this works incorrectly
result = ITE_DecodeFrame(anim->resdata, anim->resdata_len, anim->frame_offsets[frame], display_buf, 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) { if (result != SUCCESS) {
warning("Anim::play: Error decoding frame %u", anim->current_frame); warning("Anim::play: Error decoding frame %u", anim->current_frame);
anim->state = ANIM_PAUSE; anim->state = ANIM_PAUSE;
@ -219,7 +215,7 @@ int Anim::play(uint16 anim_id, int vector_time, bool playing) {
return FAILURE; 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); anim->cur_frame_p, anim->cur_frame_len, &nextf_p, &nextf_len);
if (result != SUCCESS) { if (result != SUCCESS) {
warning("Anim::play: Error decoding frame %u", anim->current_frame); 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; byte *outbuf_endp = (decode_buf + decode_buf_len) - 1;
size_t outbuf_remain = decode_buf_len; size_t outbuf_remain = decode_buf_len;
GAME_DISPLAYINFO di;
_vm->getDisplayInfo(&di);
*nextf_p = NULL; *nextf_p = NULL;
@ -668,7 +661,7 @@ int Anim::IHNM_DecodeFrame(byte *decode_buf, size_t decode_buf_len, const byte *
x_origin = param1; x_origin = param1;
y_origin = param2; 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) { if (outbuf_p > outbuf_endp) {
warning("0x%02X: (0x%X) Invalid output position. (x: %d, y: %d)", 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(); x_vector = readS.readSint16();
new_row = 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; outbuf_remain = (outbuf_endp - outbuf_p) + 1;
continue; continue;
break; break;

View file

@ -33,7 +33,6 @@
namespace Saga { namespace Saga {
Font::Font(SagaEngine *vm) : _vm(vm), _initialized(false) { Font::Font(SagaEngine *vm) : _vm(vm), _initialized(false) {
GAME_FONTDESC *gamefonts;
int i; int i;
// Load font module resource context // 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."); error("Font::Font(): Couldn't get resource context.");
} }
// Allocate font table assert(_vm->getFontsCount() > 0);
_vm->getFontInfo(&gamefonts, &_nFonts);
assert(_nFonts > 0); _nFonts = _vm->getFontsCount();
_fonts = (FONT **)malloc(_nFonts * sizeof(*_fonts)); _fonts = (FONT **)malloc(_nFonts * sizeof(*_fonts));
if (_fonts == NULL) { if (_fonts == NULL) {
@ -53,7 +51,7 @@ Font::Font(SagaEngine *vm) : _vm(vm), _initialized(false) {
} }
for (i = 0; i < _nFonts; i++) { 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; _initialized = true;

View file

@ -44,29 +44,29 @@ static int detectGame(const FSList &fslist, bool mode = false);
// Inherit the Earth - DOS Demo version // Inherit the Earth - DOS Demo version
static GAME_FILEDESC ITEDEMO_GameFiles[] = { static GameFileDescription ITEDEMO_GameFiles[] = {
{"ite.rsc", GAME_RESOURCEFILE}, {"ite.rsc", GAME_RESOURCEFILE},
{"ite.dmo", GAME_DEMOFILE}, {"ite.dmo", GAME_DEMOFILE},
{"scripts.rsc", GAME_SCRIPTFILE}, {"scripts.rsc", GAME_SCRIPTFILE},
{"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE} {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE}
}; };
static GAME_FONTDESC ITEDEMO_GameFonts[] = { static GameFontDescription ITEDEMO_GameFonts[] = {
{GAME_FONT_SMALL, 0}, {GAME_FONT_SMALL, 0},
{GAME_FONT_MEDIUM, 1} {GAME_FONT_MEDIUM, 1}
}; };
static GAME_SOUNDINFO ITEDEMO_GameSound = { static GameSoundInfo ITEDEMO_GameSound = {
GAME_SOUND_VOC, 0, 0, 0 GAME_SOUND_VOC, 0, 0, 0
}; };
static GAME_FONTDESC ITEMACDEMO_GameFonts[] = { static GameFontDescription ITEMACDEMO_GameFonts[] = {
{GAME_FONT_MEDIUM, 0}, {GAME_FONT_MEDIUM, 0},
{GAME_FONT_SMALL, 2} {GAME_FONT_SMALL, 2}
}; };
// Inherit the Earth - Wyrmkeep Win32 Demo version // Inherit the Earth - Wyrmkeep Win32 Demo version
static GAME_FILEDESC ITEWINDEMO_GameFiles[] = { static GameFileDescription ITEWINDEMO_GameFiles[] = {
{"ited.rsc", GAME_RESOURCEFILE}, {"ited.rsc", GAME_RESOURCEFILE},
{"scriptsd.rsc", GAME_SCRIPTFILE}, {"scriptsd.rsc", GAME_SCRIPTFILE},
{"soundsd.rsc", GAME_SOUNDFILE}, {"soundsd.rsc", GAME_SOUNDFILE},
@ -74,7 +74,7 @@ static GAME_FILEDESC ITEWINDEMO_GameFiles[] = {
}; };
// Inherit the Earth - Wyrmkeep Linux Demo version // Inherit the Earth - Wyrmkeep Linux Demo version
static GAME_FILEDESC ITELINDEMO_GameFiles[] = { static GameFileDescription ITELINDEMO_GameFiles[] = {
{"ited.rsc", GAME_RESOURCEFILE}, {"ited.rsc", GAME_RESOURCEFILE},
{"scriptsd.rsc", GAME_SCRIPTFILE}, {"scriptsd.rsc", GAME_SCRIPTFILE},
{"soundsd.rsc", GAME_SOUNDFILE}, {"soundsd.rsc", GAME_SOUNDFILE},
@ -83,7 +83,7 @@ static GAME_FILEDESC ITELINDEMO_GameFiles[] = {
}; };
// Inherit the Earth - Wyrmkeep Linux version // Inherit the Earth - Wyrmkeep Linux version
static GAME_FILEDESC ITELINCD_GameFiles[] = { static GameFileDescription ITELINCD_GameFiles[] = {
{"ite.rsc", GAME_RESOURCEFILE}, {"ite.rsc", GAME_RESOURCEFILE},
{"scripts.rsc", GAME_SCRIPTFILE}, {"scripts.rsc", GAME_SCRIPTFILE},
{"sounds.rsc", GAME_SOUNDFILE}, {"sounds.rsc", GAME_SOUNDFILE},
@ -91,13 +91,13 @@ static GAME_FILEDESC ITELINCD_GameFiles[] = {
{"music.rsc", GAME_MUSICFILE} {"music.rsc", GAME_MUSICFILE}
}; };
static GAME_FONTDESC ITEWINDEMO_GameFonts[] = { static GameFontDescription ITEWINDEMO_GameFonts[] = {
{GAME_FONT_MEDIUM, 0}, {GAME_FONT_MEDIUM, 0},
{GAME_FONT_SMALL, 2} {GAME_FONT_SMALL, 2}
}; };
// Inherit the Earth - Mac Wyrmkeep version // Inherit the Earth - Mac Wyrmkeep version
static GAME_FILEDESC ITEMACCD_GameFiles[] = { static GameFileDescription ITEMACCD_GameFiles[] = {
{"ite.rsc", GAME_RESOURCEFILE}, {"ite.rsc", GAME_RESOURCEFILE},
{"scripts.rsc", GAME_SCRIPTFILE}, {"scripts.rsc", GAME_SCRIPTFILE},
{"sounds.rsc", GAME_SOUNDFILE}, {"sounds.rsc", GAME_SOUNDFILE},
@ -106,44 +106,44 @@ static GAME_FILEDESC ITEMACCD_GameFiles[] = {
}; };
// Inherit the Earth - Diskette version // Inherit the Earth - Diskette version
static GAME_FILEDESC ITEDISK_GameFiles[] = { static GameFileDescription ITEDISK_GameFiles[] = {
{"ite.rsc", GAME_RESOURCEFILE}, {"ite.rsc", GAME_RESOURCEFILE},
{"scripts.rsc", GAME_SCRIPTFILE}, {"scripts.rsc", GAME_SCRIPTFILE},
{"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE} {"voices.rsc", GAME_SOUNDFILE | GAME_VOICEFILE}
}; };
static GAME_FONTDESC ITEDISK_GameFonts[] = { static GameFontDescription ITEDISK_GameFonts[] = {
{GAME_FONT_MEDIUM, 0}, {GAME_FONT_MEDIUM, 0},
{GAME_FONT_LARGE, 1}, {GAME_FONT_LARGE, 1},
{GAME_FONT_SMALL, 2} {GAME_FONT_SMALL, 2}
}; };
static GAME_RESOURCEDESC ITE_Resources = { static GameResourceDescription ITE_Resources = {
RID_ITE_SCENE_LUT, // Scene lookup table RN RID_ITE_SCENE_LUT, // Scene lookup table RN
RID_ITE_SCRIPT_LUT, // Script lookup table RN RID_ITE_SCRIPT_LUT, // Script lookup table RN
RID_ITE_COMMAND_PANEL, RID_ITE_COMMAND_PANEL,
RID_ITE_DIALOGUE_PANEL RID_ITE_DIALOGUE_PANEL
}; };
static GAME_SOUNDINFO ITE_GameSound = { static GameSoundInfo ITE_GameSound = {
GAME_SOUND_VOC, 0, 0, 0 GAME_SOUND_VOC, 0, 0, 0
}; };
// Inherit the Earth - CD Enhanced version // Inherit the Earth - CD Enhanced version
static GAME_FILEDESC ITECD_GameFiles[] = { static GameFileDescription ITECD_GameFiles[] = {
{"ite.rsc", GAME_RESOURCEFILE}, {"ite.rsc", GAME_RESOURCEFILE},
{"scripts.rsc", GAME_SCRIPTFILE}, {"scripts.rsc", GAME_SCRIPTFILE},
{"sounds.rsc", GAME_SOUNDFILE}, {"sounds.rsc", GAME_SOUNDFILE},
{"voices.rsc", GAME_VOICEFILE} {"voices.rsc", GAME_VOICEFILE}
}; };
static GAME_FONTDESC ITECD_GameFonts[] = { static GameFontDescription ITECD_GameFonts[] = {
{GAME_FONT_MEDIUM, 0}, {GAME_FONT_MEDIUM, 0},
{GAME_FONT_LARGE, 1}, {GAME_FONT_LARGE, 1},
{GAME_FONT_SMALL, 2} {GAME_FONT_SMALL, 2}
}; };
static GAME_SOUNDINFO ITECD_GameSound = { static GameSoundInfo ITECD_GameSound = {
GAME_SOUND_PCM, GAME_SOUND_PCM,
22050, 22050,
16, 16,
@ -151,7 +151,7 @@ static GAME_SOUNDINFO ITECD_GameSound = {
}; };
// I Have No Mouth and I Must Scream - Demo version // I Have No Mouth and I Must Scream - Demo version
static GAME_FILEDESC IHNMDEMO_GameFiles[] = { static GameFileDescription IHNMDEMO_GameFiles[] = {
{"scream.res", GAME_RESOURCEFILE}, {"scream.res", GAME_RESOURCEFILE},
{"scripts.res", GAME_SCRIPTFILE}, {"scripts.res", GAME_SCRIPTFILE},
{"sfx.res", GAME_SOUNDFILE}, {"sfx.res", GAME_SOUNDFILE},
@ -159,7 +159,7 @@ static GAME_FILEDESC IHNMDEMO_GameFiles[] = {
}; };
// I Have No Mouth and I Must Scream - Retail CD version // 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}, {"musicfm.res", GAME_MUSICFILE_FM},
{"musicgm.res", GAME_MUSICFILE_GM}, {"musicgm.res", GAME_MUSICFILE_GM},
{"scream.res", GAME_RESOURCEFILE}, {"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 // 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}, {"musicfm.res", GAME_MUSICFILE_FM},
{"musicgm.res", GAME_MUSICFILE_GM}, {"musicgm.res", GAME_MUSICFILE_GM},
{"scream.res", GAME_RESOURCEFILE}, {"scream.res", GAME_RESOURCEFILE},
@ -191,7 +191,7 @@ static GAME_FILEDESC IHNMCDDE_GameFiles[] = {
{"voicess.res", GAME_VOICEFILE} {"voicess.res", GAME_VOICEFILE}
}; };
static GAME_FONTDESC IHNMCD_GameFonts[] = { static GameFontDescription IHNMCD_GameFonts[] = {
{GAME_FONT_MEDIUM, 2}, {GAME_FONT_MEDIUM, 2},
{GAME_FONT_LARGE, 3}, {GAME_FONT_LARGE, 3},
{GAME_FONT_SMALL, 4}, {GAME_FONT_SMALL, 4},
@ -201,19 +201,19 @@ static GAME_FONTDESC IHNMCD_GameFonts[] = {
{GAME_FONT_LARGE3, 8} {GAME_FONT_LARGE3, 8}
}; };
static GAME_RESOURCEDESC IHNM_Resources = { static GameResourceDescription IHNM_Resources = {
RID_IHNM_SCENE_LUT, // Scene lookup table RN RID_IHNM_SCENE_LUT, // Scene lookup table RN
RID_IHNM_SCRIPT_LUT, // Script lookup table RN RID_IHNM_SCRIPT_LUT, // Script lookup table RN
RID_IHNM_COMMAND_PANEL, RID_IHNM_COMMAND_PANEL,
RID_IHNM_DIALOGUE_PANEL RID_IHNM_DIALOGUE_PANEL
}; };
static GAME_SOUNDINFO IHNM_GameSound = { static GameSoundInfo IHNM_GameSound = {
GAME_SOUND_WAV, 0, 0, 0 GAME_SOUND_WAV, 0, 0, 0
}; };
struct GAME_MD5 { struct GameMD5 {
GAME_IDS id; GameIds id;
const char *md5; const char *md5;
const char *filename; const char *filename;
bool caseSensitive; bool caseSensitive;
@ -221,7 +221,7 @@ struct GAME_MD5 {
#define FILE_MD5_BYTES 5000 #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, "8f4315a9bb10ec839253108a032c8b54", "ite.rsc", false },
{ GID_ITE_DISK_G, "516f7330f8410057b834424ea719d1ef", "scripts.rsc", false }, { GID_ITE_DISK_G, "516f7330f8410057b834424ea719d1ef", "scripts.rsc", false },
{ GID_ITE_DISK_G, "c46e4392fcd2e89bc91e5567db33b62d", "voices.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 }, { GID_IHNM_DEMO, "3bbc16a8f741dbb511da506c660a0b54", "voicesd.res", false },
}; };
static GAMEDESC GameDescs[] = { static GameDescription gameDescriptions[] = {
// Inherit the earth - DOS Demo version // Inherit the earth - DOS Demo version
{ {
"ite-demo", "ite-demo",
@ -618,18 +618,16 @@ static GAMEDESC GameDescs[] = {
} }
}; };
static GAMEMODULE GameModule;
int SagaEngine::initGame(void) { int SagaEngine::initGame(void) {
int game_n; int gameNumber;
FSList dummy; FSList dummy;
if ((game_n = detectGame(dummy)) == -1) { if ((gameNumber = detectGame(dummy)) == -1) {
warning("No valid games were found in the specified directory."); warning("No valid games were found in the specified directory.");
return FAILURE; return FAILURE;
} }
if (loadGame(game_n) != SUCCESS) { if (loadGame(gameNumber) != SUCCESS) {
warning("Error loading game resource files."); warning("Error loading game resource files.");
return FAILURE; return FAILURE;
} }
@ -642,14 +640,11 @@ int SagaEngine::initGame(void) {
int SagaEngine::loadLanguage(void) { int SagaEngine::loadLanguage(void) {
char lang_file[MAXPATH]; char lang_file[MAXPATH];
uint16 game_n;
File test_file; File test_file;
game_n = GameModule.game_number;
if (GameDescs[game_n].gd_game_type == GType_ITE) { if (_gameType == GType_ITE) {
snprintf(lang_file, MAXPATH, "%s%s.%s", GAME_ITE_LANG_PREFIX, GameModule.game_language, GAME_LANG_EXT); snprintf(lang_file, MAXPATH, "%s%s.%s", GAME_ITE_LANG_PREFIX, _gameLanguage, GAME_LANG_EXT);
if (!test_file.open(lang_file)) { if (!test_file.open(lang_file)) {
debug(0, "Couldn't open language file %s. Using default (US English)", lang_file); debug(0, "Couldn't open language file %s. Using default (US English)", lang_file);
return SUCCESS; return SUCCESS;
@ -678,16 +673,15 @@ int SagaEngine::loadLanguage(void) {
} }
RSCFILE_CONTEXT *SagaEngine::getFileContext(uint16 type, int param) { RSCFILE_CONTEXT *SagaEngine::getFileContext(uint16 type, int param) {
RSCFILE_CONTEXT *found_ctxt = NULL;
uint16 i; uint16 i;
for (i = 0; i < GameModule.gfile_n; i++) { for (i = 0; i < _gameDescription->filesCount; i++) {
if (GameModule.gfile_data[i].file_types & type) { if ( _gameDescription->filesDescriptions[i].fileType & type) {
found_ctxt = GameModule.gfile_data[i].file_ctxt; return _gameFileContexts[i];
} }
} }
return found_ctxt; return NULL;
} }
DetectedGameList GAME_ProbeGame(const FSList &fslist) { DetectedGameList GAME_ProbeGame(const FSList &fslist) {
@ -695,13 +689,13 @@ DetectedGameList GAME_ProbeGame(const FSList &fslist) {
int game_n; int game_n;
if ((game_n = detectGame(fslist, true)) != -1) if ((game_n = detectGame(fslist, true)) != -1)
detectedGames.push_back(GameDescs[game_n].toGameSettings()); detectedGames.push_back(gameDescriptions[game_n].toGameSettings());
return detectedGames; return detectedGames;
} }
int detectGame(const FSList &fslist, bool mode) { int detectGame(const FSList &fslist, bool mode) {
int game_count = ARRAYSIZE(GameDescs); int game_count = ARRAYSIZE(gameDescriptions);
int game_n = -1; int game_n = -1;
Common::StringMap filesMD5; Common::StringMap filesMD5;
@ -718,12 +712,12 @@ int detectGame(const FSList &fslist, bool mode) {
uint8 md5sum[16]; uint8 md5sum[16];
// First we compose list of files which we need MD5s for // First we compose list of files which we need MD5s for
for (int i = 0; i < ARRAYSIZE(game_md5); i++) { for (int i = 0; i < ARRAYSIZE(gameMD5); i++) {
tstr = Common::String(game_md5[i].filename); tstr = Common::String(gameMD5[i].filename);
tstr.toLowercase(); tstr.toLowercase();
if (game_md5[i].caseSensitive && !mode) if (gameMD5[i].caseSensitive && !mode)
filesList[Common::String(game_md5[i].filename)] = true; filesList[Common::String(gameMD5[i].filename)] = true;
else else
filesList[tstr] = true; filesList[tstr] = true;
} }
@ -766,12 +760,12 @@ int detectGame(const FSList &fslist, bool mode) {
} }
for (game_n = 0; game_n < game_count; game_n++) { 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; file_missing = false;
// Try to open all files for this game // Try to open all files for this game
for (file_n = 0; file_n < file_count; file_n++) { 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)) { if (!filesMD5.contains(tstr)) {
file_missing = true; file_missing = true;
@ -786,13 +780,13 @@ int detectGame(const FSList &fslist, bool mode) {
} else { } else {
bool match = true; 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++) { for (int i = 0; i < ARRAYSIZE(gameMD5); i++) {
if (game_md5[i].id == GameDescs[game_n].gd_game_id) { if (gameMD5[i].id == gameDescriptions[game_n].gameId) {
tstr = game_md5[i].filename; 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; match = false;
break; break;
} }
@ -801,7 +795,7 @@ int detectGame(const FSList &fslist, bool mode) {
if (!match) if (!match)
continue; continue;
debug(5, "Found game: %s", GameDescs[game_n].gd_title); debug(5, "Found game: %s", gameDescriptions[game_n].title);
return game_n; return game_n;
} }
@ -819,70 +813,48 @@ int detectGame(const FSList &fslist, bool mode) {
return -1; return -1;
} }
int SagaEngine::loadGame(int game_n) { int SagaEngine::loadGame(int gameNumber) {
RSCFILE_CONTEXT *load_ctxt; RSCFILE_CONTEXT *loadContext;
uint16 game_count = ARRAYSIZE(GameDescs); uint16 gameCount = ARRAYSIZE(gameDescriptions);
const char *game_fname; const char *gameFileName;
uint16 game_filect; uint16 gameFileCount;
uint16 i; uint16 i;
if (game_n >= game_count) { if (gameNumber >= gameCount) {
return FAILURE; error("SagaEngine::loadGame wrong gameNumber");
} }
GameModule.game_number = game_n; _gameNumber = gameNumber;
GameModule.gamedesc = &GameDescs[game_n]; _gameDescription = &gameDescriptions[gameNumber];
_gameId = GameModule.gamedesc->gd_game_id; _gameId = _gameDescription->gameId;
_gameType = GameModule.gamedesc->gd_game_type; _gameType = _gameDescription->gameType;
_features = GameModule.gamedesc->features; _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)); _gameFileContexts = (RSCFILE_CONTEXT **)malloc(gameFileCount * sizeof(*_gameFileContexts));
if (GameModule.gfile_data == NULL) { //TODO: on exit - FREE!
return MEM; if (_gameFileContexts == NULL) {
error("SagaEngine::loadGame not enough memory");
} }
GameModule.gfile_n = game_filect;
// Load game resource files // Load game resource files
for (i = 0; i < game_filect; i++) { for (i = 0; i < gameFileCount; i++) {
load_ctxt = RSC_CreateContext(); loadContext = RSC_CreateContext();
game_fname = GameDescs[game_n].gd_filedescs[i].gf_fname; gameFileName = _gameDescription->filesDescriptions[i].fileName;
if (RSC_OpenContext(load_ctxt, game_fname) != SUCCESS) { if (RSC_OpenContext(loadContext, gameFileName) != SUCCESS) {
return FAILURE; return FAILURE;
} }
debug(0, "Opened resource file: %s", game_fname); debug(0, "Opened resource file: %s", gameFileName);
GameModule.gfile_data[i].file_ctxt = load_ctxt; _gameFileContexts[i] = loadContext;
GameModule.gfile_data[i].file_types = GameDescs[game_n].gd_filedescs[i].gf_type;
GameModule.gfile_data[i].file_flags = 0;
} }
// Load game font data
GameModule.gd_fontct = GameDescs[game_n].gd_fontct;
GameModule.gd_fontdescs = GameDescs[game_n].gd_fontdescs;
return SUCCESS; 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 int SagaEngine::getPathYOffset() { //fixme: should be in GameDesc
if (_gameType == GType_ITE) { if (_gameType == GType_ITE) {
return 35; 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 } // End of namespace Saga

View file

@ -30,62 +30,12 @@
namespace Saga { namespace Saga {
#define GAME_LANGSTR_LIMIT 3
#define GAME_PATH_LIMIT 512 #define GAME_PATH_LIMIT 512
#define GAME_ITE_LANG_PREFIX "ite_"
#define GAME_LANG_EXT "lng"
// Script lookup table entry sizes for game verification // Script lookup table entry sizes for game verification
#define SCR_LUT_ENTRYLEN_ITECD 22 #define SCR_LUT_ENTRYLEN_ITECD 22
#define SCR_LUT_ENTRYLEN_ITEDISK 16 #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); DetectedGameList GAME_ProbeGame(const FSList &fslist);

View file

@ -92,7 +92,6 @@ int Scene::IHNMStartProc() {
size_t i; size_t i;
SCENE_QUEUE first_scene; SCENE_QUEUE first_scene;
GAME_SCENEDESC gs_desc;
n_introscenes = ARRAYSIZE(IHNM_IntroList); 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 // it will cause the end titles music to play, which is wrong. (But
// hey, it's a nice piece of music!) // hey, it's a nice piece of music!)
_vm->getSceneInfo(&gs_desc);
first_scene.load_flag = BY_SCENE; 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_skiptarget = 1;
first_scene.scene_proc = NULL; first_scene.scene_proc = NULL;
first_scene.fadeType = SCENE_FADE; first_scene.fadeType = SCENE_FADE;

View file

@ -81,8 +81,8 @@ static INTERFACE_DESC ITE_interface = {
ITE_INVENTORY_YSPACING ITE_INVENTORY_YSPACING
}; };
static INTERFACE_BUTTON ITE_c_buttons[] = { static InterfaceButton ITEMainPanel[] = {
{5, 4, 46, 47, "Portrait", 0, 0, BUTTON_NONE, 0}, {5, 4, 46, 47, "Portrait", 0, 0, BUTTON_NONE, 0}, //TODO: remove?
// "Walk To" and "Talk To" share button sprites // "Walk To" and "Talk To" share button sprites
{52, 4, 109, 14, "Walk To", 1, 2, BUTTON_VERB, I_VERB_WALKTO}, {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}, {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 IHNM_INVENTORY_YSPACING
}; };
static INTERFACE_BUTTON IHNM_c_buttons[] = { static InterfaceButton IHNMMainPanel[] = {
{5, 4, 46, 47, "Portrait", 0, 0, 0, 0} {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) { Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {
GAME_RESOURCEDESC g_resdesc;
int result; int result;
if (_initialized) { if (_initialized) {
@ -183,37 +181,32 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {
// Initialize interface data by game type // Initialize interface data by game type
if (_vm->_gameType == GType_ITE) { if (_vm->_gameType == GType_ITE) {
// Load Inherit the Earth interface desc // Load Inherit the Earth interface desc
_cPanel.buttons = ITE_c_buttons; _mainPanel.buttons = ITEMainPanel;
_cPanel.nbuttons = ARRAYSIZE(ITE_c_buttons); _mainPanel.nbuttons = ARRAYSIZE(ITEMainPanel);
_iDesc = ITE_interface; _iDesc = ITE_interface;
} else if (_vm->_gameType == GType_IHNM) { } else if (_vm->_gameType == GType_IHNM) {
// Load I Have No Mouth interface desc // Load I Have No Mouth interface desc
_cPanel.buttons = IHNM_c_buttons; _mainPanel.buttons = IHNMMainPanel;
_cPanel.nbuttons = ARRAYSIZE(IHNM_c_buttons); _mainPanel.nbuttons = ARRAYSIZE(IHNMMainPanel);
_iDesc = IHNM_interface; _iDesc = IHNM_interface;
} else { } else {
return; return;
} }
// Load interface resources
g_resdesc = _vm->getResourceInfo();
// Load command panel resource // Load command panel resource
result = RSC_LoadResource(_interfaceContext, g_resdesc.command_panel_rn, result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->command_panel_rn, &_mainPanel.res, &_mainPanel.res_len);
&_cPanel.res, &_cPanel.res_len);
if (result != SUCCESS) { if (result != SUCCESS) {
return; return;
} }
// Load dialogue panel resource // Load dialogue panel resource
result = RSC_LoadResource(_interfaceContext, g_resdesc.dialogue_panel_rn, result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->dialogue_panel_rn, &_conversePanel.res, &_conversePanel.res_len);
&_dPanel.res, &_dPanel.res_len);
if (result != SUCCESS) { if (result != SUCCESS) {
return; 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"); 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, _vm->decodeBGImage(_mainPanel.res, _mainPanel.res_len, &_mainPanel.img,
&_cPanel.img_len, &_cPanel.img_w, &_cPanel.img_h); &_mainPanel.img_len, &_mainPanel.img_w, &_mainPanel.img_h);
_vm->decodeBGImage(_dPanel.res, _dPanel.res_len, _vm->decodeBGImage(_conversePanel.res, _conversePanel.res_len,
&_dPanel.img, &_dPanel.img_len, &_conversePanel.img, &_conversePanel.img_len,
&_dPanel.img_w, &_dPanel.img_h); &_conversePanel.img_w, &_conversePanel.img_h);
_cPanel.x = 0; _mainPanel.x = 0;
_cPanel.y = 149; _mainPanel.y = 149;
_dPanel.x = 0; _conversePanel.x = 0;
_dPanel.y = 149; _conversePanel.y = 149;
_cPanel.set_button = COMMAND_DEFAULT_BUTTON; _mainPanel.set_button = COMMAND_DEFAULT_BUTTON;
_leftPortrait = 0; _leftPortrait = 0;
_rightPortrait = 0; _rightPortrait = 0;
@ -262,7 +255,7 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {
Interface::~Interface(void) { Interface::~Interface(void) {
free(_inventory); free(_inventory);
_cPanel.sprites.freeMem(); _mainPanel.sprites.freeMem();
_defPortraits.freeMem(); _defPortraits.freeMem();
_scenePortraits.freeMem(); _scenePortraits.freeMem();
_initialized = false; _initialized = false;
@ -310,23 +303,25 @@ void Interface::restoreMode() {
int Interface::setMode(int mode, bool force) { int Interface::setMode(int mode, bool force) {
// TODO: Is this where we should hide/show the mouse cursor? // 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; _inMainMode = false;
else if (mode == kPanelInventory) { } else {
_inMainMode = true; if (mode == kPanelInventory) {
newmode = kPanelMain; _inMainMode = true;
newMode = kPanelMain;
}
} }
// This lets us to prevents actors to pop up during initial // This lets us to prevents actors to pop up during initial
// scene fade in. // scene fade in.
if (_savedMode != -1 && !force) { if (_savedMode != -1 && !force) {
_savedMode = newmode; _savedMode = newMode;
debug(0, "Saved mode: %d. my mode is %d", newmode, _panelMode); debug(0, "Saved mode: %d. my mode is %d", newMode, _panelMode);
} }
else else
_panelMode = newmode; _panelMode = newMode;
draw(); draw();
@ -362,71 +357,63 @@ int Interface::setRightPortrait(int portrait) {
} }
int Interface::draw() { int Interface::draw() {
GAME_DISPLAYINFO g_di; SURFACE *backBuffer;
SURFACE *back_buf;
int xbase; Point base;
int ybase; Point leftPortraitPoint;
Point lportrait; Point rightPortraitPoint;
Point rportrait;
Point origin; Point origin;
back_buf = _vm->_gfx->getBackBuffer(); backBuffer = _vm->_gfx->getBackBuffer();
if (_vm->_scene->isInDemo() || _panelMode == kPanelFade) if (_vm->_scene->isInDemo() || _panelMode == kPanelFade)
return SUCCESS; return SUCCESS;
// Get game display info
_vm->getDisplayInfo(&g_di);
drawStatusBar(back_buf); drawStatusBar(backBuffer);
// Draw command panel background
if (_panelMode == kPanelMain) { if (_panelMode == kPanelMain) {
xbase = _cPanel.x; base.x = _mainPanel.x;
ybase = _cPanel.y; base.y = _mainPanel.y;
origin.x = 0; 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, bufToSurface(backBuffer, _mainPanel.img, _mainPanel.img_w, _mainPanel.img_h, NULL, &origin);
_cPanel.img_h, NULL, &origin);
} else { } else {
xbase = _dPanel.x; base.x = _conversePanel.x;
ybase = _dPanel.y; base.y = _conversePanel.y;
origin.x = 0; 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, bufToSurface(backBuffer, _conversePanel.img, _conversePanel.img_w,
_dPanel.img_h, NULL, &origin); _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 || if (_panelMode == kPanelMain || _panelMode == kPanelConverse ||
_lockedMode == kPanelMain || _lockedMode == kPanelConverse) _lockedMode == kPanelMain || _lockedMode == kPanelConverse) {
_vm->_sprite->draw(back_buf, _defPortraits, _leftPortrait, lportrait, 256); 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) { if (!_inMainMode && _iDesc.rportrait_x >= 0) {
rportrait.x = xbase + _iDesc.rportrait_x; rightPortraitPoint.x = base.x + _iDesc.rportrait_x;
rportrait.y = ybase + _iDesc.rportrait_y; 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(); drawInventory();
}
return SUCCESS; return SUCCESS;
} }
int Interface::update(const Point& imousePt, int update_flag) { int Interface::update(const Point& imousePt, int update_flag) {
GAME_DISPLAYINFO g_di;
SURFACE *back_buf; SURFACE *back_buf;
int imouse_x, imouse_y; int imouse_x, imouse_y;
@ -439,12 +426,10 @@ int Interface::update(const Point& imousePt, int update_flag) {
back_buf = _vm->_gfx->getBackBuffer(); back_buf = _vm->_gfx->getBackBuffer();
// Get game display info
_vm->getDisplayInfo(&g_di);
if (_panelMode == kPanelMain) { // FIXME: HACK if (_panelMode == kPanelMain) { // FIXME: HACK
// Update playfield space ( only if cursor is inside ) // 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 // Mouse is in playfield space
if (update_flag == UPDATE_MOUSEMOVE) { if (update_flag == UPDATE_MOUSEMOVE) {
handlePlayfieldUpdate(back_buf, imousePt); handlePlayfieldUpdate(back_buf, imousePt);
@ -467,7 +452,6 @@ int Interface::update(const Point& imousePt, int update_flag) {
} }
int Interface::drawStatusBar(SURFACE *ds) { int Interface::drawStatusBar(SURFACE *ds) {
GAME_DISPLAYINFO g_di;
Rect rect; Rect rect;
int string_w; int string_w;
@ -479,13 +463,11 @@ int Interface::drawStatusBar(SURFACE *ds) {
return SUCCESS; return SUCCESS;
} }
// Get game display info
_vm->getDisplayInfo(&g_di);
// Erase background of status bar // Erase background of status bar
rect.left = 0; rect.left = 0;
rect.top = _iDesc.status_y; rect.top = _iDesc.status_y;
rect.right = g_di.logical_w; rect.right = _vm->getDisplayWidth();
rect.bottom = _iDesc.status_y + _iDesc.status_h; rect.bottom = _iDesc.status_y + _iDesc.status_h;
drawRect(ds, &rect, _iDesc.status_bgcol); drawRect(ds, &rect, _iDesc.status_bgcol);
@ -516,31 +498,31 @@ int Interface::handleCommandClick(SURFACE *ds, const Point& imousePt) {
return SUCCESS; return SUCCESS;
} }
x_base = _cPanel.x; x_base = _mainPanel.x;
y_base = _cPanel.y; y_base = _mainPanel.y;
if (_cPanel.buttons[ibutton_num].flags & BUTTON_SET) { if (_mainPanel.buttons[ibutton_num].flags & BUTTON_SET) {
old_set_button = _cPanel.set_button; old_set_button = _mainPanel.set_button;
set_button = ibutton_num; set_button = ibutton_num;
_cPanel.set_button = set_button; _mainPanel.set_button = set_button;
if (_cPanel.buttons[set_button].flags & BUTTON_VERB) { if (_mainPanel.buttons[set_button].flags & BUTTON_VERB) {
_activeVerb = _cPanel.buttons[ibutton_num].data; _activeVerb = _mainPanel.buttons[ibutton_num].data;
} }
if (_cPanel.buttons[set_button].flags & BUTTON_BITMAP) { if (_mainPanel.buttons[set_button].flags & BUTTON_BITMAP) {
button.x = x_base + _cPanel.buttons[set_button].x1; button.x = x_base + _mainPanel.buttons[set_button].x1;
button.y = y_base + _cPanel.buttons[set_button].y1; 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); active_sprite - 1, button, 256);
} }
if (_cPanel.buttons[old_set_button].flags & BUTTON_BITMAP) { if (_mainPanel.buttons[old_set_button].flags & BUTTON_BITMAP) {
button.x = x_base + _cPanel.buttons[old_set_button].x1; button.x = x_base + _mainPanel.buttons[old_set_button].x1;
button.y = y_base + _cPanel.buttons[old_set_button].y1; 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); inactive_sprite - 1, button, 256);
} }
} }
@ -553,13 +535,12 @@ int Interface::handleCommandUpdate(SURFACE *ds, const Point& imousePt) {
int ibutton_num; int ibutton_num;
Point button; Point button;
int button_w = 0; // int button_w = 0;
int verb_idx = 0; /* int verb_idx = 0;
int string_w = 0; int string_w = 0;
int color; int color;
int i; int i;*/
hit_button = inventoryTest(imousePt, &ibutton_num); hit_button = inventoryTest(imousePt, &ibutton_num);
@ -568,21 +549,21 @@ int Interface::handleCommandUpdate(SURFACE *ds, const Point& imousePt) {
return SUCCESS; return SUCCESS;
} }
hit_button = hitTest(imousePt, &ibutton_num); /* hit_button = hitTest(imousePt, &ibutton_num);
if (hit_button == SUCCESS) { if (hit_button == SUCCESS) {
// Hovering over a command panel button // Hovering over a command panel button
setStatusText(I_VerbData[_activeVerb].verb_str); setStatusText(I_VerbData[_activeVerb].verb_str);
} }
for (i = 0; i < _cPanel.nbuttons; i++) { for (i = 0; i < _mainPanel.nbuttons; i++) {
if (!(_cPanel.buttons[i].flags & BUTTON_LABEL)) { if (!(_mainPanel.buttons[i].flags & BUTTON_LABEL)) {
continue; 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); 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; color = _iDesc.cmd_txt_col;
} }
button.x = _cPanel.x + _cPanel.buttons[i].x1; button.x = _mainPanel.x + _mainPanel.buttons[i].x1;
button.y = _cPanel.y + _cPanel.buttons[i].y1; button.y = _mainPanel.y + _mainPanel.buttons[i].y1;
_vm->_font->draw(SMALL_FONT_ID, ds, I_VerbData[verb_idx].verb_str, 0, _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, button.x + ((button_w / 2) - (string_w / 2)), button.y + 1,
color, _iDesc.cmd_txt_shadowcol, FONT_SHADOW); color, _iDesc.cmd_txt_shadowcol, FONT_SHADOW);
if ((i == _cPanel.set_button) && (_cPanel.buttons[i].flags & BUTTON_BITMAP)) { if ((i == _mainPanel.set_button) && (_mainPanel.buttons[i].flags & BUTTON_BITMAP)) {
_vm->_sprite->draw(ds, _cPanel.sprites, _cPanel.buttons[i].active_sprite - 1, _vm->_sprite->draw(ds, _mainPanel.sprites, _mainPanel.buttons[i].active_sprite - 1,
button, 256); button, 256);
} }
} }
*/
return SUCCESS; return SUCCESS;
} }
@ -687,7 +668,7 @@ int Interface::handlePlayfieldUpdate(SURFACE *ds, const Point& imousePt) {
} }
int Interface::hitTest(const Point& imousePt, int *ibutton) { int Interface::hitTest(const Point& imousePt, int *ibutton) {
INTERFACE_BUTTON *buttons; InterfaceButton *buttons;
int nbuttons; int nbuttons;
int xbase; int xbase;
@ -695,11 +676,11 @@ int Interface::hitTest(const Point& imousePt, int *ibutton) {
int i; int i;
buttons = _cPanel.buttons; buttons = _mainPanel.buttons;
nbuttons = _cPanel.nbuttons; nbuttons = _mainPanel.nbuttons;
xbase = _cPanel.x; xbase = _mainPanel.x;
ybase = _cPanel.y; ybase = _mainPanel.y;
for (i = 0; i < nbuttons; i++) { for (i = 0; i < nbuttons; i++) {
if ((imousePt.x >= (xbase + buttons[i].x1)) && (imousePt.x < (xbase + buttons[i].x2)) && 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; return FAILURE;
} }
void Interface::drawVerb(int verb, int state) {
}
} // End of namespace Saga } // End of namespace Saga

View file

@ -126,7 +126,7 @@ enum BUTTON_FLAGS {
#define BUTTON_VERB ( BUTTON_LABEL | BUTTON_BITMAP | BUTTON_SET ) #define BUTTON_VERB ( BUTTON_LABEL | BUTTON_BITMAP | BUTTON_SET )
struct INTERFACE_BUTTON { struct InterfaceButton {
int x1; int x1;
int y1; int y1;
int x2; int x2;
@ -138,7 +138,7 @@ struct INTERFACE_BUTTON {
int data; int data;
}; };
struct INTERFACE_PANEL { struct InterfacePanel {
byte *res; byte *res;
size_t res_len; size_t res_len;
int x; int x;
@ -149,7 +149,7 @@ struct INTERFACE_PANEL {
int img_h; int img_h;
int set_button; int set_button;
int nbuttons; int nbuttons;
INTERFACE_BUTTON *buttons; InterfaceButton *buttons;
SpriteList sprites; SpriteList sprites;
}; };
@ -235,6 +235,7 @@ private:
int handleCommandClick(SURFACE *ds, const Point& imousePt); int handleCommandClick(SURFACE *ds, const Point& imousePt);
int handlePlayfieldUpdate(SURFACE *ds, const Point& imousePt); int handlePlayfieldUpdate(SURFACE *ds, const Point& imousePt);
int handlePlayfieldClick(SURFACE *ds, const Point& imousePt); int handlePlayfieldClick(SURFACE *ds, const Point& imousePt);
void drawVerb(int verb, int state);
private: private:
SagaEngine *_vm; SagaEngine *_vm;
@ -247,8 +248,8 @@ private:
int _savedMode; int _savedMode;
int _lockedMode; int _lockedMode;
bool _inMainMode; bool _inMainMode;
INTERFACE_PANEL _cPanel; InterfacePanel _mainPanel;
INTERFACE_PANEL _dPanel; InterfacePanel _conversePanel;
char _statusText[STATUS_TEXT_LEN]; char _statusText[STATUS_TEXT_LEN];
int _leftPortrait; int _leftPortrait;
int _rightPortrait; int _rightPortrait;

View file

@ -132,13 +132,11 @@ int IsoMap::loadMetamap(const byte *mm_res_p, size_t mm_res_len) {
} }
int IsoMap::draw(SURFACE *dst_s) { 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); drawRect(dst_s, &iso_rect, 0);
drawMetamap(dst_s, -1000, -500); drawMetamap(dst_s, -1000, -500);
*/
return SUCCESS; return SUCCESS;
} }

View file

@ -126,7 +126,6 @@ int Scene::ITEStartProc() {
SCENE_QUEUE first_scene; SCENE_QUEUE first_scene;
SCENE_QUEUE tempScene; SCENE_QUEUE tempScene;
GAME_SCENEDESC gs_desc;
n_introscenes = ARRAYSIZE(ITE_IntroList); n_introscenes = ARRAYSIZE(ITE_IntroList);
@ -136,10 +135,9 @@ int Scene::ITEStartProc() {
_vm->_scene->queueScene(&tempScene); _vm->_scene->queueScene(&tempScene);
} }
_vm->getSceneInfo(&gs_desc);
first_scene.load_flag = BY_SCENE; 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_skiptarget = 1;
first_scene.scene_proc = NULL; first_scene.scene_proc = NULL;
first_scene.fadeType = SCENE_FADE; first_scene.fadeType = SCENE_FADE;

View file

@ -46,28 +46,25 @@ Render::Render(SagaEngine *vm, OSystem *system) {
_system = system; _system = system;
_initialized = false; _initialized = false;
GAME_DISPLAYINFO disp_info;
int tmp_w, tmp_h, tmp_bytepp; int tmp_w, tmp_h, tmp_bytepp;
// Initialize system graphics
_vm->getDisplayInfo(&disp_info);
// Initialize FPS timer callback // Initialize FPS timer callback
g_timer->installTimerProc(&fpsTimerCallback, 1000000, this); g_timer->installTimerProc(&fpsTimerCallback, 1000000, this);
// Create background buffer // Create background buffer
_bg_buf_w = disp_info.logical_w; _bg_buf_w = _vm->getDisplayWidth();
_bg_buf_h = disp_info.logical_h; _bg_buf_h = _vm->getDisplayHeight();
_bg_buf = (byte *)calloc(disp_info.logical_w, disp_info.logical_h); _bg_buf = (byte *)calloc(_vm->getDisplayWidth(), _vm->getDisplayHeight());
if (_bg_buf == NULL) { if (_bg_buf == NULL) {
return; error("Render::Render not enough memory");
} }
// Allocate temp buffer for animation decoding, // Allocate temp buffer for animation decoding,
// graphics scalers (2xSaI), etc. // graphics scalers (2xSaI), etc.
tmp_w = disp_info.logical_w; tmp_w = _vm->getDisplayWidth();
tmp_h = disp_info.logical_h + 4; // BG unbanking requres extra rows tmp_h = _vm->getDisplayHeight() + 4; // BG unbanking requres extra rows
tmp_bytepp = 1; tmp_bytepp = 1;
_tmp_buf = (byte *)calloc(1, tmp_w * tmp_h * tmp_bytepp); _tmp_buf = (byte *)calloc(1, tmp_w * tmp_h * tmp_bytepp);
@ -98,7 +95,6 @@ bool Render::initialized() {
int Render::drawScene() { int Render::drawScene() {
SURFACE *backbuf_surface; SURFACE *backbuf_surface;
GAME_DISPLAYINFO disp_info;
SCENE_INFO scene_info; SCENE_INFO scene_info;
SCENE_BGINFO bg_info; SCENE_BGINFO bg_info;
Point bg_pt; Point bg_pt;
@ -118,7 +114,6 @@ int Render::drawScene() {
mouse_pt = _vm->getMousePos(); mouse_pt = _vm->getMousePos();
_vm->_scene->getBGInfo(&bg_info); _vm->_scene->getBGInfo(&bg_info);
_vm->getDisplayInfo(&disp_info);
bg_pt.x = 0; bg_pt.x = 0;
bg_pt.y = 0; bg_pt.y = 0;

View file

@ -169,9 +169,7 @@ int SagaEngine::init(GameDetector &detector) {
_previousTicks = _system->getMillis(); _previousTicks = _system->getMillis();
// Initialize graphics // Initialize graphics
GAME_DISPLAYINFO disp_info; _gfx = new Gfx(_system, _vm->getDisplayWidth(), _vm->getDisplayHeight(), detector);
getDisplayInfo(&disp_info);
_gfx = new Gfx(_system, disp_info.logical_w, disp_info.logical_h, detector);
// Graphics driver should be initialized before console // Graphics driver should be initialized before console
_console = new Console(this); _console = new Console(this);

View file

@ -60,6 +60,9 @@ class Console;
class Events; class Events;
class PalAnim; 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 PBOUNDS(n,max) (((n)>=(0))&&((n)<(max)))
#define MAXPATH 512 #define MAXPATH 512
@ -150,7 +153,7 @@ struct CLICKAREA {
Point *points; Point *points;
}; };
enum GAME_IDS { enum GameIds {
// Dreamers Guild // Dreamers Guild
GID_ITE_DEMO_G = 0, GID_ITE_DEMO_G = 0,
GID_ITE_DISK_G, GID_ITE_DISK_G,
@ -181,7 +184,7 @@ enum GAME_IDS {
GID_IHNM_CD_DE // reported by mld. German retail GID_IHNM_CD_DE // reported by mld. German retail
}; };
enum GAME_FILETYPES { enum GameFileTypes {
GAME_RESOURCEFILE = 1 << 0, GAME_RESOURCEFILE = 1 << 0,
GAME_SCRIPTFILE = 1 << 1, GAME_SCRIPTFILE = 1 << 1,
GAME_SOUNDFILE = 1 << 2, GAME_SOUNDFILE = 1 << 2,
@ -193,14 +196,14 @@ enum GAME_FILETYPES {
GAME_PATCHFILE = 1 << 8 GAME_PATCHFILE = 1 << 8
}; };
enum GAME_SOUNDINFO_TYPES { enum GameSoundTypes {
GAME_SOUND_PCM = 0, GAME_SOUND_PCM = 0,
GAME_SOUND_VOC, GAME_SOUND_VOC,
GAME_SOUND_WAV, GAME_SOUND_WAV,
GAME_SOUND_VOX GAME_SOUND_VOX
}; };
enum GAME_FONT_IDS { enum GameFontIds {
GAME_FONT_SMALL = 0, GAME_FONT_SMALL = 0,
GAME_FONT_MEDIUM, GAME_FONT_MEDIUM,
GAME_FONT_LARGE, GAME_FONT_LARGE,
@ -210,7 +213,7 @@ enum GAME_FONT_IDS {
GAME_FONT_LARGE3 GAME_FONT_LARGE3
}; };
enum GAME_FEATURES { enum GameFeatures {
GF_VOX_VOICES = 1 << 0, GF_VOX_VOICES = 1 << 0,
GF_BIG_ENDIAN_DATA = 1 << 1, GF_BIG_ENDIAN_DATA = 1 << 1,
GF_MAC_RESOURCES = 1 << 2, GF_MAC_RESOURCES = 1 << 2,
@ -218,36 +221,60 @@ enum GAME_FEATURES {
GF_WYRMKEEP = 1 << 4 GF_WYRMKEEP = 1 << 4
}; };
struct GAME_DISPLAYINFO { struct GameSoundInfo {
int logical_w;
int logical_h;
int scene_h;
};
struct GAME_SOUNDINFO {
int res_type; int res_type;
long freq; long freq;
int sample_size; int sample_size;
int stereo; int stereo;
}; };
struct GAME_FONTDESC { struct GameFontDescription {
uint16 font_id; uint16 font_id;
uint32 font_rn; uint32 font_rn;
}; };
struct GAME_SCENEDESC { struct GameResourceDescription {
uint32 scene_lut_rn;
uint32 first_scene;
};
struct GAME_RESOURCEDESC {
uint32 scene_lut_rn; uint32 scene_lut_rn;
uint32 script_lut_rn; uint32 script_lut_rn;
uint32 command_panel_rn; uint32 command_panel_rn;
uint32 dialogue_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) { inline int ticksToMSec(int tick) {
return tick * 1000 / kScriptTimeTicksPerSecond; return tick * 1000 / kScriptTimeTicksPerSecond;
} }
@ -287,10 +314,16 @@ public:
int _soundEnabled; int _soundEnabled;
int _musicEnabled; int _musicEnabled;
char _gameLanguage[GAME_LANGSTR_LIMIT];
RSCFILE_CONTEXT **_gameFileContexts;
//current game description
int _gameId; int _gameId;
int _gameType; int _gameType;
uint32 _features; uint32 _features;
int _gameNumber;
GameDescription *_gameDescription;
SndRes *_sndRes; SndRes *_sndRes;
Sound *_sound; Sound *_sound;
@ -351,18 +384,23 @@ public:
public: public:
int initGame(void); int initGame(void);
RSCFILE_CONTEXT *getFileContext(uint16 type, int param); RSCFILE_CONTEXT *getFileContext(uint16 type, int param);
int getFontInfo(GAME_FONTDESC **, int *); public:
const GAME_RESOURCEDESC getResourceInfo(void); const GameResourceDescription *getResourceDescription() { return _gameDescription->resourceDescription; }
const GAME_SOUNDINFO getSoundInfo(void); const GameSoundInfo *getSoundInfo() { return _gameDescription->soundInfo; }
int getDisplayInfo(GAME_DISPLAYINFO *disp_info); const GameFontDescription *getFontDescription(int index) {
int getSceneInfo(GAME_SCENEDESC *); assert(index < _gameDescription->fontsCount);
int getDisplayWidth(); return &_gameDescription->fontDescriptions[index];
int getDisplayHeight(); }
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 getStatusYOffset();
int getPathYOffset(); int getPathYOffset();
private: private:
int loadLanguage(void); 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 // FIXME: Global var. We use it until everything will be turned into objects

View file

@ -51,14 +51,11 @@ static int initSceneDoors[SCENE_DOORS_MAX] = {
}; };
Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) { Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) {
GAME_SCENEDESC gs_desc;
byte *scene_lut_p; byte *scene_lut_p;
size_t scene_lut_len; size_t scene_lut_len;
int result; int result;
int i; int i;
// Load game-specific scene data
_vm->getSceneInfo(&gs_desc);
// Load scene module resource context // Load scene module resource context
_sceneContext = _vm->getFileContext(GAME_RESOURCEFILE, 0); _sceneContext = _vm->getFileContext(GAME_RESOURCEFILE, 0);
@ -69,8 +66,8 @@ Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) {
// Load scene lookup table // Load scene lookup table
debug(0, "Loading scene LUT from resource %u.", gs_desc.scene_lut_rn); debug(0, "Loading scene LUT from resource %u.", _vm->getResourceDescription()->scene_lut_rn);
result = RSC_LoadResource(_sceneContext, gs_desc.scene_lut_rn, &scene_lut_p, &scene_lut_len); result = RSC_LoadResource(_sceneContext, _vm->getResourceDescription()->scene_lut_rn, &scene_lut_p, &scene_lut_len);
if (result != SUCCESS) { if (result != SUCCESS) {
warning("Scene::Scene(): Error: couldn't load scene LUT"); warning("Scene::Scene(): Error: couldn't load scene LUT");
return; return;
@ -95,9 +92,7 @@ Scene::Scene(SagaEngine *vm) : _vm(vm), _initialized(false) {
free(scene_lut_p); free(scene_lut_p);
if (gs_desc.first_scene != 0) { _firstScene = _vm->getStartSceneNumber();
_firstScene = gs_desc.first_scene;
}
debug(0, "First scene set to %d.", _firstScene); 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) { int Scene::getBGInfo(SCENE_BGINFO *bginfo) {
GAME_DISPLAYINFO di;
int x, y; int x, y;
assert(_initialized); assert(_initialized);
@ -331,16 +325,15 @@ int Scene::getBGInfo(SCENE_BGINFO *bginfo) {
bginfo->bg_h = _bg.h; bginfo->bg_h = _bg.h;
bginfo->bg_p = _bg.p; bginfo->bg_p = _bg.p;
_vm->getDisplayInfo(&di);
x = 0; x = 0;
y = 0; y = 0;
if (_bg.w < di.logical_w) { if (_bg.w < _vm->getDisplayWidth()) {
x = (di.logical_w - _bg.w) / 2; x = (_vm->getDisplayWidth() - _bg.w) / 2;
} }
if (_bg.h < di.scene_h) { if (_bg.h < _vm->getStatusYOffset()) {
y = (di.scene_h - _bg.h) / 2; y = (_vm->getStatusYOffset() - _bg.h) / 2;
} }
bginfo->bg_x = x; bginfo->bg_x = x;
@ -902,23 +895,22 @@ int Scene::processSceneResources() {
} }
int Scene::draw(SURFACE *dst_s) { int Scene::draw(SURFACE *dst_s) {
GAME_DISPLAYINFO disp_info;
BUFFER_INFO buf_info; BUFFER_INFO buf_info;
Point bg_pt; Point bg_pt;
assert(_initialized); assert(_initialized);
_vm->_render->getBufferInfo(&buf_info); _vm->_render->getBufferInfo(&buf_info);
_vm->getDisplayInfo(&disp_info);
bg_pt.x = 0; bg_pt.x = 0;
bg_pt.y = 0; bg_pt.y = 0;
if (_vm->_scene->getFlags() & kSceneFlagISO) if (_vm->_scene->getFlags() & kSceneFlagISO) {
_vm->_isoMap->draw(dst_s); _vm->_isoMap->draw(dst_s);
else } else {
bufToSurface(dst_s, buf_info.bg_buf, disp_info.logical_w, bufToSurface(dst_s, buf_info.bg_buf, _vm->getDisplayWidth(),
MAX(disp_info.scene_h, _bg.h), NULL, &bg_pt); MAX(_vm->getStatusYOffset(), _bg.h), NULL, &bg_pt);
}
return SUCCESS; return SUCCESS;
} }

View file

@ -37,7 +37,6 @@ namespace Saga {
// Initializes the scripting module. // Initializes the scripting module.
// Loads script resource look-up table, initializes script data system // Loads script resource look-up table, initializes script data system
Script::Script() { Script::Script() {
GAME_RESOURCEDESC gr_desc;
RSCFILE_CONTEXT *s_lut_ctxt; RSCFILE_CONTEXT *s_lut_ctxt;
RSCFILE_CONTEXT *resourceContext; RSCFILE_CONTEXT *resourceContext;
byte *rsc_ptr; byte *rsc_ptr;
@ -71,7 +70,6 @@ Script::Script() {
_dataBuf[i].data = NULL; _dataBuf[i].data = NULL;
} }
gr_desc = _vm->getResourceInfo();
debug(0, "Initializing scripting subsystem"); debug(0, "Initializing scripting subsystem");
// Load script resource file context // Load script resource file context
@ -86,8 +84,8 @@ Script::Script() {
error("Couldn't get resource file context"); error("Couldn't get resource file context");
} }
debug(0, "Loading script LUT from resource %u.", gr_desc.script_lut_rn); debug(0, "Loading script LUT from resource %u.", _vm->getResourceDescription()->script_lut_rn);
result = RSC_LoadResource(s_lut_ctxt, gr_desc.script_lut_rn, &rsc_ptr, &rsc_len); result = RSC_LoadResource(s_lut_ctxt, _vm->getResourceDescription()->script_lut_rn, &rsc_ptr, &rsc_len);
if (result != SUCCESS) { if (result != SUCCESS) {
error("Error: Couldn't load script resource look-up table"); error("Error: Couldn't load script resource look-up table");
} }

View file

@ -1005,7 +1005,6 @@ static TEXTLIST_ENTRY *placardTextEntry;
// Param1: string rid // Param1: string rid
int Script::sfPlacard(SCRIPTFUNC_PARAMS) { int Script::sfPlacard(SCRIPTFUNC_PARAMS) {
int stringId; int stringId;
GAME_DISPLAYINFO disp;
SURFACE *back_buf = _vm->_gfx->getBackBuffer(); SURFACE *back_buf = _vm->_gfx->getBackBuffer();
static PALENTRY cur_pal[PAL_ENTRIES]; static PALENTRY cur_pal[PAL_ENTRIES];
PALENTRY *pal; PALENTRY *pal;
@ -1017,8 +1016,6 @@ int Script::sfPlacard(SCRIPTFUNC_PARAMS) {
_vm->_interface->rememberMode(); _vm->_interface->rememberMode();
_vm->_interface->setMode(kPanelPlacard); _vm->_interface->setMode(kPanelPlacard);
_vm->getDisplayInfo(&disp);
stringId = thread->pop(); stringId = thread->pop();
event.type = ONESHOT_EVENT; event.type = ONESHOT_EVENT;
@ -1057,9 +1054,9 @@ int Script::sfPlacard(SCRIPTFUNC_PARAMS) {
event.data = back_buf; event.data = back_buf;
event.param = 138; event.param = 138;
event.param2 = 0; event.param2 = 0;
event.param3 = disp.scene_h; event.param3 = _vm->getStatusYOffset();
event.param4 = 0; event.param4 = 0;
event.param5 = disp.logical_w; event.param5 = _vm->getDisplayWidth();
q_event = _vm->_events->chain(q_event, &event); 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.color = _vm->_gfx->getWhite();
text_entry.effect_color = _vm->_gfx->getBlack(); text_entry.effect_color = _vm->_gfx->getBlack();
text_entry.text_x = disp.logical_w / 2; text_entry.text_x = _vm->getDisplayWidth() / 2;
text_entry.text_y = (disp.scene_h - _vm->_font->getHeight(MEDIUM_FONT_ID)) / 2; text_entry.text_y = (_vm->getStatusYOffset() - _vm->_font->getHeight(MEDIUM_FONT_ID)) / 2;
text_entry.font_id = MEDIUM_FONT_ID; text_entry.font_id = MEDIUM_FONT_ID;
text_entry.flags = FONT_OUTLINE | FONT_CENTERED; text_entry.flags = FONT_OUTLINE | FONT_CENTERED;
text_entry.string = getScriptString(stringId); text_entry.string = getScriptString(stringId);

View file

@ -51,7 +51,7 @@ SndRes::SndRes(SagaEngine *vm) : _vm(vm) {
} }
// Grab sound resource information for the current game // Grab sound resource information for the current game
_snd_info = _vm->getSoundInfo(); _snd_info = *_vm->getSoundInfo();
_init = 1; _init = 1;
} }

View file

@ -51,7 +51,7 @@ public:
RSCFILE_CONTEXT *_sfx_ctxt; RSCFILE_CONTEXT *_sfx_ctxt;
RSCFILE_CONTEXT *_voice_ctxt; RSCFILE_CONTEXT *_voice_ctxt;
GAME_SOUNDINFO _snd_info; GameSoundInfo _snd_info;
SagaEngine *_vm; SagaEngine *_vm;
}; };