Changeset - r23276:c458bd8c3ba3
[Not reviewed]
master
0 3 0
Peter Nelson - 6 years ago 2019-01-31 20:54:15
peter1138@openttd.org
Fix #7119: When rotating a ship, apply an additional offset to avoid movement glitch.
3 files changed with 28 insertions and 0 deletions:
0 comments (0 inline, 0 general)
src/saveload/vehicle_sl.cpp
Show inline comments
 
@@ -375,6 +375,17 @@ void AfterLoadVehicles(bool part_of_load
 
			FOR_ALL_SHIPS(s) {
 
				s->rotation = s->direction;
 
			}
 
		} else {
 
			Ship *s;
 
			FOR_ALL_SHIPS(s) {
 
				if (s->rotation == s->direction) continue;
 
				/* In case we are rotating on gameload, set the rotation position to
 
				 * the current position, otherwise the applied workaround offset would
 
				 * be with respect to 0,0.
 
				 */
 
				s->rotation_x_pos = s->x_pos;
 
				s->rotation_y_pos = s->y_pos;
 
			}
 
		}
 
	}
 

	
src/ship.h
Show inline comments
 
@@ -29,6 +29,8 @@ struct Ship FINAL : public SpecializedVe
 
	TrackBitsByte state;    ///< The "track" the ship is following.
 
	ShipPathCache path;     ///< Cached path.
 
	DirectionByte rotation; ///< Visible direction.
 
	int16 rotation_x_pos;   ///< NOSAVE: X Position before rotation.
 
	int16 rotation_y_pos;   ///< NOSAVE: Y Position before rotation.
 

	
 
	/** We don't want GCC to zero our struct! It already is zeroed and has an index! */
 
	Ship() : SpecializedVehicleBase() {}
src/ship_cmd.cpp
Show inline comments
 
@@ -319,6 +319,15 @@ void Ship::UpdateDeltaXY()
 
	this->x_extent      = bb[1];
 
	this->y_extent      = bb[0];
 
	this->z_extent      = 6;
 

	
 
	if (this->direction != this->rotation) {
 
		/* If we are rotating, then it is possible the ship was moved to its next position. In that
 
		 * case, because we are still showing the old direction, the ship will appear to glitch sideways
 
		 * slightly. We can work around this by applying an additional offset to make the ship appear
 
		 * where it was before it moved. */
 
		this->x_offs -= this->x_pos - this->rotation_x_pos;
 
		this->y_offs -= this->y_pos - this->rotation_y_pos;
 
	}
 
}
 

	
 
/**
 
@@ -678,6 +687,9 @@ static void ShipController(Ship *v)
 
					/* Stop for rotation */
 
					v->cur_speed = 0;
 
					v->direction = new_direction;
 
					/* Remember our current location to avoid movement glitch */
 
					v->rotation_x_pos = v->x_pos;
 
					v->rotation_y_pos = v->y_pos;
 
					break;
 
			}
 
		}
 
@@ -704,6 +716,9 @@ getout:
 

	
 
reverse_direction:
 
	v->direction = ReverseDir(v->direction);
 
	/* Remember our current location to avoid movement glitch */
 
	v->rotation_x_pos = v->x_pos;
 
	v->rotation_y_pos = v->y_pos;
 
	v->cur_speed = 0;
 
	v->path.clear();
 
	goto getout;
0 comments (0 inline, 0 general)