(svn r10527) [NoAI] -Add: AIStationList(), which lists all your stations; useful to maintain routes noai
authortruelight
Thu, 12 Jul 2007 15:05:24 +0000
branchnoai
changeset 9636 1005ffccf641
parent 9635 9ee82e091af7
child 9637 9f78a12a4f53
(svn r10527) [NoAI] -Add: AIStationList(), which lists all your stations; useful to maintain routes
bin/ai/regression/regression.nut
bin/ai/regression/regression.txt
projects/openttd.vcproj
projects/openttd_vs80.vcproj
source.list
src/ai/ai_squirrel.cpp
src/ai/api/ai_stationlist.cpp
src/ai/api/ai_stationlist.hpp
src/ai/api/ai_stationlist.hpp.sq
src/ai/api/ai_stationlist_valuator.cpp
src/ai/api/ai_stationlist_valuator.hpp
src/ai/api/ai_stationlist_valuator.hpp.sq
--- a/bin/ai/regression/regression.nut	Thu Jul 12 15:04:26 2007 +0000
+++ b/bin/ai/regression/regression.nut	Thu Jul 12 15:05:24 2007 +0000
@@ -278,6 +278,27 @@
 	print("    GetDriveThroughBackTile():     " + road.GetDriveThroughBackTile(33415));
 	print("    GetRoadStationFrontTile():     " + road.GetRoadStationFrontTile(33415));
 	print("    IsRoadTile():                  " + road.IsRoadTile(33415));
+
+	local list = AIStationList(AIStationList.STATION_BUS_STOP + AIStationList.STATION_TRUCK_STOP);
+
+	print("");
+	print("--StationList--");
+	print("  Count():             " + list.Count());
+	list.Valuate(AIStationListLocation());
+	print("  Location ListDump:");
+	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+		print("    " + i + " => " + list.GetValue(i));
+	}
+	list.Valuate(AIStationListCargoWaiting(0));
+	print("  CargoWaiting(0) ListDump:");
+	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+		print("    " + i + " => " + list.GetValue(i));
+	}
+	list.Valuate(AIStationListCargoWaiting(1));
+	print("  CargoWaiting(1) ListDump:");
+	for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+		print("    " + i + " => " + list.GetValue(i));
+	}
 }
 
 function Regression::Sign()
--- a/bin/ai/regression/regression.txt	Thu Jul 12 15:04:26 2007 +0000
+++ b/bin/ai/regression/regression.txt	Thu Jul 12 15:05:24 2007 +0000
@@ -670,6 +670,18 @@
     GetRoadStationFrontTile():     33414
     IsRoadTile():                  true
 
+--StationList--
+  Count():             2
+  Location ListDump:
+    1 => 33420
+    0 => 33411
+  CargoWaiting(0) ListDump:
+    1 => 0
+    0 => 0
+  CargoWaiting(1) ListDump:
+    1 => 0
+    0 => 0
+
 --Sign--
   BuildSign(33410, 'Some Sign'):       0
   BuildSign(33409, 'Some other Sign'): 1
--- a/projects/openttd.vcproj	Thu Jul 12 15:04:26 2007 +0000
+++ b/projects/openttd.vcproj	Thu Jul 12 15:05:24 2007 +0000
@@ -1120,6 +1120,12 @@
 				RelativePath=".\..\src\ai\api\ai_sign.hpp">
 			</File>
 			<File
+				RelativePath=".\..\src\ai\api\ai_stationlist.hpp">
+			</File>
+			<File
+				RelativePath=".\..\src\ai\api\ai_stationlist_valuator.hpp">
+			</File>
+			<File
 				RelativePath=".\..\src\ai\api\ai_testmode.hpp">
 			</File>
 			<File
@@ -1202,6 +1208,12 @@
 				RelativePath=".\..\src\ai\api\ai_sign.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\ai\api\ai_stationlist.cpp">
+			</File>
+			<File
+				RelativePath=".\..\src\ai\api\ai_stationlist_valuator.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\ai\api\ai_testmode.cpp">
 			</File>
 			<File
