~ubuntu-branches/ubuntu/quantal/gnurobbo/quantal

« back to all changes in this revision

Viewing changes to screen.c

  • Committer: Bazaar Package Importer
  • Author(s): Ansgar Burchardt, Ansgar Burchardt, Gonéri Le Bouder
  • Date: 2009-03-14 23:10:50 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090314231050-70zcgdcmp7177pql
Tags: 0.61-1
[ Ansgar Burchardt ]
* New Upstream Version (LP: #337089)
* Do not dump vm usage information
  + New patch: do-not-dump-vmusage.diff
* Update packaging for debhelper 7
* Update copyright information
* Update Vcs-* fields for the Git repository
* Bump Standards Version to 3.8.0
  + add debian/README.source
* Add watch file

[ Gonéri Le Bouder ]
* Do not install the LICENSE-font files 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  GNU Robbo
 
2
 *  Copyright (C) notes:
 
3
 *  An Idea and Atari version: LK Avalon, Janusz Pelc, 1989
 
4
 *                 Linux Code: Arkadiusz Lipiec, 2002-2009
 
5
 *                                 <arkadiusz.lipiec@gmail.com>
 
6
 *                             Thunor 2007-2009
 
7
 *                                 <thunorsif@hotmail.com>
 
8
 *
 
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)
 
12
 *  any later version.
 
13
 *
 
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.
 
18
 *
 
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.
 
23
 *
 
24
 */
 
25
 
 
26
#include "game.h"
 
27
 
 
28
/* Defines */
 
29
/*
 
30
#define DEBUG_VIDEO
 
31
#define DEBUG_MESSAGE_BOX
 
32
*/
 
33
#define BANNER_COLOURS 22 * 3
 
34
#define DELAY_BANNER 2
 
35
 
 
36
/* Variables */
 
37
SDL_Color bgcolor, fgcolor;     /* General purpose colours */
 
38
SDL_Surface *image;                     /* General purpose surface */
 
39
 
 
40
/* Used for animating banners */
 
41
int bannerstate;
 
42
int bannerframe;
 
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
 
47
};
 
48
 
 
49
/* Used for animating icons */
 
50
int capsulestate;
 
51
int capsuleframe;
 
52
int capsuleoffsets[2 * 2] = {86, 18, 103, 18};
 
53
int teleportstate;
 
54
int teleportframe;
 
55
int teleportoffsets[2 * 2] = {1, 69, 18, 69};
 
56
int barrierstate;
 
57
int barrierframe;
 
58
int barrieroffsets[2 * 2] = {154, 52, 154, 69};
 
59
int butterflystate;
 
60
int butterflyframe;
 
61
int butterflyoffsets[2 * 2] = {137, 35, 154, 35};
 
62
int bearstate;
 
63
int bearframe;
 
64
int bearoffsets[2 * 2] = {18, 18, 35, 18};
 
65
int blackbearstate;
 
66
int blackbearframe;
 
67
int blackbearoffsets[2 * 2] = {103, 35, 120, 35};
 
68
int birdstate;
 
69
int birdframe;
 
70
int birdoffsets[2 * 2] = {52, 18, 69, 18};
 
71
int gunstate;
 
72
int gunframe;
 
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
 
79
};
 
80
int laserstate;
 
81
int laserframe;
 
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
 
97
};
 
98
int blasterstate;
 
99
int blasterframe;
 
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
 
110
};
 
111
int robbostate;
 
112
int robboframe;
 
113
int robbooffsets[2 * 2] = {35, 86, 52, 86};
 
114
 
 
115
/* Screen banners */
 
116
char *banner[8] = {
 
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."};
 
125
 
 
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....."};
 
137
 
 
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..............................................."};
 
149
 
 
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);
 
156
 
 
157
 
 
158
/***************************************************************************
 
159
 * Show Game Area                                                          *
 
160
 ***************************************************************************/
 
161
/* Rewritten to use a viewport that can reposition itself at Robbo's
 
162
   destination in as many cycles as requested.
 
163
 
 
164
   On entry: redrawlevel = REDRAW_INITIALISE to initialise */
 
165
 
 
166
void show_game_area(int redrawlevel) {
 
167
        int x, y, xoffset = viewport.xoffset, yoffset = viewport.yoffset;
 
168
        int vpepx, vpepy;
 
169
        SDL_Rect srcrect, destrect;
 
170
 
 
171
        if (redrawlevel >= REDRAW_INITIALISE) {
 
172
                viewport_needs_redrawing();
 
173
                clear_screen();
 
174
                scoreline.redraw = 0xff;
 
175
 
 
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;
 
194
        }
 
195
 
 
196
        /* Calculate the valid expected position of the viewport */
 
197
        vpepx = robbo.x - viewport.w / 2;
 
198
        if (vpepx < 0) {
 
199
                vpepx = 0;
 
200
        } else if (vpepx + viewport.w > level.w) {
 
201
                vpepx = level.w - viewport.w;
 
202
        }
 
203
        vpepy = robbo.y - viewport.h / 2;
 
204
        if (vpepy < 0) {
 
205
                vpepy = 0;
 
206
        } else if (vpepy + viewport.h > level.h) {
 
207
                vpepy = level.h - viewport.h;
 
208
        }
 
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);
 
218
                        } else {
 
219
                                viewport.x -= ceil((float)(viewport.x - vpepx) / viewport.cycles_to_dest);
 
220
                        }
 
221
                }
 
222
                if (viewport.y != vpepy) {
 
223
                        if (viewport.y < vpepy) {
 
224
                                viewport.y += ceil((float)(vpepy - viewport.y) / viewport.cycles_to_dest);
 
225
                        } else {
 
226
                                viewport.y -= ceil((float)(viewport.y - vpepy) / viewport.cycles_to_dest);
 
227
                        }
 
228
                }
 
