summaryrefslogtreecommitdiff
path: root/rail_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'rail_cmd.c')
-rw-r--r--rail_cmd.c122
1 files changed, 16 insertions, 106 deletions
diff --git a/rail_cmd.c b/rail_cmd.c
index ddea310b6..bc2ee557e 100644
--- a/rail_cmd.c
+++ b/rail_cmd.c
@@ -18,9 +18,7 @@
#include "station.h"
#include "sprite.h"
#include "depot.h"
-#include "pbs.h"
#include "waypoint.h"
-#include "npf.h"
#include "rail.h"
#include "railtypes.h" // include table for railtypes
@@ -474,10 +472,6 @@ int32 CmdRemoveSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
/* We remove the trackbit here. */
_m[tile].m5 &= ~trackbit;
- /* Unreserve track for PBS */
- if (PBSTileReserved(tile) & trackbit)
- PBSClearTrack(tile, track);
-
if (GetTrackBits(tile) == 0) {
/* The tile has no tracks left, it is no longer a rail tile */
DoClearSquare(tile);
@@ -766,9 +760,9 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_m[tile].m3 |= SignalOnTrack(track);
} else {
if (pre_signal) {
- // cycle between normal -> pre -> exit -> combo -> pbs ->...
+ // cycle between normal -> pre -> exit -> combo -> ...
byte type = (GetSignalType(tile, track) + 1) % SIGTYPE_END;
- SB(_m[tile].m4, 0, 3, type);
+ SB(_m[tile].m4, 0, 2, type);
} else {
// cycle between two-way -> one-way -> one-way -> ...
/* TODO: Rewrite switch into something more general */
@@ -799,9 +793,9 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_m[tile].m3 |= p2 & SignalOnTrack(track);
// convert between signal<->semaphores when dragging
if (semaphore) {
- SETBIT(_m[tile].m4, 3);
+ SETBIT(_m[tile].m4, 2);
} else {
- CLRBIT(_m[tile].m4, 3);
+ CLRBIT(_m[tile].m4, 2);
}
}
@@ -938,7 +932,7 @@ int32 CmdRemoveSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (GB(_m[tile].m3, 4, 4) == 0) {
SB(_m[tile].m2, 4, 4, 0);
SB(_m[tile].m5, 6, 2, RAIL_TYPE_NORMAL >> 6); // XXX >> because the constant is meant for direct application, not use with SB
- CLRBIT(_m[tile].m4, 3); // remove any possible semaphores
+ CLRBIT(_m[tile].m4, 2); // remove any possible semaphores
}
SetSignalsOnBothDir(tile, track);
@@ -1130,54 +1124,29 @@ static int32 ClearTile_Track(TileIndex tile, byte flags)
#include "table/track_land.h"
// used for presignals
-static const SpriteID _signal_base_sprites[32] = {
+static const SpriteID _signal_base_sprites[16] = {
0x4FB,
0x1323,
0x1333,
0x1343,
- // pbs signals
- 0x1393,
- 0x13A3, // not used (yet?)
- 0x13B3, // not used (yet?)
- 0x13C3, // not used (yet?)
-
// semaphores
0x1353,
0x1363,
0x1373,
0x1383,
- // pbs semaphores
- 0x13D3,
- 0x13E3, // not used (yet?)
- 0x13F3, // not used (yet?)
- 0x1403, // not used (yet?)
-
-
// mirrored versions
0x4FB,
0x1323,
0x1333,
0x1343,
- // pbs signals
- 0x1393,
- 0x13A3, // not used (yet?)
- 0x13B3, // not used (yet?)
- 0x13C3, // not used (yet?)
-
// semaphores
0x1446,
0x1456,
0x1466,
0x1476,
-
- // pbs semaphores
- 0x14C6,
- 0x14D6, // not used (yet?)
- 0x14E6, // not used (yet?)
- 0x14F6, // not used (yet?)
};
// used to determine the side of the road for the signal
@@ -1195,7 +1164,7 @@ static void DrawSignalHelper(const TileInfo *ti, byte condition, uint32 image_an
uint v = _signal_position[(image_and_pos & 0xF) + (otherside ? 12 : 0)];
uint x = ti->x | (v&0xF);
uint y = ti->y | (v>>4);
- uint sprite = _signal_base_sprites[(_m[ti->tile].m4 & 0xF) + (otherside ? 0x10 : 0)] + (image_and_pos>>4) + ((condition != 0) ? 1 : 0);
+ uint sprite = _signal_base_sprites[(_m[ti->tile].m4 & 0x7) + (otherside ? 8 : 0)] + (image_and_pos>>4) + ((condition != 0) ? 1 : 0);
AddSortableSpriteToDraw(sprite, x, y, 1, 1, 10, GetSlopeZ(x,y));
}
@@ -1387,16 +1356,6 @@ static void DrawTrackBits(TileInfo* ti, TrackBits track, bool earth, bool snow,
if (track & TRACK_BIT_LEFT) DrawGroundSprite(rti->base_sprites.single_w);
if (track & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e);
}
-
- if (_debug_pbs_level >= 1) {
- byte pbs = PBSTileReserved(ti->tile) & track;
- if (pbs & TRACK_BIT_DIAG1) DrawGroundSprite(rti->base_sprites.single_y | PALETTE_CRASH);
- if (pbs & TRACK_BIT_DIAG2) DrawGroundSprite(rti->base_sprites.single_x | PALETTE_CRASH);
- if (pbs & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n | PALETTE_CRASH);
- if (pbs & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s | PALETTE_CRASH);
- if (pbs & TRACK_BIT_LEFT) DrawGroundSprite(rti->base_sprites.single_w | PALETTE_CRASH);
- if (pbs & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e | PALETTE_CRASH);
- }
}
static void DrawTile_Track(TileInfo *ti)
@@ -1526,16 +1485,6 @@ static void DrawTile_Track(TileInfo *ti)
DrawGroundSprite(image);
- if (_debug_pbs_level >= 1) {
- byte pbs = PBSTileReserved(ti->tile);
- if (pbs & TRACK_BIT_DIAG1) DrawGroundSprite(rti->base_sprites.single_y | PALETTE_CRASH);
- if (pbs & TRACK_BIT_DIAG2) DrawGroundSprite(rti->base_sprites.single_x | PALETTE_CRASH);
- if (pbs & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n | PALETTE_CRASH);
- if (pbs & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s | PALETTE_CRASH);
- if (pbs & TRACK_BIT_LEFT) DrawGroundSprite(rti->base_sprites.single_w | PALETTE_CRASH);
- if (pbs & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e | PALETTE_CRASH);
- }
-
for (; drss->image != 0; drss++) {
DrawSpecialBuilding(drss->image, type < 4 ? rti->total_offset : 0, ti,
drss->subcoord_x, drss->subcoord_y, 0,
@@ -1595,11 +1544,6 @@ typedef struct SetSignalsData {
bool stop;
bool has_presignal;
- bool has_pbssignal;
- // lowest 2 bits = amount of pbs signals in the block, clamped at 2
- // bit 2 = there is a pbs entry signal in this block
- // bit 3 = there is a pbs exit signal in this block
-
// presignal info
int presignal_exits;
int presignal_exits_free;
@@ -1608,10 +1552,6 @@ typedef struct SetSignalsData {
byte bit[NUM_SSD_ENTRY];
TileIndex tile[NUM_SSD_ENTRY];
- int pbs_cur;
- // these are used to keep track of all signals in the block
- TileIndex pbs_tile[NUM_SSD_ENTRY];
-
// these are used to keep track of the stack that modifies presignals recursively
TileIndex next_tile[NUM_SSD_STACK];
byte next_dir[NUM_SSD_STACK];
@@ -1631,32 +1571,15 @@ static bool SetSignalsEnumProc(TileIndex tile, SetSignalsData *ssd, int track, u
ssd->cur++;
}
- if (PBSIsPbsSignal(tile, ReverseTrackdir(track)))
- SETBIT(ssd->has_pbssignal, 2);
-
// remember if this block has a presignal.
ssd->has_presignal |= (_m[tile].m4&1);
}
- if (PBSIsPbsSignal(tile, ReverseTrackdir(track)) || PBSIsPbsSignal(tile, track)) {
- byte num = ssd->has_pbssignal & 3;
- num = clamp(num + 1, 0, 2);
- ssd->has_pbssignal &= ~3;
- ssd->has_pbssignal |= num;
- }
-
- ssd->pbs_tile[ssd->pbs_cur] = tile; // remember the tile index
- ssd->pbs_cur++;
-
- if (HasSignalOnTrackdir(tile, track)) {
- if (_m[tile].m4&2) {
- // this is an exit signal that points out from the segment
- ssd->presignal_exits++;
- if (GetSignalState(tile, track) != SIGNAL_STATE_RED)
- ssd->presignal_exits_free++;
- }
- if (PBSIsPbsSignal(tile, track))
- SETBIT(ssd->has_pbssignal, 3);
+ if (HasSignalOnTrackdir(tile, track) && (_m[tile].m4 & 2)) {
+ // this is an exit signal that points out from the segment
+ ssd->presignal_exits++;
+ if (GetSignalState(tile, track) != SIGNAL_STATE_RED)
+ ssd->presignal_exits_free++;
}
return true;
@@ -1791,14 +1714,6 @@ static void ChangeSignalStates(SetSignalsData *ssd)
// there is at least one green exit signal OR
// there are no exit signals in the segment
- // convert the block to pbs, if needed
- if (_patches.auto_pbs_placement && !(ssd->stop) && (ssd->has_pbssignal == 0xE) && !ssd->has_presignal && (ssd->presignal_exits == 0)) // 0xE means at least 2 pbs signals, and at least 1 entry and 1 exit, see comments ssd->has_pbssignal
- for (i = 0; i != ssd->pbs_cur; i++) {
- TileIndex tile = ssd->pbs_tile[i];
- SB(_m[tile].m4, 0, 3, SIGTYPE_PBS);
- MarkTileDirtyByTile(tile);
- };
-
// then mark the signals in the segment accordingly
for (i = 0; i != ssd->cur; i++) {
TileIndex tile = ssd->tile[i];
@@ -1859,9 +1774,8 @@ bool UpdateSignalsOnSegment(TileIndex tile, byte direction)
for(;;) {
// go through one segment and update all signals pointing into that segment.
- ssd.cur = ssd.pbs_cur = ssd.presignal_exits = ssd.presignal_exits_free = 0;
+ ssd.cur = ssd.presignal_exits = ssd.presignal_exits_free = 0;
ssd.has_presignal = false;
- ssd.has_pbssignal = false;
FollowTrack(tile, 0xC000 | TRANSPORT_RAIL, direction, (TPFEnumProc*)SetSignalsEnumProc, SetSignalsAfterProc, &ssd);
ChangeSignalStates(&ssd);
@@ -2126,16 +2040,14 @@ static void GetTileDesc_Track(TileIndex tile, TileDesc *td)
break;
case RAIL_TYPE_SIGNALS: {
- const StringID signal_type[7] = {
+ const StringID signal_type[] = {
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS,
STR_RAILROAD_TRACK_WITH_PRESIGNALS,
STR_RAILROAD_TRACK_WITH_EXITSIGNALS,
- STR_RAILROAD_TRACK_WITH_COMBOSIGNALS,
- STR_RAILROAD_TRACK_WITH_PBSSIGNALS,
- STR_NULL, STR_NULL
+ STR_RAILROAD_TRACK_WITH_COMBOSIGNALS
};
- td->str = signal_type[GB(_m[tile].m4, 0, 3)];
+ td->str = signal_type[GB(_m[tile].m4, 0, 2)];
break;
}
@@ -2199,8 +2111,6 @@ static uint32 VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y)
} else if (_fractcoords_enter[dir] == fract_coord) {
if (_enter_directions[dir] == v->direction) {
/* enter the depot */
- if (v->next == NULL)
- PBSClearTrack(v->tile, FIND_FIRST_BIT(v->u.rail.track));
v->u.rail.track = 0x80,
v->vehstatus |= VS_HIDDEN; /* hide it */
v->direction ^= 4;