0e7caea5013f510cf8d0e9f314b20c0a6d910bea
[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 setLevelInfoToDefaults_EM(void)
24 {
25   lev.width = 64;
26   lev.height = 32;
27
28   ply1.x_initial = 0;
29   ply1.y_initial = 0;
30
31   ply2.x_initial = 0;
32   ply2.y_initial = 0;
33 }
34
35
36 /* attempt load a cave
37  * 
38  * completely initializes the level structure, ready for a game
39  */
40 int OLD_cave_convert(char *filename)
41 {
42   int result;
43   FILE *file;
44   int actual;
45   int length;
46   unsigned char buffer[16384];
47
48   /* always start with reliable default values */
49   setLevelInfoToDefaults_EM();
50
51   file = fopen(filename, "rb");
52   if (file == 0)
53   {
54     fprintf(stderr, "%s: \"%s\": %s: %s\n", progname, filename, "open error",
55             strerror(errno));
56     result = 1;
57     goto fail;
58   }
59
60   actual = fread(buffer, 1, 16384, file);
61   if (actual == -1)
62   {
63     fprintf(stderr, "%s: \"%s\": %s: %s\n", progname, filename, "read error",
64             strerror(errno));
65     result = 1;
66     goto fail;
67   }
68
69   length = actual;
70   fclose(file);
71   file = 0;
72
73   if (!cleanup_em_level(buffer, &length))
74   {
75     fprintf(stderr, "%s: \"%s\": %s\n", progname, filename,
76             "unrecognized format");
77     result = 1;
78     goto fail;
79   }
80
81   convert_em_level(buffer);
82   prepare_em_level();
83
84   result = 0;
85
86  fail:
87
88   if (file)
89     fclose(file);
90
91   return(result);
92 }
93
94 #define MAX_EM_LEVEL_SIZE               16384
95
96 boolean LoadNativeLevel_EM(char *filename)
97 {
98   unsigned char raw_leveldata[MAX_EM_LEVEL_SIZE];
99   int raw_leveldata_length;
100   FILE *file;
101
102   /* always start with reliable default values */
103   setLevelInfoToDefaults_EM();
104
105   if (!(file = fopen(filename, MODE_READ)))
106   {
107     Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename);
108
109     return FALSE;
110   }
111
112   raw_leveldata_length = fread(raw_leveldata, 1, MAX_EM_LEVEL_SIZE, file);
113
114   fclose(file);
115
116   if (raw_leveldata_length <= 0)
117   {
118     Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
119
120     return FALSE;
121   }
122
123   if (!cleanup_em_level(raw_leveldata, &raw_leveldata_length))
124   {
125     Error(ERR_WARN, "unknown EM level '%s' -- using empty level", filename);
126
127     return FALSE;
128   }
129
130   convert_em_level(raw_leveldata);
131   prepare_em_level();
132
133   return TRUE;
134 }
135
136 void read_cave_list(void)
137 {
138   char name[MAXNAME+2];
139   struct cave_node *node, **prev;
140   DIR *dir;
141   struct dirent *entry;
142   char *cut;
143   int len;
144
145   free_cave_list(); /* delete old list if i forgot to before */
146
147   name[MAXNAME] = 0;
148   if (arg_basedir)
149   {
150     snprintf(name, MAXNAME+2, "%s/%s", arg_basedir, EM_LVL_DIR);
151   }
152   else
153   {
154     snprintf(name, MAXNAME+2, "%s", EM_LVL_DIR);
155   }
156
157   if (name[MAXNAME])
158     snprintf_overflow("read cave/ directory");
159
160   dir = opendir(name);
161   if (dir)
162   {
163     prev = &cave_list;
164     while ((entry = readdir(dir)))
165     {
166       if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
167         continue;
168
169       node = malloc(sizeof(*node)); if (node == 0) break;
170       *prev = node; prev = &node->next;
171
172       node->path[MAXNAME] = 0;
173       snprintf(node->path, MAXNAME+2, "%s/%s", name, entry->d_name);
174       if (node->path[MAXNAME])
175         snprintf_overflow("read cave/ directory");
176
177       cut = strrchr(node->path, '/'); cut = cut ? cut + 1 : node->path;
178       len = strlen(cut);
179       if (len <= 32)
180       {
181         strncpy(node->name, cut, 32);
182       }
183       else
184       {
185         snprintf(node->name, 32, "%.8s..%s", cut, cut + len - 16);
186       }
187     }
188
189     *prev = 0;
190     closedir(dir);
191   }
192   else
193   {
194     fprintf(stderr, "%s: \"%s\": %s: %s\n", progname, name,
195             "failed to open directory", strerror(errno));
196   }
197 }
198
199 void free_cave_list(void)
200 {
201   struct cave_node *node, *next;
202
203   for (node = cave_list; node; node = next)
204   {
205     next = node->next;
206     free(node);
207   }
208   cave_list = 0;
209 }
210
211 #endif