home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / TOP / USR / SRC / wanderer2.t.Z / wanderer2.t / fall.c < prev    next >
C/C++ Source or Header  |  1988-11-29  |  7KB  |  295 lines

  1. #include "wand_head.h"
  2.  
  3. extern void draw_symbol();
  4. extern int debug_disp;
  5. extern char screen[NOOFROWS][ROWLEN+1];
  6.  
  7. int check(mx,my,x,y,dx,dy,sx,sy,howdead)
  8. /* check for any falling caused by something moving out of x,y along
  9.    vector dx,dy. All the others are constant and should really have
  10.    been global...                             */
  11. int x,y,sx,sy,dx,dy, *mx, *my;
  12. char howdead[25];
  13. {
  14. int ret=0;
  15. ret+=fall(mx,my,x,y,sx,sy,howdead);
  16. ret+=fall(mx,my,x-dx,y-dy,sx,sy,howdead);
  17. ret+=fall(mx,my,x-dy,y-dx,sx,sy,howdead);
  18. ret+=fall(mx,my,x+dy,y+dx,sx,sy,howdead);
  19. ret+=fall(mx,my,x-dx-dy,y-dy-dx,sx,sy,howdead);
  20. ret+=fall(mx,my,x-dx+dy,y-dy+dx,sx,sy,howdead);
  21. return ret;
  22. }
  23.  
  24. int fall(mx,my,x,y,sx,sy,howdead)  /* recursive function for falling */
  25.                    /* boulders and arrows */
  26. int  x,y,sx,sy, *mx, *my;
  27. char howdead[25];
  28. {
  29. int nx = x,nxu = x,nyl = y,nyr = y,retval = 0;
  30. int firstrow = 0, firstcol = 0, lastrow = 0, lastcol = 0;
  31.  
  32. if ((y>(NOOFROWS-1))||(y<0)||(x<0)||(x>(ROWLEN-1)))
  33.     return(0);
  34. if((screen[y][x] != 'O') && (screen[y][x] != ' ') && (screen[y][x] != 'M') &&
  35.    (screen[y][x] !='\\') && (screen[y][x] != '/') && (screen[y][x] != '@') &&
  36.    (screen[y][x] != '^'))
  37.     return(0);
  38.  
  39. firstrow = (y == 0);    lastrow = (y == NOOFROWS-1);
  40. firstcol = (x == 0);    lastcol = (x == ROWLEN - 1);
  41.  
  42. if(screen[y][x] == 'O')
  43.     {
  44.     int blankright = 0, blankleft = 0, blankabove = 0, blankbelow = 0,
  45.     blankupright = 0, blankupleft = 0, blankdnright = 0, blankdnleft = 0;
  46.     /* blanks above? */
  47.     if (!firstrow)
  48.         {
  49.     if (!firstcol)    blankupleft  = (screen[y-1][x-1] == ' ');
  50.             blankabove   = (screen[y-1][x] == ' ');
  51.     if (!lastcol)    blankupright = (screen[y-1][x+1] == ' ');
  52.         }
  53.     /* blanks left and right? */
  54.     if (!firstcol)    blankleft    = (screen[y][x-1] == ' ');
  55.     if (!lastcol)    blankright   = (screen[y][x+1] == ' ');
  56.     /* blanks below? */
  57.     if (!lastrow)
  58.     {
  59.     if (!firstcol)    blankdnleft  = (screen[y+1][x-1] == ' ');
  60.             blankbelow   = (screen[y+1][x] == ' ');
  61.     if (!lastcol)    blankdnright = (screen[y+1][x+1] == ' ');
  62.         }
  63.     if(blankleft && blankupleft)
  64.         nx--;
  65.     else
  66.     {
  67.     if(blankright && blankupright)
  68.             nx++;
  69.     else
  70.         nx = -1;
  71.     }
  72.     if(blankleft && blankdnleft)
  73.         nxu--;
  74.     else
  75.     {
  76.     if(blankright && blankdnright)
  77.             nxu++;
  78.     else
  79.         nxu = -1;
  80.     }
  81.     if(blankabove && blankupright)
  82.         nyr--;
  83.     else
  84.     {
  85.     if(blankbelow && blankdnright)
  86.             nyr++;
  87.     else
  88.         nyr = -1;
  89.     }
  90.     if (blankabove && blankupleft)
  91.         nyl--;
  92.     else
  93.     {
  94.     if(blankbelow && blankdnleft)
  95.             nyl++;
  96.     else
  97.         nyl = -1;
  98.     }
  99.     }
  100. if(screen[y][x] == '\\')
  101.     {
  102.     if(nx != -1
  103.     && (firstrow || nx == (ROWLEN-1) || screen[y-1][++nx] != ' '))
  104.     nx = -1;
  105.     if(nxu != -1
  106.     && (lastrow || nxu == 0 || screen[y+1][--nxu] != ' '))
  107.         nxu = -1;
  108.     if(nyr != -1
  109.     && (lastcol || nyr == 0 || screen[--nyr][x+1] != ' '))
  110.     nyr = -1;
  111.     if(nyl != -1
  112.     && (firstcol || nyl == (NOOFROWS-1) || screen[++nyl][x-1] != ' '))
  113.         nyl = -1;
  114.     }
  115. if(screen[y][x] == '/')
  116.     {
  117.     if(nx != -1
  118.     && (firstrow || nx == 0 || screen[y-1][--nx] != ' '))
  119.     nx = -1;
  120.     if(nxu != -1
  121.     && (lastrow || nxu == (ROWLEN-1) || screen[y+1][++nxu] != ' '))
  122.         nxu = -1;
  123.     if(nyr != -1
  124.     && (lastcol || nyr == (NOOFROWS-1) || screen[++nyr][x+1] != ' '))
  125.     nyr = -1;
  126.     if(nyl != -1
  127.     && (firstcol || nyl == 0 || screen[--nyl][x-1] != ' '))
  128.     nyl = -1;
  129.     }
  130. if(nx != -1 && (screen[y][nx] != ' ') && (screen[y][nx] != 'M'))
  131.     nx = -1;
  132. if((y > 0) && (screen[y-1][x] == 'O') && (nx >= 0) &&
  133.    (screen[y][nx] != '^')) /* boulder falls ? */
  134.     {
  135.     screen[y-1][x] = ' ';
  136.     if(screen[y][nx] == '@')
  137.         {
  138.         strcpy(howdead,"a falling boulder");
  139.         retval=1;
  140.         }
  141.     if(screen[y][nx] == 'M')
  142.         {
  143.         *mx = *my = -2;
  144.     screen[y][nx] = ' ';
  145.         }
  146.     screen[y][nx] = 'O';
  147.     if(!debug_disp)
  148.     {
  149.         if((y<(sy+5)) && (y>(sy-3)) && (x>(sx-6)) && (x<(sx+6)))
  150.             draw_symbol((x-sx+5)*3,(y-sy+2)*2,' ');
  151.         if((y<(sy+4)) && (y>(sy-4)) && (nx>(sx-6)) && (nx<(sx+6)))
  152.             draw_symbol((nx-sx+5)*3,(y-sy+3)*2,'O');
  153.     }
  154.     else
  155.     {
  156.     move(y,x+1);
  157.     addch(' ');;
  158.     move(y+1,nx+1);
  159.     addch('O');
  160.     }
  161.     refresh();
  162.     retval+=fall(mx,my,nx ,y+1,sx,sy,howdead);
  163.     retval+=check(mx,my,x,y-1,0,1,sx,sy,howdead);
  164.     if(y < NOOFROWS-1 && screen[y+1][nx] == '@')
  165.         {
  166.         strcpy(howdead,"a falling boulder");
  167.         return(1);
  168.         }
  169.     if(y < NOOFROWS-1 && screen[y+1][nx] == 'M')
  170.         {
  171.         *mx = *my = -2;
  172.     screen[y+1][nx] = ' ';
  173.         }
  174.     }
  175. if(nyr != -1
  176. && (screen[nyr][x] != '^')&&(screen[nyr][x] != ' ')&&(screen[nyr][x] != 'M'))
  177.     nyr = -1;
  178. if(x+1<ROWLEN && screen[y][x+1] == '<' && nyr >= 0) /* arrow moves ( < ) ? */
  179.     {
  180.     screen[y][x+1] = ' ';
  181.     if(screen[nyr][x] == '@')
  182.         {
  183.         strcpy(howdead,"a speeding arrow");
  184.         retval = 1;
  185.         }
  186.     if(screen[nyr][x] == 'M')
  187.         {
  188.         *mx = *my = -2;
  189.     screen[nyr][x] = ' ';
  190.         }
  191.     screen[nyr][x] = '<';
  192.     if(!debug_disp)
  193.     {
  194.         if((y<(sy+4)) && (y>(sy-4)) && (x<(sx+5)) && (x>(sx-7)))
  195.             draw_symbol((x-sx+6)*3,(y-sy+3)*2,' ');
  196.         if((nyr<(sy+4)) && (nyr>(sy-4)) && (x<(sx+6)) && (x>(sx-6)))
  197.             draw_symbol((x-sx+5)*3,(nyr-sy+3)*2,'<');
  198.     }
  199.     else
  200.     {
  201.     move(y+1,x+2);
  202.     addch(' ');
  203.     move(nyr+1,x+1);
  204.     addch('<');
  205.     }
  206.     refresh();
  207.     retval+=fall(mx,my,x-1,nyr,sx,sy,howdead);
  208.     retval+=check(mx,my,x+1,y,-1,0,sx,sy,howdead);
  209.     if(x != 0 && screen[nyr][x-1] == '@')
  210.         {
  211.         strcpy(howdead,"a speeding arrow");
  212.         return(1);
  213.         }
  214.     if(x != 0 && screen[nyr][x-1] == 'M')
  215.         {
  216.         *mx = *my = -2;
  217.     screen[nyr][x-1] = ' ';
  218.         }
  219.     }
  220. if(nyl != -1
  221. && (screen[nyl][x] != ' ')&&(screen[nyl][x] != '^')&&(screen[nyl][x] != 'M'))
  222.     nyl = -1;
  223. if(x>0 && (screen[y][x-1] == '>') && nyl>=0)       /* arrow moves ( > ) ? */
  224.     {
  225.     screen[y][x-1] = ' ';
  226.     if(screen[nyl][x] == '@')
  227.         {
  228.         strcpy(howdead,"a speeding arrow");
  229.         retval = 1;
  230.         }
  231.     if(screen[nyl][x] == 'M')
  232.         {
  233.         *mx = *my = -2;
  234.     screen[nyl][x] = ' ';
  235.         }
  236.     screen[nyl][x] = '>';
  237.     if(!debug_disp)
  238.     {
  239.         if((y<(sy+4)) && (y>(sy-4)) && (x<(sx+7)) && (x>(sx-5)))
  240.             draw_symbol((x-sx+4)*3,(y-sy+3)*2,' ');
  241.         if((nyl<(sy+4)) && (nyl>(sy-4)) && (x<(sx+6)) && (x>(sx-6)))
  242.             draw_symbol((x-sx+5)*3,(nyl-sy+3)*2,'>');
  243.     }
  244.     else
  245.     {
  246.     move(y+1,x);
  247.     addch(' ');
  248.     move(nyl+1,x+1);
  249.     addch('>');
  250.     }
  251.     refresh();
  252.     retval+=fall(mx,my,x+1,nyl,sx,sy,howdead);
  253.     retval+=check(mx,my,x-1,y,1,0,sx,sy,howdead);
  254.     if(!lastcol && screen[nyl][x+1] == '@')
  255.         {
  256.         strcpy(howdead,"a speeding arrow");
  257.         return(1);
  258.         }
  259.     if(!lastcol && screen[nyl][x+1] == 'M')
  260.         {
  261.         *mx = *my = -2;
  262.     screen[nyl][x+1] = ' ';
  263.         }
  264.     }
  265. if(nxu != -1 && screen[y][nxu] != ' ')
  266.     nxu = -1;
  267. if(y < NOOFROWS-1 && (screen[y+1][x] == '^') && (nxu >= 0) &&
  268.    (screen[y][x] != '^')) /* balloon rises? */
  269.     {
  270.     screen[y+1][x] = ' ';
  271.     screen[y][nxu] = '^';
  272.     if(!debug_disp)
  273.     {
  274.         if((y<(sy+3)) && (y>(sy-5)) && (x>(sx-6)) && (x<(sx+6)))
  275.             draw_symbol((x-sx+5)*3,(y-sy+4)*2,' ');
  276.         if((y<(sy+4)) && (y>(sy-4)) && (nxu>(sx-6)) && (nxu<(sx+6)))
  277.             draw_symbol((nxu-sx+5)*3,(y-sy+3)*2,'^');
  278.     }
  279.     else
  280.     {
  281.     move(y+2,x+1);
  282.     addch(' ');
  283.     move(y+1,nxu+1);
  284.     addch('^');
  285.     }
  286.     refresh();
  287.     retval+=fall(mx,my,nxu ,y-1,sx,sy,howdead);
  288.     retval+=check(mx,my,x,y+1,0,-1,sx,sy,howdead);
  289.     }
  290. if(retval>0)
  291.     return(1);
  292. return(0);
  293. }
  294.  
  295.