player dead animation

origin
stpohle 23 years ago
parent 0cde601cd7
commit c1ef50c8dd

@ -419,9 +419,30 @@ gfx_load_players (int sx, int sy)
gfx.players[i].smal_image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage1);
SDL_FreeSurface (tmpimage);
}
}
/* load the death image */
sprintf (filename, "%s/player/dead0.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (filename);
if (tmpimage == NULL) {
/* no image found - set field clear */
printf ("Player Animation Could not be loaded (%s)\n", filename);
exit (1);
}
gfx.dead.frames = tmpimage->h / (2* GFX_IMGSIZE);
tmpimage1 =
scale_image (tmpimage, ((2 * sx * tmpimage->w) / (2 * GFX_IMGSIZE)),
gfx.dead.frames * (2 * sy));
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, r, g, b));
gfx.dead.image = SDL_DisplayFormat (tmpimage1);
SDL_FreeSurface (tmpimage1);
SDL_FreeSurface (tmpimage);
/* load the illnessthing */
sprintf (filename, "%s/player/playersick.bmp", bman.datapath);
tmpimage = SDL_LoadBMP (filename);
@ -431,7 +452,7 @@ gfx_load_players (int sx, int sy)
}
gfx.ill.frames = tmpimage->h / (2 * GFX_IMGSIZE);
tmpimage1 =
scale_image (tmpimage, (tmpimage->w / (2 * GFX_IMGSIZE)) * (2 * sx),
scale_image (tmpimage, (2 * sx * tmpimage->w) / (2 * GFX_IMGSIZE),
gfx.ill.frames * (2 * sy));
getRGBpixel (tmpimage1, 0, 0, &r, &g, &b);
SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, r, g, b));
@ -446,6 +467,7 @@ void
gfx_free_players ()
{
int i;
for (i = 0; i < MAX_PLAYERS; i++) {
if (gfx.players[i].ani.image != NULL)
SDL_FreeSurface (gfx.players[i].ani.image);
@ -454,6 +476,10 @@ gfx_free_players ()
SDL_FreeSurface (gfx.players[i].smal_image);
gfx.players[i].smal_image = NULL;
}
if (gfx.dead.image != NULL)
SDL_FreeSurface (gfx.dead.image);
if (gfx.ill.image != NULL)
SDL_FreeSurface (gfx.ill.image);
}

