home · contact · privacy
Individual map objects are now identified by unique numbers stored in the savefiles...
authorChristian Heller <c.heller@plomlompom.de>
Thu, 19 Sep 2013 14:37:59 +0000 (16:37 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 19 Sep 2013 14:37:59 +0000 (16:37 +0200)
src/main.c
src/main.h
src/map_objects.c
src/map_objects.h

index f261e39f94fd008912bee0379e345eebc0bb5921..2c096aef69d6f3450d0b5fa718ee67f661d0cd0d 100644 (file)
@@ -94,6 +94,7 @@ int main(int argc, char *argv[])
     world.item = 0;
     init_map_object_defs(&world, "config/defs");
     set_cleanup_flag(CLEANUP_MAP_OBJECT_DEFS);
+    world.map_object_count = 1;
 
     /* For interactive mode, try to load world state from savefile. */
     char * err_r = "Trouble loading game (in main()) / "
index b3ffc8968f6c3c4fe1e6e3498be4b3007be7055e..83bdb83d2aa12717e3c857bacaca8e4c15b1da6f 100644 (file)
@@ -41,6 +41,7 @@ struct World
     struct WinMeta * wmeta;           /* Pointer to window manager's WinMeta. */
     struct WinConf * winconfs;        /* Pointer to windows' configurations. */
     char * winconf_ids;               /* Pointer to string of Winconfs' ids. */
+    uint8_t map_object_count;         /* Counts loaded/generated map objects. */
 };
 
 
index 8d08ae04db1832e3222799df73278984aff731fb..485ab6da0031a97146e42eba9c8bb1192a0704b5 100644 (file)
@@ -18,7 +18,7 @@
  * in map object chain ("first" pointing to !0), point "start" to it.
  */
 static struct MapObj * get_next_map_obj(struct World * world,
-                                        void * start, char * first,
+                                        void * start, uint8_t * first,
                                         size_t size, struct MapObj * map_obj);
 
 
@@ -34,7 +34,7 @@ static uint8_t read_map_objects_monsterdata( void * start, FILE * file);
 
 
 static struct MapObj * get_next_map_obj(struct World * world,
-                                        void * start, char * first,
+                                        void * start, uint8_t * first,
                                         size_t size, struct MapObj * map_obj)
 {
     char * f_name = "get_next_map_obj()";
@@ -177,6 +177,7 @@ extern uint8_t write_map_objects(struct World * world, void * start,
     for (map_obj = start; map_obj != 0; map_obj = map_obj->next)
     {
         if (   write_uint8(map_obj->type, file)
+            || write_uint8(map_obj->id, file)
             || write_uint16_bigendian(map_obj->pos.y + 1, file)
             || write_uint16_bigendian(map_obj->pos.x + 1, file))
         {
@@ -203,7 +204,7 @@ extern uint8_t read_map_objects(struct World * world, void * start, FILE * file)
     struct MapObjDef * mod;
     size_t size;
     uint8_t type;
-    char first = 1;
+    uint8_t first = 1;
     long pos;
     uint16_t read_uint16 = 0;
     while (1)
@@ -234,7 +235,8 @@ extern uint8_t read_map_objects(struct World * world, void * start, FILE * file)
         map_obj = get_next_map_obj(world, start, &first, size, map_obj);
         exit_err(NULL == map_obj, world, err);
         map_obj->type = type;
-        if (   read_uint16_bigendian(file, &map_obj->pos.y)
+        if (   read_uint8(file, &map_obj->id)
+            || read_uint16_bigendian(file, &map_obj->pos.y)
             || read_uint16_bigendian(file, &map_obj->pos.x))
         {
             return 1;
@@ -264,7 +266,7 @@ extern void * build_map_objects(struct World * world, void * start, char def_id,
     char * err = "Trouble in build_map_objects() with get_next_map_obj().";
     uint8_t i;
     struct MapObj * mo;
-    char first = 1;
+    uint8_t first = 1;
     struct MapObjDef * mod = get_map_obj_def(world, def_id);
     size_t size = 0;
     if ('i' == mod->m_or_i)
@@ -280,6 +282,8 @@ extern void * build_map_objects(struct World * world, void * start, char def_id,
         mo = get_next_map_obj(world, start, &first, size, mo);
         exit_err(NULL == mo, world, err);
         mo->pos = find_passable_pos(world->map);
+        mo->id = world->map_object_count;
+        world->map_object_count++;
         if ('i' == mod->m_or_i)
         {
             build_map_objects_itemdata(mod, mo);
@@ -288,7 +292,6 @@ extern void * build_map_objects(struct World * world, void * start, char def_id,
         {
             build_map_objects_monsterdata(mod, mo);
         }
-
     }
     if (!first)
     {
index bddd5ffc5f96e655180bcb4ad1b0f9e0d8c42a29..2307fb51fe776bb09f52e816b7294be86554dd49 100644 (file)
@@ -30,6 +30,7 @@ struct Player
 struct MapObj
 {
     void * next;
+    uint8_t id;           /* Unique identifier of individual map object. */
     char type;            /* Map object type identifier (see MapObjDef.id). */
     struct yx_uint16 pos; /* Coordinate of object on map. */
 };