[Scummvm-git-logs] scummvm master -> 8f3819ccfec4cdbf1884449179bb65749e0617ed
dreammaster
dreammaster at scummvm.org
Wed Apr 28 03:51:14 UTC 2021
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
8f3819ccfe LURE: Added support for Konami English VGA version
Commit: 8f3819ccfec4cdbf1884449179bb65749e0617ed
https://github.com/scummvm/scummvm/commit/8f3819ccfec4cdbf1884449179bb65749e0617ed
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-04-27T20:30:01-07:00
Commit Message:
LURE: Added support for Konami English VGA version
Changed paths:
NEWS.md
devtools/create_lure/create_lure_dat.cpp
devtools/create_lure/create_lure_dat.h
devtools/create_lure/process_actions.cpp
dists/engine-data/lure.dat
engines/lure/detection.cpp
engines/lure/detection.h
engines/lure/hotspots.cpp
engines/lure/lure.h
engines/lure/luredefs.h
engines/lure/metaengine.cpp
engines/lure/strings.cpp
diff --git a/NEWS.md b/NEWS.md
index ee24f73023..8fe561f217 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -11,14 +11,15 @@ For a more comprehensive changelog of the latest experimental code, see:
- Added support for Little Big Adventure.
- Added support for Red Comrades 1: Save the Galaxy.
- Added support for Red Comrades 2: For the Great Justice.
- - Added support for Transylvania
- - Added support for Crimson Crown
- - Added support for OO-Topos
+ - Added support for Transylvania.
+ - Added support for Crimson Crown.
+ - Added support for OO-Topos.
- Added support for Glulx interactive fiction games
- - Added support for Private Eye (US release)
- - Added support for Spanish Blue Force
- - Added support for Spanish Ringworld
- - Added support for Spanish Amazon Guardians of Eden
+ - Added support for Lure of the Temptress Konami release.
+ - Added support for Private Eye (US release).
+ - Added support for Spanish Blue Force.
+ - Added support for Spanish Ringworld.
+ - Added support for Spanish Amazon Guardians of Eden.
- Added support for AGS Games versions 2.5+
New ports:
diff --git a/devtools/create_lure/create_lure_dat.cpp b/devtools/create_lure/create_lure_dat.cpp
index 6d56f56617..9393270bbd 100644
--- a/devtools/create_lure/create_lure_dat.cpp
+++ b/devtools/create_lure/create_lure_dat.cpp
@@ -50,6 +50,7 @@ uint16 dataSegment;
#define FRENCH_FILE_CHECKSUM 0xD38C
#define GERMAN_FILE_CHECKSUM 0xD143
#define SPANISH_FILE_CHECKSUM 0xFFDA
+#define KONAMI_FILE_CHECKSUM 0xd634
Common::Language processedLanguages[100];
int langIndex = 0;
@@ -131,7 +132,8 @@ void add_anim_record(uint16 offset) {
else if (language == FR_FRA) index = 2;
else if (language == DE_DEU) index = 3;
else if (language == ES_ESP) index = 4;
- else if (language != EN_ANY) errorExit("add_anim_record: Unknown language");
+ else if (language != EN_ANY && language != EN_USA)
+ errorExit("add_anim_record: Unknown language");
AnimListRecord *p = &animDataList[0];
while (p->languages[index] != 0) {
@@ -160,6 +162,7 @@ void read_basic_palette(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) segmentStart = 0xC4B7;
else if (language == DE_DEU) segmentStart = 0xC517;
else if (language == ES_ESP) segmentStart = 0xC177;
+ else if (language == EN_USA) segmentStart = 0xC387;
else if (language != EN_ANY) errorExit("read_basic_palette: Unknown language");
lureExe.seek(segmentStart);
@@ -188,6 +191,7 @@ void read_dialog_data(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) segmentStart = 0x1e1a0;
else if (language == DE_DEU) segmentStart = 0x1e230;
else if (language == ES_ESP) segmentStart = 0x1de60;
+ else if (language == EN_USA) segmentStart = 0x1df90;
else if (language != EN_ANY) errorExit("read_dialog_data: Unknown language");
totalSize = DIALOG_SIZE;
@@ -202,6 +206,7 @@ void read_talk_dialog_data(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) segmentStart = 0x1e2f0;
else if (language == DE_DEU) segmentStart = 0x1e380;
else if (language == ES_ESP) segmentStart = 0x1dfb0;
+ else if (language == EN_USA) segmentStart = 0x1e0e0;
else if (language != EN_ANY) errorExit("read_talk_dialog_data: Unknown language");
totalSize = TALK_DIALOG_SIZE;
@@ -242,6 +247,10 @@ void read_room_data(byte *&data, uint16 &totalSize) {
dataStart = 0xc020;
walkAreaOffset = 0x2ecb;
break;
+ case EN_USA:
+ dataStart = 0xbf40;
+ walkAreaOffset = 0x2eb1;
+ break;
default:
errorExit("read_room_data: Unknown language");
}
@@ -342,6 +351,13 @@ uint16 englishTickProcOffsets[] = {
0xffff
};
+uint16 konamiTickProcOffsets[] = {
+ 0x44A3, 0x5268, 0x612a, 0x6544, 0x6857, 0x74ed, 0x7efa, 0x7f0a, 0x81e0, 0x81e8,
+ 0x821d, 0x8220, 0x823a, 0x824f, 0x8287, 0x82ef, 0x83ac, 0x8425, 0x8466, 0x8499,
+ 0x84d9, 0x84f4, 0x8527, 0x8586, 0x88b4, 0x8913, 0x8940, 0x89e0, 0x89e5, 0x8a04,
+ 0x8a23, 0x8a28, 0x8a2d, 0x8a99, 0x8ad2, 0x8b10, 0x8da3, 0x9b13, 0x9b9c
+};
+
uint16 italianTickProcOffsets[] = {
0x4205, 0x4fca, 0x5e8c, 0x62a6, 0x65b9, 0x724f, 0x7c5c, 0x7c6c, 0x7f58, 0x7f60,
0x7f95, 0x7f98, 0x7fb2, 0x7fc7, 0x7fff, 0x8067, 0x8124, 0x819d, 0x81de, 0x8211,
@@ -380,8 +396,10 @@ uint16 italianOffsets[4] = {0x5e58, 0x5f78, 0x62fe, 0x6471};
uint16 frenchOffsets[4] = {0x5e78, 0x5f98, 0x631e, 0x6491};
uint16 germanOffsets[4] = {0x5ea8, 0x5fc8, 0x634e, 0x64c1};
uint16 spanishOffsets[4] = {0x5e78, 0x5f98, 0x631e, 0x6491};
+uint16 konamiOffsets[4] = {0x5d98, 0x5eb8, 0x623e, 0x63b1};
uint16 englishLoadOffsets[] = {0x3afe, 0x41BD, 0x7167, 0x7172, 0x8617, 0x88ac, 0};
+uint16 konamiLoadOffsets[] = {0x3de4, 0x44A3, 0x744D, 0x7458, 0x88fd, 0x8B92, 0};
uint16 italianLoadOffsets[] = {0x3b46, 0x4205, 0x71af, 0x71ba, 0x8675, 0x890a, 0};
uint16 frenchLoadOffsets[] = {0x3ebc, 0x457B, 0x755b, 0x7566, 0x8a18, 0x8ca8, 0};
uint16 germanLoadOffsets[] = {0x3e84, 0x4543, 0x74f1, 0x74fc, 0x8a75, 0x8d05, 0};
@@ -432,6 +450,12 @@ void read_hotspot_data(byte *&data, uint16 &totalSize) {
walkToOffset = 0xBD2B;
loadOffsets = &spanishLoadOffsets[0];
break;
+ case EN_USA:
+ offsets = &konamiOffsets[0];
+ procList = &konamiTickProcOffsets[0];
+ walkToOffset = 0xBC4B;
+ loadOffsets = &konamiLoadOffsets[0];
+ break;
default:
errorExit("read_hotspot_data: Unknown language");
break;
@@ -540,9 +564,8 @@ void read_hotspot_data(byte *&data, uint16 &totalSize) {
if (procList[procIndex] == 0xffff) {
if ((FROM_LE_16(entry.tickProcOffset) != 0xe00) &&
(FROM_LE_16(entry.tickProcOffset) != 2))
-// printf("Could not find a tick proc handler for hotspot %xh offset %xh\n",
-// startId[tableNum] + hotspotIndex,
-printf("%xh,\n",
+ printf("Could not find a tick proc handler for hotspot %d offset %xh\n",
+ startId[tableNum] + hotspotIndex,
FROM_LE_16(entry.tickProcOffset));
r->tickProcId = 0;
}
@@ -668,6 +691,7 @@ void read_room_exits(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) dataStart = 0x2f80;
else if (language == DE_DEU) dataStart = 0x2f8f;
else if (language == ES_ESP) dataStart = 0x2f7b;
+ else if (language == EN_USA) dataStart = 0x2F61;
else if (language != EN_ANY) errorExit("read_room_exits: Unknown language");
lureExe.seek(dataSegment + dataStart);
@@ -741,6 +765,7 @@ void read_room_exit_joins(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) dataStart = 0xcf10;
else if (language == DE_DEU) dataStart = 0xcf40;
else if (language == ES_ESP) dataStart = 0xcf10;
+ else if (language == EN_USA) dataStart = 0xce30;
else if (language != EN_ANY) errorExit("read_room_exit_joins: Unknown language");
lureExe.seek(dataSegment + dataStart);
@@ -895,6 +920,7 @@ void read_script_data(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) segmentOffset = 0x1e3f0;
else if (language == DE_DEU) segmentOffset = 0x1e480;
else if (language == ES_ESP) segmentOffset = 0x1e0b0;
+ else if (language == EN_USA) segmentOffset = 0x1e1e0;
else if (language != EN_ANY) errorExit("read_script_data: Unknown language");
lureExe.seek(segmentOffset);
@@ -909,6 +935,7 @@ void read_script2_data(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) segmentOffset = 0x1a160;
else if (language == DE_DEU) segmentOffset = 0x1a1f0;
else if (language == ES_ESP) segmentOffset = 0x19e20;
+ else if (language == EN_USA) segmentOffset = 0x19f50;
else if (language != EN_ANY) errorExit("read_script2_data: Unknown language");
lureExe.seek(segmentOffset);
@@ -923,6 +950,7 @@ void read_hotspot_script_offsets(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) dataStart = 0x58c0;
else if (language == DE_DEU) dataStart = 0x58f0;
else if (language == ES_ESP) dataStart = 0x58c0;
+ else if (language == EN_USA) dataStart = 0x57e0;
else if (language != EN_ANY) errorExit("read_hotspot_script_offsets: Unknown language");
lureExe.seek(dataSegment + dataStart);
@@ -937,6 +965,7 @@ void read_messages_segment(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) segmentOffset = 0x21050;
else if (language == DE_DEU) segmentOffset = 0x210E0;
else if (language == ES_ESP) segmentOffset = 0x20d10;
+ else if (language == EN_USA) segmentOffset = 0x20e40;
else if (language != EN_ANY) errorExit("read_messages_segment: Unknown language");
lureExe.seek(segmentOffset);
@@ -999,6 +1028,7 @@ void read_talk_headers(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) dataStart = 0x513c;
else if (language == DE_DEU) dataStart = 0x515c;
else if (language == ES_ESP) dataStart = 0x512c;
+ else if (language == EN_USA) dataStart = 0x505c;
else if (language != EN_ANY) errorExit("read_talk_headers: Unknown language");
lureExe.seek(dataSegment + dataStart);
@@ -1077,6 +1107,7 @@ struct TalkRecord {
#define NUM_GIVE_TALK_IDS 6
uint16 englishGiveTalkIds[7] = {0xCF5E, 0xCF14, 0xCF90, 0xCFAA, 0xCFD0, 0xCFF6, 0xf010};
+uint16 konamiGiveTalkIds[7] = {0xCF5E, 0xCF14, 0xCF90, 0xCFAA, 0xCFD0, 0xCFF6, 0xf010};
uint16 italianGiveTalkIds[7] = {0xD01E, 0xCFD4, 0xD050, 0xD06A, 0xD090, 0xD0B6, 0xf0d0};
uint16 frenchGiveTalkIds[7] = {0xD03E, 0xCFF4, 0xD070, 0xD08A, 0xD0B0, 0xD0D6, 0xf0f0};
uint16 germanGiveTalkIds[7] = {0xD06E, 0xD024, 0xD0A0, 0xD0BA, 0xD0E0, 0xD106, 0xf120};
@@ -1092,6 +1123,7 @@ void read_talk_data(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) giveTalkIds = &frenchGiveTalkIds[0];
else if (language == DE_DEU) giveTalkIds = &germanGiveTalkIds[0];
else if (language == ES_ESP) giveTalkIds = &spanishGiveTalkIds[0];
+ else if (language == EN_USA) giveTalkIds = &konamiGiveTalkIds[0];
else if (language != EN_ANY) errorExit("read_talk_data: Unknown language");
data = (byte *) malloc(MAX_DATA_SIZE);
@@ -1210,6 +1242,7 @@ void read_room_pathfinding_data(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) dataStart = 0x992A;
else if (language == DE_DEU) dataStart = 0x995A;
else if (language == ES_ESP) dataStart = 0x992A;
+ else if (language == EN_USA) dataStart = 0x984a;
else if (language != EN_ANY) errorExit("read_room_pathfinding_data: Unknown language");
lureExe.seek(dataSegment + dataStart);
@@ -1270,6 +1303,7 @@ void read_room_exit_hotspots_data(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) dataStart = 0x2e76;
else if (language == DE_DEU) dataStart = 0x2e85;
else if (language == ES_ESP) dataStart = 0x2e71;
+ else if (language == EN_USA) dataStart = 0x2e57;
else if (language != EN_ANY) errorExit("read_room_exit_hotspots_data: Unknown language");
lureExe.seek(dataSegment + dataStart);
@@ -1290,6 +1324,7 @@ void save_fight_segment(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) fightSegment = 0x1c8f0;
else if (language == DE_DEU) fightSegment = 0x1c980;
else if (language == ES_ESP) fightSegment = 0x1c5b0;
+ else if (language == EN_USA) fightSegment = 0x1c6E0;
else if (language != EN_ANY) errorExit("save_fight_segment: Unknown language");
lureExe.seek(fightSegment);
@@ -1371,7 +1406,8 @@ void save_text_strings(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) textStrings = &frenchTextStrings[0];
else if (language == DE_DEU) textStrings = &germanTextStrings[0];
else if (language == ES_ESP) textStrings = &spanishTextStrings[0];
- else if (language != EN_ANY) errorExit("save_text_strings: Unknown language");
+ else if (language != EN_ANY && language != EN_USA)
+ errorExit("save_text_strings: Unknown language");
// Calculate the total needed space
totalSize = sizeof(uint16);
@@ -1402,7 +1438,8 @@ void save_sound_desc_data(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) dataStart = 0x5751;
else if (language == DE_DEU) dataStart = 0x5781;
else if (language == ES_ESP) dataStart = 0x5751;
- else if (language != EN_ANY) errorExit("save_sound_desc_data: Unknown language");
+ else if (language != EN_ANY && language != EN_USA)
+ errorExit("save_sound_desc_data: Unknown language");
lureExe.seek(dataSegment + dataStart);
totalSize = SOUND_DESCS_SIZE;
@@ -1419,7 +1456,7 @@ void save_sound_desc_data(byte *&data, uint16 &totalSize) {
struct DecoderEntry {
const char *sequence;
- char character;
+ unsigned char character;
};
const DecoderEntry englishDecoders[] = {
@@ -1453,6 +1490,52 @@ const DecoderEntry englishDecoders[] = {
{NULL, '\0'}
};
+const DecoderEntry konamiDecoders[] = {
+ { "00", ' ' }, { "0100", 'a' }, { "0101", 'o' }, { "0110", 'e' },
+ { "01110", 't' }, { "01111", 's' }, { "1000", 'i' }, { "10010", 'n' },
+ { "10011", 'r' }, { "10100", 'h' }, { "10101", 'l' }, { "10110", 'd' },
+ { "101110", 'm' }, { "1011110", '\0' }, { "1011111", 'g' },
+ { "11000", 'u' }, { "110010", 'w' }, { "1100110", 'c' },
+ { "1100111", 'f' }, { "110100", '.' }, { "110101", 'y' },
+ { "110110", 'p' }, { "1101110", 'b' }, { "1101111", ',' },
+ { "111000", '\xA1' }, { "1110010", 'k' }, { "1110011", '\'' },
+ { "1110100", 'I' }, { "1110101", 'v' }, { "1110110", '\xA4' },
+ { "11101110", '!' }, { "11101111", '\xB0' }, { "1111000", '\xB8' },
+ { "11110010", '?' }, { "111100110", '\xA2' }, { "111100111", '\xAA' },
+ { "11110100", 'W' }, { "111101010", 'A' }, { "111101011", 'H' },
+ { "111101100", 'T' }, { "111101101", '\xF2' }, { "111101110", '\xA3' },
+ { "1111011110", 'G' }, { "11110111110", 'S' }, { "11110111111", '\xC5' },
+ { "111110000", 'Y' }, { "111110001", 'M' }, { "111110010", 'N' },
+ { "1111100110", 'O' }, { "1111100111", 'L' }, { "111110100", 'E' },
+ { "1111101010", '-' }, { "11111010110", '\xEF' }, { "11111010111", 'R' },
+ { "1111101100", 'B' }, { "1111101101", 'D' }, { "1111101110", '\xC8' },
+ { "11111011110", 'C' }, { "11111011111", 'x' }, { "1111110000", '\xA7' },
+ { "1111110001", '\xE6' }, { "1111110010", 'j' }, { "11111100110", '\xAF' },
+ { "11111100111", '\xBE' }, { "1111110100", '\xE0' }, { "11111101010", '\xC7' },
+ { "11111101011", '\xB1' }, { "1111110110", '\xC9' }, { "11111101110", '\x50' },
+ { "111111011110", 'U' }, { "111111011111", '\xBD' }, { "1111111000", 'q' },
+ { "11111110010", '\xBC' }, { "111111100110", '\xDC' }, { "111111100111", '\xE9' },
+ { "11111110100", 'F' }, { "111111101010", 'z' }, { "111111101011", '\xDB' },
+ { "11111110110", '\xA0' }, { "111111101110", '\xC2' }, { "1111111011110", '\xC4' },
+ { "1111111011111", '1' }, { "11111111000", '\xCD' }, { "111111110010", '\xBA' },
+ { "1111111100110", '\xEE' }, { "1111111100111", ';' }, { "111111110100", '2' },
+ { "1111111101010", '\xD9' }, { "1111111101011", 'K' }, { "1111111101100", '\xC3' },
+ { "1111111101101", '%' }, { "1111111101110", '5' }, { "1111111101111", '\xE8' },
+ { "111111111000", '6' }, { "1111111110010", ':' }, { "1111111110011", 'J' },
+ { "1111111110100", 'V' }, { "1111111110101", '\xA6' }, { "1111111110110", '\xB7' },
+ { "11111111101110", '\xD0' }, { "11111111101111", '\xAE' }, { "1111111111000", '\xE3' },
+ { "1111111111001", '3' }, { "1111111111010", '\xC0' }, { "11111111110110", '0' },
+ { "111111111101110", '4' }, { "111111111101111", '9' }, { "11111111111000", '7' },
+ { "11111111111001", '8' }, { "11111111111010", '\xD8' }, { "111111111110110", '\xE4' },
+ { "111111111110111", '\xED' }, { "111111111111000", '\xAC' }, { "111111111111001", '"' },
+ { "111111111111010", '/' }, { "111111111111011", '\xD5' }, { "111111111111100", '\xEA' },
+ { "111111111111101", '\xEB' }, { "1111111111111100", 'Q' }, { "1111111111111101", '\xA5' },
+ { "11111111111111100", '\x99' }, { "111111111111111010", '(' }, { "111111111111111011", ')' },
+ { "111111111111111100", '\xB2' }, { "111111111111111101", '\xDA' },
+ { "11111111111111111", '\xEC' },
+ { NULL, '\0' }
+};
+
const DecoderEntry italianDecoders[] = {
{"00", ' '}, {"010", (char) 0x69}, {"0110", (char) 0x6F}, {"01110", (char) 0x61}, {"01111", (char) 0x65},
{"1000", (char) 0x72}, {"1001", (char) 0x6E}, {"1010", (char) 0x74}, {"10110", (char) 0x73}, {"101110", (char) 0x6C},
@@ -1616,6 +1699,7 @@ void save_string_decoder_data(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) list = &frenchDecoders[0];
else if (language == DE_DEU) list = &germanDecoders[0];
else if (language == ES_ESP) list = &spanishDecoders[0];
+ else if (language == EN_USA) list = &konamiDecoders[0];
else if (language != EN_ANY) errorExit("save_string_decoder_data: Unknown language");
totalSize = 1;
@@ -1646,6 +1730,7 @@ void save_audio_init_icon(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) dataStart = 0x132C0;
else if (language == DE_DEU) dataStart = 0x132F0;
else if (language == ES_ESP) dataStart = 0x132C0;
+ else if (language == EN_USA) dataStart = 0x131e0;
else if (language != EN_ANY) errorExit("save_audio_init_icon: Unknown language");
lureExe.seek(dataSegment + dataStart);
@@ -1855,6 +1940,9 @@ void createFile(const char *outFilename) {
case EN_ANY:
outputFile.writeByte(LANG_EN_ANY);
break;
+ case EN_USA:
+ outputFile.writeByte(LANG_EN_USA);
+ break;
default:
printf("Unknown language encountered\n");
exit(1);
@@ -1945,6 +2033,10 @@ bool validate_executable() {
language = ES_ESP;
dataSegment = 0xAD20;
printf("Detected Spanish version\n");
+ } else if (sumTotal == KONAMI_FILE_CHECKSUM) {
+ language = EN_USA;
+ dataSegment = 0xaf30;
+ printf("Detected Konami English version\n");
} else {
printf("Lure executable version not recognized. Checksum = %xh\n", sumTotal);
return false;
diff --git a/devtools/create_lure/create_lure_dat.h b/devtools/create_lure/create_lure_dat.h
index 9ec0d3e176..767ba5e5b3 100644
--- a/devtools/create_lure/create_lure_dat.h
+++ b/devtools/create_lure/create_lure_dat.h
@@ -28,7 +28,7 @@
#include "common/util.h"
#define VERSION_MAJOR 1
-#define VERSION_MINOR 30
+#define VERSION_MINOR 31
#define DIALOG_SIZE 0x150
@@ -421,6 +421,7 @@ enum LureLanguage {
LANG_DE_DEU = 7,
LANG_ES_ESP = 17,
LANG_EN_ANY = 3,
+ LANG_EN_USA = 4,
LANG_UNKOWN = -1
};
diff --git a/devtools/create_lure/process_actions.cpp b/devtools/create_lure/process_actions.cpp
index 20d8e50aa5..abf32b6fba 100644
--- a/devtools/create_lure/process_actions.cpp
+++ b/devtools/create_lure/process_actions.cpp
@@ -67,6 +67,7 @@ JumpOffsetsRecord jumpOffsets[] = {
{FR_FRA, {0x8bbf, 0x8c18}},
{DE_DEU, {0x8c1c, 0x8c75}},
{ES_ESP, {0x8882, 0x88e0}},
+ {EN_USA, {0x8aa4, 0x8B02}},
{UNK_LANG, {0, 0}}
};
@@ -127,6 +128,7 @@ uint16 process_action_sequence_entry(int supportIndex, byte *data, uint16 remain
switch (language) {
case EN_ANY:
+ case EN_USA:
if (startOffset == 0x7dcb) { startOffset = 0x7d9d; maxOffset = 0x7dcb; }
if (startOffset == 0x7248) { startOffset = 0x71ce; maxOffset = 0x7248; }
if (startOffset == 0x79a8) { startOffset = 0x785c; maxOffset = 0x79a8; }
@@ -371,7 +373,8 @@ void read_action_sequence(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) raOffset = 0x4df0;
else if (language == DE_DEU) raOffset = 0x4de0;
else if (language == ES_ESP) raOffset = 0x4dc0;
- else if (language != EN_ANY) errorExit("read_action_sequence: Unknown language");
+ else if (language != EN_ANY && language != EN_USA)
+ errorExit("read_action_sequence: Unknown language");
lureExe.seek(dataSegment + raOffset, SEEK_SET);
for (roomIndex = 0; roomIndex < RANDOM_ROOM_NUM_ENTRIES; ++roomIndex) {
@@ -419,6 +422,7 @@ void read_action_sequence(byte *&data, uint16 &totalSize) {
// index, so they need to be first, and in that order
switch (language) {
case EN_ANY:
+ case EN_USA:
process_entry(0x13c2, data, totalSize); // RETURN sequence
process_entry(0xbb95, data, totalSize); // Exit blocked sequence
process_entry(0x706c, data, totalSize); // Jump proc #2 - go to castle basement
@@ -464,7 +468,8 @@ void read_action_sequence(byte *&data, uint16 &totalSize) {
else if (language == FR_FRA) hsOffset = 0x5e78;
else if (language == DE_DEU) hsOffset = 0x5ea8;
else if (language == ES_ESP) hsOffset = 0x5e78;
- else if (language != EN_ANY) errorExit("read_action_sequence: Unknown language");
+ else if (language != EN_ANY && language != EN_USA)
+ errorExit("read_action_sequence: Unknown language");
hotspotIndex = 0;
for (;;) {
diff --git a/dists/engine-data/lure.dat b/dists/engine-data/lure.dat
index 1855613dee..b73acce3ef 100644
Binary files a/dists/engine-data/lure.dat and b/dists/engine-data/lure.dat differ
diff --git a/engines/lure/detection.cpp b/engines/lure/detection.cpp
index 92c3254cc4..c8b0638bb9 100644
--- a/engines/lure/detection.cpp
+++ b/engines/lure/detection.cpp
@@ -70,25 +70,25 @@ static const LureGameDescription gameDescriptions[] = {
GUIO0()
#endif
},
- GF_FLOPPY,
+ GF_FLOPPY
},
- { // VGA version. Assembled 11:13:50 on 08/04/92
+ { // Konami VGA version. Assembled 11:13:50 on 08/04/92
// Bugreport #11441
{
"lure",
- _s("Missing game code"), // Reason for being unsupported
+ "Konami VGA",
AD_ENTRY1s("disk1.vga", "fbb0fca025579c0eda81d832d1fa5567", 615008),
Common::EN_ANY,
Common::kPlatformDOS,
- ADGF_UNSUPPORTED,
+ ADGF_NO_FLAGS,
#ifdef USE_TTS
GUIO1(GAMEOPTION_TTS_NARRATOR)
#else
GUIO0()
#endif
},
- GF_FLOPPY,
+ GF_FLOPPY | GF_KONAMI
},
{
@@ -105,7 +105,7 @@ static const LureGameDescription gameDescriptions[] = {
GUIO0()
#endif
},
- GF_FLOPPY | GF_EGA,
+ GF_FLOPPY | GF_EGA
},
{
@@ -118,7 +118,7 @@ static const LureGameDescription gameDescriptions[] = {
ADGF_NO_FLAGS,
GUIO0()
},
- GF_FLOPPY,
+ GF_FLOPPY
},
{
@@ -131,7 +131,7 @@ static const LureGameDescription gameDescriptions[] = {
ADGF_NO_FLAGS,
GUIO0()
},
- GF_FLOPPY | GF_EGA,
+ GF_FLOPPY | GF_EGA
},
{
@@ -144,7 +144,7 @@ static const LureGameDescription gameDescriptions[] = {
ADGF_NO_FLAGS,
GUIO0()
},
- GF_FLOPPY,
+ GF_FLOPPY
},
{
@@ -157,7 +157,7 @@ static const LureGameDescription gameDescriptions[] = {
ADGF_NO_FLAGS,
GUIO0()
},
- GF_FLOPPY,
+ GF_FLOPPY
},
{
@@ -170,7 +170,7 @@ static const LureGameDescription gameDescriptions[] = {
ADGF_NO_FLAGS,
GUIO0()
},
- GF_FLOPPY,
+ GF_FLOPPY
},
{
@@ -183,7 +183,7 @@ static const LureGameDescription gameDescriptions[] = {
ADGF_NO_FLAGS,
GUIO0()
},
- GF_FLOPPY,
+ GF_FLOPPY
},
// Russian OG Edition v1.0
@@ -197,7 +197,7 @@ static const LureGameDescription gameDescriptions[] = {
ADGF_NO_FLAGS,
GUIO0()
},
- GF_FLOPPY,
+ GF_FLOPPY
},
// Russian OG Edition v1.1
@@ -211,7 +211,7 @@ static const LureGameDescription gameDescriptions[] = {
ADGF_NO_FLAGS,
GUIO0()
},
- GF_FLOPPY,
+ GF_FLOPPY
},
// Unsupported demo
@@ -226,7 +226,7 @@ static const LureGameDescription gameDescriptions[] = {
ADGF_DEMO | ADGF_UNSUPPORTED,
GUIO0()
},
- GF_FLOPPY,
+ GF_FLOPPY
},
diff --git a/engines/lure/detection.h b/engines/lure/detection.h
index 94090c39e0..23d35230ce 100644
--- a/engines/lure/detection.h
+++ b/engines/lure/detection.h
@@ -30,6 +30,7 @@ namespace Lure {
enum {
GF_FLOPPY = 1 << 0,
GF_EGA = 1 << 1,
+ GF_KONAMI = 1 << 2,
GF_LNGUNK = 1 << 15
};
diff --git a/engines/lure/hotspots.cpp b/engines/lure/hotspots.cpp
index 128308ecd0..8df5e86943 100644
--- a/engines/lure/hotspots.cpp
+++ b/engines/lure/hotspots.cpp
@@ -3635,6 +3635,13 @@ void HotspotTickHandlers::talkAnimHandler(Hotspot &h) {
responseNumber = Script::execute(_talkResponse->preSequenceId);
debugC(ERROR_DETAILED, kLureDebugAnimations, "Character response new response = %d",
responseNumber);
+
+ // FIXME: Fix for resetting the character being talked to
+ // after talking to Goewin whilst transformed
+ if (_talkResponse->preSequenceId == 10902) {
+ HotspotData *character = res.getHotspot(PLAYER_ID);
+ character->talkDestCharacterId = 0;
+ }
} while (responseNumber != TALK_RESPONSE_MAGIC_ID);
descId = _talkResponse->descId;
@@ -4118,8 +4125,10 @@ void HotspotTickHandlers::npcRoomChange(Hotspot &h) {
}
// Get room exit coordinates
- RoomExitCoordinateData &exitData = res.coordinateList().getEntry(
- h.roomNumber()).getData(h.currentActions().top().roomNumber());
+ uint16 srcRoom = h.roomNumber(),
+ destRoom = h.currentActions().top().roomNumber();
+ RoomExitCoordinates &coords = res.coordinateList().getEntry(srcRoom);
+ RoomExitCoordinateData &exitData = coords.getData(destRoom);
if (h.hotspotId() != RATPOUCH_ID) {
// Count up the number of characters in the room
diff --git a/engines/lure/lure.h b/engines/lure/lure.h
index 6abb5c7530..adcf90b19b 100644
--- a/engines/lure/lure.h
+++ b/engines/lure/lure.h
@@ -61,6 +61,7 @@ enum LureLanguage {
LANG_ES_ESP = 17,
LANG_EN_ANY = 3,
LANG_RU_RUS = 3, // English data has been overridden
+ LANG_EN_KONAMI = 4,
LANG_UNKNOWN = -1
};
@@ -120,6 +121,7 @@ public:
Common::Language getLanguage() const;
Common::Platform getPlatform() const;
bool isEGA() const { return (getFeatures() & GF_EGA) != 0; }
+ bool isKonami() const { return (getFeatures() & GF_KONAMI) != 0; }
Common::Error loadGameState(int slot) override {
return loadGame(slot) ? Common::kNoError : Common::kReadingFailed;
@@ -135,7 +137,9 @@ public:
return _saveLoadAllowed && !Fights.isFighting();
}
};
- Common::String getSaveName(Common::InSaveFile *in);
+
+Common::String getSaveName(Common::InSaveFile *in);
+
} // End of namespace Lure
#endif
diff --git a/engines/lure/luredefs.h b/engines/lure/luredefs.h
index f01de75e98..02885118e6 100644
--- a/engines/lure/luredefs.h
+++ b/engines/lure/luredefs.h
@@ -31,7 +31,7 @@ namespace Lure {
#define SUPPORT_FILENAME "lure.dat"
#define LURE_DAT_MAJOR 1
-#define LURE_DAT_MINOR 30
+#define LURE_DAT_MINOR 31
#define LURE_MIN_SAVEGAME_MINOR 25
#define LURE_SAVEGAME_MINOR 33
diff --git a/engines/lure/metaengine.cpp b/engines/lure/metaengine.cpp
index 099510822a..c378b9a502 100644
--- a/engines/lure/metaengine.cpp
+++ b/engines/lure/metaengine.cpp
@@ -41,7 +41,8 @@ LureLanguage LureEngine::getLureLanguage() const {
case Common::DE_DEU: return LANG_DE_DEU;
case Common::ES_ESP: return LANG_ES_ESP;
case Common::RU_RUS: return LANG_RU_RUS;
- case Common::EN_ANY: return LANG_EN_ANY;
+ case Common::EN_ANY:
+ return isKonami() ? LANG_EN_KONAMI : LANG_EN_ANY;
case Common::UNK_LANG: return LANG_UNKNOWN;
default:
error("Unknown game language");
diff --git a/engines/lure/strings.cpp b/engines/lure/strings.cpp
index dbe2f786b4..9adec63516 100644
--- a/engines/lure/strings.cpp
+++ b/engines/lure/strings.cpp
@@ -236,7 +236,6 @@ void StringData::getString(uint16 stringId, char *dest, const char *hotspotName,
// Hardcode for end of string
ch = '\0';
else
- // All other character reads
ch = readCharacter();
}
More information about the Scummvm-git-logs
mailing list