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

From NetHackWiki
Jump to navigation Jump to search
(Created page with "__MIXEDSYNTAXHIGHLIGHT__ Below is the full text to '''were.c''' from the source code of NetHack 3.6.0. To link to a particular line, write ...")
 
Line 3: Line 3:
  
 
{{NGPL}}
 
{{NGPL}}
  <span id="line1">1.   /* NetHack 3.6 were.c $NHDT-Date: 1432512763 2015/05/25 00:12:43 $  $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */</span>
+
 
  <span id="line2">2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */</span>
+
== Top of file ==
  <span id="line3">3.   /* NetHack may be freely redistributed.  See license for details. */</span>
+
 
  <span id="line4">4.   </span>
+
  <span id="line1">1. /* NetHack 3.6 were.c $NHDT-Date: 1432512763 2015/05/25 00:12:43 $  $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */</span>
  <span id="line5">5.   #include "hack.h"</span>
+
  <span id="line2">2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */</span>
  <span id="line6">6.   </span>
+
  <span id="line3">3. /* NetHack may be freely redistributed.  See license for details. */</span>
  <span id="line7">7.   void</span>
+
  <span id="line4">4. </span>
  <span id="line8">8.   were_change(mon)</span>
+
  <span id="line5">5. #include "hack.h"</span>
  <span id="line9">9.   register struct monst *mon;</span>
+
  <span id="line6">6. </span>
  <span id="line10">10.   {</span>
+
  <span id="line7">7. void</span>
  <span id="line11">11.       if (!is_were(mon->data))</span>
+
  <span id="line8">8. were_change(mon)</span>
  <span id="line12">12.           return;</span>
+
  <span id="line9">9. register struct monst *mon;</span>
  <span id="line13">13.   </span>
+
  <span id="line10">10. {</span>
  <span id="line14">14.       if (is_human(mon->data)) {</span>
+
  <span id="line11">11.     if (!is_were(mon->data))</span>
  <span id="line15">15.           if (!Protection_from_shape_changers</span>
+
  <span id="line12">12.         return;</span>
  <span id="line16">16.               && !rn2(night() ? (flags.moonphase == FULL_MOON ? 3 : 30)</span>
+
  <span id="line13">13. </span>
  <span id="line17">17.                               : (flags.moonphase == FULL_MOON ? 10 : 50))) {</span>
+
  <span id="line14">14.     if (is_human(mon->data)) {</span>
  <span id="line18">18.               new_were(mon); /* change into animal form */</span>
+
  <span id="line15">15.         if (!Protection_from_shape_changers</span>
  <span id="line19">19.               if (!Deaf && !canseemon(mon)) {</span>
+
  <span id="line16">16.             && !rn2(night() ? (flags.moonphase == FULL_MOON ? 3 : 30)</span>
  <span id="line20">20.                   const char *howler;</span>
+
  <span id="line17">17.                             : (flags.moonphase == FULL_MOON ? 10 : 50))) {</span>
  <span id="line21">21.   </span>
+
  <span id="line18">18.             new_were(mon); /* change into animal form */</span>
  <span id="line22">22.                   switch (monsndx(mon->data)) {</span>
+
  <span id="line19">19.             if (!Deaf && !canseemon(mon)) {</span>
  <span id="line23">23.                   case PM_WEREWOLF:</span>
+
  <span id="line20">20.                 const char *howler;</span>
  <span id="line24">24.                       howler = "wolf";</span>
+
  <span id="line21">21. </span>
  <span id="line25">25.                       break;</span>
+
  <span id="line22">22.                 switch (monsndx(mon->data)) {</span>
  <span id="line26">26.                   case PM_WEREJACKAL:</span>
+
  <span id="line23">23.                 case PM_WEREWOLF:</span>
  <span id="line27">27.                       howler = "jackal";</span>
+
  <span id="line24">24.                     howler = "wolf";</span>
  <span id="line28">28.                       break;</span>
+
  <span id="line25">25.                     break;</span>
  <span id="line29">29.                   default:</span>
+
  <span id="line26">26.                 case PM_WEREJACKAL:</span>
  <span id="line30">30.                       howler = (char *) 0;</span>
+
  <span id="line27">27.                     howler = "jackal";</span>
  <span id="line31">31.                       break;</span>
+
  <span id="line28">28.                     break;</span>
  <span id="line32">32.                   }</span>
+
  <span id="line29">29.                 default:</span>
  <span id="line33">33.                   if (howler)</span>
+
  <span id="line30">30.                     howler = (char *) 0;</span>
  <span id="line34">34.                       You_hear("a %s howling at the moon.", howler);</span>
+
  <span id="line31">31.                     break;</span>
  <span id="line35">35.               }</span>
+
  <span id="line32">32.                 }</span>
  <span id="line36">36.           }</span>
+
  <span id="line33">33.                 if (howler)</span>
  <span id="line37">37.       } else if (!rn2(30) || Protection_from_shape_changers) {</span>
+
  <span id="line34">34.                     You_hear("a %s howling at the moon.", howler);</span>
  <span id="line38">38.           new_were(mon); /* change back into human form */</span>
+
  <span id="line35">35.             }</span>
  <span id="line39">39.       }</span>
+
  <span id="line36">36.         }</span>
  <span id="line40">40.   }</span>
+
  <span id="line37">37.     } else if (!rn2(30) || Protection_from_shape_changers) {</span>
  <span id="line41">41.   </span>
+
  <span id="line38">38.         new_were(mon); /* change back into human form */</span>
  <span id="line42">42.   int</span>
+
  <span id="line39">39.     }</span>
  <span id="line43">43.   counter_were(pm)</span>
+
  <span id="line40">40. }</span>
  <span id="line44">44.   int pm;</span>
