TINSEL: Added support for the 3,4 and 5 FLAGS (multi lingual) versions of DW (only 4 flags version has been tested; see also bug #2048383)

svn-id: r34210
This commit is contained in:
Max Horn 2008-08-30 21:03:15 +00:00
parent 2e9bdfb3b1
commit 396d815e15
6 changed files with 203 additions and 136 deletions

View File

@ -24,8 +24,6 @@
* This file contains configuration functionality
*/
//#define USE_3FLAGS 1
#include "tinsel/config.h"
#include "tinsel/dw.h"
#include "tinsel/sound.h"
@ -47,7 +45,7 @@ int volVoice = MAXSAMPVOL;
int speedText = DEFTEXTSPEED;
int bSubtitles = false;
int bSwapButtons = 0;
LANGUAGE language = TXT_ENGLISH;
LANGUAGE g_language = TXT_ENGLISH;
int bAmerica = 0;
@ -68,6 +66,32 @@ void WriteConfig(void) {
//ConfMan.setBool("swap_buttons", bSwapButtons ? 1 : 0);
//ConfigData.language = language; // not necessary, as language has been set in the launcher
//ConfigData.bAmerica = bAmerica; // EN_USA / EN_GRB
// Store language for multilingual versions
if ((_vm->getFeatures() & GF_USE_3FLAGS) || (_vm->getFeatures() & GF_USE_4FLAGS) || (_vm->getFeatures() & GF_USE_5FLAGS)) {
Common::Language lang;
switch (g_language) {
case TXT_FRENCH:
lang = Common::FR_FRA;
break;
case TXT_GERMAN:
lang = Common::DE_DEU;
break;
case TXT_SPANISH:
lang = Common::ES_ESP;
break;
case TXT_ITALIAN:
lang = Common::IT_ITA;
break;
default:
lang = Common::EN_ANY;
}
ConfMan.set("language", Common::getLanguageCode(lang));
}
// Write to disk
ConfMan.flushToDisk();
}
/*---------------------------------------------------------------------*\
@ -94,24 +118,53 @@ void ReadConfig(void) {
//ConfigData.language = language; // not necessary, as language has been set in the launcher
//ConfigData.bAmerica = bAmerica; // EN_USA / EN_GRB
// The flags here control how many country flags are displayed in one of the option dialogs.
#if defined(USE_3FLAGS) || defined(USE_4FLAGS) || defined(USE_5FLAGS)
language = ConfigData.language;
#ifdef USE_3FLAGS
if (language == TXT_ENGLISH || language == TXT_ITALIAN) {
language = TXT_GERMAN;
bSubtitles = true;
// Set language - we'll be clever here and use the ScummVM language setting
g_language = TXT_ENGLISH;
Common::Language lang = _vm->getLanguage();
if (lang == Common::UNK_LANG && ConfMan.hasKey("language"))
lang = Common::parseLanguage(ConfMan.get("language")); // For multi-lingual versions, fall back to user settings
switch (lang) {
case Common::FR_FRA:
g_language = TXT_FRENCH;
break;
case Common::DE_DEU:
g_language = TXT_GERMAN;
break;
case Common::ES_ESP:
g_language = TXT_SPANISH;
break;
case Common::IT_ITA:
g_language = TXT_ITALIAN;
break;
default:
g_language = TXT_ENGLISH;
}
#endif
#ifdef USE_4FLAGS
if (language == TXT_ENGLISH) {
language = TXT_GERMAN;
if (lang == Common::JA_JPN) {
// TODO: Add support for JAPAN version
} else if (lang == Common::HB_ISR) {
// TODO: Add support for HEBREW version
// The Hebrew version appears to the software as being English
// but it needs to have subtitles on...
g_language = TXT_ENGLISH;
bSubtitles = true;
} else if (_vm->getFeatures() & GF_USE_3FLAGS) {
// 3 FLAGS version supports French, German, Spanish
// Fall back to German if necessary
if (g_language != TXT_FRENCH && g_language != TXT_GERMAN && g_language != TXT_SPANISH) {
g_language = TXT_GERMAN;
bSubtitles = true;
}
} else if (_vm->getFeatures() & GF_USE_4FLAGS) {
// 4 FLAGS version supports French, German, Spanish, Italian
// Fall back to German if necessary
if (g_language != TXT_FRENCH && g_language != TXT_GERMAN &&
g_language != TXT_SPANISH && g_language != TXT_ITALIAN) {
g_language = TXT_GERMAN;
bSubtitles = true;
}
}
#endif
#else
language = TXT_ENGLISH;
#endif
}
bool isJapanMode() {

View File

@ -30,23 +30,11 @@
namespace Tinsel {
// None of these defined -> 1 language, in ENGLISH.TXT
//#define USE_5FLAGS 1 // All 5 flags
//#define USE_4FLAGS 1 // French, German, Italian, Spanish
//#define USE_3FLAGS 1 // French, German, Spanish
// The Hebrew version appears to the software as being English
// but it needs to have subtitles on...
//#define HEBREW 1
//#define JAPAN 1
// double click timer initial value
#define DOUBLE_CLICK_TIME 6 // 6 @ 18Hz = .33 sec
#define DEFTEXTSPEED 0
enum {
DOUBLE_CLICK_TIME = 6, // 6 @ 18Hz = .33 sec
DEFTEXTSPEED = 0
};
extern int dclickSpeed;
extern int volMidi;
@ -55,7 +43,7 @@ extern int volVoice;
extern int speedText;
extern int bSubtitles;
extern int bSwapButtons;
extern LANGUAGE language;
extern LANGUAGE g_language;
extern int bAmerica;
void WriteConfig(void);

View File

@ -130,6 +130,30 @@ static const TinselGameDescription gameDescriptions[] = {
TINSEL_V1,
},
{ // Multilingual CD with english speech and *.gra files.
// Note: It contains no english subtitles.
{
"dw",
"CD",
{
{"dw.gra", 0, "c8808ccd988d603dd35dff42013ae7fd", 781656},
{"english.smp", 0, NULL, -1},
{"french.txt", 0, NULL, -1},
{"german.txt", 0, NULL, -1},
{"italian.txt", 0, NULL, -1},
{"spanish.txt", 0, NULL, -1},
{NULL, 0, NULL, 0}
},
Common::UNK_LANG,
Common::kPlatformPC,
Common::ADGF_NO_FLAGS
},
GID_DW1,
0,
GF_CD | GF_USE_4FLAGS,
TINSEL_V1,
},
{ // English CD with SCN files
{
"dw",

View File

@ -29,8 +29,6 @@
* And there's still a bit of tidying and commenting to do yet.
*/
//#define USE_3FLAGS 1
#include "tinsel/actors.h"
#include "tinsel/anim.h"
#include "tinsel/background.h"
@ -370,9 +368,7 @@ enum BFUNC {
NOFUNC, SAVEGAME, LOADGAME, IQUITGAME, CLOSEWIN,
OPENLOAD, OPENSAVE, OPENREST,
OPENSOUND, OPENCONT,
#ifndef JAPAN
OPENSUBT,
#endif
OPENQUIT,
INITGAME, MIDIVOL,
CLANG, RLANG
@ -402,9 +398,7 @@ struct CONFBOX {
#define SIX_RESTART_OPTION 2
#define SIX_SOUND_OPTION 3
#define SIX_CONTROL_OPTION 4
#ifndef JAPAN
#define SIX_SUBTITLES_OPTION 5
#endif
#define SIX_QUIT_OPTION 6
#define SIX_RESUME_OPTION 7
#define SIX_LOAD_HEADING 8
@ -568,41 +562,60 @@ CONFBOX controlBox[] = {
/*-------------------------------------------------------------*\
| This is the subtitles 'menu'. |
| This is the subtitles 'menu'. |
\*-------------------------------------------------------------*/
#ifndef JAPAN
CONFBOX subtitlesBox[] = {
#ifdef USE_5FLAGS
{ SLIDER, NOFUNC, NULL, SIX_TSPEED_SLIDER, 142, 20, 100, 2, &speedText, 0 },
{ TOGGLE, NOFUNC, NULL, SIX_STITLE_TOGGLE, 142, 20+40, 23, 19, &bSubtitles, 0 },
};
CONFBOX subtitlesBox3Flags[] = {
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 15, 118, 56, 32, NULL, FIX_FR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 85, 118, 56, 32, NULL, FIX_GR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 155, 118, 56, 32, NULL, FIX_SP },
{ SLIDER, NOFUNC, NULL, SIX_TSPEED_SLIDER, 142, 20, 100, 2, &speedText, 0 },
{ TOGGLE, NOFUNC, NULL, SIX_STITLE_TOGGLE, 142, 20+40, 23, 19, &bSubtitles, 0 },
{ ARSGBUT, CLANG, NULL, USE_POINTER, 230, 110, 23, 19, NULL, IX_TICK1 },
{ AAGBUT, RLANG, NULL, USE_POINTER, 230, 140, 23, 19, NULL, IX_CROSS1 }
};
CONFBOX subtitlesBox4Flags[] = {
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 20, 100, 56, 32, NULL, FIX_FR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 108, 100, 56, 32, NULL, FIX_GR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 64, 137, 56, 32, NULL, FIX_IT },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 152, 137, 56, 32, NULL, FIX_SP },
{ SLIDER, NOFUNC, NULL, SIX_TSPEED_SLIDER, 142, 20, 100, 2, &speedText, 0 },
{ TOGGLE, NOFUNC, NULL, SIX_STITLE_TOGGLE, 142, 20+40, 23, 19, &bSubtitles, 0 },
{ ARSGBUT, CLANG, NULL, USE_POINTER, 230, 110, 23, 19, NULL, IX_TICK1 },
{ AAGBUT, RLANG, NULL, USE_POINTER, 230, 140, 23, 19, NULL, IX_CROSS1 }
};
CONFBOX subtitlesBox5Flags[] = {
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 15, 100, 56, 32, NULL, FIX_UK },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 85, 100, 56, 32, NULL, FIX_FR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 155, 100, 56, 32, NULL, FIX_GR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 50, 137, 56, 32, NULL, FIX_IT },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 120, 137, 56, 32, NULL, FIX_SP },
#endif
#ifdef USE_4FLAGS
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 20, 100, 56, 32, NULL, FIX_FR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 108, 100, 56, 32, NULL, FIX_GR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 64, 137, 56, 32, NULL, FIX_IT },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 152, 137, 56, 32, NULL, FIX_SP },
#endif
#ifdef USE_3FLAGS
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 15, 118, 56, 32, NULL, FIX_FR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 85, 118, 56, 32, NULL, FIX_GR },
{ FRGROUP, NOFUNC, NULL, USE_POINTER, 155, 118, 56, 32, NULL, FIX_SP },
#endif
{ SLIDER, NOFUNC, NULL, SIX_TSPEED_SLIDER, 142, 20, 100, 2, &speedText, 0 },
{ TOGGLE, NOFUNC, NULL, SIX_STITLE_TOGGLE, 142, 20+40, 23, 19, &bSubtitles, 0 },
#if defined(USE_3FLAGS) || defined(USE_4FLAGS) || defined(USE_5FLAGS)
{ ARSGBUT, CLANG, NULL, USE_POINTER, 230, 110, 23, 19, NULL, IX_TICK1 },
{ AAGBUT, RLANG, NULL, USE_POINTER, 230, 140, 23, 19, NULL, IX_CROSS1 }
#endif
};
#endif
/*-------------------------------------------------------------*\
@ -610,7 +623,7 @@ CONFBOX subtitlesBox[] = {
\*-------------------------------------------------------------*/
CONFBOX quitBox[] = {
#ifdef JAPAN
#ifdef g
{ AAGBUT, IQUITGAME, NULL, USE_POINTER,70, 44, 23, 19, NULL, IX_TICK1 },
{ AAGBUT, CLOSEWIN, NULL, USE_POINTER, 30, 44, 23, 19, NULL, IX_CROSS1 }
#else
@ -652,13 +665,9 @@ CONFINIT ciSound = { 10, 5, 20, 16, false, soundBox, ARRAYSIZE(soundBox), NO_HEA
#else
CONFINIT ciControl = { 10, 5, 20, 16, false, controlBox, ARRAYSIZE(controlBox), NO_HEADING };
#endif
#ifndef JAPAN
#if defined(USE_3FLAGS) || defined(USE_4FLAGS) || defined(USE_5FLAGS)
CONFINIT ciSubtitles = { 10, 6, 20, 16, false, subtitlesBox, ARRAYSIZE(subtitlesBox), NO_HEADING };
#else
CONFINIT ciSubtitles = { 10, 3, 20, 16, false, subtitlesBox, ARRAYSIZE(subtitlesBox), NO_HEADING };
#endif
#endif
CONFINIT ciQuit = { 4, 2, 98, 53, false, quitBox, ARRAYSIZE(quitBox), SIX_QUIT_HEADING };
CONFINIT ciTopWin = { 6, 5, 72, 23, false, topwinBox, 0, NO_HEADING };
@ -762,33 +771,31 @@ static void ConfActionSpecial(int i);
#ifndef JAPAN
bool LanguageChange(void) {
LANGUAGE nLang;
#ifdef USE_3FLAGS
// VERY quick dodgy bodge
if (cd.selBox == 0)
nLang = TXT_FRENCH; // = 1
else if (cd.selBox == 1)
nLang = TXT_GERMAN; // = 2
else
nLang = TXT_SPANISH; // = 4
#elif defined(USE_4FLAGS)
nLang = (LANGUAGE)(cd.selBox + 1);
#else
nLang = (LANGUAGE)cd.selBox;
#endif
if (_vm->getFeatures() & GF_USE_3FLAGS) {
// VERY quick dodgy bodge
if (cd.selBox == 0)
nLang = TXT_FRENCH; // = 1
else if (cd.selBox == 1)
nLang = TXT_GERMAN; // = 2
else
nLang = TXT_SPANISH; // = 4
} else if (_vm->getFeatures() & GF_USE_4FLAGS) {
nLang = (LANGUAGE)(cd.selBox + 1);
} else if (_vm->getFeatures() & GF_USE_5FLAGS) {
nLang = (LANGUAGE)cd.selBox;
}
if (nLang != language) {
if (nLang != g_language) {
KillInventory();
ChangeLanguage(nLang);
language = nLang;
g_language = nLang;
return true;
} else
return false;
}
#endif
/**************************************************************************/
/******************** Some miscellaneous functions ************************/
@ -1212,8 +1219,8 @@ void Select(int i, bool force) {
break;
#if defined(USE_3FLAGS) || defined(USE_4FLAGS) || defined(USE_5FLAGS)
case FRGROUP:
assert((_vm->getFeatures() & GF_USE_3FLAGS) || (_vm->getFeatures() & GF_USE_4FLAGS) || (_vm->getFeatures() & GF_USE_5FLAGS));
iconArray[HL2] = RectangleObject(BackPal(), COL_HILIGHT, cd.Box[i].w+6, cd.Box[i].h+6);
MultiInsertObject(GetPlayfieldList(FIELD_STATUS), iconArray[HL2]);
MultiSetAniXY(iconArray[HL2],
@ -1222,7 +1229,7 @@ void Select(int i, bool force) {
MultiSetZPosition(iconArray[HL2], Z_INV_BRECT+1);
break;
#endif
default:
break;
}
@ -2124,8 +2131,8 @@ void AddBox(int *pi, int i) {
break;
#if defined(USE_3FLAGS) || defined(USE_4FLAGS) || defined(USE_5FLAGS)
case FRGROUP:
assert((_vm->getFeatures() & GF_USE_3FLAGS) || (_vm->getFeatures() & GF_USE_4FLAGS) || (_vm->getFeatures() & GF_USE_5FLAGS));
assert(flagFilm != 0); // Language flags not declared!
pfilm = (const FILM *)LockMem(flagFilm);
@ -2139,7 +2146,7 @@ void AddBox(int *pi, int i) {
*pi += 1;
break;
#endif
case FLIP:
pfilm = (const FILM *)LockMem(winPartsf);
@ -2901,11 +2908,27 @@ void PopUpConf(CONFTYPE type) {
SetConfGlobals(&ciSound);
break;
#ifndef JAPAN
case SUBT:
if (_vm->getFeatures() & GF_USE_3FLAGS) {
ciSubtitles.v = 6;
ciSubtitles.Box = subtitlesBox3Flags;
ciSubtitles.NumBoxes = ARRAYSIZE(subtitlesBox3Flags);
} else if (_vm->getFeatures() & GF_USE_4FLAGS) {
ciSubtitles.v = 6;
ciSubtitles.Box = subtitlesBox4Flags;
ciSubtitles.NumBoxes = ARRAYSIZE(subtitlesBox4Flags);
} else if (_vm->getFeatures() & GF_USE_5FLAGS) {
ciSubtitles.v = 6;
ciSubtitles.Box = subtitlesBox4Flags;
ciSubtitles.NumBoxes = ARRAYSIZE(subtitlesBox4Flags);
} else {
ciSubtitles.v = 3;
ciSubtitles.Box = subtitlesBox;
ciSubtitles.NumBoxes = ARRAYSIZE(subtitlesBox);
}
SetConfGlobals(&ciSubtitles);
break;
#endif
case TOPWIN:
SetConfGlobals(&ciTopWin);
@ -2925,25 +2948,21 @@ void PopUpConf(CONFTYPE type) {
if (type == SAVE || type == LOAD)
Select(0, false);
#ifndef JAPAN
#if !defined(USE_3FLAGS) || !defined(USE_4FLAGS) || !defined(USE_5FLAGS)
else if (type == SUBT) {
#ifdef USE_3FLAGS
// VERY quick dirty bodges
if (language == TXT_FRENCH)
Select(0, false);
else if (language == TXT_GERMAN)
Select(1, false);
else
Select(2, false);
#elif defined(USE_4FLAGS)
Select(language-1, false);
#else
Select(language, false);
#endif
if (_vm->getFeatures() & GF_USE_3FLAGS) {
// VERY quick dirty bodges
if (g_language == TXT_FRENCH)
Select(0, false);
else if (g_language == TXT_GERMAN)
Select(1, false);
else
Select(2, false);
} else if (_vm->getFeatures() & GF_USE_4FLAGS) {
Select(g_language-1, false);
} else if (_vm->getFeatures() & GF_USE_5FLAGS) {
Select(g_language, false);
}
}
#endif
#endif // JAPAN
GetCursorXY(&curX, &curY, false);
InvCursor(IC_AREA, curX, curY);
@ -3096,12 +3115,10 @@ void InventoryProcess(CORO_PARAM, const void *) {
KillInventory();
PopUpConf(CONTROLS);
break;
#ifndef JAPAN
case OPENSUBT:
KillInventory();
PopUpConf(SUBT);
break;
#endif
case OPENQUIT:
KillInventory();
PopUpConf(QUIT);
@ -3110,7 +3127,6 @@ void InventoryProcess(CORO_PARAM, const void *) {
KillInventory();
bRestart = true;
break;
#if defined(USE_3FLAGS) || defined(USE_4FLAGS) || defined(USE_5FLAGS)
case CLANG:
if (!LanguageChange())
KillInventory();
@ -3118,7 +3134,6 @@ void InventoryProcess(CORO_PARAM, const void *) {
case RLANG:
KillInventory();
break;
#endif
default:
break;
}
@ -3342,10 +3357,8 @@ static void SlideMSlider(int x, SSFN fn) {
case S_END: // End of a drag on the slider
AddBoxes(false); // Might change position slightly
#ifndef JAPAN
if (ino == INV_CONF && cd.Box == subtitlesBox)
Select(language, false);
#endif
Select(g_language, false);
break;
}
}
@ -3778,8 +3791,8 @@ void ConfAction(int i, bool dbl) {
}
break;
#if defined(USE_3FLAGS) || defined(USE_4FLAGS) || defined(USE_5FLAGS)
case FRGROUP:
assert((_vm->getFeatures() & GF_USE_3FLAGS) || (_vm->getFeatures() & GF_USE_4FLAGS) || (_vm->getFeatures() & GF_USE_5FLAGS));
if (dbl) {
Select(i, false);
LanguageChange();
@ -3787,7 +3800,6 @@ void ConfAction(int i, bool dbl) {
Select(i, false);
}
break;
#endif
case AAGBUT:
case ARSGBUT:

View File

@ -207,7 +207,7 @@ void KeyboardProcess(CORO_PARAM, const void *) {
int sceneOffset = (_vm->getFeatures() & GF_SCNFILES) ? 1 : 0;
int sceneNumber = (GetSceneHandle() >> SCNHANDLE_SHIFT) - sceneOffset;
#if 0 // FIXME: Disabled this code for now, as it doesn't work as it should (see bug #2078922).
if ((language == TXT_GERMAN) &&
if ((g_language == TXT_GERMAN) &&
((sceneNumber >= 25 && sceneNumber <= 27) || (sceneNumber == 17))) {
// Skip to title screen
// It seems the German CD version uses scenes 25,26,27,17 for the intro,
@ -695,25 +695,8 @@ int TinselEngine::init() {
// TODO: More stuff from dos_main.c may have to be added here
// Set language - we'll be clever here and use the ScummVM language setting
language = TXT_ENGLISH;
switch (getLanguage()) {
case Common::FR_FRA:
language = TXT_FRENCH;
break;
case Common::DE_DEU:
language = TXT_GERMAN;
break;
case Common::IT_ITA:
language = TXT_ITALIAN;
break;
case Common::ES_ESP:
language = TXT_SPANISH;
break;
default:
language = TXT_ENGLISH;
}
ChangeLanguage(language);
// load in text strings
ChangeLanguage(g_language);
// load in graphics info
SetupHandleTable();

View File

@ -55,7 +55,14 @@ enum TinselGameFeatures {
GF_DEMO = 1 << 0,
GF_CD = 1 << 1,
GF_FLOPPY = 1 << 2,
GF_SCNFILES = 1 << 3
GF_SCNFILES = 1 << 3,
// The GF_USE_?FLAGS values specify how many country flags are displayed
// in the subtitles options dialog.
// None of these defined -> 1 language, in ENGLISH.TXT
GF_USE_3FLAGS = 1 << 4, // French, German, Spanish
GF_USE_4FLAGS = 1 << 5, // French, German, Spanish, Italian
GF_USE_5FLAGS = 1 << 6 // All 5 flags
};
enum TinselEngineVersion {