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

From NetHackWiki
Jump to navigation Jump to search
(Created page with "__MIXEDSYNTAXHIGHLIGHT__ Below is the full text to '''rect.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 rect.c $NHDT-Date: 1432512774 2015/05/25 00:12:54 $  $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */</span>
+
 
  <span id="line2">2.   /* Copyright (c) 1990 by Jean-Christophe Collet */</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 rect.c $NHDT-Date: 1432512774 2015/05/25 00:12:54 $  $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */</span>
  <span id="line5">5.   #include "hack.h"</span>
+
  <span id="line2">2. /* Copyright (c) 1990 by Jean-Christophe Collet */</span>
  <span id="line6">6.   </span>
+
  <span id="line3">3. /* NetHack may be freely redistributed.  See license for details. */</span>
  <span id="line7">7.   int FDECL(get_rect_ind, (NhRect *));</span>
+
  <span id="line4">4. </span>
  <span id="line8">8.   </span>
+
  <span id="line5">5. #include "hack.h"</span>
  <span id="line9">9.   STATIC_DCL boolean FDECL(intersect, (NhRect *, NhRect *, NhRect *));</span>
+
  <span id="line6">6. </span>
  <span id="line10">10.   </span>
+
  <span id="line7">7. int FDECL(get_rect_ind, (NhRect *));</span>
  <span id="line11">11.   /*</span>
+
  <span id="line8">8. </span>
  <span id="line12">12.   * In this file, we will handle the various rectangle functions we</span>
+
  <span id="line9">9. STATIC_DCL boolean FDECL(intersect, (NhRect *, NhRect *, NhRect *));</span>
  <span id="line13">13.   * need for room generation.</span>
+
  <span id="line10">10. </span>
  <span id="line14">14.   */</span>
+
  <span id="line11">11. /*</span>
  <span id="line15">15.   </span>
+
  <span id="line12">12.  * In this file, we will handle the various rectangle functions we</span>
  <span id="line16">16.   #define MAXRECT 50</span>
+
  <span id="line13">13.  * need for room generation.</span>
  <span id="line17">17.   #define XLIM 4</span>
+
  <span id="line14">14.  */</span>
  <span id="line18">18.   #define YLIM 3</span>
+
  <span id="line15">15. </span>
  <span id="line19">19.   </span>
+
  <span id="line16">16. #define MAXRECT 50</span>
  <span id="line20">20.   static NhRect rect[MAXRECT + 1];</span>
+
  <span id="line17">17. #define XLIM 4</span>
  <span id="line21">21.   static int rect_cnt;</span>
+
  <span id="line18">18. #define YLIM 3</span>
  <span id="line22">22.   </span>
+
  <span id="line19">19. </span>
  <span id="line23">23.   /*</span>
+
  <span id="line20">20. static NhRect rect[MAXRECT + 1];</span>
  <span id="line24">24.   * Initialisation of internal structures. Should be called for every</span>
+
  <span id="line21">21. static int rect_cnt;</span>
  <span id="line25">25.   * new level to be build...</span>
+
  <span id="line22">22. </span>
  <span id="line26">26.   */</span>
+
  <span id="line23">23. /*</span>
  <span id="line27">27.   </span>
+
  <span id="line24">24.  * Initialisation of internal structures. Should be called for every</span>
  <span id="line28">28.   void</span>
+
  <span id="line25">25.  * new level to be build...</span>
  <span id="line29">29.   init_rect()</span>
+
  <span id="line26">26.  */</span>
  <span id="line30">30.   {</span>
+
  <span id="line27">27. </span>
  <span id="line31">31.       rect_cnt = 1;</span>
+
  <span id="line28">28. void</span>
  <span id="line32">32.       rect[0].lx = rect[0].ly = 0;</span>
+
  <span id="line29">29. init_rect()</span>
  <span id="line33">33.       rect[0].hx = COLNO - 1;</span>
+
  <span id="line30">30. {</span>
  <span id="line34">34.       rect[0].hy = ROWNO - 1;</span>
+
  <span id="line31">31.     rect_cnt = 1;</span>
  <span id="line35">35.   }</span>
+
  <span id="line32">32.     rect[0].lx = rect[0].ly = 0;</span>
  <span id="line36">36.   </span>
+
  <span id="line33">33.     rect[0].hx = COLNO - 1;</span>
  <span id="line37">37.   /*</span>
+
  <span id="line34">34.     rect[0].hy = ROWNO - 1;</span>
  <span id="line38">38.   * Search Index of one precise NhRect.</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. /*</span>
  <span id="line41">41.   </span>
+
  <span id="line38">38.  * Search Index of one precise NhRect.</span>
  <span id="line42">42.   int</span>
+
  <span id="line39">39.  *</span>
  <span id="line43">43.   get_rect_ind(r)</span>
+
  <span id="line40">40.  */</span>
  <span id="line44">44.   NhRect *r;</span>
+
  <span id="line41">41. </span>
  <span id="line45">45.   {</span>
+
  <span id="line42">42. int</span>
  <span id="line46">46.       register NhRect *rectp;</span>
+
  <span id="line43">43. get_rect_ind(r)</span>
  <span id="line47">47.       register int lx, ly, hx, hy;</span>
+
  <span id="line44">44. NhRect *r;</span>
  <span id="line48">48.       register int i;</span>
+
  <span id="line45">45. {</span>
  <span id="line49">49.   </span>
+
  <span id="line46">46.     register NhRect *rectp;</span>
  <span id="line50">50.       lx = r->lx;</span>
+
  <span id="line47">47.     register int lx, ly, hx, hy;</span>
  <span id="line51">51.       ly = r->ly;</span>
+
  <span id="line48">48.     register int i;</span>
  <span id="line52">52.       hx = r->hx;</span>
+
  <span id="line49">49. </span>
  <span id="line53">53.       hy = r->hy;</span>
+
  <span id="line50">50.     lx = r->lx;</span>
  <span id="line54">54.       for (i = 0, rectp = &rect[0]; i < rect_cnt; i++, rectp++)</span>
+
  <span id="line51">51.     ly = r->ly;</span>
  <span id="line55">55.           if (lx == rectp->lx && ly == rectp->ly && hx == rectp->hx</span>
+
  <span id="line52">52.     hx = r->hx;</span>
  <span id="line56">56.               && hy == rectp->hy)</span>
+
  <span id="line53">53.     hy = r->hy;</span>
  <span id="line57">57.               return i;</span>
+
  <span id="line54">54.     for (i = 0, rectp = &rect[0]; i < rect_cnt; i++, rectp++)</span>
  <span id="line58">58.       return -1;</span>
+
  <span id="line55">55.         if (lx == rectp->lx && ly == rectp->ly && hx == rectp->hx</span>
  <span id="line59">59.   }</span>
+
  <span id="line56">56.             && hy == rectp->hy)</span>
  <span id="line60">60.   </span>
+
  <span id="line57">57.             return i;</span>
  <span id="line61">61.   /*</span>
+
  <span id="line58">58.     return -1;</span>
  <span id="line62">62.   * Search a free rectangle that include the one given in arg</span>
+
  <span id="line59">59. }</span>
  <span id="line63">63.   */</span>
+
  <span id="line60">60. </span>
  <span id="line64">64.   </span>
+
  <span id="line61">61. /*</span>
  <span id="line65">65.   NhRect *</span>
+
  <span id="line62">62.  * Search a free rectangle that include the one given in arg</span>
  <span id="line66">66.   get_rect(r)</span>
+
  <span id="line63">63.  */</span>
  <span id="line67">67.   NhRect *r;</span>
+
  <span id="line64">64. </span>
  <span id="line68">68.   {</span>
+
  <span id="line65">65. NhRect *</span>
  <span id="line69">69.       register NhRect *rectp;</span>
+
  <span id="line66">66. get_rect(r)</span>
  <span id="line70">70.       register int lx, ly, hx, hy;</span>
+
  <span id="line67">67. NhRect *r;</span>
  <span id="line71">71.       register int i;</span>
+
  <span id="line68">68. {</span>
  <span id="line72">72.   </span>
+
  <span id="line69">69.     register NhRect *rectp;</span>
  <span id="line73">73.       lx = r->lx;</span>
+
  <span id="line70">70.     register int lx, ly, hx, hy;</span>
  <span id="line74">74.       ly = r->ly;</span>
+
  <span id="line71">71.     register int i;</span>
  <span id="line75">75.       hx = r->hx;</span>
+
  <span id="line72">72. </span>
  <span id="line76">76.       hy = r->hy;</span>
+
  <span id="line73">73.     lx = r->lx;</span>
  <span id="line77">77.       for (i = 0, rectp = &rect[0]; i < rect_cnt; i++, rectp++)</span>
+
  <span id="line74">74.     ly = r->ly;</span>
  <span id="line78">78.           if (lx >= rectp->lx && ly >= rectp->ly && hx <= rectp->hx</span>
+
  <span id="line75">75.     hx = r->hx;</span>
  <span id="line79">79.               && hy <= rectp->hy)</span>
+
  <span id="line76">76.     hy = r->hy;</span>
  <span id="line80">80.               return rectp;</span>
+
  <span id="line77">77.     for (i = 0, rectp = &rect[0]; i < rect_cnt; i++, rectp++)</span>
  <span id="line81">81.       return 0;</span>
+
  <span id="line78">78.         if (lx >= rectp->lx && ly >= rectp->ly && hx <= rectp->hx</span>
  <span id="line82">82.   }</span>
+
  <span id="line79">79.             && hy <= rectp->hy)</span>
  <span id="line83">83.   </span>
+
  <span id="line80">80.             return rectp;</span>
  <span id="line84">84.   /*</span>
+
  <span id="line81">81.     return 0;</span>
  <span id="line85">85.   * Get some random NhRect from the list.</span>
+
  <span id="line82">82. }</span>
  <span id="line86">86.   */</span>
+
  <span id="line83">83. </span>
  <span id="line87">87.   </span>
+
  <span id="line84">84. /*</span>
  <span id="line88">88.   NhRect *</span>
+
  <span id="line85">85.  * Get some random NhRect from the list.</span>
  <span id="line89">89.   rnd_rect()</span>
+
  <span id="line86">86.  */</span>
  <span id="line90">90.   {</span>
+
  <span id="line87">87. </span>
  <span id="line91">91.       return rect_cnt > 0 ? &rect[rn2(rect_cnt)] : 0;</span>
+
  <span id="line88">88. NhRect *</span>
  <span id="line92">92.   }</span>
+
  <span id="line89">89. rnd_rect()</span>
  <span id="line93">93.   </span>
+
  <span id="line90">90. {</span>
  <span id="line94">94.   /*</span>
+
  <span id="line91">91.     return rect_cnt > 0 ? &rect[rn2(rect_cnt)] : 0;</span>
  <span id="line95">95.   * Search intersection between two rectangles (r1 & r2).</span>
+
  <span id="line92">92. }</span>
  <span id="line96">96.   * return TRUE if intersection exist and put it in r3.</span>
+
  <span id="line93">93. </span>
  <span id="line97">97.   * otherwise returns FALSE</span>
+
  <span id="line94">94. /*</span>
  <span id="line98">98.   */</span>
+
  <span id="line95">95.  * Search intersection between two rectangles (r1 & r2).</span>
  <span id="line99">99.   </span>
+
  <span id="line96">96.  * return TRUE if intersection exist and put it in r3.</span>
  <span id="line100">100. STATIC_OVL boolean</span>
+
  <span id="line97">97.  * otherwise returns FALSE</span>
  <span id="line101">101. intersect(r1, r2, r3)</span>
+
  <span id="line98">98.  */</span>
  <span id="line102">102. NhRect *r1, *r2, *r3;</span>
+
  <span id="line99">99. </span>
  <span id="line103">103. {</span>
+
  <span id="line100">100. STATIC_OVL boolean</span>
  <span id="line104">104.     if (r2->lx > r1->hx || r2->ly > r1->hy || r2->hx < r1->lx</span>
+
  <span id="line101">101. intersect(r1, r2, r3)</span>
  <span id="line105">105.         || r2->hy < r1->ly)</span>
+
  <span id="line102">102. NhRect *r1, *r2, *r3;</span>
  <span id="line106">106.         return FALSE;</span>
+
  <span id="line103">103. {</span>
  <span id="line107">107. </span>
+
  <span id="line104">104.     if (r2->lx > r1->hx || r2->ly > r1->hy || r2->hx < r1->lx</span>
  <span id="line108">108.     r3->lx = (r2->lx > r1->lx ? r2->lx : r1->lx);</span>
+
  <span id="line105">105.         || r2->hy < r1->ly)</span>
  <span id="line109">109.     r3->ly = (r2->ly > r1->ly ? r2->ly : r1->ly);</span>
+
  <span id="line106">106.         return FALSE;</span>
  <span id="line110">110.     r3->hx = (r2->hx > r1->hx ? r1->hx : r2->hx);</span>
+
  <span id="line107">107. </span>
  <span id="line111">111.     r3->hy = (r2->hy > r1->hy ? r1->hy : r2->hy);</span>
+
  <span id="line108">108.     r3->lx = (r2->lx > r1->lx ? r2->lx : r1->lx);</span>
  <span id="line112">112. </span>
+
  <span id="line109">109.     r3->ly = (r2->ly > r1->ly ? r2->ly : r1->ly);</span>
  <span id="line113">113.     if (r3->lx > r3->hx || r3->ly > r3->hy)</span>
+
  <span id="line110">110.     r3->hx = (r2->hx > r1->hx ? r1->hx : r2->hx);</span>
  <span id="line114">114.         return FALSE;</span>
+
  <span id="line111">111.     r3->hy = (r2->hy > r1->hy ? r1->hy : r2->hy);</span>
  <span id="line115">115.     return TRUE;</span>
+
  <span id="line112">112. </span>
  <span id="line116">116. }</span>
+
  <span id="line113">113.     if (r3->lx > r3->hx || r3->ly > r3->hy)</span>
  <span id="line117">117. </span>
+
  <span id="line114">114.         return FALSE;</span>
  <span id="line118">118. /*</span>
+
  <span id="line115">115.     return TRUE;</span>
  <span id="line119">119.   * Remove a rectangle from the list of free NhRect.</span>
+
  <span id="line116">116. }</span>
  <span id="line120">120.   */</span>
+
  <span id="line117">117. </span>
  <span id="line121">121. </span>
+
  <span id="line118">118. /*</span>
  <span id="line122">122. void</span>
+
  <span id="line119">119.  * Remove a rectangle from the list of free NhRect.</span>
  <span id="line123">123. remove_rect(r)</span>
+
  <span id="line120">120.  */</span>
  <span id="line124">124. NhRect *r;</span>
+
  <span id="line121">121. </span>
  <span id="line125">125. {</span>
+
  <span id="line122">122. void</span>
  <span id="line126">126.     int ind;</span>
+
  <span id="line123">123. remove_rect(r)</span>
  <span id="line127">127. </span>
+
  <span id="line124">124. NhRect *r;</span>
  <span id="line128">128.     ind = get_rect_ind(r);</span>
+
  <span id="line125">125. {</span>
  <span id="line129">129.     if (ind >= 0)</span>
+
  <span id="line126">126.     int ind;</span>
  <span id="line130">130.         rect[ind] = rect[--rect_cnt];</span>
+
  <span id="line127">127. </span>
  <span id="line131">131. }</span>
+
  <span id="line128">128.     ind = get_rect_ind(r);</span>
  <span id="line132">132. </span>
+
  <span id="line129">129.     if (ind >= 0)</span>
  <span id="line133">133. /*</span>
+
  <span id="line130">130.         rect[ind] = rect[--rect_cnt];</span>
  <span id="line134">134.   * Add a NhRect to the list.</span>
+
  <span id="line131">131. }</span>
  <span id="line135">135.   */</span>
+
  <span id="line132">132. </span>
  <span id="line136">136. </span>
+
  <span id="line133">133. /*</span>
  <span id="line137">137. void</span>
+
  <span id="line134">134.  * Add a NhRect to the list.</span>
  <span id="line138">138. add_rect(r)</span>
+
  <span id="line135">135.  */</span>
  <span id="line139">139. NhRect *r;</span>
+
  <span id="line136">136. </span>
  <span id="line140">140. {</span>
+
  <span id="line137">137. void</span>
  <span id="line141">141.     if (rect_cnt >= MAXRECT) {</span>
+
  <span id="line138">138. add_rect(r)</span>
  <span id="line142">142.         if (wizard)</span>
+
  <span id="line139">139. NhRect *r;</span>
  <span id="line143">143.             pline("MAXRECT may be too small.");</span>
+
  <span id="line140">140. {</span>
  <span id="line144">144.         return;</span>
+
  <span id="line141">141.     if (rect_cnt >= MAXRECT) {</span>
  <span id="line145">145.     }</span>
+
  <span id="line142">142.         if (wizard)</span>
  <span id="line146">146.     /* Check that this NhRect is not included in another one */</span>
+
  <span id="line143">143.             pline("MAXRECT may be too small.");</span>
  <span id="line147">147.     if (get_rect(r))</span>
+
  <span id="line144">144.         return;</span>
  <span id="line148">148.         return;</span>
+
  <span id="line145">145.     }</span>
  <span id="line149">149.     rect[rect_cnt] = *r;</span>
+
  <span id="line146">146.     /* Check that this NhRect is not included in another one */</span>
  <span id="line150">150.     rect_cnt++;</span>
+
  <span id="line147">147.     if (get_rect(r))</span>
  <span id="line151">151. }</span>
+
  <span id="line148">148.         return;</span>
  <span id="line152">152. </span>
+
  <span id="line149">149.     rect[rect_cnt] = *r;</span>
  <span id="line153">153. /*</span>
+
  <span id="line150">150.     rect_cnt++;</span>
  <span id="line154">154.   * Okay, here we have two rectangles (r1 & r2).</span>
+
  <span id="line151">151. }</span>
  <span id="line155">155.   * r1 was already in the list and r2 is included in r1.</span>
+
  <span id="line152">152. </span>
  <span id="line156">156.   * What we want is to allocate r2, that is split r1 into smaller rectangles</span>
+
  <span id="line153">153. /*</span>
  <span id="line157">157.   * then remove it.</span>
+
  <span id="line154">154.  * Okay, here we have two rectangles (r1 & r2).</span>
  <span id="line158">158.   */</span>
+
  <span id="line155">155.  * r1 was already in the list and r2 is included in r1.</span>
  <span id="line159">159. </span>
+
  <span id="line156">156.  * What we want is to allocate r2, that is split r1 into smaller rectangles</span>
  <span id="line160">160. void</span>
+
  <span id="line157">157.  * then remove it.</span>
  <span id="line161">161. split_rects(r1, r2)</span>
+
  <span id="line158">158.  */</span>
  <span id="line162">162. NhRect *r1, *r2;</span>
+
  <span id="line159">159. </span>
  <span id="line163">163. {</span>
+
  <span id="line160">160. void</span>
  <span id="line164">164.     NhRect r, old_r;</span>
+
  <span id="line161">161. split_rects(r1, r2)</span>
  <span id="line165">165.     int i;</span>
+
  <span id="line162">162. NhRect *r1, *r2;</span>
  <span id="line166">166. </span>
+
  <span id="line163">163. {</span>
  <span id="line167">167.     old_r = *r1;</span>
+
  <span id="line164">164.     NhRect r, old_r;</span>
  <span id="line168">168.     remove_rect(r1);</span>
+
  <span id="line165">165.     int i;</span>
  <span id="line169">169. </span>
+
  <span id="line166">166. </span>
  <span id="line170">170.     /* Walk down since rect_cnt & rect[] will change... */</span>
+
  <span id="line167">167.     old_r = *r1;</span>
  <span id="line171">171.     for (i = rect_cnt - 1; i >= 0; i--)</span>
+
  <span id="line168">168.     remove_rect(r1);</span>
  <span id="line172">172.         if (intersect(&rect[i], r2, &r))</span>
+
  <span id="line169">169. </span>
  <span id="line173">173.             split_rects(&rect[i], &r);</span>
+
  <span id="line170">170.     /* Walk down since rect_cnt & rect[] will change... */</span>
  <span id="line174">174. </span>
+
  <span id="line171">171.     for (i = rect_cnt - 1; i >= 0; i--)</span>
  <span id="line175">175.     if (r2->ly - old_r.ly - 1</span>
+
  <span id="line172">172.         if (intersect(&rect[i], r2, &r))</span>
  <span id="line176">176.         > (old_r.hy < ROWNO - 1 ? 2 * YLIM : YLIM + 1) + 4) {</span>
+
  <span id="line173">173.             split_rects(&rect[i], &r);</span>
  <span id="line177">177.         r = old_r;</span>
+
  <span id="line174">174. </span>
  <span id="line178">178.         r.hy = r2->ly - 2;</span>
+
  <span id="line175">175.     if (r2->ly - old_r.ly - 1</span>
  <span id="line179">179.         add_rect(&r);</span>
+
  <span id="line176">176.         > (old_r.hy < ROWNO - 1 ? 2 * YLIM : YLIM + 1) + 4) {</span>
  <span id="line180">180.     }</span>
+
  <span id="line177">177.         r = old_r;</span>
  <span id="line181">181.     if (r2->lx - old_r.lx - 1</span>
+
  <span id="line178">178.         r.hy = r2->ly - 2;</span>
  <span id="line182">182.         > (old_r.hx < COLNO - 1 ? 2 * XLIM : XLIM + 1) + 4) {</span>
+
  <span id="line179">179.         add_rect(&r);</span>
  <span id="line183">183.         r = old_r;</span>
+
  <span id="line180">180.     }</span>
  <span id="line184">184.         r.hx = r2->lx - 2;</span>
+
  <span id="line181">181.     if (r2->lx - old_r.lx - 1</span>
  <span id="line185">185.         add_rect(&r);</span>
+
  <span id="line182">182.         > (old_r.hx < COLNO - 1 ? 2 * XLIM : XLIM + 1) + 4) {</span>
  <span id="line186">186.     }</span>
+
  <span id="line183">183.         r = old_r;</span>
  <span id="line187">187.     if (old_r.hy - r2->hy - 1 > (old_r.ly > 0 ? 2 * YLIM : YLIM + 1) + 4) {</span>
+
  <span id="line184">184.         r.hx = r2->lx - 2;</span>
  <span id="line188">188.         r = old_r;</span>
+
  <span id="line185">185.         add_rect(&r);</span>
  <span id="line189">189.         r.ly = r2->hy + 2;</span>
+
  <span id="line186">186.     }</span>
  <span id="line190">190.         add_rect(&r);</span>
+
  <span id="line187">187.     if (old_r.hy - r2->hy - 1 > (old_r.ly > 0 ? 2 * YLIM : YLIM + 1) + 4) {</span>
  <span id="line191">191.     }</span>
+
  <span id="line188">188.         r = old_r;</span>
  <span id="line192">192.     if (old_r.hx - r2->hx - 1 > (old_r.lx > 0 ? 2 * XLIM : XLIM + 1) + 4) {</span>
+
  <span id="line189">189.         r.ly = r2->hy + 2;</span>
  <span id="line193">193.         r = old_r;</span>
+
  <span id="line190">190.         add_rect(&r);</span>
  <span id="line194">194.         r.lx = r2->hx + 2;</span>
+
  <span id="line191">191.     }</span>
  <span id="line195">195.         add_rect(&r);</span>
+
  <span id="line192">192.     if (old_r.hx - r2->hx - 1 > (old_r.lx > 0 ? 2 * XLIM : XLIM + 1) + 4) {</span>
  <span id="line196">196.     }</span>
+
  <span id="line193">193.         r = old_r;</span>
  <span id="line197">197. }</span>
+
  <span id="line194">194.         r.lx = r2->hx + 2;</span>
  <span id="line198">198. </span>
+
  <span id="line195">195.         add_rect(&r);</span>
  <span id="line199">199. /*rect.c*/</span>
+
  <span id="line196">196.     }</span>
 +
  <span id="line197">197. }</span>
 +
  <span id="line198">198. </span>
 +
  <span id="line199">199. /*rect.c*/</span>
 
[[Category:NetHack 3.6.0 source code|src/rect.c]]
 
[[Category:NetHack 3.6.0 source code|src/rect.c]]

Revision as of 02:05, 17 December 2015

Below is the full text to rect.c from the source code of NetHack 3.6.0. To link to a particular line, write [[Source:NetHack 3.6.0/src/rect.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	rect.c	$NHDT-Date: 1432512774 2015/05/25 00:12:54 $  $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */
 /* Copyright (c) 1990 by Jean-Christophe Collet	 */
 /* NetHack may be freely redistributed.  See license for details. */
 
 #include "hack.h"
 
 int FDECL(get_rect_ind, (NhRect *));
 
 STATIC_DCL boolean FDECL(intersect, (NhRect *, NhRect *, NhRect *));
 
 /*
  * In this file, we will handle the various rectangle functions we
  * need for room generation.
  */
 
 #define MAXRECT 50
 #define XLIM 4
 #define YLIM 3
 
 static NhRect rect[MAXRECT + 1];
 static int rect_cnt;
 
 /*
  * Initialisation of internal structures. Should be called for every
  * new level to be build...
  */
 
 void
 init_rect()
 {
     rect_cnt = 1;
     rect[0].lx = rect[0].ly = 0;
     rect[0].hx = COLNO - 1;
     rect[0].hy = ROWNO - 1;
 }
 
 /*
  * Search Index of one precise NhRect.
  *
  */
 
 int
 get_rect_ind(r)
 NhRect *r;
 {
     register NhRect *rectp;
     register int lx, ly, hx, hy;
     register int i;
 
     lx = r->lx;
     ly = r->ly;
     hx = r->hx;
     hy = r->hy;
     for (i = 0, rectp = &rect[0]; i < rect_cnt; i++, rectp++)
         if (lx == rectp->lx && ly == rectp->ly && hx == rectp->hx
             && hy == rectp->hy)
             return i;
     return -1;
 }
 
 /*
  * Search a free rectangle that include the one given in arg
  */
 
 NhRect *
 get_rect(r)
 NhRect *r;
 {
     register NhRect *rectp;
     register int lx, ly, hx, hy;
     register int i;
 
     lx = r->lx;
     ly = r->ly;
     hx = r->hx;
     hy = r->hy;
     for (i = 0, rectp = &rect[0]; i < rect_cnt; i++, rectp++)
         if (lx >= rectp->lx && ly >= rectp->ly && hx <= rectp->hx
             && hy <= rectp->hy)
             return rectp;
     return 0;
 }
 
 /*
  * Get some random NhRect from the list.
  */
 
 NhRect *
 rnd_rect()
 {
     return rect_cnt > 0 ? &rect[rn2(rect_cnt)] : 0;
 }
 
 /*
  * Search intersection between two rectangles (r1 & r2).
  * return TRUE if intersection exist and put it in r3.
  * otherwise returns FALSE
  */
 
 STATIC_OVL boolean
 intersect(r1, r2, r3)
 NhRect *r1, *r2, *r3;
 {
     if (r2->lx > r1->hx || r2->ly > r1->hy || r2->hx < r1->lx
         || r2->hy < r1->ly)
         return FALSE;
 
     r3->lx = (r2->lx > r1->lx ? r2->lx : r1->lx);
     r3->ly = (r2->ly > r1->ly ? r2->ly : r1->ly);
     r3->hx = (r2->hx > r1->hx ? r1->hx : r2->hx);
     r3->hy = (r2->hy > r1->hy ? r1->hy : r2->hy);
 
     if (r3->lx > r3->hx || r3->ly > r3->hy)
         return FALSE;
     return TRUE;
 }
 
 /*
  * Remove a rectangle from the list of free NhRect.
  */
 
 void
 remove_rect(r)
 NhRect *r;
 {
     int ind;
 
     ind = get_rect_ind(r);
     if (ind >= 0)
         rect[ind] = rect[--rect_cnt];
 }
 
 /*
  * Add a NhRect to the list.
  */
 
 void
 add_rect(r)
 NhRect *r;
 {
     if (rect_cnt >= MAXRECT) {
         if (wizard)
             pline("MAXRECT may be too small.");
         return;
     }
     /* Check that this NhRect is not included in another one */
     if (get_rect(r))
         return;
     rect[rect_cnt] = *r;
     rect_cnt++;
 }
 
 /*
  * Okay, here we have two rectangles (r1 & r2).
  * r1 was already in the list and r2 is included in r1.
  * What we want is to allocate r2, that is split r1 into smaller rectangles
  * then remove it.
  */
 
 void
 split_rects(r1, r2)
 NhRect *r1, *r2;
 {
     NhRect r, old_r;
     int i;
 
     old_r = *r1;
     remove_rect(r1);
 
     /* Walk down since rect_cnt & rect[] will change... */
     for (i = rect_cnt - 1; i >= 0; i--)
         if (intersect(&rect[i], r2, &r))
             split_rects(&rect[i], &r);
 
     if (r2->ly - old_r.ly - 1
         > (old_r.hy < ROWNO - 1 ? 2 * YLIM : YLIM + 1) + 4) {
         r = old_r;
         r.hy = r2->ly - 2;
         add_rect(&r);
     }
     if (r2->lx - old_r.lx - 1
         > (old_r.hx < COLNO - 1 ? 2 * XLIM : XLIM + 1) + 4) {
         r = old_r;
         r.hx = r2->lx - 2;
         add_rect(&r);
     }
     if (old_r.hy - r2->hy - 1 > (old_r.ly > 0 ? 2 * YLIM : YLIM + 1) + 4) {
         r = old_r;
         r.ly = r2->hy + 2;
         add_rect(&r);
     }
     if (old_r.hx - r2->hx - 1 > (old_r.lx > 0 ? 2 * XLIM : XLIM + 1) + 4) {
         r = old_r;
         r.lx = r2->hx + 2;
         add_rect(&r);
     }
 }
 
 /*rect.c*/