+
  <span id="line41">41. </span>
  <span id="line45">45.   {</span>
+
  <span id="line42">42. int</span>
  <span id="line46">46.       switch (pm) {</span>
+
  <span id="line43">43. counter_were(pm)</span>
  <span id="line47">47.       case PM_WEREWOLF:</span>
+
  <span id="line44">44. int pm;</span>
  <span id="line48">48.           return (PM_HUMAN_WEREWOLF);</span>
+
  <span id="line45">45. {</span>
  <span id="line49">49.       case PM_HUMAN_WEREWOLF:</span>
+
  <span id="line46">46.     switch (pm) {</span>
  <span id="line50">50.           return (PM_WEREWOLF);</span>
+
  <span id="line47">47.     case PM_WEREWOLF:</span>
  <span id="line51">51.       case PM_WEREJACKAL:</span>
+
  <span id="line48">48.         return (PM_HUMAN_WEREWOLF);</span>
  <span id="line52">52.           return (PM_HUMAN_WEREJACKAL);</span>
+
  <span id="line49">49.     case PM_HUMAN_WEREWOLF:</span>
  <span id="line53">53.       case PM_HUMAN_WEREJACKAL:</span>
+
  <span id="line50">50.         return (PM_WEREWOLF);</span>
  <span id="line54">54.           return (PM_WEREJACKAL);</span>
+
  <span id="line51">51.     case PM_WEREJACKAL:</span>
  <span id="line55">55.       case PM_WERERAT:</span>
+
  <span id="line52">52.         return (PM_HUMAN_WEREJACKAL);</span>
  <span id="line56">56.           return (PM_HUMAN_WERERAT);</span>
+
  <span id="line53">53.     case PM_HUMAN_WEREJACKAL:</span>
  <span id="line57">57.       case PM_HUMAN_WERERAT:</span>
+
  <span id="line54">54.         return (PM_WEREJACKAL);</span>
  <span id="line58">58.           return (PM_WERERAT);</span>
+
  <span id="line55">55.     case PM_WERERAT:</span>
  <span id="line59">59.       default:</span>
+
  <span id="line56">56.         return (PM_HUMAN_WERERAT);</span>
  <span id="line60">60.           return NON_PM;</span>
+
  <span id="line57">57.     case PM_HUMAN_WERERAT:</span>
  <span id="line61">61.       }</span>
+
  <span id="line58">58.         return (PM_WERERAT);</span>
  <span id="line62">62.   }</span>
+
  <span id="line59">59.     default:</span>
  <span id="line63">63.   </span>
+
  <span id="line60">60.         return NON_PM;</span>
  <span id="line64">64.   /* convert monsters similar to werecritters into appropriate werebeast */</span>
+
  <span id="line61">61.     }</span>
  <span id="line65">65.   int</span>
+
  <span id="line62">62. }</span>
  <span id="line66">66.   were_beastie(pm)</span>
