summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ai/ai_instance.cpp1
-rw-r--r--src/ai/api/ai_changelog.hpp3
-rw-r--r--src/ai/api/ai_vehiclelist.cpp54
-rw-r--r--src/ai/api/ai_vehiclelist.hpp18
-rw-r--r--src/ai/api/ai_vehiclelist.hpp.sq17
5 files changed, 92 insertions, 1 deletions
diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp
index 6d29aec95..9e4b56ddc 100644
--- a/src/ai/ai_instance.cpp
+++ b/src/ai/ai_instance.cpp
@@ -244,6 +244,7 @@ void AIInstance::RegisterAPI()
SQAIVehicle_Register(this->engine);
SQAIVehicleList_Register(this->engine);
SQAIVehicleList_DefaultGroup_Register(this->engine);
+ SQAIVehicleList_Depot_Register(this->engine);
SQAIVehicleList_Group_Register(this->engine);
SQAIVehicleList_SharedOrders_Register(this->engine);
SQAIVehicleList_Station_Register(this->engine);
diff --git a/src/ai/api/ai_changelog.hpp b/src/ai/api/ai_changelog.hpp
index d71e53e37..4a00b85ea 100644
--- a/src/ai/api/ai_changelog.hpp
+++ b/src/ai/api/ai_changelog.hpp
@@ -22,6 +22,7 @@
* \li AIBaseStation
* \li AIBuoyList
* \li AIEventCompanyAskMerger
+ * \li AIIndustry::GetLastMonthTransportedPercentage
* \li AIRail::RemoveRailStationTileRectangle
* \li AIRail::RemoveRailWaypointTileRectangle
* \li AISubsidy::SubsidyParticipantType
@@ -30,7 +31,7 @@
* \li AISubsidy::GetDestinationType
* \li AISubsidy::GetDestinationIndex
* \li AITown::GetLastMonthTransportedPercentage
- * \li AIIndustry::GetLastMonthTransportedPercentage
+ * \li AIVehicleList_Depot
*
* API removals:
* \li AIOrder::ChangeOrder, use AIOrder::SetOrderFlags instead
diff --git a/src/ai/api/ai_vehiclelist.cpp b/src/ai/api/ai_vehiclelist.cpp
index 937128ae8..5e1fb6b07 100644
--- a/src/ai/api/ai_vehiclelist.cpp
+++ b/src/ai/api/ai_vehiclelist.cpp
@@ -11,9 +11,12 @@
#include "ai_vehiclelist.hpp"
#include "ai_group.hpp"
+#include "ai_map.hpp"
#include "ai_station.hpp"
#include "ai_vehicle.hpp"
#include "../../company_func.h"
+#include "../../depot_base.h"
+#include "../../depot_map.h"
#include "../../vehicle_base.h"
AIVehicleList::AIVehicleList()
@@ -43,6 +46,57 @@ AIVehicleList_Station::AIVehicleList_Station(StationID station_id)
}
}
+AIVehicleList_Depot::AIVehicleList_Depot(TileIndex tile)
+{
+ if (!AIMap::IsValidTile(tile)) return;
+
+ DestinationID dest;
+ VehicleType type;
+
+ switch (GetTileType(tile)) {
+ case MP_STATION: // Aircraft
+ if (!IsAirport(tile)) return;
+ type = VEH_AIRCRAFT;
+ dest = GetStationIndex(tile);
+ break;
+
+ case MP_RAILWAY:
+ if (!IsRailDepot(tile)) return;
+ type = VEH_TRAIN;
+ dest = Depot::GetByTile(tile)->index;
+ break;
+
+ case MP_ROAD:
+ if (!IsRoadDepot(tile)) return;
+ type = VEH_ROAD;
+ dest = Depot::GetByTile(tile)->index;
+ break;
+
+ case MP_WATER:
+ if (!IsShipDepot(tile)) return;
+ type = VEH_SHIP;
+ dest = Depot::GetByTile(min(tile, GetOtherShipDepotTile(tile)))->index;
+ break;
+
+ default: // No depot
+ return;
+ }
+
+ const Vehicle *v;
+ FOR_ALL_VEHICLES(v) {
+ if (v->owner == _current_company && v->IsPrimaryVehicle() && v->type == type) {
+ const Order *order;
+
+ FOR_VEHICLE_ORDERS(v, order) {
+ if (order->IsType(OT_GOTO_DEPOT) && order->GetDestination() == dest) {
+ this->AddItem(v->index);
+ break;
+ }
+ }
+ }
+ }
+}
+
AIVehicleList_SharedOrders::AIVehicleList_SharedOrders(VehicleID vehicle_id)
{
if (!AIVehicle::IsValidVehicle(vehicle_id)) return;
diff --git a/src/ai/api/ai_vehiclelist.hpp b/src/ai/api/ai_vehiclelist.hpp
index edc0035e4..ac868ead3 100644
--- a/src/ai/api/ai_vehiclelist.hpp
+++ b/src/ai/api/ai_vehiclelist.hpp
@@ -41,6 +41,24 @@ public:
};
/**
+ * Creates a list of vehicles that have orders to a given depot.
+ * The list is created with a tile. If the tile is part of an airport all
+ * aircraft having a depot order on a hangar of that airport will be
+ * returned. For all other vehicle types the tile has to be a depot or
+ * an empty list will be returned.
+ * @ingroup AIList
+ */
+class AIVehicleList_Depot : public AIAbstractList {
+public:
+ static const char *GetClassName() { return "AIVehicleList_Depot"; }
+
+ /**
+ * @param tile The tile of the depot to get the list of vehicles from, which have orders to it.
+ */
+ AIVehicleList_Depot(TileIndex tile);
+};
+
+/**
* Creates a list of vehicles that share orders.
* @ingroup AIList
*/
diff --git a/src/ai/api/ai_vehiclelist.hpp.sq b/src/ai/api/ai_vehiclelist.hpp.sq
index 68cb3cf41..1e7817cdf 100644
--- a/src/ai/api/ai_vehiclelist.hpp.sq
+++ b/src/ai/api/ai_vehiclelist.hpp.sq
@@ -46,6 +46,23 @@ void SQAIVehicleList_Station_Register(Squirrel *engine) {
}
namespace SQConvert {
+ /* Allow AIVehicleList_Depot to be used as Squirrel parameter */
+ template <> AIVehicleList_Depot *GetParam(ForceType<AIVehicleList_Depot *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AIVehicleList_Depot *)instance; }
+ template <> AIVehicleList_Depot &GetParam(ForceType<AIVehicleList_Depot &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIVehicleList_Depot *)instance; }
+ template <> const AIVehicleList_Depot *GetParam(ForceType<const AIVehicleList_Depot *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AIVehicleList_Depot *)instance; }
+ template <> const AIVehicleList_Depot &GetParam(ForceType<const AIVehicleList_Depot &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIVehicleList_Depot *)instance; }
+ template <> int Return<AIVehicleList_Depot *>(HSQUIRRELVM vm, AIVehicleList_Depot *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "AIVehicleList_Depot", res, NULL, DefSQDestructorCallback<AIVehicleList_Depot>); return 1; }
+}; // namespace SQConvert
+
+void SQAIVehicleList_Depot_Register(Squirrel *engine) {
+ DefSQClass <AIVehicleList_Depot> SQAIVehicleList_Depot("AIVehicleList_Depot");
+ SQAIVehicleList_Depot.PreRegister(engine, "AIAbstractList");
+ SQAIVehicleList_Depot.AddConstructor<void (AIVehicleList_Depot::*)(TileIndex tile), 2>(engine, "xi");
+
+ SQAIVehicleList_Depot.PostRegister(engine);
+}
+
+namespace SQConvert {
/* Allow AIVehicleList_SharedOrders to be used as Squirrel parameter */
template <> AIVehicleList_SharedOrders *GetParam(ForceType<AIVehicleList_SharedOrders *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AIVehicleList_SharedOrders *)instance; }
template <> AIVehicleList_SharedOrders &GetParam(ForceType<AIVehicleList_SharedOrders &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIVehicleList_SharedOrders *)instance; }