rnd-20040822-2-src
[rocksndiamonds.git] / src / game_em / cave.c
1 /* 2000-08-10T16:43:50Z
2  *
3  * cave data structures
4  */
5
6 #include <sys/types.h>
7 #include <dirent.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include <errno.h>
12
13 #include "global.h"
14 #include "tile.h"
15 #include "level.h"
16 #include "file.h"
17
18
19 #if defined(TARGET_X11)
20
21 struct cave_node *cave_list;
22
23 static void clear(void);
24
25 /* attempt load a cave
26  * 
27  * completely initializes the level structure, ready for a game
28  */
29 int cave_convert(char *filename)
30 {
31   int result;
32   FILE *file;
33   int actual;
34   unsigned long length;
35   unsigned char buffer[16384];
36
37   clear();
38
39   file = fopen(filename, "rb");
40   if (file == 0)
41   {
42     fprintf(stderr, "%s: \"%s\": %s: %s\n", progname, filename, "open error",
43             strerror(errno));
44     result = 1;
45     goto fail;
46   }
47
48   actual = fread(buffer, 1, 16384, file);
49   if (actual == -1)
50   {
51     fprintf(stderr, "%s: \"%s\": %s: %s\n", progname, filename, "read error",
52             strerror(errno));
53     result = 1;
54     goto fail;
55   }
56
57   length = actual;
58   fclose(file);
59   file = 0;
60
61   if (clean_emerald(buffer, &length))
62   {
63     fprintf(stderr, "%s: \"%s\": %s\n", progname, filename,
64             "unrecognized format");
65     result = 1;
66     goto fail;
67   }
68
69   convert_emerald(buffer);
70
71   result = 0;
72
73  fail:
74
75   if (file)
76     fclose(file);
77
78   return(result);
79 }
80
81 static void clear(void)
82 {
83   lev.home = 1; /* number of players */
84   lev.width = 0;
85   lev.height = 0;
86   lev.time = 0;
87   lev.required = 0;
88   lev.score = 0;
89
90   ply1.num = 0;
91   ply1.alive = (lev.home >= 1);
92   ply1.dynamite = 0;
93   ply1.dynamite_cnt = 0;
94   ply1.keys = 0;
95   ply1.anim = 0;
96   ply1.oldx = ply1.x = 0;
97   ply1.oldy = ply1.y = 0;
98   ply1.joy_n = ply1.joy_e = ply1.joy_s = ply1.joy_w = ply1.joy_fire = 0;
99   ply1.joy_stick = ply1.joy_spin = 0;
100   ply2.num = 1;
101   ply2.alive = (lev.home >= 2);
102   ply2.dynamite = 0;
103   ply2.dynamite_cnt = 0;
104   ply2.keys = 0;
105   ply2.anim = 0;
106   ply2.oldx = ply2.x = 0;
107   ply2.oldy = ply2.y = 0;
108   ply2.joy_n = ply2.joy_e = ply2.joy_s = ply2.joy_w = ply2.joy_fire = 0;
109   ply2.joy_stick = ply2.joy_spin = 0;
110 }
111
112 void read_cave_list(void)
113 {
114   char name[MAXNAME+2];
115   struct cave_node *node, **prev;
116   DIR *dir;
117   struct dirent *entry;
118   char *cut;
119   int len;
120
121   free_cave_list(); /* delete old list if i forgot to before */
122
123   name[MAXNAME] = 0;
124   if (arg_basedir)
125   {
126     snprintf(name, MAXNAME+2, "%s/%s", arg_basedir, EM_LVL_DIR);
127   }
128   else
129   {
130     snprintf(name, MAXNAME+2, "%s", EM_LVL_DIR);
131   }
132
133   if (name[MAXNAME])
134     snprintf_overflow("read cave/ directory");
135
136   dir = opendir(name);
137   if (dir)
138   {
139     prev = &cave_list;
140     while ((entry = readdir(dir)))
141     {
142       if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
143         continue;
144
145       node = malloc(sizeof(*node)); if (node == 0) break;
146       *prev = node; prev = &node->next;
147
148       node->path[MAXNAME] = 0;
149       snprintf(node->path, MAXNAME+2, "%s/%s", name, entry->d_name);
150       if (node->path[MAXNAME])
151         snprintf_overflow("read cave/ directory");
152
153       cut = strrchr(node->path, '/'); cut = cut ? cut + 1 : node->path;
154       len = strlen(cut);
155       if (len <= 32)
156       {
157         strncpy(node->name, cut, 32);
158       }
159       else
160       {
161         snprintf(node->name, 32, "%.8s..%s", cut, cut + len - 16);
162       }
163     }
164
165     *prev = 0;
166     closedir(dir);
167   }
168   else
169   {
170     fprintf(stderr, "%s: \"%s\": %s: %s\n", progname, name,
171             "failed to open directory", strerror(errno));
172   }
173 }
174
175 void free_cave_list(void)
176 {
177   struct cave_node *node, *next;
178
179   for (node = cave_list; node; node = next)
180   {
181     next = node->next;
182     free(node);
183   }
184   cave_list = 0;
185 }
186
187 #endif