Difference between revisions of "Source:NetHack 1.4f/vault.c"

From NetHackWiki
Jump to navigation Jump to search
m (Automated source code upload)
 
m (Semi-redirect to 1.3d versions)
Line 1: Line 1:
Below is the full text to '''vault.c''' from the [[NetHack 1.4f source code|source code]] of [[NetHack 1.4f]]. To link to a particular line, write [[NetHack 1.4f/vault.c#line123|<nowiki>[[NetHack 1.4f/vault.c#line123]]</nowiki>]], for example.
+
The source code file '''vault.c''' in [[NetHack 1.4f source code|NetHack 1.4f]] is unchanged from [[NetHack 1.3d/vault.c]].
 
+
[[Category:NetHack 1.4f source code]]
'''Warning!''' This is the source code from an old release. For the latest release, see [[Source code]]
 
 
 
{{CWI}}
 
<span id="line1">1.   /* SCCS Id: @(#)vault.c 1.3 87/07/14</span>
 
<span id="line2">2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */</span>
 
<span id="line3">3.    /* vault.c - version 1.0.2 */</span>
 
<span id="line4">4.    </span>
 
<span id="line5">5.    #include "hack.h"</span>
 
<span id="line6">6.    #ifdef QUEST</span>
 
<span id="line7">7.    setgd(/* mtmp */) /* struct monst *mtmp; */ {}</span>
 
<span id="line8">8.    gd_move() { return(2); }</span>
 
<span id="line9">9.    gddead(mtmp) struct monst *mtmp; {}</span>
 
<span id="line10">10.  replgd(mtmp,mtmp2) struct monst *mtmp, *mtmp2; {}</span>
 
<span id="line11">11.  invault(){}</span>
 
<span id="line12">12.  </span>
 
<span id="line13">13.  #else</span>
 
<span id="line14">14.  </span>
 
<span id="line15">15.  </span>
 
<span id="line16">16.  #include "mkroom.h"</span>
 
<span id="line17">17.  extern struct monst *makemon();</span>
 
<span id="line18">18.  #define FCSIZ (ROWNO+COLNO)</span>
 
<span id="line19">19.  struct fakecorridor {</span>
 
<span id="line20">20.  xchar fx,fy,ftyp;</span>
 
<span id="line21">21.  };</span>
 
<span id="line22">22.  </span>
 
<span id="line23">23.  struct egd {</span>
 
<span id="line24">24.  int fcbeg, fcend; /* fcend: first unused pos */</span>
 
<span id="line25">25.  xchar gdx, gdy; /* goal of guard's walk */</span>
 
<span id="line26">26.  unsigned gddone:1;</span>
 
<span id="line27">27.  struct fakecorridor fakecorr[FCSIZ];</span>
 
<span id="line28">28.  };</span>
 
<span id="line29">29.  </span>
 
<span id="line30">30.  static struct permonst pm_guard =</span>
 
<span id="line31">31.  { "guard", '@', 12, 12, -1, 40, 4, 10, sizeof(struct egd) };</span>
 
<span id="line32">32.  </span>
 
<span id="line33">33.  static struct monst *guard;</span>
 
<span id="line34">34.  static int gdlevel;</span>
 
<span id="line35">35.  #define EGD ((struct egd *)(&(guard->mextra[0])))</span>
 
<span id="line36">36.  </span>
 
<span id="line37">37.  static</span>
 
<span id="line38">38.  restfakecorr()</span>
 
<span id="line39">39.  {</span>
 
<span id="line40">40.  register fcx,fcy,fcbeg;</span>
 
<span id="line41">41.  register struct rm *crm;</span>
 
<span id="line42">42.  </span>
 
<span id="line43">43.  while((fcbeg = EGD->fcbeg) < EGD->fcend) {</span>
 
<span id="line44">44.  fcx = EGD->fakecorr[fcbeg].fx;</span>
 
<span id="line45">45.  fcy = EGD->fakecorr[fcbeg].fy;</span>
 
<span id="line46">46.  if((u.ux == fcx && u.uy == fcy) || cansee(fcx,fcy) ||</span>
 
<span id="line47">47.    m_at(fcx,fcy))</span>
 
<span id="line48">48.  return;</span>
 
<span id="line49">49.  crm = &levl[fcx][fcy];</span>
 
<span id="line50">50.  crm->typ = EGD->fakecorr[fcbeg].ftyp;</span>
 
<span id="line51">51.  if(!crm->typ) crm->seen = 0;</span>
 
<span id="line52">52.  newsym(fcx,fcy);</span>
 
<span id="line53">53.  EGD->fcbeg++;</span>
 
<span id="line54">54.  }</span>
 
<span id="line55">55.  /* it seems he left the corridor - let the guard disappear */</span>
 
<span id="line56">56.  mondead(guard);</span>
 
<span id="line57">57.  guard = 0;</span>
 
<span id="line58">58.  }</span>
 
<span id="line59">59.  </span>
 
<span id="line60">60.  static</span>
 
<span id="line61">61.  goldincorridor()</span>
 
<span id="line62">62.  {</span>
 
<span id="line63">63.  register int fci;</span>
 
<span id="line64">64.  </span>
 
<span id="line65">65.  for(fci = EGD->fcbeg; fci < EGD->fcend; fci++)</span>
 
<span id="line66">66.  if(g_at(EGD->fakecorr[fci].fx, EGD->fakecorr[fci].fy))</span>
 
<span id="line67">67.  return(1);</span>
 
<span id="line68">68.  return(0);</span>
 
<span id="line69">69.  }</span>
 
<span id="line70">70.  </span>
 
<span id="line71">71.  setgd(){</span>
 
<span id="line72">72.  register struct monst *mtmp;</span>
 
<span id="line73">73.  for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) if(mtmp->isgd){</span>
 
<span id="line74">74.  guard = mtmp;</span>
 
<span id="line75">75.  gdlevel = dlevel;</span>
 
<span id="line76">76.  return;</span>
 
<span id="line77">77.  }</span>
 
<span id="line78">78.  guard = 0;</span>
 
<span id="line79">79.  }</span>
 
<span id="line80">80.  </span>
 
<span id="line81">81.  invault(){</span>
 
<span id="line82">82.  register tmp = inroom(u.ux, u.uy);</span>
 
<span id="line83">83.      if(tmp < 0 || rooms[tmp].rtype != VAULT) {</span>
 
<span id="line84">84.  u.uinvault = 0;</span>
 
<span id="line85">85.  return;</span>
 
<span id="line86">86.      }</span>
 
<span id="line87">87.      if(++u.uinvault % 50 == 0 && (!guard || gdlevel != dlevel)) {</span>
 
<span id="line88">88.  char buf[BUFSZ];</span>
 
<span id="line89">89.  register x,y,dd,gx,gy;</span>
 
<span id="line90">90.  </span>
 
<span id="line91">91.  /* first find the goal for the guard */</span>
 
<span id="line92">92.  for(dd = 1; (dd < ROWNO || dd < COLNO); dd++) {</span>
 
<span id="line93">93.    for(y = u.uy-dd; y <= u.uy+dd; y++) {</span>
 
<span id="line94">94.      if(y < 0 || y > ROWNO-1) continue;</span>
 
<span id="line95">95.      for(x = u.ux-dd; x <= u.ux+dd; x++) {</span>
 
<span id="line96">96.        if(y != u.uy-dd && y != u.uy+dd && x != u.ux-dd)</span>
 
<span id="line97">97.  x = u.ux+dd;</span>
 
<span id="line98">98.        if(x < 0 || x > COLNO-1) continue;</span>
 
<span id="line99">99.        if(levl[x][y].typ == CORR) goto fnd;</span>
 
<span id="line100">100.      }</span>
 
<span id="line101">101.    }</span>
 
<span id="line102">102.  }</span>
 
<span id="line103">103.  impossible("Not a single corridor on this level??");</span>
 
<span id="line104">104.  tele();</span>
 
<span id="line105">105.  return;</span>
 
<span id="line106">106.  fnd:</span>
 
<span id="line107">107.  gx = x; gy = y;</span>
 
<span id="line108">108.  </span>
 
<span id="line109">109.  /* next find a good place for a door in the wall */</span>
 
<span id="line110">110.  x = u.ux; y = u.uy;</span>
 
<span id="line111">111.  while(levl[x][y].typ == ROOM) {</span>
 
<span id="line112">112.  register int dx,dy;</span>
 
<span id="line113">113.  </span>
 
<span id="line114">114.  dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;</span>
 
<span id="line115">115.  dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;</span>
 
<span id="line116">116.  if(abs(gx-x) >= abs(gy-y))</span>
 
<span id="line117">117.  x += dx;</span>
 
<span id="line118">118.  else</span>
 
<span id="line119">119.  y += dy;</span>
 
<span id="line120">120.  }</span>
 
<span id="line121">121.  </span>
 
<span id="line122">122.  /* make something interesting happen */</span>
 
<span id="line123">123.  if(!(guard = makemon(&pm_guard,x,y))) return;</span>
 
<span id="line124">124.  guard->isgd = guard->mpeaceful = 1;</span>
 
<span id="line125">125.  EGD->gddone = 0;</span>
 
<span id="line126">126.  gdlevel = dlevel;</span>
 
<span id="line127">127.  if(!cansee(guard->mx, guard->my)) {</span>
 
<span id="line128">128.  mondead(guard);</span>
 
<span id="line129">129.  guard = 0;</span>
 
<span id="line130">130.  return;</span>
 
<span id="line131">131.  }</span>
 
<span id="line132">132.  </span>
 
<span id="line133">133.  pline("Suddenly one of the Vault's guards enters!");</span>
 
<span id="line134">134.  pmon(guard);</span>
 
<span id="line135">135.  do {</span>
 
<span id="line136">136.  pline("\"Hello stranger, who are you?\" - ");</span>
 
<span id="line137">137.  getlin(buf);</span>
 
<span id="line138">138.  } while (!letter(buf[0]));</span>
 
<span id="line139">139.  </span>
 
<span id="line140">140.  if(!strcmp(buf, "Croesus") || !strcmp(buf, "Kroisos")) {</span>
 
<span id="line141">141.  pline("\"Oh, yes - of course. Sorry to have disturbed you.\"");</span>
 
<span id="line142">142.  mondead(guard);</span>
 
<span id="line143">143.  guard = 0;</span>
 
<span id="line144">144.  return;</span>
 
<span id="line145">145.  }</span>
 
<span id="line146">146.  clrlin();</span>
 
<span id="line147">147.  pline("\"I don't know you.\"");</span>
 
<span id="line148">148.  if(!u.ugold)</span>
 
<span id="line149">149.      pline("\"Please follow me.\"");</span>
 
<span id="line150">150.  else {</span>
 
<span id="line151">151.      pline("\"Most likely all that gold was stolen from this vault.\"");</span>
 
<span id="line152">152.      pline("\"Please drop your gold (say d$ ) and follow me.\"");</span>
 
<span id="line153">153.  }</span>
 
<span id="line154">154.  EGD->gdx = gx;</span>
 
<span id="line155">155.  EGD->gdy = gy;</span>
 
<span id="line156">156.  EGD->fcbeg = 0;</span>
 
<span id="line157">157.  EGD->fakecorr[0].fx = x;</span>
 
<span id="line158">158.  EGD->fakecorr[0].fy = y;</span>
 
<span id="line159">159.  EGD->fakecorr[0].ftyp = levl[x][y].typ;</span>
 
<span id="line160">160.  levl[x][y].typ = DOOR;</span>
 
<span id="line161">161.  EGD->fcend = 1;</span>
 
<span id="line162">162.      }</span>
 
<span id="line163">163.  }</span>
 
<span id="line164">164.  </span>
 
<span id="line165">165.  gd_move(){</span>
 
<span id="line166">166.  register int x,y,dx,dy,gx,gy,nx,ny,typ;</span>
 
<span id="line167">167.  register struct fakecorridor *fcp;</span>
 
<span id="line168">168.  register struct rm *crm;</span>
 
<span id="line169">169.  if(!guard || gdlevel != dlevel){</span>
 
<span id="line170">170.  impossible("Where is the guard?");</span>
 
<span id="line171">171.  return(2); /* died */</span>
 
<span id="line172">172.  }</span>
 
<span id="line173">173.  if(u.ugold || goldincorridor())</span>
 
<span id="line174">174.  return(0); /* didnt move */</span>
 
<span id="line175">175.  if(dist(guard->mx,guard->my) > 1 || EGD->gddone) {</span>
 
<span id="line176">176.  restfakecorr();</span>
 
<span id="line177">177.  return(0); /* didnt move */</span>
 
<span id="line178">178.  }</span>
 
<span id="line179">179.  x = guard->mx;</span>
 
<span id="line180">180.  y = guard->my;</span>
 
<span id="line181">181.  /* look around (hor & vert only) for accessible places */</span>
 
<span id="line182">182.  for(nx = x-1; nx <= x+1; nx++) for(ny = y-1; ny <= y+1; ny++) {</span>
 
<span id="line183">183.      if(nx == x || ny == y) if(nx != x || ny != y)</span>
 
<span id="line184">184.      if(isok(nx,ny))</span>
 
<span id="line185">185.      if(!IS_WALL(typ = (crm = &levl[nx][ny])->typ) && typ != POOL) {</span>
 
<span id="line186">186.  register int i;</span>
 
<span id="line187">187.  for(i = EGD->fcbeg; i < EGD->fcend; i++)</span>
 
<span id="line188">188.  if(EGD->fakecorr[i].fx == nx &&</span>
 
<span id="line189">189.    EGD->fakecorr[i].fy == ny)</span>
 
<span id="line190">190.  goto nextnxy;</span>
 
<span id="line191">191.  if((i = inroom(nx,ny)) >= 0 && rooms[i].rtype == VAULT)</span>
 
<span id="line192">192.  goto nextnxy;</span>
 
<span id="line193">193.  /* seems we found a good place to leave him alone */</span>
 
<span id="line194">194.  EGD->gddone = 1;</span>
 
<span id="line195">195.  if(ACCESSIBLE(typ)) goto newpos;</span>
 
<span id="line196">196.  crm->typ = (typ == SCORR) ? CORR : DOOR;</span>
 
<span id="line197">197.  goto proceed;</span>
 
<span id="line198">198.      }</span>
 
<span id="line199">199.      nextnxy: ;</span>
 
<span id="line200">200.  }</span>
 
<span id="line201">201.  nx = x;</span>
 
<span id="line202">202.  ny = y;</span>
 
<span id="line203">203.  gx = EGD->gdx;</span>
 
<span id="line204">204.  gy = EGD->gdy;</span>
 
<span id="line205">205.  dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;</span>
 
<span id="line206">206.  dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;</span>
 
<span id="line207">207.  if(abs(gx-x) >= abs(gy-y)) nx += dx; else ny += dy;</span>
 
<span id="line208">208.  </span>
 
<span id="line209">209.  while((typ = (crm = &levl[nx][ny])->typ) != 0) {</span>
 
<span id="line210">210.  /* in view of the above we must have IS_WALL(typ) or typ == POOL */</span>
 
<span id="line211">211.  /* must be a wall here */</span>
 
<span id="line212">212.  if(isok(nx+nx-x,ny+ny-y) && typ != POOL &&</span>
 
<span id="line213">213.      ZAP_POS(levl[nx+nx-x][ny+ny-y].typ)){</span>
 
<span id="line214">214.  crm->typ = DOOR;</span>
 
<span id="line215">215.  goto proceed;</span>
 
<span id="line216">216.  }</span>
 
<span id="line217">217.  if(dy && nx != x) {</span>
 
<span id="line218">218.  nx = x; ny = y+dy;</span>
 
<span id="line219">219.  continue;</span>
 
<span id="line220">220.  }</span>
 
<span id="line221">221.  if(dx && ny != y) {</span>
 
<span id="line222">222.  ny = y; nx = x+dx; dy = 0;</span>
 
<span id="line223">223.  continue;</span>
 
<span id="line224">224.  }</span>
 
<span id="line225">225.  /* I don't like this, but ... */</span>
 
<span id="line226">226.  crm->typ = DOOR;</span>
 
<span id="line227">227.  goto proceed;</span>
 
<span id="line228">228.  }</span>
 
<span id="line229">229.  crm->typ = CORR;</span>
 
<span id="line230">230.  proceed:</span>
 
<span id="line231">231.  if(cansee(nx,ny)) {</span>
 
<span id="line232">232.  mnewsym(nx,ny);</span>
 
<span id="line233">233.  prl(nx,ny);</span>
 
<span id="line234">234.  }</span>
 
<span id="line235">235.  fcp = &(EGD->fakecorr[EGD->fcend]);</span>
 
<span id="line236">236.  if(EGD->fcend++ == FCSIZ) panic("fakecorr overflow");</span>
 
<span id="line237">237.  fcp->fx = nx;</span>
 
<span id="line238">238.  fcp->fy = ny;</span>
 
<span id="line239">239.  fcp->ftyp = typ;</span>
 
<span id="line240">240.  newpos:</span>
 
<span id="line241">241.  if(EGD->gddone) nx = ny = 0;</span>
 
<span id="line242">242.  guard->mx = nx;</span>
 
<span id="line243">243.  guard->my = ny;</span>
 
<span id="line244">244.  pmon(guard);</span>
 
<span id="line245">245.  restfakecorr();</span>
 
<span id="line246">246.  return(1);</span>
 
<span id="line247">247.  }</span>
 
<span id="line248">248.  </span>
 
<span id="line249">249.  gddead(){</span>
 
<span id="line250">250.  guard = 0;</span>
 
<span id="line251">251.  }</span>
 
<span id="line252">252.  </span>
 
<span id="line253">253.  replgd(mtmp,mtmp2)</span>
 
<span id="line254">254.  register struct monst *mtmp, *mtmp2;</span>
 
<span id="line255">255.  {</span>
 
<span id="line256">256.  if(mtmp == guard)</span>
 
<span id="line257">257.  guard = mtmp2;</span>
 
<span id="line258">258.  }</span>
 
<span id="line259">259.  </span>
 
<span id="line260">260.  #endif /* QUEST /**/</span>
 
[[Category:NetHack 1.4f source code|vault.c]]
 

Revision as of 20:53, 3 September 2006

The source code file vault.c in NetHack 1.4f is unchanged from NetHack 1.3d/vault.c.