1 /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
2 /* abyss.c */
3 /* some functions to make the abyss level and run the final challenge */
4
5 #ifdef MSDOS_SUPPORTED_ANTIQUE
6 #include <sys/types.h>
7 #include <malloc.h>
8 #ifdef SAVE_LEVELS
9 #include <sys/timeb.h>
10 #include <dos.h>
11 #endif
12 #endif
13
14 #include "glob.h"
15
16 /* loads the abyss level into Level*/
load_abyss()17 void load_abyss()
18 {
19 int i,j;
20 char site;
21
22 FILE *fd;
23
24 TempLevel = Level;
25 if (ok_to_free(TempLevel)) {
26 #ifndef SAVE_LEVELS
27 free_level(TempLevel);
28 #endif
29 TempLevel = NULL;
30 }
31 #ifndef SAVE_LEVELS
32 Level = ((plv) checkmalloc(sizeof(levtype)));
33 #else
34 msdos_changelevel(TempLevel,0,-1);
35 Level = &TheLevel;
36 #endif
37
38 clear_level(Level);
39
40 strcpy(Str3,Omegalib);
41 strcat(Str3,"abyss.dat");
42 fd = checkfopen(Str3,"rb");
43 site = cryptkey("abyss.dat");
44 for(j=0;j<LENGTH;j++) {
45 for(i=0;i<WIDTH;i++) {
46 site = getc(fd)^site;
47 Level->site[i][j].roomnumber = RS_ADEPT;
48 switch(site) {
49 case '0':
50 Level->site[i][j].locchar = VOID_CHAR;
51 Level->site[i][j].p_locf = L_VOID;
52 break;
53 case 'V':
54 Level->site[i][j].locchar = VOID_CHAR;
55 Level->site[i][j].p_locf = L_VOID_STATION;
56 break;
57 case '1':
58 Level->site[i][j].locchar = FLOOR;
59 Level->site[i][j].p_locf = L_VOICE1;
60 break;
61 case '2':
62 Level->site[i][j].locchar = FLOOR;
63 Level->site[i][j].p_locf = L_VOICE2;
64 break;
65 case '3':
66 Level->site[i][j].locchar = FLOOR;
67 Level->site[i][j].p_locf = L_VOICE3;
68 break;
69 case '~':
70 Level->site[i][j].locchar = WATER;
71 Level->site[i][j].p_locf = L_WATER_STATION;
72 break;
73 case ';':
74 Level->site[i][j].locchar = FIRE;
75 Level->site[i][j].p_locf = L_FIRE_STATION;
76 break;
77 case '"':
78 Level->site[i][j].locchar = HEDGE;
79 Level->site[i][j].p_locf = L_EARTH_STATION;
80 break;
81 case '6':
82 Level->site[i][j].locchar = WHIRLWIND;
83 Level->site[i][j].p_locf = L_AIR_STATION;
84 break;
85 case '#':
86 Level->site[i][j].locchar = WALL;
87 break;
88 case '.':
89 Level->site[i][j].locchar = FLOOR;
90 break;
91 }
92 }
93 site = getc(fd)^site;
94 }
95 fclose(fd);
96 }
97
98
99 #ifdef SAVE_LEVELS
100 /* This stuff is in this file because the file was really small. */
101
msdos_init()102 void msdos_init()
103 {
104 int i;
105
106 /* Allocate the inner level of pointers for TheLevel */
107 for (i = 0; i < MAXWIDTH; i++)
108 TheLevel.site[i] = (plc)checkmalloc(MAXLENGTH * sizeof(loctype));
109
110 /* Remove old level files */
111 kill_all_levels();
112 }
113
kill_all_levels()114 void kill_all_levels()
115 {
116 kill_levels("om*.lev");
117 }
118
kill_levels(str)119 void kill_levels(str)
120 char *str;
121 {
122 int i;
123 struct find_t buf;
124
125 /* Remove old level files laying around */
126 sprintf(Str1,"%s%s",Omegalib,str);
127 for (i = _dos_findfirst(Str1,_A_NORMAL,&buf); !i; i = _dos_findnext(&buf))
128 {
129 sprintf(Str2,"%s%s",Omegalib,buf.name);
130 remove(Str2);
131 }
132 }
133
134 #define MEM_CHECK_AMOUNT 0xf000
check_memory()135 void check_memory()
136 {
137 char *mems[50];
138 long amount = 0;
139 int num_mems = 0;
140 unsigned try;
141
142 sprintf(Str1,"Heapchk returned %d.",_heapchk());
143 mprint(Str1);
144
145 try = MEM_CHECK_AMOUNT;
146 while (try > 10000)
147 {
148 while (try > 0 && (mems[num_mems] = checkmalloc(try)) == NULL)
149 try -= 0x400;
150 amount += try;
151 num_mems++;
152 }
153 while (--num_mems >= 0)
154 if (mems[num_mems] != NULL)
155 free(mems[num_mems]);
156
157 sprintf(Str1,"Free mem approx %dK",(int)(amount / 0x400));
158 mprint(Str1);
159 }
160
open_levfile(env,depth,rw)161 static FILE *open_levfile(env,depth,rw)
162 int env,depth,rw;
163 {
164 sprintf(Str1,"%som%03d%03d.lev",Omegalib,env,depth);
165 return(fopen(Str1,(rw) ? "wb" : "rb"));
166 }
167
168 /* Saves oldlevel (unless NULL), and reads in the new level,
169 unless depth is < 0. */
msdos_changelevel(oldlevel,newenv,newdepth)170 plv msdos_changelevel(oldlevel,newenv,newdepth)
171 plv oldlevel;
172 int newenv,newdepth;
173 {
174 FILE *fp;
175
176 if (oldlevel != NULL)
177 {
178 if (oldlevel->environment == newenv &&
179 oldlevel->depth == newdepth)
180 return(oldlevel);
181 if ((fp = open_levfile(oldlevel->environment,oldlevel->depth,1)) != NULL)
182 {
183 save_level(fp,oldlevel);
184 fclose(fp);
185 }
186 else
187 mprint("Cannot save level!!!");
188 /* Free up monsters and items */
189 free_level(oldlevel);
190 }
191 if (newdepth >= 0)
192 {
193 if ((fp = open_levfile(newenv,newdepth,0)) == NULL)
194 return(NULL);
195 restore_level(fp);
196 fclose(fp);
197 return(Level);
198 }
199 return(NULL);
200 }
201
202 #endif
203
204 #ifdef DJGPP
205
check_memory()206 void check_memory()
207 {
208 clear_screen();
209 print1("There should be over 300 K free on the drive.");
210 print2("Save _before_ the free space gets below 300 K.");
211 morewait();
212 system("dir");
213 morewait();
214 clear_screen();
215 xredraw();
216 }
217 #endif
218