3
* An Idea and Atari version: LK Avalon, Janusz Pelc, 1989
4
* Linux Code: Arkadiusz Lipiec, 2002-2009
5
* <arkadiusz.lipiec@gmail.com>
7
* <thunorsif@hotmail.com>
9
* GNU Robbo is free software - you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2, or (at your option)
14
* GNU Robbo is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the impled warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with GNU CC; see the file COPYING. If not, write to the
21
* Free Software Foundation, 59 Temple Place - Suite 330,
22
* Boston, MA 02111-1307, USA.
31
#define DEBUG_MESSAGE_BOX
33
#define BANNER_COLOURS 22 * 3
34
#define DELAY_BANNER 2
37
SDL_Color bgcolor, fgcolor; /* General purpose colours */
38
SDL_Surface *image; /* General purpose surface */
40
/* Used for animating banners */
43
int bannercolour[BANNER_COLOURS] = {
44
0x00ff00, 0x00f010, 0x00e020, 0x00d030, 0x00c040, 0x00b050, 0x00a060, 0x009070, 0x008080, 0x007090, 0x0060a0, 0x0050b0, 0x0060a0, 0x007090, 0x008080, 0x009070, 0x00a060, 0x00b050, 0x00c040, 0x00d030, 0x00e020, 0x00f010,
45
0x00ff00, 0x10f000, 0x20e000, 0x30d000, 0x40c000, 0x50b000, 0x60a000, 0x709000, 0x808000, 0x907000, 0xa06000, 0xb05000, 0xa06000, 0x907000, 0x808000, 0x709000, 0x60a000, 0x50b000, 0x40c000, 0x30d000, 0x20e000, 0x10f000,
46
0x00ff00, 0x10f010, 0x20e020, 0x30d030, 0x40c040, 0x50b050, 0x60a060, 0x709070, 0x808080, 0x907090, 0xa060a0, 0xb050b0, 0xa060a0, 0x907090, 0x808080, 0x709070, 0x60a060, 0x50b050, 0x40c040, 0x30d030, 0x20e020, 0x10f010
49
/* Used for animating icons */
52
int capsuleoffsets[2 * 2] = {86, 18, 103, 18};
55
int teleportoffsets[2 * 2] = {1, 69, 18, 69};
58
int barrieroffsets[2 * 2] = {154, 52, 154, 69};
61
int butterflyoffsets[2 * 2] = {137, 35, 154, 35};
64
int bearoffsets[2 * 2] = {18, 18, 35, 18};
67
int blackbearoffsets[2 * 2] = {103, 35, 120, 35};
70
int birdoffsets[2 * 2] = {52, 18, 69, 18};
73
int gunoffsets[2 * 5 * 5] = {
74
1, 52, 0, 0, 0, 0, 0, 0, 0, 0,
75
0, 0, 18, 52, 0, 0, 0, 0, 0, 0,
76
0, 0, 0, 0, 1, 52, 0, 0, 0, 0,
77
0, 0, 0, 0, 0, 0, 18, 52, 0, 0,
78
0, 0, 0, 0, 0, 0, 0, 0, 1, 52
82
int laseroffsets[2 * 5 * 14] = {
83
1, 35, 0, 0, 0, 0, 0, 0, 0, 0,
84
1, 35, 1, 35, 0, 0, 0, 0, 0, 0,
85
1, 35, 1, 35, 1, 35, 0, 0, 0, 0,
86
1, 35, 1, 35, 1, 35, 1, 35, 0, 0,
87
1, 35, 1, 35, 1, 35, 1, 35, 1, 35,
88
1, 35, 1, 35, 1, 35, 1, 35, 0, 0,
89
1, 35, 1, 35, 1, 35, 0, 0, 0, 0,
90
1, 35, 1, 35, 0, 0, 0, 0, 0, 0,
91
1, 35, 0, 0, 0, 0, 0, 0, 0, 0,
92
35, 35, 0, 0, 0, 0, 0, 0, 0, 0,
93
18, 35, 0, 0, 0, 0, 0, 0, 0, 0,
94
35, 35, 0, 0, 0, 0, 0, 0, 0, 0,
95
52, 35, 0, 0, 0, 0, 0, 0, 0, 0,
96
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
100
int blasteroffsets[2 * 5 * 9] = {
101
35, 69, 0, 0, 0, 0, 0, 0, 0, 0,
102
52, 69, 35, 69, 0, 0, 0, 0, 0, 0,
103
69, 69, 52, 69, 35, 69, 0, 0, 0, 0,
104
52, 69, 69, 69, 52, 69, 35, 69, 0, 0,
105
35, 69, 52, 69, 69, 69, 52, 69, 35, 69,
106
0, 0, 35, 69, 52, 69, 69, 69, 52, 69,
107
0, 0, 0, 0, 35, 69, 52, 69, 69, 69,
108
0, 0, 0, 0, 0, 0, 35, 69, 52, 69,
109
0, 0, 0, 0, 0, 0, 0, 0, 35, 69
113
int robbooffsets[2 * 2] = {35, 86, 52, 86};
117
".OOOOO...OO...OOO..OOO..OOO.....oO#$oO..............oO#.......#$o...............", /* 80 wide */
118
"OOOOOOO..OOO..OOO..OOO..OOO.....O#$..#$.....O#$o....O#$.......$oO.........$oO#..",
119
"OOO..OO..OOO..OOO..OOO..OOO.....#$o...oO...O#$.O#...#$oO#$....oO#$oO.....$oO.$o.",
120
"OOO......OOOO.OOO..OOO..OOO.....$oO...O#..O#$...$o..$oO..oO...O#$..#$...$oO...O#",
121
"OOO.OOO..OOOOOOOO..OOO..OOO.....oO#..O#...#$o...oO..oO#...#$..#$o...oO..oO#...#$",
122
"OOO..OO..OOO.OOOO..OOO..OOO.....O#$oO#....$oO...O#..O#$...$o..$oO...O#..O#$...$o",
123
"OOOOOOO..OOO..OOO..OOOOOOOO.....#$o..$o...oO#...#$..#$o...oO..oO#...#$..#$o...oO",
124
".OOOOO...OOO..OOO...OOOOOO......$oO...O#...#$oO#$...$oO#$oO...O#$oO#$....oO#$oO."};
126
char *helpscreenbanner[10] = {
127
"OOO..OOO............oO#..........", /* 33 wide */
128
"OOO..OOO....O#$o....O#$..........",
129
"OOO..OOO...O#$.O#...#$o..OOOOOO..",
130
"OOO..OOO..O#$...$o..$oO..OOO..OO.",
131
"OOOOOOOO..#$oOOOoO..oO#..OOO...OO",
132
"OOO..OOO..$oO.......$oO..OOO...OO",
133
"OOO..OOO..oO#...#$..oO#..OOO..OO.",
134
"OOO..OOO...#$oO#$...O#$..OOOOOO..",
135
".........................OOO.....",
136
".........................OOO....."};
138
char *optionsscreenbanner[10] = {
139
".OOOOOO.............oO#....OOO..............................", /* 60 wide */
140
"OOOOOOOO............O#$....OOO....O#$o....ooo.........O#$o..",
141
"OOO..OOO..OOOOOO....#$ooo........O#$.O#...#$oO#$.....O#$.O#.",
142
"OOO..OOO..OOO..OO...$oO....OOO..O#$...$o..$oO..oO...O#$.....",
143
"OOO..OOO..OOO...OO..oO#....OOO..#$o...oO..oO#...#$...O$oooO.",
144
"OOO..OOO..OOO...OO..$oO....OOO..$oO...O#..O#$...$o........O#",
145
"OOOOOOOO..OOO..OO...oO#....OOO..oO#...#$..#$o...oO..OO#...#$",
146
".OOOOOO...OOOOOO.....#$oo..OOO...#$oO#$...$oO...oO...OO$o#$.",
147
"..........OOO...............................................",
148
"..........OOO..............................................."};
150
/* Function prototypes */
151
void show_scoreline(void);
152
Uint32 getpixel(SDL_Surface *surface, int x, int y);
153
void clear_screen(void);
154
void show_banner(char *banner[], int xpos, int ypos, int width, int height);
155
void write_lcd_char(char lcdchar, int xpos, int ypos);
158
/***************************************************************************
160
***************************************************************************/
161
/* Rewritten to use a viewport that can reposition itself at Robbo's
162
destination in as many cycles as requested.
164
On entry: redrawlevel = REDRAW_INITIALISE to initialise */
166
void show_game_area(int redrawlevel) {
167
int x, y, xoffset = viewport.xoffset, yoffset = viewport.yoffset;
169
SDL_Rect srcrect, destrect;
171
if (redrawlevel >= REDRAW_INITIALISE) {
172
viewport_needs_redrawing();
174
scoreline.redraw = 0xff;
176
/* Maximum key/button repeat for Robbo navigation keys */
177
user_controls[ACTION_UP].delay = 0;
178
user_controls[ACTION_UP].interval = 0;
179
user_controls[ACTION_DOWN].delay = 0;
180
user_controls[ACTION_DOWN].interval = 0;
181
user_controls[ACTION_LEFT].delay = 0;
182
user_controls[ACTION_LEFT].interval = 0;
183
user_controls[ACTION_RIGHT].delay = 0;
184
user_controls[ACTION_RIGHT].interval = 0;
185
/* Set a useable repeat for Robbo shoot keys */
186
user_controls[ACTION_SHOOT_UP].delay = game_cycle_limit / 2;
187
user_controls[ACTION_SHOOT_UP].interval = game_cycle_limit / 2;
188
user_controls[ACTION_SHOOT_DOWN].delay = game_cycle_limit / 2;
189
user_controls[ACTION_SHOOT_DOWN].interval = game_cycle_limit / 2;
190
user_controls[ACTION_SHOOT_LEFT].delay = game_cycle_limit / 2;
191
user_controls[ACTION_SHOOT_LEFT].interval = game_cycle_limit / 2;
192
user_controls[ACTION_SHOOT_RIGHT].delay = game_cycle_limit / 2;
193
user_controls[ACTION_SHOOT_RIGHT].interval = game_cycle_limit / 2;
196
/* Calculate the valid expected position of the viewport */
197
vpepx = robbo.x - viewport.w / 2;
200
} else if (vpepx + viewport.w > level.w) {
201
vpepx = level.w - viewport.w;
203
vpepy = robbo.y - viewport.h / 2;
206
} else if (vpepy + viewport.h > level.h) {
207
vpepy = level.h - viewport.h;
209
/* If viewport.cycles_to_dest > 0 then move the viewport towards the expected position.
210
viewport.cycles_to_dest tells us how many cycles we have to get the viewport over to the expected position
211
and this is set to 1 on exit from this function. It is possible to lock the viewport at a set location
212
by setting viewport.cycles_to_dest to 0 before calling this function. It's also possible to instantly
213
place the viewport at its expected position by setting viewport.cycles_to_dest to 1 */
214
if ((viewport.x != vpepx || viewport.y != vpepy) && viewport.cycles_to_dest > 0) {
215
if (viewport.x != vpepx) {
216
if (viewport.x < vpepx) {
217
viewport.x += ceil((float)(vpepx - viewport.x) / viewport.cycles_to_dest);
219
viewport.x -= ceil((float)(viewport.x - vpepx) / viewport.cycles_to_dest);
222
if (viewport.y != vpepy) {
223
if (viewport.y < vpepy) {
224
viewport.y += ceil((float)(vpepy - viewport.y) / viewport.cycles_to_dest);
226
viewport.y -= ceil((float)(viewport.y - vpepy) / viewport.cycles_to_dest);
229
viewport.cycles_to_dest--;
230
viewport_needs_redrawing();
232
viewport.cycles_to_dest = 1;
235
/* Iterate through the board locations in the viewport and draw the objects if required */
236
for (y = viewport.y; y < viewport.y + viewport.h; y++) {
237
for (x = viewport.x; x < viewport.x + viewport.w; x++) {
238
destrect = set_rect(xoffset + (x - viewport.x) * video.field_size, yoffset + (y - viewport.y) * video.field_size, video.field_size, video.field_size);
239
/* If the location is outside the dimensions of the level then draw a BACKGROUND_COLOUR tile instead */
240
if (x < 0 || y < 0 || x >= level.w || y >= level.h) {
241
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, skins[selected_skin].background_colour >> 16 & 0xff, skins[selected_skin].background_colour >> 8 & 0xff, skins[selected_skin].background_colour & 0xff));
243
/* The location is valid but only draw locations that have been marked for redrawing */
244
if (board[x][y].redraw) {
245
board[x][y].redraw = FALSE;
246
if (level.now_is_blinking > 1) {
247
/* If the level is blinking then draw a white tile */
248
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, 0xff, 0xff, 0xff));
250
if (level.colour_override != UNDEFINED) {
251
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, level.colour_override >> 16 & 0xff, level.colour_override >> 8 & 0xff, level.colour_override & 0xff));
252
} else if (level.colour != UNDEFINED) {
253
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, level.colour >> 16 & 0xff, level.colour >> 8 & 0xff, level.colour & 0xff));
255
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, DEFAULT_LEVEL_COLOUR >> 16 & 0xff, DEFAULT_LEVEL_COLOUR >> 8 & 0xff, DEFAULT_LEVEL_COLOUR & 0xff));
258
/* Get icon surface offsets for object's current animation frame */
259
if (board[x][y].type != EMPTY_FIELD) {
260
srcrect = set_rect(board[x][y].icon[board[x][y].state].x, board[x][y].icon[board[x][y].state].y, video.field_size, video.field_size);
261
if (SDL_BlitSurface(icons, &srcrect, screen, &destrect) < 0) {
262
fprintf(stdout,"BlitSurface error: %s\n", SDL_GetError());
265
/* Are we drawing Robbo? */
266
if (robbo.x == x && robbo.y == y && robbo.alive && /* Is this his location and is he alive? */
267
(!robbo.teleporting || (robbo.teleporting && robbo.moved <= DELAY_TELEPORTING))) { /* Is he either not teleporting or just about to materialise from teleporting? */
268
srcrect = set_rect(robbo_images_srcrect[robbo.direction + robbo.state].x, robbo_images_srcrect[robbo.direction + robbo.state].y, robbo_images_srcrect[robbo.direction + robbo.state].w, robbo_images_srcrect[robbo.direction + robbo.state].h);
269
if (SDL_BlitSurface(icons, &srcrect, screen, &destrect) < 0) {
270
fprintf(stdout,"BlitSurface error: %s\n", SDL_GetError());
278
/* If the level is blinking then mark the viewport for redrawing */
279
if (level.now_is_blinking > 1) {
280
level.now_is_blinking--;
281
if (level.now_is_blinking == 1) {
282
viewport_needs_redrawing();
286
/* Redraw the parts of the scoreline that have been requested */
287
if (scoreline.redraw) show_scoreline();
291
/***************************************************************************
292
* Show Game Area Fade *
293
***************************************************************************/
294
/* Simulates the screen fading in. I think fades can become annoying, so I
295
don't fade when manually changing levels and packs.
297
On entry: redrawlevel = REDRAW_INITIALISE to initialise with
298
type = 1 to 17 for a specific fade type or
299
type = 0 to kill an existing fade
300
redrawlevel = REDRAW_EVERYTHING for everything */
302
void show_game_area_fade(int redrawlevel, int type) {
304
static int fadesize = 0, fadetype;
305
int xoffset = viewport.xoffset, yoffset = viewport.yoffset, x, y;
307
if (redrawlevel == REDRAW_INITIALISE) {
309
/* Initialise a fade */
313
} else if (fadetype == 16) {
314
fadesize = viewport.w;
316
fadesize = video.field_size;
319
} else if (redrawlevel == REDRAW_EVERYTHING) {
323
for (y = 0; y < viewport.h; y++) {
324
for (x = 0; x < viewport.w; x++) {
328
} else if (fadetype == 1) {
329
/* Fade middle dot */
330
destrect = set_rect(x * video.field_size + xoffset + (video.field_size - fadesize) / 2, y * video.field_size + yoffset + (video.field_size - fadesize) / 2, fadesize, fadesize);
331
} else if (fadetype == 2) {
332
/* Fade bottom right */
333
destrect = set_rect(x * video.field_size + xoffset + video.field_size - fadesize, y * video.field_size + yoffset + video.field_size - fadesize, fadesize, fadesize);
334
} else if (fadetype == 3) {
335
/* Fade top left and bottom right */
337
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset, fadesize, fadesize);
338
} else if (x % 2 == 1) {
339
destrect = set_rect(x * video.field_size + xoffset + video.field_size - fadesize, y * video.field_size + yoffset + video.field_size - fadesize, fadesize, fadesize);
341
} else if (fadetype == 4) {
342
/* Fade bottom left and top right */
344
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset + video.field_size - fadesize, fadesize, fadesize);
345
} else if (x % 2 == 1) {
346
destrect = set_rect(x * video.field_size + xoffset + video.field_size - fadesize, y * video.field_size + yoffset, fadesize, fadesize);
348
} else if (fadetype == 5) {
350
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset + video.field_size - fadesize, video.field_size, fadesize);
351
} else if (fadetype == 6) {
353
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset, fadesize, fadesize);
354
} else if (fadetype == 7) {
356
destrect = set_rect(x * video.field_size + xoffset + video.field_size - fadesize, y * video.field_size + yoffset, fadesize, fadesize);
357
} else if (fadetype == 8) {
358
/* Fade bottom left */
359
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset + video.field_size - fadesize, fadesize, fadesize);
360
} else if (fadetype == 9) {
361
/* Intermittent fade top left and bottom right */
362
if (fadesize % 4 == 0) {
363
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset, fadesize, fadesize);
364
} else if (fadesize % 4 == 2) {
365
destrect = set_rect(x * video.field_size + xoffset + video.field_size - fadesize, y * video.field_size + yoffset + video.field_size - fadesize, fadesize, fadesize);
367
} else if (fadetype == 10) {
369
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset, fadesize, video.field_size);
370
} else if (fadetype == 11) {
371
/* Fade middle tall */
372
destrect = set_rect(x * video.field_size + xoffset + (video.field_size - fadesize) / 2, y * video.field_size + yoffset, fadesize, video.field_size);
373
} else if (fadetype == 12) {
374
/* Fade middle wide */
375
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset + (video.field_size - fadesize) / 2, video.field_size, fadesize);
376
} else if (fadetype == 13) {
378
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset, video.field_size, fadesize);
379
} else if (fadetype == 14) {
381
destrect = set_rect(x * video.field_size + xoffset + video.field_size - fadesize, y * video.field_size + yoffset, fadesize, video.field_size);
382
} else if (fadetype == 15) {
383
/* Intermittent fade bottom left and top right */
384
if (fadesize % 4 == 0) {
385
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset + video.field_size - fadesize, fadesize, fadesize);
386
} else if (fadesize % 4 == 2) {
387
destrect = set_rect(x * video.field_size + xoffset + video.field_size - fadesize, y * video.field_size + yoffset, fadesize, fadesize);
389
} else if (fadetype == 16) {
390
/* Board fades from the right */
391
if (x < fadesize) destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset, video.field_size, video.field_size);
392
} else if (fadetype == 17) {
393
/* Fade top left, top right, bottom left and bottom right */
394
if (x % 2 == 0 && y % 2 == 0) {
395
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset, fadesize, fadesize);
396
} else if (x % 2 == 1 && y % 2 == 0) {
397
destrect = set_rect(x * video.field_size + xoffset + video.field_size - fadesize, y * video.field_size + yoffset, fadesize, fadesize);
398
} else if (x % 2 == 0 && y % 2 == 1) {
399
destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset + video.field_size - fadesize, fadesize, fadesize);
400
} else if (x % 2 == 1 && y % 2 == 1) {
401
destrect = set_rect(x * video.field_size + xoffset + video.field_size - fadesize, y * video.field_size + yoffset + video.field_size - fadesize, fadesize, fadesize);
405
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, skins[selected_skin].fade_colour >> 16 & 0xff, skins[selected_skin].fade_colour >> 8 & 0xff, skins[selected_skin].fade_colour & 0xff));
410
if (fadetype == 16) {
413
fadesize -= video.field_size / 16;
416
viewport_needs_redrawing();
422
/***************************************************************************
424
***************************************************************************/
425
/* Now each item can be individually redrawn by the setting of bits in
426
the global variable scoreline.redraw prior to calling this function */
428
void show_scoreline(void) {
429
int xoffset, count, number;
430
int yoffset = scoreline.yoffset;
431
char tempstring[256];
434
if (scoreline.redraw & SCORELINE_ICONS) {
435
xoffset = scoreline.xoffset;
437
/* Draw screw icon */
438
destrect = set_rect(xoffset, yoffset, video.field_size, video.field_size);
439
if (SDL_BlitSurface(icons, &score_screw_srcrect, screen, &destrect) < 0) {
440
fprintf(stdout, "BlitSurface error: %s\n", SDL_GetError());
443
xoffset = xoffset + video.field_size * 2 + video.field_size / 4;
446
destrect = set_rect(xoffset, yoffset, video.field_size, video.field_size);
447
if (SDL_BlitSurface(icons, &score_key_srcrect, screen, &destrect) < 0) {
448
fprintf(stdout, "BlitSurface error: %s\n", SDL_GetError());
451
xoffset = xoffset + video.field_size * 2 + video.field_size / 2;
453
/* Draw bullet icon */
454
destrect = set_rect(xoffset, yoffset, video.field_size, video.field_size);
455
if (SDL_BlitSurface(icons, &score_bullet_srcrect, screen, &destrect) < 0) {
456
fprintf(stdout, "BlitSurface error: %s\n", SDL_GetError());
459
xoffset = xoffset + video.field_size * 3;
461
/* Draw level icon */
462
destrect = set_rect(xoffset, yoffset, video.field_size, video.field_size);
463
if (SDL_BlitSurface(icons, &score_level_srcrect, screen, &destrect) < 0) {
464
fprintf(stdout, "BlitSurface error: %s\n", SDL_GetError());
468
if (scoreline.redraw & SCORELINE_SCREWS) {
469
xoffset = scoreline.xoffset + video.field_size;
471
/* First erase the area occupied by the digits */
472
destrect = set_rect(xoffset, yoffset, video.field_size, video.field_size);
473
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, skins[selected_skin].background_colour >> 16 & 0xff, skins[selected_skin].background_colour >> 8 & 0xff, skins[selected_skin].background_colour & 0xff));
475
/* Draw screw count */
477
for (count = 0; count < 2; count++) {
478
sprintf(tempstring, "%i", (robbo.screws / number) % 10);
479
write_lcd_char(tempstring[0], xoffset, yoffset);
480
xoffset = xoffset + video.field_size / 2;
481
number = number / 10;
485
if (scoreline.redraw & SCORELINE_KEYS) {
486
xoffset = scoreline.xoffset + video.field_size * 3 + video.field_size / 2;
488
/* First erase the area occupied by the digits */
489
destrect = set_rect(xoffset, yoffset, video.field_size, video.field_size);
490
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, skins[selected_skin].background_colour >> 16 & 0xff, skins[selected_skin].background_colour >> 8 & 0xff, skins[selected_skin].background_colour & 0xff));
494
for (count = 0; count < 2; count++) {
495
sprintf(tempstring, "%i", (robbo.keys / number) % 10);
496
write_lcd_char(tempstring[0], xoffset, yoffset);
497
xoffset = xoffset + video.field_size / 2;
498
number = number / 10;
502
if (scoreline.redraw & SCORELINE_BULLETS) {
503
xoffset = scoreline.xoffset + video.field_size * 6;
505
/* First erase the area occupied by the digits */
506
destrect = set_rect(xoffset, yoffset, video.field_size + video.field_size / 2, video.field_size);
507
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, skins[selected_skin].background_colour >> 16 & 0xff, skins[selected_skin].background_colour >> 8 & 0xff, skins[selected_skin].background_colour & 0xff));
509
/* Draw bullet count */
511
for (count = 0; count < 3; count++) {
512
sprintf(tempstring, "%i", (robbo.bullets / number) % 10);
513
write_lcd_char(tempstring[0], xoffset, yoffset);
514
xoffset = xoffset + video.field_size / 2;
515
number = number / 10;
519
if (scoreline.redraw & SCORELINE_LEVEL) {
520
xoffset = scoreline.xoffset + video.field_size * 9;
522
/* First erase the area occupied by the digits */
523
destrect = set_rect(xoffset, yoffset, video.field_size + video.field_size / 2, video.field_size);
524
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, skins[selected_skin].background_colour >> 16 & 0xff, skins[selected_skin].background_colour >> 8 & 0xff, skins[selected_skin].background_colour & 0xff));
526
/* Draw level count */
528
for (count = 0; count < 3; count++) {
529
sprintf(tempstring, "%i", (level_packs[selected_pack].level_selected / number) % 10);
530
write_lcd_char(tempstring[0], xoffset, yoffset);
531
xoffset = xoffset + video.field_size / 2;
532
number = number / 10;
536
if (scoreline.redraw & SCORELINE_PACK) {
537
xoffset = scoreline.xoffset + video.field_size * 10 + video.field_size / 2;
539
/* First erase the area occupied by the digits */
540
destrect = set_rect(xoffset, yoffset, video.field_size * 5 + video.field_size / 2, video.field_size);
541
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, skins[selected_skin].background_colour >> 16 & 0xff, skins[selected_skin].background_colour >> 8 & 0xff, skins[selected_skin].background_colour & 0xff));
545
write_lcd_char(tempstring[0], xoffset, yoffset);
548
for (count = 0; count < strlen(level_packs[selected_pack].name); count++) {
549
write_lcd_char(level_packs[selected_pack].name[count], xoffset + (count + 1) * video.field_size / 2, yoffset);
553
if (scoreline.redraw & SCORELINE_AUTHOR) {
554
fgcolor.r = skins[selected_skin].author_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].author_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].author_text_colour & 0xff;
555
bgcolor.r = skins[selected_skin].background_colour >> 16 & 0xff; bgcolor.g = skins[selected_skin].background_colour >> 8 & 0xff; bgcolor.b = skins[selected_skin].background_colour & 0xff;
557
/* Draw level author */
558
if (level.author[0] == '_') {
559
sprintf(tempstring,"%s", &level.author[1]);
560
} else if (strlen(level.author) > 0) {
561
sprintf(tempstring,"%s: %s", txt_Level_Author, level.author);
563
strcpy(tempstring, "");
565
if (strlen(tempstring) > 0) {
566
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
567
destrect = set_rect(authorline.xoffset, authorline.yoffset, image->w, image->h);
568
SDL_BlitSurface(image, NULL, screen, &destrect);
569
SDL_FreeSurface(image);
573
scoreline.redraw = 0;
576
/*************************************************************/
577
/* Set Rect **************************************************/
578
/*************************************************************/
580
SDL_Rect set_rect(int x, int y, int w, int h)
590
/*************************************************************/
591
/* Get Pixel *************************************************/
592
/*************************************************************/
593
/* Not used in this project anymore */
595
Uint32 getpixel(SDL_Surface *surface, int x, int y)
597
int bpp = surface->format->BytesPerPixel;
598
/* Here p is the address to the pixel we want to retrieve */
599
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
607
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
608
return p[0] << 16 | p[1] << 8 | p[2];
610
return p[0] | p[1] << 8 | p[2] << 16;
614
return 0; /* shouldn't happen, but avoids warnings */
618
/*************************************************************/
619
/* Clear Screen***********************************************/
620
/*************************************************************/
622
void clear_screen(void)
624
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, skins[selected_skin].background_colour >> 16 & 0xff, skins[selected_skin].background_colour >> 8 & 0xff, skins[selected_skin].background_colour & 0xff));
627
/***************************************************************************
629
***************************************************************************/
630
/* Now allows the setting of any resolution with a choice of field_sizes */
632
/* On exit: returns 1 on error */
634
int set_video_mode(void) {
636
int hwsurface = FALSE, count, flags;
638
const SDL_VideoInfo *videoinfo;
640
char description[256];
642
/* Validate the screen resolution and field_size that the user may have requested */
643
if (video.xres == UNDEFINED || video.yres == UNDEFINED) {
644
video.xres = 640; video.yres = 480;
645
if (video.field_size == UNDEFINED) video.field_size = 32;
647
if (video.field_size == UNDEFINED) video.field_size = 32;
648
if (video.xres < 480 || video.yres < 480) video.field_size = 16;
650
/* Force GP2X screen resolution as there is no option */
651
#if defined(PLATFORM_GP2X)
652
video.xres = 320; video.yres = 240; video.field_size = 16;
654
/* Validate fullscreen that the user may have requested */
655
if (video.fullscreen == UNDEFINED) video.fullscreen = 0;
656
#if defined(PLATFORM_GP2X)
657
video.fullscreen = SDL_FULLSCREEN;
658
#elif defined(PLATFORM_ZAURUS)
659
video.fullscreen = SDL_FULLSCREEN;
661
/* Validate the viewport dimensions */
662
if (viewport.max_w == UNDEFINED || viewport.max_h == UNDEFINED) {
663
viewport.max_w = DEFAULT_VIEWPORT_WIDTH;
664
viewport.max_h = DEFAULT_VIEWPORT_HEIGHT;
666
if (viewport.maximise == UNDEFINED) viewport.maximise = FALSE;
669
printf("*** Start %s ***\n", __func__);
670
printf ("Fullscreen hwsurfaces :-\n");
672
/* Query available fullscreen hwsurface modes */
673
modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
676
printf ("None found\n");
678
} else if (modes == (SDL_Rect **) -1) {
680
printf("Any dimension is okay\n");
684
for (count = 0; modes[count]; ++count) {
686
printf("%dx%d\n", modes[count]->w, modes[count]->h);
688
if (modes[count]->w == video.xres && modes[count]->h == video.yres) {
694
printf ("Fullscreen swsurfaces :-\n");
696
/* Query available fullscreen swsurface modes */
697
modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_SWSURFACE);
700
printf ("None found\n");
702
} else if (modes == (SDL_Rect **) -1) {
704
printf("Any dimension is okay\n");
707
for (count = 0; modes[count]; ++count) {
709
printf("%dx%d\n", modes[count]->w, modes[count]->h);
714
videoinfo = SDL_GetVideoInfo();
715
printf ("Best video mode info :-\n");
716
printf ("hw_available: %u\n", videoinfo->hw_available);
717
printf ("wm_available: %u\n", videoinfo->wm_available);
718
printf ("blit_hw: %u\n", videoinfo->blit_hw);
719
printf ("blit_hw_CC: %u\n", videoinfo->blit_hw_CC);
720
printf ("blit_hw_A: %u\n", videoinfo->blit_hw_A);
721
printf ("blit_sw: %u\n", videoinfo->blit_sw);
722
printf ("blit_sw_CC: %u\n", videoinfo->blit_sw_CC);
723
printf ("blit_sw_A: %u\n", videoinfo->blit_sw_A);
724
printf ("blit_fill: %u\n", videoinfo->blit_fill);
725
printf ("video_mem: %uKB\n", videoinfo->video_mem);
726
printf ("BitsPerPixel: %u\n", videoinfo->vfmt->BitsPerPixel);
727
printf ("BytesPerPixel: %u\n", videoinfo->vfmt->BytesPerPixel);
730
/* Well after all that clever video mode detection code the GP2X
731
GPH SDL states it has hwsurface support and then seg faults ;) */
732
#if defined(PLATFORM_GP2X)
736
/* We have enough info to set the correct mode now */
738
flags = SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_ANYFORMAT | video.fullscreen;
739
strcpy(description, "double buffered hardware");
741
flags = SDL_SWSURFACE | SDL_ANYFORMAT | video.fullscreen;
742
strcpy(description, "software");
744
/* Attempt to set the requested video mode or fall back to some defaults */
745
for (count = 0; count < 3; count++) {
747
fprintf(stdout, "Setting video mode %ix%i 16bpp %s surface.\n", video.xres, video.yres, description);
748
} else if (count == 1) {
749
video.xres = 640; video.yres = 480; video.field_size = 32;
750
fprintf(stdout, "Trying default hi-res video mode %ix%i 16bpp %s surface.\n", video.xres, video.yres, description);
751
} else if (count == 2) {
752
video.xres = 320; video.yres = 240; video.field_size = 16;
753
fprintf(stdout, "Trying default low-res video mode %ix%i 16bpp %s surface.\n", video.xres, video.yres, description);
755
screen = SDL_SetVideoMode(video.xres, video.yres, 16, flags);
756
if (screen != NULL) {
758
} else if (count < 2) {
759
fprintf(stdout, "Failed: %s\n", SDL_GetError());
765
/* We won't be needing the mouse pointer if full screen */
766
if (video.fullscreen == SDL_FULLSCREEN) SDL_ShowCursor(SDL_DISABLE);
769
videoinfo = SDL_GetVideoInfo();
770
printf ("Current video mode info :-\n");
771
printf ("hw_available: %u\n", videoinfo->hw_available);
772
printf ("wm_available: %u\n", videoinfo->wm_available);
773
printf ("blit_hw: %u\n", videoinfo->blit_hw);
774
printf ("blit_hw_CC: %u\n", videoinfo->blit_hw_CC);
775
printf ("blit_hw_A: %u\n", videoinfo->blit_hw_A);
776
printf ("blit_sw: %u\n", videoinfo->blit_sw);
777
printf ("blit_sw_CC: %u\n", videoinfo->blit_sw_CC);
778
printf ("blit_sw_A: %u\n", videoinfo->blit_sw_A);
779
printf ("blit_fill: %u\n", videoinfo->blit_fill);
780
printf ("video_mem: %uKB\n", videoinfo->video_mem);
781
printf ("BitsPerPixel: %u\n", videoinfo->vfmt->BitsPerPixel);
782
printf ("BytesPerPixel: %u\n", videoinfo->vfmt->BytesPerPixel);
783
printf("*** Stop %s ***\n", __func__);
789
/***************************************************************************
790
* Toggle Fullscreen *
791
***************************************************************************/
792
/* Toggles between a window and fullscreen on supported platforms */
794
void toggle_fullscreen(int *fullscreen) {
795
if (!(SDL_WM_ToggleFullScreen(screen))) {
796
fprintf(stdout, "Unable to toggle fullscreen: %s\n", SDL_GetError());
799
/* We won't be needing the mouse pointer if full screen */
800
/* Be careful to record the current fullscreen state */
801
if (*fullscreen != SDL_FULLSCREEN) {
802
*fullscreen = SDL_FULLSCREEN;
803
SDL_ShowCursor(SDL_DISABLE);
806
SDL_ShowCursor(SDL_ENABLE);
811
/***************************************************************************
812
* Show Level Colour *
813
***************************************************************************/
814
/* Used for debugging */
816
void show_level_colour(int debug_colour_select_r, int debug_colour_select_g, int debug_colour_select_b, int debug_colour_select_component) {
818
int xoffset, yoffset;
821
xoffset = authorline.xoffset + video.field_size * 13.5;
822
yoffset = authorline.yoffset;
824
/* Display red component */
825
if (debug_colour_select_component == 0) {
826
bgcolor.r = 0xff; bgcolor.g = 0; bgcolor.b = 0;
827
fgcolor.r = 0; fgcolor.g = 0; fgcolor.b = 0;
829
bgcolor.r = 0; bgcolor.g = 0; bgcolor.b = 0;
830
fgcolor.r = 0xff; fgcolor.g = 0xff; fgcolor.b = 0xff;
832
sprintf(tempstring, "%02X", debug_colour_select_r);
833
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
834
destrect = set_rect(xoffset, yoffset, image->w, image->h);
835
SDL_BlitSurface(image, NULL, screen, &destrect);
837
SDL_FreeSurface(image);
838
/* Display green component */
839
if (debug_colour_select_component == 1) {
840
bgcolor.r = 0; bgcolor.g = 0xff; bgcolor.b = 0;
841
fgcolor.r = 0; fgcolor.g = 0; fgcolor.b = 0;
843
bgcolor.r = 0; bgcolor.g = 0; bgcolor.b = 0;
844
fgcolor.r = 0xff; fgcolor.g = 0xff; fgcolor.b = 0xff;
846
sprintf(tempstring, "%02X", debug_colour_select_g);
847
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
848
destrect = set_rect(xoffset, yoffset, image->w, image->h);
849
SDL_BlitSurface(image, NULL, screen, &destrect);
851
SDL_FreeSurface(image);
852
/* Display blue component */
853
if (debug_colour_select_component == 2) {
854
bgcolor.r = 0; bgcolor.g = 0; bgcolor.b = 0xff;
855
fgcolor.r = 0; fgcolor.g = 0; fgcolor.b = 0;
857
bgcolor.r = 0; bgcolor.g = 0; bgcolor.b = 0;
858
fgcolor.r = 0xff; fgcolor.g = 0xff; fgcolor.b = 0xff;
860
sprintf(tempstring, "%02X", debug_colour_select_b);
861
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
862
destrect = set_rect(xoffset, yoffset, image->w, image->h);
863
SDL_BlitSurface(image, NULL, screen, &destrect);
864
SDL_FreeSurface(image);
867
/***************************************************************************
868
* Inc Colour Component *
869
***************************************************************************/
870
/* Used for debugging */
872
void inc_colour_component(int *colour_component) {
873
if (*colour_component == 0xf8) {
874
*colour_component = 0xff;
875
} else if (*colour_component == 0xff) {
876
*colour_component = 0x0;
878
*colour_component += 0x8;
882
/***************************************************************************
883
* Dec Colour Component *
884
***************************************************************************/
885
/* Used for debugging */
887
void dec_colour_component(int *colour_component) {
888
if (*colour_component == 0x0) {
889
*colour_component = 0xff;
890
} else if (*colour_component == 0xff) {
891
*colour_component = 0xf8;
893
*colour_component -= 0x8;
897
/***************************************************************************
898
* Show Intro Screen *
899
***************************************************************************/
900
/* On entry: redrawlevel = REDRAW_INITIALISE to initialise
901
redrawlevel = REDRAW_EVERYTHING for everything
902
redrawlevel = REDRAW_INTERMEDIATE for menu
903
redrawlevel = REDRAW_ANIMATED for animated objects only */
905
void show_introscreen(int redrawlevel) {
907
int count, xoffset, yoffset;
908
char tempstring[256];
910
xoffset = (screen->w - video.field_size * 15) / 2;
911
yoffset = (screen->h - video.field_size * 15) / 2;
913
bgcolor.r = skins[selected_skin].background_colour >> 16 & 0xff; bgcolor.g = skins[selected_skin].background_colour >> 8 & 0xff; bgcolor.b = skins[selected_skin].background_colour & 0xff;
915
if (redrawlevel >= REDRAW_INITIALISE) {
916
/* Reinitialise some variables */
919
/* Restore normal key/button repeat values for these keys */
920
user_controls[ACTION_UP].delay = KEY_REPEAT_DELAY;
921
user_controls[ACTION_UP].interval = KEY_REPEAT_INTERVAL;
922
user_controls[ACTION_DOWN].delay = KEY_REPEAT_DELAY;
923
user_controls[ACTION_DOWN].interval = KEY_REPEAT_INTERVAL;
924
user_controls[ACTION_LEFT].delay = KEY_REPEAT_DELAY;
925
user_controls[ACTION_LEFT].interval = KEY_REPEAT_INTERVAL;
926
user_controls[ACTION_RIGHT].delay = KEY_REPEAT_DELAY;
927
user_controls[ACTION_RIGHT].interval = KEY_REPEAT_INTERVAL;
928
user_controls[ACTION_SHOOT_UP].delay = KEY_REPEAT_DELAY;
929
user_controls[ACTION_SHOOT_UP].interval = KEY_REPEAT_INTERVAL;
930
user_controls[ACTION_SHOOT_DOWN].delay = KEY_REPEAT_DELAY;
931
user_controls[ACTION_SHOOT_DOWN].interval = KEY_REPEAT_INTERVAL;
932
user_controls[ACTION_SHOOT_LEFT].delay = KEY_REPEAT_DELAY;
933
user_controls[ACTION_SHOOT_LEFT].interval = KEY_REPEAT_INTERVAL;
934
user_controls[ACTION_SHOOT_RIGHT].delay = KEY_REPEAT_DELAY;
935
user_controls[ACTION_SHOOT_RIGHT].interval = KEY_REPEAT_INTERVAL;
938
if (redrawlevel >= REDRAW_EVERYTHING) {
939
/* Reinitialise some variables */
942
/* Set entire screen to a colour */
945
/* Draw the version */
946
fgcolor.r = skins[selected_skin].version_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].version_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].version_text_colour & 0xff;
947
image = TTF_RenderUTF8_Shaded(font, VERSION, fgcolor, bgcolor);
948
if (video.field_size == 16) {
949
destrect = set_rect(xoffset + 217, yoffset + 37, image->w, image->h);
950
} else if (video.field_size == 32) {
951
destrect = set_rect(xoffset + 438, yoffset + 55, image->w, image->h);
953
SDL_BlitSurface(image, NULL, screen, &destrect);
954
SDL_FreeSurface(image);
956
/* Draw the intro story */
957
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
958
for (count = 0; count < TXT_INTRO_STORY_ROWS; count++) {
959
image = TTF_RenderUTF8_Shaded(font, &txt_intro_story[count * TXT_MAX_COLS], fgcolor, bgcolor);
960
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
961
if (video.field_size == 16) {
962
destrect = set_rect(xoffset + 2, yoffset + 48 + count * (FONTSIZE16 + video.field_size / 8), image->w, image->h);
963
} else if (video.field_size == 32) {
964
destrect = set_rect(xoffset + 4, yoffset + 96 + count * (FONTSIZE32 + video.field_size / 8), image->w, image->h);
966
SDL_BlitSurface(image, NULL, screen, &destrect);
967
SDL_FreeSurface(image);
970
/* Draw the intro keys */
971
fgcolor.r = skins[selected_skin].default_controls_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].default_controls_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].default_controls_text_colour & 0xff;
972
for (count = 0; count < TXT_INTRO_KEYS_ROWS; count++) {
973
image = TTF_RenderUTF8_Shaded(font, &txt_intro_keys[count * TXT_MAX_COLS], fgcolor, bgcolor);
974
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
975
if (video.field_size == 16) {
976
destrect = set_rect(xoffset + 6, yoffset + 105 + count * (FONTSIZE16 + video.field_size / 8), image->w, image->h);
977
} else if (video.field_size == 32) {
978
destrect = set_rect(xoffset + 12, yoffset + 210 + count * (FONTSIZE32 + video.field_size / 8), image->w, image->h);
980
SDL_BlitSurface(image, NULL, screen, &destrect);
981
SDL_FreeSurface(image);
984
/* Draw the intro keys description */
985
fgcolor.r = skins[selected_skin].default_controls_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].default_controls_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].default_controls_text_colour & 0xff;
986
for (count = 0; count < TXT_INTRO_KEYS_DESCRIPTION_ROWS; count++) {
987
image = TTF_RenderUTF8_Shaded(font, &txt_intro_keys_description[count * TXT_MAX_COLS], fgcolor, bgcolor);
988
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
989
if (video.field_size == 16) {
990
destrect = set_rect(xoffset + 79, yoffset + 105 + count * (FONTSIZE16 + video.field_size / 8), image->w, image->h);
991
} else if (video.field_size == 32) {
992
destrect = set_rect(xoffset + 158, yoffset + 210 + count * (FONTSIZE32 + video.field_size / 8), image->w, image->h);
994
SDL_BlitSurface(image, NULL, screen, &destrect);
995
SDL_FreeSurface(image);
998
/* Draw the intro credits */
999
fgcolor.r = skins[selected_skin].credits_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].credits_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].credits_text_colour & 0xff;
1000
for (count = 0; count < TXT_INTRO_CREDITS_ROWS; count++) {
1001
image = TTF_RenderUTF8_Shaded(font, &txt_intro_credits[count * TXT_MAX_COLS], fgcolor, bgcolor);
1002
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1003
if (video.field_size == 16) {
1004
destrect = set_rect(screen->w / 2 - image->w / 2, yoffset + 199 + count * (FONTSIZE16 + video.field_size / 8), image->w, image->h);
1005
} else if (video.field_size == 32) {
1006
destrect = set_rect(screen->w / 2 - image->w / 2, yoffset + 398 + count * (FONTSIZE32 + video.field_size / 8), image->w, image->h);
1008
SDL_BlitSurface(image, NULL, screen, &destrect);
1009
SDL_FreeSurface(image);
1013
if (redrawlevel >= REDRAW_INTERMEDIATE) {
1014
/* Erase the menu text area only */
1015
if (video.field_size == 16) {
1016
destrect = set_rect(xoffset + 126, yoffset + 105, 112, 86);
1017
} else if (video.field_size == 32) {
1018
destrect = set_rect(xoffset + 252, yoffset + 210, 224, 172);
1020
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, skins[selected_skin].background_colour >> 16 & 0xff, skins[selected_skin].background_colour >> 8 & 0xff, skins[selected_skin].background_colour & 0xff));
1022
/* Draw the intro menu text */
1023
for (count = 0; count < TXT_INTRO_MENU_ROWS; count++) {
1024
if (count - 1 == introscreenmenuposition) {
1025
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1027
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1029
image = TTF_RenderUTF8_Shaded(font, &txt_intro_menu[count * TXT_MAX_COLS], fgcolor, bgcolor);
1030
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1031
if (video.field_size == 16) {
1032
destrect = set_rect(xoffset + 129, yoffset + 105 + count * (FONTSIZE16 + video.field_size / 8), image->w, image->h);
1033
} else if (video.field_size == 32) {
1034
destrect = set_rect(xoffset + 258, yoffset + 210 + count * (FONTSIZE32 + video.field_size / 8), image->w, image->h);
1036
SDL_BlitSurface(image, NULL, screen, &destrect);
1037
SDL_FreeSurface(image);
1040
/* Draw the current level */
1042
strcpy(tempstring, "< ");
1043
if (level_packs[selected_pack].level_selected > 1) {
1044
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1046
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1048
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1049
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1050
if (video.field_size == 16) {
1051
destrect = set_rect(xoffset + 164, yoffset + 129, image->w, image->h);
1052
} else if (video.field_size == 32) {
1053
destrect = set_rect(xoffset + 330, yoffset + 258, image->w, image->h);
1055
SDL_BlitSurface(image, NULL, screen, &destrect);
1056
destrect.x += image->w;
1057
SDL_FreeSurface(image);
1059
sprintf(tempstring, "%i %s %i", level_packs[selected_pack].level_selected, txt_of, level_packs[selected_pack].last_level);
1060
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1061
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1062
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1063
destrect.w = image->w; destrect.h = image->h;
1064
SDL_BlitSurface(image, NULL, screen, &destrect);
1065
destrect.x += image->w;
1066
SDL_FreeSurface(image);
1068
strcpy(tempstring, " >");
1069
if (level_packs[selected_pack].level_selected < level_packs[selected_pack].level_reached) {
1070
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1072
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1074
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1075
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1076
destrect.w = image->w; destrect.h = image->h;
1077
SDL_BlitSurface(image, NULL, screen, &destrect);
1078
SDL_FreeSurface(image);
1080
/* Draw the current pack */
1082
strcpy(tempstring, "< ");
1083
if (selected_pack > 0) {
1084
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1086
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1088
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1089
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1090
if (video.field_size == 16) {
1091
destrect = set_rect(xoffset + 165, yoffset + 141, image->w, image->h);
1092
} else if (video.field_size == 32) {
1093
destrect = set_rect(xoffset + 330, yoffset + 282, image->w, image->h);
1095
SDL_BlitSurface(image, NULL, screen, &destrect);
1096
destrect.x += image->w;
1097
SDL_FreeSurface(image);
1099
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1100
image = TTF_RenderUTF8_Shaded(font, level_packs[selected_pack].name, fgcolor, bgcolor);
1101
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1102
destrect.w = image->w; destrect.h = image->h;
1103
SDL_BlitSurface(image, NULL, screen, &destrect);
1104
destrect.x += image->w;
1105
SDL_FreeSurface(image);
1107
strcpy(tempstring, " >");
1108
if (selected_pack < found_pack_count - 1) {
1109
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1111
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1113
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1114
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1115
destrect.w = image->w; destrect.h = image->h;
1116
SDL_BlitSurface(image, NULL, screen, &destrect);
1117
SDL_FreeSurface(image);
1120
if (redrawlevel >= REDRAW_ANIMATED) {
1122
if (bannerstate <= 0) {
1123
/* Draw the horizontal line under the GNU Robbo banner */
1124
if (video.field_size == 16) {
1125
destrect = set_rect(xoffset + 0, yoffset + 43, 217, video.field_size / 8);
1126
} else if (video.field_size == 32) {
1127
destrect = set_rect(xoffset + 0, yoffset + 86, 480, video.field_size / 8);
1129
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
1130
/* Draw the horizontal line above the controls area */
1131
destrect = set_rect(xoffset + 0, yoffset + 102 * video.field_size / 16, 240 * video.field_size / 16, video.field_size / 8);
1132
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
1133
/* Draw the horizontal line below the controls area */
1134
destrect = set_rect(xoffset + 0, yoffset + 194 * video.field_size / 16, 240 * video.field_size / 16, video.field_size / 8);
1135
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
1136
/* Draw the vertical line to the left of the controls area */
1137
destrect = set_rect(xoffset + 0, yoffset + 102 * video.field_size / 16, video.field_size / 8, 92 * video.field_size / 16);
1138
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
1139
/* Draw the vertical line in the middle of the controls area */
1140
destrect = set_rect(xoffset + 123 * video.field_size / 16, yoffset + 102 * video.field_size / 16, video.field_size / 8, 92 * video.field_size / 16);
1141
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
1142
/* Draw the vertical line to the right of the controls area */
1143
destrect = set_rect(xoffset + 238 * video.field_size / 16, yoffset + 102 * video.field_size / 16, video.field_size / 8, 92 * video.field_size / 16);
1144
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
1146
/* Draw the GNU Robbo banner */
1147
if (video.field_size == 16) {
1148
show_banner(banner, xoffset + 0, yoffset + 6, 80, 8);
1149
} else if (video.field_size == 32) {
1150
show_banner(banner, xoffset + 24, yoffset + 19, 80, 8);
1153
bannerstate = DELAY_BANNER;
1158
/***************************************************************************
1159
* Show Help Screen *
1160
***************************************************************************/
1161
/* On entry: redrawlevel = REDRAW_INITIALISE to initialise
1162
redrawlevel = REDRAW_EVERYTHING for everything
1163
redrawlevel = REDRAW_INTERMEDIATE for menu
1164
redrawlevel = REDRAW_ANIMATED for animated objects only */
1166
void show_helpscreen(int redrawlevel) {
1167
SDL_Rect srcrect, destrect;
1168
int xoffset, yoffset, yincrement = video.field_size + video.field_size / 4;
1169
Uint32 tilecolour = skins[selected_skin].help_tile_colour; /* 0x709070 0x60a000 0x907090 0x961B2B */
1170
int iconoffsets1[7 * 2] = {52, 1, 103, 1, 137, 18, 69, 35, 120, 1, 137, 1, 1, 18};
1171
int iconoffsets2[7 * 2] = {86, 1, 1, 1, 69, 1, 0, 0, 0, 0, 0, 0, 0, 0};
1172
int iconoffsets3[7 * 2] = {0, 0, 0, 0, 0, 0, 86, 69, 86, 69, 86, 69, 0, 0};
1173
char tempstring[256];
1176
xoffset = (screen->w - video.field_size * 15) / 2;
1177
yoffset = (screen->h - video.field_size * 15) / 2;
1179
bgcolor.r = skins[selected_skin].background_colour >> 16 & 0xff; bgcolor.g = skins[selected_skin].background_colour >> 8 & 0xff; bgcolor.b = skins[selected_skin].background_colour & 0xff;
1180
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1182
if (redrawlevel >= REDRAW_INITIALISE) {
1183
/* Reinitialise some variables */
1184
bannerframe = capsuleframe = teleportframe = barrierframe = butterflyframe = bearframe = 0;
1185
blackbearframe = birdframe = gunframe = laserframe = blasterframe = robboframe = 0;
1187
/* Restore normal key/button repeat values for these keys */
1188
user_controls[ACTION_UP].delay = KEY_REPEAT_DELAY;
1189
user_controls[ACTION_UP].interval = KEY_REPEAT_INTERVAL;
1190
user_controls[ACTION_DOWN].delay = KEY_REPEAT_DELAY;
1191
user_controls[ACTION_DOWN].interval = KEY_REPEAT_INTERVAL;
1192
user_controls[ACTION_LEFT].delay = KEY_REPEAT_DELAY;
1193
user_controls[ACTION_LEFT].interval = KEY_REPEAT_INTERVAL;
1194
user_controls[ACTION_RIGHT].delay = KEY_REPEAT_DELAY;
1195
user_controls[ACTION_RIGHT].interval = KEY_REPEAT_INTERVAL;
1196
user_controls[ACTION_SHOOT_UP].delay = KEY_REPEAT_DELAY;
1197
user_controls[ACTION_SHOOT_UP].interval = KEY_REPEAT_INTERVAL;
1198
user_controls[ACTION_SHOOT_DOWN].delay = KEY_REPEAT_DELAY;
1199
user_controls[ACTION_SHOOT_DOWN].interval = KEY_REPEAT_INTERVAL;
1200
user_controls[ACTION_SHOOT_LEFT].delay = KEY_REPEAT_DELAY;
1201
user_controls[ACTION_SHOOT_LEFT].interval = KEY_REPEAT_INTERVAL;
1202
user_controls[ACTION_SHOOT_RIGHT].delay = KEY_REPEAT_DELAY;
1203
user_controls[ACTION_SHOOT_RIGHT].interval = KEY_REPEAT_INTERVAL;
1206
if (redrawlevel >= REDRAW_EVERYTHING) {
1207
/* Reinitialise some variables */
1208
bannerstate = capsulestate = teleportstate = barrierstate = butterflystate = bearstate = 0;
1209
blackbearstate = birdstate = gunstate = laserstate = blasterstate = robbostate = 0;
1211
/* Set entire screen to a colour */
1214
if (helpscreenpage == 0) {
1216
/* Draw the help text */
1217
for (count = 0; count < TXT_HELP_PAGE0_ROWS; count++) {
1218
image = TTF_RenderUTF8_Shaded(font, &txt_help_page0[count * TXT_MAX_COLS], fgcolor, bgcolor);
1219
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1220
if (video.field_size == 16) {
1221
destrect = set_rect(xoffset + 2, yoffset + 57 + count * (FONTSIZE16 + video.field_size / 8), image->w, image->h);
1222
} else if (video.field_size == 32) {
1223
destrect = set_rect(xoffset + 4, yoffset + 104 + count * (FONTSIZE32 + video.field_size / 8), image->w, image->h);
1225
SDL_BlitSurface(image, NULL, screen, &destrect);
1226
SDL_FreeSurface(image);
1229
} else if (helpscreenpage == 1) {
1231
for (count = 0; count < TXT_HELP_PAGE1_ROWS; count++) {
1232
/* Draw the background tiles for the icons */
1233
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + count * yincrement, video.field_size, video.field_size);
1234
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1235
/* Draw the icons */
1236
srcrect = set_rect(iconoffsets1[count * 2] * video.field_size / 16, iconoffsets1[count * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1237
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + count * yincrement, video.field_size, video.field_size);
1238
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1240
/* Draw the background tile for the door icon */
1241
destrect = set_rect(xoffset + 2 * video.field_size / 16 + video.field_size * 8, yoffset + 57 * video.field_size / 16 + count * yincrement, video.field_size, video.field_size);
1242
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1243
/* Draw the door icon */
1244
srcrect = set_rect(154 * video.field_size / 16, 1 * video.field_size / 16, video.field_size, video.field_size);
1245
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1247
/* Draw the text for the icons */
1248
image = TTF_RenderUTF8_Shaded(font, &txt_help_page1[count * TXT_MAX_COLS], fgcolor, bgcolor);
1249
destrect = set_rect(xoffset + 2 * video.field_size / 16 + video.field_size * 1.5, yoffset + 57 * video.field_size / 16 + count * yincrement, image->w, image->h);
1250
SDL_BlitSurface(image, NULL, screen, &destrect);
1251
SDL_FreeSurface(image);
1254
} else if (helpscreenpage == 2) {
1256
for (count = 0; count < TXT_HELP_PAGE2_ROWS; count++) {
1258
/* Draw the background tiles for the icons */
1259
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + count * yincrement, video.field_size, video.field_size);
1260
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1261
/* Draw the icons */
1262
srcrect = set_rect(iconoffsets2[count * 2] * video.field_size / 16, iconoffsets2[count * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1263
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + count * yincrement, video.field_size, video.field_size);
1264
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1266
/* Draw the text for the icons */
1267
image = TTF_RenderUTF8_Shaded(font, &txt_help_page2[count * TXT_MAX_COLS], fgcolor, bgcolor);
1268
destrect = set_rect(xoffset + 2 * video.field_size / 16 + video.field_size * 1.5, yoffset + 57 * video.field_size / 16 + count * yincrement, image->w, image->h);
1269
SDL_BlitSurface(image, NULL, screen, &destrect);
1270
SDL_FreeSurface(image);
1273
} else if (helpscreenpage == 3) {
1275
for (count = 0; count < TXT_HELP_PAGE3_ROWS; count++) {
1276
if (count > 2 && count < 6) {
1277
/* Draw the background tiles for the icons */
1278
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + count * yincrement, video.field_size, video.field_size);
1279
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1280
/* Draw the icons */
1281
srcrect = set_rect(iconoffsets3[count * 2] * video.field_size / 16, iconoffsets3[count * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1282
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + count * yincrement, video.field_size, video.field_size);
1283
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1285
/* Draw the text for the icons */
1286
image = TTF_RenderUTF8_Shaded(font, &txt_help_page3[count * TXT_MAX_COLS], fgcolor, bgcolor);
1287
if (count >= 3 && count <= 5) {
1288
destrect = set_rect(xoffset + 2 * video.field_size / 16 + video.field_size * 6.5, yoffset + 57 * video.field_size / 16 + count * yincrement, image->w, image->h);
1290
destrect = set_rect(xoffset + 2 * video.field_size / 16 + video.field_size * 1.5, yoffset + 57 * video.field_size / 16 + count * yincrement, image->w, image->h);
1292
SDL_BlitSurface(image, NULL, screen, &destrect);
1293
SDL_FreeSurface(image);
1300
if (redrawlevel >= REDRAW_INTERMEDIATE) {
1303
if (helpscreenmenuposition == 1) {
1304
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1306
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1308
sprintf(tempstring, "%s", txt_Exit);
1309
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1310
destrect = set_rect(xoffset + 240 * video.field_size / 16 / 2 - image->w / 2, yoffset + 220 * video.field_size / 16, image->w, image->h);
1311
SDL_BlitSurface(image, NULL, screen, &destrect);
1312
SDL_FreeSurface(image);
1314
if (helpscreenpage == 0 || helpscreenpage == 1 || helpscreenpage == 2) {
1317
if (helpscreenmenuposition == 2) {
1318
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1320
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1322
sprintf(tempstring, "%s >", txt_Next);
1323
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1324
destrect = set_rect(xoffset + 238 * video.field_size / 16 - image->w, yoffset + 220 * video.field_size / 16, image->w, image->h);
1325
SDL_BlitSurface(image, NULL, screen, &destrect);
1326
SDL_FreeSurface(image);
1330
if (helpscreenpage == 1 || helpscreenpage == 2 || helpscreenpage == 3) {
1333
if (helpscreenmenuposition == 0) {
1334
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1336
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1338
sprintf(tempstring, "< %s", txt_Back);
1339
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1340
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 220 * video.field_size / 16, image->w, image->h);
1341
SDL_BlitSurface(image, NULL, screen, &destrect);
1342
SDL_FreeSurface(image);
1347
if (redrawlevel >= REDRAW_ANIMATED) {
1349
if (helpscreenpage == 2) {
1350
/* Animate the capsule */
1352
if (capsulestate <= 0) {
1353
srcrect = set_rect(capsuleoffsets[capsuleframe * 2] * video.field_size / 16, capsuleoffsets[capsuleframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1354
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 3 * yincrement, video.field_size, video.field_size);
1355
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1356
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1357
capsuleframe++; if (capsuleframe > 1) capsuleframe = 0;
1358
capsulestate = DELAY_CAPSULE;
1361
/* Animate the teleport */
1363
if (teleportstate <= 0) {
1364
srcrect = set_rect(teleportoffsets[teleportframe * 2] * video.field_size / 16, teleportoffsets[teleportframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1365
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 4 * yincrement, video.field_size, video.field_size);
1366
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1367
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1368
teleportframe++; if (teleportframe > 1) teleportframe = 0;
1369
teleportstate = DELAY_TELEPORT;
1372
/* Animate the barrier */
1374
if (barrierstate <= 0) {
1375
srcrect = set_rect(barrieroffsets[barrierframe * 2] * video.field_size / 16, barrieroffsets[barrierframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1376
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 5 * yincrement, video.field_size, video.field_size);
1377
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1378
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1379
barrierframe++; if (barrierframe > 1) barrierframe = 0;
1380
barrierstate = DELAY_BARRIER;
1383
/* Animate the butterfly */
1385
if (butterflystate <= 0) {
1386
srcrect = set_rect(butterflyoffsets[butterflyframe * 2] * video.field_size / 16, butterflyoffsets[butterflyframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1387
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 6 * yincrement, video.field_size, video.field_size);
1388
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1389
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1390
butterflyframe++; if (butterflyframe > 1) butterflyframe = 0;
1391
butterflystate = DELAY_BUTTERFLY;
1394
} else if (helpscreenpage == 3) {
1396
/* Animate the bear */
1398
if (bearstate <= 0) {
1399
srcrect = set_rect(bearoffsets[bearframe * 2] * video.field_size / 16, bearoffsets[bearframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1400
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16, video.field_size, video.field_size);
1401
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1402
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1403
bearframe++; if (bearframe > 1) bearframe = 0;
1404
bearstate = DELAY_BEAR;
1407
/* Animate the blackbear */
1409
if (blackbearstate <= 0) {
1410
srcrect = set_rect(blackbearoffsets[blackbearframe * 2] * video.field_size / 16, blackbearoffsets[blackbearframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1411
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 1 * yincrement, video.field_size, video.field_size);
1412
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1413
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1414
blackbearframe++; if (blackbearframe > 1) blackbearframe = 0;
1415
blackbearstate = DELAY_BEAR;
1418
/* Animate the bird */
1420
if (birdstate <= 0) {
1421
srcrect = set_rect(birdoffsets[birdframe * 2] * video.field_size / 16, birdoffsets[birdframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1422
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 2 * yincrement, video.field_size, video.field_size);
1423
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1424
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1425
birdframe++; if (birdframe > 1) birdframe = 0;
1426
birdstate = DELAY_BIRD;
1429
/* Animate the gun */
1431
if (gunstate <= 0) {
1432
destrect = set_rect(xoffset + 2 * video.field_size / 16 + video.field_size, yoffset + 57 * video.field_size / 16 + 3 * yincrement, video.field_size * 5, video.field_size);
1433
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1434
for (count = 0; count < 5; count++) {
1435
if (gunoffsets[gunframe * 2] != 0 && gunoffsets[gunframe * 2 + 1] != 0) {
1436
srcrect = set_rect(gunoffsets[gunframe * 2] * video.field_size / 16, gunoffsets[gunframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1437
destrect = set_rect(xoffset + 2 * video.field_size / 16 + (count + 1) * video.field_size, yoffset + 57 * video.field_size / 16 + 3 * yincrement, video.field_size, video.field_size);
1438
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1440
gunframe++; if (gunframe >= 25) gunframe = 0;
1442
gunstate = DELAY_LASER;
1445
/* Animate the laser */
1447
if (laserstate <= 0) {
1448
destrect = set_rect(xoffset + 2 * video.field_size / 16 + video.field_size, yoffset + 57 * video.field_size / 16 + 4 * yincrement, video.field_size * 5, video.field_size);
1449
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1450
for (count = 0; count < 5; count++) {
1451
if (laseroffsets[laserframe * 2] != 0 && laseroffsets[laserframe * 2 + 1] != 0) {
1452
srcrect = set_rect(laseroffsets[laserframe * 2] * video.field_size / 16, laseroffsets[laserframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1453
destrect = set_rect(xoffset + 2 * video.field_size / 16 + (count + 1) * video.field_size, yoffset + 57 * video.field_size / 16 + 4 * yincrement, video.field_size, video.field_size);
1454
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1456
laserframe++; if (laserframe >= 70) laserframe = 0;
1458
if (laserframe < 45) {
1459
laserstate = DELAY_LASER;
1461
laserstate = DELAY_LITTLE_BOOM;
1465
/* Animate the blaster */
1467
if (blasterstate <= 0) {
1468
destrect = set_rect(xoffset + 2 * video.field_size / 16 + video.field_size, yoffset + 57 * video.field_size / 16 + 5 * yincrement, video.field_size * 5, video.field_size);
1469
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1470
for (count = 0; count < 5; count++) {
1471
if (blasteroffsets[blasterframe * 2] != 0 && blasteroffsets[blasterframe * 2 + 1] != 0) {
1472
srcrect = set_rect(blasteroffsets[blasterframe * 2] * video.field_size / 16, blasteroffsets[blasterframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1473
destrect = set_rect(xoffset + 2 * video.field_size / 16 + (count + 1) * video.field_size, yoffset + 57 * video.field_size / 16 + 5 * yincrement, video.field_size, video.field_size);
1474
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1476
blasterframe++; if (blasterframe >= 45) blasterframe = 0;
1478
blasterstate = DELAY_LASER;
1483
if (robbostate <= 0) {
1484
srcrect = set_rect(robbooffsets[robboframe * 2] * video.field_size / 16, robbooffsets[robboframe * 2 + 1] * video.field_size / 16, video.field_size, video.field_size);
1485
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 6 * yincrement, video.field_size, video.field_size);
1486
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, tilecolour >> 16 & 0xff, tilecolour >> 8 & 0xff, tilecolour & 0xff));
1487
SDL_BlitSurface(icons, &srcrect, screen, &destrect);
1488
robboframe++; if (robboframe > 1) robboframe = 0;
1489
robbostate = DELAY_ROBBO;
1493
/* Animate the Help banner */
1495
if (bannerstate <= 0) {
1496
/* Draw the horizontal line under the banner */
1497
destrect = set_rect(xoffset + 0, yoffset + 43 * video.field_size / 16, 240 * video.field_size / 16, video.field_size / 8);
1498
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
1500
/* Draw the Help banner */
1501
if (video.field_size == 16) {
1502
show_banner(helpscreenbanner, screen->w / 2 - 33 * 3 / 2, yoffset + 6, 33, 10);
1503
} else if (video.field_size == 32) {
1504
show_banner(helpscreenbanner, screen->w / 2 - 33 * 5 / 2, yoffset + 19, 33, 10);
1507
bannerstate = DELAY_BANNER;
1512
/***************************************************************************
1513
* Show Options Screen *
1514
***************************************************************************/
1515
/* On entry: redrawlevel = REDRAW_INITIALISE to initialise
1516
redrawlevel = REDRAW_EVERYTHING for everything
1517
redrawlevel = REDRAW_INTERMEDIATE for menu
1518
redrawlevel = REDRAW_ANIMATED for animated objects only */
1520
void show_optionsscreen(int redrawlevel) {
1521
int xoffset, yoffset, yincrement = video.field_size;
1522
SDL_Surface *icons_preview;
1523
char tempstring[256];
1527
xoffset = (screen->w - video.field_size * 15) / 2;
1528
yoffset = (screen->h - video.field_size * 15) / 2;
1530
bgcolor.r = skins[selected_skin].background_colour >> 16 & 0xff; bgcolor.g = skins[selected_skin].background_colour >> 8 & 0xff; bgcolor.b = skins[selected_skin].background_colour & 0xff;
1531
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1533
if (redrawlevel >= REDRAW_INITIALISE) {
1534
/* Reinitialise some variables */
1536
temp_game_cycle_limit = game_cycle_limit;
1537
temp_key_repeat_delay = key_repeat_delay;
1538
temp_key_repeat_interval = key_repeat_interval;
1539
temp_default_joystick = default_joystick;
1540
temp_joystick_dead_zone = joystick_dead_zone;
1541
temp_selected_skin = selected_skin;
1542
temp_selected_locale = selected_locale;
1543
for (count = 0; count < USER_CONTROLS; count++) {
1544
temp_user_controls[count].device = user_controls[count].device;
1545
temp_user_controls[count].id = user_controls[count].id;
1546
temp_user_controls[count].mod = user_controls[count].mod;
1549
/* Restore normal key/button repeat values for these keys */
1550
user_controls[ACTION_UP].delay = KEY_REPEAT_DELAY;
1551
user_controls[ACTION_UP].interval = KEY_REPEAT_INTERVAL;
1552
user_controls[ACTION_DOWN].delay = KEY_REPEAT_DELAY;
1553
user_controls[ACTION_DOWN].interval = KEY_REPEAT_INTERVAL;
1554
user_controls[ACTION_LEFT].delay = KEY_REPEAT_DELAY;
1555
user_controls[ACTION_LEFT].interval = KEY_REPEAT_INTERVAL;
1556
user_controls[ACTION_RIGHT].delay = KEY_REPEAT_DELAY;
1557
user_controls[ACTION_RIGHT].interval = KEY_REPEAT_INTERVAL;
1558
user_controls[ACTION_SHOOT_UP].delay = KEY_REPEAT_DELAY;
1559
user_controls[ACTION_SHOOT_UP].interval = KEY_REPEAT_INTERVAL;
1560
user_controls[ACTION_SHOOT_DOWN].delay = KEY_REPEAT_DELAY;
1561
user_controls[ACTION_SHOOT_DOWN].interval = KEY_REPEAT_INTERVAL;
1562
user_controls[ACTION_SHOOT_LEFT].delay = KEY_REPEAT_DELAY;
1563
user_controls[ACTION_SHOOT_LEFT].interval = KEY_REPEAT_INTERVAL;
1564
user_controls[ACTION_SHOOT_RIGHT].delay = KEY_REPEAT_DELAY;
1565
user_controls[ACTION_SHOOT_RIGHT].interval = KEY_REPEAT_INTERVAL;
1568
if (redrawlevel >= REDRAW_EVERYTHING) {
1569
/* Reinitialise some variables */
1572
/* Set entire screen to a colour */
1576
if (redrawlevel >= REDRAW_INTERMEDIATE) {
1578
if (optionsscreenpage == 0) {
1581
if (optionsscreenmenuposition[optionsscreenpage] == 0) {
1582
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1584
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1586
image = TTF_RenderUTF8_Shaded(font, txt_Game_Speed, fgcolor, bgcolor);
1587
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16, image->w, image->h);
1588
SDL_BlitSurface(image, NULL, screen, &destrect);
1589
destrect.x += image->w;
1590
SDL_FreeSurface(image);
1593
if (temp_game_cycle_limit < GAME_CYCLE_LIMIT_MAX) {
1594
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1596
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1598
image = TTF_RenderUTF8_Shaded(font, " +< ", fgcolor, bgcolor);
1599
destrect.w = image->w; destrect.h = image->h;
1600
SDL_BlitSurface(image, NULL, screen, &destrect);
1601
destrect.x += image->w;
1602
SDL_FreeSurface(image);
1605
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1606
if (temp_game_cycle_limit == 33) {
1607
sprintf(tempstring, "%s", txt_Fast);
1608
} else if (temp_game_cycle_limit == 25) {
1609
sprintf(tempstring, "%s", txt_Normal);
1610
} else if (temp_game_cycle_limit == 20) {
1611
sprintf(tempstring, "%s", txt_Slow);
1613
sprintf(tempstring, "%iHz", temp_game_cycle_limit);
1615
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1616
destrect.w = image->w; destrect.h = image->h;
1617
SDL_BlitSurface(image, NULL, screen, &destrect);
1618
destrect.x += image->w;
1619
SDL_FreeSurface(image);
1622
if (temp_game_cycle_limit > GAME_CYCLE_LIMIT_MIN) {
1623
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1625
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1627
image = TTF_RenderUTF8_Shaded(font, " >- ", fgcolor, bgcolor);
1628
destrect.w = image->w; destrect.h = image->h;
1629
SDL_BlitSurface(image, NULL, screen, &destrect);
1630
SDL_FreeSurface(image);
1632
/* Default Joystick */
1633
if (joystick_count == 0) {
1634
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
1635
} else if (optionsscreenmenuposition[optionsscreenpage] == 1) {
1636
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1638
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1640
image = TTF_RenderUTF8_Shaded(font, txt_Default_Joystick, fgcolor, bgcolor);
1641
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 1 * yincrement, image->w, image->h);
1642
SDL_BlitSurface(image, NULL, screen, &destrect);
1643
destrect.x += image->w;
1644
SDL_FreeSurface(image);
1647
if (joystick_count == 0) {
1648
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
1649
} else if (temp_default_joystick > 0) {
1650
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1652
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1654
image = TTF_RenderUTF8_Shaded(font, " < ", fgcolor, bgcolor);
1655
destrect.w = image->w; destrect.h = image->h;
1656
SDL_BlitSurface(image, NULL, screen, &destrect);
1657
destrect.x += image->w;
1658
SDL_FreeSurface(image);
1661
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1662
if (joystick_count == 0) {
1663
strcpy(tempstring, txt_No_joystick_found);
1664
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
1665
} else if (strlen(joystick_list[temp_default_joystick]) <= 28) {
1666
sprintf(tempstring, "%i:", temp_default_joystick);
1667
strcat(tempstring, joystick_list[temp_default_joystick]);
1669
sprintf(tempstring, "%i:", temp_default_joystick);
1670
strncat(tempstring, joystick_list[temp_default_joystick], 28 - 3);
1671
tempstring[28 + 2 - 4] = '\0'; /* If max characters were copied then the string won't be null terminated */
1672
strcat(tempstring, "...");
1674
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1675
destrect.w = 240 * video.field_size / 16; destrect.h = video.field_size;
1676
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bgcolor.r, bgcolor.g, bgcolor.b));
1677
destrect.w = image->w; destrect.h = image->h;
1678
SDL_BlitSurface(image, NULL, screen, &destrect);
1679
destrect.x += image->w;
1680
SDL_FreeSurface(image);
1683
if (joystick_count == 0) {
1684
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
1685
} else if (temp_default_joystick < joystick_count - 1) {
1686
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1688
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1690
image = TTF_RenderUTF8_Shaded(font, " > ", fgcolor, bgcolor);
1691
destrect.w = image->w; destrect.h = image->h;
1692
SDL_BlitSurface(image, NULL, screen, &destrect);
1693
SDL_FreeSurface(image);
1695
/* Joystick Axes Dead Zone */
1696
if (joystick_count == 0) {
1697
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
1698
} else if (optionsscreenmenuposition[optionsscreenpage] == 2) {
1699
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1701
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1703
image = TTF_RenderUTF8_Shaded(font, txt_Joystick_Axes_Dead_Zone, fgcolor, bgcolor);
1704
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 2 * yincrement, image->w, image->h);
1705
SDL_BlitSurface(image, NULL, screen, &destrect);
1706
destrect.x += image->w;
1707
SDL_FreeSurface(image);
1710
if (joystick_count == 0) {
1711
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
1712
} else if (temp_joystick_dead_zone > 1) {
1713
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1715
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1717
image = TTF_RenderUTF8_Shaded(font, " < ", fgcolor, bgcolor);
1718
destrect.w = image->w; destrect.h = image->h;
1719
SDL_BlitSurface(image, NULL, screen, &destrect);
1720
destrect.x += image->w;
1721
SDL_FreeSurface(image);
1724
if (joystick_count == 0) {
1725
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
1727
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1729
sprintf(tempstring, "%i%%", temp_joystick_dead_zone);
1730
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1731
destrect.w = image->w; destrect.h = image->h;
1732
SDL_BlitSurface(image, NULL, screen, &destrect);
1733
destrect.x += image->w;
1734
SDL_FreeSurface(image);
1737
if (joystick_count == 0) {
1738
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
1739
} else if (temp_joystick_dead_zone < 99) {
1740
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1742
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1744
image = TTF_RenderUTF8_Shaded(font, " > ", fgcolor, bgcolor);
1745
destrect.w = image->w; destrect.h = image->h;
1746
SDL_BlitSurface(image, NULL, screen, &destrect);
1747
SDL_FreeSurface(image);
1750
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1751
image = TTF_RenderUTF8_Shaded(font, txt_Key_Repeat, fgcolor, bgcolor);
1752
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 3 * yincrement, image->w, image->h);
1753
SDL_BlitSurface(image, NULL, screen, &destrect);
1754
SDL_FreeSurface(image);
1756
/* Key Repeat: Delay */
1757
if (optionsscreenmenuposition[optionsscreenpage] == 3) {
1758
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1760
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1762
image = TTF_RenderUTF8_Shaded(font, txt_Delay, fgcolor, bgcolor);
1763
destrect = set_rect(xoffset + 12 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 4 * yincrement, image->w, image->h);
1764
SDL_BlitSurface(image, NULL, screen, &destrect);
1765
destrect.x += image->w;
1766
SDL_FreeSurface(image);
1769
if (temp_key_repeat_delay > KEY_REPEAT_MIN) {
1770
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1772
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1774
image = TTF_RenderUTF8_Shaded(font, " +< ", fgcolor, bgcolor);
1775
destrect.w = image->w; destrect.h = image->h;
1776
SDL_BlitSurface(image, NULL, screen, &destrect);
1777
destrect.x += image->w;
1778
SDL_FreeSurface(image);
1781
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1782
sprintf(tempstring, "%ims", temp_key_repeat_delay);
1783
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1784
destrect.w = image->w; destrect.h = image->h;
1785
SDL_BlitSurface(image, NULL, screen, &destrect);
1786
destrect.x += image->w;
1787
SDL_FreeSurface(image);
1790
if (temp_key_repeat_delay < KEY_REPEAT_MAX) {
1791
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1793
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1795
image = TTF_RenderUTF8_Shaded(font, " >- ", fgcolor, bgcolor);
1796
destrect.w = image->w; destrect.h = image->h;
1797
SDL_BlitSurface(image, NULL, screen, &destrect);
1798
SDL_FreeSurface(image);
1800
/* Key Repeat: Interval */
1801
if (optionsscreenmenuposition[optionsscreenpage] == 4) {
1802
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1804
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1806
image = TTF_RenderUTF8_Shaded(font, txt_Interval, fgcolor, bgcolor);
1807
destrect = set_rect(xoffset + 12 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 5 * yincrement, image->w, image->h);
1808
SDL_BlitSurface(image, NULL, screen, &destrect);
1809
destrect.x += image->w;
1810
SDL_FreeSurface(image);
1813
if (temp_key_repeat_interval > KEY_REPEAT_MIN) {
1814
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1816
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1818
image = TTF_RenderUTF8_Shaded(font, " +< ", fgcolor, bgcolor);
1819
destrect.w = image->w; destrect.h = image->h;
1820
SDL_BlitSurface(image, NULL, screen, &destrect);
1821
destrect.x += image->w;
1822
SDL_FreeSurface(image);
1825
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1826
sprintf(tempstring, "%ims", temp_key_repeat_interval);
1827
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1828
destrect.w = image->w; destrect.h = image->h;
1829
SDL_BlitSurface(image, NULL, screen, &destrect);
1830
destrect.x += image->w;
1831
SDL_FreeSurface(image);
1834
if (temp_key_repeat_interval < KEY_REPEAT_MAX) {
1835
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1837
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1839
image = TTF_RenderUTF8_Shaded(font, " >- ", fgcolor, bgcolor);
1840
destrect.w = image->w; destrect.h = image->h;
1841
SDL_BlitSurface(image, NULL, screen, &destrect);
1842
SDL_FreeSurface(image);
1845
if (optionsscreenmenuposition[optionsscreenpage] == 5) {
1846
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1848
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1850
image = TTF_RenderUTF8_Shaded(font, txt_Language, fgcolor, bgcolor);
1851
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 6 * yincrement, image->w, image->h);
1852
SDL_BlitSurface(image, NULL, screen, &destrect);
1853
destrect.x += image->w;
1854
SDL_FreeSurface(image);
1857
if (temp_selected_locale > 0) {
1858
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1860
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1862
image = TTF_RenderUTF8_Shaded(font, " < ", fgcolor, bgcolor);
1863
destrect.w = image->w; destrect.h = image->h;
1864
SDL_BlitSurface(image, NULL, screen, &destrect);
1865
destrect.x += image->w;
1866
SDL_FreeSurface(image);
1869
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1870
image = TTF_RenderUTF8_Shaded(font, locales[temp_selected_locale].name, fgcolor, bgcolor);
1871
destrect.w = image->w; destrect.h = image->h;
1872
SDL_BlitSurface(image, NULL, screen, &destrect);
1873
destrect.x += image->w;
1874
SDL_FreeSurface(image);
1877
if (temp_selected_locale < locale_count - 1) {
1878
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1880
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
1882
image = TTF_RenderUTF8_Shaded(font, " > ", fgcolor, bgcolor);
1883
destrect.w = image->w; destrect.h = image->h;
1884
SDL_BlitSurface(image, NULL, screen, &destrect);
1885
SDL_FreeSurface(image);
1888
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1889
sprintf(tempstring, "%s ", txt_Translation_by);
1890
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1891
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 7 * yincrement, image->w, image->h);
1892
SDL_BlitSurface(image, NULL, screen, &destrect);
1893
destrect.x += image->w;
1894
SDL_FreeSurface(image);
1897
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1898
image = TTF_RenderUTF8_Shaded(font, locales[temp_selected_locale].author, fgcolor, bgcolor);
1899
destrect.w = 240 * video.field_size / 16; destrect.h = video.field_size;
1900
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bgcolor.r, bgcolor.g, bgcolor.b));
1901
destrect.w = image->w; destrect.h = image->h;
1902
SDL_BlitSurface(image, NULL, screen, &destrect);
1903
SDL_FreeSurface(image);
1905
} else if (optionsscreenpage == 1) {
1907
/* Draw the control reconfiguration help text */
1908
for (count = 0; count < TXT_OPTIONS_PAGE1_ROWS; count++) {
1909
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1910
image = TTF_RenderUTF8_Shaded(font, &txt_options_page1[count * TXT_MAX_COLS], fgcolor, bgcolor);
1911
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
1912
if (video.field_size == 16) {
1913
destrect = set_rect(xoffset + 2, yoffset + 57 + count * (FONTSIZE16 + video.field_size / 8), image->w, image->h);
1914
} else if (video.field_size == 32) {
1915
destrect = set_rect(xoffset + 4, yoffset + 104 + count * (FONTSIZE32 + video.field_size / 8), image->w, image->h);
1917
SDL_BlitSurface(image, NULL, screen, &destrect);
1918
SDL_FreeSurface(image);
1921
} else if (optionsscreenpage >= 2 && optionsscreenpage <= 4) {
1923
for (count = 0; count < 9; count++) {
1926
if (optionsscreenmenuposition[optionsscreenpage] == count) {
1927
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
1929
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
1931
if (count + (optionsscreenpage - 2) * 9 == ACTION_UP) {
1932
sprintf(tempstring, "%s ", txt_Move_Up);
1933
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_DOWN) {
1934
sprintf(tempstring, "%s ", txt_Move_Down);
1935
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_LEFT) {
1936
sprintf(tempstring, "%s ", txt_Move_Left);
1937
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_RIGHT) {
1938
sprintf(tempstring, "%s ", txt_Move_Right);
1939
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_SHOOT_UP) {
1940
sprintf(tempstring, "%s ", txt_Shoot_Up);
1941
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_SHOOT_DOWN) {
1942
sprintf(tempstring, "%s ", txt_Shoot_Down);
1943
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_SHOOT_LEFT) {
1944
sprintf(tempstring, "%s ", txt_Shoot_Left);
1945
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_SHOOT_RIGHT) {
1946
sprintf(tempstring, "%s ", txt_Shoot_Right);
1947
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_RESTART) {
1948
sprintf(tempstring, "%s ", txt_Restart);
1949
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_SELECT) {
1950
sprintf(tempstring, "%s ", txt_Confirm);
1951
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_EXIT) {
1952
sprintf(tempstring, "%s ", txt_Exit);
1953
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_HELP) {
1954
sprintf(tempstring, "%s ", txt_Help);
1955
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_OPTIONS) {
1956
sprintf(tempstring, "%s ", txt_Options);
1957
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_PREVIOUS_LEVEL) {
1958
sprintf(tempstring, "%s ", txt_Previous_Level);
1959
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_NEXT_LEVEL) {
1960
sprintf(tempstring, "%s ", txt_Next_Level);
1961
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_PREVIOUS_PACK) {
1962
sprintf(tempstring, "%s ", txt_Previous_Pack);
1963
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_NEXT_PACK) {
1964
sprintf(tempstring, "%s ", txt_Next_Pack);
1965
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_TOGGLE_FULLSCREEN) {
1966
sprintf(tempstring, "%s ", txt_Toggle_Fullscreen);
1967
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_MODIFIER1) {
1968
sprintf(tempstring, "%s1 ", txt_Modifier);
1969
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_MODIFIER2) {
1970
sprintf(tempstring, "%s2 ", txt_Modifier);
1971
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_HOME) {
1972
sprintf(tempstring, "%s ", txt_Home);
1973
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_END) {
1974
sprintf(tempstring, "%s ", txt_End);
1975
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_PAGEUP) {
1976
sprintf(tempstring, "%s ", txt_Page_Up);
1977
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_PAGEDOWN) {
1978
sprintf(tempstring, "%s ", txt_Page_Down);
1979
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_VOLUP) {
1980
sprintf(tempstring, "%s ", txt_Volume_Up);
1981
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_VOLDOWN) {
1982
sprintf(tempstring, "%s ", txt_Volume_Down);
1983
} else if (count + (optionsscreenpage - 2) * 9 == ACTION_NOT_USED1) {
1984
sprintf(tempstring, "%s ", txt_Restore_Default_Controls);
1986
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
1987
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + count * yincrement, 240 * video.field_size / 16, image->h);
1988
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bgcolor.r, bgcolor.g, bgcolor.b));
1989
destrect.w = image->w; destrect.h = image->h;
1990
SDL_BlitSurface(image, NULL, screen, &destrect);
1991
SDL_FreeSurface(image);
1993
destrect.x = xoffset + 110 * video.field_size / 16; /* Was 88 */
1996
if (count + (optionsscreenpage - 2) * 9 != ACTION_NOT_USED1) {
1997
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
1998
if (temp_user_controls[count + (optionsscreenpage - 2) * 9].device == UNDEFINED) {
1999
sprintf(tempstring, "%s", "-");
2000
} else if (temp_user_controls[count + (optionsscreenpage - 2) * 9].device == DEVICE_KEYBOARD) {
2001
sprintf(tempstring, "%s: ", txt_Key);
2002
} else if (temp_user_controls[count + (optionsscreenpage - 2) * 9].device == DEVICE_JOYSTICK) {
2003
sprintf(tempstring, "%s: ", txt_Joy);
2005
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
2006
destrect.w = image->w; destrect.h = image->h;
2007
SDL_BlitSurface(image, NULL, screen, &destrect);
2008
destrect.x += image->w;
2009
SDL_FreeSurface(image);
2012
if (temp_user_controls[count + (optionsscreenpage - 2) * 9].id == UNDEFINED) {
2013
sprintf(tempstring, "%s ", "-");
2015
if (joystick_count > 0) {
2016
get_keyjbtn_text(temp_user_controls[count + (optionsscreenpage - 2) * 9].device, temp_user_controls[count + (optionsscreenpage - 2) * 9].id, joystick_list[temp_default_joystick], tempstring);
2018
get_keyjbtn_text(temp_user_controls[count + (optionsscreenpage - 2) * 9].device, temp_user_controls[count + (optionsscreenpage - 2) * 9].id, "", tempstring);
2020
sprintf(tempstring, "%s ", tempstring);
2022
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
2023
destrect.w = image->w; destrect.h = image->h;
2024
SDL_BlitSurface(image, NULL, screen, &destrect);
2025
SDL_FreeSurface(image);
2027
destrect.x = xoffset + 190 * video.field_size / 16; /* Was 169 */
2030
if (count + (optionsscreenpage - 2) * 9 != ACTION_MODIFIER1 && count + (optionsscreenpage - 2) * 9 != ACTION_MODIFIER2) {
2031
if (temp_user_controls[count + (optionsscreenpage - 2) * 9].device == UNDEFINED) {
2032
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
2033
} else if (temp_user_controls[count + (optionsscreenpage - 2) * 9].mod != UNDEFINED) {
2034
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
2036
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
2038
image = TTF_RenderUTF8_Shaded(font, "<", fgcolor, bgcolor);
2039
destrect.w = image->w; destrect.h = image->h;
2040
SDL_BlitSurface(image, NULL, screen, &destrect);
2041
destrect.x += image->w;
2042
SDL_FreeSurface(image);
2045
if (temp_user_controls[count + (optionsscreenpage - 2) * 9].device == UNDEFINED) {
2046
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
2048
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
2050
if (temp_user_controls[count + (optionsscreenpage - 2) * 9].mod == UNDEFINED) {
2051
sprintf(tempstring, "%s", "--");
2052
} else if (temp_user_controls[count + (optionsscreenpage - 2) * 9].mod == ACTION_MODIFIER1) {
2053
sprintf(tempstring, " %s1 ", txt_Mod);
2054
} else if (temp_user_controls[count + (optionsscreenpage - 2) * 9].mod == ACTION_MODIFIER2) {
2055
sprintf(tempstring, " %s2 ", txt_Mod);
2057
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
2058
destrect.w = image->w; destrect.h = image->h;
2059
SDL_BlitSurface(image, NULL, screen, &destrect);
2060
destrect.x += image->w;
2061
SDL_FreeSurface(image);
2064
if (temp_user_controls[count + (optionsscreenpage - 2) * 9].device == UNDEFINED) {
2065
fgcolor.r = skins[selected_skin].menu_greyed_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_greyed_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_greyed_text_colour & 0xff;
2066
} else if (temp_user_controls[count + (optionsscreenpage - 2) * 9].mod != ACTION_MODIFIER2) {
2067
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
2069
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
2071
image = TTF_RenderUTF8_Shaded(font, "> ", fgcolor, bgcolor);
2072
destrect.w = image->w; destrect.h = image->h;
2073
SDL_BlitSurface(image, NULL, screen, &destrect);
2074
SDL_FreeSurface(image);
2079
} else if (optionsscreenpage == 5) {
2082
if (optionsscreenmenuposition[optionsscreenpage] == 0) {
2083
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
2085
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
2087
image = TTF_RenderUTF8_Shaded(font, txt_Skin, fgcolor, bgcolor);
2088
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 0 * yincrement, image->w, image->h);
2089
SDL_BlitSurface(image, NULL, screen, &destrect);
2090
destrect.x += image->w;
2091
SDL_FreeSurface(image);
2094
if (temp_selected_skin > 0) {
2095
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
2097
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
2099
image = TTF_RenderUTF8_Shaded(font, " < ", fgcolor, bgcolor);
2100
destrect.w = image->w; destrect.h = image->h;
2101
SDL_BlitSurface(image, NULL, screen, &destrect);
2102
destrect.x += image->w;
2103
SDL_FreeSurface(image);
2106
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
2107
image = TTF_RenderUTF8_Shaded(font, skins[temp_selected_skin].name, fgcolor, bgcolor);
2108
destrect.w = 240 * video.field_size / 16; destrect.h = video.field_size;
2109
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bgcolor.r, bgcolor.g, bgcolor.b));
2110
destrect.w = image->w; destrect.h = image->h;
2111
SDL_BlitSurface(image, NULL, screen, &destrect);
2112
destrect.x += image->w;
2113
SDL_FreeSurface(image);
2116
if (temp_selected_skin < skin_count - 1) {
2117
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
2119
fgcolor.r = skins[selected_skin].menu_selected_limit_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_limit_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_limit_text_colour & 0xff;
2121
image = TTF_RenderUTF8_Shaded(font, " > ", fgcolor, bgcolor);
2122
destrect.w = image->w; destrect.h = image->h;
2123
SDL_BlitSurface(image, NULL, screen, &destrect);
2124
SDL_FreeSurface(image);
2127
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
2128
sprintf(tempstring, "%s ", txt_By);
2129
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
2130
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 1 * yincrement, image->w, image->h);
2131
SDL_BlitSurface(image, NULL, screen, &destrect);
2132
destrect.x += image->w;
2133
SDL_FreeSurface(image);
2136
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
2137
image = TTF_RenderUTF8_Shaded(font, skins[temp_selected_skin].author, fgcolor, bgcolor);
2138
destrect.w = 240 * video.field_size / 16; destrect.h = video.field_size;
2139
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bgcolor.r, bgcolor.g, bgcolor.b));
2140
destrect.w = image->w; destrect.h = image->h;
2141
SDL_BlitSurface(image, NULL, screen, &destrect);
2142
SDL_FreeSurface(image);
2145
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
2146
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 57 * video.field_size / 16 + 2 * yincrement, 240 * video.field_size / 16, 3 * video.field_size);
2147
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bgcolor.r, bgcolor.g, bgcolor.b));
2148
for (count = 0; count < 3; count++) {
2149
image = TTF_RenderUTF8_Shaded(font, skins[temp_selected_skin].about[count], fgcolor, bgcolor);
2150
SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, bgcolor.r, bgcolor.g, bgcolor.b));
2151
destrect.w = image->w; destrect.h = image->h;
2152
SDL_BlitSurface(image, NULL, screen, &destrect);
2153
if (video.field_size == 16) {
2154
destrect.y += FONTSIZE16 + video.field_size / 8;
2155
} else if (video.field_size == 32) {
2156
destrect.y += FONTSIZE32 + video.field_size / 8;
2158
SDL_FreeSurface(image);
2161
/* Draw the icons preview image */
2162
icons_preview = create_skin_preview();
2163
destrect = set_rect(screen->w / 2 - icons_preview->w / 2, yoffset + 57 * video.field_size / 16 + 5 * video.field_size, video.field_size, video.field_size);
2164
SDL_BlitSurface(icons_preview, NULL, screen, &destrect);
2165
SDL_FreeSurface(icons_preview);
2168
/* Page navigation */
2169
if (optionsscreenpage > 0) {
2172
if (optionsscreenmenuposition[optionsscreenpage] == OPTIONS_MENUPOS_LEFT) {
2173
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
2175
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
2177
sprintf(tempstring, "< %s", txt_Back);
2178
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
2179
destrect = set_rect(xoffset + 2 * video.field_size / 16, yoffset + 220 * video.field_size / 16, image->w, image->h);
2180
SDL_BlitSurface(image, NULL, screen, &destrect);
2181
SDL_FreeSurface(image);
2185
if (optionsscreenmenuposition[optionsscreenpage] == OPTIONS_MENUPOS_SAVE) {
2186
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
2188
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
2190
image = TTF_RenderUTF8_Shaded(font, txt_Save, fgcolor, bgcolor);
2191
destrect = set_rect(xoffset + 90 * video.field_size / 16 - image->w / 2, yoffset + 220 * video.field_size / 16, image->w, image->h);
2192
SDL_BlitSurface(image, NULL, screen, &destrect);
2193
SDL_FreeSurface(image);
2196
if (optionsscreenmenuposition[optionsscreenpage] == OPTIONS_MENUPOS_EXIT) {
2197
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
2199
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
2201
image = TTF_RenderUTF8_Shaded(font, txt_Exit, fgcolor, bgcolor);
2202
destrect = set_rect(xoffset + 150 * video.field_size / 16 - image->w / 2, yoffset + 220 * video.field_size / 16, image->w, image->h);
2203
SDL_BlitSurface(image, NULL, screen, &destrect);
2204
SDL_FreeSurface(image);
2206
if (optionsscreenpage < OPTIONS_SCREEN_PAGES - 1) {
2208
if (optionsscreenmenuposition[optionsscreenpage] == OPTIONS_MENUPOS_RIGHT) {
2209
fgcolor.r = skins[selected_skin].menu_selected_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_selected_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_selected_text_colour & 0xff;
2211
fgcolor.r = skins[selected_skin].menu_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].menu_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].menu_text_colour & 0xff;
2213
sprintf(tempstring, "%s >", txt_Next);
2214
image = TTF_RenderUTF8_Shaded(font, tempstring, fgcolor, bgcolor);
2215
destrect = set_rect(xoffset + 238 * video.field_size / 16 - image->w, yoffset + 220 * video.field_size / 16, image->w, image->h);
2216
SDL_BlitSurface(image, NULL, screen, &destrect);
2217
SDL_FreeSurface(image);
2222
if (redrawlevel >= REDRAW_ANIMATED) {
2223
/* Animate the Options banner */
2224
if (bannerstate <= 0) {
2225
/* Draw the horizontal line under the banner */
2226
destrect = set_rect(xoffset + 0, yoffset + 43 * video.field_size / 16, 240 * video.field_size / 16, video.field_size / 8);
2227
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
2229
/* Draw the Options banner */
2230
if (video.field_size == 16) {
2231
show_banner(optionsscreenbanner, screen->w / 2 - 60 * 3 / 2, yoffset + 6, 60, 10);
2232
} else if (video.field_size == 32) {
2233
show_banner(optionsscreenbanner, screen->w / 2 - 60 * 5 / 2, yoffset + 19, 60, 10);
2236
bannerstate = DELAY_BANNER;
2243
/***************************************************************************
2244
* Show Message Box *
2245
***************************************************************************/
2246
/* This displays one very simple message box over the screen at once. If there
2247
currently exists a message box with a different name then it is destroyed and
2248
the screen rebuilt, else a message box is drawn over the existing one.
2251
To initialise: show_message_box(REDRAW_INITIALISE, "bla", 50, "Boo!", TRUE, 0, 0);
2252
To redraw after you've rebuilt your screen: show_message_box(REDRAW_EVERYTHING, "", 0, "", 0, 0, 0);
2253
To kill an existing box: show_message_box(REDRAW_INITIALISE, "", -1, "", 0, 0, 0);
2255
On entry: redrawlevel = REDRAW_INITIALISE to initialise a message box
2256
name = unique identifier
2257
timeout = units of TICK_INTERVAL
2259
dynamic = TRUE to fit to the size of the text
2260
dynamic = FALSE for an exact size with
2263
redrawlevel = REDRAW_EVERYTHING to show it (all the other values are ignored)
2264
(the timeout is decremented here and so is the rebuilding of the screen) */
2266
void show_message_box(int redrawlevel, char *name, int timeout, char *message, int dynamic, int width, int height) {
2268
static char boxname[256] = "", boxmessage[256];
2269
static int boxtimeout = -1, boxdynamic, boxwidth, boxheight, bannerstate, bannerframe;
2270
static int boxx, boxy, boxw, boxh, bartlx, bartly, barbrx, barbry;
2272
if (redrawlevel >= REDRAW_INITIALISE) {
2274
/* Restore/rebuild the screen if there is an existing
2275
message box showing which is not name */
2276
if ((boxtimeout >= 0) && (strcmp(boxname, name) != 0)) {
2277
if (game_mode == INTRO_SCREEN) {
2278
show_introscreen(REDRAW_EVERYTHING);
2279
} else if (game_mode == GAME_ON) {
2280
show_game_area(REDRAW_INITIALISE);
2281
} else if (game_mode == END_SCREEN) {
2283
} else if (game_mode == HELP_SCREEN) {
2284
show_helpscreen(REDRAW_EVERYTHING);
2285
} else if (game_mode == OPTIONS_SCREEN) {
2286
show_optionsscreen(REDRAW_EVERYTHING);
2288
bannerframe = 0; /* This retains the animation frame through updates */
2291
/* Store passed values */
2292
strcpy(boxname, name);
2293
boxtimeout = timeout;
2294
if ((strlen(message)) == 0) {
2295
strcpy(boxmessage, " "); /* This stops SDL_ttf from seg faulting on NULL strings >( */
2297
strcpy(boxmessage, message);
2299
boxdynamic = dynamic;
2303
/* Render the text so we can get its size in image->w and image->h */
2304
bgcolor.r = skins[selected_skin].background_colour >> 16 & 0xff; bgcolor.g = skins[selected_skin].background_colour >> 8 & 0xff; bgcolor.b = skins[selected_skin].background_colour & 0xff;
2305
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
2306
image = TTF_RenderUTF8_Shaded(font, boxmessage, fgcolor, bgcolor);
2308
/* Calculate some dimensions */
2310
boxw = image->w + video.field_size;
2311
boxh = image->h + video.field_size;
2316
SDL_FreeSurface(image);
2317
#ifdef DEBUG_MESSAGE_BOX
2318
printf("*** Start %s ***\n", __func__);
2319
printf("boxw=%i boxh=%i\n", boxw, boxh);
2320
printf("*** Stop %s ***\n", __func__);
2322
boxx = (screen->w - boxw) / 2;
2323
boxy = (screen->h - boxh) / 2;
2324
bartlx = boxx + video.field_size / 8;
2325
bartly = boxy + video.field_size / 8;
2326
barbrx = boxx + boxw - video.field_size / 4;
2327
barbry = boxy + boxh - video.field_size / 4;
2329
/* Initialise some variables */
2334
if (redrawlevel >= REDRAW_EVERYTHING) {
2336
if (boxtimeout > 0) {
2339
/* Draw box background */
2340
bgcolor.r = skins[selected_skin].background_colour >> 16 & 0xff; bgcolor.g = skins[selected_skin].background_colour >> 8 & 0xff; bgcolor.b = skins[selected_skin].background_colour & 0xff;
2341
destrect = set_rect(boxx, boxy, boxw, boxh);
2342
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bgcolor.r, bgcolor.g, bgcolor.b));
2345
destrect = set_rect(bartlx, bartly, barbrx - bartlx, video.field_size / 8);
2346
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
2348
/* Draw bottom bar */
2349
destrect = set_rect(bartlx, barbry, barbrx - bartlx, video.field_size / 8);
2350
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
2353
destrect = set_rect(bartlx, bartly, video.field_size / 8, barbry - bartly);
2354
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
2356
/* Draw right bar */
2357
destrect = set_rect(barbrx, bartly, video.field_size / 8, barbry - bartly + video.field_size / 8);
2358
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[bannerframe] >> 16 & 0xff, bannercolour[bannerframe] >> 8 & 0xff, bannercolour[bannerframe] & 0xff));
2360
/* Colour cycle the bars */
2361
if (bannerstate <= 0) {
2362
bannerstate = DELAY_BANNER;
2363
bannerframe++; if (bannerframe >= BANNER_COLOURS) bannerframe = 0;
2368
/* Render the text so we can write it */
2369
bgcolor.r = skins[selected_skin].background_colour >> 16 & 0xff; bgcolor.g = skins[selected_skin].background_colour >> 8 & 0xff; bgcolor.b = skins[selected_skin].background_colour & 0xff;
2370
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
2371
image = TTF_RenderUTF8_Shaded(font, boxmessage, fgcolor, bgcolor);
2374
destrect = set_rect(boxx + (boxw - image->w) / 2, boxy + (boxh - image->h) / 2, image->w, image->h);
2375
SDL_BlitSurface(image, NULL, screen, &destrect);
2377
SDL_FreeSurface(image);
2379
} else if (boxtimeout == 0) {
2382
/* Restore/rebuild the screen */
2383
if (game_mode == INTRO_SCREEN) {
2384
show_introscreen(REDRAW_EVERYTHING);
2385
} else if (game_mode == GAME_ON) {
2386
show_game_area(REDRAW_INITIALISE);
2387
} else if (game_mode == END_SCREEN) {
2389
} else if (game_mode == HELP_SCREEN) {
2390
show_helpscreen(REDRAW_EVERYTHING);
2391
} else if (game_mode == OPTIONS_SCREEN) {
2392
show_optionsscreen(REDRAW_EVERYTHING);
2398
/***************************************************************************
2400
***************************************************************************/
2401
/* On entry: banner points to the banner array
2402
xpos and ypos are the screen offsets to draw it
2403
width and height are the dimensions of the banner array */
2405
void show_banner(char *banner[], int xpos, int ypos, int width, int height) {
2407
int x, y, frame = bannerframe;
2409
for(y = 0; y < height; y++) {
2410
for(x = 0; x < width; x++) {
2411
if (banner[y][x] != '.') {
2412
if (video.field_size == 16) {
2413
destrect = set_rect(x * 3 + xpos, y * 4 + ypos, 2, 3);
2415
destrect = set_rect(x * 5 + xpos, y * 7 + ypos, 4, 6);
2417
SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[frame] >> 16 & 0xff, bannercolour[frame] >> 8 & 0xff, bannercolour[frame] & 0xff));
2420
frame++; if (frame >= BANNER_COLOURS) frame = 0;
2423
bannerframe++; if (bannerframe >= BANNER_COLOURS) bannerframe = 0;
2426
/***************************************************************************
2428
***************************************************************************/
2429
/* As we only have uppercase letters, numbers and a hyphon spread across
2430
multiple surfaces, this function will manage them.
2431
On entry: lcdchar = char to write
2432
xpos and ypos are the screen offsets to draw it */
2434
void write_lcd_char(char lcdchar, int xpos, int ypos) {
2435
SDL_Rect srcrect, destrect;
2437
destrect = set_rect(xpos, ypos, video.field_size / 2, video.field_size);
2439
/* Force lowercase uppercase */
2440
if (lcdchar >= 'a' && lcdchar <= 'z') lcdchar -= 0x20;
2442
if (lcdchar >= 'A' && lcdchar <= 'Z') {
2443
srcrect = set_rect((lcdchar - 'A') * (video.field_size / 2 + video.field_size / 16), 0, video.field_size / 2, video.field_size);
2444
SDL_BlitSurface(alpha, &srcrect, screen, &destrect);
2445
} else if (lcdchar >= '0' && lcdchar <= '9') {
2446
srcrect = set_rect((lcdchar - '0') * (video.field_size / 2 + video.field_size / 16), 0, video.field_size / 2, video.field_size);
2447
SDL_BlitSurface(ciphers, &srcrect, screen, &destrect);
2448
} else if (lcdchar == '-') {
2449
srcrect = set_rect(26 * (video.field_size / 2 + video.field_size / 16), 0, video.field_size / 2, video.field_size);
2450
SDL_BlitSurface(alpha, &srcrect, screen, &destrect);
2452
/* Drop everything else */
2456
/***************************************************************************
2458
***************************************************************************/
2459
/* Currently this only shows a congratulatory message although I may add
2460
some funny animations such as Robbo being chased across the screen by bears
2461
and the capsule zooming up screen etc. */
2463
void show_endscreen(void) {
2465
int count, yoffset = screen->h / 2 - video.field_size * 3 / 2;
2469
bgcolor.r = skins[selected_skin].background_colour >> 16 & 0xff; bgcolor.g = skins[selected_skin].background_colour >> 8 & 0xff; bgcolor.b = skins[selected_skin].background_colour & 0xff;
2470
fgcolor.r = skins[selected_skin].general_text_colour >> 16 & 0xff; fgcolor.g = skins[selected_skin].general_text_colour >> 8 & 0xff; fgcolor.b = skins[selected_skin].general_text_colour & 0xff;
2472
for (count = 0; count < TXT_ENDSCREEN_CONGRATS_ROWS; count++) {
2473
image = TTF_RenderUTF8_Shaded(font, &txt_endscreen_congrats[count * TXT_MAX_COLS], fgcolor, bgcolor);
2474
destrect = set_rect(screen->w / 2 - image->w / 2, yoffset + count * video.field_size, image->w, image->h);
2475
SDL_BlitSurface(image, NULL, screen, &destrect);
2476
SDL_FreeSurface(image);