equal
deleted
inserted
replaced
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); |