src/ai/api/ai_station.cpp
author rubidium
Wed, 09 Jan 2008 18:11:12 +0000
branchnoai
changeset 9723 eee46cb39750
parent 9696 4384ed3de1f0
child 9724 b39bc69bb2f2
permissions -rw-r--r--
(svn r11796) [NoAI] -Sync: with trunk r11502:11795.
/* $Id$ */

/** @file ai_station.cpp handles the functions of the AIStation class */

#include "ai_station.hpp"
#include "ai_cargo.hpp"
#include "../../debug.h"
#include "../../station.h"
#include "../../station_map.h"
#include "../../variables.h"
#include "../../strings_func.h"
#include "../../core/alloc_func.hpp"
#include "table/strings.h"

/* static */ bool AIStation::IsValidStation(StationID station_id)
{
	return ::IsValidStationID(station_id) && ::GetStation(station_id)->owner == _current_player;
}

/* static */ StationID AIStation::GetStationID(TileIndex tile)
{
	if (!::IsTileType(tile, MP_STATION)) return INVALID_STATION;
	return ::GetStationIndex(tile);
}

/* static */ char *AIStation::GetName(StationID station_id)
{
	if (!AIStation::IsValidStation(station_id)) return NULL;

	static const int len = 64;
	char *station_name = MallocT<char>(len);

	SetDParam(0, GetStation(station_id)->index);
	GetString(station_name, STR_STATION, &station_name[len - 1]);
	return station_name;
}

/* static */ TileIndex AIStation::GetLocation(StationID station_id)
{
	if (!AIStation::IsValidStation(station_id)) return INVALID_TILE;

	return ::GetStation(station_id)->xy;
}

/* static */ int32 AIStation::GetCargoWaiting(StationID station_id, CargoID cargo_id)
{
	if (!AIStation::IsValidStation(station_id)) return -1;
	if (!AICargo::IsValidCargo(cargo_id)) return -1;

	return ::GetStation(station_id)->goods[cargo_id].cargo.Count();
}

/* static */ int32 AIStation::GetCargoRating(StationID station_id, CargoID cargo_id)
{
	if (!AIStation::IsValidStation(station_id)) return -1;
	if (!AICargo::IsValidCargo(cargo_id)) return -1;

	return ::GetStation(station_id)->goods[cargo_id].rating * 101 >> 8;
}

/* static */ int32 AIStation::GetCoverageRadius(AIStation::StationType type)
{
	if (type == STATION_AIRPORT) {
		DEBUG(ai, 0, "GetCoverageRadius(): coverage radius of airports needs to be requested via AIAirport::GetAirportCoverageRadius(), as it requires AirportType");
		return 0;
	}
	if (!_patches.modified_catchment) return 3;

	switch (type) {
		case STATION_TRAIN:      return CA_TRAIN;
		case STATION_TRUCK_STOP: return CA_TRUCK;
		case STATION_BUS_STOP:   return CA_BUS;
		case STATION_DOCK:       return CA_DOCK;
		default:                 return CA_NONE;
	}
}