+
  <span id="line63">63. </span>
  <span id="line67">67.   int pm;</span>
+
  <span id="line64">64. /* convert monsters similar to werecritters into appropriate werebeast */</span>
  <span id="line68">68.   {</span>
+
  <span id="line65">65. int</span>
  <span id="line69">69.       switch (pm) {</span>
+
  <span id="line66">66. were_beastie(pm)</span>
  <span id="line70">70.       case PM_WERERAT:</span>
+
  <span id="line67">67. int pm;</span>
  <span id="line71">71.       case PM_SEWER_RAT:</span>
+
  <span id="line68">68. {</span>
  <span id="line72">72.       case PM_GIANT_RAT:</span>
+
  <span id="line69">69.     switch (pm) {</span>
  <span id="line73">73.       case PM_RABID_RAT:</span>
+
  <span id="line70">70.     case PM_WERERAT:</span>
  <span id="line74">74.           return PM_WERERAT;</span>
+
  <span id="line71">71.     case PM_SEWER_RAT:</span>
  <span id="line75">75.       case PM_WEREJACKAL:</span>
+
  <span id="line72">72.     case PM_GIANT_RAT:</span>
  <span id="line76">76.       case PM_JACKAL:</span>
+
  <span id="line73">73.     case PM_RABID_RAT:</span>
  <span id="line77">77.       case PM_FOX:</span>
+
  <span id="line74">74.         return PM_WERERAT;</span>
  <span id="line78">78.       case PM_COYOTE:</span>
+
  <span id="line75">75.     case PM_WEREJACKAL:</span>
  <span id="line79">79.           return PM_WEREJACKAL;</span>
+
  <span id="line76">76.     case PM_JACKAL:</span>
  <span id="line80">80.       case PM_WEREWOLF:</span>
+
  <span id="line77">77.     case PM_FOX:</span>
  <span id="line81">81.       case PM_WOLF:</span>
+
  <span id="line78">78.     case PM_COYOTE:</span>
  <span id="line82">82.       case PM_WARG:</span>
+
  <span id="line79">79.         return PM_WEREJACKAL;</span>
  <span id="line83">83.       case PM_WINTER_WOLF:</span>
+
  <span id="line80">80.     case PM_WEREWOLF:</span>
  <span id="line84">84.           return PM_WEREWOLF;</span>
+
  <span id="line81">81.     case PM_WOLF:</span>
  <span id="line85">85.       default:</span>
+
  <span id="line82">82.     case PM_WARG:</span>
  <span id="line86">86.           break;</span>
+
  <span id="line83">83.     case PM_WINTER_WOLF:</span>
  <span id="line87">87.       }</span>
+
  <span id="line84">84.         return PM_WEREWOLF;</span>
  <span id="line88">88.       return NON_PM;</span>
+
  <span id="line85">85.     default:</span>
  <span id="line89">89.   }</span>
+
  <span id="line86">86.         break;</span>
  <span id="line90">90.   </span>
+
  <span id="line87">87.     }</span>
  <span id="line91">91.   void</span>
+
  <span id="line88">88.     return NON_PM;</span>
  <span id="line92">92.   new_were(mon)</span>
+
  <span id="line89">89. }</span>
  <span id="line93">93.   register struct monst *mon;</span>
