# HG changeset patch # User truebrain # Date 1212933395 0 # Node ID 9a6616a1dce6e1df7934cec2917e74450ab7f8fe # Parent 7b31d67e155312186b6822d86f3fbd6806a06c62 (svn r13415) [NoAI] -Add: added AITileList_StationType, giving all the tiles on which a station of your requested type is, for a given station diff -r 7b31d67e1553 -r 9a6616a1dce6 bin/ai/regression/regression.nut --- a/bin/ai/regression/regression.nut Sun Jun 08 12:45:11 2008 +0000 +++ b/bin/ai/regression/regression.nut Sun Jun 08 13:56:35 2008 +0000 @@ -980,6 +980,15 @@ for (local i = list.Begin(); list.HasNext(); i = list.Next()) { print(" " + i + " => " + list.GetValue(i)); } + + local list = AITileList_StationType(3, AIStation.STATION_BUS_STOP); + print(""); + print("--TileList_StationType--"); + print(" Count(): " + list.Count()); + print(" Location ListDump:"); + for (local i = list.Begin(); list.HasNext(); i = list.Next()) { + print(" " + i + " => " + list.GetValue(i)); + } } function Regression::Town() diff -r 7b31d67e1553 -r 9a6616a1dce6 bin/ai/regression/regression.txt --- a/bin/ai/regression/regression.txt Sun Jun 08 12:45:11 2008 +0000 +++ b/bin/ai/regression/regression.txt Sun Jun 08 13:56:35 2008 +0000 @@ -6295,6 +6295,14 @@ 44360 => 1 44351 => 1 +--TileList_StationType-- + Count(): 4 + Location ListDump: + 33668 => 0 + 33416 => 0 + 33414 => 0 + 33412 => 0 + --Town-- GetMaxTownID(): 31 GetTownCount(): 28 diff -r 7b31d67e1553 -r 9a6616a1dce6 src/ai/api/ai_controller.cpp --- a/src/ai/api/ai_controller.cpp Sun Jun 08 12:45:11 2008 +0000 +++ b/src/ai/api/ai_controller.cpp Sun Jun 08 13:56:35 2008 +0000 @@ -129,6 +129,7 @@ SQAITileList_Register(this->engine); SQAITileList_IndustryAccepting_Register(this->engine); SQAITileList_IndustryProducing_Register(this->engine); + SQAITileList_StationType_Register(this->engine); SQAITown_Register(this->engine); SQAITownList_Register(this->engine); SQAITransactionMode_Register(this->engine); diff -r 7b31d67e1553 -r 9a6616a1dce6 src/ai/api/ai_tilelist.cpp --- a/src/ai/api/ai_tilelist.cpp Sun Jun 08 12:45:11 2008 +0000 +++ b/src/ai/api/ai_tilelist.cpp Sun Jun 08 13:56:35 2008 +0000 @@ -11,6 +11,8 @@ #include "../../map_func.h" #include "../../tile_map.h" #include "../../industry_map.h" +#include "../../station_base.h" +#include "../../station_map.h" void AITileList::FixRectangleSpan(TileIndex &t1, TileIndex &t2) { @@ -148,3 +150,18 @@ this->AddTile(cur_tile); } END_TILE_LOOP(cur_tile, i->width + radius * 2, i->height + radius * 2, i->xy - ::TileDiffXY(radius, radius)) } + +AITileList_StationType::AITileList_StationType(StationID station_id, AIStation::StationType station_type) +{ + if (!AIStation::IsValidStation(station_id)) return; + + const StationRect *rect = &::GetStation(station_id)->rect; + int station_type_value = ::FindFirstBit(station_type); + + BEGIN_TILE_LOOP(cur_tile, rect->right - rect->left + 1, rect->bottom - rect->top + 1, ::TileXY(rect->left, rect->top)) { + if (!::IsTileType(cur_tile, MP_STATION)) continue; + if (::GetStationIndex(cur_tile) != station_id) continue; + if (::GetStationType(cur_tile) != station_type_value) continue; + this->AddTile(cur_tile); + } END_TILE_LOOP(cur_tile, rect->right - rect->left + 1, rect->bottom - rect->top + 1, ::TileXY(rect->left, rect->top)) +} diff -r 7b31d67e1553 -r 9a6616a1dce6 src/ai/api/ai_tilelist.hpp --- a/src/ai/api/ai_tilelist.hpp Sun Jun 08 12:45:11 2008 +0000 +++ b/src/ai/api/ai_tilelist.hpp Sun Jun 08 13:56:35 2008 +0000 @@ -6,6 +6,7 @@ #define AI_TILELIST_HPP #include "ai_abstractlist.hpp" +#include "ai_station.hpp" /** * Creates an empty list, in which you can add tiles. @@ -90,4 +91,20 @@ AITileList_IndustryProducing(IndustryID industry_id, uint radius); }; +/** + * Creates a list of tiles which have the requested StationType of the + * StationID. + * @ingroup AIList + */ +class AITileList_StationType : public AITileList { +public: + static const char *GetClassName() { return "AITileList_StationType"; } + + /** + * @param station_id The station to create the AITileList for. + * @param station_type The StationType to create the AIList for. + */ + AITileList_StationType(StationID station_id, AIStation::StationType station_type); +}; + #endif /* AI_TILELIST_HPP */ diff -r 7b31d67e1553 -r 9a6616a1dce6 src/ai/api/ai_tilelist.hpp.sq --- a/src/ai/api/ai_tilelist.hpp.sq Sun Jun 08 12:45:11 2008 +0000 +++ b/src/ai/api/ai_tilelist.hpp.sq Sun Jun 08 13:56:35 2008 +0000 @@ -64,3 +64,22 @@ SQAITileList_IndustryProducing.PostRegister(engine); } + +namespace SQConvert { + /* Allow AITileList_StationType to be used as Squirrel parameter */ + template <> AITileList_StationType *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AITileList_StationType *)instance; } + template <> AITileList_StationType &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AITileList_StationType *)instance; } + template <> const AITileList_StationType *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AITileList_StationType *)instance; } + template <> const AITileList_StationType &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AITileList_StationType *)instance; } + template <> int Return(HSQUIRRELVM vm, AITileList_StationType *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "AITileList_StationType", res, NULL, DefSQDestructorCallback); return 1; } +}; // namespace SQConvert + +void SQAITileList_StationType_Register(Squirrel *engine) { + DefSQClass SQAITileList_StationType("AITileList_StationType"); + SQAITileList_StationType.PreRegister(engine, "AITileList"); + SQAITileList_StationType.AddConstructor(engine, "xii"); + + SQAITileList_StationType.DefSQStaticMethod(engine, &AITileList_StationType::GetClassName, "GetClassName", 1, "x"); + + SQAITileList_StationType.PostRegister(engine); +}