comparison urogue/artifact.c @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children
comparison
equal deleted inserted replaced
253:d9badb9c0179 256:c495a4f288c6
1 /*
2 artifact.c - functions for dealing with artifacts
3
4 UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5 Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
6 All rights reserved.
7
8 See the file LICENSE.TXT for full copyright and licensing information.
9 */
10
11 #include <stdlib.h>
12 #include <ctype.h>
13 #include "rogue.h"
14
15 /*
16 apply()
17 apply an artifact
18 */
19
20 void
21 apply(void)
22 {
23 struct linked_list *item;
24 struct object *obj;
25 int which;
26 int chance;
27
28 if ((item = get_item("activate", ARTIFACT)) == NULL)
29 return;
30
31 obj = OBJPTR(item);
32 which = obj->o_which;
33
34 if (!(obj->ar_flags & ISACTIVE))
35 {
36 chance = rnd(100) - 10 * rnd(luck);
37 debug("Rolled %d.", chance);
38 if (chance < 5)
39 do_major();
40 else if (chance < 50)
41 do_minor(obj);
42 else
43 obj->ar_flags |= ISACTIVE;
44 }
45
46 if (obj->ar_flags & ISACTIVE)
47 {
48 switch (which)
49 {
50 case TR_PURSE: do_bag(obj);
51 break;
52 case TR_PHIAL: do_phial();
53 break;
54 case TR_AMULET: do_amulet();
55 break;
56 case TR_PALANTIR: do_palantir();
57 break;
58 case TR_CROWN: do_crown();
59 break;
60 case TR_SCEPTRE: do_sceptre();
61 break;
62 case TR_SILMARIL: do_silmaril();
63 break;
64 case TR_WAND: do_wand();
65 break;
66 default: nothing_message(ISCURSED);
67 return;
68 }
69 }
70
71 if (rnd(pstats.s_lvl) < 6)
72 do_minor(obj);
73
74 turn_on(player, POWEREAT);
75 }
76
77 /*
78 possessed(int artifact)
79 was the hero carrying a particular artifact
80 */
81
82 int
83 possessed(int artifact)
84 {
85 return (picked_artifact >> artifact) & 1;
86 }
87
88 /*
89 is_carrying(int artifact)
90 is the hero carrying a particular artifact
91 */
92
93 int
94 is_carrying(int artifact)
95 {
96 return (has_artifact >> artifact) & 1;
97 }
98
99 /*
100 make_artifact()
101 is it time to make a new artifact?
102 */
103
104 int
105 make_artifact(void)
106 {
107 int i;
108
109 mpos = 0;
110
111 debug("Artifact possession and picked flags : %x %x.",
112 has_artifact, picked_artifact);
113
114 for(i = 0; i < maxartifact; i++)
115 {
116 if (!is_carrying(i) && arts[i].ar_level <= level)
117 return TRUE;
118 }
119
120 return FALSE;
121 }
122
123 /*
124 new_artifact(int which, struct object *cur)
125 make a specified artifact
126 */
127
128 struct object *
129 new_artifact(int which, struct object *cur)
130 {
131 if (which >= maxartifact)
132 {
133 debug("Bad artifact %d. Random one created.", which);
134 which = rnd(maxartifact);
135 }
136
137 if (which < 0)
138 {
139 for (which = 0; which < maxartifact; which++)
140 if (!is_carrying(which) && arts[which].ar_level <= level)
141 break;
142 }
143
144 debug("Artifact number: %d.", which);
145
146 cur->o_hplus = cur->o_dplus = 0;
147 cur->o_damage = cur->o_hurldmg = "0d0";
148 cur->o_ac = 11;
149 cur->o_mark[0] = '\0';
150 cur->o_type = ARTIFACT;
151 cur->o_which = which;
152 cur->o_weight = arts[which].ar_weight;
153 cur->o_flags = 0;
154 cur->o_group = 0;
155 cur->o_count = 1;
156 cur->o_bag = NULL;
157 cur->ar_flags = 0;
158
159 return(cur);
160 }
161
162 /*
163 do_minor(struct object *tr)
164 side effects and minor malevolent effects of artifacts
165 */
166
167 void
168 do_minor(struct object *tr)
169 {
170 int which;
171 long loss;
172
173 which = rnd(110);
174
175 debug("Rolled %d.", which);
176
177 switch (which)
178 {
179 case 0:
180 seemsg("You develop some acne on your face.");
181 break;
182
183 case 1:
184 if (on(player, CANSCENT))
185 {
186 msg("A sudden whiff of BO causes you to faint.");
187 no_command = STONETIME;
188 }
189 else if (off(player, ISUNSMELL))
190 msg("You begin to smell funny.");
191 break;
192
193 case 2:
194 seemsg("A wart grows on the end of your nose.");
195 break;
196
197 case 3:
198 hearmsg("Your hear strange noises in the distance.");
199 break;
200
201 case 4:
202 hearmsg("You hear shuffling in the distance.");
203 break;
204
205 case 5:
206 hearmsg("You hear clanking in the distance.");
207 break;
208
209 case 6:
210 hearmsg("You hear water dripping onto the floor.");
211 break;
212
213 case 7:
214 hearmsg("The dungeon goes strangely silent.");
215 break;
216
217 case 8:
218 msg("You suddenly feel very warm.");
219 break;
220
221 case 9:
222 msg("You feel very hot.");
223 break;
224
225 case 10:
226 msg("A blast of heat hits you.");
227 break;
228
229 case 11:
230 {
231 struct room *rp;
232
233 if (off(player, ISBLIND))
234 msg("A pillar of flame leaps up beside you.");
235 else
236 msg("You feel something very hot nearby.");
237
238 if (ntraps + 1 < 2 * MAXTRAPS &&
239 fallpos(hero, &traps[ntraps].tr_pos))
240 {
241 mvaddch(traps[ntraps].tr_pos.y, traps[ntraps].tr_pos.x,
242 FIRETRAP);
243 traps[ntraps].tr_type = FIRETRAP;
244 traps[ntraps].tr_flags = ISFOUND;
245 traps[ntraps].tr_show = FIRETRAP;
246 ntraps++;
247
248 if ((rp = roomin(hero)) != NULL)
249 {
250 rp->r_flags &= ~ISDARK;
251 light(&hero);
252 mvwaddch(cw, hero.y, hero.x, PLAYER);
253 }
254 }
255 }
256 break;
257
258 case 12:
259 msg("You feel a blast of hot air.");
260 break;
261
262 case 13:
263 msg("You feel very cold.");
264 break;
265
266 case 14:
267 msg("You break out in a cold sweat.");
268 break;
269
270 case 15:
271 if (off(player, ISBLIND) && cur_armor == NULL)
272 msg("You are covered with frost.");
273 else if (off(player, ISBLIND))
274 msg("Your armor is covered with frost.");
275 else if (cur_armor == NULL)
276 msg("Your body feels very cold and you begin to shiver.");
277 else
278 msg("Your armor feels very cold. You hear cracking ice.");
279 break;
280
281 case 16:
282 msg("A cold wind whistles through the dungeon.");
283 break;
284
285 case 17:
286 {
287 int change;
288
289 change = 18 - pstats.s_str;
290 chg_str(change, TRUE, FALSE);
291 chg_dext(-change, TRUE, FALSE);
292
293 if (change > 0)
294 msg("You feel stronger and clumsier now.");
295 else if (change < 0)
296 msg("You feel weaker and more dextrous now.");
297 else
298 nothing_message(ISCURSED);
299 }
300 break;
301
302 case 18:
303 msg("You begin to itch all over.");
304 break;
305
306 case 19:
307 msg("You begin to feel hot and itchy.");
308 break;
309
310 case 20:
311 msg("You feel a burning itch.");
312 chg_dext(-1, FALSE, TRUE);
313
314 if (off(player, HASITCH))
315 {
316 turn_on(player, HASITCH);
317 light_fuse(FUSE_UNITCH, 0, roll(4,6), AFTER);
318 }
319 else
320 lengthen_fuse(FUSE_UNITCH, roll(4,6));
321 break;
322
323 case 21:
324 if (off(player, ISBLIND))
325 msg("Your skin begins to flake and peel.");
326 else
327 msg("You feel an urge to scratch an itch.");
328 break;
329
330
331 case 22:
332 seemsg("Your hair begins to turn grey.");
333 break;
334
335 case 23:
336 seemsg("Your hair begins to turn white.");
337 break;
338
339 case 24:
340 seemsg("Some of your hair instantly turns white.");
341 break;
342
343 case 25:
344 seemsg("You are covered with long white hair.");
345 break;
346
347 case 26:
348 seemsg("You are covered with long red hair.");
349 break;
350
351 case 27:
352 msg("You grow a beard.");
353 break;
354
355 case 28:
356 msg("Your hair falls out.");
357 break;
358
359 case 29:
360 msg("You feel a burning down below.");
361 break;
362
363 case 30:
364 msg("Your toes fall off.");
365 break;
366
367 case 31:
368 msg("You grow some extra toes.");
369 break;
370
371 case 32:
372 msg("You grow some extra fingers.");
373 break;
374
375 case 33:
376 msg("You grow an extra thumb.");
377 break;