aboutsummaryrefslogtreecommitdiff
path: root/engines/cge2/vga13h.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2014-08-01 11:16:39 -0400
committerPaul Gilbert2014-08-01 11:16:39 -0400
commit0d662566bd2706919e8ed9c7abf79c5f0767f591 (patch)
tree272143a3076f75a3bcc7e81e39f6ee62f29ffeae /engines/cge2/vga13h.cpp
parent6d278157e16927f483d6cc397c0fe2d959cf22bb (diff)
downloadscummvm-rg350-0d662566bd2706919e8ed9c7abf79c5f0767f591.tar.gz
scummvm-rg350-0d662566bd2706919e8ed9c7abf79c5f0767f591.tar.bz2
scummvm-rg350-0d662566bd2706919e8ed9c7abf79c5f0767f591.zip
CGE2: Further fixes to FXP operators to fix pathfinding
Diffstat (limited to 'engines/cge2/vga13h.cpp')
-rw-r--r--engines/cge2/vga13h.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/engines/cge2/vga13h.cpp b/engines/cge2/vga13h.cpp
index 9340abf09e..cdf683d380 100644
--- a/engines/cge2/vga13h.cpp
+++ b/engines/cge2/vga13h.cpp
@@ -45,6 +45,51 @@ void V3D::sync(Common::Serializer &s) {
_z.sync(s);
}
+FXP FXP::operator*(const FXP& x) const {
+ FXP y;
+ int32 t1 = (v >> 8) * x.v;
+ int32 t2 = (v & 0xFF) * x.v;
+
+ y.v = t1 + t2;
+ return y;
+}
+
+FXP FXP::operator/(const FXP& x) const {
+ FXP y;
+ if (x.v != 0) {
+ int32 v1 = this->v;
+ int32 v2 = x.v;
+ bool negFlag = false;
+
+ if (v1 < 0) {
+ v1 = -v1;
+ negFlag = true;
+ }
+ if (v2 < 0) {
+ v2 = -v2;
+ negFlag ^= true;
+ }
+
+ int32 v3 = v1 / v2;
+ v1 -= v3 * v2;
+ v3 <<= 8;
+
+ if (v1 < 0xFFFFFF) {
+ v1 <<= 8;
+ } else {
+ v2 >>= 8;
+ }
+ v3 += v1 / v2;
+
+ if (negFlag)
+ v3 = -v3;
+
+ y.v = v3;
+ }
+
+ return y;
+}
+
void FXP::sync(Common::Serializer &s) {
s.syncAsSint32LE(v);
}