persistent map
This commit is contained in:
parent
02760ec80b
commit
becd1b6f60
207
w/w.c
207
w/w.c
|
@ -80,6 +80,7 @@ typedef struct {
|
||||||
Position position;
|
Position position;
|
||||||
Item inventory[INVENTORY_SIZE];
|
Item inventory[INVENTORY_SIZE];
|
||||||
char screen;
|
char screen;
|
||||||
|
char map[MAP_SIZE * MAP_SIZE];
|
||||||
} Gamestate;
|
} Gamestate;
|
||||||
|
|
||||||
const char* statepath = "w.state";
|
const char* statepath = "w.state";
|
||||||
|
@ -91,8 +92,6 @@ Character currentmonster;
|
||||||
Round* firstround = NULL;
|
Round* firstround = NULL;
|
||||||
Round* currentround = NULL;
|
Round* currentround = NULL;
|
||||||
|
|
||||||
char map[MAP_SIZE * MAP_SIZE];
|
|
||||||
|
|
||||||
Character monsters[2] = {
|
Character monsters[2] = {
|
||||||
{ "alien bleu", 2, 2, 1, 1 },
|
{ "alien bleu", 2, 2, 1, 1 },
|
||||||
{ "vilaine araignée", 5, 8, 2, 1 }
|
{ "vilaine araignée", 5, 8, 2, 1 }
|
||||||
|
@ -130,7 +129,7 @@ char tileonmap(char tile)
|
||||||
|
|
||||||
char charatpos(int x, int y)
|
char charatpos(int x, int y)
|
||||||
{
|
{
|
||||||
return map[y * MAP_SIZE + x];
|
return state.map[y * MAP_SIZE + x];
|
||||||
}
|
}
|
||||||
|
|
||||||
void setatpos(int x, int y, char c)
|
void setatpos(int x, int y, char c)
|
||||||
|
@ -139,7 +138,7 @@ void setatpos(int x, int y, char c)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
map[y * MAP_SIZE + x] = c;
|
state.map[y * MAP_SIZE + x] = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawmap()
|
void drawmap()
|
||||||
|
@ -434,10 +433,106 @@ void clearscreen()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dfs(int x, int y)
|
||||||
|
{
|
||||||
|
if (charatpos(x,y) != TILE_START)
|
||||||
|
{
|
||||||
|
setatpos(x, y, TILE_ROOM);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool nok = false;
|
||||||
|
bool eok = false;
|
||||||
|
bool sok = false;
|
||||||
|
bool wok = false;
|
||||||
|
|
||||||
|
while (! (nok && eok && sok && wok))
|
||||||
|
{
|
||||||
|
char orientation = rand() % 4;
|
||||||
|
switch (orientation)
|
||||||
|
{
|
||||||
|
case NORTH:
|
||||||
|
nok = true;
|
||||||
|
if (charatpos(x, y - 2) == TILE_INIT)
|
||||||
|
{
|
||||||
|
setatpos(x, y - 1, dice() == 6 ? TILE_DOOR : TILE_FREE);
|
||||||
|
dfs(x, y - 2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SOUTH:
|
||||||
|
sok = true;
|
||||||
|
if (charatpos(x, y + 2) == TILE_INIT)
|
||||||
|
{
|
||||||
|
setatpos(x, y + 1, dice() == 6 ? TILE_DOOR : TILE_FREE);
|
||||||
|
dfs(x, y + 2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EAST:
|
||||||
|
eok = true;
|
||||||
|
if (charatpos(x - 2, y) == TILE_INIT)
|
||||||
|
{
|
||||||
|
setatpos(x - 1, y, dice() == 6 ? TILE_DOOR : TILE_FREE);
|
||||||
|
dfs(x - 2, y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WEST:
|
||||||
|
wok = true;
|
||||||
|
if (charatpos(x + 2, y) == TILE_INIT)
|
||||||
|
{
|
||||||
|
setatpos(x + 1, y, dice() == 6 ? TILE_DOOR : TILE_FREE);
|
||||||
|
dfs(x + 2, y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initmap()
|
||||||
|
{
|
||||||
|
memset(&state.map, TILE_INIT, MAP_SIZE * MAP_SIZE);
|
||||||
|
|
||||||
|
for (int x = 0; x < MAP_SIZE; x ++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < MAP_SIZE; y++)
|
||||||
|
{
|
||||||
|
if (x == 0 || y == 0 || x == MAP_SIZE - 1 || y == MAP_SIZE - 1)
|
||||||
|
{
|
||||||
|
// boundaries
|
||||||
|
setatpos(x, y, TILE_WALL);
|
||||||
|
}
|
||||||
|
else if (x % 2 && y % 2)
|
||||||
|
{
|
||||||
|
// free tiles not yet initialized by dfs
|
||||||
|
setatpos(x, y, TILE_INIT);
|
||||||
|
}
|
||||||
|
else if (!(x % 2 ) && !(y % 2))
|
||||||
|
{
|
||||||
|
// unused tiles aka "poles"
|
||||||
|
setatpos(x, y, TILE_POLE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// init all intersections with walls
|
||||||
|
setatpos(x, y, TILE_WALL);
|
||||||
|
|
||||||
|
//... and put a few free tiles here and there to create bigger rooms
|
||||||
|
if (dice() == 1)
|
||||||
|
{
|
||||||
|
setatpos(x, y, TILE_FREE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// starting point
|
||||||
|
setatpos(1, 13, TILE_START);
|
||||||
|
|
||||||
|
// create map
|
||||||
|
dfs(1, 13);
|
||||||
|
}
|
||||||
|
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
printf("Démarrage...\n");
|
printf("Démarrage...\n");
|
||||||
map[0] = 0;
|
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
FILE* file = fopen(statepath, "r");
|
FILE* file = fopen(statepath, "r");
|
||||||
if (file)
|
if (file)
|
||||||
|
@ -449,6 +544,7 @@ void init()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
state.screen = SC_TITLE;
|
state.screen = SC_TITLE;
|
||||||
|
initmap();
|
||||||
}
|
}
|
||||||
printf("Début de la boucle principale...\n");
|
printf("Début de la boucle principale...\n");
|
||||||
}
|
}
|
||||||
|
@ -562,103 +658,6 @@ void drawrounds()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dfs(int x, int y)
|
|
||||||
{
|
|
||||||
if (charatpos(x,y) != TILE_START)
|
|
||||||
{
|
|
||||||
setatpos(x, y, TILE_ROOM);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool nok = false;
|
|
||||||
bool eok = false;
|
|
||||||
bool sok = false;
|
|
||||||
bool wok = false;
|
|
||||||
|
|
||||||
while (! (nok && eok && sok && wok))
|
|
||||||
{
|
|
||||||
char orientation = rand() % 4;
|
|
||||||
switch (orientation)
|
|
||||||
{
|
|
||||||
case NORTH:
|
|
||||||
nok = true;
|
|
||||||
if (charatpos(x, y - 2) == TILE_INIT)
|
|
||||||
{
|
|
||||||
setatpos(x, y - 1, dice() == 6 ? TILE_DOOR : TILE_FREE);
|
|
||||||
dfs(x, y - 2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SOUTH:
|
|
||||||
sok = true;
|
|
||||||
if (charatpos(x, y + 2) == TILE_INIT)
|
|
||||||
{
|
|
||||||
setatpos(x, y + 1, dice() == 6 ? TILE_DOOR : TILE_FREE);
|
|
||||||
dfs(x, y + 2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EAST:
|
|
||||||
eok = true;
|
|
||||||
if (charatpos(x - 2, y) == TILE_INIT)
|
|
||||||
{
|
|
||||||
setatpos(x - 1, y, dice() == 6 ? TILE_DOOR : TILE_FREE);
|
|
||||||
dfs(x - 2, y);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WEST:
|
|
||||||
wok = true;
|
|
||||||
if (charatpos(x + 2, y) == TILE_INIT)
|
|
||||||
{
|
|
||||||
setatpos(x + 1, y, dice() == 6 ? TILE_DOOR : TILE_FREE);
|
|
||||||
dfs(x + 2, y);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void initmap()
|
|
||||||
{
|
|
||||||
memset(&map, TILE_INIT, MAP_SIZE * MAP_SIZE);
|
|
||||||
|
|
||||||
for (int x = 0; x < MAP_SIZE; x ++)
|
|
||||||
{
|
|
||||||
for (int y = 0; y < MAP_SIZE; y++)
|
|
||||||
{
|
|
||||||
if (x == 0 || y == 0 || x == MAP_SIZE - 1 || y == MAP_SIZE - 1)
|
|
||||||
{
|
|
||||||
// boundaries
|
|
||||||
setatpos(x, y, TILE_WALL);
|
|
||||||
}
|
|
||||||
else if (x % 2 && y % 2)
|
|
||||||
{
|
|
||||||
// free tiles not yet initialized by dfs
|
|
||||||
setatpos(x, y, TILE_INIT);
|
|
||||||
}
|
|
||||||
else if (!(x % 2 ) && !(y % 2))
|
|
||||||
{
|
|
||||||
// unused tiles aka "poles"
|
|
||||||
setatpos(x, y, TILE_POLE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// init all intersections with walls
|
|
||||||
setatpos(x, y, TILE_WALL);
|
|
||||||
|
|
||||||
//... and put a few free tiles here and there to create bigger rooms
|
|
||||||
if (dice() == 1)
|
|
||||||
{
|
|
||||||
setatpos(x, y, TILE_FREE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// starting point
|
|
||||||
setatpos(1, 13, TILE_START);
|
|
||||||
|
|
||||||
// create map
|
|
||||||
dfs(1, 13);
|
|
||||||
}
|
|
||||||
|
|
||||||
void update(char* command)
|
void update(char* command)
|
||||||
{
|
{
|
||||||
char c = command[0];
|
char c = command[0];
|
||||||
|
@ -720,10 +719,6 @@ void update(char* command)
|
||||||
state.position.y = 13;
|
state.position.y = 13;
|
||||||
state.position.orientation = NORTH;
|
state.position.orientation = NORTH;
|
||||||
|
|
||||||
if (map[0] == 0)
|
|
||||||
{
|
|
||||||
initmap();
|
|
||||||
}
|
|
||||||
updatepov();
|
updatepov();
|
||||||
}
|
}
|
||||||
else if (c == CMD_GOTOMARKET)
|
else if (c == CMD_GOTOMARKET)
|
||||||
|
|
Loading…
Reference in New Issue