[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