diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp index 57b2cc2b82..6ef776b286 100644 --- a/src/ai/ai_instance.cpp +++ b/src/ai/ai_instance.cpp @@ -137,6 +137,7 @@ void AIInstance::RegisterAPI() SQAIEventExclusiveTransportRights_Register(this->engine); SQAIEventIndustryClose_Register(this->engine); SQAIEventIndustryOpen_Register(this->engine); + SQAIEventRoadReconstruction_Register(this->engine); SQAIEventStationFirstVehicle_Register(this->engine); SQAIEventSubsidyAwarded_Register(this->engine); SQAIEventSubsidyExpired_Register(this->engine); diff --git a/src/game/game_instance.cpp b/src/game/game_instance.cpp index b8aafa6147..66905912c6 100644 --- a/src/game/game_instance.cpp +++ b/src/game/game_instance.cpp @@ -132,6 +132,7 @@ void GameInstance::RegisterAPI() SQGSEventGoalQuestionAnswer_Register(this->engine); SQGSEventIndustryClose_Register(this->engine); SQGSEventIndustryOpen_Register(this->engine); + SQGSEventRoadReconstruction_Register(this->engine); SQGSEventStationFirstVehicle_Register(this->engine); SQGSEventSubsidyAwarded_Register(this->engine); SQGSEventSubsidyExpired_Register(this->engine); diff --git a/src/script/api/ai/ai_event.hpp.sq b/src/script/api/ai/ai_event.hpp.sq index 6eb6de5bae..75098625a3 100644 --- a/src/script/api/ai/ai_event.hpp.sq +++ b/src/script/api/ai/ai_event.hpp.sq @@ -49,6 +49,7 @@ void SQAIEvent_Register(Squirrel *engine) SQAIEvent.DefSQConst(engine, ScriptEvent::ET_WINDOW_WIDGET_CLICK, "ET_WINDOW_WIDGET_CLICK"); SQAIEvent.DefSQConst(engine, ScriptEvent::ET_GOAL_QUESTION_ANSWER, "ET_GOAL_QUESTION_ANSWER"); SQAIEvent.DefSQConst(engine, ScriptEvent::ET_EXCLUSIVE_TRANSPORT_RIGHTS, "ET_EXCLUSIVE_TRANSPORT_RIGHTS"); + SQAIEvent.DefSQConst(engine, ScriptEvent::ET_ROAD_RECONSTRUCTION, "ET_ROAD_RECONSTRUCTION"); SQAIEvent.DefSQMethod(engine, &ScriptEvent::GetEventType, "GetEventType", 1, "x"); diff --git a/src/script/api/ai/ai_event_types.hpp.sq b/src/script/api/ai/ai_event_types.hpp.sq index 3cc9361156..f3468d14ba 100644 --- a/src/script/api/ai/ai_event_types.hpp.sq +++ b/src/script/api/ai/ai_event_types.hpp.sq @@ -391,3 +391,17 @@ void SQAIEventExclusiveTransportRights_Register(Squirrel *engine) SQAIEventExclusiveTransportRights.PostRegister(engine); } + + +template <> const char *GetClassName() { return "AIEventRoadReconstruction"; } + +void SQAIEventRoadReconstruction_Register(Squirrel *engine) +{ + DefSQClass SQAIEventRoadReconstruction("AIEventRoadReconstruction"); + SQAIEventRoadReconstruction.PreRegister(engine, "AIEventCompanyTown"); + SQAIEventRoadReconstruction.AddConstructor(engine, "xii"); + + SQAIEventRoadReconstruction.DefSQStaticMethod(engine, &ScriptEventRoadReconstruction::Convert, "Convert", 2, ".x"); + + SQAIEventRoadReconstruction.PostRegister(engine); +} diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index 6ad6c5c3cc..13f42928b8 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -21,6 +21,7 @@ * * API additions: * \li AIEventExclusiveTransportRights + * \li AIEventRoadReconstruction * \li AIStation::IsAirportClosed * \li AIStation::OpenCloseAirport * diff --git a/src/script/api/game/game_event.hpp.sq b/src/script/api/game/game_event.hpp.sq index 6ac7856724..53b9b2ce9e 100644 --- a/src/script/api/game/game_event.hpp.sq +++ b/src/script/api/game/game_event.hpp.sq @@ -49,6 +49,7 @@ void SQGSEvent_Register(Squirrel *engine) SQGSEvent.DefSQConst(engine, ScriptEvent::ET_WINDOW_WIDGET_CLICK, "ET_WINDOW_WIDGET_CLICK"); SQGSEvent.DefSQConst(engine, ScriptEvent::ET_GOAL_QUESTION_ANSWER, "ET_GOAL_QUESTION_ANSWER"); SQGSEvent.DefSQConst(engine, ScriptEvent::ET_EXCLUSIVE_TRANSPORT_RIGHTS, "ET_EXCLUSIVE_TRANSPORT_RIGHTS"); + SQGSEvent.DefSQConst(engine, ScriptEvent::ET_ROAD_RECONSTRUCTION, "ET_ROAD_RECONSTRUCTION"); SQGSEvent.DefSQMethod(engine, &ScriptEvent::GetEventType, "GetEventType", 1, "x"); diff --git a/src/script/api/game/game_event_types.hpp.sq b/src/script/api/game/game_event_types.hpp.sq index 3a97a7d7e1..56acdd30fd 100644 --- a/src/script/api/game/game_event_types.hpp.sq +++ b/src/script/api/game/game_event_types.hpp.sq @@ -296,3 +296,17 @@ void SQGSEventExclusiveTransportRights_Register(Squirrel *engine) SQGSEventExclusiveTransportRights.PostRegister(engine); } + + +template <> const char *GetClassName() { return "GSEventRoadReconstruction"; } + +void SQGSEventRoadReconstruction_Register(Squirrel *engine) +{ + DefSQClass SQGSEventRoadReconstruction("GSEventRoadReconstruction"); + SQGSEventRoadReconstruction.PreRegister(engine, "GSEventCompanyTown"); + SQGSEventRoadReconstruction.AddConstructor(engine, "xii"); + + SQGSEventRoadReconstruction.DefSQStaticMethod(engine, &ScriptEventRoadReconstruction::Convert, "Convert", 2, ".x"); + + SQGSEventRoadReconstruction.PostRegister(engine); +} diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 573e396b8c..60ac30d2ff 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -21,6 +21,7 @@ * * API additions: * \li GSEventExclusiveTransportRights + * \li GSEventRoadReconstruction * \li GSNews::NT_ACCIDENT, GSNews::NT_COMPANY_INFO, GSNews::NT_ADVICE, GSNews::NT_ACCEPTANCE * \li GSStation::IsAirportClosed * \li GSStation::OpenCloseAirport diff --git a/src/script/api/script_event.hpp b/src/script/api/script_event.hpp index a7b55ef578..b2dddebd67 100644 --- a/src/script/api/script_event.hpp +++ b/src/script/api/script_event.hpp @@ -54,6 +54,7 @@ public: ET_WINDOW_WIDGET_CLICK, ET_GOAL_QUESTION_ANSWER, ET_EXCLUSIVE_TRANSPORT_RIGHTS, + ET_ROAD_RECONSTRUCTION, }; /** diff --git a/src/script/api/script_event_types.hpp b/src/script/api/script_event_types.hpp index 6a4786f163..f7b58c5cef 100644 --- a/src/script/api/script_event_types.hpp +++ b/src/script/api/script_event_types.hpp @@ -1044,5 +1044,27 @@ public: static ScriptEventExclusiveTransportRights *Convert(ScriptEventCompanyTown *instance) { return (ScriptEventExclusiveTransportRights *)instance; } }; +/** + * Event Road Reconstruction, indicating that company triggered + * road reconstructions in a town. + * @api ai game + */ +class ScriptEventRoadReconstruction : public ScriptEventCompanyTown { +public: + /** + * @param company The company. + * @param town The town. + */ + ScriptEventRoadReconstruction(ScriptCompany::CompanyID company, TownID town) : + ScriptEventCompanyTown(ET_ROAD_RECONSTRUCTION, company, town) + {} + + /** + * Convert an ScriptEvent to the real instance. + * @param instance The instance to convert. + * @return The converted instance. + */ + static ScriptEventRoadReconstruction *Convert(ScriptEventCompanyTown *instance) { return (ScriptEventRoadReconstruction *)instance; } +}; #endif /* SCRIPT_EVENT_TYPES_HPP */ diff --git a/src/script/api/template/template_event_types.hpp.sq b/src/script/api/template/template_event_types.hpp.sq index 2837ebde82..eb6d1f1b42 100644 --- a/src/script/api/template/template_event_types.hpp.sq +++ b/src/script/api/template/template_event_types.hpp.sq @@ -257,3 +257,12 @@ namespace SQConvert { template <> inline const ScriptEventExclusiveTransportRights &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(ScriptEventExclusiveTransportRights *)instance; } template <> inline int Return(HSQUIRRELVM vm, ScriptEventExclusiveTransportRights *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "EventExclusiveTransportRights", res, NULL, DefSQDestructorCallback, true); return 1; } } // namespace SQConvert + +namespace SQConvert { + /* Allow ScriptEventRoadReconstruction to be used as Squirrel parameter */ + template <> inline ScriptEventRoadReconstruction *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptEventRoadReconstruction *)instance; } + template <> inline ScriptEventRoadReconstruction &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(ScriptEventRoadReconstruction *)instance; } + template <> inline const ScriptEventRoadReconstruction *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (ScriptEventRoadReconstruction *)instance; } + template <> inline const ScriptEventRoadReconstruction &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(ScriptEventRoadReconstruction *)instance; } + template <> inline int Return(HSQUIRRELVM vm, ScriptEventRoadReconstruction *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "EventRoadReconstruction", res, NULL, DefSQDestructorCallback, true); return 1; } +} // namespace SQConvert diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 59dee9e6e4..6c37ccae15 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -2701,6 +2701,8 @@ static CommandCost TownActionRoadRebuild(Town *t, DoCommandFlag flags) SetDParamStr(1, cn); AddNewsItem(STR_NEWS_ROAD_REBUILDING, NT_GENERAL, NF_NORMAL, NR_TOWN, t->index, NR_NONE, UINT32_MAX, cn); + AI::BroadcastNewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index)); + Game::NewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index)); } return CommandCost(); }