-Add: generalised A* Algorithm -Add: generalised queues (Fifo, Stack, InsSort, BinaryHeap)
		
			
				
	
	
		
			195 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef PLAYER_H
 | 
						|
#define PLAYER_H
 | 
						|
 | 
						|
#include "aystar.h"
 | 
						|
 | 
						|
typedef struct PlayerEconomyEntry {
 | 
						|
	int32 income;
 | 
						|
	int32 expenses;
 | 
						|
	int32 delivered_cargo;
 | 
						|
	int32 performance_history;
 | 
						|
	int32 company_value;
 | 
						|
} PlayerEconomyEntry;
 | 
						|
 | 
						|
typedef struct AiBuildRec {
 | 
						|
	TileIndex spec_tile;
 | 
						|
	TileIndex use_tile;
 | 
						|
	byte rand_rng;
 | 
						|
	byte cur_building_rule;
 | 
						|
	byte unk6;
 | 
						|
	byte unk7;
 | 
						|
	byte buildcmd_a;
 | 
						|
	byte buildcmd_b;
 | 
						|
	byte direction;
 | 
						|
	byte cargo;
 | 
						|
} AiBuildRec;
 | 
						|
 | 
						|
typedef struct PlayerAI {
 | 
						|
	byte state;
 | 
						|
	byte tick; // Used to determine how often to move
 | 
						|
	uint16 state_counter;
 | 
						|
	uint16 timeout_counter;
 | 
						|
 | 
						|
	byte state_mode;
 | 
						|
	byte banned_tile_count;
 | 
						|
	byte railtype_to_use;
 | 
						|
 | 
						|
	byte cargo_type;
 | 
						|
	byte num_wagons;
 | 
						|
	byte build_kind;
 | 
						|
	byte num_build_rec;
 | 
						|
	byte num_loco_to_build;
 | 
						|
	byte num_want_fullload;
 | 
						|
 | 
						|
	byte route_type_mask;
 | 
						|
 | 
						|
	TileIndex start_tile_a;
 | 
						|
	TileIndex cur_tile_a;
 | 
						|
	byte cur_dir_a;
 | 
						|
	byte start_dir_a;
 | 
						|
	
 | 
						|
	TileIndex start_tile_b;
 | 
						|
	TileIndex cur_tile_b;
 | 
						|
	byte cur_dir_b;
 | 
						|
	byte start_dir_b;
 | 
						|
 | 
						|
	Vehicle *cur_veh; /* only used by some states */
 | 
						|
		
 | 
						|
	AiBuildRec src, dst, mid1, mid2;
 | 
						|
	
 | 
						|
	VehicleID wagon_list[9];
 | 
						|
	byte order_list_blocks[20];
 | 
						|
	
 | 
						|
	TileIndex banned_tiles[16];
 | 
						|
	byte banned_val[16];
 | 
						|
} PlayerAI;
 | 
						|
 | 
						|
typedef struct Ai_PathFinderInfo {
 | 
						|
	TileIndex start_tile_tl; // tl = top-left
 | 
						|
	TileIndex start_tile_br; // br = bottom-right
 | 
						|
	TileIndex end_tile_tl; // tl = top-left
 | 
						|
	TileIndex end_tile_br; // br = bottom-right
 | 
						|
	byte start_direction; // 0 to 3 or AI_PATHFINDER_NO_DIRECTION
 | 
						|
	byte end_direction; // 0 to 3 or AI_PATHFINDER_NO_DIRECTION
 | 
						|
 | 
						|
	TileIndex route[500];
 | 
						|
	byte route_extra[500]; // Some extra information about the route like bridge/tunnel
 | 
						|
	int route_length;
 | 
						|
	int position; // Current position in the build-path, needed to build the path
 | 
						|
	
 | 
						|
	bool rail_or_road; // true = rail, false = road
 | 
						|
} Ai_PathFinderInfo;
 | 
						|
 | 
						|
