1 /* 2 * Routines dealing specifically with rings 3 * 4 * rings.c 1.4 (AI Design) 12/13/84 5 */ 6 7 #include "rogue.h" 8 #include "curses.h" 9 10 11 /* 12 * ring_on: 13 * Put a ring on a hand 14 */ 15 ring_on() 16 { 17 register THING *obj; 18 register int ring = -1; 19 20 if ((obj = get_item("put on", RING)) == NULL) 21 goto no_ring; 22 /* 23 * Make certain that it is somethings that we want to wear 24 */ 25 if (obj->o_type != RING) { 26 msg("you can't put that on your finger"); 27 goto no_ring; 28 } 29 30 /* 31 * find out which hand to put it on 32 */ 33 if (is_current(obj)) 34 goto no_ring; 35 36 if (cur_ring[LEFT] == NULL) 37 ring = LEFT; 38 if (cur_ring[RIGHT] == NULL) 39 ring = RIGHT; 40 if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL) 41 if ((ring = gethand()) < 0) 42 goto no_ring; 43 if (ring < 0) { 44 msg("you already have a ring on each hand"); 45 goto no_ring; 46 } 47 cur_ring[ring] = obj; 48 49 /* 50 * Calculate the effect it has on the poor guy. 51 */ 52 switch (obj->o_which) { 53 case R_ADDSTR: 54 chg_str(obj->o_ac); 55 break; 56 case R_SEEINVIS: 57 invis_on(); 58 break; 59 case R_AGGR: 60 aggravate(); 61 break; 62 } 63 64 msg("%swearing %s (%c)", noterse("you are now "), inv_name(obj, TRUE), pack_char(obj)); 65 return ; 66 67 no_ring: 68 after = FALSE; 69 return; 70 } 71 72 /* 73 * ring_off: 74 * Take off a ring 75 */ 76 ring_off() 77 { 78 register int ring; 79 register THING *obj; 80 register char packchar; 81 82 if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL) { 83 msg("you aren't wearing any rings"); 84 after = FALSE; 85 return; 86 } else if (cur_ring[LEFT] == NULL) 87 ring = RIGHT; 88 else if (cur_ring[RIGHT] == NULL) 89 ring = LEFT; 90 else 91 if ((ring = gethand()) < 0) 92 return; 93 mpos = 0; 94 obj = cur_ring[ring]; 95 if (obj == NULL) { 96 msg("not wearing such a ring"); 97 after = FALSE; 98 return; 99 } 100 packchar = pack_char(obj); 101 if (can_drop(obj)) 102 msg("was wearing %s(%c)", inv_name(obj, TRUE), packchar); 103 } 104 105 /* 106 * gethand: 107 * Which hand is the hero interested in? 108 */ 109 gethand() 110 { 111 register int c; 112 113 for (;;) { 114 msg("left hand or right hand? "); 115 if ((c = readchar()) == ESCAPE) { 116 after = FALSE; 117 return -1; 118 } 119 mpos = 0; 120 if (c == 'l' || c == 'L') 121 return LEFT; 122 else if (c == 'r' || c == 'R') 123 return RIGHT; 124 msg("please type L or R"); 125 } 126 } 127 128 /* 129 * ring_eat: 130 * How much food does this ring use up? 131 */ 132 ring_eat(hand) 133 register int hand; 134 { 135 if (cur_ring[hand] == NULL) 136 return 0; 137 switch (cur_ring[hand]->o_which) { 138 case R_REGEN: 139 return 2; 140 case R_SUSTSTR: 141 case R_SUSTARM: 142 case R_PROTECT: 143 case R_ADDSTR: 144 case R_STEALTH: 145 return 1; 146 case R_SEARCH: 147 return(rnd(5)==0); 148 case R_ADDHIT: 149 case R_ADDDAM: 150 return (rnd(3) == 0); 151 case R_DIGEST: 152 return -rnd(2); 153 case R_SEEINVIS: 154 return (rnd(5) == 0); 155 default: 156 return 0; 157 } 158 } 159 160 /* 161 * ring_num: 162 * Print ring bonuses 163 */ 164 char * 165 ring_num(obj) 166 register THING *obj; 167 { 168 extern char *ring_buf; 169 170 if (!(obj->o_flags & ISKNOW)) 171 return ""; 172 switch (obj->o_which) { 173 when R_PROTECT: 174 case R_ADDSTR: 175 case R_ADDDAM: 176 case R_ADDHIT: 177 ring_buf[0] = ' '; 178 strcpy(&ring_buf[1], num(obj->o_ac, 0, RING)); 179 otherwise: 180 return ""; 181 } 182 return ring_buf; 183 } 184 ÿ