+
  <span id="line90">90. </span>
  <span id="line94">94.   {</span>
+
  <span id="line91">91. void</span>
  <span id="line95">95.       register int pm;</span>
+
  <span id="line92">92. new_were(mon)</span>
  <span id="line96">96.   </span>
+
  <span id="line93">93. register struct monst *mon;</span>
  <span id="line97">97.       pm = counter_were(monsndx(mon->data));</span>
+
  <span id="line94">94. {</span>
  <span id="line98">98.       if (pm < LOW_PM) {</span>
+
  <span id="line95">95.     register int pm;</span>
  <span id="line99">99.           impossible("unknown lycanthrope %s.", mon->data->mname);</span>
+
  <span id="line96">96. </span>
  <span id="line100">100.         return;</span>
+
  <span id="line97">97.     pm = counter_were(monsndx(mon->data));</span>
  <span id="line101">101.     }</span>
+
  <span id="line98">98.     if (pm < LOW_PM) {</span>
  <span id="line102">102. </span>
+
  <span id="line99">99.         impossible("unknown lycanthrope %s.", mon->data->mname);</span>
  <span id="line103">103.     if (canseemon(mon) && !Hallucination)</span>
+
  <span id="line100">100.         return;</span>
  <span id="line104">104.         pline("%s changes into a %s.", Monnam(mon),</span>
+
  <span id="line101">101.     }</span>
  <span id="line105">105.               is_human(&mons[pm]) ? "human" : mons[pm].mname + 4);</span>
+
  <span id="line102">102. </span>
  <span id="line106">106. </span>
+
  <span id="line103">103.     if (canseemon(mon) && !Hallucination)</span>
  <span id="line107">107.     set_mon_data(mon, &mons[pm], 0);</span>
+
  <span id="line104">104.         pline("%s changes into a %s.", Monnam(mon),</span>
  <span id="line108">108.     if (mon->msleeping || !mon->mcanmove) {</span>
+
  <span id="line105">105.               is_human(&mons[pm]) ? "human" : mons[pm].mname + 4);</span>
  <span id="line109">109.         /* transformation wakens and/or revitalizes */</span>
+
  <span id="line106">106. </span>
  <span id="line110">110.         mon->msleeping = 0;</span>
+
  <span id="line107">107.     set_mon_data(mon, &mons[pm], 0);</span>
  <span id="line111">111.         mon->mfrozen = 0; /* not asleep or paralyzed */</span>
+
  <span id="line108">108.     if (mon->msleeping || !mon->mcanmove) {</span>
  <span id="line112">112.         mon->mcanmove = 1;</span>
+
  <span id="line109">109.         /* transformation wakens and/or revitalizes */</span>
  <span id="line113">113.     }</span>
+
  <span id="line110">110.         mon->msleeping = 0;</span>
  <span id="line114">114.     /* regenerate by 1/4 of the lost hit points */</span>
+
  <span id="line111">111.         mon->mfrozen = 0; /* not asleep or paralyzed */</span>
  <span id="line115">115.     mon->mhp += (mon->mhpmax - mon->mhp) / 4;</span>
+
  <span id="line112">112.         mon->mcanmove = 1;</span>
  <span id="line116">116.     newsym(mon->mx, mon->my);</span>
+
  <span id="line113">113.     }</span>
  <span id="line117">117.     mon_break_armor(mon, FALSE);</span>
+
  <span id="line114">114.     /* regenerate by 1/4 of the lost hit points */</span>
  <span id="line118">118.     possibly_unwield(mon, FALSE);</span>
+
  <span id="line115">115.     mon->mhp += (mon->mhpmax - mon->mhp) / 4;</span>
  <span id="line119">119. }</span>
+
  <span id="line116">116.     newsym(mon->mx, mon->my);</span>
  <span id="line120">120. </span>
+
  <span id="line117">117.     mon_break_armor(mon, FALSE);</span>
  <span id="line121">121. int were_summon(ptr, yours, visible,</span>
+
  <span id="line118">118.     possibly_unwield(mon, FALSE);</span>
  <span id="line122">122.                 genbuf) /* were-creature (even you) summons a horde */</span>
+
  <span id="line119">119. }</span>
  <span id="line123">123. register struct permonst *ptr;</span>
+
  <span id="line120">120. </span>
  <span id="line124">124. register boolean yours;</span>
+
  <span id="line121">121. int were_summon(ptr, yours, visible,</span>
  <span id="line125">125. int *visible; /* number of visible helpers created */</span>
+
  <span id="line122">122.                 genbuf) /* were-creature (even you) summons a horde */</span>
  <span id="line126">126. char *genbuf;</span>
