1 /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
2 /* trap.c */
3 /* trap movement functions */
4 
5 #include "glob.h"
6 
7 
8 /* various traps */
9 
10 /* note special function on different levels */
l_trap_siren()11 void l_trap_siren()
12 {
13   pml ml;
14   Level->site[Player.x][Player.y].locchar = TRAP;
15   lset(Player.x, Player.y, CHANGED);
16   print1("A klaxon goes off!");
17   print2("'Intruder Alert -- Intruder Alert -- Intruder Alert'");
18   print3("You have the feeling you have been discovered....");
19   morewait();
20   clearmsg();
21   if ((Current_Environment == E_HOUSE) ||
22       (Current_Environment == E_MANSION)) {
23     if (! gamestatusp(DESTROYED_ORDER)) {
24       print1("The city guard arrives!");
25       print2("You are apprehended....");
26       morewait();
27       send_to_jail();
28     }
29     else print1("Nobody answers the alarm.");
30   }
31   else if (Current_Environment == E_HOVEL)
32     print1("Nobody answers the alarm.");
33   else {
34     if (Current_Environment == E_CIRCLE) {
35       summon(-1,DEMON_PRINCE); /* prime circle demon */
36       summon(-1,DEMON_PRINCE);
37       summon(-1,DEMON_PRINCE);
38     }
39     for(ml=Level->mlist;ml!=NULL;ml=ml->next) {
40       m_status_set(ml->m,AWAKE);
41       ml->m->sense *= 2;
42       if ((Current_Environment == E_CIRCLE) ||
43 	  ((Current_Environment == E_VILLAGE) && (ml->m->id == GUARD)) ||
44 	  ((Current_Environment == E_CITY) && (ml->m->id == GUARD)))
45 	m_status_set(ml->m,HOSTILE);
46     }
47   }
48 }
49 
l_trap_dart()50 void l_trap_dart()
51 {
52   Level->site[Player.x][Player.y].locchar = TRAP;
53   lset(Player.x, Player.y, CHANGED);
54   if (gamestatusp(MOUNTED)) {
55     mprint("A dart annoys your horse....");
56   }
57   else if (random_range(100) < Player.absorption)
58     mprint("A dart plinks off your armor");
59   else {
60     mprint("You were hit by a dart!");
61     p_damage(difficulty(),NORMAL_DAMAGE,"a dart trap");
62     if (random_range(3)==1) {
63       mprint("It was poisoned!");
64       morewait();
65       p_poison(difficulty());
66     }
67   }
68 }
69 
l_trap_pit()70 void l_trap_pit()
71 {
72   Level->site[Player.x][Player.y].locchar = TRAP;
73   lset(Player.x, Player.y, CHANGED);
74   if (gamestatusp(MOUNTED)) {
75     mprint("Your horse stumbles into a pit and breaks a leg!");
76     morewait();
77     mprint("You are forced to put it out of its misery.");
78     morewait();
79     resetgamestatus(MOUNTED);
80     showflags();
81   }
82   else if (Player.itemweight < ((int) (Player.maxweight / 2)))
83     mprint("You nimbly dodge a pit trap.");
84   else {
85     mprint("You fell into a pit!");
86     if (random_range(3) == 1) {
87       mprint("And were impaled by spikes!");
88       morewait();
89       p_damage(difficulty()*5,NORMAL_DAMAGE,"a spiked pit");
90     }
91     else p_damage(difficulty()*2,NORMAL_DAMAGE,"a pit");
92     Player.status[IMMOBILE] ++;
93   }
94 }
95 
l_trap_door()96 void l_trap_door()
97 {
98   if (Current_Environment != Current_Dungeon)
99     mprint("You feel oddly lucky.");
100   else {
101     Level->site[Player.x][Player.y].locchar = TRAP;
102     lset(Player.x, Player.y, CHANGED);
103     if (gamestatusp(MOUNTED)) {
104       mprint("You and your horse fall through a trap door!");
105       morewait();
106       mprint("Your horse breaks its back. Snif.");
107       morewait();
108       if (Level->site[Player.x][Player.y].aux != S_DISINTEGRATE) {
109 	mprint("You're hit by a rockslide!");
110 	morewait();
111 	p_damage(Level->depth*difficulty(),UNSTOPPABLE,"a rockslide");
112       }
113       change_level(Level->depth,Level->depth+1,FALSE);
114       resetgamestatus(MOUNTED);
115       showflags();
116       roomcheck();
117     }
118     else if (random_range(100) < Player.agi)
119       mprint("You leap over a trap door.");
120     else {
121       mprint("You fell through a trap door!");
122       morewait();
123       p_damage(difficulty(),NORMAL_DAMAGE,"a trap door");
124       if (Level->site[Player.x][Player.y].aux != S_DISINTEGRATE) {
125 	mprint("You're hit by a rockslide!");
126 	morewait();
127 	p_damage(Level->depth*difficulty(),UNSTOPPABLE,"a rockslide");
128       }
129       change_level(Level->depth,Level->depth+1,FALSE);
130       roomcheck();
131     }
132   }
133 }
134 
l_trap_snare()135 void l_trap_snare()
136 {
137   Level->site[Player.x][Player.y].locchar = TRAP;
138   lset(Player.x, Player.y, CHANGED);
139   if (gamestatusp(MOUNTED))
140     mprint("Your horse steps out of a snare trap.");
141   else if (random_range(100) < Player.agi)
142     mprint("You agilely avoid a snare.");
143   else {
144     mprint("You were caught in a snare!");
145     Player.status[IMMOBILE]+=difficulty();
146   }
147 }
148 
l_trap_blade()149 void l_trap_blade()
150 {
151   Level->site[Player.x][Player.y].locchar = TRAP;
152   lset(Player.x, Player.y, CHANGED);
153   if (random_range(30) < Player.agi+Player.level)
154     mprint("You duck under a scything blade!");
155   else {
156     if (gamestatusp(MOUNTED)) {
157       mprint("Your horse is struck by a scything blade and killed instantly.");
158       morewait();
159       resetgamestatus(MOUNTED);
160       showflags();
161     }
162     else {
163       mprint("A heavy blade scythes across the room and hits you!");
164       morewait();
165       p_damage(random_range(difficulty()*3)+difficulty()-Player.absorption,
166 	       NORMAL_DAMAGE,
167 	       "a blade trap");
168     }
169   }
170 }
171 
l_trap_fire()172 void l_trap_fire()
173 {
174   if (gamestatusp(MOUNTED)) {
175     mprint("Your horse is struck by a blast of fire and is charbroiled!");
176     morewait();
177     resetgamestatus(MOUNTED);
178     showflags();
179   }
180   else if (random_range(50) < Player.agi+Player.level)
181     mprint("You dodge a pillar of fire!");
182   else {
183     mprint("You were blasted by a fire trap!");
184     morewait();
185     p_damage(random_range((difficulty()+1)*5),FLAME,"a fire trap");
186   }
187   Level->site[Player.x][Player.y].locchar = FIRE;
188   Level->site[Player.x][Player.y].p_locf = L_FIRE;
189   lset(Player.x, Player.y, CHANGED);
190 }
191 
l_trap_teleport()192 void l_trap_teleport()
193 {
194   Level->site[Player.x][Player.y].locchar = TRAP;
195   lset(Player.x, Player.y, CHANGED);
196   mprint("You experience a momentary disorientation....");
197   morewait();
198   if (random_range(10000) > difficulty()*difficulty()) p_teleport(0);
199   else p_teleport(-1);
200 }
201 
l_trap_disintegrate()202 void l_trap_disintegrate()
203 {
204   Level->site[Player.x][Player.y].locchar = TRAP;
205   lset(Player.x, Player.y, CHANGED);
206   mprint("Oh, no! A disintegration trap!");
207   morewait();
208   if (gamestatusp(MOUNTED)) {
209     mprint("Your horse falls apart into its component atoms...");
210     morewait();
211     resetgamestatus(MOUNTED);
212     showflags();
213   }
214   disintegrate(Player.x,Player.y);
215 }
216 
l_trap_sleepgas()217 void l_trap_sleepgas()
218 {
219   Level->site[Player.x][Player.y].locchar = TRAP;
220   lset(Player.x, Player.y, CHANGED);
221   mprint("Hsssssssss....");
222   morewait();
223   mprint("You detect a strange odor....");
224   morewait();
225   sleep_player((difficulty()/5)+1);
226 }
227 
228 
l_trap_acid()229 void l_trap_acid()
230 {
231   int i,k,itemdamage;
232   Level->site[Player.x][Player.y].locchar = TRAP;
233   lset(Player.x, Player.y, CHANGED);
234   if (Player.agi+Player.level < random_range(100)) {
235     mprint("You are drenched by a spray of acid!");
236     morewait();
237     if (gamestatusp(MOUNTED)) {
238       mprint("Your horse dies unpleasantly.");
239       morewait();
240       resetgamestatus(MOUNTED);
241       showflags();
242     }
243     p_damage(random_range(difficulty()*5),ACID,"an acid trap");
244     if (! p_immune(ACID)) {
245       mprint("The acid seeps over your possessions...");
246       morewait();
247       itemdamage = random_range(5);
248       for(i=k=0;((i<MAXITEMS) && (k<itemdamage));i++)
249 	if (Player.possessions[i]!=NULL) {
250 	  k++;
251 	  (void) damage_item(Player.possessions[i]);
252 	}
253     }
254   }
255   else mprint("You somehow dodge a shower of hydroflouric acid!");
256 }
257 
l_trap_abyss()258 void l_trap_abyss()
259 {
260   Level->site[Player.x][Player.y].locchar = ABYSS;
261   lset(Player.x, Player.y, CHANGED);
262   if (gamestatusp(MOUNTED)) {
263     mprint("You and your horse fall into the infinite abyss!");
264     morewait();
265     l_abyss();
266   }
267   if (Player.dex + Player.level < random_range(100)) {
268     mprint("You stumble over a concealed entrance to the abyss!");
269     morewait();
270     l_abyss();
271   }
272   else mprint("You gingerly step around a concealed entrance to the abyss!");
273 }
274 
l_trap_manadrain()275 void l_trap_manadrain()
276 {
277   Level->site[Player.x][Player.y].locchar = TRAP;
278   lset(Player.x, Player.y, CHANGED);
279   if (Player.mana==0) {
280     if (random_range(10)==3) {
281       mprint("The manadrain trap overloads -- positive feedback....");
282       mprint("That's strange.... You feel repowered!");
283       morewait();
284       Level->site[Player.x][Player.y].locchar = FLOOR;
285       Level->site[Player.x][Player.y].p_locf = L_NO_OP;
286       lset(Player.x, Player.y, CHANGED);
287       Player.mana = calcmana();
288     }
289     else mprint("You feel strangely unaffected by the manadrain trap.");
290   }
291   else {
292     mprint("A weird rainbow light seems to play over you....");
293     mprint("You feel drained.");
294     morewait();
295     while (Player.mana > 1) {
296       Player.mana /= 2;
297       dataprint();
298     }
299     Player.mana = 0;
300     dispel(-1);
301   }
302 }
303