1 /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
2 /* house.c */
3 /* some functions to make the house levels */
4
5 #include "glob.h"
6
7
8 /* loads the house level into Level*/
load_house(kind,populate)9 void load_house(kind, populate)
10 int kind;
11 int populate;
12 {
13 int i,j;
14 char site;
15 int stops;
16
17 FILE *fd;
18
19 TempLevel = Level;
20 initrand(Current_Environment, Player.x + Player.y + hour()*10);
21 if (ok_to_free(TempLevel)) {
22 #ifndef SAVE_LEVELS
23 free_level(TempLevel);
24 #endif
25 TempLevel = NULL;
26 }
27 #ifndef SAVE_LEVELS
28 Level = ((plv) checkmalloc(sizeof(levtype)));
29 #else
30 msdos_changelevel(TempLevel,0,-1);
31 Level = &TheLevel;
32 #endif
33 clear_level(Level);
34 strcpy(Str3,Omegalib);
35 switch(kind) {
36 case E_HOUSE:
37 strcat(Str3,"home1.dat");
38 Level->environment = E_HOUSE;
39 site = cryptkey("home1.dat");
40 break;
41 case E_MANSION:
42 strcat(Str3,"home2.dat");
43 Level->environment = E_MANSION;
44 site = cryptkey("home2.dat");
45 break;
46 default:
47 case E_HOVEL:
48 strcat(Str3,"home3.dat");
49 Level->environment = E_HOVEL;
50 site = cryptkey("home3.dat");
51 break;
52 }
53 fd = checkfopen(Str3,"rb");
54 stops = 0;
55 for(j=0;j<LENGTH;j++) {
56 for(i=0;i<WIDTH;i++) {
57 if (kind == E_HOVEL) Level->site[i][j].lstatus = SEEN;
58 else Level->site[i][j].lstatus = 0;
59 Level->site[i][j].roomnumber = RS_CORRIDOR;
60 Level->site[i][j].p_locf = L_NO_OP;
61 site = getc(fd)^site;
62 switch(site) {
63 case 'N':
64 Level->site[i][j].locchar = FLOOR;
65 Level->site[i][j].roomnumber = RS_BEDROOM;
66 if (random_range(2) && populate) make_house_npc(i,j);
67 break;
68 case 'H':
69 Level->site[i][j].locchar = FLOOR;
70 Level->site[i][j].roomnumber = RS_BEDROOM;
71 if (random_range(2) && populate) make_mansion_npc(i,j);
72 break;
73 case 'D':
74 Level->site[i][j].locchar = FLOOR;
75 Level->site[i][j].roomnumber = RS_DININGROOM;
76 break;
77 case '.':
78 Level->site[i][j].locchar = FLOOR;
79 if (stops) {
80 lset(i,j,STOPS);
81 stops = 0;
82 }
83 break;
84 case 'c':
85 Level->site[i][j].locchar = FLOOR;
86 Level->site[i][j].roomnumber = RS_CLOSET;
87 break;
88 case 'G':
89 Level->site[i][j].locchar = FLOOR;
90 Level->site[i][j].roomnumber = RS_BATHROOM;
91 break;
92 case 'B':
93 Level->site[i][j].locchar = FLOOR;
94 Level->site[i][j].roomnumber = RS_BEDROOM;
95 break;
96 case 'K':
97 Level->site[i][j].locchar = FLOOR;
98 Level->site[i][j].roomnumber = RS_KITCHEN;
99 break;
100 case 'S':
101 Level->site[i][j].locchar = FLOOR;
102 Level->site[i][j].showchar = WALL;
103 lset(i,j,SECRET);
104 Level->site[i][j].roomnumber = RS_SECRETPASSAGE;
105 break;
106 case '3':
107 Level->site[i][j].locchar = SAFE;
108 Level->site[i][j].showchar = WALL;
109 lset(i,j,SECRET);
110 Level->site[i][j].p_locf = L_SAFE;
111 break;
112 case '^':
113 Level->site[i][j].locchar = FLOOR;
114 Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
115 break;
116 case 'P':
117 Level->site[i][j].locchar = PORTCULLIS;
118 Level->site[i][j].p_locf = L_PORTCULLIS;
119 break;
120 case 'R':
121 Level->site[i][j].locchar = FLOOR;
122 Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
123 break;
124 case 'p':
125 Level->site[i][j].locchar = FLOOR;
126 Level->site[i][j].p_locf = L_PORTCULLIS;
127 break;
128 case 'T':
129 Level->site[i][j].locchar = FLOOR;
130 Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
131 break;
132 case 'X':
133 Level->site[i][j].locchar = FLOOR;
134 Level->site[i][j].p_locf = L_HOUSE_EXIT;
135 stops = 1;
136 break;
137 case '#':
138 Level->site[i][j].locchar = WALL;
139 switch (kind) {
140 case E_HOVEL: Level->site[i][j].aux = 10; break;
141 case E_HOUSE: Level->site[i][j].aux = 50; break;
142 case E_MANSION: Level->site[i][j].aux = 150; break;
143 }
144 break;
145 case '|':
146 Level->site[i][j].locchar = OPEN_DOOR;
147 Level->site[i][j].roomnumber = RS_CORRIDOR;
148 lset(i,j,STOPS);
149 break;
150 case '+':
151 Level->site[i][j].locchar = CLOSED_DOOR;
152 Level->site[i][j].roomnumber = RS_CORRIDOR;
153 Level->site[i][j].aux = LOCKED;
154 lset(i,j,STOPS);
155 break;
156 case 'd':
157 Level->site[i][j].locchar = FLOOR;
158 Level->site[i][j].roomnumber = RS_CORRIDOR;
159 if (populate)
160 make_site_monster(i,j,DOBERMAN);
161 break;
162 case 'a':
163 Level->site[i][j].locchar = FLOOR;
164 Level->site[i][j].roomnumber = RS_CORRIDOR;
165 Level->site[i][j].p_locf = L_TRAP_SIREN;
166 break;
167 case 'A':
168 Level->site[i][j].locchar = FLOOR;
169 Level->site[i][j].roomnumber = RS_CORRIDOR;
170 if (populate)
171 make_site_monster(i,j,AUTO_MINOR); /* automaton */
172 break;
173 }
174 Level->site[i][j].showchar = ' ';
175 }
176 site = getc(fd)^site;
177 }
178 fclose(fd);
179 initrand(E_RESTORE, 0);
180 }
181
182
183
184 /* makes a log npc for houses and hovels */
make_house_npc(i,j)185 void make_house_npc(i,j)
186 int i,j;
187 {
188 pml ml = ((pml) checkmalloc(sizeof(mltype)));
189 pob ob;
190 ml->m = ((pmt) checkmalloc(sizeof(montype)));
191 *(ml->m) = Monsters[NPC];
192 make_log_npc(ml->m);
193 if (ml->m->id == NPC) mprint("You detect signs of life in this house.");
194 else mprint("An eerie shiver runs down your spine as you enter....");
195 /* if not == NPC, then we got a ghost off the npc list */
196 ml->m->x = i;
197 ml->m->y = j;
198 Level->site[i][j].creature = ml->m;
199 ml->m->click = (Tick + 1) % 50;
200 ml->next = Level->mlist;
201 Level->mlist = ml;
202 m_status_set(ml->m,HOSTILE);
203 if (nighttime())
204 m_status_reset(ml->m,AWAKE);
205 else m_status_set(ml->m,AWAKE);
206 if (ml->m->startthing > -1) {
207 ob = ((pob) checkmalloc(sizeof(objtype)));
208 *ob = Objects[ml->m->startthing];
209 m_pickup(ml->m,ob);
210 }
211 }
212
213
214
215
216
217 /* makes a hiscore npc for mansions */
make_mansion_npc(i,j)218 void make_mansion_npc(i,j)
219 int i,j;
220 {
221 pml ml = ((pml) checkmalloc(sizeof(mltype)));
222 ml->m = ((pmt) checkmalloc(sizeof(montype)));
223 *(ml->m) = Monsters[NPC];
224 make_hiscore_npc(ml->m,random_range(14) + 1);
225 mprint("You detect signs of life in this house.");
226 ml->m->x = i;
227 ml->m->y = j;
228 Level->site[i][j].creature = ml->m;
229 ml->m->click = (Tick + 1) % 50;
230 ml->next = Level->mlist;
231 Level->mlist = ml;
232 m_status_set(ml->m,HOSTILE);
233 if (nighttime())
234 m_status_reset(ml->m,AWAKE);
235 else m_status_set(ml->m,AWAKE);
236 }
237
238
239