Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #include "stdafx.h"
00013 #include "texteff.hpp"
00014 #include "transparency.h"
00015 #include "strings_func.h"
00016 #include "core/smallvec_type.hpp"
00017 #include "viewport_func.h"
00018 #include "settings_type.h"
00019
00021 struct TextEffect : public ViewportSign {
00022 uint64 params_1;
00023 StringID string_id;
00024 uint8 duration;
00025 TextEffectMode mode;
00026
00028 void Reset()
00029 {
00030 this->MarkDirty();
00031 this->width_normal = 0;
00032 this->string_id = INVALID_STRING_ID;
00033 }
00034 };
00035
00036 static SmallVector<struct TextEffect, 32> _text_effects;
00037
00038
00039 TextEffectID AddTextEffect(StringID msg, int center, int y, uint8 duration, TextEffectMode mode)
00040 {
00041 if (_game_mode == GM_MENU) return INVALID_TE_ID;
00042
00043 TextEffectID i;
00044 for (i = 0; i < _text_effects.Length(); i++) {
00045 if (_text_effects[i].string_id == INVALID_STRING_ID) break;
00046 }
00047 if (i == _text_effects.Length()) _text_effects.Append();
00048
00049 TextEffect *te = _text_effects.Get(i);
00050
00051
00052 te->string_id = msg;
00053 te->duration = duration;
00054 te->params_1 = GetDParam(0);
00055 te->mode = mode;
00056
00057
00058 te->width_normal = 0;
00059 te->UpdatePosition(center, y, msg);
00060
00061 return i;
00062 }
00063
00064 void UpdateTextEffect(TextEffectID te_id, StringID msg)
00065 {
00066
00067 TextEffect *te = _text_effects.Get(te_id);
00068 te->string_id = msg;
00069 te->params_1 = GetDParam(0);
00070
00071 te->UpdatePosition(te->center, te->top, msg);
00072 }
00073
00074 void RemoveTextEffect(TextEffectID te_id)
00075 {
00076 _text_effects[te_id].Reset();
00077 }
00078
00079 void MoveAllTextEffects()
00080 {
00081 const TextEffect *end = _text_effects.End();
00082 for (TextEffect *te = _text_effects.Begin(); te != end; te++) {
00083 if (te->string_id == INVALID_STRING_ID) continue;
00084 if (te->mode != TE_RISING) continue;
00085
00086 if (te->duration-- == 0) {
00087 te->Reset();
00088 continue;
00089 }
00090
00091 te->MarkDirty();
00092 te->top--;
00093 te->MarkDirty();
00094 }
00095 }
00096
00097 void InitTextEffects()
00098 {
00099 _text_effects.Reset();
00100 }
00101
00102 void DrawTextEffects(DrawPixelInfo *dpi)
00103 {
00104
00105 if (dpi->zoom > ZOOM_LVL_OUT_2X) return;
00106
00107 const TextEffect *end = _text_effects.End();
00108 for (TextEffect *te = _text_effects.Begin(); te != end; te++) {
00109 if (te->string_id == INVALID_STRING_ID) continue;
00110 if (te->mode == TE_RISING || (_settings_client.gui.loading_indicators && !IsTransparencySet(TO_LOADING))) {
00111 ViewportAddString(dpi, ZOOM_LVL_OUT_2X, te, te->string_id, te->string_id - 1, 0, te->params_1);
00112 }
00113 }
00114 }