2 * Contains functions for dealing with things like
5 * @(#)things.c 3.37 (Berkeley) 6/15/81
7 * Rogue: Exploring the Cavern of Cuties
8 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
11 * See the file LICENSE.TXT for full copyright and licensing information.
21 * return the name of something as it would appear in an
26 register struct object
*obj
;
34 if (obj
->o_count
== 1)
35 strcpy(prbuf
, "A scroll ");
37 sprintf(prbuf
, "%d scrolls ", obj
->o_count
);
38 pb
= &prbuf
[strlen(prbuf
)];
39 if (s_know
[obj
->o_which
])
40 sprintf(pb
, "of %s", s_magic
[obj
->o_which
].mi_name
);
41 else if (s_guess
[obj
->o_which
])
42 sprintf(pb
, "called %s", s_guess
[obj
->o_which
]);
44 sprintf(pb
, "titled '%s'", s_names
[obj
->o_which
]);
46 if (obj
->o_count
== 1)
47 strcpy(prbuf
, "A potion ");
49 sprintf(prbuf
, "%d potions ", obj
->o_count
);
50 pb
= &prbuf
[strlen(prbuf
)];
51 if (p_know
[obj
->o_which
])
52 sprintf(pb
, "of %s(%s)", p_magic
[obj
->o_which
].mi_name
,
53 p_colors
[obj
->o_which
]);
54 else if (p_guess
[obj
->o_which
])
55 sprintf(pb
, "called %s(%s)", p_guess
[obj
->o_which
],
56 p_colors
[obj
->o_which
]);
57 else if (obj
->o_count
== 1)
58 sprintf(prbuf
, "A%s %s potion",
59 vowelstr(p_colors
[obj
->o_which
]),
60 p_colors
[obj
->o_which
]);
62 sprintf(prbuf
, "%d %s potions", obj
->o_count
,
63 p_colors
[obj
->o_which
]);
65 if (obj
->o_which
== 1)
66 if (obj
->o_count
== 1)
67 sprintf(prbuf
, "A%s %s", vowelstr(fruit
), fruit
);
69 sprintf(prbuf
, "%d %ss", obj
->o_count
, fruit
);
71 if (obj
->o_count
== 1)
72 strcpy(prbuf
, "Some food");
74 sprintf(prbuf
, "%d rations of food", obj
->o_count
);
77 sprintf(prbuf
, "%d ", obj
->o_count
);
80 pb
= &prbuf
[strlen(prbuf
)];
81 if (obj
->o_flags
& ISKNOW
)
82 sprintf(pb
, "%s %s", num(obj
->o_hplus
, obj
->o_dplus
),
83 w_names
[obj
->o_which
]);
85 sprintf(pb
, "%s", w_names
[obj
->o_which
]);
89 if (obj
->o_flags
& ISKNOW
)
90 sprintf(prbuf
, "%s %s",
91 num(a_class
[obj
->o_which
] - obj
->o_ac
, 0),
92 a_names
[obj
->o_which
]);
94 sprintf(prbuf
, "%s", a_names
[obj
->o_which
]);
96 strcpy(prbuf
, "The Amulet of Yendor");
98 sprintf(prbuf
, "A %s ", ws_type
[obj
->o_which
]);
99 pb
= &prbuf
[strlen(prbuf
)];
100 if (ws_know
[obj
->o_which
])
101 sprintf(pb
, "of %s%s(%s)", ws_magic
[obj
->o_which
].mi_name
,
102 charge_str(obj
), ws_made
[obj
->o_which
]);
103 else if (ws_guess
[obj
->o_which
])
104 sprintf(pb
, "called %s(%s)", ws_guess
[obj
->o_which
],
105 ws_made
[obj
->o_which
]);
107 sprintf(&prbuf
[2], "%s %s", ws_made
[obj
->o_which
],
108 ws_type
[obj
->o_which
]);
110 if (r_know
[obj
->o_which
])
111 sprintf(prbuf
, "A%s ring of %s(%s)", ring_num(obj
),
112 r_magic
[obj
->o_which
].mi_name
, r_stones
[obj
->o_which
]);
113 else if (r_guess
[obj
->o_which
])
114 sprintf(prbuf
, "A ring called %s(%s)",
115 r_guess
[obj
->o_which
], r_stones
[obj
->o_which
]);
117 sprintf(prbuf
, "A%s %s ring", vowelstr(r_stones
[obj
->o_which
]),
118 r_stones
[obj
->o_which
]);
120 debug("Picked up something funny");
121 sprintf(prbuf
, "Something bizarre %s", unctrl(obj
->o_type
));
123 if (obj
== cur_armor
)
124 strcat(prbuf
, " (being worn)");
125 if (obj
== cur_weapon
)
126 strcat(prbuf
, " (weapon in hand)");
127 if (obj
== cur_ring
[LEFT
])
128 strcat(prbuf
, " (on left hand)");
129 else if (obj
== cur_ring
[RIGHT
])
130 strcat(prbuf
, " (on right hand)");
131 if (drop
&& isupper(prbuf
[0]))
132 prbuf
[0] = tolower(prbuf
[0]);
133 else if (!drop
&& islower(*prbuf
))
134 *prbuf
= toupper(*prbuf
);
142 * Add to characters purse
146 register struct room
*rp
;
148 for (rp
= rooms
; rp
<= &rooms
[MAXROOMS
-1]; rp
++)
149 if (ce(hero
, rp
->r_gold
))
154 addmsg("You found ");
155 msg("%d gold pieces.", rp
->r_goldval
);
157 purse
+= rp
->r_goldval
;
163 msg("That gold must have been counterfeit");
173 register struct linked_list
*obj
, *nobj
;
174 register struct object
*op
;
176 ch
= mvwinch(stdscr
, hero
.y
, hero
.x
);
177 if (ch
!= FLOOR
&& ch
!= PASSAGE
)
179 msg("There is something there already");
182 if ((obj
= get_item("drop", 0)) == NULL
)
184 op
= (struct object
*) ldata(obj
);
188 * Take it out of the pack
190 if (op
->o_count
>= 2 && op
->o_type
!= WEAPON
)
192 nobj
= new_item(sizeof *op
);
194 op
= (struct object
*) ldata(nobj
);
195 *op
= *((struct object
*) ldata(obj
));
198 if (op
->o_group
!= 0)
205 * Link it into the level object list
207 attach(lvl_obj
, obj
);
208 mvaddch(hero
.y
, hero
.x
, op
->o_type
);
210 msg("Dropped %s", inv_name(op
, TRUE
));
214 * do special checks for dropping or unweilding|unwearing|unringing
217 register struct object
*op
;
223 if (op
!= cur_armor
&& op
!= cur_weapon
224 && op
!= cur_ring
[LEFT
] && op
!= cur_ring
[RIGHT
])
226 if (op
->o_flags
& ISCURSED
)
228 msg("You can't. It appears to be cursed.");
231 if (op
== cur_weapon
)
233 else if (op
== cur_armor
)
238 else if (op
== cur_ring
[LEFT
] || op
== cur_ring
[RIGHT
])
243 save_max
= max_stats
.s_str
;
245 max_stats
.s_str
= save_max
;
248 player
.t_flags
&= ~CANSEE
;
251 mvwaddch(cw
, hero
.y
, hero
.x
, PLAYER
);
254 cur_ring
[op
== cur_ring
[LEFT
] ? LEFT
: RIGHT
] = NULL
;
265 register struct linked_list
*item
;
266 register struct object
*cur
;
269 item
= new_item(sizeof *cur
);
270 cur
= (struct object
*) ldata(item
);
271 cur
->o_hplus
= cur
->o_dplus
= 0;
272 strcpy(cur
->o_damage
,"0d0");
273 strcpy(cur
->o_hurldmg
,"0d0");
279 * Decide what kind of object it will be
280 * If we haven't had food for a while, let it be food.
282 switch (no_food
> 3 ? 2 : pick_one(things
, NUMTHINGS
))
285 cur
->o_type
= POTION
;
286 cur
->o_which
= pick_one(p_magic
, MAXPOTIONS
);
288 cur
->o_type
= SCROLL
;
289 cur
->o_which
= pick_one(s_magic
, MAXSCROLLS
);
298 cur
->o_type
= WEAPON
;
299 cur
->o_which
= rnd(MAXWEAPONS
);
300 init_weapon(cur
, cur
->o_which
);
301 if ((k
= rnd(100)) < 10)
303 cur
->o_flags
|= ISCURSED
;
304 cur
->o_hplus
-= rnd(3)+1;
307 cur
->o_hplus
+= rnd(3)+1;
310 for (j
= 0, k
= rnd(100); j
< MAXARMORS
; j
++)
311 if (k
< a_chances
[j
])
315 debug("Picked a bad armor %d", k
);
319 cur
->o_ac
= a_class
[j
];
320 if ((k
= rnd(100)) < 20)
322 cur
->o_flags
|= ISCURSED
;
323 cur
->o_ac
+= rnd(3)+1;
326 cur
->o_ac
-= rnd(3)+1;
329 cur
->o_which
= pick_one(r_magic
, MAXRINGS
);
330 switch (cur
->o_which
)
336 if ((cur
->o_ac
= rnd(3)) == 0)
339 cur
->o_flags
|= ISCURSED
;
343 cur
->o_flags
|= ISCURSED
;
347 cur
->o_which
= pick_one(ws_magic
, MAXSTICKS
);
350 debug("Picked a bad kind of object");
357 * pick an item out of a list of nitems possible magic items
359 pick_one(magic
, nitems
)
360 register struct magic_item
*magic
;
363 register struct magic_item
*end
;
365 register struct magic_item
*start
;
368 for (end
= &magic
[nitems
], i
= rnd(100); magic
< end
; magic
++)
369 if (i
< magic
->mi_prob
)
375 msg("bad pick_one: %d from %d items", i
, nitems
);
376 for (magic
= start
; magic
< end
; magic
++)
377 msg("%s: %d%%", magic
->mi_name
, magic
->mi_prob
);
381 return magic
- start
;