Files @ r5312:ffd375effb01
Branch filter:

Location: cpp/openttd-patchpack/source/station.h - annotation

Darkvater
(svn r7468) -Codechange: [win32] Add some comments to MB/WIDE_TO_WIDE/MB_[BUFFER] macros and
use them some more in win32 code. Also for the clipboard use the convert_from_fs
function instead of calling Win32 API directly. Make the static buffers in OTTD2FS
and FS2OTTD the same size (character-length wise)
r2186:5ee653b1b5e1
r2186:5ee653b1b5e1
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r2154:83cf5a3d6634
r5216:bdd3aa57475e
r405:af2e0e5f1331
r1247:d01094dbcdcc
r2963:056135abdc92
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r3347:b0be9ba36dd3
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1935:14189c6d6c9d
r0:d63b455452f6
r0:d63b455452f6
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1266:eab492937b2b
r1266:eab492937b2b
r3123:3f0d39f0a427
r1266:eab492937b2b
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r4397:ee009589bbcb
r3431:d4db460d5bfc
r1551:252aaa58b02a
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r3587:3a7498e030bb
r3587:3a7498e030bb
r3587:3a7498e030bb
r3587:3a7498e030bb
r3587:3a7498e030bb
r3587:3a7498e030bb
r0:d63b455452f6
r0:d63b455452f6
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r193:6aa65dc5a4b4
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r2475:8ceca0de932b
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r3587:3a7498e030bb
r3786:49468ad3e46e
r3587:3a7498e030bb
r3587:3a7498e030bb
r4289:b392a03b3ca3
r0:d63b455452f6
r0:d63b455452f6
r393:57c73ac69034
r1551:252aaa58b02a
r0:d63b455452f6
r3580:25c52552a9cd
r0:d63b455452f6
r1217:1f9b7fc00eb8
r3687:4392ae07446f
r3687:4392ae07446f
r3687:4392ae07446f
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r4344:bff007ae1fd1
r3554:eec715dbe631
r3554:eec715dbe631
r3554:eec715dbe631
r1217:1f9b7fc00eb8
r3554:eec715dbe631
r1751:242d46045f3b
r1751:242d46045f3b
r3554:eec715dbe631
r0:d63b455452f6
r0:d63b455452f6
r568:3ee180395698
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4344:bff007ae1fd1
r4059:35d2ee7000b3
r4344:bff007ae1fd1
r915:dabba47e3ed1
r568:3ee180395698
r2498:8dfa040ed505
r0:d63b455452f6
r2498:8dfa040ed505
r1093:18f56ef2d029
r0:d63b455452f6
r3812:1a25bd693268
r3812:1a25bd693268
r3812:1a25bd693268
r3812:1a25bd693268
r5216:bdd3aa57475e
r1272:a89befd437f8
r5247:1abbd3b3cd80
r4354:95cd3ce6deea
r4354:95cd3ce6deea
r4354:95cd3ce6deea
r5247:1abbd3b3cd80
r4354:95cd3ce6deea
r4354:95cd3ce6deea
r5247:1abbd3b3cd80
r5247:1abbd3b3cd80
r5247:1abbd3b3cd80
r5247:1abbd3b3cd80
r5247:1abbd3b3cd80
r4354:95cd3ce6deea
r4354:95cd3ce6deea
r4354:95cd3ce6deea
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4352:460a517b040f
r4352:460a517b040f
r4352:460a517b040f
r4352:460a517b040f
r4352:460a517b040f
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4980:f43a85870b6c
r1272:a89befd437f8
r919:57ef81f1ba8e
r1284:bfca7c1236df
r1284:bfca7c1236df
r1284:bfca7c1236df
r5216:bdd3aa57475e
r1284:bfca7c1236df
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4346:fa4ac6b6f852
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4398:8829599de6ac
r4981:ef6e7595ac1d
r1284:bfca7c1236df
r1284:bfca7c1236df
r1284:bfca7c1236df
r1284:bfca7c1236df
r1284:bfca7c1236df
r3765:c9eaea3d3f78
r1424:d83d29456f7b
r1424:d83d29456f7b
r2436:963efe8b84cc
r3928:9dfbde96c6f9
r5220:f1a0b5cb28f4
r384:75b26a2a614a
r384:75b26a2a614a
r3763:d49feb04b007
r2520:1767662fb229
r2520:1767662fb229
r1217:1f9b7fc00eb8
r1217:1f9b7fc00eb8
r3123:3f0d39f0a427
r1284:bfca7c1236df
r3123:3f0d39f0a427
r1217:1f9b7fc00eb8
r1751:242d46045f3b
r1751:242d46045f3b
r3900:1c2675abec23
r1751:242d46045f3b
r1751:242d46045f3b
r0:d63b455452f6
/* $Id$ */