--- a/projects/openttd_vs80.vcproj	Thu Jul 12 15:04:26 2007 +0000
+++ b/projects/openttd_vs80.vcproj	Thu Jul 12 15:05:24 2007 +0000
@@ -1712,6 +1712,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\ai\api\ai_stationlist.hpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ai\api\ai_stationlist_valuator.hpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\ai\api\ai_testmode.hpp"
 				>
 			</File>
@@ -1820,6 +1828,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\ai\api\ai_stationlist.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\ai\api\ai_stationlist_valuator.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\ai\api\ai_testmode.cpp"
 				>
 			</File>
--- a/source.list	Thu Jul 12 15:04:26 2007 +0000
+++ b/source.list	Thu Jul 12 15:05:24 2007 +0000
@@ -346,6 +346,8 @@
 ai/api/ai_road.hpp
 ai/api/ai_settings.hpp
 ai/api/ai_sign.hpp
+ai/api/ai_stationlist.hpp
+ai/api/ai_stationlist_valuator.hpp
 ai/api/ai_testmode.hpp
 ai/api/ai_tile.hpp
 ai/api/ai_tilelist.hpp
@@ -374,6 +376,8 @@
 ai/api/ai_road.cpp
 ai/api/ai_settings.cpp
 ai/api/ai_sign.cpp
+ai/api/ai_stationlist.cpp
+ai/api/ai_stationlist_valuator.cpp
 ai/api/ai_testmode.cpp
 ai/api/ai_tile.cpp
 ai/api/ai_tilelist.cpp
--- a/src/ai/ai_squirrel.cpp	Thu Jul 12 15:04:26 2007 +0000
+++ b/src/ai/ai_squirrel.cpp	Thu Jul 12 15:05:24 2007 +0000
@@ -35,6 +35,8 @@
 #include "api/ai_road.hpp.sq"
 #include "api/ai_settings.hpp.sq"
 #include "api/ai_sign.hpp.sq"
+#include "api/ai_stationlist.hpp.sq"
+#include "api/ai_stationlist_valuator.hpp.sq"
 #include "api/ai_testmode.hpp.sq"
 #include "api/ai_tile.hpp.sq"
 #include "api/ai_tilelist.hpp.sq"
@@ -212,6 +214,9 @@
 	SQAIRoadRegister(this->engine);
 	SQAISettingsRegister(this->engine);
 	SQAISignRegister(this->engine);
+	SQAIStationListCargoWaitingRegister(this->engine);
+	SQAIStationListLocationRegister(this->engine);
+	SQAIStationListRegister(this->engine);
 	SQAITestModeRegister(this->engine);
 	SQAITileListBuildableRegister(this->engine);
 	SQAITileListCargoAcceptanceRegister(this->engine);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ai/api/ai_stationlist.cpp	Thu Jul 12 15:05:24 2007 +0000