@ -50,6 +50,7 @@ struct __gfx {
_gfxani fire; // fire (explostion)
_gfxani bomb; // bomb animation
_gfxani ill; // sick animation above the player
_gfxani dead; // load the dead player animation
_gfxani menuselect; // The Menu Select GFX (the bomb ?)

@ -12,19 +12,18 @@ draw_player (_player * player)
dest;
int i;
if (PS_IS_alife (player->state)) {
/* player is alife */
dest.w = src.w = player->gfx->size.x;
dest.h = src.h = player->gfx->size.y;
dest.x =
gfx.offset.x + player->gfx->offset.x + (player->pos.x >> 8) * gfx.block.x +
gfx.postab[player->pos.x & 255];
dest.y =
gfx.offset.y + player->gfx->offset.y + (player->pos.y >> 8) * gfx.block.y +
gfx.postab[player->pos.y & 255];
src.x = player->d * player->gfx->size.x;
src.y = player->frame * player->gfx->size.y;
SDL_BlitSurface (player->gfx->ani.image, &src, gfx.screen, &dest);
/* if the player is ill, draw this image above him */
@ -33,21 +32,36 @@ draw_player (_player * player)
if (i >= 0) {
dest.w = src.w = gfx.block.x * 2;
dest.h = src.h = gfx.block.y * 2;
src.x = 0;
src.y = (2 * gfx.block.y) * player->illframe;
dest.x =
(-(gfx.block.x >> 1)) + gfx.offset.x + (player->pos.x >> 8) * gfx.block.x +
gfx.postab[player->pos.x & 255];
dest.y =
gfx.offset.y + ((player->pos.y >> 8) - 1) * gfx.block.y +
gfx.postab[player->pos.y & 255];
SDL_BlitSurface (gfx.ill.image, &src, gfx.screen, &dest);
}
}
}
else {
/* player is dead */
dest.w = src.w = gfx.dead.image->w;
dest.h = src.h = player->gfx->size.y;
dest.x =
gfx.offset.x + player->gfx->offset.x + (player->pos.x >> 8) * gfx.block.x +
gfx.postab[player->pos.x & 255];
dest.y =
gfx.offset.y + player->gfx->offset.y + (player->pos.y >> 8) * gfx.block.y +
gfx.postab[player->pos.y & 255];
src.x = 0;
src.y = (2 * gfx.block.y) * player->frame;
SDL_BlitSurface (gfx.dead.image, &src, gfx.screen, &dest);
}
gfx_AddUpdateRect (dest.x, dest.y, dest.w, dest.h);
player->old = player->pos; // save this position
};
@ -56,6 +70,7 @@ draw_player (_player * player)
void
restore_players_screen ()
{
int i,
x,
xs,
@ -63,7 +78,6 @@ restore_players_screen ()
y,
ys,
ye;
for (i = 0; i < MAX_PLAYERS; i++)
if ((PS_IS_used (bman.players[i].state)) && bman.players[i].old.x != -1) {
if ((bman.players[i].old.x & 0xFF) > 128) {
@ -78,7 +92,6 @@ restore_players_screen ()
x = 0;
if (xe >= bman.fieldsize.x)
xe = bman.fieldsize.x - 1;
ys = (bman.players[i].old.y >> 8) - 1;
ye = (bman.players[i].old.y >> 8) + 1;
if (ys < 0)
@ -89,10 +102,8 @@ restore_players_screen ()
for (; x <= xe; x++)
for (y = ys; y <= ye; y++)
draw_stone (x, y);
gfx_AddUpdateRect (xs * gfx.block.x + gfx.offset.x, ys * gfx.block.y + gfx.offset.y,
gfx.block.x * 3, gfx.block.y * 3);
}
};
@ -101,7 +112,6 @@ void
player_check_powerup (int p_nr)
{
_player *p = &bman.players[p_nr];
int fx = p->pos.x >> 8;
int fy = p->pos.y >> 8;
int _x = p->pos.x & 255;
@ -115,10 +125,8 @@ player_check_powerup (int p_nr)
/* Get the right field position */
if (_x > 128)
fx = fx + 1;
if (_y > 128)
fy = fy + 1;
ft = bman.field[fx][fy].type;
/* we found a mixed powerup */
if (ft == FT_mixed) {
@ -150,7 +158,6 @@ player_check_powerup (int p_nr)
}
field_clear (fx, fy);
break;
/* we found a fire powerup */
case FT_fire:
if (p->range < MAX_RANGE && p->ill[PI_range].to <= 0) {
@ -159,7 +166,6 @@ player_check_powerup (int p_nr)
}
field_clear (fx, fy);
break;
/* we found a shoe powerup */
case FT_shoe:
if (p->speed < MAX_SPEED && p->ill[PI_slow].to <= 0) {
@ -168,7 +174,6 @@ player_check_powerup (int p_nr)
}
field_clear (fx, fy);
break;
/* we found a death ?powerup? */
case FT_death:
player_set_ilness (p, -1);
@ -177,7 +182,6 @@ player_check_powerup (int p_nr)
net_game_send_ill (bman.p_nr);
field_clear (fx, fy);
break;
/* we found a special */
case FT_sp_trigger:
case FT_sp_row:
@ -203,11 +207,9 @@ check_field (short int fx, short int fy, _player * p)
if (bman.field[fx][fy].type != FT_stone && bman.field[fx][fy].type != FT_block)
res = 1;
get_bomb_on (fx, fy, bombs);
if (bombs[0].x != -1)
res = 0;
return res;
}
@ -228,22 +230,18 @@ stepmove_player (int pl_nr)
fx = p->pos.x >> 8;
fy = p->pos.y >> 8;
_x = p->pos.x & 255;
_y = p->pos.y & 255;
// do direction correction for going up/down
if (_x > 0 && _x <= 128 && (p->d == up || p->d == down))
p->d = left;
if (_x > 128 && _x < 256 && (p->d == up || p->d == down))
p->d = right;
// do direction correction for left/right
if (_y > 0 && _y <= 128 && (p->d == left || p->d == right))
p->d = up;
if (_y > 128 && _y < 256 && (p->d == left || p->d == right))
p->d = down;
/* get the pos to the next field */
if (p->d == left)
speed = _x;
@ -253,29 +251,22 @@ stepmove_player (int pl_nr)
speed = _y;
else
speed = 256 - _y;
if (speed > p->speed || speed == 0)
speed = p->speed;
// go left
if (p->d == left && _y == 0 && ((_x == 0 && check_field (fx - 1, fy, p)) || (_x > 0)))
dx = -speed;
// go right
if (p->d == right && _y == 0 && ((_x == 0 && check_field (fx + 1, fy, p)) || (_x > 0)))
dx = speed;
// go up
if (p->d == up && _x == 0 && ((_y == 0 && check_field (fx, fy - 1, p)) || (_y > 0)))
dy = -speed;
// go down
if (p->d == down && _x == 0 && ((_y == 0 && check_field (fx, fy + 1, p)) || (_y > 0)))
dy = speed;
p->pos.x = p->pos.x + dx;
p->pos.y = p->pos.y + dy;
player_check_powerup (pl_nr);
}
@ -288,6 +279,7 @@ stepmove_player (int pl_nr)
void
move_player (int pl_nr)
{
int oldd,
stepsleft,
speed;
@ -296,7 +288,6 @@ move_player (int pl_nr)
oldd = p->d;
if (p->m) {
player_animation (p);
if ((stepsleft = stepmove_player (pl_nr)) > 0) {
/* save the speed and go the rest of the step */
p->d = oldd;
@ -314,7 +305,6 @@ move_player (int pl_nr)
/* the player just stopt moving so send data */
if (bman.gametype != GT_single && p->m == 0 && p->old_m != 0)
net_game_send_playermove (pl_nr, 1);
p->old_m = p->m; // save the old state
p->m = 0;
};
@ -323,24 +313,21 @@ move_player (int pl_nr)
void
player_drop_bomb (int pl_nr)
{
_player *player = &bman.players[pl_nr];
_bomb *bomb = NULL;
int i,
_x,
_y;
_point bombs[MAX_PLAYERS * MAX_BOMBS];
for (i = 0; ((i < player->bombs_n) && (player->bombs[i].state != BS_off)); i++);
if (i < player->bombs_n && PS_IS_alife (player->state)) { // free bomb found
// get the best position for the bomb.
bomb = &player->bombs[i];
bomb->pos.x = player->pos.x >> 8;
bomb->pos.y = player->pos.y >> 8;
_x = player->pos.x & 255;
_y = player->pos.y & 255;
if (_x > 0 && _x <= 128)
_x = 0;
else if (_x > 128) {
@ -359,7 +346,6 @@ player_drop_bomb (int pl_nr)
get_bomb_on (bomb->pos.x, bomb->pos.y, bombs);
if (bombs[0].x != -1) // is there already a bomb
return;
d_printf ("Player %d Dropped Bomb %d\n", pl_nr, i);
bomb->r = player->range;
if (player->special.type == SP_trigger) {
@ -374,7 +360,6 @@ player_drop_bomb (int pl_nr)
bman.bfield[bomb->pos.x][bomb->pos.y] = 1;
bomb->pos.x = bomb->pos.x << 8;
bomb->pos.y = bomb->pos.y << 8;
if (bman.gametype != GT_single) {
net_game_send_bomb (pl_nr, i);
if (GT_MP_PTPS)
@ -415,18 +400,16 @@ player_died (_player * player, signed char dead_by)
// player die !
d_printf ("player_died (%10s)\n", player->name);
bman.updatestatusbar = 1; // force an update
bman.updatestatusbar = 1; // force an update
if (PS_IS_alife (player->state) && dead_by >= 0 && dead_by < MAX_PLAYERS)
if (bman.p_nr != dead_by)
bman.players[dead_by].points++;
player->frame = 0;
player->state &= (0xFF - PSF_alife);
player->dead_by = dead_by;
if (GT_MP_PTP)
net_game_send_player (bman.p_nr);
snd_play (SND_dead);
};
@ -434,8 +417,8 @@ player_died (_player * player, signed char dead_by)
void
draw_players ()
{
int p;
int p;
for (p = 0; p < MAX_PLAYERS; p++) {
if (PS_IS_playing (bman.players[p].state))
draw_player (&bman.players[p]);
@ -449,14 +432,23 @@ player_animation (_player * player)
if (player->gfx == NULL)
return;
if (PS_IS_alife (player->state)) {
if (player->frame < player->gfx->ani.frames
&& (player->frameto <= 0 || player->frameto > ANI_PLAYERTIMEOUT)) {
player->frameto = ANI_PLAYERTIMEOUT;
player->frame++;
}
if (player->frame >= player->gfx->ani.frames && PS_IS_alife (player->state))
if (player->frame >= player->gfx->ani.frames)
player->frame = 0;
}
if (PS_IS_dead (player->state)) {
if (player->frame < gfx.dead.frames
&& (player->frameto <= 0 || player->frameto > ANI_PLAYERTIMEOUT * 2)) {
player->frameto = ANI_PLAYERTIMEOUT * 2;
player->frame++;
}
}
if (player->frameto > 0)
player->frameto--;
@ -466,14 +458,15 @@ player_animation (_player * player)
int
dead_playerani ()
{
int i,
b = 0;
for (i = 0; i < MAX_PLAYERS; i++)
if (PS_IS_dead (bman.players[i].state)) {
player_animation (&bman.players[i]);
b++;
}
return b;
};
@ -481,15 +474,13 @@ dead_playerani ()
void
player_calcstep (_player * pl)
{
_point d;
int fx,
fy;
player_animation (pl);
fx = pl->pos.x >> 8;
fy = pl->pos.y >> 8;
if (bman.field[fx][fy].type != FT_block && bman.field[fx][fy].type != FT_stone) {
d.x = 0;
d.y = 0;
@ -501,7 +492,6 @@ player_calcstep (_player * pl)
d.y = -16;
else if (pl->d == down)
d.y = 16;
pl->pos.x += d.x;
pl->pos.y += d.y;
}
@ -527,13 +517,10 @@ player_calcpos ()
pl->speeddat = 1;
else
pl->speeddat = 0;
oldm = pl->m;
oldd = pl->d;
if (pl->speed > 1)
stepmove_player (p);
if (pl->speeddat) {
pl->m = oldm;
pl->d = oldd;
@ -574,9 +561,9 @@ player_ilness_loop (int pl_nr)
}
}
}
/* check if we have contact with an other ill player */
p = &bman.players[pl_nr];
get_player_on (p->pos.x, p->pos.y, pl);
for (i = 0; (pl[i] != -1 && i < MAX_PLAYERS); i++)
if (pl[i] != pl_nr) {
@ -641,12 +628,10 @@ void
player_set_ilness (_player * p, int t)
{
int type;
if (t == -1)
type = s_random (PI_max);
else
type = t;
d_printf ("Ilness : %d\n", type);
switch (type) {
case PI_slow:
@ -657,7 +642,6 @@ player_set_ilness (_player * p, int t)
}
else
p->ill[type].data = p->speed;
}
p->speed = 6;
break;
@ -669,7 +653,6 @@ player_set_ilness (_player * p, int t)
}
else
p->ill[type].data = p->speed;
}
p->speed = 150;
@ -684,7 +667,6 @@ player_set_ilness (_player * p, int t)
p->ill[type].data = p->bombs_n;
p->bombs_n = s_random (2);
break;
}
bman.updatestatusbar = 1;
p->ill[type].to += TIME_FACTOR * IL_TIMEOUT;
@ -710,7 +692,6 @@ player_clear_ilness (_player * p, int type)
break;
}
p->ill[type].to = 0;
if (bman.gametype != GT_single)
net_game_send_ill (bman.p_nr);
bman.updatestatusbar = 1;
@ -721,10 +702,8 @@ void
player_set_gfx (_player * p, signed char gfx_nr)
{
p->gfx_nr = gfx_nr;
if (p->gfx_nr < 0 || p->gfx_nr >= MAX_PLAYERS)
p->gfx_nr = -1;
if (p->gfx_nr == -1) {
p->gfx = NULL;
p->state &= (0xFF - (PSF_alife + PSF_playing));

Loading…
Cancel
Save