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