home · contact · privacy
Added diagonal movement, with a 1.4 penalty.
[plomrogue] / src / server / map.c
1 /* src/server/map.c */
2
3 #include "map.h"
4 #include <stdint.h> /* uint8_t, uint16_t, uint32_t */
5 #include "../common/try_malloc.h" /* try_malloc() */
6 #include "../common/yx_uint16.h" /* struct yx_uint16 */
7 #include "rrand.h" /* rrand() */
8 #include "world.h" /* global world */
9
10
11
12 extern void init_map()
13 {
14     char * f_name = "init_map()";
15     uint32_t size = world.map.size.x * world.map.size.y;
16     world.map.cells = try_malloc(size, f_name);
17     uint16_t y, x;
18     for (y = 0; y < world.map.size.y; y++)
19     {
20         for (x = 0;
21              x < world.map.size.x;
22              world.map.cells[(y * world.map.size.x) + x] = '~', x++);
23     }
24     world.map.cells[size / 2 + (world.map.size.x / 2)] = '.';
25     uint32_t curpos;
26     while (1)
27     {
28         y = rrand() % world.map.size.y;
29         x = rrand() % world.map.size.x;
30         curpos = y * world.map.size.x + x;
31         if ('~' == world.map.cells[curpos]
32             && (   (   curpos >= world.map.size.x
33                     && '.' == world.map.cells[curpos - world.map.size.x])
34                 || (   curpos < world.map.size.x * (world.map.size.y-1)
35                     && '.' == world.map.cells[curpos + world.map.size.x])
36                 || (   curpos > 0 && curpos % world.map.size.x != 0
37                     && '.' == world.map.cells[curpos-1])
38                 || (   curpos < (world.map.size.x * world.map.size.y)
39                     && (curpos+1) % world.map.size.x != 0
40                     && '.' == world.map.cells[curpos+1])))
41         {
42             if (  y == 0 || y == world.map.size.y - 1 || x == 0
43                 || x == world.map.size.x - 1)
44             {
45                 break;
46             }
47             world.map.cells[y * world.map.size.x + x] = '.';
48         }
49     }
50 }
51
52
53
54 extern uint8_t is_passable(struct yx_uint16 pos)
55 {
56     uint8_t passable = 0;
57     if (   0 <= pos.x && pos.x < world.map.size.x
58         && 0 <= pos.y && pos.y < world.map.size.y)
59     {
60         passable = (('.' == world.map.cells[pos.y * world.map.size.x + pos.x]));
61     }
62     return passable;
63 }