Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "../../stdafx.h"
00013 #include "ai_town.hpp"
00014 #include "ai_map.hpp"
00015 #include "ai_cargo.hpp"
00016 #include "ai_error.hpp"
00017 #include "../../town.h"
00018 #include "../../strings_func.h"
00019 #include "../../company_func.h"
00020 #include "../../station_base.h"
00021 #include "table/strings.h"
00022
00023 int32 AITown::GetTownCount()
00024 {
00025 return (int32)::Town::GetNumItems();
00026 }
00027
00028 bool AITown::IsValidTown(TownID town_id)
00029 {
00030 return ::Town::IsValidID(town_id);
00031 }
00032
00033 char *AITown::GetName(TownID town_id)
00034 {
00035 if (!IsValidTown(town_id)) return NULL;
00036 static const int len = 64;
00037 char *town_name = MallocT<char>(len);
00038
00039 ::SetDParam(0, town_id);
00040 ::GetString(town_name, STR_TOWN_NAME, &town_name[len - 1]);
00041
00042 return town_name;
00043 }
00044
00045 int32 AITown::GetPopulation(TownID town_id)
00046 {
00047 if (!IsValidTown(town_id)) return -1;
00048 const Town *t = ::Town::Get(town_id);
00049 return t->population;
00050 }
00051
00052 int32 AITown::GetHouseCount(TownID town_id)
00053 {
00054 if (!IsValidTown(town_id)) return -1;
00055 const Town *t = ::Town::Get(town_id);
00056 return t->num_houses;
00057 }
00058
00059 TileIndex AITown::GetLocation(TownID town_id)
00060 {
00061 if (!IsValidTown(town_id)) return INVALID_TILE;
00062 const Town *t = ::Town::Get(town_id);
00063 return t->xy;
00064 }
00065
00066 int32 AITown::GetLastMonthProduction(TownID town_id, CargoID cargo_id)
00067 {
00068 if (!IsValidTown(town_id)) return -1;
00069 if (!AICargo::IsValidCargo(cargo_id)) return -1;
00070
00071 const Town *t = ::Town::Get(town_id);
00072
00073 switch (AICargo::GetTownEffect(cargo_id)) {
00074 case AICargo::TE_PASSENGERS: return t->max_pass;
00075 case AICargo::TE_MAIL: return t->max_mail;
00076 default: return -1;
00077 }
00078 }
00079
00080 int32 AITown::GetLastMonthTransported(TownID town_id, CargoID cargo_id)
00081 {
00082 if (!IsValidTown(town_id)) return -1;
00083 if (!AICargo::IsValidCargo(cargo_id)) return -1;
00084
00085 const Town *t = ::Town::Get(town_id);
00086
00087 switch (AICargo::GetTownEffect(cargo_id)) {
00088 case AICargo::TE_PASSENGERS: return t->act_pass;
00089 case AICargo::TE_MAIL: return t->act_mail;
00090 default: return -1;
00091 }
00092 }
00093
00094 int32 AITown::GetLastMonthTransportedPercentage(TownID town_id, CargoID cargo_id)
00095 {
00096 if (!IsValidTown(town_id)) return -1;
00097 if (!AICargo::IsValidCargo(cargo_id)) return -1;
00098
00099 const Town *t = ::Town::Get(town_id);
00100
00101 switch (AICargo::GetTownEffect(cargo_id)) {
00102 case AICargo::TE_PASSENGERS: return ::ToPercent8(t->pct_pass_transported);
00103 case AICargo::TE_MAIL: return ::ToPercent8(t->pct_mail_transported);
00104 default: return -1;
00105 }
00106 }
00107
00108 int32 AITown::GetDistanceManhattanToTile(TownID town_id, TileIndex tile)
00109 {
00110 return AIMap::DistanceManhattan(tile, GetLocation(town_id));
00111 }
00112
00113 int32 AITown::GetDistanceSquareToTile(TownID town_id, TileIndex tile)
00114 {
00115 return AIMap::DistanceSquare(tile, GetLocation(town_id));
00116 }
00117
00118 bool AITown::IsWithinTownInfluence(TownID town_id, TileIndex tile)
00119 {
00120 if (!IsValidTown(town_id)) return false;
00121
00122 const Town *t = ::Town::Get(town_id);
00123 return ((uint32)GetDistanceSquareToTile(town_id, tile) <= t->squared_town_zone_radius[0]);
00124 }
00125
00126 bool AITown::HasStatue(TownID town_id)
00127 {
00128 if (!IsValidTown(town_id)) return false;
00129
00130 return ::HasBit(::Town::Get(town_id)->statues, _current_company);
00131 }
00132
00133 bool AITown::IsCity(TownID town_id)
00134 {
00135 if (!IsValidTown(town_id)) return false;
00136
00137 return ::Town::Get(town_id)->larger_town;
00138 }
00139
00140 int AITown::GetRoadReworkDuration(TownID town_id)
00141 {
00142 if (!IsValidTown(town_id)) return -1;
00143
00144 return ::Town::Get(town_id)->road_build_months;
00145 }
00146
00147 AICompany::CompanyID AITown::GetExclusiveRightsCompany(TownID town_id)
00148 {
00149 if (!IsValidTown(town_id)) return AICompany::COMPANY_INVALID;
00150
00151 return (AICompany::CompanyID)(int8)::Town::Get(town_id)->exclusivity;
00152 }
00153
00154 int32 AITown::GetExclusiveRightsDuration(TownID town_id)
00155 {
00156 if (!IsValidTown(town_id)) return -1;
00157
00158 return ::Town::Get(town_id)->exclusive_counter;
00159 }
00160
00161 bool AITown::IsActionAvailable(TownID town_id, TownAction town_action)
00162 {
00163 if (!IsValidTown(town_id)) return false;
00164
00165 return HasBit(::GetMaskOfTownActions(NULL, _current_company, ::Town::Get(town_id)), town_action);
00166 }
00167
00168 bool AITown::PerformTownAction(TownID town_id, TownAction town_action)
00169 {
00170 EnforcePrecondition(false, IsValidTown(town_id));
00171 EnforcePrecondition(false, IsActionAvailable(town_id, town_action));
00172
00173 return AIObject::DoCommand(::Town::Get(town_id)->xy, town_id, town_action, CMD_DO_TOWN_ACTION);
00174 }
00175
00176 AITown::TownRating AITown::GetRating(TownID town_id, AICompany::CompanyID company_id)
00177 {
00178 if (!IsValidTown(town_id)) return TOWN_RATING_INVALID;
00179 AICompany::CompanyID company = AICompany::ResolveCompanyID(company_id);
00180 if (company == AICompany::COMPANY_INVALID) return TOWN_RATING_INVALID;
00181
00182 const Town *t = ::Town::Get(town_id);
00183 if (!HasBit(t->have_ratings, company)) {
00184 return TOWN_RATING_NONE;
00185 } else if (t->ratings[company] <= RATING_APPALLING) {
00186 return TOWN_RATING_APPALLING;
00187 } else if (t->ratings[company] <= RATING_VERYPOOR) {
00188 return TOWN_RATING_VERY_POOR;
00189 } else if (t->ratings[company] <= RATING_POOR) {
00190 return TOWN_RATING_POOR;
00191 } else if (t->ratings[company] <= RATING_MEDIOCRE) {
00192 return TOWN_RATING_MEDIOCRE;
00193 } else if (t->ratings[company] <= RATING_GOOD) {
00194 return TOWN_RATING_GOOD;
00195 } else if (t->ratings[company] <= RATING_VERYGOOD) {
00196 return TOWN_RATING_VERY_GOOD;
00197 } else if (t->ratings[company] <= RATING_EXCELLENT) {
00198 return TOWN_RATING_EXCELLENT;
00199 } else {
00200 return TOWN_RATING_OUTSTANDING;
00201 }
00202 }
00203
00204 int AITown::GetAllowedNoise(TownID town_id)
00205 {
00206 if (!IsValidTown(town_id)) return -1;
00207
00208 const Town *t = ::Town::Get(town_id);
00209 if (_settings_game.economy.station_noise_level) {
00210 return t->MaxTownNoise() - t->noise_reached;
00211 }
00212
00213 int num = 0;
00214 const Station *st;
00215 FOR_ALL_STATIONS(st) {
00216 if (st->town == t && (st->facilities & FACIL_AIRPORT) && st->airport.type != AT_OILRIG) num++;
00217 }
00218 return max(0, 2 - num);
00219 }
00220
00221 AITown::RoadLayout AITown::GetRoadLayout(TownID town_id)
00222 {
00223 if (!IsValidTown(town_id)) return ROAD_LAYOUT_INVALID;
00224
00225 return (AITown::RoadLayout)((TownLayout)::Town::Get(town_id)->layout);
00226 }