@@ -0,0 +1,11 @@
+#include "ai_stationlist.hpp"
+#include "../../player.h"
+#include "../../station.h"
+
+AIStationList::AIStationList(AIStationList::StationType type)
+{
+	Station *st;
+	FOR_ALL_STATIONS(st) {
+		if (st->owner == _current_player && (type == AIStationList::STATION_ANY || (st->facilities & type) != 0)) this->AddItem(st->index);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ai/api/ai_stationlist.hpp	Thu Jul 12 15:05:24 2007 +0000
@@ -0,0 +1,36 @@
+/* $Id$ */
+
+/** @file ai_stationlist.hpp list all the stations (you own) */
+
+#ifndef AI_STATIONLIST_HPP
+#define AI_STATIONLIST_HPP
+
+#include "ai_abstractlist.hpp"
+
+/**
+ * Class that creates a list of stations you own.
+ */
+class AIStationList : public AIAbstractList {
+public:
+	enum StationType {
+		STATION_ANY        = 0x00,
+		STATION_TRAIN      = 0x01,
+		STATION_TRUCK_STOP = 0x02,
+		STATION_BUS_STOP   = 0x04,
+		STATION_AIRPORT    = 0x08,
+		STATION_DOCK       = 0x10,
+	};
+
+	/**
+	 * The name of the class, needed by several sub-processes.
+	 */
+	static const char *GetClassName() { return "AIStationList"; }
+
+	/**
+	 * The constructor to make a list of stations.
+	 */
+	AIStationList(AIStationList::StationType type);
+};
+DECLARE_ENUM_AS_BIT_SET(AIStationList::StationType);
+
+#endif /* AI_STATIONLIST_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ai/api/ai_stationlist.hpp.sq	Thu Jul 12 15:05:24 2007 +0000
@@ -0,0 +1,30 @@
+#include "ai_stationlist.hpp"
+
+namespace SQConvert {
+	/* Allow enums to be used as Squirrel parameters */
+	template <> AIStationList::StationType GetParam(ForceType<AIStationList::StationType>, HSQUIRRELVM vm, int index) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AIStationList::StationType)tmp; }
+	template <> int Return<AIStationList::StationType>(HSQUIRRELVM vm, AIStationList::StationType res) { sq_pushinteger(vm, (int32)res); return 1; }
+
+	/* Allow AIStationList to be used as Squirrel parameter */
+	template <> AIStationList *GetParam(ForceType<AIStationList *>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (AIStationList *)instance; }
+	template <> AIStationList &GetParam(ForceType<AIStationList &>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIStationList *)instance; }
+	template <> const AIStationList *GetParam(ForceType<const AIStationList *>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (AIStationList *)instance; }
+	template <> const AIStationList &GetParam(ForceType<const AIStationList &>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIStationList *)instance; }
+}; // namespace SQConvert
+
+void SQAIStationListRegister(Squirrel *engine) {
+	DefSQClass <AIStationList> SQAIStationList("AIStationList");
+	SQAIStationList.PreRegister(engine, "AIAbstractList");
+	SQAIStationList.AddConstructor<void (AIStationList::*)(AIStationList::StationType type), 2>(engine, "xi");
+
+	SQAIStationList.DefSQConst(engine, AIStationList::STATION_ANY,        "STATION_ANY");
+	SQAIStationList.DefSQConst(engine, AIStationList::STATION_TRAIN,      "STATION_TRAIN");
+	SQAIStationList.DefSQConst(engine, AIStationList::STATION_TRUCK_STOP, "STATION_TRUCK_STOP");
+	SQAIStationList.DefSQConst(engine, AIStationList::STATION_BUS_STOP,   "STATION_BUS_STOP");
+	SQAIStationList.DefSQConst(engine, AIStationList::STATION_AIRPORT,    "STATION_AIRPORT");
+	SQAIStationList.DefSQConst(engine, AIStationList::STATION_DOCK,       "STATION_DOCK");
+
+	SQAIStationList.DefSQStaticMethod(engine, &AIStationList::GetClassName, "GetClassName", 1, "x");
+
+	SQAIStationList.PostRegister(engine);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ai/api/ai_stationlist_valuator.cpp	Thu Jul 12 15:05:24 2007 +0000
@@ -0,0 +1,15 @@
+#include "ai_stationlist_valuator.hpp"
+#include "../../station.h"
+
+int32 AIStationListLocation::Valuate(int32 station) const
+{
+	if (!IsValidStationID(station)) return INVALID_TILE;
+	return GetStation(station)->xy;
+}
+
+int32 AIStationListCargoWaiting::Valuate(int32 station) const
+{
+	if (!IsValidStationID(station)) return -1;
+	return GetStation(station)->goods[this->cargo_type].cargo.Count();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ai/api/ai_stationlist_valuator.hpp	Thu Jul 12 15:05:24 2007 +0000
@@ -0,0 +1,49 @@
+/* $Id$ */
+
+/** @file ai_stationlist_valuator.hpp all the valuators for stationlist */
+
+#ifndef AI_STATIONLIST_VALUATOR_HPP
+#define AI_STATIONLIST_VALUATOR_HPP
+
+#include "ai_abstractlist.hpp"
+
+/**
+ * Get the location for entries in an AIStationList instance.
+ * @note resulting items are of the type TileIndex
+ * @note the input items are of the type StationID
+ */
+class AIStationListLocation : public AIAbstractList::Valuator {
+public:
+	/**
+	 * The name of the class, needed by several sub-processes.
+	 */
+	static const char *GetClassName() { return "AIStationListGetLocation"; }
+
+private:
+	int32 Valuate(int32 station) const;
+};
+
+/**
+ * Get the cargo waiting for entries in an AIStationList instance.
+ * @note resulting items are of the type units
+ * @note the input items are of the type StationID
+ */
+class AIStationListCargoWaiting : public AIAbstractList::Valuator {
+public:
+	/**
+	 * The name of the class, needed by several sub-processes.
+	 */
+	static const char *GetClassName() { return "AIStationListCargoWaiting"; }
+
+	/**
+	 * Custom constructor, we want a cargo-type as parameter.
+	 */
+	AIStationListCargoWaiting(CargoID cargo_type) { this->cargo_type = cargo_type; }
+
+private:
+	CargoID cargo_type;
+
+	int32 Valuate(int32 station) const;
+};
+
+#endif /* AI_STATIONLIST_VALUATOR_HPP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ai/api/ai_stationlist_valuator.hpp.sq	Thu Jul 12 15:05:24 2007 +0000
@@ -0,0 +1,37 @@
+#include "ai_stationlist_valuator.hpp"
+
+namespace SQConvert {
+	/* Allow AIStationListLocation to be used as Squirrel parameter */
+	template <> AIStationListLocation *GetParam(ForceType<AIStationListLocation *>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (AIStationListLocation *)instance; }
+	template <> AIStationListLocation &GetParam(ForceType<AIStationListLocation &>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIStationListLocation *)instance; }
+	template <> const AIStationListLocation *GetParam(ForceType<const AIStationListLocation *>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (AIStationListLocation *)instance; }
+	template <> const AIStationListLocation &GetParam(ForceType<const AIStationListLocation &>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIStationListLocation *)instance; }
+}; // namespace SQConvert
+
+void SQAIStationListLocationRegister(Squirrel *engine) {
+	DefSQClass <AIStationListLocation> SQAIStationListLocation("AIStationListLocation");
+	SQAIStationListLocation.PreRegister(engine);
+	SQAIStationListLocation.AddConstructor<void (AIStationListLocation::*)(), 1>(engine, "x");
+
+	SQAIStationListLocation.DefSQStaticMethod(engine, &AIStationListLocation::GetClassName, "GetClassName", 1, "x");
+
+	SQAIStationListLocation.PostRegister(engine);
+}
+
+namespace SQConvert {
+	/* Allow AIStationListCargoWaiting to be used as Squirrel parameter */
+	template <> AIStationListCargoWaiting *GetParam(ForceType<AIStationListCargoWaiting *>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (AIStationListCargoWaiting *)instance; }
+	template <> AIStationListCargoWaiting &GetParam(ForceType<AIStationListCargoWaiting &>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIStationListCargoWaiting *)instance; }
+	template <> const AIStationListCargoWaiting *GetParam(ForceType<const AIStationListCargoWaiting *>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (AIStationListCargoWaiting *)instance; }
+	template <> const AIStationListCargoWaiting &GetParam(ForceType<const AIStationListCargoWaiting &>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIStationListCargoWaiting *)instance; }
+}; // namespace SQConvert
+
+void SQAIStationListCargoWaitingRegister(Squirrel *engine) {
+	DefSQClass <AIStationListCargoWaiting> SQAIStationListCargoWaiting("AIStationListCargoWaiting");
+	SQAIStationListCargoWaiting.PreRegister(engine);
+	SQAIStationListCargoWaiting.AddConstructor<void (AIStationListCargoWaiting::*)(CargoID cargo_type), 2>(engine, "xi");
+
+	SQAIStationListCargoWaiting.DefSQStaticMethod(engine, &AIStationListCargoWaiting::GetClassName, "GetClassName", 1, "x");
+
+	SQAIStationListCargoWaiting.PostRegister(engine);
+}