Add: [Script] Custom news message text for industry SetProductionLevel.

(cherry picked from commit 0089323542)
This commit is contained in:
Michael Lutz
2023-08-06 16:05:04 +02:00
committed by Jonathan G Rennison
parent 4c6ed36b6a
commit fb6d85dbe5
4 changed files with 19 additions and 10 deletions

View File

@@ -2212,9 +2212,10 @@ CommandCost CmdIndustrySetFlags(TileIndex tile, DoCommandFlag flags, uint32 p1,
* @param ind_id IndustryID * @param ind_id IndustryID
* @param prod_level Production level. * @param prod_level Production level.
* @param show_news Show a news message on production change. * @param show_news Show a news message on production change.
* @param custom_news Custom news message text.
* @return Empty cost or an error. * @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 (_current_company != OWNER_DEITY) return CMD_ERROR;
if (prod_level < PRODLEVEL_MINIMUM || prod_level > PRODLEVEL_MAXIMUM) 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) { } else if (prod_level < ind->prod_level) {
str = GetIndustrySpec(ind->type)->production_down_text; 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->ctlflags |= INDCTL_EXTERNAL_PROD_LEVEL;
ind->prod_level = prod_level; ind->prod_level = prod_level;
@@ -2245,14 +2247,18 @@ CommandCost CmdIndustrySetProduction(DoCommandFlag flags, IndustryID ind_id, byt
} }
/* Set parameters of news string */ /* 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(0, STR_TOWN_NAME);
SetDParam(1, ind->town->index); SetDParam(1, ind->town->index);
SetDParam(2, GetIndustrySpec(ind->type)->name); SetDParam(2, GetIndustrySpec(ind->type)->name);
} else { } else {
SetDParam(0, ind->index); 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 * @param p2 various bitstuffed elements
* - p2 = (bit 0 - 7) - production level * - p2 = (bit 0 - 7) - production level
* - p2 = (bit 8) - whether to show news * - p2 = (bit 8) - whether to show news
* @param text unused. * @param text custom news message.
* @return the cost of this operation or an error * @return the cost of this operation or an error
*/ */
CommandCost CmdIndustrySetProduction(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) 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{});
} }
/** /**

View File

@@ -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); 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(); void NewsLoop();

View File

@@ -300,11 +300,13 @@
return i->prod_level; 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<Text> counter(custom_news);
EnforceDeityMode(false); EnforceDeityMode(false);
EnforcePrecondition(false, IsValidIndustry(industry_id)); EnforcePrecondition(false, IsValidIndustry(industry_id));
EnforcePrecondition(false, prod_level >= PRODLEVEL_MINIMUM && prod_level <= PRODLEVEL_MAXIMUM); 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{});
} }

View File

@@ -342,13 +342,14 @@ public:
* @param industry_id The index of the industry. * @param industry_id The index of the industry.
* @param prod_level The production level to set. * @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 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 IsValidIndustry(industry_id).
* @pre ScriptCompanyMode::IsDeity(). * @pre ScriptCompanyMode::IsDeity().
* @pre prod_level >= 4 && prod_level <= 128. * @pre prod_level >= 4 && prod_level <= 128.
* @return True if the action succeeded. * @return True if the action succeeded.
* @api -ai * @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 */ #endif /* SCRIPT_INDUSTRY_HPP */