Difference between revisions of "Source:NetHack 3.6.0/src/attrib.c"

From NetHackWiki
Jump to navigation Jump to search
m (Fix indents and break functions)
 
Line 6: Line 6:
 
== Top of file ==
 
== Top of file ==
  
  <span id="line1">1.  /* NetHack 3.6 attrib.c $NHDT-Date: 1449269911 2015/12/04 22:58:31 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.51 $ */</span>
+
  <span id="line1">1. /* NetHack 3.6 attrib.c $NHDT-Date: 1449269911 2015/12/04 22:58:31 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.51 $ */</span>
  <span id="line2">2.  /*      Copyright 1988, 1989, 1990, 1992, M. Stephenson          */</span>
+
  <span id="line2">2. /*      Copyright 1988, 1989, 1990, 1992, M. Stephenson          */</span>
  <span id="line3">3.  /* NetHack may be freely redistributed.  See license for details. */</span>
+
  <span id="line3">3. /* NetHack may be freely redistributed.  See license for details. */</span>
  <span id="line4">4.  </span>
+
  <span id="line4">4. </span>
  <span id="line5">5.  /*  attribute modification routines. */</span>
+
  <span id="line5">5. /*  attribute modification routines. */</span>
  <span id="line6">6.  </span>
+
  <span id="line6">6. </span>
  <span id="line7">7.  #include "hack.h"</span>
+
  <span id="line7">7. #include "hack.h"</span>
  <span id="line8">8.  #include <ctype.h></span>
+
  <span id="line8">8. #include <ctype.h></span>
  <span id="line9">9.  </span>
+
  <span id="line9">9. </span>
  <span id="line10">10.  /* part of the output on gain or loss of attribute */</span>
+
  <span id="line10">10. /* part of the output on gain or loss of attribute */</span>
  <span id="line11">11.  static const char</span>
+
  <span id="line11">11. static const char</span>
  <span id="line12">12.      *const plusattr[] = { "strong", "smart", "wise",</span>
+
  <span id="line12">12.    *const plusattr[] = { "strong", "smart", "wise",</span>
  <span id="line13">13.                            "agile",  "tough", "charismatic" },</span>
+
  <span id="line13">13.                          "agile",  "tough", "charismatic" },</span>
  <span id="line14">14.      *const minusattr[] = { "weak",    "stupid",</span>
+
  <span id="line14">14.    *const minusattr[] = { "weak",    "stupid",</span>
  <span id="line15">15.                            "foolish", "clumsy",</span>
+
  <span id="line15">15.                            "foolish", "clumsy",</span>
  <span id="line16">16.                            "fragile", "repulsive" };</span>
+
  <span id="line16">16.                            "fragile", "repulsive" };</span>
  <span id="line17">17.  </span>
