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