summaryrefslogtreecommitdiff
path: root/src/ship_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ship_cmd.cpp')
-rw-r--r--src/ship_cmd.cpp74
1 files changed, 39 insertions, 35 deletions
diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp
index f72323915..78138612e 100644
--- a/src/ship_cmd.cpp
+++ b/src/ship_cmd.cpp
@@ -29,12 +29,18 @@
#include "date.h"
static const uint16 _ship_sprites[] = {0x0E5D, 0x0E55, 0x0E65, 0x0E6D};
-static const byte _ship_sometracks[4] = {0x19, 0x16, 0x25, 0x2A};
-static byte GetTileShipTrackStatus(TileIndex tile)
+static const TrackBits _ship_sometracks[4] = {
+ TRACK_BIT_X | TRACK_BIT_LOWER | TRACK_BIT_LEFT, // 0x19, // DIAGDIR_NE
+ TRACK_BIT_Y | TRACK_BIT_UPPER | TRACK_BIT_LEFT, // 0x16, // DIAGDIR_SE
+ TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT, // 0x25, // DIAGDIR_SW
+ TRACK_BIT_Y | TRACK_BIT_LOWER | TRACK_BIT_RIGHT, // 0x2A, // DIAGDIR_NW
+};
+
+static TrackBits GetTileShipTrackStatus(TileIndex tile)
{
uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER);
- return r | r >> 8;
+ return TrackdirBitsToTrackBits((TrackdirBits)(TRACKDIR_BIT_MASK & (r | r >> 8)));
}
void DrawShipEngine(int x, int y, EngineID engine, uint32 image_ormod)
@@ -77,7 +83,7 @@ static const Depot* FindClosestShipDepot(const Vehicle* v)
if (_patches.new_pathfinding_all) {
NPFFoundTargetData ftd;
- byte trackdir = GetVehicleTrackdir(v);
+ Trackdir trackdir = GetVehicleTrackdir(v);
ftd = NPFRouteToDepotTrialError(v->tile, trackdir, TRANSPORT_WATER, v->owner, INVALID_RAILTYPE);
if (ftd.best_bird_dist == 0) {
best_depot = GetDepotByTile(ftd.node.tile); /* Found target */
@@ -350,8 +356,8 @@ static void CheckShipLeaveDepot(Vehicle *v)
} else {
return;
}
- v->direction = GB(m, 0, 8);
- v->u.ship.state = GB(m, 8, 8);
+ v->direction = (Direction)GB(m, 0, 8);
+ v->u.ship.state = (TrackBits)GB(m, 8, 8);
v->vehstatus &= ~VS_HIDDEN;
v->cur_speed = 0;
@@ -447,10 +453,10 @@ static const byte _ship_search_directions[6][4] = {
static const byte _pick_shiptrack_table[6] = {1, 3, 2, 2, 0, 0};
-static uint FindShipTrack(Vehicle *v, TileIndex tile, int dir, uint bits, TileIndex skiptile, int *track)
+static uint FindShipTrack(Vehicle *v, TileIndex tile, DiagDirection dir, TrackBits bits, TileIndex skiptile, Track *track)
{
PathFindShip pfs;
- int i, best_track;
+ Track i, best_track;
uint best_bird_dist = 0;
uint best_length = 0;
uint r;
@@ -459,18 +465,17 @@ static uint FindShipTrack(Vehicle *v, TileIndex tile, int dir, uint bits, TileIn
pfs.dest_coords = v->dest_tile;
pfs.skiptile = skiptile;
- best_track = -1;
+ best_track = INVALID_TRACK;
do {
- i = FIND_FIRST_BIT(bits);
- bits = KILL_FIRST_BIT(bits);
+ i = RemoveFirstTrack(bits);
pfs.best_bird_dist = (uint)-1;
pfs.best_length = (uint)-1;
- FollowTrack(tile, 0x3800 | TRANSPORT_WATER, _ship_search_directions[i][dir], (TPFEnumProc*)ShipTrackFollower, NULL, &pfs);
+ FollowTrack(tile, 0x3800 | TRANSPORT_WATER, (DiagDirection)_ship_search_directions[i][dir], (TPFEnumProc*)ShipTrackFollower, NULL, &pfs);
- if (best_track >= 0) {
+ if (best_track != INVALID_TRACK) {
if (pfs.best_bird_dist != 0) {
/* neither reached the destination, pick the one with the smallest bird dist */
if (pfs.best_bird_dist > best_bird_dist) goto bad;
@@ -512,19 +517,19 @@ static inline NPFFoundTargetData PerfNPFRouteToStationOrTile(TileIndex tile, Tra
/* returns the track to choose on the next tile, or -1 when it's better to
* reverse. The tile given is the tile we are about to enter, enterdir is the
* direction in which we are entering the tile */
-static int ChooseShipTrack(Vehicle *v, TileIndex tile, int enterdir, uint tracks)
+static Track ChooseShipTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks)
{
assert(enterdir>=0 && enterdir<=3);
if (_patches.yapf.ship_use_yapf) {
Trackdir trackdir = YapfChooseShipTrack(v, tile, enterdir, tracks);
- return (trackdir != INVALID_TRACKDIR) ? (int)TrackdirToTrack(trackdir) : -1;
+ return (trackdir != INVALID_TRACKDIR) ? TrackdirToTrack(trackdir) : INVALID_TRACK;
} else if (_patches.new_pathfinding_all) {
NPFFindStationOrTileData fstd;
NPFFoundTargetData ftd;
TileIndex src_tile = TILE_ADD(tile, TileOffsByDiagDir(ReverseDiagDir(enterdir)));
- byte trackdir = GetVehicleTrackdir(v);
- assert (trackdir != 0xFF); /* Check that we are not in a depot */
+ Trackdir trackdir = GetVehicleTrackdir(v);
+ assert(trackdir != INVALID_TRACKDIR); /* Check that we are not in a depot */
NPFFillWithOrderData(&fstd, v);
@@ -535,21 +540,20 @@ static int ChooseShipTrack(Vehicle *v, TileIndex tile, int enterdir, uint tracks
the direction we need to take to get there, if ftd.best_bird_dist is not 0,
we did not find our target, but ftd.best_trackdir contains the direction leading
to the tile closest to our target. */
- return ftd.best_trackdir & 7; /* TODO: Wrapper function? */
+ return TrackdirToTrack(ftd.best_trackdir); /* TODO: Wrapper function? */
} else {
- return -1; /* Already at target, reverse? */
+ return INVALID_TRACK; /* Already at target, reverse? */
}
} else {
- uint b;
uint tot_dist, dist;
- int track;
+ Track track;
TileIndex tile2;
tile2 = TILE_ADD(tile, -TileOffsByDiagDir(enterdir));
tot_dist = (uint)-1;
/* Let's find out how far it would be if we would reverse first */
- b = GetTileShipTrackStatus(tile2) & _ship_sometracks[ReverseDiagDir(enterdir)] & v->u.ship.state;
+ TrackBits b = GetTileShipTrackStatus(tile2) & _ship_sometracks[ReverseDiagDir(enterdir)] & v->u.ship.state;
if (b != 0) {
dist = FindShipTrack(v, tile2, ReverseDiagDir(enterdir), b, tile, &track);
if (dist != (uint)-1)
@@ -559,18 +563,18 @@ static int ChooseShipTrack(Vehicle *v, TileIndex tile, int enterdir, uint tracks
dist = FindShipTrack(v, tile, enterdir, tracks, 0, &track);
if (dist > tot_dist)
/* We could better reverse */
- return -1;
+ return INVALID_TRACK;
return track;
}
}
static const Direction _new_vehicle_direction_table[] = {
- DIR_N , DIR_NW, DIR_W , 0,
- DIR_NE, DIR_N , DIR_SW, 0,
+ DIR_N , DIR_NW, DIR_W , INVALID_DIR,
+ DIR_NE, DIR_N , DIR_SW, INVALID_DIR,
DIR_E , DIR_SE, DIR_S
};
-static int ShipGetNewDirectionFromTiles(TileIndex new_tile, TileIndex old_tile)
+static Direction ShipGetNewDirectionFromTiles(TileIndex new_tile, TileIndex old_tile)
{
uint offs = (TileY(new_tile) - TileY(old_tile) + 1) * 4 +
TileX(new_tile) - TileX(old_tile) + 1;
@@ -578,17 +582,17 @@ static int ShipGetNewDirectionFromTiles(TileIndex new_tile, TileIndex old_tile)
return _new_vehicle_direction_table[offs];
}
-static int ShipGetNewDirection(Vehicle *v, int x, int y)
+static Direction ShipGetNewDirection(Vehicle *v, int x, int y)
{
uint offs = (y - v->y_pos + 1) * 4 + (x - v->x_pos + 1);
assert(offs < 11 && offs != 3 && offs != 7);
return _new_vehicle_direction_table[offs];
}
-static int GetAvailShipTracks(TileIndex tile, int dir)
+static TrackBits GetAvailShipTracks(TileIndex tile, int dir)
{
uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER);
- return (byte) ((r | r >> 8)) & _ship_sometracks[dir];
+ return (TrackBits)((r | r >> 8) & _ship_sometracks[dir]);
}
static const byte _ship_subcoord[4][6][3] = {
@@ -632,8 +636,8 @@ static void ShipController(Vehicle *v)
uint32 r;
const byte *b;
Direction dir;
- int track;
- int tracks;
+ Track track;
+ TrackBits tracks;
v->tick_counter++;
@@ -737,7 +741,7 @@ static void ShipController(Vehicle *v)
// Choose a direction, and continue if we find one
track = ChooseShipTrack(v, gp.new_tile, diagdir, tracks);
- if (track < 0)
+ if (track == INVALID_TRACK)
goto reverse_direction;
b = _ship_subcoord[diagdir][track];
@@ -751,10 +755,10 @@ static void ShipController(Vehicle *v)
if (!(r&0x4)) {
v->tile = gp.new_tile;
- v->u.ship.state = 1 << track;
+ v->u.ship.state = TrackToTrackBits(track);
}
- v->direction = b[2];
+ v->direction = (Direction)b[2];
}
/* update image of ship, as well as delta XY */
@@ -872,7 +876,7 @@ int32 CmdBuildShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
_new_vehicle_id = v->index;
v->string_id = STR_SV_SHIP_NAME;
- v->u.ship.state = 0x80;
+ v->u.ship.state = TRACK_BIT_SPECIAL;
v->service_interval = _patches.servint_ships;
v->date_of_last_service = _date;