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