src/rail_gui.cpp
changeset 5982 54218ea5af1e
parent 5947 45b168de41f3
child 5986 1b9ab9629d36
equal deleted inserted replaced
5981:7aa1a23cd1e4 5982:54218ea5af1e
   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 	);