summaryrefslogtreecommitdiff
path: root/src/rail_cmd.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2007-12-01 21:40:18 +0000
committerrubidium <rubidium@openttd.org>2007-12-01 21:40:18 +0000
commit99dbfd38665eadc6e25592acf7461095c57210e4 (patch)
tree8ec734ed0a2a9a32ec6f41bd88a23a1c56fa4b11 /src/rail_cmd.cpp
parent61dc1f8609e4f4227e51eea8c468224452152429 (diff)
downloadopenttd-99dbfd38665eadc6e25592acf7461095c57210e4.tar.xz
(svn r11547) -Add: signal selection GUI for the ones that really like to use that over CTRL. Patch by BigBB.
Diffstat (limited to 'src/rail_cmd.cpp')
-rw-r--r--src/rail_cmd.cpp51
1 files changed, 40 insertions, 11 deletions
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index f73e6532f..a507f1981 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -776,16 +776,20 @@ CommandCost CmdBuildTrainDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p
* @param flags operation to perform
* @param p1 various bitstuffed elements
* - p1 = (bit 0-2) - track-orientation, valid values: 0-5 (Track enum)
- * - p1 = (bit 3) - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
+ * - p1 = (bit 3) - 1 = override signal/semaphore, or pre/exit/combo signal or (for bit 7) toggle variant (CTRL-toggle)
* - p1 = (bit 4) - 0 = signals, 1 = semaphores
+ * - p1 = (bit 5-6) - type of the signal, for valid values see enum SignalType in rail_map.h
+ * - p1 = (bit 7) - convert the present signal type and variant
* @param p2 used for CmdBuildManySignals() to copy direction of first signal
* TODO: p2 should be replaced by two bits for "along" and "against" the track.
*/
CommandCost CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
Track track = (Track)GB(p1, 0, 3);
- bool pre_signal = HasBit(p1, 3);
- SignalVariant sigvar = (pre_signal ^ HasBit(p1, 4)) ? SIG_SEMAPHORE : SIG_ELECTRIC;
+ bool ctrl_pressed = HasBit(p1, 3); // was the CTRL button pressed
+ SignalVariant sigvar = (ctrl_pressed ^ HasBit(p1, 4)) ? SIG_SEMAPHORE : SIG_ELECTRIC; // the signal variant of the new signal
+ SignalType sigtype = (SignalType)GB(p1, 5, 2); // the signal type of the new signal
+ bool convert_signal = HasBit(p1, 7); // convert button pressed
CommandCost cost;
if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoTrainOnTrack(tile, track))
@@ -799,18 +803,19 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32
if (!CheckTileOwnership(tile)) return CMD_ERROR;
- _error_message = STR_1005_NO_SUITABLE_RAILROAD_TRACK;
-
{
/* See if this is a valid track combination for signals, (ie, no overlap) */
TrackBits trackbits = GetTrackBits(tile);
if (KillFirstBit(trackbits) != TRACK_BIT_NONE && /* More than one track present */
trackbits != TRACK_BIT_HORZ &&
trackbits != TRACK_BIT_VERT) {
- return CMD_ERROR;
+ return_cmd_error(STR_1005_NO_SUITABLE_RAILROAD_TRACK);
}
}
+ /* you can not convert a signal if no signal is on track */
+ if (convert_signal && !HasSignalOnTrack(tile, track)) return CMD_ERROR;
+
SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
if (!HasSignalOnTrack(tile, track)) {
@@ -820,6 +825,17 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32
if (p2 != 0 && sigvar != GetSignalVariant(tile, track)) {
/* convert signals <-> semaphores */
cost = CommandCost(_price.build_signals + _price.remove_signals);
+
+ } else if (convert_signal) {
+ /* convert button pressed */
+ if (ctrl_pressed || GetSignalVariant(tile, track) != sigvar) {
+ /* convert electric <-> semaphore */
+ cost = CommandCost(_price.build_signals + _price.remove_signals);
+ } else {
+ /* it is free to change signal type: normal-pre-exit-combo */
+ cost = CommandCost();
+ }
+
} else {
/* it is free to change orientation/pre-exit-combo signals */
cost = CommandCost();
@@ -832,7 +848,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32
SetHasSignals(tile, true);
SetSignalStates(tile, 0xF); // all signals are on
SetPresentSignals(tile, 0); // no signals built by default
- SetSignalType(tile, track, SIGTYPE_NORMAL);
+ SetSignalType(tile, track, sigtype);
SetSignalVariant(tile, track, sigvar);
}
@@ -840,15 +856,28 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32
if (!HasSignalOnTrack(tile, track)) {
/* build new signals */
SetPresentSignals(tile, GetPresentSignals(tile) | SignalOnTrack(track));
- SetSignalType(tile, track, SIGTYPE_NORMAL);
+ SetSignalType(tile, track, sigtype);
SetSignalVariant(tile, track, sigvar);
} else {
- if (pre_signal) {
+ if (convert_signal) {
+ /* convert signal button pressed */
+ if (ctrl_pressed) {
+ /* toggle the pressent signal variant: SIG_ELECTRIC <-> SIG_SEMAPHORE */
+ SetSignalVariant(tile, track, (GetSignalVariant(tile, track) == SIG_ELECTRIC) ? SIG_SEMAPHORE : SIG_ELECTRIC);
+
+ } else {
+ /* convert the present signal to the chosen type and variant */
+ SetSignalType(tile, track, sigtype);
+ SetSignalVariant(tile, track, sigvar);
+ }
+
+ } else if (ctrl_pressed) {
/* cycle between normal -> pre -> exit -> combo -> ... */
- SignalType type = GetSignalType(tile, track);
+ sigtype = GetSignalType(tile, track);
- SetSignalType(tile, track, type == SIGTYPE_COMBO ? SIGTYPE_NORMAL : (SignalType)(type + 1));
+ SetSignalType(tile, track, sigtype == SIGTYPE_COMBO ? SIGTYPE_NORMAL : (SignalType)(sigtype + 1));
} else {
+ /* cycle the signal side: both -> left -> right -> both -> ... */
CycleSignalSide(tile, track);
}
}