diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h
index 984d6a94f..7e81a14fc 100644
--- a/source/games/sw/src/game.h
+++ b/source/games/sw/src/game.h
@@ -1299,7 +1299,7 @@ struct SWING
 struct SINE_WAVE_FLOOR
 {
     sectortype* sectp;
-    int floor_origz, ceiling_origz, range;
+    double floorOrigz, ceilingOrigz, Range;
     int16_t sintable_ndx, speed_shift;
     uint8_t flags;
 };
diff --git a/source/games/sw/src/save.cpp b/source/games/sw/src/save.cpp
index fa73048cf..9080da2d4 100644
--- a/source/games/sw/src/save.cpp
+++ b/source/games/sw/src/save.cpp
@@ -867,9 +867,9 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, SINE_WAVE_FLOOR& w
 
 	if (arc.BeginObject(keyname))
 	{
-		arc("floor_origz", w.floor_origz, def->floor_origz)
-			("ceiling_origz", w.ceiling_origz, def->ceiling_origz)
-			("range", w.range, def->range)
+		arc("floor_origz", w.floorOrigz, def->floorOrigz)
+			("ceiling_origz", w.ceilingOrigz, def->ceilingOrigz)
+			("range", w.Range, def->Range)
 			("sector", w.sectp, def->sectp)
 			("sintable_ndx", w.sintable_ndx, def->sintable_ndx)
 			("speed_shift", w.speed_shift, def->speed_shift)
diff --git a/source/games/sw/src/sector.cpp b/source/games/sw/src/sector.cpp
index d0db4f872..f1442e2ec 100644
--- a/source/games/sw/src/sector.cpp
+++ b/source/games/sw/src/sector.cpp
@@ -500,7 +500,7 @@ void SectorSetup(void)
             SINE_WAVE_FLOOR *swf;
             uint16_t swf_ndx = 0;
             short cnt = 0, sector_cnt;
-            int range;
+            double Range;
             int range_diff = 0;
             int wave_diff = 0;
             short peak_dist = 0;
@@ -536,9 +536,9 @@ void SectorSetup(void)
 
             swf->sectp = sectp;
             ASSERT(swf->sectp->hitag != 0);
-            swf->range = range = Z(swf->sectp->hitag);
-            swf->floor_origz = swf->sectp->int_floorz() - (range >> 2);
-            swf->ceiling_origz = swf->sectp->int_ceilingz() - (range >> 2);
+            swf->Range = Range = swf->sectp->hitag;
+            swf->floorOrigz = swf->sectp->floorz - (Range * 0.25);
+            swf->ceilingOrigz = swf->sectp->ceilingz- (Range * 0.25);
 
             // look for the rest by distance
             auto near_sectp = sectp, base_sectp = sectp;
@@ -558,10 +558,10 @@ void SectorSetup(void)
                         peak_dist = near_sectp->hitag;
 
                     swf->sectp = near_sectp;
-                    swf->floor_origz = swf->sectp->int_floorz() - (range >> 2);
-                    swf->ceiling_origz = swf->sectp->int_ceilingz() - (range >> 2);
-                    range -= range_diff;
-                    swf->range = range;
+					swf->floorOrigz = swf->sectp->floorz - (Range * 0.25);
+					swf->ceilingOrigz = swf->sectp->ceilingz- (Range * 0.25);
+                    Range -= range_diff * zmaptoworld;
+                    swf->Range = Range;
 
                     base_sectp = swf->sectp;
                     sector_cnt++;
@@ -604,16 +604,16 @@ void SectorSetup(void)
 
                     swf = &SineWaveFloor[NextSineWave][cnt];
 
-                    swf->range -= wave_diff;
+                    swf->Range -= wave_diff * zmaptoworld;
 
                     wave_diff += wave_diff;
 
-                    if (swf->range < Z(4))
-                        swf->range = Z(4);
+                    if (swf->Range < 4)
+                        swf->Range = 4;
 
                     // reset origz's based on new range
-                    swf->floor_origz = swf->sectp->int_floorz() - (swf->range >> 2);
-                    swf->ceiling_origz = swf->sectp->int_ceilingz() - (swf->range >> 2);
+                    swf->floorOrigz = swf->sectp->floorz - (swf->Range * 0.25);
+                    swf->ceilingOrigz = swf->sectp->ceilingz - (swf->Range * 0.25);
                 }
             }
 
@@ -2597,13 +2597,13 @@ void DoSineWaveFloor(void)
 
             if ((flags & SINE_FLOOR))
             {
-                newz = swf->floor_origz + MulScale(swf->range, bsin(swf->sintable_ndx), 14);
+                newz = swf->floorOrigz + swf->Range * BobVal(swf->sintable_ndx);
                 swf->sectp->set_int_floorz(newz);
             }
 
             if ((flags & SINE_CEILING))
             {
-                newz = swf->ceiling_origz + MulScale(swf->range, bsin(swf->sintable_ndx), 14);
+                newz = swf->ceilingOrigz + swf->Range * BobVal(swf->sintable_ndx);
                 swf->sectp->set_int_ceilingz(newz);
             }