diff arogue7/wear.c @ 125:adfa37e67084

Import Advanced Rogue 7.7 from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Fri, 08 May 2015 15:24:40 -0400
parents
children b786053d2f37
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/arogue7/wear.c	Fri May 08 15:24:40 2015 -0400
@@ -0,0 +1,431 @@
+/*
+ * wear.c  -  functions for dealing with armor
+ *
+ * Advanced Rogue
+ * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
+ * All rights reserved.
+ *
+ * Based on "Rogue: Exploring the Dungeons of Doom"
+ * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
+ * All rights reserved.
+ *
+ * See the file LICENSE.TXT for full copyright and licensing information.
+ */
+
+/*
+ * This file contains misc functions for dealing with armor
+ */
+
+#include "curses.h"
+#include "rogue.h"
+
+
+/*
+ * take_off:
+ *	Get the armor off of the players back
+ */
+
+take_off()
+{
+    register struct object *obj;
+    register struct linked_list *item;
+
+    /* It takes time to take things off */
+    if (player.t_action != C_TAKEOFF) {
+	/* What does player want to take off? */
+	if ((item = get_item(pack, "take off", REMOVABLE, FALSE, FALSE))==NULL)
+	    return;
+
+	obj = OBJPTR(item);
+	if (!is_current(obj)) {
+	    msg("Not wearing %c) %s", pack_char(pack, obj),inv_name(obj, TRUE));
+	    return;
+	}
+
+	player.t_using = item;	/* Remember what it is */
+	player.t_action = C_TAKEOFF;	/* We are taking something off */
+
+	/* Cursed items take almost no time */
+	if (obj->o_flags & ISCURSED) player.t_no_move = movement(&player);
+	else player.t_no_move = dress_units(item) * movement(&player);
+	return;
+    }
+
+    /* We have waited our time, let's take off our item */
+    item = player.t_using;
+    player.t_using = NULL;
+    player.t_action = A_NIL;
+
+    obj = OBJPTR(item);
+    if (!is_current(obj)) {	/* Just to be on the safe side */
+	msg("Not wearing %c) %s", pack_char(pack, obj),inv_name(obj, TRUE));
+	return;
+    }
+
+    /* Can the player remove the item? */
+    if (!dropcheck(obj)) return;
+    updpack(TRUE, &player);
+
+    msg("Was wearing %c) %s", pack_char(pack, obj),inv_name(obj,TRUE));
+}
+
+/*
+ * wear:
+ *	The player wants to wear something, so let him/her put it on.
+ */
+
+wear()
+{
+    register struct linked_list *item;
+    register struct object *obj;
+    register int i;
+
+    /* It takes time to put things on */
+    if (player.t_action != C_WEAR) {
+	/* What does player want to wear? */
+	if ((item = get_item(pack, "wear", WEARABLE, FALSE, FALSE)) == NULL)
+	    return;
+
+	obj = OBJPTR(item);
+
+	switch (obj->o_type) {
+	    case ARMOR:
+		if (cur_armor != NULL) {
+		    addmsg("You are already wearing armor");
+		    if (!terse) addmsg(".  You'll have to take it off first.");
+		    endmsg();
+		    after = FALSE;
+		    return;
+		}
+		if (player.t_ctype == C_MONK) {
+		    msg("Monks can't wear armor!");
+		    return;
+		}
+		if (cur_misc[WEAR_BRACERS] != NULL) {
+		    msg("You can't wear armor with bracers of defense.");
+		    return;
+		}
+		if (cur_misc[WEAR_CLOAK] != NULL || cur_relic[EMORI_CLOAK]) {
+		    msg("You can't wear armor with a cloak.");
+		    return;
+		}
+		if (player.t_ctype == C_THIEF	&&
+		    (obj->o_which != LEATHER    &&
+		     obj->o_which != STUDDED_LEATHER)) {
+		    if (terse) msg("Thieves can't wear that type of armor");
+		    else
+		 msg("Thieves can only wear leather or studded leather armor");
+		    return;
+		}
+		if (player.t_ctype == C_ASSASIN	&&
+		    (obj->o_which != LEATHER    &&
+		     obj->o_which != STUDDED_LEATHER)) {
+		    if (terse) msg("Assassins can't wear that type of armor");
+		    else
+		 msg("Assassins can only wear leather or studded leather armor");
+		    return;
+		}
+
+	    when MM:
+		switch (obj->o_which) {
+		/*
+		 * when wearing the boots of elvenkind the player will not
+		 * set off any traps
+		 */
+		case MM_ELF_BOOTS:
+		    if (cur_misc[WEAR_BOOTS] != NULL) {
+			msg("Already wearing a pair of boots");
+			return;
+		    }
+		/*
+		 * when wearing the boots of dancing the player will dance
+		 * uncontrollably
+		 */
+		when MM_DANCE:
+		    if (cur_misc[WEAR_BOOTS] != NULL) {
+			msg("Already wearing a pair of boots");
+			return;
+		    }
+		/*
+		 * bracers give the hero protection in he same way armor does.
+		 * they cannot be used with armor but can be used with cloaks
+		 */
+		when MM_BRACERS:
+		    if (cur_misc[WEAR_BRACERS] != NULL) {
+			msg("Already wearing bracers");
+			return;
+		    }
+		    else {
+			if (cur_armor != NULL) {
+			   msg("You can't wear bracers of defense with armor.");
+			   return;
+			}
+		    }
+
+		/*
+		 * The robe (cloak) of powerlessness disallows any spell casting
+		 */
+		when MM_R_POWERLESS:
+		/*
+		 * the cloak of displacement gives the hero an extra +2 on AC
+		 * and saving throws. Cloaks cannot be used with armor.
+		 */
+		case MM_DISP:
+		/*
+		 * the cloak of protection gives the hero +n on AC and saving
+		 * throws with a max of +3 on saves
+		 */
+		case MM_PROTECT:
+		    if (cur_misc[WEAR_CLOAK] != NULL ||
+			cur_relic[EMORI_CLOAK]) {
+			msg("%slready wearing a cloak.", terse ? "A"
+							       : "You are a");
+			return;
+		    }
+		    else {
+			if (cur_armor != NULL) {
+			    msg("You can't wear a cloak with armor.");
+			    return;
+			}
+		    }
+		/*
+		 * the gauntlets of dexterity give the hero a dexterity of 18
+		 * the gauntlets of ogre power give the hero a strength of 18
+		 * the gauntlets of fumbling cause the hero to drop his weapon
+		 */
+		when MM_G_DEXTERITY:
+		case MM_G_OGRE:
+		case MM_FUMBLE:
+		    if (cur_misc[WEAR_GAUNTLET] != NULL) {
+			msg("Already wearing a pair of gauntlets.");
+			return;
+		    }
+		/*
+		 * the jewel of attacks does an aggavate monster
+		 */
+		when MM_JEWEL:
+		    if (cur_misc[WEAR_JEWEL] != NULL	||
+			cur_relic[YENDOR_AMULET]	||
+			cur_relic[STONEBONES_AMULET]) {
+			msg("Already wearing an amulet.");
+			return;
+		    }
+		/*
+		 * the necklace of adaption makes the hero immune to
+		 * chlorine gas
+		 */
+		when MM_ADAPTION:
+		    if (cur_misc[WEAR_NECKLACE] != NULL) {
+			msg("Already wearing a necklace");
+			return;
+		    }
+		/*
+		 * the necklace of stragulation will try to strangle the
+		 * hero to death
+		 */
+		when MM_STRANGLE:
+		    if (cur_misc[WEAR_NECKLACE] != NULL) {
+			msg("Already wearing a necklace");
+			return;
+		    }
+		otherwise:
+		    msg("what a strange item you have!");
+		    return;
+		}
+
+	    when RING:
+		if (cur_misc[WEAR_GAUNTLET] != NULL) {
+		    msg ("You have to remove your gauntlets first!");
+		    return;
+		}
+
+		/* Is there room to put the ring on */
+		for (i=0; i<NUM_FINGERS; i++)
+		    if (cur_ring[i] == NULL) {
+			break;
+		    }
+		if (i == NUM_FINGERS) {	/* No room */
+		    if (terse) msg("Wearing enough rings");
+		    else msg("You already have on eight rings");
+		    return;
+		}
+	}
+
+	player.t_using = item;	/* Remember what it is */
+	player.t_action = C_WEAR;	/* We are taking something off */
+	player.t_no_move = dress_units(item) * movement(&player);
+	return;
+    }
+
+    /* We have waited our time, let's put on our item */
+    item = player.t_using;
+    player.t_using = NULL;
+    player.t_action = A_NIL;
+
+    obj = OBJPTR(item);
+
+    switch (obj->o_type) {
+	case ARMOR:
+	    obj->o_flags |= ISKNOW;
+	    cur_armor = obj;
+	    addmsg(terse ? "W" : "You are now w");
+	    msg("earing %s.", armors[obj->o_which].a_name);
+
+	when MM:
+	    switch (obj->o_which) {
+	    /*
+	     * when wearing the boots of elvenkind the player will not
+	     * set off any traps
+	     */
+	    case MM_ELF_BOOTS:
+		msg("Wearing %s",inv_name(obj,TRUE));
+		cur_misc[WEAR_BOOTS] = obj;
+	    /*
+	     * when wearing the boots of dancing the player will dance
+	     * uncontrollably
+	     */
+	    when MM_DANCE:
+		msg("Wearing %s",inv_name(obj,TRUE));
+		cur_misc[WEAR_BOOTS] = obj;
+		msg("You begin to dance uncontrollably!");
+		turn_on(player, ISDANCE);
+	    /*
+	     * bracers give the hero protection in he same way armor does.
+	     * they cannot be used with armor but can be used with cloaks
+	     */
+	    when MM_BRACERS:
+		msg("wearing %s",inv_name(obj,TRUE));
+		cur_misc[WEAR_BRACERS] = obj;
+
+	    /*
+	     * The robe (cloak) of powerlessness disallows any spell casting
+	     */
+	    when MM_R_POWERLESS:
+	    /*
+	     * the cloak of displacement gives the hero an extra +2 on AC
+	     * and saving throws. Cloaks cannot be used with armor.
+	     */
+	    case MM_DISP:
+	    /*
+	     * the cloak of protection gives the hero +n on AC and saving
+	     * throws with a max of +3 on saves
+	     */
+	    case MM_PROTECT:
+		msg("wearing %s",inv_name(obj,TRUE));
+		cur_misc[WEAR_CLOAK] = obj;
+	    /*
+	     * the gauntlets of dexterity give the hero a dexterity of 18
+	     * the gauntlets of ogre power give the hero a strength of 18
+	     * the gauntlets of fumbling cause the hero to drop his weapon
+	     */
+	    when MM_G_DEXTERITY:
+	    case MM_G_OGRE:
+	    case MM_FUMBLE:
+		msg("Wearing %s", inv_name(obj,TRUE));
+		cur_misc[WEAR_GAUNTLET] = obj;
+		if (obj->o_which == MM_FUMBLE)
+		    daemon(fumble, 0, AFTER);
+	    /*
+	     * the jewel of attacks does an aggavate monster
+	     */
+	    when MM_JEWEL:
+		msg("Wearing %s",inv_name(obj,TRUE));
+		cur_misc[WEAR_JEWEL] = obj;
+		aggravate(TRUE, TRUE);
+	    /*
+	     * the necklace of adaption makes the hero immune to
+	     * chlorine gas
+	     */
+	    when MM_ADAPTION:
+		msg("Wearing %s",inv_name(obj,TRUE));
+		cur_misc[WEAR_NECKLACE] = obj;
+		turn_on(player, NOGAS);
+	    /*
+	     * the necklace of stragulation will try to strangle the
+	     * hero to death
+	     */
+	    when MM_STRANGLE:
+		msg("Wearing %s",inv_name(obj,TRUE));
+		cur_misc[WEAR_NECKLACE] = obj;
+		msg("The necklace is beginning to strangle you!");
+		daemon(strangle, 0, AFTER);
+	    otherwise:
+		msg("What a strange item you have!");
+	    }
+	    status(FALSE);
+	    if (m_know[obj->o_which] && m_guess[obj->o_which]) {
+		free(m_guess[obj->o_which]);
+		m_guess[obj->o_which] = NULL;
+	    }
+	    else if (!m_know[obj->o_which] && 
+		     askme &&
+		     (obj->o_flags & ISKNOW) == 0 &&
+		     m_guess[obj->o_which] == NULL) {
+		nameitem(item, FALSE);
+	    }
+
+	when RING:
+	    /* If there is room, put on the ring */
+	    for (i=0; i<NUM_FINGERS; i++)
+	        if (cur_ring[i] == NULL) {
+		    cur_ring[i] = obj;
+		    break;
+		}
+	    if (i == NUM_FINGERS) {	/* No room */
+		if (terse) msg("Wearing enough rings");
+		else msg("You already have on eight rings");
+		return;
+	    }
+
+	    /* Calculate the effect of the ring */
+	    ring_on(item);
+    }
+    updpack(TRUE, &player);
+}
+
+/*
+ * dress_units:
+ *	How many movements periods does it take to put on or remove the
+ *	given item of "clothing"?
+ */
+dress_units(item)
+struct linked_list *item;
+{
+    register struct object *obj;
+
+    obj = OBJPTR(item);
+
+    switch (obj->o_type) {
+	case ARMOR:
+	    return(10-armors[obj->o_which].a_class);
+	when RING:
+	    return(2);
+	when MM:
+	    switch (obj->o_which) {
+		case MM_ELF_BOOTS:
+		case MM_DANCE:
+		    /* Boots */
+		    return(4);
+		when MM_R_POWERLESS:
+		case MM_DISP:
+		case MM_PROTECT:
+		    /* Robes */
+		    return(4);
+		when MM_BRACERS:
+		case MM_G_DEXTERITY:
+		case MM_G_OGRE:
+		case MM_FUMBLE:
+		    /* Hand garments */
+		    return(3);
+		when MM_JEWEL:
+		case MM_ADAPTION:
+		case MM_STRANGLE:
+		    /* Jewelry */
+		    return(2);
+		otherwise:
+		    return(1);	/* What is it? */
+	}
+	otherwise:
+	    return(1);	/* What is it? */
+    }
+}