diff options
-rw-r--r-- | bin/ai/compat_0.7.nut | 8 | ||||
-rw-r--r-- | bin/ai/regression/regression.nut | 10 | ||||
-rw-r--r-- | bin/ai/regression/regression.txt | 4 | ||||
-rw-r--r-- | projects/openttd_vs80.vcproj | 8 | ||||
-rw-r--r-- | projects/openttd_vs90.vcproj | 8 | ||||
-rw-r--r-- | source.list | 2 | ||||
-rw-r--r-- | src/ai/ai_instance.cpp | 2 | ||||
-rw-r--r-- | src/ai/api/ai_buoylist.cpp | 21 | ||||
-rw-r--r-- | src/ai/api/ai_buoylist.hpp | 28 | ||||
-rw-r--r-- | src/ai/api/ai_buoylist.hpp.sq | 30 | ||||
-rw-r--r-- | src/ai/api/ai_changelog.hpp | 5 | ||||
-rw-r--r-- | src/ai/api/ai_waypoint.cpp | 13 | ||||
-rw-r--r-- | src/ai/api/ai_waypoint.hpp | 20 | ||||
-rw-r--r-- | src/ai/api/ai_waypoint.hpp.sq | 6 | ||||
-rw-r--r-- | src/ai/api/ai_waypointlist.cpp | 5 | ||||
-rw-r--r-- | src/ai/api/ai_waypointlist.hpp | 6 | ||||
-rw-r--r-- | src/ai/api/ai_waypointlist.hpp.sq | 2 |
17 files changed, 68 insertions, 110 deletions
diff --git a/bin/ai/compat_0.7.nut b/bin/ai/compat_0.7.nut index a90c79314..3e4b4fa68 100644 --- a/bin/ai/compat_0.7.nut +++ b/bin/ai/compat_0.7.nut @@ -250,3 +250,11 @@ AIEngine.GetPlaneType <- function(engine_id) if (!AIEngine.IsBuildable(engine_id)) return -1; return AIEngine._GetPlaneType(engine_id); } + +_AIWaypointList <- AIWaypointList; +class AIWaypointList extends _AIWaypointList { + constructor() + { + ::_AIWaypointList.constructor(AIWaypoint.WAYPOINT_RAIL); + } +} diff --git a/bin/ai/regression/regression.nut b/bin/ai/regression/regression.nut index b009ef0de..8af065abf 100644 --- a/bin/ai/regression/regression.nut +++ b/bin/ai/regression/regression.nut @@ -805,13 +805,17 @@ function Regression::Marine() print(" IsCanalTile(): " + AIMarine.IsCanalTile(32127)); print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF)); - local list = AIBuoyList(); + local list = AIWaypointList(AIWaypoint.WAYPOINT_BUOY); print(""); - print("--AIBuoyList--"); + print("--AIWaypointList(BUOY)--"); print(" Count(): " + list.Count()); print(" Location ListDump:"); for (local i = list.Begin(); list.HasNext(); i = list.Next()) { - print(" " + i); + print(" " + AIWaypoint.GetLocation(i)); + } + print(" HasWaypointType:"); + for (local i = list.Begin(); list.HasNext(); i = list.Next()) { + print(" " + AIWaypoint.HasWaypointType(i, AIWaypoint.WAYPOINT_RAIL) + " " + AIWaypoint.HasWaypointType(i, AIWaypoint.WAYPOINT_BUOY) + " " + AIWaypoint.HasWaypointType(i, AIWaypoint.WAYPOINT_ANY)); } print(""); diff --git a/bin/ai/regression/regression.txt b/bin/ai/regression/regression.txt index 0adf36e1c..c5b65d863 100644 --- a/bin/ai/regression/regression.txt +++ b/bin/ai/regression/regression.txt @@ -7100,10 +7100,12 @@ IsCanalTile(): true GetBankBalance(): 1999951154 ---AIBuoyList-- +--AIWaypointList(BUOY)-- Count(): 1 Location ListDump: 28481 + HasWaypointType: + false true false RemoveWaterDepot(): true RemoveDock(): true diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj index 66856f087..8fb0704e0 100644 --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -2640,10 +2640,6 @@ > </File> <File - RelativePath=".\..\src\ai\api\ai_buoylist.hpp" - > - </File> - <File RelativePath=".\..\src\ai\api\ai_cargo.hpp" > </File> @@ -2864,10 +2860,6 @@ > </File> <File - RelativePath=".\..\src\ai\api\ai_buoylist.cpp" - > - </File> - <File RelativePath=".\..\src\ai\api\ai_cargo.cpp" > </File> diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj index 4906cc351..f8d41a88b 100644 --- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -2637,10 +2637,6 @@ > </File> <File - RelativePath=".\..\src\ai\api\ai_buoylist.hpp" - > - </File> - <File RelativePath=".\..\src\ai\api\ai_cargo.hpp" > </File> @@ -2861,10 +2857,6 @@ > </File> <File - RelativePath=".\..\src\ai\api\ai_buoylist.cpp" - > - </File> - <File RelativePath=".\..\src\ai\api\ai_cargo.cpp" > </File> diff --git a/source.list b/source.list index 40482108a..760aa1ab1 100644 --- a/source.list +++ b/source.list @@ -597,7 +597,6 @@ ai/api/ai_base.hpp ai/api/ai_basestation.hpp ai/api/ai_bridge.hpp ai/api/ai_bridgelist.hpp -ai/api/ai_buoylist.hpp ai/api/ai_cargo.hpp ai/api/ai_cargolist.hpp ai/api/ai_changelog.hpp @@ -654,7 +653,6 @@ ai/api/ai_base.cpp ai/api/ai_basestation.cpp ai/api/ai_bridge.cpp ai/api/ai_bridgelist.cpp -ai/api/ai_buoylist.cpp ai/api/ai_cargo.cpp ai/api/ai_cargolist.cpp ai/api/ai_company.cpp diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp index 41b4c42c0..7adb797f8 100644 --- a/src/ai/ai_instance.cpp +++ b/src/ai/ai_instance.cpp @@ -35,7 +35,6 @@ #include "api/ai_basestation.hpp.sq" #include "api/ai_bridge.hpp.sq" #include "api/ai_bridgelist.hpp.sq" -#include "api/ai_buoylist.hpp.sq" #include "api/ai_cargo.hpp.sq" #include "api/ai_cargolist.hpp.sq" #include "api/ai_company.hpp.sq" @@ -177,7 +176,6 @@ void AIInstance::RegisterAPI() SQAIBridge_Register(this->engine); SQAIBridgeList_Register(this->engine); SQAIBridgeList_Length_Register(this->engine); - SQAIBuoyList_Register(this->engine); SQAICargo_Register(this->engine); SQAICargoList_Register(this->engine); SQAICargoList_IndustryAccepting_Register(this->engine); diff --git a/src/ai/api/ai_buoylist.cpp b/src/ai/api/ai_buoylist.cpp deleted file mode 100644 index 426296b08..000000000 --- a/src/ai/api/ai_buoylist.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* $Id$ */ - -/* - * This file is part of OpenTTD. - * 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. - * 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. - * 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/>. - */ - -/** @file ai_buoylist.cpp Implementation of AIBuoyList and friends. */ - -#include "ai_buoylist.hpp" -#include "../../waypoint_base.h" - -AIBuoyList::AIBuoyList() -{ - Waypoint *wp; - FOR_ALL_WAYPOINTS(wp) { - if (wp->facilities & FACIL_DOCK) this->AddItem(wp->xy); - } -} diff --git a/src/ai/api/ai_buoylist.hpp b/src/ai/api/ai_buoylist.hpp deleted file mode 100644 index e46f999ed..000000000 --- a/src/ai/api/ai_buoylist.hpp +++ /dev/null @@ -1,28 +0,0 @@ -/* $Id$ */ - -/* - * This file is part of OpenTTD. - * 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. - * 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. - * 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/>. - */ - -/** @file ai_buoylist.hpp List all the buoys. */ - -#ifndef AI_BUOYLIST_HPP -#define AI_BUOYLIST_HPP - -#include "ai_abstractlist.hpp" - -/** - * Creates a list of buoys. - * @ingroup AIList - */ -class AIBuoyList : public AIAbstractList { -public: - static const char *GetClassName() { return "AIBuoyList"; } - AIBuoyList(); -}; - - -#endif /* AI_BUOYLIST_HPP */ diff --git a/src/ai/api/ai_buoylist.hpp.sq b/src/ai/api/ai_buoylist.hpp.sq deleted file mode 100644 index 99b3a45ce..000000000 --- a/src/ai/api/ai_buoylist.hpp.sq +++ /dev/null @@ -1,30 +0,0 @@ -/* $Id$ */ - -/* - * This file is part of OpenTTD. - * 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. - * 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. - * 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/>. - */ - -/* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */ - -#include "ai_buoylist.hpp" - -namespace SQConvert { - /* Allow AIBuoyList to be used as Squirrel parameter */ - template <> AIBuoyList *GetParam(ForceType<AIBuoyList *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AIBuoyList *)instance; } - template <> AIBuoyList &GetParam(ForceType<AIBuoyList &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIBuoyList *)instance; } - template <> const AIBuoyList *GetParam(ForceType<const AIBuoyList *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AIBuoyList *)instance; } - template <> const AIBuoyList &GetParam(ForceType<const AIBuoyList &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIBuoyList *)instance; } - template <> int Return<AIBuoyList *>(HSQUIRRELVM vm, AIBuoyList *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "AIBuoyList", res, NULL, DefSQDestructorCallback<AIBuoyList>); return 1; } -}; // namespace SQConvert - -void SQAIBuoyList_Register(Squirrel *engine) -{ - DefSQClass <AIBuoyList> SQAIBuoyList("AIBuoyList"); - SQAIBuoyList.PreRegister(engine, "AIAbstractList"); - SQAIBuoyList.AddConstructor<void (AIBuoyList::*)(), 1>(engine, "x"); - - SQAIBuoyList.PostRegister(engine); -} diff --git a/src/ai/api/ai_changelog.hpp b/src/ai/api/ai_changelog.hpp index fa35e559e..23b9d1573 100644 --- a/src/ai/api/ai_changelog.hpp +++ b/src/ai/api/ai_changelog.hpp @@ -20,7 +20,6 @@ * * API additions: * \li AIBaseStation - * \li AIBuoyList * \li AIEngine::IsBuildable * \li AIEventCompanyAskMerger * \li AIIndustry::GetLastMonthTransportedPercentage @@ -34,6 +33,8 @@ * \li AISubsidy::GetDestinationIndex * \li AITown::GetLastMonthTransportedPercentage * \li AIVehicleList_Depot + * \li AIWaypoint::WaypointType + * \li AIWaypoint::HasWaypointType * \li Some error messages to AIWaypoint * * API removals: @@ -59,6 +60,8 @@ * AIBaseStation, but can still be used as AIStation.GetConstructionDate * \li WaypointID was replaced by StationID. All WaypointIDs from previous * savegames are invalid. Use STATION_INVALID instead of WAYPOINT_INVALID + * \li AIWaypointList constructor now needs a WaypointType similiar to AIStationList, + * it can also handle buoys. * \li AIVehicleList_Station now also works for waypoints * \li Stations can be build over rail without signals that is in the right * direction for the to-be built station. It will also convert the rail if diff --git a/src/ai/api/ai_waypoint.cpp b/src/ai/api/ai_waypoint.cpp index 8f7eadf50..f5badfbbb 100644 --- a/src/ai/api/ai_waypoint.cpp +++ b/src/ai/api/ai_waypoint.cpp @@ -11,18 +11,27 @@ #include "ai_waypoint.hpp" #include "ai_rail.hpp" +#include "ai_marine.hpp" #include "../../company_func.h" #include "../../waypoint_base.h" /* static */ bool AIWaypoint::IsValidWaypoint(StationID waypoint_id) { const Waypoint *wp = ::Waypoint::GetIfValid(waypoint_id); - return wp != NULL && wp->owner == _current_company; + return wp != NULL && (wp->owner == _current_company || wp->owner == OWNER_NONE); } /* static */ StationID AIWaypoint::GetWaypointID(TileIndex tile) { - if (!AIRail::IsRailWaypointTile(tile)) return STATION_INVALID; + if (!AIRail::IsRailWaypointTile(tile) && !AIMarine::IsBuoyTile(tile)) return STATION_INVALID; return ::GetStationIndex(tile); } + +/* static */ bool AIWaypoint::HasWaypointType(StationID waypoint_id, WaypointType waypoint_type) +{ + if (!IsValidWaypoint(waypoint_id)) return false; + if (CountBits(waypoint_type) != 1) return false; + + return (::Waypoint::Get(waypoint_id)->facilities & waypoint_type) != 0; +} diff --git a/src/ai/api/ai_waypoint.hpp b/src/ai/api/ai_waypoint.hpp index a781a0ba9..ddd6168d5 100644 --- a/src/ai/api/ai_waypoint.hpp +++ b/src/ai/api/ai_waypoint.hpp @@ -24,6 +24,16 @@ public: static const char *GetClassName() { return "AIWaypoint"; } /** + * Type of waypoints known in the game. + */ + enum WaypointType { + /* Values are important, as they represent the internal state of the game. */ + WAYPOINT_RAIL = 0x01, //!< Rail waypoint + WAYPOINT_BUOY = 0x10, //!< Buoy + WAYPOINT_ANY = 0x11, //!< All waypoint types + }; + + /** * All waypoint related error messages. */ enum ErrorMessages { @@ -51,6 +61,16 @@ public: * @return StationID of the waypoint. */ static StationID GetWaypointID(TileIndex tile); + + /** + * Check if any part of the waypoint contains a waypoint of the type waypoint_type + * @param waypoint_id The waypoint to look at. + * @param waypoint_type The WaypointType to look for. + * @return True if the waypoint has a waypoint part of the type waypoint_type. + */ + static bool HasWaypointType(StationID waypoint_id, WaypointType waypoint_type); }; +DECLARE_ENUM_AS_BIT_SET(AIWaypoint::WaypointType); + #endif /* AI_WAYPOINT_HPP */ diff --git a/src/ai/api/ai_waypoint.hpp.sq b/src/ai/api/ai_waypoint.hpp.sq index bdecda56b..704f39701 100644 --- a/src/ai/api/ai_waypoint.hpp.sq +++ b/src/ai/api/ai_waypoint.hpp.sq @@ -13,6 +13,8 @@ namespace SQConvert { /* Allow enums to be used as Squirrel parameters */ + template <> AIWaypoint::WaypointType GetParam(ForceType<AIWaypoint::WaypointType>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AIWaypoint::WaypointType)tmp; } + template <> int Return<AIWaypoint::WaypointType>(HSQUIRRELVM vm, AIWaypoint::WaypointType res) { sq_pushinteger(vm, (int32)res); return 1; } template <> AIWaypoint::ErrorMessages GetParam(ForceType<AIWaypoint::ErrorMessages>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AIWaypoint::ErrorMessages)tmp; } template <> int Return<AIWaypoint::ErrorMessages>(HSQUIRRELVM vm, AIWaypoint::ErrorMessages res) { sq_pushinteger(vm, (int32)res); return 1; } @@ -30,6 +32,9 @@ void SQAIWaypoint_Register(Squirrel *engine) SQAIWaypoint.PreRegister(engine, "AIBaseStation"); SQAIWaypoint.AddConstructor<void (AIWaypoint::*)(), 1>(engine, "x"); + SQAIWaypoint.DefSQConst(engine, AIWaypoint::WAYPOINT_RAIL, "WAYPOINT_RAIL"); + SQAIWaypoint.DefSQConst(engine, AIWaypoint::WAYPOINT_BUOY, "WAYPOINT_BUOY"); + SQAIWaypoint.DefSQConst(engine, AIWaypoint::WAYPOINT_ANY, "WAYPOINT_ANY"); SQAIWaypoint.DefSQConst(engine, AIWaypoint::ERR_WAYPOINT_BASE, "ERR_WAYPOINT_BASE"); SQAIWaypoint.DefSQConst(engine, AIWaypoint::ERR_WAYPOINT_TOO_CLOSE_TO_ANOTHER_WAYPOINT, "ERR_WAYPOINT_TOO_CLOSE_TO_ANOTHER_WAYPOINT"); SQAIWaypoint.DefSQConst(engine, AIWaypoint::ERR_WAYPOINT_ADJOINS_MULTIPLE_WAYPOINTS, "ERR_WAYPOINT_ADJOINS_MULTIPLE_WAYPOINTS"); @@ -42,6 +47,7 @@ void SQAIWaypoint_Register(Squirrel *engine) SQAIWaypoint.DefSQStaticMethod(engine, &AIWaypoint::IsValidWaypoint, "IsValidWaypoint", 2, ".i"); SQAIWaypoint.DefSQStaticMethod(engine, &AIWaypoint::GetWaypointID, "GetWaypointID", 2, ".i"); + SQAIWaypoint.DefSQStaticMethod(engine, &AIWaypoint::HasWaypointType, "HasWaypointType", 3, ".ii"); SQAIWaypoint.PostRegister(engine); } diff --git a/src/ai/api/ai_waypointlist.cpp b/src/ai/api/ai_waypointlist.cpp index 13087df81..79cc62fdf 100644 --- a/src/ai/api/ai_waypointlist.cpp +++ b/src/ai/api/ai_waypointlist.cpp @@ -15,11 +15,12 @@ #include "../../vehicle_base.h" #include "../../waypoint_base.h" -AIWaypointList::AIWaypointList() +AIWaypointList::AIWaypointList(AIWaypoint::WaypointType waypoint_type) { const Waypoint *wp; FOR_ALL_WAYPOINTS(wp) { - if (wp->facilities & FACIL_TRAIN && wp->owner == _current_company) this->AddItem(wp->index); + if ((wp->facilities & waypoint_type) && + (wp->owner == _current_company || wp->owner == OWNER_NONE)) this->AddItem(wp->index); } } diff --git a/src/ai/api/ai_waypointlist.hpp b/src/ai/api/ai_waypointlist.hpp index 4bc11f8d7..e7c322ece 100644 --- a/src/ai/api/ai_waypointlist.hpp +++ b/src/ai/api/ai_waypointlist.hpp @@ -13,6 +13,7 @@ #define AI_WAYPOINTLIST_HPP #include "ai_abstractlist.hpp" +#include "ai_waypoint.hpp" /** * Creates a list of waypoints of which you are the owner. @@ -22,7 +23,10 @@ class AIWaypointList : public AIAbstractList { public: static const char *GetClassName() { return "AIWaypointList"; } - AIWaypointList(); + /** + * @param waypoint_type The type of waypoint to make a list of waypoints for. + */ + AIWaypointList(AIWaypoint::WaypointType waypoint_type); }; /** diff --git a/src/ai/api/ai_waypointlist.hpp.sq b/src/ai/api/ai_waypointlist.hpp.sq index c2f70c3ef..831f56041 100644 --- a/src/ai/api/ai_waypointlist.hpp.sq +++ b/src/ai/api/ai_waypointlist.hpp.sq @@ -24,7 +24,7 @@ void SQAIWaypointList_Register(Squirrel *engine) { DefSQClass <AIWaypointList> SQAIWaypointList("AIWaypointList"); SQAIWaypointList.PreRegister(engine, "AIAbstractList"); - SQAIWaypointList.AddConstructor<void (AIWaypointList::*)(), 1>(engine, "x"); + SQAIWaypointList.AddConstructor<void (AIWaypointList::*)(AIWaypoint::WaypointType waypoint_type), 2>(engine, "xi"); SQAIWaypointList.PostRegister(engine); } |