(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.

This commit is contained in:
rubidium
2007-01-10 18:56:51 +00:00
parent a332d10fd9
commit f35ed4bbc2
190 changed files with 2825 additions and 2208 deletions

View File

@@ -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;