[Scummvm-git-logs] scummvm master -> 560d09f3140de78ef5b3ad8d82e396db829bacc2

sluicebox noreply at scummvm.org
Tue Jan 2 06:01:36 UTC 2024


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

Summary:
ad9537227b AGI: Fix print.at parameter count in SQ1 1.0X
0877da67b2 AGI: Fix uninit memory use, crash on `error`
560d09f314 AGI: Remove unused function declarations


Commit: ad9537227b1c03262e7973c7fda7a5a16badac81
    https://github.com/scummvm/scummvm/commit/ad9537227b1c03262e7973c7fda7a5a16badac81
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2024-01-01T21:58:43-08:00

Commit Message:
AGI: Fix print.at parameter count in SQ1 1.0X

Fixes the skimmer sequence locking up when displaying a message box.

fixes bug #10872

Changed paths:
    engines/agi/opcodes.cpp


diff --git a/engines/agi/opcodes.cpp b/engines/agi/opcodes.cpp
index 8b7a7ca2875..acb36d02510 100644
--- a/engines/agi/opcodes.cpp
+++ b/engines/agi/opcodes.cpp
@@ -320,7 +320,7 @@ AgiOpCodeDefinitionEntry opCodesV2[] = {
 	{ "reposition.to.v",    "nvv",      &cmdRepositionToF },    // 94
 	{ "trace.on",           "",         &cmdTraceOn },          // 95
 	{ "trace.info",         "nnn",      &cmdTraceInfo },        // 96
-	{ "print.at",           "snnn",     &cmdPrintAt }, // 3 args for AGI versions before 2.440
+	{ "print.at",           "snnn",     &cmdPrintAt }, // 3 args for AGI versions before 2.089
 	{ "print.at.v",         "vnnn",     &cmdPrintAtV },         // 98
 	{ "discard.view.v",     "v",        &cmdDiscardView},       // 99
 	{ "clear.text.rect",    "nnnnn",    &cmdClearTextRect },    // 9A
@@ -404,10 +404,10 @@ void AgiEngine::setupOpCodes(uint16 version) {
 		if (version == 0x2089)
 			_opCodes[0x86].parameters = "";
 
-		// 'print.at' and 'print.at.v' take 3 args before 2.272
-		// This is documented in the specs as only < 2.440, but it seems
-		// that KQ3 (2.272) needs a 'print.at' taking 4 args.
-		if (version < 0x2272) {
+		// 'print.at' and 'print.at.v' take 3 args before 2.089.
+		// This is documented in the specs as only < 2.440, but
+		// SQ1 1.0X (2.089) and KQ3 (2.272) take 4 args. Bug #10872
+		if (version < 0x2089) {
 			_opCodes[0x97].parameters = "vvv";
 			_opCodes[0x98].parameters = "vvv";
 		}


Commit: 0877da67b20fe570cf4812a6ca486a648cd108ab
    https://github.com/scummvm/scummvm/commit/0877da67b20fe570cf4812a6ca486a648cd108ab
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2024-01-01T21:59:20-08:00

Commit Message:
AGI: Fix uninit memory use, crash on `error`

Fixes random crashes when an illegal opcode is encountered.

See bug #14699

Changed paths:
    engines/agi/op_cmd.cpp
    engines/agi/opcodes.cpp


diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp
index 177a0a90057..a5a0cfe4a01 100644
--- a/engines/agi/op_cmd.cpp
+++ b/engines/agi/op_cmd.cpp
@@ -2439,16 +2439,16 @@ int AgiEngine::runLogic(int16 logicNr) {
 			_game.execStack.pop_back();
 			return 1;
 		default:
+			if (!_opCodes[op].functionPtr) {
+				error("Illegal opcode %x in logic %d, ip %d", op, state->curLogicNr, state->_curLogic->cIP);
+			}
+
 			curParameterSize = _opCodes[op].parameterSize;
 			memmove(p, state->_curLogic->data + state->_curLogic->cIP, curParameterSize);
 			memset(p + curParameterSize, 0, CMD_BSIZE - curParameterSize);
 
 			debugC(2, kDebugLevelScripts, "%s%s(%d %d %d)", st, _opCodes[op].name, p[0], p[1], p[2]);
 
-			if (!_opCodes[op].functionPtr) {
-				error("Illegal opcode %x in logic %d, ip %d", op, state->curLogicNr, state->_curLogic->cIP);
-			}
-
 			_opCodes[op].functionPtr(&_game, this, p);
 			state->_curLogic->cIP += curParameterSize;
 		}
diff --git a/engines/agi/opcodes.cpp b/engines/agi/opcodes.cpp
index acb36d02510..f391dcb2e5b 100644
--- a/engines/agi/opcodes.cpp
+++ b/engines/agi/opcodes.cpp
@@ -366,8 +366,6 @@ void AgiEngine::setupOpCodes(uint16 version) {
 	const AgiOpCodeDefinitionEntry *opCodesCondTable = nullptr;
 	uint16 opCodesTableSize = 0;
 	uint16 opCodesCondTableSize = 0;
-	uint16 opCodesTableMaxSize = sizeof(_opCodes) / sizeof(AgiOpCodeEntry);
-	uint16 opCodesCondTableMaxSize = sizeof(_opCodesCond) / sizeof(AgiOpCodeEntry);
 
 	debug(0, "Setting up for version 0x%04X", version);
 
@@ -443,16 +441,18 @@ void AgiEngine::setupOpCodes(uint16 version) {
 		_opCodes[182].parameters = "vv";
 
 	// add invalid entries for every opcode, that is not defined at all
-	for (int opCodeNr = opCodesTableSize; opCodeNr < opCodesTableMaxSize; opCodeNr++) {
+	for (int opCodeNr = opCodesTableSize; opCodeNr < ARRAYSIZE(_opCodes); opCodeNr++) {
 		_opCodes[opCodeNr].name = "illegal";
 		_opCodes[opCodeNr].parameters = "";
 		_opCodes[opCodeNr].functionPtr = nullptr;
+		_opCodes[opCodeNr].parameterSize = 0;
 	}
 
-	for (int opCodeNr = opCodesCondTableSize; opCodeNr < opCodesCondTableMaxSize; opCodeNr++) {
+	for (int opCodeNr = opCodesCondTableSize; opCodeNr < ARRAYSIZE(_opCodesCond); opCodeNr++) {
 		_opCodesCond[opCodeNr].name = "illegal";
 		_opCodesCond[opCodeNr].parameters = "";
 		_opCodesCond[opCodeNr].functionPtr = nullptr;
+		_opCodesCond[opCodeNr].parameterSize = 0;
 	}
 
 	// calculate parameter size


Commit: 560d09f3140de78ef5b3ad8d82e396db829bacc2
    https://github.com/scummvm/scummvm/commit/560d09f3140de78ef5b3ad8d82e396db829bacc2
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2024-01-01T21:59:20-08:00

Commit Message:
AGI: Remove unused function declarations

Changed paths:
    engines/agi/agi.h
    engines/agi/graphics.h
    engines/agi/loader_v3.cpp
    engines/agi/picture.h
    engines/agi/sound.h
    engines/agi/sprite.h


diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index ac78d7c37ee..499bcf7ae17 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -932,14 +932,8 @@ public:
 
 public:
 	void decrypt(uint8 *mem, int len);
-	void releaseSprites();
 	uint16 processAGIEvents();
-	int viewPictures();
 	int runGame();
-	int getAppDir(char *appDir, unsigned int size);
-
-	int setupV2Game(int ver);
-	int setupV3Game(int ver);
 
 	void newRoom(int16 newRoomNr);
 	void resetControllers();
@@ -954,7 +948,6 @@ public:
 
 	// Objects
 public:
-	int showObjects();
 	int loadObjects(const char *fname);
 	int loadObjects(Common::File &fp);
 	const char *objectName(uint16 objectNr);
@@ -1002,8 +995,6 @@ public:
 
 	// View
 private:
-
-	void lSetLoop(ScreenObjEntry *screenObj, int16 loopNr);
 	void updateView(ScreenObjEntry *screenObj);
 
 public:
@@ -1024,8 +1015,6 @@ private:
 	void unpackViewCelDataAGI256(AgiViewCel *celData, byte *compressedData, uint16 compressedSize);
 
 public:
-	void addToPic(int, int, int, int, int, int, int);
-	void drawObj(int);
 	bool isEgoView(const ScreenObjEntry *screenObj);
 
 	// Motion
@@ -1055,14 +1044,12 @@ public:
 
 	// Keyboard
 	int doPollKeyboard();
-	void cleanKeyboard();
 
 	bool handleMouseClicks(uint16 &key);
 	bool handleController(uint16 key);
 
 	bool showPredictiveDialog();
 
-	uint16 agiGetKeypress();
 	int waitKey();
 	int waitAnyKey();
 
diff --git a/engines/agi/graphics.h b/engines/agi/graphics.h
index 726fecf1214..ab9464a2fe0 100644
--- a/engines/agi/graphics.h
+++ b/engines/agi/graphics.h
@@ -92,7 +92,6 @@ public:
 
 	void translateGameRectToDisplayScreen(int16 &x, int16 &y, int16 &width, int16 &height);
 	void translateVisualRectToDisplayScreen(int16 &x, int16 &y, int16 &width, int16 &height);
-	void translateDisplayRectToVisualScreen(int16 &x, int16 &y, int16 &width, int16 &height);
 
 	uint32 getDisplayOffsetToGameScreenPos(int16 x, int16 y);
 	uint32 getDisplayOffsetToVisualScreenPos(int16 x, int16 y);
diff --git a/engines/agi/loader_v3.cpp b/engines/agi/loader_v3.cpp
index e5409a8c076..8f82ee02018 100644
--- a/engines/agi/loader_v3.cpp
+++ b/engines/agi/loader_v3.cpp
@@ -232,8 +232,6 @@ uint8 *AgiLoader_v3::loadVolRes(AgiDir *agid) {
 			// Manhunter 2 uses such pictures
 			data = compBuffer;
 			agid->flags |= RES_PICTURE_V3_NIBBLE_PARM;
-			//data = _vm->_picture->convertV3Pic(compBuffer, agid->clen);
-			// compBuffer has been freed inside convertV3Pic()
 		} else if (agid->len == agid->clen) {
 			// do not decompress
 			data = compBuffer;
diff --git a/engines/agi/picture.h b/engines/agi/picture.h
index 4954c3b7189..82231719fdc 100644
--- a/engines/agi/picture.h
+++ b/engines/agi/picture.h
@@ -75,7 +75,6 @@ public:
 private:
 	void draw_xCorner(bool skipOtherCoords = false);
 	void yCorner(bool skipOtherCoords = false);
-	int plotPatternPoint(int x, int y, int bitpos);
 	void plotBrush();
 
 	byte getNextByte();
@@ -112,7 +111,6 @@ public:
 	void showPic(); // <-- for regular AGI games
 	void showPic(int16 x, int16 y, int16 pic_width, int16 pic_height); // <-- for preAGI games
 	void showPicWithTransition();
-	uint8 *convertV3Pic(uint8 *src, uint32 len);
 
 	void plotPattern(int x, int y);     // public because it's used directly by preagi
 
diff --git a/engines/agi/sound.h b/engines/agi/sound.h
index b823b280382..ecc19a7c34e 100644
--- a/engines/agi/sound.h
+++ b/engines/agi/sound.h
@@ -137,7 +137,6 @@ public:
 	void setVolume(uint8 volume);
 
 	void unloadSound(int);
-	void playSound();
 	void startSound(int, int);
 	void stopSound();
 
diff --git a/engines/agi/sprite.h b/engines/agi/sprite.h
index 0c67f772630..96107ed2d22 100644
--- a/engines/agi/sprite.h
+++ b/engines/agi/sprite.h
@@ -94,8 +94,6 @@ public:
 	SpritesMgr(AgiEngine *agi, GfxMgr *gfx);
 	~SpritesMgr();
 
-	int initSprites();
-	void deinitSprites();
 	void addToPic(int16 viewNr, int16 loopNr, int16 celNr, int16 xPos, int16 yPos, int16 priority, int16 border);
 	void addToPicDrawPriorityBox(ScreenObjEntry *screenObj, int16 border);
 };




More information about the Scummvm-git-logs mailing list