home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / TIERRA40.ZIP / TIERRA / QUEUES.C < prev    next >
C/C++ Source or Header  |  1992-09-09  |  7KB  |  187 lines

  1. /* queues.c   9-9-92  Tierra Simulator */
  2. /* Tierra Simulator V4.0: Copyright (c) 1991, 1992 Tom Ray & Virtual Life */
  3.  
  4. #ifndef lint
  5. static char     sccsid[] = "@(#)queues.c    1.5     7/21/92";
  6. #endif
  7.  
  8. #include "license.h"
  9. #include "tierra.h"
  10. #include "extern.h"
  11.  
  12. #ifdef MEM_CHK
  13. #include <memcheck.h>
  14. #endif
  15.  
  16. void IncrSliceQueue() /* increment slicer queue */
  17. {   ThisSlice = &cells[ThisSlice->q.n_time.a][ThisSlice->q.n_time.i];
  18.     while(!ThisSlice->ld) /* get dead cells out of queue */
  19.         RmvFrmSlicer(ThisSlice);
  20. }
  21.  
  22. void EntBotSlicer(ce)
  23. Pcells  ce; /* new cell being added to bottom of slicer queue */
  24. {   Pcells  tc; /* ThisSlice cell */
  25.     Pcells  pc; /* previous slice cell */
  26.  
  27.     tc = ThisSlice; pc = &cells[tc->q.p_time.a][tc->q.p_time.i];
  28. #ifdef ERROR
  29.     if((ce->q.n_time.a != ce->q.p_time.a || ce->q.n_time.i != ce->q.p_time.i)
  30.         && NumCells > 1)
  31.     {   FEError(-800,EXIT,WRITE,
  32.             "Tierra EntBotSlicer() error: cell already in slicer queue");
  33.     }
  34. #endif
  35.     pc->q.n_time = ce->q.this; /* previous slice points to ce */
  36.     ce->q.p_time = tc->q.p_time; /* ce points back at previous slice */
  37.     ce->q.n_time = ThisSlice->q.this; /* ce points to this slice */
  38.     tc->q.p_time = ce->q.this; /* this slice points back at ce */
  39. }
  40.  
  41. void UpReaper(ce) /* move cell up the reaper queue */
  42. Pcells  ce; /* ce is cell to be moved up in reaper */
  43. {   Pcells  pe2, pe, ne;
  44.  
  45.     if(ce == TopReap) return;
  46. #ifdef ERROR
  47.     if(ce->q.n_reap.a == ce->q.p_reap.a && ce->q.n_reap.i == ce->q.p_reap.i
  48.         && NumCells > 1)
  49.     {   FEError(-801,EXIT,WRITE,
  50.         "Tierra UpReaper() error: cell not in reaper queue");
  51.     }
  52. #endif
  53.     ne = &cells[ce->q.n_reap.a][ce->q.n_reap.i];/*ne is next cell in reaper */
  54.     pe = &cells[ce->q.p_reap.a][ce->q.p_reap.i];
  55.         /* pe is previous cell in reaper */
  56.     pe2 = &cells[pe->q.p_reap.a][pe->q.p_reap.i];
  57.         /* pe2 is 2nd previous cell in reaper */
  58.     ne->q.p_reap = pe->q.this;  /* ne points back to pe */
  59.     ce->q.p_reap = pe2->q.this; /* ce points back to pe2 */
  60.     ce->q.n_reap = pe->q.this;  /* ce points ahead to pe */
  61.     pe->q.p_reap = ce->q.this;  /* pe points back to ce */
  62.     pe->q.n_reap = ne->q.this;  /* pe points ahead to ne */
  63.     pe2->q.n_reap = ce->q.this; /* pe2 points ahead to ce */
  64.     if(ce == BottomReap)
  65.         BottomReap = pe;
  66.     if(pe == TopReap)
  67.         TopReap = ce;
  68. }
  69.  
  70. void DownReaper(ce)
  71. Pcells  ce; /* ce is cell to be moved down in reaper */
  72. {   Pcells  pe, ne, ne2;
  73.  
  74.     if(ce == BottomReap) return;
  75. #ifdef ERROR
  76.     if(ce->q.n_reap.a == ce->q.p_reap.a && ce->q.n_reap.i == ce->q.p_reap.i
  77.         && NumCells > 1)
  78.     {   FEError(-802,EXIT,WRITE,
  79.         "Tierra DownReaper() error: cell not in reaper queue");
  80.     }
  81. #endif
  82.     ne = &cells[ce->q.n_reap.a][ce->q.n_reap.i];/*ne is next cell in reaper */
  83.     ne2 = &cells[ne->q.n_reap.a][ne->q.n_reap.i];
  84.         /* ne2 is 2nd next cell in reaper */
  85.     pe = &cells[ce->q.p_reap.a][ce->q.p_reap.i];
  86.         /* pe is previous cell in reaper */
  87.     pe->q.n_reap = ne->q.this;  /* pe points ahead to ne */
  88.     ce->q.n_reap = ne2->q.this; /* ce points ahead to ne2 */
  89.     ce->q.p_reap = ne->q.this;  /* ce points back to ne */
  90.     ne->q.n_reap = ce->q.this;  /* ne points ahead to ce */
  91.     ne->q.p_reap = pe->q.this;  /* ne points back to pe */
  92.     ne2->q.p_reap = ce->q.this; /* ne2 points back to ce */
  93.     if(ce == TopReap)
  94.         TopReap = ne;
  95.     if(ne == BottomReap)
  96.         BottomReap = ce;
  97. }
  98.  
  99. void UpRprIf(ce)
  100. Pcells  ce;
  101. {   if(ce->d.flags >= cells[ce->q.p_reap.a][ce->q.p_reap.i].d.flags)
  102.         UpReaper(ce);
  103. }
  104.  
  105. void DownReperIf(ce)
  106. Pcells  ce;
  107. {   if(ce->d.flags <= cells[ce->q.n_reap.a][ce->q.n_reap.i].d.flags)
  108.         DownReaper(ce);
  109. }
  110.  
  111. void EntBotReaper(ce)
  112. Pcells  ce; /* cell to be added to the bottom of reaper queue */
  113. {   Pcells  be = BottomReap; /* cell presently at bottom of reaper queue */
  114.  
  115. #ifdef ERROR
  116.     if((ce->q.n_reap.a != ce->q.p_reap.a || ce->q.n_reap.i != ce->q.p_reap.i)
  117.         && NumCells > 1)
  118.     {   FEError(-803,EXIT,WRITE,
  119.             "Tierra EntBotReaper() error: cell already in reaper queue");
  120.     }
  121. #endif
  122.     ce->q.p_reap = BottomReap->q.this;
  123.         /* new cell points back to old BottomReap */
  124.     ce->q.n_reap = BottomDummy->q.this;
  125.         /* new cell points ahead to dummy bottom */
  126.     be->q.n_reap = ce->q.this;/* old BottomReap cell now points ahead to ce */
  127.     BottomDummy->q.p_reap = ce->q.this;
  128.     BottomReap = ce; /* BottomReap is now ce */
  129. }
  130.  
  131. void RmvFrmReaper(ce)
  132. Pcells  ce; /* cell to be removed from reaper queue */
  133. {   Pcells  nc; /* next cell in reaper queue */
  134.     Pcells  pc; /* previous cell in reaper queue */
  135.  
  136.     nc = &cells[ce->q.n_reap.a][ce->q.n_reap.i];
  137.     pc = &cells[ce->q.p_reap.a][ce->q.p_reap.i];
  138. #ifdef ERROR
  139.     if(ce->q.n_reap.a == ce->q.p_reap.a && ce->q.n_reap.i == ce->q.p_reap.i
  140.         && NumCells > 1)
  141.     {   FEError(-804,EXIT,WRITE,
  142.             "Tierra RmvFrmReaper() error: cell not in reaper queue");
  143.     }
  144. #endif
  145.     if(ce == TopReap) /* TopReap changed to next cell in queue */
  146.         TopReap = &cells[ce->q.n_reap.a][ce->q.n_reap.i];
  147.     if(ce == BottomReap) /* BottomReap changed to previous cell in queue */
  148.         BottomReap = &cells[ce->q.p_reap.a][ce->q.p_reap.i];
  149.         /* previous cell points ahead to next cell: */
  150.     pc->q.n_reap = ce->q.n_reap;
  151.         /* next cell points back to previous cell: */
  152.     nc->q.p_reap = ce->q.p_reap;
  153.     ce->q.p_reap = ce->q.n_reap = ce->q.this;
  154.         /* initialize reap queue this cell */
  155. #ifdef ERROR
  156.     if((ce->q.n_time.a != ce->q.p_time.a || ce->q.n_time.i != ce->q.p_time.i)
  157.         && NumCells > 1)
  158.     {   FEError(-805,EXIT,WRITE,
  159.             "Tierra RmvFrmReaper() error: cell still in slicer queue");
  160.     }
  161. #endif
  162. }
  163.  
  164. void RmvFrmSlicer(ce)
  165. Pcells  ce; /* cell to be removed from slicer queue */
  166. {   Pcells  nc; /* next cell in slicer queue */
  167.     Pcells  pc; /* previous cell in slicer queue */
  168.  
  169.     nc = &cells[ce->q.n_time.a][ce->q.n_time.i];
  170.     pc = &cells[ce->q.p_time.a][ce->q.p_time.i];
  171. #ifdef ERROR
  172.     if(ce->q.n_time.a == ce->q.p_time.a && ce->q.n_time.i == ce->q.p_time.i
  173.         && NumCells > 1)
  174.     {   FEError(-806,EXIT,WRITE,
  175.             "Tierra RmvFrmSlicer() error: cell not in slicer queue");
  176.     }
  177. #endif
  178.         /* previous cell points ahead to next cell: */
  179.     pc->q.n_time = ce->q.n_time;
  180.         /* next cell points back to previous cell: */
  181.     nc->q.p_time = ce->q.p_time;
  182.     if(ce == ThisSlice)
  183.         ThisSlice = &cells[ce->q.n_time.a][ce->q.n_time.i];
  184.     ce->q.n_time = ce->q.p_time = ce->q.this;
  185.          /* initialize slice queue this cell */
  186. }
  187.