+
  <span id="line123">123. register struct permonst *ptr;</span>
  <span id="line127">127. {</span>
+
  <span id="line124">124. register boolean yours;</span>
  <span id="line128">128.     register int i, typ, pm = monsndx(ptr);</span>
+
  <span id="line125">125. int *visible; /* number of visible helpers created */</span>
  <span id="line129">129.     register struct monst *mtmp;</span>
+
  <span id="line126">126. char *genbuf;</span>
  <span id="line130">130.     int total = 0;</span>
+
  <span id="line127">127. {</span>
  <span id="line131">131. </span>
+
  <span id="line128">128.     register int i, typ, pm = monsndx(ptr);</span>
  <span id="line132">132.     *visible = 0;</span>
+
  <span id="line129">129.     register struct monst *mtmp;</span>
  <span id="line133">133.     if (Protection_from_shape_changers && !yours)</span>
+
  <span id="line130">130.     int total = 0;</span>
  <span id="line134">134.         return 0;</span>
+
  <span id="line131">131. </span>
  <span id="line135">135.     for (i = rnd(5); i > 0; i--) {</span>
+
  <span id="line132">132.     *visible = 0;</span>
  <span id="line136">136.         switch (pm) {</span>
+
  <span id="line133">133.     if (Protection_from_shape_changers && !yours)</span>
  <span id="line137">137.         case PM_WERERAT:</span>
+
  <span id="line134">134.         return 0;</span>
  <span id="line138">138.         case PM_HUMAN_WERERAT:</span>
+
  <span id="line135">135.     for (i = rnd(5); i > 0; i--) {</span>
  <span id="line139">139.             typ =</span>
+
  <span id="line136">136.         switch (pm) {</span>
  <span id="line140">140.                 rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT;</span>
+
  <span id="line137">137.         case PM_WERERAT:</span>
  <span id="line141">141.             if (genbuf)</span>
+
  <span id="line138">138.         case PM_HUMAN_WERERAT:</span>
  <span id="line142">142.                 Strcpy(genbuf, "rat");</span>
+
  <span id="line139">139.             typ =</span>
  <span id="line143">143.             break;</span>
+
  <span id="line140">140.                 rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT;</span>
  <span id="line144">144.         case PM_WEREJACKAL:</span>
+
  <span id="line141">141.             if (genbuf)</span>
  <span id="line145">145.         case PM_HUMAN_WEREJACKAL:</span>
+
  <span id="line142">142.                 Strcpy(genbuf, "rat");</span>
  <span id="line146">146.             typ = PM_JACKAL;</span>
+
  <span id="line143">143.             break;</span>
  <span id="line147">147.             if (genbuf)</span>
+
  <span id="line144">144.         case PM_WEREJACKAL:</span>
  <span id="line148">148.                 Strcpy(genbuf, "jackal");</span>
+
  <span id="line145">145.         case PM_HUMAN_WEREJACKAL:</span>
  <span id="line149">149.             break;</span>
+
  <span id="line146">146.             typ = PM_JACKAL;</span>
  <span id="line150">150.         case PM_WEREWOLF:</span>
+
  <span id="line147">147.             if (genbuf)</span>
  <span id="line151">151.         case PM_HUMAN_WEREWOLF:</span>
+
  <span id="line148">148.                 Strcpy(genbuf, "jackal");</span>
  <span id="line152">152.             typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF;</span>
+
  <span id="line149">149.             break;</span>
  <span id="line153">153.             if (genbuf)</span>
+
  <span id="line150">150.         case PM_WEREWOLF:</span>
  <span id="line154">154.                 Strcpy(genbuf, "wolf");</span>
+
  <span id="line151">151.         case PM_HUMAN_WEREWOLF:</span>
  <span id="line155">155.             break;</span>
+
  <span id="line152">152.             typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF;</span>
  <span id="line156">156.         default:</span>
+
  <span id="line153">153.             if (genbuf)</span>
  <span id="line157">157.             continue;</span>
+
  <span id="line154">154.                 Strcpy(genbuf, "wolf");</span>
  <span id="line158">158.         }</span>
+
  <span id="line155">155.             break;</span>
  <span id="line159">159.         mtmp = makemon(&mons[typ], u.ux, u.uy, NO_MM_FLAGS);</span>
+
  <span id="line156">156.         default:</span>
  <span id="line160">160.         if (mtmp) {</span>
+
  <span id="line157">157.             continue;</span>
  <span id="line161">161.             total++;</span>
+
  <span id="line158">158.         }</span>
  <span id="line162">162.             if (canseemon(mtmp))</span>
+
  <span id="line159">159.         mtmp = makemon(&mons[typ], u.ux, u.uy, NO_MM_FLAGS);</span>
  <span id="line163">163.                 *visible += 1;</span>
+
  <span id="line160">160.         if (mtmp) {</span>
  <span id="line164">164.         }</span>
+
  <span id="line161">161.             total++;</span>
  <span id="line165">165.         if (yours && mtmp)</span>
+
  <span id="line162">162.             if (canseemon(mtmp))</span>
  <span id="line166">166.             (void) tamedog(mtmp, (struct obj *) 0);</span>
+
  <span id="line163">163.                 *visible += 1;</span>
  <span id="line167">167.     }</span>
+
  <span id="line164">164.         }</span>
  <span id="line168">168.     return total;</span>
+
  <span id="line165">165.         if (yours && mtmp)</span>
  <span id="line169">169. }</span>
+
  <span id="line166">166.             (void) tamedog(mtmp, (struct obj *) 0);</span>
  <span id="line170">170. </span>
+
  <span id="line167">167.     }</span>
  <span id="line171">171. void</span>
+
  <span id="line168">168.     return total;</span>
  <span id="line172">172. you_were()</span>
+
  <span id="line169">169. }</span>
  <span id="line173">173. {</span>
+
  <span id="line170">170. </span>
  <span id="line174">174.     char qbuf[QBUFSZ];</span>
+
  <span id="line171">171. void</span>
  <span id="line175">175.     boolean controllable_poly = Polymorph_control && !(Stunned || Unaware);</span>
+
  <span id="line172">172. you_were()</span>
  <span id="line176">176. </span>
+
  <span id="line173">173. {</span>
  <span id="line177">177.     if (Unchanging || (u.umonnum == u.ulycn))</span>
+
  <span id="line174">174.     char qbuf[QBUFSZ];</span>
  <span id="line178">178.         return;</span>
+
  <span id="line175">175.     boolean controllable_poly = Polymorph_control && !(Stunned || Unaware);</span>
  <span id="line179">179.     if (controllable_poly) {</span>
+
  <span id="line176">176. </span>
  <span id="line180">180.         /* `+4' => skip "were" prefix to get name of beast */</span>
+
  <span id="line177">177.     if (Unchanging || (u.umonnum == u.ulycn))</span>
  <span id="line181">181.         Sprintf(qbuf, "Do you want to change into %s?",</span>
+
  <span id="line178">178.         return;</span>
  <span id="line182">182.                 an(mons[u.ulycn].mname + 4));</span>
+
  <span id="line179">179.     if (controllable_poly) {</span>
  <span id="line183">183.         if (yn(qbuf) == 'n')</span>
+
  <span id="line180">180.         /* `+4' => skip "were" prefix to get name of beast */</span>
  <span id="line184">184.             return;</span>
+
  <span id="line181">181.         Sprintf(qbuf, "Do you want to change into %s?",</span>
  <span id="line185">185.     }</span>
+
  <span id="line182">182.                 an(mons[u.ulycn].mname + 4));</span>
  <span id="line186">186.     (void) polymon(u.ulycn);</span>
+
  <span id="line183">183.         if (yn(qbuf) == 'n')</span>
  <span id="line187">187. }</span>
+
  <span id="line184">184.             return;</span>
  <span id="line188">188. </span>
+
  <span id="line185">185.     }</span>
  <span id="line189">189. void</span>
+
  <span id="line186">186.     (void) polymon(u.ulycn);</span>
  <span id="line190">190. you_unwere(purify)</span>
+
  <span id="line187">187. }</span>
  <span id="line191">191. boolean purify;</span>
