162 } |
162 } |
163 } |
163 } |
164 |
164 |
165 static void GenericPlaceSignals(TileIndex tile) |
165 static void GenericPlaceSignals(TileIndex tile) |
166 { |
166 { |
167 uint trackstat; |
167 byte trackstat; |
168 uint i; |
168 uint i; |
169 |
169 |
170 trackstat = (byte)GetTileTrackStatus(tile, TRANSPORT_RAIL); |
170 trackstat = (byte)GetTileTrackStatus(tile, TRANSPORT_RAIL); |
171 |
171 |
172 if ((trackstat & 0x30)) // N-S direction |
172 if (trackstat & TRACK_BIT_VERT) // N-S direction |
173 trackstat = (_tile_fract_coords.x <= _tile_fract_coords.y) ? 0x20 : 0x10; |
173 trackstat = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; |
174 |
174 |
175 if ((trackstat & 0x0C)) // E-W direction |
175 if (trackstat & TRACK_BIT_HORZ) // E-W direction |
176 trackstat = (_tile_fract_coords.x + _tile_fract_coords.y <= 15) ? 4 : 8; |
176 trackstat = (_tile_fract_coords.x + _tile_fract_coords.y <= 15) ? TRACK_BIT_UPPER : TRACK_BIT_LOWER; |
177 |
177 |
178 // Lookup the bit index |
178 // Lookup the bit index |
179 i = 0; |
179 i = 0; |
180 if (trackstat != 0) { |
180 if (trackstat != 0) { |
181 for (; !(trackstat & 1); trackstat >>= 1) i++; |
181 for (; !(trackstat & 1); trackstat >>= 1) i++; |
182 } |
182 } |
183 |
183 |
184 if (!_remove_button_clicked) { |
184 if (!_remove_button_clicked) { |
185 uint32 p1 = _ctrl_pressed ? 8 : 0; |
185 uint32 p1 = 0; |
186 if (IsTileType(tile, MP_RAILWAY) && !HasSignals(tile) && _cur_year < _patches.semaphore_build_before) { |
186 SB(p1, 0, 1, _ctrl_pressed); |
187 /* Reverse the logic, so semaphores are normally built, and light |
187 SB(p1, 1, 1, _ctrl_pressed ^ (_cur_year < _patches.semaphore_build_before)); |
188 * signals can be built with ctrl held down. */ |
188 SB(p1, 2, 3, i); |
189 p1 = _ctrl_pressed ? 0 : 8; |
189 |
190 } |
190 DoCommandP(tile, p1, 0, CcPlaySound1E, |
191 DoCommandP(tile, i + p1, 0, CcPlaySound1E, |
|
192 CMD_BUILD_SIGNALS | CMD_AUTO | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE)); |
191 CMD_BUILD_SIGNALS | CMD_AUTO | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE)); |
193 } else { |
192 } else { |
194 DoCommandP(tile, i, 0, CcPlaySound1E, |
193 DoCommandP(tile, i, 0, CcPlaySound1E, |
195 CMD_REMOVE_SIGNALS | CMD_AUTO | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM)); |
194 CMD_REMOVE_SIGNALS | CMD_AUTO | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM)); |
196 } |
195 } |
365 |
364 |
366 static void HandleAutoSignalPlacement(void) |
365 static void HandleAutoSignalPlacement(void) |
367 { |
366 { |
368 TileHighlightData *thd = &_thd; |
367 TileHighlightData *thd = &_thd; |
369 byte trackstat = thd->drawstyle & 0xF; // 0..5 |
368 byte trackstat = thd->drawstyle & 0xF; // 0..5 |
370 byte semaphore = _ctrl_pressed ? 1 : 0; |
|
371 |
369 |
372 if (thd->drawstyle == HT_RECT) { // one tile case |
370 if (thd->drawstyle == HT_RECT) { // one tile case |
373 GenericPlaceSignals(TileVirtXY(thd->selend.x, thd->selend.y)); |
371 GenericPlaceSignals(TileVirtXY(thd->selend.x, thd->selend.y)); |
374 return; |
372 return; |
375 } |
373 } |
376 |
374 |
377 TileIndex start_tile = TileVirtXY(thd->selstart.x, thd->selstart.y); |
375 int p2 = 0; |
378 if (IsTileType(start_tile, MP_RAILWAY) && !HasSignals(start_tile) && _cur_year < _patches.semaphore_build_before) { |
376 SB(p2, 0, 1, _ctrl_pressed); |
379 /* Reverse the logic, so semaphores are normally built, and light |
377 SB(p2, 1, 1, _ctrl_pressed ^ (_cur_year < _patches.semaphore_build_before)); |
380 * signals can be built with ctrl held down. */ |
378 SB(p2, 2, 3, trackstat); |
381 semaphore = _ctrl_pressed ? 0 : 1; |
379 SB(p2, 24, 8, _patches.drag_signals_density); |
382 } |
380 |
383 |
381 /* _patches.drag_signals_density is given as a parameter such that each user |
384 // _patches.drag_signals_density is given as a parameter such that each user in a network |
382 * in a network game can specify his/her own signal density */ |
385 // game can specify his/her own signal density |
|
386 DoCommandP( |
383 DoCommandP( |
387 start_tile, |
384 TileVirtXY(thd->selstart.x, thd->selstart.y), |
388 TileVirtXY(thd->selend.x, thd->selend.y), |
385 TileVirtXY(thd->selend.x, thd->selend.y), |
389 (semaphore << 3) | (trackstat << 4) | (_patches.drag_signals_density << 24), |
386 p2, |
390 CcPlaySound1E, |
387 CcPlaySound1E, |
391 _remove_button_clicked ? |
388 _remove_button_clicked ? |
392 CMD_REMOVE_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM) : |
389 CMD_REMOVE_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM) : |
393 CMD_BUILD_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE) |
390 CMD_BUILD_SIGNAL_TRACK | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE) |
394 ); |
391 ); |