[Scummvm-git-logs] scummvm master -> 03493e5042c9283389f56eb669c1e84298dfd17b

sev- sev at scummvm.org
Tue Aug 24 23:31:15 UTC 2021


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

Summary:
cb60da0f6e TOLTECS: Added sanity check to avoid potential out-of-bounds read. CID 1403261
c5500cdb5d TOLTECS: Added script tracing
5373b9f301 TOLTECS: Initialize engine class on creation
03493e5042 TOLTECS: Fixed Cancel button behaviour. Bugreport #7107


Commit: cb60da0f6e2a8648f9c45924aa5034a54f929d6e
    https://github.com/scummvm/scummvm/commit/cb60da0f6e2a8648f9c45924aa5034a54f929d6e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2021-08-25T01:30:44+02:00

Commit Message:
TOLTECS: Added sanity check to avoid potential out-of-bounds read. CID 1403261

Changed paths:
    engines/toltecs/segmap.cpp


diff --git a/engines/toltecs/segmap.cpp b/engines/toltecs/segmap.cpp
index d50e110485..da202a03eb 100644
--- a/engines/toltecs/segmap.cpp
+++ b/engines/toltecs/segmap.cpp
@@ -307,6 +307,7 @@ void SegmentMap::findPath(int16 *pointsArray, int16 destX, int16 destY, int16 so
 				if (currentRectIndex != -1 && currentRectIndex == destRectIndex)
 					break;
 				_deadEndPathRects[_deadEndPathRectsCount++] = _closedPathRects[--_closedPathRectsCount];
+				assert(_pathNodesCount >= 2);
 				_pathNodesCount -= 2;
 				currentRectIndex = _closedPathRects[--_closedPathRectsCount];
 			}


Commit: c5500cdb5db805e74c547853fc8ef58199e407a5
    https://github.com/scummvm/scummvm/commit/c5500cdb5db805e74c547853fc8ef58199e407a5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2021-08-25T01:30:44+02:00

Commit Message:
TOLTECS: Added script tracing

Changed paths:
    engines/toltecs/script.cpp
    engines/toltecs/script.h


