(svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends

pull/155/head
tron 19 years ago
parent 3027b8673e
commit 8cfcdaa733

@ -5,6 +5,7 @@
#include "../../debug.h"
#include "../../functions.h"
#include "../../map.h"
#include "../../road_map.h"
#include "../../tile.h"
#include "../../command.h"
#include "trolly.h"
@ -255,9 +256,8 @@ int AiNew_Build_Vehicle(Player *p, TileIndex tile, byte flag)
return AI_DoCommand(tile, i, 0, flag, CMD_BUILD_ROAD_VEH);
}
int AiNew_Build_Depot(Player *p, TileIndex tile, byte direction, byte flag)
int AiNew_Build_Depot(Player* p, TileIndex tile, DiagDirection direction, byte flag)
{
static const byte _roadbits_by_dir[4] = {2,1,8,4};
int ret, ret2;
if (p->ainew.tbt == AI_TRAIN)
return AI_DoCommand(tile, 0, direction, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_TRAIN_DEPOT);
@ -265,7 +265,7 @@ int AiNew_Build_Depot(Player *p, TileIndex tile, byte direction, byte flag)
ret = AI_DoCommand(tile, direction, 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_DEPOT);
if (CmdFailed(ret)) return ret;
// Try to build the road from the depot
ret2 = AI_DoCommand(tile + TileOffsByDir(direction), _roadbits_by_dir[direction], 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD);
ret2 = AI_DoCommand(tile + TileOffsByDir(direction), DiagDirToRoadBits(ReverseDiagDir(direction)), 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD);
// If it fails, ignore it..
if (CmdFailed(ret2)) return ret;
return ret + ret2;

@ -372,7 +372,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
extern uint GetRailFoundation(uint tileh, uint bits);
extern uint GetRoadFoundation(uint tileh, uint bits);
extern uint GetBridgeFoundation(uint tileh, byte direction);
extern uint GetBridgeFoundation(uint tileh, Axis); // XXX function declaration in .c
enum {
BRIDGE_NO_FOUNDATION = 1 << 0 | 1 << 3 | 1 << 6 | 1 << 9 | 1 << 12,
};

@ -1024,7 +1024,6 @@ static void AiNew_State_BuildPath(Player *p)
// This means we are done building!
if (p->ainew.tbt == AI_TRUCK && !_patches.roadveh_queue) {
static const byte _roadbits_by_dir[4] = {2,1,8,4};
// If they not queue, they have to go up and down to try again at a station...
// We don't want that, so try building some road left or right of the station
int dir1, dir2, dir3;
@ -1047,7 +1046,7 @@ static void AiNew_State_BuildPath(Player *p)
dir3 = p->ainew.to_direction;
}
ret = AI_DoCommand(tile, _roadbits_by_dir[dir1], 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
ret = AI_DoCommand(tile, DiagDirToRoadBits(ReverseDiagDir(dir1)), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
if (!CmdFailed(ret)) {
dir1 = TileOffsByDir(dir1);
if (IsTileType(tile + dir1, MP_CLEAR) || IsTileType(tile + dir1, MP_TREES)) {
@ -1059,7 +1058,7 @@ static void AiNew_State_BuildPath(Player *p)
}
}
ret = AI_DoCommand(tile, _roadbits_by_dir[dir2], 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
ret = AI_DoCommand(tile, DiagDirToRoadBits(ReverseDiagDir(dir2)), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
if (!CmdFailed(ret)) {
dir2 = TileOffsByDir(dir2);
if (IsTileType(tile + dir2, MP_CLEAR) || IsTileType(tile + dir2, MP_TREES)) {
@ -1071,7 +1070,7 @@ static void AiNew_State_BuildPath(Player *p)
}
}
ret = AI_DoCommand(tile, _roadbits_by_dir[dir3^2], 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
ret = AI_DoCommand(tile, DiagDirToRoadBits(dir3), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
if (!CmdFailed(ret)) {
dir3 = TileOffsByDir(dir3);
if (IsTileType(tile + dir3, MP_CLEAR) || IsTileType(tile + dir3, MP_TREES)) {

@ -256,6 +256,6 @@ int AiNew_Build_Bridge(Player *p, TileIndex tile_a, TileIndex tile_b, byte flag)
int AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte flag);
int AiNew_PickVehicle(Player *p);
int AiNew_Build_Vehicle(Player *p, TileIndex tile, byte flag);
int AiNew_Build_Depot(Player *p, TileIndex tile, byte direction, byte flag);
int AiNew_Build_Depot(Player* p, TileIndex tile, DiagDirection direction, byte flag);
#endif /* AI_TROLLY_H */

@ -91,7 +91,7 @@ static bool HaveHangarInOrderList(Vehicle *v)
}
#endif
int GetAircraftImage(const Vehicle *v, byte direction)
int GetAircraftImage(const Vehicle* v, Direction direction)
{
int spritenum = v->spritenum;

@ -65,7 +65,7 @@ void DrawAircraftPurchaseInfo(int x, int y, EngineID engine_number)
static void DrawAircraftImage(const Vehicle *v, int x, int y, VehicleID selection)
{
PalSpriteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
DrawSprite(GetAircraftImage(v, 6) | pal, x + 25, y + 10);
DrawSprite(GetAircraftImage(v, DIR_W) | pal, x + 25, y + 10);
if (v->subtype == 0) DrawSprite(SPR_ROTOR_STOPPED, x + 25, y + 5);
if (v->index == selection) {
DrawFrameRect(x - 1, y - 1, x + 58, y + 21, 0xF, FR_BORDERONLY);
@ -730,7 +730,7 @@ static void AircraftDepotClickAircraft(Window *w, int x, int y)
if (v != NULL) {
WP(w,traindepot_d).sel = v->index;
SetWindowDirty(w);
SetObjectToPlaceWnd(GetVehiclePalette(v) | GetAircraftImage(v, 6), 4, w);
SetObjectToPlaceWnd(GetVehiclePalette(v) | GetAircraftImage(v, DIR_W), 4, w);
}
break;

@ -17,6 +17,11 @@ typedef enum Direction {
INVALID_DIR = 0xFF,
} Direction;
static inline Direction ReverseDir(Direction d)
{
return (Direction)(4 ^ d);
}
/* Direction commonly used as the direction of entering and leaving tiles, 4-way */
typedef enum DiagDirection {

@ -74,7 +74,7 @@ static void DisasterVehicleUpdateImage(Vehicle *v)
v->cur_image = img;
}
static void InitializeDisasterVehicle(Vehicle *v, int x, int y, byte z, byte direction, byte subtype)
static void InitializeDisasterVehicle(Vehicle* v, int x, int y, byte z, Direction direction, byte subtype)
{
v->type = VEH_Disaster;
v->x_pos = x;
@ -552,7 +552,7 @@ static void DisasterTick_4(Vehicle *v)
return;
}
InitializeDisasterVehicle(u, -6*16, v->y_pos, 135, 5, 11);
InitializeDisasterVehicle(u, -6 * 16, v->y_pos, 135, DIR_SW, 11);
u->u.disaster.unk2 = v->index;
w = ForceAllocateSpecialVehicle();
@ -560,7 +560,7 @@ static void DisasterTick_4(Vehicle *v)
return;
u->next = w;
InitializeDisasterVehicle(w, -6*16, v->y_pos, 0, 5, 12);
InitializeDisasterVehicle(w, -6 * 16, v->y_pos, 0, DIR_SW, 12);
w->vehstatus |= VS_DISASTER;
} else if (v->current_order.station < 1) {
@ -720,13 +720,13 @@ static void Disaster0_Init(void)
}
}
InitializeDisasterVehicle(v, x, 0, 135, 3, 0);
InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, 0);
// Allocate shadow too?
u = ForceAllocateSpecialVehicle();
if (u != NULL) {
v->next = u;
InitializeDisasterVehicle(u, x, 0, 0, 3, 1);
InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, 1);
u->vehstatus |= VS_DISASTER;
}
}
@ -741,7 +741,7 @@ static void Disaster1_Init(void)
x = TileX(Random()) * 16 + 8;
InitializeDisasterVehicle(v, x, 0, 135, 3, 2);
InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, 2);
v->dest_tile = TileXY(MapSizeX() / 2, MapSizeY() / 2);
v->age = 0;
@ -749,7 +749,7 @@ static void Disaster1_Init(void)
u = ForceAllocateSpecialVehicle();
if (u != NULL) {
v->next = u;
InitializeDisasterVehicle(u,x,0,0,3,3);
InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, 3);
u->vehstatus |= VS_DISASTER;
}
}
@ -780,12 +780,12 @@ static void Disaster2_Init(void)
x = (MapSizeX() + 9) * 16 - 1;
y = TileY(found->xy) * 16 + 37;
InitializeDisasterVehicle(v,x,y, 135,1,4);
InitializeDisasterVehicle(v, x, y, 135, DIR_NE, 4);
u = ForceAllocateSpecialVehicle();
if (u != NULL) {
v->next = u;
InitializeDisasterVehicle(u,x,y,0,3,5);
InitializeDisasterVehicle(u, x, y, 0, DIR_SE, 5);
u->vehstatus |= VS_DISASTER;
}
}
@ -816,18 +816,18 @@ static void Disaster3_Init(void)
x = -16 * 16;
y = TileY(found->xy) * 16 + 37;
InitializeDisasterVehicle(v,x,y, 135,5,6);
InitializeDisasterVehicle(v, x, y, 135, DIR_SW, 6);
u = ForceAllocateSpecialVehicle();
if (u != NULL) {
v->next = u;
InitializeDisasterVehicle(u,x,y,0,5,7);
InitializeDisasterVehicle(u, x, y, 0, DIR_SW, 7);
u->vehstatus |= VS_DISASTER;
w = ForceAllocateSpecialVehicle();
if (w != NULL) {
u->next = w;
InitializeDisasterVehicle(w,x,y,140,5,8);
InitializeDisasterVehicle(w, x, y, 140, DIR_SW, 8);
}
}
}
@ -842,7 +842,7 @@ static void Disaster4_Init(void)
x = TileX(Random()) * 16 + 8;
y = MapMaxX() * 16 - 1;
InitializeDisasterVehicle(v, x, y, 135, 7, 9);
InitializeDisasterVehicle(v, x, y, 135, DIR_NW, 9);
v->dest_tile = TileXY(MapSizeX() / 2, MapSizeY() / 2);
v->age = 0;
@ -850,7 +850,7 @@ static void Disaster4_Init(void)
u = ForceAllocateSpecialVehicle();
if (u != NULL) {
v->next = u;
InitializeDisasterVehicle(u,x,y,0,7,10);
InitializeDisasterVehicle(u, x, y, 0, DIR_NW, 10);
u->vehstatus |= VS_DISASTER;
}
}
@ -860,7 +860,7 @@ static void Disaster5_Init(void)
{
Vehicle *v = ForceAllocateSpecialVehicle();
int x,y;
byte dir;
Direction dir;
uint32 r;
if (v == NULL) return;
@ -868,10 +868,14 @@ static void Disaster5_Init(void)
r = Random();
x = TileX(r) * 16 + 8;
y = 8;
dir = 3;
if (r & 0x80000000) { y = MapMaxX() * 16 - 8 - 1; dir = 7; }
InitializeDisasterVehicle(v, x, y, 0, dir,13);
if (r & 0x80000000) {
y = MapMaxX() * 16 - 8 - 1;
dir = DIR_NW;
} else {
y = 8;
dir = DIR_SE;
}
InitializeDisasterVehicle(v, x, y, 0, dir, 13);
v->age = 0;
}
@ -880,7 +884,7 @@ static void Disaster6_Init(void)
{
Vehicle *v = ForceAllocateSpecialVehicle();
int x,y;
byte dir;
Direction dir;
uint32 r;
if (v == NULL) return;
@ -888,10 +892,14 @@ static void Disaster6_Init(void)
r = Random();
x = TileX(r) * 16 + 8;
y = 8;
dir = 3;
if (r & 0x80000000) { y = MapMaxX() * 16 - 8 - 1; dir = 7; }
InitializeDisasterVehicle(v, x, y, 0, dir,14);
if (r & 0x80000000) {
y = MapMaxX() * 16 - 8 - 1;
dir = DIR_NW;
} else {
y = 8;
dir = DIR_SE;
}
InitializeDisasterVehicle(v, x, y, 0, dir, 14);
v->age = 0;
}

