Changeset - r26245:d7f5ec275f43
[Not reviewed]
master
0 1 0
Niels Martin Hansen - 2 years ago 2022-05-06 10:50:30
nielsm@indvikleren.dk
Codechange: Document the _ship_subcoord table
1 file changed with 44 insertions and 30 deletions:
0 comments (0 inline, 0 general)
src/ship_cmd.cpp
Show inline comments
 
@@ -516,38 +516,53 @@ static inline TrackBits GetAvailShipTrac
 
	return tracks;
 
}
 

	
 
static const byte _ship_subcoord[4][6][3] = {
 
/** Structure for ship sub-coordinate data for moving into a new tile via a Diagdir onto a Track. */
 
struct ShipSubcoordData {
 
	byte x_subcoord; ///< New X sub-coordinate on the new tile
 
	byte y_subcoord; ///< New Y sub-coordinate on the new tile
 
	Direction dir;   ///< New Direction to move in on the new track
 
};
 
/** Ship sub-coordinate data for moving into a new tile via a Diagdir onto a Track.
 
 * Array indexes are Diagdir, Track.
 
 * There will always be three possible tracks going into an adjacent tile via a Diagdir,
 
 * so each Diagdir sub-array will have three valid and three invalid structures per Track.
 
 */
 
static const ShipSubcoordData _ship_subcoord[DIAGDIR_END][TRACK_END] = {
 
	// DIAGDIR_NE
 
	{
 
		{15, 8, 1},
 
		{ 0, 0, 0},
 
		{ 0, 0, 0},
 
		{15, 8, 2},
 
		{15, 7, 0},
 
		{ 0, 0, 0},
 
		{15,  8, DIR_NE},      // TRACK_X
 
		{ 0,  0, INVALID_DIR}, // TRACK_Y
 
		{ 0,  0, INVALID_DIR}, // TRACK_UPPER
 
		{15,  8, DIR_E},       // TRACK_LOWER
 
		{15,  7, DIR_N},       // TRACK_LEFT
 
		{ 0,  0, INVALID_DIR}, // TRACK_RIGHT
 
	},
 
	// DIAGDIR_SE
 
	{
 
		{ 0, 0, 0},
 
		{ 8, 0, 3},
 
		{ 7, 0, 2},
 
		{ 0, 0, 0},
 
		{ 8, 0, 4},
 
		{ 0, 0, 0},
 
		{ 0,  0, INVALID_DIR}, // TRACK_X
 
		{ 8,  0, DIR_SE},      // TRACK_Y
 
		{ 7,  0, DIR_E},       // TRACK_UPPER
 
		{ 0,  0, INVALID_DIR}, // TRACK_LOWER
 
		{ 8,  0, DIR_S},       // TRACK_LEFT
 
		{ 0,  0, INVALID_DIR}, // TRACK_RIGHT
 
	},
 
	// DIAGDIR_SW
 
	{
 
		{ 0, 8, 5},
 
		{ 0, 0, 0},
 
		{ 0, 7, 6},
 
		{ 0, 0, 0},
 
		{ 0, 0, 0},
 
		{ 0, 8, 4},
 
		{ 0,  8, DIR_SW},      // TRACK_X
 
		{ 0,  0, INVALID_DIR}, // TRACK_Y
 
		{ 0,  7, DIR_W},       // TRACK_UPPER
 
		{ 0,  0, INVALID_DIR}, // TRACK_LOWER
 
		{ 0,  0, INVALID_DIR}, // TRACK_LEFT
 
		{ 0,  8, DIR_S},       // TRACK_RIGHT
 
	},
 
	// DIAGDIR_NW
 
	{
 
		{ 0, 0, 0},
 
		{ 8, 15, 7},
 
		{ 0, 0, 0},
 
		{ 8, 15, 6},
 
		{ 0, 0, 0},
 
		{ 7, 15, 0},
 
		{ 0,  0, INVALID_DIR}, // TRACK_X
 
		{ 8, 15, DIR_NW},      // TRACK_Y
 
		{ 0,  0, INVALID_DIR}, // TRACK_UPPER
 
		{ 8, 15, DIR_W},       // TRACK_LOWER
 
		{ 0,  0, INVALID_DIR}, // TRACK_LEFT
 
		{ 7, 15, DIR_N},       // TRACK_RIGHT
 
	}
 
};
 

	
 
@@ -627,7 +642,6 @@ bool IsShipDestinationTile(TileIndex til
 
static void ShipController(Ship *v)
 
{
 
	uint32 r;
 
	const byte *b;
 
	Track track;
 
	TrackBits tracks;
 
	GetNewVehiclePosResult gp;
 
@@ -744,10 +758,10 @@ static void ShipController(Ship *v)
 
			track = ChooseShipTrack(v, gp.new_tile, diagdir, tracks);
 
			if (track == INVALID_TRACK) goto reverse_direction;
 

	
 
			b = _ship_subcoord[diagdir][track];
 
			const ShipSubcoordData &b = _ship_subcoord[diagdir][track];
 

	
 
			gp.x = (gp.x & ~0xF) | b[0];
 
			gp.y = (gp.y & ~0xF) | b[1];
 
			gp.x = (gp.x & ~0xF) | b.x_subcoord;
 
			gp.y = (gp.y & ~0xF) | b.y_subcoord;
 

	
 
			/* Call the landscape function and tell it that the vehicle entered the tile */
 
			r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
 
@@ -763,7 +777,7 @@ static void ShipController(Ship *v)
 
				if (old_wc != new_wc) v->UpdateCache();
 
			}
 

	
 
			Direction new_direction = (Direction)b[2];
 
			Direction new_direction = b.dir;
 
			DirDiff diff = DirDifference(new_direction, v->direction);
 
			switch (diff) {
 
				case DIRDIFF_SAME:
0 comments (0 inline, 0 general)