aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/gob/dataio.cpp8
-rw-r--r--engines/gob/detection.cpp805
-rw-r--r--engines/gob/draw.h8
-rw-r--r--engines/gob/draw_fascin.cpp44
-rw-r--r--engines/gob/game.cpp3
-rw-r--r--engines/gob/game_v1.cpp3
-rw-r--r--engines/gob/gob.cpp282
-rw-r--r--engines/gob/gob.h9
-rw-r--r--engines/gob/init.cpp22
-rw-r--r--engines/gob/init.h2
-rw-r--r--engines/gob/init_v2.cpp3
-rw-r--r--engines/gob/inter.cpp8
-rw-r--r--engines/gob/inter.h52
-rw-r--r--engines/gob/inter_fascin.cpp804
-rw-r--r--engines/gob/inter_v1.cpp6
-rw-r--r--engines/gob/module.mk2
16 files changed, 1726 insertions, 335 deletions
diff --git a/engines/gob/dataio.cpp b/engines/gob/dataio.cpp
index a2bb730870..dbb1e66eb2 100644
--- a/engines/gob/dataio.cpp
+++ b/engines/gob/dataio.cpp
@@ -370,6 +370,7 @@ void DataIO::openDataFile(const char *src, bool itk) {
ChunkDesc *dataDesc;
char path[128];
int16 file;
+ char *fakeTotPtr;
strncpy0(path, src, 127);
if (!strchr(path, '.')) {
@@ -409,6 +410,13 @@ void DataIO::openDataFile(const char *src, bool itk) {
Util::replaceChar(dataDesc[i].chunkName, (char) 0x8E, 'O');
Util::replaceChar(dataDesc[i].chunkName, (char) 0x91, 'C');
Util::replaceChar(dataDesc[i].chunkName, (char) 0x92, 'T');
+
+ // Geisha use 0ot files, which are compressed TOT files without the packed byte set.
+ fakeTotPtr = strstr(dataDesc[i].chunkName, "0OT");
+ if (fakeTotPtr != 0) {
+ strncpy(fakeTotPtr, "TOT", 3);
+ dataDesc[i].packed = 1;
+ }
}
for (int i = 0; i < _numDataChunks[file]; i++)
diff --git a/engines/gob/detection.cpp b/engines/gob/detection.cpp
index aaae57b756..7f1f992d4d 100644
--- a/engines/gob/detection.cpp
+++ b/engines/gob/detection.cpp
@@ -35,6 +35,7 @@ struct GOBGameDescription {
GameType gameType;
int32 features;
+ const char *startStkBase;
const char *startTotBase;
};
@@ -59,6 +60,11 @@ static const PlainGameDescriptor gobGames[] = {
{"woodruff", "The Bizarre Adventures of Woodruff and the Schnibble"},
{"dynasty", "The Last Dynasty"},
{"urban", "Urban Runner"},
+ {"archibald", "Playtoon 1 - Uncle Archibald"},
+ {"spirou", "Playtoon 2 - Spirou"},
+ {"fascination", "Fascination"},
+ {"geisha", "Geisha"},
+ {"adibou4", "Adibou v4"},
{0, 0}
};
@@ -82,7 +88,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesEGA,
- "intro"
+ 0,
+ 0
},
{
{
@@ -95,7 +102,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesEGA,
- "intro"
+ 0,
+ 0
},
{ // Supplied by Theruler76 in bug report #1201233
{
@@ -108,7 +116,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by raziel_ in bug report #1891864
{
@@ -121,7 +130,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // CD 1.000 version.
{
@@ -134,7 +144,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // CD 1.000 version.
{
@@ -147,7 +158,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // CD 1.000 version.
{
@@ -160,7 +172,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // CD 1.000 version.
{
@@ -173,7 +186,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // CD 1.000 version.
{
@@ -186,7 +200,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // CD 1.02 version. Multilingual
{
@@ -199,7 +214,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // CD 1.02 version. Multilingual
{
@@ -212,7 +228,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // CD 1.02 version. Multilingual
{
@@ -225,7 +242,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // CD 1.02 version. Multilingual
{
@@ -238,7 +256,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // CD 1.02 version. Multilingual
{
@@ -251,7 +270,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -264,7 +284,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{
{
@@ -277,7 +298,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{
{
@@ -290,7 +312,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by raina in the forums
{
@@ -303,7 +326,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 in bug report #1652352
{
@@ -316,7 +340,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 in bug report #1652352
{
@@ -329,7 +354,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 in bug report #1652352
{
@@ -342,7 +368,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 in bug report #1652352
{
@@ -355,7 +382,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 in bug report #1652352
{
@@ -368,7 +396,26 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob1,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
+ },
+ {
+ {
+ "gob1",
+ "",
+ {
+ {"intro.stk", 0, "f5f028ee39c456fa51fa63b606583918", 313472},
+ {"musmac1.mid", 0, "4f66903b33df8a20edd4c748809c0b56", 8161},
+ {NULL, 0, NULL, 0}
+ },
+ FR_FRA,
+ kPlatformWindows,
+ ADGF_NO_FLAGS
+ },
+ kGameTypeGob1,
+ kFeaturesAdlib,
+ 0,
+ 0
},
{ // Supplied by fac76 in bug report #1883808
{
@@ -381,7 +428,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{
{
@@ -394,7 +442,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by goodoldgeorg in bug report #2602057
{
@@ -407,7 +456,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by bgk in bug report #1706861
{
@@ -420,7 +470,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by fac76 in bug report #1673397
{
@@ -437,7 +488,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by koalet in bug report #2478585
{
@@ -454,7 +506,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -467,7 +520,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -480,7 +534,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by raziel_ in bug report #1891867
{
@@ -493,7 +548,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -506,7 +562,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by blackwhiteeagle in bug report #1605235
{
@@ -519,7 +576,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -532,7 +590,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by goodoldgeorg in bug report #2602017
{
@@ -545,7 +604,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -558,7 +618,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by arcepi in bug report #1659884
{
@@ -571,7 +632,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -584,7 +646,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -597,7 +660,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -610,7 +674,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -623,7 +688,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -636,7 +702,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -649,7 +716,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -662,7 +730,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "usa"
+ 0,
+ "usa.tot"
},
{
{
@@ -675,7 +744,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -688,7 +758,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by polluks in bug report #1895126
{
@@ -701,7 +772,26 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesNone,
- "intro"
+ 0,
+ 0
+ },
+ {
+ {
+ "gob2",
+ "",
+ {
+ {"intro.stk", 0, "285d7340f98ebad65d465585da12910b", 837286},
+ {"musmac1.mid", 0, "834e55205b710d0af5f14a6f2320dd8e", 8661},
+ {NULL, 0, NULL, 0}
+ },
+ FR_FRA,
+ kPlatformWindows,
+ ADGF_NO_FLAGS
+ },
+ kGameTypeGob2,
+ kFeaturesAdlib,
+ 0,
+ 0
},
{ // Supplied by vampir_raziel in bug report #1658373
{
@@ -718,7 +808,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by vampir_raziel in bug report #1658373
{
@@ -731,7 +822,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by vampir_raziel in bug report #1658373
{
@@ -744,7 +836,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by vampir_raziel in bug report #1658373
{
@@ -757,7 +850,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by goodoldgeorg in bug report #2563539
{
@@ -774,7 +868,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by pwigren in bug report #1764174
{
@@ -791,7 +886,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{
{
@@ -804,7 +900,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{
{
@@ -817,7 +914,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -830,7 +928,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by cybot_tmin in bug report #1667743
{
@@ -843,7 +942,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -856,7 +956,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by cartman_ on #scummvm
{
@@ -869,7 +970,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by glorfindel in bugreport #1722142
{
@@ -882,7 +984,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -895,7 +998,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesAdlib,
- "show"
+ 0,
+ "show.tot"
},
{
{
@@ -908,7 +1012,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWeen,
kFeaturesAdlib,
- "show"
+ 0,
+ "show.tot"
},
{
{
@@ -921,7 +1026,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeBargon,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by Trekky in the forums
{
@@ -934,7 +1040,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeBargon,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by cesardark in bug #1681649
{
@@ -947,7 +1054,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeBargon,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 in bug #1692667
{
@@ -960,7 +1068,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeBargon,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by pwigren in bugreport #1764174
{
@@ -973,7 +1082,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeBargon,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by kizkoool in bugreport #2089734
{
@@ -986,7 +1096,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeBargon,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{ // Supplied by glorfindel in bugreport #1722142
{
@@ -999,7 +1110,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeBargon,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1012,7 +1124,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib | kFeaturesEGA,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1029,7 +1142,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1042,7 +1156,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1055,7 +1170,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by Arshlan in the forums
{
@@ -1068,7 +1184,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by cartman_ on #scummvm
{
@@ -1081,7 +1198,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by goodoldgeorg in bug report #2105220
{
@@ -1094,7 +1212,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by koalet in bug report #2479034
{
@@ -1111,7 +1230,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1124,7 +1244,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1137,7 +1258,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1150,7 +1272,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1163,7 +1286,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1176,7 +1300,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1189,7 +1314,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by SiRoCs in bug report #2093672
{
@@ -1202,7 +1328,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by SiRoCs in bug report #2093672
{
@@ -1215,7 +1342,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by SiRoCs in bug report #2093672
{
@@ -1228,7 +1356,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by SiRoCs in bug report #2093672
{
@@ -1241,7 +1370,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by SiRoCs in bug report #2093672
{
@@ -1254,7 +1384,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by SiRoCs in bug report #2093672
{
@@ -1267,7 +1398,135 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
+ },
+ {
+ {
+ "fascination",
+ "CD Version (Censored)",
+ AD_ENTRY1s("disk0.stk", "9c61e9c22077f72921f07153e37ccf01", 545952),
+ UNK_LANG,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ },
+ kGameTypeFascination,
+ kFeaturesCD,
+ "disk0.stk",
+ 0
+ },
+ {
+ {
+ "fascination",
+ "VGA 3 disks edition",
+ AD_ENTRY1s("disk0.stk", "a50a8495e1b2d67699fb562cb98fc3e2", 1064387),
+ UNK_LANG,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ },
+ kGameTypeFascination,
+ kFeaturesNone,
+ "disk0.stk",
+ 0
+ },
+ //Provided by Sanguine
+ {
+ {
+ "fascination",
+ "VGA 3 disks edition",
+ AD_ENTRY1s("disk0.stk", "c14330d052fe4da5a441ac9d81bc5891", 1061955),
+ UNK_LANG,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ },
+ kGameTypeFascination,
+ kFeaturesNone,
+ "disk0.stk",
+ 0
+ },
+ {
+ {
+ "fascination",
+ "VGA",
+ AD_ENTRY1s("disk0.stk", "e8ab4f200a2304849f462dc901705599", 183337),
+ UNK_LANG,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ },
+ kGameTypeFascination,
+ kFeaturesNone,
+ "disk0.stk",
+ 0
+ },
+ {
+ {
+ "fascination",
+ "",
+ AD_ENTRY1s("disk0.stk", "68b1c01564f774c0b640075fbad1b695", 189968),
+ DE_DEU,
+ kPlatformAmiga,
+ ADGF_NO_FLAGS,
+ },
+ kGameTypeFascination,
+ kFeaturesNone,
+ "disk0.stk",
+ 0
+ },
+ {
+ {
+ "fascination",
+ "",
+ AD_ENTRY1s("disk0.stk", "7062117e9c5adfb6bfb2dac3ff74df9e", 189951),
+ EN_ANY,
+ kPlatformAmiga,
+ ADGF_NO_FLAGS,
+ },
+ kGameTypeFascination,
+ kFeaturesNone,
+ "disk0.stk",
+ 0
+ },
+ {
+ {
+ "fascination",
+ "",
+ AD_ENTRY1s("disk0.stk", "55c154e5a3e8e98afebdcff4b522e1eb", 190005),
+ FR_FRA,
+ kPlatformAmiga,
+ ADGF_NO_FLAGS,
+ },
+ kGameTypeFascination,
+ kFeaturesNone,
+ "disk0.stk",
+ 0
+ },
+ {
+ {
+ "fascination",
+ "",
+ AD_ENTRY1s("disk0.stk", "7691827fff35df7799f14cfd6be178ad", 189931),
+ IT_ITA,
+ kPlatformAmiga,
+ ADGF_NO_FLAGS,
+ },
+ kGameTypeFascination,
+ kFeaturesNone,
+ "disk0.stk",
+ 0
+ },
+ {
+ {
+ "geisha",
+ "",
+ AD_ENTRY1s("disk1.stk", "6eebbb98ad90cd3c44549fc2ab30f632", 212153),
+ UNK_LANG,
+ kPlatformPC,
+ ADGF_NO_FLAGS,
+ },
+ kGameTypeGeisha,
+ kFeaturesNone,
+ "disk1.stk",
+ "intro.tot"
},
{
{
@@ -1280,7 +1539,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesAdlib,
- "demo"
+ "demo.stk",
+ "demo.tot"
},
{
{
@@ -1293,7 +1553,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeLostInTime,
kFeaturesAdlib,
- "demo"
+ "demo.stk",
+ "demo.tot"
},
{
{
@@ -1306,7 +1567,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by raziel_ in bug report #1891869
{
@@ -1319,7 +1581,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by fac76 in bug report #1742716
{
@@ -1336,7 +1599,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1349,7 +1613,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 in bug report #1652352
{
@@ -1362,7 +1627,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1375,7 +1641,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by Paranoimia on #scummvm
{
@@ -1388,7 +1655,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1401,7 +1669,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1414,7 +1683,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{ // Supplied by SiRoCs in bug report #2098621
{
@@ -1427,7 +1697,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1440,7 +1711,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesNone,
- "menu"
+ 0,
+ "menu.tot"
},
{
{
@@ -1453,7 +1725,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesNone,
- "menu"
+ 0,
+ "menu.tot"
},
{
{
@@ -1466,7 +1739,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
{
@@ -1479,7 +1753,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
{
@@ -1492,7 +1767,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
{
@@ -1505,7 +1781,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
{
@@ -1518,7 +1795,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{ // Supplied by paul66 and noizert in bug reports #1652352 and #1691230
{
@@ -1531,7 +1809,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1544,7 +1823,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1557,7 +1837,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1570,7 +1851,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1583,7 +1865,26 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
+ },
+ {
+ {
+ "gob3",
+ "",
+ {
+ {"intro.stk", 0, "edd7403e5dc2a14459d2665a4c17714d", 209534},
+ {"musmac1.mid", 0, "948c546cad3a9de5bff3fe4107c82bf1", 6404},
+ {NULL, 0, NULL, 0}
+ },
+ FR_FRA,
+ kPlatformWindows,
+ ADGF_NO_FLAGS
+ },
+ kGameTypeGob3,
+ kFeaturesAdlib,
+ 0,
+ 0
},
{
{
@@ -1596,7 +1897,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeInca2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1609,7 +1911,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeInca2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1622,7 +1925,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeInca2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1635,7 +1939,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeInca2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1648,7 +1953,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeInca2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1661,7 +1967,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeInca2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1674,7 +1981,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeInca2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1687,7 +1995,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeInca2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1700,7 +2009,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1713,7 +2023,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1726,7 +2037,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1739,7 +2051,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1752,7 +2065,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1765,7 +2079,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1778,7 +2093,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1791,7 +2107,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1804,7 +2121,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1817,7 +2135,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -1830,7 +2149,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by jvprat on #scummvm
{
@@ -1843,7 +2163,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by jvprat on #scummvm
{
@@ -1856,7 +2177,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by jvprat on #scummvm
{
@@ -1869,7 +2191,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by jvprat on #scummvm
{
@@ -1882,7 +2205,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by jvprat on #scummvm
{
@@ -1895,7 +2219,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by Hkz on #scummvm
{
@@ -1908,7 +2233,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by Hkz on #scummvm
{
@@ -1921,7 +2247,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by Hkz on #scummvm
{
@@ -1934,7 +2261,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by DjDiabolik in bug report #1971294
{
@@ -1947,7 +2275,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by DjDiabolik in bug report #1971294
{
@@ -1960,7 +2289,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by DjDiabolik in bug report #1971294
{
@@ -1973,7 +2303,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by DjDiabolik in bug report #1971294
{
@@ -1986,7 +2317,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by DjDiabolik in bug report #1971294
{
@@ -1999,7 +2331,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{ // Supplied by goodoldgeorg in bug report #2098838
{
@@ -2012,7 +2345,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2025,7 +2359,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeDynasty,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2038,7 +2373,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeDynasty,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2051,7 +2387,8 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeDynasty,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2064,7 +2401,22 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeDynasty,
kFeatures640,
- "intro"
+ 0,
+ 0
+ },
+ {
+ {
+ "dynasty",
+ "Demo",
+ AD_ENTRY1s("lda1.stk", "0e56a899357cbc0bf503260fd2dd634e", 15032774),
+ UNK_LANG,
+ kPlatformWindows,
+ ADGF_DEMO
+ },
+ kGameTypeDynasty,
+ kFeatures640,
+ "lda1.stk",
+ 0
},
{
{
@@ -2077,7 +2429,36 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeUrban,
kFeatures640,
- "intro"
+ 0,
+ 0
+ },
+ {
+ {
+ "spirou",
+ "",
+ AD_ENTRY1s("intro2.stk", "5e214cec5041d6a4a810feba8ddaaa92",247576),
+ UNK_LANG,
+ kPlatformPC,
+ ADGF_NO_FLAGS
+ },
+ kGameTypeSpirou,
+ kFeatures640,
+ "intro2.stk",
+ 0
+ },
+ {
+ {
+ "archibald",
+ "",
+ AD_ENTRY1s("intro2.stk", "9aa412f5b8a1ee1761cb7b26e97fbd56",247094),
+ UNK_LANG,
+ kPlatformWindows,
+ ADGF_NO_FLAGS
+ },
+ kGameTypeArchibald,
+ kFeatures640,
+ "intro2.stk",
+ 0
},
{ // Supplied by gamin in the forums
{
@@ -2090,7 +2471,22 @@ static const GOBGameDescription gameDescriptions[] = {
},
kGameTypeUrban,
kFeatures640,
- "intro"
+ 0,
+ 0
+ },
+ {
+ {
+ "adibou4",
+ "",
+ AD_ENTRY1s("intro.stk", "a3c35d19b2d28ea261d96321d208cb5a", 6021466),
+ FR_FRA,
+ kPlatformPC,
+ ADGF_NO_FLAGS
+ },
+ kGameTypeAdibou4,
+ kFeatures640,
+ 0,
+ 0
},
{ AD_TABLE_END_MARKER, kGameTypeNone, kFeaturesNone, NULL }
};
@@ -2107,7 +2503,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeGob1,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2120,7 +2517,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeGob1,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2133,7 +2531,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2146,7 +2545,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeGob2,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2159,7 +2559,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeGob2,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2172,7 +2573,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeBargon,
kFeaturesNone,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2185,7 +2587,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeGob3,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2198,7 +2601,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeGob3,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2211,7 +2615,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeWoodruff,
kFeatures640,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2224,7 +2629,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeLostInTime,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2237,7 +2643,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeLostInTime,
kFeaturesAdlib,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2250,7 +2657,8 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeLostInTime,
kFeaturesCD,
- "intro"
+ 0,
+ 0
},
{
{
@@ -2263,8 +2671,51 @@ static const GOBGameDescription fallbackDescs[] = {
},
kGameTypeUrban,
kFeaturesCD,
- "intro"
- }
+ 0,
+ 0
+ },
+ {
+ {
+ "fascination",
+ "unknown",
+ AD_ENTRY1(0, 0),
+ UNK_LANG,
+ kPlatformPC,
+ ADGF_NO_FLAGS
+ },
+ kGameTypeFascination,
+ kFeaturesNone,
+ "disk0.stk",
+ 0
+ },
+ {
+ {
+ "geisha",
+ "unknown",
+ AD_ENTRY1(0, 0),
+ UNK_LANG,
+ kPlatformPC,
+ ADGF_NO_FLAGS
+ },
+ kGameTypeGeisha,
+ kFeaturesNone,
+ "disk1.stk",
+ "intro.tot"
+ },
+ {
+ {
+ "adibou4",
+ "",
+ AD_ENTRY1(0, 0),
+ UNK_LANG,
+ kPlatformPC,
+ ADGF_NO_FLAGS
+ },
+ kGameTypeAdibou4,
+ kFeatures640,
+ "adif41.stk",
+ 0
+ },
};
static const ADFileBasedFallback fileBased[] = {
@@ -2282,6 +2733,9 @@ static const ADFileBasedFallback fileBased[] = {
{ &fallbackDescs[10], { "intro.stk", "commun1.itk", "musmac1.mid", 0 } },
{ &fallbackDescs[11], { "intro.stk", "commun1.itk", "lost.lic", 0 } },
{ &fallbackDescs[12], { "intro.stk", "cd1.itk", "objet1.itk", 0 } },
+ { &fallbackDescs[13], { "disk0.stk", "disk1.stk", "disk2.stk", "disk3.stk", 0 } },
+ { &fallbackDescs[14], { "disk1.stk", "disk2.stk", "disk3.stk", 0 } },
+ { &fallbackDescs[15], { "adif41.stk", "adim41.stk", 0 } },
{ 0, { 0 } }
};
@@ -2350,22 +2804,21 @@ namespace Gob {
void GobEngine::initGame(const GOBGameDescription *gd) {
if (gd->startTotBase == 0) {
_startTot = new char[10];
- _startTot0 = new char[11];
strcpy(_startTot, "intro.tot");
- strcpy(_startTot0, "intro0.tot");
} else {
- _startTot = new char[strlen(gd->startTotBase) + 5];
- _startTot0 = new char[strlen(gd->startTotBase) + 6];
+ _startTot = new char[strlen(gd->startTotBase) + 1];
strcpy(_startTot, gd->startTotBase);
- strcpy(_startTot0, gd->startTotBase);
- strcat(_startTot, ".tot");
- strcat(_startTot0, "0.tot");
}
-
+ if (gd->startStkBase == 0) {
+ _startStk = new char[10];
+ strcpy(_startStk, "intro.stk");
+ } else {
+ _startStk = new char[strlen(gd->startStkBase) + 1];
+ strcpy(_startStk, gd->startStkBase);
+ }
_gameType = gd->gameType;
_features = gd->features;
_language = gd->desc.language;
_platform = gd->desc.platform;
}
-
} // End of namespace Gob
diff --git a/engines/gob/draw.h b/engines/gob/draw.h
index d1238bf702..873019745f 100644
--- a/engines/gob/draw.h
+++ b/engines/gob/draw.h
@@ -211,6 +211,14 @@ public:
virtual ~Draw_Bargon() {}
};
+class Draw_Fascin: public Draw_v2 {
+public:
+ virtual void initScreen();
+
+ Draw_Fascin(GobEngine *vm);
+ virtual ~Draw_Fascin() {}
+};
+
// Draw operations
#define DRAW_BLITSURF 0
diff --git a/engines/gob/draw_fascin.cpp b/engines/gob/draw_fascin.cpp
new file mode 100644
index 0000000000..58bf486bc1
--- /dev/null
+++ b/engines/gob/draw_fascin.cpp
@@ -0,0 +1,44 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "gob/gob.h"
+#include "gob/draw.h"
+#include "gob/global.h"
+#include "gob/video.h"
+
+namespace Gob {
+
+Draw_Fascin::Draw_Fascin(GobEngine *vm) : Draw_v2(vm) {
+}
+
+void Draw_Fascin::initScreen(void) {
+ _vm->_global->_videoMode = 0x14;
+ _vm->_video->_surfWidth = 640;
+ _vm->_video->initPrimary(_vm->_global->_videoMode);
+
+ Draw_v2::initScreen();
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp
index 1a7c31eec0..9f64099e73 100644
--- a/engines/gob/game.cpp
+++ b/engines/gob/game.cpp
@@ -557,6 +557,9 @@ void Game::totSub(int8 flags, const char *newTotFile) {
_vm->_inter->_variables = 0;
strncpy0(_curTotFile, newTotFile, 9);
+// if (_vm->getGameType() == kGameTypeGeisha)
+// strcat(_curTotFile, ".0OT");
+// else
strcat(_curTotFile, ".TOT");
if (_vm->_inter->_terminate != 0)
diff --git a/engines/gob/game_v1.cpp b/engines/gob/game_v1.cpp
index 4d392e4ce6..4d2361e78f 100644
--- a/engines/gob/game_v1.cpp
+++ b/engines/gob/game_v1.cpp
@@ -71,7 +71,8 @@ void Game_v1::playTot(int16 skipPlay) {
_vm->_draw->_fontToSprite[i].height = -1;
}
- if (_vm->getPlatform() == Common::kPlatformMacintosh)
+ if ((_vm->getPlatform() == Common::kPlatformMacintosh)||
+ (_vm->getPlatform() == Common::kPlatformWindows))
_vm->_sound->adlibStop();
else
_vm->_sound->cdStop();
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index 51b7d30fbe..fbf3d6586c 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -106,8 +106,8 @@ GobEngine::~GobEngine() {
// Stop all mixer streams (except for the permanent ones).
_vm->_mixer->stopAll();
+ delete[] _startStk;
delete[] _startTot;
- delete[] _startTot0;
}
const char *GobEngine::getLangDesc(int16 language) const {
@@ -249,7 +249,7 @@ Common::Error GobEngine::run() {
}
_global->_languageWanted = _global->_language;
- _init->initGame(0);
+ _init->initGame();
return Common::kNoError;
}
@@ -285,136 +285,154 @@ bool GobEngine::initGameParts() {
_sound = new Sound(this);
switch (_gameType) {
- case kGameTypeGob1:
- _init = new Init_v1(this);
- _video = new Video_v1(this);
- _inter = new Inter_v1(this);
- _parse = new Parse_v1(this);
- _mult = new Mult_v1(this);
- _draw = new Draw_v1(this);
- _game = new Game_v1(this);
- _map = new Map_v1(this);
- _goblin = new Goblin_v1(this);
- _scenery = new Scenery_v1(this);
- break;
-
- case kGameTypeGob2:
- _init = new Init_v2(this);
- _video = new Video_v2(this);
- _inter = new Inter_v2(this);
- _parse = new Parse_v2(this);
- _mult = new Mult_v2(this);
- _draw = new Draw_v2(this);
- _game = new Game_v2(this);
- _map = new Map_v2(this);
- _goblin = new Goblin_v2(this);
- _scenery = new Scenery_v2(this);
- _saveLoad = new SaveLoad_v2(this, _targetName.c_str());
- break;
-
- case kGameTypeBargon:
- _init = new Init_v2(this);
- _video = new Video_v2(this);
- _inter = new Inter_Bargon(this);
- _parse = new Parse_v2(this);
- _mult = new Mult_v2(this);
- _draw = new Draw_Bargon(this);
- _game = new Game_v2(this);
- _map = new Map_v2(this);
- _goblin = new Goblin_v2(this);
- _scenery = new Scenery_v2(this);
- _saveLoad = new SaveLoad_v2(this, _targetName.c_str());
- break;
-
- case kGameTypeWeen:
- _init = new Init_v2(this);
- _video = new Video_v2(this);
- _inter = new Inter_v2(this);
- _parse = new Parse_v2(this);
- _mult = new Mult_v2(this);
- _draw = new Draw_v2(this);
- _game = new Game_v2(this);
- _map = new Map_v2(this);
- _goblin = new Goblin_v2(this);
- _scenery = new Scenery_v2(this);
- _saveLoad = new SaveLoad_v2(this, _targetName.c_str());
- break;
-
- case kGameTypeGob3:
- case kGameTypeInca2:
- _init = new Init_v3(this);
- _video = new Video_v2(this);
- _inter = new Inter_v3(this);
- _parse = new Parse_v2(this);
- _mult = new Mult_v2(this);
- _draw = new Draw_v2(this);
- _game = new Game_v2(this);
- _map = new Map_v2(this);
- _goblin = new Goblin_v3(this);
- _scenery = new Scenery_v2(this);
- _saveLoad = new SaveLoad_v3(this, _targetName.c_str());
- break;
-
- case kGameTypeLostInTime:
- _init = new Init_v3(this);
- _video = new Video_v2(this);
- _inter = new Inter_v3(this);
- _parse = new Parse_v2(this);
- _mult = new Mult_v2(this);
- _draw = new Draw_v2(this);
- _game = new Game_v2(this);
- _map = new Map_v2(this);
- _goblin = new Goblin_v3(this);
- _scenery = new Scenery_v2(this);
- _saveLoad = new SaveLoad_v3(this, _targetName.c_str(), 4768, 0, 50);
- break;
-
- case kGameTypeWoodruff:
- _init = new Init_v3(this);
- _video = new Video_v2(this);
- _inter = new Inter_v4(this);
- _parse = new Parse_v2(this);
- _mult = new Mult_v2(this);
- _draw = new Draw_v2(this);
- _game = new Game_v2(this);
- _map = new Map_v4(this);
- _goblin = new Goblin_v4(this);
- _scenery = new Scenery_v2(this);
- _saveLoad = new SaveLoad_v4(this, _targetName.c_str());
- break;
-
- case kGameTypeDynasty:
- _init = new Init_v3(this);
- _video = new Video_v2(this);
- _inter = new Inter_v5(this);
- _parse = new Parse_v2(this);
- _mult = new Mult_v2(this);
- _draw = new Draw_v2(this);
- _game = new Game_v2(this);
- _map = new Map_v4(this);
- _goblin = new Goblin_v4(this);
- _scenery = new Scenery_v2(this);
- _saveLoad = new SaveLoad_v4(this, _targetName.c_str());
- break;
-
- case kGameTypeUrban:
- _init = new Init_v3(this);
- _video = new Video_v6(this);
- _inter = new Inter_v6(this);
- _parse = new Parse_v2(this);
- _mult = new Mult_v2(this);
- _draw = new Draw_v2(this);
- _game = new Game_v6(this);
- _map = new Map_v4(this);
- _goblin = new Goblin_v4(this);
- _scenery = new Scenery_v2(this);
- _saveLoad = new SaveLoad_v6(this, _targetName.c_str());
- break;
-
- default:
- deinitGameParts();
- return false;
- break;
+ case kGameTypeGeisha:
+ case kGameTypeGob1:
+ _init = new Init_v1(this);
+ _video = new Video_v1(this);
+ _inter = new Inter_v1(this);
+ _parse = new Parse_v1(this);
+ _mult = new Mult_v1(this);
+ _draw = new Draw_v1(this);
+ _game = new Game_v1(this);
+ _map = new Map_v1(this);
+ _goblin = new Goblin_v1(this);
+ _scenery = new Scenery_v1(this);
+ break;
+
+ case kGameTypeFascination:
+ _init = new Init_v2(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_Fascination(this);
+ _parse = new Parse_v1(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _game = new Game_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v2(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_v2(this, _targetName.c_str());
+ break;
+
+ case kGameTypeGob2:
+ _init = new Init_v2(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_v2(this);
+ _parse = new Parse_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _game = new Game_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v2(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_v2(this, _targetName.c_str());
+ break;
+
+ case kGameTypeBargon:
+ _init = new Init_v2(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_Bargon(this);
+ _parse = new Parse_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_Bargon(this);
+ _game = new Game_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v2(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_v2(this, _targetName.c_str());
+ break;
+
+ case kGameTypeWeen:
+ _init = new Init_v2(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_v2(this);
+ _parse = new Parse_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _game = new Game_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v2(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_v2(this, _targetName.c_str());
+ break;
+
+ case kGameTypeGob3:
+ case kGameTypeInca2:
+ _init = new Init_v3(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_v3(this);
+ _parse = new Parse_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _game = new Game_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v3(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_v3(this, _targetName.c_str());
+ break;
+
+ case kGameTypeLostInTime:
+ _init = new Init_v3(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_v3(this);
+ _parse = new Parse_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _game = new Game_v2(this);
+ _map = new Map_v2(this);
+ _goblin = new Goblin_v3(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_v3(this, _targetName.c_str(), 4768, 0, 50);
+ break;
+
+ case kGameTypeWoodruff:
+ _init = new Init_v3(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_v4(this);
+ _parse = new Parse_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _game = new Game_v2(this);
+ _map = new Map_v4(this);
+ _goblin = new Goblin_v4(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_v4(this, _targetName.c_str());
+ break;
+
+ case kGameTypeDynasty:
+ _init = new Init_v3(this);
+ _video = new Video_v2(this);
+ _inter = new Inter_v5(this);
+ _parse = new Parse_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _game = new Game_v2(this);
+ _map = new Map_v4(this);
+ _goblin = new Goblin_v4(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_v4(this, _targetName.c_str());
+ break;
+
+ case kGameTypeArchibald:
+ case kGameTypeSpirou:
+ case kGameTypeAdibou4:
+ case kGameTypeUrban:
+ _init = new Init_v3(this);
+ _video = new Video_v6(this);
+ _inter = new Inter_v6(this);
+ _parse = new Parse_v2(this);
+ _mult = new Mult_v2(this);
+ _draw = new Draw_v2(this);
+ _game = new Game_v6(this);
+ _map = new Map_v4(this);
+ _goblin = new Goblin_v4(this);
+ _scenery = new Scenery_v2(this);
+ _saveLoad = new SaveLoad_v6(this, _targetName.c_str());
+ break;
+
+ default:
+ deinitGameParts();
+ return false;
+ break;
}
if (is640()) {
diff --git a/engines/gob/gob.h b/engines/gob/gob.h
index 6500c7f2a7..fb739141cb 100644
--- a/engines/gob/gob.h
+++ b/engines/gob/gob.h
@@ -95,7 +95,12 @@ enum GameType {
kGameTypeLostInTime,
kGameTypeInca2,
kGameTypeDynasty,
- kGameTypeUrban
+ kGameTypeUrban,
+ kGameTypeArchibald,
+ kGameTypeSpirou,
+ kGameTypeFascination,
+ kGameTypeGeisha,
+ kGameTypeAdibou4
};
enum Features {
@@ -208,8 +213,8 @@ public:
uint16 _height;
uint8 _mode;
+ char *_startStk;
char *_startTot;
- char *_startTot0;
bool _copyProtection;
bool _noMusic;
diff --git a/engines/gob/init.cpp b/engines/gob/init.cpp
index 9820cc6774..8fbbab1628 100644
--- a/engines/gob/init.cpp
+++ b/engines/gob/init.cpp
@@ -55,7 +55,7 @@ void Init::cleanup(void) {
_vm->_dataIO->closeDataFile();
}
-void Init::initGame(const char *totName) {
+void Init::initGame() {
int16 handle2;
int16 handle;
int16 imdHandle;
@@ -66,19 +66,10 @@ void Init::initGame(const char *totName) {
initVideo();
- // The Lost In Time demo uses different file prefix
- if (_vm->getGameType() == kGameTypeLostInTime) {
- handle2 = _vm->_dataIO->openData("demo.stk");
- if (handle2 >= 0) {
- _vm->_dataIO->closeData(handle2);
- _vm->_dataIO->openDataFile("demo.stk");
- }
- }
-
- handle2 = _vm->_dataIO->openData("intro.stk");
+ handle2 = _vm->_dataIO->openData(_vm->_startStk);
if (handle2 >= 0) {
_vm->_dataIO->closeData(handle2);
- _vm->_dataIO->openDataFile("intro.stk");
+ _vm->_dataIO->openDataFile(_vm->_startStk);
}
_vm->_util->initInput();
@@ -142,12 +133,7 @@ void Init::initGame(const char *totName) {
delete[] infBuf;
}
- if (totName) {
- strncpy0(buffer, totName, 15);
- strcat(buffer, ".tot");
- } else
- strncpy0(buffer, _vm->_startTot, 19);
-
+ strcpy(buffer, _vm->_startTot);
handle = _vm->_dataIO->openData(buffer);
if (handle >= 0) {
diff --git a/engines/gob/init.h b/engines/gob/init.h
index 7511719612..6ab2fa7e66 100644
--- a/engines/gob/init.h
+++ b/engines/gob/init.h
@@ -32,7 +32,7 @@ namespace Gob {
class Init {
public:
- void initGame(const char *totFile);
+ void initGame();
virtual void initVideo() = 0;
diff --git a/engines/gob/init_v2.cpp b/engines/gob/init_v2.cpp
index 9e9cf69e97..9c52bd2eea 100644
--- a/engines/gob/init_v2.cpp
+++ b/engines/gob/init_v2.cpp
@@ -51,7 +51,8 @@ void Init_v2::initVideo() {
_vm->_global->_colorCount = 16;
if (!_vm->isEGA() &&
((_vm->getPlatform() == Common::kPlatformPC) ||
- (_vm->getPlatform() == Common::kPlatformMacintosh)) &&
+ (_vm->getPlatform() == Common::kPlatformMacintosh) ||
+ (_vm->getPlatform() == Common::kPlatformWindows)) &&
((_vm->_global->_videoMode == 0x13) ||
(_vm->_global->_videoMode == 0x14)))
_vm->_global->_colorCount = 256;
diff --git a/engines/gob/inter.cpp b/engines/gob/inter.cpp
index 869ab958c7..cd9685db2e 100644
--- a/engines/gob/inter.cpp
+++ b/engines/gob/inter.cpp
@@ -231,10 +231,12 @@ void Inter::funcBlock(int16 retFlag) {
break;
// WORKAROUND:
- // The EGA and Mac versions of gob1 doesn't add a delay after showing
- // images between levels. We manually add it here.
+ // The EGA, Mac and Windows versions of gob1 doesn't add a delay after
+ // showing images between levels. We manually add it here.
if ((_vm->getGameType() == kGameTypeGob1) &&
- (_vm->isEGA() || (_vm->getPlatform() == Common::kPlatformMacintosh))) {
+ ( _vm->isEGA() ||
+ (_vm->getPlatform() == Common::kPlatformMacintosh) ||
+ (_vm->getPlatform() == Common::kPlatformWindows))) {
int addr = _vm->_global->_inter_execPtr-_vm->_game->_totFileData;
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 9a8da431cb..3f47be2f77 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -451,6 +451,58 @@ protected:
void oBargon_intro9(OpGobParams &params);
};
+class Inter_Fascination : public Inter_v2 {
+public:
+ Inter_Fascination(GobEngine *vm);
+ virtual ~Inter_Fascination() {}
+
+protected:
+ typedef void (Inter_Fascination::*OpcodeDrawProcFascination)();
+ typedef bool (Inter_Fascination::*OpcodeFuncProcFascination)(OpFuncParams &);
+ typedef void (Inter_Fascination::*OpcodeGoblinProcFascination)(OpGobParams &);
+ struct OpcodeDrawEntryFascination {
+ OpcodeDrawProcFascination proc;
+ const char *desc;
+ };
+ struct OpcodeFuncEntryFascination {
+ OpcodeFuncProcFascination proc;
+ const char *desc;
+ };
+ struct OpcodeGoblinEntryFascination {
+ OpcodeGoblinProcFascination proc;
+ const char *desc;
+ };
+ const OpcodeDrawEntryFascination *_opcodesDrawFascination;
+ const OpcodeFuncEntryFascination *_opcodesFuncFascination;
+ const OpcodeGoblinEntryFascination *_opcodesGoblinFascination;
+ static const int _goblinFuncLookUp[][2];
+
+ virtual void setupOpcodes();
+ virtual void executeDrawOpcode(byte i);
+ virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams &params);
+ virtual void executeGoblinOpcode(int i, OpGobParams &params);
+ virtual const char *getOpcodeDrawDesc(byte i);
+ virtual const char *getOpcodeFuncDesc(byte i, byte j);
+ virtual const char *getOpcodeGoblinDesc(int i);
+
+ void oFascin_playProtracker(OpGobParams &params);
+
+ void oFascin_geUnknown2(OpGobParams &params);
+ void oFascin_geUnknown3(OpGobParams &params);
+ void oFascin_geUnknown4(OpGobParams &params);
+ void oFascin_geUnknown5(OpGobParams &params);
+ void oFascin_geUnknown6(OpGobParams &params);
+ void oFascin_geUnknown10(OpGobParams &params);
+ bool oFascin_feUnknown4(OpFuncParams &params);
+ void oFascin_cdUnknown3();
+ void oFascin_cdUnknown4();
+ void oFascin_cdUnknown5();
+ void oFascin_cdUnknown6();
+ void oFascin_cdUnknown10();
+ void oFascin_cdUnknown11();
+
+};
+
class Inter_v3 : public Inter_v2 {
public:
Inter_v3(GobEngine *vm);
diff --git a/engines/gob/inter_fascin.cpp b/engines/gob/inter_fascin.cpp
new file mode 100644
index 0000000000..8c6e8460e6
--- /dev/null
+++ b/engines/gob/inter_fascin.cpp
@@ -0,0 +1,804 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/endian.h"
+
+#include "gob/gob.h"
+#include "gob/inter.h"
+#include "gob/global.h"
+#include "gob/util.h"
+#include "gob/dataio.h"
+#include "gob/draw.h"
+#include "gob/parse.h"
+#include "gob/game.h"
+#include "gob/palanim.h"
+#include "gob/video.h"
+#include "gob/videoplayer.h"
+#include "gob/sound/sound.h"
+
+namespace Gob {
+
+#define OPCODE(x) _OPCODE(Inter_Fascination, x)
+
+const int Inter_Fascination::_goblinFuncLookUp[][2] = {
+ {1, 0},
+ {2, 1},
+ {3, 2},
+ {4, 3},
+ {5, 4},
+ {6, 5},
+ {7, 6},
+ {8, 7},
+ {9, 8},
+ {10, 9},
+ {11, 10},
+ {12, 11},
+ {13, 12},
+ {14, 13},
+ {15, 14},
+ {16, 15},
+ {21, 16},
+ {22, 17},
+ {23, 18},
+ {24, 19},
+ {25, 20},
+ {26, 21},
+ {27, 22},
+ {28, 23},
+ {29, 24},
+ {30, 25},
+ {32, 26},
+ {33, 27},
+ {34, 28},
+ {35, 29},
+ {36, 30},
+ {37, 31},
+ {40, 32},
+ {41, 33},
+ {42, 34},
+ {43, 35},
+ {44, 36},
+ {50, 37},
+ {52, 38},
+ {53, 39},
+ {100, 40},
+ {152, 41},
+ {200, 42},
+ {201, 43},
+ {202, 44},
+ {203, 45},
+ {204, 46},
+ {250, 47},
+ {251, 48},
+ {252, 49},
+ {500, 50},
+ {502, 51},
+ {503, 52},
+ {600, 53},
+ {601, 54},
+ {602, 55},
+ {603, 56},
+ {604, 57},
+ {605, 58},
+ {1000, 59},
+ {1001, 60},
+ {1002, 61},
+ {1003, 62},
+ {1004, 63},
+ {1005, 64},
+ {1006, 65},
+ {1008, 66},
+ {1009, 67},
+ {1010, 68},
+ {1011, 69},
+ {1015, 70},
+ {2005, 71}
+};
+
+Inter_Fascination::Inter_Fascination(GobEngine *vm) : Inter_v2(vm) {
+ setupOpcodes();
+}
+
+void Inter_Fascination::setupOpcodes() {
+ static const OpcodeDrawEntryFascination opcodesDraw[256] = {
+ /* 00 */
+ OPCODE(o1_loadMult),
+ OPCODE(o2_playMult),
+ OPCODE(o1_freeMultKeys),
+ OPCODE(oFascin_cdUnknown3),
+ /* 04 */
+ OPCODE(oFascin_cdUnknown4),
+ OPCODE(oFascin_cdUnknown5),
+ OPCODE(oFascin_cdUnknown6),
+ OPCODE(o1_initCursor),
+ /* 08 */
+ OPCODE(o1_initCursorAnim),
+ OPCODE(o1_clearCursorAnim),
+ OPCODE(oFascin_cdUnknown10),
+ OPCODE(oFascin_cdUnknown11),
+ /* 0C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 10 */
+ OPCODE(o1_loadAnim),
+ OPCODE(o1_freeAnim),
+ OPCODE(o1_updateAnim),
+ OPCODE(o2_multSub),
+ /* 14 */
+ OPCODE(o2_initMult),
+ OPCODE(o1_freeMult),
+ OPCODE(o1_animate),
+ OPCODE(o2_loadMultObject),
+ /* 18 */
+ OPCODE(o1_getAnimLayerInfo),
+ OPCODE(o1_getObjAnimSize),
+ OPCODE(o1_loadStatic),
+ OPCODE(o1_freeStatic),
+ /* 1C */
+ OPCODE(o2_renderStatic),
+ OPCODE(o2_loadCurLayer),
+ {NULL, ""},
+ {NULL, ""},
+ /* 20 */
+ OPCODE(o2_playCDTrack),
+ OPCODE(o2_waitCDTrackEnd),
+ OPCODE(o2_stopCD),
+ OPCODE(o2_readLIC),
+ /* 24 */
+ OPCODE(o2_freeLIC),
+ OPCODE(o2_getCDTrackPos),
+ {NULL, ""},
+ {NULL, ""},
+ /* 28 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 2C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 30 */
+ OPCODE(o2_loadFontToSprite),
+ OPCODE(o1_freeFontToSprite),
+ {NULL, ""},
+ {NULL, ""},
+ /* 34 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 38 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 3C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 40 */
+ OPCODE(o2_totSub),
+ OPCODE(o2_switchTotSub),
+ OPCODE(o2_pushVars),
+ OPCODE(o2_popVars),
+ /* 44 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 48 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 4C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 50 */
+ {NULL, ""},//OPCODE(o2_loadMapObjects),
+ {NULL, ""},//OPCODE(o2_freeGoblins),
+ {NULL, ""},//OPCODE(o2_moveGoblin),
+ {NULL, ""},//OPCODE(o2_writeGoblinPos),
+ /* 54 */
+ {NULL, ""},//OPCODE(o2_stopGoblin),
+ {NULL, ""},//OPCODE(o2_setGoblinState),
+ {NULL, ""},//OPCODE(o2_placeGoblin),
+ {NULL, ""},
+ /* 58 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 5C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 60 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 64 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 68 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 6C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 70 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 74 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 78 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 7C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 80 */
+ {NULL, ""},//OPCODE(o2_initScreen),
+ {NULL, ""},//OPCODE(o2_scroll),
+ {NULL, ""},//OPCODE(o2_setScrollOffset),
+ {NULL, ""},//OPCODE(o2_playImd),
+ /* 84 */
+ {NULL, ""},//OPCODE(o2_getImdInfo),
+ {NULL, ""},//OPCODE(o2_openItk),
+ {NULL, ""},//OPCODE(o2_closeItk),
+ {NULL, ""},//OPCODE(o2_setImdFrontSurf),
+ /* 88 */
+ {NULL, ""},//OPCODE(o2_resetImdFrontSurf),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 8C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 90 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 94 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 98 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 9C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* A0 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* A4 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* A8 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* AC */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* B0 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* B4 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* B8 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* BC */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* C0 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* C4 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* C8 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* CC */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* D0 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* D4 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* D8 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* DC */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* E0 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* E4 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* E8 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* EC */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* F0 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* F4 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* F8 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* FC */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""}
+ };
+
+ static const OpcodeFuncEntryFascination opcodesFunc[80] = {
+ /* 00 */
+ OPCODE(o1_callSub),
+ OPCODE(o1_callSub),
+ OPCODE(o1_printTotText),
+ OPCODE(o1_loadCursor),
+ /* 04 */
+ {NULL, ""},
+ OPCODE(o1_switch),
+ OPCODE(o1_repeatUntil),
+ OPCODE(o1_whileDo),
+ /* 08 */
+ OPCODE(o1_if),
+ OPCODE(o2_evaluateStore),
+ OPCODE(o1_loadSpriteToPos),
+ {NULL, ""},
+ /* 0C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 10 */
+ {NULL, ""},
+ OPCODE(o2_printText),
+ OPCODE(o1_loadTot),
+ OPCODE(o1_palLoad),
+ /* 14 */
+ OPCODE(o1_keyFunc),
+ OPCODE(o1_capturePush),
+ OPCODE(o1_capturePop),
+ OPCODE(o2_animPalInit),
+ /* 18 */
+ OPCODE(o2_addCollision),
+ OPCODE(o2_freeCollision),
+ {NULL, ""},
+ {NULL, ""},
+ /* 1C */
+ {NULL, ""},
+ {NULL, ""},
+ OPCODE(o1_drawOperations),
+ OPCODE(o1_setcmdCount),
+ /* 20 */
+ OPCODE(o1_return),
+ OPCODE(o1_renewTimeInVars),
+ OPCODE(o1_speakerOn),
+ OPCODE(o1_speakerOff),
+ /* 24 */
+ OPCODE(o1_putPixel),
+ OPCODE(o2_goblinFunc),
+ OPCODE(o1_createSprite),
+ OPCODE(o1_freeSprite),
+ /* 28 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 2C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 30 */
+ OPCODE(o1_returnTo),
+ OPCODE(o1_loadSpriteContent),
+ OPCODE(o1_copySprite),
+ OPCODE(o1_fillRect),
+ /* 34 */
+ OPCODE(o1_drawLine),
+ OPCODE(o1_strToLong),
+ OPCODE(o1_invalidate),
+ OPCODE(o1_setBackDelta),
+ /* 38 */
+ OPCODE(o1_playSound),
+ OPCODE(o2_stopSound),
+ OPCODE(o2_loadSound),
+ OPCODE(o1_freeSoundSlot),
+ /* 3C */
+ OPCODE(o1_waitEndPlay),
+ {NULL, " "},//OPCODE(o1_playComposition),
+ OPCODE(o2_getFreeMem),
+ OPCODE(o2_checkData),
+ /* 40 */
+ {NULL, ""},
+ OPCODE(o1_prepareStr),
+ OPCODE(o1_insertStr),
+ OPCODE(o1_cutStr),
+ /* 44 */
+ OPCODE(o1_strstr),
+ OPCODE(o1_istrlen),
+ OPCODE(o1_setMousePos),
+ OPCODE(o1_setFrameRate),
+ /* 48 */
+ OPCODE(o1_animatePalette),
+ OPCODE(o1_animateCursor),
+ OPCODE(o1_blitCursor),
+ OPCODE(o1_loadFont),
+ /* 4C */
+ OPCODE(o1_freeFont),
+ OPCODE(o2_readData),
+ OPCODE(o2_writeData),
+ OPCODE(o1_manageDataFile),
+ };
+
+ static const OpcodeGoblinEntryFascination opcodesGoblin[71] = {
+ /* 00 */
+ {NULL, ""},//OPCODE(o2_loadInfogramesIns),
+ {NULL, ""},//OPCODE(o2_startInfogrames),
+ OPCODE(oFascin_geUnknown2),//OPCODE(o2_stopInfogrames),
+ OPCODE(oFascin_geUnknown3), // OPCODE(o2_startInfogrames),
+ /* 04 */
+ OPCODE(oFascin_geUnknown4),
+ OPCODE(oFascin_geUnknown5),//OPCODE(o2_playProtracker), //OPCODE(o2_geUnknown5),
+ OPCODE(oFascin_geUnknown6),//OPCODE(o2_stopProtracker), //OPCODE(o2_geUnknown6),
+ {NULL, ""},
+ /* 08 */
+ {NULL, ""},
+ OPCODE(oFascin_geUnknown10), // OPCODE(o2_playInfogrames),
+ {NULL, ""},
+ {NULL, ""},
+ /* 0C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 10 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 14 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 18 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 1C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 20 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 24 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""}, //OPCODE(o2_handleGoblins),
+ /* 28 */
+ {NULL, ""}, //OPCODE(o2_playProtracker),
+ {NULL, ""}, //OPCODE(o2_stopProtracker),
+ {NULL, ""},
+ {NULL, ""},
+ /* 2C */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 30 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 34 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 38 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 3C */
+ OPCODE(oFascin_playProtracker),//{NULL, ""},
+ OPCODE(o2_stopProtracker),//{NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 40 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ /* 44 */
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ };
+
+ _opcodesDrawFascination = opcodesDraw;
+ _opcodesFuncFascination = opcodesFunc;
+ _opcodesGoblinFascination = opcodesGoblin;
+}
+
+void Inter_Fascination::executeDrawOpcode(byte i) {
+ debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)",
+ i, i, getOpcodeDrawDesc(i));
+
+ OpcodeDrawProcFascination op = _opcodesDrawFascination[i].proc;
+
+ if (op == NULL)
+ warning("Not yet implemented Fascination opcodeDraw: %d", i);
+ else
+ (this->*op) ();
+}
+
+void Inter_Fascination::oFascin_geUnknown2(OpGobParams &params) {
+ warning("Fascination Unknown GE Function 2\n");
+}
+
+void Inter_Fascination::oFascin_geUnknown3(OpGobParams &params) {
+ warning("Fascination Unknown GE Function 3\n");
+}
+
+void Inter_Fascination::oFascin_geUnknown4(OpGobParams &params) {
+ warning("Fascination Unknown GE Function 4\n");
+}
+
+void Inter_Fascination::oFascin_geUnknown5(OpGobParams &params) {
+ warning("Fascination Unknown GE Function 5\n");
+}
+
+void Inter_Fascination::oFascin_geUnknown6(OpGobParams &params) {
+ warning("Fascination Unknown GE Function 6\n");
+}
+
+void Inter_Fascination::oFascin_geUnknown10(OpGobParams &params) {
+ warning("Fascination Unknown GE Function 10\n");
+}
+
+bool Inter_Fascination::oFascin_feUnknown4(OpFuncParams &params) {
+ warning("Fascination Unknown FE Function 4\n");
+ return true;
+}
+
+void Inter_Fascination::oFascin_cdUnknown3() {
+ uint16 resVar, resVar2;
+ int16 retVal1, retVal2, retVal3, retVal4, retVal5, retVal6, retVal7;
+
+ warning("Fascination Unknown CD Function 3 (sub_EDBB)\n");
+
+ resVar = (uint16) load16();
+ resVar2 = (uint16) load16();
+ retVal1 = _vm->_parse->parseVarIndex();
+ retVal2 = _vm->_parse->parseVarIndex();
+ retVal3 = _vm->_parse->parseVarIndex();
+ retVal4 = _vm->_parse->parseVarIndex();
+ retVal5 = _vm->_parse->parseVarIndex();
+ retVal6 = _vm->_parse->parseVarIndex();
+ retVal7 = _vm->_parse->parseVarIndex();
+ warning ("Input word_25196-%d word_25194-%d\n",resVar, resVar2);
+ warning ("Fetched variables word_25198-%d word_2519A-%d word_2519C-%d word_2519E-%d word_251A0-%d word_251A2-%d word_251A4-%d\n", retVal1, retVal2, retVal3, retVal4, retVal5, retVal6, retVal7);
+}
+
+void Inter_Fascination::oFascin_cdUnknown4() {
+ warning("Fascination Unknown CD Function 4 (sub_EE04)\n");
+}
+
+void Inter_Fascination::oFascin_cdUnknown5() {
+ warning("Fascination Unknown CD Function 5 (sub_EE29)\n");
+}
+
+void Inter_Fascination::oFascin_cdUnknown6() {
+ int16 retVal1,expr;
+ warning("Fascination Unknown CD Function 6 (sub_EE46)\n");
+ evalExpr(&expr);
+ retVal1 = _vm->_parse->parseVarIndex();
+ warning ("evalExpr : %d Variable index %d\n",expr, retVal1);
+}
+
+void Inter_Fascination::oFascin_cdUnknown10() {
+ int16 expr;
+ warning("Fascination Unknown CD Function 10 (loc_66E0)\n");
+ evalExpr(&expr);
+ printf("_draw_renderFlags <- %d\n",expr);
+ _vm->_draw->_renderFlags = expr;
+}
+
+void Inter_Fascination::oFascin_cdUnknown11() {
+ int16 expr;
+ warning("Fascination Unknown CD Function 11 (loc_66E6)\n");
+ evalExpr(&expr);
+ printf("Word_23906 <- %d\n",expr);
+}
+
+bool Inter_Fascination::executeFuncOpcode(byte i, byte j, OpFuncParams &params) {
+ debugC(1, kDebugFuncOp, "opcodeFunc %d.%d [0x%X.0x%X] (%s)",
+ i, j, i, j, getOpcodeFuncDesc(i, j));
+
+ if ((i > 4) || (j > 16)) {
+ warning("Invalid opcodeFunc: %d.%d", i, j);
+ return false;
+ }
+
+ OpcodeFuncProcFascination op = _opcodesFuncFascination[i*16 + j].proc;
+
+ if (op == NULL)
+ warning("unimplemented opcodeFunc: %d.%d", i, j);
+ else
+ return (this->*op) (params);
+
+ return false;
+}
+
+void Inter_Fascination::executeGoblinOpcode(int i, OpGobParams &params) {
+ debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
+ i, i, getOpcodeGoblinDesc(i));
+
+ OpcodeGoblinProcFascination op = NULL;
+
+ for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
+ if (_goblinFuncLookUp[j][0] == i) {
+ op = _opcodesGoblinFascination[_goblinFuncLookUp[j][1]].proc;
+ break;
+ }
+
+ if (op == NULL) {
+ int16 val;
+
+ _vm->_global->_inter_execPtr -= 2;
+ val = load16();
+ _vm->_global->_inter_execPtr += val << 1;
+ warning("unimplemented opcodeGob: %d", i);
+ } else
+ (this->*op) (params);
+}
+
+const char *Inter_Fascination::getOpcodeDrawDesc(byte i) {
+ return _opcodesDrawFascination[i].desc;
+}
+
+const char *Inter_Fascination::getOpcodeFuncDesc(byte i, byte j) {
+ if ((i > 4) || (j > 15))
+ return "";
+
+ return _opcodesFuncFascination[i*16 + j].desc;
+}
+
+const char *Inter_Fascination::getOpcodeGoblinDesc(int i) {
+ for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
+ if (_goblinFuncLookUp[j][0] == i)
+ return _opcodesGoblinFascination[_goblinFuncLookUp[j][1]].desc;
+ warning("Error in getOpcodeGoblinDesc %d\n",i);
+ return "";
+}
+
+void Inter_Fascination::oFascin_playProtracker(OpGobParams &params) {
+ _vm->_sound->protrackerPlay("mod.extasy");
+}
+
+} // End of namespace Gob
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index 9c4679ca35..5d6be23ecf 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -1142,7 +1142,7 @@ bool Inter_v1::o1_callSub(OpFuncParams &params) {
}
// Skipping the copy protection screen in Gobliins 2
if (!_vm->_copyProtection && (_vm->getGameType() == kGameTypeGob2) && (offset == 1746)
- && !scumm_stricmp(_vm->_game->_curTotFile, _vm->_startTot0)) {
+ && !scumm_stricmp(_vm->_game->_curTotFile, "intro0.tot")) {
debugC(2, kDebugGameFlow, "Skipping copy protection screen");
return false;
}
@@ -1436,7 +1436,11 @@ bool Inter_v1::o1_loadTot(OpFuncParams &params) {
buf[size] = 0;
}
+// if (_vm->getGameType() == kGameTypeGeisha)
+// strcat(buf, ".0ot");
+// else
strcat(buf, ".tot");
+
if (_terminate != 2)
_terminate = 1;
strcpy(_vm->_game->_totToLoad, buf);
diff --git a/engines/gob/module.mk b/engines/gob/module.mk
index 0871ce59da..fc933fdf88 100644
--- a/engines/gob/module.mk
+++ b/engines/gob/module.mk
@@ -7,6 +7,7 @@ MODULE_OBJS := \
draw_v1.o \
draw_v2.o \
draw_bargon.o \
+ draw_fascin.o \
driver_vga.o \
game.o \
game_v1.o \
@@ -30,6 +31,7 @@ MODULE_OBJS := \
inter_v1.o \
inter_v2.o \
inter_bargon.o \
+ inter_fascin.o \
inter_v3.o \
inter_v4.o \
inter_v5.o \