home · contact · privacy
Maps are always squares, therefore define only their edge lengths.
authorChristian Heller <c.heller@plomlompom.de>
Wed, 14 May 2014 04:04:11 +0000 (06:04 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Wed, 14 May 2014 04:04:11 +0000 (06:04 +0200)
17 files changed:
README
TODO
confserver/world
src/client/draw_wins.c
src/client/io.c
src/client/map.c
src/client/wincontrol.c
src/client/windows.c
src/client/windows.h
src/common/map.h
src/common/yx_uint16.h [deleted file]
src/server/ai.c
src/server/configfile.c
src/server/field_of_view.c
src/server/io.c
src/server/map.c
src/server/map_objects.c

diff --git a/README b/README
index 2a0206deb2935950eeb388b70ac7a09c0812a840..5ec2f4ae7b059650e3b247ba10f3f7d7f37d4668 100644 (file)
--- a/README
+++ b/README
@@ -78,21 +78,9 @@ Hacking / server internals and configuration
 --------------------------------------------
 
 The ./confserver/world file defines the map object types, actions available to
-them, the map itself, the map object type (species) of the player and whether
-enemies see the whole map or only a line-of-sight field of view. Each definition
-consists of a single- or multi-line block wherein each line sets one attribute.
-
-Here's a typical map definition block:
-
-MAP_TYPE 0
-HEIGHT 64
-WIDTH 64
-
-A line of "MAP_TYPE" followed by a non-empty token starts the map definition
-block. In the future, the second token may differentiate different map types,
-but as of right now, only one is available and the value is not interpreted.
-The numbers after "HEIGHT" and "WIDTH" give the map's vertical and horizontal
-extensions in cells. They must be >= 1 and <= 256. 
+them, the map geometry and the map object type (species) of the player. Each
+definition consists of a single- or multi-line block wherein each line sets one
+attribute.
 
 Here's a typical action definition block:
 
@@ -131,14 +119,21 @@ yet: or if they are inanimate, but are otherwise crushed). Note that the
 after, it may even be the same). "START_NUMBER" sets the number of objects that
 are to appear of the given type on the map on game start.
 
-A line of "PLAYER_TYPE" followed by a number sets the map object type (id) of
-the player's creature.
+The map is defined by a single-line block. Its number value sets the map
+square's edge length. It must be >= 1 and <= 256:
+
+MAP_LENGTH 64
+
+The player type / species is also defined by a single line block. Its number
+value sets the player's creature's map object type by its id:
+
+PLAYER_TYPE 0
 
-All these definition block members must be present within their blocks, but only
-"ACTION" / "OBJECT" / "MAP_TYPE" must be positioned at their respective blocks'
-first line; the others may appear in whatever order and even multiple times. If
-an object or action definition block is finished, however, it cannot be
-re-defined by starting a new block with the same object type or action id.
+All these definition block members must be present within their respective
+blocks, but only "ACTION" and "OBJECT" must be positioned at their respective
+blocks' first line; the others may appear in whatever order and even multiple
+times. If an object or action definition block is finished, however, it cannot
+be re-defined by starting a new block with the same object type or action id.
 
 Tokens in this config file are separated by whitespace. Single quotes can be
 put around string values that are to include whitespace by themslves. Note that
diff --git a/TODO b/TODO
index 46a647e034457cc57da982c4dc5c1de5f13cd7fe..c6623da4ddf03a19c52db310a12cb1e684a275a2 100644 (file)
--- a/TODO
+++ b/TODO
@@ -9,8 +9,6 @@ BOTH SERVER/CLIENT:
 
 - be more strict and humble when allocating memory from the stack
 
-- maps are always as wide as high, so only use one of the two values
-
 SERVER:
 
 - optimize too-slow AI / FOV algorithms
index 724d0120f2d6056fb439383712443fd42cc672b2..a44535c1f21d03b9033bbc1706ab8293f9b9e8b3 100644 (file)
@@ -1,7 +1,4 @@
-MAP_TYPE 0
-HEIGHT 64
-WIDTH 64
-
+MAP_LENGTH 64
 PLAYER_TYPE 0
 
 ACTION 1
index 5c35dd6cc2939e5f2176b1a6aec3e9cbb08b14c3..69278e8393631a351326ae725e682a304a267ab7 100644 (file)
@@ -10,9 +10,8 @@
 #include <string.h> /* memset(), strchr(), strdup/(), strlen() */
 #include "../common/rexit.h" /* exit_err() */
 #include "../common/try_malloc.h" /* try_malloc() */
-#include "../common/yx_uint16.h" /* struct yx_uint16 */
 #include "keybindings.h" /* struct KeyBindingDB, get_keyname_to_keycode() */
-#include "windows.h" /* struct Win, get_win_by_id() */
+#include "windows.h" /* yx_uint16, Win, get_win_by_id() */
 #include "world.h" /* global world */
 
 
