|
|
|
@ -1,8 +1,10 @@
|
|
|
|
|
/* $Id: map.c,v 1.1 2003/07/15 11:43:09 stpohle Exp $ */
|
|
|
|
|
/* $Id: map.c,v 1.2 2003/07/16 14:42:00 stpohle Exp $ */
|
|
|
|
|
/* map handling, like generate and load maps. */
|
|
|
|
|
|
|
|
|
|
#include "bomberclone.h"
|
|
|
|
|
|
|
|
|
|
_map map;
|
|
|
|
|
|
|
|
|
|
// put items into the field
|
|
|
|
|
void
|
|
|
|
|
map_fillitems (int fieldtype, int num)
|
|
|
|
@ -13,19 +15,19 @@ map_fillitems (int fieldtype, int num)
|
|
|
|
|
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);
|
|
|
|
|
float fkt = ((float) (map.size.x * map.size.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);
|
|
|
|
|
while (map.field[x][y].type != FT_stone || map.field[x][y].special != FT_nothing) {
|
|
|
|
|
x = ((float) rand () / (float) RAND_MAX) * (map.size.x - 1);
|
|
|
|
|
y = ((float) rand () / (float) RAND_MAX) * (map.size.y - 1);
|
|
|
|
|
nb_try--;
|
|
|
|
|
if (nb_try < 0)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
bman.field[x][y].special = fieldtype;
|
|
|
|
|
map.field[x][y].special = fieldtype;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -56,7 +58,7 @@ map_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;
|
|
|
|
|
map.bfield[x][y] = 0;
|
|
|
|
|
|
|
|
|
|
/* Set the Playerinformation */
|
|
|
|
|
map_set_playerposition (fmap != NULL);
|
|
|
|
@ -85,33 +87,33 @@ void map_genrandom () {
|
|
|
|
|
int x, y, d;
|
|
|
|
|
|
|
|
|
|
/* 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)
|
|
|
|
|
bman.fieldsize.x = MAX_FIELDSIZE_X;
|
|
|
|
|
|
|
|
|
|
for (x = 0; x < bman.fieldsize.x; x++)
|
|
|
|
|
for (y = 0; y < bman.fieldsize.y; y++) {
|
|
|
|
|
if ((y == 0) || (y == bman.fieldsize.y - 1))
|
|
|
|
|
bman.field[x][y].type = FT_block;
|
|
|
|
|
else if ((x == 0) || (x == bman.fieldsize.x - 1))
|
|
|
|
|
bman.field[x][y].type = FT_block;
|
|
|
|
|
if (map.size.x < MIN_FIELDSIZE_X)
|
|
|
|
|
map.size.x = MIN_FIELDSIZE_X;
|
|
|
|
|
if (map.size.x > MAX_FIELDSIZE_X)
|
|
|
|
|
map.size.x = MAX_FIELDSIZE_X;
|
|
|
|
|
|
|
|
|
|
for (x = 0; x < map.size.x; x++)
|
|
|
|
|
for (y = 0; y < map.size.y; y++) {
|
|
|
|
|
if ((y == 0) || (y == map.size.y - 1))
|
|
|
|
|
map.field[x][y].type = FT_block;
|
|
|
|
|
else if ((x == 0) || (x == map.size.x - 1))
|
|
|
|
|
map.field[x][y].type = FT_block;
|
|
|
|
|
else if (((x & 1) == 0) && ((y & 1) == 0))
|
|
|
|
|
bman.field[x][y].type = FT_block;
|
|
|
|
|
map.field[x][y].type = FT_block;
|
|
|
|
|
else {
|
|
|
|
|
// create random field
|
|
|
|
|
if ((s_random (256) & 3) == 0)
|
|
|
|
|
bman.field[x][y].type = FT_nothing;
|
|
|
|
|
map.field[x][y].type = FT_nothing;
|
|
|
|
|
else
|
|
|
|
|
bman.field[x][y].type = FT_stone;
|
|
|
|
|
map.field[x][y].type = FT_stone;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (d = 0; d < 4; d++)
|
|
|
|
|
bman.field[x][y].ex[d].frame = bman.field[x][y].ex[d].count = 0;
|
|
|
|
|
bman.field[x][y].ex_nr = -1;
|
|
|
|
|
bman.field[x][y].frame = 0;
|
|
|
|
|
bman.field[x][y].frameto = 0;
|
|
|
|
|
bman.field[x][y].special = FT_nothing;
|
|
|
|
|
map.field[x][y].ex[d].frame = map.field[x][y].ex[d].count = 0;
|
|
|
|
|
map.field[x][y].ex_nr = -1;
|
|
|
|
|
map.field[x][y].frame = 0;
|
|
|
|
|
map.field[x][y].frameto = 0;
|
|
|
|
|
map.field[x][y].special = FT_nothing;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -143,8 +145,8 @@ map_set_playerposition (int 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;
|
|
|
|
|
PLX = s_random (map.size.x - 2) + 1;
|
|
|
|
|
PLY = s_random (map.size.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;
|
|
|
|
@ -157,8 +159,8 @@ map_set_playerposition (int usermap)
|
|
|
|
|
|
|
|
|
|
/* 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)) {
|
|
|
|
|
&& ((map.field[PLX][PLY].type != FT_block && maxloop > 100)
|
|
|
|
|
|| map.field[PLX][PLY].type == FT_nothing)) {
|
|
|
|
|
/* get (up or down) dx and (left or right) dy */
|
|
|
|
|
dx = s_random (2);
|
|
|
|
|
if (dx == 0)
|
|
|
|
@ -168,18 +170,18 @@ map_set_playerposition (int usermap)
|
|
|
|
|
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))
|
|
|
|
|
if (!((map.field[PLX + dx][PLY].type != FT_block && maxloop > 100) ||
|
|
|
|
|
map.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))
|
|
|
|
|
if (!((map.field[PLX + dx][PLY].type != FT_block && maxloop > 100) ||
|
|
|
|
|
map.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))
|
|
|
|
|
if (!((map.field[PLX][PLY + dy].type != FT_block && maxloop > 100) ||
|
|
|
|
|
map.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))
|
|
|
|
|
if (!((map.field[PLX][PLY + dy].type != FT_block && maxloop > 100) ||
|
|
|
|
|
map.field[PLX][PLY + dy].type == FT_nothing))
|
|
|
|
|
PLY = -1;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
@ -189,9 +191,9 @@ map_set_playerposition (int usermap)
|
|
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
|
map.field[PLX][PLY].type = FT_nothing;
|
|
|
|
|
map.field[PLX + dx][PLY].type = FT_nothing;
|
|
|
|
|
map.field[PLX][PLY + dy].type = FT_nothing;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -203,22 +205,22 @@ map_set_playerposition (int usermap)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
|
PLX = 2 * (s_random ((map.size.x - 1) / 2)) + 1;
|
|
|
|
|
PLY = 2 * (s_random ((map.size.y - 1) / 2)) + 1;
|
|
|
|
|
|
|
|
|
|
bman.field[PLX][PLY].type = FT_nothing;
|
|
|
|
|
map.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;
|
|
|
|
|
if (((dx & 1) == 0 && PLX > 1) || PLX >= map.size.x - 2)
|
|
|
|
|
map.field[PLX - 1][PLY].type = FT_nothing;
|
|
|
|
|
else
|
|
|
|
|
bman.field[PLX + 1][PLY].type = FT_nothing;
|
|
|
|
|
map.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;
|
|
|
|
|
if (((dx & 2) == 0 && PLY > 1) || PLY >= map.size.y - 2)
|
|
|
|
|
map.field[PLX][PLY - 1].type = FT_nothing;
|
|
|
|
|
else
|
|
|
|
|
bman.field[PLX][PLY + 1].type = FT_nothing;
|
|
|
|
|
map.field[PLX][PLY + 1].type = FT_nothing;
|
|
|
|
|
}
|
|
|
|
|
mx = my = 100;
|
|
|
|
|
for (j = 0; j <= i; j++) { /* search smalest distance */
|
|
|
|
@ -273,27 +275,27 @@ void map_random () {
|
|
|
|
|
d_printf ("Random Map %s (%d on %d)\n", desel->name, sel, max);
|
|
|
|
|
|
|
|
|
|
if (desel != NULL)
|
|
|
|
|
sprintf (bman.fieldpath, "%s/maps/%s", bman.datapath, desel->name);
|
|
|
|
|
sprintf (map.map, "%s/maps/%s", bman.datapath, desel->name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Init the game according to options
|
|
|
|
|
void init_map_tileset()
|
|
|
|
|
{
|
|
|
|
|
switch (bman.random_map) {
|
|
|
|
|
switch (map.map_selection) {
|
|
|
|
|
case (0):
|
|
|
|
|
map_new (bman.fieldpath);
|
|
|
|
|
map_new (map.map);
|
|
|
|
|
break;
|
|
|
|
|
case (1):
|
|
|
|
|
map_random ();
|
|
|
|
|
map_new (bman.fieldpath);
|
|
|
|
|
map_new (map.map);
|
|
|
|
|
break;
|
|
|
|
|
case (2):
|
|
|
|
|
map_new (NULL);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gfx.random_tileset)
|
|
|
|
|
if (map.random_tileset)
|
|
|
|
|
tileset_random ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -304,7 +306,7 @@ void init_map_tileset()
|
|
|
|
|
an espace is nothing ' '
|
|
|
|
|
% are commentary at the beginning of the map */
|
|
|
|
|
void
|
|
|
|
|
map_load (FILE * map)
|
|
|
|
|
map_load (FILE * mapname)
|
|
|
|
|
{
|
|
|
|
|
size_t length;
|
|
|
|
|
char *currentline;
|
|
|
|
@ -314,7 +316,7 @@ map_load (FILE * map)
|
|
|
|
|
int i;
|
|
|
|
|
int d;
|
|
|
|
|
|
|
|
|
|
while ((currentline = fgets (tmp, MAX_FIELDSIZE_X, map))) {
|
|
|
|
|
while ((currentline = fgets (tmp, MAX_FIELDSIZE_X, mapname))) {
|
|
|
|
|
length = strlen (currentline);
|
|
|
|
|
if (currentline[0] == '%')
|
|
|
|
|
continue;
|
|
|
|
@ -323,22 +325,22 @@ map_load (FILE * map)
|
|
|
|
|
for (i = 0; i < length; i++) {
|
|
|
|
|
switch (currentline[i]) {
|
|
|
|
|
case '#':
|
|
|
|
|
bman.field[i][sizey].type = FT_block;
|
|
|
|
|
map.field[i][sizey].type = FT_block;
|
|
|
|
|
break;
|
|
|
|
|
case '@':
|
|
|
|
|
bman.field[i][sizey].type = FT_stone;
|
|
|
|
|
map.field[i][sizey].type = FT_stone;
|
|
|
|
|
break;
|
|
|
|
|
case ' ':
|
|
|
|
|
bman.field[i][sizey].type = FT_nothing;
|
|
|
|
|
map.field[i][sizey].type = FT_nothing;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
for (d = 0; d < 4; d++)
|
|
|
|
|
bman.field[i][sizey].ex[d].frame = bman.field[i][sizey].ex[d].count = 0;
|
|
|
|
|
bman.field[i][sizey].ex_nr = -1;
|
|
|
|
|
bman.field[i][sizey].frame = 0;
|
|
|
|
|
bman.field[i][sizey].frameto = 0;
|
|
|
|
|
bman.field[i][sizey].special = FT_nothing;
|
|
|
|
|
map.field[i][sizey].ex[d].frame = map.field[i][sizey].ex[d].count = 0;
|
|
|
|
|
map.field[i][sizey].ex_nr = -1;
|
|
|
|
|
map.field[i][sizey].frame = 0;
|
|
|
|
|
map.field[i][sizey].frameto = 0;
|
|
|
|
|
map.field[i][sizey].special = FT_nothing;
|
|
|
|
|
}
|
|
|
|
|
sizey++;
|
|
|
|
|
if (sizex < length)
|
|
|
|
@ -346,12 +348,12 @@ map_load (FILE * map)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bman.fieldsize.x = sizex - 1;
|
|
|
|
|
bman.fieldsize.y = sizey;
|
|
|
|
|
map.size.x = sizex - 1;
|
|
|
|
|
map.size.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;
|
|
|
|
|
for (i = 0; i < map.size.x; i++)
|
|
|
|
|
map.field[i][0].type = map.field[i][map.size.y - 1].type = FT_block;
|
|
|
|
|
for (i = 0; i < map.size.y; i++)
|
|
|
|
|
map.field[0][i].type = map.field[map.size.x - 1][i].type = FT_block;
|
|
|
|
|
}
|
|
|
|
|