[Scummvm-git-logs] scummvm master -> 02a5a1e2c6db9c91674c603ede9d00347a192ee5

mduggan mgithub at guarana.org
Wed May 5 05:32:18 UTC 2021


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

Summary:
f3f5aca83d ULTIMA8: Fix assert in reshowing Crusader status gump
ca2226caa0 ULTIMA8: Fix location of Crusader bullet splash shapes
f30c74ed12 ULTIMA8: More savegame integrity checks
0b9afc4a52 ULTIMA8: Correct parameter mixup writing usecode globals
02a5a1e2c6 ULTIMA8: Wire up Crusader: No Remorse isFalling intrinsic


Commit: f3f5aca83d821d14f9baa182bd53eb32a6c7406e
    https://github.com/scummvm/scummvm/commit/f3f5aca83d821d14f9baa182bd53eb32a6c7406e
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-05T14:31:58+09:00

Commit Message:
ULTIMA8: Fix assert in reshowing Crusader status gump

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


diff --git a/engines/ultima/ultima8/gumps/cru_status_gump.cpp b/engines/ultima/ultima8/gumps/cru_status_gump.cpp
index ca843b0769..c45a47d2b5 100644
--- a/engines/ultima/ultima8/gumps/cru_status_gump.cpp
+++ b/engines/ultima/ultima8/gumps/cru_status_gump.cpp
@@ -133,7 +133,7 @@ uint32 CruStatusGump::I_showStatusGump(const uint8 * /*args*/,
 	unsigned int /*argsize*/) {
 	CruStatusGump *instance = get_instance();
 	if (!instance) {
-		instance = new CruStatusGump();
+		instance = new CruStatusGump(true);
 		instance->InitGump(nullptr, false);
 		assert(_instance);
 	}


Commit: ca2226caa00023ac0e6a6d48c6c01ba57d5ac62d
    https://github.com/scummvm/scummvm/commit/ca2226caa00023ac0e6a6d48c6c01ba57d5ac62d
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-05T14:31:58+09:00

Commit Message:
ULTIMA8: Fix location of Crusader bullet splash shapes

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


diff --git a/engines/ultima/ultima8/world/super_sprite_process.cpp b/engines/ultima/ultima8/world/super_sprite_process.cpp
index 44e69951c5..e155fe60fe 100644
--- a/engines/ultima/ultima8/world/super_sprite_process.cpp
+++ b/engines/ultima/ultima8/world/super_sprite_process.cpp
@@ -332,6 +332,8 @@ void SuperSpriteProcess::hitAndFinish() {
 		CurrentMap *map = World::get_instance()->getCurrentMap();
 		collision = map->sweepTest(start, end, dims, ShapeInfo::SI_SOLID,
 								   _source, true, &hits);
+		if (collision)
+			break;
 		start[0] += xstep;
 		start[1] += ystep;
 		start[2] += zstep;


Commit: f30c74ed121ab143173f9203fee4d2be5f107138
    https://github.com/scummvm/scummvm/commit/f30c74ed121ab143173f9203fee4d2be5f107138
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-05T14:31:58+09:00

Commit Message:
ULTIMA8: More savegame integrity checks

Changed paths:
    engines/ultima/ultima8/graphics/palette.h
    engines/ultima/ultima8/kernel/kernel.cpp
    engines/ultima/ultima8/kernel/process.cpp
    engines/ultima/ultima8/kernel/process.h
    engines/ultima/ultima8/ultima8.cpp


diff --git a/engines/ultima/ultima8/graphics/palette.h b/engines/ultima/ultima8/graphics/palette.h
index 111140825a..fbb243477c 100644
--- a/engines/ultima/ultima8/graphics/palette.h
+++ b/engines/ultima/ultima8/graphics/palette.h
@@ -51,7 +51,10 @@ enum PalTransforms {
 	Transform_GBR       = 6,
 
 	// O[b] = I[r]; O[r] = I[g]; O[g] = I[b];
-	Transform_BRG       = 7
+	Transform_BRG       = 7,
+
+	// Any value beyond this is invalid in savegames.
+	Transform_Invalid 	= 8
 };
 
 struct Palette {
diff --git a/engines/ultima/ultima8/kernel/kernel.cpp b/engines/ultima/ultima8/kernel/kernel.cpp
index 430d69d9d7..b048b726f6 100644
--- a/engines/ultima/ultima8/kernel/kernel.cpp
+++ b/engines/ultima/ultima8/kernel/kernel.cpp
@@ -349,10 +349,18 @@ bool Kernel::load(Common::ReadStream *rs, uint32 version) {
 	Std::set<ProcId> procs;
 	for (Std::list<Process *>::const_iterator iter = _processes.begin(); iter != _processes.end(); iter++) {
 		const Process *p = *iter;
+		if (!_pIDs->isIDUsed(p->getPid())) {
+			warning("Process id %d exists but not marked used.  Corrupt save?", p->getPid());
+			return false;
+		}
 		if (procs.find(p->getPid()) != procs.end()) {
 			warning("Duplicate process id %d in processes.  Corrupt save?", p->getPid());
 			return false;
 		}
+		procs.insert(p->getPid());
+		if (!p->validateWaiters()) {
+			return false;
+		}
 		if (p->getTicksPerRun() > 100) {
 			warning("Improbable value for ticks per run %d in process id %d .  Corrupt save?", p->getTicksPerRun(), p->getPid());
 			return false;
diff --git a/engines/ultima/ultima8/kernel/process.cpp b/engines/ultima/ultima8/kernel/process.cpp
index b400e6ce47..d857019094 100644
--- a/engines/ultima/ultima8/kernel/process.cpp
+++ b/engines/ultima/ultima8/kernel/process.cpp
@@ -146,6 +146,12 @@ bool Process::loadData(Common::ReadStream *rs, uint32 version) {
 	_type = rs->readUint16LE();
 	_result = rs->readUint32LE();
 	uint32 waitcount = rs->readUint32LE();
+
+	if (waitcount > 1024*1024) {
+		warning("Improbable waitcount %d for proc %d. Corrupt save?", waitcount, _pid);
+		return false;
+	}
+
 	_waiting.resize(waitcount);
 	for (unsigned int i = 0; i < waitcount; ++i)
 		_waiting[i] = rs->readUint16LE();
@@ -153,5 +159,21 @@ bool Process::loadData(Common::ReadStream *rs, uint32 version) {
 	return true;
 }
 
+bool Process::validateWaiters() const {
+	for (Std::vector<ProcId>::const_iterator i = _waiting.begin();
+			i != _waiting.end(); ++i) {
+		const Process *p = Kernel::get_instance()->getProcess(*i);
+		if (!p) {
+			// This can happen if a waiting process gets forcibly terminated.
+			warning("Invalid procid %d in waitlist for proc %d. Maybe a bug?", *i, _pid);
+		} else if (!p->is_suspended()) {
+			// This should never happen.
+			warning("Procid %d in waitlist for proc %d but not marked suspended", *i, _pid);
+			return false;
+		}
+	}
+	return true;
+}
+
 } // End of namespace Ultima8
 } // End of namespace Ultima
diff --git a/engines/ultima/ultima8/kernel/process.h b/engines/ultima/ultima8/kernel/process.h
index 43baf98f7e..3caf24fc81 100644
--- a/engines/ultima/ultima8/kernel/process.h
+++ b/engines/ultima/ultima8/kernel/process.h
@@ -120,6 +120,11 @@ public:
 	//! save Process data
 	virtual void saveData(Common::WriteStream *ws);
 
+	//! Check the waiting processes.  This is used after loading a game.
+	//! Ensures they are all valid processes and suspended.  Can't be done in
+	//! loadData because the waiters may not be loaded yet at that point.
+	bool validateWaiters() const;
+
 protected:
 	//! process id
 	ProcId _pid;
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 86f8c86cca..460d1906a3 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -1454,6 +1454,20 @@ bool Ultima8Engine::load(Common::ReadStream *rs, uint32 version) {
 
 	_hasCheated = (rs->readByte() != 0);
 
+	// Integrity checks
+	if (!_avatarMoverProcess) {
+		warning("No AvatarMoverProcess.  Corrupt savegame?");
+		return false;
+	}
+	if (pal->_transform >= Transform_Invalid) {
+		warning("Invalid palette transform %d.  Corrupt savegame?", static_cast<int>(pal->_transform));
+		return false;
+	}
+	if (_saveCount > 1024*1024) {
+		warning("Improbable savecount %d.  Corrupt savegame?", _saveCount);
+		return false;
+	}
+
 	return true;
 }
 


Commit: 0b9afc4a52c9f66a81875701efd08c4ce0e06689
    https://github.com/scummvm/scummvm/commit/0b9afc4a52c9f66a81875701efd08c4ce0e06689
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-05T14:31:58+09:00

Commit Message:
ULTIMA8: Correct parameter mixup writing usecode globals

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


diff --git a/engines/ultima/ultima8/usecode/uc_machine.cpp b/engines/ultima/ultima8/usecode/uc_machine.cpp
index 709e2e6d33..36bb4ddda6 100644
--- a/engines/ultima/ultima8/usecode/uc_machine.cpp
+++ b/engines/ultima/ultima8/usecode/uc_machine.cpp
@@ -2215,10 +2215,10 @@ bool UCMachine::assignPointer(uint32 ptr, const uint8 *data, uint32 size) {
 			CANT_HAPPEN_MSG("Global pointers not supported in U8");
 
 		if (size == 1) {
-			_globals->setEntries(offset, data[0], 1);
+			_globals->setEntries(offset, 1, data[0]);
 		} else if (size == 2) {
 			uint16 val = ((data[0] << 8) | data[1]);
-			_globals->setEntries(offset, val, 2);
+			_globals->setEntries(offset, 2, val);
 		} else {
 			CANT_HAPPEN_MSG("Global pointers must be size 1 or 2");
 		}


Commit: 02a5a1e2c6db9c91674c603ede9d00347a192ee5
    https://github.com/scummvm/scummvm/commit/02a5a1e2c6db9c91674c603ede9d00347a192ee5
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-05T14:31:58+09:00

Commit Message:
ULTIMA8: Wire up Crusader: No Remorse isFalling intrinsic

Changed paths:
    engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
    engines/ultima/ultima8/usecode/remorse_intrinsics.h


diff --git a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
index ae12114662..8808200256 100644
--- a/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
+++ b/engines/ultima/ultima8/convert/crusader/convert_usecode_crusader.h
@@ -222,7 +222,7 @@ const char* const ConvertUsecodeCrusader::_intrinsics[] = {
 	"void Actor::I_setDead(Actor *)", // part of same coff set 021, 060, 073, 0A0, 0A8, 0D8, 0E7, 135
 	"void I_playMovieCutsceneFullscreen(char *)", // same coff as 092
 	"void AudioProcess::I_playSFX(2 bytes)", // same coff as 0D4
-	"byte Actor::I_getField0x59Bit1(Actor *)",
+	"byte Actor::I_isFalling(Actor *)",
 	"int16 Item::I_getFamilyOfType(Item *)", // per pentagram notes, matches disasm.
 	"int16 Item::I_getNPCNum(Item *)", // part of same coff set 067, 06D, 089, 08E, 0AD, 0F8, 100, 102, 105, 107, 109, 10B, 10D, 10F, 111, 115, 11C, 123, 129
 	"int16 Item::I_getQLo(Item *)", // same as 02B based on same coff set 010, 02B, 066, 084, 0A1, 0AE, 0D9, 0EA
diff --git a/engines/ultima/ultima8/usecode/remorse_intrinsics.h b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
index 1b264ddccf..907fdea7f0 100644
--- a/engines/ultima/ultima8/usecode/remorse_intrinsics.h
+++ b/engines/ultima/ultima8/usecode/remorse_intrinsics.h
@@ -216,7 +216,7 @@ Intrinsic RemorseIntrinsics[] = {
 	Actor::I_setDead,
 	MovieGump::I_playMovieCutsceneAlt, // TODO: not exactly the same, Alt includes a fade.
 	AudioProcess::I_playSFX, // void Intrinsic0AA(2 bytes)
-	0, // int Actor::I_getFlag0x59Field1  Intrinsic0AB(4 bytes)
+	Actor::I_isFalling, // int Actor::I_getFlag0x59Field1  Intrinsic0AB(4 bytes)
 	Item::I_getFamilyOfType, // void Intrinsic0AC(2 bytes)
 	Item::I_getNpcNum, // based on same coff as 102 (-> variable name in TRIGGER::ordinal21)
 	Item::I_getQLo, // based on same coff set as 02B




More information about the Scummvm-git-logs mailing list