+
  <span id="line17">17. </span>
  <span id="line18">18.  static const struct innate {</span>
+
  <span id="line18">18. static const struct innate {</span>
  <span id="line19">19.      schar ulevel;</span>
+
  <span id="line19">19.    schar ulevel;</span>
  <span id="line20">20.      long *ability;</span>
+
  <span id="line20">20.    long *ability;</span>
  <span id="line21">21.      const char *gainstr, *losestr;</span>
+
  <span id="line21">21.    const char *gainstr, *losestr;</span>
  <span id="line22">22.  } arc_abil[] = { { 1, &(HStealth), "", "" },</span>
+
  <span id="line22">22. } arc_abil[] = { { 1, &(HStealth), "", "" },</span>
  <span id="line23">23.                  { 1, &(HFast), "", "" },</span>
+
  <span id="line23">23.                  { 1, &(HFast), "", "" },</span>
  <span id="line24">24.                  { 10, &(HSearching), "perceptive", "" },</span>
+
  <span id="line24">24.                  { 10, &(HSearching), "perceptive", "" },</span>
  <span id="line25">25.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line25">25.                  { 0, 0, 0, 0 } },</span>
  <span id="line26">26.  </span>
+
  <span id="line26">26. </span>
  <span id="line27">27.    bar_abil[] = { { 1, &(HPoison_resistance), "", "" },</span>
+
  <span id="line27">27.  bar_abil[] = { { 1, &(HPoison_resistance), "", "" },</span>
  <span id="line28">28.                  { 7, &(HFast), "quick", "slow" },</span>
+
  <span id="line28">28.                  { 7, &(HFast), "quick", "slow" },</span>
  <span id="line29">29.                  { 15, &(HStealth), "stealthy", "" },</span>
+
  <span id="line29">29.                  { 15, &(HStealth), "stealthy", "" },</span>
  <span id="line30">30.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line30">30.                  { 0, 0, 0, 0 } },</span>
  <span id="line31">31.  </span>
+
  <span id="line31">31. </span>
  <span id="line32">32.    cav_abil[] = { { 7, &(HFast), "quick", "slow" },</span>
+
  <span id="line32">32.  cav_abil[] = { { 7, &(HFast), "quick", "slow" },</span>
  <span id="line33">33.                  { 15, &(HWarning), "sensitive", "" },</span>
+
  <span id="line33">33.                  { 15, &(HWarning), "sensitive", "" },</span>
  <span id="line34">34.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line34">34.                  { 0, 0, 0, 0 } },</span>
  <span id="line35">35.  </span>
+
  <span id="line35">35. </span>
  <span id="line36">36.    hea_abil[] = { { 1, &(HPoison_resistance), "", "" },</span>
+
  <span id="line36">36.  hea_abil[] = { { 1, &(HPoison_resistance), "", "" },</span>
  <span id="line37">37.                  { 15, &(HWarning), "sensitive", "" },</span>
+
  <span id="line37">37.                  { 15, &(HWarning), "sensitive", "" },</span>
  <span id="line38">38.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line38">38.                  { 0, 0, 0, 0 } },</span>
  <span id="line39">39.  </span>
+
  <span id="line39">39. </span>
  <span id="line40">40.    kni_abil[] = { { 7, &(HFast), "quick", "slow" }, { 0, 0, 0, 0 } },</span>
+
  <span id="line40">40.  kni_abil[] = { { 7, &(HFast), "quick", "slow" }, { 0, 0, 0, 0 } },</span>
  <span id="line41">41.  </span>
+
  <span id="line41">41. </span>
  <span id="line42">42.    mon_abil[] = { { 1, &(HFast), "", "" },</span>
+
  <span id="line42">42.  mon_abil[] = { { 1, &(HFast), "", "" },</span>
  <span id="line43">43.                  { 1, &(HSleep_resistance), "", "" },</span>
+
  <span id="line43">43.                  { 1, &(HSleep_resistance), "", "" },</span>
  <span id="line44">44.                  { 1, &(HSee_invisible), "", "" },</span>
+
  <span id="line44">44.                  { 1, &(HSee_invisible), "", "" },</span>
  <span id="line45">45.                  { 3, &(HPoison_resistance), "healthy", "" },</span>
+
  <span id="line45">45.                  { 3, &(HPoison_resistance), "healthy", "" },</span>
  <span id="line46">46.                  { 5, &(HStealth), "stealthy", "" },</span>
+
  <span id="line46">46.                  { 5, &(HStealth), "stealthy", "" },</span>
  <span id="line47">47.                  { 7, &(HWarning), "sensitive", "" },</span>
+
  <span id="line47">47.                  { 7, &(HWarning), "sensitive", "" },</span>
  <span id="line48">48.                  { 9, &(HSearching), "perceptive", "unaware" },</span>
+
  <span id="line48">48.                  { 9, &(HSearching), "perceptive", "unaware" },</span>
  <span id="line49">49.                  { 11, &(HFire_resistance), "cool", "warmer" },</span>
+
  <span id="line49">49.                  { 11, &(HFire_resistance), "cool", "warmer" },</span>
  <span id="line50">50.                  { 13, &(HCold_resistance), "warm", "cooler" },</span>
+
  <span id="line50">50.                  { 13, &(HCold_resistance), "warm", "cooler" },</span>
  <span id="line51">51.                  { 15, &(HShock_resistance), "insulated", "conductive" },</span>
+
  <span id="line51">51.                  { 15, &(HShock_resistance), "insulated", "conductive" },</span>
  <span id="line52">52.                  { 17, &(HTeleport_control), "controlled", "uncontrolled" },</span>
+
  <span id="line52">52.                  { 17, &(HTeleport_control), "controlled", "uncontrolled" },</span>
  <span id="line53">53.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line53">53.                  { 0, 0, 0, 0 } },</span>
  <span id="line54">54.  </span>
+
  <span id="line54">54. </span>
  <span id="line55">55.    pri_abil[] = { { 15, &(HWarning), "sensitive", "" },</span>
+
  <span id="line55">55.  pri_abil[] = { { 15, &(HWarning), "sensitive", "" },</span>
  <span id="line56">56.                  { 20, &(HFire_resistance), "cool", "warmer" },</span>
+
  <span id="line56">56.                  { 20, &(HFire_resistance), "cool", "warmer" },</span>
  <span id="line57">57.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line57">57.                  { 0, 0, 0, 0 } },</span>
  <span id="line58">58.  </span>
+
  <span id="line58">58. </span>
  <span id="line59">59.    ran_abil[] = { { 1, &(HSearching), "", "" },</span>
+
  <span id="line59">59.  ran_abil[] = { { 1, &(HSearching), "", "" },</span>
  <span id="line60">60.                  { 7, &(HStealth), "stealthy", "" },</span>
+
  <span id="line60">60.                  { 7, &(HStealth), "stealthy", "" },</span>
  <span id="line61">61.                  { 15, &(HSee_invisible), "", "" },</span>
+
  <span id="line61">61.                  { 15, &(HSee_invisible), "", "" },</span>
  <span id="line62">62.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line62">62.                  { 0, 0, 0, 0 } },</span>
  <span id="line63">63.  </span>
+
  <span id="line63">63. </span>
  <span id="line64">64.    rog_abil[] = { { 1, &(HStealth), "", "" },</span>
+
  <span id="line64">64.  rog_abil[] = { { 1, &(HStealth), "", "" },</span>
  <span id="line65">65.                  { 10, &(HSearching), "perceptive", "" },</span>
+
  <span id="line65">65.                  { 10, &(HSearching), "perceptive", "" },</span>
  <span id="line66">66.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line66">66.                  { 0, 0, 0, 0 } },</span>
  <span id="line67">67.  </span>
+
  <span id="line67">67. </span>
  <span id="line68">68.    sam_abil[] = { { 1, &(HFast), "", "" },</span>
+
  <span id="line68">68.  sam_abil[] = { { 1, &(HFast), "", "" },</span>
  <span id="line69">69.                  { 15, &(HStealth), "stealthy", "" },</span>
+
  <span id="line69">69.                  { 15, &(HStealth), "stealthy", "" },</span>
  <span id="line70">70.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line70">70.                  { 0, 0, 0, 0 } },</span>
  <span id="line71">71.  </span>
+
  <span id="line71">71. </span>
  <span id="line72">72.    tou_abil[] = { { 10, &(HSearching), "perceptive", "" },</span>
+
  <span id="line72">72.  tou_abil[] = { { 10, &(HSearching), "perceptive", "" },</span>
  <span id="line73">73.                  { 20, &(HPoison_resistance), "hardy", "" },</span>
+
  <span id="line73">73.                  { 20, &(HPoison_resistance), "hardy", "" },</span>
  <span id="line74">74.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line74">74.                  { 0, 0, 0, 0 } },</span>
  <span id="line75">75.  </span>
+
  <span id="line75">75. </span>
  <span id="line76">76.    val_abil[] = { { 1, &(HCold_resistance), "", "" },</span>
+
  <span id="line76">76.  val_abil[] = { { 1, &(HCold_resistance), "", "" },</span>
  <span id="line77">77.                  { 1, &(HStealth), "", "" },</span>
+
  <span id="line77">77.                  { 1, &(HStealth), "", "" },</span>
  <span id="line78">78.                  { 7, &(HFast), "quick", "slow" },</span>
+
  <span id="line78">78.                  { 7, &(HFast), "quick", "slow" },</span>
  <span id="line79">79.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line79">79.                  { 0, 0, 0, 0 } },</span>
  <span id="line80">80.  </span>
+
  <span id="line80">80. </span>
  <span id="line81">81.    wiz_abil[] = { { 15, &(HWarning), "sensitive", "" },</span>
+
  <span id="line81">81.  wiz_abil[] = { { 15, &(HWarning), "sensitive", "" },</span>
  <span id="line82">82.                  { 17, &(HTeleport_control), "controlled", "uncontrolled" },</span>
+
  <span id="line82">82.                  { 17, &(HTeleport_control), "controlled", "uncontrolled" },</span>
  <span id="line83">83.                  { 0, 0, 0, 0 } },</span>
+
  <span id="line83">83.                  { 0, 0, 0, 0 } },</span>
  <span id="line84">84.  </span>
+
  <span id="line84">84. </span>
  <span id="line85">85.    /* Intrinsics conferred by race */</span>
+
  <span id="line85">85.  /* Intrinsics conferred by race */</span>
  <span id="line86">86.      elf_abil[] = { { 4, &(HSleep_resistance), "awake", "tired" },</span>
+
  <span id="line86">86.    elf_abil[] = { { 4, &(HSleep_resistance), "awake", "tired" },</span>
  <span id="line87">87.                    { 0, 0, 0, 0 } },</span>
+
  <span id="line87">87.                    { 0, 0, 0, 0 } },</span>
  <span id="line88">88.  </span>
+
  <span id="line88">88. </span>
  <span id="line89">89.    orc_abil[] = { { 1, &(HPoison_resistance), "", "" }, { 0, 0, 0, 0 } };</span>
+
  <span id="line89">89.  orc_abil[] = { { 1, &(HPoison_resistance), "", "" }, { 0, 0, 0, 0 } };</span>
  <span id="line90">90.  </span>
+
  <span id="line90">90. </span>
  <span id="line91">91.  STATIC_DCL void NDECL(exerper);</span>
+
  <span id="line91">91. STATIC_DCL void NDECL(exerper);</span>
  <span id="line92">92.  STATIC_DCL void FDECL(postadjabil, (long *));</span>
+
  <span id="line92">92. STATIC_DCL void FDECL(postadjabil, (long *));</span>
  <span id="line93">93.  STATIC_DCL const struct innate *FDECL(check_innate_abil, (long *, long));</span>
+
  <span id="line93">93. STATIC_DCL const struct innate *FDECL(check_innate_abil, (long *, long));</span>
  <span id="line94">94.  STATIC_DCL int FDECL(innately, (long *));</span>
+
  <span id="line94">94. STATIC_DCL int FDECL(innately, (long *));</span>
  <span id="line95">95.  </span>
+
  <span id="line95">95. </span>
  
 
== adjattrib ==
 
== adjattrib ==
 
       
 
       
  <span id="line96">96.  /* adjust an attribute; return TRUE if change is made, FALSE otherwise */</span>
+
  <span id="line96">96. /* adjust an attribute; return TRUE if change is made, FALSE otherwise */</span>
  <span id="line97">97.  boolean</span>
+
  <span id="line97">97. boolean</span>
  <span id="line98">98.  adjattrib(ndx, incr, msgflg)</span>
+
  <span id="line98">98. adjattrib(ndx, incr, msgflg)</span>
  <span id="line99">99.  int ndx, incr;</span>
+
  <span id="line99">99. int ndx, incr;</span>
  <span id="line100">100.  int msgflg; /* positive => no message, zero => message, and */</span>
+
  <span id="line100">100. int msgflg; /* positive => no message, zero => message, and */</span>
  <span id="line101">101.  {          /* negative => conditional (msg if change made) */</span>
+
  <span id="line101">101. {          /* negative => conditional (msg if change made) */</span>
  <span id="line102">102.      int old_acurr;</span>
+
  <span id="line102">102.    int old_acurr;</span>
  <span id="line103">103.      boolean abonflg;</span>
+
  <span id="line103">103.    boolean abonflg;</span>
  <span id="line104">104.      const char *attrstr;</span>
+
  <span id="line104">104.    const char *attrstr;</span>
  <span id="line105">105.  </span>
+
  <span id="line105">105. </span>
  <span id="line106">106.      if (Fixed_abil || !incr)</span>
+
  <span id="line106">106.    if (Fixed_abil || !incr)</span>
  <span id="line107">107.          return FALSE;</span>
+
  <span id="line107">107.        return FALSE;</span>
  <span id="line108">108.  </span>
+
  <span id="line108">108. </span>
  <span id="line109">109.      if ((ndx == A_INT || ndx == A_WIS) && uarmh && uarmh->otyp == DUNCE_CAP) {</span>
+
  <span id="line109">109.    if ((ndx == A_INT || ndx == A_WIS) && uarmh && uarmh->otyp == DUNCE_CAP) {</span>
  <span id="line110">110.          if (msgflg == 0)</span>
+
  <span id="line110">110.        if (msgflg == 0)</span>
  <span id="line111">111.              Your("cap constricts briefly, then relaxes again.");</span>
+
  <span id="line111">111.            Your("cap constricts briefly, then relaxes again.");</span>
  <span id="line112">112.          return FALSE;</span>
+
  <span id="line112">112.        return FALSE;</span>
  <span id="line113">113.      }</span>
+
  <span id="line113">113.    }</span>
  <span id="line114">114.  </span>
+
  <span id="line114">114. </span>
  <span id="line115">115.      old_acurr = ACURR(ndx);</span>
+
  <span id="line115">115.    old_acurr = ACURR(ndx);</span>
  <span id="line116">116.      if (incr > 0) {</span>
+
  <span id="line116">116.    if (incr > 0) {</span>
  <span id="line117">117.          ABASE(ndx) += incr;</span>
+
  <span id="line117">117.        ABASE(ndx) += incr;</span>
  <span id="line118">118.          if (ABASE(ndx) > AMAX(ndx)) {</span>
+
  <span id="line118">118.        if (ABASE(ndx) > AMAX(ndx)) {</span>
  <span id="line119">119.              incr = ABASE(ndx) - AMAX(ndx);</span>
+
  <span id="line119">119.            incr = ABASE(ndx) - AMAX(ndx);</span>
  <span id="line120">120.              AMAX(ndx) += incr;</span>
+
  <span id="line120">120.            AMAX(ndx) += incr;</span>
  <span id="line121">121.              if (AMAX(ndx) > ATTRMAX(ndx))</span>
+
  <span id="line121">121.            if (AMAX(ndx) > ATTRMAX(ndx))</span>
  <span id="line122">122.                  AMAX(ndx) = ATTRMAX(ndx);</span>
+
  <span id="line122">122.                AMAX(ndx) = ATTRMAX(ndx);</span>
  <span id="line123">123.              ABASE(ndx) = AMAX(ndx);</span>
+
  <span id="line123">123.            ABASE(ndx) = AMAX(ndx);</span>
  <span id="line124">124.          }</span>
+
  <span id="line124">124.        }</span>
  <span id="line125">125.          attrstr = plusattr[ndx];</span>
+
  <span id="line125">125.        attrstr = plusattr[ndx];</span>
  <span id="line126">126.          abonflg = (ABON(ndx) < 0);</span>
+
  <span id="line126">126.        abonflg = (ABON(ndx) < 0);</span>
  <span id="line127">127.      } else {</span>
+
  <span id="line127">127.    } else {</span>
  <span id="line128">128.          ABASE(ndx) += incr;</span>
+
  <span id="line128">128.        ABASE(ndx) += incr;</span>
  <span id="line129">129.          if (ABASE(ndx) < ATTRMIN(ndx)) {</span>
+
  <span id="line129">129.        if (ABASE(ndx) < ATTRMIN(ndx)) {</span>
  <span id="line130">130.              incr = ABASE(ndx) - ATTRMIN(ndx);</span>
+
  <span id="line130">130.            incr = ABASE(ndx) - ATTRMIN(ndx);</span>
  <span id="line131">131.              ABASE(ndx) = ATTRMIN(ndx);</span>
+
  <span id="line131">131.            ABASE(ndx) = ATTRMIN(ndx);</span>
  <span id="line132">132.              AMAX(ndx) += incr;</span>
+
  <span id="line132">132.            AMAX(ndx) += incr;</span>
  <span id="line133">133.              if (AMAX(ndx) < ATTRMIN(ndx))</span>
+
  <span id="line133">133.            if (AMAX(ndx) < ATTRMIN(ndx))</span>
  <span id="line134">134.                  AMAX(ndx) = ATTRMIN(ndx);</span>
+
  <span id="line134">134.                AMAX(ndx) = ATTRMIN(ndx);</span>
  <span id="line135">135.          }</span>
+
  <span id="line135">135.        }</span>
  <span id="line136">136.          attrstr = minusattr[ndx];</span>
+
  <span id="line136">136.        attrstr = minusattr[ndx];</span>
  <span id="line137">137.          abonflg = (ABON(ndx) > 0);</span>
+
  <span id="line137">137.        abonflg = (ABON(ndx) > 0);</span>
  <span id="line138">138.      }</span>
+
  <span id="line138">138.    }</span>
  <span id="line139">139.      if (ACURR(ndx) == old_acurr) {</span>
+
  <span id="line139">139.    if (ACURR(ndx) == old_acurr) {</span>
  <span id="line140">140.          if (msgflg == 0 && flags.verbose)</span>
+
  <span id="line140">140.        if (msgflg == 0 && flags.verbose)</span>
  <span id="line141">141.              pline("You're %s as %s as you can get.",</span>
+
  <span id="line141">141.            pline("You're %s as %s as you can get.",</span>
  <span id="line142">142.                    abonflg ? "currently" : "already", attrstr);</span>
+
  <span id="line142">142.                  abonflg ? "currently" : "already", attrstr);</span>
  <span id="line143">143.          return FALSE;</span>
+
  <span id="line143">143.        return FALSE;</span>
  <span id="line144">144.      }</span>
+
  <span id="line144">144.    }</span>
  <span id="line145">145.  </span>
+
  <span id="line145">145. </span>
  <span id="line146">146.      if (msgflg <= 0)</span>
+
  <span id="line146">146.    if (msgflg <= 0)</span>
  <span id="line147">147.          You_feel("%s%s!", (incr > 1 || incr < -1) ? "very " : "", attrstr);</span>
+
  <span id="line147">147.        You_feel("%s%s!", (incr > 1 || incr < -1) ? "very " : "", attrstr);</span>
  <span id="line148">148.      context.botl = 1;</span>
+
  <span id="line148">148.    context.botl = 1;</span>
  <span id="line149">149.      if (moves > 1 && (ndx == A_STR || ndx == A_CON))</span>
+
  <span id="line149">149.    if (moves > 1 && (ndx == A_STR || ndx == A_CON))</span>
  <span id="line150">150.          (void) encumber_msg();</span>
+
  <span id="line150">150.        (void) encumber_msg();</span>
  <span id="line151">151.      return TRUE;</span>
+
  <span id="line151">151.    return TRUE;</span>
  <span id="line152">152.  }</span>
+
  <span id="line152">152. }</span>
  <span id="line153">153.  </span>
+
  <span id="line153">153. </span>
  
 
== gainstr ==
 
== gainstr ==
 
       
 
       
  <span id="line154">154.  void</span>
+
  <span id="line154">154. void</span>
  <span id="line155">155.  gainstr(otmp, incr, givemsg)</span>
+
  <span id="line155">155. gainstr(otmp, incr, givemsg)</span>
  <span id="line156">156.  struct obj *otmp;</span>
+
  <span id="line156">156. struct obj *otmp;</span>
  <span id="line157">157.  int incr;</span>
+
  <span id="line157">157. int incr;</span>
  <span id="line158">158.  boolean givemsg;</span>
+
  <span id="line158">158. boolean givemsg;</span>
  <span id="line159">159.  {</span>
+
  <span id="line159">159. {</span>
  <span id="line160">160.      int num = incr;</span>
+
  <span id="line160">160.    int num = incr;</span>
  <span id="line161">161.  </span>
+
  <span id="line161">161. </span>
  <span id="line162">162.      if (!num) {</span>
+
  <span id="line162">162.    if (!num) {</span>
  <span id="line163">163.          if (ABASE(A_STR) < 18)</span>
+
  <span id="line163">163.        if (ABASE(A_STR) < 18)</span>
  <span id="line164">164.              num = (rn2(4) ? 1 : rnd(6));</span>
+
  <span id="line164">164.            num = (rn2(4) ? 1 : rnd(6));</span>
  <span id="line165">165.          else if (ABASE(A_STR) < STR18(85))</span>
+
  <span id="line165">165.        else if (ABASE(A_STR) < STR18(85))</span>
  <span id="line166">166.              num = rnd(10);</span>
+
  <span id="line166">166.            num = rnd(10);</span>
  <span id="line167">167.          else</span>
+
  <span id="line167">167.        else</span>
  <span id="line168">168.              num = 1;</span>
+
  <span id="line168">168.            num = 1;</span>
  <span id="line169">169.      }</span>
+
  <span id="line169">169.    }</span>
  <span id="line170">170.      (void) adjattrib(A_STR, (otmp && otmp->cursed) ? -num : num,</span>
+
  <span id="line170">170.    (void) adjattrib(A_STR, (otmp && otmp->cursed) ? -num : num,</span>
  <span id="line171">171.                      givemsg ? -1 : 1);</span>
+
  <span id="line171">171.                      givemsg ? -1 : 1);</span>
  <span id="line172">172.  }</span>
+
  <span id="line172">172. }</span>
  <span id="line173">173.  </span>
+
  <span id="line173">173. </span>
  
 
== losestr ==
 
== losestr ==
 
       
 
       
  <span id="line174">174.  /* may kill you; cause may be poison or monster like 'a' */</span>
+
  <span id="line174">174. /* may kill you; cause may be poison or monster like 'a' */</span>
  <span id="line175">175.  void</span>
+
  <span id="line175">175. void</span>
  <span id="line176">176.  losestr(num)</span>
+
  <span id="line176">176. losestr(num)</span>
  <span id="line177">177.  register int num;</span>
+
  <span id="line177">177. register int num;</span>
  <span id="line178">178.  {</span>
+
  <span id="line178">178. {</span>
  <span id="line179">179.      int ustr = ABASE(A_STR) - num;</span>
+
  <span id="line179">179.    int ustr = ABASE(A_STR) - num;</span>
  <span id="line180">180.  </span>
+
  <span id="line180">180. </span>
  <span id="line181">181.      while (ustr < 3) {</span>
+
  <span id="line181">181.    while (ustr < 3) {</span>
  <span id="line182">182.          ++ustr;</span>
+
  <span id="line182">182.        ++ustr;</span>
  <span id="line183">183.          --num;</span>
+
  <span id="line183">183.        --num;</span>
  <span id="line184">184.          if (Upolyd) {</span>
+
  <span id="line184">184.        if (Upolyd) {</span>
  <span id="line185">185.              u.mh -= 6;</span>
+
  <span id="line185">185.            u.mh -= 6;</span>
  <span id="line186">186.              u.mhmax -= 6;</span>
+
  <span id="line186">186.            u.mhmax -= 6;</span>
  <span id="line187">187.          } else {</span>
+
  <span id="line187">187.        } else {</span>
  <span id="line188">188.              u.uhp -= 6;</span>
+
  <span id="line188">188.            u.uhp -= 6;</span>
  <span id="line189">189.              u.uhpmax -= 6;</span>
+
  <span id="line189">189.            u.uhpmax -= 6;</span>
  <span id="line190">190.          }</span>
+
  <span id="line190">190.        }</span>
  <span id="line191">191.      }</span>
+
  <span id="line191">191.    }</span>
  <span id="line192">192.      (void) adjattrib(A_STR, -num, 1);</span>
+
  <span id="line192">192.    (void) adjattrib(A_STR, -num, 1);</span>
  <span id="line193">193.  }</span>
+
  <span id="line193">193. }</span>
  <span id="line194">194.  </span>
+
  <span id="line194">194. </span>
  
 
== poisontell ==
 
== poisontell ==
 
       
 
       
  <span id="line195">195.  static const struct poison_effect_message {</span>
+
  <span id="line195">195. static const struct poison_effect_message {</span>
  <span id="line196">196.      void VDECL((*delivery_func), (const char *, ...));</span>
+
  <span id="line196">196.    void VDECL((*delivery_func), (const char *, ...));</span>
  <span id="line197">197.      const char *effect_msg;</span>
+
  <span id="line197">197.    const char *effect_msg;</span>
  <span id="line198">198.  } poiseff[] = {</span>
+
  <span id="line198">198. } poiseff[] = {</span>
  <span id="line199">199.      { You_feel, "weaker" },            /* A_STR */</span>
+
  <span id="line199">199.    { You_feel, "weaker" },            /* A_STR */</span>
  <span id="line200">200.      { Your, "brain is on fire" },      /* A_INT */</span>
+
  <span id="line200">200.    { Your, "brain is on fire" },      /* A_INT */</span>
  <span id="line201">201.      { Your, "judgement is impaired" },  /* A_WIS */</span>
+
  <span id="line201">201.    { Your, "judgement is impaired" },  /* A_WIS */</span>
  <span id="line202">202.      { Your, "muscles won't obey you" }, /* A_DEX */</span>
+
  <span id="line202">202.    { Your, "muscles won't obey you" }, /* A_DEX */</span>
  <span id="line203">203.      { You_feel, "very sick" },          /* A_CON */</span>
+
  <span id="line203">203.    { You_feel, "very sick" },          /* A_CON */</span>
  <span id="line204">204.      { You, "break out in hives" }      /* A_CHA */</span>
+
  <span id="line204">204.    { You, "break out in hives" }      /* A_CHA */</span>
  <span id="line205">205.  };</span>
+
  <span id="line205">205. };</span>
  <span id="line206">206.  </span>
+
  <span id="line206">206. </span>
  <span id="line207">207.  /* feedback for attribute loss due to poisoning */</span>
+
  <span id="line207">207. /* feedback for attribute loss due to poisoning */</span>
  <span id="line208">208.  void</span>
+
  <span id="line208">208. void</span>
  <span id="line209">209.  poisontell(typ, exclaim)</span>
+
  <span id="line209">209. poisontell(typ, exclaim)</span>
  <span id="line210">210.  int typ;        /* which attribute */</span>
+
  <span id="line210">210. int typ;        /* which attribute */</span>
  <span id="line211">211.  boolean exclaim; /* emphasis */</span>
+
  <span id="line211">211. boolean exclaim; /* emphasis */</span>
  <span id="line212">212.  {</span>
+
  <span id="line212">212. {</span>
  <span id="line213">213.      void VDECL((*func), (const char *, ...)) = poiseff[typ].delivery_func;</span>
+
  <span id="line213">213.    void VDECL((*func), (const char *, ...)) = poiseff[typ].delivery_func;</span>
  <span id="line214">214.  </span>
+
  <span id="line214">214. </span>
  <span id="line215">215.      (*func)("%s%c", poiseff[typ].effect_msg, exclaim ? '!' : '.');</span>
+
  <span id="line215">215.    (*func)("%s%c", poiseff[typ].effect_msg, exclaim ? '!' : '.');</span>
  <span id="line216">216.  }</span>
+
  <span id="line216">216. }</span>
  <span id="line217">217.  </span>
+
  <span id="line217">217. </span>
  
 
== poisoned ==
 
== poisoned ==
 
 
  <span id="line218">218.  /* called when an attack or trap has poisoned the hero (used to be in mon.c)</span>
+
  <span id="line218">218. /* called when an attack or trap has poisoned the hero (used to be in mon.c)</span>
  <span id="line219">219.  */</span>
+
  <span id="line219">219.  */</span>
  <span id="line220">220.  void</span>
+
  <span id="line220">220. void</span>
  <span id="line221">221.  poisoned(reason, typ, pkiller, fatal, thrown_weapon)</span>
+
  <span id="line221">221. poisoned(reason, typ, pkiller, fatal, thrown_weapon)</span>
  <span id="line222">222.  const char *reason,    /* controls what messages we display */</span>
+
  <span id="line222">222. const char *reason,    /* controls what messages we display */</span>
  <span id="line223">223.      *pkiller;          /* for score+log file if fatal */</span>
+
  <span id="line223">223.    *pkiller;          /* for score+log file if fatal */</span>
  <span id="line224">224.  int typ, fatal;        /* if fatal is 0, limit damage to adjattrib */</span>
+
  <span id="line224">224. int typ, fatal;        /* if fatal is 0, limit damage to adjattrib */</span>
  <span id="line225">225.  boolean thrown_weapon; /* thrown weapons are less deadly */</span>
+
  <span id="line225">225. boolean thrown_weapon; /* thrown weapons are less deadly */</span>
  <span id="line226">226.  {</span>
+
  <span id="line226">226. {</span>
  <span id="line227">227.      int i, loss, kprefix = KILLED_BY_AN;</span>
+
  <span id="line227">227.    int i, loss, kprefix = KILLED_BY_AN;</span>
  <span id="line228">228.  </span>
+
  <span id="line228">228. </span>
  <span id="line229">229.      /* inform player about being poisoned unless that's already been done;</span>
+
  <span id="line229">229.    /* inform player about being poisoned unless that's already been done;</span>
  <span id="line230">230.        "blast" has given a "blast of poison gas" message; "poison arrow",</span>
+
  <span id="line230">230.        "blast" has given a "blast of poison gas" message; "poison arrow",</span>
  <span id="line231">231.        "poison dart", etc have implicitly given poison messages too... */</span>
+
  <span id="line231">231.        "poison dart", etc have implicitly given poison messages too... */</span>
  <span id="line232">232.      if (strcmp(reason, "blast") && !strstri(reason, "poison")) {</span>
+
  <span id="line232">232.    if (strcmp(reason, "blast") && !strstri(reason, "poison")) {</span>
  <span id="line233">233.          boolean plural = (reason[strlen(reason) - 1] == 's') ? 1 : 0;</span>
+
  <span id="line233">233.        boolean plural = (reason[strlen(reason) - 1] == 's') ? 1 : 0;</span>
  <span id="line234">234.  </span>
+
  <span id="line234">234. </span>
  <span id="line235">235.          /* avoid "The" Orcus's sting was poisoned... */</span>
+
  <span id="line235">235.        /* avoid "The" Orcus's sting was poisoned... */</span>
  <span id="line236">236.          pline("%s%s %s poisoned!", isupper(*reason) ? "" : "The ", reason,</span>
+
  <span id="line236">236.        pline("%s%s %s poisoned!", isupper(*reason) ? "" : "The ", reason,</span>
  <span id="line237">237.                plural ? "were" : "was");</span>
+
  <span id="line237">237.              plural ? "were" : "was");</span>
  <span id="line238">238.      }</span>
+
  <span id="line238">238.    }</span>
  <span id="line239">239.      if (Poison_resistance) {</span>
+
  <span id="line239">239.    if (Poison_resistance) {</span>
  <span id="line240">240.          if (!strcmp(reason, "blast"))</span>
+
  <span id="line240">240.        if (!strcmp(reason, "blast"))</span>
  <span id="line241">241.              shieldeff(u.ux, u.uy);</span>
+
  <span id="line241">241.            shieldeff(u.ux, u.uy);</span>
  <span id="line242">242.          pline_The("poison doesn't seem to affect you.");</span>
+
  <span id="line242">242.        pline_The("poison doesn't seem to affect you.");</span>
  <span id="line243">243.          return;</span>
+
  <span id="line243">243.        return;</span>
  <span id="line244">244.      }</span>
+
  <span id="line244">244.    }</span>
  <span id="line245">245.  </span>
+
  <span id="line245">245. </span>
  <span id="line246">246.      /* suppress killer prefix if it already has one */</span>
+
  <span id="line246">246.    /* suppress killer prefix if it already has one */</span>
  <span id="line247">247.      i = name_to_mon(pkiller);</span>
+
  <span id="line247">247.    i = name_to_mon(pkiller);</span>
  <span id="line248">248.      if (i >= LOW_PM && (mons[i].geno & G_UNIQ)) {</span>
+
  <span id="line248">248.    if (i >= LOW_PM && (mons[i].geno & G_UNIQ)) {</span>
  <span id="line249">249.          kprefix = KILLED_BY;</span>
+
  <span id="line249">249.        kprefix = KILLED_BY;</span>
  <span id="line250">250.          if (!type_is_pname(&mons[i]))</span>
+
  <span id="line250">250.        if (!type_is_pname(&mons[i]))</span>
  <span id="line251">251.              pkiller = the(pkiller);</span>
+
  <span id="line251">251.            pkiller = the(pkiller);</span>
  <span id="line252">252.      } else if (!strncmpi(pkiller, "the ", 4) || !strncmpi(pkiller, "an ", 3)</span>
+
  <span id="line252">252.    } else if (!strncmpi(pkiller, "the ", 4) || !strncmpi(pkiller, "an ", 3)</span>
  <span id="line253">253.                || !strncmpi(pkiller, "a ", 2)) {</span>
+
  <span id="line253">253.                || !strncmpi(pkiller, "a ", 2)) {</span>
  <span id="line254">254.          /*[ does this need a plural check too? ]*/</span>
+
  <span id="line254">254.        /*[ does this need a plural check too? ]*/</span>
  <span id="line255">255.          kprefix = KILLED_BY;</span>
+
  <span id="line255">255.        kprefix = KILLED_BY;</span>
  <span id="line256">256.      }</span>
+
  <span id="line256">256.    }</span>
  <span id="line257">257.  </span>
+
  <span id="line257">257. </span>
  <span id="line258">258.      i = !fatal ? 1 : rn2(fatal + (thrown_weapon ? 20 : 0));</span>
+
  <span id="line258">258.    i = !fatal ? 1 : rn2(fatal + (thrown_weapon ? 20 : 0));</span>
  <span id="line259">259.      if (i == 0 && typ != A_CHA) {</span>
+
  <span id="line259">259.    if (i == 0 && typ != A_CHA) {</span>
  <span id="line260">260.          /* instant kill */</span>
+
  <span id="line260">260.        /* instant kill */</span>
  <span id="line261">261.          u.uhp = -1;</span>
+
  <span id="line261">261.        u.uhp = -1;</span>
  <span id="line262">262.          pline_The("poison was deadly...");</span>
+
  <span id="line262">262.        pline_The("poison was deadly...");</span>
  <span id="line263">263.      } else if (i > 5) {</span>
+
  <span id="line263">263.    } else if (i > 5) {</span>
  <span id="line264">264.          /* HP damage; more likely--but less severe--with missiles */</span>
+
  <span id="line264">264.        /* HP damage; more likely--but less severe--with missiles */</span>
  <span id="line265">265.          loss = thrown_weapon ? rnd(6) : rn1(10, 6);</span>
+
  <span id="line265">265.        loss = thrown_weapon ? rnd(6) : rn1(10, 6);</span>
  <span id="line266">266.          losehp(loss, pkiller, kprefix); /* poison damage */</span>
+
  <span id="line266">266.        losehp(loss, pkiller, kprefix); /* poison damage */</span>
  <span id="line267">267.      } else {</span>
+
  <span id="line267">267.    } else {</span>
  <span id="line268">268.          /* attribute loss; if typ is A_STR, reduction in current and</span>
+
  <span id="line268">268.        /* attribute loss; if typ is A_STR, reduction in current and</span>
  <span id="line269">269.            maximum HP will occur once strength has dropped down to 3 */</span>
+
  <span id="line269">269.            maximum HP will occur once strength has dropped down to 3 */</span>
  <span id="line270">270.          loss = (thrown_weapon || !fatal) ? 1 : d(2, 2); /* was rn1(3,3) */</span>
+
  <span id="line270">270.        loss = (thrown_weapon || !fatal) ? 1 : d(2, 2); /* was rn1(3,3) */</span>
  <span id="line271">271.          /* check that a stat change was made */</span>
+
  <span id="line271">271.        /* check that a stat change was made */</span>
  <span id="line272">272.          if (adjattrib(typ, -loss, 1))</span>
+
  <span id="line272">272.        if (adjattrib(typ, -loss, 1))</span>
  <span id="line273">273.              poisontell(typ, TRUE);</span>
+
  <span id="line273">273.            poisontell(typ, TRUE);</span>
  <span id="line274">274.      }</span>
+
  <span id="line274">274.    }</span>
  <span id="line275">275.  </span>
+
  <span id="line275">275. </span>
  <span id="line276">276.      if (u.uhp < 1) {</span>
+
  <span id="line276">276.    if (u.uhp < 1) {</span>
  <span id="line277">277.          killer.format = kprefix;</span>
+
  <span id="line277">277.        killer.format = kprefix;</span>
  <span id="line278">278.          Strcpy(killer.name, pkiller);</span>
+
  <span id="line278">278.        Strcpy(killer.name, pkiller);</span>
  <span id="line279">279.          /* "Poisoned by a poisoned ___" is redundant */</span>
+
  <span id="line279">279.        /* "Poisoned by a poisoned ___" is redundant */</span>
  <span id="line280">280.          done(strstri(pkiller, "poison") ? DIED : POISONING);</span>
+
  <span id="line280">280.        done(strstri(pkiller, "poison") ? DIED : POISONING);</span>
  <span id="line281">281.      }</span>
+
  <span id="line281">281.    }</span>
  <span id="line282">282.      (void) encumber_msg();</span>
+
  <span id="line282">282.    (void) encumber_msg();</span>
  <span id="line283">283.  }</span>
+
  <span id="line283">283. }</span>
  <span id="line284">284.  </span>
+
  <span id="line284">284. </span>
  
 
== change_luck ==
 
== change_luck ==
 
 
  <span id="line285">285.  void</span>
+
  <span id="line285">285. void</span>
  <span id="line286">286.  change_luck(n)</span>
+
  <span id="line286">286. change_luck(n)</span>
  <span id="line287">287.  register schar n;</span>
+
  <span id="line287">287. register schar n;</span>
  <span id="line288">288.  {</span>
+
  <span id="line288">288. {</span>
  <span id="line289">289.      u.uluck += n;</span>
+
  <span id="line289">289.    u.uluck += n;</span>
  <span id="line290">290.      if (u.uluck < 0 && u.uluck < LUCKMIN)</span>
+
  <span id="line290">290.    if (u.uluck < 0 && u.uluck < LUCKMIN)</span>
  <span id="line291">291.          u.uluck = LUCKMIN;</span>
+
  <span id="line291">291.        u.uluck = LUCKMIN;</span>
  <span id="line292">292.      if (u.uluck > 0 && u.uluck > LUCKMAX)</span>
+
  <span id="line292">292.    if (u.uluck > 0 && u.uluck > LUCKMAX)</span>
  <span id="line293">293.          u.uluck = LUCKMAX;</span>
+
  <span id="line293">293.        u.uluck = LUCKMAX;</span>
  <span id="line294">294.  }</span>
+
  <span id="line294">294. }</span>
  <span id="line295">295.  </span>
+
  <span id="line295">295. </span>
  
 
== stone_luck ==
 
== stone_luck ==
 
 
  <span id="line296">296.  int</span>
+
  <span id="line296">296. int</span>
  <span id="line297">297.  stone_luck(parameter)</span>
+
  <span id="line297">297. stone_luck(parameter)</span>
  <span id="line298">298.  boolean parameter; /* So I can't think up of a good name.  So sue me. --KAA */</span>
+
  <span id="line298">298. boolean parameter; /* So I can't think up of a good name.  So sue me. --KAA */</span>
  <span id="line299">299.  {</span>
+
  <span id="line299">299. {</span>
  <span id="line300">300.      register struct obj *otmp;</span>
+
  <span id="line300">300.    register struct obj *otmp;</span>
  <span id="line301">301.      register long bonchance = 0;</span>
+
  <span id="line301">301.    register long bonchance = 0;</span>
  <span id="line302">302.  </span>
+
  <span id="line302">302. </span>
  <span id="line303">303.      for (otmp = invent; otmp; otmp = otmp->nobj)</span>
+
  <span id="line303">303.    for (otmp = invent; otmp; otmp = otmp->nobj)</span>
  <span id="line304">304.          if (confers_luck(otmp)) {</span>
+
  <span id="line304">304.        if (confers_luck(otmp)) {</span>
  <span id="line305">305.              if (otmp->cursed)</span>
+
  <span id="line305">305.            if (otmp->cursed)</span>
  <span id="line306">306.                  bonchance -= otmp->quan;</span>
+
  <span id="line306">306.                bonchance -= otmp->quan;</span>
  <span id="line307">307.              else if (otmp->blessed)</span>
+
  <span id="line307">307.            else if (otmp->blessed)</span>
  <span id="line308">308.                  bonchance += otmp->quan;</span>
+
  <span id="line308">308.                bonchance += otmp->quan;</span>
  <span id="line309">309.              else if (parameter)</span>
+
  <span id="line309">309.            else if (parameter)</span>
  <span id="line310">310.                  bonchance += otmp->quan;</span>
+
  <span id="line310">310.                bonchance += otmp->quan;</span>
  <span id="line311">311.          }</span>
+
  <span id="line311">311.        }</span>
  <span id="line312">312.  </span>
+
  <span id="line312">312. </span>
  <span id="line313">313.      return sgn((int) bonchance);</span>
+
  <span id="line313">313.    return sgn((int) bonchance);</span>
  <span id="line314">314.  }</span>
+
  <span id="line314">314. }</span>
  <span id="line315">315.  </span>
+
  <span id="line315">315. </span>
  
 
== set_moreluck ==
 
== set_moreluck ==
 
 
  <span id="line316">316.  /* there has just been an inventory change affecting a luck-granting item */</span>
+
  <span id="line316">316. /* there has just been an inventory change affecting a luck-granting item */</span>
  <span id="line317">317.  void</span>
+
  <span id="line317">317. void</span>
  <span id="line318">318.  set_moreluck()</span>
+
  <span id="line318">318. set_moreluck()</span>
  <span id="line319">319.  {</span>
+
  <span id="line319">319. {</span>
  <span id="line320">320.      int luckbon = stone_luck(TRUE);</span>
+
  <span id="line320">320.    int luckbon = stone_luck(TRUE);</span>
  <span id="line321">321.  </span>
+
  <span id="line321">321. </span>
  <span id="line322">322.      if (!luckbon && !carrying(LUCKSTONE))</span>
+
  <span id="line322">322.    if (!luckbon && !carrying(LUCKSTONE))</span>
  <span id="line323">323.          u.moreluck = 0;</span>
+
  <span id="line323">323.        u.moreluck = 0;</span>
  <span id="line324">324.      else if (luckbon >= 0)</span>
+
  <span id="line324">324.    else if (luckbon >= 0)</span>
  <span id="line325">325.          u.moreluck = LUCKADD;</span>
+
  <span id="line325">325.        u.moreluck = LUCKADD;</span>
  <span id="line326">326.      else</span>
+
  <span id="line326">326.    else</span>
  <span id="line327">327.          u.moreluck = -LUCKADD;</span>
+
  <span id="line327">327.        u.moreluck = -LUCKADD;</span>
  <span id="line328">328.  }</span>
+
  <span id="line328">328. }</span>
  <span id="line329">329.  </span>
+
  <span id="line329">329. </span>
  
 
== restore_attrib ==
 
== restore_attrib ==
 
 
  <span id="line330">330.  void</span>
+
  <span id="line330">330. void</span>
  <span id="line331">331.  restore_attrib()</span>
+
  <span id="line331">331. restore_attrib()</span>
  <span id="line332">332.  {</span>
+
  <span id="line332">332. {</span>
  <span id="line333">333.      int i;</span>
+
  <span id="line333">333.    int i;</span>
  <span id="line334">334.  </span>
+
  <span id="line334">334. </span>
  <span id="line335">335.      for (i = 0; i < A_MAX; i++) { /* all temporary losses/gains */</span>
+
  <span id="line335">335.    for (i = 0; i < A_MAX; i++) { /* all temporary losses/gains */</span>
  <span id="line336">336.  </span>
+
  <span id="line336">336. </span>
  <span id="line337">337.          if (ATEMP(i) && ATIME(i)) {</span>
+
  <span id="line337">337.        if (ATEMP(i) && ATIME(i)) {</span>
  <span id="line338">338.              if (!(--(ATIME(i)))) { /* countdown for change */</span>
+
  <span id="line338">338.            if (!(--(ATIME(i)))) { /* countdown for change */</span>
  <span id="line339">339.                  ATEMP(i) += ATEMP(i) > 0 ? -1 : 1;</span>
+
  <span id="line339">339.                ATEMP(i) += ATEMP(i) > 0 ? -1 : 1;</span>
  <span id="line340">340.  </span>
+
  <span id="line340">340. </span>
  <span id="line341">341.                  if (ATEMP(i)) /* reset timer */</span>
+
  <span id="line341">341.                if (ATEMP(i)) /* reset timer */</span>
  <span id="line342">342.                      ATIME(i) = 100 / ACURR(A_CON);</span>
+
  <span id="line342">342.                    ATIME(i) = 100 / ACURR(A_CON);</span>
  <span id="line343">343.              }</span>
+
  <span id="line343">343.            }</span>
  <span id="line344">344.          }</span>
+
  <span id="line344">344.        }</span>
  <span id="line345">345.      }</span>
+
  <span id="line345">345.    }</span>
  <span id="line346">346.      (void) encumber_msg();</span>
+
  <span id="line346">346.    (void) encumber_msg();</span>
  <span id="line347">347.  }</span>
+
  <span id="line347">347. }</span>
  <span id="line348">348.  </span>
+
  <span id="line348">348. </span>
  
 
== exercise ==
 
== exercise ==
 
 
  <span id="line349">349.  #define AVAL 50 /* tune value for exercise gains */</span>
+
  <span id="line349">349. #define AVAL 50 /* tune value for exercise gains */</span>
  <span id="line350">350.  </span>
+
  <span id="line350">350. </span>
  <span id="line351">351.  void</span>
+
  <span id="line351">351. void</span>
  <span id="line352">352.  exercise(i, inc_or_dec)</span>
+
  <span id="line352">352. exercise(i, inc_or_dec)</span>
  <span id="line353">353.  int i;</span>
+
  <span id="line353">353. int i;</span>
  <span id="line354">354.  boolean inc_or_dec;</span>
+
  <span id="line354">354. boolean inc_or_dec;</span>
  <span id="line355">355.  {</span>
+
  <span id="line355">355. {</span>
  <span id="line356">356.      debugpline0("Exercise:");</span>
+
  <span id="line356">356.    debugpline0("Exercise:");</span>
  <span id="line357">357.      if (i == A_INT || i == A_CHA)</span>
+
  <span id="line357">357.    if (i == A_INT || i == A_CHA)</span>
  <span id="line358">358.          return; /* can't exercise these */</span>
+
  <span id="line358">358.        return; /* can't exercise these */</span>
  <span id="line359">359.  </span>
+
  <span id="line359">359. </span>
  <span id="line360">360.      /* no physical exercise while polymorphed; the body's temporary */</span>
+
  <span id="line360">360.    /* no physical exercise while polymorphed; the body's temporary */</span>
  <span id="line361">361.      if (Upolyd && i != A_WIS)</span>
+
  <span id="line361">361.    if (Upolyd && i != A_WIS)</span>
  <span id="line362">362.          return;</span>
+
  <span id="line362">362.        return;</span>
  <span id="line363">363.  </span>
+
  <span id="line363">363. </span>
  <span id="line364">364.      if (abs(AEXE(i)) < AVAL) {</span>
+
  <span id="line364">364.    if (abs(AEXE(i)) < AVAL) {</span>
  <span id="line365">365.          /*</span>
+
  <span id="line365">365.        /*</span>
  <span id="line366">366.          *      Law of diminishing returns (Part I):</span>
+
  <span id="line366">366.          *      Law of diminishing returns (Part I):</span>
  <span id="line367">367.          *</span>
+
  <span id="line367">367.          *</span>
  <span id="line368">368.          *      Gain is harder at higher attribute values.</span>
+
  <span id="line368">368.          *      Gain is harder at higher attribute values.</span>
  <span id="line369">369.          *      79% at "3" --> 0% at "18"</span>
+
  <span id="line369">369.          *      79% at "3" --> 0% at "18"</span>
  <span id="line370">370.          *      Loss is even at all levels (50%).</span>
+
  <span id="line370">370.          *      Loss is even at all levels (50%).</span>
  <span id="line371">371.          *</span>
+
  <span id="line371">371.          *</span>
  <span id="line372">372.          *      Note: *YES* ACURR is the right one to use.</span>
+
  <span id="line372">372.          *      Note: *YES* ACURR is the right one to use.</span>
  <span id="line373">373.          */</span>
+
  <span id="line373">373.          */</span>
  <span id="line374">374.          AEXE(i) += (inc_or_dec) ? (rn2(19) > ACURR(i)) : -rn2(2);</span>
+
  <span id="line374">374.        AEXE(i) += (inc_or_dec) ? (rn2(19) > ACURR(i)) : -rn2(2);</span>
  <span id="line375">375.          debugpline3("%s, %s AEXE = %d",</span>
+
  <span id="line375">375.        debugpline3("%s, %s AEXE = %d",</span>
  <span id="line376">376.                      (i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" : (i == A_DEX)</span>
+
  <span id="line376">376.                    (i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" : (i == A_DEX)</span>
  <span id="line377">377.                                                                        ? "Dex"</span>
+
  <span id="line377">377.                                                                      ? "Dex"</span>
  <span id="line378">378.                                                                        : "Con",</span>
+
  <span id="line378">378.                                                                      : "Con",</span>
  <span id="line379">379.                      (inc_or_dec) ? "inc" : "dec", AEXE(i));</span>
+
  <span id="line379">379.                    (inc_or_dec) ? "inc" : "dec", AEXE(i));</span>
  <span id="line380">380.      }</span>
+
  <span id="line380">380.    }</span>
  <span id="line381">381.      if (moves > 0 && (i == A_STR || i == A_CON))</span>
+
  <span id="line381">381.    if (moves > 0 && (i == A_STR || i == A_CON))</span>
  <span id="line382">382.          (void) encumber_msg();</span>
+
  <span id="line382">382.        (void) encumber_msg();</span>
  <span id="line383">383.  }</span>
+
  <span id="line383">383. }</span>
  <span id="line384">384.  </span>
+
  <span id="line384">384. </span>
  
 
== exerper ==
 
== exerper ==
 
 
  <span id="line385">385.  STATIC_OVL void</span>
+
  <span id="line385">385. STATIC_OVL void</span>
  <span id="line386">386.  exerper()</span>
+
  <span id="line386">386. exerper()</span>
  <span id="line387">387.  {</span>
+
  <span id="line387">387. {</span>
  <span id="line388">388.      if (!(moves % 10)) {</span>
+
  <span id="line388">388.    if (!(moves % 10)) {</span>
  <span id="line389">389.          /* Hunger Checks */</span>
+
  <span id="line389">389.        /* Hunger Checks */</span>
  <span id="line390">390.  </span>
+
  <span id="line390">390. </span>
  <span id="line391">391.          int hs = (u.uhunger > 1000) ? SATIATED : (u.uhunger > 150)</span>
+
  <span id="line391">391.        int hs = (u.uhunger > 1000) ? SATIATED : (u.uhunger > 150)</span>
  <span id="line392">392.                                                      ? NOT_HUNGRY</span>
+
  <span id="line392">392.                                                      ? NOT_HUNGRY</span>
  <span id="line393">393.                                                      : (u.uhunger > 50)</span>
+
  <span id="line393">393.                                                      : (u.uhunger > 50)</span>
  <span id="line394">394.                                                            ? HUNGRY</span>
+
  <span id="line394">394.                                                            ? HUNGRY</span>
  <span id="line395">395.                                                            : (u.uhunger > 0)</span>
+
  <span id="line395">395.                                                            : (u.uhunger > 0)</span>
  <span id="line396">396.                                                                  ? WEAK</span>
+
  <span id="line396">396.                                                                  ? WEAK</span>
  <span id="line397">397.                                                                  : FAINTING;</span>
+
  <span id="line397">397.                                                                  : FAINTING;</span>
  <span id="line398">398.  </span>
+
  <span id="line398">398. </span>
  <span id="line399">399.          debugpline0("exerper: Hunger checks");</span>
+
  <span id="line399">399.        debugpline0("exerper: Hunger checks");</span>
  <span id="line400">400.          switch (hs) {</span>
+
  <span id="line400">400.        switch (hs) {</span>
  <span id="line401">401.          case SATIATED:</span>
+
  <span id="line401">401.        case SATIATED:</span>
  <span id="line402">402.              exercise(A_DEX, FALSE);</span>
+
  <span id="line402">402.            exercise(A_DEX, FALSE);</span>
  <span id="line403">403.              if (Role_if(PM_MONK))</span>
+
  <span id="line403">403.            if (Role_if(PM_MONK))</span>
  <span id="line404">404.                  exercise(A_WIS, FALSE);</span>
+
  <span id="line404">404.                exercise(A_WIS, FALSE);</span>
  <span id="line405">405.              break;</span>
+
  <span id="line405">405.            break;</span>
  <span id="line406">406.          case NOT_HUNGRY:</span>
+
  <span id="line406">406.        case NOT_HUNGRY:</span>
  <span id="line407">407.              exercise(A_CON, TRUE);</span>
+
  <span id="line407">407.            exercise(A_CON, TRUE);</span>
  <span id="line408">408.              break;</span>
+
  <span id="line408">408.            break;</span>
  <span id="line409">409.          case WEAK:</span>
+
  <span id="line409">409.        case WEAK:</span>
  <span id="line410">410.              exercise(A_STR, FALSE);</span>
+
  <span id="line410">410.            exercise(A_STR, FALSE);</span>
  <span id="line411">411.              if (Role_if(PM_MONK)) /* fasting */</span>
+
  <span id="line411">411.            if (Role_if(PM_MONK)) /* fasting */</span>
  <span id="line412">412.                  exercise(A_WIS, TRUE);</span>
+
  <span id="line412">412.                exercise(A_WIS, TRUE);</span>
  <span id="line413">413.              break;</span>
+
  <span id="line413">413.            break;</span>
  <span id="line414">414.          case FAINTING:</span>
+
  <span id="line414">414.        case FAINTING:</span>
  <span id="line415">415.          case FAINTED:</span>
+
  <span id="line415">415.        case FAINTED:</span>
  <span id="line416">416.              exercise(A_CON, FALSE);</span>
+
  <span id="line416">416.            exercise(A_CON, FALSE);</span>
  <span id="line417">417.              break;</span>
+
  <span id="line417">417.            break;</span>
  <span id="line418">418.          }</span>
+
  <span id="line418">418.        }</span>
  <span id="line419">419.  </span>
+
  <span id="line419">419. </span>
  <span id="line420">420.          /* Encumbrance Checks */</span>
+
  <span id="line420">420.        /* Encumbrance Checks */</span>
  <span id="line421">421.          debugpline0("exerper: Encumber checks");</span>
+
  <span id="line421">421.        debugpline0("exerper: Encumber checks");</span>
  <span id="line422">422.          switch (near_capacity()) {</span>
+
  <span id="line422">422.        switch (near_capacity()) {</span>
  <span id="line423">423.          case MOD_ENCUMBER:</span>
+
  <span id="line423">423.        case MOD_ENCUMBER:</span>
  <span id="line424">424.              exercise(A_STR, TRUE);</span>
+
  <span id="line424">424.            exercise(A_STR, TRUE);</span>
  <span id="line425">425.              break;</span>
+
  <span id="line425">425.            break;</span>
  <span id="line426">426.          case HVY_ENCUMBER:</span>
+
  <span id="line426">426.        case HVY_ENCUMBER:</span>
  <span id="line427">427.              exercise(A_STR, TRUE);</span>
+
  <span id="line427">427.            exercise(A_STR, TRUE);</span>
  <span id="line428">428.              exercise(A_DEX, FALSE);</span>
+
  <span id="line428">428.            exercise(A_DEX, FALSE);</span>
  <span id="line429">429.              break;</span>
+
  <span id="line429">429.            break;</span>
  <span id="line430">430.          case EXT_ENCUMBER:</span>
+
  <span id="line430">430.        case EXT_ENCUMBER:</span>
  <span id="line431">431.              exercise(A_DEX, FALSE);</span>
+
  <span id="line431">431.            exercise(A_DEX, FALSE);</span>
  <span id="line432">432.              exercise(A_CON, FALSE);</span>
+
  <span id="line432">432.            exercise(A_CON, FALSE);</span>
  <span id="line433">433.              break;</span>
+
  <span id="line433">433.            break;</span>
  <span id="line434">434.          }</span>
+
  <span id="line434">434.        }</span>
  <span id="line435">435.      }</span>
+
  <span id="line435">435.    }</span>
  <span id="line436">436.  </span>
+
  <span id="line436">436. </span>
  <span id="line437">437.      /* status checks */</span>
+
  <span id="line437">437.    /* status checks */</span>
  <span id="line438">438.      if (!(moves % 5)) {</span>
+
  <span id="line438">438.    if (!(moves % 5)) {</span>
  <span id="line439">439.          debugpline0("exerper: Status checks");</span>
+
  <span id="line439">439.        debugpline0("exerper: Status checks");</span>
  <span id="line440">440.          if ((HClairvoyant & (INTRINSIC | TIMEOUT)) && !BClairvoyant)</span>
+
  <span id="line440">440.        if ((HClairvoyant & (INTRINSIC | TIMEOUT)) && !BClairvoyant)</span>
  <span id="line441">441.              exercise(A_WIS, TRUE);</span>
+
  <span id="line441">441.            exercise(A_WIS, TRUE);</span>
  <span id="line442">442.          if (HRegeneration)</span>
+
  <span id="line442">442.        if (HRegeneration)</span>
  <span id="line443">443.              exercise(A_STR, TRUE);</span>
+
  <span id="line443">443.            exercise(A_STR, TRUE);</span>
  <span id="line444">444.  </span>
+
  <span id="line444">444. </span>
  <span id="line445">445.          if (Sick || Vomiting)</span>
+
  <span id="line445">445.        if (Sick || Vomiting)</span>
  <span id="line446">446.              exercise(A_CON, FALSE);</span>
+
  <span id="line446">446.            exercise(A_CON, FALSE);</span>
  <span id="line447">447.          if (Confusion || Hallucination)</span>
+
  <span id="line447">447.        if (Confusion || Hallucination)</span>
  <span id="line448">448.              exercise(A_WIS, FALSE);</span>
+
  <span id="line448">448.            exercise(A_WIS, FALSE);</span>
  <span id="line449">449.          if ((Wounded_legs && !u.usteed) || Fumbling || HStun)</span>
+
  <span id="line449">449.        if ((Wounded_legs && !u.usteed) || Fumbling || HStun)</span>
  <span id="line450">450.              exercise(A_DEX, FALSE);</span>
+
  <span id="line450">450.            exercise(A_DEX, FALSE);</span>
  <span id="line451">451.      }</span>
+
  <span id="line451">451.    }</span>
  <span id="line452">452.  }</span>
+
  <span id="line452">452. }</span>
  <span id="line453">453.  </span>
+
  <span id="line453">453. </span>
  
 
== exerchk ==
 
== exerchk ==
 
 
  <span id="line454">454.  /* exercise/abuse text (must be in attribute order, not botl order);</span>
+
  <span id="line454">454. /* exercise/abuse text (must be in attribute order, not botl order);</span>
  <span id="line455">455.    phrased as "You must have been [][0]." or "You haven't been [][1]." */</span>
+
  <span id="line455">455.    phrased as "You must have been [][0]." or "You haven't been [][1]." */</span>
  <span id="line456">456.  static NEARDATA const char *const exertext[A_MAX][2] = {</span>
+
  <span id="line456">456. static NEARDATA const char *const exertext[A_MAX][2] = {</span>
  <span id="line457">457.      { "exercising diligently", "exercising properly" },          /* Str */</span>
+
  <span id="line457">457.    { "exercising diligently", "exercising properly" },          /* Str */</span>
  <span id="line458">458.      { 0, 0 },                                                    /* Int */</span>
+
  <span id="line458">458.    { 0, 0 },                                                    /* Int */</span>
  <span id="line459">459.      { "very observant", "paying attention" },                    /* Wis */</span>
+
  <span id="line459">459.    { "very observant", "paying attention" },                    /* Wis */</span>
  <span id="line460">460.      { "working on your reflexes", "working on reflexes lately" }, /* Dex */</span>
+
  <span id="line460">460.    { "working on your reflexes", "working on reflexes lately" }, /* Dex */</span>
  <span id="line461">461.      { "leading a healthy life-style", "watching your health" },  /* Con */</span>
+
  <span id="line461">461.    { "leading a healthy life-style", "watching your health" },  /* Con */</span>
  <span id="line462">462.      { 0, 0 },                                                    /* Cha */</span>
+
  <span id="line462">462.    { 0, 0 },                                                    /* Cha */</span>
  <span id="line463">463.  };</span>
+
  <span id="line463">463. };</span>
  <span id="line464">464.  </span>
+
  <span id="line464">464. </span>
  <span id="line465">465.  void</span>
+
  <span id="line465">465. void</span>
  <span id="line466">466.  exerchk()</span>
+
  <span id="line466">466. exerchk()</span>
  <span id="line467">467.  {</span>
+
  <span id="line467">467. {</span>
  <span id="line468">468.      int i, ax, mod_val, lolim, hilim;</span>
+
  <span id="line468">468.    int i, ax, mod_val, lolim, hilim;</span>
  <span id="line469">469.  </span>
+
  <span id="line469">469. </span>
  <span id="line470">470.      /*  Check out the periodic accumulations */</span>
+
  <span id="line470">470.    /*  Check out the periodic accumulations */</span>
  <span id="line471">471.      exerper();</span>
+
  <span id="line471">471.    exerper();</span>
  <span id="line472">472.  </span>
+
  <span id="line472">472. </span>
  <span id="line473">473.      if (moves >= context.next_attrib_check) {</span>
+
  <span id="line473">473.    if (moves >= context.next_attrib_check) {</span>
  <span id="line474">474.          debugpline1("exerchk: ready to test. multi = %d.", multi);</span>
+
  <span id="line474">474.        debugpline1("exerchk: ready to test. multi = %d.", multi);</span>
  <span id="line475">475.      }</span>
+
  <span id="line475">475.    }</span>
  <span id="line476">476.      /*  Are we ready for a test? */</span>
+
  <span id="line476">476.    /*  Are we ready for a test? */</span>
  <span id="line477">477.      if (moves >= context.next_attrib_check && !multi) {</span>
+
  <span id="line477">477.    if (moves >= context.next_attrib_check && !multi) {</span>
  <span id="line478">478.          debugpline0("exerchk: testing.");</span>
+
  <span id="line478">478.        debugpline0("exerchk: testing.");</span>
  <span id="line479">479.          /*</span>
+
  <span id="line479">479.        /*</span>
  <span id="line480">480.          *      Law of diminishing returns (Part II):</span>
+
  <span id="line480">480.          *      Law of diminishing returns (Part II):</span>
  <span id="line481">481.          *</span>
+
  <span id="line481">481.          *</span>
  <span id="line482">482.          *      The effects of "exercise" and "abuse" wear</span>
+
  <span id="line482">482.          *      The effects of "exercise" and "abuse" wear</span>
  <span id="line483">483.          *      off over time.  Even if you *don't* get an</span>
+
  <span id="line483">483.          *      off over time.  Even if you *don't* get an</span>
  <span id="line484">484.          *      increase/decrease, you lose some of the</span>
+
  <span id="line484">484.          *      increase/decrease, you lose some of the</span>
  <span id="line485">485.          *      accumulated effects.</span>
+
  <span id="line485">485.          *      accumulated effects.</span>
  <span id="line486">486.          */</span>
+
  <span id="line486">486.          */</span>
  <span id="line487">487.          for (i = 0; i < A_MAX; ++i) {</span>
+
  <span id="line487">487.        for (i = 0; i < A_MAX; ++i) {</span>
  <span id="line488">488.              ax = AEXE(i);</span>
+
  <span id="line488">488.            ax = AEXE(i);</span>
  <span id="line489">489.              /* nothing to do here if no exercise or abuse has occurred</span>
+
  <span id="line489">489.            /* nothing to do here if no exercise or abuse has occurred</span>
  <span id="line490">490.                (Int and Cha always fall into this category) */</span>
+
  <span id="line490">490.                (Int and Cha always fall into this category) */</span>
  <span id="line491">491.              if (!ax)</span>
+
  <span id="line491">491.            if (!ax)</span>
  <span id="line492">492.                  continue; /* ok to skip nextattrib */</span>
+
  <span id="line492">492.                continue; /* ok to skip nextattrib */</span>
  <span id="line493">493.  </span>
+
  <span id="line493">493. </span>
  <span id="line494">494.              mod_val = sgn(ax); /* +1 or -1; used below */</span>
+
  <span id="line494">494.            mod_val = sgn(ax); /* +1 or -1; used below */</span>
  <span id="line495">495.              /* no further effect for exercise if at max or abuse if at min;</span>
+
  <span id="line495">495.            /* no further effect for exercise if at max or abuse if at min;</span>
  <span id="line496">496.                can't exceed 18 via exercise even if actual max is higher */</span>
+
  <span id="line496">496.                can't exceed 18 via exercise even if actual max is higher */</span>
  <span id="line497">497.              lolim = ATTRMIN(i); /* usually 3; might be higher */</span>
+
  <span id="line497">497.            lolim = ATTRMIN(i); /* usually 3; might be higher */</span>
  <span id="line498">498.              hilim = ATTRMAX(i); /* usually 18; maybe lower or higher */</span>
+
  <span id="line498">498.            hilim = ATTRMAX(i); /* usually 18; maybe lower or higher */</span>
  <span id="line499">499.              if (hilim > 18)</span>
+
  <span id="line499">499.            if (hilim > 18)</span>
  <span id="line500">500.                  hilim = 18;</span>
+
  <span id="line500">500.                hilim = 18;</span>
  <span id="line501">501.              if ((ax < 0) ? (ABASE(i) <= lolim) : (ABASE(i) >= hilim))</span>
+
  <span id="line501">501.            if ((ax < 0) ? (ABASE(i) <= lolim) : (ABASE(i) >= hilim))</span>
  <span id="line502">502.                  goto nextattrib;</span>
+
  <span id="line502">502.                goto nextattrib;</span>
  <span id="line503">503.              /* can't exercise non-Wisdom while polymorphed; previous</span>
+
  <span id="line503">503.            /* can't exercise non-Wisdom while polymorphed; previous</span>
  <span id="line504">504.                exercise/abuse gradually wears off without impact then */</span>
+
  <span id="line504">504.                exercise/abuse gradually wears off without impact then */</span>
  <span id="line505">505.              if (Upolyd && i != A_WIS)</span>
+
  <span id="line505">505.            if (Upolyd && i != A_WIS)</span>
  <span id="line506">506.                  goto nextattrib;</span>
+
  <span id="line506">506.                goto nextattrib;</span>
  <span id="line507">507.  </span>
+
  <span id="line507">507. </span>
  <span id="line508">508.              debugpline2("exerchk: testing %s (%d).",</span>
+
  <span id="line508">508.            debugpline2("exerchk: testing %s (%d).",</span>
  <span id="line509">509.                          (i == A_STR)</span>
+
  <span id="line509">509.                        (i == A_STR)</span>
  <span id="line510">510.                              ? "Str"</span>
+
  <span id="line510">510.                            ? "Str"</span>
  <span id="line511">511.                              : (i == A_INT)</span>
+
  <span id="line511">511.                            : (i == A_INT)</span>
  <span id="line512">512.                                    ? "Int?"</span>
+
  <span id="line512">512.                                  ? "Int?"</span>
  <span id="line513">513.                                    : (i == A_WIS)</span>
+
  <span id="line513">513.                                  : (i == A_WIS)</span>
  <span id="line514">514.                                          ? "Wis"</span>
+
  <span id="line514">514.                                        ? "Wis"</span>
  <span id="line515">515.                                          : (i == A_DEX)</span>
+
  <span id="line515">515.                                        : (i == A_DEX)</span>
  <span id="line516">516.                                                ? "Dex"</span>
+
  <span id="line516">516.                                              ? "Dex"</span>
  <span id="line517">517.                                                : (i == A_CON)</span>
+
  <span id="line517">517.                                              : (i == A_CON)</span>
  <span id="line518">518.                                                      ? "Con"</span>
+
  <span id="line518">518.                                                    ? "Con"</span>
  <span id="line519">519.                                                      : (i == A_CHA)</span>
+
  <span id="line519">519.                                                    : (i == A_CHA)</span>
  <span id="line520">520.                                                            ? "Cha?"</span>
+
  <span id="line520">520.                                                          ? "Cha?"</span>
  <span id="line521">521.                                                            : "???",</span>
+
  <span id="line521">521.                                                          : "???",</span>
  <span id="line522">522.                          ax);</span>
+
  <span id="line522">522.                        ax);</span>
  <span id="line523">523.              /*</span>
+
  <span id="line523">523.            /*</span>
  <span id="line524">524.              *  Law of diminishing returns (Part III):</span>
+
  <span id="line524">524.              *  Law of diminishing returns (Part III):</span>
  <span id="line525">525.              *</span>
+
  <span id="line525">525.              *</span>
  <span id="line526">526.              *  You don't *always* gain by exercising.</span>
+
  <span id="line526">526.              *  You don't *always* gain by exercising.</span>
  <span id="line527">527.              *  [MRS 92/10/28 - Treat Wisdom specially for balance.]</span>
+
  <span id="line527">527.              *  [MRS 92/10/28 - Treat Wisdom specially for balance.]</span>
  <span id="line528">528.              */</span>
+
  <span id="line528">528.              */</span>
  <span id="line529">529.              if (rn2(AVAL) > ((i != A_WIS) ? (abs(ax) * 2 / 3) : abs(ax)))</span>
+
  <span id="line529">529.            if (rn2(AVAL) > ((i != A_WIS) ? (abs(ax) * 2 / 3) : abs(ax)))</span>
  <span id="line530">530.                  goto nextattrib;</span>
+
  <span id="line530">530.                goto nextattrib;</span>
  <span id="line531">531.  </span>
+
  <span id="line531">531. </span>
  <span id="line532">532.              debugpline1("exerchk: changing %d.", i);</span>
+
  <span id="line532">532.            debugpline1("exerchk: changing %d.", i);</span>
  <span id="line533">533.              if (adjattrib(i, mod_val, -1)) {</span>
+
  <span id="line533">533.            if (adjattrib(i, mod_val, -1)) {</span>
  <span id="line534">534.                  debugpline1("exerchk: changed %d.", i);</span>
+
  <span id="line534">534.                debugpline1("exerchk: changed %d.", i);</span>
  <span id="line535">535.                  /* if you actually changed an attrib - zero accumulation */</span>
+
  <span id="line535">535.                /* if you actually changed an attrib - zero accumulation */</span>
  <span id="line536">536.                  AEXE(i) = ax = 0;</span>
+
  <span id="line536">536.                AEXE(i) = ax = 0;</span>
  <span id="line537">537.                  /* then print an explanation */</span>
+
  <span id="line537">537.                /* then print an explanation */</span>
  <span id="line538">538.                  You("%s %s.",</span>
+
  <span id="line538">538.                You("%s %s.",</span>
  <span id="line539">539.                      (mod_val > 0) ? "must have been" : "haven't been",</span>
+
  <span id="line539">539.                    (mod_val > 0) ? "must have been" : "haven't been",</span>
  <span id="line540">540.                      exertext[i][(mod_val > 0) ? 0 : 1]);</span>
+
  <span id="line540">540.                    exertext[i][(mod_val > 0) ? 0 : 1]);</span>
  <span id="line541">541.              }</span>
+
  <span id="line541">541.            }</span>
  <span id="line542">542.          nextattrib:</span>
+
  <span id="line542">542.        nextattrib:</span>
  <span id="line543">543.              /* this used to be ``AEXE(i) /= 2'' but that would produce</span>
+
  <span id="line543">543.            /* this used to be ``AEXE(i) /= 2'' but that would produce</span>
  <span id="line544">544.                platform-dependent rounding/truncation for negative vals */</span>
+
  <span id="line544">544.                platform-dependent rounding/truncation for negative vals */</span>
  <span id="line545">545.              AEXE(i) = (abs(ax) / 2) * mod_val;</span>
+
  <span id="line545">545.            AEXE(i) = (abs(ax) / 2) * mod_val;</span>
  <span id="line546">546.          }</span>
+
  <span id="line546">546.        }</span>
  <span id="line547">547.          context.next_attrib_check += rn1(200, 800);</span>
+
  <span id="line547">547.        context.next_attrib_check += rn1(200, 800);</span>
  <span id="line548">548.          debugpline1("exerchk: next check at %ld.", context.next_attrib_check);</span>
+
  <span id="line548">548.        debugpline1("exerchk: next check at %ld.", context.next_attrib_check);</span>
  <span id="line549">549.      }</span>
+
  <span id="line549">549.    }</span>
  <span id="line550">550.  }</span>
+
  <span id="line550">550. }</span>
  <span id="line551">551.  </span>
+
  <span id="line551">551. </span>
  
 
== init_attr ==
 
== init_attr ==
 
 
  <span id="line552">552.  void</span>
+
  <span id="line552">552. void</span>
  <span id="line553">553.  init_attr(np)</span>
+
  <span id="line553">553. init_attr(np)</span>
  <span id="line554">554.  register int np;</span>
+
  <span id="line554">554. register int np;</span>
  <span id="line555">555.  {</span>
+
  <span id="line555">555. {</span>
  <span id="line556">556.      register int i, x, tryct;</span>
+
  <span id="line556">556.    register int i, x, tryct;</span>
  <span id="line557">557.  </span>
+
  <span id="line557">557. </span>
  <span id="line558">558.      for (i = 0; i < A_MAX; i++) {</span>
+
  <span id="line558">558.    for (i = 0; i < A_MAX; i++) {</span>
  <span id="line559">559.          ABASE(i) = AMAX(i) = urole.attrbase[i];</span>
+
  <span id="line559">559.        ABASE(i) = AMAX(i) = urole.attrbase[i];</span>
  <span id="line560">560.          ATEMP(i) = ATIME(i) = 0;</span>
+
  <span id="line560">560.        ATEMP(i) = ATIME(i) = 0;</span>
  <span id="line561">561.          np -= urole.attrbase[i];</span>
+
  <span id="line561">561.        np -= urole.attrbase[i];</span>
  <span id="line562">562.      }</span>
+
  <span id="line562">562.    }</span>
  <span id="line563">563.  </span>
+
  <span id="line563">563. </span>
  <span id="line564">564.      tryct = 0;</span>
+
  <span id="line564">564.    tryct = 0;</span>
  <span id="line565">565.      while (np > 0 && tryct < 100) {</span>
+
  <span id="line565">565.    while (np > 0 && tryct < 100) {</span>
  <span id="line566">566.          x = rn2(100);</span>
+
  <span id="line566">566.        x = rn2(100);</span>
  <span id="line567">567.          for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++)</span>
+
  <span id="line567">567.        for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++)</span>
  <span id="line568">568.              ;</span>
+
  <span id="line568">568.            ;</span>
  <span id="line569">569.          if (i >= A_MAX)</span>
+
  <span id="line569">569.        if (i >= A_MAX)</span>
  <span id="line570">570.              continue; /* impossible */</span>
+
  <span id="line570">570.            continue; /* impossible */</span>
  <span id="line571">571.  </span>
+
  <span id="line571">571. </span>
  <span id="line572">572.          if (ABASE(i) >= ATTRMAX(i)) {</span>
+
  <span id="line572">572.        if (ABASE(i) >= ATTRMAX(i)) {</span>
  <span id="line573">573.              tryct++;</span>
+
  <span id="line573">573.            tryct++;</span>
  <span id="line574">574.              continue;</span>
+
  <span id="line574">574.            continue;</span>
  <span id="line575">575.          }</span>
+
  <span id="line575">575.        }</span>
  <span id="line576">576.          tryct = 0;</span>
+
  <span id="line576">576.        tryct = 0;</span>
  <span id="line577">577.          ABASE(i)++;</span>
+
  <span id="line577">577.        ABASE(i)++;</span>
  <span id="line578">578.          AMAX(i)++;</span>
+
  <span id="line578">578.        AMAX(i)++;</span>
  <span id="line579">579.          np--;</span>
+
  <span id="line579">579.        np--;</span>
  <span id="line580">580.      }</span>
+
  <span id="line580">580.    }</span>
  <span id="line581">581.  </span>
+
  <span id="line581">581. </span>
  <span id="line582">582.      tryct = 0;</span>
+
  <span id="line582">582.    tryct = 0;</span>
  <span id="line583">583.      while (np < 0 && tryct < 100) { /* for redistribution */</span>
+
  <span id="line583">583.    while (np < 0 && tryct < 100) { /* for redistribution */</span>
  <span id="line584">584.  </span>
+
  <span id="line584">584. </span>
  <span id="line585">585.          x = rn2(100);</span>
+
  <span id="line585">585.        x = rn2(100);</span>
  <span id="line586">586.          for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++)</span>
+
  <span id="line586">586.        for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++)</span>
  <span id="line587">587.              ;</span>
+
  <span id="line587">587.            ;</span>
  <span id="line588">588.          if (i >= A_MAX)</span>
+
  <span id="line588">588.        if (i >= A_MAX)</span>
  <span id="line589">589.              continue; /* impossible */</span>
+
  <span id="line589">589.            continue; /* impossible */</span>
  <span id="line590">590.  </span>
+
  <span id="line590">590. </span>
  <span id="line591">591.          if (ABASE(i) <= ATTRMIN(i)) {</span>
+
  <span id="line591">591.        if (ABASE(i) <= ATTRMIN(i)) {</span>
  <span id="line592">592.              tryct++;</span>
+
  <span id="line592">592.            tryct++;</span>
  <span id="line593">593.              continue;</span>
+
  <span id="line593">593.            continue;</span>
  <span id="line594">594.          }</span>
+
  <span id="line594">594.        }</span>
  <span id="line595">595.          tryct = 0;</span>
+
  <span id="line595">595.        tryct = 0;</span>
  <span id="line596">596.          ABASE(i)--;</span>
+
  <span id="line596">596.        ABASE(i)--;</span>
  <span id="line597">597.          AMAX(i)--;</span>
+
  <span id="line597">597.        AMAX(i)--;</span>
  <span id="line598">598.          np++;</span>
+
  <span id="line598">598.        np++;</span>
  <span id="line599">599.      }</span>
+
  <span id="line599">599.    }</span>
  <span id="line600">600.  }</span>
+
  <span id="line600">600. }</span>
  <span id="line601">601.  </span>
+
  <span id="line601">601. </span>
  
 
== redist_attr ==
 
== redist_attr ==
 
 
  <span id="line602">602.  void</span>
+
  <span id="line602">602. void</span>
  <span id="line603">603.  redist_attr()</span>
+
  <span id="line603">603. redist_attr()</span>
  <span id="line604">604.  {</span>
+
  <span id="line604">604. {</span>
  <span id="line605">605.      register int i, tmp;</span>
+
  <span id="line605">605.    register int i, tmp;</span>
  <span id="line606">606.  </span>
+
  <span id="line606">606. </span>
  <span id="line607">607.      for (i = 0; i < A_MAX; i++) {</span>
+
  <span id="line607">607.    for (i = 0; i < A_MAX; i++) {</span>
  <span id="line608">608.          if (i == A_INT || i == A_WIS)</span>
+
  <span id="line608">608.        if (i == A_INT || i == A_WIS)</span>
  <span id="line609">609.              continue;</span>
+
  <span id="line609">609.            continue;</span>
  <span id="line610">610.          /* Polymorphing doesn't change your mind */</span>
+
  <span id="line610">610.        /* Polymorphing doesn't change your mind */</span>
  <span id="line611">611.          tmp = AMAX(i);</span>
+
  <span id="line611">611.        tmp = AMAX(i);</span>
  <span id="line612">612.          AMAX(i) += (rn2(5) - 2);</span>
+
  <span id="line612">612.        AMAX(i) += (rn2(5) - 2);</span>
  <span id="line613">613.          if (AMAX(i) > ATTRMAX(i))</span>
+
  <span id="line613">613.        if (AMAX(i) > ATTRMAX(i))</span>
  <span id="line614">614.              AMAX(i) = ATTRMAX(i);</span>
+
  <span id="line614">614.            AMAX(i) = ATTRMAX(i);</span>
  <span id="line615">615.          if (AMAX(i) < ATTRMIN(i))</span>
+
  <span id="line615">615.        if (AMAX(i) < ATTRMIN(i))</span>
  <span id="line616">616.              AMAX(i) = ATTRMIN(i);</span>
+
  <span id="line616">616.            AMAX(i) = ATTRMIN(i);</span>
  <span id="line617">617.          ABASE(i) = ABASE(i) * AMAX(i) / tmp;</span>
+
  <span id="line617">617.        ABASE(i) = ABASE(i) * AMAX(i) / tmp;</span>
  <span id="line618">618.          /* ABASE(i) > ATTRMAX(i) is impossible */</span>
+
  <span id="line618">618.        /* ABASE(i) > ATTRMAX(i) is impossible */</span>
  <span id="line619">619.          if (ABASE(i) < ATTRMIN(i))</span>
+
  <span id="line619">619.        if (ABASE(i) < ATTRMIN(i))</span>
  <span id="line620">620.              ABASE(i) = ATTRMIN(i);</span>
+
  <span id="line620">620.            ABASE(i) = ATTRMIN(i);</span>
  <span id="line621">621.      }</span>
+
  <span id="line621">621.    }</span>
  <span id="line622">622.      (void) encumber_msg();</span>
+
  <span id="line622">622.    (void) encumber_msg();</span>
  <span id="line623">623.  }</span>
+
  <span id="line623">623. }</span>
  <span id="line624">624.  </span>
+
  <span id="line624">624. </span>
  
 
== postadjabil ==
 
== postadjabil ==
 
 
  <span id="line625">625.  STATIC_OVL</span>
+
  <span id="line625">625. STATIC_OVL</span>
  <span id="line626">626.  void</span>
+
  <span id="line626">626. void</span>
  <span id="line627">627.  postadjabil(ability)</span>
+
  <span id="line627">627. postadjabil(ability)</span>
  <span id="line628">628.  long *ability;</span>
+
  <span id="line628">628. long *ability;</span>
  <span id="line629">629.  {</span>
+
  <span id="line629">629. {</span>
  <span id="line630">630.      if (!ability)</span>
+
  <span id="line630">630.    if (!ability)</span>
  <span id="line631">631.          return;</span>
+
  <span id="line631">631.        return;</span>
  <span id="line632">632.      if (ability == &(HWarning) || ability == &(HSee_invisible))</span>
+
  <span id="line632">632.    if (ability == &(HWarning) || ability == &(HSee_invisible))</span>
  <span id="line633">633.          see_monsters();</span>
+
  <span id="line633">633.        see_monsters();</span>
  <span id="line634">634.  }</span>
+
  <span id="line634">634. }</span>
  <span id="line635">635.  </span>
+
  <span id="line635">635. </span>
  
 
== check_innate_abil ==
 
== check_innate_abil ==
 
 
  <span id="line636">636.  STATIC_OVL const struct innate *</span>
+
  <span id="line636">636. STATIC_OVL const struct innate *</span>
  <span id="line637">637.  check_innate_abil(ability, frommask)</span>
+
  <span id="line637">637. check_innate_abil(ability, frommask)</span>
  <span id="line638">638.  long *ability;</span>
+
  <span id="line638">638. long *ability;</span>
  <span id="line639">639.  long frommask;</span>
+
  <span id="line639">639. long frommask;</span>
  <span id="line640">640.  {</span>
+
  <span id="line640">640. {</span>
  <span id="line641">641.      const struct innate *abil = 0;</span>
+
  <span id="line641">641.    const struct innate *abil = 0;</span>
  <span id="line642">642.  </span>
+
  <span id="line642">642. </span>
  <span id="line643">643.      if (frommask == FROMEXPER)</span>
+
  <span id="line643">643.    if (frommask == FROMEXPER)</span>
  <span id="line644">644.          switch (Role_switch) {</span>
+
  <span id="line644">644.        switch (Role_switch) {</span>
  <span id="line645">645.          case PM_ARCHEOLOGIST:</span>
+
  <span id="line645">645.        case PM_ARCHEOLOGIST:</span>
  <span id="line646">646.              abil = arc_abil;</span>
+
  <span id="line646">646.            abil = arc_abil;</span>
  <span id="line647">647.              break;</span>
+
  <span id="line647">647.            break;</span>
  <span id="line648">648.          case PM_BARBARIAN:</span>
+
  <span id="line648">648.        case PM_BARBARIAN:</span>
  <span id="line649">649.              abil = bar_abil;</span>
+
  <span id="line649">649.            abil = bar_abil;</span>
  <span id="line650">650.              break;</span>
+
  <span id="line650">650.            break;</span>
  <span id="line651">651.          case PM_CAVEMAN:</span>
+
  <span id="line651">651.        case PM_CAVEMAN:</span>
  <span id="line652">652.              abil = cav_abil;</span>
+
  <span id="line652">652.            abil = cav_abil;</span>
  <span id="line653">653.              break;</span>
+
  <span id="line653">653.            break;</span>
  <span id="line654">654.          case PM_HEALER:</span>
+
  <span id="line654">654.        case PM_HEALER:</span>
  <span id="line655">655.              abil = hea_abil;</span>
+
  <span id="line655">655.            abil = hea_abil;</span>
  <span id="line656">656.              break;</span>
+
  <span id="line656">656.            break;</span>
  <span id="line657">657.          case PM_KNIGHT:</span>
+
  <span id="line657">657.        case PM_KNIGHT:</span>
  <span id="line658">658.              abil = kni_abil;</span>
+
  <span id="line658">658.            abil = kni_abil;</span>
  <span id="line659">659.              break;</span>
+
  <span id="line659">659.            break;</span>
  <span id="line660">660.          case PM_MONK:</span>
+
  <span id="line660">660.        case PM_MONK:</span>
  <span id="line661">661.              abil = mon_abil;</span>
+
  <span id="line661">661.            abil = mon_abil;</span>
  <span id="line662">662.              break;</span>
+
  <span id="line662">662.            break;</span>
  <span id="line663">663.          case PM_PRIEST:</span>
+
  <span id="line663">663.        case PM_PRIEST:</span>
  <span id="line664">664.              abil = pri_abil;</span>
+
  <span id="line664">664.            abil = pri_abil;</span>
  <span id="line665">665.              break;</span>
+
  <span id="line665">665.            break;</span>
  <span id="line666">666.          case PM_RANGER:</span>
+
  <span id="line666">666.        case PM_RANGER:</span>
  <span id="line667">667.              abil = ran_abil;</span>
+
  <span id="line667">667.            abil = ran_abil;</span>
  <span id="line668">668.              break;</span>
+
  <span id="line668">668.            break;</span>
  <span id="line669">669.          case PM_ROGUE:</span>
+
  <span id="line669">669.        case PM_ROGUE:</span>
  <span id="line670">670.              abil = rog_abil;</span>
+
  <span id="line670">670.            abil = rog_abil;</span>
  <span id="line671">671.              break;</span>
+
  <span id="line671">671.            break;</span>
  <span id="line672">672.          case PM_SAMURAI:</span>
+
  <span id="line672">672.        case PM_SAMURAI:</span>
  <span id="line673">673.              abil = sam_abil;</span>
+
  <span id="line673">673.            abil = sam_abil;</span>
  <span id="line674">674.              break;</span>
+
  <span id="line674">674.            break;</span>
  <span id="line675">675.          case PM_TOURIST:</span>
+
  <span id="line675">675.        case PM_TOURIST:</span>
  <span id="line676">676.              abil = tou_abil;</span>
+
  <span id="line676">676.            abil = tou_abil;</span>
  <span id="line677">677.              break;</span>
+
  <span id="line677">677.            break;</span>
  <span id="line678">678.          case PM_VALKYRIE:</span>
+
  <span id="line678">678.        case PM_VALKYRIE:</span>
  <span id="line679">679.              abil = val_abil;</span>
+
  <span id="line679">679.            abil = val_abil;</span>
  <span id="line680">680.              break;</span>
+
  <span id="line680">680.            break;</span>
  <span id="line681">681.          case PM_WIZARD:</span>
+
  <span id="line681">681.        case PM_WIZARD:</span>
  <span id="line682">682.              abil = wiz_abil;</span>
+
  <span id="line682">682.            abil = wiz_abil;</span>
  <span id="line683">683.              break;</span>
+
  <span id="line683">683.            break;</span>
  <span id="line684">684.          default:</span>
+
  <span id="line684">684.        default:</span>
  <span id="line685">685.              break;</span>
+
  <span id="line685">685.            break;</span>
  <span id="line686">686.          }</span>
+
  <span id="line686">686.        }</span>
  <span id="line687">687.      else if (frommask == FROMRACE)</span>
+
  <span id="line687">687.    else if (frommask == FROMRACE)</span>
  <span id="line688">688.          switch (Race_switch) {</span>
+
  <span id="line688">688.        switch (Race_switch) {</span>
  <span id="line689">689.          case PM_ELF:</span>
+
  <span id="line689">689.        case PM_ELF:</span>
  <span id="line690">690.              abil = elf_abil;</span>
+
  <span id="line690">690.            abil = elf_abil;</span>
  <span id="line691">691.              break;</span>
+
  <span id="line691">691.            break;</span>
  <span id="line692">692.          case PM_ORC:</span>
+
  <span id="line692">692.        case PM_ORC:</span>
  <span id="line693">693.              abil = orc_abil;</span>
+
  <span id="line693">693.            abil = orc_abil;</span>
  <span id="line694">694.              break;</span>
+
  <span id="line694">694.            break;</span>
  <span id="line695">695.          case PM_HUMAN:</span>
+
  <span id="line695">695.        case PM_HUMAN:</span>
  <span id="line696">696.          case PM_DWARF:</span>
+
  <span id="line696">696.        case PM_DWARF:</span>
  <span id="line697">697.          case PM_GNOME:</span>
+
  <span id="line697">697.        case PM_GNOME:</span>
  <span id="line698">698.          default:</span>
+
  <span id="line698">698.        default:</span>
  <span id="line699">699.              break;</span>
+
  <span id="line699">699.            break;</span>
  <span id="line700">700.          }</span>
+
  <span id="line700">700.        }</span>
  <span id="line701">701.  </span>
+
  <span id="line701">701. </span>
  <span id="line702">702.      while (abil && abil->ability) {</span>
+
  <span id="line702">702.    while (abil && abil->ability) {</span>
  <span id="line703">703.          if ((abil->ability == ability) && (u.ulevel >= abil->ulevel))</span>
+
  <span id="line703">703.        if ((abil->ability == ability) && (u.ulevel >= abil->ulevel))</span>
  <span id="line704">704.              return abil;</span>
+
  <span id="line704">704.            return abil;</span>
  <span id="line705">705.          abil++;</span>
+
  <span id="line705">705.        abil++;</span>
  <span id="line706">706.      }</span>
+
  <span id="line706">706.    }</span>
  <span id="line707">707.      return (struct innate *) 0;</span>
+
  <span id="line707">707.    return (struct innate *) 0;</span>
  <span id="line708">708.  }</span>
+
  <span id="line708">708. }</span>
  <span id="line709">709.  </span>
+
  <span id="line709">709. </span>
  
 
== innately ==
 
== innately ==
 
 
  <span id="line710">710.  /*</span>
+
  <span id="line710">710. /*</span>
  <span id="line711">711.  * returns 1 if FROMRACE or FROMEXPER and exper level == 1</span>
+
  <span id="line711">711.  * returns 1 if FROMRACE or FROMEXPER and exper level == 1</span>
  <span id="line712">712.  * returns 2 if FROMEXPER and exper level > 1</span>
+
  <span id="line712">712.  * returns 2 if FROMEXPER and exper level > 1</span>
  <span id="line713">713.  * otherwise returns 0</span>
+
  <span id="line713">713.  * otherwise returns 0</span>
  <span id="line714">714.  */</span>
+
  <span id="line714">714.  */</span>
  <span id="line715">715.  STATIC_OVL int</span>
+
  <span id="line715">715. STATIC_OVL int</span>
  <span id="line716">716.  innately(ability)</span>
+
  <span id="line716">716. innately(ability)</span>
  <span id="line717">717.  long *ability;</span>
+
  <span id="line717">717. long *ability;</span>
  <span id="line718">718.  {</span>
+
  <span id="line718">718. {</span>
  <span id="line719">719.      const struct innate *iptr;</span>
+
  <span id="line719">719.    const struct innate *iptr;</span>
  <span id="line720">720.  </span>
+
  <span id="line720">720. </span>
  <span id="line721">721.      if ((iptr = check_innate_abil(ability, FROMRACE)) != 0)</span>
+
  <span id="line721">721.    if ((iptr = check_innate_abil(ability, FROMRACE)) != 0)</span>
  <span id="line722">722.          return 1;</span>
+
  <span id="line722">722.        return 1;</span>
  <span id="line723">723.      else if ((iptr = check_innate_abil(ability, FROMEXPER)) != 0)</span>
+
  <span id="line723">723.    else if ((iptr = check_innate_abil(ability, FROMEXPER)) != 0)</span>
  <span id="line724">724.          return (iptr->ulevel == 1) ? 1 : 2;</span>
+
  <span id="line724">724.        return (iptr->ulevel == 1) ? 1 : 2;</span>
  <span id="line725">725.      return 0;</span>
+
  <span id="line725">725.    return 0;</span>
  <span id="line726">726.  }</span>
+
  <span id="line726">726. }</span>
  <span id="line727">727.  </span>
+
  <span id="line727">727. </span>
  
 
== is_innate ==
 
== is_innate ==
 
 
  <span id="line728">728.  int</span>
+
  <span id="line728">728. int</span>
  <span id="line729">729.  is_innate(propidx)</span>
+
  <span id="line729">729. is_innate(propidx)</span>
  <span id="line730">730.  int propidx;</span>
+
  <span id="line730">730. int propidx;</span>
  <span id="line731">731.  {</span>
+
  <span id="line731">731. {</span>
  <span id="line732">732.      if (propidx == BLINDED && !haseyes(youmonst.data))</span>
+
  <span id="line732">732.    if (propidx == BLINDED && !haseyes(youmonst.data))</span>
  <span id="line733">733.          return 1;</span>
+
  <span id="line733">733.        return 1;</span>
  <span id="line734">734.      return innately(&u.uprops[propidx].intrinsic);</span>
+
  <span id="line734">734.    return innately(&u.uprops[propidx].intrinsic);</span>
  <span id="line735">735.  }</span>
+
  <span id="line735">735. }</span>
  <span id="line736">736.  </span>
+
  <span id="line736">736. </span>
  
 
== from_what ==
 
== from_what ==
 
 
  <span id="line737">737.  char *</span>
+
  <span id="line737">737. char *</span>
  <span id="line738">738.  from_what(propidx)</span>
+
  <span id="line738">738. from_what(propidx)</span>
  <span id="line739">739.  int propidx; /* special cases can have negative values */</span>
+
  <span id="line739">739. int propidx; /* special cases can have negative values */</span>
  <span id="line740">740.  {</span>
+
  <span id="line740">740. {</span>
  <span id="line741">741.      static char buf[BUFSZ];</span>
+
  <span id="line741">741.    static char buf[BUFSZ];</span>
  <span id="line742">742.  </span>
+
  <span id="line742">742. </span>
  <span id="line743">743.      buf[0] = '\0';</span>
+
  <span id="line743">743.    buf[0] = '\0';</span>
  <span id="line744">744.      /*</span>
+
  <span id="line744">744.    /*</span>
  <span id="line745">745.      * Restrict the source of the attributes just to debug mode for now</span>
+
  <span id="line745">745.      * Restrict the source of the attributes just to debug mode for now</span>
  <span id="line746">746.      */</span>
+
  <span id="line746">746.      */</span>
  <span id="line747">747.      if (wizard) {</span>
+
  <span id="line747">747.    if (wizard) {</span>
  <span id="line748">748.          static NEARDATA const char because_of[] = " because of %s";</span>
+
  <span id="line748">748.        static NEARDATA const char because_of[] = " because of %s";</span>
  <span id="line749">749.  </span>
+
  <span id="line749">749. </span>
  <span id="line750">750.          if (propidx >= 0) {</span>
+
  <span id="line750">750.        if (propidx >= 0) {</span>
  <span id="line751">751.              char *p;</span>
+
  <span id="line751">751.            char *p;</span>
  <span id="line752">752.              struct obj *obj = (struct obj *) 0;</span>
+
  <span id="line752">752.            struct obj *obj = (struct obj *) 0;</span>
  <span id="line753">753.              int innate = is_innate(propidx);</span>
+
  <span id="line753">753.            int innate = is_innate(propidx);</span>
  <span id="line754">754.  </span>
+
  <span id="line754">754. </span>
  <span id="line755">755.              if (innate == 2)</span>
+
  <span id="line755">755.            if (innate == 2)</span>
  <span id="line756">756.                  Strcpy(buf, " because of your experience");</span>
+
  <span id="line756">756.                Strcpy(buf, " because of your experience");</span>
  <span id="line757">757.              else if (innate == 1)</span>
+
  <span id="line757">757.            else if (innate == 1)</span>
  <span id="line758">758.                  Strcpy(buf, " innately");</span>
+
  <span id="line758">758.                Strcpy(buf, " innately");</span>
  <span id="line759">759.              else if (wizard</span>
+
  <span id="line759">759.            else if (wizard</span>
  <span id="line760">760.                      && (obj = what_gives(&u.uprops[propidx].extrinsic)))</span>
+
  <span id="line760">760.                      && (obj = what_gives(&u.uprops[propidx].extrinsic)))</span>
  <span id="line761">761.                  Sprintf(buf, because_of, obj->oartifact</span>
+
  <span id="line761">761.                Sprintf(buf, because_of, obj->oartifact</span>
  <span id="line762">762.                                              ? bare_artifactname(obj)</span>
+
  <span id="line762">762.                                              ? bare_artifactname(obj)</span>
  <span id="line763">763.                                              : ysimple_name(obj));</span>
+
  <span id="line763">763.                                              : ysimple_name(obj));</span>
  <span id="line764">764.              else if (propidx == BLINDED && u.uroleplay.blind)</span>
+
  <span id="line764">764.            else if (propidx == BLINDED && u.uroleplay.blind)</span>
  <span id="line765">765.                  Sprintf(buf, " from birth");</span>
+
  <span id="line765">765.                Sprintf(buf, " from birth");</span>
  <span id="line766">766.              else if (propidx == BLINDED && Blindfolded_only)</span>
+
  <span id="line766">766.            else if (propidx == BLINDED && Blindfolded_only)</span>
  <span id="line767">767.                  Sprintf(buf, because_of, ysimple_name(ublindf));</span>
+
  <span id="line767">767.                Sprintf(buf, because_of, ysimple_name(ublindf));</span>
  <span id="line768">768.  </span>
+
  <span id="line768">768. </span>
  <span id="line769">769.              /* remove some verbosity and/or redundancy */</span>
+
  <span id="line769">769.            /* remove some verbosity and/or redundancy */</span>
  <span id="line770">770.              if ((p = strstri(buf, " pair of ")) != 0)</span>
+
  <span id="line770">770.            if ((p = strstri(buf, " pair of ")) != 0)</span>
  <span id="line771">771.                  copynchars(p + 1, p + 9, BUFSZ); /* overlapping buffers ok */</span>
+
  <span id="line771">771.                copynchars(p + 1, p + 9, BUFSZ); /* overlapping buffers ok */</span>
  <span id="line772">772.              else if (propidx == STRANGLED</span>
+
  <span id="line772">772.            else if (propidx == STRANGLED</span>
  <span id="line773">773.                      && (p = strstri(buf, " of strangulation")) != 0)</span>
+
  <span id="line773">773.                      && (p = strstri(buf, " of strangulation")) != 0)</span>
  <span id="line774">774.                  *p = '\0';</span>
+
  <span id="line774">774.                *p = '\0';</span>
  <span id="line775">775.  </span>
+
  <span id="line775">775. </span>
  <span id="line776">776.          } else { /* negative property index */</span>
+
  <span id="line776">776.        } else { /* negative property index */</span>
  <span id="line777">777.              /* if more blocking capabilities get implemented we'll need to</span>
+
  <span id="line777">777.            /* if more blocking capabilities get implemented we'll need to</span>
  <span id="line778">778.                replace this with what_blocks() comparable to what_gives() */</span>
+
  <span id="line778">778.                replace this with what_blocks() comparable to what_gives() */</span>
  <span id="line779">779.              switch (-propidx) {</span>
+
  <span id="line779">779.            switch (-propidx) {</span>
  <span id="line780">780.              case BLINDED:</span>
+
  <span id="line780">780.            case BLINDED:</span>
  <span id="line781">781.                  if (ublindf</span>
+
  <span id="line781">781.                if (ublindf</span>
  <span id="line782">782.                      && ublindf->oartifact == ART_EYES_OF_THE_OVERWORLD)</span>
+
  <span id="line782">782.                    && ublindf->oartifact == ART_EYES_OF_THE_OVERWORLD)</span>
  <span id="line783">783.                      Sprintf(buf, because_of, bare_artifactname(ublindf));</span>
+
  <span id="line783">783.                    Sprintf(buf, because_of, bare_artifactname(ublindf));</span>
  <span id="line784">784.                  break;</span>
+
  <span id="line784">784.                break;</span>
  <span id="line785">785.              case INVIS:</span>
+
  <span id="line785">785.            case INVIS:</span>
  <span id="line786">786.                  if (u.uprops[INVIS].blocked & W_ARMC)</span>
+
  <span id="line786">786.                if (u.uprops[INVIS].blocked & W_ARMC)</span>
  <span id="line787">787.                      Sprintf(buf, because_of,</span>
+
  <span id="line787">787.                    Sprintf(buf, because_of,</span>
  <span id="line788">788.                              ysimple_name(uarmc)); /* mummy wrapping */</span>
+
  <span id="line788">788.                            ysimple_name(uarmc)); /* mummy wrapping */</span>
  <span id="line789">789.                  break;</span>
+
  <span id="line789">789.                break;</span>
  <span id="line790">790.              case CLAIRVOYANT:</span>
+
  <span id="line790">790.            case CLAIRVOYANT:</span>
  <span id="line791">791.                  if (wizard && (u.uprops[CLAIRVOYANT].blocked & W_ARMH))</span>
+
  <span id="line791">791.                if (wizard && (u.uprops[CLAIRVOYANT].blocked & W_ARMH))</span>
  <span id="line792">792.                      Sprintf(buf, because_of,</span>
+
  <span id="line792">792.                    Sprintf(buf, because_of,</span>
  <span id="line793">793.                              ysimple_name(uarmh)); /* cornuthaum */</span>
+
  <span id="line793">793.                            ysimple_name(uarmh)); /* cornuthaum */</span>
  <span id="line794">794.                  break;</span>
+
  <span id="line794">794.                break;</span>
  <span id="line795">795.              }</span>
+
  <span id="line795">795.            }</span>
  <span id="line796">796.          }</span>
+
  <span id="line796">796.        }</span>
  <span id="line797">797.  </span>
+
  <span id="line797">797. </span>
  <span id="line798">798.      } /*wizard*/</span>
+
  <span id="line798">798.    } /*wizard*/</span>
  <span id="line799">799.      return buf;</span>
+
  <span id="line799">799.    return buf;</span>
  <span id="line800">800.  }</span>
+
  <span id="line800">800. }</span>
  <span id="line801">801.  </span>
+
  <span id="line801">801. </span>
  
 
== adjabil ==
 
== adjabil ==
 
 
  <span id="line802">802.  void</span>
+
  <span id="line802">802. void</span>
  <span id="line803">803.  adjabil(oldlevel, newlevel)</span>
+
  <span id="line803">803. adjabil(oldlevel, newlevel)</span>
  <span id="line804">804.  int oldlevel, newlevel;</span>
+
  <span id="line804">804. int oldlevel, newlevel;</span>
  <span id="line805">805.  {</span>
+
  <span id="line805">805. {</span>
  <span id="line806">806.      register const struct innate *abil, *rabil;</span>
+
  <span id="line806">806.    register const struct innate *abil, *rabil;</span>
  <span id="line807">807.      long prevabil, mask = FROMEXPER;</span>
+
  <span id="line807">807.    long prevabil, mask = FROMEXPER;</span>
  <span id="line808">808.  </span>
+
  <span id="line808">808. </span>
  <span id="line809">809.      switch (Role_switch) {</span>
+
  <span id="line809">809.    switch (Role_switch) {</span>
  <span id="line810">810.      case PM_ARCHEOLOGIST:</span>
+
  <span id="line810">810.    case PM_ARCHEOLOGIST:</span>
  <span id="line811">811.          abil = arc_abil;</span>
+
  <span id="line811">811.        abil = arc_abil;</span>
  <span id="line812">812.          break;</span>
+
  <span id="line812">812.        break;</span>
  <span id="line813">813.      case PM_BARBARIAN:</span>
+
  <span id="line813">813.    case PM_BARBARIAN:</span>
  <span id="line814">814.          abil = bar_abil;</span>
+
  <span id="line814">814.        abil = bar_abil;</span>
  <span id="line815">815.          break;</span>
+
  <span id="line815">815.        break;</span>
  <span id="line816">816.      case PM_CAVEMAN:</span>
+
  <span id="line816">816.    case PM_CAVEMAN:</span>
  <span id="line817">817.          abil = cav_abil;</span>
+
  <span id="line817">817.        abil = cav_abil;</span>
  <span id="line818">818.          break;</span>
+
  <span id="line818">818.        break;</span>
  <span id="line819">819.      case PM_HEALER:</span>
+
  <span id="line819">819.    case PM_HEALER:</span>
  <span id="line820">820.          abil = hea_abil;</span>
+
  <span id="line820">820.        abil = hea_abil;</span>
  <span id="line821">821.          break;</span>
+
  <span id="line821">821.        break;</span>
  <span id="line822">822.      case PM_KNIGHT:</span>
+
  <span id="line822">822.    case PM_KNIGHT:</span>
  <span id="line823">823.          abil = kni_abil;</span>
+
  <span id="line823">823.        abil = kni_abil;</span>
  <span id="line824">824.          break;</span>
+
  <span id="line824">824.        break;</span>
  <span id="line825">825.      case PM_MONK:</span>
+
  <span id="line825">825.    case PM_MONK:</span>
  <span id="line826">826.          abil = mon_abil;</span>
+
  <span id="line826">826.        abil = mon_abil;</span>
  <span id="line827">827.          break;</span>
+
  <span id="line827">827.        break;</span>
  <span id="line828">828.      case PM_PRIEST:</span>
+
  <span id="line828">828.    case PM_PRIEST:</span>
  <span id="line829">829.          abil = pri_abil;</span>
+
  <span id="line829">829.        abil = pri_abil;</span>
  <span id="line830">830.          break;</span>
+
  <span id="line830">830.        break;</span>
  <span id="line831">831.      case PM_RANGER:</span>
+
  <span id="line831">831.    case PM_RANGER:</span>
  <span id="line832">832.          abil = ran_abil;</span>
+
  <span id="line832">832.        abil = ran_abil;</span>
  <span id="line833">833.          break;</span>
+
  <span id="line833">833.        break;</span>
  <span id="line834">834.      case PM_ROGUE:</span>
+
  <span id="line834">834.    case PM_ROGUE:</span>
  <span id="line835">835.          abil = rog_abil;</span>
+
  <span id="line835">835.        abil = rog_abil;</span>
  <span id="line836">836.          break;</span>
+
  <span id="line836">836.        break;</span>
  <span id="line837">837.      case PM_SAMURAI:</span>
+
  <span id="line837">837.    case PM_SAMURAI:</span>
  <span id="line838">838.          abil = sam_abil;</span>
+
  <span id="line838">838.        abil = sam_abil;</span>
  <span id="line839">839.          break;</span>
+
  <span id="line839">839.        break;</span>
  <span id="line840">840.      case PM_TOURIST:</span>
+
  <span id="line840">840.    case PM_TOURIST:</span>
  <span id="line841">841.          abil = tou_abil;</span>
+
  <span id="line841">841.        abil = tou_abil;</span>
  <span id="line842">842.          break;</span>
+
  <span id="line842">842.        break;</span>
  <span id="line843">843.      case PM_VALKYRIE:</span>
+
  <span id="line843">843.    case PM_VALKYRIE:</span>
  <span id="line844">844.          abil = val_abil;</span>
+
  <span id="line844">844.        abil = val_abil;</span>
  <span id="line845">845.          break;</span>
+
  <span id="line845">845.        break;</span>
  <span id="line846">846.      case PM_WIZARD:</span>
+
  <span id="line846">846.    case PM_WIZARD:</span>
  <span id="line847">847.          abil = wiz_abil;</span>
+
  <span id="line847">847.        abil = wiz_abil;</span>
  <span id="line848">848.          break;</span>
+
  <span id="line848">848.        break;</span>
  <span id="line849">849.      default:</span>
+
  <span id="line849">849.    default:</span>
  <span id="line850">850.          abil = 0;</span>
+
  <span id="line850">850.        abil = 0;</span>
  <span id="line851">851.          break;</span>
+
  <span id="line851">851.        break;</span>
  <span id="line852">852.      }</span>
+
  <span id="line852">852.    }</span>
  <span id="line853">853.  </span>
+
  <span id="line853">853. </span>
  <span id="line854">854.      switch (Race_switch) {</span>
+
  <span id="line854">854.    switch (Race_switch) {</span>
  <span id="line855">855.      case PM_ELF:</span>
+
  <span id="line855">855.    case PM_ELF:</span>
  <span id="line856">856.          rabil = elf_abil;</span>
+
  <span id="line856">856.        rabil = elf_abil;</span>
  <span id="line857">857.          break;</span>
+
  <span id="line857">857.        break;</span>
  <span id="line858">858.      case PM_ORC:</span>
+
  <span id="line858">858.    case PM_ORC:</span>
  <span id="line859">859.          rabil = orc_abil;</span>
+
  <span id="line859">859.        rabil = orc_abil;</span>
  <span id="line860">860.          break;</span>
+
  <span id="line860">860.        break;</span>
  <span id="line861">861.      case PM_HUMAN:</span>
+
  <span id="line861">861.    case PM_HUMAN:</span>
  <span id="line862">862.      case PM_DWARF:</span>
+
  <span id="line862">862.    case PM_DWARF:</span>
  <span id="line863">863.      case PM_GNOME:</span>
+
  <span id="line863">863.    case PM_GNOME:</span>
  <span id="line864">864.      default:</span>
+
  <span id="line864">864.    default:</span>
  <span id="line865">865.          rabil = 0;</span>
+
  <span id="line865">865.        rabil = 0;</span>
  <span id="line866">866.          break;</span>
+
  <span id="line866">866.        break;</span>
  <span id="line867">867.      }</span>
+
  <span id="line867">867.    }</span>
  <span id="line868">868.  </span>
+
  <span id="line868">868. </span>
  <span id="line869">869.      while (abil || rabil) {</span>
+
  <span id="line869">869.    while (abil || rabil) {</span>
  <span id="line870">870.          /* Have we finished with the intrinsics list? */</span>
+
  <span id="line870">870.        /* Have we finished with the intrinsics list? */</span>
  <span id="line871">871.          if (!abil || !abil->ability) {</span>
+
  <span id="line871">871.        if (!abil || !abil->ability) {</span>
  <span id="line872">872.              /* Try the race intrinsics */</span>
+
  <span id="line872">872.            /* Try the race intrinsics */</span>
  <span id="line873">873.              if (!rabil || !rabil->ability)</span>
+
  <span id="line873">873.            if (!rabil || !rabil->ability)</span>
  <span id="line874">874.                  break;</span>
+
  <span id="line874">874.                break;</span>
  <span id="line875">875.              abil = rabil;</span>
+
  <span id="line875">875.            abil = rabil;</span>
  <span id="line876">876.              rabil = 0;</span>
+
  <span id="line876">876.            rabil = 0;</span>
  <span id="line877">877.              mask = FROMRACE;</span>
+
  <span id="line877">877.            mask = FROMRACE;</span>
  <span id="line878">878.          }</span>
+
  <span id="line878">878.        }</span>
  <span id="line879">879.          prevabil = *(abil->ability);</span>
+
  <span id="line879">879.        prevabil = *(abil->ability);</span>
  <span id="line880">880.          if (oldlevel < abil->ulevel && newlevel >= abil->ulevel) {</span>
+
  <span id="line880">880.        if (oldlevel < abil->ulevel && newlevel >= abil->ulevel) {</span>
  <span id="line881">881.              /* Abilities gained at level 1 can never be lost</span>
+
  <span id="line881">881.            /* Abilities gained at level 1 can never be lost</span>
  <span id="line882">882.              * via level loss, only via means that remove _any_</span>
+
  <span id="line882">882.              * via level loss, only via means that remove _any_</span>
  <span id="line883">883.              * sort of ability.  A "gain" of such an ability from</span>
+
  <span id="line883">883.              * sort of ability.  A "gain" of such an ability from</span>
  <span id="line884">884.              * an outside source is devoid of meaning, so we set</span>
+
  <span id="line884">884.              * an outside source is devoid of meaning, so we set</span>
  <span id="line885">885.              * FROMOUTSIDE to avoid such gains.</span>
+
  <span id="line885">885.              * FROMOUTSIDE to avoid such gains.</span>
  <span id="line886">886.              */</span>
+
  <span id="line886">886.              */</span>
  <span id="line887">887.              if (abil->ulevel == 1)</span>
+
  <span id="line887">887.            if (abil->ulevel == 1)</span>
  <span id="line888">888.                  *(abil->ability) |= (mask | FROMOUTSIDE);</span>
+
  <span id="line888">888.                *(abil->ability) |= (mask | FROMOUTSIDE);</span>
  <span id="line889">889.              else</span>
+
  <span id="line889">889.            else</span>
  <span id="line890">890.                  *(abil->ability) |= mask;</span>
+
  <span id="line890">890.                *(abil->ability) |= mask;</span>
  <span id="line891">891.              if (!(*(abil->ability) & INTRINSIC & ~mask)) {</span>
+
  <span id="line891">891.            if (!(*(abil->ability) & INTRINSIC & ~mask)) {</span>
  <span id="line892">892.                  if (*(abil->gainstr))</span>
+
  <span id="line892">892.                if (*(abil->gainstr))</span>
  <span id="line893">893.                      You_feel("%s!", abil->gainstr);</span>
+
  <span id="line893">893.                    You_feel("%s!", abil->gainstr);</span>
  <span id="line894">894.              }</span>
+
  <span id="line894">894.            }</span>
  <span id="line895">895.          } else if (oldlevel >= abil->ulevel && newlevel < abil->ulevel) {</span>
+
  <span id="line895">895.        } else if (oldlevel >= abil->ulevel && newlevel < abil->ulevel) {</span>
  <span id="line896">896.              *(abil->ability) &= ~mask;</span>
+
  <span id="line896">896.            *(abil->ability) &= ~mask;</span>
  <span id="line897">897.              if (!(*(abil->ability) & INTRINSIC)) {</span>
+
  <span id="line897">897.            if (!(*(abil->ability) & INTRINSIC)) {</span>
  <span id="line898">898.                  if (*(abil->losestr))</span>
+
  <span id="line898">898.                if (*(abil->losestr))</span>
  <span id="line899">899.                      You_feel("%s!", abil->losestr);</span>
+
  <span id="line899">899.                    You_feel("%s!", abil->losestr);</span>
  <span id="line900">900.                  else if (*(abil->gainstr))</span>
+
  <span id="line900">900.                else if (*(abil->gainstr))</span>
  <span id="line901">901.                      You_feel("less %s!", abil->gainstr);</span>
+
  <span id="line901">901.                    You_feel("less %s!", abil->gainstr);</span>
  <span id="line902">902.              }</span>
+
  <span id="line902">902.            }</span>
  <span id="line903">903.          }</span>
+
  <span id="line903">903.        }</span>
  <span id="line904">904.          if (prevabil != *(abil->ability)) /* it changed */</span>
+
  <span id="line904">904.        if (prevabil != *(abil->ability)) /* it changed */</span>
  <span id="line905">905.              postadjabil(abil->ability);</span>
+
  <span id="line905">905.            postadjabil(abil->ability);</span>
  <span id="line906">906.          abil++;</span>
+
  <span id="line906">906.        abil++;</span>
  <span id="line907">907.      }</span>
+
  <span id="line907">907.    }</span>
  <span id="line908">908.  </span>
+
  <span id="line908">908. </span>
  <span id="line909">909.      if (oldlevel > 0) {</span>
+
  <span id="line909">909.    if (oldlevel > 0) {</span>
  <span id="line910">910.          if (newlevel > oldlevel)</span>
+
  <span id="line910">910.        if (newlevel > oldlevel)</span>
  <span id="line911">911.              add_weapon_skill(newlevel - oldlevel);</span>
+
  <span id="line911">911.            add_weapon_skill(newlevel - oldlevel);</span>
  <span id="line912">912.          else</span>
+
  <span id="line912">912.        else</span>
  <span id="line913">913.              lose_weapon_skill(oldlevel - newlevel);</span>
+
  <span id="line913">913.            lose_weapon_skill(oldlevel - newlevel);</span>
  <span id="line914">914.      }</span>
+
  <span id="line914">914.    }</span>
  <span id="line915">915.  }</span>
+
  <span id="line915">915. }</span>
  <span id="line916">916.  </span>
+
  <span id="line916">916. </span>
  
 
== newhp ==
 
== newhp ==
 
 
  <span id="line917">917.  int</span>
+
  <span id="line917">917. int</span>
  <span id="line918">918.  newhp()</span>
+
  <span id="line918">918. newhp()</span>
  <span id="line919">919.  {</span>
+
  <span id="line919">919. {</span>
  <span id="line920">920.      int hp, conplus;</span>
+
  <span id="line920">920.    int hp, conplus;</span>
  <span id="line921">921.  </span>
+
  <span id="line921">921. </span>
  <span id="line922">922.      if (u.ulevel == 0) {</span>
+
  <span id="line922">922.    if (u.ulevel == 0) {</span>
  <span id="line923">923.          /* Initialize hit points */</span>
+
  <span id="line923">923.        /* Initialize hit points */</span>
  <span id="line924">924.          hp = urole.hpadv.infix + urace.hpadv.infix;</span>
+
  <span id="line924">924.        hp = urole.hpadv.infix + urace.hpadv.infix;</span>
  <span id="line925">925.          if (urole.hpadv.inrnd > 0)</span>
+
  <span id="line925">925.        if (urole.hpadv.inrnd > 0)</span>
  <span id="line926">926.              hp += rnd(urole.hpadv.inrnd);</span>
+
  <span id="line926">926.            hp += rnd(urole.hpadv.inrnd);</span>
  <span id="line927">927.          if (urace.hpadv.inrnd > 0)</span>
+
  <span id="line927">927.        if (urace.hpadv.inrnd > 0)</span>
  <span id="line928">928.              hp += rnd(urace.hpadv.inrnd);</span>
+
  <span id="line928">928.            hp += rnd(urace.hpadv.inrnd);</span>
  <span id="line929">929.          if (moves <= 1L) { /* initial hero; skip for polyself to new man */</span>
+
  <span id="line929">929.        if (moves <= 1L) { /* initial hero; skip for polyself to new man */</span>
  <span id="line930">930.              /* Initialize alignment stuff */</span>
+
  <span id="line930">930.            /* Initialize alignment stuff */</span>
  <span id="line931">931.              u.ualign.type = aligns[flags.initalign].value;</span>
+
  <span id="line931">931.            u.ualign.type = aligns[flags.initalign].value;</span>
  <span id="line932">932.              u.ualign.record = urole.initrecord;</span>
+
  <span id="line932">932.            u.ualign.record = urole.initrecord;</span>
  <span id="line933">933.          }</span>
+
  <span id="line933">933.        }</span>
  <span id="line934">934.          /* no Con adjustment for initial hit points */</span>
+
  <span id="line934">934.        /* no Con adjustment for initial hit points */</span>
  <span id="line935">935.      } else {</span>
+
  <span id="line935">935.    } else {</span>
  <span id="line936">936.          if (u.ulevel < urole.xlev) {</span>
+
  <span id="line936">936.        if (u.ulevel < urole.xlev) {</span>
  <span id="line937">937.              hp = urole.hpadv.lofix + urace.hpadv.lofix;</span>
+
  <span id="line937">937.            hp = urole.hpadv.lofix + urace.hpadv.lofix;</span>
  <span id="line938">938.              if (urole.hpadv.lornd > 0)</span>
+
  <span id="line938">938.            if (urole.hpadv.lornd > 0)</span>
  <span id="line939">939.                  hp += rnd(urole.hpadv.lornd);</span>
+
  <span id="line939">939.                hp += rnd(urole.hpadv.lornd);</span>
  <span id="line940">940.              if (urace.hpadv.lornd > 0)</span>
+
  <span id="line940">940.            if (urace.hpadv.lornd > 0)</span>
  <span id="line941">941.                  hp += rnd(urace.hpadv.lornd);</span>
+
  <span id="line941">941.                hp += rnd(urace.hpadv.lornd);</span>
  <span id="line942">942.          } else {</span>
+
  <span id="line942">942.        } else {</span>
  <span id="line943">943.              hp = urole.hpadv.hifix + urace.hpadv.hifix;</span>
+
  <span id="line943">943.            hp = urole.hpadv.hifix + urace.hpadv.hifix;</span>
  <span id="line944">944.              if (urole.hpadv.hirnd > 0)</span>
+
  <span id="line944">944.            if (urole.hpadv.hirnd > 0)</span>
  <span id="line945">945.                  hp += rnd(urole.hpadv.hirnd);</span>
+
  <span id="line945">945.                hp += rnd(urole.hpadv.hirnd);</span>
  <span id="line946">946.              if (urace.hpadv.hirnd > 0)</span>
+
  <span id="line946">946.            if (urace.hpadv.hirnd > 0)</span>
  <span id="line947">947.                  hp += rnd(urace.hpadv.hirnd);</span>
+
  <span id="line947">947.                hp += rnd(urace.hpadv.hirnd);</span>
  <span id="line948">948.          }</span>
+
  <span id="line948">948.        }</span>
  <span id="line949">949.          if (ACURR(A_CON) <= 3)</span>
+
  <span id="line949">949.        if (ACURR(A_CON) <= 3)</span>
  <span id="line950">950.              conplus = -2;</span>
+
  <span id="line950">950.            conplus = -2;</span>
  <span id="line951">951.          else if (ACURR(A_CON) <= 6)</span>
+
  <span id="line951">951.        else if (ACURR(A_CON) <= 6)</span>
  <span id="line952">952.              conplus = -1;</span>
+
  <span id="line952">952.            conplus = -1;</span>
  <span id="line953">953.          else if (ACURR(A_CON) <= 14)</span>
+
  <span id="line953">953.        else if (ACURR(A_CON) <= 14)</span>
  <span id="line954">954.              conplus = 0;</span>
+
  <span id="line954">954.            conplus = 0;</span>
  <span id="line955">955.          else if (ACURR(A_CON) <= 16)</span>
+
  <span id="line955">955.        else if (ACURR(A_CON) <= 16)</span>
  <span id="line956">956.              conplus = 1;</span>
+
  <span id="line956">956.            conplus = 1;</span>
  <span id="line957">957.          else if (ACURR(A_CON) == 17)</span>
+
  <span id="line957">957.        else if (ACURR(A_CON) == 17)</span>
  <span id="line958">958.              conplus = 2;</span>
+
  <span id="line958">958.            conplus = 2;</span>
  <span id="line959">959.          else if (ACURR(A_CON) == 18)</span>
+
  <span id="line959">959.        else if (ACURR(A_CON) == 18)</span>
  <span id="line960">960.              conplus = 3;</span>
+
  <span id="line960">960.            conplus = 3;</span>
  <span id="line961">961.          else</span>
+
  <span id="line961">961.        else</span>
  <span id="line962">962.              conplus = 4;</span>
+
  <span id="line962">962.            conplus = 4;</span>
  <span id="line963">963.          hp += conplus;</span>
+
  <span id="line963">963.        hp += conplus;</span>
  <span id="line964">964.      }</span>
+
  <span id="line964">964.    }</span>
  <span id="line965">965.      if (hp <= 0)</span>
+
  <span id="line965">965.    if (hp <= 0)</span>
  <span id="line966">966.          hp = 1;</span>
+
  <span id="line966">966.        hp = 1;</span>
  <span id="line967">967.      if (u.ulevel < MAXULEV)</span>
+
  <span id="line967">967.    if (u.ulevel < MAXULEV)</span>
  <span id="line968">968.          u.uhpinc[u.ulevel] = (xchar) hp;</span>
+
  <span id="line968">968.        u.uhpinc[u.ulevel] = (xchar) hp;</span>
  <span id="line969">969.      return hp;</span>
+
  <span id="line969">969.    return hp;</span>
  <span id="line970">970.  }</span>
+
  <span id="line970">970. }</span>
  <span id="line971">971.  </span>
+
  <span id="line971">971. </span>
  
 
== acurr ==
 
== acurr ==
 
 
  <span id="line972">972.  schar</span>
+
  <span id="line972">972. schar</span>
  <span id="line973">973.  acurr(x)</span>
+
  <span id="line973">973. acurr(x)</span>
  <span id="line974">974.  int x;</span>
+
  <span id="line974">974. int x;</span>
  <span id="line975">975.  {</span>
+
  <span id="line975">975. {</span>
  <span id="line976">976.      register int tmp = (u.abon.a[x] + u.atemp.a[x] + u.acurr.a[x]);</span>
+
  <span id="line976">976.    register int tmp = (u.abon.a[x] + u.atemp.a[x] + u.acurr.a[x]);</span>
  <span id="line977">977.  </span>
+
  <span id="line977">977. </span>
  <span id="line978">978.      if (x == A_STR) {</span>
+
  <span id="line978">978.    if (x == A_STR) {</span>
  <span id="line979">979.          if (tmp >= 125 || (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER))</span>
+
  <span id="line979">979.        if (tmp >= 125 || (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER))</span>
  <span id="line980">980.              return (schar) 125;</span>
+
  <span id="line980">980.            return (schar) 125;</span>
  <span id="line981">981.          else</span>
+
  <span id="line981">981.        else</span>
  <span id="line982">982.  #ifdef WIN32_BUG</span>
+
  <span id="line982">982. #ifdef WIN32_BUG</span>
  <span id="line983">983.              return (x = ((tmp <= 3) ? 3 : tmp));</span>
+
  <span id="line983">983.            return (x = ((tmp <= 3) ? 3 : tmp));</span>
  <span id="line984">984.  #else</span>
+
  <span id="line984">984. #else</span>
  <span id="line985">985.          return (schar) ((tmp <= 3) ? 3 : tmp);</span>
+
  <span id="line985">985.        return (schar) ((tmp <= 3) ? 3 : tmp);</span>
  <span id="line986">986.  #endif</span>
+
  <span id="line986">986. #endif</span>
  <span id="line987">987.      } else if (x == A_CHA) {</span>
+
  <span id="line987">987.    } else if (x == A_CHA) {</span>
  <span id="line988">988.          if (tmp < 18</span>
+
  <span id="line988">988.        if (tmp < 18</span>
  <span id="line989">989.              && (youmonst.data->mlet == S_NYMPH || u.umonnum == PM_SUCCUBUS</span>
+
  <span id="line989">989.            && (youmonst.data->mlet == S_NYMPH || u.umonnum == PM_SUCCUBUS</span>
  <span id="line990">990.                  || u.umonnum == PM_INCUBUS))</span>
+
  <span id="line990">990.                || u.umonnum == PM_INCUBUS))</span>
  <span id="line991">991.              return (schar) 18;</span>
+
  <span id="line991">991.            return (schar) 18;</span>
  <span id="line992">992.      } else if (x == A_INT || x == A_WIS) {</span>
+
  <span id="line992">992.    } else if (x == A_INT || x == A_WIS) {</span>
  <span id="line993">993.          /* yes, this may raise int/wis if player is sufficiently</span>
+
  <span id="line993">993.        /* yes, this may raise int/wis if player is sufficiently</span>
  <span id="line994">994.          * stupid.  there are lower levels of cognition than "dunce".</span>
+
  <span id="line994">994.          * stupid.  there are lower levels of cognition than "dunce".</span>
  <span id="line995">995.          */</span>
+
  <span id="line995">995.          */</span>
  <span id="line996">996.          if (uarmh && uarmh->otyp == DUNCE_CAP)</span>
+
  <span id="line996">996.        if (uarmh && uarmh->otyp == DUNCE_CAP)</span>
  <span id="line997">997.              return (schar) 6;</span>
+
  <span id="line997">997.            return (schar) 6;</span>
  <span id="line998">998.      }</span>
+
  <span id="line998">998.    }</span>
 
  <span id="line999">999.  #ifdef WIN32_BUG</span>
 
  <span id="line999">999.  #ifdef WIN32_BUG</span>
  <span id="line1000">1000.      return (x = ((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp));</span>
+
  <span id="line1000">1000.    return (x = ((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp));</span>
  <span id="line1001">1001.  #else</span>
+
  <span id="line1001">1001. #else</span>
  <span id="line1002">1002.      return (schar) ((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp);</span>
+
  <span id="line1002">1002.    return (schar) ((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp);</span>
  <span id="line1003">1003.  #endif</span>
+
  <span id="line1003">1003. #endif</span>
  <span id="line1004">1004.  }</span>
+
  <span id="line1004">1004. }</span>
  <span id="line1005">1005.  </span>
+
  <span id="line1005">1005. </span>
  
 
== acurrstr ==
 
== acurrstr ==
 
 
  <span id="line1006">1006.  /* condense clumsy ACURR(A_STR) value into value that fits into game formulas</span>
+
  <span id="line1006">1006. /* condense clumsy ACURR(A_STR) value into value that fits into game formulas</span>
  <span id="line1007">1007.  */</span>
+
  <span id="line1007">1007.  */</span>
  <span id="line1008">1008.  schar</span>
+
  <span id="line1008">1008. schar</span>
  <span id="line1009">1009.  acurrstr()</span>
+
  <span id="line1009">1009. acurrstr()</span>
  <span id="line1010">1010.  {</span>
+
  <span id="line1010">1010. {</span>
  <span id="line1011">1011.      register int str = ACURR(A_STR);</span>
+
  <span id="line1011">1011.    register int str = ACURR(A_STR);</span>
  <span id="line1012">1012.  </span>
+
  <span id="line1012">1012. </span>
  <span id="line1013">1013.      if (str <= 18)</span>
+
  <span id="line1013">1013.    if (str <= 18)</span>
  <span id="line1014">1014.          return (schar) str;</span>
+
  <span id="line1014">1014.        return (schar) str;</span>
  <span id="line1015">1015.      if (str <= 121)</span>
+
  <span id="line1015">1015.    if (str <= 121)</span>
  <span id="line1016">1016.          return (schar) (19 + str / 50); /* map to 19..21 */</span>
+
  <span id="line1016">1016.        return (schar) (19 + str / 50); /* map to 19..21 */</span>
  <span id="line1017">1017.      else</span>
+
  <span id="line1017">1017.    else</span>
  <span id="line1018">1018.          return (schar) (min(str, 125) - 100); /* 22..25 */</span>
+
  <span id="line1018">1018.        return (schar) (min(str, 125) - 100); /* 22..25 */</span>
  <span id="line1019">1019.  }</span>
+
  <span id="line1019">1019. }</span>
  <span id="line1020">1020.  </span>
+
  <span id="line1020">1020. </span>
  
 
== extremeattr ==
 
== extremeattr ==
 
 
  <span id="line1021">1021.  /* when wearing (or taking off) an unID'd item, this routine is used</span>
+
  <span id="line1021">1021. /* when wearing (or taking off) an unID'd item, this routine is used</span>
  <span id="line1022">1022.    to distinguish between observable +0 result and no-visible-effect</span>
+
  <span id="line1022">1022.    to distinguish between observable +0 result and no-visible-effect</span>
  <span id="line1023">1023.    due to an attribute not being able to exceed maximum or minimum */</span>
+
  <span id="line1023">1023.    due to an attribute not being able to exceed maximum or minimum */</span>
  <span id="line1024">1024.  boolean</span>
+
  <span id="line1024">1024. boolean</span>
  <span id="line1025">1025.  extremeattr(attrindx) /* does attrindx's value match its max or min? */</span>
+
  <span id="line1025">1025. extremeattr(attrindx) /* does attrindx's value match its max or min? */</span>
  <span id="line1026">1026.  int attrindx;</span>
+
  <span id="line1026">1026. int attrindx;</span>
  <span id="line1027">1027.  {</span>
+
  <span id="line1027">1027. {</span>
  <span id="line1028">1028.      /* Fixed_abil and racial MINATTR/MAXATTR aren't relevant here */</span>
+
  <span id="line1028">1028.    /* Fixed_abil and racial MINATTR/MAXATTR aren't relevant here */</span>
  <span id="line1029">1029.      int lolimit = 3, hilimit = 25, curval = ACURR(attrindx);</span>
+
  <span id="line1029">1029.    int lolimit = 3, hilimit = 25, curval = ACURR(attrindx);</span>
  <span id="line1030">1030.  </span>
+
  <span id="line1030">1030. </span>
  <span id="line1031">1031.      /* upper limit for Str is 25 but its value is encoded differently */</span>
+
  <span id="line1031">1031.    /* upper limit for Str is 25 but its value is encoded differently */</span>
  <span id="line1032">1032.      if (attrindx == A_STR) {</span>
+
  <span id="line1032">1032.    if (attrindx == A_STR) {</span>
  <span id="line1033">1033.          hilimit = STR19(25); /* 125 */</span>
+
  <span id="line1033">1033.        hilimit = STR19(25); /* 125 */</span>
  <span id="line1034">1034.          /* lower limit for Str can also be 25 */</span>
+
  <span id="line1034">1034.        /* lower limit for Str can also be 25 */</span>
  <span id="line1035">1035.          if (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER)</span>
+
  <span id="line1035">1035.        if (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER)</span>
  <span id="line1036">1036.              lolimit = hilimit;</span>
+
  <span id="line1036">1036.            lolimit = hilimit;</span>
  <span id="line1037">1037.      }</span>
+
  <span id="line1037">1037.    }</span>
  <span id="line1038">1038.      /* this exception is hypothetical; the only other worn item affecting</span>
+
  <span id="line1038">1038.    /* this exception is hypothetical; the only other worn item affecting</span>
  <span id="line1039">1039.        Int or Wis is another helmet so can't be in use at the same time */</span>
+
  <span id="line1039">1039.        Int or Wis is another helmet so can't be in use at the same time */</span>
  <span id="line1040">1040.      if (attrindx == A_INT || attrindx == A_WIS) {</span>
+
  <span id="line1040">1040.    if (attrindx == A_INT || attrindx == A_WIS) {</span>
  <span id="line1041">1041.          if (uarmh && uarmh->otyp == DUNCE_CAP)</span>
+
  <span id="line1041">1041.        if (uarmh && uarmh->otyp == DUNCE_CAP)</span>
  <span id="line1042">1042.              hilimit = lolimit = 6;</span>
+
  <span id="line1042">1042.            hilimit = lolimit = 6;</span>
  <span id="line1043">1043.      }</span>
+
  <span id="line1043">1043.    }</span>
  <span id="line1044">1044.  </span>
+
  <span id="line1044">1044. </span>
  <span id="line1045">1045.      /* are we currently at either limit? */</span>
+
  <span id="line1045">1045.    /* are we currently at either limit? */</span>
  <span id="line1046">1046.      return (curval == lolimit || curval == hilimit) ? TRUE : FALSE;</span>
+
  <span id="line1046">1046.    return (curval == lolimit || curval == hilimit) ? TRUE : FALSE;</span>
  <span id="line1047">1047.  }</span>
+
  <span id="line1047">1047. }</span>
  <span id="line1048">1048.  </span>
+
  <span id="line1048">1048. </span>
  
 
== adjalign ==
 
== adjalign ==
 
 
  <span id="line1049">1049.  /* avoid possible problems with alignment overflow, and provide a centralized</span>
+
  <span id="line1049">1049. /* avoid possible problems with alignment overflow, and provide a centralized</span>
  <span id="line1050">1050.    location for any future alignment limits */</span>
+
  <span id="line1050">1050.    location for any future alignment limits */</span>
  <span id="line1051">1051.  void</span>
+
  <span id="line1051">1051. void</span>
  <span id="line1052">1052.  adjalign(n)</span>
+
  <span id="line1052">1052. adjalign(n)</span>
  <span id="line1053">1053.  int n;</span>
+
  <span id="line1053">1053. int n;</span>
  <span id="line1054">1054.  {</span>
+
  <span id="line1054">1054. {</span>
  <span id="line1055">1055.      int newalign = u.ualign.record + n;</span>
+
  <span id="line1055">1055.    int newalign = u.ualign.record + n;</span>
  <span id="line1056">1056.  </span>
+
  <span id="line1056">1056. </span>
  <span id="line1057">1057.      if (n < 0) {</span>
+
  <span id="line1057">1057.    if (n < 0) {</span>
  <span id="line1058">1058.          if (newalign < u.ualign.record)</span>
+
  <span id="line1058">1058.        if (newalign < u.ualign.record)</span>
  <span id="line1059">1059.              u.ualign.record = newalign;</span>
+
  <span id="line1059">1059.            u.ualign.record = newalign;</span>
  <span id="line1060">1060.      } else if (newalign > u.ualign.record) {</span>
+
  <span id="line1060">1060.    } else if (newalign > u.ualign.record) {</span>
  <span id="line1061">1061.          u.ualign.record = newalign;</span>
+
  <span id="line1061">1061.        u.ualign.record = newalign;</span>
  <span id="line1062">1062.          if (u.ualign.record > ALIGNLIM)</span>
+
  <span id="line1062">1062.        if (u.ualign.record > ALIGNLIM)</span>
  <span id="line1063">1063.              u.ualign.record = ALIGNLIM;</span>
+
  <span id="line1063">1063.            u.ualign.record = ALIGNLIM;</span>
  <span id="line1064">1064.      }</span>
+
  <span id="line1064">1064.    }</span>
  <span id="line1065">1065.  }</span>
+
  <span id="line1065">1065. }</span>
  <span id="line1066">1066.  </span>
+
  <span id="line1066">1066. </span>
  
 
== uchangealign ==
 
== uchangealign ==
 
 
  <span id="line1067">1067.  /* change hero's alignment type, possibly losing use of artifacts */</span>
+
  <span id="line1067">1067. /* change hero's alignment type, possibly losing use of artifacts */</span>
  <span id="line1068">1068.  void</span>
+
  <span id="line1068">1068. void</span>
  <span id="line1069">1069.  uchangealign(newalign, reason)</span>
+
  <span id="line1069">1069. uchangealign(newalign, reason)</span>
  <span id="line1070">1070.  int newalign;</span>
+
  <span id="line1070">1070. int newalign;</span>
  <span id="line1071">1071.  int reason; /* 0==conversion, 1==helm-of-OA on, 2==helm-of-OA off */</span>
+
  <span id="line1071">1071. int reason; /* 0==conversion, 1==helm-of-OA on, 2==helm-of-OA off */</span>
  <span id="line1072">1072.  {</span>
+
  <span id="line1072">1072. {</span>
  <span id="line1073">1073.      aligntyp oldalign = u.ualign.type;</span>
+
  <span id="line1073">1073.    aligntyp oldalign = u.ualign.type;</span>
  <span id="line1074">1074.  </span>
+
  <span id="line1074">1074. </span>
  <span id="line1075">1075.      u.ublessed = 0;  /* lose divine protection */</span>
+
  <span id="line1075">1075.    u.ublessed = 0;  /* lose divine protection */</span>
  <span id="line1076">1076.      context.botl = 1; /* status line needs updating */</span>
+
  <span id="line1076">1076.    context.botl = 1; /* status line needs updating */</span>
  <span id="line1077">1077.      if (reason == 0) {</span>
+
  <span id="line1077">1077.    if (reason == 0) {</span>
  <span id="line1078">1078.          /* conversion via altar */</span>
+
  <span id="line1078">1078.        /* conversion via altar */</span>
  <span id="line1079">1079.          u.ualignbase[A_CURRENT] = (aligntyp) newalign;</span>
+
  <span id="line1079">1079.        u.ualignbase[A_CURRENT] = (aligntyp) newalign;</span>
  <span id="line1080">1080.          /* worn helm of opposite alignment might block change */</span>
+
  <span id="line1080">1080.        /* worn helm of opposite alignment might block change */</span>
  <span id="line1081">1081.          if (!uarmh || uarmh->otyp != HELM_OF_OPPOSITE_ALIGNMENT)</span>
+
  <span id="line1081">1081.        if (!uarmh || uarmh->otyp != HELM_OF_OPPOSITE_ALIGNMENT)</span>
  <span id="line1082">1082.              u.ualign.type = u.ualignbase[A_CURRENT];</span>
+
  <span id="line1082">1082.            u.ualign.type = u.ualignbase[A_CURRENT];</span>
  <span id="line1083">1083.          You("have a %ssense of a new direction.",</span>
+
  <span id="line1083">1083.        You("have a %ssense of a new direction.",</span>
  <span id="line1084">1084.              (u.ualign.type != oldalign) ? "sudden " : "");</span>
+
  <span id="line1084">1084.            (u.ualign.type != oldalign) ? "sudden " : "");</span>
  <span id="line1085">1085.      } else {</span>
+
  <span id="line1085">1085.    } else {</span>
  <span id="line1086">1086.          /* putting on or taking off a helm of opposite alignment */</span>
+
  <span id="line1086">1086.        /* putting on or taking off a helm of opposite alignment */</span>
  <span id="line1087">1087.          u.ualign.type = (aligntyp) newalign;</span>
+
  <span id="line1087">1087.        u.ualign.type = (aligntyp) newalign;</span>
  <span id="line1088">1088.          if (reason == 1)</span>
+
  <span id="line1088">1088.        if (reason == 1)</span>
  <span id="line1089">1089.              Your("mind oscillates %s.", Hallucination ? "wildly" : "briefly");</span>
+
  <span id="line1089">1089.            Your("mind oscillates %s.", Hallucination ? "wildly" : "briefly");</span>
  <span id="line1090">1090.          else if (reason == 2)</span>
+
  <span id="line1090">1090.        else if (reason == 2)</span>
  <span id="line1091">1091.              Your("mind is %s.", Hallucination</span>
+
  <span id="line1091">1091.            Your("mind is %s.", Hallucination</span>
  <span id="line1092">1092.                                      ? "much of a muchness"</span>
+
  <span id="line1092">1092.                                    ? "much of a muchness"</span>
  <span id="line1093">1093.                                      : "back in sync with your body");</span>
+
  <span id="line1093">1093.                                    : "back in sync with your body");</span>
  <span id="line1094">1094.      }</span>
+
  <span id="line1094">1094.    }</span>
  <span id="line1095">1095.  </span>
+
  <span id="line1095">1095. </span>
  <span id="line1096">1096.      if (u.ualign.type != oldalign) {</span>
+
  <span id="line1096">1096.    if (u.ualign.type != oldalign) {</span>
  <span id="line1097">1097.          u.ualign.record = 0; /* slate is wiped clean */</span>
+
  <span id="line1097">1097.        u.ualign.record = 0; /* slate is wiped clean */</span>
  <span id="line1098">1098.          retouch_equipment(0);</span>
+
  <span id="line1098">1098.        retouch_equipment(0);</span>
  <span id="line1099">1099.      }</span>
+
  <span id="line1099">1099.    }</span>
  <span id="line1100">1100.  }</span>
+
  <span id="line1100">1100. }</span>
  <span id="line1101">1101.  </span>
+
  <span id="line1101">1101. </span>
  <span id="line1102">1102.  /*attrib.c*/</span>
+
  <span id="line1102">1102. /*attrib.c*/</span>
 
[[Category:NetHack 3.6.0 source code|src/attrib.c]]
 
[[Category:NetHack 3.6.0 source code|src/attrib.c]]

Latest revision as of 14:03, 15 December 2015

Below is the full text to attrib.c from the source code of NetHack 3.6.0. To link to a particular line, write [[Source:NetHack 3.6.0/src/attrib.c#line123]], for example.

The NetHack General Public License applies to screenshots, source code and other content from NetHack.

This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.

Top of file

 /* NetHack 3.6	attrib.c	$NHDT-Date: 1449269911 2015/12/04 22:58:31 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.51 $ */
 /*      Copyright 1988, 1989, 1990, 1992, M. Stephenson           */
 /* NetHack may be freely redistributed.  See license for details. */
 
 /*  attribute modification routines. */
 
 #include "hack.h"
 #include <ctype.h>
 
 /* part of the output on gain or loss of attribute */
 static const char
     *const plusattr[] = { "strong", "smart", "wise",
                           "agile",  "tough", "charismatic" },
     *const minusattr[] = { "weak",    "stupid",
                            "foolish", "clumsy",
                            "fragile", "repulsive" };
 
 static const struct innate {
     schar ulevel;
     long *ability;
     const char *gainstr, *losestr;
 } arc_abil[] = { { 1, &(HStealth), "", "" },
                  { 1, &(HFast), "", "" },
                  { 10, &(HSearching), "perceptive", "" },
                  { 0, 0, 0, 0 } },
 
   bar_abil[] = { { 1, &(HPoison_resistance), "", "" },
                  { 7, &(HFast), "quick", "slow" },
                  { 15, &(HStealth), "stealthy", "" },
                  { 0, 0, 0, 0 } },
 
   cav_abil[] = { { 7, &(HFast), "quick", "slow" },
                  { 15, &(HWarning), "sensitive", "" },
                  { 0, 0, 0, 0 } },
 
   hea_abil[] = { { 1, &(HPoison_resistance), "", "" },
                  { 15, &(HWarning), "sensitive", "" },
                  { 0, 0, 0, 0 } },
 
   kni_abil[] = { { 7, &(HFast), "quick", "slow" }, { 0, 0, 0, 0 } },
 
   mon_abil[] = { { 1, &(HFast), "", "" },
                  { 1, &(HSleep_resistance), "", "" },
                  { 1, &(HSee_invisible), "", "" },
                  { 3, &(HPoison_resistance), "healthy", "" },
                  { 5, &(HStealth), "stealthy", "" },
                  { 7, &(HWarning), "sensitive", "" },
                  { 9, &(HSearching), "perceptive", "unaware" },
                  { 11, &(HFire_resistance), "cool", "warmer" },
                  { 13, &(HCold_resistance), "warm", "cooler" },
                  { 15, &(HShock_resistance), "insulated", "conductive" },
                  { 17, &(HTeleport_control), "controlled", "uncontrolled" },
                  { 0, 0, 0, 0 } },
 
   pri_abil[] = { { 15, &(HWarning), "sensitive", "" },
                  { 20, &(HFire_resistance), "cool", "warmer" },
                  { 0, 0, 0, 0 } },
 
   ran_abil[] = { { 1, &(HSearching), "", "" },
                  { 7, &(HStealth), "stealthy", "" },
                  { 15, &(HSee_invisible), "", "" },
                  { 0, 0, 0, 0 } },
 
   rog_abil[] = { { 1, &(HStealth), "", "" },
                  { 10, &(HSearching), "perceptive", "" },
                  { 0, 0, 0, 0 } },
 
   sam_abil[] = { { 1, &(HFast), "", "" },
                  { 15, &(HStealth), "stealthy", "" },
                  { 0, 0, 0, 0 } },
 
   tou_abil[] = { { 10, &(HSearching), "perceptive", "" },
                  { 20, &(HPoison_resistance), "hardy", "" },
                  { 0, 0, 0, 0 } },
 
   val_abil[] = { { 1, &(HCold_resistance), "", "" },
                  { 1, &(HStealth), "", "" },
                  { 7, &(HFast), "quick", "slow" },
                  { 0, 0, 0, 0 } },
 
   wiz_abil[] = { { 15, &(HWarning), "sensitive", "" },
                  { 17, &(HTeleport_control), "controlled", "uncontrolled" },
                  { 0, 0, 0, 0 } },
 
   /* Intrinsics conferred by race */
     elf_abil[] = { { 4, &(HSleep_resistance), "awake", "tired" },
                    { 0, 0, 0, 0 } },
 
   orc_abil[] = { { 1, &(HPoison_resistance), "", "" }, { 0, 0, 0, 0 } };
 
 STATIC_DCL void NDECL(exerper);
 STATIC_DCL void FDECL(postadjabil, (long *));
 STATIC_DCL const struct innate *FDECL(check_innate_abil, (long *, long));
 STATIC_DCL int FDECL(innately, (long *));
 

adjattrib

 /* adjust an attribute; return TRUE if change is made, FALSE otherwise */
 boolean
 adjattrib(ndx, incr, msgflg)
 int ndx, incr;
 int msgflg; /* positive => no message, zero => message, and */
 {           /* negative => conditional (msg if change made) */
     int old_acurr;
     boolean abonflg;
     const char *attrstr;
 
     if (Fixed_abil || !incr)
         return FALSE;
 
     if ((ndx == A_INT || ndx == A_WIS) && uarmh && uarmh->otyp == DUNCE_CAP) {
         if (msgflg == 0)
             Your("cap constricts briefly, then relaxes again.");
         return FALSE;
     }
 
     old_acurr = ACURR(ndx);
     if (incr > 0) {
         ABASE(ndx) += incr;
         if (ABASE(ndx) > AMAX(ndx)) {
             incr = ABASE(ndx) - AMAX(ndx);
             AMAX(ndx) += incr;
             if (AMAX(ndx) > ATTRMAX(ndx))
                 AMAX(ndx) = ATTRMAX(ndx);
             ABASE(ndx) = AMAX(ndx);
         }
         attrstr = plusattr[ndx];
         abonflg = (ABON(ndx) < 0);
     } else {
         ABASE(ndx) += incr;
         if (ABASE(ndx) < ATTRMIN(ndx)) {
             incr = ABASE(ndx) - ATTRMIN(ndx);
             ABASE(ndx) = ATTRMIN(ndx);
             AMAX(ndx) += incr;
             if (AMAX(ndx) < ATTRMIN(ndx))
                 AMAX(ndx) = ATTRMIN(ndx);
         }
         attrstr = minusattr[ndx];
         abonflg = (ABON(ndx) > 0);
     }
     if (ACURR(ndx) == old_acurr) {
         if (msgflg == 0 && flags.verbose)
             pline("You're %s as %s as you can get.",
                   abonflg ? "currently" : "already", attrstr);
         return FALSE;
     }
 
     if (msgflg <= 0)
         You_feel("%s%s!", (incr > 1 || incr < -1) ? "very " : "", attrstr);
     context.botl = 1;
     if (moves > 1 && (ndx == A_STR || ndx == A_CON))
         (void) encumber_msg();
     return TRUE;
 }
 

gainstr

 void
 gainstr(otmp, incr, givemsg)
 struct obj *otmp;
 int incr;
 boolean givemsg;
 {
     int num = incr;
 
     if (!num) {
         if (ABASE(A_STR) < 18)
             num = (rn2(4) ? 1 : rnd(6));
         else if (ABASE(A_STR) < STR18(85))
             num = rnd(10);
         else
             num = 1;
     }
     (void) adjattrib(A_STR, (otmp && otmp->cursed) ? -num : num,
                      givemsg ? -1 : 1);
 }
 

losestr

 /* may kill you; cause may be poison or monster like 'a' */
 void
 losestr(num)
 register int num;
 {
     int ustr = ABASE(A_STR) - num;
 
     while (ustr < 3) {
         ++ustr;
         --num;
         if (Upolyd) {
             u.mh -= 6;
             u.mhmax -= 6;
         } else {
             u.uhp -= 6;
             u.uhpmax -= 6;
         }
     }
     (void) adjattrib(A_STR, -num, 1);
 }
 

poisontell

 static const struct poison_effect_message {
     void VDECL((*delivery_func), (const char *, ...));
     const char *effect_msg;
 } poiseff[] = {
     { You_feel, "weaker" },             /* A_STR */
     { Your, "brain is on fire" },       /* A_INT */
     { Your, "judgement is impaired" },  /* A_WIS */
     { Your, "muscles won't obey you" }, /* A_DEX */
     { You_feel, "very sick" },          /* A_CON */
     { You, "break out in hives" }       /* A_CHA */
 };
 
 /* feedback for attribute loss due to poisoning */
 void
 poisontell(typ, exclaim)
 int typ;         /* which attribute */
 boolean exclaim; /* emphasis */
 {
     void VDECL((*func), (const char *, ...)) = poiseff[typ].delivery_func;
 
     (*func)("%s%c", poiseff[typ].effect_msg, exclaim ? '!' : '.');
 }
 

poisoned

 /* called when an attack or trap has poisoned the hero (used to be in mon.c)
  */
 void
 poisoned(reason, typ, pkiller, fatal, thrown_weapon)
 const char *reason,    /* controls what messages we display */
     *pkiller;          /* for score+log file if fatal */
 int typ, fatal;        /* if fatal is 0, limit damage to adjattrib */
 boolean thrown_weapon; /* thrown weapons are less deadly */
 {
     int i, loss, kprefix = KILLED_BY_AN;
 
     /* inform player about being poisoned unless that's already been done;
        "blast" has given a "blast of poison gas" message; "poison arrow",
        "poison dart", etc have implicitly given poison messages too... */
     if (strcmp(reason, "blast") && !strstri(reason, "poison")) {
         boolean plural = (reason[strlen(reason) - 1] == 's') ? 1 : 0;
 
         /* avoid "The" Orcus's sting was poisoned... */
         pline("%s%s %s poisoned!", isupper(*reason) ? "" : "The ", reason,
               plural ? "were" : "was");
     }
     if (Poison_resistance) {
         if (!strcmp(reason, "blast"))
             shieldeff(u.ux, u.uy);
         pline_The("poison doesn't seem to affect you.");
         return;
     }
 
     /* suppress killer prefix if it already has one */
     i = name_to_mon(pkiller);
     if (i >= LOW_PM && (mons[i].geno & G_UNIQ)) {
         kprefix = KILLED_BY;
         if (!type_is_pname(&mons[i]))
             pkiller = the(pkiller);
     } else if (!strncmpi(pkiller, "the ", 4) || !strncmpi(pkiller, "an ", 3)
                || !strncmpi(pkiller, "a ", 2)) {
         /*[ does this need a plural check too? ]*/
         kprefix = KILLED_BY;
     }
 
     i = !fatal ? 1 : rn2(fatal + (thrown_weapon ? 20 : 0));
     if (i == 0 && typ != A_CHA) {
         /* instant kill */
         u.uhp = -1;
         pline_The("poison was deadly...");
     } else if (i > 5) {
         /* HP damage; more likely--but less severe--with missiles */
         loss = thrown_weapon ? rnd(6) : rn1(10, 6);
         losehp(loss, pkiller, kprefix); /* poison damage */
     } else {
         /* attribute loss; if typ is A_STR, reduction in current and
            maximum HP will occur once strength has dropped down to 3 */
         loss = (thrown_weapon || !fatal) ? 1 : d(2, 2); /* was rn1(3,3) */
         /* check that a stat change was made */
         if (adjattrib(typ, -loss, 1))
             poisontell(typ, TRUE);
     }
 
     if (u.uhp < 1) {
         killer.format = kprefix;
         Strcpy(killer.name, pkiller);
         /* "Poisoned by a poisoned ___" is redundant */
         done(strstri(pkiller, "poison") ? DIED : POISONING);
     }
     (void) encumber_msg();
 }
 

change_luck

 void
 change_luck(n)
 register schar n;
 {
     u.uluck += n;
     if (u.uluck < 0 && u.uluck < LUCKMIN)
         u.uluck = LUCKMIN;
     if (u.uluck > 0 && u.uluck > LUCKMAX)
         u.uluck = LUCKMAX;
 }
 

stone_luck

 int
 stone_luck(parameter)
 boolean parameter; /* So I can't think up of a good name.  So sue me. --KAA */
 {
     register struct obj *otmp;
     register long bonchance = 0;
 
     for (otmp = invent; otmp; otmp = otmp->nobj)
         if (confers_luck(otmp)) {
             if (otmp->cursed)
                 bonchance -= otmp->quan;
             else if (otmp->blessed)
                 bonchance += otmp->quan;
             else if (parameter)
                 bonchance += otmp->quan;
         }
 
     return sgn((int) bonchance);
 }
 

set_moreluck

 /* there has just been an inventory change affecting a luck-granting item */
 void
 set_moreluck()
 {
     int luckbon = stone_luck(TRUE);
 
     if (!luckbon && !carrying(LUCKSTONE))
         u.moreluck = 0;
     else if (luckbon >= 0)
         u.moreluck = LUCKADD;
     else
         u.moreluck = -LUCKADD;
 }
 

restore_attrib

 void
 restore_attrib()
 {
     int i;
 
     for (i = 0; i < A_MAX; i++) { /* all temporary losses/gains */
 
         if (ATEMP(i) && ATIME(i)) {
             if (!(--(ATIME(i)))) { /* countdown for change */
                 ATEMP(i) += ATEMP(i) > 0 ? -1 : 1;
 
                 if (ATEMP(i)) /* reset timer */
                     ATIME(i) = 100 / ACURR(A_CON);
             }
         }
     }
     (void) encumber_msg();
 }
 

exercise

 #define AVAL 50 /* tune value for exercise gains */
 
 void
 exercise(i, inc_or_dec)
 int i;
 boolean inc_or_dec;
 {
     debugpline0("Exercise:");
     if (i == A_INT || i == A_CHA)
         return; /* can't exercise these */
 
     /* no physical exercise while polymorphed; the body's temporary */
     if (Upolyd && i != A_WIS)
         return;
 
     if (abs(AEXE(i)) < AVAL) {
         /*
          *      Law of diminishing returns (Part I):
          *
          *      Gain is harder at higher attribute values.
          *      79% at "3" --> 0% at "18"
          *      Loss is even at all levels (50%).
          *
          *      Note: *YES* ACURR is the right one to use.
          */
         AEXE(i) += (inc_or_dec) ? (rn2(19) > ACURR(i)) : -rn2(2);
         debugpline3("%s, %s AEXE = %d",
                     (i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" : (i == A_DEX)
                                                                       ? "Dex"
                                                                       : "Con",
                     (inc_or_dec) ? "inc" : "dec", AEXE(i));
     }
     if (moves > 0 && (i == A_STR || i == A_CON))
         (void) encumber_msg();
 }
 

exerper

 STATIC_OVL void
 exerper()
 {
     if (!(moves % 10)) {
         /* Hunger Checks */
 
         int hs = (u.uhunger > 1000) ? SATIATED : (u.uhunger > 150)
                                                      ? NOT_HUNGRY
                                                      : (u.uhunger > 50)
                                                            ? HUNGRY
                                                            : (u.uhunger > 0)
                                                                  ? WEAK
                                                                  : FAINTING;
 
         debugpline0("exerper: Hunger checks");
         switch (hs) {
         case SATIATED:
             exercise(A_DEX, FALSE);
             if (Role_if(PM_MONK))
                 exercise(A_WIS, FALSE);
             break;
         case NOT_HUNGRY:
             exercise(A_CON, TRUE);
             break;
         case WEAK:
             exercise(A_STR, FALSE);
             if (Role_if(PM_MONK)) /* fasting */
                 exercise(A_WIS, TRUE);
             break;
         case FAINTING:
         case FAINTED:
             exercise(A_CON, FALSE);
             break;
         }
 
         /* Encumbrance Checks */
         debugpline0("exerper: Encumber checks");
         switch (near_capacity()) {
         case MOD_ENCUMBER:
             exercise(A_STR, TRUE);
             break;
         case HVY_ENCUMBER:
             exercise(A_STR, TRUE);
             exercise(A_DEX, FALSE);
             break;
         case EXT_ENCUMBER:
             exercise(A_DEX, FALSE);
             exercise(A_CON, FALSE);
             break;
         }
     }
 
     /* status checks */
     if (!(moves % 5)) {
         debugpline0("exerper: Status checks");
         if ((HClairvoyant & (INTRINSIC | TIMEOUT)) && !BClairvoyant)
             exercise(A_WIS, TRUE);
         if (HRegeneration)
             exercise(A_STR, TRUE);
 
         if (Sick || Vomiting)
             exercise(A_CON, FALSE);
         if (Confusion || Hallucination)
             exercise(A_WIS, FALSE);
         if ((Wounded_legs && !u.usteed) || Fumbling || HStun)
             exercise(A_DEX, FALSE);
     }
 }
 

exerchk

 /* exercise/abuse text (must be in attribute order, not botl order);
    phrased as "You must have been [][0]." or "You haven't been [][1]." */
 static NEARDATA const char *const exertext[A_MAX][2] = {
     { "exercising diligently", "exercising properly" },           /* Str */
     { 0, 0 },                                                     /* Int */
     { "very observant", "paying attention" },                     /* Wis */
     { "working on your reflexes", "working on reflexes lately" }, /* Dex */
     { "leading a healthy life-style", "watching your health" },   /* Con */
     { 0, 0 },                                                     /* Cha */
 };
 
 void
 exerchk()
 {
     int i, ax, mod_val, lolim, hilim;
 
     /*  Check out the periodic accumulations */
     exerper();
 
     if (moves >= context.next_attrib_check) {
         debugpline1("exerchk: ready to test. multi = %d.", multi);
     }
     /*  Are we ready for a test? */
     if (moves >= context.next_attrib_check && !multi) {
         debugpline0("exerchk: testing.");
         /*
          *      Law of diminishing returns (Part II):
          *
          *      The effects of "exercise" and "abuse" wear
          *      off over time.  Even if you *don't* get an
          *      increase/decrease, you lose some of the
          *      accumulated effects.
          */
         for (i = 0; i < A_MAX; ++i) {
             ax = AEXE(i);
             /* nothing to do here if no exercise or abuse has occurred
                (Int and Cha always fall into this category) */
             if (!ax)
                 continue; /* ok to skip nextattrib */
 
             mod_val = sgn(ax); /* +1 or -1; used below */
             /* no further effect for exercise if at max or abuse if at min;
                can't exceed 18 via exercise even if actual max is higher */
             lolim = ATTRMIN(i); /* usually 3; might be higher */
             hilim = ATTRMAX(i); /* usually 18; maybe lower or higher */
             if (hilim > 18)
                 hilim = 18;
             if ((ax < 0) ? (ABASE(i) <= lolim) : (ABASE(i) >= hilim))
                 goto nextattrib;
             /* can't exercise non-Wisdom while polymorphed; previous
                exercise/abuse gradually wears off without impact then */
             if (Upolyd && i != A_WIS)
                 goto nextattrib;
 
             debugpline2("exerchk: testing %s (%d).",
                         (i == A_STR)
                             ? "Str"
                             : (i == A_INT)
                                   ? "Int?"
                                   : (i == A_WIS)
                                         ? "Wis"
                                         : (i == A_DEX)
                                               ? "Dex"
                                               : (i == A_CON)
                                                     ? "Con"
                                                     : (i == A_CHA)
                                                           ? "Cha?"
                                                           : "???",
                         ax);
             /*
              *  Law of diminishing returns (Part III):
              *
              *  You don't *always* gain by exercising.
              *  [MRS 92/10/28 - Treat Wisdom specially for balance.]
              */
             if (rn2(AVAL) > ((i != A_WIS) ? (abs(ax) * 2 / 3) : abs(ax)))
                 goto nextattrib;
 
             debugpline1("exerchk: changing %d.", i);
             if (adjattrib(i, mod_val, -1)) {
                 debugpline1("exerchk: changed %d.", i);
                 /* if you actually changed an attrib - zero accumulation */
                 AEXE(i) = ax = 0;
                 /* then print an explanation */
                 You("%s %s.",
                     (mod_val > 0) ? "must have been" : "haven't been",
                     exertext[i][(mod_val > 0) ? 0 : 1]);
             }
         nextattrib:
             /* this used to be ``AEXE(i) /= 2'' but that would produce
                platform-dependent rounding/truncation for negative vals */
             AEXE(i) = (abs(ax) / 2) * mod_val;
         }
         context.next_attrib_check += rn1(200, 800);
         debugpline1("exerchk: next check at %ld.", context.next_attrib_check);
     }
 }
 

init_attr

 void
 init_attr(np)
 register int np;
 {
     register int i, x, tryct;
 
     for (i = 0; i < A_MAX; i++) {
         ABASE(i) = AMAX(i) = urole.attrbase[i];
         ATEMP(i) = ATIME(i) = 0;
         np -= urole.attrbase[i];
     }
 
     tryct = 0;
     while (np > 0 && tryct < 100) {
         x = rn2(100);
         for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++)
             ;
         if (i >= A_MAX)
             continue; /* impossible */
 
         if (ABASE(i) >= ATTRMAX(i)) {
             tryct++;
             continue;
         }
         tryct = 0;
         ABASE(i)++;
         AMAX(i)++;
         np--;
     }
 
     tryct = 0;
     while (np < 0 && tryct < 100) { /* for redistribution */
 
         x = rn2(100);
         for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++)
             ;
         if (i >= A_MAX)
             continue; /* impossible */
 
         if (ABASE(i) <= ATTRMIN(i)) {
             tryct++;
             continue;
         }
         tryct = 0;
         ABASE(i)--;
         AMAX(i)--;
         np++;
     }
 }
 

redist_attr

 void
 redist_attr()
 {
     register int i, tmp;
 
     for (i = 0; i < A_MAX; i++) {
         if (i == A_INT || i == A_WIS)
             continue;
         /* Polymorphing doesn't change your mind */
         tmp = AMAX(i);
         AMAX(i) += (rn2(5) - 2);
         if (AMAX(i) > ATTRMAX(i))
             AMAX(i) = ATTRMAX(i);
         if (AMAX(i) < ATTRMIN(i))
             AMAX(i) = ATTRMIN(i);
         ABASE(i) = ABASE(i) * AMAX(i) / tmp;
         /* ABASE(i) > ATTRMAX(i) is impossible */
         if (ABASE(i) < ATTRMIN(i))
             ABASE(i) = ATTRMIN(i);
     }
     (void) encumber_msg();
 }
 

postadjabil

 STATIC_OVL
 void
 postadjabil(ability)
 long *ability;
 {
     if (!ability)
         return;
     if (ability == &(HWarning) || ability == &(HSee_invisible))
         see_monsters();
 }
 

check_innate_abil

 STATIC_OVL const struct innate *
 check_innate_abil(ability, frommask)
 long *ability;
 long frommask;
 {
     const struct innate *abil = 0;
 
     if (frommask == FROMEXPER)
         switch (Role_switch) {
         case PM_ARCHEOLOGIST:
             abil = arc_abil;
             break;
         case PM_BARBARIAN:
             abil = bar_abil;
             break;
         case PM_CAVEMAN:
             abil = cav_abil;
             break;
         case PM_HEALER:
             abil = hea_abil;
             break;
         case PM_KNIGHT:
             abil = kni_abil;
             break;
         case PM_MONK:
             abil = mon_abil;
             break;
         case PM_PRIEST:
             abil = pri_abil;
             break;
         case PM_RANGER:
             abil = ran_abil;
             break;
         case PM_ROGUE:
             abil = rog_abil;
             break;
         case PM_SAMURAI:
             abil = sam_abil;
             break;
         case PM_TOURIST:
             abil = tou_abil;
             break;
         case PM_VALKYRIE:
             abil = val_abil;
             break;
         case PM_WIZARD:
             abil = wiz_abil;
             break;
         default:
             break;
         }
     else if (frommask == FROMRACE)
         switch (Race_switch) {
         case PM_ELF:
             abil = elf_abil;
             break;
         case PM_ORC:
             abil = orc_abil;
             break;
         case PM_HUMAN:
         case PM_DWARF:
         case PM_GNOME:
         default:
             break;
         }
 
     while (abil && abil->ability) {
         if ((abil->ability == ability) && (u.ulevel >= abil->ulevel))
             return abil;
         abil++;
     }
     return (struct innate *) 0;
 }
 

innately

 /*
  * returns 1 if FROMRACE or FROMEXPER and exper level == 1
  * returns 2 if FROMEXPER and exper level > 1
  * otherwise returns 0
  */
 STATIC_OVL int
 innately(ability)
 long *ability;
 {
     const struct innate *iptr;
 
     if ((iptr = check_innate_abil(ability, FROMRACE)) != 0)
         return 1;
     else if ((iptr = check_innate_abil(ability, FROMEXPER)) != 0)
         return (iptr->ulevel == 1) ? 1 : 2;
     return 0;
 }
 

is_innate

 int
 is_innate(propidx)
 int propidx;
 {
     if (propidx == BLINDED && !haseyes(youmonst.data))
         return 1;
     return innately(&u.uprops[propidx].intrinsic);
 }
 

from_what

 char *
 from_what(propidx)
 int propidx; /* special cases can have negative values */
 {
     static char buf[BUFSZ];
 
     buf[0] = '\0';
     /*
      * Restrict the source of the attributes just to debug mode for now
      */
     if (wizard) {
         static NEARDATA const char because_of[] = " because of %s";
 
         if (propidx >= 0) {
             char *p;
             struct obj *obj = (struct obj *) 0;
             int innate = is_innate(propidx);
 
             if (innate == 2)
                 Strcpy(buf, " because of your experience");
             else if (innate == 1)
                 Strcpy(buf, " innately");
             else if (wizard
                      && (obj = what_gives(&u.uprops[propidx].extrinsic)))
                 Sprintf(buf, because_of, obj->oartifact
                                              ? bare_artifactname(obj)
                                              : ysimple_name(obj));
             else if (propidx == BLINDED && u.uroleplay.blind)
                 Sprintf(buf, " from birth");
             else if (propidx == BLINDED && Blindfolded_only)
                 Sprintf(buf, because_of, ysimple_name(ublindf));
 
             /* remove some verbosity and/or redundancy */
             if ((p = strstri(buf, " pair of ")) != 0)
                 copynchars(p + 1, p + 9, BUFSZ); /* overlapping buffers ok */
             else if (propidx == STRANGLED
                      && (p = strstri(buf, " of strangulation")) != 0)
                 *p = '\0';
 
         } else { /* negative property index */
             /* if more blocking capabilities get implemented we'll need to
                replace this with what_blocks() comparable to what_gives() */
             switch (-propidx) {
             case BLINDED:
                 if (ublindf
                     && ublindf->oartifact == ART_EYES_OF_THE_OVERWORLD)
                     Sprintf(buf, because_of, bare_artifactname(ublindf));
                 break;
             case INVIS:
                 if (u.uprops[INVIS].blocked & W_ARMC)
                     Sprintf(buf, because_of,
                             ysimple_name(uarmc)); /* mummy wrapping */
                 break;
             case CLAIRVOYANT:
                 if (wizard && (u.uprops[CLAIRVOYANT].blocked & W_ARMH))
                     Sprintf(buf, because_of,
                             ysimple_name(uarmh)); /* cornuthaum */
                 break;
             }
         }
 
     } /*wizard*/
     return buf;
 }
 

adjabil

 void
 adjabil(oldlevel, newlevel)
 int oldlevel, newlevel;
 {
     register const struct innate *abil, *rabil;
     long prevabil, mask = FROMEXPER;
 
     switch (Role_switch) {
     case PM_ARCHEOLOGIST:
         abil = arc_abil;
         break;
     case PM_BARBARIAN:
         abil = bar_abil;
         break;
     case PM_CAVEMAN:
         abil = cav_abil;
         break;
     case PM_HEALER:
         abil = hea_abil;
         break;
     case PM_KNIGHT:
         abil = kni_abil;
         break;
     case PM_MONK:
         abil = mon_abil;
         break;
     case PM_PRIEST:
         abil = pri_abil;
         break;
     case PM_RANGER:
         abil = ran_abil;
         break;
     case PM_ROGUE:
         abil = rog_abil;
         break;
     case PM_SAMURAI:
         abil = sam_abil;
         break;
     case PM_TOURIST:
         abil = tou_abil;
         break;
     case PM_VALKYRIE:
         abil = val_abil;
         break;
     case PM_WIZARD:
         abil = wiz_abil;
         break;
     default:
         abil = 0;
         break;
     }
 
     switch (Race_switch) {
     case PM_ELF:
         rabil = elf_abil;
         break;
     case PM_ORC:
         rabil = orc_abil;
         break;
     case PM_HUMAN:
     case PM_DWARF:
     case PM_GNOME:
     default:
         rabil = 0;
         break;
     }
 
     while (abil || rabil) {
         /* Have we finished with the intrinsics list? */
         if (!abil || !abil->ability) {
             /* Try the race intrinsics */
             if (!rabil || !rabil->ability)
                 break;
             abil = rabil;
             rabil = 0;
             mask = FROMRACE;
         }
         prevabil = *(abil->ability);
         if (oldlevel < abil->ulevel && newlevel >= abil->ulevel) {
             /* Abilities gained at level 1 can never be lost
              * via level loss, only via means that remove _any_
              * sort of ability.  A "gain" of such an ability from
              * an outside source is devoid of meaning, so we set
              * FROMOUTSIDE to avoid such gains.
              */
             if (abil->ulevel == 1)
                 *(abil->ability) |= (mask | FROMOUTSIDE);
             else
                 *(abil->ability) |= mask;
             if (!(*(abil->ability) & INTRINSIC & ~mask)) {
                 if (*(abil->gainstr))
                     You_feel("%s!", abil->gainstr);
             }
         } else if (oldlevel >= abil->ulevel && newlevel < abil->ulevel) {
             *(abil->ability) &= ~mask;
             if (!(*(abil->ability) & INTRINSIC)) {
                 if (*(abil->losestr))
                     You_feel("%s!", abil->losestr);
                 else if (*(abil->gainstr))
                     You_feel("less %s!", abil->gainstr);
             }
         }
         if (prevabil != *(abil->ability)) /* it changed */
             postadjabil(abil->ability);
         abil++;
     }
 
     if (oldlevel > 0) {
         if (newlevel > oldlevel)
             add_weapon_skill(newlevel - oldlevel);
         else
             lose_weapon_skill(oldlevel - newlevel);
     }
 }
 

newhp

 int
 newhp()
 {
     int hp, conplus;
 
     if (u.ulevel == 0) {
         /* Initialize hit points */
         hp = urole.hpadv.infix + urace.hpadv.infix;
         if (urole.hpadv.inrnd > 0)
             hp += rnd(urole.hpadv.inrnd);
         if (urace.hpadv.inrnd > 0)
             hp += rnd(urace.hpadv.inrnd);
         if (moves <= 1L) { /* initial hero; skip for polyself to new man */
             /* Initialize alignment stuff */
             u.ualign.type = aligns[flags.initalign].value;
             u.ualign.record = urole.initrecord;
         }
         /* no Con adjustment for initial hit points */
     } else {
         if (u.ulevel < urole.xlev) {
             hp = urole.hpadv.lofix + urace.hpadv.lofix;
             if (urole.hpadv.lornd > 0)
                 hp += rnd(urole.hpadv.lornd);
             if (urace.hpadv.lornd > 0)
                 hp += rnd(urace.hpadv.lornd);
         } else {
             hp = urole.hpadv.hifix + urace.hpadv.hifix;
             if (urole.hpadv.hirnd > 0)
                 hp += rnd(urole.hpadv.hirnd);
             if (urace.hpadv.hirnd > 0)
                 hp += rnd(urace.hpadv.hirnd);
         }
         if (ACURR(A_CON) <= 3)
             conplus = -2;
         else if (ACURR(A_CON) <= 6)
             conplus = -1;
         else if (ACURR(A_CON) <= 14)
             conplus = 0;
         else if (ACURR(A_CON) <= 16)
             conplus = 1;
         else if (ACURR(A_CON) == 17)
             conplus = 2;
         else if (ACURR(A_CON) == 18)
             conplus = 3;
         else
             conplus = 4;
         hp += conplus;
     }
     if (hp <= 0)
         hp = 1;
     if (u.ulevel < MAXULEV)
         u.uhpinc[u.ulevel] = (xchar) hp;
     return hp;
 }
 

acurr

 schar
 acurr(x)
 int x;
 {
     register int tmp = (u.abon.a[x] + u.atemp.a[x] + u.acurr.a[x]);
 
     if (x == A_STR) {
         if (tmp >= 125 || (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER))
             return (schar) 125;
         else
 #ifdef WIN32_BUG
             return (x = ((tmp <= 3) ? 3 : tmp));
 #else
         return (schar) ((tmp <= 3) ? 3 : tmp);
 #endif
     } else if (x == A_CHA) {
         if (tmp < 18
             && (youmonst.data->mlet == S_NYMPH || u.umonnum == PM_SUCCUBUS
                 || u.umonnum == PM_INCUBUS))
             return (schar) 18;
     } else if (x == A_INT || x == A_WIS) {
         /* yes, this may raise int/wis if player is sufficiently
          * stupid.  there are lower levels of cognition than "dunce".
          */
         if (uarmh && uarmh->otyp == DUNCE_CAP)
             return (schar) 6;
     }
#ifdef WIN32_BUG
     return (x = ((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp));
 #else
     return (schar) ((tmp >= 25) ? 25 : (tmp <= 3) ? 3 : tmp);
 #endif
 }
 

acurrstr

 /* condense clumsy ACURR(A_STR) value into value that fits into game formulas
  */
 schar
 acurrstr()
 {
     register int str = ACURR(A_STR);
 
     if (str <= 18)
         return (schar) str;
     if (str <= 121)
         return (schar) (19 + str / 50); /* map to 19..21 */
     else
         return (schar) (min(str, 125) - 100); /* 22..25 */
 }
 

extremeattr

 /* when wearing (or taking off) an unID'd item, this routine is used
    to distinguish between observable +0 result and no-visible-effect
    due to an attribute not being able to exceed maximum or minimum */
 boolean
 extremeattr(attrindx) /* does attrindx's value match its max or min? */
 int attrindx;
 {
     /* Fixed_abil and racial MINATTR/MAXATTR aren't relevant here */
     int lolimit = 3, hilimit = 25, curval = ACURR(attrindx);
 
     /* upper limit for Str is 25 but its value is encoded differently */
     if (attrindx == A_STR) {
         hilimit = STR19(25); /* 125 */
         /* lower limit for Str can also be 25 */
         if (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER)
             lolimit = hilimit;
     }
     /* this exception is hypothetical; the only other worn item affecting
        Int or Wis is another helmet so can't be in use at the same time */
     if (attrindx == A_INT || attrindx == A_WIS) {
         if (uarmh && uarmh->otyp == DUNCE_CAP)
             hilimit = lolimit = 6;
     }
 
     /* are we currently at either limit? */
     return (curval == lolimit || curval == hilimit) ? TRUE : FALSE;
 }
 

adjalign

 /* avoid possible problems with alignment overflow, and provide a centralized
    location for any future alignment limits */
 void
 adjalign(n)
 int n;
 {
     int newalign = u.ualign.record + n;
 
     if (n < 0) {
         if (newalign < u.ualign.record)
             u.ualign.record = newalign;
     } else if (newalign > u.ualign.record) {
         u.ualign.record = newalign;
         if (u.ualign.record > ALIGNLIM)
             u.ualign.record = ALIGNLIM;
     }
 }
 

uchangealign

 /* change hero's alignment type, possibly losing use of artifacts */
 void
 uchangealign(newalign, reason)
 int newalign;
 int reason; /* 0==conversion, 1==helm-of-OA on, 2==helm-of-OA off */
 {
     aligntyp oldalign = u.ualign.type;
 
     u.ublessed = 0;   /* lose divine protection */
     context.botl = 1; /* status line needs updating */
     if (reason == 0) {
         /* conversion via altar */
         u.ualignbase[A_CURRENT] = (aligntyp) newalign;
         /* worn helm of opposite alignment might block change */
         if (!uarmh || uarmh->otyp != HELM_OF_OPPOSITE_ALIGNMENT)
             u.ualign.type = u.ualignbase[A_CURRENT];
         You("have a %ssense of a new direction.",
             (u.ualign.type != oldalign) ? "sudden " : "");
     } else {
         /* putting on or taking off a helm of opposite alignment */
         u.ualign.type = (aligntyp) newalign;
         if (reason == 1)
             Your("mind oscillates %s.", Hallucination ? "wildly" : "briefly");
         else if (reason == 2)
             Your("mind is %s.", Hallucination
                                     ? "much of a muchness"
                                     : "back in sync with your body");
     }
 
     if (u.ualign.type != oldalign) {
         u.ualign.record = 0; /* slate is wiped clean */
         retouch_equipment(0);
     }
 }
 
 /*attrib.c*/