home · contact · privacy
Fixed README typo.
[plomrogue] / src / misc.c
index 50fee6407854469819a691ccb8826943f55fd08a..522af09b9a8ea807c1ac4595cd4f1751a4666a90 100644 (file)
@@ -9,14 +9,19 @@
 #include "readwrite.h" /* for [read/write]_uint[8/16/32][_bigendian](),
                         * try_fopen(), try_fclose()
                         */
-#include "map_objects.h" /* for struct Monster, write_map_objects(), */
-#include "map_object_actions.h" /* for is_passable(), move_monster() */
+#include "map_objects.h" /* for struct MapObj, read_map_objects(),
+                          * write_map_objects()
+                          */
+#include "map_object_actions.h" /* for is_passable(), move_actor() */
 #include "map.h" /* for Map struct */
 #include "main.h" /* for World struct */
 #include "yx_uint16.h" /* for yx_uint16 struct */
 #include "rrand.h" /* for rrand(), rrand_seed() */
 #include "rexit.h" /* for exit_err() */
-
+#include "wincontrol.h" /* for init_winconfs(), init_wins(), free_winconfs(),
+                         * sorted_wintoggle_and_activate()
+                         */
+#include "windows.h" /* for suspend_win() */
 
 
 extern char * trouble_msg(struct World * w, char * parent, char * child)
@@ -95,6 +100,42 @@ extern void check_tempfile(char * path, struct World * w)
 
 
 
+extern void save_interface_conf(struct World * world)
+{
+    save_keybindings(world, "config/keybindings_global", &world->kb_global);
+    save_keybindings(world, "config/keybindings_wingeom", &world->kb_wingeom);
+    save_keybindings(world, "config/keybindings_winkeys", &world->kb_winkeys);
+    save_win_configs(world);
+}
+
+
+
+extern void load_interface_conf(struct World * world)
+{
+    init_keybindings(world, "config/keybindings_global",  &world->kb_global);
+    init_keybindings(world, "config/keybindings_wingeom", &world->kb_wingeom);
+    init_keybindings(world, "config/keybindings_winkeys", &world->kb_winkeys);
+    init_winconfs(world);
+    init_wins(world);
+    sorted_wintoggle_and_activate(world);
+}
+
+
+
+extern void unload_interface_conf(struct World * world)
+{
+    free_keybindings(world->kb_global.kbs);
+    free_keybindings(world->kb_wingeom.kbs);
+    free_keybindings(world->kb_winkeys.kbs);
+    while (0 != world->wmeta->active)
+    {
+        suspend_win(world->wmeta, world->wmeta->active);
+    }
+    free_winconfs(world);
+}
+
+
+
 extern void update_log(struct World * world, char * text)
 {
     char * f_name = "update_log()";
@@ -176,12 +217,15 @@ extern void turn_over(struct World * world, char action)
     }
     world->turn++;
     rrand_seed(world->seed * world->turn);
-    struct Monster * monster;
-    for (monster = world->monster;
+    struct MapObj * monster;
+    for (monster = world->map_objs;
          monster != 0;
-         monster = monster->map_obj.next)
+         monster = monster->next)
     {
-        move_monster(world, monster);
+        if (0 < monster->lifepoints && 0 != monster->id)
+        {
+            move_actor(world, monster, rrand() % 5);
+        }
     }
 }
 
@@ -190,28 +234,44 @@ extern void turn_over(struct World * world, char action)
 extern void save_game(struct World * world)
 {
     char * f_name = "save_game()";
-    char * err_write = "Trouble in save_game() "
-                       "writing to opened file 'savefile_tmp'.";
 
     char * savefile_tmp = "savefile_tmp";
     char * savefile     = "savefile";
     FILE * file = try_fopen(savefile_tmp, "w", world, f_name);
-    if (   write_uint32_bigendian(world->seed, file)
-        || write_uint32_bigendian(world->turn, file)
-        || write_uint16_bigendian(world->score, file)
-        || write_uint16_bigendian(world->player->pos.y + 1, file)
-        || write_uint16_bigendian(world->player->pos.x + 1, file)
-        || write_uint8(world->player->hitpoints, file)
-        || write_map_objects(world, world->monster, file)
-        || write_map_objects(world, world->item, file))
-    {
-        exit_err(1, world, err_write);
-    }
+
+    char line[12];
+    sprintf(line, "%d\n", world->seed);
+    try_fwrite(line, strlen(line), 1, file, world, f_name);
+    sprintf(line, "%d\n", world->turn);
+    try_fwrite(line, strlen(line), 1, file, world, f_name);
+    sprintf(line, "%d\n", world->score);
+    try_fwrite(line, strlen(line), 1, file, world, f_name);
+    write_map_objects(world, file);
+
     try_fclose_unlink_rename(file, savefile_tmp, savefile, world, f_name);
 }
 
 
 
+extern void load_game(struct World * world)
+{
+    char * f_name = "load_game2()";
+    char * filename = "savefile";
+    FILE * file = try_fopen(filename, "r", world, f_name);
+    uint16_t linemax = get_linemax(file, world, f_name);
+    char line[linemax + 1];
+    try_fgets(line, linemax + 1, file, world, f_name);
+    world->seed = atoi(line);
+    try_fgets(line, linemax + 1, file, world, f_name);
+    world->turn = atoi(line);
+    try_fgets(line, linemax + 1, file, world, f_name);
+    world->score = atoi(line);
+    read_map_objects(world, file, line, linemax);
+    try_fclose(file, world, f_name);
+}
+
+
+
 extern struct yx_uint16 find_passable_pos(struct Map * map)
 {
     struct yx_uint16 pos;