[Scummvm-git-logs] scummvm-tools master -> 7c1089ae403a81aa6ef3ba3a4c9f2bfb911b58cf

sev- noreply at scummvm.org
Mon Jan 2 23:52:58 UTC 2023


This automated email contains information about 13 new commits which have been
pushed to the 'scummvm-tools' repo located at https://github.com/scummvm/scummvm-tools .

Summary:
4f0cbf267c GOB: add v7 opcodes (Adibou2/Adi4) in degob
f61a3d7ad8 GOB: fix o1_loadMultObject
9ea5f8c825 GOB: fix o1_copySprite
d26fc3e3bc GOB: more informative o1_loadMultObject
95e1138cd0 GOB: fix missing cases in o1_palLoad
a3b6e31586 GOB: add support of IDE files in degob (named function offsets)
462e36e94e GOB: --lib mode in degob to use named function offsets as entry points
2b7d4c90e6 GOB: more detailed degob --help message
33918927b4 GOB: fix o7_oemToANSI not being written to degob output
6cb3a5c6a3 GOB: fix an incorrect indentation
fc86ad2002 GOB: revert "fix missing cases in o1_palLoad", which introduced a regression
9665c9e68f GOB: correctly add missing cases 55 and 56 in o1_palLoad
7c1089ae40 GOB: GPLv2 -> GPLv3 in degob_script_v7.cpp


Commit: 4f0cbf267ce5adea4aa88585ad0c7a7bfb851e18
    https://github.com/scummvm/scummvm-tools/commit/4f0cbf267ce5adea4aa88585ad0c7a7bfb851e18
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: add v7 opcodes (Adibou2/Adi4) in degob

Changed paths:
  A engines/gob/degob_script_v7.cpp
    Makefile.common
    engines/gob/degob.cpp
    engines/gob/degob_script.h
    engines/gob/degob_script_v2.cpp


diff --git a/Makefile.common b/Makefile.common
index e9fafb79..0cd11e01 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -138,6 +138,7 @@ degob_OBJS := \
 	engines/gob/degob_script_v4.o \
 	engines/gob/degob_script_v5.o \
 	engines/gob/degob_script_v6.o \
+	engines/gob/degob_script_v7.o \
 	engines/gob/degob_script_bargon.o \
 	engines/gob/degob_script_fascin.o \
 	engines/gob/degob_script_littlered.o \
@@ -205,6 +206,7 @@ degob_OBJS := \
 	engines/gob/degob_script_v4.o \
 	engines/gob/degob_script_v5.o \
 	engines/gob/degob_script_v6.o \
+	engines/gob/degob_script_v7.o \
 	engines/gob/degob_script_bargon.o \
 	engines/gob/degob_script_fascin.o \
 	engines/gob/degob_script_geisha.o \
diff --git a/engines/gob/degob.cpp b/engines/gob/degob.cpp
index fbb865eb..e1843d88 100644
--- a/engines/gob/degob.cpp
+++ b/engines/gob/degob.cpp
@@ -126,6 +126,7 @@ void printHelp(const char *bin) {
 	printf("	Urban     - Urban Runner\n");
 	printf("	Geisha    - Geisha\n");
 	printf("	LittleRed - Once Upon A Time: Little Red Riding Hood\n");
+	printf("	Adibou2   - Adibou 2\n");
 }
 
 int getVersion(const char *verStr) {
@@ -153,6 +154,8 @@ int getVersion(const char *verStr) {
 		return 10;
 	else if (!scumm_stricmp(verStr, "LittleRed"))
 		return 11;
+	else if (!scumm_stricmp(verStr, "Adibou2"))
+		return 12;
 
 	return -1;
 }
@@ -199,13 +202,16 @@ Script *initScript(byte *totData, uint32 totSize, ExtTable *extTable, int versio
 			break;
 		case 9:
 			return new Script_v6(totData, totSize, extTable);
-			break;
+		break;
 		case 10:
 			return new Script_Geisha(totData, totSize, extTable);
 			break;
 		case 11:
 			return new Script_LittleRed(totData, totSize, extTable);
 			break;
+		case 12:
+			return new Script_v7(totData, totSize, extTable);
+			break;
 	}
 	return 0;
 }
diff --git a/engines/gob/degob_script.h b/engines/gob/degob_script.h
index d4800ff5..135c8a65 100644
--- a/engines/gob/degob_script.h
+++ b/engines/gob/degob_script.h
@@ -622,4 +622,47 @@ protected:
 	void o6_createSprite(FuncParams &params);
 };
 
+class Script_v7 : public Script_v6 {
+public:
+	Script_v7(byte *totData, uint32 totSize, ExtTable *extTable = 0);
+	virtual ~Script_v7();
+
+protected:
+	typedef void (Script_v7::*OpcodeDrawProcV7)(FuncParams &);
+	typedef void (Script_v7::*OpcodeFuncProcV7)(FuncParams &);
+	typedef void (Script_v7::*OpcodeGoblinProcV7)(FuncParams &);
+	struct OpcodeDrawEntryV7 {
+		FuncType type;
+		OpcodeDrawProcV7 proc;
+		const char *desc;
+		const Param params[16];
+	};
+	struct OpcodeFuncEntryV7 {
+		FuncType type;
+		OpcodeFuncProcV7 proc;
+		const char *desc;
+		const Param params[16];
+	};
+	struct OpcodeGoblinEntryV7 {
+		FuncType type;
+		OpcodeGoblinProcV7 proc;
+		const char *desc;
+		const Param params[16];
+	};
+	const OpcodeDrawEntryV7 *_opcodesDrawV7;
+	const OpcodeFuncEntryV7 *_opcodesFuncV7;
+	const OpcodeGoblinEntryV7 *_opcodesGoblinV7;
+	static const int _goblinFuncLookUp[][2];
+
+	virtual void setupOpcodes();
+	virtual void drawOpcode(byte i, FuncParams &params);
+	virtual void funcOpcode(byte i, byte j, FuncParams &params);
+	virtual void goblinOpcode(int i, FuncParams &params);
+
+	void o7_loadCursor(FuncParams &params);
+	void oPlaytoons_printText(FuncParams &params);
+	void o7_oemToANSI(FuncParams &params);
+	void oPlaytoons_freeSprite(FuncParams &params);
+};
+
 #endif // DEGOB_SCRIPT_H
