summaryrefslogtreecommitdiff
path: root/src/ai/api/ai_event_types.cpp
diff options
context:
space:
mode:
authortruebrain <truebrain@openttd.org>2009-01-12 17:11:45 +0000
committertruebrain <truebrain@openttd.org>2009-01-12 17:11:45 +0000
commita3dd7506d377b1434f913bd65c019eed52b64b6e (patch)
treeced1a262eb143ad6e64ec02f4a4c89835c0c32fd /src/ai/api/ai_event_types.cpp
parent9294f9616866b9778c22076c19b5a32b4f85f788 (diff)
downloadopenttd-a3dd7506d377b1434f913bd65c019eed52b64b6e.tar.xz
(svn r15027) -Merge: tomatos and bananas left to be, here is NoAI for all to see.
NoAI is an API (a framework) to build your own AIs in. See: http://wiki.openttd.org/wiki/index.php/AI:Main_Page With many thanks to: - glx and Rubidium for their syncing, feedback and hard work - Yexo for his feedback, patches, and AIs which tested the system very deep - Morloth for his feedback and patches - TJIP for hosting a challenge which kept NoAI on track - All AI authors for testing our AI API, and all other people who helped in one way or another -Remove: all old AIs and their cheats/hacks
Diffstat (limited to 'src/ai/api/ai_event_types.cpp')
-rw-r--r--src/ai/api/ai_event_types.cpp187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/ai/api/ai_event_types.cpp b/src/ai/api/ai_event_types.cpp
new file mode 100644
index 000000000..07b324cfa
--- /dev/null
+++ b/src/ai/api/ai_event_types.cpp
@@ -0,0 +1,187 @@
+/* $Id$ */
+
+/** @file ai_event_types.cpp Implementation of all EventTypes. */
+
+#include "ai_event_types.hpp"
+#include "../../openttd.h"
+#include "../../core/alloc_func.hpp"
+#include "../../strings_func.h"
+#include "../../roadveh.h"
+#include "../../train.h"
+#include "../../ship.h"
+#include "../../aircraft.h"
+#include "../../settings_type.h"
+#include "../../articulated_vehicles.h"
+#include "table/strings.h"
+
+bool AIEventVehicleCrashed::CloneCrashedVehicle(TileIndex depot)
+{
+ return false;
+}
+
+const char *AIEventEnginePreview::GetName()
+{
+ static const int len = 64;
+ char *engine_name = MallocT<char>(len);
+
+ ::SetDParam(0, engine);
+ ::GetString(engine_name, STR_ENGINE_NAME, &engine_name[len - 1]);
+ return engine_name;
+}
+
+CargoID AIEventEnginePreview::GetCargoType()
+{
+ switch (::GetEngine(engine)->type) {
+ case VEH_ROAD: {
+ const RoadVehicleInfo *vi = ::RoadVehInfo(engine);
+ return vi->cargo_type;
+ } break;
+
+ case VEH_TRAIN: {
+ const RailVehicleInfo *vi = ::RailVehInfo(engine);
+ return vi->cargo_type;
+ } break;
+
+ case VEH_SHIP: {
+ const ShipVehicleInfo *vi = ::ShipVehInfo(engine);
+ return vi->cargo_type;
+ } break;
+
+ case VEH_AIRCRAFT: {
+ return CT_PASSENGERS;
+ } break;
+
+ default: NOT_REACHED();
+ }
+}
+
+int32 AIEventEnginePreview::GetCapacity()
+{
+ switch (::GetEngine(engine)->type) {
+ case VEH_ROAD:
+ case VEH_TRAIN: {
+ uint16 *capacities = GetCapacityOfArticulatedParts(engine, ::GetEngine(engine)->type);
+ for (CargoID c = 0; c < NUM_CARGO; c++) {
+ if (capacities[c] == 0) continue;
+ return capacities[c];
+ }
+ return -1;
+ } break;
+
+ case VEH_SHIP: {
+ const ShipVehicleInfo *vi = ::ShipVehInfo(engine);
+ return vi->capacity;
+ } break;
+
+ case VEH_AIRCRAFT: {
+ const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine);
+ return vi->passenger_capacity;
+ } break;
+
+ default: NOT_REACHED();
+ }
+}
+
+int32 AIEventEnginePreview::GetMaxSpeed()
+{
+ switch (::GetEngine(engine)->type) {
+ case VEH_ROAD: {
+ const RoadVehicleInfo *vi = ::RoadVehInfo(engine);
+ /* Internal speeds are km/h * 2 */
+ return vi->max_speed / 2;
+ } break;
+
+ case VEH_TRAIN: {
+ const RailVehicleInfo *vi = ::RailVehInfo(engine);
+ return vi->max_speed;
+ } break;
+
+ case VEH_SHIP: {
+ const ShipVehicleInfo *vi = ::ShipVehInfo(engine);
+ /* Internal speeds are km/h * 2 */
+ return vi->max_speed / 2;
+ } break;
+
+ case VEH_AIRCRAFT: {
+ const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine);
+ return vi->max_speed / _settings_game.vehicle.plane_speed;
+ } break;
+
+ default: NOT_REACHED();
+ }
+}
+
+Money AIEventEnginePreview::GetPrice()
+{
+ switch (::GetEngine(engine)->type) {
+ case VEH_ROAD: {
+ const RoadVehicleInfo *vi = ::RoadVehInfo(engine);
+ return (_price.roadveh_base >> 3) * vi->cost_factor >> 5;
+ } break;
+
+ case VEH_TRAIN: {
+ const RailVehicleInfo *vi = ::RailVehInfo(engine);
+ return (_price.build_railvehicle >> 3) * vi->cost_factor >> 5;
+ } break;
+
+ case VEH_SHIP: {
+ const ShipVehicleInfo *vi = ::ShipVehInfo(engine);
+ return (_price.ship_base >> 3) * vi->cost_factor >> 5;
+ } break;
+
+ case VEH_AIRCRAFT: {
+ const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine);
+ return (_price.aircraft_base >> 3) * vi->cost_factor >> 5;
+ } break;
+
+ default: NOT_REACHED();
+ }
+}
+
+Money AIEventEnginePreview::GetRunningCost()
+{
+ /* We need to create an instance in order to obtain GetRunningCost.
+ * This means we temporary allocate a vehicle in the pool, but
+ * there is no other way.. */
+ Vehicle *vehicle;
+ switch (::GetEngine(engine)->type) {
+ case VEH_ROAD: {
+ vehicle = new RoadVehicle();
+ } break;
+
+ case VEH_TRAIN: {
+ vehicle = new Train();
+ } break;
+
+ case VEH_SHIP: {
+ vehicle = new Ship();
+ } break;
+
+ case VEH_AIRCRAFT: {
+ vehicle = new Aircraft();
+ } break;
+
+ default: NOT_REACHED();
+ }
+
+ vehicle->engine_type = engine;
+ Money runningCost = vehicle->GetRunningCost();
+ delete vehicle;
+ return runningCost >> 8;
+}
+
+AIVehicle::VehicleType AIEventEnginePreview::GetVehicleType()
+{
+ switch (::GetEngine(engine)->type) {
+ case VEH_ROAD: return AIVehicle::VEHICLE_ROAD;
+ case VEH_TRAIN: return AIVehicle::VEHICLE_RAIL;
+ case VEH_SHIP: return AIVehicle::VEHICLE_WATER;
+ case VEH_AIRCRAFT: return AIVehicle::VEHICLE_AIR;
+ default: NOT_REACHED();
+ }
+}
+
+bool AIEventEnginePreview::AcceptPreview()
+{
+ return AIObject::DoCommand(0, engine, 0, CMD_WANT_ENGINE_PREVIEW);
+}