diff options
Diffstat (limited to 'src/ai')
-rw-r--r-- | src/ai/ai_instance.cpp | 1 | ||||
-rw-r--r-- | src/ai/api/ai_changelog.hpp | 3 | ||||
-rw-r--r-- | src/ai/api/ai_vehiclelist.cpp | 54 | ||||
-rw-r--r-- | src/ai/api/ai_vehiclelist.hpp | 18 | ||||
-rw-r--r-- | src/ai/api/ai_vehiclelist.hpp.sq | 17 |
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; } |