229
                viewport.cycles_to_dest--;
 
230
                viewport_needs_redrawing();
 
231
        } else {
 
232
                viewport.cycles_to_dest = 1;
 
233
        }
 
234
 
 
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));
 
242
                        } else {
 
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));
 
249
                                        } else {
 
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));
 
254
                                                } else {
 
255
                                                        SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, DEFAULT_LEVEL_COLOUR >> 16 & 0xff, DEFAULT_LEVEL_COLOUR >> 8 & 0xff, DEFAULT_LEVEL_COLOUR & 0xff));
 
256
                                                }
 
257
                                        }
 
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());
 
263
                                                }
 
264
                                        }
 
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());
 
271
                                                }
 
272
                                        }
 
273
                                }
 
274
                        }
 
275
                }
 
276
        }
 
277
 
 
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();
 
283
                }
 
284
        }
 
285
 
 
286
        /* Redraw the parts of the scoreline that have been requested */
 
287
        if (scoreline.redraw) show_scoreline();
 
288
 
 
289
}
 
290
 
 
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.
 
296
   
 
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 */
 
301
 
 
302
void show_game_area_fade(int redrawlevel, int type) {
 
303
        SDL_Rect destrect;
 
304
        static int fadesize = 0, fadetype;
 
305
        int xoffset = viewport.xoffset, yoffset = viewport.yoffset, x, y;
 
306
 
 
307
        if (redrawlevel == REDRAW_INITIALISE) {
 
308
 
 
309
                /* Initialise a fade */
 
310
                fadetype = type;
 
311
                if (fadetype == 0) {
 
312
                        fadesize = 0;
 
313
                } else if (fadetype == 16) {
 
314
                        fadesize = viewport.w;
 
315
                } else {
 
316
                        fadesize = video.field_size;
 
317
                }
 
318
 
 
319
        } else if (redrawlevel == REDRAW_EVERYTHING) {
 
320
 
 
321
                if (fadesize > 0) {
 
322
        
 
323
                        for (y = 0; y < viewport.h; y++) {
 
324
                                for (x = 0; x < viewport.w; x++) {
 
325
 
 
326
                                        if (fadetype == 0) {
 
327
                                                /* No fade */
 
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 */
 
336
                                                if (x % 2 == 0) {
 
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);
 
340
                                                }
 
341
                                        } else if (fadetype == 4) {
 
342
                                                /* Fade bottom left and top right */
 
343
                                                if (x % 2 == 0) {
 
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);
 
347
                                                }
 
348
                                        } else if (fadetype == 5) {
 
349
                                                /* Fade bottom */
 
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) {
 
352
                                                /* Fade top left */
 
353
                                                destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset, fadesize, fadesize);
 
354
                                        } else if (fadetype == 7) {
 
355
                                                /* Fade top right */
 
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);
 
366
                                                }
 
367
                                        } else if (fadetype == 10) {
 
368
                                                /* Fade left */
 
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) {
 
377
                                                /* Fade top */
 
378
                                                destrect = set_rect(x * video.field_size + xoffset, y * video.field_size + yoffset, video.field_size, fadesize);
 
379
                                        } else if (fadetype == 14) {
 
380
                                                /* Fade right */
 
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);
 
388
                                                }
 
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);
 
402
                                                }
 
403
                                        }
 
404
 
 
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));
 
406
 
 
407
                                }
 
408
                        }
 
409
                        
 
410
                        if (fadetype == 16) {
 
411
                                fadesize--;
 
412
                        } else {
 
413
                                fadesize -= video.field_size / 16;
 
414
                        }
 
415
                        
 
416
                        viewport_needs_redrawing();
 
417
                        
 
418
                }
 
419
        }
 
420
}
 
421
 
 
422
/***************************************************************************
 
423
 * Show Scoreline                                                          *
 
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 */
 
427
  
 
428
void show_scoreline(void) {
 
429
        int xoffset, count, number;
 
430
        int yoffset = scoreline.yoffset;
 
431
        char tempstring[256];
 
432
        SDL_Rect destrect;
 
433
 
 
434
        if (scoreline.redraw & SCORELINE_ICONS) {
 
435
                xoffset = scoreline.xoffset;
 
436
 
 
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());   
 
441
                }
 
442
                
 
443
                xoffset = xoffset + video.field_size * 2 + video.field_size / 4;
 
444
 
 
445
                /* Draw key icon */
 
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());
 
449
                }
 
450
 
 
451
                xoffset = xoffset + video.field_size * 2 + video.field_size / 2;
 
452
 
 
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());
 
457
                }
 
458
 
 
459
                xoffset = xoffset + video.field_size * 3;
 
460
 
 
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());
 
465
                }
 
466
        }
 
467
 
 
468
        if (scoreline.redraw & SCORELINE_SCREWS) {
 
469
                xoffset = scoreline.xoffset + video.field_size;
 
470
 
 
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));
 
474
 
 
475
                /* Draw screw count */
 
476
                number = 10;
 
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;
 
482
                }
 
483
        }
 
484
 
 
485
        if (scoreline.redraw & SCORELINE_KEYS) {
 
486
                xoffset = scoreline.xoffset + video.field_size * 3 + video.field_size / 2;
 
487
 
 
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));
 
491
 
 
492
                /* Draw key count */
 
493
                number = 10;
 
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;
 
499
                }
 
500
        }
 
501
 
 
502
        if (scoreline.redraw & SCORELINE_BULLETS) {
 
503
                xoffset = scoreline.xoffset + video.field_size * 6;
 
504
 
 
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));
 