@@ -339,12 +338,12 @@ extern void draw_win_log(struct Win * win)
 
 extern void draw_win_map(struct Win * win)
 {
-    try_resize_winmap(win, world.map.size.y, world.map.size.x * 2);
+    try_resize_winmap(win, world.map.length, world.map.length * 2);
     uint16_t z = 0;
     uint16_t x, y;
-    for (y = 0; y < world.map.size.y; y++)
+    for (y = 0; y < world.map.length; y++)
     {
-        for (x = 0; x < world.map.size.x; x++)
+        for (x = 0; x < world.map.length; x++)
         {
             set_ch_on_yx(win, y, x * 2 + (y % 2), world.map.cells[z]);
             z++;
index 1995b14a67aca61f74fb9b710ebaa33a13169b89..e3047234311aa19f4aaa5a154fc240b6e55525af 100644 (file)
@@ -31,7 +31,7 @@
 static void read_inventory(char * read_buf, uint32_t linemax, FILE * file);
 
 /* Read the next characters in "file" into world.map.cells. In detail: Read
- * world.map.size.y times world.map.size.x characters, followed by one ignored
+ * world.map.length times world.map.length characters, followed by one ignored
  * character (that we assume is a newline).
  */
 static void read_map_cells(FILE * file);
@@ -120,14 +120,14 @@ static void read_map_cells(FILE * file)
 {
     char * f_name = "read_map_cells()";
     free(world.map.cells);
-    world.map.cells = try_malloc(world.map.size.y * world.map.size.x, f_name);
+    world.map.cells = try_malloc(world.map.length * world.map.length, f_name);
     uint16_t y, x;
-    for (y = 0; y < world.map.size.y; y++)
+    for (y = 0; y < world.map.length; y++)
     {
-        for (x = 0; x < world.map.size.x; x++)
+        for (x = 0; x < world.map.length; x++)
         {
             char c = try_fgetc(file, f_name);
-            world.map.cells[(y * world.map.size.x) + x] = c;
+            world.map.cells[(y * world.map.length) + x] = c;
         }
         try_fgetc(file, f_name);
     }
@@ -216,8 +216,7 @@ static uint8_t read_world()
         map_center();
         first_read = 0;
     }
-    world.map.size.y = read_value_from_line(read_buf, linemax, file);
-    world.map.size.x = read_value_from_line(read_buf, linemax, file);
+    world.map.length = read_value_from_line(read_buf, linemax, file);
     read_map_cells(file);
     read_log(read_buf, linemax, file);
     free(read_buf);
index 2e3c12d1c34af34c8e8625caf0ee858baa495c85..7c2dcc384590df51b3dcfa46c9bcb577a6755e27 100644 (file)
@@ -11,24 +11,24 @@ extern void map_scroll(char d)
 {
     struct Win * win = get_win_by_id('m');
     uint16_t offset;
-    if (('8' == d || '2' == d) && world.map.size.y > win->frame_size.y)
+    if (('8' == d || '2' == d) && world.map.length > win->frame_size.y)
     {
         offset = center_offset(win->center.y,
-                               world.map.size.y, win->frame_size.y);
+                               world.map.length, win->frame_size.y);
         win->center.y = offset + (win->frame_size.y / 2);
-        if ('2' == d && win->center.y < world.map.size.y - 1)
+        if ('2' == d && win->center.y < world.map.length - 1)
         {
             win->center.y++;
             return;
         }
         win->center.y = win->center.y - ('8' == d && win->center.y > 0);
     }
-    else if (('4' == d || '6' == d) && (world.map.size.x*2) > win->frame_size.x)
+    else if (('4' == d || '6' == d) && (world.map.length*2) > win->frame_size.x)
     {
         offset = center_offset(win->center.x,
-                               world.map.size.x*2, win->frame_size.x);
+                               world.map.length*2, win->frame_size.x);
         win->center.x = offset + (win->frame_size.x / 2);
-        if ('6' == d && win->center.x < (world.map.size.x * 2) - 1)
+        if ('6' == d && win->center.x < (world.map.length * 2) - 1)
         {
             win->center.x++;
             return;
index 21308e728117756f7dc62f3ec356fd01920f5924..09cff03caaa756b9e095a5ce10b45dc829636da0 100644 (file)
@@ -9,8 +9,7 @@
 #include <string.h> /* memcpy(), memset(), strchr(), strlen() */
 #include "../common/rexit.h" /* exit_err() */
 #include "../common/try_malloc.h" /* try_malloc() */
-#include "../common/yx_uint16.h" /* struct yx_uint16 */
-#include "windows.h" /* struct Win, get_win_by_id(), get_win_pos_in_order() */
+#include "windows.h" /* Win,yx_uint16, get_win_by_id(),get_win_pos_in_order() */
 #include "world.h" /* global world */
 
 
index 4952a4d3a689c029a82a6f2481c13a490fba48b8..faf1f8a642484a37235ae5b29eb3fe9698e75686 100644 (file)
@@ -13,7 +13,6 @@
 #include <stdlib.h> /* free() */
 #include <string.h> /* memcpy(), strlen(), strnlen(), memset() */
 #include "../common/rexit.h" /* exit_trouble(), exit_err() */
-#include "../common/yx_uint16.h" /* struct yx_uint16 */
 #include "draw_wins.h" /* draw_winconf_geometry(), draw_winconf_keybindings(),
                         * draw_win_inventory(), draw_win_info(), draw_win_log(),
                         * draw_win_available_keybindings(), draw_win_map(),
@@ -22,7 +21,7 @@
                         * draw_win_keybindings_global()
                         */
 #include "wincontrol.h" /* toggle_window() */
-#include "world.h" /* global world */
+#include "world.h" /* world */
 
 
 
index dd03d8b151138079c0dbd1884c632be391b0d026..e2d39c29770a5fdf360282dd7e476cfe5eb617a4 100644 (file)
 
 #include <ncurses.h> /* WINDOW, chtype */
 #include <stdint.h> /* uint8_t, int16_t, uint16_t, uint32_t */
-#include "../common/yx_uint16.h" /* yx_uint16 struct */
 #include "keybindings.h" /* struct KeyBindingDB */
 
 
 
+struct yx_uint16
+{
+    uint16_t y;
+    uint16_t x;
+};
+
 struct WinDB
 {
     WINDOW * t_screen; /* ncurses' pointer to the terminal screen */
index 8d454ca7ab1b040464a3f5a0ab7a86c6824697fb..4a6d04126ad49d01e925b783e2e5136725c8803a 100644 (file)
@@ -6,13 +6,14 @@
 #ifndef MAP_H
 #define MAP_H
 
-#include "yx_uint16.h" /* yx_uint16 struct */
+#include <stdint.h> /* uint16_t */
+
 
 
 struct Map
 {
-    struct yx_uint16 size;   /* map's height/width in number of cells */
     char * cells;            /* sequence of bytes encoding map cells */
+    uint16_t length;         /* map's edge length */
 };
 
 
diff --git a/src/common/yx_uint16.h b/src/common/yx_uint16.h
deleted file mode 100644 (file)
index 05cf29e..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/* yx_uint16.h
- *
- * Used for window / screen maps and game map size.
- */
-
-#ifndef YX_UINT16_H
-#define YX_UINT16_H
-
-#include <stdint.h> /* for uint16_t */
-
-
-
-/* Coordinates for maps of max. 65536x65536 cells. */
-struct yx_uint16
-{
-    uint16_t y;
-    uint16_t x;
-};
-
-
-
-#endif
index 1596d5ae1915d600712ed99657e2e0bffd563dcc..ea77dd48e740e79bf4dd67a9a0a4d629368bb4d7 100644 (file)
@@ -46,19 +46,19 @@ static char get_dir_to_nearest_enemy(struct MapObj * mo_origin);
 static void get_neighbor_scores(uint16_t * score_map, uint16_t pos_i,
                                 uint16_t max_score, uint16_t * neighbors)
 {
-    uint32_t map_size = world.map.size.y * world.map.size.x;
+    uint32_t map_size = world.map.length * world.map.length;
     uint8_t i_dir;
     for (i_dir = 0; i_dir < N_DIRS; neighbors[i_dir] = max_score, i_dir++);
-    uint8_t open_north     = pos_i >= world.map.size.x;
-    uint8_t open_east      = pos_i + 1 % world.map.size.x;
-    uint8_t open_south     = pos_i + world.map.size.x < map_size;
-    uint8_t open_west      = pos_i % world.map.size.x;
-    uint8_t is_indented    = (pos_i / world.map.size.x) % 2;
+    uint8_t open_north     = pos_i >= world.map.length;
+    uint8_t open_east      = pos_i + 1 % world.map.length;
+    uint8_t open_south     = pos_i + world.map.length < map_size;
+    uint8_t open_west      = pos_i % world.map.length;
+    uint8_t is_indented    = (pos_i / world.map.length) % 2;
     uint8_t open_diag_west = is_indented || open_west;
     uint8_t open_diag_east = !is_indented || open_east;
     if (open_north && open_diag_east)
     {
-        neighbors[0] = score_map[pos_i - world.map.size.x + is_indented];
+        neighbors[0] = score_map[pos_i - world.map.length + is_indented];
     }
     if (open_east)
     {
@@ -66,11 +66,11 @@ static void get_neighbor_scores(uint16_t * score_map, uint16_t pos_i,
     }
     if (open_south && open_diag_east)
     {
-        neighbors[2] = score_map[pos_i + world.map.size.x + is_indented];
+        neighbors[2] = score_map[pos_i + world.map.length + is_indented];
     }
     if (open_south && open_diag_west)
     {
-        neighbors[3] = score_map[pos_i + world.map.size.x - !is_indented];
+        neighbors[3] = score_map[pos_i + world.map.length - !is_indented];
     }
     if (open_west)
     {
@@ -78,7 +78,7 @@ static void get_neighbor_scores(uint16_t * score_map, uint16_t pos_i,
     }
     if (open_north && open_diag_west)
     {
-        neighbors[5] = score_map[pos_i - world.map.size.x - !is_indented];
+        neighbors[5] = score_map[pos_i - world.map.length - !is_indented];
     }
 }
 
@@ -86,7 +86,7 @@ static void get_neighbor_scores(uint16_t * score_map, uint16_t pos_i,
 
 static void dijkstra_map(uint16_t * score_map, uint16_t max_score)
 {
-    uint32_t map_size = world.map.size.y * world.map.size.x;
+    uint32_t map_size = world.map.length * world.map.length;
     uint16_t pos, i_scans, neighbors[N_DIRS], min_neighbor;
     uint8_t scores_still_changing = 1;
     uint8_t i_dirs;
@@ -126,7 +126,7 @@ static char get_dir_to_nearest_enemy(struct MapObj * mo_origin)
      * "mo_origin", with movement only possible in the directions of "dir".
      * (Actors' own cells start with a distance of 0 towards themselves.)
      */
-    uint32_t map_size = world.map.size.y * world.map.size.x;
+    uint32_t map_size = world.map.length * world.map.length;
     uint16_t max_score = UINT16_MAX - 1;
     uint16_t * score_map = try_malloc(map_size * sizeof(uint16_t), f_name);
     uint32_t i;
@@ -141,13 +141,13 @@ static char get_dir_to_nearest_enemy(struct MapObj * mo_origin)
         {
             continue;
         }
-        score_map[(mo->pos.y * world.map.size.x) + mo->pos.x] = 0;
+        score_map[(mo->pos.y * world.map.length) + mo->pos.x] = 0;
     }
     dijkstra_map(score_map, max_score);
 
     /* Return direction of "mo_origin"'s lowest-scored neighbor cell. */
     uint16_t neighbors[N_DIRS];
-    uint16_t pos_i = (mo_origin->pos.y * world.map.size.x) + mo_origin->pos.x;
+    uint16_t pos_i = (mo_origin->pos.y * world.map.length) + mo_origin->pos.x;
     get_neighbor_scores(score_map, pos_i, max_score, neighbors);
     free(score_map);
     char dir_to_nearest_enemy = 0;
index fc2c771f42d952a3c5c5721d8dd533153ee264f1..8bbf4ef7a6251e61984b023ab22648f00c885f69 100644 (file)
@@ -37,8 +37,7 @@ enum flag
     START_N_SET    = 0x40,
     READY_ACT = NAME_SET | EFFORT_SET,
     READY_OBJ = NAME_SET | CORPSE_ID_SET | SYMBOL_SET | LIFEPOINTS_SET
-                | CONSUMABLE_SET | START_N_SET,
-    READY_MAP = HEIGHT_SET | WIDTH_SET
+                | CONSUMABLE_SET | START_N_SET
 };
 
 
@@ -76,11 +75,6 @@ static uint8_t start_entry(char * token0, char * token1, char * comparand,
                          struct EntryHead ** entry,
                          struct EntryHead * entry_cmp);
 
-/* Start reading map definition if "token0" matches "comparand". Set "map_flags"
- * to EDIT_STARTED to mark beginning of map definition reading.
- */
-static uint8_t start_map(char * token0, char * comparand, uint8_t * map_flags);
-
 /* Write DB entry pointed to by "entry" to its appropriate location. */
 static void write_if_entry(struct EntryHead ** entry,
                            struct EntryHead *** entry_p_p_p);
@@ -90,21 +84,21 @@ static void write_if_entry(struct EntryHead ** entry,
  */
 static void test_corpse_ids();
 
-/* set_members() helper specifically for editing world.map members. */
-static uint8_t set_map_members(char * token0,char * token1,uint8_t * map_flags);
-
 /* If "token0" matches "comparand", set world.player_type to int in "token1". */
 static uint8_t set_player_type(char * token0, char * comparand, char * token1);
 
+/* If "token0" matches "comparand", set world.map.length to int in "token1". */
+static uint8_t set_map_length(char * token0, char * comparand, char * token1);
+
 /* Try to read tokens as members for the definition currently edited, which may
- * be "mod" or "moa" or that of world.map. What member of which of the three is
- * set depends on which of the flags has EDIT_STARTED set and on the key name in
- * "token0". Return 1 if interpretation succeeds, else 0.
+ * be "mod" or "moa". What member of which of the two is set depends on which of
+ * the flags has EDIT_STARTED set and on the key name in "token0". Return 1 if
+ * interpretation succeeds, else 0.
  *
  * Note that MapObjAct entries' .name also determines their .func.
  */
-static uint8_t set_members(char * token0, char * token1, uint8_t * object_flags,
-                           uint8_t * action_flags, uint8_t * map_flags,
+static uint8_t set_members(char * token0, char * token1,
+                           uint8_t * object_flags, uint8_t * action_flags,
                            struct MapObjDef * mod, struct MapObjAct * moa);
 
 /* If "name" fits "moa"->name, set "moa"->func to "func". (Derives MapObjAct
@@ -119,21 +113,19 @@ static void tokens_into_entries(char * token0, char * token1)
 {
     char * str_act = "ACTION";
     char * str_obj = "OBJECT";
-    char * str_map = "MAP_TYPE";
     char * str_player = "PLAYER_TYPE";
+    char * str_map_length = "MAP_LENGTH";
     static struct MapObjAct ** moa_p_p = &world.map_obj_acts;
     static struct MapObjDef ** mod_p_p = &world.map_obj_defs;
     static uint8_t action_flags = READY_ACT;
     static uint8_t object_flags = READY_OBJ;
-    static uint8_t map_flags = READY_MAP;
     static struct EntryHead * moa = NULL;
     static struct EntryHead * mod = NULL;
     if (!token0 || !strcmp(token0, str_act) || !strcmp(token0, str_obj)
-                || !strcmp(token0, str_map) || !strcmp(token0, str_player))
+                || !strcmp(token0, str_player))
     {
         parse_and_reduce_to_readyflag(&action_flags, READY_ACT);
         parse_and_reduce_to_readyflag(&object_flags, READY_OBJ);
-        parse_and_reduce_to_readyflag(&map_flags, READY_MAP);
         write_if_entry(&moa, (struct EntryHead ***) &moa_p_p);
         write_if_entry(&mod, (struct EntryHead ***) &mod_p_p);
     }
@@ -150,10 +142,10 @@ static void tokens_into_entries(char * token0, char * token1)
                                   sizeof(struct MapObjDef),
                                   (struct EntryHead**) &mod,
                                   (struct EntryHead *) world.map_obj_defs)
-                   || start_map(token0, str_map, &map_flags)
                    || set_player_type(token0, str_player, token1)
+                   || set_map_length(token0, str_map_length, token1)
                    || set_members(token0, token1, &object_flags, &action_flags,
-                                  &map_flags, (struct MapObjDef *)mod,
+                                  (struct MapObjDef *)mod,
                                   (struct MapObjAct *) moa)))
         {
             parse_unknown_arg();
@@ -184,18 +176,6 @@ static uint8_t start_entry(char * token0, char * token1, char * comparand,
 
 
 
-static uint8_t start_map(char * token0, char * comparand, uint8_t * map_flags)
-{
-    if (strcmp(token0, comparand))
-    {
-        return 0;
-    }
-    *map_flags = EDIT_STARTED;
-    return 1;
-}
-
-
-
 static void write_if_entry(struct EntryHead ** entry,
                            struct EntryHead *** entry_p_p_p)
 {
@@ -239,37 +219,36 @@ static void test_corpse_ids()
 
 
 
-static uint8_t set_map_members(char * token0, char * token1,uint8_t * map_flags)
+static uint8_t set_player_type(char * token0, char * comparand, char * token1)
 {
-    if      (   parse_val(token0, token1, "HEIGHT", map_flags,
-                          HEIGHT_SET, 'i', (char *) &world.map.size.y)
-             || parse_val(token0, token1, "WIDTH", map_flags,
-                          WIDTH_SET, 'i', (char *) &world.map.size.x))
+    if (strcmp(token0, comparand))
     {
-        int test = atoi(token1) > 256 || atoi(token1) < 1;
-        err_line(test, "Value must be >= 1 and <= 256.");
-        return 1;
+        return 0;
     }
-    return 0;
+    parsetest_int(token1, '8');
+    world.player_type = atoi(token1);
+    return 1;
 }
 
 
 
-static uint8_t set_player_type(char * token0, char * comparand, char * token1)
+static uint8_t set_map_length(char * token0, char * comparand, char * token1)
 {
     if (strcmp(token0, comparand))
     {
         return 0;
     }
-    parsetest_int(token1, '8');
-    world.player_type = atoi(token1);
+    parsetest_int(token1, 'i');
+    int test = atoi(token1) > 256 || atoi(token1) < 1;
+    err_line(test, "Value must be >= 1 and <= 256.");
+    world.map.length = atoi(token1);
     return 1;
 }
 
 
 
 static uint8_t set_members(char * token0, char * token1, uint8_t * object_flags,
-                           uint8_t * action_flags, uint8_t * map_flags,
+                           uint8_t * action_flags,
                            struct MapObjDef * mod, struct MapObjAct * moa)
 {
     if (   *action_flags & EDIT_STARTED
@@ -286,8 +265,7 @@ static uint8_t set_members(char * token0, char * token1, uint8_t * object_flags,
         *action_flags = *action_flags | NAME_SET;
         return 1;
     }
-    else if (   set_map_members(token0, token1, map_flags)
-             || parse_val(token0, token1, "NAME", object_flags,
+    else if (   parse_val(token0, token1, "NAME", object_flags,
                           NAME_SET, 's', (char *) &mod->name)
              || parse_val(token0, token1, "SYMBOL", object_flags,
                           SYMBOL_SET, 'c', (char *) &mod->char_on_map)
@@ -325,7 +303,7 @@ static uint8_t try_func_name(struct MapObjAct * moa, char * name,
 extern void read_config_file()
 {
     parse_file(world.path_config, tokens_into_entries);
-    exit_err(!world.map.size.y, "Map not defined in config file.");
+    exit_err(!world.map.length, "Map size not defined in config file.");
     uint8_t player_type_is_valid = 0;
     struct MapObjDef * mod;
     for (mod = world.map_obj_defs; NULL != mod; mod = mod->next)
index 61ebf88df183ca649b28aef4d5d5eb7da0b09e01..ad58a191c3194664c0eed365dc29e6cca6a52222 100644 (file)
@@ -205,7 +205,7 @@ static uint8_t mv_yx_in_dir_wrap(char d, struct yx_uint8 * yx, uint8_t unwrap)
 extern uint8_t mv_yx_in_dir_legal(char dir, struct yx_uint8 * yx)
 {
     uint8_t wraptest = mv_yx_in_dir_wrap(dir, yx, 0);
-    if (!wraptest && yx->x < world.map.size.x && yx->y < world.map.size.y)
+    if (!wraptest && yx->x < world.map.length && yx->y < world.map.length)
     {
         return 1;
     }
@@ -420,11 +420,11 @@ static char * eye_to_cell(struct yx_uint8 * yx_eye, struct yx_uint8 * yx_cell,
 static uint8_t is_top_left_shaded(uint16_t pos_a, uint16_t pos_b,
                                   int16_t a_y_on_left)
 {
-    uint16_t start_last_row = world.map.size.x * (world.map.size.y - 1);
+    uint16_t start_last_row = world.map.length * (world.map.length - 1);
     uint8_t a_on_left_or_bottom =    0 <= a_y_on_left
                                   || (pos_a >= start_last_row);
-    uint8_t b_on_top_or_right =    pos_b < world.map.size.x
-                                || pos_b % world.map.size.x==world.map.size.x-1;
+    uint8_t b_on_top_or_right =    pos_b < world.map.length
+                                || pos_b % world.map.length==world.map.length-1;
     return pos_a != pos_b && b_on_top_or_right && a_on_left_or_bottom;
 }
 
@@ -433,18 +433,18 @@ static uint8_t is_top_left_shaded(uint16_t pos_a, uint16_t pos_b,
 static void fill_shadow(struct yx_uint8 * yx_eye, struct yx_uint8 * yx_cell,
                         uint8_t * fov_map, uint16_t pos_a, uint16_t pos_b)
 {
-    int16_t a_y_on_left = !(pos_a%world.map.size.x)? pos_a/world.map.size.x :-1;
-    int16_t b_y_on_left = !(pos_b%world.map.size.x)? pos_b/world.map.size.x :-1;
+    int16_t a_y_on_left = !(pos_a%world.map.length)? pos_a/world.map.length :-1;
+    int16_t b_y_on_left = !(pos_b%world.map.length)? pos_b/world.map.length :-1;
     uint8_t top_left_shaded = is_top_left_shaded(pos_a, pos_b, a_y_on_left);
     uint16_t pos;
     uint8_t y, x, in_shade;
-    for (y = 0; y < world.map.size.y; y++)
+    for (y = 0; y < world.map.length; y++)
     {
         in_shade =    (top_left_shaded || (b_y_on_left >= 0 && y > b_y_on_left))
                    && (a_y_on_left < 0 || y < a_y_on_left);
-        for (x = 0; x < world.map.size.x; x++)
+        for (x = 0; x < world.map.length; x++)
         {
-            pos = (y * world.map.size.x) + x;
+            pos = (y * world.map.length) + x;
             if (yx_eye->y == yx_cell->y && yx_eye->x < yx_cell->x)
             {
                 uint8_t val = fov_map[pos] & (SHADOW_LEFT | SHADOW_RIGHT);
@@ -512,7 +512,7 @@ static void shadow(struct yx_uint8 * yx_eye, struct yx_uint8 * yx_start,
     pos_start = yx_to_map_pos(yx_start);
     fov_map[pos_start] = fov_map[pos_start] | SHADOW_LEFT | SHADOW_RIGHT;
     fill_shadow(yx_eye, yx_start, fov_map, pos_a, pos_b);
-    for (i = 0; i < world.map.size.y * world.map.size.x; i++)
+    for (i = 0; i < world.map.length * world.map.length; i++)
     {
         if (fov_map[i] & (SHADOW_LEFT | SHADOW_RIGHT) && i != pos_start)
         {
@@ -560,8 +560,8 @@ static void set_view_of_cell_and_shadows(struct yx_uint8 * yx_cell,
 extern uint8_t * build_fov_map(struct MapObj * eye)
 {
     char * f_name = "build_fov_map()";
-    uint8_t radius = 2 * world.map.size.y;
-    uint32_t map_size = world.map.size.y * world.map.size.x;
+    uint8_t radius = 2 * world.map.length;
+    uint32_t map_size = world.map.length * world.map.length;
     struct yx_uint8 yx = eye->pos;
     uint8_t * fov_map = try_malloc(map_size, f_name);
     memset(fov_map, 0, map_size);
@@ -584,7 +584,7 @@ extern uint8_t * build_fov_map(struct MapObj * eye)
         }
     }
     uint16_t i;
-    for (i = 0; i < world.map.size.y * world.map.size.x; i++)
+    for (i = 0; i < world.map.length * world.map.length; i++)
     {
         if (fov_map[i] & HIDE_LATER)
         {
index 964e06a69f53a6b389f5f038997cc96f6c9f4b6a..488f92bd34ac8a2923b1a500f2c3d8f1c9d94a98 100644 (file)
@@ -144,8 +144,7 @@ static void update_worldstate_file()
     write_inventory(player, file);
     write_value_as_line(player->pos.y, file);
     write_value_as_line(player->pos.x, file);
-    write_value_as_line(world.map.size.y, file);
-    write_value_as_line(world.map.size.x, file);
+    write_value_as_line(world.map.length, file);
     write_map(player, file);
     if (world.log)
     {
@@ -199,7 +198,7 @@ static void write_inventory(struct MapObj * player, FILE * file)
 static char * build_visible_map(struct MapObj * player)
 {
     char * f_name = "build_visible_map()";
-    uint32_t map_size = world.map.size.y * world.map.size.x;
+    uint32_t map_size = world.map.length * world.map.length;
     char * visible_map = try_malloc(map_size, f_name);
     memset(visible_map, ' ', map_size);
     uint16_t pos_i;
@@ -238,11 +237,11 @@ static void write_map(struct MapObj * player, FILE * file)
     char * f_name = "write_map()";
     char * visible_map = build_visible_map(player);
     uint16_t x, y;
-    for (y = 0; y < world.map.size.y; y++)
+    for (y = 0; y < world.map.length; y++)
     {
-        for (x = 0; x < world.map.size.x; x++)
+        for (x = 0; x < world.map.length; x++)
         {
-            try_fputc(visible_map[(y * world.map.size.x) + x], file, f_name);
+            try_fputc(visible_map[(y * world.map.length) + x], file, f_name);
         }
         try_fputc('\n', file, f_name);
     }
index 464f6e2b3ac0060df3ac96952de556ba28228306..1c9a2f1881fdbac990dcd48ffe3bc9232aaa479d 100644 (file)
@@ -50,20 +50,20 @@ static uint8_t is_neighbor(struct yx_uint8 pos, char type)
 {
     uint8_t ind = pos.y % 2;
     uint8_t diag_west = pos.x + ind > 0;
-    uint8_t diag_east = pos.x + ind <= world.map.size.x - 1;
-    uint16_t pos_i = (pos.y * world.map.size.x) + pos.x;
+    uint8_t diag_east = pos.x + ind <= world.map.length - 1;
+    uint16_t pos_i = (pos.y * world.map.length) + pos.x;
     if (   (   pos.y > 0                    && diag_east
-            && type == world.map.cells[pos_i - world.map.size.x + ind])
-        || (   pos.x < world.map.size.x - 1
+            && type == world.map.cells[pos_i - world.map.length + ind])
+        || (   pos.x < world.map.length - 1
             && type == world.map.cells[pos_i + 1])
-        || (   pos.y < world.map.size.y - 1 && diag_east
-            && type == world.map.cells[pos_i + world.map.size.x + ind])
+        || (   pos.y < world.map.length - 1 && diag_east
+            && type == world.map.cells[pos_i + world.map.length + ind])
         || (   pos.y > 0                    && diag_west
-            && type == world.map.cells[pos_i - world.map.size.x - !ind])
+            && type == world.map.cells[pos_i - world.map.length - !ind])
         || (   pos.x > 0
             && type == world.map.cells[pos_i - 1])
-        || (   pos.y < world.map.size.y - 1 && diag_west
-            && type == world.map.cells[pos_i + world.map.size.x - !ind]))
+        || (   pos.y < world.map.length - 1 && diag_west
+            && type == world.map.cells[pos_i + world.map.length - !ind]))
     {
         return 1;
     }
@@ -75,11 +75,11 @@ static uint8_t is_neighbor(struct yx_uint8 pos, char type)
 static void make_sea()
 {
     uint16_t y, x;
-    for (y = 0; y < world.map.size.y; y++)
+    for (y = 0; y < world.map.length; y++)
     {
         for (x = 0;
-             x < world.map.size.x;
-             world.map.cells[(y * world.map.size.x) + x] = '~', x++);
+             x < world.map.length;
+             world.map.cells[(y * world.map.length) + x] = '~', x++);
     }
 }
 
@@ -88,20 +88,20 @@ static void make_sea()
 static void make_island()
 {
     char type = '.';
-    uint8_t add_half_width = !(world.map.size.y % 2) * (world.map.size.x / 2);
-    uint32_t size = world.map.size.x * world.map.size.y;
+    uint8_t add_half_width = !(world.map.length % 2) * (world.map.length / 2);
+    uint32_t size = world.map.length * world.map.length;
     world.map.cells[(size / 2) + add_half_width] = type;
     struct yx_uint8 pos;
     iter_limit(1);
     while (iter_limit(0))
     {
-        pos.y = rrand() % world.map.size.y;
-        pos.x = rrand() % world.map.size.x;
-        uint16_t pos_i = (pos.y * world.map.size.x) + pos.x;
+        pos.y = rrand() % world.map.length;
+        pos.x = rrand() % world.map.length;
+        uint16_t pos_i = (pos.y * world.map.length) + pos.x;
         if ('~' == world.map.cells[pos_i] && is_neighbor(pos, type))
         {
-            if (   pos.y == 0 || pos.y == world.map.size.y - 1
-                || pos.x == 0 || pos.x == world.map.size.x - 1)
+            if (   pos.y == 0 || pos.y == world.map.length - 1
+                || pos.x == 0 || pos.x == world.map.length - 1)
             {
                 break;
             }
@@ -116,15 +116,15 @@ static void make_trees()
 {
     char type = 'X';
     struct yx_uint8 pos;
-    uint16_t n_trees = (world.map.size.x * world.map.size.y) / 16;
+    uint16_t n_trees = (world.map.length * world.map.length) / 16;
     uint16_t i_trees = 0;
     iter_limit(1);
     while (i_trees <= n_trees && iter_limit(0))
     {
         uint8_t single_allowed = rrand() % 32;
-        pos.y = rrand() % world.map.size.y;
-        pos.x = rrand() % world.map.size.x;
-        uint16_t pos_i = (pos.y * world.map.size.x) + pos.x;
+        pos.y = rrand() % world.map.length;
+        pos.x = rrand() % world.map.length;
+        uint16_t pos_i = (pos.y * world.map.length) + pos.x;
         if ('.' == world.map.cells[pos_i]
             && (!single_allowed || is_neighbor(pos, type)))
         {
@@ -139,7 +139,7 @@ static void make_trees()
 extern void init_map()
 {
     char * f_name = "init_map()";
-    world.map.cells = try_malloc(world.map.size.x * world.map.size.y, f_name);
+    world.map.cells = try_malloc(world.map.length * world.map.length, f_name);
     make_sea();
     make_island();
     make_trees();
@@ -150,9 +150,9 @@ extern void init_map()
 extern uint8_t is_passable(struct yx_uint8 pos)
 {
     uint8_t passable = 0;
-    if (pos.x < world.map.size.x && pos.y < world.map.size.y)
+    if (pos.x < world.map.length && pos.y < world.map.length)
     {
-        passable = ('.' == world.map.cells[(pos.y * world.map.size.x) + pos.x]);
+        passable = ('.' == world.map.cells[(pos.y * world.map.length) + pos.x]);
     }
     return passable;
 }
@@ -161,5 +161,5 @@ extern uint8_t is_passable(struct yx_uint8 pos)
 
 extern uint16_t yx_to_map_pos(struct yx_uint8 * yx)
 {
-    return (yx->y * world.map.size.x) + yx->x;
+    return (yx->y * world.map.length) + yx->x;
 }
index 975c7487fe98906bf4d588c7b4350d02d0da6a13..fa20c170455172d6c5bf6be501b9106bff7a1c81 100644 (file)
@@ -59,8 +59,8 @@ static void add_map_object(uint8_t type)
         for (pos.y = pos.x = 0; 0 == is_passable(pos); i++)
         {
             exit_err(UINT16_MAX == i, err);
-            pos.y = rrand() % world.map.size.y;
-            pos.x = rrand() % world.map.size.x;
+            pos.y = rrand() % world.map.length;
+            pos.x = rrand() % world.map.length;
         }
         struct MapObj * mo_ptr;
         uint8_t clear = 1;