diff options
author | rubidium <rubidium@openttd.org> | 2007-12-01 21:40:18 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-12-01 21:40:18 +0000 |
commit | 08ab4e185000994c311d0c3c8c3b8d886815bfdd (patch) | |
tree | 8ec734ed0a2a9a32ec6f41bd88a23a1c56fa4b11 /src/rail_cmd.cpp | |
parent | 0feaee4124e3905eea2b214142eb7f91919d7738 (diff) | |
download | openttd-08ab4e185000994c311d0c3c8c3b8d886815bfdd.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.cpp | 51 |
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); } } |