508
 
 
509
                /* Draw bullet count */
 
510
                number = 100;
 
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;
 
516
                }
 
517
        }
 
518
 
 
519
        if (scoreline.redraw & SCORELINE_LEVEL) {
 
520
                xoffset = scoreline.xoffset + video.field_size * 9;
 
521
 
 
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));
 
525
 
 
526
                /* Draw level count */
 
527
                number = 100;
 
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;
 
533
                }
 
534
        }
 
535
 
 
536
        if (scoreline.redraw & SCORELINE_PACK) {
 
537
                xoffset = scoreline.xoffset + video.field_size * 10 + video.field_size / 2;
 
538
 
 
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));
 
542
 
 
543
                /* Draw "-" */
 
544
                tempstring[0] = '-';
 
545
                write_lcd_char(tempstring[0], xoffset, yoffset);
 
546
 
 
547
                /* Draw pack name */
 
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);
 
550
                }
 
551
        }
 
552
 
 
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;
 
556
 
 
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);
 
562
                } else {
 
563
                        strcpy(tempstring, "");
 
564
                }
 
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);
 
570
                }
 
571
        }
 
572
 
 
573
        scoreline.redraw = 0;
 
574
}
 
575
 
 
576
/*************************************************************/
 
577
/* Set Rect **************************************************/
 
578
/*************************************************************/
 
579
 
 
580
SDL_Rect set_rect(int x, int y, int w, int h)
 
581
{
 
582
        SDL_Rect rect;
 
583
        rect.x = x;
 
584
        rect.y = y;
 
585
        rect.w = w;
 
586
        rect.h = h;
 
587
        return rect;
 
588
}
 
589
 
 
590
/*************************************************************/
 
591
/* Get Pixel *************************************************/
 
592
/*************************************************************/
 
593
/* Not used in this project anymore */
 
594
 
 
595
Uint32 getpixel(SDL_Surface *surface, int x, int y) 
 
596
{
 
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;
 
600
            
 
601
        switch(bpp) {
 
602
                case 1:
 
603
                        return *p;
 
604
                case 2:
 
605
                        return *(Uint16 *)p;
 
606
                case 3:
 
607
                        if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
 
608
                                return p[0] << 16 | p[1] << 8 | p[2];
 
609
                        else
 
610
                                return p[0] | p[1] << 8 | p[2] << 16;
 
611
                case 4:
 
612
                        return *(Uint32 *)p;
 
613
                default:
 
614
                        return 0;       /* shouldn't happen, but avoids warnings */
 
615
        }
 
616
}
 
617
 
 
618
/*************************************************************/
 
619
/* Clear Screen***********************************************/
 
620
/*************************************************************/
 
621
 
 
622
void clear_screen(void)
 
623
{
 
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));
 
625
}
 
626
 
 
627
/***************************************************************************
 
628
 * Set Video Mode                                                          *
 
629
 ***************************************************************************/
 
630
/* Now allows the setting of any resolution with a choice of field_sizes */
 
631
 
 
632
/*      On exit: returns 1 on error */   
 
633
 
 
634
int set_video_mode(void) {
 
635
        SDL_Rect **modes;
 
636
        int hwsurface = FALSE, count, flags;
 
637
        #ifdef DEBUG_VIDEO      
 
638
                const SDL_VideoInfo *videoinfo;
 
639
        #endif
 
640
        char description[256];
 
641
 
 
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;
 
646
        } else {
 
647
                if (video.field_size == UNDEFINED) video.field_size = 32;
 
648
                if (video.xres < 480 || video.yres < 480) video.field_size = 16;
 
649
        }
 
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;
 
653
        #endif
 
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;
 
660
        #endif
 
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;
 
665
        }
 
666
        if (viewport.maximise == UNDEFINED) viewport.maximise = FALSE;
 
667
        
 
668
        #ifdef DEBUG_VIDEO      
 
669
                printf("*** Start %s ***\n", __func__);
 
670
                printf ("Fullscreen hwsurfaces :-\n");
 
671
        #endif
 
672
        /* Query available fullscreen hwsurface modes */
 
673
        modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
 
674
        if (modes == NULL) {
 
675
                #ifdef DEBUG_VIDEO      
 
676
                        printf ("None found\n");
 
677
                #endif
 
678
        } else if (modes == (SDL_Rect **) -1) {
 
679
                #ifdef DEBUG_VIDEO      
 
680
                        printf("Any dimension is okay\n");
 
681
                #endif
 
682
                hwsurface = TRUE;
 
683
        } else {
 
684
                for (count = 0; modes[count]; ++count) {
 
685
                        #ifdef DEBUG_VIDEO      
 
686
                                printf("%dx%d\n", modes[count]->w, modes[count]->h);
 
687
                        #endif
 
688
                        if (modes[count]->w == video.xres && modes[count]->h == video.yres) {
 
689
                                hwsurface = TRUE;
 
690
                        }
 
691
                }
 
692
        }
 
693
        #ifdef DEBUG_VIDEO      
 
694
                printf ("Fullscreen swsurfaces :-\n");
 
695
        #endif
 
696
        /* Query available fullscreen swsurface modes */
 
697
        modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_SWSURFACE);
 
698
        if (modes == NULL) {
 
699
                #ifdef DEBUG_VIDEO      
 
700
                        printf ("None found\n");
 
701
                #endif
 
702
        } else if (modes == (SDL_Rect **) -1) {
 
703
                #ifdef DEBUG_VIDEO      
 
704
                        printf("Any dimension is okay\n");
 
705
                #endif
 
706
        } else {
 
707
                for (count = 0; modes[count]; ++count) {
 
708
                        #ifdef DEBUG_VIDEO      
 
709
                                printf("%dx%d\n", modes[count]->w, modes[count]->h);
 
710
                        #endif
 
711
                }
 
712
        }
 
