src/station_cmd.cpp
changeset 9016 2b722bde93ec
parent 9015 4a44c6974ac1
child 9059 04edde3eb0c6
equal deleted inserted replaced
9015:4a44c6974ac1 9016:2b722bde93ec
  1463 		rs_auto_delete.Detach();
  1463 		rs_auto_delete.Detach();
  1464 	}
  1464 	}
  1465 	return cost;
  1465 	return cost;
  1466 }
  1466 }
  1467 
  1467 
       
  1468 
       
  1469 static void *ClearRoadStopStatusEnum(Vehicle *v, void *)
       
  1470 {
       
  1471 	if (v->type == VEH_ROAD) ClrBit(v->u.road.state, RVS_IN_DT_ROAD_STOP);
       
  1472 
       
  1473 	return NULL;
       
  1474 }
       
  1475 
       
  1476 
  1468 /** Remove a bus station
  1477 /** Remove a bus station
  1469  * @param st Station to remove
  1478  * @param st Station to remove
  1470  * @param flags operation to perform
  1479  * @param flags operation to perform
  1471  * @param tile TileIndex been queried
  1480  * @param tile TileIndex been queried
  1472  * @return cost or failure of operation
  1481  * @return cost or failure of operation
  1489 		cur_stop = GetRoadStopByTile(tile, RoadStop::BUS);
  1498 		cur_stop = GetRoadStopByTile(tile, RoadStop::BUS);
  1490 	}
  1499 	}
  1491 
  1500 
  1492 	assert(cur_stop != NULL);
  1501 	assert(cur_stop != NULL);
  1493 
  1502 
  1494 	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
  1503 	/* don't do the check for drive-through road stops when company bankrupts */
       
  1504 	if (IsDriveThroughStopTile(tile) && (flags & DC_BANKRUPT)) {
       
  1505 		/* remove the 'going through road stop' status from all vehicles on that tile */
       
  1506 		if (flags & DC_EXEC) VehicleFromPos(tile, NULL, &ClearRoadStopStatusEnum);
       
  1507 	} else {
       
  1508 		if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
       
  1509 	}
  1495 
  1510 
  1496 	if (flags & DC_EXEC) {
  1511 	if (flags & DC_EXEC) {
  1497 		if (*primary_stop == cur_stop) {
  1512 		if (*primary_stop == cur_stop) {
  1498 			/* removed the first stop in the list */
  1513 			/* removed the first stop in the list */
  1499 			*primary_stop = cur_stop->next;
  1514 			*primary_stop = cur_stop->next;
  1903 	if (!IsValidPlayer(_current_player))  return_cmd_error(INVALID_STRING_ID);
  1918 	if (!IsValidPlayer(_current_player))  return_cmd_error(INVALID_STRING_ID);
  1904 
  1919 
  1905 	TileIndex tile = st->dock_tile;
  1920 	TileIndex tile = st->dock_tile;
  1906 
  1921 
  1907 	if (HasStationInUse(st->index, INVALID_PLAYER)) return_cmd_error(STR_BUOY_IS_IN_USE);
  1922 	if (HasStationInUse(st->index, INVALID_PLAYER)) return_cmd_error(STR_BUOY_IS_IN_USE);
  1908 	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
  1923 	/* remove the buoy if there is a ship on tile when company goes bankrupt... */
       
  1924 	if (!(flags & DC_BANKRUPT) && !EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
  1909 
  1925 
  1910 	if (flags & DC_EXEC) {
  1926 	if (flags & DC_EXEC) {
  1911 		st->dock_tile = 0;
  1927 		st->dock_tile = 0;
  1912 		/* Buoys are marked in the Station struct by this flag. Yes, it is this
  1928 		/* Buoys are marked in the Station struct by this flag. Yes, it is this
  1913 		 * braindead.. */
  1929 		 * braindead.. */
  2889 		SetTileOwner(tile, new_player);
  2905 		SetTileOwner(tile, new_player);
  2890 		if (!IsBuoy(tile)) st->owner = new_player; // do not set st->owner for buoys
  2906 		if (!IsBuoy(tile)) st->owner = new_player; // do not set st->owner for buoys
  2891 		RebuildStationLists();
  2907 		RebuildStationLists();
  2892 		InvalidateWindowClasses(WC_STATION_LIST);
  2908 		InvalidateWindowClasses(WC_STATION_LIST);
  2893 	} else {
  2909 	} else {
  2894 		if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile)) {
  2910 		if (IsDriveThroughStopTile(tile)) {
  2895 			/* For a drive-through stop on a town-owned road remove the stop and replace the road */
  2911 			/* Remove the drive-through road stop */
  2896 			DoCommand(tile, 0, (GetStationType(tile) == STATION_TRUCK) ? RoadStop::TRUCK : RoadStop::BUS, DC_EXEC | DC_BANKRUPT, CMD_REMOVE_ROAD_STOP);
  2912 			DoCommand(tile, 0, (GetStationType(tile) == STATION_TRUCK) ? RoadStop::TRUCK : RoadStop::BUS, DC_EXEC | DC_BANKRUPT, CMD_REMOVE_ROAD_STOP);
       
  2913 			assert(IsTileType(tile, MP_ROAD));
       
  2914 			/* Change owner of tile and all roadtypes */
       
  2915 			ChangeTileOwner(tile, old_player, new_player);
  2897 		} else {
  2916 		} else {
  2898 			DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR);
  2917 			DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR);
       
  2918 			/* Set tile owner of water under (now removed) buoy and dock to OWNER_NONE.
       
  2919 			 * Update owner of buoy if it was not removed (was in orders).
       
  2920 			 * Do not update when owned by OWNER_WATER (sea and rivers). */
       
  2921 			if ((IsTileType(tile, MP_WATER) || IsBuoyTile(tile)) && IsTileOwner(tile, old_player)) SetTileOwner(tile, OWNER_NONE);
  2899 		}
  2922 		}
  2900 	}
  2923 	}
  2901 }
  2924 }
  2902 
  2925 
  2903 /**
  2926 /**