home · contact · privacy
Eliminated some potential problems for alternative game map sizes.
[plomrogue] / src / server / map_object_actions.c
index 561a2e2bf39a5899c6d1e2e54ac4dd6486ac1160..a30809b33336dbea3695bd3d471f796cb111df7f 100644 (file)
@@ -9,19 +9,19 @@
 #include "../common/err_try_fgets.h" /* err_try_fgets(), err_line(),
                                       * reset_err_try_fgets_counter()
                                       */
-#include "../common/readwrite.h" /* textfile_sizes(), try_fopen(), try_fclose(),
+#include "../common/readwrite.h" /* textfile_width(), try_fopen(), try_fclose(),
                                   * try_fgetc()
                                   */
 #include "../common/rexit.h" /* exit_err(), exit_trouble() */
 #include "../common/try_malloc.h" /* try_malloc() */
-#include "../common/yx_uint16.h" /* yx_uint16 struct */
+#include "../common/yx_uint8.h" /* struct yx_uint8 */
 #include "cleanup.h" /* set_cleanup_flag() */
 #include "map_objects.h" /* structs MapObj, MapObjDef, get_player(),
                           * set_object_position(), own_map_object(),
                           * get_map_object_def()
                           */
 #include "map.h" /* is_passable() */
-#include "yx_uint16.h" /* mv_yx_in_dir(), yx_uint16_cmp() */
+#include "yx_uint8.h" /* mv_yx_in_dir(), yx_uint8_cmp() */
 #include "world.h" /* global world */
 
 
@@ -40,8 +40,10 @@ static void actor_hits_actor(struct MapObj * hitter, struct MapObj * hitted);
 
 /* Bonus stuff to actor_*() to happen if actor==player. Mostly writing of log
  * messages; _pick and _drop also decrement world.inventory_sel by 1 if >0.
+ * (match_dir() is just a little helper to playerbonus_move().)
  */
 static void playerbonus_wait();
+static uint8_t match_dir(char d, char ** dsc_d, char match, char * dsc_match);
 static void playerbonus_move(char d, uint8_t passable);
 static void playerbonus_drop(uint8_t owns_none);
 static void playerbonus_pick(uint8_t picked);
@@ -151,21 +153,28 @@ static void playerbonus_wait()
 
 
 
-static void playerbonus_move(char d, uint8_t passable)
+static uint8_t match_dir(char d, char ** dsc_d, char match, char * dsc_match)
 {
-    char * dsc_dir = "north";
-    if      ('E' == d)
-    {
-        dsc_dir = "east" ;
-    }
-    else if ('S' == d)
+    if (d == match)
     {
-        dsc_dir = "south";
-    }
-    else if ('W' == d)
-    {
-        dsc_dir = "west" ;
+        * dsc_d = dsc_match;
+        return 1;
     }
+    return 0;
+}
+
+
+
+static void playerbonus_move(char d, uint8_t passable)
+{
+    char * dsc_dir = "north";
+    if (   match_dir(d, &dsc_dir, '6', "east")
+        || match_dir(d, &dsc_dir, '2', "south")
+        || match_dir(d, &dsc_dir, '4', "west")
+        || match_dir(d, &dsc_dir, '7', "north-west")
+        || match_dir(d, &dsc_dir, '9', "north-east")
+        || match_dir(d, &dsc_dir, '1', "south-west")
+        || match_dir(d, &dsc_dir, '3', "south-east"));
     char * dsc_move = "You move ";
     if (0 == passable)
     {
@@ -223,7 +232,7 @@ extern void init_map_object_actions()
 {
     char * f_name = "init_map_object_actions()";
     FILE * file = try_fopen(world.path_map_obj_acts, "r", f_name);
-    uint16_t linemax = textfile_sizes(file, NULL);
+    uint32_t linemax = textfile_width(file);
     char line[linemax + 1];
     struct MapObjAct ** moa_ptr_ptr = &world.map_obj_acts;
     char * context = "Failed reading map object actions config file. ";
@@ -316,7 +325,7 @@ extern void actor_wait(struct MapObj * mo)
 extern void actor_move(struct MapObj * mo)
 {
     char d = mo->arg;
-    struct yx_uint16 target = mv_yx_in_dir(d, mo->pos);
+    struct yx_uint8 target = mv_yx_in_dir(d, mo->pos);
     struct MapObj * other_mo;
     for (other_mo = world.map_objs; other_mo != 0; other_mo = other_mo->next)
     {
@@ -324,7 +333,7 @@ extern void actor_move(struct MapObj * mo)
         {
             continue;
         }
-        if (yx_uint16_cmp(&target, &other_mo->pos))
+        if (yx_uint8_cmp(&target, &other_mo->pos))
         {
             actor_hits_actor(mo, other_mo);
             return;
@@ -364,12 +373,13 @@ extern void actor_drop(struct MapObj * mo)
 
 extern void actor_pick(struct MapObj * mo)
 {
-    struct MapObj * picked;
-    for (picked = world.map_objs; NULL != picked; picked = picked->next)
+    struct MapObj * picked = NULL;
+    struct MapObj * mo_i;
+    for (mo_i = world.map_objs; NULL != mo_i; mo_i = mo_i->next)
     {
-        if (picked != mo && yx_uint16_cmp(&picked->pos, &mo->pos))
+        if (mo_i != mo && yx_uint8_cmp(&mo_i->pos, &mo->pos))
         {
-            break;
+            picked = mo_i;
         }
     }
     if (NULL != picked)