rnd-20040820-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 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                 fprintf(stderr, "%s: \"%s\": %s: %s\n", progname, filename, "open error", strerror(errno));
42                 result = 1;
43                 goto fail;
44         }
45         actual = fread(buffer, 1, 16384, file);
46         if(actual == -1) {
47                 fprintf(stderr, "%s: \"%s\": %s: %s\n", progname, filename, "read error", strerror(errno));
48                 result = 1;
49                 goto fail;
50         }
51         length = actual;
52         fclose(file);
53         file = 0;
54
55         if(clean_emerald(buffer, &length)) {
56                 fprintf(stderr, "%s: \"%s\": %s\n", progname, filename, "unrecognized format");
57                 result = 1; goto fail;
58         }
59         convert_emerald(buffer);
60
61         result = 0;
62 fail:
63         if(file) fclose(file);
64         return(result);
65 }
66
67 static void clear(void)
68 {
69         lev.home = 1; /* number of players */
70         lev.width = 0;
71         lev.height = 0;
72         lev.time = 0;
73         lev.required = 0;
74         lev.score = 0;
75
76         ply1.num = 0;
77         ply1.alive = (lev.home >= 1);
78         ply1.dynamite = 0;
79         ply1.dynamite_cnt = 0;
80         ply1.keys = 0;
81         ply1.anim = 0;
82         ply1.oldx = ply1.x = 0;
83         ply1.oldy = ply1.y = 0;
84         ply1.joy_n = ply1.joy_e = ply1.joy_s = ply1.joy_w = ply1.joy_fire = ply1.joy_stick = ply1.joy_spin = 0;
85         ply2.num = 1;
86         ply2.alive = (lev.home >= 2);
87         ply2.dynamite = 0;
88         ply2.dynamite_cnt = 0;
89         ply2.keys = 0;
90         ply2.anim = 0;
91         ply2.oldx = ply2.x = 0;
92         ply2.oldy = ply2.y = 0;
93         ply2.joy_n = ply2.joy_e = ply2.joy_s = ply2.joy_w = ply2.joy_fire = ply2.joy_stick = ply2.joy_spin = 0;
94 }
95
96 void read_cave_list(void)
97 {
98         char name[MAXNAME+2];
99         struct cave_node *node, **prev;
100         DIR *dir;
101         struct dirent *entry;
102         char *cut;
103         int len;
104
105         free_cave_list(); /* delete old list if i forgot to before */
106
107         name[MAXNAME] = 0;
108         if(arg_basedir) {
109                 snprintf(name, MAXNAME+2, "%s/%s", arg_basedir, EM_LVL_DIR);
110         } else {
111                 snprintf(name, MAXNAME+2, "%s", EM_LVL_DIR);
112         }
113         if(name[MAXNAME]) snprintf_overflow("read cave/ directory");
114
115         dir = opendir(name);
116         if(dir) {
117                 prev = &cave_list;
118                 while((entry = readdir(dir))) {
119                         if(strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue;
120
121                         node = malloc(sizeof(*node)); if(node == 0) break;
122                         *prev = node; prev = &node->next;
123
124                         node->path[MAXNAME] = 0;
125                         snprintf(node->path, MAXNAME+2, "%s/%s", name, entry->d_name);
126                         if(node->path[MAXNAME]) snprintf_overflow("read cave/ directory");
127
128                         cut = strrchr(node->path, '/'); cut = cut ? cut + 1 : node->path;
129                         len = strlen(cut);
130                         if(len <= 32) {
131                                 strncpy(node->name, cut, 32);
132                         } else {
133                                 snprintf(node->name, 32, "%.8s..%s", cut, cut + len - 16);
134                         }
135                 }
136                 *prev = 0;
137                 closedir(dir);
138         } else {
139                 fprintf(stderr, "%s: \"%s\": %s: %s\n", progname, name, "failed to open directory", strerror(errno));
140         }
141 }
142
143 void free_cave_list(void)
144 {
145         struct cave_node *node, *next;
146
147         for(node = cave_list; node; node = next) {
148                 next = node->next;
149                 free(node);
150         }
151         cave_list = 0;
152 }
153
154 #endif