Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "../../stdafx.h"
00013 #include "script_station.hpp"
00014 #include "script_cargo.hpp"
00015 #include "script_map.hpp"
00016 #include "script_town.hpp"
00017 #include "../../debug.h"
00018 #include "../../station_base.h"
00019 #include "../../roadstop_base.h"
00020 #include "../../company_func.h"
00021 #include "../../town.h"
00022
00023 bool ScriptStation::IsValidStation(StationID station_id)
00024 {
00025 const Station *st = ::Station::GetIfValid(station_id);
00026 return st != NULL && (st->owner == _current_company || st->owner == OWNER_NONE);
00027 }
00028
00029 StationID ScriptStation::GetStationID(TileIndex tile)
00030 {
00031 if (!::IsValidTile(tile) || !::IsTileType(tile, MP_STATION)) return INVALID_STATION;
00032 return ::GetStationIndex(tile);
00033 }
00034
00035 int32 ScriptStation::GetCargoWaiting(StationID station_id, CargoID cargo_id)
00036 {
00037 if (!IsValidStation(station_id)) return -1;
00038 if (!ScriptCargo::IsValidCargo(cargo_id)) return -1;
00039
00040 return ::Station::Get(station_id)->goods[cargo_id].cargo.Count();
00041 }
00042
00043 int32 ScriptStation::GetCargoRating(StationID station_id, CargoID cargo_id)
00044 {
00045 if (!IsValidStation(station_id)) return -1;
00046 if (!ScriptCargo::IsValidCargo(cargo_id)) return -1;
00047
00048 return ::ToPercent8(::Station::Get(station_id)->goods[cargo_id].rating);
00049 }
00050
00051 int32 ScriptStation::GetCoverageRadius(ScriptStation::StationType station_type)
00052 {
00053 if (station_type == STATION_AIRPORT) {
00054 DEBUG(script, 0, "GetCoverageRadius(): coverage radius of airports needs to be requested via ScriptAirport::GetAirportCoverageRadius(), as it requires AirportType");
00055 return -1;
00056 }
00057 if (!HasExactlyOneBit(station_type)) return -1;
00058 if (!_settings_game.station.modified_catchment) return CA_UNMODIFIED;
00059
00060 switch (station_type) {
00061 case STATION_TRAIN: return CA_TRAIN;
00062 case STATION_TRUCK_STOP: return CA_TRUCK;
00063 case STATION_BUS_STOP: return CA_BUS;
00064 case STATION_DOCK: return CA_DOCK;
00065 default: return CA_NONE;
00066 }
00067 }
00068
00069 int32 ScriptStation::GetDistanceManhattanToTile(StationID station_id, TileIndex tile)
00070 {
00071 if (!IsValidStation(station_id)) return -1;
00072
00073 return ScriptMap::DistanceManhattan(tile, GetLocation(station_id));
00074 }
00075
00076 int32 ScriptStation::GetDistanceSquareToTile(StationID station_id, TileIndex tile)
00077 {
00078 if (!IsValidStation(station_id)) return -1;
00079
00080 return ScriptMap::DistanceSquare(tile, GetLocation(station_id));
00081 }
00082
00083 bool ScriptStation::IsWithinTownInfluence(StationID station_id, TownID town_id)
00084 {
00085 if (!IsValidStation(station_id)) return false;
00086
00087 return ScriptTown::IsWithinTownInfluence(town_id, GetLocation(station_id));
00088 }
00089
00090 bool ScriptStation::HasStationType(StationID station_id, StationType station_type)
00091 {
00092 if (!IsValidStation(station_id)) return false;
00093 if (!HasExactlyOneBit(station_type)) return false;
00094
00095 return (::Station::Get(station_id)->facilities & station_type) != 0;
00096 }
00097
00098 bool ScriptStation::HasRoadType(StationID station_id, ScriptRoad::RoadType road_type)
00099 {
00100 if (!IsValidStation(station_id)) return false;
00101 if (!ScriptRoad::IsRoadTypeAvailable(road_type)) return false;
00102
00103 ::RoadTypes r = RoadTypeToRoadTypes((::RoadType)road_type);
00104
00105 for (const RoadStop *rs = ::Station::Get(station_id)->GetPrimaryRoadStop(ROADSTOP_BUS); rs != NULL; rs = rs->next) {
00106 if ((::GetRoadTypes(rs->xy) & r) != 0) return true;
00107 }
00108 for (const RoadStop *rs = ::Station::Get(station_id)->GetPrimaryRoadStop(ROADSTOP_TRUCK); rs != NULL; rs = rs->next) {
00109 if ((::GetRoadTypes(rs->xy) & r) != 0) return true;
00110 }
00111
00112 return false;
00113 }
00114
00115 TownID ScriptStation::GetNearestTown(StationID station_id)
00116 {
00117 if (!IsValidStation(station_id)) return INVALID_TOWN;
00118
00119 return ::Station::Get(station_id)->town->index;
00120 }