o Added support for German ITE. There are also Puzzle-related messages

hardcoded, but I'll save that for later :)
o Eliminated all leftovers of previous language loader. If you'll spot another
  one, just remove it silently.

svn-id: r16556
This commit is contained in:
Eugene Sandulenko 2005-01-14 01:17:34 +00:00
parent 211ec4c32a
commit ccacf6f82e
5 changed files with 159 additions and 138 deletions

View File

@ -689,37 +689,6 @@ int SagaEngine::initGame(void) {
warning("Error loading game resource files.");
return FAILURE;
}
// Load dialogue file
loadLanguage();
return SUCCESS;
}
int SagaEngine::loadLanguage(void) {
char lang_file[MAXPATH];
File test_file;
if (getGameType() == 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;
}
test_file.close();
if (_vm->_scene->ITEIntroRegisterLang() != SUCCESS) {
warning("Error registering intro sequence language cvars");
return FAILURE;
}
debug(0, "Using language file %s.", lang_file);
// FIXME
//CFG_Read(lang_path);
} else {
debug(0, "Language support for this game not implemented.");
}
return SUCCESS;
}

View File

@ -40,8 +40,8 @@
namespace Saga {
static INTRO_DIALOGUE IntroDiag[] = {
{
static INTRO_DIALOGUE IntroDiag[][14] = {
{ {
RID_CAVE_VOICE_0, "intro1a",
"We see the sky, we see the land, we see the water, "
"and we wonder: Are we the only ones?"
@ -105,7 +105,71 @@ static INTRO_DIALOGUE IntroDiag[] = {
{
RID_CAVE_VOICE_13, "intro4d",
"And will we also share the same fate one day?"
} },
// German
{ {
RID_CAVE_VOICE_0, "intro1a",
"Um uns sind der Himmel, das Land und die Seen; und wir "
"fragen uns - sind wir die einzigen?"
},
{
RID_CAVE_VOICE_1, "intro2a",
"Lange vor unserer Zeit herrschten die Menschen \201ber die Erde."
},
{
RID_CAVE_VOICE_2, "intro3a",
"Sie taten wundersame Dinge und versetzten ganze Berge."
},
{
RID_CAVE_VOICE_3, "intro4a",
"Sie kannten das Geheimnis des Fluges, das Geheimnis der Fr\224hlichkeit "
"und andere Geheimnisse, die unsere Vorstellungskraft \201bersteigen."
},
{
RID_CAVE_VOICE_4, "intro1b",
"Au$erdem kannten die Menschen das Geheimnis des Lebens. Und sie nutzten "
"es, um uns die vier gro$en Geschenke zu geben -"
},
{
RID_CAVE_VOICE_5, "intro2b",
"den denkenden Geist, das f\201hlende Herz, den sprechenden Mund und die "
"greifende Hand."
},
{
RID_CAVE_VOICE_6, "intro3b",
"Wir sind ihre Kinder."
},
{
RID_CAVE_VOICE_7, "intro1c",
"Sie lehrten uns zu sprechen und unsere H\204nde zu benutzen."
},
{
RID_CAVE_VOICE_8, "intro2c",
"Sie zeigten uns die Freude am Denken."
},
{
RID_CAVE_VOICE_9, "intro3c",
"Sie liebten uns, und w\204ren wir bereit gewesen, h\204tten sie "
"uns sicherlich das Geheimnis der Fr\224hlichkeit offenbart."
},
{
RID_CAVE_VOICE_10, "intro1d",
"Und nun sehen wir den Himmel, das Land und die Seen - unser Erbe. "
"Und wir fragen uns - warum verschwanden sie?"
},
{
RID_CAVE_VOICE_11, "intro2d",
"Leben sie noch in den Sternen? In den Tiefen des Ozeans? Im Wind?"
},
{
RID_CAVE_VOICE_12, "intro3d",
"Wir fragen uns - war ihr Schicksal gut oder b\224se?"
},
{
RID_CAVE_VOICE_13, "intro4d",
"Und wird uns eines Tages das gleiche Schicksal ereilen?"
} }
};
SCENE_QUEUE ITE_IntroList[] = {
@ -147,35 +211,21 @@ int Scene::ITEStartProc() {
return SUCCESS;
}
int Scene::ITEIntroRegisterLang() {
#if 0
size_t i;
for (i = 0; i < ARRAYSIZE(IntroDiag); i++) {
if (CVAR_Register_S(IntroDiag[i].i_str,
IntroDiag[i].i_cvar_name,
NULL, CVAR_CFG, INTRO_STRMAX) != SUCCESS) {
warning("Error registering intro text cvars");
return FAILURE;
}
}
#endif
return SUCCESS;
}
enum {
kCHeader,
kCText
};
enum {
kITEPC = (1 << 0),
kITEPCCD = (1 << 1),
kITEMac = (1 << 2),
kITEWyrmKeep = (1 << 3),
kITEAny = 0xffff,
kITENotWyrmKeep = kITEAny & ~kITEWyrmKeep
kITEPC = (1 << 0),
kITEPCCD = (1 << 1),
kITEMac = (1 << 2),
kITEWyrmKeep = (1 << 3),
kITEDe = (1 << 4),
kITEAny = 0xffff,
kITENotWyrmKeep = kITEAny & ~kITEWyrmKeep,
kITENotDe = kITEAny & ~kITEDe,
kITENotDeNotWyrm = kITENotWyrmKeep & ~kITEDe
};
#define INV(n) (kITEAny & ~(n))
@ -189,7 +239,9 @@ EVENT *Scene::ITEQueueCredits(SCENE_INFO *scene_info, int delta_time, int durati
// The assumption here is that all WyrmKeep versions have the same
// credits, regardless of which operating system they're for.
if (_vm->getFeatures() & GF_WYRMKEEP) {
if (_vm->getFeatures() & GF_LANG_DE) {
game = kITEDe;
} else if (_vm->getFeatures() & GF_WYRMKEEP) {
game = kITEWyrmKeep;
} else if (_vm->getFeatures() & GF_MAC_RESOURCES) {
game = kITEMac;
@ -389,6 +441,7 @@ int Scene::ITEIntroCave1Proc(int param, SCENE_INFO *scene_info) {
TEXTLIST_ENTRY *entry_p;
int i;
int font_flags = FONT_OUTLINE | FONT_CENTERED;
int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0;
switch (param) {
case SCENE_BEGIN:
@ -404,12 +457,13 @@ int Scene::ITEIntroCave1Proc(int param, SCENE_INFO *scene_info) {
text_entry.color = 255;
text_entry.effect_color = 0;
text_entry.text_x = 320 / 2;
text_entry.text_y = INTRO_CAPTION_Y;
text_entry.text_y = _vm->getFeatures() & GF_LANG_DE ? INTRO_DE_CAPTION_Y :
INTRO_CAPTION_Y;
text_entry.font_id = MEDIUM_FONT_ID;
text_entry.flags = font_flags;
for (i = INTRO_CAVE1_START; i < INTRO_CAVE1_END; i++) {
text_entry.string = IntroDiag[i].i_str;
text_entry.string = IntroDiag[lang][i].i_str;
entry_p = _vm->textAddEntry(scene_info->text_list, &text_entry);
// Display text
@ -425,14 +479,14 @@ int Scene::ITEIntroCave1Proc(int param, SCENE_INFO *scene_info) {
event.type = ONESHOT_EVENT;
event.code = VOICE_EVENT;
event.op = EVENT_PLAY;
event.param = IntroDiag[i].i_voice_rn;
event.param = IntroDiag[lang][i].i_voice_rn;
event.time = event_time;
q_event = _vm->_events->chain(q_event, &event);
voice_len = _vm->_sndRes->getVoiceLength(IntroDiag[i].i_voice_rn);
voice_len = _vm->_sndRes->getVoiceLength(IntroDiag[lang][i].i_voice_rn);
if (voice_len < 0) {
voice_len = strlen(IntroDiag[i].i_str) * VOICE_LETTERLEN;
voice_len = strlen(IntroDiag[lang][i].i_str) * VOICE_LETTERLEN;
}
// Remove text
@ -481,6 +535,7 @@ int Scene::ITEIntroCave2Proc(int param, SCENE_INFO *scene_info) {
TEXTLIST_ENTRY *entry_p;
int i;
int font_flags = FONT_OUTLINE | FONT_CENTERED;
int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0;
switch (param) {
case SCENE_BEGIN:
@ -505,12 +560,13 @@ int Scene::ITEIntroCave2Proc(int param, SCENE_INFO *scene_info) {
text_entry.color = 255;
text_entry.effect_color = 0;
text_entry.text_x = 320 / 2;
text_entry.text_y = INTRO_CAPTION_Y;
text_entry.text_y = _vm->getFeatures() & GF_LANG_DE ? INTRO_DE_CAPTION_Y :
INTRO_CAPTION_Y;
text_entry.font_id = MEDIUM_FONT_ID;
text_entry.flags = font_flags;
for (i = INTRO_CAVE2_START; i < INTRO_CAVE2_END; i++) {
text_entry.string = IntroDiag[i].i_str;
text_entry.string = IntroDiag[lang][i].i_str;
entry_p = _vm->textAddEntry(scene_info->text_list, &text_entry);
// Display text
@ -526,14 +582,14 @@ int Scene::ITEIntroCave2Proc(int param, SCENE_INFO *scene_info) {
event.type = ONESHOT_EVENT;
event.code = VOICE_EVENT;
event.op = EVENT_PLAY;
event.param = IntroDiag[i].i_voice_rn;
event.param = IntroDiag[lang][i].i_voice_rn;
event.time = event_time;
q_event = _vm->_events->chain(q_event, &event);
voice_len = _vm->_sndRes->getVoiceLength(IntroDiag[i].i_voice_rn);
voice_len = _vm->_sndRes->getVoiceLength(IntroDiag[lang][i].i_voice_rn);
if (voice_len < 0) {
voice_len = strlen(IntroDiag[i].i_str) * VOICE_LETTERLEN;
voice_len = strlen(IntroDiag[lang][i].i_str) * VOICE_LETTERLEN;
}
// Remove text
@ -581,6 +637,7 @@ int Scene::ITEIntroCave3Proc(int param, SCENE_INFO *scene_info) {
TEXTLIST_ENTRY *entry_p;
int i;
int font_flags = FONT_OUTLINE | FONT_CENTERED;
int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0;
switch (param) {
case SCENE_BEGIN:
@ -605,12 +662,13 @@ int Scene::ITEIntroCave3Proc(int param, SCENE_INFO *scene_info) {
text_entry.color = 255;
text_entry.effect_color = 0;
text_entry.text_x = 320 / 2;
text_entry.text_y = INTRO_CAPTION_Y;
text_entry.text_y = _vm->getFeatures() & GF_LANG_DE ? INTRO_DE_CAPTION_Y :
INTRO_CAPTION_Y;
text_entry.font_id = MEDIUM_FONT_ID;
text_entry.flags = font_flags;
for (i = INTRO_CAVE3_START; i < INTRO_CAVE3_END; i++) {
text_entry.string = IntroDiag[i].i_str;
text_entry.string = IntroDiag[lang][i].i_str;
entry_p = _vm->textAddEntry(scene_info->text_list, &text_entry);
// Display text
@ -626,14 +684,14 @@ int Scene::ITEIntroCave3Proc(int param, SCENE_INFO *scene_info) {
event.type = ONESHOT_EVENT;
event.code = VOICE_EVENT;
event.op = EVENT_PLAY;
event.param = IntroDiag[i].i_voice_rn;
event.param = IntroDiag[lang][i].i_voice_rn;
event.time = event_time;
q_event = _vm->_events->chain(q_event, &event);
voice_len = _vm->_sndRes->getVoiceLength(IntroDiag[i].i_voice_rn);
voice_len = _vm->_sndRes->getVoiceLength(IntroDiag[lang][i].i_voice_rn);
if (voice_len < 0) {
voice_len = strlen(IntroDiag[i].i_str) * VOICE_LETTERLEN;
voice_len = strlen(IntroDiag[lang][i].i_str) * VOICE_LETTERLEN;
}
// Remove text
@ -682,6 +740,7 @@ int Scene::ITEIntroCave4Proc(int param, SCENE_INFO *scene_info) {
TEXTLIST_ENTRY *entry_p;
int i;
int font_flags = FONT_OUTLINE | FONT_CENTERED;
int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0;
switch (param) {
case SCENE_BEGIN:
@ -706,12 +765,13 @@ int Scene::ITEIntroCave4Proc(int param, SCENE_INFO *scene_info) {
text_entry.color = 255;
text_entry.effect_color = 0;
text_entry.text_x = 320 / 2;
text_entry.text_y = INTRO_CAPTION_Y;
text_entry.text_y = _vm->getFeatures() & GF_LANG_DE ? INTRO_DE_CAPTION_Y :
INTRO_CAPTION_Y;
text_entry.font_id = MEDIUM_FONT_ID;
text_entry.flags = font_flags;
for (i = INTRO_CAVE4_START; i < INTRO_CAVE4_END; i++) {
text_entry.string = IntroDiag[i].i_str;
text_entry.string = IntroDiag[lang][i].i_str;
entry_p = _vm->textAddEntry(scene_info->text_list, &text_entry);
// Display text
@ -727,14 +787,14 @@ int Scene::ITEIntroCave4Proc(int param, SCENE_INFO *scene_info) {
event.type = ONESHOT_EVENT;
event.code = VOICE_EVENT;
event.op = EVENT_PLAY;
event.param = IntroDiag[i].i_voice_rn;
event.param = IntroDiag[lang][i].i_voice_rn;
event.time = event_time;
q_event = _vm->_events->chain(q_event, &event);
voice_len = _vm->_sndRes->getVoiceLength(IntroDiag[i].i_voice_rn);
voice_len = _vm->_sndRes->getVoiceLength(IntroDiag[lang][i].i_voice_rn);
if (voice_len < 0) {
voice_len = strlen(IntroDiag[i].i_str) * VOICE_LETTERLEN;
voice_len = strlen(IntroDiag[lang][i].i_str) * VOICE_LETTERLEN;
}
// Remove text
@ -778,12 +838,15 @@ int Scene::ITEIntroValleyProc(int param, SCENE_INFO *scene_info) {
EVENT *q_event;
const INTRO_CREDIT credits[] = {
{kITEAny, kCHeader, "Producer"},
{kITENotDe, kCHeader, "Producer"},
{kITEDe, kCHeader, "Produzent"},
{kITEAny, kCText, "Walter Hochbrueckner"},
{kITEAny, kCHeader, "Executive Producer"},
{kITENotDe, kCHeader, "Executive Producer"},
{kITEDe, kCHeader, "Ausf\201hrender Produzent"},
{kITEAny, kCText, "Robert McNally"},
{kITEWyrmKeep, kCHeader, "2nd Executive Producer"},
{kITENotWyrmKeep, kCHeader, "Publisher"},
{kITENotDeNotWyrm, kCHeader, "Herausgeber"},
{kITEAny, kCText, "Jon Van Caneghem"}
};
@ -881,11 +944,15 @@ int Scene::ITEIntroTreeHouseProc(int param, SCENE_INFO *scene_info) {
EVENT *q_event;
const INTRO_CREDIT credits1[] = {
{kITEAny, kCHeader, "Game Design"},
{kITENotDe, kCHeader, "Game Design"},
{kITEDe, kCHeader, "Spielentwurf"},
{kITEAny, kCText, "Talin, Joe Pearce, Robert McNally"},
{kITEAny, kCText, "and Carolly Hauksdottir"},
{kITEAny, kCHeader, "Screenplay and Dialog"},
{kITEAny, kCText, "Robert Leh, Len Wein, and Bill Rotsler"}
{kITENotDe, kCText, "and Carolly Hauksdottir"},
{kITEDe, kCText, "und Carolly Hauksdottir"},
{kITENotDe, kCHeader, "Screenplay and Dialog"},
{kITEDe, kCHeader, "Geschichte und Dialoge"},
{kITENotDe, kCText, "Robert Leh, Len Wein, and Bill Rotsler"},
{kITEDe, kCText, "Robert Leh, Len Wein und Bill Rotsler"}
};
int n_credits1 = ARRAYSIZE(credits1);
@ -893,13 +960,16 @@ int Scene::ITEIntroTreeHouseProc(int param, SCENE_INFO *scene_info) {
const INTRO_CREDIT credits2[] = {
{kITEWyrmKeep, kCHeader, "Art Direction"},
{kITEWyrmKeep, kCText, "Allison Hershey"},
{kITEAny, kCHeader, "Art"},
{kITENotDe, kCHeader, "Art"},
{kITEDe, kCHeader, "Grafiken"},
{kITEAny, kCText, "Edward Lacabanne, Glenn Price, April Lee,"},
{kITEWyrmKeep, kCText, "Lisa Sample, Brian Dowrick, Reed Waller,"},
{kITEWyrmKeep, kCText, "Allison Hershey and Talin"},
{kITENotWyrmKeep, kCText, "Lisa Iennaco, Brian Dowrick, Reed"},
{kITENotWyrmKeep, kCText, "Waller, Allison Hershey and Talin"},
{kITENotWyrmKeep, kCHeader, "Art Direction"},
{kITENotDeNotWyrm, kCText, "Waller, Allison Hershey and Talin"},
{kITEDe, kCText, "Waller, Allison Hershey und Talin"},
{kITENotDeNotWyrm, kCHeader, "Art Direction"},
{kITEDe, kCHeader, "Grafische Leitung"},
{kITENotWyrmKeep, kCText, "Allison Hershey"}
};
@ -959,21 +1029,25 @@ int Scene::ITEIntroFairePathProc(int param, SCENE_INFO *scene_info) {
EVENT *q_event;
const INTRO_CREDIT credits1[] = {
{kITEAny, kCHeader, "Programming"},
{kITENotDe, kCHeader, "Programming"},
{kITEDe, kCHeader, "Programmiert von"},
{kITEAny, kCText, "Talin, Walter Hochbrueckner,"},
{kITEAny, kCText, "Joe Burks and Robert Wiggins"},
{kITENotDe, kCText, "Joe Burks and Robert Wiggins"},
{kITEDe, kCText, "Joe Burks und Robert Wiggins"},
{kITEPCCD | kITEWyrmKeep, kCHeader, "Additional Programming"},
{kITEPCCD | kITEWyrmKeep, kCText, "John Bolton"},
{kITEMac, kCHeader, "Macintosh Version"},
{kITEMac, kCText, "Michael McNally and Robert McNally"},
{kITEAny, kCHeader, "Music and Sound"},
{kITENotDe, kCHeader, "Music and Sound"},
{kITEDe, kCHeader, "Musik und Sound"},
{kITEAny, kCText, "Matt Nathan"}
};
int n_credits1 = ARRAYSIZE(credits1);
const INTRO_CREDIT credits2[] = {
{kITEAny, kCHeader, "Directed by"},
{kITENotDe, kCHeader, "Directed by"},
{kITEDe, kCHeader, "Regie"},
{kITEAny, kCText, "Talin"}
};

View File

@ -60,46 +60,28 @@ static const GameSettings saga_games[] = {
{0, 0, 0}
};
static const char *englishTextStrings[] = {
"Walk to",
"Look At",
"Pick Up",
"Talk to",
"Open",
"Close",
"Use",
"Give",
"Options",
"Test",
"Demo",
"Help",
"Quit Game",
"Fast",
"Slow",
"On",
"Off",
"Continue Playing",
"Load",
"Save",
"Game Options",
"Reading Speed",
"Music",
"Sound",
"Cancel",
"Quit",
"OK",
"Mid",
"Click",
"10%",
"20%",
"30%",
"40%",
"50%",
"60%",
"70%",
"80%",
"90%",
"Max"
static const char *interfaceTextStrings[][39] = {
{
"Walk to", "Look At", "Pick Up", "Talk to", "Open",
"Close", "Use", "Give", "Options", "Test",
"Demo", "Help", "Quit Game", "Fast", "Slow",
"On", "Off", "Continue Playing", "Load", "Save",
"Game Options", "Reading Speed", "Music", "Sound", "Cancel",
"Quit", "OK", "Mid", "Click",
"10%", "20%", "30%", "40%", "50%",
"60%", "70%", "80%", "90%", "Max"
},
// German
{
"Gehe zu", "Schau an", "Nimm", "Rede mit", "\231ffne",
"Schlie$e", "Benutze", "Gib", "Optionen", "Test",
"Demo", "Hilfe", "Spiel beenden", "S", "L",
"An", "Aus", "Weiterspielen", "Laden", "Sichern",
"Spieleoptionen", "Lesegeschw.", "Musik", "Sound", "Abbr.",
"Beenden", "OK", "M", "Klick",
"10%", "20%", "30%", "40%", "50%",
"60%", "70%", "80%", "90%", "Max"
}
};
GameList Engine_SAGA_gameList() {
@ -377,7 +359,9 @@ const char *SagaEngine::getObjectName(uint16 objectId) {
const char *SagaEngine::getTextString(int textStringId) {
return englishTextStrings[textStringId]; //TODO: i18n
int lang = _vm->getFeatures() & GF_LANG_DE ? 1 : 0;
return interfaceTextStrings[lang][textStringId];
}
} // End of namespace Saga

View File

@ -60,10 +60,6 @@ class Console;
class Events;
class PalAnim;
#define GAME_LANGSTR_LIMIT 3
#define GAME_ITE_LANG_PREFIX "ite_"
#define GAME_LANG_EXT "lng"
#define MIN_IMG_RLECODE 3
#define MODEX_SCANLINE_LIMIT 200
@ -462,7 +458,6 @@ public:
Point _mousePos;
bool _quit;
char _gameLanguage[GAME_LANGSTR_LIMIT];
RSCFILE_CONTEXT **_gameFileContexts;
//current game description
@ -497,7 +492,6 @@ public:
const char *getTextString(int textStringId);
private:
int loadLanguage(void);
int loadGame(int gameNumber);
};

View File

@ -160,6 +160,7 @@ typedef Common::List<SCENE_QUEUE> SceneQueueList;
#define ITE_INTRO_FRAMETIME 90
#define INTRO_CAPTION_Y 170
#define INTRO_DE_CAPTION_Y 160
#define VOICE_PAD 50
#define VOICE_LETTERLEN 90
@ -303,7 +304,6 @@ class Scene {
int IHNMHateProc(int param, SCENE_INFO *scene_info);
public:
int ITEIntroRegisterLang(void);
static int SC_ITEIntroAnimProc(int param, SCENE_INFO *scene_info, void *refCon);
static int SC_ITEIntroCave1Proc(int param, SCENE_INFO *scene_info, void *refCon);
static int SC_ITEIntroCave2Proc(int param, SCENE_INFO *scene_info, void *refCon);