(svn r10527) [NoAI] -Add: AIStationList(), which lists all your stations; useful to maintain routes
--- 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);
+}