src/rail.h
author rubidium
Tue, 25 Dec 2007 23:42:52 +0000
changeset 8138 dbfdc08fa6b9
parent 8123 ce31d2843a95
child 8169 31d57d9de945
permissions -rw-r--r--
(svn r11700) -Codechange: reduce the amount of unnecessary includes.
2186
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2049
diff changeset
     1
/* $Id$ */
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2049
diff changeset
     2
2232
2a0d0328ebbe (svn r2752) -Doc: Added some doxygen stuff to rail.h. I'm gonna mess around with this file and wanted to get rid of this first
celestar
parents: 2186
diff changeset
     3
/** @file rail.h */
2a0d0328ebbe (svn r2752) -Doc: Added some doxygen stuff to rail.h. I'm gonna mess around with this file and wanted to get rid of this first
celestar
parents: 2186
diff changeset
     4
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
diff changeset
     5
#ifndef RAIL_H
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
diff changeset
     6
#define RAIL_H
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
diff changeset
     7
8101
d5357bde8cab (svn r11662) -Codechange: move some rail types/related functions around.
rubidium
parents: 8100
diff changeset
     8
#include "rail_type.h"
d5357bde8cab (svn r11662) -Codechange: move some rail types/related functions around.
rubidium
parents: 8100
diff changeset
     9
#include "track_type.h"
8119
52b48108425a (svn r11680) -Codechange: refactor more out of openttd.h and functions.h.
rubidium
parents: 8116
diff changeset
    10
#include "vehicle_type.h"
8123
ce31d2843a95 (svn r11684) -Codechange: split gfx.h in a type and functional header.
rubidium
parents: 8121
diff changeset
    11