@ -18,7 +18,7 @@
static void ShowBuildDockStationPicker(void);
static void ShowBuildDocksDepotPicker(void);
static byte _ship_depot_direction;
static Axis _ship_depot_direction;
void CcBuildDocks(bool success, TileIndex tile, uint32 p1, uint32 p2)
{
@ -293,7 +293,7 @@ static void ShowBuildDockStationPicker(void)
static void UpdateDocksDirection(void)
{
if (_ship_depot_direction != 0) {
if (_ship_depot_direction != AXIS_X) {
SetTileSelectSize(1, 2);
} else {
SetTileSelectSize(2, 1);
@ -362,5 +362,5 @@ static void ShowBuildDocksDepotPicker(void)
void InitializeDockGui(void)
{
_ship_depot_direction = 0;
_ship_depot_direction = AXIS_X;
}

@ -907,7 +907,7 @@ static bool IsBadFarmFieldTile2(TileIndex tile)
}
}
static void SetupFarmFieldFence(TileIndex tile, int size, byte type, int direction)
static void SetupFarmFieldFence(TileIndex tile, int size, byte type, Axis direction)
{
do {
tile = TILE_MASK(tile);
@ -917,14 +917,14 @@ static void SetupFarmFieldFence(TileIndex tile, int size, byte type, int directi
if (or == 1 && CHANCE16(1, 7)) or = 2;
if (direction) {
SetFenceSW(tile, or);
} else {
if (direction == AXIS_X) {
SetFenceSE(tile, or);
} else {
SetFenceSW(tile, or);
}
}
tile += direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
tile += (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
} while (--size);
}
@ -984,10 +984,10 @@ static void PlantFarmField(TileIndex tile)
type = _plantfarmfield_type[Random() & 0xF];
}
SetupFarmFieldFence(tile - TileDiffXY(1, 0), size_y, type, 1);
SetupFarmFieldFence(tile - TileDiffXY(0, 1), size_x, type, 0);
SetupFarmFieldFence(tile + TileDiffXY(size_x - 1, 0), size_y, type, 1);
SetupFarmFieldFence(tile + TileDiffXY(0, size_y - 1), size_x, type, 0);
SetupFarmFieldFence(tile - TileDiffXY(1, 0), size_y, type, AXIS_Y);
SetupFarmFieldFence(tile - TileDiffXY(0, 1), size_x, type, AXIS_X);
SetupFarmFieldFence(tile + TileDiffXY(size_x - 1, 0), size_y, type, AXIS_Y);
SetupFarmFieldFence(tile + TileDiffXY(0, size_y - 1), size_x, type, AXIS_X);
}
static void MaybePlantFarmField(const Industry* i)

@ -388,7 +388,7 @@ static const SpriteGroup *GetVehicleSpriteGroup(EngineID engine, const Vehicle *
return group;
}
int GetCustomEngineSprite(EngineID engine, const Vehicle *v, byte direction)
int GetCustomEngineSprite(EngineID engine, const Vehicle* v, Direction direction)
{
const SpriteGroup *group;
const RealSpriteGroup *rsg;

@ -3,6 +3,8 @@
#ifndef NEWGRF_ENGINE_H
#define NEWGRF_ENGINE_H
#include "direction.h"
/** @file newgrf_engine.h
*/
@ -15,7 +17,7 @@ VARDEF const uint32 cargo_classes[16];
void SetWagonOverrideSprites(EngineID engine, struct SpriteGroup *group, byte *train_id, int trains);
void SetCustomEngineSprites(EngineID engine, byte cargo, struct SpriteGroup *group);
// loaded is in percents, overriding_engine 0xffff is none
int GetCustomEngineSprite(EngineID engine, const Vehicle *v, byte direction);
int GetCustomEngineSprite(EngineID engine, const Vehicle* v, Direction direction);
uint16 GetCallBackResult(uint16 callback_info, EngineID engine, const Vehicle *v);
bool UsesWagonOverride(const Vehicle *v);
#define GetCustomVehicleSprite(v, direction) GetCustomEngineSprite(v->engine_type, v, direction)

@ -210,7 +210,7 @@ static const int8 _get_tunlen_inc[5] = { -16, 0, 16, 0, -16 };
/* Returns the end tile and the length of a tunnel. The length does not
* include the starting tile (entry), it does include the end tile (exit).
*/
FindLengthOfTunnelResult FindLengthOfTunnel(TileIndex tile, uint direction)
FindLengthOfTunnelResult FindLengthOfTunnel(TileIndex tile, DiagDirection direction)
{
FindLengthOfTunnelResult flotr;
int x,y;
@ -246,7 +246,7 @@ FindLengthOfTunnelResult FindLengthOfTunnel(TileIndex tile, uint direction)
static const uint16 _tpfmode1_and[4] = { 0x1009, 0x16, 0x520, 0x2A00 };
static uint SkipToEndOfTunnel(TrackPathFinder *tpf, TileIndex tile, int direction)
static uint SkipToEndOfTunnel(TrackPathFinder* tpf, TileIndex tile, DiagDirection direction)
{
FindLengthOfTunnelResult flotr;
TPFSetTileBit(tpf, tile, 14);

@ -1788,8 +1788,8 @@ bool UpdateSignalsOnSegment(TileIndex tile, Direction dir)
void SetSignalsOnBothDir(TileIndex tile, byte track)
{
static const byte _search_dir_1[6] = {1, 3, 1, 3, 5, 3};
static const byte _search_dir_2[6] = {5, 7, 7, 5, 7, 1};
static const Direction _search_dir_1[] = { DIR_NE, DIR_SE, DIR_NE, DIR_SE, DIR_SW, DIR_SE };
static const Direction _search_dir_2[] = { DIR_SW, DIR_NW, DIR_NW, DIR_SW, DIR_NW, DIR_NE };
UpdateSignalsOnSegment(tile, _search_dir_1[track]);
UpdateSignalsOnSegment(tile, _search_dir_2[track]);
@ -2069,15 +2069,13 @@ static const byte _deltacoord_leaveoffset[8] = {
-1, 0, 1, 0, /* x */
0, 1, 0, -1 /* y */
};
static const byte _enter_directions[4] = {5, 7, 1, 3};
static const byte _leave_directions[4] = {1, 3, 5, 7};
static const byte _depot_track_mask[4] = {1, 2, 1, 2};
static uint32 VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y)
{
byte fract_coord;
byte fract_coord_leave;
int dir;
DiagDirection dir;
int length;
// this routine applies only to trains in depot tiles
@ -2102,11 +2100,11 @@ static uint32 VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y)
/* make sure a train is not entering the tile from behind */
return 8;
} else if (_fractcoords_enter[dir] == fract_coord) {
if (_enter_directions[dir] == v->direction) {
if (DiagDirToDir(ReverseDiagDir(dir)) == v->direction) {
/* enter the depot */
v->u.rail.track = 0x80,
v->vehstatus |= VS_HIDDEN; /* hide it */
v->direction ^= 4;
v->direction = ReverseDir(v->direction);
if (v->next == NULL)
TrainEnterDepot(v, tile);
v->tile = tile;
@ -2114,7 +2112,7 @@ static uint32 VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y)
return 4;
}
} else if (fract_coord_leave == fract_coord) {
if (_leave_directions[dir] == v->direction) {
if (DiagDirToDir(dir) == v->direction) {
/* leave the depot? */
if ((v = v->next) != NULL) {
v->vehstatus &= ~VS_HIDDEN;

@ -23,7 +23,7 @@
static RailType _cur_railtype;
static bool _remove_button_clicked;
static byte _build_depot_direction;
static DiagDirection _build_depot_direction;
static byte _waypoint_count = 1;
static byte _cur_waypoint_type;
@ -101,7 +101,7 @@ static const uint16 _place_depot_extra[12] = {
void CcRailDepot(bool success, TileIndex tile, uint32 p1, uint32 p2)
{
if (success) {
int dir = p2;
DiagDirection dir = p2;
SndPlayTileFx(SND_20_SPLAT_2, tile);
ResetObjectToPlace();
@ -901,7 +901,7 @@ static void ShowBuildWaypointPicker(void)
void InitializeRailGui(void)
{
_build_depot_direction = 3;
_build_depot_direction = DIAGDIR_NW;
_railstation.numtracks = 1;
_railstation.platlength = 1;
_railstation.dragdrop = true;

@ -60,7 +60,7 @@ static const uint16 _road_pf_table_3[4] = {
0x910, 0x1600, 0x2005, 0x2A
};
int GetRoadVehImage(const Vehicle *v, byte direction)
int GetRoadVehImage(const Vehicle* v, Direction direction)
{
int img = v->spritenum;
int image;
@ -718,7 +718,7 @@ typedef struct RoadVehFindData {
int x;
int y;
const Vehicle* veh;
byte dir;
Direction dir;
} RoadVehFindData;
static void* EnumCheckRoadVehClose(Vehicle *v, void* data)
@ -744,7 +744,7 @@ static void* EnumCheckRoadVehClose(Vehicle *v, void* data)
v : NULL;
}
static Vehicle *RoadVehFindCloseTo(Vehicle *v, int x, int y, byte dir)
static Vehicle* RoadVehFindCloseTo(Vehicle* v, int x, int y, Direction dir)
{
RoadVehFindData rvf;
Vehicle *u;
@ -833,12 +833,12 @@ static bool RoadVehAccelerate(Vehicle *v)
return (t < v->progress);
}
static byte RoadVehGetNewDirection(Vehicle *v, int x, int y)
static Direction RoadVehGetNewDirection(const Vehicle* v, int x, int y)
{
static const byte _roadveh_new_dir[11] = {
0, 7, 6, 0,
1, 0, 5, 0,
2, 3, 4
static const Direction _roadveh_new_dir[] = {
DIR_N , DIR_NW, DIR_W , 0,
DIR_NE, DIR_N , DIR_SW, 0,
DIR_E , DIR_SE, DIR_S
};
x = x - v->x_pos + 1;
@ -848,10 +848,11 @@ static byte RoadVehGetNewDirection(Vehicle *v, int x, int y)
return _roadveh_new_dir[y * 4 + x];
}
static byte RoadVehGetSlidingDirection(Vehicle *v, int x, int y)
static Direction RoadVehGetSlidingDirection(const Vehicle* v, int x, int y)
{
byte b = RoadVehGetNewDirection(v, x, y);
byte d = v->direction;
Direction b = RoadVehGetNewDirection(v, x, y);
Direction d = v->direction;
if (b == d) return d;
d = (d + 1) & 7;
if (b == d) return d;
@ -980,7 +981,7 @@ static bool EnumRoadTrackFindDist(TileIndex tile, void* data, int track, uint le
// Returns direction to choose
// or -1 if the direction is currently blocked
static int RoadFindPathToDest(Vehicle *v, TileIndex tile, int enterdir)
static int RoadFindPathToDest(Vehicle* v, TileIndex tile, DiagDirection enterdir)
{
#define return_track(x) {best_track = x; goto found_best_track; }
@ -1154,7 +1155,8 @@ static const byte _roadveh_data_2[4] = { 0,1,8,9 };
static void RoadVehController(Vehicle *v)
{
byte new_dir, old_dir;
Direction new_dir;
Direction old_dir;
RoadDriveEntry rd;
int x,y;
uint32 r;
@ -1273,7 +1275,7 @@ static void RoadVehController(Vehicle *v)
TileIndex tile = v->tile + TileOffsByDir(rd.x & 3);
int dir = RoadFindPathToDest(v, tile, rd.x & 3);
uint32 r;
byte newdir;
Direction newdir;
const RoadDriveEntry *rdp;
if (dir == -1) {
@ -1339,7 +1341,7 @@ again:
int dir = RoadFindPathToDest(v, v->tile, rd.x & 3);
uint32 r;
int tmp;
byte newdir;
Direction newdir;
const RoadDriveEntry *rdp;
if (dir == -1) {

@ -65,7 +65,7 @@ void DrawRoadVehPurchaseInfo(int x, int y, EngineID engine_number)
static void DrawRoadVehImage(const Vehicle *v, int x, int y, VehicleID selection)
{
PalSpriteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
DrawSprite(GetRoadVehImage(v, 6) | pal, x + 14, y + 6);
DrawSprite(GetRoadVehImage(v, DIR_W) | pal, x + 14, y + 6);
if (v->index == selection) {
DrawFrameRect(x - 1, y - 1, x + 28, y + 12, 15, FR_BORDERONLY);
@ -636,7 +636,7 @@ static void RoadDepotClickVeh(Window *w, int x, int y)
if (v != NULL) {
WP(w,traindepot_d).sel = v->index;
SetWindowDirty(w);
SetObjectToPlaceWnd(GetVehiclePalette(v) | GetRoadVehImage(v, 6), 4, w);
SetObjectToPlaceWnd(GetVehiclePalette(v) | GetRoadVehImage(v, DIR_W), 4, w);
}
break;

@ -44,7 +44,7 @@ void DrawShipEngine(int x, int y, EngineID engine, uint32 image_ormod)
DrawSprite((6 + _ship_sprites[spritenum]) | image_ormod, x, y);
}
int GetShipImage(const Vehicle *v, byte direction)
int GetShipImage(const Vehicle* v, Direction direction)
{
int spritenum = v->spritenum;
@ -579,10 +579,10 @@ static int ChooseShipTrack(Vehicle *v, TileIndex tile, int enterdir, uint tracks
}
}
static const byte _new_vehicle_direction_table[11] = {
0, 7, 6, 0,
1, 0, 5, 0,
2, 3, 4,
static const Direction _new_vehicle_direction_table[] = {
DIR_N , DIR_NW, DIR_W , 0,
DIR_NE, DIR_N , DIR_SW, 0,
DIR_E , DIR_SE, DIR_S
};
static int ShipGetNewDirectionFromTiles(TileIndex new_tile, TileIndex old_tile)
@ -646,7 +646,9 @@ static void ShipController(Vehicle *v)
GetNewVehiclePosResult gp;
uint32 r;
const byte *b;
int dir,track,tracks;
Direction dir;
int track;
int tracks;
v->tick_counter++;
@ -736,23 +738,24 @@ static void ShipController(Vehicle *v)
}
}
} else {
DiagDirection diagdir;
// new tile
if (TileX(gp.new_tile) >= MapMaxX() || TileY(gp.new_tile) >= MapMaxY())
goto reverse_direction;
dir = ShipGetNewDirectionFromTiles(gp.new_tile, gp.old_tile);
assert(dir == 1 || dir == 3 || dir == 5 || dir == 7);
dir>>=1;
tracks = GetAvailShipTracks(gp.new_tile, dir);
assert(dir == DIR_NE || dir == DIR_SE || dir == DIR_SW || dir == DIR_NW);
diagdir = DirToDiagDir(dir);
tracks = GetAvailShipTracks(gp.new_tile, diagdir);
if (tracks == 0)
goto reverse_direction;
// Choose a direction, and continue if we find one
track = ChooseShipTrack(v, gp.new_tile, dir, tracks);
track = ChooseShipTrack(v, gp.new_tile, diagdir, tracks);
if (track < 0)
goto reverse_direction;
b = _ship_subcoord[dir][track];
b = _ship_subcoord[diagdir][track];
gp.x = (gp.x&~0xF) | b[0];
gp.y = (gp.y&~0xF) | b[1];
@ -783,7 +786,7 @@ getout:
return;
reverse_direction:
dir = v->direction ^ 4;
dir = ReverseDir(v->direction);
v->direction = dir;
goto getout;
}

@ -65,7 +65,7 @@ void DrawShipPurchaseInfo(int x, int y, EngineID engine_number)
static void DrawShipImage(const Vehicle *v, int x, int y, VehicleID selection)
{
DrawSprite(GetShipImage(v, 6) | GetVehiclePalette(v), x + 32, y + 10);
DrawSprite(GetShipImage(v, DIR_W) | GetVehiclePalette(v), x + 32, y + 10);
if (v->index == selection) {
DrawFrameRect(x - 5, y - 1, x + 67, y + 21, 15, FR_BORDERONLY);
@ -713,7 +713,7 @@ static void ShipDepotClick(Window *w, int x, int y)
if (v != NULL) {
WP(w,traindepot_d).sel = v->index;
SetWindowDirty(w);
SetObjectToPlaceWnd(GetVehiclePalette(v) | GetShipImage(v, 6), 4, w);
SetObjectToPlaceWnd(GetVehiclePalette(v) | GetShipImage(v, DIR_W), 4, w);
}
break;

@ -817,7 +817,7 @@ int32 CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invali
return cost;
}
static bool CanExpandRailroadStation(Station *st, uint *fin, int direction)
static bool CanExpandRailroadStation(Station* st, uint* fin, Axis axis)
{
uint curw = st->trainst_w, curh = st->trainst_h;
TileIndex tile = fin[0];
@ -832,8 +832,8 @@ static bool CanExpandRailroadStation(Station *st, uint *fin, int direction)
curh = max(TileY(st->train_tile) + curh, TileY(tile) + h) - y;
tile = TileXY(x, y);
} else {
// check so the direction is the same
if ((_m[st->train_tile].m5 & 1) != direction) {
// check so the orientation is the same
if ((_m[st->train_tile].m5 & 1U) != axis) {
_error_message = STR_306D_NONUNIFORM_STATIONS_DISALLOWED;
return false;
}
@ -934,7 +934,7 @@ int32 CmdBuildRailroadStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
int32 cost, ret;
StationID est;
int plat_len, numtracks;
int direction;
Axis axis;
uint finalvalues[3];
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
@ -946,16 +946,16 @@ int32 CmdBuildRailroadStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (!ValParamRailtype(p2 & 0xF)) return CMD_ERROR;
/* unpack parameters */
direction = p1 & 1;
axis = p1 & 1;
numtracks = GB(p1, 8, 8);
plat_len = GB(p1, 16, 8);
/* w = length, h = num_tracks */
if (direction) {
h_org = plat_len;
w_org = numtracks;
} else {
if (axis == AXIS_X) {
w_org = plat_len;
h_org = numtracks;
} else {
h_org = plat_len;
w_org = numtracks;
}
if (h_org > _patches.station_spread || w_org > _patches.station_spread) return CMD_ERROR;
@ -969,7 +969,7 @@ int32 CmdBuildRailroadStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
est = INVALID_STATION;
// If DC_EXEC is in flag, do not want to pass it to CheckFlatLandBelow, because of a nice bug
// for detail info, see: https://sourceforge.net/tracker/index.php?func=detail&aid=1029064&group_id=103924&atid=636365
if (CmdFailed(ret = CheckFlatLandBelow(tile_org, w_org, h_org, flags&~DC_EXEC, 5 << direction, _patches.nonuniform_stations ? &est : NULL))) return CMD_ERROR;
if (CmdFailed(ret = CheckFlatLandBelow(tile_org, w_org, h_org, flags&~DC_EXEC, 5 << axis, _patches.nonuniform_stations ? &est : NULL))) return CMD_ERROR;
cost = ret + (numtracks * _price.train_station_track + _price.train_station_length) * plat_len;
// Make sure there are no similar stations around us.
@ -991,7 +991,7 @@ int32 CmdBuildRailroadStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// check if we want to expanding an already existing station?
if (_is_old_ai_player || !_patches.join_stations)
return_cmd_error(STR_3005_TOO_CLOSE_TO_ANOTHER_RAILROAD);
if (!CanExpandRailroadStation(st, finalvalues, direction))
if (!CanExpandRailroadStation(st, finalvalues, axis))
return CMD_ERROR;
}
@ -1021,7 +1021,7 @@ int32 CmdBuildRailroadStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// Now really clear the land below the station
// It should never return CMD_ERROR.. but you never know ;)
// (a bit strange function name for it, but it really does clear the land, when DC_EXEC is in flags)
if (CmdFailed(CheckFlatLandBelow(tile_org, w_org, h_org, flags, 5 << direction, _patches.nonuniform_stations ? &est : NULL))) return CMD_ERROR;
if (CmdFailed(CheckFlatLandBelow(tile_org, w_org, h_org, flags, 5 << axis, _patches.nonuniform_stations ? &est : NULL))) return CMD_ERROR;
st->train_tile = finalvalues[0];
if (!st->facilities) st->xy = finalvalues[0];
@ -1033,8 +1033,8 @@ int32 CmdBuildRailroadStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
st->build_date = _date;
tile_delta = direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
track = direction ? TRACK_Y : TRACK_X;
tile_delta = (axis == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
track = (axis == AXIS_X ? TRACK_X : TRACK_Y);
statspec = (p2 & 0x10) != 0 ? GetCustomStation(STAT_CLASS_DFLT, p2 >> 8) : NULL;
layout_ptr = alloca(numtracks * plat_len);
@ -1051,7 +1051,7 @@ int32 CmdBuildRailroadStation(int x, int y, uint32 flags, uint32 p1, uint32 p2)
station_index, /* map2 parameter */
p2 & 0xFF, /* map3lo parameter */
p2 >> 8, /* map3hi parameter */
(*layout_ptr++) + direction /* map5 parameter */
(*layout_ptr++) + axis /* map5 parameter */
);
tile += tile_delta;
@ -1172,27 +1172,27 @@ uint GetStationPlatforms(const Station *st, TileIndex tile)
{
TileIndex t;
TileIndexDiff delta;
int dir;
Axis dir;
uint len;
assert(TileBelongsToRailStation(st, tile));
len = 0;
dir = _m[tile].m5 & 1;
delta = dir ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
delta = (dir == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
// find starting tile..
t = tile;
do {
t -= delta;
len++;
} while (TileBelongsToRailStation(st, t) && (_m[t].m5 & 1) == dir);
} while (TileBelongsToRailStation(st, t) && (_m[t].m5 & 1U) == dir);
// find ending tile
t = tile;
do {
t += delta;
len++;
} while (TileBelongsToRailStation(st, t) && (_m[t].m5 & 1) == dir);
} while (TileBelongsToRailStation(st, t) && (_m[t].m5 & 1U) == dir);
return len - 1;
}
@ -1806,17 +1806,17 @@ int32 CmdBuildDock(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{
TileIndex tile = TileVirtXY(x, y);
TileIndex tile_cur;
int direction;
DiagDirection direction;
int32 cost;
Station *st;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
switch (GetTileSlope(tile, NULL)) {
case 3: direction = 0; break;
case 6: direction = 3; break;
case 9: direction = 1; break;
case 12: direction = 2; break;
case 3: direction = DIAGDIR_NE; break;
case 6: direction = DIAGDIR_NW; break;
case 9: direction = DIAGDIR_SE; break;
case 12: direction = DIAGDIR_SW; break;
default: return_cmd_error(STR_304B_SITE_UNSUITABLE);
}
@ -1898,7 +1898,8 @@ int32 CmdBuildDock(int x, int y, uint32 flags, uint32 p1, uint32 p2)
MP_MAP2 | MP_MAP3LO_CLEAR | MP_MAP3HI_CLEAR |
MP_MAP5,
st->index,
(direction&1) + 0x50);
DiagDirToAxis(direction) + 0x50
);
UpdateStationVirtCoordDirty(st);
UpdateStationAcceptance(st, false);

@ -239,8 +239,8 @@ static int GetTrainAcceleration(Vehicle *v, bool mode)
//first find the curve speed limit
for (u = v; u->next != NULL; u = u->next, pos++) {
int dir = u->direction;
int ndir = u->next->direction;
Direction dir = u->direction;
Direction ndir = u->next->direction;
int i;
for (i = 0; i < 2; i++) {
@ -373,7 +373,7 @@ static void UpdateTrainAcceleration(Vehicle* v)
v->acceleration = clamp(power / weight * 4, 1, 255);
}
int GetTrainImage(const Vehicle *v, byte direction)
int GetTrainImage(const Vehicle* v, Direction direction)
{
int img = v->spritenum;
int base;
@ -1444,8 +1444,8 @@ static void ReverseTrainSwapVeh(Vehicle *v, int l, int r)
swap_byte(&a->direction, &b->direction);
/* toggle direction */
if (!(a->u.rail.track & 0x80)) a->direction ^= 4;
if (!(b->u.rail.track & 0x80)) b->direction ^= 4;
if (!(a->u.rail.track & 0x80)) a->direction = ReverseDir(a->direction);
if (!(b->u.rail.track & 0x80)) b->direction = ReverseDir(b->direction);
/* swap more variables */
swap_int32(&a->x_pos, &b->x_pos);
@ -1462,7 +1462,7 @@ static void ReverseTrainSwapVeh(Vehicle *v, int l, int r)
VehicleEnterTile(a, a->tile, a->x_pos, a->y_pos);
VehicleEnterTile(b, b->tile, b->x_pos, b->y_pos);
} else {
if (!(a->u.rail.track & 0x80)) a->direction ^= 4;
if (!(a->u.rail.track & 0x80)) a->direction = ReverseDir(a->direction);
UpdateVarsAfterSwap(a);
VehicleEnterTile(a, a->tile, a->x_pos, a->y_pos);
@ -2492,10 +2492,10 @@ static byte AfterSetTrainPos(Vehicle *v, bool new_tile)
return old_z;
}
static const byte _new_vehicle_direction_table[11] = {
0, 7, 6, 0,
1, 0, 5, 0,
2, 3, 4,
static const Direction _new_vehicle_direction_table[11] = {
DIR_N , DIR_NW, DIR_W , 0,
DIR_NE, DIR_N , DIR_SW, 0,
DIR_E , DIR_SE, DIR_S
};
static Direction GetNewVehicleDirectionByTile(TileIndex new_tile, TileIndex old_tile)
@ -2589,7 +2589,7 @@ static const RailtypeSlowdownParams _railtype_slowdown[3] = {
};
/* Modify the speed of the vehicle due to a turn */
static void AffectSpeedByDirChange(Vehicle *v, byte new_dir)
static void AffectSpeedByDirChange(Vehicle* v, Direction new_dir)
{
byte diff;
const RailtypeSlowdownParams *rsp;
@ -2617,9 +2617,9 @@ static void AffectSpeedByZChange(Vehicle *v, byte old_z)
}
}
static const byte _otherside_signal_directions[14] = {
1, 3, 1, 3, 5, 3, 0, 0,
5, 7, 7, 5, 7, 1,
static const Direction _otherside_signal_directions[] = {
DIR_NE, DIR_SE, DIR_NE, DIR_SE, DIR_SW, DIR_SE, 0, 0,
DIR_SW, DIR_NW, DIR_NW, DIR_SW, DIR_NW, DIR_NE,
};
static void TrainMovedChangeSignals(TileIndex tile, DiagDirection dir)
@ -2732,7 +2732,7 @@ static void CheckTrainCollision(Vehicle *v)
typedef struct VehicleAtSignalData {
TileIndex tile;
byte direction;
Direction direction;
} VehicleAtSignalData;
static void *CheckVehicleAtSignal(Vehicle *v, void *data)
@ -2757,7 +2757,7 @@ static void TrainController(Vehicle *v)
DiagDirection enterdir;
Direction dir;
Direction newdir;
byte chosen_dir;
Direction chosen_dir;
byte chosen_track;
byte old_z;
@ -2938,7 +2938,7 @@ red_light: {
TileIndex o_tile = gp.new_tile + TileOffsByDir(enterdir);
VehicleAtSignalData vasd;
vasd.tile = o_tile;
vasd.direction = dir ^ 4;
vasd.direction = ReverseDir(dir);
/* check if a train is waiting on the other side */
if (VehicleFromPos(o_tile, &vasd, CheckVehicleAtSignal) == NULL) return;

@ -362,7 +362,7 @@ static void DrawTrainImage(const Vehicle *v, int x, int y, int count, int skip,
if (dx + width <= count) {
PalSpriteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
DrawSprite(GetTrainImage(v, 6) | pal, x + 14 + WagonLengthToPixels(dx), y + 6 + (is_custom_sprite(RailVehInfo(v->engine_type)->image_index) ? _traininfo_vehicle_pitch : 0));
DrawSprite(GetTrainImage(v, DIR_W) | pal, x + 14 + WagonLengthToPixels(dx), y + 6 + (is_custom_sprite(RailVehInfo(v->engine_type)->image_index) ? _traininfo_vehicle_pitch : 0));
if (v->index == selection)
DrawFrameRect(x - 1 + WagonLengthToPixels(dx), y - 1, x + WagonLengthToPixels(dx + width) - 1, y + 12, 15, FR_BORDERONLY);
}
@ -577,7 +577,7 @@ static void TrainDepotClickTrain(Window *w, int x, int y)
TrainDepotMoveVehicle(v, sel, gdvp.head);
} else if (v != NULL) {
WP(w,traindepot_d).sel = v->index;
SetObjectToPlaceWnd(GetVehiclePalette(v) | GetTrainImage(v, 6), 4, w);
SetObjectToPlaceWnd(GetVehiclePalette(v) | GetTrainImage(v, DIR_W), 4, w);
SetWindowDirty(w);
}
break;

@ -119,7 +119,7 @@ static inline int GetBridgeType(TileIndex tile)
* is_start_tile = false <-- end tile
* is_start_tile = true <-- start tile
*/
static uint32 CheckBridgeSlope(uint direction, uint tileh, bool is_start_tile)
static uint32 CheckBridgeSlope(Axis direction, uint tileh, bool is_start_tile)
{
if (IsSteepTileh(tileh)) return CMD_ERROR;
@ -129,7 +129,7 @@ static uint32 CheckBridgeSlope(uint direction, uint tileh, bool is_start_tile)
- direction X: tiles 0, 12
- direction Y: tiles 0, 9
*/
if ((direction ? 0x201 : 0x1001) & (1 << tileh)) return 0;
if ((direction == AXIS_X ? 0x1001 : 0x201) & (1 << tileh)) return 0;
// disallow certain start tiles to avoid certain crooked bridges
if (tileh == 2) return CMD_ERROR;
@ -139,7 +139,7 @@ static uint32 CheckBridgeSlope(uint direction, uint tileh, bool is_start_tile)
- direction X: tiles 0, 3
- direction Y: tiles 0, 6
*/
if ((direction? 0x41 : 0x9) & (1 << tileh)) return 0;
if ((direction == AXIS_X ? 0x9 : 0x41) & (1 << tileh)) return 0;
// disallow certain end tiles to avoid certain crooked bridges
if (tileh == 8) return CMD_ERROR;
@ -149,8 +149,8 @@ static uint32 CheckBridgeSlope(uint direction, uint tileh, bool is_start_tile)
* start-tile: X 2,1 Y 2,4 (2 was disabled before)
* end-tile: X 8,4 Y 8,1 (8 was disabled before)
*/
if ((tileh == 1 && is_start_tile != (bool)direction) ||
(tileh == 4 && is_start_tile == (bool)direction)) {
if ((tileh == 1 && is_start_tile != (direction != AXIS_X)) ||
(tileh == 4 && is_start_tile == (direction != AXIS_X))) {
return CMD_ERROR;
}
@ -200,7 +200,7 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
TileInfo ti_start, ti_end, ti; /* OPT: only 2 of those are ever used */
uint bridge_len;
uint odd_middle_part;
uint direction;
Axis direction;
uint i;
int32 cost, terraformcost, ret;
bool allow_on_slopes;
@ -225,17 +225,16 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
sx = TileX(p1) * 16;
sy = TileY(p1) * 16;
direction = 0;
/* check if valid, and make sure that (x,y) are smaller than (sx,sy) */
if (x == sx) {
if (y == sy) return_cmd_error(STR_5008_CANNOT_START_AND_END_ON);
direction = 1;
direction = AXIS_Y;
if (y > sy) {
intswap(y,sy);
intswap(x,sx);
}
} else if (y == sy) {
direction = AXIS_X;
if (x > sx) {
intswap(y,sy);
intswap(x,sx);
@ -327,10 +326,10 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
odd_middle_part = (bridge_len % 2) ? (bridge_len / 2) : bridge_len;
for (i = 0; i != bridge_len; i++) {
if (direction != 0) {
y += 16;
} else {
if (direction == AXIS_X) {
x += 16;
} else {
y += 16;
}
FindLandscapeHeight(&ti, x, y);
@ -349,13 +348,15 @@ int32 CmdBuildBridge(int x, int y, uint32 flags, uint32 p1, uint32 p2)
break;
case MP_RAILWAY:
if (ti.map5 != (direction == 0 ? 2 : 1)) goto not_valid_below;
if (ti.map5 != (direction == AXIS_X ? TRACK_BIT_Y : TRACK_BIT_X)) {
goto not_valid_below;
}
m5 = 0xE0;
break;
case MP_STREET:
if (GetRoadType(ti.tile) != ROAD_NORMAL ||
GetRoadBits(ti.tile) != (direction == 0 ? ROAD_Y : ROAD_X)) {
GetRoadBits(ti.tile) != (direction == AXIS_X ? ROAD_Y : ROAD_X)) {
goto not_valid_below;
}
m5 = 0xE8;
@ -408,7 +409,7 @@ not_valid_below:;
}
}
SetSignalsOnBothDir(ti_start.tile, (direction & 1) ? 1 : 0);
SetSignalsOnBothDir(ti_start.tile, direction == AXIS_X ? TRACK_X : TRACK_Y);
/* for human player that builds the bridge he gets a selection to choose from bridges (DC_QUERY_COST)
It's unnecessary to execute this command every time for every bridge. So it is done only
@ -546,7 +547,6 @@ static int32 DoClearTunnel(TileIndex tile, uint32 flags)
Town *t;
TileIndex endtile;
uint length;
static const byte _updsignals_tunnel_dir[4] = { 5, 7, 1, 3};
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
@ -574,8 +574,7 @@ static int32 DoClearTunnel(TileIndex tile, uint32 flags)
if (flags & DC_EXEC) {
// We first need to request the direction before calling DoClearSquare
// else the direction is always 0.. dah!! ;)
DiagDirection tile_dir = GetTunnelDirection(tile);
DiagDirection endtile_dir = GetTunnelDirection(endtile);
DiagDirection dir = GetTunnelDirection(tile);
// Adjust the town's player rating. Do this before removing the tile owner info.
if (IsTileOwner(tile, OWNER_TOWN) && _game_mode != GM_EDITOR)
@ -583,22 +582,22 @@ static int32 DoClearTunnel(TileIndex tile, uint32 flags)
DoClearSquare(tile);
DoClearSquare(endtile);
UpdateSignalsOnSegment(tile, _updsignals_tunnel_dir[tile_dir]);
UpdateSignalsOnSegment(endtile, _updsignals_tunnel_dir[endtile_dir]);
UpdateSignalsOnSegment(tile, DiagDirToDir(ReverseDiagDir(dir)));
UpdateSignalsOnSegment(endtile, DiagDirToDir(dir));
}
return _price.clear_tunnel * (length + 1);
}
static TileIndex FindEdgesOfBridge(TileIndex tile, TileIndex *endtile)
{
int direction = GB(_m[tile].m5, 0, 1);
Axis direction = GB(_m[tile].m5, 0, 1);
TileIndex start;
// find start of bridge
for (;;) {
if (IsTileType(tile, MP_TUNNELBRIDGE) && (_m[tile].m5 & 0xE0) == 0x80)
break;
tile += direction ? TileDiffXY(0, -1) : TileDiffXY(-1, 0);
tile += (direction == AXIS_X ? TileDiffXY(-1, 0) : TileDiffXY(0, -1));
}
start = tile;
@ -607,7 +606,7 @@ static TileIndex FindEdgesOfBridge(TileIndex tile, TileIndex *endtile)
for (;;) {
if (IsTileType(tile, MP_TUNNELBRIDGE) && (_m[tile].m5 & 0xE0) == 0xA0)
break;
tile += direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
tile += (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
}
*endtile = tile;
@ -620,7 +619,7 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
TileIndex endtile;
Vehicle *v;
Town *t;
int direction;
Axis direction;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
@ -672,8 +671,8 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
Omit tile and endtile, since these are already checked, thus solving the problem
of bridges over water, or higher bridges, where z is not increased, eg level bridge
*/
tile += direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
endtile -= direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
tile += (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
endtile -= (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
/* Bridges on slopes might have their Z-value offset..correct this */
v = FindVehicleBetween(tile, endtile, TilePixelHeight(tile) + 8 + GetCorrectTileHeight(tile));
if (v != NULL) {
@ -682,9 +681,8 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
}
/* Put the tiles back to start/end position */
tile -= direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
endtile += direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
tile -= (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
endtile += (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
t = ClosestTownFromTile(tile, (uint)-1); //needed for town rating penalty
// check if you're allowed to remove the bridge owned by a town.
@ -726,17 +724,17 @@ static int32 DoClearBridge(TileIndex tile, uint32 flags)
clear_it:;
DoClearSquare(c);
}
c += direction ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
c += (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
} while (c <= endtile);
SetSignalsOnBothDir(tile, direction);
SetSignalsOnBothDir(endtile, direction);
SetSignalsOnBothDir(tile, direction == AXIS_X ? TRACK_X : TRACK_Y);
SetSignalsOnBothDir(endtile, direction == AXIS_X ? TRACK_X : TRACK_Y);
}
if (direction) {
return (TileY(endtile) - TileY(tile) + 1) * _price.clear_bridge;
} else {
if (direction == AXIS_X) {
return (TileX(endtile) - TileX(tile) + 1) * _price.clear_bridge;
} else {
return (TileY(endtile) - TileY(tile) + 1) * _price.clear_bridge;
}
}
@ -918,7 +916,7 @@ static void DrawBridgePillars(const TileInfo *ti, int x, int y, int z)
}
}
uint GetBridgeFoundation(uint tileh, byte direction)
uint GetBridgeFoundation(uint tileh, Axis axis)
{
int i;
// normal level sloped building (7, 11, 13, 14)
@ -931,8 +929,8 @@ uint GetBridgeFoundation(uint tileh, byte direction)
(i += 2, tileh == 4) ||
(i += 2, tileh == 8)
) && (
direction == 0 ||
(i++, direction == 1)
axis == AXIS_X ||
(i++, axis == AXIS_Y)
)) {
return i + 15;
}

@ -1921,15 +1921,16 @@ bool GetNewVehiclePos(const Vehicle *v, GetNewVehiclePosResult *gp)
return gp->old_tile == gp->new_tile;
}
static const byte _new_direction_table[9] = {
0, 7, 6,
1, 3, 5,
2, 3, 4,
static const Direction _new_direction_table[] = {
DIR_N , DIR_NW, DIR_W ,
DIR_NE, DIR_SE, DIR_SW,
DIR_E , DIR_SE, DIR_S
};
byte GetDirectionTowards(const Vehicle *v, int x, int y)
Direction GetDirectionTowards(const Vehicle* v, int x, int y)
{
byte dirdiff, dir;
Direction dir;
byte dirdiff;
int i = 0;
if (y >= v->y_pos) {

@ -269,10 +269,10 @@ void ViewportAddVehicles(DrawPixelInfo *dpi);
void TrainEnterDepot(Vehicle *v, TileIndex tile);
/* train_cmd.h */
int GetTrainImage(const Vehicle *v, byte direction);
int GetAircraftImage(const Vehicle *v, byte direction);
int GetRoadVehImage(const Vehicle *v, byte direction);
int GetShipImage(const Vehicle *v, byte direction);
int GetTrainImage(const Vehicle* v, Direction direction);
int GetAircraftImage(const Vehicle* v, Direction direction);
int GetRoadVehImage(const Vehicle* v, Direction direction);
int GetShipImage(const Vehicle* v, Direction direction);
Vehicle *CreateEffectVehicle(int x, int y, int z, EffectVehicle type);
Vehicle *CreateEffectVehicleAbove(int x, int y, int z, EffectVehicle type);
@ -332,7 +332,7 @@ Trackdir GetVehicleTrackdir(const Vehicle* v);
/* returns true if staying in the same tile */
bool GetNewVehiclePos(const Vehicle *v, GetNewVehiclePosResult *gp);
byte GetDirectionTowards(const Vehicle *v, int x, int y);
Direction GetDirectionTowards(const Vehicle* v, int x, int y);
#define BEGIN_ENUM_WAGONS(v) do {
#define END_ENUM_WAGONS(v) } while ( (v=v->next) != NULL);

@ -127,7 +127,7 @@ static int32 RemoveShipDepot(TileIndex tile, uint32 flags)
}
// build a shiplift
static int32 DoBuildShiplift(TileIndex tile, int dir, uint32 flags)
static int32 DoBuildShiplift(TileIndex tile, DiagDirection dir, uint32 flags)
{
int32 ret;
int delta;
@ -189,17 +189,18 @@ static void MarkTilesAroundDirty(TileIndex tile)
int32 CmdBuildLock(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{
TileIndex tile = TileVirtXY(x, y);
uint tileh;
DiagDirection dir;
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
tileh = GetTileSlope(tile, NULL);
if (tileh == 3 || tileh == 6 || tileh == 9 || tileh == 12) {
static const byte _shiplift_dirs[16] = {0, 0, 0, 2, 0, 0, 1, 0, 0, 3, 0, 0, 0};
return DoBuildShiplift(tile, _shiplift_dirs[tileh], flags);
switch (GetTileSlope(tile, NULL)) {
case 3: dir = DIAGDIR_SW; break;
case 6: dir = DIAGDIR_SE; break;
case 9: dir = DIAGDIR_NW; break;
case 12: dir = DIAGDIR_NE; break;
default: return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
}
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
return DoBuildShiplift(tile, dir, flags);
}
/** Build a piece of canal.

@ -292,7 +292,7 @@ int32 RemoveTrainWaypoint(TileIndex tile, uint32 flags, bool justremove)
return CMD_ERROR;
if (flags & DC_EXEC) {
int direction = _m[tile].m5 & RAIL_WAYPOINT_TRACK_MASK;
Axis direction = _m[tile].m5 & RAIL_WAYPOINT_TRACK_MASK;
wp = GetWaypointByTile(tile);
@ -304,7 +304,7 @@ int32 RemoveTrainWaypoint(TileIndex tile, uint32 flags, bool justremove)
MarkTileDirtyByTile(tile);
} else {
DoClearSquare(tile);
SetSignalsOnBothDir(tile, direction);
SetSignalsOnBothDir(tile, direction == AXIS_X ? TRACK_X : TRACK_Y);
}
}

Loading…
Cancel
Save