00001 /* $Id: ai_event_types.cpp 21987 2011-02-05 20:41:13Z frosch $ */ 00002 00003 /* 00004 * This file is part of OpenTTD. 00005 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. 00006 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00007 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. 00008 */ 00009 00012 #include "../../stdafx.h" 00013 #include "ai_event_types.hpp" 00014 #include "ai_vehicle.hpp" 00015 #include "../../command_type.h" 00016 #include "../../strings_func.h" 00017 #include "../../settings_type.h" 00018 #include "../../engine_base.h" 00019 #include "../../articulated_vehicles.h" 00020 #include "table/strings.h" 00021 00022 bool AIEventEnginePreview::IsEngineValid() const 00023 { 00024 const Engine *e = ::Engine::GetIfValid(this->engine); 00025 return e != NULL && e->IsEnabled(); 00026 } 00027 00028 char *AIEventEnginePreview::GetName() 00029 { 00030 if (!this->IsEngineValid()) return NULL; 00031 static const int len = 64; 00032 char *engine_name = MallocT<char>(len); 00033 00034 ::SetDParam(0, this->engine); 00035 ::GetString(engine_name, STR_ENGINE_NAME, &engine_name[len - 1]); 00036 return engine_name; 00037 } 00038 00039 CargoID AIEventEnginePreview::GetCargoType() 00040 { 00041 if (!this->IsEngineValid()) return CT_INVALID; 00042 CargoArray cap = ::GetCapacityOfArticulatedParts(this->engine); 00043 00044 CargoID most_cargo = CT_INVALID; 00045 uint amount = 0; 00046 for (CargoID cid = 0; cid < NUM_CARGO; cid++) { 00047 if (cap[cid] > amount) { 00048 amount = cap[cid]; 00049 most_cargo = cid; 00050 } 00051 } 00052 00053 return most_cargo; 00054 } 00055 00056 int32 AIEventEnginePreview::GetCapacity() 00057 { 00058 if (!this->IsEngineValid()) return -1; 00059 const Engine *e = ::Engine::Get(this->engine); 00060 switch (e->type) { 00061 case VEH_ROAD: 00062 case VEH_TRAIN: { 00063 CargoArray capacities = GetCapacityOfArticulatedParts(this->engine); 00064 for (CargoID c = 0; c < NUM_CARGO; c++) { 00065 if (capacities[c] == 0) continue; 00066 return capacities[c]; 00067 } 00068 return -1; 00069 } 00070 00071 case VEH_SHIP: 00072 case VEH_AIRCRAFT: 00073 return e->GetDisplayDefaultCapacity(); 00074 00075 default: NOT_REACHED(); 00076 } 00077 } 00078 00079 int32 AIEventEnginePreview::GetMaxSpeed() 00080 { 00081 if (!this->IsEngineValid()) return -1; 00082 const Engine *e = ::Engine::Get(this->engine); 00083 int32 max_speed = e->GetDisplayMaxSpeed(); // km-ish/h 00084 if (e->type == VEH_AIRCRAFT) max_speed /= _settings_game.vehicle.plane_speed; 00085 return max_speed; 00086 } 00087 00088 Money AIEventEnginePreview::GetPrice() 00089 { 00090 if (!this->IsEngineValid()) return -1; 00091 return ::Engine::Get(this->engine)->GetCost(); 00092 } 00093 00094 Money AIEventEnginePreview::GetRunningCost() 00095 { 00096 if (!this->IsEngineValid()) return -1; 00097 return ::Engine::Get(this->engine)->GetRunningCost(); 00098 } 00099 00100 int32 AIEventEnginePreview::GetVehicleType() 00101 { 00102 if (!this->IsEngineValid()) return AIVehicle::VT_INVALID; 00103 switch (::Engine::Get(this->engine)->type) { 00104 case VEH_ROAD: return AIVehicle::VT_ROAD; 00105 case VEH_TRAIN: return AIVehicle::VT_RAIL; 00106 case VEH_SHIP: return AIVehicle::VT_WATER; 00107 case VEH_AIRCRAFT: return AIVehicle::VT_AIR; 00108 default: NOT_REACHED(); 00109 } 00110 } 00111 00112 bool AIEventEnginePreview::AcceptPreview() 00113 { 00114 if (!this->IsEngineValid()) return false; 00115 return AIObject::DoCommand(0, this->engine, 0, CMD_WANT_ENGINE_PREVIEW); 00116 } 00117 00118 bool AIEventCompanyAskMerger::AcceptMerger() 00119 { 00120 return AIObject::DoCommand(0, this->owner, 0, CMD_BUY_COMPANY); 00121 }