#include "gfx_type.h"
8113
31b7784db761 (svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents: 8108
diff changeset
    12
#include "core/bitmath_func.hpp"
8123
ce31d2843a95 (svn r11684) -Codechange: split gfx.h in a type and functional header.
rubidium
parents: 8121
diff changeset
    13
#include "economy_func.h"
7730
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
    14
#include "variables.h"
8138
dbfdc08fa6b9 (svn r11700) -Codechange: reduce the amount of unnecessary includes.
rubidium
parents: 8123
diff changeset
    15
#include "tile_cmd.h"
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
diff changeset
    16
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    17
/** This struct contains all the info that is needed to draw and construct tracks.
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    18
 */
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6162
diff changeset
    19
struct RailtypeInfo {
2274
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    20
	/** Struct containing the main sprites. @note not all sprites are listed, but only
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    21
	 *  the ones used directly in the code */
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    22
	struct {
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    23
		SpriteID track_y;      ///< single piece of rail in Y direction, with ground
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    24
		SpriteID track_ns;     ///< two pieces of rail in North and South corner (East-West direction)
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    25
		SpriteID ground;       ///< ground sprite for a 3-way switch
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    26
		SpriteID single_y;     ///< single piece of rail in Y direction, without ground
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    27
		SpriteID single_x;     ///< single piece of rail in X direction
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    28
		SpriteID single_n;     ///< single piece of rail in the northern corner
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    29
		SpriteID single_s;     ///< single piece of rail in the southern corner
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    30
		SpriteID single_e;     ///< single piece of rail in the eastern corner
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    31
		SpriteID single_w;     ///< single piece of rail in the western corner
2511
3eb6cb6b750d (svn r3037) Don't deduce the sprites for tunnels and level crossings from magic numbers, but fetch them from the central rail info array. This is a preparation step for electrified rails
tron
parents: 2472
diff changeset
    32
		SpriteID crossing;     ///< level crossing, rail in X direction
3eb6cb6b750d (svn r3037) Don't deduce the sprites for tunnels and level crossings from magic numbers, but fetch them from the central rail info array. This is a preparation step for electrified rails
tron
parents: 2472
diff changeset
    33
		SpriteID tunnel;       ///< tunnel sprites base
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    34
	} base_sprites;
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    35
2274
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    36
	/** struct containing the sprites for the rail GUI. @note only sprites referred to
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    37
	 * directly in the code are listed */
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    38
	struct {
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    39
		SpriteID build_ns_rail;      ///< button for building single rail in N-S direction
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    40
		SpriteID build_x_rail;       ///< button for building single rail in X direction
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    41
		SpriteID build_ew_rail;      ///< button for building single rail in E-W direction
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    42
		SpriteID build_y_rail;       ///< button for building single rail in Y direction
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    43
		SpriteID auto_rail;          ///< button for the autorail construction
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    44
		SpriteID build_depot;        ///< button for building depots
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    45
		SpriteID build_tunnel;       ///< button for building a tunnel
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    46
		SpriteID convert_rail;       ///< button for converting rail
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    47
	} gui_sprites;
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    48
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    49
	struct {
7396
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
    50
		CursorID rail_ns;    ///< Cursor for building rail in N-S direction
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
    51
		CursorID rail_swne;  ///< Cursor for building rail in X direction
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
    52
		CursorID rail_ew;    ///< Cursor for building rail in E-W direction
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
    53
		CursorID rail_nwse;  ///< Cursor for building rail in Y direction
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
    54
		CursorID autorail;   ///< Cursor for autorail tool
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
    55
		CursorID depot;      ///< Cursor for building a depot
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
    56
		CursorID tunnel;     ///< Cursor for building a tunnel
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
    57
		CursorID convert;    ///< Cursor for converting track
2514
859692ffa65a (svn r3040) Don't deduce the cursor sprites when building rails from magic numbers, but fetch them from the central rail info array.
tron
parents: 2511
diff changeset
    58
	} cursor;
859692ffa65a (svn r3040) Don't deduce the cursor sprites when building rails from magic numbers, but fetch them from the central rail info array.
tron
parents: 2511
diff changeset
    59
859692ffa65a (svn r3040) Don't deduce the cursor sprites when building rails from magic numbers, but fetch them from the central rail info array.
tron
parents: 2511
diff changeset
    60
	struct {
2274
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    61
		StringID toolbar_caption;
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    62
	} strings;
2c99425c1086 (svn r2798) -Codechange: Unified the rail toolbars into one that is modified by
celestar
parents: 2254
diff changeset
    63
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    64
	/** sprite number difference between a piece of track on a snowy ground and the corresponding one on normal ground */
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    65
	SpriteID snow_offset;
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    66
3355
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
    67
	/** bitmask to the OTHER railtypes on which an engine of THIS railtype generates power */
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
    68
	RailTypeMask powered_railtypes;
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
    69
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
    70
	/** bitmask to the OTHER railtypes on which an engine of THIS railtype can physically travel */
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
    71
	RailTypeMask compatible_railtypes;
2254
99de94953104 (svn r2774) -Codechange: Removed TRACKTYPE_SPRITE_PITCH globally and replaced it by a member of RailtypeInfo
celestar
parents: 2236
diff changeset
    72
99de94953104 (svn r2774) -Codechange: Removed TRACKTYPE_SPRITE_PITCH globally and replaced it by a member of RailtypeInfo
celestar
parents: 2236
diff changeset
    73
	/**
99de94953104 (svn r2774) -Codechange: Removed TRACKTYPE_SPRITE_PITCH globally and replaced it by a member of RailtypeInfo
celestar
parents: 2236
diff changeset
    74
	 * Offset between the current railtype and normal rail. This means that:<p>
99de94953104 (svn r2774) -Codechange: Removed TRACKTYPE_SPRITE_PITCH globally and replaced it by a member of RailtypeInfo
celestar
parents: 2236
diff changeset
    75
	 * 1) All the sprites in a railset MUST be in the same order. This order
99de94953104 (svn r2774) -Codechange: Removed TRACKTYPE_SPRITE_PITCH globally and replaced it by a member of RailtypeInfo
celestar
parents: 2236
diff changeset
    76
	 *    is determined by normal rail. Check sprites 1005 and following for this order<p>
99de94953104 (svn r2774) -Codechange: Removed TRACKTYPE_SPRITE_PITCH globally and replaced it by a member of RailtypeInfo
celestar
parents: 2236
diff changeset
    77
	 * 2) The position where the railtype is loaded must always be the same, otherwise
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6248
diff changeset
    78
	 *    the offset will fail.
2254
99de94953104 (svn r2774) -Codechange: Removed TRACKTYPE_SPRITE_PITCH globally and replaced it by a member of RailtypeInfo
celestar
parents: 2236
diff changeset
    79
	 * @note: Something more flexible might be desirable in the future.
99de94953104 (svn r2774) -Codechange: Removed TRACKTYPE_SPRITE_PITCH globally and replaced it by a member of RailtypeInfo
celestar
parents: 2236
diff changeset
    80
	 */
99de94953104 (svn r2774) -Codechange: Removed TRACKTYPE_SPRITE_PITCH globally and replaced it by a member of RailtypeInfo
celestar
parents: 2236
diff changeset
    81
	SpriteID total_offset;
2536
634914d741b4 (svn r3065) -Codechange/Add: Modified the bridge drawing code so that the basic offset is read from the RailTypeInfo struct. This is (hopefully) the last DrawTile change on the way to electrified railways. While being at it, de-mystified the function a bit and added some asserts.
celestar
parents: 2520
diff changeset
    82
634914d741b4 (svn r3065) -Codechange/Add: Modified the bridge drawing code so that the basic offset is read from the RailTypeInfo struct. This is (hopefully) the last DrawTile change on the way to electrified railways. While being at it, de-mystified the function a bit and added some asserts.
celestar
parents: 2520
diff changeset
    83
	/**
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4041
diff changeset
    84
	 * Bridge offset
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4041
diff changeset
    85
	 */
2536
634914d741b4 (svn r3065) -Codechange/Add: Modified the bridge drawing code so that the basic offset is read from the RailTypeInfo struct. This is (hopefully) the last DrawTile change on the way to electrified railways. While being at it, de-mystified the function a bit and added some asserts.
celestar
parents: 2520
diff changeset
    86
	SpriteID bridge_offset;
3503
44f50afb0a75 (svn r4354) [Elrail][NewGRF] Codechange: Drawing of custom waypoints with custom ground sprites used the index of the rail type as an offset. With the introduction of elrails this offset is incorrect, so instead there is now a lookup table within the RailTypeInfo struct to explicitly list the offset.
peter1138
parents: 3500
diff changeset
    87
44f50afb0a75 (svn r4354) [Elrail][NewGRF] Codechange: Drawing of custom waypoints with custom ground sprites used the index of the rail type as an offset. With the introduction of elrails this offset is incorrect, so instead there is now a lookup table within the RailTypeInfo struct to explicitly list the offset.
peter1138
parents: 3500
diff changeset
    88
	/**
44f50afb0a75 (svn r4354) [Elrail][NewGRF] Codechange: Drawing of custom waypoints with custom ground sprites used the index of the rail type as an offset. With the introduction of elrails this offset is incorrect, so instead there is now a lookup table within the RailTypeInfo struct to explicitly list the offset.
peter1138
parents: 3500
diff changeset
    89
	 * Offset to add to ground sprite when drawing custom waypoints / stations
44f50afb0a75 (svn r4354) [Elrail][NewGRF] Codechange: Drawing of custom waypoints with custom ground sprites used the index of the rail type as an offset. With the introduction of elrails this offset is incorrect, so instead there is now a lookup table within the RailTypeInfo struct to explicitly list the offset.
peter1138
parents: 3500
diff changeset
    90
	 */
44f50afb0a75 (svn r4354) [Elrail][NewGRF] Codechange: Drawing of custom waypoints with custom ground sprites used the index of the rail type as an offset. With the introduction of elrails this offset is incorrect, so instead there is now a lookup table within the RailTypeInfo struct to explicitly list the offset.
peter1138
parents: 3500
diff changeset
    91
	byte custom_ground_offset;
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6162
diff changeset
    92
};
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    93
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
    94
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6248
diff changeset
    95
/** these are the maximums used for updating signal blocks, and checking if a depot is in a pbs block */
2008
cdb444f6d43c (svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents: 2006
diff changeset
    96
enum {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6248
diff changeset
    97
	NUM_SSD_ENTRY = 256, ///< max amount of blocks
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6248
diff changeset
    98
	NUM_SSD_STACK =  32, ///< max amount of blocks to check recursively
2008
cdb444f6d43c (svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents: 2006
diff changeset
    99
};
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
diff changeset
   100
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents:
diff changeset
   101
1967
a01f4d5dd957 (svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents: 1950
diff changeset
   102
a01f4d5dd957 (svn r2473) - Add: VehicleMayEnterTile(), which checks if the tile owner of a tile is correct for a vehicle to enter it. Based upon glx's code.
matthijs
parents: 1950
diff changeset
   103
/**
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
   104
 * Returns a pointer to the Railtype information for a given railtype
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
   105
 * @param railtype the rail type which the information is requested for
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
   106
 * @return The pointer to the RailtypeInfo
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
   107
 */
2236
34daee5dfc60 (svn r2756) Renamed railtypes into _railtypes
ludde
parents: 2233
diff changeset
   108
static inline const RailtypeInfo *GetRailTypeInfo(RailType railtype)
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
   109
{
6162
798086a4c251 (svn r8912) -Codechange: coding style cleanup and moving of two global externs into the functions that use them.
rubidium
parents: 6156
diff changeset
   110
	extern RailtypeInfo _railtypes[RAILTYPE_END];
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
   111
	assert(railtype < RAILTYPE_END);
2236
34daee5dfc60 (svn r2756) Renamed railtypes into _railtypes
ludde
parents: 2233
diff changeset
   112
	return &_railtypes[railtype];
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
   113
}
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
   114
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2232
diff changeset
   115
/**
2006
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   116
 * Checks if an engine of the given RailType can drive on a tile with a given
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   117
 * RailType. This would normally just be an equality check, but for electric
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   118
 * rails (which also support non-electric engines).
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   119
 * @return Whether the engine can drive on this tile.
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   120
 * @param  enginetype The RailType of the engine we are considering.
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   121
 * @param  tiletype   The RailType of the tile we are considering.
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   122
 */
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   123
static inline bool IsCompatibleRail(RailType enginetype, RailType tiletype)
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   124
{
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7833
diff changeset
   125
	return HasBit(GetRailTypeInfo(enginetype)->compatible_railtypes, tiletype);
2006
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   126
}
9d5d7fd428c2 (svn r2514) - Codechange: [NPF] Move the checking of railtype into a funciton IsCompatibleRail().
matthijs
parents: 2001
diff changeset
   127
7396
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
   128
/**
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
   129
 * Checks if an engine of the given RailType got power on a tile with a given
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
   130
 * RailType. This would normally just be an equality check, but for electric
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
   131
 * rails (which also support non-electric engines).
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
   132
 * @return Whether the engine got power on this tile.
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
   133
 * @param  enginetype The RailType of the engine we are considering.
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
   134
 * @param  tiletype   The RailType of the tile we are considering.
6b9f010b31ea (svn r10765) -Documentation [FS#1100]: of rail.h. Based on a patch by Progman.
rubidium
parents: 7335
diff changeset
   135
 */
3355
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   136
static inline bool HasPowerOnRail(RailType enginetype, RailType tiletype)
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   137
{
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7833
diff changeset
   138
	return HasBit(GetRailTypeInfo(enginetype)->powered_railtypes, tiletype);
3355
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   139
}
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   140
7730
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   141
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   142
extern int _railtype_cost_multiplier[RAILTYPE_END];
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   143
extern const int _default_railtype_cost_multiplier[RAILTYPE_END];
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   144
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   145
/**
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   146
 * Returns the cost of building the specified railtype.
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   147
 * @param railtype The railtype being built.
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   148
 * @return The cost multiplier.
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   149
 */
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   150
static inline Money RailBuildCost(RailType railtype)
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   151
{
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   152
	assert(railtype < RAILTYPE_END);
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   153
	return (_price.build_rail * _railtype_cost_multiplier[railtype]) >> 3;
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   154
}
4293ba29ce21 (svn r11265) -Feature: Make more advanced rail types more expensive to build.
maedhros
parents: 7703
diff changeset
   155
8043
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   156
/**
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   157
 * Calculates the cost of rail conversion
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   158
 * @param from The railtype we are converting from
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   159
 * @param to   The railtype we are converting to
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   160
 * @return Cost per TrackBit
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   161
 */
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   162
static inline Money RailConvertCost(RailType from, RailType to)
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   163
{
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   164
	/* rail -> el. rail
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   165
	 * calculate the price as 5 / 4 of (cost build el. rail) - (cost build rail)
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   166
	 * (the price of workers to get to place is that 1/4)
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   167
	 */
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   168
	if (HasPowerOnRail(from, to)) {
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   169
		return ((RailBuildCost(to) - RailBuildCost(from)) * 5) >> 2;
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   170
	}
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   171
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   172
	/* el. rail -> rail
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   173
	 * calculate the price as 1 / 4 of (cost build el. rail) - (cost build rail)
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   174
	 * (the price of workers is 1 / 4 + price of copper sold to a recycle center)
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   175
	 */
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   176
	if (HasPowerOnRail(to, from)) {
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   177
		return (RailBuildCost(from) - RailBuildCost(to)) >> 2;
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   178
	}
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   179
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   180
	/* make the price the same as remove + build new type */
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   181
	return RailBuildCost(to) + _price.remove_rail;
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   182
}
08dcb2d81d9d (svn r11603) -Fix [FS#1481]: make price for railtype conversion more realistic
smatz
parents: 7929
diff changeset
   183
7539
5f41050498bd (svn r11059) -Fix [FS#1182]: inconsistency between Rail<->ElRail conversions of different kinds of rail containing tiles (normal rail, stations, depots, etc). Patch by SmatZ.
rubidium
parents: 7396
diff changeset
   184
void *UpdateTrainPowerProc(Vehicle *v, void *data);
2520
8a52362c4ada (svn r3049) Replace byte/int/uint by RailType where appropriate
tron
parents: 2514
diff changeset
   185
void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
8a52362c4ada (svn r3049) Replace byte/int/uint by RailType where appropriate
tron
parents: 2514
diff changeset
   186
void DrawDefaultWaypointSprite(int x, int y, RailType railtype);
3355
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   187
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   188
/**
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   189
 * Draws overhead wires and pylons for electric railways.
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   190
 * @param ti The TileInfo struct of the tile being drawn
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   191
 * @see DrawCatenaryRailway
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   192
 */
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   193
void DrawCatenary(const TileInfo *ti);
7601
988040ee27f4 (svn r11128) -Fix: a lot of graphical glitches by changing some bounding boxes. It's not perfect yet, but a *very* good step into the right direction. Patch by frosch.
rubidium
parents: 7539
diff changeset
   194
void DrawCatenaryOnTunnel(const TileInfo *ti);
3355
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3267
diff changeset
   195
7335
141c6b86ec1f (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7155
diff changeset
   196
Foundation GetRailFoundation(Slope tileh, TrackBits bits);
5116
3c0c3da214ca (svn r7195) -Feature: [FS#297, optional elrails] New patches/vehicles option 'disable electrified railways'.
KUDr
parents: 4549
diff changeset
   197
3c0c3da214ca (svn r7195) -Feature: [FS#297, optional elrails] New patches/vehicles option 'disable electrified railways'.
KUDr
parents: 4549
diff changeset
   198
int32 SettingsDisableElrail(int32 p1); ///< _patches.disable_elrail callback
3c0c3da214ca (svn r7195) -Feature: [FS#297, optional elrails] New patches/vehicles option 'disable electrified railways'.
KUDr
parents: 4549
diff changeset
   199
2536
634914d741b4 (svn r3065) -Codechange/Add: Modified the bridge drawing code so that the basic offset is read from the RailTypeInfo struct. This is (hopefully) the last DrawTile change on the way to electrified railways. While being at it, de-mystified the function a bit and added some asserts.
celestar
parents: 2520
diff changeset
   200
#endif /* RAIL_H */