Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "../../stdafx.h"
00013 #include "ai_industrytype.hpp"
00014 #include "ai_map.hpp"
00015 #include "ai_error.hpp"
00016 #include "../../strings_func.h"
00017 #include "../../industry.h"
00018 #include "../../newgrf_industries.h"
00019 #include "../../core/random_func.hpp"
00020
00021 bool AIIndustryType::IsValidIndustryType(IndustryType industry_type)
00022 {
00023 if (industry_type >= NUM_INDUSTRYTYPES) return false;
00024
00025 return ::GetIndustrySpec(industry_type)->enabled;
00026 }
00027
00028 bool AIIndustryType::IsRawIndustry(IndustryType industry_type)
00029 {
00030 if (!IsValidIndustryType(industry_type)) return false;
00031
00032 return ::GetIndustrySpec(industry_type)->IsRawIndustry();
00033 }
00034
00035 bool AIIndustryType::ProductionCanIncrease(IndustryType industry_type)
00036 {
00037 if (!IsValidIndustryType(industry_type)) return false;
00038
00039 if (_settings_game.game_creation.landscape != LT_TEMPERATE) return true;
00040 return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_DONT_INCR_PROD) == 0;
00041 }
00042
00043 Money AIIndustryType::GetConstructionCost(IndustryType industry_type)
00044 {
00045 if (!IsValidIndustryType(industry_type)) return -1;
00046 if (::GetIndustrySpec(industry_type)->IsRawIndustry() && _settings_game.construction.raw_industry_construction == 0) return -1;
00047
00048 return ::GetIndustrySpec(industry_type)->GetConstructionCost();
00049 }
00050
00051 char *AIIndustryType::GetName(IndustryType industry_type)
00052 {
00053 if (!IsValidIndustryType(industry_type)) return NULL;
00054 static const int len = 64;
00055 char *industrytype_name = MallocT<char>(len);
00056
00057 ::GetString(industrytype_name, ::GetIndustrySpec(industry_type)->name, &industrytype_name[len - 1]);
00058
00059 return industrytype_name;
00060 }
00061
00062 AIList *AIIndustryType::GetProducedCargo(IndustryType industry_type)
00063 {
00064 if (!IsValidIndustryType(industry_type)) return NULL;
00065
00066 const IndustrySpec *ins = ::GetIndustrySpec(industry_type);
00067
00068 AIList *list = new AIList();
00069 for (size_t i = 0; i < lengthof(ins->produced_cargo); i++) {
00070 if (ins->produced_cargo[i] != CT_INVALID) list->AddItem(ins->produced_cargo[i]);
00071 }
00072
00073 return list;
00074 }
00075
00076 AIList *AIIndustryType::GetAcceptedCargo(IndustryType industry_type)
00077 {
00078 if (!IsValidIndustryType(industry_type)) return NULL;
00079
00080 const IndustrySpec *ins = ::GetIndustrySpec(industry_type);
00081
00082 AIList *list = new AIList();
00083 for (size_t i = 0; i < lengthof(ins->accepts_cargo); i++) {
00084 if (ins->accepts_cargo[i] != CT_INVALID) list->AddItem(ins->accepts_cargo[i]);
00085 }
00086
00087 return list;
00088 }
00089
00090 bool AIIndustryType::CanBuildIndustry(IndustryType industry_type)
00091 {
00092 if (!IsValidIndustryType(industry_type)) return false;
00093
00094 if (!::CheckIfCallBackAllowsAvailability(industry_type, IACT_USERCREATION)) return false;
00095 if (!::GetIndustrySpec(industry_type)->IsRawIndustry()) return true;
00096
00097
00098 return _settings_game.construction.raw_industry_construction == 1;
00099 }
00100
00101 bool AIIndustryType::CanProspectIndustry(IndustryType industry_type)
00102 {
00103 if (!IsValidIndustryType(industry_type)) return false;
00104
00105 if (!::GetIndustrySpec(industry_type)->IsRawIndustry()) return false;
00106 if (!::CheckIfCallBackAllowsAvailability(industry_type, IACT_USERCREATION)) return false;
00107
00108
00109 return _settings_game.construction.raw_industry_construction == 2;
00110 }
00111
00112 bool AIIndustryType::BuildIndustry(IndustryType industry_type, TileIndex tile)
00113 {
00114 EnforcePrecondition(false, CanBuildIndustry(industry_type));
00115 EnforcePrecondition(false, AIMap::IsValidTile(tile));
00116
00117 uint32 seed = ::InteractiveRandom();
00118 return AIObject::DoCommand(tile, (::InteractiveRandomRange(::GetIndustrySpec(industry_type)->num_table) << 8) | industry_type, seed, CMD_BUILD_INDUSTRY);
00119 }
00120
00121 bool AIIndustryType::ProspectIndustry(IndustryType industry_type)
00122 {
00123 EnforcePrecondition(false, CanProspectIndustry(industry_type));
00124
00125 uint32 seed = ::InteractiveRandom();
00126 return AIObject::DoCommand(0, industry_type, seed, CMD_BUILD_INDUSTRY);
00127 }
00128
00129 bool AIIndustryType::IsBuiltOnWater(IndustryType industry_type)
00130 {
00131 if (!IsValidIndustryType(industry_type)) return false;
00132
00133 return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0;
00134 }
00135
00136 bool AIIndustryType::HasHeliport(IndustryType industry_type)
00137 {
00138 if (!IsValidIndustryType(industry_type)) return false;
00139
00140 return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0;
00141 }
00142
00143 bool AIIndustryType::HasDock(IndustryType industry_type)
00144 {
00145 if (!IsValidIndustryType(industry_type)) return false;
00146
00147 return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0;
00148 }