Annotation of early-roguelike/arogue5/rings.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * routines dealing specifically with rings
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
! 6: * All rights reserved.
! 7: *
! 8: * Based on "Rogue: Exploring the Dungeons of Doom"
! 9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 10: * All rights reserved.
! 11: *
! 12: * See the file LICENSE.TXT for full copyright and licensing information.
! 13: */
! 14:
! 15: #include "curses.h"
! 16: #include "rogue.h"
! 17: #include <stdlib.h>
! 18: #include <string.h>
! 19:
! 20: /*
! 21: * how much food does this ring use up?
! 22: */
! 23: int
! 24: ring_eat(int hand)
! 25: {
! 26: if (cur_ring[hand] == NULL)
! 27: return 0;
! 28: switch (cur_ring[hand]->o_which) {
! 29: case R_VAMPREGEN:
! 30: return 3;
! 31: case R_REGEN:
! 32: return 2;
! 33: case R_HEALTH:
! 34: case R_SUSABILITY:
! 35: return 1;
! 36: case R_SEARCH:
! 37: case R_SEEINVIS:
! 38: return (rnd(100) < 33);
! 39: case R_DIGEST:
! 40: if (cur_ring[hand]->o_ac >= 0)
! 41: return (-(cur_ring[hand]->o_ac)-1);
! 42: else
! 43: return (-(cur_ring[hand]->o_ac));
! 44: }
! 45: return 0;
! 46: }
! 47:
! 48: void
! 49: ring_on(struct object *obj)
! 50: {
! 51: register int save_max;
! 52: char buf[LINELEN];
! 53:
! 54: /*
! 55: * Calculate the effect it has on the poor guy.
! 56: */
! 57: switch (obj->o_which)
! 58: {
! 59: case R_ADDSTR:
! 60: save_max = max_stats.s_str;
! 61: chg_str(obj->o_ac);
! 62: max_stats.s_str = save_max;
! 63: when R_ADDHIT:
! 64: pstats.s_dext += obj->o_ac;
! 65: when R_ADDINTEL:
! 66: pstats.s_intel += obj->o_ac;
! 67: when R_ADDWISDOM:
! 68: pstats.s_wisdom += obj->o_ac;
! 69: when R_SEEINVIS:
! 70: turn_on(player, CANSEE);
! 71: msg("Your eyes begin to tingle");
! 72: light(&hero);
! 73: mvwaddch(cw, hero.y, hero.x, PLAYER);
! 74: when R_AGGR:
! 75: aggravate();
! 76: when R_WARMTH:
! 77: turn_on(player, NOCOLD);
! 78: when R_FIRE:
! 79: turn_on(player, NOFIRE);
! 80: when R_LIGHT: {
! 81: if(roomin(&hero) != NULL) {
! 82: light(&hero);
! 83: mvwaddch(cw, hero.y, hero.x, PLAYER);
! 84: }
! 85: }
! 86: when R_SEARCH:
! 87: start_daemon(ring_search, 0, AFTER);
! 88: when R_TELEPORT:
! 89: start_daemon(ring_teleport, 0, AFTER);
! 90: }
! 91: status(FALSE);
! 92: if (r_know[obj->o_which] && r_guess[obj->o_which])
! 93: {
! 94: free(r_guess[obj->o_which]);
! 95: r_guess[obj->o_which] = NULL;
! 96: }
! 97: else if (!r_know[obj->o_which] &&
! 98: askme &&
! 99: (obj->o_flags & ISKNOW) == 0 &&
! 100: r_guess[obj->o_which] == NULL) {
! 101: msg(terse ? "Call it: " : "What do you want to call it? ");
! 102: if (get_str(buf, msgw) == NORM)
! 103: {
! 104: r_guess[obj->o_which] = new((unsigned int) strlen(buf) + 1);
! 105: strcpy(r_guess[obj->o_which], buf);
! 106: }
! 107: msg("");
! 108: }
! 109: }
! 110:
! 111: /*
! 112: * print ring bonuses
! 113: */
! 114: char *
! 115: ring_num(struct object *obj)
! 116: {
! 117: static char buf[5];
! 118:
! 119: if (!(obj->o_flags & ISKNOW))
! 120: return "";
! 121: switch (obj->o_which)
! 122: {
! 123: case R_PROTECT:
! 124: case R_ADDSTR:
! 125: case R_ADDDAM:
! 126: case R_ADDHIT:
! 127: case R_ADDINTEL:
! 128: case R_ADDWISDOM:
! 129: case R_DIGEST:
! 130: buf[0] = ' ';
! 131: strcpy(&buf[1], num(obj->o_ac, 0));
! 132: when R_AGGR:
! 133: case R_LIGHT:
! 134: case R_HEAVY:
! 135: case R_TELEPORT:
! 136: if (obj->o_flags & ISCURSED)
! 137: return " cursed";
! 138: else
! 139: return "";
! 140: otherwise:
! 141: return "";
! 142: }
! 143: return buf;
! 144: }
! 145:
! 146: /*
! 147: * Return the effect of the specified ring
! 148: */
! 149: int
! 150: ring_value(int type)
! 151: {
! 152: int result = 0;
! 153:
! 154: if (ISRING(LEFT_1, type)) result += cur_ring[LEFT_1]->o_ac;
! 155: if (ISRING(LEFT_2, type)) result += cur_ring[LEFT_2]->o_ac;
! 156: if (ISRING(LEFT_3, type)) result += cur_ring[LEFT_3]->o_ac;
! 157: if (ISRING(LEFT_4, type)) result += cur_ring[LEFT_4]->o_ac;
! 158: if (ISRING(RIGHT_1, type)) result += cur_ring[RIGHT_1]->o_ac;
! 159: if (ISRING(RIGHT_2, type)) result += cur_ring[RIGHT_2]->o_ac;
! 160: if (ISRING(RIGHT_3, type)) result += cur_ring[RIGHT_3]->o_ac;
! 161: if (ISRING(RIGHT_4, type)) result += cur_ring[RIGHT_4]->o_ac;
! 162: return(result);
! 163: }
CVSweb