+
  <span id="line188">188. </span>
  <span id="line192">192. {</span>
+
  <span id="line189">189. void</span>
  <span id="line193">193.     boolean controllable_poly = Polymorph_control && !(Stunned || Unaware);</span>
+
  <span id="line190">190. you_unwere(purify)</span>
  <span id="line194">194. </span>
+
  <span id="line191">191. boolean purify;</span>
  <span id="line195">195.     if (purify) {</span>
+
  <span id="line192">192. {</span>
  <span id="line196">196.         You_feel("purified.");</span>
+
  <span id="line193">193.     boolean controllable_poly = Polymorph_control && !(Stunned || Unaware);</span>
  <span id="line197">197.         u.ulycn = NON_PM; /* cure lycanthropy */</span>
+
  <span id="line194">194. </span>
  <span id="line198">198.     }</span>
+
  <span id="line195">195.     if (purify) {</span>
  <span id="line199">199.     if (!Unchanging && is_were(youmonst.data)</span>
+
  <span id="line196">196.         You_feel("purified.");</span>
  <span id="line200">200.         && (!controllable_poly || yn("Remain in beast form?") == 'n'))</span>
+
  <span id="line197">197.         u.ulycn = NON_PM; /* cure lycanthropy */</span>
  <span id="line201">201.         rehumanize();</span>
+
  <span id="line198">198.     }</span>
  <span id="line202">202. }</span>
+
  <span id="line199">199.     if (!Unchanging && is_were(youmonst.data)</span>
  <span id="line203">203. </span>
+
  <span id="line200">200.         && (!controllable_poly || yn("Remain in beast form?") == 'n'))</span>
  <span id="line204">204. /*were.c*/</span>
+
  <span id="line201">201.         rehumanize();</span>
 +
  <span id="line202">202. }</span>
 +
  <span id="line203">203. </span>
 +
  <span id="line204">204. /*were.c*/</span>
 
