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