changeset 16929:9345826dd1fd draft

(svn r21664) -Add: [NoAI] AIEventTownFounded
author yexo <yexo@openttd.org>
date Wed, 29 Dec 2010 23:44:39 +0000
parents 32a83472793d
children 952c845458a3
files src/ai/ai_instance.cpp src/ai/api/ai_event.hpp src/ai/api/ai_event.hpp.sq src/ai/api/ai_event_types.hpp src/ai/api/ai_event_types.hpp.sq src/town_cmd.cpp
diffstat 6 files changed, 59 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/ai/ai_instance.cpp
+++ b/src/ai/ai_instance.cpp
@@ -209,6 +209,7 @@
 	SQAIEventSubsidyExpired_Register(this->engine);
 	SQAIEventSubsidyOffer_Register(this->engine);
 	SQAIEventSubsidyOfferExpired_Register(this->engine);
+	SQAIEventTownFounded_Register(this->engine);
 	SQAIEventVehicleCrashed_Register(this->engine);
 	SQAIEventVehicleLost_Register(this->engine);
 	SQAIEventVehicleUnprofitable_Register(this->engine);
--- a/src/ai/api/ai_event.hpp
+++ b/src/ai/api/ai_event.hpp
@@ -50,6 +50,7 @@
 		AI_ET_STATION_FIRST_VEHICLE,
 		AI_ET_DISASTER_ZEPPELINER_CRASHED,
 		AI_ET_DISASTER_ZEPPELINER_CLEARED,
+		AI_ET_TOWN_FOUNDED,
 	};
 
 	/**
--- a/src/ai/api/ai_event.hpp.sq
+++ b/src/ai/api/ai_event.hpp.sq
@@ -52,6 +52,7 @@
 	SQAIEvent.DefSQConst(engine, AIEvent::AI_ET_STATION_FIRST_VEHICLE,       "AI_ET_STATION_FIRST_VEHICLE");
 	SQAIEvent.DefSQConst(engine, AIEvent::AI_ET_DISASTER_ZEPPELINER_CRASHED, "AI_ET_DISASTER_ZEPPELINER_CRASHED");
 	SQAIEvent.DefSQConst(engine, AIEvent::AI_ET_DISASTER_ZEPPELINER_CLEARED, "AI_ET_DISASTER_ZEPPELINER_CLEARED");
+	SQAIEvent.DefSQConst(engine, AIEvent::AI_ET_TOWN_FOUNDED,                "AI_ET_TOWN_FOUNDED");
 
 	SQAIEvent.DefSQMethod(engine, &AIEvent::GetEventType, "GetEventType", 1, "x");
 
--- a/src/ai/api/ai_event_types.hpp
+++ b/src/ai/api/ai_event_types.hpp
@@ -800,4 +800,37 @@
 	StationID station;
 };
 
+/**
+ * Event Town Founded, indicating a new town has been created.
+ */
+class AIEventTownFounded : public AIEvent {
+public:
+	/** Get the name of this class to identify it towards squirrel. */
+	static const char *GetClassName() { return "AIEventTownFounded"; }
+
+	/**
+	 * @param town The town that was created.
+	 */
+	AIEventTownFounded(TownID town) :
+		AIEvent(AI_ET_TOWN_FOUNDED),
+		town(town)
+	{}
+
+	/**
+	 * Convert an AIEvent to the real instance.
+	 * @param instance The instance to convert.
+	 * @return The converted instance.
+	 */
+	static AIEventTownFounded *Convert(AIEvent *instance) { return (AIEventTownFounded *)instance; }
+
+	/**
+	 * Get the TownID of the town.
+	 * @return The TownID of the town that was created.
+	 */
+	TownID GetTownID() { return this->town; }
+
+private:
+	TownID town;
+};
+
 #endif /* AI_EVENT_TYPES_HPP */
--- a/src/ai/api/ai_event_types.hpp.sq
+++ b/src/ai/api/ai_event_types.hpp.sq
@@ -454,3 +454,24 @@
 
 	SQAIEventDisasterZeppelinerCleared.PostRegister(engine);
 }
+
+namespace SQConvert {
+	/* Allow AIEventTownFounded to be used as Squirrel parameter */
+	template <> AIEventTownFounded *GetParam(ForceType<AIEventTownFounded *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (AIEventTownFounded *)instance; }
+	template <> AIEventTownFounded &GetParam(ForceType<AIEventTownFounded &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIEventTownFounded *)instance; }
+	template <> const AIEventTownFounded *GetParam(ForceType<const AIEventTownFounded *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (AIEventTownFounded *)instance; }
+	template <> const AIEventTownFounded &GetParam(ForceType<const AIEventTownFounded &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIEventTownFounded *)instance; }
+	template <> int Return<AIEventTownFounded *>(HSQUIRRELVM vm, AIEventTownFounded *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "AIEventTownFounded", res, NULL, DefSQDestructorCallback<AIEventTownFounded>); return 1; }
+} // namespace SQConvert
+
+void SQAIEventTownFounded_Register(Squirrel *engine)
+{
+	DefSQClass <AIEventTownFounded> SQAIEventTownFounded("AIEventTownFounded");
+	SQAIEventTownFounded.PreRegister(engine, "AIEvent");
+
+	SQAIEventTownFounded.DefSQStaticMethod(engine, &AIEventTownFounded::Convert, "Convert", 2, ".x");
+
+	SQAIEventTownFounded.DefSQMethod(engine, &AIEventTownFounded::GetTownID, "GetTownID", 1, "x");
+
+	SQAIEventTownFounded.PostRegister(engine);
+}
--- a/src/town_cmd.cpp
+++ b/src/town_cmd.cpp
@@ -47,6 +47,7 @@
 #include "depot_base.h"
 #include "object_map.h"
 #include "object_base.h"
+#include "ai/ai.hpp"
 
 #include "table/strings.h"
 #include "table/town_land.h"
@@ -1605,6 +1606,7 @@
 			SetDParam(1, t->index);
 
 			AddNewsItem(STR_NEWS_NEW_TOWN, NS_INDUSTRY_OPEN, NR_TILE, tile, NR_NONE, UINT32_MAX, cn);
+			AI::BroadcastNewEvent(new AIEventTownFounded(t->index));
 		}
 	}
 	return cost;