From ee929136835a98a108073965315dd87028ed3f12 Mon Sep 17 00:00:00 2001 From: Arnaud BoutonnĂ© Date: Tue, 21 Apr 2009 21:44:37 +0000 Subject: Patch #2725859 : Added some MD5 to the gob engine, modified the way the first STK and TOT is declared, added inter and draw skeleton for Fascination svn-id: r40059 --- engines/gob/dataio.cpp | 8 + engines/gob/detection.cpp | 805 +++++++++++++++++++++++++++++++++---------- engines/gob/draw.h | 8 + engines/gob/draw_fascin.cpp | 44 +++ engines/gob/game.cpp | 3 + engines/gob/game_v1.cpp | 3 +- engines/gob/gob.cpp | 282 ++++++++------- engines/gob/gob.h | 9 +- engines/gob/init.cpp | 22 +- engines/gob/init.h | 2 +- engines/gob/init_v2.cpp | 3 +- engines/gob/inter.cpp | 8 +- engines/gob/inter.h | 52 +++ engines/gob/inter_fascin.cpp | 804 ++++++++++++++++++++++++++++++++++++++++++ engines/gob/inter_v1.cpp | 6 +- engines/gob/module.mk | 2 + 16 files changed, 1726 insertions(+), 335 deletions(-) create mode 100644 engines/gob/draw_fascin.cpp create mode 100644 engines/gob/inter_fascin.cpp 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 ¶ms); }; +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 ¶ms); + virtual void executeGoblinOpcode(int i, OpGobParams ¶ms); + virtual const char *getOpcodeDrawDesc(byte i); + virtual const char *getOpcodeFuncDesc(byte i, byte j); + virtual const char *getOpcodeGoblinDesc(int i); + + void oFascin_playProtracker(OpGobParams ¶ms); + + void oFascin_geUnknown2(OpGobParams ¶ms); + void oFascin_geUnknown3(OpGobParams ¶ms); + void oFascin_geUnknown4(OpGobParams ¶ms); + void oFascin_geUnknown5(OpGobParams ¶ms); + void oFascin_geUnknown6(OpGobParams ¶ms); + void oFascin_geUnknown10(OpGobParams ¶ms); + bool oFascin_feUnknown4(OpFuncParams ¶ms); + 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 ¶ms) { + warning("Fascination Unknown GE Function 2\n"); +} + +void Inter_Fascination::oFascin_geUnknown3(OpGobParams ¶ms) { + warning("Fascination Unknown GE Function 3\n"); +} + +void Inter_Fascination::oFascin_geUnknown4(OpGobParams ¶ms) { + warning("Fascination Unknown GE Function 4\n"); +} + +void Inter_Fascination::oFascin_geUnknown5(OpGobParams ¶ms) { + warning("Fascination Unknown GE Function 5\n"); +} + +void Inter_Fascination::oFascin_geUnknown6(OpGobParams ¶ms) { + warning("Fascination Unknown GE Function 6\n"); +} + +void Inter_Fascination::oFascin_geUnknown10(OpGobParams ¶ms) { + warning("Fascination Unknown GE Function 10\n"); +} + +bool Inter_Fascination::oFascin_feUnknown4(OpFuncParams ¶ms) { + 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 ¶ms) { + 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 ¶ms) { + 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 ¶ms) { + _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 ¶ms) { } // 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 ¶ms) { 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 \ -- cgit v1.2.3