(svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
- Codechange: Remove some magic numbers (PALETTE_CRASH)
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
				
			|||||||
#include "stdafx.h"
 | 
					#include "stdafx.h"
 | 
				
			||||||
#include "openttd.h"
 | 
					#include "openttd.h"
 | 
				
			||||||
#include "debug.h"
 | 
					#include "debug.h"
 | 
				
			||||||
 | 
					#include "table/sprites.h"
 | 
				
			||||||
#include "table/strings.h"
 | 
					#include "table/strings.h"
 | 
				
			||||||
#include "map.h"
 | 
					#include "map.h"
 | 
				
			||||||
#include "tile.h"
 | 
					#include "tile.h"
 | 
				
			||||||
@@ -60,7 +61,8 @@ static void DrawAircraftImage(const Vehicle *v, int x, int y, VehicleID selectio
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	int image = GetAircraftImage(v, 6);
 | 
						int image = GetAircraftImage(v, 6);
 | 
				
			||||||
	uint32 ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
 | 
						uint32 ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
 | 
				
			||||||
	if (v->vehstatus & VS_CRASHED) ormod = 0x3248000;
 | 
						if (v->vehstatus & VS_CRASHED)
 | 
				
			||||||
 | 
							ormod = PALETTE_CRASH;
 | 
				
			||||||
	DrawSprite(image | ormod, x+25, y+10);
 | 
						DrawSprite(image | ormod, x+25, y+10);
 | 
				
			||||||
	if (v->subtype == 0)
 | 
						if (v->subtype == 0)
 | 
				
			||||||
		DrawSprite(0xF3D, x+25, y+5);
 | 
							DrawSprite(0xF3D, x+25, y+5);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								engine.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								engine.h
									
									
									
									
									
								
							@@ -21,6 +21,7 @@ typedef struct RailVehicleInfo {
 | 
				
			|||||||
	                    //       for when the 'powered wagon' callback fails. But it should really also determine what
 | 
						                    //       for when the 'powered wagon' callback fails. But it should really also determine what
 | 
				
			||||||
	                    //       kind of visual effect to generate for a vehicle (default, steam, diesel, electric).
 | 
						                    //       kind of visual effect to generate for a vehicle (default, steam, diesel, electric).
 | 
				
			||||||
	                    //       Same goes for the callback result, which atm is only used to check if a wagon is powered.
 | 
						                    //       Same goes for the callback result, which atm is only used to check if a wagon is powered.
 | 
				
			||||||
 | 
						byte shorten_factor;	// length on main map for this type is 8 - shorten_factor
 | 
				
			||||||
} RailVehicleInfo;
 | 
					} RailVehicleInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct ShipVehicleInfo {
 | 
					typedef struct ShipVehicleInfo {
 | 
				
			||||||
@@ -136,6 +137,10 @@ enum CallbackID {
 | 
				
			|||||||
	// TODO: interpret the rest of the result, aka "visual effects"
 | 
						// TODO: interpret the rest of the result, aka "visual effects"
 | 
				
			||||||
	CBID_WAGON_POWER = 0x10,
 | 
						CBID_WAGON_POWER = 0x10,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Vehicle length, returns the amount of 1/8's the vehicle is shorter
 | 
				
			||||||
 | 
						// only for train vehicles
 | 
				
			||||||
 | 
						CBID_VEH_LENGTH = 0x11,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Refit capacity, the passed vehicle needs to have its ->cargo_type set to
 | 
						// Refit capacity, the passed vehicle needs to have its ->cargo_type set to
 | 
				
			||||||
	// the cargo we are refitting to, returns the new cargo capacity
 | 
						// the cargo we are refitting to, returns the new cargo capacity
 | 
				
			||||||
	CBID_REFIT_CAP = 0x15,
 | 
						CBID_REFIT_CAP = 0x15,
 | 
				
			||||||
@@ -145,6 +150,7 @@ enum CallbackID {
 | 
				
			|||||||
// (some callbacks are always used, and dont appear here)
 | 
					// (some callbacks are always used, and dont appear here)
 | 
				
			||||||
enum CallbackMask {
 | 
					enum CallbackMask {
 | 
				
			||||||
	CBM_WAGON_POWER = 0,
 | 
						CBM_WAGON_POWER = 0,
 | 
				
			||||||
 | 
						CBM_VEH_LENGTH = 1,
 | 
				
			||||||
	CBM_REFIT_CAP = 3,
 | 
						CBM_REFIT_CAP = 3,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								newgrf.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								newgrf.c
									
									
									
									
									
								
							@@ -353,9 +353,17 @@ static bool RailVehicleChangeInfo(uint engine, int numinfo, int prop, byte **buf
 | 
				
			|||||||
		case 0x1E: { /* Callback */
 | 
							case 0x1E: { /* Callback */
 | 
				
			||||||
			FOR_EACH_OBJECT {
 | 
								FOR_EACH_OBJECT {
 | 
				
			||||||
				byte callbacks = grf_load_byte(&buf);
 | 
									byte callbacks = grf_load_byte(&buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				rvi[i].callbackmask = callbacks;
 | 
									rvi[i].callbackmask = callbacks;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} break;
 | 
							} break;
 | 
				
			||||||
 | 
							case 0x21: { /* Shorter vehicle */
 | 
				
			||||||
 | 
								FOR_EACH_OBJECT {
 | 
				
			||||||
 | 
									byte shorten_factor = grf_load_byte(&buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									rvi[i].shorten_factor = shorten_factor;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} break;
 | 
				
			||||||
		case 0x22: { /* Visual effect */
 | 
							case 0x22: { /* Visual effect */
 | 
				
			||||||
			// see note in engine.h about rvi->visual_effect
 | 
								// see note in engine.h about rvi->visual_effect
 | 
				
			||||||
			FOR_EACH_OBJECT {
 | 
								FOR_EACH_OBJECT {
 | 
				
			||||||
@@ -377,7 +385,6 @@ static bool RailVehicleChangeInfo(uint engine, int numinfo, int prop, byte **buf
 | 
				
			|||||||
		case 0x1C:	/* Refit cost */
 | 
							case 0x1C:	/* Refit cost */
 | 
				
			||||||
		case 0x1F:	/* Tractive effort */
 | 
							case 0x1F:	/* Tractive effort */
 | 
				
			||||||
		case 0x20:	/* Air drag */
 | 
							case 0x20:	/* Air drag */
 | 
				
			||||||
		case 0x21:	/* Shorter tenders */
 | 
					 | 
				
			||||||
		case 0x24:	/* High byte of vehicle weight */
 | 
							case 0x24:	/* High byte of vehicle weight */
 | 
				
			||||||
		case 0x25:	/* User-defined bit mask to set when checking veh. var. 42 */
 | 
							case 0x25:	/* User-defined bit mask to set when checking veh. var. 42 */
 | 
				
			||||||
		case 0x26:	/* Retire vehicle early */
 | 
							case 0x26:	/* Retire vehicle early */
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										22
									
								
								rail_cmd.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								rail_cmd.c
									
									
									
									
									
								
							@@ -1,5 +1,6 @@
 | 
				
			|||||||
#include "stdafx.h"
 | 
					#include "stdafx.h"
 | 
				
			||||||
#include "openttd.h"
 | 
					#include "openttd.h"
 | 
				
			||||||
 | 
					#include "debug.h"
 | 
				
			||||||
#include "table/sprites.h"
 | 
					#include "table/sprites.h"
 | 
				
			||||||
#include "table/strings.h"
 | 
					#include "table/strings.h"
 | 
				
			||||||
#include "gfx.h"
 | 
					#include "gfx.h"
 | 
				
			||||||
@@ -9,6 +10,7 @@
 | 
				
			|||||||
#include "viewport.h"
 | 
					#include "viewport.h"
 | 
				
			||||||
#include "command.h"
 | 
					#include "command.h"
 | 
				
			||||||
#include "pathfind.h"
 | 
					#include "pathfind.h"
 | 
				
			||||||
 | 
					#include "engine.h"
 | 
				
			||||||
#include "town.h"
 | 
					#include "town.h"
 | 
				
			||||||
#include "sound.h"
 | 
					#include "sound.h"
 | 
				
			||||||
#include "station.h"
 | 
					#include "station.h"
 | 
				
			||||||
@@ -2036,7 +2038,10 @@ static void ChangeTileOwner_Track(uint tile, byte old_player, byte new_player)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static const byte _fractcoords_behind[4] = { 0x8F, 0x8, 0x80, 0xF8 };
 | 
					static const byte _fractcoords_behind[4] = { 0x8F, 0x8, 0x80, 0xF8 };
 | 
				
			||||||
static const byte _fractcoords_enter[4] = { 0x8A, 0x48, 0x84, 0xA8 };
 | 
					static const byte _fractcoords_enter[4] = { 0x8A, 0x48, 0x84, 0xA8 };
 | 
				
			||||||
static const byte _fractcoords_leave[4] = { 0x81, 0xD8, 0x8D, 0x18 };
 | 
					static const byte _deltacoord_leaveoffset[8] = {
 | 
				
			||||||
 | 
						-1,  0,  1,  0, /* x */
 | 
				
			||||||
 | 
						 0,  1,  0, -1  /* y */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
static const byte _enter_directions[4] = {5, 7, 1, 3};
 | 
					static const byte _enter_directions[4] = {5, 7, 1, 3};
 | 
				
			||||||
static const byte _leave_directions[4] = {1, 3, 5, 7};
 | 
					static const byte _leave_directions[4] = {1, 3, 5, 7};
 | 
				
			||||||
static const byte _depot_track_mask[4] = {1, 2, 1, 2};
 | 
					static const byte _depot_track_mask[4] = {1, 2, 1, 2};
 | 
				
			||||||
@@ -2044,7 +2049,9 @@ static const byte _depot_track_mask[4] = {1, 2, 1, 2};
 | 
				
			|||||||
static uint32 VehicleEnter_Track(Vehicle *v, uint tile, int x, int y)
 | 
					static uint32 VehicleEnter_Track(Vehicle *v, uint tile, int x, int y)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	byte fract_coord;
 | 
						byte fract_coord;
 | 
				
			||||||
 | 
						byte fract_coord_leave;
 | 
				
			||||||
	int dir;
 | 
						int dir;
 | 
				
			||||||
 | 
						int length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// this routine applies only to trains in depot tiles
 | 
						// this routine applies only to trains in depot tiles
 | 
				
			||||||
	if (v->type != VEH_Train || !IsRailDepot(_map5[tile]))
 | 
						if (v->type != VEH_Train || !IsRailDepot(_map5[tile]))
 | 
				
			||||||
@@ -2053,7 +2060,18 @@ static uint32 VehicleEnter_Track(Vehicle *v, uint tile, int x, int y)
 | 
				
			|||||||
	/* depot direction */
 | 
						/* depot direction */
 | 
				
			||||||
	dir = _map5[tile] & RAIL_DEPOT_DIR;
 | 
						dir = _map5[tile] & RAIL_DEPOT_DIR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* calculate the point where the following wagon should be activated */
 | 
				
			||||||
 | 
						/* this depends on the length of the current vehicle */
 | 
				
			||||||
 | 
						length = v->u.rail.cached_veh_length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fract_coord_leave =
 | 
				
			||||||
 | 
							((_fractcoords_enter[dir] & 0x0F) +				// x
 | 
				
			||||||
 | 
								(length + 1) * _deltacoord_leaveoffset[dir]) +
 | 
				
			||||||
 | 
							(((_fractcoords_enter[dir] >> 4) +				// y
 | 
				
			||||||
 | 
								((length + 1) * _deltacoord_leaveoffset[dir+4])) << 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fract_coord = (x & 0xF) + ((y & 0xF) << 4);
 | 
						fract_coord = (x & 0xF) + ((y & 0xF) << 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (_fractcoords_behind[dir] == fract_coord) {
 | 
						if (_fractcoords_behind[dir] == fract_coord) {
 | 
				
			||||||
		/* make sure a train is not entering the tile from behind */
 | 
							/* make sure a train is not entering the tile from behind */
 | 
				
			||||||
		return 8;
 | 
							return 8;
 | 
				
			||||||
@@ -2069,7 +2087,7 @@ static uint32 VehicleEnter_Track(Vehicle *v, uint tile, int x, int y)
 | 
				
			|||||||
			InvalidateWindow(WC_VEHICLE_DEPOT, tile);
 | 
								InvalidateWindow(WC_VEHICLE_DEPOT, tile);
 | 
				
			||||||
			return 4;
 | 
								return 4;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else if (_fractcoords_leave[dir] == fract_coord) {
 | 
						} else if (fract_coord_leave == fract_coord) {
 | 
				
			||||||
		if (_leave_directions[dir] == v->direction) {
 | 
							if (_leave_directions[dir] == v->direction) {
 | 
				
			||||||
			/* leave the depot? */
 | 
								/* leave the depot? */
 | 
				
			||||||
			if ((v=v->next) != NULL) {
 | 
								if ((v=v->next) != NULL) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
#include "stdafx.h"
 | 
					#include "stdafx.h"
 | 
				
			||||||
#include "openttd.h"
 | 
					#include "openttd.h"
 | 
				
			||||||
#include "debug.h"
 | 
					#include "debug.h"
 | 
				
			||||||
 | 
					#include "table/sprites.h"
 | 
				
			||||||
#include "table/strings.h"
 | 
					#include "table/strings.h"
 | 
				
			||||||
#include "map.h"
 | 
					#include "map.h"
 | 
				
			||||||
#include "window.h"
 | 
					#include "window.h"
 | 
				
			||||||
@@ -60,7 +61,8 @@ static void DrawRoadVehImage(const Vehicle *v, int x, int y, VehicleID selection
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	int image = GetRoadVehImage(v, 6);
 | 
						int image = GetRoadVehImage(v, 6);
 | 
				
			||||||
	uint32 ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
 | 
						uint32 ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
 | 
				
			||||||
	if (v->vehstatus & VS_CRASHED) ormod = 0x3248000;
 | 
						if (v->vehstatus & VS_CRASHED)
 | 
				
			||||||
 | 
							ormod = PALETTE_CRASH;
 | 
				
			||||||
	DrawSprite(image | ormod, x+14, y+6);
 | 
						DrawSprite(image | ormod, x+14, y+6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (v->index == selection) {
 | 
						if (v->index == selection) {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										242
									
								
								table/engines.h
									
									
									
									
									
								
							
							
						
						
									
										242
									
								
								table/engines.h
									
									
									
									
									
								
							@@ -266,127 +266,127 @@ EngineInfo _engine_info[TOTAL_NUM_ENGINES] = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES] = {
 | 
					RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES] = {
 | 
				
			||||||
	// image_index  max_speed (kph)      running_cost_base                callback bitmask
 | 
						// image_index  max_speed (kph)      running_cost_base                 callbackmask    shortened factor
 | 
				
			||||||
	// |  flags     |        power (hp)  |    running_cost_class          |  powered wagons power
 | 
						// |  flags     |        power (hp)  |    running_cost_class           |   powered wagons power
 | 
				
			||||||
	// |  |    base_cost     |    weight      |    capacity               |  |  powered wagons weight
 | 
						// |  |    base_cost     |    weight      |    capacity                |   |   powered wagons weight
 | 
				
			||||||
	// |  |    |    |        |    |      |    |    |    cargo_type        |  |  |  visual effects
 | 
						// |  |    |    |        |    |      |    |    |    cargo_type         |   |   |   visual effects
 | 
				
			||||||
	// |  |    |    |        |    |      |    |    |    |                 |  |  |  |
 | 
						// |  |    |    |        |    |      |    |    |    |                  |   |   |   |   |
 | 
				
			||||||
	{  2, 0,   7,  64,     300,  47,    50,   0,   0,   0               , 0, 0, 0, 0 }, /*   0 */
 | 
						{  2, 0,   7,  64,     300,  47,    50,   0,   0,   0               ,  0,  0,  0,  0,  0 }, /*   0 */
 | 
				
			||||||
	{ 19, 0,   8,  80,     600,  65,    65,   1,   0,   0               , 0, 0, 0, 0 }, /*   1 */
 | 
						{ 19, 0,   8,  80,     600,  65,    65,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*   1 */
 | 
				
			||||||
	{  2, 0,  10,  72,     400,  85,    90,   0,   0,   0               , 0, 0, 0, 0 }, /*   2 */
 | 
						{  2, 0,  10,  72,     400,  85,    90,   0,   0,   0               ,  0,  0,  0,  0,  0 }, /*   2 */
 | 
				
			||||||
	{  0, 0,  15,  96,     900, 130,   130,   0,   0,   0               , 0, 0, 0, 0 }, /*   3 */
 | 
						{  0, 0,  15,  96,     900, 130,   130,   0,   0,   0               ,  0,  0,  0,  0,  0 }, /*   3 */
 | 
				
			||||||
	{  1, 0,  19, 112,    1000, 140,   145,   0,   0,   0               , 0, 0, 0, 0 }, /*   4 */
 | 
						{  1, 0,  19, 112,    1000, 140,   145,   0,   0,   0               ,  0,  0,  0,  0,  0 }, /*   4 */
 | 
				
			||||||
	{ 12, 0,  16, 120,    1400,  95,   125,   1,   0,   0               , 0, 0, 0, 0 }, /*   5 */
 | 
						{ 12, 0,  16, 120,    1400,  95,   125,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*   5 */
 | 
				
			||||||
	{ 14, 0,  20, 152,    2000, 120,   135,   1,   0,   0               , 0, 0, 0, 0 }, /*   6 */
 | 
						{ 14, 0,  20, 152,    2000, 120,   135,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*   6 */
 | 
				
			||||||
	{  3, 0,  14,  88,    1100, 145,   130,   0,   0,   0               , 0, 0, 0, 0 }, /*   7 */
 | 
						{  3, 0,  14,  88,    1100, 145,   130,   0,   0,   0               ,  0,  0,  0,  0,  0 }, /*   7 */
 | 
				
			||||||
	{  0, 0,  13, 112,    1000, 131,   120,   0,   0,   0               , 0, 0, 0, 0 }, /*   8 */
 | 
						{  0, 0,  13, 112,    1000, 131,   120,   0,   0,   0               ,  0,  0,  0,  0,  0 }, /*   8 */
 | 
				
			||||||
	{  1, 0,  19, 128,    1200, 162,   140,   0,   0,   0               , 0, 0, 0, 0 }, /*   9 */
 | 
						{  1, 0,  19, 128,    1200, 162,   140,   0,   0,   0               ,  0,  0,  0,  0,  0 }, /*   9 */
 | 
				
			||||||
	{  0, 0,  22, 144,    1600, 170,   130,   0,   0,   0               , 0, 0, 0, 0 }, /*  10 */
 | 
						{  0, 0,  22, 144,    1600, 170,   130,   0,   0,   0               ,  0,  0,  0,  0,  0 }, /*  10 */
 | 
				
			||||||
	{  8, 1,  11, 112,   600/2,32/2,  85/2,   1,  38,   CT_PASSENGERS   , 0, 0, 0, 0 }, /*  11 */
 | 
						{  8, 1,  11, 112,   600/2,32/2,  85/2,   1,  38,   CT_PASSENGERS   ,  0,  0,  0,  0,  0 }, /*  11 */
 | 
				
			||||||
	{ 10, 1,  14, 120,   700/2,38/2,  70/2,   1,  40,   CT_PASSENGERS   , 0, 0, 0, 0 }, /*  12 */
 | 
						{ 10, 1,  14, 120,   700/2,38/2,  70/2,   1,  40,   CT_PASSENGERS   ,  0,  0,  0,  0,  0 }, /*  12 */
 | 
				
			||||||
	{  4, 0,  15, 128,    1250,  72,    95,   1,   0,   0               , 0, 0, 0, 0 }, /*  13 */
 | 
						{  4, 0,  15, 128,    1250,  72,    95,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*  13 */
 | 
				
			||||||
	{  5, 0,  17, 144,    1750, 101,   120,   1,   0,   0               , 0, 0, 0, 0 }, /*  14 */
 | 
						{  5, 0,  17, 144,    1750, 101,   120,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*  14 */
 | 
				
			||||||
	{  4, 0,  18, 160,    2580, 112,   140,   1,   0,   0               , 0, 0, 0, 0 }, /*  15 */
 | 
						{  4, 0,  18, 160,    2580, 112,   140,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*  15 */
 | 
				
			||||||
	{ 14, 0,  23,  96,    4000, 150,   135,   1,   0,   0               , 0, 0, 0, 0 }, /*  16 */
 | 
						{ 14, 0,  23,  96,    4000, 150,   135,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*  16 */
 | 
				
			||||||
	{ 12, 0,  16, 112,    2400, 120,   105,   1,   0,   0               , 0, 0, 0, 0 }, /*  17 */
 | 
						{ 12, 0,  16, 112,    2400, 120,   105,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*  17 */
 | 
				
			||||||
	{ 13, 0,  30, 112,    6600, 207,   155,   1,   0,   0               , 0, 0, 0, 0 }, /*  18 */
 | 
						{ 13, 0,  30, 112,    6600, 207,   155,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*  18 */
 | 
				
			||||||
	{ 15, 0,  18, 104,    1500, 110,   105,   1,   0,   0               , 0, 0, 0, 0 }, /*  19 */
 | 
						{ 15, 0,  18, 104,    1500, 110,   105,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*  19 */
 | 
				
			||||||
	{ 16, 1,  35, 160,  3500/2,95/2, 205/2,   1,   0,   0               , 0, 0, 0, 0 }, /*  20 */
 | 
						{ 16, 1,  35, 160,  3500/2,95/2, 205/2,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*  20 */
 | 
				
			||||||
	{ 18, 0,  21, 104,    2200, 120,   145,   1,   0,   0               , 0, 0, 0, 0 }, /*  21 */
 | 
						{ 18, 0,  21, 104,    2200, 120,   145,   1,   0,   0               ,  0,  0,  0,  0,  0 }, /*  21 */
 | 
				
			||||||
	{  6, 1,  20, 200,  4500/2,70/2, 190/2,   1,   4,   CT_MAIL         , 0, 0, 0, 0 }, /*  22 */
 | 
						{  6, 1,  20, 200,  4500/2,70/2, 190/2,   1,   4,   CT_MAIL         ,  0,  0,  0,  0,  0 }, /*  22 */
 | 
				
			||||||
	{ 20, 0,  26, 160,    3600,  84,   180,   2,   0,   0               , 0, 0, 0, 0 }, /*  23 */
 | 
						{ 20, 0,  26, 160,    3600,  84,   180,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  23 */
 | 
				
			||||||
	{ 20, 0,  30, 176,    5000,  82,   205,   2,   0,   0               , 0, 0, 0, 0 }, /*  24 */
 | 
						{ 20, 0,  30, 176,    5000,  82,   205,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  24 */
 | 
				
			||||||
	{ 21, 1,  40, 240,  7000/2,90/2, 240/2,   2,   0,   0               , 0, 0, 0, 0 }, /*  25 */
 | 
						{ 21, 1,  40, 240,  7000/2,90/2, 240/2,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  25 */
 | 
				
			||||||
	{ 23, 1,  43, 264,  8000/2,95/2, 250/2,   2,   0,   0               , 0, 0, 0, 0 }, /*  26 */
 | 
						{ 23, 1,  43, 264,  8000/2,95/2, 250/2,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  26 */
 | 
				
			||||||
	{ 33, 2, 247,   0,       0,  25,     0,   0,  40,   CT_PASSENGERS   , 0, 0, 0, 0 }, /*  27 */
 | 
						{ 33, 2, 247,   0,       0,  25,     0,   0,  40,   CT_PASSENGERS   ,  0,  0,  0,  0,  0 }, /*  27 */
 | 
				
			||||||
	{ 35, 2, 228,   0,       0,  21,     0,   0,  30,   CT_MAIL         , 0, 0, 0, 0 }, /*  28 */
 | 
						{ 35, 2, 228,   0,       0,  21,     0,   0,  30,   CT_MAIL         ,  0,  0,  0,  0,  0 }, /*  28 */
 | 
				
			||||||
	{ 34, 2, 176,   0,       0,  18,     0,   0,  30,   CT_COAL         , 0, 0, 0, 0 }, /*  29 */
 | 
						{ 34, 2, 176,   0,       0,  18,     0,   0,  30,   CT_COAL         ,  0,  0,  0,  0,  0 }, /*  29 */
 | 
				
			||||||
	{ 36, 2, 200,   0,       0,  24,     0,   0,  30,   CT_OIL          , 0, 0, 0, 0 }, /*  30 */
 | 
						{ 36, 2, 200,   0,       0,  24,     0,   0,  30,   CT_OIL          ,  0,  0,  0,  0,  0 }, /*  30 */
 | 
				
			||||||
	{ 37, 2, 192,   0,       0,  20,     0,   0,  25,   CT_LIVESTOCK    , 0, 0, 0, 0 }, /*  31 */
 | 
						{ 37, 2, 192,   0,       0,  20,     0,   0,  25,   CT_LIVESTOCK    ,  0,  0,  0,  0,  0 }, /*  31 */
 | 
				
			||||||
	{ 38, 2, 190,   0,       0,  21,     0,   0,  25,   CT_GOODS        , 0, 0, 0, 0 }, /*  32 */
 | 
						{ 38, 2, 190,   0,       0,  21,     0,   0,  25,   CT_GOODS        ,  0,  0,  0,  0,  0 }, /*  32 */
 | 
				
			||||||
	{ 39, 2, 182,   0,       0,  19,     0,   0,  30,   CT_GRAIN        , 0, 0, 0, 0 }, /*  33 */
 | 
						{ 39, 2, 182,   0,       0,  19,     0,   0,  30,   CT_GRAIN        ,  0,  0,  0,  0,  0 }, /*  33 */
 | 
				
			||||||
	{ 40, 2, 181,   0,       0,  16,     0,   0,  30,   CT_WOOD         , 0, 0, 0, 0 }, /*  34 */
 | 
						{ 40, 2, 181,   0,       0,  16,     0,   0,  30,   CT_WOOD         ,  0,  0,  0,  0,  0 }, /*  34 */
 | 
				
			||||||
	{ 41, 2, 179,   0,       0,  19,     0,   0,  30,   CT_IRON_ORE     , 0, 0, 0, 0 }, /*  35 */
 | 
						{ 41, 2, 179,   0,       0,  19,     0,   0,  30,   CT_IRON_ORE     ,  0,  0,  0,  0,  0 }, /*  35 */
 | 
				
			||||||
	{ 42, 2, 196,   0,       0,  18,     0,   0,  20,   CT_STEEL        , 0, 0, 0, 0 }, /*  36 */
 | 
						{ 42, 2, 196,   0,       0,  18,     0,   0,  20,   CT_STEEL        ,  0,  0,  0,  0,  0 }, /*  36 */
 | 
				
			||||||
	{ 43, 2, 255,   0,       0,  30,     0,   0,  20,   CT_VALUABLES    , 0, 0, 0, 0 }, /*  37 */
 | 
						{ 43, 2, 255,   0,       0,  30,     0,   0,  20,   CT_VALUABLES    ,  0,  0,  0,  0,  0 }, /*  37 */
 | 
				
			||||||
	{ 44, 2, 191,   0,       0,  22,     0,   0,  25,   CT_FOOD         , 0, 0, 0, 0 }, /*  38 */
 | 
						{ 44, 2, 191,   0,       0,  22,     0,   0,  25,   CT_FOOD         ,  0,  0,  0,  0,  0 }, /*  38 */
 | 
				
			||||||
	{ 45, 2, 196,   0,       0,  18,     0,   0,  20,   CT_PAPER        , 0, 0, 0, 0 }, /*  39 */
 | 
						{ 45, 2, 196,   0,       0,  18,     0,   0,  20,   CT_PAPER        ,  0,  0,  0,  0,  0 }, /*  39 */
 | 
				
			||||||
	{ 46, 2, 179,   0,       0,  19,     0,   0,  30,   CT_COPPER_ORE   , 0, 0, 0, 0 }, /*  40 */
 | 
						{ 46, 2, 179,   0,       0,  19,     0,   0,  30,   CT_COPPER_ORE   ,  0,  0,  0,  0,  0 }, /*  40 */
 | 
				
			||||||
	{ 47, 2, 199,   0,       0,  25,     0,   0,  25,   CT_WATER        , 0, 0, 0, 0 }, /*  41 */
 | 
						{ 47, 2, 199,   0,       0,  25,     0,   0,  25,   CT_WATER        ,  0,  0,  0,  0,  0 }, /*  41 */
 | 
				
			||||||
	{ 48, 2, 182,   0,       0,  18,     0,   0,  25,   CT_FRUIT        , 0, 0, 0, 0 }, /*  42 */
 | 
						{ 48, 2, 182,   0,       0,  18,     0,   0,  25,   CT_FRUIT        ,  0,  0,  0,  0,  0 }, /*  42 */
 | 
				
			||||||
	{ 49, 2, 185,   0,       0,  19,     0,   0,  21,   CT_RUBBER       , 0, 0, 0, 0 }, /*  43 */
 | 
						{ 49, 2, 185,   0,       0,  19,     0,   0,  21,   CT_RUBBER       ,  0,  0,  0,  0,  0 }, /*  43 */
 | 
				
			||||||
	{ 50, 2, 176,   0,       0,  19,     0,   0,  30,   CT_SUGAR        , 0, 0, 0, 0 }, /*  44 */
 | 
						{ 50, 2, 176,   0,       0,  19,     0,   0,  30,   CT_SUGAR        ,  0,  0,  0,  0,  0 }, /*  44 */
 | 
				
			||||||
	{ 51, 2, 178,   0,       0,  20,     0,   0,  30,   CT_COTTON_CANDY , 0, 0, 0, 0 }, /*  45 */
 | 
						{ 51, 2, 178,   0,       0,  20,     0,   0,  30,   CT_COTTON_CANDY ,  0,  0,  0,  0,  0 }, /*  45 */
 | 
				
			||||||
	{ 52, 2, 192,   0,       0,  20,     0,   0,  30,   CT_TOFFEE       , 0, 0, 0, 0 }, /*  46 */
 | 
						{ 52, 2, 192,   0,       0,  20,     0,   0,  30,   CT_TOFFEE       ,  0,  0,  0,  0,  0 }, /*  46 */
 | 
				
			||||||
	{ 53, 2, 190,   0,       0,  21,     0,   0,  20,   CT_BUBBLES      , 0, 0, 0, 0 }, /*  47 */
 | 
						{ 53, 2, 190,   0,       0,  21,     0,   0,  20,   CT_BUBBLES      ,  0,  0,  0,  0,  0 }, /*  47 */
 | 
				
			||||||
	{ 54, 2, 182,   0,       0,  24,     0,   0,  25,   CT_COLA         , 0, 0, 0, 0 }, /*  48 */
 | 
						{ 54, 2, 182,   0,       0,  24,     0,   0,  25,   CT_COLA         ,  0,  0,  0,  0,  0 }, /*  48 */
 | 
				
			||||||
	{ 55, 2, 181,   0,       0,  21,     0,   0,  25,   CT_CANDY        , 0, 0, 0, 0 }, /*  49 */
 | 
						{ 55, 2, 181,   0,       0,  21,     0,   0,  25,   CT_CANDY        ,  0,  0,  0,  0,  0 }, /*  49 */
 | 
				
			||||||
	{ 56, 2, 183,   0,       0,  21,     0,   0,  20,   CT_TOYS         , 0, 0, 0, 0 }, /*  50 */
 | 
						{ 56, 2, 183,   0,       0,  21,     0,   0,  20,   CT_TOYS         ,  0,  0,  0,  0,  0 }, /*  50 */
 | 
				
			||||||
	{ 57, 2, 196,   0,       0,  18,     0,   0,  22,   CT_BATTERIES    , 0, 0, 0, 0 }, /*  51 */
 | 
						{ 57, 2, 196,   0,       0,  18,     0,   0,  22,   CT_BATTERIES    ,  0,  0,  0,  0,  0 }, /*  51 */
 | 
				
			||||||
	{ 58, 2, 193,   0,       0,  18,     0,   0,  25,   CT_FIZZY_DRINKS , 0, 0, 0, 0 }, /*  52 */
 | 
						{ 58, 2, 193,   0,       0,  18,     0,   0,  25,   CT_FIZZY_DRINKS ,  0,  0,  0,  0,  0 }, /*  52 */
 | 
				
			||||||
	{ 59, 2, 191,   0,       0,  18,     0,   0,  30,   CT_PLASTIC      , 0, 0, 0, 0 }, /*  53 */
 | 
						{ 59, 2, 191,   0,       0,  18,     0,   0,  30,   CT_PLASTIC      ,  0,  0,  0,  0,  0 }, /*  53 */
 | 
				
			||||||
	{ 25, 0,  52, 304,    9000,  95,   230,   2,   0,   0               , 0, 0, 0, 0 }, /*  54 */
 | 
						{ 25, 0,  52, 304,    9000,  95,   230,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  54 */
 | 
				
			||||||
	{ 26, 1,  60, 336, 10000/2,85/2, 240/2,   2,  25,   CT_PASSENGERS   , 0, 0, 0, 0 }, /*  55 */
 | 
						{ 26, 1,  60, 336, 10000/2,85/2, 240/2,   2,  25,   CT_PASSENGERS   ,  0,  0,  0,  0,  0 }, /*  55 */
 | 
				
			||||||
	{ 26, 0,  53, 320,    5000,  95,   230,   2,   0,   0               , 0, 0, 0, 0 }, /*  56 */
 | 
						{ 26, 0,  53, 320,    5000,  95,   230,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  56 */
 | 
				
			||||||
	{ 60, 2, 247,   0,       0,  25,     0,   0,  45,   CT_PASSENGERS   , 0, 0, 0, 0 }, /*  57 */
 | 
						{ 60, 2, 247,   0,       0,  25,     0,   0,  45,   CT_PASSENGERS   ,  0,  0,  0,  0,  0 }, /*  57 */
 | 
				
			||||||
	{ 62, 2, 228,   0,       0,  21,     0,   0,  35,   CT_MAIL         , 0, 0, 0, 0 }, /*  58 */
 | 
						{ 62, 2, 228,   0,       0,  21,     0,   0,  35,   CT_MAIL         ,  0,  0,  0,  0,  0 }, /*  58 */
 | 
				
			||||||
	{ 61, 2, 176,   0,       0,  18,     0,   0,  35,   CT_COAL         , 0, 0, 0, 0 }, /*  59 */
 | 
						{ 61, 2, 176,   0,       0,  18,     0,   0,  35,   CT_COAL         ,  0,  0,  0,  0,  0 }, /*  59 */
 | 
				
			||||||
	{ 63, 2, 200,   0,       0,  24,     0,   0,  35,   CT_OIL          , 0, 0, 0, 0 }, /*  60 */
 | 
						{ 63, 2, 200,   0,       0,  24,     0,   0,  35,   CT_OIL          ,  0,  0,  0,  0,  0 }, /*  60 */
 | 
				
			||||||
	{ 64, 2, 192,   0,       0,  20,     0,   0,  30,   CT_LIVESTOCK    , 0, 0, 0, 0 }, /*  61 */
 | 
						{ 64, 2, 192,   0,       0,  20,     0,   0,  30,   CT_LIVESTOCK    ,  0,  0,  0,  0,  0 }, /*  61 */
 | 
				
			||||||
	{ 65, 2, 190,   0,       0,  21,     0,   0,  30,   CT_GOODS        , 0, 0, 0, 0 }, /*  62 */
 | 
						{ 65, 2, 190,   0,       0,  21,     0,   0,  30,   CT_GOODS        ,  0,  0,  0,  0,  0 }, /*  62 */
 | 
				
			||||||
	{ 66, 2, 182,   0,       0,  19,     0,   0,  35,   CT_GRAIN        , 0, 0, 0, 0 }, /*  63 */
 | 
						{ 66, 2, 182,   0,       0,  19,     0,   0,  35,   CT_GRAIN        ,  0,  0,  0,  0,  0 }, /*  63 */
 | 
				
			||||||
	{ 67, 2, 181,   0,       0,  16,     0,   0,  35,   CT_WOOD         , 0, 0, 0, 0 }, /*  64 */
 | 
						{ 67, 2, 181,   0,       0,  16,     0,   0,  35,   CT_WOOD         ,  0,  0,  0,  0,  0 }, /*  64 */
 | 
				
			||||||
	{ 68, 2, 179,   0,       0,  19,     0,   0,  35,   CT_IRON_ORE     , 0, 0, 0, 0 }, /*  65 */
 | 
						{ 68, 2, 179,   0,       0,  19,     0,   0,  35,   CT_IRON_ORE     ,  0,  0,  0,  0,  0 }, /*  65 */
 | 
				
			||||||
	{ 69, 2, 196,   0,       0,  18,     0,   0,  25,   CT_STEEL        , 0, 0, 0, 0 }, /*  66 */
 | 
						{ 69, 2, 196,   0,       0,  18,     0,   0,  25,   CT_STEEL        ,  0,  0,  0,  0,  0 }, /*  66 */
 | 
				
			||||||
	{ 70, 2, 255,   0,       0,  30,     0,   0,  25,   CT_VALUABLES    , 0, 0, 0, 0 }, /*  67 */
 | 
						{ 70, 2, 255,   0,       0,  30,     0,   0,  25,   CT_VALUABLES    ,  0,  0,  0,  0,  0 }, /*  67 */
 | 
				
			||||||
	{ 71, 2, 191,   0,       0,  22,     0,   0,  30,   CT_FOOD         , 0, 0, 0, 0 }, /*  68 */
 | 
						{ 71, 2, 191,   0,       0,  22,     0,   0,  30,   CT_FOOD         ,  0,  0,  0,  0,  0 }, /*  68 */
 | 
				
			||||||
	{ 72, 2, 196,   0,       0,  18,     0,   0,  25,   CT_PAPER        , 0, 0, 0, 0 }, /*  69 */
 | 
						{ 72, 2, 196,   0,       0,  18,     0,   0,  25,   CT_PAPER        ,  0,  0,  0,  0,  0 }, /*  69 */
 | 
				
			||||||
	{ 73, 2, 179,   0,       0,  19,     0,   0,  35,   CT_COPPER_ORE   , 0, 0, 0, 0 }, /*  70 */
 | 
						{ 73, 2, 179,   0,       0,  19,     0,   0,  35,   CT_COPPER_ORE   ,  0,  0,  0,  0,  0 }, /*  70 */
 | 
				
			||||||
	{ 47, 2, 199,   0,       0,  25,     0,   0,  30,   CT_WATER        , 0, 0, 0, 0 }, /*  71 */
 | 
						{ 47, 2, 199,   0,       0,  25,     0,   0,  30,   CT_WATER        ,  0,  0,  0,  0,  0 }, /*  71 */
 | 
				
			||||||
	{ 48, 2, 182,   0,       0,  18,     0,   0,  30,   CT_FRUIT        , 0, 0, 0, 0 }, /*  72 */
 | 
						{ 48, 2, 182,   0,       0,  18,     0,   0,  30,   CT_FRUIT        ,  0,  0,  0,  0,  0 }, /*  72 */
 | 
				
			||||||
	{ 49, 2, 185,   0,       0,  19,     0,   0,  26,   CT_RUBBER       , 0, 0, 0, 0 }, /*  73 */
 | 
						{ 49, 2, 185,   0,       0,  19,     0,   0,  26,   CT_RUBBER       ,  0,  0,  0,  0,  0 }, /*  73 */
 | 
				
			||||||
	{ 50, 2, 176,   0,       0,  19,     0,   0,  35,   CT_SUGAR        , 0, 0, 0, 0 }, /*  74 */
 | 
						{ 50, 2, 176,   0,       0,  19,     0,   0,  35,   CT_SUGAR        ,  0,  0,  0,  0,  0 }, /*  74 */
 | 
				
			||||||
	{ 51, 2, 178,   0,       0,  20,     0,   0,  35,   CT_COTTON_CANDY , 0, 0, 0, 0 }, /*  75 */
 | 
						{ 51, 2, 178,   0,       0,  20,     0,   0,  35,   CT_COTTON_CANDY ,  0,  0,  0,  0,  0 }, /*  75 */
 | 
				
			||||||
	{ 52, 2, 192,   0,       0,  20,     0,   0,  35,   CT_TOFFEE       , 0, 0, 0, 0 }, /*  76 */
 | 
						{ 52, 2, 192,   0,       0,  20,     0,   0,  35,   CT_TOFFEE       ,  0,  0,  0,  0,  0 }, /*  76 */
 | 
				
			||||||
	{ 53, 2, 190,   0,       0,  21,     0,   0,  25,   CT_BUBBLES      , 0, 0, 0, 0 }, /*  77 */
 | 
						{ 53, 2, 190,   0,       0,  21,     0,   0,  25,   CT_BUBBLES      ,  0,  0,  0,  0,  0 }, /*  77 */
 | 
				
			||||||
	{ 54, 2, 182,   0,       0,  24,     0,   0,  30,   CT_COLA         , 0, 0, 0, 0 }, /*  78 */
 | 
						{ 54, 2, 182,   0,       0,  24,     0,   0,  30,   CT_COLA         ,  0,  0,  0,  0,  0 }, /*  78 */
 | 
				
			||||||
	{ 55, 2, 181,   0,       0,  21,     0,   0,  30,   CT_CANDY        , 0, 0, 0, 0 }, /*  79 */
 | 
						{ 55, 2, 181,   0,       0,  21,     0,   0,  30,   CT_CANDY        ,  0,  0,  0,  0,  0 }, /*  79 */
 | 
				
			||||||
	{ 56, 2, 183,   0,       0,  21,     0,   0,  25,   CT_TOYS         , 0, 0, 0, 0 }, /*  80 */
 | 
						{ 56, 2, 183,   0,       0,  21,     0,   0,  25,   CT_TOYS         ,  0,  0,  0,  0,  0 }, /*  80 */
 | 
				
			||||||
	{ 57, 2, 196,   0,       0,  18,     0,   0,  27,   CT_BATTERIES    , 0, 0, 0, 0 }, /*  81 */
 | 
						{ 57, 2, 196,   0,       0,  18,     0,   0,  27,   CT_BATTERIES    ,  0,  0,  0,  0,  0 }, /*  81 */
 | 
				
			||||||
	{ 58, 2, 193,   0,       0,  18,     0,   0,  30,   CT_FIZZY_DRINKS , 0, 0, 0, 0 }, /*  82 */
 | 
						{ 58, 2, 193,   0,       0,  18,     0,   0,  30,   CT_FIZZY_DRINKS ,  0,  0,  0,  0,  0 }, /*  82 */
 | 
				
			||||||
	{ 59, 2, 191,   0,       0,  18,     0,   0,  35,   CT_PLASTIC      , 0, 0, 0, 0 }, /*  83 */
 | 
						{ 59, 2, 191,   0,       0,  18,     0,   0,  35,   CT_PLASTIC      ,  0,  0,  0,  0,  0 }, /*  83 */
 | 
				
			||||||
	{ 28, 0,  70, 400,   10000, 105,   250,   2,   0,   0               , 0, 0, 0, 0 }, /*  84 */
 | 
						{ 28, 0,  70, 400,   10000, 105,   250,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  84 */
 | 
				
			||||||
	{ 29, 0,  74, 448,   12000, 120,   253,   2,   0,   0               , 0, 0, 0, 0 }, /*  85 */
 | 
						{ 29, 0,  74, 448,   12000, 120,   253,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  85 */
 | 
				
			||||||
	{ 30, 0,  82, 480,   15000, 130,   254,   2,   0,   0               , 0, 0, 0, 0 }, /*  86 */
 | 
						{ 30, 0,  82, 480,   15000, 130,   254,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  86 */
 | 
				
			||||||
	{ 31, 1,  95, 640, 20000/2,150/2,255/2,   2,   0,   0               , 0, 0, 0, 0 }, /*  87 */
 | 
						{ 31, 1,  95, 640, 20000/2,150/2,255/2,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  87 */
 | 
				
			||||||
	{ 28, 0,  70, 480,   10000, 120,   250,   2,   0,   0               , 0, 0, 0, 0 }, /*  88 */
 | 
						{ 28, 0,  70, 480,   10000, 120,   250,   2,   0,   0               ,  0,  0,  0,  0,  0 }, /*  88 */
 | 
				
			||||||
	{ 60, 2, 247,   0,       0,  25,     0,   0,  47,   CT_PASSENGERS   , 0, 0, 0, 0 }, /*  89 */
 | 
						{ 60, 2, 247,   0,       0,  25,     0,   0,  47,   CT_PASSENGERS   ,  0,  0,  0,  0,  0 }, /*  89 */
 | 
				
			||||||
	{ 62, 2, 228,   0,       0,  21,     0,   0,  37,   CT_MAIL         , 0, 0, 0, 0 }, /*  90 */
 | 
						{ 62, 2, 228,   0,       0,  21,     0,   0,  37,   CT_MAIL         ,  0,  0,  0,  0,  0 }, /*  90 */
 | 
				
			||||||
	{ 61, 2, 176,   0,       0,  18,     0,   0,  37,   CT_COAL         , 0, 0, 0, 0 }, /*  91 */
 | 
						{ 61, 2, 176,   0,       0,  18,     0,   0,  37,   CT_COAL         ,  0,  0,  0,  0,  0 }, /*  91 */
 | 
				
			||||||
	{ 63, 2, 200,   0,       0,  24,     0,   0,  37,   CT_OIL          , 0, 0, 0, 0 }, /*  92 */
 | 
						{ 63, 2, 200,   0,       0,  24,     0,   0,  37,   CT_OIL          ,  0,  0,  0,  0,  0 }, /*  92 */
 | 
				
			||||||
	{ 64, 2, 192,   0,       0,  20,     0,   0,  32,   CT_LIVESTOCK    , 0, 0, 0, 0 }, /*  93 */
 | 
						{ 64, 2, 192,   0,       0,  20,     0,   0,  32,   CT_LIVESTOCK    ,  0,  0,  0,  0,  0 }, /*  93 */
 | 
				
			||||||
	{ 65, 2, 190,   0,       0,  21,     0,   0,  32,   CT_GOODS        , 0, 0, 0, 0 }, /*  94 */
 | 
						{ 65, 2, 190,   0,       0,  21,     0,   0,  32,   CT_GOODS        ,  0,  0,  0,  0,  0 }, /*  94 */
 | 
				
			||||||
	{ 66, 2, 182,   0,       0,  19,     0,   0,  37,   CT_GRAIN        , 0, 0, 0, 0 }, /*  95 */
 | 
						{ 66, 2, 182,   0,       0,  19,     0,   0,  37,   CT_GRAIN        ,  0,  0,  0,  0,  0 }, /*  95 */
 | 
				
			||||||
	{ 67, 2, 181,   0,       0,  16,     0,   0,  37,   CT_WOOD         , 0, 0, 0, 0 }, /*  96 */
 | 
						{ 67, 2, 181,   0,       0,  16,     0,   0,  37,   CT_WOOD         ,  0,  0,  0,  0,  0 }, /*  96 */
 | 
				
			||||||
	{ 68, 2, 179,   0,       0,  19,     0,   0,  37,   CT_IRON_ORE     , 0, 0, 0, 0 }, /*  97 */
 | 
						{ 68, 2, 179,   0,       0,  19,     0,   0,  37,   CT_IRON_ORE     ,  0,  0,  0,  0,  0 }, /*  97 */
 | 
				
			||||||
	{ 69, 2, 196,   0,       0,  18,     0,   0,  27,   CT_STEEL        , 0, 0, 0, 0 }, /*  98 */
 | 
						{ 69, 2, 196,   0,       0,  18,     0,   0,  27,   CT_STEEL        ,  0,  0,  0,  0,  0 }, /*  98 */
 | 
				
			||||||
	{ 70, 2, 255,   0,       0,  30,     0,   0,  27,   CT_VALUABLES    , 0, 0, 0, 0 }, /*  99 */
 | 
						{ 70, 2, 255,   0,       0,  30,     0,   0,  27,   CT_VALUABLES    ,  0,  0,  0,  0,  0 }, /*  99 */
 | 
				
			||||||
	{ 71, 2, 191,   0,       0,  22,     0,   0,  32,   CT_FOOD         , 0, 0, 0, 0 }, /* 100 */
 | 
						{ 71, 2, 191,   0,       0,  22,     0,   0,  32,   CT_FOOD         ,  0,  0,  0,  0,  0 }, /* 100 */
 | 
				
			||||||
	{ 72, 2, 196,   0,       0,  18,     0,   0,  27,   CT_PAPER        , 0, 0, 0, 0 }, /* 101 */
 | 
						{ 72, 2, 196,   0,       0,  18,     0,   0,  27,   CT_PAPER        ,  0,  0,  0,  0,  0 }, /* 101 */
 | 
				
			||||||
	{ 73, 2, 179,   0,       0,  19,     0,   0,  37,   CT_COPPER_ORE   , 0, 0, 0, 0 }, /* 102 */
 | 
						{ 73, 2, 179,   0,       0,  19,     0,   0,  37,   CT_COPPER_ORE   ,  0,  0,  0,  0,  0 }, /* 102 */
 | 
				
			||||||
	{ 47, 2, 199,   0,       0,  25,     0,   0,  32,   CT_WATER        , 0, 0, 0, 0 }, /* 103 */
 | 
						{ 47, 2, 199,   0,       0,  25,     0,   0,  32,   CT_WATER        ,  0,  0,  0,  0,  0 }, /* 103 */
 | 
				
			||||||
	{ 48, 2, 182,   0,       0,  18,     0,   0,  32,   CT_FRUIT        , 0, 0, 0, 0 }, /* 104 */
 | 
						{ 48, 2, 182,   0,       0,  18,     0,   0,  32,   CT_FRUIT        ,  0,  0,  0,  0,  0 }, /* 104 */
 | 
				
			||||||
	{ 49, 2, 185,   0,       0,  19,     0,   0,  28,   CT_RUBBER       , 0, 0, 0, 0 }, /* 105 */
 | 
						{ 49, 2, 185,   0,       0,  19,     0,   0,  28,   CT_RUBBER       ,  0,  0,  0,  0,  0 }, /* 105 */
 | 
				
			||||||
	{ 50, 2, 176,   0,       0,  19,     0,   0,  37,   CT_SUGAR        , 0, 0, 0, 0 }, /* 106 */
 | 
						{ 50, 2, 176,   0,       0,  19,     0,   0,  37,   CT_SUGAR        ,  0,  0,  0,  0,  0 }, /* 106 */
 | 
				
			||||||
	{ 51, 2, 178,   0,       0,  20,     0,   0,  37,   CT_COTTON_CANDY , 0, 0, 0, 0 }, /* 107 */
 | 
						{ 51, 2, 178,   0,       0,  20,     0,   0,  37,   CT_COTTON_CANDY ,  0,  0,  0,  0,  0 }, /* 107 */
 | 
				
			||||||
	{ 52, 2, 192,   0,       0,  20,     0,   0,  37,   CT_TOFFEE       , 0, 0, 0, 0 }, /* 108 */
 | 
						{ 52, 2, 192,   0,       0,  20,     0,   0,  37,   CT_TOFFEE       ,  0,  0,  0,  0,  0 }, /* 108 */
 | 
				
			||||||
	{ 53, 2, 190,   0,       0,  21,     0,   0,  27,   CT_BUBBLES      , 0, 0, 0, 0 }, /* 109 */
 | 
						{ 53, 2, 190,   0,       0,  21,     0,   0,  27,   CT_BUBBLES      ,  0,  0,  0,  0,  0 }, /* 109 */
 | 
				
			||||||
	{ 54, 2, 182,   0,       0,  24,     0,   0,  32,   CT_COLA         , 0, 0, 0, 0 }, /* 110 */
 | 
						{ 54, 2, 182,   0,       0,  24,     0,   0,  32,   CT_COLA         ,  0,  0,  0,  0,  0 }, /* 110 */
 | 
				
			||||||
	{ 55, 2, 181,   0,       0,  21,     0,   0,  32,   CT_CANDY        , 0, 0, 0, 0 }, /* 111 */
 | 
						{ 55, 2, 181,   0,       0,  21,     0,   0,  32,   CT_CANDY        ,  0,  0,  0,  0,  0 }, /* 111 */
 | 
				
			||||||
	{ 56, 2, 183,   0,       0,  21,     0,   0,  27,   CT_TOYS         , 0, 0, 0, 0 }, /* 112 */
 | 
						{ 56, 2, 183,   0,       0,  21,     0,   0,  27,   CT_TOYS         ,  0,  0,  0,  0,  0 }, /* 112 */
 | 
				
			||||||
	{ 57, 2, 196,   0,       0,  18,     0,   0,  29,   CT_BATTERIES    , 0, 0, 0, 0 }, /* 113 */
 | 
						{ 57, 2, 196,   0,       0,  18,     0,   0,  29,   CT_BATTERIES    ,  0,  0,  0,  0,  0 }, /* 113 */
 | 
				
			||||||
	{ 58, 2, 193,   0,       0,  18,     0,   0,  32,   CT_FIZZY_DRINKS , 0, 0, 0, 0 }, /* 114 */
 | 
						{ 58, 2, 193,   0,       0,  18,     0,   0,  32,   CT_FIZZY_DRINKS ,  0,  0,  0,  0,  0 }, /* 114 */
 | 
				
			||||||
	{ 59, 2, 191,   0,       0,  18,     0,   0,  37,   CT_PLASTIC      , 0, 0, 0, 0 }, /* 115 */
 | 
						{ 59, 2, 191,   0,       0,  18,     0,   0,  37,   CT_PLASTIC      ,  0,  0,  0,  0,  0 }, /* 115 */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ShipVehicleInfo _ship_vehicle_info[NUM_SHIP_ENGINES] = {
 | 
					ShipVehicleInfo _ship_vehicle_info[NUM_SHIP_ENGINES] = {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										67
									
								
								train_cmd.c
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								train_cmd.c
									
									
									
									
									
								
							@@ -1,5 +1,6 @@
 | 
				
			|||||||
#include "stdafx.h"
 | 
					#include "stdafx.h"
 | 
				
			||||||
#include "openttd.h"
 | 
					#include "openttd.h"
 | 
				
			||||||
 | 
					#include "debug.h"
 | 
				
			||||||
#include "table/strings.h"
 | 
					#include "table/strings.h"
 | 
				
			||||||
#include "map.h"
 | 
					#include "map.h"
 | 
				
			||||||
#include "tile.h"
 | 
					#include "tile.h"
 | 
				
			||||||
@@ -22,6 +23,7 @@
 | 
				
			|||||||
	(is_custom_sprite(spritenum) ? IS_CUSTOM_FIRSTHEAD_SPRITE(spritenum) : _engine_sprite_add[spritenum] == 0)
 | 
						(is_custom_sprite(spritenum) ? IS_CUSTOM_FIRSTHEAD_SPRITE(spritenum) : _engine_sprite_add[spritenum] == 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool TrainCheckIfLineEnds(Vehicle *v);
 | 
					static bool TrainCheckIfLineEnds(Vehicle *v);
 | 
				
			||||||
 | 
					static void TrainController(Vehicle *v);
 | 
				
			||||||
extern void ShowTrainViewWindow(Vehicle *v);
 | 
					extern void ShowTrainViewWindow(Vehicle *v);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const byte _vehicle_initial_x_fract[4] = {10,8,4,8};
 | 
					static const byte _vehicle_initial_x_fract[4] = {10,8,4,8};
 | 
				
			||||||
@@ -81,6 +83,7 @@ void TrainConsistChanged(Vehicle *v) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	for (u = v; u != NULL; u = u->next) {
 | 
						for (u = v; u != NULL; u = u->next) {
 | 
				
			||||||
		const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type);
 | 
							const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type);
 | 
				
			||||||
 | 
							uint16 veh_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// update the 'first engine'
 | 
							// update the 'first engine'
 | 
				
			||||||
		u->u.rail.first_engine = (v == u) ? INVALID_VEHICLE : first_engine;
 | 
							u->u.rail.first_engine = (v == u) ? INVALID_VEHICLE : first_engine;
 | 
				
			||||||
@@ -109,6 +112,16 @@ void TrainConsistChanged(Vehicle *v) {
 | 
				
			|||||||
		// max speed is the minimum of the speed limits of all vehicles in the consist
 | 
							// max speed is the minimum of the speed limits of all vehicles in the consist
 | 
				
			||||||
		if (rvi_u->max_speed != 0)
 | 
							if (rvi_u->max_speed != 0)
 | 
				
			||||||
			max_speed = min(rvi_u->max_speed, max_speed);
 | 
								max_speed = min(rvi_u->max_speed, max_speed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// check the vehicle length (callback)
 | 
				
			||||||
 | 
							veh_len = CALLBACK_FAILED;
 | 
				
			||||||
 | 
							if (HASBIT(rvi_u->callbackmask, CBM_VEH_LENGTH))
 | 
				
			||||||
 | 
								veh_len = GetCallBackResult(CBID_VEH_LENGTH,  u->engine_type, u);
 | 
				
			||||||
 | 
							if (veh_len == CALLBACK_FAILED)
 | 
				
			||||||
 | 
								veh_len = rvi_u->shorten_factor;
 | 
				
			||||||
 | 
							assert(veh_len < 8);
 | 
				
			||||||
 | 
							u->u.rail.cached_veh_length = 8 - veh_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// store consist weight/max speed in cache
 | 
						// store consist weight/max speed in cache
 | 
				
			||||||
@@ -1257,6 +1270,52 @@ static void DisableTrainCrossing(TileIndex tile)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Advances wagons for train reversing, needed for variable length wagons.
 | 
				
			||||||
 | 
					 * Needs to be called once before the train is reversed, and once after it.
 | 
				
			||||||
 | 
					 * @param v First vehicle in chain
 | 
				
			||||||
 | 
					 * @param before Set to true for the call before reversing, false otherwise
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void AdvanceWagons(Vehicle *v, bool before)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Vehicle *base, *first, *last, *tempnext;
 | 
				
			||||||
 | 
						int i, length;
 | 
				
			||||||
 | 
						int differential;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						base = v;
 | 
				
			||||||
 | 
						first = base->next;
 | 
				
			||||||
 | 
						length = CountVehiclesInChain(v);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (length > 2) {
 | 
				
			||||||
 | 
							// find pairwise matching wagon
 | 
				
			||||||
 | 
							// start<>end, start+1<>end-1, ... */
 | 
				
			||||||
 | 
							last = first;
 | 
				
			||||||
 | 
							for (i = length - 3; i; i--) {
 | 
				
			||||||
 | 
								last = last->next;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							differential = last->u.rail.cached_veh_length - base->u.rail.cached_veh_length;
 | 
				
			||||||
 | 
							if (before)
 | 
				
			||||||
 | 
								differential *= -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (differential > 0) {
 | 
				
			||||||
 | 
								// disconnect last car to make sure only this subset moves
 | 
				
			||||||
 | 
								tempnext = last->next;
 | 
				
			||||||
 | 
								last->next = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (i = 0; i < differential; i++) {
 | 
				
			||||||
 | 
									TrainController(first);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								last->next = tempnext;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							base = first;
 | 
				
			||||||
 | 
							first = first->next;
 | 
				
			||||||
 | 
							length -= 2;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ReverseTrainDirection(Vehicle *v)
 | 
					static void ReverseTrainDirection(Vehicle *v)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int l = 0, r = -1;
 | 
						int l = 0, r = -1;
 | 
				
			||||||
@@ -1285,11 +1344,15 @@ static void ReverseTrainDirection(Vehicle *v)
 | 
				
			|||||||
	u = v;
 | 
						u = v;
 | 
				
			||||||
	do r++; while ( (u = u->next) != NULL );
 | 
						do r++; while ( (u = u->next) != NULL );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						AdvanceWagons(v, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* swap start<>end, start+1<>end-1, ... */
 | 
						/* swap start<>end, start+1<>end-1, ... */
 | 
				
			||||||
	do {
 | 
						do {
 | 
				
			||||||
		ReverseTrainSwapVeh(v, l++, r--);
 | 
							ReverseTrainSwapVeh(v, l++, r--);
 | 
				
			||||||
	} while (l <= r);
 | 
						} while (l <= r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						AdvanceWagons(v, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (IsTileDepotType(v->tile, TRANSPORT_RAIL))
 | 
						if (IsTileDepotType(v->tile, TRANSPORT_RAIL))
 | 
				
			||||||
		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 | 
							InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2723,8 +2786,6 @@ static void TrainController(Vehicle *v)
 | 
				
			|||||||
			v->x_pos = gp.x;
 | 
								v->x_pos = gp.x;
 | 
				
			||||||
			v->y_pos = gp.y;
 | 
								v->y_pos = gp.y;
 | 
				
			||||||
			VehiclePositionChanged(v);
 | 
								VehiclePositionChanged(v);
 | 
				
			||||||
			if (prev == NULL)
 | 
					 | 
				
			||||||
				CheckTrainCollision(v);
 | 
					 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
common:;
 | 
					common:;
 | 
				
			||||||
@@ -2743,7 +2804,6 @@ common:;
 | 
				
			|||||||
		if (prev == NULL) {
 | 
							if (prev == NULL) {
 | 
				
			||||||
			/* This is the first vehicle in the train */
 | 
								/* This is the first vehicle in the train */
 | 
				
			||||||
			AffectSpeedByZChange(v, old_z);
 | 
								AffectSpeedByZChange(v, old_z);
 | 
				
			||||||
			CheckTrainCollision(v);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
@@ -3106,6 +3166,7 @@ static void TrainLocoHandler(Vehicle *v, bool mode)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		do {
 | 
							do {
 | 
				
			||||||
			TrainController(v);
 | 
								TrainController(v);
 | 
				
			||||||
 | 
								CheckTrainCollision(v);
 | 
				
			||||||
			if (v->cur_speed <= 0x100)
 | 
								if (v->cur_speed <= 0x100)
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
		} while (--j != 0);
 | 
							} while (--j != 0);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										46
									
								
								train_gui.c
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								train_gui.c
									
									
									
									
									
								
							@@ -1,6 +1,7 @@
 | 
				
			|||||||
#include "stdafx.h"
 | 
					#include "stdafx.h"
 | 
				
			||||||
#include "openttd.h"
 | 
					#include "openttd.h"
 | 
				
			||||||
#include "debug.h"
 | 
					#include "debug.h"
 | 
				
			||||||
 | 
					#include "table/sprites.h"
 | 
				
			||||||
#include "table/strings.h"
 | 
					#include "table/strings.h"
 | 
				
			||||||
#include "map.h"
 | 
					#include "map.h"
 | 
				
			||||||
#include "window.h"
 | 
					#include "window.h"
 | 
				
			||||||
@@ -328,20 +329,27 @@ static void ShowBuildTrainWindow(uint tile)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void DrawTrainImage(const Vehicle *v, int x, int y, int count, int skip, VehicleID selection)
 | 
					static void DrawTrainImage(const Vehicle *v, int x, int y, int count, int skip, VehicleID selection)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						int max_x = x + count * 29;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	do {
 | 
						do {
 | 
				
			||||||
		if (--skip < 0) {
 | 
							if (--skip < 0) {
 | 
				
			||||||
			int image = GetTrainImage(v, 6);
 | 
								int image = GetTrainImage(v, 6);
 | 
				
			||||||
			uint32 ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
 | 
								uint32 ormod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
 | 
				
			||||||
			if (v->vehstatus & VS_CRASHED) ormod = 0x3248000;
 | 
								int width = v->u.rail.cached_veh_length * 3;
 | 
				
			||||||
			DrawSprite(image | ormod, x+14, y+6+_traininfo_vehicle_pitch);
 | 
					
 | 
				
			||||||
			if (v->index == selection) DrawFrameRect(x-1, y-1, x+28, y+12, 15, 0x10);
 | 
								if (x + width + 4 <= max_x) {
 | 
				
			||||||
			x += 29;
 | 
									if (v->vehstatus & VS_CRASHED)
 | 
				
			||||||
			count--;
 | 
										ormod = PALETTE_CRASH;
 | 
				
			||||||
 | 
									DrawSprite(image | ormod, x + 14, y + 6 + _traininfo_vehicle_pitch);
 | 
				
			||||||
 | 
									if (v->index == selection)
 | 
				
			||||||
 | 
										DrawFrameRect(x - 1, y - 1, x + width + 4, y + 12, 15, 0x10);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								x += width + 5;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!(v = v->next))
 | 
							if (!(v = v->next))
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
	} while (count);
 | 
						} while (x < max_x);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void DrawTrainDepotWindow(Window *w)
 | 
					static void DrawTrainDepotWindow(Window *w)
 | 
				
			||||||
@@ -409,8 +417,10 @@ static void DrawTrainDepotWindow(Window *w)
 | 
				
			|||||||
			/*Draw the train counter */
 | 
								/*Draw the train counter */
 | 
				
			||||||
			i = 0;
 | 
								i = 0;
 | 
				
			||||||
			u = v;
 | 
								u = v;
 | 
				
			||||||
			do i++; while ( (u=u->next) != NULL);		//Determine length of train
 | 
								do {
 | 
				
			||||||
			SetDParam(0, i);				//Set the counter
 | 
									i += u->u.rail.cached_veh_length + 1;
 | 
				
			||||||
 | 
								} while ( (u=u->next) != NULL);			//Determine length of train
 | 
				
			||||||
 | 
								SetDParam(0, (i+8) / 9);			//Set the counter
 | 
				
			||||||
			i = (w->hscroll.cap * 29) + (x + 26);		//Calculate position of text according to window size
 | 
								i = (w->hscroll.cap * 29) + (x + 26);		//Calculate position of text according to window size
 | 
				
			||||||
			DrawStringCentered(i, y+5, STR_TINY_BLACK, 0);	//Draw the counter
 | 
								DrawStringCentered(i, y+5, STR_TINY_BLACK, 0);	//Draw the counter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -451,16 +461,11 @@ typedef struct GetDepotVehiclePtData {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static int GetVehicleFromTrainDepotWndPt(Window *w, int x, int y, GetDepotVehiclePtData *d)
 | 
					static int GetVehicleFromTrainDepotWndPt(Window *w, int x, int y, GetDepotVehiclePtData *d)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int area_x;
 | 
					 | 
				
			||||||
	int row;
 | 
						int row;
 | 
				
			||||||
 | 
						int skip = 0;
 | 
				
			||||||
	Vehicle *v;
 | 
						Vehicle *v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	x = x - 23;
 | 
						x = x - 23;
 | 
				
			||||||
	if (x < 0) {
 | 
					 | 
				
			||||||
		area_x = (x >= -10) ? -2 : -1;
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		area_x = x / 29;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	row = (y - 14) / 14;
 | 
						row = (y - 14) / 14;
 | 
				
			||||||
	if ( (uint) row >= w->vscroll.cap)
 | 
						if ( (uint) row >= w->vscroll.cap)
 | 
				
			||||||
@@ -475,12 +480,12 @@ static int GetVehicleFromTrainDepotWndPt(Window *w, int x, int y, GetDepotVehicl
 | 
				
			|||||||
				v->tile == w->window_number &&
 | 
									v->tile == w->window_number &&
 | 
				
			||||||
				v->u.rail.track == 0x80 &&
 | 
									v->u.rail.track == 0x80 &&
 | 
				
			||||||
				--row < 0) {
 | 
									--row < 0) {
 | 
				
			||||||
					if (area_x >= 0) area_x += w->hscroll.pos;
 | 
										skip = w->hscroll.pos;
 | 
				
			||||||
					goto found_it;
 | 
										goto found_it;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	area_x--; /* free wagons don't have an initial loco. */
 | 
						x -= 29; /* free wagons don't have an initial loco. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* and then the list of free wagons */
 | 
						/* and then the list of free wagons */
 | 
				
			||||||
	FOR_ALL_VEHICLES(v) {
 | 
						FOR_ALL_VEHICLES(v) {
 | 
				
			||||||
@@ -502,11 +507,14 @@ found_it:
 | 
				
			|||||||
	d->head = d->wagon = v;
 | 
						d->head = d->wagon = v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* either pressed the flag or the number, but only when it's a loco */
 | 
						/* either pressed the flag or the number, but only when it's a loco */
 | 
				
			||||||
	if (area_x < 0 && v->subtype == TS_Front_Engine)
 | 
						if (x < 0 && v->subtype == TS_Front_Engine)
 | 
				
			||||||
		return area_x;
 | 
							return (x >= -10) ? -2 : -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// skip vehicles that are scrolled off the left side
 | 
				
			||||||
 | 
						while (skip--) v = v->next;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* find the vehicle in this row that was clicked */
 | 
						/* find the vehicle in this row that was clicked */
 | 
				
			||||||
	while (--area_x >= 0) {
 | 
						while ((x -= v->u.rail.cached_veh_length * 3 + 5) >= 0) {
 | 
				
			||||||
		v = v->next;
 | 
							v = v->next;
 | 
				
			||||||
		if (v == NULL) break;
 | 
							if (v == NULL) break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -528,7 +528,7 @@ static void DoDrawVehicle(Vehicle *v)
 | 
				
			|||||||
	if (v->vehstatus & VS_DISASTER) {
 | 
						if (v->vehstatus & VS_DISASTER) {
 | 
				
			||||||
		image |= 0x3224000;
 | 
							image |= 0x3224000;
 | 
				
			||||||
	} else if (v->vehstatus & VS_DEFPAL) {
 | 
						} else if (v->vehstatus & VS_DEFPAL) {
 | 
				
			||||||
		image |= (v->vehstatus & VS_CRASHED) ? 0x3248000 : SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
 | 
							image |= (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : SPRITE_PALETTE(PLAYER_SPRITE_COLOR(v->owner));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	AddSortableSpriteToDraw(image, v->x_pos + v->x_offs, v->y_pos + v->y_offs,
 | 
						AddSortableSpriteToDraw(image, v->x_pos + v->x_offs, v->y_pos + v->y_offs,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,6 +53,7 @@ typedef struct VehicleRail {
 | 
				
			|||||||
	// cached values, recalculated on load and each time a vehicle is added to/removed from the consist.
 | 
						// cached values, recalculated on load and each time a vehicle is added to/removed from the consist.
 | 
				
			||||||
	uint16 cached_max_speed;  // max speed of the consist. (minimum of the max speed of all vehicles in the consist)
 | 
						uint16 cached_max_speed;  // max speed of the consist. (minimum of the max speed of all vehicles in the consist)
 | 
				
			||||||
	uint32 cached_power;      // total power of the consist.
 | 
						uint32 cached_power;      // total power of the consist.
 | 
				
			||||||
 | 
						uint8 cached_veh_length;  // length of this vehicle in units of 1/8 of normal length, cached because this can be set by a callback
 | 
				
			||||||
	// cached values, recalculated when the cargo on a train changes (in addition to the conditions above)
 | 
						// cached values, recalculated when the cargo on a train changes (in addition to the conditions above)
 | 
				
			||||||
	uint16 cached_weight;     // total weight of the consist.
 | 
						uint16 cached_weight;     // total weight of the consist.
 | 
				
			||||||
	uint16 cached_veh_weight; // weight of the vehicle.
 | 
						uint16 cached_veh_weight; // weight of the vehicle.
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user