#ifndef STATION_H
#define STATION_H

#include "player.h"
#include "oldpool.h"
#include "sprite.h"
#include "tile.h"
#include "newgrf_station.h"

typedef struct GoodsEntry {
	uint16 waiting_acceptance;
	byte days_since_pickup;
	byte rating;
	StationID enroute_from;
	byte enroute_time;
	byte last_speed;
	byte last_age;
	int32 feeder_profit;
} GoodsEntry;

typedef enum RoadStopType {
	RS_BUS,
	RS_TRUCK
} RoadStopType;

enum {
	INVALID_STATION = 0xFFFF,
	ROAD_STOP_LIMIT = 16,
};

typedef struct RoadStop {
	TileIndex xy;
	bool used;
	byte status;
	RoadStopID index;
	byte num_vehicles;
	StationID station;
	struct RoadStop *next;
	struct RoadStop *prev;
} RoadStop;

typedef struct StationSpecList {
	const StationSpec *spec;
	uint32 grfid;      /// GRF ID of this custom station
	uint8  localidx;   /// Station ID within GRF of station
} StationSpecList;

struct Station {
	TileIndex xy;
	RoadStop *bus_stops;
	RoadStop *truck_stops;
	TileIndex train_tile;
	TileIndex airport_tile;
	TileIndex dock_tile;
	Town *town;
	uint16 string_id;

	ViewportSign sign;

	uint16 had_vehicle_of_type;

	byte time_since_load;
	byte time_since_unload;
	byte delete_ctr;
	PlayerID owner;
	byte facilities;
	byte airport_type;

	// trainstation width/height
	byte trainst_w, trainst_h;

	/** List of custom stations (StationSpecs) allocated to the station */
	uint8 num_specs;
	StationSpecList *speclist;

	Date build_date;

	//uint16 airport_flags;
	uint32 airport_flags;
	StationID index;

	byte last_vehicle_type;
	GoodsEntry goods[NUM_CARGO];

	uint16 random_bits;
	byte waiting_triggers;

	/* Stuff that is no longer used, but needed for conversion */
	TileIndex bus_tile_obsolete;
	TileIndex lorry_tile_obsolete;

	byte truck_stop_status_obsolete;
	byte bus_stop_status_obsolete;
	byte blocked_months_obsolete;
};

enum {
	FACIL_TRAIN      = 0x01,
	FACIL_TRUCK_STOP = 0x02,
	FACIL_BUS_STOP   = 0x04,
	FACIL_AIRPORT    = 0x08,
	FACIL_DOCK       = 0x10,
};

enum {
//	HVOT_PENDING_DELETE = 1 << 0, // not needed anymore
	HVOT_TRAIN    = 1 << 1,
	HVOT_BUS      = 1 << 2,
	HVOT_TRUCK    = 1 << 3,
	HVOT_AIRCRAFT = 1 << 4,
	HVOT_SHIP     = 1 << 5,
	/* This bit is used to mark stations. No, it does not belong here, but what
	 * can we do? ;-) */
	HVOT_BUOY     = 1 << 6
};

