diff options
author | Dave Chapman <dave@dchapman.com> | 2006-03-28 15:44:01 +0000 |
---|---|---|
committer | Dave Chapman <dave@dchapman.com> | 2006-03-28 15:44:01 +0000 |
commit | 47f4a458d636a889e955e68f896708f1276febc0 (patch) | |
tree | 99f770c02ef606f0abbdcd332ac39e69830d8007 /apps/plugins/doom/st_lib.c | |
parent | fff7d6157d56f233cad5c2003475e47a5ff809a7 (diff) | |
download | rockbox-47f4a458d636a889e955e68f896708f1276febc0.tar.gz rockbox-47f4a458d636a889e955e68f896708f1276febc0.zip |
Patch #2969 - Doom! Currently only working on the H300.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9312 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/doom/st_lib.c')
-rw-r--r-- | apps/plugins/doom/st_lib.c | 372 |
1 files changed, 372 insertions, 0 deletions
diff --git a/apps/plugins/doom/st_lib.c b/apps/plugins/doom/st_lib.c new file mode 100644 index 0000000000..adcd0e6688 --- /dev/null +++ b/apps/plugins/doom/st_lib.c | |||
@@ -0,0 +1,372 @@ | |||
1 | /* Emacs style mode select -*- C++ -*- | ||
2 | *----------------------------------------------------------------------------- | ||
3 | * | ||
4 | * | ||
5 | * PrBoom a Doom port merged with LxDoom and LSDLDoom | ||
6 | * based on BOOM, a modified and improved DOOM engine | ||
7 | * Copyright (C) 1999 by | ||
8 | * id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman | ||
9 | * Copyright (C) 1999-2000 by | ||
10 | * Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This program is distributed in the hope that it will be useful, | ||
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
20 | * GNU General Public License for more details. | ||
21 | * | ||
22 | * You should have received a copy of the GNU General Public License | ||
23 | * along with this program; if not, write to the Free Software | ||
24 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | ||
25 | * 02111-1307, USA. | ||
26 | * | ||
27 | * DESCRIPTION: | ||
28 | * The status bar widget code. | ||
29 | * | ||
30 | *-----------------------------------------------------------------------------*/ | ||
31 | |||
32 | #include "doomdef.h" | ||
33 | #include "doomstat.h" | ||
34 | #include "v_video.h" | ||
35 | #include "w_wad.h" | ||
36 | #include "m_swap.h" | ||
37 | #include "st_stuff.h" | ||
38 | #include "st_lib.h" | ||
39 | #include "r_main.h" | ||
40 | |||
41 | int sts_always_red; //jff 2/18/98 control to disable status color changes | ||
42 | int sts_pct_always_gray; // killough 2/21/98: always gray %'s? bug or feature? | ||
43 | |||
44 | // | ||
45 | // STlib_init() | ||
46 | // | ||
47 | void STlib_init(void) | ||
48 | { | ||
49 | // cph - no longer hold STMINUS pointer | ||
50 | } | ||
51 | |||
52 | // | ||
53 | // STlib_initNum() | ||
54 | // | ||
55 | // Initializes an st_number_t widget | ||
56 | // | ||
57 | // Passed the widget, its position, the patches for the digits, a pointer | ||
58 | // to the value displayed, a pointer to the on/off control, and the width | ||
59 | // Returns nothing | ||
60 | // | ||
61 | void STlib_initNum | ||
62 | ( st_number_t* n, | ||
63 | int x, | ||
64 | int y, | ||
65 | const patchnum_t* pl, | ||
66 | int* num, | ||
67 | boolean* on, | ||
68 | int width ) | ||
69 | { | ||
70 | n->x = x; | ||
71 | n->y = y; | ||
72 | n->oldnum = 0; | ||
73 | n->width = width; | ||
74 | n->num = num; | ||
75 | n->on = on; | ||
76 | n->p = pl; | ||
77 | } | ||
78 | |||
79 | /* | ||
80 | * STlib_drawNum() | ||
81 | * | ||
82 | * A fairly efficient way to draw a number based on differences from the | ||
83 | * old number. | ||
84 | * | ||
85 | * Passed a st_number_t widget, a color range for output, and a flag | ||
86 | * indicating whether refresh is needed. | ||
87 | * Returns nothing | ||
88 | * | ||
89 | * jff 2/16/98 add color translation to digit output | ||
90 | * cphipps 10/99 - const pointer to colour trans table, made function static | ||
91 | */ | ||
92 | static void STlib_drawNum | ||
93 | ( st_number_t* n, | ||
94 | int cm, | ||
95 | boolean refresh ) | ||
96 | { | ||
97 | |||
98 | int numdigits = n->width; | ||
99 | int num = *n->num; | ||
100 | |||
101 | int w = SHORT(n->p[0].width); | ||
102 | int h = SHORT(n->p[0].height); | ||
103 | int x = n->x; | ||
104 | |||
105 | int neg; | ||
106 | |||
107 | // leban 1/20/99: | ||
108 | // strange that somebody went through all the work to draw only the | ||
109 | // differences, and then went and constantly redrew all the numbers. | ||
110 | // return without drawing if the number didn't change and the bar | ||
111 | // isn't refreshing. | ||
112 | if(n->oldnum == num && !refresh) | ||
113 | return; | ||
114 | |||
115 | // CPhipps - compact some code, use num instead of *n->num | ||
116 | if ((neg = (n->oldnum = num) < 0)) | ||
117 | { | ||
118 | if (numdigits == 2 && num < -9) | ||
119 | num = -9; | ||
120 | else if (numdigits == 3 && num < -99) | ||
121 | num = -99; | ||
122 | |||
123 | num = -num; | ||
124 | } | ||
125 | |||
126 | // clear the area | ||
127 | x = n->x - numdigits*w; | ||
128 | |||
129 | #ifdef RANGECHECK | ||
130 | if (n->y - ST_Y < 0) | ||
131 | I_Error("STlib_drawNum: n->y - ST_Y < 0"); | ||
132 | #endif | ||
133 | |||
134 | V_CopyRect(x, n->y - ST_Y, BG, w*numdigits, h, x, n->y, FG, VPT_STRETCH); | ||
135 | |||
136 | // if non-number, do not draw it | ||
137 | if (num == 1994) | ||
138 | return; | ||
139 | |||
140 | x = n->x; | ||
141 | |||
142 | //jff 2/16/98 add color translation to digit output | ||
143 | // in the special case of 0, you draw 0 | ||
144 | if (!num) | ||
145 | // CPhipps - patch drawing updated, reformatted | ||
146 | V_DrawNumPatch(x - w, n->y, FG, n->p[0].lumpnum, cm, | ||
147 | (((cm!=CR_DEFAULT) && !sts_always_red) ? VPT_TRANS : VPT_NONE) | VPT_STRETCH); | ||
148 | |||
149 | // draw the new number | ||
150 | //jff 2/16/98 add color translation to digit output | ||
151 | while (num && numdigits--) { | ||
152 | // CPhipps - patch drawing updated, reformatted | ||
153 | x -= w; | ||
154 | V_DrawNumPatch(x, n->y, FG, n->p[num % 10].lumpnum, cm, | ||
155 | (((cm!=CR_DEFAULT) && !sts_always_red) ? VPT_TRANS : VPT_NONE) | VPT_STRETCH); | ||
156 | num /= 10; | ||
157 | } | ||
158 | |||
159 | // draw a minus sign if necessary | ||
160 | //jff 2/16/98 add color translation to digit output | ||
161 | // cph - patch drawing updated, load by name instead of acquiring pointer earlier | ||
162 | if (neg) | ||
163 | V_DrawNamePatch(x - w, n->y, FG, "STTMINUS", cm, | ||
164 | (((cm!=CR_DEFAULT) && !sts_always_red) ? VPT_TRANS : VPT_NONE) | VPT_STRETCH); | ||
165 | } | ||
166 | |||
167 | /* | ||
168 | * STlib_updateNum() | ||
169 | * | ||
170 | * Draws a number conditionally based on the widget's enable | ||
171 | * | ||
172 | * Passed a number widget, the output color range, and a refresh flag | ||
173 | * Returns nothing | ||
174 | * | ||
175 | * jff 2/16/98 add color translation to digit output | ||
176 | * cphipps 10/99 - make that pointer const | ||
177 | */ | ||
178 | void STlib_updateNum | ||
179 | ( st_number_t* n, | ||
180 | int cm, | ||
181 | boolean refresh ) | ||
182 | { | ||
183 | if (*n->on) STlib_drawNum(n, cm, refresh); | ||
184 | } | ||
185 | |||
186 | // | ||
187 | // STlib_initPercent() | ||
188 | // | ||
189 | // Initialize a st_percent_t number with percent sign widget | ||
190 | // | ||
191 | // Passed a st_percent_t widget, the position, the digit patches, a pointer | ||
192 | // to the number to display, a pointer to the enable flag, and patch | ||
193 | // for the percent sign. | ||
194 | // Returns nothing. | ||
195 | // | ||
196 | void STlib_initPercent | ||
197 | ( st_percent_t* p, | ||
198 | int x, | ||
199 | int y, | ||
200 | const patchnum_t* pl, | ||
201 | int* num, | ||
202 | boolean* on, | ||
203 | const patchnum_t* percent ) | ||
204 | { | ||
205 | STlib_initNum(&p->n, x, y, pl, num, on, 3); | ||
206 | p->p = percent; | ||
207 | } | ||
208 | |||
209 | /* | ||
210 | * STlib_updatePercent() | ||
211 | * | ||
212 | * Draws a number/percent conditionally based on the widget's enable | ||
213 | * | ||
214 | * Passed a precent widget, the output color range, and a refresh flag | ||
215 | * Returns nothing | ||
216 | * | ||
217 | * jff 2/16/98 add color translation to digit output | ||
218 | * cphipps - const for pointer to the colour translation table | ||
219 | */ | ||
220 | |||
221 | void STlib_updatePercent | ||
222 | ( st_percent_t* per, | ||
223 | int cm, | ||
224 | int refresh ) | ||
225 | { | ||
226 | if (*per->n.on && (refresh || (per->n.oldnum != *per->n.num))) { | ||
227 | // killough 2/21/98: fix percents not updated; | ||
228 | /* CPhipps - make %'s only be updated if number changed */ | ||
229 | // CPhipps - patch drawing updated | ||
230 | V_DrawNumPatch(per->n.x, per->n.y, FG, per->p->lumpnum, | ||
231 | sts_pct_always_gray ? CR_GRAY : cm, | ||
232 | (sts_always_red ? VPT_NONE : VPT_TRANS) | VPT_STRETCH); | ||
233 | } | ||
234 | |||
235 | STlib_updateNum(&per->n, cm, refresh); | ||
236 | } | ||
237 | |||
238 | // | ||
239 | // STlib_initMultIcon() | ||
240 | // | ||
241 | // Initialize a st_multicon_t widget, used for a multigraphic display | ||
242 | // like the status bar's keys. | ||
243 | // | ||
244 | // Passed a st_multicon_t widget, the position, the graphic patches, a pointer | ||
245 | // to the numbers representing what to display, and pointer to the enable flag | ||
246 | // Returns nothing. | ||
247 | // | ||
248 | void STlib_initMultIcon | ||
249 | ( st_multicon_t* i, | ||
250 | int x, | ||
251 | int y, | ||
252 | const patchnum_t* il, | ||
253 | int* inum, | ||
254 | boolean* on ) | ||
255 | { | ||
256 | i->x = x; | ||
257 | i->y = y; | ||
258 | i->oldinum = -1; | ||
259 | i->inum = inum; | ||
260 | i->on = on; | ||
261 | i->p = il; | ||
262 | } | ||
263 | |||
264 | // | ||
265 | // STlib_updateMultIcon() | ||
266 | // | ||
267 | // Draw a st_multicon_t widget, used for a multigraphic display | ||
268 | // like the status bar's keys. Displays each when the control | ||
269 | // numbers change or refresh is true | ||
270 | // | ||
271 | // Passed a st_multicon_t widget, and a refresh flag | ||
272 | // Returns nothing. | ||
273 | // | ||
274 | void STlib_updateMultIcon | ||
275 | ( st_multicon_t* mi, | ||
276 | boolean refresh ) | ||
277 | { | ||
278 | int w; | ||
279 | int h; | ||
280 | int x; | ||
281 | int y; | ||
282 | |||
283 | if (*mi->on && (mi->oldinum != *mi->inum || refresh)) | ||
284 | { | ||
285 | if (mi->oldinum != -1) | ||
286 | { | ||
287 | x = mi->x - SHORT(mi->p[mi->oldinum].leftoffset); | ||
288 | y = mi->y - SHORT(mi->p[mi->oldinum].topoffset); | ||
289 | w = SHORT(mi->p[mi->oldinum].width); | ||
290 | h = SHORT(mi->p[mi->oldinum].height); | ||
291 | |||
292 | #ifdef RANGECHECK | ||
293 | if (y - ST_Y < 0) | ||
294 | I_Error("STlib_updateMultIcon: y - ST_Y < 0"); | ||
295 | #endif | ||
296 | |||
297 | V_CopyRect(x, y-ST_Y, BG, w, h, x, y, FG, VPT_STRETCH); | ||
298 | } | ||
299 | if (*mi->inum != -1) // killough 2/16/98: redraw only if != -1 | ||
300 | V_DrawNumPatch(mi->x, mi->y, FG, mi->p[*mi->inum].lumpnum, CR_DEFAULT, VPT_STRETCH); | ||
301 | mi->oldinum = *mi->inum; | ||
302 | } | ||
303 | } | ||
304 | |||
305 | // | ||
306 | // STlib_initBinIcon() | ||
307 | // | ||
308 | // Initialize a st_binicon_t widget, used for a multinumber display | ||
309 | // like the status bar's weapons, that are present or not. | ||
310 | // | ||
311 | // Passed a st_binicon_t widget, the position, the digit patches, a pointer | ||
312 | // to the flags representing what is displayed, and pointer to the enable flag | ||
313 | // Returns nothing. | ||
314 | // | ||
315 | void STlib_initBinIcon | ||
316 | ( st_binicon_t* b, | ||
317 | int x, | ||
318 | int y, | ||
319 | const patchnum_t* i, | ||
320 | boolean* val, | ||
321 | boolean* on ) | ||
322 | { | ||
323 | b->x = x; | ||
324 | b->y = y; | ||
325 | b->oldval = 0; | ||
326 | b->val = val; | ||
327 | b->on = on; | ||
328 | b->p = i; | ||
329 | } | ||
330 | |||
331 | // | ||
332 | // STlib_updateBinIcon() | ||
333 | // | ||
334 | // DInitialize a st_binicon_t widget, used for a multinumber display | ||
335 | // like the status bar's weapons, that are present or not. | ||
336 | // | ||
337 | // Draw a st_binicon_t widget, used for a multinumber display | ||
338 | // like the status bar's weapons that are present or not. Displays each | ||
339 | // when the control flag changes or refresh is true | ||
340 | // | ||
341 | // Passed a st_binicon_t widget, and a refresh flag | ||
342 | // Returns nothing. | ||
343 | // | ||
344 | void STlib_updateBinIcon | ||
345 | ( st_binicon_t* bi, | ||
346 | boolean refresh ) | ||
347 | { | ||
348 | int x; | ||
349 | int y; | ||
350 | int w; | ||
351 | int h; | ||
352 | |||
353 | if (*bi->on && (bi->oldval != (signed)*bi->val || refresh)) | ||
354 | { | ||
355 | x = bi->x - SHORT(bi->p->leftoffset); | ||
356 | y = bi->y - SHORT(bi->p->topoffset); | ||
357 | w = SHORT(bi->p->width); | ||
358 | h = SHORT(bi->p->height); | ||
359 | |||
360 | #ifdef RANGECHECK | ||
361 | if (y - ST_Y < 0) | ||
362 | I_Error("STlib_updateBinIcon: y - ST_Y < 0"); | ||
363 | #endif | ||
364 | |||
365 | if (*bi->val) | ||
366 | V_DrawNumPatch(bi->x, bi->y, FG, bi->p->lumpnum, CR_DEFAULT, VPT_STRETCH); | ||
367 | else | ||
368 | V_CopyRect(x, y-ST_Y, BG, w, h, x, y, FG, VPT_STRETCH); | ||
369 | |||
370 | bi->oldval = *bi->val; | ||
371 | } | ||
372 | } | ||