|
|
/* $Id$ */
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
#include "openttd.h"
|
|
|
#include "bridge_map.h"
|
|
|
#include "rail_map.h"
|
|
|
#include "road_map.h"
|
|
|
#include "sprite.h"
|
|
|
#include "table/sprites.h"
|
|
|
#include "table/strings.h"
|
|
|
#include "functions.h"
|
|
|
#include "map.h"
|
|
|
#include "tile.h"
|
|
|
#include "town_map.h"
|
|
|
#include "vehicle.h"
|
|
|
#include "viewport.h"
|
|
|
#include "command.h"
|
|
|
#include "player.h"
|
|
|
#include "town.h"
|
|
|
#include "gfx.h"
|
|
|
#include "sound.h"
|
|
|
#include "yapf/yapf.h"
|
|
|
#include "depot.h"
|
|
|
|
|
|
void RoadVehEnterDepot(Vehicle *v);
|
|
|
|
|
|
|
|
|
static uint CountRoadBits(RoadBits r)
|
|
|
{
|
|
|
uint count = 0;
|
|
|
|
|
|
if (r & ROAD_NW) ++count;
|
|
|
if (r & ROAD_SW) ++count;
|
|
|
if (r & ROAD_SE) ++count;
|
|
|
if (r & ROAD_NE) ++count;
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
|
|
|
static bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, bool* edge_road)
|
|
|
{
|
|
|
RoadBits present;
|
|
|
RoadBits n;
|
|
|
byte owner;
|
|
|
*edge_road = true;
|
|
|
|
|
|
if (_game_mode == GM_EDITOR) return true;
|
|
|
|
|
|
// Only do the special processing for actual players.
|
|
|
if (_current_player >= MAX_PLAYERS) return true;
|
|
@@ -1036,49 +1034,49 @@ static void GetTileDesc_Road(TileIndex t
|
|
|
default: td->str = _road_tile_strings[GetRoadside(tile)]; break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static const byte _roadveh_enter_depot_unk0[4] = {
|
|
|
8, 9, 0, 1
|
|
|
};
|
|
|
|
|
|
static uint32 VehicleEnter_Road(Vehicle *v, TileIndex tile, int x, int y)
|
|
|
{
|
|
|
switch (GetRoadTileType(tile)) {
|
|
|
case ROAD_TILE_CROSSING:
|
|
|
if (v->type == VEH_Train && !IsCrossingBarred(tile)) {
|
|
|
/* train crossing a road */
|
|
|
SndPlayVehicleFx(SND_0E_LEVEL_CROSSING, v);
|
|
|
BarCrossing(tile);
|
|
|
MarkTileDirtyByTile(tile);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ROAD_TILE_DEPOT:
|
|
|
if (v->type == VEH_Road &&
|
|
|
v->u.road.frame == 11 &&
|
|
|
_roadveh_enter_depot_unk0[GetRoadDepotDirection(tile)] == v->u.road.state) {
|
|
|
RoadVehEnterDepot(v);
|
|
|
VehicleEnterDepot(v);
|
|
|
return 4;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
default: break;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
static void ChangeTileOwner_Road(TileIndex tile, PlayerID old_player, PlayerID new_player)
|
|
|
{
|
|
|
if (IsLevelCrossing(tile) && GetCrossingRoadOwner(tile) == old_player) {
|
|
|
SetCrossingRoadOwner(tile, new_player == OWNER_SPECTATOR ? OWNER_NONE : new_player);
|
|
|
}
|
|
|
|
|
|
if (!IsTileOwner(tile, old_player)) return;
|
|
|
|
|
|
if (new_player != OWNER_SPECTATOR) {
|
|
|
SetTileOwner(tile, new_player);
|
|
|
} else {
|
|
|
switch (GetRoadTileType(tile)) {
|
|
|
case ROAD_TILE_NORMAL:
|
|
|
SetTileOwner(tile, OWNER_NONE);
|