diff --git a/engines/gob/degob_script_v2.cpp b/engines/gob/degob_script_v2.cpp
index f489e78c..162737c6 100644
--- a/engines/gob/degob_script_v2.cpp
+++ b/engines/gob/degob_script_v2.cpp
@@ -886,7 +886,7 @@ void Script_v2::o2_loadMapObjects(FuncParams &params) {
 
 	id = (int16) readUint16();
 	print("%d", id);
-	if (id != -1) {
+	if ((uint16) id < 65520) {
 		int16 count = (int16) readUint16();
 		print(", %d", count);
 		for (int i = 0; i < count; i++)
diff --git a/engines/gob/degob_script_v7.cpp b/engines/gob/degob_script_v7.cpp
new file mode 100644
index 00000000..e6ef58b9
--- /dev/null
+++ b/engines/gob/degob_script_v7.cpp
@@ -0,0 +1,784 @@
+/* ScummVM Tools
+ *
+ * ScummVM Tools 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.
+ */
+
+/* GobEngine Script disassembler */
+
+#include "degob_script.h"
+#include "common/util.h"
+
+#define OPCODET(x) _OPCODET(Script_v7, x)
+#define OPCODEF(x) _OPCODEF(Script_v7, x)
+#define OPCODEB(x) _OPCODEB(Script_v, x)
+
+const int Script_v7::_goblinFuncLookUp[][2] = {
+	{0, 0},
+	{1, 1},
+	{2, 2},
+	{4, 3},
+	{5, 4},
+	{6, 5},
+	{7, 6},
+	{8, 7},
+	{9, 8},
+	{10, 9},
+	{12, 10},
+	{13, 71},
+	{14, 12},
+	{15, 13},
+	{16, 14},
+	{21, 15},
+	{22, 16},
+	{23, 17},
+	{24, 18},
+	{25, 19},
+	{26, 20},
+	{27, 21},
+	{28, 22},
+	{29, 23},
+	{30, 24},
+	{32, 25},
+	{33, 26},
+	{34, 27},
+	{35, 28},
+	{36, 29},
+	{37, 30},
+	{40, 31},
+	{41, 32},
+	{42, 33},
+	{43, 34},
+	{44, 35},
+	{50, 36},
+	{52, 37},
+	{53, 38},
+	{100, 39},
+	{152, 40},
+	{200, 41},
+	{201, 42},
+	{202, 43},
+	{203, 44},
+	{204, 45},
+	{250, 46},
+	{251, 47},
+	{252, 48},
+	{500, 49},
+	{502, 50},
+	{503, 51},
+	{600, 52},
+	{601, 53},
+	{602, 54},
+	{603, 55},
+	{604, 56},
+	{605, 57},
+	{1000, 58},
+	{1001, 59},
+	{1002, 60},
+	{1003, 61},
+	{1004, 62},
+	{1005, 63},
+	{1006, 64},
+	{1008, 65},
+	{1009, 66},
+	{1010, 67},
+	{1011, 68},
+	{1015, 69},
+	{2005, 70},
+	{3, 71},
+	{420, 72},
+	{513, 73}
+};
+
+Script_v7::Script_v7(byte *totData, uint32 totSize, ExtTable *extTable) :
+	Script_v6(totData, totSize, extTable) {
+
+	setupOpcodes();
+}
+
+Script_v7::~Script_v7() {
+}
+
+void Script_v7::setupOpcodes() {
+	static const OpcodeDrawEntryV7 opcodesDraw[256] = {
+		/* 00 */
+		{OPCODEF(o2_loadMult), {PARAM_NONE}},
+		{OPCODEF(o2_playMult), {PARAM_NONE}},
+		{OPCODET(o2_freeMultKeys), {PARAM_UINT16}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 04 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODET(o1_initCursor), {PARAM_VARINDEX, PARAM_VARINDEX, PARAM_INT16, PARAM_INT16, PARAM_INT16}},
+		/* 08 */
+		{OPCODET(o1_initCursorAnim), {PARAM_EXPR, PARAM_INT16, PARAM_INT16, PARAM_INT16}},
+		{OPCODET(o1_clearCursorAnim), {PARAM_EXPR}},
+		{OPCODET(o2_setRenderFlags), {PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 0C */
+		{OPCODET(o2_draw0x0C), {PARAM_NONE}},
+		{OPCODET(o7_setCursorToLoadFromExec), {PARAM_EXPR, PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 10 */
+		{OPCODEF(o1_loadAnim), {PARAM_NONE}},
+		{OPCODET(o1_freeAnim), {PARAM_EXPR}},
+		{OPCODET(o1_updateAnim), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_UINT16}},
+		{OPCODET(o2_multSub), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		/* 14 */
+		{OPCODET(o2_initMult), {PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX}},
+		{OPCODET(o1_freeMult), {PARAM_NONE}},
+		{OPCODET(o1_animate), {PARAM_NONE}},
+		{OPCODEF(o2_loadMultObject), {PARAM_NONE}},
+		/* 18 */
+		{OPCODET(o1_getAnimLayerInfo), {PARAM_EXPR, PARAM_EXPR, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX}},
+		{OPCODET(o1_getObjAnimSize), {PARAM_EXPR, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX}},
+		{OPCODEF(o1_loadStatic), {PARAM_NONE}},
+		{OPCODET(o1_freeStatic), {PARAM_EXPR}},
+		/* 1C */
+		{OPCODET(o2_renderStatic), {PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o2_loadCurLayer), {PARAM_EXPR, PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 20 */
+		{OPCODET(o2_playCDTrack), {PARAM_EXPR}},
+		{OPCODET(o2_waitCDTrackEnd), {PARAM_NONE}},
+		{OPCODET(o2_stopCD), {PARAM_NONE}},
+		{OPCODET(o2_readLIC), {PARAM_EXPR}},
+		/* 24 */
+		{OPCODET(o2_freeLIC), {PARAM_NONE}},
+		{OPCODET(o2_getCDTrackPos), {PARAM_VARINDEX, PARAM_VARINDEX}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 28 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 2C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 30 */
+		{OPCODET(o2_loadFontToSprite), {PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_INT16, PARAM_INT16}},
+		{OPCODET(o1_freeFontToSprite), {PARAM_INT16}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 34 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 38 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 3C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 40 */
+		{OPCODEF(o2_totSub), {PARAM_NONE}},
+		{OPCODET(o2_switchTotSub), {PARAM_UINT16, PARAM_UINT16}},
+		{OPCODEF(o2_pushVars), {PARAM_NONE}},
+		{OPCODEF(o2_popVars), {PARAM_NONE}},
+		/* 44 */
+		{OPCODET(o7_displayWarning), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o7_logString), {PARAM_EXPR, PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 48 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 4C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 50 */
+		{OPCODEF(o2_loadMapObjects), {PARAM_NONE}},
+		{OPCODET(o2_freeGoblins), {PARAM_NONE}},
+		{OPCODET(o2_moveGoblin), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o2_writeGoblinPos), {PARAM_VARINDEX, PARAM_VARINDEX, PARAM_EXPR}},
+		/* 54 */
+		{OPCODET(o2_stopGoblin), {PARAM_EXPR}},
+		{OPCODET(o2_setGoblinState), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o2_placeGoblin), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o7_intToString), {PARAM_VARINDEX, PARAM_VARINDEX}},
+		/* 58 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODET(o7_callFunction), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o7_loadFunctions), {PARAM_EXPR, PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 5C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 60 */
+		{OPCODET(o7_copyFile), {PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o5_deleteFile), {PARAM_EXPR}},
+		{OPCODET(o7_moveFile), {PARAM_EXPR, PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 64 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 68 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 6C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 70 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 74 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 78 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 7C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 80 */
+		{OPCODET(o2_initScreen), {PARAM_UINT8, PARAM_UINT8, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o2_scroll), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o2_setScrollOffset), {PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o4_playVmdOrMusic), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		/* 84 */
+		{OPCODET(o2_getImdInfo), {PARAM_EXPR, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX, PARAM_VARINDEX}},
+		{OPCODET(oPlaytoons_openItk), {PARAM_EXPR}},
+		{OPCODET(o2_closeItk), {PARAM_NONE}},
+		{OPCODET(o2_setImdFrontSurf), {PARAM_NONE}},
+		/* 88 */
+		{OPCODET(o2_resetImdFrontSurf), {PARAM_NONE}},
+		{OPCODET(o7_draw0x89), {PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o7_findFile), {PARAM_EXPR, PARAM_VARINDEX, PARAM_VARINDEX}},
+		{OPCODET(o7_findCDFile),{PARAM_VARINDEX, PARAM_VARINDEX}},
+		/* 8C */
+		{OPCODET(o7_getSystemProperty), {PARAM_EXPR, PARAM_VARINDEX}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 90 */
+		{OPCODET(o7_loadImage), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODET(o7_setVolume), {PARAM_EXPR}},
+		/* 94 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODET(o7_zeroVar), {PARAM_VARINDEX}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 98 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 9C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* A0 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODET(o7_getINIValue), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_VARINDEX}},
+		{OPCODET(o7_setINIValue), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* A4 */
+		{OPCODET(o7_loadIFFPalette), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* A8 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* AC */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* B0 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* B4 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* B8 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* BC */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* C0 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* C4 */
+		{OPCODET(o7_opendBase), {PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o7_closedBase), {PARAM_EXPR}},
+		{OPCODET(o7_getDBString), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* C8 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* CC */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* D0 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* D4 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* D8 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* DC */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* E0 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* E4 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* E8 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* EC */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* F0 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* F4 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* F8 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* FC */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+	};
+
+	static const OpcodeFuncEntryV7 opcodesFunc[80] = {
+		/* 00 */
+		{OPCODEF(o1_callSub), {PARAM_NONE}},
+		{OPCODEF(o1_callSub), {PARAM_NONE}},
+		{OPCODET(o1_printTotText), {PARAM_INT16}},
+		{OPCODEF(o7_loadCursor), {PARAM_NONE}},
+		/* 04 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODEF(o1_switch), {PARAM_NONE}},
+		{OPCODEF(o1_repeatUntil), {PARAM_NONE}},
+		{OPCODEF(o1_whileDo), {PARAM_NONE}},
+		/* 08 */
+		{OPCODEF(o1_if), {PARAM_NONE}},
+		{OPCODEF(o6_assign), {PARAM_NONE}},
+		{OPCODEF(o1_loadSpriteToPos), {PARAM_NONE}},
+		{OPCODEF(oPlaytoons_printText), {PARAM_NONE}},
+		/* 0C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 10 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODEF(o2_printText), {PARAM_NONE}},
+		{OPCODEF(o1_loadTot), {PARAM_NONE}},
+		{OPCODEF(o1_palLoad), {PARAM_NONE}},
+		/* 14 */
+		{OPCODET(o1_keyFunc), {PARAM_INT16}},
+		{OPCODET(o1_capturePush), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o1_capturePop), {PARAM_NONE}},
+		{OPCODET(o2_animPalInit), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR}},
+		/* 18 */
+		{OPCODET(o2_addHotspot), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_UINT16}},
+		{OPCODET(o2_removeHotspot), {PARAM_EXPR}},
+		{OPCODET(o3_getTotTextItemPart), {PARAM_UINT16, PARAM_VARINDEX, PARAM_EXPR}},
+		{OPCODET(oPlaytoons_F_1B), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_UINT16}},
+		/* 1C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODEF(o1_drawOperations), {PARAM_NONE}},
+		{OPCODEF(o1_setcmdCount), {PARAM_NONE}},
+		/* 20 */
+		{OPCODEF(o1_return), {PARAM_NONE}},
+		{OPCODET(o1_renewTimeInVars), {PARAM_NONE}},
+		{OPCODET(o1_speakerOn), {PARAM_EXPR}},
+		{OPCODET(o1_speakerOff), {PARAM_NONE}},
+		/* 24 */
+		{OPCODET(o1_putPixel), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODEF(o2_goblinFunc), {PARAM_NONE}},
+		{OPCODEF(o6_createSprite), {PARAM_NONE}},
+		{OPCODEF(oPlaytoons_freeSprite), {PARAM_NONE}},
+		/* 28 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 2C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 30 */
+		{OPCODEF(o1_returnTo), {PARAM_NONE}},
+		{OPCODET(o1_loadSpriteContent), {PARAM_INT16, PARAM_INT16, PARAM_INT16}},
+		{OPCODET(o3_copySprite), {PARAM_INT16, PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_INT16}},
+		{OPCODET(o1_fillRect), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		/* 34 */
+		{OPCODET(o1_drawLine), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o1_strToLong), {PARAM_VARINDEX, PARAM_VARINDEX}},
+		{OPCODET(o1_invalidate), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o1_setBackDelta), {PARAM_EXPR, PARAM_EXPR}},
+		/* 38 */
+		{OPCODET(o1_playSound), {PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o2_stopSound), {PARAM_EXPR}},
+		{OPCODEF(o2_loadSound), {PARAM_NONE}},
+		{OPCODET(o1_freeSoundSlot), {PARAM_EXPR}},
+		/* 3C */
+		{OPCODET(o1_waitEndPlay), {PARAM_NONE}},
+		{OPCODET(o1_playComposition), {PARAM_VARINDEX, PARAM_EXPR}},
+		{OPCODET(o2_getFreeMem), {PARAM_VARINDEX, PARAM_VARINDEX}},
+		{OPCODET(o2_checkData), {PARAM_EXPR, PARAM_VARINDEX}},
+		/* 40 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODET(o1_cleanupStr), {PARAM_VARINDEX}},
+		{OPCODET(o1_insertStr), {PARAM_VARINDEX, PARAM_EXPR}},
+		{OPCODET(o1_cutStr), {PARAM_VARINDEX, PARAM_EXPR, PARAM_EXPR}},
+		/* 44 */
+		{OPCODET(o1_strstr), {PARAM_VARINDEX, PARAM_EXPR, PARAM_VARINDEX}},
+		{OPCODEF(o5_istrlen), {PARAM_NONE}},
+		{OPCODET(o1_setMousePos), {PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o1_setFrameRate), {PARAM_EXPR}},
+		/* 48 */
+		{OPCODET(o1_animatePalette), {PARAM_NONE}},
+		{OPCODET(o1_animateCursor), {PARAM_NONE}},
+		{OPCODET(o1_blitCursor), {PARAM_NONE}},
+		{OPCODET(o1_loadFont), {PARAM_EXPR, PARAM_INT16}},
+		/* 4C */
+		{OPCODET(o1_freeFont), {PARAM_INT16}},
+		{OPCODET(o7_readData), {PARAM_EXPR, PARAM_VARINDEX, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o2_writeData), {PARAM_EXPR, PARAM_VARINDEX, PARAM_EXPR, PARAM_EXPR}},
+		{OPCODET(o1_manageDataFile), {PARAM_EXPR}},
+	};
+
+	static const OpcodeGoblinEntryV7 opcodesGoblin[74] = {
+		/* 00 */
+		{OPCODEF(o1_dummy), {PARAM_NONE}},
+		{OPCODET(o2_startInfogrames), {PARAM_UINT16}},
+		{OPCODET(o2_stopInfogrames), {PARAM_UINT16}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 04 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 08 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODEF(o2_playInfogrames), {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 0C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 10 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 14 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 18 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 1C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 20 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 24 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODET(o3_wobble), {PARAM_NONE}},
+		/* 28 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 2C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 30 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 34 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 38 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 3C */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 40 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		/* 44 */
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{TYPE_NONE, 0, 0, {PARAM_NONE}},
+		{OPCODEF(o1_dummy), {PARAM_NONE}},
+		{OPCODEF(o7_oemToANSI), {PARAM_NONE}},
+		{OPCODET(o7_gob0x201), {PARAM_UINT16}}
+	};
+
+	_opcodesDrawV7 = opcodesDraw;
+	_opcodesFuncV7 = opcodesFunc;
+	_opcodesGoblinV7 = opcodesGoblin;
+}
+
+void Script_v7::drawOpcode(byte i, FuncParams &params) {
+	FuncType type = _opcodesDrawV7[i].type;
+	params.desc = _opcodesDrawV7[i].desc;
+	OpcodeDrawProcV7 op = _opcodesDrawV7[i].proc;
+
+	if (type == TYPE_NONE)
+		warning("No such opcodeDraw: %d", i);
+	if ((type == TYPE_TEXTDESC) || (type == TYPE_BOTHDESC))
+		printFuncDesc(params, _opcodesDrawV7[i].params);
+	if ((type == TYPE_FUNCDESC) || (type == TYPE_BOTHDESC))
+		(this->*op)(params);
+}
+
+void Script_v7::funcOpcode(byte i, byte j, FuncParams &params) {
+	int n = i*16 + j;
+	FuncType type = TYPE_NONE;
+	OpcodeFuncProcV7 op = 0;
+
+	if ((i <= 4) && (j <= 15)) {
+		op = _opcodesFuncV7[n].proc;
+		params.desc = _opcodesFuncV7[n].desc;
+		type = _opcodesFuncV7[n].type;
+	}
+
+	if (type == TYPE_NONE)
+		error("No such opcodeFunc: %d.%d", i, j);
+	if ((type == TYPE_TEXTDESC) || (type == TYPE_BOTHDESC))
+		printFuncDesc(params, _opcodesFuncV7[n].params);
+	if ((type == TYPE_FUNCDESC) || (type == TYPE_BOTHDESC))
+		(this->*op)(params);
+}
+
+void Script_v7::goblinOpcode(int i, FuncParams &params) {
+	int n = -1;
+	for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
+		if (_goblinFuncLookUp[j][0] == i) {
+			n = _goblinFuncLookUp[j][1];
+			break;
+		}
+
+	FuncType type = TYPE_NONE;
+	OpcodeGoblinProcV7 op = 0;
+
+	if (n >= 0) {
+		op = _opcodesGoblinV7[n].proc;
+		params.desc = _opcodesGoblinV7[n].desc;
+		type = _opcodesGoblinV7[n].type;
+	}
+
+	if (type == TYPE_NONE) {
+		warning("No such opcodeGoblin: %d (%d)", i, n);
+		o1_dummy(params);
+	}
+	if ((type == TYPE_TEXTDESC) || (type == TYPE_BOTHDESC)) {
+		const Param *param = _opcodesGoblinV7[n].params;
+		if (*param == PARAM_GOB)
+			printFuncDesc(params);
+		else
+			printFuncDesc(params, param);
+	}
+	if ((type == TYPE_FUNCDESC) || (type == TYPE_BOTHDESC))
+		(this->*op)(params);
+}
+
+void Script_v7::o7_loadCursor(FuncParams &params) {
+    int16 id = (int16) readUint16();
+
+    startFunc(params);
+    print("%d, ", id);
+    if (id == -1) {
+	print("%s, ", peekString());
+	skip(9);
+	print("%d, ", readUint16());
+	print("%d", (int8) readUint8());
+    } else if (id == -2) {
+	print("%d, ", readUint16());
+	print("%d, ", readUint16());
+	print("%d", (int8) readUint8());
+    } else {
+	print("%d", (int8) readUint8());
+    }
+    endFunc();
+}
+
+
+void  Script_v7::oPlaytoons_printText(FuncParams &params)
+{
+	startFunc(params);
+	print("%s, ", readExpr().c_str());
+	print("%s, ", readExpr().c_str());
+	print("%s, ", readExpr().c_str());
+	print("%s, ", readExpr().c_str());
+	print("%s", readExpr().c_str());
+
+	do {
+		print(", \"");
+		for (int i = 0; (((char) (peekUint8())) != '.') && (peekUint8() != 200); i++)
+			print("%c", (char) readUint8());
+
+		if (peekUint8() != 200) {
+			skip(1);
+
+			print("\", ");
+			switch (peekUint8()) {
+			case 16:
+			case 17:
+			case 18:
+			case 23:
+			case 24:
+			case 25:
+			case 26:
+			case 27:
+			case 28:
+				print("%s", readVarIndex().c_str());
+				break;
+			}
+			skip(1);
+		} else
+			print("\"");
+
+	} while (peekUint8() != 200);
+
+	endFunc();
+
+	skip(1);
+}
+
+void Script_v7::o7_oemToANSI(FuncParams &params)
+{
+	skip(2);
+}
+
+void Script_v7::oPlaytoons_freeSprite(FuncParams &params)
+{
+	startFunc(params);
+	if (peekUint8(1) == 0)
+		print("%d", readUint16());
+	else
+		print("%s", readExpr().c_str());
+	endFunc();
+}
\ No newline at end of file


Commit: f61a3d7ad830fa6b840f52bde794abfbb287e3eb
    https://github.com/scummvm/scummvm-tools/commit/f61a3d7ad830fa6b840f52bde794abfbb287e3eb
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: fix o1_loadMultObject

Changed paths:
    engines/gob/degob_script_v1.cpp


diff --git a/engines/gob/degob_script_v1.cpp b/engines/gob/degob_script_v1.cpp
index 9dff22a2..5d2b2b99 100644
--- a/engines/gob/degob_script_v1.cpp
+++ b/engines/gob/degob_script_v1.cpp
@@ -1128,10 +1128,16 @@ void Script_v1::o1_loadMultObject(FuncParams &params) {
 	print("%s, ", readExpr().c_str());
 	print("%s, ", readExpr().c_str());
 	print("%s", readExpr().c_str());
-	endFunc();
 
 	for (int i = 0; i < 11; i++)
-		readExpr();
+	{
+		if (peekUint8() != 99)
+			readExpr();
+		else
+			skip(1);
+	}
+
+	endFunc();
 }
 
 void Script_v1::o1_dummy(FuncParams &params) {


Commit: 9ea5f8c82505bf038e8555153f9298a22c6942e1
    https://github.com/scummvm/scummvm-tools/commit/9ea5f8c82505bf038e8555153f9298a22c6942e1
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: fix o1_copySprite

Changed paths:
    engines/gob/degob_script.cpp
    engines/gob/degob_script.h
    engines/gob/degob_script_v1.cpp
    engines/gob/degob_script_v7.cpp


diff --git a/engines/gob/degob_script.cpp b/engines/gob/degob_script.cpp
index 7f4b2254..05e38e29 100644
--- a/engines/gob/degob_script.cpp
+++ b/engines/gob/degob_script.cpp
@@ -251,13 +251,13 @@ void Script::seek(uint32 off, int whence) {
 	}
 }
 
-uint8  Script::peekUint8()  const { return *_ptr; }
-uint16 Script::peekUint16() const { return READ_LE_UINT16(_ptr); }
-uint32 Script::peekUint32() const { return READ_LE_UINT32(_ptr); }
+uint8  Script::peekUint8(int32 offset)  const { return *(_ptr + offset); }
+uint16 Script::peekUint16(int32 offset) const { return READ_LE_UINT16(_ptr + offset); }
+uint32 Script::peekUint32(int32 offset) const { return READ_LE_UINT32(_ptr + offset); }
 uint8  Script::readUint8()        { uint8  i = peekUint8();  _ptr += 1; return i; }
 uint16 Script::readUint16()       { uint16 i = peekUint16(); _ptr += 2; return i; }
 uint32 Script::readUint32()       { uint32 i = peekUint32(); _ptr += 4; return i; }
-const char *Script::peekString() const { return (char *) _ptr; }
+const char *Script::peekString(int32 offset) const { return (char *) _ptr + offset; }
 const char *Script::readString()  { const char *i = peekString(); _ptr += strlen(i) + 1; return i; }
 
 void Script::skipExpr(char stopToken) {
diff --git a/engines/gob/degob_script.h b/engines/gob/degob_script.h
index 135c8a65..1b712187 100644
--- a/engines/gob/degob_script.h
+++ b/engines/gob/degob_script.h
@@ -136,10 +136,10 @@ protected:
 	uint32 readUint32();
 	const char *readString();
 
-	uint8 peekUint8() const;
-	uint16 peekUint16() const;
-	uint32 peekUint32() const;
-	const char *peekString() const;
+	uint8 peekUint8(int32 offset = 0) const;
+	uint16 peekUint16(int32 offset = 0) const;
+	uint32 peekUint32(int32 offset = 0) const;
+	const char *peekString(int32 offset = 0) const;
 
 	void skipExpr(char stopToken = 99);
 	std::string readExpr(char stopToken = 99);
@@ -248,6 +248,7 @@ protected:
 	void o1_loadMultObject(FuncParams &params);
 
 	void o1_dummy(FuncParams &params);
+	void o1_copySprite(FuncParams &params);
 };
 
 class Script_v2 : public Script_v1 {
diff --git a/engines/gob/degob_script_v1.cpp b/engines/gob/degob_script_v1.cpp
index 5d2b2b99..efe42806 100644
--- a/engines/gob/degob_script_v1.cpp
+++ b/engines/gob/degob_script_v1.cpp
@@ -1145,3 +1145,26 @@ void Script_v1::o1_dummy(FuncParams &params) {
 	uint16 size = readUint16();
 	skip(size * 2);
 }
+
+void  Script_v1::o1_copySprite(FuncParams &params) {
+	startFunc(params);
+	if (peekUint8(1) == 0)
+		print("%d, ", readUint16());
+	else
+		print("%s, ", readExpr().c_str());
+
+	if (peekUint8(1) == 0)
+		print("%d, ", readUint16());
+	else
+		print("%s, ", readExpr().c_str());
+
+	print("%s, ", readExpr().c_str());
+	print("%s, ", readExpr().c_str());
+	print("%s, ", readExpr().c_str());
+	print("%s, ", readExpr().c_str());
+	print("%s, ", readExpr().c_str());
+	print("%s, ", readExpr().c_str());
+
+	print("%d", readUint16());
+	endFunc();
+}
\ No newline at end of file
diff --git a/engines/gob/degob_script_v7.cpp b/engines/gob/degob_script_v7.cpp
index e6ef58b9..241bc6f6 100644
--- a/engines/gob/degob_script_v7.cpp
+++ b/engines/gob/degob_script_v7.cpp
@@ -502,7 +502,7 @@ void Script_v7::setupOpcodes() {
 		/* 30 */
 		{OPCODEF(o1_returnTo), {PARAM_NONE}},
 		{OPCODET(o1_loadSpriteContent), {PARAM_INT16, PARAM_INT16, PARAM_INT16}},
-		{OPCODET(o3_copySprite), {PARAM_INT16, PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_INT16}},
+		{OPCODEF(o1_copySprite), {PARAM_INT16, PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_INT16}},
 		{OPCODET(o1_fillRect), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
 		/* 34 */
 		{OPCODET(o1_drawLine), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},


Commit: d26fc3e3bcfcc59c6771066e6a1498f165700979
    https://github.com/scummvm/scummvm-tools/commit/d26fc3e3bcfcc59c6771066e6a1498f165700979
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: more informative o1_loadMultObject

Changed paths:
    engines/gob/degob_script_v1.cpp
    engines/gob/degob_script_v7.cpp


diff --git a/engines/gob/degob_script_v1.cpp b/engines/gob/degob_script_v1.cpp
index efe42806..6abc7aad 100644
--- a/engines/gob/degob_script_v1.cpp
+++ b/engines/gob/degob_script_v1.cpp
@@ -1127,12 +1127,52 @@ void Script_v1::o1_loadMultObject(FuncParams &params) {
 	startFunc(params);
 	print("%s, ", readExpr().c_str());
 	print("%s, ", readExpr().c_str());
-	print("%s", readExpr().c_str());
+	print("%s, ", readExpr().c_str());
 
 	for (int i = 0; i < 11; i++)
 	{
 		if (peekUint8() != 99)
-			readExpr();
+		{
+			switch (i) {
+			case 0:
+				printf("animation=");
+				break;
+			case 1:
+				printf("layer=");
+				break;
+			case 2:
+				printf("frame=");
+				break;
+			case 3:
+				printf("animType=");
+				break;
+			case 4:
+				printf("order=");
+				break;
+			case 5:
+				printf("isPaused=");
+				break;
+			case 6:
+				printf("isStatic=");
+				break;
+			case 7:
+				printf("maxTick=");
+				break;
+			case 8:
+				printf("maxFrame=");
+				break;
+			case 9:
+				printf("newLayer=");
+				break;
+			case 10:
+				printf("newAnimation=");
+				break;
+			default:
+				printf("unknownField=");
+			}
+
+			printf("%s%s", readExpr().c_str(), (i < 10)?", ":"");
+		}
 		else
 			skip(1);
 	}
diff --git a/engines/gob/degob_script_v7.cpp b/engines/gob/degob_script_v7.cpp
index 241bc6f6..f9a666a9 100644
--- a/engines/gob/degob_script_v7.cpp
+++ b/engines/gob/degob_script_v7.cpp
@@ -502,7 +502,7 @@ void Script_v7::setupOpcodes() {
 		/* 30 */
 		{OPCODEF(o1_returnTo), {PARAM_NONE}},
 		{OPCODET(o1_loadSpriteContent), {PARAM_INT16, PARAM_INT16, PARAM_INT16}},
-		{OPCODEF(o1_copySprite), {PARAM_INT16, PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_INT16}},
+		{OPCODEF(o1_copySprite), {PARAM_NONE}},
 		{OPCODET(o1_fillRect), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},
 		/* 34 */
 		{OPCODET(o1_drawLine), {PARAM_INT16, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR, PARAM_EXPR}},


Commit: 95e1138cd09a8e8817ed150a1b35e4cd085b25c3
    https://github.com/scummvm/scummvm-tools/commit/95e1138cd09a8e8817ed150a1b35e4cd085b25c3
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: fix missing cases in o1_palLoad

Changed paths:
    engines/gob/degob_script_v1.cpp


diff --git a/engines/gob/degob_script_v1.cpp b/engines/gob/degob_script_v1.cpp
index 6abc7aad..055b6dd5 100644
--- a/engines/gob/degob_script_v1.cpp
+++ b/engines/gob/degob_script_v1.cpp
@@ -926,6 +926,14 @@ void Script_v1::o1_palLoad(FuncParams &params) {
 		break;
 
 	case 53:
+		skip(2);
+		return;
+
+	case 55:
+		skip(2);
+		break;
+
+	case 56:
 		skip(2);
 		break;
 
@@ -933,6 +941,57 @@ void Script_v1::o1_palLoad(FuncParams &params) {
 		skip(4);
 		break;
 	}
+
+	if ((cmd & 0x7F) == 0x30) {
+		skip(48);
+		return;
+	}
+
+	cmd &= 0x7F;
+
+	if (cmd == 49) {
+		bool allZero = true;
+
+		for (int i = 2; i < 18; i++) {
+			if (peekUint8() != 0) {
+				allZero = false;
+				break;
+			}
+		}
+		if (!allZero) {
+			skip(48);
+			return;
+		}
+
+		for (int i = 0; i < 18; i++) {
+			skip(1);
+		}
+
+		return;
+	}
+
+	switch (cmd) {
+	case 50:
+		for (int i = 0; i < 16; i++)
+			readUint8();
+		break;
+
+		case 52:
+			for (int i = 0; i < 16; i++) {
+				readUint8();
+				readUint8();
+				readUint8();
+			}
+			break;
+
+		case 53:
+			readUint16();
+			break;
+
+		default:
+			break;
+
+	}
 }
 
 void Script_v1::o1_loadSpriteToPos(FuncParams &params) {


Commit: a3b6e3158611e83e398c3ca27f4d19cd66831c30
    https://github.com/scummvm/scummvm-tools/commit/a3b6e3158611e83e398c3ca27f4d19cd66831c30
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: add support of IDE files in degob (named function offsets)

Changed paths:
    engines/gob/degob.cpp
    engines/gob/degob_script.cpp
    engines/gob/degob_script.h


diff --git a/engines/gob/degob.cpp b/engines/gob/degob.cpp
index e1843d88..4593ebba 100644
--- a/engines/gob/degob.cpp
+++ b/engines/gob/degob.cpp
@@ -47,11 +47,22 @@ int main(int argc, char **argv) {
 		return -1;
 	}
 
-	byte *totData = 0, *extData = 0, *extComData = 0;
-	uint32 totSize = 0, extSize = 0, extComSize = 0;
+	byte *totData = 0, *extData = 0, *extComData = 0, *ideData = 0;
+	uint32 totSize = 0, extSize = 0, extComSize = 0, ideSize = 0;
 	int32 offset = -1;
 
 	totData = readFile(argv[2], totSize);
+	std::string ideFilename = argv[2];
+
+	size_t extPos = ideFilename.find_last_of('.');
+	if (extPos == std::string::npos)
+		ideFilename += ".IDE";
+	else {
+		ideFilename.replace(extPos, ideFilename.length() - extPos, ".IDE");
+	}
+
+	if (Common::Filename(ideFilename).exists())
+		ideData = readFile(ideFilename.c_str(), ideSize);
 
 	ExtTable *extTable = 0;
 	if (argc > 3) {
@@ -97,6 +108,10 @@ int main(int argc, char **argv) {
 		return -1;
 	}
 
+	if (ideData) {
+		script->loadIDE(ideData);
+		delete[] ideData;
+	}
 	printInfo(*script);
 	printf("-----\n");
 
@@ -237,6 +252,7 @@ void printInfo(Script &script) {
 		printf("None\n");
 
 	printf("# of variables: %d (%d bytes)\n", script.getVarsCount(), script.getVarsCount() * 4);
+	printf("# of named functions: %d\n", script.getFuncNamesCount());
 	printf("AnimDataSize: %d bytes\n", script.getAnimDataSize());
 	printf("Text center code starts at: 0x%04X\n", script.getTextCenter());
 	printf("Script code starts at: 0x%04X\n", script.getStart());
diff --git a/engines/gob/degob_script.cpp b/engines/gob/degob_script.cpp
index 05e38e29..c3921b1d 100644
--- a/engines/gob/degob_script.cpp
+++ b/engines/gob/degob_script.cpp
@@ -198,6 +198,7 @@ uint8 Script::getVerScript() const { return _verScript; }
 uint8 Script::getVerIMEX() const { return _verIMEX; }
 uint8 Script::getSuffixIM() const { return _suffixIM; }
 uint8 Script::getSuffixEX() const { return _suffixEX; }
+uint32 Script::getFuncNamesCount() const { return _funcOffsetsNames.size(); }
 
 void Script::putString(const char *s) const {
 	printf("%s", s);
@@ -840,6 +841,39 @@ void Script::loadProperties(byte *data) {
 	_textCenter = READ_LE_UINT16(data + 0x7E);
 }
 
+void Script::loadIDE(const byte *ideData) {
+	const byte *ptr = ideData;
+	char buffer[17];
+
+	uint16 count = *(const uint16 *)ptr;
+	ptr += 2;
+	for (uint32 i = 0; i < count; i++) {
+
+		// skip function type
+		byte functionType = *ptr;
+		++ptr;
+
+		memcpy(buffer, ptr, 17);
+		buffer[16] = '\0';
+		ptr += 17;
+
+		// skip unknown word
+		ptr += 2;
+
+		// Read offset
+		uint16 offset = *(const uint16 *)ptr;
+		ptr += 2;
+
+		// skip unknown word
+		ptr += 2;
+
+		if ((functionType != 0x47) && (functionType != 0x67))
+			continue;
+
+		_funcOffsetsNames[offset] = buffer;
+	}
+}
+
 void Script::funcBlock(int16 retFlag) {
 	FuncParams params;
 	byte cmd;
@@ -905,6 +939,12 @@ void Script::deGob(int32 offset) {
 }
 
 void Script::deGobFunction() {
+	if (!_funcOffsetsNames.empty()) {
+		auto it = _funcOffsetsNames.find(getPos());
+		if (it != _funcOffsetsNames.end()) {
+			print("--- %s ---\n", it->second.c_str());
+		}
+	}
 	printIndent();
 	print("sub_%d {\n", getPos());
 	incIndent();
diff --git a/engines/gob/degob_script.h b/engines/gob/degob_script.h
index 1b712187..67abefb0 100644
--- a/engines/gob/degob_script.h
+++ b/engines/gob/degob_script.h
@@ -26,6 +26,7 @@
 
 #include <string>
 #include <list>
+#include <map>
 
 #include "common/scummsys.h"
 
@@ -82,8 +83,9 @@ public:
 	uint8 getVerIMEX() const;
 	uint8 getSuffixIM() const;
 	uint8 getSuffixEX() const;
+	uint32 getFuncNamesCount() const;
 
-	void deGob(int32 offset = -1);
+	void loadIDE(const byte *ideData);
 
 protected:
 	enum FuncType {
@@ -171,6 +173,7 @@ protected:
 	ExtTable *_extTable;
 
 	std::list<uint32> _funcOffsets;
+	std::map<uint32, std::string> _funcOffsetsNames;
 
 	// Script properties
 	uint16 _start, _textCenter;


Commit: 462e36e94ed0210557309e1ae8c4088de486311d
    https://github.com/scummvm/scummvm-tools/commit/462e36e94ed0210557309e1ae8c4088de486311d
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: --lib mode in degob to use named function offsets as entry points

Changed paths:
    engines/gob/degob.cpp
    engines/gob/degob_script.cpp
    engines/gob/degob_script.h


diff --git a/engines/gob/degob.cpp b/engines/gob/degob.cpp
index 4593ebba..48cae38f 100644
--- a/engines/gob/degob.cpp
+++ b/engines/gob/degob.cpp
@@ -65,6 +65,7 @@ int main(int argc, char **argv) {
 		ideData = readFile(ideFilename.c_str(), ideSize);
 
 	ExtTable *extTable = 0;
+	bool libMode = false;
 	if (argc > 3) {
 		int n = 3;
 
@@ -88,6 +89,11 @@ int main(int argc, char **argv) {
 			n++;
 		}
 
+		if (!strncmp(argv[n], "--lib", 5)) {
+			libMode = true;
+			n++;
+		}
+
 		if (argc > n) {
 
 			extData = readFile(argv[n], extSize);
@@ -115,7 +121,7 @@ int main(int argc, char **argv) {
 	printInfo(*script);
 	printf("-----\n");
 
-	script->deGob(offset);
+	script->deGob(offset, libMode);
 
 	delete[] totData;
 	delete[] extData;
@@ -126,7 +132,7 @@ int main(int argc, char **argv) {
 }
 
 void printHelp(const char *bin) {
-	printf("Usage: %s <version> <file.tot> [-o <offset>] [<file.ext>] [<commun.ext>]\n\n", bin);
+	printf("Usage: %s <version> <file.tot> [-o <offset>] [--lib] [<file.ext>] [<commun.ext>]\n\n", bin);
 	printf("The disassembled script will be written to stdout.\n\n");
 	printf("Supported versions:\n");
 	printf("	Gob1      - Gobliiins 1\n");
diff --git a/engines/gob/degob_script.cpp b/engines/gob/degob_script.cpp
index c3921b1d..1ef8dd3e 100644
--- a/engines/gob/degob_script.cpp
+++ b/engines/gob/degob_script.cpp
@@ -827,7 +827,7 @@ void Script::endFunc() const {
 
 void Script::loadProperties(byte *data) {
 	_start = READ_LE_UINT16(data + 0x64);
-	assert(_start >= 128);
+	//assert(_start >= 128) -> pure "library" files may have no defined entry point (_start = 0)
 
 	_varsCount = READ_LE_UINT16(data + 0x2C);
 	_totTextCount = READ_LE_UINT32(data + 0x30);
@@ -923,13 +923,20 @@ void Script::addFuncOffset(uint32 offset) {
 	_funcOffsets.push_back(offset);
 }
 
-void Script::deGob(int32 offset) {
+void Script::deGob(int32 offset, bool isLib) {
 	_funcOffsets.clear();
 
-	if (offset < 0)
-		addStartingOffsets();
-	else
-	_funcOffsets.push_back(offset);
+	if (isLib) {
+		// Use functions from IDE file as entry points
+		for (auto it = _funcOffsetsNames.begin(); it != _funcOffsetsNames.end(); ++it)
+			addFuncOffset(it->first);
+	} else {
+		if (offset < 0)
+			addStartingOffsets();
+		else
+			_funcOffsets.push_back(offset);
+	}
+
 
 	for (std::list<uint32>::iterator it = _funcOffsets.begin(); it != _funcOffsets.end(); ++it) {
 		seek(*it);
diff --git a/engines/gob/degob_script.h b/engines/gob/degob_script.h
index 67abefb0..1ce5692f 100644
--- a/engines/gob/degob_script.h
+++ b/engines/gob/degob_script.h
@@ -87,6 +87,8 @@ public:
 
 	void loadIDE(const byte *ideData);
 
+	void deGob(int32 offset = -1, bool isLib = false);
+
 protected:
 	enum FuncType {
 		TYPE_NONE = 0,   // No description


Commit: 2b7d4c90e6ba6acccb9821c18839889a0245627d
    https://github.com/scummvm/scummvm-tools/commit/2b7d4c90e6ba6acccb9821c18839889a0245627d
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: more detailed degob --help message

Changed paths:
    engines/gob/degob.cpp


diff --git a/engines/gob/degob.cpp b/engines/gob/degob.cpp
index 48cae38f..9eef3768 100644
--- a/engines/gob/degob.cpp
+++ b/engines/gob/degob.cpp
@@ -148,6 +148,13 @@ void printHelp(const char *bin) {
 	printf("	Geisha    - Geisha\n");
 	printf("	LittleRed - Once Upon A Time: Little Red Riding Hood\n");
 	printf("	Adibou2   - Adibou 2\n");
+	printf("\n");
+	printf("<file.tot>\n\tthe .tot file to decompile\n\n");
+	printf("-o <offset>\n\tscript entry point in the .tot file, defaults to the value read in script header\n\n");
+	printf("--lib\n\tlibrary mode: all offsets from .IDE named functions file are used as entry points\n\n");
+	printf("<file.ext>\n\texternal script resource file (<script name>.EXT)\n\n");
+	printf("<commun.ext>\n\texternal common script resource file (commun.EXn)\n\n");
+
 }
 
 int getVersion(const char *verStr) {


Commit: 33918927b4d8079b3b78ca80ae4dcada1f57d233
    https://github.com/scummvm/scummvm-tools/commit/33918927b4d8079b3b78ca80ae4dcada1f57d233
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: fix o7_oemToANSI not being written to degob output

Changed paths:
    engines/gob/degob_script_v7.cpp


diff --git a/engines/gob/degob_script_v7.cpp b/engines/gob/degob_script_v7.cpp
index f9a666a9..861e123c 100644
--- a/engines/gob/degob_script_v7.cpp
+++ b/engines/gob/degob_script_v7.cpp
@@ -770,6 +770,8 @@ void  Script_v7::oPlaytoons_printText(FuncParams &params)
 
 void Script_v7::o7_oemToANSI(FuncParams &params)
 {
+	startFunc(params);
+	endFunc();
 	skip(2);
 }
 


Commit: 6cb3a5c6a38cfbdeb7b79af615b3d4e95d9eb46b
    https://github.com/scummvm/scummvm-tools/commit/6cb3a5c6a38cfbdeb7b79af615b3d4e95d9eb46b
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: fix an incorrect indentation

Changed paths:
    engines/gob/degob.cpp


diff --git a/engines/gob/degob.cpp b/engines/gob/degob.cpp
index 9eef3768..f0f09bdd 100644
--- a/engines/gob/degob.cpp
+++ b/engines/gob/degob.cpp
@@ -230,7 +230,7 @@ Script *initScript(byte *totData, uint32 totSize, ExtTable *extTable, int versio
 			break;
 		case 9:
 			return new Script_v6(totData, totSize, extTable);
-		break;
+			break;
 		case 10:
 			return new Script_Geisha(totData, totSize, extTable);
 			break;


Commit: fc86ad20023c5fdef46eab86df137c7a865b05b5
    https://github.com/scummvm/scummvm-tools/commit/fc86ad20023c5fdef46eab86df137c7a865b05b5
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: revert "fix missing cases in o1_palLoad", which introduced a regression

This reverts commit 7c1b07d4a2d71a04b7a295222df74c262cadbefd.

Changed paths:
    engines/gob/degob_script_v1.cpp


diff --git a/engines/gob/degob_script_v1.cpp b/engines/gob/degob_script_v1.cpp
index 055b6dd5..6abc7aad 100644
--- a/engines/gob/degob_script_v1.cpp
+++ b/engines/gob/degob_script_v1.cpp
@@ -926,14 +926,6 @@ void Script_v1::o1_palLoad(FuncParams &params) {
 		break;
 
 	case 53:
-		skip(2);
-		return;
-
-	case 55:
-		skip(2);
-		break;
-
-	case 56:
 		skip(2);
 		break;
 
@@ -941,57 +933,6 @@ void Script_v1::o1_palLoad(FuncParams &params) {
 		skip(4);
 		break;
 	}
-
-	if ((cmd & 0x7F) == 0x30) {
-		skip(48);
-		return;
-	}
-
-	cmd &= 0x7F;
-
-	if (cmd == 49) {
-		bool allZero = true;
-
-		for (int i = 2; i < 18; i++) {
-			if (peekUint8() != 0) {
-				allZero = false;
-				break;
-			}
-		}
-		if (!allZero) {
-			skip(48);
-			return;
-		}
-
-		for (int i = 0; i < 18; i++) {
-			skip(1);
-		}
-
-		return;
-	}
-
-	switch (cmd) {
-	case 50:
-		for (int i = 0; i < 16; i++)
-			readUint8();
-		break;
-
-		case 52:
-			for (int i = 0; i < 16; i++) {
-				readUint8();
-				readUint8();
-				readUint8();
-			}
-			break;
-
-		case 53:
-			readUint16();
-			break;
-
-		default:
-			break;
-
-	}
 }
 
 void Script_v1::o1_loadSpriteToPos(FuncParams &params) {


Commit: 9665c9e68f8eb5cdeb3e0d4b8c8d74bb5fda4429
    https://github.com/scummvm/scummvm-tools/commit/9665c9e68f8eb5cdeb3e0d4b8c8d74bb5fda4429
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: correctly add missing cases 55 and 56 in o1_palLoad

Just skipping the right amount of bytes depending on the case is enough here, so cases 53, 55 and 56 are equivalent for degob.

Changed paths:
    engines/gob/degob_script_v1.cpp


diff --git a/engines/gob/degob_script_v1.cpp b/engines/gob/degob_script_v1.cpp
index 6abc7aad..cf1e82c9 100644
--- a/engines/gob/degob_script_v1.cpp
+++ b/engines/gob/degob_script_v1.cpp
@@ -926,6 +926,8 @@ void Script_v1::o1_palLoad(FuncParams &params) {
 		break;
 
 	case 53:
+	case 55:
+	case 56:
 		skip(2);
 		break;
 


Commit: 7c1089ae403a81aa6ef3ba3a4c9f2bfb911b58cf
    https://github.com/scummvm/scummvm-tools/commit/7c1089ae403a81aa6ef3ba3a4c9f2bfb911b58cf
Author: Simon Delamarre (simon.delamarre14 at gmail.com)
Date: 2023-01-03T00:52:51+01:00

Commit Message:
GOB: GPLv2 -> GPLv3 in degob_script_v7.cpp

Changed paths:
    engines/gob/degob_script_v7.cpp


diff --git a/engines/gob/degob_script_v7.cpp b/engines/gob/degob_script_v7.cpp
index 861e123c..5eb12bcc 100644
--- a/engines/gob/degob_script_v7.cpp
+++ b/engines/gob/degob_script_v7.cpp
@@ -1,13 +1,13 @@
 /* ScummVM Tools
  *
- * ScummVM Tools 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.
+ * ScummVM Tools 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 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 3 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
@@ -15,8 +15,8 @@
  * 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.
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
  */
 
 /* GobEngine Script disassembler */




More information about the Scummvm-git-logs mailing list