* Copyright (c) 1988 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)ring.c 5.3 (Berkeley) 6/1/90";
* This source herein may be modified and/or distributed by anybody who
* so desires, with the following restrictions:
* 1.) No portion of this notice shall be removed.
* 2.) Credit shall not be taken for the creation of this source.
* 3.) This code is not to be traded, sold, or used for personal
char *left_or_right
= "left or right hand?";
char *no_ring
= "there's no ring on that hand";
boolean sustain_strength
;
extern char *curse_message
;
message("wearing two rings already", 0);
if ((ch
= pack_letter("put on what?", RING
)) == CANCEL
) {
if (!(ring
= get_letter_object(ch
))) {
message("no such item.", 0);
if (!(ring
->what_is
& RING
)) {
message("that's not a ring", 0);
if (ring
->in_use_flags
& (ON_LEFT_HAND
| ON_RIGHT_HAND
)) {
message("that ring is already being worn", 0);
ch
= (rogue
.left_ring
? 'r' : 'l');
message(left_or_right
, 0);
} while ((ch
!= CANCEL
) && (ch
!= 'l') && (ch
!= 'r') && (ch
!= '\n') &&
if ((ch
!= 'l') && (ch
!= 'r')) {
if (((ch
== 'l') && rogue
.left_ring
)||((ch
== 'r') && rogue
.right_ring
)) {
message("there's already a ring on that hand", 0);
* Do not call ring_stats() from within do_put_on(). It will cause
* serious problems when do_put_on() is called from read_pack() in restore().
ring
->in_use_flags
|= ON_LEFT_HAND
;
ring
->in_use_flags
|= ON_RIGHT_HAND
;
boolean left
= 0, right
= 0;
} else if (rogue
.left_ring
&& !rogue
.right_ring
) {
} else if (!rogue
.left_ring
&& rogue
.right_ring
) {
message(left_or_right
, 0);
} while ((ch
!= CANCEL
) && (ch
!= 'l') && (ch
!= 'r') &&
(ch
!= '\n') && (ch
!= '\r'));
message(curse_message
, 0);
(void) strcpy(buf
, "removed ");
if (ring
&& (ring
->in_use_flags
& ON_LEFT_HAND
)) {
ring
->in_use_flags
&= (~ON_LEFT_HAND
);
} else if (ring
&& (ring
->in_use_flags
& ON_RIGHT_HAND
)) {
ring
->in_use_flags
&= (~ON_RIGHT_HAND
);
ring
->which_kind
= get_rand(0, (RINGS
- 1));
switch(ring
->which_kind
) {
while ((ring
->class = (get_rand(0, 4) - 2)) == 0) ;
ring
->is_cursed
= (ring
->class < 0);
ring
->is_cursed
= coin_toss();
message("not wearing any rings", 0);
get_desc(rogue
.left_ring
, buf
);
get_desc(rogue
.right_ring
, buf
);
sprintf(buf
, "ste %d, r_r %d, e_r %d, r_t %d, s_s %d, a_s %d, reg %d, r_e %d, s_i %d, m_a %d, aus %d",
stealthy
, r_rings
, e_rings
, r_teleport
, sustain_strength
,
add_strength
, regeneration
, ring_exp
, r_see_invisible
,
maintain_armor
, auto_search
);
for (i
= 0; i
< 2; i
++) {
if (!(ring
= ((i
== 0) ? rogue
.left_ring
: rogue
.right_ring
))) {
switch(ring
->which_kind
) {
add_strength
+= ring
->class;
print_stats(STAT_STRENGTH
);