[Scummvm-git-logs] scummvm master -> bf9af9abc1ef3658aee2c0f4854a03e5b9af98e4

mduggan mgithub at guarana.org
Tue May 4 13:52:23 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:
92fe6afa24 ULTIMA8: Check bytes read when loading savegames
878331b074 ULTIMA8: Tweak process start order for Crusader
fab43f51a4 ULTIMA8: Destroy contents earlier in Cru death
bf9af9abc1 ULTIMA8: Ignore invalid parent objects on destruction


Commit: 92fe6afa24ef0c05cd2ecea513ab1165e3747f8c
    https://github.com/scummvm/scummvm/commit/92fe6afa24ef0c05cd2ecea513ab1165e3747f8c
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-04T22:42:44+09:00

Commit Message:
ULTIMA8: Check bytes read when loading savegames

Changed paths:
    engines/ultima/ultima8/ultima8.cpp


diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 799e3abf3e..86f8c86cca 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -1247,6 +1247,8 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 	setupCoreGumps();
 
 	// and load everything back (order matters)
+	// for each entry, check that we read exactly the number of bytes
+	// expected - anything else suggests a corrupt save (or a bug)
 	bool totalok = true;
 
 	Std::string message;
@@ -1255,6 +1257,7 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 	// so load these first
 	ds = sg->getDataSource("UCSTRINGS");
 	ok = _ucMachine->loadStrings(ds, version);
+	ok &= (ds->pos() == ds->size() && !ds->eos());
 	totalok &= ok;
 	pout << "UCSTRINGS: " << (ok ? "ok" : "failed") << Std::endl;
 	if (!ok) message += "UCSTRINGS: failed\n";
@@ -1262,6 +1265,7 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 
 	ds = sg->getDataSource("UCGLOBALS");
 	ok = _ucMachine->loadGlobals(ds, version);
+	ok &= (ds->pos() == ds->size() && !ds->eos());
 	totalok &= ok;
 	pout << "UCGLOBALS: " << (ok ? "ok" : "failed") << Std::endl;
 	if (!ok) message += "UCGLOBALS: failed\n";
@@ -1269,6 +1273,7 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 
 	ds = sg->getDataSource("UCLISTS");
 	ok = _ucMachine->loadLists(ds, version);
+	ok &= (ds->pos() == ds->size() && !ds->eos());
 	totalok &= ok;
 	pout << "UCLISTS: " << (ok ? "ok" : "failed") << Std::endl;
 	if (!ok) message += "UCLISTS: failed\n";
@@ -1278,6 +1283,7 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 	// KERNEL must be before APP, for the _avatarMoverProcess
 	ds = sg->getDataSource("KERNEL");
 	ok = _kernel->load(ds, version);
+	ok &= (ds->pos() == ds->size() && !ds->eos());
 	totalok &= ok;
 	pout << "KERNEL: " << (ok ? "ok" : "failed") << Std::endl;
 	if (!ok) message += "KERNEL: failed\n";
@@ -1285,6 +1291,7 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 
 	ds = sg->getDataSource("APP");
 	ok = load(ds, version);
+	ok &= (ds->pos() == ds->size() && !ds->eos());
 	totalok &= ok;
 	pout << "APP: " << (ok ? "ok" : "failed") << Std::endl;
 	if (!ok) message += "APP: failed\n";
@@ -1293,6 +1300,7 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 	// WORLD must be before OBJECTS, for the egghatcher
 	ds = sg->getDataSource("WORLD");
 	ok = _world->load(ds, version);
+	ok &= (ds->pos() == ds->size() && !ds->eos());
 	totalok &= ok;
 	pout << "WORLD: " << (ok ? "ok" : "failed") << Std::endl;
 	if (!ok) message += "WORLD: failed\n";
@@ -1300,6 +1308,7 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 
 	ds = sg->getDataSource("CURRENTMAP");
 	ok = _world->getCurrentMap()->load(ds, version);
+	ok &= (ds->pos() == ds->size() && !ds->eos());
 	totalok &= ok;
 	pout << "CURRENTMAP: " << (ok ? "ok" : "failed") << Std::endl;
 	if (!ok) message += "CURRENTMAP: failed\n";
@@ -1307,6 +1316,7 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 
 	ds = sg->getDataSource("OBJECTS");
 	ok = _objectManager->load(ds, version);
+	ok &= (ds->pos() == ds->size() && !ds->eos());
 	totalok &= ok;
 	pout << "OBJECTS: " << (ok ? "ok" : "failed") << Std::endl;
 	if (!ok) message += "OBJECTS: failed\n";
