[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