713
        #ifdef DEBUG_VIDEO      
 
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);
 
728
        #endif
 
729
 
 
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)
 
733
                hwsurface = FALSE;
 
734
        #endif
 
735
        
 
736
        /* We have enough info to set the correct mode now */
 
737
        if (hwsurface) {
 
738
                flags = SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_ANYFORMAT | video.fullscreen;
 
739
                strcpy(description, "double buffered hardware");
 
740
        } else {
 
741
                flags = SDL_SWSURFACE | SDL_ANYFORMAT | video.fullscreen;
 
742
                strcpy(description, "software");
 
743
        }
 
744
        /* Attempt to set the requested video mode or fall back to some defaults */
 
745
        for (count = 0; count < 3; count++) {
 
746
                if (count == 0) {
 
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);
 
754
                }
 
755
                screen = SDL_SetVideoMode(video.xres, video.yres, 16, flags);
 
756
                if (screen != NULL) {
 
757
                        break;
 
758
                } else if (count < 2) {
 
759
                        fprintf(stdout, "Failed: %s\n", SDL_GetError());
 
760
                } else {
 
761
                        return 1;
 
762
                }
 
763
        }
 
764
 
 
765
        /* We won't be needing the mouse pointer if full screen */
 
766
        if (video.fullscreen == SDL_FULLSCREEN) SDL_ShowCursor(SDL_DISABLE);
 
767
 
 
768
        #ifdef DEBUG_VIDEO      
 
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__);
 
784
        #endif
 
785
 
 
786
        return 0;
 
787
 
788
 
 
789
/***************************************************************************
 
790
 * Toggle Fullscreen                                                       *
 
791
 ***************************************************************************/
 
792
/* Toggles between a window and fullscreen on supported platforms */   
 
793
 
 
794
void toggle_fullscreen(int *fullscreen) {
 
795
        if (!(SDL_WM_ToggleFullScreen(screen))) {
 
796
                fprintf(stdout, "Unable to toggle fullscreen: %s\n", SDL_GetError());
 
797
        }
 
798
 
 
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);
 
804
        } else {
 
805
                *fullscreen = 0;
 
806
                SDL_ShowCursor(SDL_ENABLE);
 
807
        }
 
808
 
 
809
}
 
810
 
 
811
/***************************************************************************
 
812
 * Show Level Colour                                                       *
 
813
 ***************************************************************************/
 
814
/* Used for debugging */   
 
815
 
 
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) {
 
817
        char tempstring[60];
 
818
        int xoffset, yoffset;
 
819
        SDL_Rect destrect;
 
820
        
 
821
        xoffset = authorline.xoffset + video.field_size * 13.5;
 
822
        yoffset = authorline.yoffset;
 
823
 
 
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;
 
828
        } else {
 
829
                bgcolor.r = 0; bgcolor.g = 0; bgcolor.b = 0;
 
830
                fgcolor.r = 0xff; fgcolor.g = 0xff; fgcolor.b = 0xff;
 
831
        }
 
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);
 
836
        xoffset += image->w;
 
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;
 
842
        } else {
 
843
                bgcolor.r = 0; bgcolor.g = 0; bgcolor.b = 0;
 
844
                fgcolor.r = 0xff; fgcolor.g = 0xff; fgcolor.b = 0xff;
 
845
        }
 
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);
 
850
        xoffset += image->w;
 
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;
 
856
        } else {
 
857
                bgcolor.r = 0; bgcolor.g = 0; bgcolor.b = 0;
 
858
                fgcolor.r = 0xff; fgcolor.g = 0xff; fgcolor.b = 0xff;
 
859
        }
 
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);
 
865
}
 
866
 
 
867
/***************************************************************************
 
868
 * Inc Colour Component                                                    *
 
869
 ***************************************************************************/
 
870
/* Used for debugging */   
 
871
 
 
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;
 
877
        } else {
 
878
                *colour_component += 0x8;
 
879
        }
 
880
}
 
881
 
 
882
/***************************************************************************
 
883
 * Dec Colour Component                                                    *
 
884
 ***************************************************************************/
 
885
/* Used for debugging */   
 
886
 
 
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;
 
892
        } else {
 
893
                *colour_component -= 0x8;
 
894
        }
 
895
}
 
896
 
 
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 */
 
904
 
 
905
void show_introscreen(int redrawlevel) {
 
906
        SDL_Rect destrect;
 
907
        int count, xoffset, yoffset;
 
908
        char tempstring[256];
 
909
        
 
910
        xoffset = (screen->w - video.field_size * 15) / 2;
 
911
        yoffset = (screen->h - video.field_size * 15) / 2;
 
912
        
 
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;
 
914
 
 
915
        if (redrawlevel >= REDRAW_INITIALISE) {
 
916
                /* Reinitialise some variables */
 
917
                bannerframe = 0;
 
918
                
 
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;
 
936
        }
 
937
        
 
938
        if (redrawlevel >= REDRAW_EVERYTHING) {
 
939
                /* Reinitialise some variables */
 
940
                bannerstate = 0;
 
941
 
 
942
                /* Set entire screen to a colour */
 
943
                clear_screen();
 
944
                
 
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);
 
952
                }
 
953
                SDL_BlitSurface(image, NULL, screen, &destrect);
 
954
                SDL_FreeSurface(image);
 
955
 
 
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);
 
965
                        }
 
966
                        SDL_BlitSurface(image, NULL, screen, &destrect);
 
967
                        SDL_FreeSurface(image);
 
968
                }
 
969
 
 
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);
 
979
                        }
 
980
                        SDL_BlitSurface(image, NULL, screen, &destrect);
 
981
                        SDL_FreeSurface(image);
 
982
                }
 
983
 
 
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);
 
993
                        }
 
994
                        SDL_BlitSurface(image, NULL, screen, &destrect);
 
995
                        SDL_FreeSurface(image);
 
996
                }
 
997
 
 
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);
 
1007
                        }
 
1008
                        SDL_BlitSurface(image, NULL, screen, &destrect);
 
1009
                        SDL_FreeSurface(image);
 
1010
                }
 
1011
        }
 
1012
        
 
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);
 
1019
                }
 
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));
 
1021
        
 
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;
 
1026
                        } else {
 
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;
 
1028
                        }
 
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);
 
1035
                        }
 
1036
                        SDL_BlitSurface(image, NULL, screen, &destrect);
 
1037
                        SDL_FreeSurface(image);
 
1038
                }
 
1039
 
 
1040
                /* Draw the current level */
 
1041
                /* < */
 
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;
 
1045
                } else {
 
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;
 
1047
                }
 
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);
 
1054
                }
 
1055
                SDL_BlitSurface(image, NULL, screen, &destrect);
 
1056
                destrect.x += image->w;
 
1057
                SDL_FreeSurface(image);
 
1058
                /* 999 */
 
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);
 
1067
                /* > */
 
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;
 
1071
                } else {
 
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;
 
1073
                }
 
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);
 
1079
 
 
1080
                /* Draw the current pack */
 
1081
                /* < */
 
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;
 
1085
                } else {
 
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;
 
1087
                }
 
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);
 
1094
                }
 
1095
                SDL_BlitSurface(image, NULL, screen, &destrect);
 
1096
                destrect.x += image->w;
 
1097
                SDL_FreeSurface(image);
 
1098
                /* "Original" */
 
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);
 
1106
                /* > */
 
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;
 
1110
                } else {
 
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;
 
1112
                }
 
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);
 
1118
        }
 
1119
        
 
1120
        if (redrawlevel >= REDRAW_ANIMATED) {
 
1121
                bannerstate--;
 
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);
 
1128
                        }
 
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));
 
1145
 
 
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);
 
1151
                        }
 
1152
 
 
1153
                        bannerstate = DELAY_BANNER;
 
1154
                }
 
1155
        }
 
1156
}
 
1157
 
 
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 */
 
1165
 
 
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];
 
1174
        int count;
 
1175
        
 
1176
        xoffset = (screen->w - video.field_size * 15) / 2;
 
1177
        yoffset = (screen->h - video.field_size * 15) / 2;
 
1178
        
 
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;
 
1181
 
 
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;
 
1186
 
 
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;
 
1204
        }
 
1205
        
 
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;
 
1210
 
 
1211
                /* Set entire screen to a colour */
 
1212
                clear_screen();
 
1213
                
 
1214
                if (helpscreenpage == 0) {
 
1215
 
 
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);
 
1224
                                }
 
1225
                                SDL_BlitSurface(image, NULL, screen, &destrect);
 
1226
                                SDL_FreeSurface(image);
 
1227
                        }
 
1228
 
 
1229
                } else if (helpscreenpage == 1) {
 
1230
                        
 
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);
 
1239
                                if (count == 4) {
 
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);
 
1246
                                }
 
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);
 
1252
                        }
 
1253
 
 
1254
                } else if (helpscreenpage == 2) {
 
1255
 
 
1256
                        for (count = 0; count < TXT_HELP_PAGE2_ROWS; count++) {
 
1257
                                if (count < 3) {
 
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);
 
1265
                                }
 
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);
 
1271
                        }
 
1272
 
 
1273
                } else if (helpscreenpage == 3) {
 
1274
 
 
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);
 
1284
                                }
 
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);
 
1289
                                } else {
 
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);
 
1291
                                }
 
1292
                                SDL_BlitSurface(image, NULL, screen, &destrect);
 
1293
                                SDL_FreeSurface(image);
 
1294
                        }
 
1295
                        
 
1296
                }
 
1297
 
 
1298
        }
 
1299
        
 
1300
        if (redrawlevel >= REDRAW_INTERMEDIATE) {
 
1301
 
 
1302
                /* Exit */
 
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;
 
1305
                } else {
 
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;
 
1307
                }
 
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);
 
1313
 
 
1314
                if (helpscreenpage == 0 || helpscreenpage == 1 || helpscreenpage == 2) {
 
1315
 
 
1316
                        /* Next > */
 
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;
 
1319
                        } else {
 
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;
 
1321
                        }
 
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);
 
1327
 
 
1328
                }
 
1329
 
 
1330
                if (helpscreenpage == 1 || helpscreenpage == 2 || helpscreenpage == 3) {
 
1331
 
 
1332
                        /* < Back */
 
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;
 
1335
                        } else {
 
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;
 
1337
                        }
 
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);
 
1343
                }
 
1344
                
 
1345
        }
 
1346
 
 
1347
        if (redrawlevel >= REDRAW_ANIMATED) {
 
1348
                
 
1349
                if (helpscreenpage == 2) {
 
1350
                        /* Animate the capsule */
 
1351
                        capsulestate--;
 
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;
 
1359
                        }
 
1360
 
 
1361
                        /* Animate the teleport */
 
1362
                        teleportstate--;
 
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;
 
1370
                        }
 
1371
 
 
1372
                        /* Animate the barrier */
 
1373
                        barrierstate--;
 
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;
 
1381
                        }
 
1382
 
 
1383
                        /* Animate the butterfly */
 
1384
                        butterflystate--;
 
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;
 
1392
                        }
 
1393
                        
 
1394
                } else if (helpscreenpage == 3) {
 
1395
                        
 
1396
                        /* Animate the bear */
 
1397
                        bearstate--;
 
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;
 
1405
                        }
 
1406
 
 
1407
                        /* Animate the blackbear */
 
1408
                        blackbearstate--;
 
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;
 
1416
                        }
 
1417
 
 
1418
                        /* Animate the bird */
 
1419
                        birdstate--;
 
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;
 
1427
                        }
 
1428
                        
 
1429
                        /* Animate the gun */
 
1430
                        gunstate--;
 
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);
 
1439
                                        }
 
1440
                                        gunframe++; if (gunframe >= 25) gunframe = 0;
 
1441
                                }
 
1442
                                gunstate = DELAY_LASER;
 
1443
                        }
 
1444
 
 
1445
                        /* Animate the laser */
 
1446
                        laserstate--;
 
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);
 
1455
                                        }
 
1456
                                        laserframe++; if (laserframe >= 70) laserframe = 0;
 
1457
                                }
 
1458
                                if (laserframe < 45) {
 
1459
                                        laserstate = DELAY_LASER;
 
1460
                                } else {
 
1461
                                        laserstate = DELAY_LITTLE_BOOM;
 
1462
                                }
 
1463
                        }
 
1464
 
 
1465
                        /* Animate the blaster */
 
1466
                        blasterstate--;
 
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);
 
1475
                                        }
 
1476
                                        blasterframe++; if (blasterframe >= 45) blasterframe = 0;
 
1477
                                }
 
1478
                                blasterstate = DELAY_LASER;
 
1479
                        }
 
1480
 
 
1481
                        /* Animate Robbo */
 
1482
                        robbostate--;
 
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;
 
1490
                        }
 
1491
                }
 
1492
                
 
1493
                /* Animate the Help banner */
 
1494
                bannerstate--;
 
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));
 
1499
 
 
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);
 
1505
                        }
 
1506
                        
 
1507
                        bannerstate = DELAY_BANNER;
 
1508
                }
 
1509
        }
 
1510
}
 
1511
 
 
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 */
 
1519
 
 
1520
void show_optionsscreen(int redrawlevel) {
 
1521
        int xoffset, yoffset, yincrement = video.field_size;
 
1522
        SDL_Surface *icons_preview;
 
1523
        char tempstring[256];
 
1524
        SDL_Rect destrect;
 
1525
        int count;
 
1526
        
 
1527
        xoffset = (screen->w - video.field_size * 15) / 2;
 
1528
        yoffset = (screen->h - video.field_size * 15) / 2;
 
1529
        
 
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;
 
1532
 
 
1533
        if (redrawlevel >= REDRAW_INITIALISE) {
 
1534
                /* Reinitialise some variables */
 
1535
                bannerframe = 0;
 
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;
 
1547
                }
 
1548
                
 
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;
 
1566
        }
 
1567
        
 
1568
        if (redrawlevel >= REDRAW_EVERYTHING) {
 
1569
                /* Reinitialise some variables */
 
1570
                bannerstate = 0;
 
1571
 
 
1572
                /* Set entire screen to a colour */
 
1573
                clear_screen();
 
1574
        }
 
1575
        
 
1576
        if (redrawlevel >= REDRAW_INTERMEDIATE) {
 
1577
 
 
1578
                if (optionsscreenpage == 0) {
 
1579
 
 
1580
                        /* Game Speed */
 
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;
 
1583
                        } else {
 
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;
 
1585
                        }
 
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);
 
1591
 
 
1592
                        /* +< */
 
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;
 
1595
                        } else {
 
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;
 
1597
                        }
 
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);
 
1603
 
 
1604
                        /* n */
 
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);
 
1612
                        } else {
 
1613
                                sprintf(tempstring, "%iHz", temp_game_cycle_limit);
 
1614
                        }
 
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);
 
1620
                
 
1621
                        /* >- */
 
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;
 
1624
                        } else {
 
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;
 
1626
                        }
 
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);
 
1631
                
 
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;
 
1637
                        } else {
 
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;
 
1639
                        }
 
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);
 
1645
 
 
1646
                        /* < */
 
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;
 
1651
                        } else {
 
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;
 
1653
                        }
 
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);
 
1659
 
 
1660
                        /* Joystick name */
 
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]);
 
1668
                        } else {
 
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, "...");
 
1673
                        }
 
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);
 
1681
 
 
1682
                        /* > */
 
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;
 
1687
                        } else {
 
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;
 
1689
                        }
 
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);
 
1694
 
 
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;
 
1700
                        } else {
 
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;
 
1702
                        }
 
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);
 
1708
 
 
1709
                        /* < */
 
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;
 
1714
                        } else {
 
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;
 
1716
                        }
 
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);
 
1722
 
 
1723
                        /* n% */
 
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;
 
1726
                        } else {
 
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;
 
1728
                        }
 
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);
 
1735
 
 
1736
                        /* > */
 
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;
 
1741
                        } else {
 
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;
 
1743
                        }
 
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);
 
1748
 
 
1749
                        /* Key Repeat: */
 
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);
 
1755
 
 
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;
 
1759
                        } else {
 
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;
 
1761
                        }
 
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);
 
1767
 
 
1768
                        /* < */
 
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;
 
1771
                        } else {
 
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;
 
1773
                        }
 
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);
 
1779
 
 
1780
                        /* n */
 
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);
 
1788
 
 
1789
                        /* > */
 
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;
 
1792
                        } else {
 
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;
 
1794
                        }
 
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);
 
