diff --git a/src/field.c b/src/field.c index e7bb795..ba5c1e7 100644 --- a/src/field.c +++ b/src/field.c @@ -1,4 +1,4 @@ -/* $Id: field.c,v 1.21 2003/05/18 14:06:29 patty21 Exp $ */ +/* $Id: field.c,v 1.22 2003/06/01 22:06:30 stpohle Exp $ */ /* field.c - procedures which are needed to control the field */ #include @@ -13,7 +13,7 @@ draw_stone (int x, int y) _field *stone = &bman.field[x][y]; SDL_Rect dest, src; - SDL_Surface *srcimg; + SDL_Surface *srcimg = NULL; int i, d; @@ -25,51 +25,75 @@ draw_stone (int x, int y) src.x = 0; - if (stone->frame == 0 || stone->type != FT_stone) { - srcimg = gfx.field[stone->type].image; - src.y = 0; + /* draw background if we have a stone, block or nothing */ + if (stone->type <= FT_block) { + SDL_Rect srcbg; + + srcbg.w = dest.w; + srcbg.h = dest.h; + srcbg.x = (x % gfx.field[FT_nothing].frames) * gfx.block.x; + srcbg.y = (y % gfx.field[FT_nothing].frames) * gfx.block.y; + + SDL_BlitSurface (gfx.field[FT_nothing].image, &srcbg, gfx.screen, &dest); } - else { - if (stone->frameto == 0) { + + /* animate the stone if needed only for exploding stone */ + if (stone->type == FT_stone && stone->frame > 0) { + if (stone->frameto == 0) if (stone->frame < gfx.field[stone->type].frames) { stone->frame++; stone->frameto = ANI_STONETIMEOUT; } - } + if (stone->frameto > 0) stone->frameto--; - if (stone->frame < gfx.field[stone->type].frames) { + + if (stone->frame < gfx.field[FT_stone].frames) { src.y = stone->frame * gfx.block.y; - srcimg = gfx.field[stone->type].image; + srcimg = gfx.field[FT_stone].image; } else { src.y = 0; srcimg = gfx.field[FT_nothing].image; } - - } - - if (stone->frame > 0 || stone->type == FT_nothing) { - SDL_Rect srcbg; + } + + else if (stone->type == FT_stone || stone->type == FT_block) { + src.y = 0; + srcimg = gfx.field[stone->type].image; + } + + /* some powerup so we need to animate this too */ + else if (stone->type >= FT_death) { + if (stone->frameto-- <= 0 || stone->frameto > ANI_STONETIMEOUT) { + stone->frameto = ANI_STONETIMEOUT; + stone->frame++; + } - srcbg.w = dest.w; - srcbg.h = dest.h; - srcbg.x = (x % gfx.field[FT_nothing].frames) * gfx.block.x; - srcbg.y = (y % gfx.field[FT_nothing].frames) * gfx.block.y; + if (stone->frame >= gfx.powerup.frames) + stone->frame = 0; - SDL_BlitSurface (gfx.field[FT_nothing].image, &srcbg, gfx.screen, &dest); + srcimg = gfx.powerup.image; + src.y = stone->frame * gfx.block.y; } + + if (srcimg != NULL) + SDL_BlitSurface (srcimg, &src, gfx.screen, &dest); - if (stone->type != FT_nothing) + if (stone->type >= FT_death) { /* draw now the powerup itself */ + srcimg = gfx.field[stone->type].image; + src.y = 0; SDL_BlitSurface (srcimg, &src, gfx.screen, &dest); - + } + // draw explosions if there is any - for (d = 0, i = 0; d < 4; d++) - if (stone->ex[d].count > 0) { - i = 1; // mark that there is already an explosion - draw_fire (x, y, d, -1); - } - return; + for (d = 0, i = 0; d < 4; d++) + if (stone->ex[d].count > 0) { + i = 1; // mark that there is already an explosion + draw_fire (x, y, d, -1); + } + + return; }; @@ -134,106 +158,118 @@ field_load (FILE * map) bman.fieldsize.x = sizex - 1; bman.fieldsize.y = sizey; - - /* darw the border so we know everything is right */ - for (i = 0; i < bman.fieldsize.x; i++) - bman.field[i][0].type = bman.field[i][bman.fieldsize.y-1].type = FT_block; - for (i = 0; i < bman.fieldsize.y; i++) - bman.field[0][i].type = bman.field[bman.fieldsize.x-1][i].type = FT_block; + + /* darw the border so we know everything is right */ + for (i = 0; i < bman.fieldsize.x; i++) + bman.field[i][0].type = bman.field[i][bman.fieldsize.y - 1].type = FT_block; + for (i = 0; i < bman.fieldsize.y; i++) + bman.field[0][i].type = bman.field[bman.fieldsize.x - 1][i].type = FT_block; } /* will set the playerposition but in a way that we won't start on a block */ /* i am just too lazy to write this all again and again */ #define PLX bman.players[i].pos.x #define PLY bman.players[i].pos.y -void field_set_playerposition (int usermap) { - int p, dist, i,j , mx, my, dx = 0, dy = 0; - char txt[255]; - +void +field_set_playerposition (int usermap) +{ + int p, + dist, + i, + j, + mx, + my, + dx = 0, + dy = 0; + char txt[255]; + p = 50; dist = 8; while (p == 50) { p = 0; dist--; for (i = 0; (p < 50 && i < MAX_PLAYERS);) { - if (usermap) { - int maxloop = 0; - while (maxloop < 200 && (PLX == -1 || PLY == -1)) { - maxloop++; - PLX = s_random (bman.fieldsize.x - 2) + 1; - PLY = s_random (bman.fieldsize.y - 2) + 1; - - for (dx = 10, dy = 10, j = 0; (j < i && j < MAX_PLAYERS && (dx > 1 || dy > 1)); j++) { /* is ther any other player */ - dx = PLX - bman.players[j].pos.x; - if (dx < 0) dx = - dx; - dy = PLY - bman.players[j].pos.y; - if (dy < 0) dy = - dy; - } - - /* check if there is no block */ - if ((dx > 1 || dy > 1) && ((bman.field[PLX][PLY].type != FT_block && maxloop > 100) || - bman.field[PLX][PLY].type == FT_nothing)) { - /* get (up or down) dx and (left or right) dy */ - dx = s_random (2); - if (dx == 0) - dx = -1; - dy = s_random (2); - if (dy == 0) - dy = -1; - - /* first check if there is and free place for us */ - if (!((bman.field[PLX+dx][PLY].type != FT_block && maxloop > 100) || - bman.field[PLX+dx][PLY].type == FT_nothing)) - dx = -dx; - if (!((bman.field[PLX+dx][PLY].type != FT_block && maxloop > 100) || - bman.field[PLX+dx][PLY].type == FT_nothing)) - PLX = -1; - - if (!((bman.field[PLX][PLY+dy].type != FT_block && maxloop > 100) || - bman.field[PLX][PLY+dy].type == FT_nothing)) - dy = -dy; - if (!((bman.field[PLX][PLY+dy].type != FT_block && maxloop > 100) || - bman.field[PLX][PLY+dy].type == FT_nothing)) - PLY = -1; - } - else { - PLX = -1; - PLY = -1; - } - - /* make some space */ - if (PLX != -1 && PLY != -1) { - bman.field[PLX][PLY].type = FT_nothing; - bman.field[PLX+dx][PLY].type = FT_nothing; - bman.field[PLX][PLY+dy].type = FT_nothing; - } - } - } - if (PLX == -1 || PLY == -1) { - /* we could not set all fields or we don't run on a usermap */ - if (usermap) { - sprintf (txt,"Not all players could be set (Pl:%d)", i); - menu_displaymessage ("MAP - ERROR",txt); - } - - /* now there will be some fields deleted */ - PLX = 2 * (s_random ((bman.fieldsize.x - 1) / 2)) + 1; - PLY = 2 * (s_random ((bman.fieldsize.y - 1) / 2)) + 1; - - bman.field[PLX][PLY].type = FT_nothing; - - dx = s_random (4); // bit 1 = up/down bit 2 = left/right - /* up and down */ - if (((dx & 1) == 0 && PLX > 1) || PLX >= bman.fieldsize.x - 2) - bman.field[PLX-1][PLY].type = FT_nothing; - else - bman.field[PLX+1][PLY].type = FT_nothing; - /* left and right */ - if (((dx & 2) == 0 && PLY > 1) || PLY >= bman.fieldsize.y - 2) - bman.field[PLX][PLY-1].type = FT_nothing; - else - bman.field[PLX][PLY+1].type = FT_nothing; - } + if (usermap) { + int maxloop = 0; + while (maxloop < 200 && (PLX == -1 || PLY == -1)) { + maxloop++; + PLX = s_random (bman.fieldsize.x - 2) + 1; + PLY = s_random (bman.fieldsize.y - 2) + 1; + + for (dx = 10, dy = 10, j = 0; (j < i && j < MAX_PLAYERS && (dx > 1 || dy > 1)); j++) { /* is ther any other player */ + dx = PLX - bman.players[j].pos.x; + if (dx < 0) + dx = -dx; + dy = PLY - bman.players[j].pos.y; + if (dy < 0) + dy = -dy; + } + + /* check if there is no block */ + if ((dx > 1 || dy > 1) + && ((bman.field[PLX][PLY].type != FT_block && maxloop > 100) + || bman.field[PLX][PLY].type == FT_nothing)) { + /* get (up or down) dx and (left or right) dy */ + dx = s_random (2); + if (dx == 0) + dx = -1; + dy = s_random (2); + if (dy == 0) + dy = -1; + + /* first check if there is and free place for us */ + if (!((bman.field[PLX + dx][PLY].type != FT_block && maxloop > 100) || + bman.field[PLX + dx][PLY].type == FT_nothing)) + dx = -dx; + if (!((bman.field[PLX + dx][PLY].type != FT_block && maxloop > 100) || + bman.field[PLX + dx][PLY].type == FT_nothing)) + PLX = -1; + + if (!((bman.field[PLX][PLY + dy].type != FT_block && maxloop > 100) || + bman.field[PLX][PLY + dy].type == FT_nothing)) + dy = -dy; + if (!((bman.field[PLX][PLY + dy].type != FT_block && maxloop > 100) || + bman.field[PLX][PLY + dy].type == FT_nothing)) + PLY = -1; + } + else { + PLX = -1; + PLY = -1; + } + + /* make some space */ + if (PLX != -1 && PLY != -1) { + bman.field[PLX][PLY].type = FT_nothing; + bman.field[PLX + dx][PLY].type = FT_nothing; + bman.field[PLX][PLY + dy].type = FT_nothing; + } + } + } + if (PLX == -1 || PLY == -1) { + /* we could not set all fields or we don't run on a usermap */ + if (usermap) { + sprintf (txt, "Not all players could be set (Pl:%d)", i); + menu_displaymessage ("MAP - ERROR", txt); + } + + /* now there will be some fields deleted */ + PLX = 2 * (s_random ((bman.fieldsize.x - 1) / 2)) + 1; + PLY = 2 * (s_random ((bman.fieldsize.y - 1) / 2)) + 1; + + bman.field[PLX][PLY].type = FT_nothing; + + dx = s_random (4); // bit 1 = up/down bit 2 = left/right + /* up and down */ + if (((dx & 1) == 0 && PLX > 1) || PLX >= bman.fieldsize.x - 2) + bman.field[PLX - 1][PLY].type = FT_nothing; + else + bman.field[PLX + 1][PLY].type = FT_nothing; + /* left and right */ + if (((dx & 2) == 0 && PLY > 1) || PLY >= bman.fieldsize.y - 2) + bman.field[PLX][PLY - 1].type = FT_nothing; + else + bman.field[PLX][PLY + 1].type = FT_nothing; + } mx = my = 100; for (j = 0; j <= i; j++) { /* search smalest distance */ dy = PLY - bman.players[j].pos.y; @@ -255,47 +291,50 @@ void field_set_playerposition (int usermap) { p++; } } - - for (i = 0; i < MAX_PLAYERS; i++) { - PLX = PLX << 8; - PLY = PLY << 8; - } + + for (i = 0; i < MAX_PLAYERS; i++) { + PLX = PLX << 8; + PLY = PLY << 8; + } }; + #undef PLX #undef PLY // clear field and send this to all netplayers void -field_clear(int x, int y) +field_clear (int x, int y) { bman.field[x][y].type = FT_nothing; if (bman.gametype != GT_single) - net_game_send_field (x, y); + net_game_send_field (x, y); } void -field_update(int x, int y) +field_update (int x, int y) { -gfx_AddUpdateRect (x * gfx.block.x + gfx.offset.x, y * gfx.block.y + gfx.offset.y, - gfx.block.x, gfx.block.y); + gfx_AddUpdateRect (x * gfx.block.x + gfx.offset.x, y * gfx.block.y + gfx.offset.y, + gfx.block.x, gfx.block.y); + +} -} - // put items into the field -void +void field_fillitems (int fieldtype, int num) - { - int nb_try=100,d,x,y; - /* this is the item factor we multiply it with this so we know - how much items we want in the game */ - float fkt = ((float)(bman.fieldsize.x * bman.fieldsize.y))/(25.0 * 17.0); - /* put the row special in the field */ - - for (d = 0; d < num * fkt; d++) { - x=y=0; - while (bman.field[x][y].type != FT_stone || bman.field[x][y].special != FT_nothing) { + int nb_try = 100, + d, + x, + y; + /* this is the item factor we multiply it with this so we know + how much items we want in the game */ + float fkt = ((float) (bman.fieldsize.x * bman.fieldsize.y)) / (25.0 * 17.0); + /* put the row special in the field */ + + for (d = 0; d < num * fkt; d++) { + x = y = 0; + while (bman.field[x][y].type != FT_stone || bman.field[x][y].special != FT_nothing) { x = ((float) rand () / (float) RAND_MAX) * (bman.fieldsize.x - 1); y = ((float) rand () / (float) RAND_MAX) * (bman.fieldsize.y - 1); nb_try--; @@ -303,8 +342,8 @@ field_fillitems (int fieldtype, int num) break; } bman.field[x][y].special = fieldtype; - } - + } + } @@ -319,27 +358,25 @@ field_new (char *filename) d; FILE *fmap; - if(filename) - { - fmap = fopen (filename, "r"); + if (filename) { + fmap = fopen (filename, "r"); - /* if we can't open the given filename for any reason, reverting - to default value else, load the file */ - if (fmap) - field_load (fmap); - } - else - { - fmap = NULL; - } + /* if we can't open the given filename for any reason, reverting + to default value else, load the file */ + if (fmap) + field_load (fmap); + } + else { + fmap = NULL; + } + + /* this is the item factor we multiply it with this so we know + how much items we want in the game */ +// fkt = ((float)(bman.fieldsize.x * bman.fieldsize.y))/(25.0 * 17.0); - /* this is the item factor we multiply it with this so we know - how much items we want in the game */ -// fkt = ((float)(bman.fieldsize.x * bman.fieldsize.y))/(25.0 * 17.0); - // Clean and create the field // if (fmap == NULL) { - /* if we can't load the map check first the fieldsize settings */ + /* if we can't load the map check first the fieldsize settings */ if (bman.fieldsize.x < MIN_FIELDSIZE_X) bman.fieldsize.x = MIN_FIELDSIZE_X; if (bman.fieldsize.x > MAX_FIELDSIZE_X) @@ -370,32 +407,30 @@ field_new (char *filename) } } - /* delete the bfield data */ - for (x = 0; x < MAX_FIELDSIZE_X; x++) - for (y = 0; y < MAX_FIELDSIZE_Y; y++) - bman.bfield[x][y] = 0; - - /* Set the Playerinformation */ - field_set_playerposition (fmap != NULL); + /* delete the bfield data */ + for (x = 0; x < MAX_FIELDSIZE_X; x++) + for (y = 0; y < MAX_FIELDSIZE_Y; y++) + bman.bfield[x][y] = 0; + + /* Set the Playerinformation */ + field_set_playerposition (fmap != NULL); /* put the fire powerups in the field */ - field_fillitems (FT_fire, GAME_SPECIAL_ITEMFIRE); + field_fillitems (FT_fire, GAME_SPECIAL_ITEMFIRE); /* put the bomb powerups in the field */ - field_fillitems (FT_bomb, GAME_SPECIAL_ITEMBOMB); + field_fillitems (FT_bomb, GAME_SPECIAL_ITEMBOMB); /* put the shoe powerup in the field */ - field_fillitems (FT_shoe, GAME_SPECIAL_ITEMSHOE); + field_fillitems (FT_shoe, GAME_SPECIAL_ITEMSHOE); /* put the death ?powerups? in the field */ - field_fillitems (FT_death, GAME_SPECIAL_ITEMDEATH); - /* put the mixed powerrup in the field */ - field_fillitems (FT_mixed, GAME_SPECIAL_ITEMMIXED); - /* put the trigger special in the field */ - field_fillitems (FT_sp_trigger, GAME_SPECIAL_ITEMSTRIGGER); - /* put the row special in the field */ - field_fillitems (FT_sp_row, GAME_SPECIAL_ITEMSROW); - /* put the push special in the field */ - field_fillitems (FT_sp_push, GAME_SPECIAL_ITEMSPUSH); - /* put the kick special in the field */ - field_fillitems (FT_sp_kick, GAME_SPECIAL_ITEMSKICK); + field_fillitems (FT_death, GAME_SPECIAL_ITEMDEATH); + /* put the mixed powerrup in the field */ + field_fillitems (FT_mixed, GAME_SPECIAL_ITEMMIXED); + /* put the trigger special in the field */ + field_fillitems (FT_sp_trigger, GAME_SPECIAL_ITEMSTRIGGER); + /* put the row special in the field */ + field_fillitems (FT_sp_row, GAME_SPECIAL_ITEMSROW); + /* put the push special in the field */ + field_fillitems (FT_sp_push, GAME_SPECIAL_ITEMSPUSH); + /* put the kick special in the field */ + field_fillitems (FT_sp_kick, GAME_SPECIAL_ITEMSKICK); } - - diff --git a/src/gfx.c b/src/gfx.c index fb4116b..70287ab 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -868,7 +868,7 @@ gfx_load_tileset (char *tilesetname) gfx.powerup.frames = tmpimage->h / GFX_IMGSIZE; tmpimage1 = scale_image (tmpimage, (tmpimage->w / GFX_IMGSIZE) * gfx.block.x, - gfx.bomb.frames * gfx.block.y); + gfx.powerup.frames * gfx.block.y); SDL_SetColorKey (tmpimage1, SDL_SRCCOLORKEY, SDL_MapRGB (tmpimage1->format, 255, 0, 255)); gfx.powerup.image = SDL_DisplayFormat (tmpimage1); SDL_FreeSurface (tmpimage);