home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / games / hack / hack.do_wear.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-02  |  7.4 KB  |  337 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* hack.do_wear.c - version 1.0.3 */
  3.  
  4. #include "hack.h"
  5. #include <stdio.h>
  6. extern char *nomovemsg;
  7. extern char quitchars[];
  8. extern char *Doname();
  9.  
  10. off_msg(otmp) register struct obj *otmp; {
  11.     pline("You were wearing %s.", doname(otmp));
  12. }
  13.  
  14. doremarm() {
  15.     register struct obj *otmp;
  16.     if(!uarm && !uarmh && !uarms && !uarmg) {
  17.         pline("Not wearing any armor.");
  18.         return(0);
  19.     }
  20.     otmp = (!uarmh && !uarms && !uarmg) ? uarm :
  21.         (!uarms && !uarm && !uarmg) ? uarmh :
  22.         (!uarmh && !uarm && !uarmg) ? uarms :
  23.         (!uarmh && !uarm && !uarms) ? uarmg :
  24.         getobj("[", "take off");
  25.     if(!otmp) return(0);
  26.     if(!(otmp->owornmask & (W_ARMOR - W_ARM2))) {
  27.         pline("You can't take that off.");
  28.         return(0);
  29.     }
  30.     if( otmp == uarmg && uwep && uwep->cursed ) {    /* myers@uwmacc */
  31.  pline("You seem not able to take off the gloves while holding your weapon.");
  32.         return(0);
  33.     }
  34.     (void) armoroff(otmp);
  35.     return(1);
  36. }
  37.  
  38. doremring() {
  39.     if(!uleft && !uright){
  40.         pline("Not wearing any ring.");
  41.         return(0);
  42.     }
  43.     if(!uleft)
  44.         return(dorr(uright));
  45.     if(!uright)
  46.         return(dorr(uleft));
  47.     if(uleft && uright) while(1) {
  48.         char answer;
  49.  
  50.         pline("What ring, Right or Left? [ rl?]");
  51.         if(index(quitchars, (answer = readchar())))
  52.             return(0);
  53.         switch(answer) {
  54.         case 'l':
  55.         case 'L':
  56.             return(dorr(uleft));
  57.         case 'r':
  58.         case 'R':
  59.             return(dorr(uright));
  60.         case '?':
  61.             (void) doprring();
  62.             /* might look at morc here %% */
  63.         }
  64.     }
  65.     /* NOTREACHED */
  66. #ifdef lint
  67.     return(0);
  68. #endif lint
  69. }
  70.  
  71. dorr(otmp) register struct obj *otmp; {
  72.     if(cursed(otmp)) return(0);
  73.     ringoff(otmp);
  74.     off_msg(otmp);
  75.     return(1);
  76. }
  77.  
  78. cursed(otmp) register struct obj *otmp; {
  79.     if(otmp->cursed){
  80.         pline("You can't. It appears to be cursed.");
  81.         return(1);
  82.     }
  83.     return(0);
  84. }
  85.  
  86. armoroff(otmp) register struct obj *otmp; {
  87. register int delay = -objects[otmp->otyp].oc_delay;
  88.     if(cursed(otmp)) return(0);
  89.     setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
  90.     if(delay) {
  91.         nomul(delay);
  92.         switch(otmp->otyp) {
  93.         case HELMET:
  94.             nomovemsg = "You finished taking off your helmet.";
  95.             break;
  96.         case PAIR_OF_GLOVES:
  97.             nomovemsg = "You finished taking off your gloves";
  98.             break;
  99.         default:
  100.             nomovemsg = "You finished taking off your suit.";
  101.         }
  102.     } else {
  103.         off_msg(otmp);
  104.     }
  105.     return(1);
  106. }
  107.  
  108. doweararm() {
  109.     register struct obj *otmp;
  110.     register int delay;
  111.     register int err = 0;
  112.     long mask = 0;
  113.  
  114.     otmp = getobj("[", "wear");
  115.     if(!otmp) return(0);
  116.     if(otmp->owornmask & W_ARMOR) {
  117.         pline("You are already wearing that!");
  118.         return(0);
  119.     }
  120.     if(otmp->otyp == HELMET){
  121.         if(uarmh) {
  122.             pline("You are already wearing a helmet.");
  123.             err++;
  124.         } else
  125.             mask = W_ARMH;
  126.     } else if(otmp->otyp == SHIELD){
  127.         if(uarms) pline("You are already wearing a shield."), err++;
  128.         if(uwep && uwep->otyp == TWO_HANDED_SWORD)
  129.     pline("You cannot wear a shield and wield a two-handed sword."), err++;
  130.         if(!err) mask = W_ARMS;
  131.     } else if(otmp->otyp == PAIR_OF_GLOVES) {
  132.         if(uarmg) {
  133.             pline("You are already wearing gloves.");
  134.             err++;
  135.         } else
  136.         if(uwep && uwep->cursed) {
  137.             pline("You cannot wear gloves over your weapon.");
  138.             err++;
  139.         } else
  140.             mask = W_ARMG;
  141.     } else {
  142.         if(uarm) {
  143.             if(otmp->otyp != ELVEN_CLOAK || uarm2) {
  144.                 pline("You are already wearing some armor.");
  145.                 err++;
  146.             }
  147.         }
  148.         if(!err) mask = W_ARM;
  149.     }
  150.     if(otmp == uwep && uwep->cursed) {
  151.         if(!err++)
  152.             pline("%s is welded to your hand.", Doname(uwep));
  153.     }
  154.     if(err) return(0);
  155.     setworn(otmp, mask);
  156.     if(otmp == uwep)
  157.         setuwep((struct obj *) 0);
  158.     delay = -objects[otmp->otyp].oc_delay;
  159.     if(delay){
  160.         nomul(delay);
  161.         nomovemsg = "You finished your dressing manoeuvre.";
  162.     }
  163.     otmp->known = 1;
  164.     return(1);
  165. }
  166.  
  167. dowearring() {
  168.     register struct obj *otmp;
  169.     long mask = 0;
  170.     long oldprop;
  171.  
  172.     if(uleft && uright){
  173.         pline("There are no more ring-fingers to fill.");
  174.         return(0);
  175.     }
  176.     otmp = getobj("=", "wear");
  177.     if(!otmp) return(0);
  178.     if(otmp->owornmask & W_RING) {
  179.         pline("You are already wearing that!");
  180.         return(0);
  181.     }
  182.     if(otmp == uleft || otmp == uright) {
  183.         pline("You are already wearing that.");
  184.         return(0);
  185.     }
  186.     if(otmp == uwep && uwep->cursed) {
  187.         pline("%s is welded to your hand.", Doname(uwep));
  188.         return(0);
  189.     }
  190.     if(uleft) mask = RIGHT_RING;
  191.     else if(uright) mask = LEFT_RING;
  192.     else do {
  193.         char answer;
  194.  
  195.          pline("What ring-finger, Right or Left? ");
  196.         if(index(quitchars, (answer = readchar())))
  197.             return(0);
  198.         switch(answer){
  199.         case 'l':
  200.         case 'L':
  201.             mask = LEFT_RING;
  202.             break;
  203.         case 'r':
  204.         case 'R':
  205.             mask = RIGHT_RING;
  206.             break;
  207.         }
  208.     } while(!mask);
  209.     setworn(otmp, mask);
  210.     if(otmp == uwep)
  211.         setuwep((struct obj *) 0);
  212.     oldprop = u.uprops[PROP(otmp->otyp)].p_flgs;
  213.     u.uprops[PROP(otmp->otyp)].p_flgs |= mask;
  214.     switch(otmp->otyp){
  215.     case RIN_LEVITATION:
  216.         if(!oldprop) float_up();
  217.         break;
  218.     case RIN_PROTECTION_FROM_SHAPE_CHANGERS:
  219.         rescham();
  220.         break;
  221.     case RIN_GAIN_STRENGTH:
  222.         u.ustr += otmp->spe;
  223.         u.ustrmax += otmp->spe;
  224.         if(u.ustr > 118) u.ustr = 118;
  225.         if(u.ustrmax > 118) u.ustrmax = 118;
  226.         flags.botl = 1;
  227.         break;
  228.     case RIN_INCREASE_DAMAGE:
  229.         u.udaminc += otmp->spe;
  230.         break;
  231.     }
  232.     prinv(otmp);
  233.     return(1);
  234. }
  235.  
  236. ringoff(obj)
  237. register struct obj *obj;
  238. {
  239. register long mask;
  240.     mask = obj->owornmask & W_RING;
  241.     setworn((struct obj *) 0, obj->owornmask);
  242.     if(!(u.uprops[PROP(obj->otyp)].p_flgs & mask))
  243.         impossible("Strange... I didnt know you had that ring.");
  244.     u.uprops[PROP(obj->otyp)].p_flgs &= ~mask;
  245.     switch(obj->otyp) {
  246.     case RIN_FIRE_RESISTANCE:
  247.         /* Bad luck if the player is in hell... --jgm */
  248.         if (!Fire_resistance && dlevel >= 30) {
  249.             pline("The flames of Hell burn you to a crisp.");
  250.             killer = "stupidity in hell";
  251.             done("burned");
  252.         }
  253.         break;
  254.     case RIN_LEVITATION:
  255.         if(!Levitation) {    /* no longer floating */
  256.             float_down();
  257.         }
  258.         break;
  259.     case RIN_GAIN_STRENGTH:
  260.         u.ustr -= obj->spe;
  261.         u.ustrmax -= obj->spe;
  262.         if(u.ustr > 118) u.ustr = 118;
  263.         if(u.ustrmax > 118) u.ustrmax = 118;
  264.         flags.botl = 1;
  265.         break;
  266.     case RIN_INCREASE_DAMAGE:
  267.         u.udaminc -= obj->spe;
  268.         break;
  269.     }
  270. }
  271.  
  272. find_ac(){
  273. register int uac = 10;
  274.     if(uarm) uac -= ARM_BONUS(uarm);
  275.     if(uarm2) uac -= ARM_BONUS(uarm2);
  276.     if(uarmh) uac -= ARM_BONUS(uarmh);
  277.     if(uarms) uac -= ARM_BONUS(uarms);
  278.     if(uarmg) uac -= ARM_BONUS(uarmg);
  279.     if(uleft && uleft->otyp == RIN_PROTECTION) uac -= uleft->spe;
  280.     if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe;
  281.     if(uac != u.uac){
  282.         u.uac = uac;
  283.         flags.botl = 1;
  284.     }
  285. }
  286.  
  287. glibr(){
  288. register struct obj *otmp;
  289. int xfl = 0;
  290.     if(!uarmg) if(uleft || uright) {
  291.         /* Note: at present also cursed rings fall off */
  292.         pline("Your %s off your fingers.",
  293.             (uleft && uright) ? "rings slip" : "ring slips");
  294.         xfl++;
  295.         if((otmp = uleft) != Null(obj)){
  296.             ringoff(uleft);
  297.             dropx(otmp);
  298.         }
  299.         if((otmp = uright) != Null(obj)){
  300.             ringoff(uright);
  301.             dropx(otmp);
  302.         }
  303.     }
  304.     if((otmp = uwep) != Null(obj)){
  305.         /* Note: at present also cursed weapons fall */
  306.         setuwep((struct obj *) 0);
  307.         dropx(otmp);
  308.         pline("Your weapon %sslips from your hands.",
  309.             xfl ? "also " : "");
  310.     }
  311. }
  312.  
  313. struct obj *
  314. some_armor(){
  315. register struct obj *otmph = uarm;
  316.     if(uarmh && (!otmph || !rn2(4))) otmph = uarmh;
  317.     if(uarmg && (!otmph || !rn2(4))) otmph = uarmg;
  318.     if(uarms && (!otmph || !rn2(4))) otmph = uarms;
  319.     return(otmph);
  320. }
  321.  
  322. corrode_armor(){
  323. register struct obj *otmph = some_armor();
  324.     if(otmph){
  325.         if(otmph->rustfree ||
  326.            otmph->otyp == ELVEN_CLOAK ||
  327.            otmph->otyp == LEATHER_ARMOR ||
  328.            otmph->otyp == STUDDED_LEATHER_ARMOR) {
  329.             pline("Your %s not affected!",
  330.                 aobjnam(otmph, "are"));
  331.             return;
  332.         }
  333.         pline("Your %s!", aobjnam(otmph, "corrode"));
  334.         otmph->spe--;
  335.     }
  336. }
  337.