Mercurial > hg > early-roguelike
diff xrogue/wear.c @ 133:e6179860cb76
Import XRogue 8.0 from the Roguelike Restoration Project (r1490)
author | John "Elwin" Edwards |
---|---|
date | Tue, 21 Apr 2015 08:55:20 -0400 |
parents | |
children | ce0cf824c192 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xrogue/wear.c Tue Apr 21 08:55:20 2015 -0400 @@ -0,0 +1,438 @@ +/* + wear.c - functions for dealing with armor + + XRogue: Expeditions into the Dungeons of Doom + Copyright (C) 1991 Robert Pietkivitch + All rights reserved. + + Based on "Advanced Rogue" + Copyright (C) 1984, 1985 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. +*/ + +#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 wear leather and studded leather armor."); + return; + } + if (player.t_ctype == C_ASSASSIN && + (obj->o_which != LEATHER && + obj->o_which != STUDDED_LEATHER)) { + if (terse) msg("Assassins can't wear that type of armor."); + else + msg("Assassins can wear leather and 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 and ogre power give the hero + * a dexterity of 21, 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 and acid breath. + */ + 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) { /* Not enough fingers */ + if (terse) msg("Wearing enough rings."); + else msg("You are already wearing 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 and ogre power give the hero + * a dexterity of 21, 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, (VOID *)NULL, 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); /* affect all charactors */ + if (player.t_ctype == C_PALADIN || + player.t_ctype == C_RANGER || player.t_ctype == C_MONK) + msg("A chill runs down your spine! "); + + /* + * the necklace of adaption makes the hero immune to + * chlorine gas and acid + */ + when MM_ADAPTION: + msg("Wearing %s",inv_name(obj,TRUE)); + cur_misc[WEAR_NECKLACE] = obj; + turn_on(player, NOGAS); + turn_on(player, NOACID); + + /* + * 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, (VOID *)NULL, 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) { /* Not enough fingers */ + if (terse) msg("Wearing enough rings."); + else msg("You are already wearing 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(5); + 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? */ + } +} +