rubidium@9405: /* $Id$ */ rubidium@9405: truebrain@9833: /** @file ai_industry.cpp Implementation of AIIndustry. */ rubidium@9405: rubidium@9430: #include "ai_industry.hpp" truelight@9649: #include "ai_cargo.hpp" truebrain@9814: #include "ai_map.hpp" truebrain@10339: #include "../../openttd.h" rubidium@9430: #include "../../industry.h" truebrain@10339: #include "../../tile_type.h" rubidium@9723: #include "../../strings_func.h" truebrain@10383: #include "../../station_func.h" rubidium@9405: #include "table/strings.h" rubidium@9405: truebrain@9737: /* static */ IndustryID AIIndustry::GetMaxIndustryID() rubidium@9405: { rubidium@9405: return ::GetMaxIndustryIndex(); rubidium@9405: } rubidium@9405: truebrain@9737: /* static */ int32 AIIndustry::GetIndustryCount() rubidium@9405: { rubidium@9405: return ::GetNumIndustries(); rubidium@9405: } rubidium@9405: rubidium@9497: /* static */ bool AIIndustry::IsValidIndustry(IndustryID industry_id) rubidium@9405: { rubidium@9405: return ::IsValidIndustryID(industry_id); rubidium@9405: } rubidium@9405: truebrain@9737: /* static */ char *AIIndustry::GetName(IndustryID industry_id) rubidium@9405: { truebrain@9736: if (!IsValidIndustry(industry_id)) return NULL; rubidium@9405: static const int len = 64; rubidium@9405: char *industry_name = MallocT(len); rubidium@9405: truebrain@9736: ::SetDParam(0, industry_id); truebrain@9736: ::GetString(industry_name, STR_INDUSTRY, &industry_name[len - 1]); rubidium@9405: rubidium@9405: return industry_name; rubidium@9405: } rubidium@9405: truelight@9650: /* static */ int32 AIIndustry::GetProduction(IndustryID industry_id, CargoID cargo_id) rubidium@9405: { truebrain@9736: if (!IsValidIndustry(industry_id)) return -1; truelight@9649: if (!AICargo::IsValidCargo(cargo_id)) return -1; truelight@9649: rubidium@9405: const Industry *i = ::GetIndustry(industry_id); truebrain@9736: const IndustrySpec *indsp = ::GetIndustrySpec(i->type); truelight@9649: truebrain@9795: for (byte j = 0; j < lengthof(indsp->produced_cargo); j++) truebrain@9798: if (indsp->produced_cargo[j] == cargo_id) return i->production_rate[j] * 8; truebrain@9795: truelight@9649: return -1; rubidium@9405: } truelight@9649: truelight@9710: /* static */ bool AIIndustry::IsCargoAccepted(IndustryID industry_id, CargoID cargo_id) truelight@9710: { truebrain@9736: if (!IsValidIndustry(industry_id)) return false; truelight@9710: if (!AICargo::IsValidCargo(cargo_id)) return false; truelight@9710: truelight@9710: const Industry *i = ::GetIndustry(industry_id); truebrain@9736: const IndustrySpec *indsp = ::GetIndustrySpec(i->type); truelight@9710: truebrain@9795: for (byte j = 0; j < lengthof(indsp->accepts_cargo); j++) truebrain@9795: if (indsp->accepts_cargo[j] == cargo_id) return true; truelight@9710: truelight@9710: return false; truelight@9710: } truelight@9710: truebrain@10842: /* static */ int32 AIIndustry::GetLastMonthProduction(IndustryID industry_id, CargoID cargo_id) truebrain@9810: { truebrain@10842: if (!IsValidIndustry(industry_id)) return -1; truebrain@10842: if (!AICargo::IsValidCargo(cargo_id)) return -1; truebrain@9810: truebrain@9810: const Industry *i = ::GetIndustry(industry_id); truebrain@9810: const IndustrySpec *indsp = ::GetIndustrySpec(i->type); truebrain@9810: truebrain@9810: for (byte j = 0; j < lengthof(indsp->produced_cargo); j++) truebrain@9810: if (indsp->produced_cargo[j] == cargo_id) return i->last_month_production[j]; truebrain@9810: truebrain@10842: return -1; truebrain@9810: } truebrain@9810: truebrain@10842: /* static */ int32 AIIndustry::GetLastMonthTransported(IndustryID industry_id, CargoID cargo_id) truebrain@9810: { truebrain@10842: if (!IsValidIndustry(industry_id)) return -1; truebrain@10842: if (!AICargo::IsValidCargo(cargo_id)) return -1; truebrain@9810: truebrain@9810: const Industry *i = ::GetIndustry(industry_id); truebrain@9810: const IndustrySpec *indsp = ::GetIndustrySpec(i->type); truebrain@9810: truebrain@9810: for (byte j = 0; j < lengthof(indsp->produced_cargo); j++) truebrain@9810: if (indsp->produced_cargo[j] == cargo_id) return i->last_month_transported[j]; truebrain@9810: truebrain@10842: return -1; truebrain@9810: } truebrain@9814: truebrain@10383: /* static */ TileIndex AIIndustry::GetLocation(IndustryID industry_id) truebrain@10383: { truebrain@10383: if (!IsValidIndustry(industry_id)) return INVALID_TILE; truebrain@10383: truebrain@10383: return ::GetIndustry(industry_id)->xy; truebrain@10383: } truebrain@10383: truebrain@10383: /* static */ int32 AIIndustry::GetAmountOfStationsAround(IndustryID industry_id) truebrain@10383: { truebrain@10383: if (!IsValidIndustry(industry_id)) return -1; truebrain@10383: truebrain@10383: Industry *ind = ::GetIndustry(industry_id); truebrain@10383: return ::FindStationsAroundIndustryTile(ind->xy, ind->width, ind->height).size(); truebrain@10383: } truebrain@10383: truebrain@9814: /* static */ int32 AIIndustry::GetDistanceManhattanToTile(IndustryID industry_id, TileIndex tile) truebrain@9814: { truebrain@10383: if (!IsValidIndustry(industry_id)) return -1; truebrain@10383: truebrain@9814: return AIMap::DistanceManhattan(tile, GetLocation(industry_id)); truebrain@9814: } truebrain@9814: truebrain@9814: /* static */ int32 AIIndustry::GetDistanceSquareToTile(IndustryID industry_id, TileIndex tile) truebrain@9814: { truebrain@10383: if (!IsValidIndustry(industry_id)) return -1; truebrain@10383: truebrain@9814: return AIMap::DistanceSquare(tile, GetLocation(industry_id)); truebrain@9814: } rubidium@10300: rubidium@10300: /* static */ bool AIIndustry::IsBuiltOnWater(IndustryID industry_id) rubidium@10300: { rubidium@10300: if (!IsValidIndustry(industry_id)) return false; rubidium@10300: rubidium@10300: return (::GetIndustrySpec(::GetIndustry(industry_id)->type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0; rubidium@10300: } rubidium@10300: rubidium@10300: /* static */ bool AIIndustry::HasHeliportAndDock(IndustryID industry_id) rubidium@10300: { rubidium@10300: if (!IsValidIndustry(industry_id)) return false; rubidium@10300: rubidium@10300: return (::GetIndustrySpec(::GetIndustry(industry_id)->type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0; rubidium@10300: } rubidium@10300: rubidium@10300: /* static */ TileIndex AIIndustry::GetHeliportAndDockLocation(IndustryID industry_id) rubidium@10300: { rubidium@10300: if (!IsValidIndustry(industry_id)) return INVALID_TILE; rubidium@10300: if (!HasHeliportAndDock(industry_id)) return INVALID_TILE; rubidium@10300: rubidium@10300: return ::GetIndustry(industry_id)->xy; rubidium@10300: }