diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index ea1693feee..4f08a5ca98 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -2212,9 +2212,10 @@ CommandCost CmdIndustrySetFlags(TileIndex tile, DoCommandFlag flags, uint32 p1, * @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; @@ -2229,6 +2230,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; @@ -2245,14 +2247,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); } } @@ -2267,12 +2273,12 @@ CommandCost CmdIndustrySetProduction(DoCommandFlag flags, IndustryID ind_id, byt * @param p2 various bitstuffed elements * - p2 = (bit 0 - 7) - production level * - p2 = (bit 8) - whether to show news - * @param text unused. + * @param text custom news message. * @return the cost of this operation or an error */ CommandCost CmdIndustrySetProduction(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { - return CmdIndustrySetProduction(flags, (IndustryID)p1, GB(p2, 0, 8), HasBit(p2, 8)); + return CmdIndustrySetProduction(flags, (IndustryID)p1, GB(p2, 0, 8), HasBit(p2, 8), text != nullptr ? std::string{ text } : std::string{}); } /** diff --git a/src/news_func.h b/src/news_func.h index 3f21f3dca1..170f48ff09 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, 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 3d2274d28d..dcbaebfa1e 100644 --- a/src/script/api/script_industry.cpp +++ b/src/script/api/script_industry.cpp @@ -300,11 +300,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::DoCommand(0, industry_id, ((uint8)prod_level) | (show_news ? (1 << 8) : 0), CMD_INDUSTRY_SET_PRODUCTION); + return ScriptObject::DoCommand(0, industry_id, ((uint8)prod_level) | (show_news ? (1 << 8) : 0), CMD_INDUSTRY_SET_PRODUCTION, 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 3fcec5d8e6..74f3e91477 100644 --- a/src/script/api/script_industry.hpp +++ b/src/script/api/script_industry.hpp @@ -342,13 +342,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 */