diff --git a/engines/toltecs/script.cpp b/engines/toltecs/script.cpp
index 95a8594a44..7ab1c07cf6 100644
--- a/engines/toltecs/script.cpp
+++ b/engines/toltecs/script.cpp
@@ -205,6 +205,8 @@ void ScriptInterpreter::setMainScript(uint slotIndex) {
 	_regs.sp = 4096;
 	_regs.reg8 = 0;
 	_code = getSlotData(_regs.reg4);
+	debug(2, "CODE: slot[%d]", _regs.reg4);
+	_codeStart = _code;
 }
 
 void ScriptInterpreter::runScript() {
@@ -255,7 +257,7 @@ int16 ScriptInterpreter::readInt16() {
 void ScriptInterpreter::execOpcode(byte opcode) {
 	int16 ofs;
 
-	debug(2, "opcode = %d", opcode);
+	debug(2, "[%ld] %d", _code - _codeStart - 1, opcode);
 
 	switch (opcode) {
 	case 0:
@@ -405,9 +407,13 @@ void ScriptInterpreter::execOpcode(byte opcode) {
 		break;
 	case 43:
 		_code = getSlotData(_regs.reg4) + _regs.reg0;
+		debug(2, "CODE: slot[%d] + %d", _regs.reg4, _regs.reg0);
+		_codeStart = _code;
 		break;
 	case 44:
 		_code = getSlotData(_regs.reg5) + _regs.reg0;
+		debug(2, "CODE: slot[%d] + %d", _regs.reg5, _regs.reg0);
+		_codeStart = _code;
 		_regs.reg4 = _regs.reg5;
 		_switchLocalDataNear = true;
 		break;
@@ -415,11 +421,15 @@ void ScriptInterpreter::execOpcode(byte opcode) {
 		pushInt16(_code - getSlotData(_regs.reg4));
 		pushInt16(_regs.reg4);
 		_code = getSlotData(_regs.reg4) + _regs.reg0;
+		debug(2, "CODE: slot[%d] + %d", _regs.reg4, _regs.reg0);
+		_codeStart = _code;
 		break;
 	case 46:
 		pushInt16(_code - getSlotData(_regs.reg4));
 		pushInt16(_regs.reg4);
 		_code = getSlotData(_regs.reg5) + _regs.reg0;
+		debug(2, "CODE: slot[%d] + %d", _regs.reg5, _regs.reg0);
+		_codeStart = _code;
 		_regs.reg4 = _regs.reg5;
 		_switchLocalDataNear = true;
 		break;
@@ -427,12 +437,16 @@ void ScriptInterpreter::execOpcode(byte opcode) {
 		_regs.reg4 = popInt16();
 		ofs = popInt16();
 		_code = getSlotData(_regs.reg4) + ofs;
+		debug(2, "CODE: slot[%d] + %d", _regs.reg4, ofs);
+		_codeStart = _code;
 		_switchLocalDataNear = true;
 		break;
 	case 48:
 		_regs.reg4 = popInt16();
 		ofs = popInt16();
 		_code = getSlotData(_regs.reg4) + ofs;
+		debug(2, "CODE: slot[%d] + %d", _regs.reg4, ofs);
+		_codeStart = _code;
 		_regs.sp += _regs.reg0;
 		_switchLocalDataNear = true;
 		break;
@@ -709,7 +723,10 @@ void ScriptInterpreter::loadState(Common::ReadStream *in) {
 	_savedSp = in->readUint16LE();
 
 	// Load IP
-	_code = getSlotData(_regs.reg4) + in->readUint16LE();
+	uint16 offset = in->readUint16LE();
+	_code = getSlotData(_regs.reg4) + offset;
+	debug(2, "CODE: slot[%d] + %d", _regs.reg4, offset);
+	_codeStart = _code;
 }
 
 void ScriptInterpreter::sfNop() {
@@ -795,6 +812,8 @@ void ScriptInterpreter::sfLoadScript() {
 	int16 codeOfs = _code - getSlotData(_regs.reg4);
 	loadScript(arg16(4), arg8(3));
 	_code = getSlotData(_regs.reg4) + codeOfs;
+	debug(2, "CODE: slot[%d] + %d", _regs.reg4, codeOfs);
+	_codeStart = _code;
 	_switchLocalDataNear = true;
 }
 
diff --git a/engines/toltecs/script.h b/engines/toltecs/script.h
index e77dcf4352..b537d527c1 100644
--- a/engines/toltecs/script.h
+++ b/engines/toltecs/script.h
@@ -82,7 +82,7 @@ protected:
 
 	byte *_stack;
 
-	byte *_code, *_subCode;
+	byte *_code, *_subCode, *_codeStart;
 	byte *_localData;
 	bool _switchLocalDataNear, _switchLocalDataFar, _switchLocalDataToStack;
 	bool _cmpBitTest;


Commit: 5373b9f3012663c5f2a7602b7c18173fef216e91
    https://github.com/scummvm/scummvm/commit/5373b9f3012663c5f2a7602b7c18173fef216e91
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2021-08-25T01:30:45+02:00

Commit Message:
TOLTECS: Initialize engine class on creation

Changed paths:
    engines/toltecs/toltecs.cpp


diff --git a/engines/toltecs/toltecs.cpp b/engines/toltecs/toltecs.cpp
index a224dd0dd9..e3f9b47f3f 100644
--- a/engines/toltecs/toltecs.cpp
+++ b/engines/toltecs/toltecs.cpp
@@ -63,6 +63,51 @@ struct GameSettings {
 
 ToltecsEngine::ToltecsEngine(OSystem *syst, const ToltecsGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
 	_rnd = new Common::RandomSource("toltecs");
+
+	_sceneResIndex = 0;
+	_sceneWidth = _sceneHeight = 0;
+
+	_counter01 = _counter02 = 0;
+	_movieSceneFlag = false;
+	_flag01 = 0;
+
+	_cameraX = _cameraY = _newCameraX = _newCameraY = 0;
+	_cameraHeight = 0;
+	_guiHeight = 26;
+
+	_doSpeech = true;
+	_doText = true;
+
+	_walkSpeedY = 5;
+	_walkSpeedX = 1;
+
+	_mouseX = 0;
+	_mouseY = 0;
+	_mouseDblClickTicks = 60;
+	_mouseWaitForRelease = false;
+	_mouseButton = 0;
+	_mouseDisabled = 0;
+	_leftButtonDown = false;
+	_rightButtonDown = false;
+
+	_arc = nullptr;
+	_res = nullptr;
+	_screen = nullptr;
+	_script = nullptr;
+	_anim = nullptr;
+	_palette = nullptr;
+	_segmap = nullptr;
+	_moviePlayer = nullptr;
+	_music = nullptr;
+	_menuSystem = nullptr;
+
+	_sound = nullptr;
+
+	_cfgText = ConfMan.getBool("subtitles");
+	_cfgVoices = !ConfMan.getBool("speech_mute");
+
+	_saveLoadRequested = 0;
+	_isSaveAllowed = true;
 }
 
 ToltecsEngine::~ToltecsEngine() {


Commit: 03493e5042c9283389f56eb669c1e84298dfd17b
    https://github.com/scummvm/scummvm/commit/03493e5042c9283389f56eb669c1e84298dfd17b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2021-08-25T01:30:45+02:00

Commit Message:
TOLTECS: Fixed Cancel button behaviour. Bugreport #7107

Changed paths:
    engines/toltecs/menu.cpp
    engines/toltecs/menu.h


diff --git a/engines/toltecs/menu.cpp b/engines/toltecs/menu.cpp
index ef61222af1..22ea68e6fe 100644
--- a/engines/toltecs/menu.cpp
+++ b/engines/toltecs/menu.cpp
@@ -47,6 +47,7 @@ MenuSystem::MenuSystem(ToltecsEngine *vm) : _vm(vm) {
 	_editingDescriptionID = kItemIdNone;
 	_editingDescriptionItem = nullptr;
 	_needRedraw = false;
+	_returnToGame = false;
 }
 
 MenuSystem::~MenuSystem() {
@@ -80,6 +81,11 @@ int MenuSystem::run(MenuID menuId) {
 
 	memcpy(_background->getPixels(), _vm->_screen->_frontScreen, 640 * 400);
 
+	if (menuId == kMenuIdMain)
+		_returnToGame = false;
+	else
+		_returnToGame = true;
+
 	while (_running) {
 		update();
 		_vm->_system->updateScreen();
@@ -268,10 +274,15 @@ void MenuSystem::initMenu(MenuID menuID) {
 			int slot = dialog->runModalWithCurrentTarget();
 			delete dialog;
 
-			if (slot >= 0)
+			if (slot >= 0) {
 				_vm->requestLoadgame(slot);
-
-			_running = false;
+				_running = false;
+			} else {
+				if (_returnToGame)
+					_running = false;
+				else
+					_newMenuID = kMenuIdMain;
+			}
 		}
 		break;
 	case kMenuIdSave:
@@ -297,10 +308,15 @@ void MenuSystem::initMenu(MenuID menuID) {
 				desc = dialog->createDefaultSaveDescription(slot);
 			}
 
-			if (slot >= 0)
+			if (slot >= 0) {
 				_vm->requestSavegame(slot, desc);
-
-			_running = false;
+				_running = false;
+			} else {
+				if (_returnToGame)
+					_running = false;
+				else
+					_newMenuID = kMenuIdMain;
+			}
 		}
 		break;
 	case kMenuIdVolumes:
diff --git a/engines/toltecs/menu.h b/engines/toltecs/menu.h
index 476eefe142..42b08e51bc 100644
--- a/engines/toltecs/menu.h
+++ b/engines/toltecs/menu.h
@@ -113,6 +113,7 @@ protected:
 	ItemID _editingDescriptionID;
 	Item *_editingDescriptionItem;
 	bool _needRedraw;
+	bool _returnToGame;
 
 	Common::Array<Item> _items;
 	Common::Array<SavegameItem> _savegames;




More information about the Scummvm-git-logs mailing list