typedef struct PlayerAiNew {
 | 
						|
	uint8 state;
 | 
						|
	uint tick;
 | 
						|
	uint idle;
 | 
						|
	
 | 
						|
	int temp; 	// A value used in more then one function, but it just temporary
 | 
						|
				// The use is pretty simple: with this we can 'think' about stuff
 | 
						|
				//   in more then one tick, and more then one AI. A static will not
 | 
						|
				//   do, because they are not saved. This way, the AI is almost human ;)
 | 
						|
	int counter; 	// For the same reason as temp, we have counter. It can count how
 | 
						|
					//  long we are trying something, and just abort if it takes too long
 | 
						|
	
 | 
						|
	// Pathfinder stuff
 | 
						|
	Ai_PathFinderInfo path_info;
 | 
						|
	AyStar *pathfinder;
 | 
						|
	
 | 
						|
	// Route stuff
 | 
						|
	
 | 
						|
	byte cargo;
 | 
						|
	byte tbt; // train/bus/truck 0/1/2 AI_TRAIN/AI_BUS/AI_TRUCK
 | 
						|
	int new_cost;
 | 
						|
	
 | 
						|
	byte action;
 | 
						|
	
 | 
						|
	uint last_id; // here is stored the last id of the searched city/industry
 | 
						|
	
 | 
						|
	TileIndex from_tile;
 | 
						|
	TileIndex to_tile;
 | 
						|
	
 | 
						|
	byte from_direction;
 | 
						|
	byte to_direction;
 | 
						|
	
 | 
						|
	bool from_deliver; // True if this is the station that GIVES cargo
 | 
						|
	bool to_deliver;
 | 
						|
	
 | 
						|
	TileIndex depot_tile;
 | 
						|
	byte depot_direction;
 | 
						|
	
 | 
						|
	byte amount_veh; // How many vehicles we are going to build in this route
 | 
						|
	byte cur_veh; // How many vehicles did we bought?
 | 
						|
	VehicleID veh_id; // Used when bought a vehicle
 | 
						|
	VehicleID veh_main_id; // The ID of the first vehicle, for shared copy
 | 
						|
	
 | 
						|
	int from_ic; // ic = industry/city. This is the ID of them
 | 
						|
	byte from_type; // AI_NO_TYPE/AI_CITY/AI_INDUSTRY
 | 
						|
	int to_ic;
 | 
						|
	byte to_type;
 | 
						|
	
 | 
						|
} PlayerAiNew;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
typedef struct Player {
 | 
						|
	uint32 name_2;
 | 
						|
	uint16 name_1;
 | 
						|
 | 
						|
	uint16 president_name_1;
 | 
						|
	uint32 president_name_2;
 | 
						|
 | 
						|
	uint32 face;
 | 
						|
 | 
						|
	int32 player_money;
 | 
						|
	int32 current_loan;
 | 
						|
	int64 money64; // internal 64-bit version of the money. the 32-bit field will be clamped to plus minus 2 billion
 | 
						|
 | 
						|
	byte player_color;
 | 
						|
	byte player_money_fraction;
 | 
						|
	byte max_railtype;
 | 
						|
	byte block_preview;
 | 
						|
	byte index;
 | 
						|
 | 
						|
	uint16 cargo_types; /* which cargo types were transported the last year */
 | 
						|
 | 
						|
	TileIndex location_of_house;
 | 
						|
	TileIndex last_build_coordinate;
 | 
						|
	
 | 
						|
	byte share_owners[4];
 | 
						|
	
 | 
						|
	byte inaugurated_year;
 | 
						|
	byte num_valid_stat_ent;
 | 
						|
	
 | 
						|
	byte quarters_of_bankrupcy;
 | 
						|
	byte bankrupt_asked; // which players were asked about buying it?
 | 
						|
	int16 bankrupt_timeout;
 | 
						|
	int32 bankrupt_value;
 | 
						|
 | 
						|
	bool is_active;
 | 
						|
	byte is_ai;
 | 
						|
	PlayerAI ai;
 | 
						|
	PlayerAiNew ainew;
 | 
						|
	
 | 
						|
	int64 yearly_expenses[3][13];
 | 
						|
	PlayerEconomyEntry cur_economy;
 | 
						|
	PlayerEconomyEntry old_economy[24];
 | 
						|
} Player;
 | 
						|
 | 
						|
void ChangeOwnershipOfPlayerItems(byte old_player, byte new_player);
 | 
						|
void GetNameOfOwner(byte owner, uint tile);
 | 
						|
uint32 CalculateCompanyValue(Player *p);
 | 
						|
void InvalidatePlayerWindows(Player *p);
 | 
						|
void AiDoGameLoop(Player *p);
 | 
						|
void UpdatePlayerMoney32(Player *p);
 | 
						|
#define DEREF_PLAYER(i) (&_players[i])
 | 
						|
#define FOR_ALL_PLAYERS(p) for(p=_players; p != endof(_players); p++)
 | 
						|
 | 
						|
#define MAX_PLAYERS 8
 | 
						|
VARDEF Player _players[MAX_PLAYERS];
 | 
						|
 | 
						|
#define IS_HUMAN_PLAYER(p) (!DEREF_PLAYER((byte)(p))->is_ai)
 | 
						|
#define IS_INTERACTIVE_PLAYER(p) (((byte)p) == _local_player)
 | 
						|
 | 
						|
#endif /* PLAYER_H */
 |