enum {
	CA_BUS             =  3,
	CA_TRUCK           =  3,
	CA_AIR_OILPAD      =  3,
	CA_TRAIN           =  4,
	CA_AIR_HELIPORT    =  4,
	CA_AIR_SMALL       =  4,
	CA_AIR_LARGE       =  5,
	CA_DOCK            =  5,
	CA_AIR_METRO       =  6,
	CA_AIR_INTER       =  8,
	CA_AIR_COMMUTER    =  4,
	CA_AIR_HELIDEPOT   =  4,
	CA_AIR_INTERCON    = 10,
	CA_AIR_HELISTATION =  4,
};

void ModifyStationRatingAround(TileIndex tile, PlayerID owner, int amount, uint radius);

void ShowStationViewWindow(StationID station);
void UpdateAllStationVirtCoord(void);

/* sorter stuff */
void RebuildStationLists(void);
void ResortStationLists(void);

DECLARE_OLD_POOL(Station, Station, 6, 1000)

static inline StationID GetMaxStationIndex(void)
{
	/* TODO - This isn't the real content of the function, but
	 *  with the new pool-system this will be replaced with one that
	 *  _really_ returns the highest index. Now it just returns
	 *  the next safe value we are sure about everything is below.
	 */
	return GetStationPoolSize() - 1;
}

static inline uint GetNumStations(void)
{
	return GetStationPoolSize();
}

/**
 * Check if a station really exists.
 */
static inline bool IsValidStation(const Station *st)
{
	return st->xy != 0;
}

static inline bool IsValidStationID(StationID index)
{
	return index < GetStationPoolSize() && IsValidStation(GetStation(index));
}

void DestroyStation(Station *st);

static inline void DeleteStation(Station *st)
{
	DestroyStation(st);
	st->xy = 0;
}

#define FOR_ALL_STATIONS_FROM(st, start) for (st = GetStation(start); st != NULL; st = (st->index + 1U < GetStationPoolSize()) ? GetStation(st->index + 1U) : NULL) if (IsValidStation(st))
#define FOR_ALL_STATIONS(st) FOR_ALL_STATIONS_FROM(st, 0)


/* Stuff for ROADSTOPS */

DECLARE_OLD_POOL(RoadStop, RoadStop, 5, 2000)

/**
 * Check if a RaodStop really exists.
 */
static inline bool IsValidRoadStop(const RoadStop *rs)
{
	return rs->used;
}

void DestroyRoadStop(RoadStop* rs);

static inline void DeleteRoadStop(RoadStop *rs)
{
	DestroyRoadStop(rs);
	rs->used = false;
}

#define FOR_ALL_ROADSTOPS_FROM(rs, start) for (rs = GetRoadStop(start); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) if (IsValidRoadStop(rs))
#define FOR_ALL_ROADSTOPS(rs) FOR_ALL_ROADSTOPS_FROM(rs, 0)

/* End of stuff for ROADSTOPS */


void AfterLoadStations(void);
void GetProductionAroundTiles(AcceptedCargo produced, TileIndex tile, int w, int h, int rad);
void GetAcceptanceAroundTiles(AcceptedCargo accepts, TileIndex tile, int w, int h, int rad);
uint GetStationPlatforms(const Station *st, TileIndex tile);
uint GetPlatformLength(TileIndex tile, DiagDirection dir);
void MarkStationTilesDirty(const Station *st);


const DrawTileSprites *GetStationTileLayout(byte gfx);
void StationPickerDrawSprite(int x, int y, RailType railtype, int image);

RoadStop * GetRoadStopByTile(TileIndex tile, RoadStopType type);
RoadStop * GetPrimaryRoadStop(const Station *st, RoadStopType type);
uint GetNumRoadStops(const Station* st, RoadStopType type);
RoadStop * AllocateRoadStop( void );
void ClearSlot(Vehicle *v);

static inline bool IsBuoy(const Station* st)
{
	return (st->had_vehicle_of_type & HVOT_BUOY) != 0; /* XXX: We should really ditch this ugly coding and switch to something sane... */
}

#endif /* STATION_H */