src/roadveh_cmd.cpp
changeset 6691 f9adbb0be102
parent 6687 c7b92f03d33f
child 6692 bc84bd50e3e6
equal deleted inserted replaced
6690:de0a758369eb 6691:f9adbb0be102
   470 	v = GetVehicle(p1);
   470 	v = GetVehicle(p1);
   471 
   471 
   472 	if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
   472 	if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
   473 
   473 
   474 	if (v->vehstatus & VS_STOPPED ||
   474 	if (v->vehstatus & VS_STOPPED ||
       
   475 			v->u.road.roadtype == ROADTYPE_TRAM ||
   475 			v->u.road.crashed_ctr != 0 ||
   476 			v->u.road.crashed_ctr != 0 ||
   476 			v->breakdown_ctr != 0 ||
   477 			v->breakdown_ctr != 0 ||
   477 			v->u.road.overtaking != 0 ||
   478 			v->u.road.overtaking != 0 ||
   478 			v->u.road.state == RVSB_WORMHOLE ||
   479 			v->u.road.state == RVSB_WORMHOLE ||
   479 			IsRoadVehInDepot(v) ||
   480 			IsRoadVehInDepot(v) ||
   834 
   835 
   835 			st->had_vehicle_of_type |= HVOT_BUS;
   836 			st->had_vehicle_of_type |= HVOT_BUS;
   836 			SetDParam(0, st->index);
   837 			SetDParam(0, st->index);
   837 			flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
   838 			flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
   838 			AddNewsItem(
   839 			AddNewsItem(
   839 				STR_902F_CITIZENS_CELEBRATE_FIRST,
   840 				v->u.road.roadtype == ROADTYPE_ROAD ? STR_902F_CITIZENS_CELEBRATE_FIRST : STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM,
   840 				flags,
   841 				flags,
   841 				v->index,
   842 				v->index,
   842 				0);
   843 				0);
   843 		}
   844 		}
   844 	} else {
   845 	} else {
   848 
   849 
   849 			st->had_vehicle_of_type |= HVOT_TRUCK;
   850 			st->had_vehicle_of_type |= HVOT_TRUCK;
   850 			SetDParam(0, st->index);
   851 			SetDParam(0, st->index);
   851 			flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
   852 			flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
   852 			AddNewsItem(
   853 			AddNewsItem(
   853 				STR_9030_CITIZENS_CELEBRATE_FIRST,
   854 				v->u.road.roadtype == ROADTYPE_ROAD ? STR_9030_CITIZENS_CELEBRATE_FIRST : STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM,
   854 				flags,
   855 				flags,
   855 				v->index,
   856 				v->index,
   856 				0
   857 				0
   857 			);
   858 			);
   858 		}
   859 		}
  1301 
  1302 
  1302 		dir = GetRoadDepotDirection(v->tile);
  1303 		dir = GetRoadDepotDirection(v->tile);
  1303 		v->direction = DiagDirToDir(dir);
  1304 		v->direction = DiagDirToDir(dir);
  1304 
  1305 
  1305 		tdir = _roadveh_depot_exit_trackdir[dir];
  1306 		tdir = _roadveh_depot_exit_trackdir[dir];
  1306 		rdp = _road_drive_data[(_opt.road_side << RVS_DRIVE_SIDE) + tdir];
  1307 		rdp = _road_drive_data[v->u.road.roadtype][(_opt.road_side << RVS_DRIVE_SIDE) + tdir];
  1307 
  1308 
  1308 		x = TileX(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].x & 0xF);
  1309 		x = TileX(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].x & 0xF);
  1309 		y = TileY(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].y & 0xF);
  1310 		y = TileY(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].y & 0xF);
  1310 
  1311 
  1311 		if (RoadVehFindCloseTo(v, x, y, v->direction) != NULL) return;
  1312 		if (RoadVehFindCloseTo(v, x, y, v->direction) != NULL) return;
  1370 	}
  1371 	}
  1371 
  1372 
  1372 	/* Get move position data for next frame.
  1373 	/* Get move position data for next frame.
  1373 	 * For a drive-through road stop use 'straight road' move data.
  1374 	 * For a drive-through road stop use 'straight road' move data.
  1374 	 * In this case v->u.road.state is masked to give the road stop entry direction. */
  1375 	 * In this case v->u.road.state is masked to give the road stop entry direction. */
  1375 	rd = _road_drive_data[(
  1376 	rd = _road_drive_data[v->u.road.roadtype][(
  1376 		(HASBIT(v->u.road.state, RVS_IN_DT_ROAD_STOP) ? v->u.road.state & RVSB_ROAD_STOP_TRACKDIR_MASK : v->u.road.state) +
  1377 		(HASBIT(v->u.road.state, RVS_IN_DT_ROAD_STOP) ? v->u.road.state & RVSB_ROAD_STOP_TRACKDIR_MASK : v->u.road.state) +
  1377 		(_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1];
  1378 		(_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1];
  1378 
  1379 
  1379 	if (rd.x & RDE_NEXT_TILE) {
  1380 	if (rd.x & RDE_NEXT_TILE) {
  1380 		TileIndex tile = v->tile + TileOffsByDiagDir(rd.x & 3);
  1381 		TileIndex tile = v->tile + TileOffsByDiagDir(rd.x & 3);
  1389 		}
  1390 		}
  1390 
  1391 
  1391 again:
  1392 again:
  1392 		if (IsReversingRoadTrackdir(dir)) {
  1393 		if (IsReversingRoadTrackdir(dir)) {
  1393 			/* Turning around */
  1394 			/* Turning around */
  1394 			tile = v->tile;
  1395 			if (v->u.road.roadtype == ROADTYPE_TRAM) {
       
  1396 				RoadBits needed; // The road bits the tram needs to be able to turn around
       
  1397 				switch (dir) {
       
  1398 					default: NOT_REACHED();
       
  1399 					case TRACKDIR_RVREV_NE: needed = ROAD_SW; break;
       
  1400 					case TRACKDIR_RVREV_SE: needed = ROAD_NW; break;
       
  1401 					case TRACKDIR_RVREV_SW: needed = ROAD_NE; break;
       
  1402 					case TRACKDIR_RVREV_NW: needed = ROAD_SE; break;
       
  1403 				}
       
  1404 				if (!IsTileType(tile, MP_STREET) || (needed & GetRoadBits(tile, ROADTYPE_TRAM)) == ROAD_NONE) {
       
  1405 					/* The tram cannot turn here */
       
  1406 					v->cur_speed = 0;
       
  1407 					return;
       
  1408 				}
       
  1409 			} else {
       
  1410 				tile = v->tile;
       
  1411 			}
  1395 		}
  1412 		}
  1396 
  1413 
  1397 		/* Get position data for first frame on the new tile */
  1414 		/* Get position data for first frame on the new tile */
  1398 		rdp = _road_drive_data[(dir + (_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking];
  1415 		rdp = _road_drive_data[v->u.road.roadtype][(dir + (_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking];
  1399 
  1416 
  1400 		x = TileX(tile) * TILE_SIZE + rdp[RVC_DEFAULT_START_FRAME].x;
  1417 		x = TileX(tile) * TILE_SIZE + rdp[RVC_DEFAULT_START_FRAME].x;
  1401 		y = TileY(tile) * TILE_SIZE + rdp[RVC_DEFAULT_START_FRAME].y;
  1418 		y = TileY(tile) * TILE_SIZE + rdp[RVC_DEFAULT_START_FRAME].y;
  1402 
  1419 
  1403 		newdir = RoadVehGetSlidingDirection(v, x, y);
  1420 		newdir = RoadVehGetSlidingDirection(v, x, y);
  1460 		if (dir == INVALID_TRACKDIR) {
  1477 		if (dir == INVALID_TRACKDIR) {
  1461 			v->cur_speed = 0;
  1478 			v->cur_speed = 0;
  1462 			return;
  1479 			return;
  1463 		}
  1480 		}
  1464 
  1481 
  1465 		rdp = _road_drive_data[(_opt.road_side << RVS_DRIVE_SIDE) + dir];
  1482 		rdp = _road_drive_data[v->u.road.roadtype][(_opt.road_side << RVS_DRIVE_SIDE) + dir];
  1466 
  1483 
  1467 		x = TileX(v->tile) * TILE_SIZE + rdp[RVC_TURN_AROUND_START_FRAME].x;
  1484 		x = TileX(v->tile) * TILE_SIZE + rdp[RVC_TURN_AROUND_START_FRAME].x;
  1468 		y = TileY(v->tile) * TILE_SIZE + rdp[RVC_TURN_AROUND_START_FRAME].y;
  1485 		y = TileY(v->tile) * TILE_SIZE + rdp[RVC_TURN_AROUND_START_FRAME].y;
  1469 
  1486 
  1470 		newdir = RoadVehGetSlidingDirection(v, x, y);
  1487 		newdir = RoadVehGetSlidingDirection(v, x, y);