Fix crash which could occur when adding/updating text effects

When DParam 0 or 1 contained a leftover string

See: #612
pull/615/head
Jonathan G Rennison 6 months ago
parent c929f7075e
commit b80e2dff19

@ -620,8 +620,7 @@ void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost)
cost = -cost;
msg = STR_INCOME_FLOAT_INCOME;
}
SetDParam(0, cost);
AddTextEffect(msg, pt.x, pt.y, DAY_TICKS, TE_RISING);
AddTextEffect(msg, pt.x, pt.y, DAY_TICKS, TE_RISING, cost);
}
/**
@ -638,17 +637,15 @@ void ShowFeederIncomeAnimation(int x, int y, int z, Money transfer, Money income
Point pt = RemapCoords(x, y, z);
SetDParam(0, transfer);
if (income == 0) {
AddTextEffect(STR_FEEDER, pt.x, pt.y, DAY_TICKS, TE_RISING);
AddTextEffect(STR_FEEDER, pt.x, pt.y, DAY_TICKS, TE_RISING, transfer);
} else {
StringID msg = STR_FEEDER_COST;
if (income < 0) {
income = -income;
msg = STR_FEEDER_INCOME;
}
SetDParam(1, income);
AddTextEffect(msg, pt.x, pt.y, DAY_TICKS, TE_RISING);
AddTextEffect(msg, pt.x, pt.y, DAY_TICKS, TE_RISING, transfer, income);
}
}
@ -667,8 +664,7 @@ TextEffectID ShowFillingPercent(int x, int y, int z, uint8 percent, StringID str
assert(string != STR_NULL);
SetDParam(0, percent);
return AddTextEffect(string, pt.x, pt.y, 0, TE_STATIC);
return AddTextEffect(string, pt.x, pt.y, 0, TE_STATIC, percent);
}
/**
@ -680,8 +676,7 @@ void UpdateFillingPercent(TextEffectID te_id, uint8 percent, StringID string)
{
assert(string != STR_NULL);
SetDParam(0, percent);
UpdateTextEffect(te_id, string);
UpdateTextEffect(te_id, string, percent);
}
/**

@ -42,7 +42,7 @@ struct TextEffect : public ViewportSign {
};
/* Text Effects */
TextEffectID AddTextEffect(StringID msg, int center, int y, uint8 duration, TextEffectMode mode)
TextEffectID AddTextEffect(StringID msg, int center, int y, uint8 duration, TextEffectMode mode, uint64 param1, uint64 param2)
{
if (_game_mode == GM_MENU) return INVALID_TE_ID;
@ -59,26 +59,30 @@ TextEffectID AddTextEffect(StringID msg, int center, int y, uint8 duration, Text
/* Start defining this object */
te.string_id = msg;
te.duration = duration;
te.params_1 = GetDParam(0);
te.params_2 = GetDParam(1);
te.params_1 = param1;
te.params_2 = param2;
te.mode = mode;
/* Make sure we only dirty the new area */
te.width_normal = 0;
SetDParam(0, param1);
SetDParam(1, param2);
te.UpdatePosition(ZOOM_LVL_OUT_8X, center, y, msg);
return i;
}
void UpdateTextEffect(TextEffectID te_id, StringID msg)
void UpdateTextEffect(TextEffectID te_id, StringID msg, uint64 param1, uint64 param2)
{
/* Update details */
TextEffect *te = _text_effects.data() + te_id;
if (msg == te->string_id && GetDParam(0) == te->params_1) return;
if (msg == te->string_id && param1 == te->params_1) return;
te->string_id = msg;
te->params_1 = GetDParam(0);
te->params_2 = GetDParam(1);
te->params_1 = param1;
te->params_2 = param2;
SetDParam(0, param1);
SetDParam(1, param2);
te->UpdatePosition(ZOOM_LVL_OUT_8X, te->center, te->top, te->string_id, te->string_id - 1);
}

@ -29,10 +29,10 @@ using TextEffectID = uint16_t;
static const TextEffectID INVALID_TE_ID = UINT16_MAX;
void MoveAllTextEffects(uint delta_ms);
TextEffectID AddTextEffect(StringID msg, int x, int y, uint8 duration, TextEffectMode mode);
TextEffectID AddTextEffect(StringID msg, int x, int y, uint8 duration, TextEffectMode mode, uint64 param1 = 0, uint64 param2 = 0);
void InitTextEffects();
void DrawTextEffects(ViewportDrawerDynamic *vdd, DrawPixelInfo *dpi, bool load_transparent);
void UpdateTextEffect(TextEffectID effect_id, StringID msg);
void UpdateTextEffect(TextEffectID effect_id, StringID msg, uint64 param1 = 0, uint64 param2 = 0);
void RemoveTextEffect(TextEffectID effect_id);
void UpdateAllTextEffectVirtCoords();

Loading…
Cancel
Save