@@ -1314,6 +1324,7 @@ Common::Error Ultima8Engine::loadGameStream(Common::SeekableReadStream *stream)
 
 	ds = sg->getDataSource("MAPS");
 	ok = _world->loadMaps(ds, version);
+	ok &= (ds->pos() == ds->size() && !ds->eos());
 	totalok &= ok;
 	pout << "MAPS: " << (ok ? "ok" : "failed") << Std::endl;
 	if (!ok) message += "MAPS: failed\n";


Commit: 878331b074319c614d44468eabc0079238676875
    https://github.com/scummvm/scummvm/commit/878331b074319c614d44468eabc0079238676875
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-04T22:50:09+09:00

Commit Message:
ULTIMA8: Tweak process start order for Crusader

Changed paths:
    engines/ultima/ultima8/games/start_crusader_process.cpp


diff --git a/engines/ultima/ultima8/games/start_crusader_process.cpp b/engines/ultima/ultima8/games/start_crusader_process.cpp
index 0c82274f33..53a1c68ad9 100644
--- a/engines/ultima/ultima8/games/start_crusader_process.cpp
+++ b/engines/ultima/ultima8/games/start_crusader_process.cpp
@@ -64,18 +64,18 @@ void StartCrusaderProcess::run() {
 		}
 	}
 
-	Gump *statusGump = new CruStatusGump(true);
-	statusGump->InitGump(nullptr, false);
-
-	Gump *cruPickupAreaGump = new CruPickupAreaGump(true);
-	cruPickupAreaGump->InitGump(nullptr, false);
-
 	// Try to load the save game, if succeeded this pointer will no longer be valid
 	if (_saveSlot >= 0 && Ultima8Engine::get_instance()->loadGameState(_saveSlot).getCode() == Common::kNoError) {
 		//PaletteFaderProcess::I_fadeFromBlack(0, 0);
 		return;
 	}
 
+	Gump *statusGump = new CruStatusGump(true);
+	statusGump->InitGump(nullptr, false);
+
+	Gump *cruPickupAreaGump = new CruPickupAreaGump(true);
+	cruPickupAreaGump->InitGump(nullptr, false);
+
 	Ultima8Engine::get_instance()->setCheatMode(true);
 
 	if (!_skipStart) {


Commit: fab43f51a4e9243c335021c1b4daa87ab0bd09a6
    https://github.com/scummvm/scummvm/commit/fab43f51a4e9243c335021c1b4daa87ab0bd09a6
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-04T22:50:49+09:00

Commit Message:
ULTIMA8: Destroy contents earlier in Cru death

Changed paths:
    engines/ultima/ultima8/world/actors/actor.cpp


diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 60665ff80c..244e253898 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -1324,6 +1324,10 @@ ProcId Actor::dieCru(uint16 damageType, uint16 damagePts, Direction srcDir) {
 
 	ProcId lastanim = 0;
 	Kernel::get_instance()->killProcesses(_objId, Kernel::PROC_TYPE_ALL, true);
+
+	destroyContents();
+	giveTreasure();
+
 	if (damageType == 3 || damageType == 4 || damageType == 10 || damageType == 12) {
 		if (!is_robot /* && violence enabled */) {
 			const FireType *ft = GameData::get_instance()->getFireType(damageType);
@@ -1449,9 +1453,6 @@ ProcId Actor::dieCru(uint16 damageType, uint16 damagePts, Direction srcDir) {
 		}
 	}
 
-	destroyContents();
-	giveTreasure();
-
 	return lastanim;
 }
 


Commit: bf9af9abc1ef3658aee2c0f4854a03e5b9af98e4
    https://github.com/scummvm/scummvm/commit/bf9af9abc1ef3658aee2c0f4854a03e5b9af98e4
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-04T22:50:59+09:00

Commit Message:
ULTIMA8: Ignore invalid parent objects on destruction

This probably shouldn't happen, but if it does then handle it gracefully for
now.

Changed paths:
    engines/ultima/ultima8/world/item.cpp


diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index 4baa99aa72..1b611e6364 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -118,7 +118,7 @@ void Item::dumpInfo() const {
 
 Container *Item::getParentAsContainer() const {
 	// No parent, no container
-	if (!_parent)
+	if (!_parent || getObject(_parent) == nullptr)
 		return nullptr;
 
 	Container *p = getContainer(_parent);




More information about the Scummvm-git-logs mailing list