1799
                        
 
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;
 
1803
                        } else {
 
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;
 
1805
                        }
 
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);
 
1811
 
 
1812
                        /* < */
 
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;
 
1815
                        } else {
 
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;
 
1817
                        }
 
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);
 
1823
 
 
1824
                        /* n */
 
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);
 
1832
 
 
1833
                        /* > */
 
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;
 
1836
                        } else {
 
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;
 
1838
                        }
 
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);
 
1843
 
 
1844
                        /* Language */
 
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;
 
1847
                        } else {
 
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;
 
1849
                        }
 
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);
 
1855
 
 
1856
                        /* < */
 
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;
 
1859
                        } else {
 
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;
 
1861
                        }
 
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);
 
1867
 
 
1868
                        /* Locale name */
 
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);
 
1875
                
 
1876
                        /* > */
 
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;
 
1879
                        } else {
 
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;
 
1881
                        }
 
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);
 
1886
 
 
1887
                        /* By */
 
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);
 
1895
 
 
1896
                        /* Locale author */
 
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);
 
1904
 
 
1905
                } else if (optionsscreenpage == 1) {
 
1906
 
 
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);
 
1916
                                }
 
1917
                                SDL_BlitSurface(image, NULL, screen, &destrect);
 
1918
                                SDL_FreeSurface(image);
 
1919
                        }
 
1920
 
 
1921
                } else if (optionsscreenpage >= 2 && optionsscreenpage <= 4) {
 
1922
                        
 
1923
                        for (count = 0; count < 9; count++) {
 
1924
                                
 
1925
                                /* Action */
 
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;
 
1928
                                } else {
 
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;
 
1930
                                }
 
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);
 
1985
                                }
 
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);
 
1992
 
 
1993
                                destrect.x = xoffset + 110 * video.field_size / 16;     /* Was 88 */
 
1994
                                
 
1995
                                /* device */
 
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);
 
2004
                                        }
 
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);
 
2010
                                        
 
2011
                                        /* id */
 
2012
                                        if (temp_user_controls[count + (optionsscreenpage - 2) * 9].id == UNDEFINED) {
 
2013
                                                sprintf(tempstring, "%s ", "-");
 
2014
                                        } else {
 
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);
 
2017
                                                } else {
 
2018
                                                        get_keyjbtn_text(temp_user_controls[count + (optionsscreenpage - 2) * 9].device, temp_user_controls[count + (optionsscreenpage - 2) * 9].id, "", tempstring);
 
2019
                                                }
 
2020
                                                sprintf(tempstring, "%s ", tempstring);
 
2021
                                        }
 
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);
 
2026
 
 
2027
                                        destrect.x = xoffset + 190 * video.field_size / 16;     /* Was 169 */
 
2028
                                        
 
2029
                                        /* < */
 
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;
 
2035
                                                } else {
 
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;
 
2037
                                                }
 
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);
 
2043
 
 
2044
                                                /* mod */
 
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;
 
2047
                                                } else {
 
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;
 
2049
                                                }
 
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);
 
2056
                                                }
 
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);
 
2062
 
 
2063
                                                /* > */
 
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;
 
2068
                                                } else {
 
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;
 
2070
                                                }
 
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);
 
2075
 
 
2076
                                        }
 
2077
                                }
 
2078
                        }
 
2079
                } else if (optionsscreenpage == 5) {
 
2080
 
 
2081
                        /* Skin */
 
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;
 
2084
                        } else {
 
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;
 
2086
                        }
 
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);
 
2092
 
 
2093
                        /* < */
 
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;
 
2096
                        } else {
 
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;
 
2098
                        }
 
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);
 
2104
 
 
2105
                        /* Skin name */
 
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);
 
2114
 
 
2115
                        /* > */
 
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;
 
2118
                        } else {
 
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;
 
2120
                        }
 
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);
 
2125
 
 
2126
                        /* By */
 
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);
 
2134
 
 
2135
                        /* Skin author */
 
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);
 
2143
 
 
2144
                        /* Skin about */
 
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;
 
2157
                                }
 
2158
                                SDL_FreeSurface(image);
 
2159
                        }
 
2160
 
 
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);
 
2166
                }
 
2167
 
 
2168
                /* Page navigation */
 
2169
                if (optionsscreenpage > 0) {
 
2170
 
 
2171
                        /* < Back */
 
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;
 
2174
                        } else {
 
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;
 
2176
                        }
 
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);
 
2182
                }
 
2183
 
 
2184
                /* Save */
 
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;
 
2187
                } else {
 
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;
 
2189
                }
 
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);
 
2194
 
 
2195
                /* Exit */
 
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;
 
2198
                } else {
 
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;
 
2200
                }
 
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);
 
2205
 
 
2206
                if (optionsscreenpage < OPTIONS_SCREEN_PAGES - 1) {
 
2207
                        /* Page > */
 
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;
 
2210
                        } else {
 
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;
 
2212
                        }
 
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);
 
2218
 
 
2219
                }
 
2220
        }
 
2221
        
 
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));
 
2228
 
 
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);
 
2234
                        }
 
2235
                        
 
2236
                        bannerstate = DELAY_BANNER;
 
2237
                } else {
 
2238
                        bannerstate--;
 
2239
                }
 
2240
        }
 
2241
}
 
2242
 
 
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.
 
2249
    
 
2250
    Examples :-
 
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);
 
2254
    
 
2255
    On entry: redrawlevel = REDRAW_INITIALISE to initialise a message box
 
2256
                          name = unique identifier
 
2257
                          timeout = units of TICK_INTERVAL
 
2258
                          message = message
 
2259
                          dynamic = TRUE to fit to the size of the text
 
