mirror of https://github.com/OpenTTD/OpenTTD
(svn r3857) Add and use GetBridgeRampDirection()
Note: This slightly changes the behavior of GetAnyRoadBits() to only return a road piece for the start of the bridge ramp instead of a full ROAD_[XY]release/0.5
parent
b2412f7472
commit
42d1731cc1
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "../../stdafx.h"
|
#include "../../stdafx.h"
|
||||||
#include "../../openttd.h"
|
#include "../../openttd.h"
|
||||||
|
#include "../../bridge_map.h"
|
||||||
#include "../../functions.h"
|
#include "../../functions.h"
|
||||||
#include "../../map.h"
|
#include "../../map.h"
|
||||||
#include "../../rail_map.h"
|
#include "../../rail_map.h"
|
||||||
|
@ -2161,7 +2162,7 @@ static bool AiRemoveTileAndGoForward(Player *p)
|
||||||
|
|
||||||
// Check if the bridge points in the right direction.
|
// Check if the bridge points in the right direction.
|
||||||
// This is not really needed the first place AiRemoveTileAndGoForward is called.
|
// This is not really needed the first place AiRemoveTileAndGoForward is called.
|
||||||
if ((_m[tile].m5 & 1) != (p->ai.cur_dir_a & 1)) return false;
|
if (DiagDirToAxis(GetBridgeRampDirection(tile)) != (p->ai.cur_dir_a & 1U)) return false;
|
||||||
|
|
||||||
// Find other side of bridge.
|
// Find other side of bridge.
|
||||||
offs = TileOffsByDir(p->ai.cur_dir_a);
|
offs = TileOffsByDir(p->ai.cur_dir_a);
|
||||||
|
@ -3673,18 +3674,18 @@ pos_3:
|
||||||
CMD_REMOVE_ROAD);
|
CMD_REMOVE_ROAD);
|
||||||
}
|
}
|
||||||
} else if (IsTileType(tile, MP_TUNNELBRIDGE)) {
|
} else if (IsTileType(tile, MP_TUNNELBRIDGE)) {
|
||||||
byte b;
|
|
||||||
|
|
||||||
if (!IsTileOwner(tile, _current_player) || (_m[tile].m5 & 0xC6) != 0x80)
|
if (!IsTileOwner(tile, _current_player) || (_m[tile].m5 & 0xC6) != 0x80)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m5 = 0;
|
m5 = 0;
|
||||||
|
|
||||||
b = _m[tile].m5 & 0x21;
|
switch (GetBridgeRampDirection(tile)) {
|
||||||
if (b == 0) goto pos_0;
|
default:
|
||||||
if (b == 1) goto pos_3;
|
case DIAGDIR_NE: goto pos_2;
|
||||||
if (b == 0x20) goto pos_2;
|
case DIAGDIR_SE: goto pos_3;
|
||||||
goto pos_1;
|
case DIAGDIR_SW: goto pos_0;
|
||||||
|
case DIAGDIR_NW: goto pos_1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
bridge_map.h
13
bridge_map.h
|
@ -3,12 +3,25 @@
|
||||||
#ifndef BRIDGE_MAP_H
|
#ifndef BRIDGE_MAP_H
|
||||||
#define BRIDGE_MAP_H
|
#define BRIDGE_MAP_H
|
||||||
|
|
||||||
|
#include "direction.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include "rail.h"
|
#include "rail.h"
|
||||||
#include "tile.h"
|
#include "tile.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the direction pointing onto the bridge
|
||||||
|
*/
|
||||||
|
static inline DiagDirection GetBridgeRampDirection(TileIndex t)
|
||||||
|
{
|
||||||
|
/* Heavy wizardry to convert the X/Y (bit 0) + N/S (bit 5) encoding of
|
||||||
|
* bridges to a DiagDirection
|
||||||
|
*/
|
||||||
|
return (DiagDirection)((6 - (_m[t].m5 >> 4 & 2) - (_m[t].m5 & 1)) % 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline void SetClearUnderBridge(TileIndex t)
|
static inline void SetClearUnderBridge(TileIndex t)
|
||||||
{
|
{
|
||||||
SetTileOwner(t, OWNER_NONE);
|
SetTileOwner(t, OWNER_NONE);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "openttd.h"
|
#include "openttd.h"
|
||||||
|
#include "bridge_map.h"
|
||||||
#include "functions.h"
|
#include "functions.h"
|
||||||
#include "road_map.h"
|
#include "road_map.h"
|
||||||
#include "station.h"
|
#include "station.h"
|
||||||
|
@ -33,7 +34,7 @@ RoadBits GetAnyRoadBits(TileIndex tile)
|
||||||
} else {
|
} else {
|
||||||
// ending
|
// ending
|
||||||
if (GB(_m[tile].m5, 1, 2) != TRANSPORT_ROAD) return 0; // not a road bridge
|
if (GB(_m[tile].m5, 1, 2) != TRANSPORT_ROAD) return 0; // not a road bridge
|
||||||
return _m[tile].m5 & 1 ? ROAD_Y : ROAD_X;
|
return DiagDirToRoadBits(ReverseDiagDir(GetBridgeRampDirection(tile)));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// tunnel
|
// tunnel
|
||||||
|
|
|
@ -73,7 +73,7 @@ static inline DiagDirection GetRoadDepotDirection(TileIndex tile)
|
||||||
* Special behavior:
|
* Special behavior:
|
||||||
* - road depots: entrance is treated as road piece
|
* - road depots: entrance is treated as road piece
|
||||||
* - road tunnels: entrance is treated as road piece
|
* - road tunnels: entrance is treated as road piece
|
||||||
* - bridge ramps: treated as straight road
|
* - bridge ramps: start of the ramp is treated as road piece
|
||||||
* - bridge middle parts: bridge itself is ignored
|
* - bridge middle parts: bridge itself is ignored
|
||||||
*/
|
*/
|
||||||
RoadBits GetAnyRoadBits(TileIndex);
|
RoadBits GetAnyRoadBits(TileIndex);
|
||||||
|
|
|
@ -1019,10 +1019,9 @@ static void DrawTile_TunnelBridge(TileInfo *ti)
|
||||||
if (f) DrawFoundation(ti, f);
|
if (f) DrawFoundation(ti, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cope for the direction of the bridge */
|
// HACK Wizardry to convert the bridge ramp direction into a sprite offset
|
||||||
if (HASBIT(ti->map5, 0)) base_offset++;
|
base_offset += (6 - GetBridgeRampDirection(ti->tile)) % 4;
|
||||||
|
|
||||||
if (ti->map5 & 0x20) base_offset += 2; // which side
|
|
||||||
if (ti->tileh == 0) base_offset += 4; // sloped bridge head
|
if (ti->tileh == 0) base_offset += 4; // sloped bridge head
|
||||||
|
|
||||||
/* Table number 6 always refers to the bridge heads for any bridge type */
|
/* Table number 6 always refers to the bridge heads for any bridge type */
|
||||||
|
|
Loading…
Reference in New Issue