mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-22 11:51:41 +00:00
Use sprites for snake and apple
This commit is contained in:
parent
380e246be3
commit
58c0383e88
1 changed files with 110 additions and 53 deletions
155
src/d_clisrv.c
155
src/d_clisrv.c
|
@ -1153,12 +1153,12 @@ static void CV_LoadPlayerNames(UINT8 **p)
|
||||||
|
|
||||||
#ifdef CLIENT_LOADINGSCREEN
|
#ifdef CLIENT_LOADINGSCREEN
|
||||||
#define SNAKE_SPEED 4
|
#define SNAKE_SPEED 4
|
||||||
#define SNAKE_NUM_BLOCKS_X 24
|
#define SNAKE_NUM_BLOCKS_X 20
|
||||||
#define SNAKE_NUM_BLOCKS_Y 14
|
#define SNAKE_NUM_BLOCKS_Y 10
|
||||||
#define SNAKE_BLOCK_SIZE 8
|
#define SNAKE_BLOCK_SIZE 12
|
||||||
#define SNAKE_MAP_WIDTH (SNAKE_NUM_BLOCKS_X * SNAKE_BLOCK_SIZE)
|
#define SNAKE_MAP_WIDTH (SNAKE_NUM_BLOCKS_X * SNAKE_BLOCK_SIZE)
|
||||||
#define SNAKE_MAP_HEIGHT (SNAKE_NUM_BLOCKS_Y * SNAKE_BLOCK_SIZE)
|
#define SNAKE_MAP_HEIGHT (SNAKE_NUM_BLOCKS_Y * SNAKE_BLOCK_SIZE)
|
||||||
#define SNAKE_BORDER_SIZE 8
|
#define SNAKE_BORDER_SIZE 12
|
||||||
#define SNAKE_LEFT_X ((BASEVIDWIDTH - SNAKE_MAP_WIDTH) / 2 - SNAKE_BORDER_SIZE)
|
#define SNAKE_LEFT_X ((BASEVIDWIDTH - SNAKE_MAP_WIDTH) / 2 - SNAKE_BORDER_SIZE)
|
||||||
#define SNAKE_RIGHT_X (SNAKE_LEFT_X + SNAKE_MAP_WIDTH + SNAKE_BORDER_SIZE * 2 - 1)
|
#define SNAKE_RIGHT_X (SNAKE_LEFT_X + SNAKE_MAP_WIDTH + SNAKE_BORDER_SIZE * 2 - 1)
|
||||||
#define SNAKE_BOTTOM_Y (BASEVIDHEIGHT - 48)
|
#define SNAKE_BOTTOM_Y (BASEVIDHEIGHT - 48)
|
||||||
|
@ -1170,17 +1170,13 @@ typedef struct snake_s
|
||||||
tic_t nextupdate;
|
tic_t nextupdate;
|
||||||
boolean gameover;
|
boolean gameover;
|
||||||
|
|
||||||
UINT8 snakedir;
|
|
||||||
UINT8 snakeprevdir;
|
|
||||||
|
|
||||||
UINT16 snakelength;
|
UINT16 snakelength;
|
||||||
UINT8 snakex[SNAKE_NUM_BLOCKS_X * SNAKE_NUM_BLOCKS_Y];
|
UINT8 snakex[SNAKE_NUM_BLOCKS_X * SNAKE_NUM_BLOCKS_Y];
|
||||||
UINT8 snakey[SNAKE_NUM_BLOCKS_X * SNAKE_NUM_BLOCKS_Y];
|
UINT8 snakey[SNAKE_NUM_BLOCKS_X * SNAKE_NUM_BLOCKS_Y];
|
||||||
UINT8 snakecolor[SNAKE_NUM_BLOCKS_X * SNAKE_NUM_BLOCKS_Y];
|
UINT8 snakedir[SNAKE_NUM_BLOCKS_X * SNAKE_NUM_BLOCKS_Y];
|
||||||
|
|
||||||
UINT8 applex;
|
UINT8 applex;
|
||||||
UINT8 appley;
|
UINT8 appley;
|
||||||
UINT8 applecolor;
|
|
||||||
} snake_t;
|
} snake_t;
|
||||||
|
|
||||||
static snake_t *snake = NULL;
|
static snake_t *snake = NULL;
|
||||||
|
@ -1194,46 +1190,49 @@ static void CL_InitialiseSnake(void)
|
||||||
snake->nextupdate = SNAKE_SPEED;
|
snake->nextupdate = SNAKE_SPEED;
|
||||||
snake->gameover = false;
|
snake->gameover = false;
|
||||||
|
|
||||||
snake->snakedir = 0;
|
|
||||||
snake->snakeprevdir = snake->snakedir;
|
|
||||||
|
|
||||||
snake->snakelength = 1;
|
snake->snakelength = 1;
|
||||||
snake->snakex[0] = rand() % SNAKE_NUM_BLOCKS_X;
|
snake->snakex[0] = M_RandomKey(SNAKE_NUM_BLOCKS_X);
|
||||||
snake->snakey[0] = rand() % SNAKE_NUM_BLOCKS_Y;
|
snake->snakey[0] = M_RandomKey(SNAKE_NUM_BLOCKS_Y);
|
||||||
snake->snakecolor[0] = rand() % 256;
|
snake->snakedir[0] = 0;
|
||||||
|
snake->snakedir[1] = 0;
|
||||||
|
|
||||||
snake->applex = rand() % SNAKE_NUM_BLOCKS_X;
|
snake->applex = M_RandomKey(SNAKE_NUM_BLOCKS_X);
|
||||||
snake->appley = rand() % SNAKE_NUM_BLOCKS_Y;
|
snake->appley = M_RandomKey(SNAKE_NUM_BLOCKS_Y);
|
||||||
snake->applecolor = rand() % 256;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CL_HandleSnake(void)
|
static void CL_HandleSnake(void)
|
||||||
{
|
{
|
||||||
UINT8 x, y;
|
UINT8 x, y;
|
||||||
|
UINT8 oldx, oldy;
|
||||||
UINT16 i;
|
UINT16 i;
|
||||||
|
|
||||||
snake->time++;
|
snake->time++;
|
||||||
|
|
||||||
|
x = snake->snakex[0];
|
||||||
|
y = snake->snakey[0];
|
||||||
|
oldx = snake->snakex[1];
|
||||||
|
oldy = snake->snakey[1];
|
||||||
|
|
||||||
// Update direction
|
// Update direction
|
||||||
if (gamekeydown[KEY_LEFTARROW])
|
if (gamekeydown[KEY_LEFTARROW])
|
||||||
{
|
{
|
||||||
if (snake->snakeprevdir != 2)
|
if (snake->snakelength < 2 || x <= oldx)
|
||||||
snake->snakedir = 1;
|
snake->snakedir[0] = 1;
|
||||||
}
|
}
|
||||||
else if (gamekeydown[KEY_RIGHTARROW])
|
else if (gamekeydown[KEY_RIGHTARROW])
|
||||||
{
|
{
|
||||||
if (snake->snakeprevdir != 1)
|
if (snake->snakelength < 2 || x >= oldx)
|
||||||
snake->snakedir = 2;
|
snake->snakedir[0] = 2;
|
||||||
}
|
}
|
||||||
else if (gamekeydown[KEY_UPARROW])
|
else if (gamekeydown[KEY_UPARROW])
|
||||||
{
|
{
|
||||||
if (snake->snakeprevdir != 4)
|
if (snake->snakelength < 2 || y <= oldy)
|
||||||
snake->snakedir = 3;
|
snake->snakedir[0] = 3;
|
||||||
}
|
}
|
||||||
else if (gamekeydown[KEY_DOWNARROW])
|
else if (gamekeydown[KEY_DOWNARROW])
|
||||||
{
|
{
|
||||||
if (snake->snakeprevdir != 3)
|
if (snake->snakelength < 2 || y >= oldy)
|
||||||
snake->snakedir = 4;
|
snake->snakedir[0] = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
snake->nextupdate--;
|
snake->nextupdate--;
|
||||||
|
@ -1241,15 +1240,11 @@ static void CL_HandleSnake(void)
|
||||||
return;
|
return;
|
||||||
snake->nextupdate = SNAKE_SPEED;
|
snake->nextupdate = SNAKE_SPEED;
|
||||||
|
|
||||||
snake->snakeprevdir = snake->snakedir;
|
|
||||||
|
|
||||||
if (snake->gameover)
|
if (snake->gameover)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Find new position
|
// Find new position
|
||||||
x = snake->snakex[0];
|
switch (snake->snakedir[0])
|
||||||
y = snake->snakey[0];
|
|
||||||
switch (snake->snakedir)
|
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
if (x > 0)
|
if (x > 0)
|
||||||
|
@ -1294,28 +1289,53 @@ static void CL_HandleSnake(void)
|
||||||
snake->snakelength++;
|
snake->snakelength++;
|
||||||
snake->snakex[snake->snakelength - 1] = snake->snakex[snake->snakelength - 2];
|
snake->snakex[snake->snakelength - 1] = snake->snakex[snake->snakelength - 2];
|
||||||
snake->snakey[snake->snakelength - 1] = snake->snakey[snake->snakelength - 2];
|
snake->snakey[snake->snakelength - 1] = snake->snakey[snake->snakelength - 2];
|
||||||
snake->snakecolor[snake->snakelength - 1] = snake->applecolor;
|
snake->snakedir[snake->snakelength - 1] = snake->snakedir[snake->snakelength - 2];
|
||||||
|
|
||||||
snake->applex = rand() % SNAKE_NUM_BLOCKS_X;
|
snake->applex = M_RandomKey(SNAKE_NUM_BLOCKS_X);
|
||||||
snake->appley = rand() % SNAKE_NUM_BLOCKS_Y;
|
snake->appley = M_RandomKey(SNAKE_NUM_BLOCKS_Y);
|
||||||
snake->applecolor = rand() % 256;
|
|
||||||
|
|
||||||
S_StartSound(NULL, sfx_s3k6b);
|
S_StartSound(NULL, sfx_s3k6b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (snake->snakelength > 1)
|
||||||
|
{
|
||||||
|
UINT8 dir = snake->snakedir[0];
|
||||||
|
|
||||||
// Move
|
// Move
|
||||||
for (i = snake->snakelength - 1; i > 0; i--)
|
for (i = snake->snakelength - 1; i > 0; i--)
|
||||||
{
|
{
|
||||||
snake->snakex[i] = snake->snakex[i - 1];
|
snake->snakex[i] = snake->snakex[i - 1];
|
||||||
snake->snakey[i] = snake->snakey[i - 1];
|
snake->snakey[i] = snake->snakey[i - 1];
|
||||||
|
snake->snakedir[i] = snake->snakedir[i - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle corners
|
||||||
|
if (x < oldx && dir == 3)
|
||||||
|
dir = 5;
|
||||||
|
else if (x > oldx && dir == 3)
|
||||||
|
dir = 6;
|
||||||
|
else if (x < oldx && dir == 4)
|
||||||
|
dir = 7;
|
||||||
|
else if (x > oldx && dir == 4)
|
||||||
|
dir = 8;
|
||||||
|
else if (y < oldy && dir == 1)
|
||||||
|
dir = 9;
|
||||||
|
else if (y < oldy && dir == 2)
|
||||||
|
dir = 10;
|
||||||
|
else if (y > oldy && dir == 1)
|
||||||
|
dir = 11;
|
||||||
|
else if (y > oldy && dir == 2)
|
||||||
|
dir = 12;
|
||||||
|
snake->snakedir[1] = dir;
|
||||||
|
}
|
||||||
|
|
||||||
snake->snakex[0] = x;
|
snake->snakex[0] = x;
|
||||||
snake->snakey[0] = y;
|
snake->snakey[0] = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CL_DrawSnake(void)
|
static void CL_DrawSnake(void)
|
||||||
{
|
{
|
||||||
UINT16 i;
|
INT16 i;
|
||||||
|
|
||||||
// Background
|
// Background
|
||||||
V_DrawFill(SNAKE_LEFT_X + SNAKE_BORDER_SIZE, SNAKE_TOP_Y + SNAKE_BORDER_SIZE, SNAKE_MAP_WIDTH, SNAKE_MAP_HEIGHT, 239);
|
V_DrawFill(SNAKE_LEFT_X + SNAKE_BORDER_SIZE, SNAKE_TOP_Y + SNAKE_BORDER_SIZE, SNAKE_MAP_WIDTH, SNAKE_MAP_HEIGHT, 239);
|
||||||
|
@ -1327,26 +1347,63 @@ static void CL_DrawSnake(void)
|
||||||
V_DrawFill(SNAKE_LEFT_X, SNAKE_TOP_Y + SNAKE_BORDER_SIZE, SNAKE_BORDER_SIZE, SNAKE_BORDER_SIZE + SNAKE_MAP_HEIGHT, 242); // Left
|
V_DrawFill(SNAKE_LEFT_X, SNAKE_TOP_Y + SNAKE_BORDER_SIZE, SNAKE_BORDER_SIZE, SNAKE_BORDER_SIZE + SNAKE_MAP_HEIGHT, 242); // Left
|
||||||
|
|
||||||
// Apple
|
// Apple
|
||||||
V_DrawFill(
|
V_DrawFixedPatch(
|
||||||
SNAKE_LEFT_X + SNAKE_BORDER_SIZE + snake->applex * SNAKE_BLOCK_SIZE,
|
(SNAKE_LEFT_X + SNAKE_BORDER_SIZE + snake->applex * SNAKE_BLOCK_SIZE + SNAKE_BLOCK_SIZE / 2) * FRACUNIT,
|
||||||
SNAKE_TOP_Y + SNAKE_BORDER_SIZE + snake->appley * SNAKE_BLOCK_SIZE,
|
(SNAKE_TOP_Y + SNAKE_BORDER_SIZE + snake->appley * SNAKE_BLOCK_SIZE + SNAKE_BLOCK_SIZE / 2) * FRACUNIT,
|
||||||
SNAKE_BLOCK_SIZE,
|
FRACUNIT / 4,
|
||||||
SNAKE_BLOCK_SIZE,
|
0,
|
||||||
snake->applecolor
|
W_CachePatchName("DL_APPLE", PU_HUDGFX),
|
||||||
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
// Snake
|
// Snake
|
||||||
if (!snake->gameover || snake->time % 8 < 8 / 2) // Blink if game over
|
if (!snake->gameover || snake->time % 8 < 8 / 2) // Blink if game over
|
||||||
for (i = 0; i < snake->snakelength; i++)
|
|
||||||
{
|
{
|
||||||
V_DrawFill(
|
for (i = snake->snakelength - 1; i >= 0; i--)
|
||||||
SNAKE_LEFT_X + SNAKE_BORDER_SIZE + snake->snakex[i] * SNAKE_BLOCK_SIZE,
|
{
|
||||||
SNAKE_TOP_Y + SNAKE_BORDER_SIZE + snake->snakey[i] * SNAKE_BLOCK_SIZE,
|
const char *patchname;
|
||||||
SNAKE_BLOCK_SIZE,
|
UINT8 dir = snake->snakedir[i];
|
||||||
SNAKE_BLOCK_SIZE,
|
|
||||||
snake->snakecolor[i]
|
if (i == 0) // Head
|
||||||
|
{
|
||||||
|
switch (dir)
|
||||||
|
{
|
||||||
|
case 1: patchname = "DL_SNAKEHEAD_L"; break;
|
||||||
|
case 2: patchname = "DL_SNAKEHEAD_R"; break;
|
||||||
|
case 3: patchname = "DL_SNAKEHEAD_T"; break;
|
||||||
|
default: patchname = "DL_SNAKEHEAD_B";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Body
|
||||||
|
{
|
||||||
|
switch (dir)
|
||||||
|
{
|
||||||
|
case 1: patchname = "DL_SNAKEBODY_L"; break;
|
||||||
|
case 2: patchname = "DL_SNAKEBODY_R"; break;
|
||||||
|
case 3: patchname = "DL_SNAKEBODY_T"; break;
|
||||||
|
case 4: patchname = "DL_SNAKEBODY_B"; break;
|
||||||
|
case 5: patchname = "DL_SNAKEBODY_LT"; break;
|
||||||
|
case 6: patchname = "DL_SNAKEBODY_RT"; break;
|
||||||
|
case 7: patchname = "DL_SNAKEBODY_LB"; break;
|
||||||
|
case 8: patchname = "DL_SNAKEBODY_RB"; break;
|
||||||
|
case 9: patchname = "DL_SNAKEBODY_TL"; break;
|
||||||
|
case 10: patchname = "DL_SNAKEBODY_TR"; break;
|
||||||
|
case 11: patchname = "DL_SNAKEBODY_BL"; break;
|
||||||
|
case 12: patchname = "DL_SNAKEBODY_BR"; break;
|
||||||
|
default: patchname = "DL_SNAKEBODY_B";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
V_DrawFixedPatch(
|
||||||
|
(SNAKE_LEFT_X + SNAKE_BORDER_SIZE + snake->snakex[i] * SNAKE_BLOCK_SIZE + SNAKE_BLOCK_SIZE / 2) * FRACUNIT,
|
||||||
|
(SNAKE_TOP_Y + SNAKE_BORDER_SIZE + snake->snakey[i] * SNAKE_BLOCK_SIZE + SNAKE_BLOCK_SIZE / 2) * FRACUNIT,
|
||||||
|
FRACUNIT / 2,
|
||||||
|
0,
|
||||||
|
W_CachePatchName(patchname, PU_HUDGFX),
|
||||||
|
NULL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Length
|
// Length
|
||||||
V_DrawString(SNAKE_RIGHT_X + 4, SNAKE_TOP_Y, V_MONOSPACE, va("%u", snake->snakelength));
|
V_DrawString(SNAKE_RIGHT_X + 4, SNAKE_TOP_Y, V_MONOSPACE, va("%u", snake->snakelength));
|
||||||
|
|
Loading…
Reference in a new issue