LOL: add support for Russian floppy version
This commit is contained in:
parent
950faa4143
commit
7174f14c61
11 changed files with 124 additions and 49 deletions
|
@ -45,7 +45,7 @@
|
|||
#include <map>
|
||||
|
||||
enum {
|
||||
kKyraDatVersion = 74
|
||||
kKyraDatVersion = 75
|
||||
};
|
||||
|
||||
const ExtractFilename extractFilenames[] = {
|
||||
|
@ -219,7 +219,7 @@ const ExtractFilename extractFilenames[] = {
|
|||
// Ingame
|
||||
{ kLolIngamePakFiles, kTypeStringList, false },
|
||||
|
||||
{ kLolCharacterDefs, kLolTypeCharData, false },
|
||||
{ kLolCharacterDefs, kLolTypeCharData, true },
|
||||
{ kLolIngameSfxFiles, k2TypeSfxList, false },
|
||||
{ kLolIngameSfxIndex, kTypeRawData, false },
|
||||
{ kLolMusicTrackMap, kTypeRawData, false },
|
||||
|
|
|
@ -98,8 +98,9 @@ const Game lolGames[] = {
|
|||
// DOS demo
|
||||
{ kLol, { EN_ANY, -1, -1 }, kPlatformPC, kDemoVersion, { "30bb5af87d38adb47d3e6ce06b1cb042", 0 } },
|
||||
|
||||
// DOS floppy (no language specifc strings)
|
||||
// DOS floppy (no language specifc strings except character presets)
|
||||
{ kLol, { EN_ANY, -1, -1 }, kPlatformPC, kNoSpecial, { "0cc764a204f7ba8cefe1a5f14c479619", 0 } },
|
||||
{ kLol, { RU_RUS, -1, -1 }, kPlatformPC, kNoSpecial, { "80a9f9bf243bc6ed36d98584fc6988c4", 0 } },
|
||||
{ kLol, { DE_DEU, -1, -1 }, kPlatformPC, kNoSpecial, { "6b843869772c1b779e1386be868c15dd", 0 } },
|
||||
|
||||
// PC98 (no language specifc strings)
|
||||
|
|
|
@ -1281,10 +1281,14 @@ const ExtractEntrySearchData kLolIngamePakFilesProvider[] = {
|
|||
};
|
||||
|
||||
const ExtractEntrySearchData kLolCharacterDefsProvider[] = {
|
||||
{ UNK_LANG, kPlatformPC, { 0x00000492, 0x000046B0, { { 0x7A, 0x94, 0x8B, 0xC6, 0xF7, 0xF1, 0x2F, 0xF3, 0xBC, 0x1B, 0x0B, 0x4E, 0x00, 0xC9, 0x44, 0x58 } } } }, // floppy
|
||||
{ UNK_LANG, kPlatformPC, { 0x00000492, 0x000047FD, { { 0x8C, 0x0B, 0x8B, 0xCE, 0xE0, 0xB0, 0x8F, 0xA9, 0x06, 0xC3, 0x98, 0xE6, 0x2E, 0x09, 0xB6, 0x93 } } } }, // floppy
|
||||
{ UNK_LANG, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
|
||||
{ UNK_LANG, kPlatformPC98, { 0x00000492, 0x00005893, { { 0x7C, 0x7E, 0xFB, 0x80, 0xD9, 0xB6, 0x16, 0x87, 0x80, 0xB7, 0x46, 0x9B, 0x96, 0x1A, 0x6A, 0xBE } } } },
|
||||
{ RU_RUS, kPlatformPC, { 0x00000492, 0x000052BA, { { 0x52, 0x29, 0x0D, 0x49, 0xFD, 0x17, 0xD7, 0x70, 0x6D, 0xCA, 0xEB, 0xB6, 0x7E, 0xFA, 0xBE, 0x08 } } } }, // floppy
|
||||
{ EN_ANY, kPlatformPC, { 0x00000492, 0x000046B0, { { 0x7A, 0x94, 0x8B, 0xC6, 0xF7, 0xF1, 0x2F, 0xF3, 0xBC, 0x1B, 0x0B, 0x4E, 0x00, 0xC9, 0x44, 0x58 } } } }, // floppy
|
||||
{ DE_DEU, kPlatformPC, { 0x00000492, 0x000047FD, { { 0x8C, 0x0B, 0x8B, 0xCE, 0xE0, 0xB0, 0x8F, 0xA9, 0x06, 0xC3, 0x98, 0xE6, 0x2E, 0x09, 0xB6, 0x93 } } } }, // floppy
|
||||
{ EN_ANY, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
|
||||
{ DE_DEU, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
|
||||
{ FR_FRA, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
|
||||
{ IT_ITA, kPlatformPC, { 0x00000492, 0x00004ACD, { { 0xDF, 0x87, 0xFE, 0x89, 0x59, 0xCC, 0x01, 0xD7, 0xC7, 0xEB, 0x16, 0xA4, 0x09, 0xAF, 0x5D, 0xC0 } } } }, // CD
|
||||
{ JA_JPN, kPlatformPC98, { 0x00000492, 0x00005893, { { 0x7C, 0x7E, 0xFB, 0x80, 0xD9, 0xB6, 0x16, 0x87, 0x80, 0xB7, 0x46, 0x9B, 0x96, 0x1A, 0x6A, 0xBE } } } },
|
||||
|
||||
EXTRACT_END_ENTRY
|
||||
};
|
||||
|
|
Binary file not shown.
|
@ -49,6 +49,7 @@ namespace {
|
|||
#define LOL_CD_FLAGS FLAGS(false, false, true, false, false, false, false, Kyra::GI_LOL)
|
||||
#define LOL_CD_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, true, false, false, false, false, Kyra::GI_LOL)
|
||||
#define LOL_FLOPPY_FLAGS FLAGS(false, false, false, false, false, false, false, Kyra::GI_LOL)
|
||||
#define LOL_FLOPPY_FAN_FLAGS(x, y) FLAGS_FAN(x, y, false, false, false, false, false, false, false, Kyra::GI_LOL)
|
||||
#define LOL_FLOPPY_CMP_FLAGS FLAGS(false, false, false, false, false, false, true, Kyra::GI_LOL)
|
||||
#define LOL_PC98_SJIS_FLAGS FLAGS(false, false, false, true, true, false, false, Kyra::GI_LOL)
|
||||
#define LOL_DEMO_FLAGS FLAGS(true, true, false, false, false, false, false, Kyra::GI_LOL)
|
||||
|
@ -95,18 +96,7 @@ const KYRAGameDescription adGameDescs[] = {
|
|||
},
|
||||
KYRA1_FLOPPY_FLAGS
|
||||
},
|
||||
{
|
||||
{
|
||||
"kyra1",
|
||||
"Extracted",
|
||||
AD_ENTRY1("GEMCUT.EMC", "689b62b7519215c1b2571d466c95624c"),
|
||||
Common::RU_RUS,
|
||||
Common::kPlatformPC,
|
||||
ADGF_NO_FLAGS,
|
||||
Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
|
||||
},
|
||||
KYRA1_FLOPPY_FLAGS
|
||||
},
|
||||
|
||||
{
|
||||
{
|
||||
"kyra1",
|
||||
|
@ -155,6 +145,18 @@ const KYRAGameDescription adGameDescs[] = {
|
|||
},
|
||||
KYRA1_FLOPPY_FLAGS
|
||||
},
|
||||
{
|
||||
{
|
||||
"kyra1",
|
||||
"Extracted",
|
||||
AD_ENTRY1("GEMCUT.EMC", "689b62b7519215c1b2571d466c95624c"),
|
||||
Common::RU_RUS,
|
||||
Common::kPlatformPC,
|
||||
ADGF_NO_FLAGS,
|
||||
Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIPCSPK
|
||||
},
|
||||
KYRA1_FLOPPY_FLAGS
|
||||
},
|
||||
{ // from VooD
|
||||
{
|
||||
"kyra1",
|
||||
|
@ -984,24 +986,6 @@ const KYRAGameDescription adGameDescs[] = {
|
|||
LOL_CD_FLAGS
|
||||
},
|
||||
|
||||
{
|
||||
{
|
||||
"lol",
|
||||
"CD",
|
||||
{
|
||||
{ "GENERAL.PAK", 0, "19354b0f464295c38c801d30588df062", -1 },
|
||||
{ "L01.PAK", 0, "174d37f21e0336c5d91020f8c58717ef", -1 },
|
||||
{ "VOC.PAK", 0, "eb398f09ba3321d872b6174a68a987d9", -1 },
|
||||
{ 0, 0, 0, 0 }
|
||||
},
|
||||
Common::RU_RUS,
|
||||
Common::kPlatformPC,
|
||||
ADGF_DROPLANGUAGE | ADGF_CD,
|
||||
Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
|
||||
},
|
||||
LOL_CD_FLAGS
|
||||
},
|
||||
|
||||
{
|
||||
{
|
||||
"lol",
|
||||
|
@ -1306,6 +1290,24 @@ const KYRAGameDescription adGameDescs[] = {
|
|||
LOL_FLOPPY_FLAGS
|
||||
},
|
||||
|
||||
// Russian fan translation
|
||||
{
|
||||
{
|
||||
"lol",
|
||||
"Extracted",
|
||||
{
|
||||
{ "GENERAL.PAK", 0, "d8f4c1153aed2418f41f886c3fb27543", -1 },
|
||||
{ "CHAPTER7.PAK", 0, "f0b8a2fdff951738834fadc12248ac1f", -1 },
|
||||
{ 0, 0, 0, 0 }
|
||||
},
|
||||
Common::RU_RUS,
|
||||
Common::kPlatformPC,
|
||||
ADGF_NO_FLAGS,
|
||||
Common::GUIO_NOSPEECH | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM | Common::GUIO_MIDIPCSPK
|
||||
},
|
||||
LOL_FLOPPY_FAN_FLAGS(Common::RU_RUS, Common::EN_ANY)
|
||||
},
|
||||
|
||||
{
|
||||
{
|
||||
"lol",
|
||||
|
|
|
@ -395,8 +395,8 @@ void LoLEngine::gui_drawCharPortraitWithStats(int charNum) {
|
|||
} else {
|
||||
gui_drawLiveMagicBar(33, 32, _characters[charNum].magicPointsCur, 0, _characters[charNum].magicPointsMax, 5, 32, 162, 1, 0);
|
||||
gui_drawLiveMagicBar(39, 32, _characters[charNum].hitPointsCur, 0, _characters[charNum].hitPointsMax, 5, 32, 154, 1, 1);
|
||||
_screen->printText(getLangString(0x4253), 33, 1, 160, 0);
|
||||
_screen->printText(getLangString(0x4254), 39, 1, 152, 0);
|
||||
_screen->printText((_flags.platform == Common::kPlatformPC && !_flags.isTalkie) ? "M" : getLangString(0x4253), 33, 1, 160, 0);
|
||||
_screen->printText((_flags.platform == Common::kPlatformPC && !_flags.isTalkie) ? "H" : getLangString(0x4254), 39, 1, 152, 0);
|
||||
}
|
||||
|
||||
int spellLevels = 0;
|
||||
|
|
|
@ -1038,11 +1038,14 @@ char *LoLEngine::getLangString(uint16 id) {
|
|||
char *string = (char *)getTableEntry(buffer, realId);
|
||||
|
||||
char *srcBuffer = _stringBuffer[_lastUsedStringBuffer];
|
||||
if (_flags.lang != Common::JA_JPN) {
|
||||
Util::decodeString1(string, srcBuffer);
|
||||
if (_flags.lang == Common::JA_JPN) {
|
||||
decodeSjis(string, srcBuffer);
|
||||
} else if (_flags.lang == Common::RU_RUS) {
|
||||
decodeCyrillic(string, srcBuffer);
|
||||
Util::decodeString2(srcBuffer, srcBuffer);
|
||||
} else {
|
||||
decodeSjis(string, srcBuffer);
|
||||
Util::decodeString1(string, srcBuffer);
|
||||
Util::decodeString2(srcBuffer, srcBuffer);
|
||||
}
|
||||
|
||||
++_lastUsedStringBuffer;
|
||||
|
@ -1081,6 +1084,54 @@ void LoLEngine::decodeSjis(const char *src, char *dst) {
|
|||
*dst = 0;
|
||||
}
|
||||
|
||||
int LoLEngine::decodeCyrillic(const char *src, char *dst) {
|
||||
static const uint8 decodeTable1[] = {
|
||||
0x20, 0xAE, 0xA5, 0xA0, 0xE2, 0xAD, 0xA8, 0xE0, 0xE1, 0xAB, 0xA2,
|
||||
0xA4, 0xAC, 0xAA, 0xE3, 0x2E
|
||||
};
|
||||
|
||||
static const uint8 decodeTable2[] = {
|
||||
0xAD, 0xAF, 0xA2, 0xE1, 0xAC, 0xAA, 0x20, 0xA4, 0xAB, 0x20,
|
||||
0xE0, 0xE2, 0xA4, 0xA2, 0xA6, 0xAA, 0x20, 0xAD, 0xE2, 0xE0,
|
||||
0xAB, 0xAC, 0xE1, 0xA1, 0x20, 0xAC, 0xE1, 0xAA, 0xAB, 0xE0,
|
||||
0xE2, 0xAD, 0xAE, 0xEC, 0xA8, 0xA5, 0xA0, 0x20, 0xE0, 0xEB,
|
||||
0xAE, 0xA0, 0xA8, 0xA5, 0xEB, 0xEF, 0x20, 0xE3, 0xE2, 0x20,
|
||||
0xAD, 0xE7, 0xAB, 0xAC, 0xA5, 0xE0, 0xAE, 0xA0, 0xA5, 0xA8,
|
||||
0xE3, 0xEB, 0xEF, 0xAA, 0xE2, 0xEF, 0xA5, 0xEC, 0xAB, 0xAE,
|
||||
0xAA, 0xAF, 0xA8, 0xA0, 0xA5, 0xEF, 0xAE, 0xEE, 0xEC, 0xE3,
|
||||
0xA0, 0xAE, 0xA5, 0xA8, 0xEB, 0x20, 0xE0, 0xE3, 0xA0, 0xA5,
|
||||
0xAE, 0xA8, 0xE3, 0xE1, 0xAD, 0xAB, 0x20, 0xAE, 0xA5, 0xA0,
|
||||
0xA8, 0xAD, 0x2E, 0xE3, 0xAE, 0xA0, 0xA8, 0x20, 0xE0, 0xE3,
|
||||
0xAB, 0xE1, 0x20, 0xA4, 0xAD, 0xE2, 0xA1, 0xA6, 0xAC, 0xE1,
|
||||
0x0D, 0x20, 0x2E, 0x09, 0xA0, 0xA1, 0x9D, 0xA5
|
||||
};
|
||||
|
||||
int size = 0;
|
||||
uint cChar = 0;
|
||||
while ((cChar = *src++) != 0) {
|
||||
if (cChar & 0x80) {
|
||||
cChar &= 0x7F;
|
||||
int index = (cChar & 0x78) >> 3;
|
||||
*dst++ = decodeTable1[index];
|
||||
++size;
|
||||
assert(cChar < sizeof(decodeTable2));
|
||||
cChar = decodeTable2[cChar];
|
||||
} else if (cChar >= 0x70) {
|
||||
cChar = *src++;
|
||||
} else if (cChar >= 0x30) {
|
||||
if (cChar < 0x60)
|
||||
cChar -= 0x30;
|
||||
cChar |= 0x80;
|
||||
}
|
||||
|
||||
*dst++ = cChar;
|
||||
++size;
|
||||
}
|
||||
|
||||
*dst++ = 0;
|
||||
return size;
|
||||
}
|
||||
|
||||
bool LoLEngine::addCharacter(int id) {
|
||||
const uint16 *cdf[] = { _charDefsMan, _charDefsMan, _charDefsMan, _charDefsWoman,
|
||||
_charDefsMan, _charDefsMan, _charDefsWoman, _charDefsKieran, _charDefsAkshel };
|
||||
|
|
|
@ -363,12 +363,13 @@ private:
|
|||
void showIntro();
|
||||
|
||||
struct CharacterPrev {
|
||||
const char *name;
|
||||
int x, y;
|
||||
int attrib[3];
|
||||
};
|
||||
|
||||
static const CharacterPrev _charPreviews[];
|
||||
static const char *const _charPreviewNamesDefault[];
|
||||
static const char *const _charPreviewNamesRussian[];
|
||||
|
||||
// PC98 specific data
|
||||
static const uint16 _charPosXPC98[];
|
||||
|
@ -875,6 +876,7 @@ private:
|
|||
char *getLangString(uint16 id);
|
||||
uint8 *getTableEntry(uint8 *buffer, uint16 id);
|
||||
void decodeSjis(const char *src, char *dst);
|
||||
int decodeCyrillic(const char *src, char *dst);
|
||||
|
||||
static const char * const _languageExt[];
|
||||
|
||||
|
|
|
@ -316,8 +316,9 @@ int LoLEngine::chooseCharacter() {
|
|||
_screen->printText(_tim->getCTableEntry(53), 72, 184, 0x81, 0x00);
|
||||
_screen->printText(_tim->getCTableEntry(55), 72, 192, 0x81, 0x00);
|
||||
} else {
|
||||
const char *const *previewNames = _flags.lang == Common::RU_RUS ? _charPreviewNamesRussian : _charPreviewNamesDefault;
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
_screen->fprintStringIntro("%s", _charPreviews[i].x + 16, _charPreviews[i].y + 36, 0xC0, 0x00, 0x9C, 0x120, _charPreviews[i].name);
|
||||
_screen->fprintStringIntro("%s", _charPreviews[i].x + 16, _charPreviews[i].y + 36, 0xC0, 0x00, 0x9C, 0x120, previewNames[i]);
|
||||
_screen->fprintStringIntro("%d", _charPreviews[i].x + 21, _charPreviews[i].y + 48, 0x98, 0x00, 0x9C, 0x220, _charPreviews[i].attrib[0]);
|
||||
_screen->fprintStringIntro("%d", _charPreviews[i].x + 21, _charPreviews[i].y + 56, 0x98, 0x00, 0x9C, 0x220, _charPreviews[i].attrib[1]);
|
||||
_screen->fprintStringIntro("%d", _charPreviews[i].x + 21, _charPreviews[i].y + 64, 0x98, 0x00, 0x9C, 0x220, _charPreviews[i].attrib[2]);
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
|
||||
namespace Kyra {
|
||||
|
||||
#define RESFILE_VERSION 74
|
||||
#define RESFILE_VERSION 75
|
||||
|
||||
namespace {
|
||||
bool checkKyraDat(Common::SeekableReadStream *file) {
|
||||
|
|
|
@ -687,11 +687,25 @@ const char * const LoLEngine::_languageExt[] = {
|
|||
"GER"
|
||||
};
|
||||
|
||||
const char *const LoLEngine::_charPreviewNamesDefault[] = {
|
||||
"Ak\'shel",
|
||||
"Michael",
|
||||
"Kieran",
|
||||
"Conrad"
|
||||
};
|
||||
|
||||
const char *const LoLEngine::_charPreviewNamesRussian[] = {
|
||||
"\x80\xAA\xE8\xA5\xAB\0",
|
||||
"\x8C\xA0\xA9\xAA\xAB\0",
|
||||
"\x8A\xA8\xE0\xA0\xAD\0",
|
||||
"\x8A\xAE\xAD\xE0\xA0\xA4\0"
|
||||
};
|
||||
|
||||
const LoLEngine::CharacterPrev LoLEngine::_charPreviews[] = {
|
||||
{ "Ak\'shel", 0x060, 0x7F, { 0x0F, 0x08, 0x05 } },
|
||||
{ "Michael", 0x09A, 0x7F, { 0x06, 0x0A, 0x0F } },
|
||||
{ "Kieran", 0x0D4, 0x7F, { 0x08, 0x06, 0x08 } },
|
||||
{ "Conrad", 0x10F, 0x7F, { 0x0A, 0x0C, 0x0A } }
|
||||
{ 0x060, 0x7F, { 0x0F, 0x08, 0x05 } },
|
||||
{ 0x09A, 0x7F, { 0x06, 0x0A, 0x0F } },
|
||||
{ 0x0D4, 0x7F, { 0x08, 0x06, 0x08 } },
|
||||
{ 0x10F, 0x7F, { 0x0A, 0x0C, 0x0A } }
|
||||
};
|
||||
|
||||
const uint16 LoLEngine::_charPosXPC98[] = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue