Changeset - r3101:528c6b45c2fa
[Not reviewed]
master
0 3 1
tron - 19 years ago 2006-03-01 08:56:38
tron@openttd.org
(svn r3696) Add functions to turn a tile into a normal rail tile/depot/waypoint. This is just a tiny step, the rail code needs way more love and caring
4 files changed with 71 insertions and 29 deletions:
0 comments (0 inline, 0 general)
rail_cmd.c
Show inline comments
 
@@ -4,6 +4,7 @@
 
#include "openttd.h"
 
#include "debug.h"
 
#include "functions.h"
 
#include "rail_map.h"
 
#include "road.h"
 
#include "table/sprites.h"
 
#include "table/strings.h"
 
@@ -372,13 +373,7 @@ int32 CmdBuildSingleRail(int x, int y, u
 
			if (CmdFailed(ret)) return ret;
 
			cost += ret;
 

	
 
			if (flags & DC_EXEC) {
 
				SetTileType(tile, MP_RAILWAY);
 
				SetTileOwner(tile, _current_player);
 
				_m[tile].m2 = 0; // Bare land
 
				_m[tile].m3 = p1; // No signals, rail type
 
				_m[tile].m5 = trackbit;
 
			}
 
			if (flags & DC_EXEC) MakeRailNormal(tile, _current_player, trackbit, p1);
 
			break;
 
	}
 

	
 
@@ -681,12 +676,8 @@ int32 CmdBuildTrainDepot(int x, int y, u
 
	if (flags & DC_EXEC) {
 
		if (IsLocalPlayer()) _last_built_train_depot_tile = tile;
 

	
 
		ModifyTile(tile,
 
			MP_SETTYPE(MP_RAILWAY) |
 
			MP_MAP3LO | MP_MAPOWNER_CURRENT | MP_MAP5,
 
			p1, /* map3_lo */
 
			p2 | RAIL_TYPE_DEPOT_WAYPOINT /* map5 */
 
		);
 
		MakeRailDepot(tile, _current_player, p2, p1);
 
		MarkTileDirtyByTile(tile);
 

	
 
		d->xy = tile;
 
		d->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
rail_map.h
Show inline comments
 
new file 100644
 
/* $Id$ */
 

	
 
#ifndef RAIL_MAP_H
 
#define RAIL_MAP_H
 

	
 
#include "rail.h"
 
#include "tile.h"
 
#include "waypoint.h"
 

	
 

	
 
static inline TrackBits GetRailWaypointBits(TileIndex t)
 
{
 
	return _m[t].m5 & RAIL_WAYPOINT_TRACK_MASK ? TRACK_BIT_DIAG2 : TRACK_BIT_DIAG1;
 
}
 

	
 

	
 
static inline void MakeRailNormal(TileIndex t, Owner o, TrackBits b, RailType r)
 
{
 
	SetTileType(t, MP_RAILWAY);
 
	SetTileOwner(t, o);
 
	_m[t].m2 = 0;
 
	_m[t].m3 = r;
 
	_m[t].m4 = 0;
 
	_m[t].m5 = RAIL_TYPE_NORMAL | b;
 
}
 

	
 

	
 
static inline void MakeRailDepot(TileIndex t, Owner o, DiagDirection d, RailType r)
 
{
 
	SetTileType(t, MP_RAILWAY);
 
	SetTileOwner(t, o);
 
	_m[t].m2 = 0;
 
	_m[t].m3 = r;
 
	_m[t].m4 = 0;
 
	_m[t].m5 = RAIL_TYPE_DEPOT_WAYPOINT | RAIL_SUBTYPE_DEPOT | d;
 
}
 

	
 

	
 
static inline void MakeRailWaypoint(TileIndex t, Owner o, Axis a, RailType r, uint index)
 
{
 
	SetTileType(t, MP_RAILWAY);
 
	SetTileOwner(t, o);
 
	_m[t].m2 = index;
 
	_m[t].m3 = r;
 
	_m[t].m4 = 0;
 
	_m[t].m5 = RAIL_TYPE_DEPOT_WAYPOINT | RAIL_SUBTYPE_WAYPOINT | a;
 
}
 

	
 
#endif
road_cmd.c
Show inline comments
 
@@ -2,6 +2,7 @@
 

	
 
#include "stdafx.h"
 
#include "openttd.h"
 
#include "rail_map.h"
 
#include "road.h"
 
#include "table/sprites.h"
 
#include "table/strings.h"
 
@@ -234,26 +235,22 @@ int32 CmdRemoveRoad(int x, int y, uint32
 
				}
 

	
 
				case ROAD_CROSSING: {
 
					byte c;
 
					TrackBits track;
 

	
 
					if (!(ti.map5 & 8)) {
 
						c = 2;
 
						if (pieces & ROAD_Y) goto return_error;
 
						track = TRACK_BIT_DIAG2;
 
					} else {
 
						c = 1;
 
						if (pieces & ROAD_X) goto return_error;
 
						track = TRACK_BIT_DIAG1;
 
					}
 

	
 
					cost = _price.remove_road * 2;
 
					if (flags & DC_EXEC) {
 
						ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
 

	
 
						ModifyTile(tile,
 
							MP_SETTYPE(MP_RAILWAY) |
 
							MP_MAP2_CLEAR | MP_MAP3LO | MP_MAP3HI_CLEAR | MP_MAP5,
 
							_m[tile].m4 & 0xF, /* map3_lo */
 
							c											/* map5 */
 
						);
 
						MakeRailNormal(tile, GetTileOwner(tile), track, GB(_m[tile].m4, 0, 4));
 
						MarkTileDirtyByTile(tile);
 
					}
 
					return cost;
 
				}
waypoint.c
Show inline comments
 
@@ -8,6 +8,7 @@
 
#include "gfx.h"
 
#include "map.h"
 
#include "order.h"
 
#include "rail_map.h"
 
#include "saveload.h"
 
#include "station.h"
 
#include "tile.h"
 
@@ -174,15 +175,19 @@ int32 CmdBuildTrainWaypoint(int x, int y
 
	TileIndex tile = TileVirtXY(x, y);
 
	Waypoint *wp;
 
	uint tileh;
 
	uint dir;
 
	Axis axis;
 

	
 
	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 

	
 
	/* if custom gfx are used, make sure it is within bounds */
 
	if (p1 >= GetNumCustomStations(STAT_CLASS_WAYP)) return CMD_ERROR;
 

	
 
	if (!IsTileType(tile, MP_RAILWAY) || ((dir = 0, _m[tile].m5 != 1) && (dir = 1, _m[tile].m5 != 2)))
 
	if (!IsTileType(tile, MP_RAILWAY) || (
 
				(axis = AXIS_X, _m[tile].m5 != TRACK_BIT_DIAG1) &&
 
				(axis = AXIS_Y, _m[tile].m5 != TRACK_BIT_DIAG2)
 
			)) {
 
		return_cmd_error(STR_1005_NO_SUITABLE_RAILROAD_TRACK);
 
	}
 

	
 
	if (!CheckTileOwnership(tile))
 
		return CMD_ERROR;
 
@@ -191,7 +196,7 @@ int32 CmdBuildTrainWaypoint(int x, int y
 

	
 
	tileh = GetTileSlope(tile, NULL);
 
	if (tileh != 0) {
 
		if (!_patches.build_on_slopes || IsSteepTileh(tileh) || !(tileh & (0x3 << dir)) || !(tileh & ~(0x3 << dir)))
 
		if (!_patches.build_on_slopes || IsSteepTileh(tileh) || !(tileh & (0x3 << axis)) || !(tileh & ~(0x3 << axis)))
 
			return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 
	}
 

	
 
@@ -208,7 +213,8 @@ int32 CmdBuildTrainWaypoint(int x, int y
 

	
 
	if (flags & DC_EXEC) {
 
		const StationSpec *spec = NULL;
 
		ModifyTile(tile, MP_MAP2 | MP_MAP5, wp->index, RAIL_TYPE_WAYPOINT | dir);
 
		MakeRailWaypoint(tile, GetTileOwner(tile), axis, GB(_m[tile].m3, 0, 4), wp->index);
 
		MarkTileDirtyByTile(tile);
 

	
 
		if (GB(p1, 0, 8) < GetNumCustomStations(STAT_CLASS_WAYP))
 
			spec = GetCustomStation(STAT_CLASS_WAYP, GB(p1, 0, 8));
 
@@ -294,9 +300,8 @@ int32 RemoveTrainWaypoint(TileIndex tile
 
		RedrawWaypointSign(wp);
 

	
 
		if (justremove) {
 
			ModifyTile(tile, MP_MAP2_CLEAR | MP_MAP5, 1<<direction);
 
			CLRBIT(_m[tile].m3, 4);
 
			_m[tile].m4 = 0;
 
			MakeRailNormal(tile, GetTileOwner(tile), GetRailWaypointBits(tile), GB(_m[tile].m3, 0, 4));
 
			MarkTileDirtyByTile(tile);
 
		} else {
 
			DoClearSquare(tile);
 
			SetSignalsOnBothDir(tile, direction);
0 comments (0 inline, 0 general)