|
@@ -245,25 +245,25 @@ static uint32 CheckRoadSlope(Slope tileh
|
|
|
if (IsSteepSlope(tileh)) return CMD_ERROR;
|
|
|
road_bits = *pieces | existing;
|
|
|
|
|
|
// no special foundation
|
|
|
if ((~_valid_tileh_slopes_road[0][tileh] & road_bits) == 0) {
|
|
|
// force that all bits are set when we have slopes
|
|
|
if (tileh != SLOPE_FLAT) *pieces |= _valid_tileh_slopes_road[0][tileh];
|
|
|
return 0; // no extra cost
|
|
|
}
|
|
|
|
|
|
// foundation is used. Whole tile is leveled up
|
|
|
if ((~_valid_tileh_slopes_road[1][tileh] & road_bits) == 0) {
|
|
|
return existing ? 0 : _price.terraform;
|
|
|
return existing != 0 ? 0 : _price.terraform;
|
|
|
}
|
|
|
|
|
|
// partly leveled up tile, only if there's no road on that tile
|
|
|
if (existing == 0 && (tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)) {
|
|
|
// force full pieces.
|
|
|
*pieces |= (*pieces & 0xC) >> 2;
|
|
|
*pieces |= (*pieces & 0x3) << 2;
|
|
|
if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform;
|
|
|
}
|
|
|
return CMD_ERROR;
|
|
|
}
|
|
|
|
|
@@ -793,25 +793,26 @@ static void DrawTile_Road(TileInfo *ti)
|
|
|
if (player < MAX_PLAYERS) ormod = PLAYER_SPRITE_COLOR(player);
|
|
|
|
|
|
drss = _road_display_datas[GetRoadDepotDirection(ti->tile)];
|
|
|
|
|
|
DrawGroundSprite(drss++->image);
|
|
|
|
|
|
for (; drss->image != 0; drss++) {
|
|
|
uint32 image = drss->image;
|
|
|
|
|
|
if (image & PALETTE_MODIFIER_COLOR) image |= ormod;
|
|
|
if (_display_opt & DO_TRANS_BUILDINGS) MAKE_TRANSPARENT(image);
|
|
|
|
|
|
AddSortableSpriteToDraw(image, ti->x | drss->subcoord_x,
|
|
|
AddSortableSpriteToDraw(
|
|
|
image, ti->x | drss->subcoord_x,
|
|
|
ti->y | drss->subcoord_y, drss->width, drss->height, 0x14, ti->z
|
|
|
);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void DrawRoadDepotSprite(int x, int y, int image)
|
|
|
{
|
|
|
const DrawRoadSeqStruct* dtss = _road_display_datas[image];
|
|
|
uint32 ormod = PLAYER_SPRITE_COLOR(_local_player);
|
|
@@ -885,55 +886,52 @@ static const Roadside _town_road_types[]
|
|
|
|
|
|
static const Roadside _town_road_types_2[][2] = {
|
|
|
{ ROADSIDE_GRASS, ROADSIDE_GRASS },
|
|
|
{ ROADSIDE_PAVED, ROADSIDE_PAVED },
|
|
|
{ ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED },
|
|
|
{ ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED },
|
|
|
{ ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED }
|
|
|
};
|
|
|
|
|
|
|
|
|
static void TileLoop_Road(TileIndex tile)
|
|
|
{
|
|
|
Town *t;
|
|
|
int grp;
|
|
|
|
|
|
switch (_opt.landscape) {
|
|
|
case LT_HILLY:
|
|
|
if (IsOnSnow(tile) != (GetTileZ(tile) > _opt.snow_line)) {
|
|
|
ToggleSnow(tile);
|
|
|
MarkTileDirtyByTile(tile);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case LT_DESERT:
|
|
|
if (GetTropicZone(tile) == TROPICZONE_DESERT && !IsOnDesert(tile)) {
|
|
|
ToggleDesert(tile);
|
|
|
MarkTileDirtyByTile(tile);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) return;
|
|
|
|
|
|
if (!HasRoadWorks(tile)) {
|
|
|
t = ClosestTownFromTile(tile, (uint)-1);
|
|
|
const Town* t = ClosestTownFromTile(tile, (uint)-1);
|
|
|
int grp = 0;
|
|
|
|
|
|
grp = 0;
|
|
|
if (t != NULL) {
|
|
|
grp = GetTownRadiusGroup(t, tile);
|
|
|
|
|
|
// Show an animation to indicate road work
|
|
|
if (t->road_build_months != 0 &&
|
|
|
!(DistanceManhattan(t->xy, tile) >= 8 && grp == 0) &&
|
|
|
(DistanceManhattan(t->xy, tile) < 8 || grp != 0) &&
|
|
|
GetRoadTileType(tile) == ROAD_TILE_NORMAL && (GetRoadBits(tile) == ROAD_X || GetRoadBits(tile) == ROAD_Y)) {
|
|
|
if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicle(tile) && CHANCE16(1, 20)) {
|
|
|
StartRoadWorks(tile);
|
|
|
|
|
|
SndPlayTileFx(SND_21_JACKHAMMER, tile);
|
|
|
CreateEffectVehicleAbove(
|
|
|
TileX(tile) * TILE_SIZE + 7,
|
|
|
TileY(tile) * TILE_SIZE + 7,
|
|
|
0,
|
|
|
EV_BULLDOZER);
|
|
|
MarkTileDirtyByTile(tile);
|
|
|
return;
|
|
@@ -992,25 +990,24 @@ static uint32 GetTileTrackStatus_Road(Ti
|
|
|
return HasRoadWorks(tile) ? 0 : _road_trackbits[GetRoadBits(tile)] * 0x101;
|
|
|
|
|
|
case ROAD_TILE_CROSSING: {
|
|
|
uint32 r = (GetCrossingRoadAxis(tile) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y) * 0x101;
|
|
|
|
|
|
if (IsCrossingBarred(tile)) r *= 0x10001;
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
case ROAD_TILE_DEPOT:
|
|
|
return (DiagDirToAxis(GetRoadDepotDirection(tile)) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y) * 0x101;
|
|
|
break;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
default: break;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static const StringID _road_tile_strings[] = {
|
|
|
STR_1814_ROAD,
|
|
|
STR_1814_ROAD,
|
|
|
STR_1814_ROAD,
|
|
@@ -1039,30 +1036,30 @@ static uint32 VehicleEnter_Road(Vehicle
|
|
|
{
|
|
|
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) {
|
|
|
if (_roadveh_enter_depot_unk0[GetRoadDepotDirection(tile)] == v->u.road.state) {
|
|
|
if (v->type == VEH_Road &&
|
|
|
v->u.road.frame == 11 &&
|
|
|
_roadveh_enter_depot_unk0[GetRoadDepotDirection(tile)] == v->u.road.state) {
|
|
|
RoadVehEnterDepot(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);
|