[Scummvm-git-logs] scummvm master -> 831db854121dcef503e603dd7f1df751bd35abde
sluicebox
noreply at scummvm.org
Mon Aug 29 11:46:02 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
831db85412 SCI32: Implement accurate kMulDiv calculations
Commit: 831db854121dcef503e603dd7f1df751bd35abde
https://github.com/scummvm/scummvm/commit/831db854121dcef503e603dd7f1df751bd35abde
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2022-08-29T04:45:12-07:00
Commit Message:
SCI32: Implement accurate kMulDiv calculations
kMulDiv's behavior now matches SSCI and produces the same results.
Fixes LSL7 motion ocean, bug #10270
Changed paths:
engines/sci/engine/kmath.cpp
diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp
index 07dd0a308df..daf94ae76f5 100644
--- a/engines/sci/engine/kmath.cpp
+++ b/engines/sci/engine/kmath.cpp
@@ -274,9 +274,9 @@ reg_t kTimesCot(EngineState *s, int argc, reg_t *argv) {
#ifdef ENABLE_SCI32
reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) {
- int16 multiplicant = argv[0].toSint16();
- int16 multiplier = argv[1].toSint16();
- int16 denominator = argv[2].toSint16();
+ int multiplicant = argv[0].toSint16();
+ int multiplier = argv[1].toSint16();
+ int denominator = argv[2].toSint16();
// Sanity check...
if (!denominator) {
@@ -284,7 +284,11 @@ reg_t kMulDiv(EngineState *s, int argc, reg_t *argv) {
return NULL_REG;
}
- return make_reg(0, multiplicant * multiplier / denominator);
+ int result = (abs(multiplicant * multiplier) + abs(denominator) / 2) / abs(denominator);
+ if (multiplicant && ((multiplicant / abs(multiplicant)) * multiplier * denominator < 0))
+ result = -result;
+
+ return make_reg(0, (int16)result);
}
#endif
More information about the Scummvm-git-logs
mailing list