ai_town.cpp

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

Generated on Fri Jul 31 22:33:13 2009 for OpenTTD by  doxygen 1.5.6