warzone2100/lib/framework/cursors32.c

1183 lines
38 KiB
C

/*
This file is part of Warzone 2100.
Copyright (C) 1999-2004 Eidos Interactive
Copyright (C) 2005-2009 Warzone Resurrection Project
Warzone 2100 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Warzone 2100 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Warzone 2100; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/** @file
* \brief Cursor definitions (32x32)
*/
#include "frame.h"
#include "cursors.h"
/* TODO: do bridge and attach need swapping? */
static const char *cursor_arrow[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
"X ",
"XX ",
"X.X ",
"X..X ",
"X...X ",
"X....X ",
"X.....X ",
"X......X ",
"X.......X ",
"X........X ",
"X.....XXXXX ",
"X..X..X ",
"X.X X..X ",
"XX X..X ",
"X X..X ",
" X..X ",
" X..X ",
" X..X ",
" XX ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"0,0"
};
static const char *cursor_dest[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" .. ",
" ...X ",
" ..X.X ",
" ..X .X ",
" .X.X .X ",
" .X.X .X ",
" .X .X .X ",
" .X .X ....... ",
" .X .X .XX....X ",
" .X .X .XXX....X ",
" .X ..XXXX....X ",
" ...X ..XXXX....X ",
" .....X ..........X ",
" .....X ..........X ",
" .....X .XX.XX.XX.. ",
" ...X .X..X..X..X.. ",
" XX .X..X..X..XX.X ",
" X...........XX ",
" XXXXXXXXXXXX ",
" ",
" ",
" ",
" ",
"15,18"
};
static const char *cursor_sight[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ....... ",
" .. ........... .. ",
" .... X..XXXXXXX..X ....X ",
" .....XXXX XXX.....XX ",
" .......X .......X ",
" ........ ........XX ",
" .......XX .......X ",
" XX.....XX .....XXX ",
" ..X....XX ....X..X ",
" ..XX..XX ..XX..X ",
" ...X .XX .X ...X ",
" ..XX X X ..X ",
" ..X ..X ",
" ..X ..X ",
" ..X ..X ",
" ..X ..X ",
" ... . .X ...X ",
" ..X .. ..X ..XX ",
" ..X.... ....X..X ",
" XX..... .....XXXX ",
" ....... .......XX ",
" ........ ........XX ",
" .......XXX XX.......X ",
" .....XXX XX.....X ",
" ....XXX... ...XXX.... ",
" ..XXX X...........XXX X..X ",
" XX XX.......XXX XX ",
" XXXXXXXX ",
" ",
" ",
"15,16"
};
static const char *cursor_target[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" . ",
" .X ",
" ....X.. ",
" ......X.... ",
" ...XXX.XXX... ",
" ..XX .X X.. ",
" ..X .X .. ",
" ..X XX .. ",
" ..X ..X ",
" ..X ..X ",
" ..X ..X ",
" ..X ..X ",
" ........X . ........X ",
" XXXXXXXX X XXXXXXXX ",
" ..X ..X ",
" ..X ..X ",
" ..X ..X ",
" .. .X ",
" ..X . ..X ",
" .. .X ..X ",
" .. .X ..X ",
" ... .X ..X ",
" X......X....X ",
" XX....X..XX ",
" XXX.XXX ",
" .X ",
" XX ",
" ",
" ",
"15,15"
};
static const char *cursor_larrow[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" .. ",
" ...X ",
" ....X ",
" ............... ",
" .................X ",
" ...................X ",
" .....................X ",
" XX...................X ",
" XX.................X ",
" XX...............X ",
" XX....XXXXXXXXXX ",
" XX...X ",
" XX..X ",
" XXX ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"7,15"
};
static const char *cursor_rarrow[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" .. ",
" ... ",
" .... ",
" ............... ",
" ................. ",
" ................... ",
" .....................X ",
" ...................XX ",
" .................XX ",
" ...............XX ",
" XXXXXXXX....XX ",
" X...XX ",
" ..XX ",
" XX ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"25,16"
};
static const char *cursor_darrow[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ....... ",
" .......X ",
" .......X ",
" .......X ",
" .......X ",
" .......X ",
" .......X XX ",
" .X .......XX.X ",
" ..X.......X..X ",
" ...........X ",
" ...........X ",
" .........X ",
" .........X ",
" .......X ",
" .......X ",
" .....X ",
" .....X ",
" ...X ",
" ...X ",
" .X ",
" .X ",
" ",
" ",
" ",
" ",
"15,24"
};
static const char *cursor_uarrow[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" . ",
" .X ",
" ...X ",
" ...X ",
" .....X ",
" .....X ",
" .......X ",
" .......X ",
" .........X ",
" .........X ",
" ...........X ",
" ...........X ",
" ..X.......X..X ",
" .X .......XX.X ",
" .......X XX ",
" .......X ",
" .......X ",
" .......X ",
" .......X ",
" .......X ",
" .......X ",
" XXXXXXX ",
" ",
" ",
" ",
" ",
" ",
" ",
"15,8"
};
static const char *cursor_default[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ..XX ",
" ....XX ",
" .....XX ",
" .......XX ",
" ........XX ",
" ..........XX ",
" ...........X ",
" ....XXXXXXXX ",
" ...X ",
" ...X ",
" ..X ",
" ..X ",
" .X ",
" .X ",
" ",
" ",
" ",
" ",
" ",
" ",
"12,12"
};
static const char *cursor_attach[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ...X ....X ....X ... ",
" XXX.X.XXXX.X.XXXX.X.XXX ",
" ..... ..... ..... ",
" .X.X .X.X .X.X ",
" ...X ....X ....X ... ",
" XXX XXXX XXXX XXX ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"17,14"
};
static const char *cursor_attack[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" . ",
" .X ",
" ....X.. ",
" ......X.... ",
" ...XXX.XXX... ",
" ..XX .X X.. ",
" ..X .X .. ",
" ..X XX .. ",
" ..X ..X ",
" ..X ..X ",
" ..X ..X ",
" ..X ..X ",
" ........X . ........X ",
" XXXXXXXX X XXXXXXXX ",
" ..X ..X ",
" ..X ..X ",
" ..X ..X ",
" .. .X ",
" ..X . ..X ",
" .. .X ..X ",
" .. .X ..X ",
" ... .X ..X ",
" X......X....X ",
" XX....X..XX ",
" XXX.XXX ",
" .X ",
" XX ",
" ",
" ",
"15,15"
};
static const char *cursor_bomb[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" . . ",
" . . . ",
" XXX. ",
" XXXX . . ",
" XX . . ",
" XX ",
" ....X ",
" ....X ",
" .XXXXXX.XX ",
" ............X ",
" ..............X ",
" ................X ",
" ..................X ",
" ..................X ",
" ....................X ",
" ....................X ",
" ....................X ",
" ....................X ",
" ....................X ",
" ..................X ",
" ..................X ",
" ................X ",
" ..............X ",
" ............X ",
" ........XX ",
" XXXXXXXX ",
" ",
" ",
" ",
"16,16"
};
static const char *cursor_bridge[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" .. ",
" .... ",
" ....... ",
" ......... ",
" ............ ",
" ............ .. ",
" X............ .. . ",
" X............ ..XX. ",
" X............ ..XXX. ",
" X............ ..XXXX. ",
" X..............XXXXX. ",
" ..X............XXXXXX. ",
" ....X..........XXXXX.. ",
" ....X.........XXXX...... ",
" .....X.......XXX......... ",
" .....X......XX............ ",
" ......X....XXXXX..........X ",
" ......X...XX..XXXX........X ",
" ........X. ..XXX .......X ",
".........X..XXX .......X.. ",
" XX......X XX ..........X",
" XXX...X .........XX",
" XXXX .........X ",
" ........XX ",
" ..........X ",
" XX......XX ",
" XXX...X ",
" XXXX ",
" ",
" ",
"16,16"
};
static const char *cursor_build[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ...... ",
" .....XX..X ",
" .X.....X XXX ",
" .X......X ",
" X.......X ",
" .......XX ",
" .......X ",
" ......X.X ",
" .......X...X ",
" .......X ....X ",
" ....XX ....X ",
" ...X ....X ",
" .X ....X ",
" ....X ",
" ....X ",
" ...X ",
" ..X ",
" X ",
" ",
" ",
" ",
" ",
" ",
" ",
"15,15"
};
static const char *cursor_embark[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ...........X ",
" ...........X ",
" ...........X ",
" ...........X ",
" .................X ",
" ...............XX ",
" .............X ",
" ...........X ",
" X.........X ",
" ...XX.......XX...X ",
" ...XX.....XX...X ",
" ...XX...XX...X ",
" ...XX.XX...X ",
" ...XXX...X ",
" ...X...X ",
" .....X ",
" ...X ",
" .X ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"16,22"
};
static const char *cursor_fix[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ... ",
" ..X ",
" ..X ",
" ..X ",
" . ..X ",
" .X ..X ",
" .X X..X ",
" ..XXXX...X ",
" .........X ",
" .........X ",
" .....X ",
" .....XXXXX ",
" .........X ",
" .........X ",
" ...X ..X ",
" ..X .X ",
" ..X .X ",
" ..X ",
" ..X ",
" ..XXX ",
" ...X ",
" ",
" ",
" ",
" ",
" ",
"16,16"
};
static const char *cursor_guard[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" .....X ..... ",
" .XXX.........XXX.X ",
" .X..XXXXXXXXX..X.X ",
" .X.............X.X ",
" .X.............X.X ",
" .X.............X.X ",
" .X............X.X ",
" .X...........X.X ",
" .X...........X.X ",
" .XX.........XX.X ",
" .X.........X.X ",
" .XX.......XX.X ",
" .XX.....XX.X ",
" .XX...XX.X ",
" ..XXX..X ",
" .....X ",
" .XX ",
" ",
" ",
" ",
" ",
" ",
" ",
"16,17"
};
static const char *cursor_jam[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" .....X ",
" ...XXX...X ",
" ..XX XX..X ",
" ..X X..X ",
" .X ...X X.X ",
" ..X .X .X ..X ",
" .X .X .X .X ",
" .X .X .X .X .X ",
" .X .XX.XX.X .X ",
" ..X X...XX ..X ",
" .X ...X .X ",
" ..X .....X ..X ",
" .XX.....XX.X ",
" X.......XX ",
" .......X ",
" .........X ",
" .........X ",
" XXXXXXXXX ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"15,15"
};
static const char *cursor_lockon[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" .....X ",
" ...XXX...X ",
" ..XX XX..X ",
" ..X X..X ",
" .X ...X X.X ",
" ..X .X .X ..X ",
" .X .X .X .X ",
" .X .X .X .X .X ",
" .X .XX.XX.X .X ",
" ..X X...XX ..X ",
" .X ...X .X ",
" ..X .....X ..X ",
" .XX.....XX.X ",
" X.......XX ",
" .......X ",
" .........X ",
" .........X ",
" XXXXXXXXX ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"15,15"
};
static const char *cursor_menu[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ..XX ",
" ....XX ",
" .....XX ",
" .......XX ",
" ........XX ",
" ..........XX ",
" ........XX ",
" .....XX ",
" ...XX ",
" ...XX ",
" ..XX ",
" . X ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"11,11"
};
static const char *cursor_move[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" . .....X . ",
" ..X.XXXXX.X.. ",
" ...XXX XX... ",
" ....X.X .X.... ",
" .....X.X .X..... ",
" XXXXX.X .XXXXX ",
" .X....X ....X.X ",
" .XXXXXXX .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X.... ....X.X ",
" XXXXX.X .XXXXX ",
" .....X.X .X..... ",
" ....X.X .X....X ",
" ...XXX XX...X ",
" ..X.X .X..X ",
" .X .....X .X ",
" XXXXX ",
" ",
" ",
" ",
" ",
" ",
"15,15"
};
static const char *cursor_notpossible[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" .X .X ",
" ...X ...X ",
" .....X .....X ",
" .......X .......X ",
" .......X .......X ",
" .......X .......X ",
" .......X.......X ",
" .............X ",
" ...........X ",
" .........X ",
" .......X ",
" .........X ",
" ...........X ",
" .............X ",
" .......X.......X ",
" .......X .......X ",
" .......X .......X ",
" .......X .......X ",
" .....X .....X ",
" ...X ...X ",
" .X .X ",
" ",
" ",
" ",
" ",
"15,17"
};
static const char *cursor_pickup[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" .X .X ",
" .X .X ",
" .X.X.X ",
" ...X ",
" .X ",
" ...X ",
" .X.X.X ",
" .X .X ",
" .X.X.X ",
" ...X ",
" X.XX ",
" .X.X.X ",
" ..X.X..X ",
" ...X.X...X ",
" ....X.X....X ",
" .....XXX.....X ",
" ...XXXXXXX...X ",
" .XXX XX.X ",
" .X .X ",
" .X .X ",
" .X .X ",
" .X .X ",
" ..X ..X ",
" ..X ..X ",
" ..X ..X ",
" .X .X ",
" ",
" ",
" ",
"15,20"
};
static const char *cursor_seekrepair[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ... ",
" ..X X ",
" ..X .X ",
" ..X ..X ",
" . ..X XXXX...X ",
" .X ..X ........X ",
" .X X..X .........X ",
" ..XXXX...X .......... ",
" .........X ......... ",
" .........X ........ ",
" .....X ... ",
" .....XXXXX .. ",
" .........X . ",
" .........X ",
" ...X ..X ",
" ..X .X ",
" ..X .X ",
" ..X ",
" ..X ",
" ..XXX ",
" ...X ",
" ",
" ",
" ",
" ",
" ",
"16,15"
};
static const char *cursor_select[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
" ",
" ",
" ",
" ",
" .....X .....X ",
" .XXXXX XXX.X ",
" .X .X ",
" .X .X ",
" .X .X ",
" XX XX ",
" ",
" ",
" ",
" ",
" ",
" .X ",
" XX ",
" ",
" ",
" ",
" ",
" ",
" . . ",
" .X .X ",
" .X .X ",
" .X .X ",
" .....X .....X ",
" XXXXXX XXXXXX ",
" ",
" ",
" ",
" ",
"15,15"
};
static const struct
{
const char** image;
CURSOR cursor_num;
} cursors[CURSOR_MAX] =
{
{ cursor_arrow, CURSOR_ARROW },
{ cursor_dest, CURSOR_DEST },
{ cursor_sight, CURSOR_SIGHT },
{ cursor_target, CURSOR_TARGET },
{ cursor_larrow, CURSOR_LARROW },
{ cursor_rarrow, CURSOR_RARROW },
{ cursor_darrow, CURSOR_DARROW },
{ cursor_uarrow, CURSOR_UARROW },
{ cursor_default, CURSOR_DEFAULT },
{ cursor_default, CURSOR_EDGEOFMAP },
{ cursor_attach, CURSOR_ATTACH },
{ cursor_attack, CURSOR_ATTACK },
{ cursor_bomb, CURSOR_BOMB },
{ cursor_bridge, CURSOR_BRIDGE },
{ cursor_build, CURSOR_BUILD },
{ cursor_embark, CURSOR_EMBARK },
{ cursor_fix, CURSOR_FIX },
{ cursor_guard, CURSOR_GUARD },
{ cursor_jam, CURSOR_JAM },
{ cursor_lockon, CURSOR_LOCKON },
{ cursor_menu, CURSOR_MENU },
{ cursor_move, CURSOR_MOVE },
{ cursor_notpossible, CURSOR_NOTPOSSIBLE },
{ cursor_pickup, CURSOR_PICKUP },
{ cursor_seekrepair, CURSOR_SEEKREPAIR },
{ cursor_select, CURSOR_SELECT },
};
SDL_Cursor* init_system_cursor32(CURSOR cur)
{
int i, row, col;
uint8_t data[4 * 32];
uint8_t mask[4 * 32];
int hot_x, hot_y;
const char** image;
ASSERT(cur < CURSOR_MAX, "Attempting to load non-existent cursor: %u", (unsigned int)cur);
ASSERT(cursors[cur].cursor_num == cur, "Bad cursor mapping");
image = cursors[cur].image;
i = -1;
for (row = 0; row < 32; ++row)
{
for (col = 0; col < 32; ++col)
{
if (col % 8)
{
data[i] <<= 1;
mask[i] <<= 1;
}
else
{
++i;
data[i] = mask[i] = 0;
}
switch (image[4 + row][col])
{
case 'X':
data[i] |= 0x01;
mask[i] |= 0x01;
break;
case '.':
mask[i] |= 0x01;
break;
case ' ':
break;
}
}
}
sscanf(image[4 + row], "%d,%d", &hot_x, &hot_y);
return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
}