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