From 0089323542bc60d3b3f7b1f627a3d6c0f886d103 Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Sun, 6 Aug 2023 16:05:04 +0200 Subject: [PATCH] Add: [Script] Custom news message text for industry SetProductionLevel. --- src/industry_cmd.cpp | 12 +++++++++--- src/industry_cmd.h | 2 +- src/news_func.h | 4 ++-- src/script/api/script_industry.cpp | 6 ++++-- src/script/api/script_industry.hpp | 3 ++- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 3dfa7405f3..a45b3f581b 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -2123,9 +2123,10 @@ CommandCost CmdIndustrySetFlags(DoCommandFlag flags, IndustryID ind_id, Industry * @param ind_id IndustryID * @param prod_level Production level. * @param show_news Show a news message on production change. + * @param custom_news Custom news message text. * @return Empty cost or an error. */ -CommandCost CmdIndustrySetProduction(DoCommandFlag flags, IndustryID ind_id, byte prod_level, bool show_news) +CommandCost CmdIndustrySetProduction(DoCommandFlag flags, IndustryID ind_id, byte prod_level, bool show_news, const std::string &custom_news) { if (_current_company != OWNER_DEITY) return CMD_ERROR; if (prod_level < PRODLEVEL_MINIMUM || prod_level > PRODLEVEL_MAXIMUM) return CMD_ERROR; @@ -2140,6 +2141,7 @@ CommandCost CmdIndustrySetProduction(DoCommandFlag flags, IndustryID ind_id, byt } else if (prod_level < ind->prod_level) { str = GetIndustrySpec(ind->type)->production_down_text; } + if (prod_level != ind->prod_level && !custom_news.empty()) str = STR_NEWS_CUSTOM_ITEM; ind->ctlflags |= INDCTL_EXTERNAL_PROD_LEVEL; ind->prod_level = prod_level; @@ -2156,14 +2158,18 @@ CommandCost CmdIndustrySetProduction(DoCommandFlag flags, IndustryID ind_id, byt } /* Set parameters of news string */ - if (str > STR_LAST_STRINGID) { + NewsAllocatedData *data = nullptr; + if (str == STR_NEWS_CUSTOM_ITEM) { + NewsStringData *news = new NewsStringData(custom_news); + SetDParamStr(0, news->string); + } else if (str > STR_LAST_STRINGID) { SetDParam(0, STR_TOWN_NAME); SetDParam(1, ind->town->index); SetDParam(2, GetIndustrySpec(ind->type)->name); } else { SetDParam(0, ind->index); } - AddIndustryNewsItem(str, nt, ind->index); + AddIndustryNewsItem(str, nt, ind->index, data); } } diff --git a/src/industry_cmd.h b/src/industry_cmd.h index eed708b2bd..955ca68628 100644 --- a/src/industry_cmd.h +++ b/src/industry_cmd.h @@ -20,7 +20,7 @@ CommandCost CmdBuildIndustry(DoCommandFlag flags, TileIndex tile, IndustryType i CommandCost CmdIndustrySetFlags(DoCommandFlag flags, IndustryID ind_id, IndustryControlFlags ctlflags); CommandCost CmdIndustrySetExclusivity(DoCommandFlag flags, IndustryID ind_id, Owner company_id, bool consumer); CommandCost CmdIndustrySetText(DoCommandFlag flags, IndustryID ind_id, const std::string &text); -CommandCost CmdIndustrySetProduction(DoCommandFlag flags, IndustryID ind_id, byte prod_level, bool show_news); +CommandCost CmdIndustrySetProduction(DoCommandFlag flags, IndustryID ind_id, byte prod_level, bool show_news, const std::string &text); DEF_CMD_TRAIT(CMD_BUILD_INDUSTRY, CmdBuildIndustry, CMD_DEITY, CMDT_LANDSCAPE_CONSTRUCTION) DEF_CMD_TRAIT(CMD_INDUSTRY_SET_FLAGS, CmdIndustrySetFlags, CMD_DEITY, CMDT_OTHER_MANAGEMENT) diff --git a/src/news_func.h b/src/news_func.h index 466f4befec..941e6b54c9 100644 --- a/src/news_func.h +++ b/src/news_func.h @@ -47,9 +47,9 @@ static inline void AddTileNewsItem(StringID string, NewsType type, TileIndex til AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_TILE, static_cast(tile), station == INVALID_STATION ? NR_NONE : NR_STATION, station, data); } -static inline void AddIndustryNewsItem(StringID string, NewsType type, IndustryID industry) +static inline void AddIndustryNewsItem(StringID string, NewsType type, IndustryID industry, const NewsAllocatedData *data = nullptr) { - AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_INDUSTRY, industry); + AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_INDUSTRY, industry, NR_NONE, UINT32_MAX, data); } void NewsLoop(); diff --git a/src/script/api/script_industry.cpp b/src/script/api/script_industry.cpp index a39d3328d1..3196e9c698 100644 --- a/src/script/api/script_industry.cpp +++ b/src/script/api/script_industry.cpp @@ -302,11 +302,13 @@ return i->prod_level; } -/* static */ bool ScriptIndustry::SetProductionLevel(IndustryID industry_id, SQInteger prod_level, bool show_news) +/* static */ bool ScriptIndustry::SetProductionLevel(IndustryID industry_id, SQInteger prod_level, bool show_news, Text *custom_news) { + CCountedPtr counter(custom_news); + EnforceDeityMode(false); EnforcePrecondition(false, IsValidIndustry(industry_id)); EnforcePrecondition(false, prod_level >= PRODLEVEL_MINIMUM && prod_level <= PRODLEVEL_MAXIMUM); - return ScriptObject::Command::Do(industry_id, prod_level, show_news); + return ScriptObject::Command::Do(industry_id, prod_level, show_news, custom_news != nullptr ? custom_news->GetEncodedText() : std::string{}); } diff --git a/src/script/api/script_industry.hpp b/src/script/api/script_industry.hpp index 531c978f8f..bedb3504d1 100644 --- a/src/script/api/script_industry.hpp +++ b/src/script/api/script_industry.hpp @@ -341,13 +341,14 @@ public: * @param industry_id The index of the industry. * @param prod_level The production level to set. * @param show_news If set to true and the production changed, generate a production change news message. If set to false, no news message is shown. + * @param custom_news Custom news message text to override the default news text with. Pass null to use the default text. Only used if \c show_news is set to true. * @pre IsValidIndustry(industry_id). * @pre ScriptCompanyMode::IsDeity(). * @pre prod_level >= 4 && prod_level <= 128. * @return True if the action succeeded. * @api -ai */ - static bool SetProductionLevel(IndustryID industry_id, SQInteger prod_level, bool show_news); + static bool SetProductionLevel(IndustryID industry_id, SQInteger prod_level, bool show_news, Text *custom_news); }; #endif /* SCRIPT_INDUSTRY_HPP */