[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