2260
                          dynamic = FALSE for an exact size with
 
2261
                            width = box width
 
2262
                            height = box height
 
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) */
 
2265
 
 
2266
void show_message_box(int redrawlevel, char *name, int timeout, char *message, int dynamic, int width, int height) {
 
2267
        SDL_Rect destrect;
 
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;
 
2271
 
 
2272
        if (redrawlevel >= REDRAW_INITIALISE) {
 
2273
 
 
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) {
 
2282
                                show_endscreen();
 
2283
                        } else if (game_mode == HELP_SCREEN) {
 
2284
                                show_helpscreen(REDRAW_EVERYTHING);
 
2285
                        } else if (game_mode == OPTIONS_SCREEN) {
 
2286
                                show_optionsscreen(REDRAW_EVERYTHING);
 
2287
                        }
 
2288
                        bannerframe = 0;        /* This retains the animation frame through updates */
 
2289
                }
 
2290
 
 
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 >( */
 
2296
                } else {
 
2297
                        strcpy(boxmessage, message);
 
2298
                }
 
2299
                boxdynamic = dynamic;
 
2300
                boxwidth = width;
 
2301
                boxheight = height;
 
2302
 
 
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);
 
2307
 
 
2308
                /* Calculate some dimensions */
 
2309
                if (boxdynamic) {
 
2310
                        boxw = image->w + video.field_size;
 
2311
                        boxh = image->h + video.field_size;
 
2312
                } else {
 
2313
                        boxw = boxwidth;
 
2314
                        boxh = boxheight;
 
2315
                }
 
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__);
 
2321
                #endif
 
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;
 
2328
 
 
2329
                /* Initialise some variables */
 
2330
                bannerstate = 0;
 
2331
                
 
2332
        }
 
2333
 
 
2334
        if (redrawlevel >= REDRAW_EVERYTHING) {
 
2335
 
 
2336
                if (boxtimeout > 0) {
 
2337
                        boxtimeout--;
 
2338
                        
 
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));
 
2343
                        
 
2344
                        /* Draw top bar */
 
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));
 
2347
                        
 
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));
 
2351
                        
 
2352
                        /* Draw left bar */
 
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));
 
2355
                        
 
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));
 
2359
                        
 
2360
                        /* Colour cycle the bars */
 
2361
                        if (bannerstate <= 0) {
 
2362
                                bannerstate = DELAY_BANNER;
 
2363
                                bannerframe++; if (bannerframe >= BANNER_COLOURS) bannerframe = 0;
 
2364
                        } else {
 
2365
                                bannerstate--;
 
2366
                        }
 
2367
                        
 
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);
 
2372
 
 
2373
                        /* Write message */
 
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);
 
2376
                        
 
2377
                        SDL_FreeSurface(image);
 
2378
 
 
2379
                } else if (boxtimeout == 0) {
 
2380
                        boxtimeout--;
 
2381
 
 
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) {
 
2388
                                show_endscreen();
 
2389
                        } else if (game_mode == HELP_SCREEN) {
 
2390
                                show_helpscreen(REDRAW_EVERYTHING);
 
2391
                        } else if (game_mode == OPTIONS_SCREEN) {
 
2392
                                show_optionsscreen(REDRAW_EVERYTHING);
 
2393
                        }
 
2394
                }
 
2395
        }
 
2396
}
 
2397
 
 
2398
/***************************************************************************
 
2399
 * Show Banner                                                             *
 
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 */
 
2404
 
 
2405
void show_banner(char *banner[], int xpos, int ypos, int width, int height) {
 
2406
        SDL_Rect destrect;
 
2407
        int x, y, frame = bannerframe;
 
2408
        
 
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);
 
2414
                                } else {
 
2415
                                        destrect = set_rect(x * 5 + xpos, y * 7 + ypos, 4, 6);
 
2416
                                }
 
2417
                                SDL_FillRect(screen, &destrect, SDL_MapRGB(screen->format, bannercolour[frame] >> 16 & 0xff, bannercolour[frame] >> 8 & 0xff, bannercolour[frame] & 0xff));
 
2418
                        }
 
2419
                }
 
2420
                frame++; if (frame >= BANNER_COLOURS) frame = 0;
 
2421
        }
 
2422
 
 
2423
        bannerframe++; if (bannerframe >= BANNER_COLOURS) bannerframe = 0;
 
2424
}
 
2425
 
 
2426
/***************************************************************************
 
2427
 * Write LCD Char                                                          *
 
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 */
 
2433
 
 
2434
void write_lcd_char(char lcdchar, int xpos, int ypos) {
 
2435
        SDL_Rect srcrect, destrect;
 
2436
 
 
2437
        destrect = set_rect(xpos, ypos, video.field_size / 2, video.field_size);
 
2438
 
 
2439
        /* Force lowercase uppercase */
 
2440
        if (lcdchar >= 'a' && lcdchar <= 'z') lcdchar -= 0x20;
 
2441
        
 
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);
 
2451
        } else {
 
2452
                /* Drop everything else */
 
2453
        }
 
2454
}
 
2455
 
 
2456
/***************************************************************************
 
2457
 * Show End Screen                                                         *
 
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. */
 
2462
 
 
2463
void show_endscreen(void) {
 
2464
        SDL_Rect destrect;
 
2465
        int count, yoffset = screen->h / 2 - video.field_size * 3 / 2;
 
2466
 
 
2467
        clear_screen();
 
2468
 
 
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;
 
2471
 
 
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); 
 
2477
        }
 
2478
 
 
2479
}
 
2480
 
 
2481
 
 
2482
 
 
2483
 
 
2484
 
 
2485
 
 
2486
 
 
2487