OpenTTD-patches/openttd.h

559 lines
15 KiB
C

/* $Id$ */
/** @file openttd.h */
#ifndef OPENTTD_H
#define OPENTTD_H
#ifndef VARDEF
#define VARDEF extern
#endif
typedef struct Rect {
int left,top,right,bottom;
} Rect;
typedef struct Point {
int x,y;
} Point;
typedef struct Pair {
int a;
int b;
} Pair;
#include "map.h"
#include "slope.h"
// Forward declarations of structs.
typedef struct Vehicle Vehicle;
typedef struct Depot Depot;
typedef struct Waypoint Waypoint;
typedef struct Window Window;
typedef struct Station Station;
typedef struct ViewPort ViewPort;
typedef struct Town Town;
typedef struct NewsItem NewsItem;
typedef struct Industry Industry;
typedef struct DrawPixelInfo DrawPixelInfo;
typedef uint16 VehicleID;
typedef uint16 StationID;
typedef uint16 RoadStopID;
typedef uint16 TownID;
typedef uint16 IndustryID;
typedef uint16 DepotID;
typedef uint16 WaypointID;
typedef uint16 OrderID;
typedef byte PlayerID;
typedef byte VehicleOrderID; ///< The index of an order within its current vehicle (not pool related)
typedef byte CargoID;
typedef byte LandscapeID;
typedef uint16 StringID;
typedef uint32 SpriteID; ///< The number of a sprite, without mapping bits and colortables
typedef uint32 PalSpriteID; ///< The number of a sprite plus all the mapping bits and colortables
typedef uint32 CursorID;
typedef uint16 EngineID;
typedef uint16 EngineRenewID;
typedef uint16 SignID;
typedef uint16 UnitID;
typedef union DestinationID {
StationID station;
DepotID depot;
WaypointID waypoint;
uint16 disaster; ///< Please don't ask about it, but disasters uses orders to store stuff...
} DestinationID;
/* All items of DestinationID has to be of the same size, because some part
* of the code depends on the fact that DestinationID is the same for all
* items inside DestinationID. Check PackOrder() */
assert_compile(sizeof(StationID) == sizeof(DepotID));
assert_compile(sizeof(StationID) == sizeof(WaypointID));
assert_compile(sizeof(StationID) == sizeof(uint16));
typedef uint32 WindowNumber;
typedef byte WindowClass;
enum {
INVALID_YEAR = -1,
INVALID_DATE = -1,
};
typedef int32 Year;
typedef int32 Date;
enum GameModes {
GM_MENU,
GM_NORMAL,
GM_EDITOR
};
enum SwitchModes {
SM_NONE = 0,
SM_NEWGAME = 1,
SM_EDITOR = 2,
SM_LOAD = 3,
SM_MENU = 4,
SM_SAVE = 5,
SM_GENRANDLAND = 6,
SM_LOAD_SCENARIO = 9,
SM_START_SCENARIO = 10,
SM_START_HEIGHTMAP = 11,
SM_LOAD_HEIGHTMAP = 12,
};
/* Modes for GenerateWorld */
enum GenerateWorldModes {
GW_NEWGAME = 0, /* Generate a map for a new game */
GW_EMPTY = 1, /* Generate an empty map (sea-level) */
GW_RANDOM = 2, /* Generate a random map for SE */
GW_HEIGHTMAP = 3, /* Generate a newgame from a heightmap */
};
/* Modes for InitializeGame, those are _bits_! */
enum InitializeGameModes {
IG_NONE = 0, /* Don't do anything special */
IG_DATE_RESET = 1, /* Reset the date when initializing a game */
};
typedef enum TransportTypes {
/* These constants are for now linked to the representation of bridges
* and tunnels, so they can be used by GetTileTrackStatus_TunnelBridge.
* In an ideal world, these constants would be used everywhere when
* accessing tunnels and bridges. For now, you should just not change
* the values for road and rail.
*/
TRANSPORT_RAIL = 0,
TRANSPORT_ROAD = 1,
TRANSPORT_WATER, // = 2
TRANSPORT_END,
INVALID_TRANSPORT = 0xff,
} TransportType;
typedef struct TileInfo {
uint x;
uint y;
Slope tileh;
TileIndex tile;
uint z;
} TileInfo;
/* Display Options */
enum {
DO_SHOW_TOWN_NAMES = 1 << 0,
DO_SHOW_STATION_NAMES = 1 << 1,
DO_SHOW_SIGNS = 1 << 2,
DO_FULL_ANIMATION = 1 << 3,
DO_TRANS_BUILDINGS = 1 << 4,
DO_FULL_DETAIL = 1 << 5,
DO_WAYPOINTS = 1 << 6,
DO_TRANS_SIGNS = 1 << 7,
};
/* Landscape types */
enum {
LT_NORMAL = 0,
LT_HILLY = 1,
LT_DESERT = 2,
LT_CANDY = 3,
NUM_LANDSCAPE = 4,
};
enum {
NUM_PRICES = 49,
};
typedef struct Prices {
int32 station_value;
int32 build_rail;
int32 build_road;
int32 build_signals;
int32 build_bridge;
int32 build_train_depot;
int32 build_road_depot;
int32 build_ship_depot;
int32 build_tunnel;
int32 train_station_track;
int32 train_station_length;
int32 build_airport;
int32 build_bus_station;
int32 build_truck_station;
int32 build_dock;
int32 build_railvehicle;
int32 build_railwagon;
int32 aircraft_base;
int32 roadveh_base;
int32 ship_base;
int32 build_trees;
int32 terraform;
int32 clear_1;
int32 purchase_land;
int32 clear_2;
int32 clear_3;
int32 remove_trees;
int32 remove_rail;
int32 remove_signals;
int32 clear_bridge;
int32 remove_train_depot;
int32 remove_road_depot;
int32 remove_ship_depot;
int32 clear_tunnel;
int32 clear_water;
int32 remove_rail_station;
int32 remove_airport;
int32 remove_bus_station;
int32 remove_truck_station;
int32 remove_dock;
int32 remove_house;
int32 remove_road;
int32 running_rail[3];
int32 aircraft_running;
int32 roadveh_running;
int32 ship_running;
int32 build_industry;
} Prices;
#define GAME_DIFFICULTY_NUM 18
typedef struct GameDifficulty {
int max_no_competitors;
int competitor_start_time;
int number_towns;
int number_industries;
int max_loan;
int initial_interest;
int vehicle_costs;
int competitor_speed;
int competitor_intelligence; // no longer in use
int vehicle_breakdowns;
int subsidy_multiplier;
int construction_cost;
int terrain_type;
int quantity_sea_lakes;
int economy;
int line_reverse_mode;
int disasters;
int town_council_tolerance; // minimum required town ratings to be allowed to demolish stuff
} GameDifficulty;
enum {
// Temperate
CT_PASSENGERS = 0,
CT_COAL = 1,
CT_MAIL = 2,
CT_OIL = 3,
CT_LIVESTOCK = 4,
CT_GOODS = 5,
CT_GRAIN = 6,
CT_WOOD = 7,
CT_IRON_ORE = 8,
CT_STEEL = 9,
CT_VALUABLES = 10,
CT_FOOD = 11,
// Arctic
CT_WHEAT = 6,
CT_HILLY_UNUSED = 8,
CT_PAPER = 9,
CT_GOLD = 10,
// Tropic
CT_RUBBER = 1,
CT_FRUIT = 4,
CT_MAIZE = 6,
CT_COPPER_ORE = 8,
CT_WATER = 9,
CT_DIAMONDS = 10,
// Toyland
CT_SUGAR = 1,
CT_TOYS = 3,
CT_BATTERIES = 4,
CT_CANDY = 5,
CT_TOFFEE = 6,
CT_COLA = 7,
CT_COTTON_CANDY = 8,
CT_BUBBLES = 9,
CT_PLASTIC = 10,
CT_FIZZY_DRINKS = 11,
NUM_CARGO = 12,
CT_INVALID = 0xFF
};
typedef uint AcceptedCargo[NUM_CARGO];
typedef struct TileDesc {
StringID str;
byte owner;
Date build_date;
uint32 dparam[2];
} TileDesc;
typedef struct {
int32 left;
int32 top;
byte width_1, width_2;
} ViewportSign;
typedef void DrawTileProc(TileInfo *ti);
typedef uint GetSlopeZProc(TileIndex tile, uint x, uint y);
typedef int32 ClearTileProc(TileIndex tile, byte flags);
typedef void GetAcceptedCargoProc(TileIndex tile, AcceptedCargo res);
typedef void GetTileDescProc(TileIndex tile, TileDesc *td);
/* GetTileTrackStatusProcs return a value that contains the possible tracks
* that can be taken on a given tile by a given transport. The return value is
* composed as follows: 0xaabbccdd. ccdd and aabb are bitmasks of trackdirs,
* where bit n corresponds to trackdir n. ccdd are the trackdirs that are
* present in the tile (1==present, 0==not present), aabb is the signal
* status, if applicable (0==green/no signal, 1==red, note that this is
* reversed from map3/2[tile] for railway signals).
*
* The result (let's call it ts) is often used as follows:
* tracks = (byte)(ts | ts >>8)
* This effectively converts the present part of the result (ccdd) to a
* track bitmask, which disregards directions. Normally, this is the same as just
* doing (byte)ts I think, although I am not really sure
*
* A trackdir is combination of a track and a dir, where the lower three bits
* are a track, the fourth bit is the direction. these give 12 (or 14)
* possible options: 0-5 and 8-13, so we need 14 bits for a trackdir bitmask
* above.
*/
typedef uint32 GetTileTrackStatusProc(TileIndex tile, TransportType mode);
typedef void GetProducedCargoProc(TileIndex tile, CargoID *b);
typedef void ClickTileProc(TileIndex tile);
typedef void AnimateTileProc(TileIndex tile);
typedef void TileLoopProc(TileIndex tile);
typedef void ChangeTileOwnerProc(TileIndex tile, PlayerID old_player, PlayerID new_player);
/* Return value has bit 0x2 set, when the vehicle enters a station. Then,
* result << 8 contains the id of the station entered. If the return value has
* bit 0x8 set, the vehicle could not and did not enter the tile. Are there
* other bits that can be set? */
typedef uint32 VehicleEnterTileProc(Vehicle *v, TileIndex tile, int x, int y);
typedef Slope GetSlopeTilehProc(TileIndex, Slope tileh);
typedef struct {
DrawTileProc *draw_tile_proc;
GetSlopeZProc *get_slope_z_proc;
ClearTileProc *clear_tile_proc;
GetAcceptedCargoProc *get_accepted_cargo_proc;
GetTileDescProc *get_tile_desc_proc;
GetTileTrackStatusProc *get_tile_track_status_proc;
ClickTileProc *click_tile_proc;
AnimateTileProc *animate_tile_proc;
TileLoopProc *tile_loop_proc;
ChangeTileOwnerProc *change_tile_owner_proc;
GetProducedCargoProc *get_produced_cargo_proc;
VehicleEnterTileProc *vehicle_enter_tile_proc;
GetSlopeTilehProc *get_slope_tileh_proc;
} TileTypeProcs;
enum {
WC_MAIN_WINDOW = 0x00,
WC_MAIN_TOOLBAR = 0x01,
WC_STATUS_BAR = 0x02,
WC_BUILD_TOOLBAR = 0x03,
WC_NEWS_WINDOW = 0x04,
WC_TOWN_DIRECTORY = 0x05,
WC_STATION_LIST = 0x06,
WC_TOWN_VIEW = 0x07,
WC_SMALLMAP = 0x08,
WC_TRAINS_LIST = 0x09,
WC_ROADVEH_LIST = 0x0A,
WC_SHIPS_LIST = 0x0B,
WC_AIRCRAFT_LIST = 0x0C,
WC_VEHICLE_VIEW = 0x0D,
WC_VEHICLE_DETAILS = 0x0E,
WC_VEHICLE_REFIT = 0x0F,
WC_VEHICLE_ORDERS = 0x10,
WC_STATION_VIEW = 0x11,
WC_VEHICLE_DEPOT = 0x12,
WC_BUILD_VEHICLE = 0x13,
WC_BUILD_BRIDGE = 0x14,
WC_ERRMSG = 0x15,
WC_ASK_ABANDON_GAME = 0x16,
WC_QUIT_GAME = 0x17,
WC_BUILD_STATION = 0x18,
WC_BUS_STATION = 0x19,
WC_TRUCK_STATION = 0x1A,
WC_BUILD_DEPOT = 0x1B,
WC_COMPANY = 0x1D,
WC_FINANCES = 0x1E,
WC_PLAYER_COLOR = 0x1F,
WC_QUERY_STRING = 0x20,
WC_SAVELOAD = 0x21,
WC_SELECT_GAME = 0x22,
WC_TOOLBAR_MENU = 0x24,
WC_INCOME_GRAPH = 0x25,
WC_OPERATING_PROFIT = 0x26,
WC_TOOLTIPS = 0x27,
WC_INDUSTRY_VIEW = 0x28,
WC_PLAYER_FACE = 0x29,
WC_LAND_INFO = 0x2A,
WC_TOWN_AUTHORITY = 0x2B,
WC_SUBSIDIES_LIST = 0x2C,
WC_GRAPH_LEGEND = 0x2D,
WC_DELIVERED_CARGO = 0x2E,
WC_PERFORMANCE_HISTORY = 0x2F,
WC_COMPANY_VALUE = 0x30,
WC_COMPANY_LEAGUE = 0x31,
WC_BUY_COMPANY = 0x32,
WC_PAYMENT_RATES = 0x33,
WC_ENGINE_PREVIEW = 0x35,
WC_MUSIC_WINDOW = 0x36,
WC_MUSIC_TRACK_SELECTION = 0x37,
WC_SCEN_LAND_GEN = 0x38, // also used for landscaping toolbar
WC_ASK_RESET_LANDSCAPE = 0x39,
WC_SCEN_TOWN_GEN = 0x3A,
WC_SCEN_INDUSTRY = 0x3B,
WC_SCEN_BUILD_ROAD = 0x3C,
WC_BUILD_TREES = 0x3D,
WC_SEND_NETWORK_MSG = 0x3E,
WC_DROPDOWN_MENU = 0x3F,
WC_BUILD_INDUSTRY = 0x40,
WC_GAME_OPTIONS = 0x41,
WC_NETWORK_WINDOW = 0x42,
WC_INDUSTRY_DIRECTORY = 0x43,
WC_MESSAGE_HISTORY = 0x44,
WC_CHEATS = 0x45,
WC_PERFORMANCE_DETAIL = 0x46,
WC_CONSOLE = 0x47,
WC_EXTRA_VIEW_PORT = 0x48,
WC_CLIENT_LIST = 0x49,
WC_NETWORK_STATUS_WINDOW = 0x4A,
WC_CUSTOM_CURRENCY = 0x4B,
WC_REPLACE_VEHICLE = 0x4C,
WC_HIGHSCORE = 0x4D,
WC_ENDSCREEN = 0x4E,
WC_SIGN_LIST = 0x4F,
WC_GENERATE_LANDSCAPE = 0x50,
WC_GENERATE_PROGRESS_WINDOW = 0x51,
WC_OK_CANCEL_QUERY = 0x52,
};
enum {
EXPENSES_CONSTRUCTION = 0,
EXPENSES_NEW_VEHICLES = 1,
EXPENSES_TRAIN_RUN = 2,
EXPENSES_ROADVEH_RUN = 3,
EXPENSES_AIRCRAFT_RUN = 4,
EXPENSES_SHIP_RUN = 5,
EXPENSES_PROPERTY = 6,
EXPENSES_TRAIN_INC = 7,
EXPENSES_ROADVEH_INC = 8,
EXPENSES_AIRCRAFT_INC = 9,
EXPENSES_SHIP_INC = 10,
EXPENSES_LOAN_INT = 11,
EXPENSES_OTHER = 12,
};
// special string constants
enum SpecialStrings {
// special strings for town names. the town name is generated dynamically on request.
SPECSTR_TOWNNAME_START = 0x20C0,
SPECSTR_TOWNNAME_ENGLISH = SPECSTR_TOWNNAME_START,
SPECSTR_TOWNNAME_FRENCH,
SPECSTR_TOWNNAME_GERMAN,
SPECSTR_TOWNNAME_AMERICAN,
SPECSTR_TOWNNAME_LATIN,
SPECSTR_TOWNNAME_SILLY,
SPECSTR_TOWNNAME_SWEDISH,
SPECSTR_TOWNNAME_DUTCH,
SPECSTR_TOWNNAME_FINNISH,
SPECSTR_TOWNNAME_POLISH,
SPECSTR_TOWNNAME_SLOVAKISH,
SPECSTR_TOWNNAME_NORWEGIAN,
SPECSTR_TOWNNAME_HUNGARIAN,
SPECSTR_TOWNNAME_AUSTRIAN,
SPECSTR_TOWNNAME_ROMANIAN,
SPECSTR_TOWNNAME_CZECH,
SPECSTR_TOWNNAME_SWISS,
SPECSTR_TOWNNAME_DANISH,
SPECSTR_TOWNNAME_TURKISH,
SPECSTR_TOWNNAME_ITALIAN,
SPECSTR_TOWNNAME_CATALAN,
SPECSTR_TOWNNAME_LAST = SPECSTR_TOWNNAME_CATALAN,
// special strings for player names on the form "TownName transport".
SPECSTR_PLAYERNAME_START = 0x70EA,
SPECSTR_PLAYERNAME_ENGLISH = SPECSTR_PLAYERNAME_START,
SPECSTR_PLAYERNAME_FRENCH,
SPECSTR_PLAYERNAME_GERMAN,
SPECSTR_PLAYERNAME_AMERICAN,
SPECSTR_PLAYERNAME_LATIN,
SPECSTR_PLAYERNAME_SILLY,
SPECSTR_PLAYERNAME_LAST = SPECSTR_PLAYERNAME_SILLY,
SPECSTR_ANDCO_NAME = 0x70E6,
SPECSTR_PRESIDENT_NAME = 0x70E7,
SPECSTR_SONGNAME = 0x70E8,
// reserve 32 strings for the *.lng files
SPECSTR_LANGUAGE_START = 0x7100,
SPECSTR_LANGUAGE_END = 0x711f,
// reserve 32 strings for various screen resolutions
SPECSTR_RESOLUTION_START = 0x7120,
SPECSTR_RESOLUTION_END = 0x713f,
// reserve 32 strings for screenshot formats
SPECSTR_SCREENSHOT_START = 0x7140,
SPECSTR_SCREENSHOT_END = 0x715F,
// Used to implement SetDParamStr
STR_SPEC_DYNSTRING = 0xF800,
STR_SPEC_USERSTRING = 0xF808,
};
typedef void PlaceProc(TileIndex tile);
enum {
SORT_ASCENDING = 0,
SORT_DESCENDING = 1,
SORT_BY_DATE = 0,
SORT_BY_NAME = 2
};
VARDEF byte _savegame_sort_order;
#define INVALID_STRING_ID 0xFFFF
enum {
MAX_SCREEN_WIDTH = 2048,
MAX_SCREEN_HEIGHT = 1200,
};
/* In certain windows you navigate with the arrow keys. Do not scroll the
* gameview when here. Bitencoded variable that only allows scrolling if all
* elements are zero */
enum {
SCROLL_CON = 0,
SCROLL_EDIT = 1,
SCROLL_SAVE = 2,
SCROLL_CHAT = 4,
};
VARDEF byte _no_scroll;
/** To have a concurrently running thread interface with the main program, use
* the OTTD_SendThreadMessage() function. Actions to perform upon the message are handled
* in the ProcessSentMessage() function */
typedef enum ThreadMsgs {
MSG_OTTD_NO_MESSAGE,
MSG_OTTD_SAVETHREAD_DONE,
MSG_OTTD_SAVETHREAD_ERROR,
} ThreadMsg;
void OTTD_SendThreadMessage(ThreadMsg msg);
#endif /* OPENTTD_H */