[[Category:NetHack 3.6.0 source code|src/were.c]]
 
[[Category:NetHack 3.6.0 source code|src/were.c]]

Revision as of 02:17, 17 December 2015

Below is the full text to were.c from the source code of NetHack 3.6.0. To link to a particular line, write [[Source:NetHack 3.6.0/src/were.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	were.c	$NHDT-Date: 1432512763 2015/05/25 00:12:43 $  $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
 #include "hack.h"
 
 void
 were_change(mon)
 register struct monst *mon;
 {
     if (!is_were(mon->data))
         return;
 
     if (is_human(mon->data)) {
         if (!Protection_from_shape_changers
             && !rn2(night() ? (flags.moonphase == FULL_MOON ? 3 : 30)
                             : (flags.moonphase == FULL_MOON ? 10 : 50))) {
             new_were(mon); /* change into animal form */
             if (!Deaf && !canseemon(mon)) {
                 const char *howler;
 
                 switch (monsndx(mon->data)) {
                 case PM_WEREWOLF:
                     howler = "wolf";
                     break;
                 case PM_WEREJACKAL:
                     howler = "jackal";
                     break;
                 default:
                     howler = (char *) 0;
                     break;
                 }
                 if (howler)
                     You_hear("a %s howling at the moon.", howler);
             }
         }
     } else if (!rn2(30) || Protection_from_shape_changers) {
         new_were(mon); /* change back into human form */
     }
 }
 
 int
 counter_were(pm)
 int pm;
 {
     switch (pm) {
     case PM_WEREWOLF:
         return (PM_HUMAN_WEREWOLF);
     case PM_HUMAN_WEREWOLF:
         return (PM_WEREWOLF);
     case PM_WEREJACKAL:
         return (PM_HUMAN_WEREJACKAL);
     case PM_HUMAN_WEREJACKAL:
         return (PM_WEREJACKAL);
     case PM_WERERAT:
         return (PM_HUMAN_WERERAT);
     case PM_HUMAN_WERERAT:
         return (PM_WERERAT);
     default:
         return NON_PM;
     }
 }
 
 /* convert monsters similar to werecritters into appropriate werebeast */
 int
 were_beastie(pm)
 int pm;
 {
     switch (pm) {
     case PM_WERERAT:
     case PM_SEWER_RAT:
     case PM_GIANT_RAT:
     case PM_RABID_RAT:
         return PM_WERERAT;
     case PM_WEREJACKAL:
     case PM_JACKAL:
     case PM_FOX:
     case PM_COYOTE:
         return PM_WEREJACKAL;
     case PM_WEREWOLF:
     case PM_WOLF:
     case PM_WARG:
     case PM_WINTER_WOLF:
         return PM_WEREWOLF;
     default:
         break;
     }
     return NON_PM;
 }
 
 void
 new_were(mon)
 register struct monst *mon;
 {
     register int pm;
 
     pm = counter_were(monsndx(mon->data));
     if (pm < LOW_PM) {
         impossible("unknown lycanthrope %s.", mon->data->mname);
         return;
     }
 
     if (canseemon(mon) && !Hallucination)
         pline("%s changes into a %s.", Monnam(mon),
               is_human(&mons[pm]) ? "human" : mons[pm].mname + 4);
 
     set_mon_data(mon, &mons[pm], 0);
     if (mon->msleeping || !mon->mcanmove) {
         /* transformation wakens and/or revitalizes */
         mon->msleeping = 0;
         mon->mfrozen = 0; /* not asleep or paralyzed */
         mon->mcanmove = 1;
     }
     /* regenerate by 1/4 of the lost hit points */
     mon->mhp += (mon->mhpmax - mon->mhp) / 4;
     newsym(mon->mx, mon->my);
     mon_break_armor(mon, FALSE);
     possibly_unwield(mon, FALSE);
 }
 
 int were_summon(ptr, yours, visible,
                 genbuf) /* were-creature (even you) summons a horde */
 register struct permonst *ptr;
 register boolean yours;
 int *visible; /* number of visible helpers created */
 char *genbuf;
 {
     register int i, typ, pm = monsndx(ptr);
     register struct monst *mtmp;
     int total = 0;
 
     *visible = 0;
     if (Protection_from_shape_changers && !yours)
         return 0;
     for (i = rnd(5); i > 0; i--) {
         switch (pm) {
         case PM_WERERAT:
         case PM_HUMAN_WERERAT:
             typ =
                 rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT;
             if (genbuf)
                 Strcpy(genbuf, "rat");
             break;
         case PM_WEREJACKAL:
         case PM_HUMAN_WEREJACKAL:
             typ = PM_JACKAL;
             if (genbuf)
                 Strcpy(genbuf, "jackal");
             break;
         case PM_WEREWOLF:
         case PM_HUMAN_WEREWOLF:
             typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF;
             if (genbuf)
                 Strcpy(genbuf, "wolf");
             break;
         default:
             continue;
         }
         mtmp = makemon(&mons[typ], u.ux, u.uy, NO_MM_FLAGS);
         if (mtmp) {
             total++;
             if (canseemon(mtmp))
                 *visible += 1;
         }
         if (yours && mtmp)
             (void) tamedog(mtmp, (struct obj *) 0);
     }
     return total;
 }
 
 void
 you_were()
 {
     char qbuf[QBUFSZ];
     boolean controllable_poly = Polymorph_control && !(Stunned || Unaware);
 
     if (Unchanging || (u.umonnum == u.ulycn))
         return;
     if (controllable_poly) {
         /* `+4' => skip "were" prefix to get name of beast */
         Sprintf(qbuf, "Do you want to change into %s?",
                 an(mons[u.ulycn].mname + 4));
         if (yn(qbuf) == 'n')
             return;
     }
     (void) polymon(u.ulycn);
 }
 
 void
 you_unwere(purify)
 boolean purify;
 {
     boolean controllable_poly = Polymorph_control && !(Stunned || Unaware);
 
     if (purify) {
         You_feel("purified.");
         u.ulycn = NON_PM; /* cure lycanthropy */
     }
     if (!Unchanging && is_were(youmonst.data)
         && (!controllable_poly || yn("Remain in beast form?") == 'n'))
         rehumanize();
 }
 
 /*were.c*/