author | dominik |
Sun, 14 Nov 2004 20:25:07 +0000 | |
changeset 412 | 3b10a6e44e7e |
parent 193 | 0a7025304867 |
child 425 | 97d601c182f0 |
permissions | -rw-r--r-- |
0 | 1 |
#include "stdafx.h" |
2 |
#include "ttd.h" |
|
3 |
#include "gfx.h" |
|
4 |
#include "viewport.h" |
|
5 |
#include "saveload.h" |
|
6 |
||
7 |
typedef struct TextEffect { |
|
8 |
StringID string_id; |
|
9 |
int16 x,y,right,bottom; |
|
10 |
uint16 duration; |
|
11 |
uint32 params_1; |
|
12 |
uint32 params_2; |
|
13 |
} TextEffect; |
|
14 |
||
15 |
static TextEffect _text_effect_list[30]; |
|
16 |
TileIndex _animated_tile_list[256]; |
|
17 |
||
18 |
static void MarkTextEffectAreaDirty(TextEffect *te) |
|
19 |
{ |
|
20 |
MarkAllViewportsDirty( |
|
21 |
te->x, |
|
22 |
te->y - 1, |
|
23 |
(te->right - te->x)*2 + te->x + 1, |
|
24 |
(te->bottom - (te->y - 1)) * 2 + (te->y - 1) + 1 |
|
25 |
); |
|
26 |
} |
|
27 |
||
28 |
void AddTextEffect(StringID msg, int x, int y, uint16 duration) |
|
29 |
{ |
|
30 |
TextEffect *te; |
|
31 |
int w; |
|
32 |
char buffer[100]; |
|
33 |
||
34 |
if (_game_mode == GM_MENU) |
|
35 |
return; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
0
diff
changeset
|
36 |
|
0 | 37 |
for (te = _text_effect_list; te->string_id != 0xFFFF; ) { |
38 |
if (++te == endof(_text_effect_list)) |
|
39 |
return; |
|
40 |
} |
|
41 |
||
42 |
te->string_id = msg; |
|
43 |
te->duration = duration; |
|
44 |
te->y = y - 5; |
|
45 |
te->bottom = y + 5; |
|
46 |
te->params_1 = GET_DPARAM32(0); |
|
47 |
te->params_2 = GET_DPARAM32(4); |
|
48 |
||
49 |
GetString(buffer, msg); |
|
50 |
w = GetStringWidth(buffer); |
|
51 |
||
52 |
te->x = x - (w >> 1); |
|
53 |
te->right = x + (w >> 1) - 1; |
|
54 |
MarkTextEffectAreaDirty(te); |
|
55 |
} |
|
56 |
||
57 |
static void MoveTextEffect(TextEffect *te) |
|
58 |
{ |
|
59 |
if (te->duration < 8) { |
|
60 |
te->string_id = 0xFFFF; |
|
61 |
} else { |
|
62 |
te->duration-=8; |
|
63 |
te->y--; |
|
64 |
te->bottom--; |
|
65 |
} |
|
66 |
MarkTextEffectAreaDirty(te); |
|
67 |
} |
|
68 |
||
69 |
void MoveAllTextEffects() |
|
70 |
{ |
|
71 |
TextEffect *te; |
|
72 |
||
73 |
for (te = _text_effect_list; te != endof(_text_effect_list); te++ ) { |
|
74 |
if (te->string_id != 0xFFFF) |
|
75 |
MoveTextEffect(te); |
|
76 |
} |
|
77 |
} |
|
78 |
||
79 |
void InitTextEffects() |
|
80 |
{ |
|
81 |
TextEffect *te; |
|
82 |
||
83 |
for (te = _text_effect_list; te != endof(_text_effect_list); te++ ) { |
|
84 |
te->string_id = 0xFFFF; |
|
85 |
} |
|
86 |
} |
|
87 |
||
88 |
void DrawTextEffects(DrawPixelInfo *dpi) |
|
89 |
{ |
|
90 |
TextEffect *te; |
|
91 |
||
92 |
if (dpi->zoom < 1) { |
|
93 |
for (te = _text_effect_list; te != endof(_text_effect_list); te++ ) { |
|
94 |
if (te->string_id == 0xFFFF) |
|
95 |
continue; |
|
96 |
||
97 |
/* intersection? */ |
|
98 |
if ((int16)dpi->left > te->right || |
|
99 |
(int16)dpi->top > te->bottom || |
|
100 |
(int16)(dpi->left + dpi->width) <= te->x || |
|
101 |
(int16)(dpi->top + dpi->height) <= te->y) |
|
102 |
continue; |
|
103 |
AddStringToDraw(te->x, te->y, te->string_id, te->params_1, te->params_2); |
|
104 |
} |
|
105 |
} else if (dpi->zoom == 1) { |
|
106 |
for (te = _text_effect_list; te != endof(_text_effect_list); te++ ) { |
|
107 |
if (te->string_id == 0xFFFF) |
|
108 |
continue; |
|
109 |
||
110 |
/* intersection? */ |
|
111 |
if (dpi->left > te->right*2 - te->x || |
|
112 |
dpi->top > te->bottom*2 - te->y || |
|
113 |
(dpi->left + dpi->width) <= te->x || |
|
114 |
(dpi->top + dpi->height) <= te->y) |
|
115 |
continue; |
|
116 |
AddStringToDraw(te->x, te->y, (StringID)(te->string_id-1), te->params_1, te->params_2); |
|
117 |
} |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
0
diff
changeset
|
118 |
|
0 | 119 |
} |
120 |
} |
|
121 |
||
122 |
void DeleteAnimatedTile(uint tile) |
|
123 |
{ |
|
124 |
TileIndex *ti; |
|
125 |
||
126 |
for(ti=_animated_tile_list; ti!=endof(_animated_tile_list); ti++) { |
|
127 |
if ( (TileIndex)tile == *ti) { |
|
128 |
/* remove the hole */ |
|
129 |
memcpy_overlapping(ti, ti+1, endof(_animated_tile_list) - 1 - ti); |
|
130 |
/* and clear last item */ |
|
131 |
endof(_animated_tile_list)[-1] = 0; |
|
132 |
MarkTileDirtyByTile(tile); |
|
133 |
return; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
0
diff
changeset
|
134 |
} |
0 | 135 |
} |
136 |
} |
|
137 |
||
138 |
bool AddAnimatedTile(uint tile) |
|
139 |
{ |
|
140 |
TileIndex *ti; |
|
141 |
||
142 |
for(ti=_animated_tile_list; ti!=endof(_animated_tile_list); ti++) { |
|
143 |
if ( (TileIndex)tile == *ti || *ti == 0) { |
|
144 |
*ti = tile; |
|
145 |
MarkTileDirtyByTile(tile); |
|
146 |
return true; |
|
147 |
} |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
0
diff
changeset
|
148 |
} |
0 | 149 |
|
150 |
return false; |
|
151 |
} |
|
152 |
||
153 |
void AnimateAnimatedTiles() |
|
154 |
{ |
|
155 |
TileIndex *ti; |
|
156 |
uint tile; |
|
157 |
||
158 |
for(ti=_animated_tile_list; ti!=endof(_animated_tile_list) && (tile=*ti) != 0; ti++) { |
|
159 |
AnimateTile(tile); |
|
160 |
} |
|
161 |
} |
|
162 |
||
163 |
void InitializeAnimatedTiles() |
|
164 |
{ |
|
165 |
memset(_animated_tile_list, 0, sizeof(_animated_tile_list)); |
|
166 |
} |
|
167 |
||
168 |
static void SaveLoad_ANIT() |
|
169 |
{ |
|
170 |
SlArray(_animated_tile_list, lengthof(_animated_tile_list), SLE_UINT16); |
|
171 |
} |
|
172 |
||
173 |
||
174 |
const ChunkHandler _animated_tile_chunk_handlers[] = { |
|
175 |
{ 'ANIT', SaveLoad_ANIT, SaveLoad_ANIT, CH_RIFF | CH_LAST}, |
|
176 |
}; |
|
177 |
||
178 |