text: /* $Header: play.c,v 7.0.1.1 86/10/16 10:52:39 lwall Exp $ */
  
  /* $Log:	play.c,v $
   * Revision 7.0.1.1  86/10/16  10:52:39  lwall
   * Added Damage.  Fixed random bugs.
   *
   * Revision 7.0  86/10/08  15:13:09  lwall
   * Split into separate files.  Added amoebas and pirates.
   *
   */
  
  #include "EXTERN.h"
  #include "warp.h"
  #include "bang.h"
  #include "score.h"
  #include "object.h"
  #include "move.h"
  #include "term.h"
  #include "them.h"
  #include "us.h"
  #include "util.h"
  #include "weapon.h"
  #include "INTERN.h"
  #include "play.h"
  
  void
  play_init()
  {
      ;
  }
  
  void
  play()
  {
      bool done = FALSE;
      register OBJECT *curobj;
      register OBJECT *to;
      register int i;
      register int x;
      register int y;
  
      display_status();
  #ifdef TIOCOUTQ
      while (output_pending() > charsperhalfsec)
  	sleep(1);			 /* allow buffers to empty */
  #endif
      sleep(3);
      do {
  	timer++;
  	nxtbang = 0;
  	banging = FALSE;
  	display_status();
  #ifdef TIOCOUTQ
  	while (output_pending() > charsperhalfsec)
  	    sleep(1);
  #endif
  	if (lowspeed)
  	    roundsleep(2);
  	else
  	    roundsleep(1);
  	if (ent) {
  	    evely = ent->vely;
  	    evelx = ent->velx;
  	    if (cloaking && ent->energy >= 250 && !damflag[NOCLOAKING]) {
  		if (!rand_mod(300)) {
  		    damage++;
  		    damflag[NOCLOAKING] = rand_mod(smarts+1)+2;
  		}
  		ent->energy -= ent->energy/40;
  	    }
  	    else
  		cloaking = FALSE;
  	    cloaked = cloaking;
  	}
  	if (base) {
  	    bvely = base->vely;
  	    bvelx = base->velx;
  	}
  	get_commands(&done);
  	if (done)
  	    break;
  	their_smarts();
  	apolloflag = 0;
  	if (ent) {
  	    if (numapollos) {
  		if (numstars) {
  		    if (realapollo) {
  			if (lookfor(realapollo->posy,realapollo->posx,
  			    Enterprise)) {
  			    apolloflag = 1;
  			}
  		    }
  		    else if (lookfor(root.next->posy,root.next->posx,
  			Enterprise)) {
  			apolloflag = 1;
  			realapollo = root.next;
  			mvaddch(realapollo->posy+1,realapollo->posx*2,
  			    'A');
  			realapollo->image = 'A';
  			realapollo->mass = 6000;
  			inumapollos = 1;
  			numenemies++;
  			inumenemies++;
  			possiblescore += 5000;
  		    }
  		    if (apolloflag) {
  			if (blast[realapollo->posy][realapollo->posx] <= 32000)
  			    evely = evelx = 0;
  			realapollo->energy = 32000;
  		    }
  		}
  		else
  		    numapollos = 0;
  	    }
  	    ent->vely = evely;
  	    ent->velx = evelx;
  	}
  	if (base) {
  	    if (numapollos) {
  		if (numstars) {
  		    if (realapollo) {
  			if (lookfor(realapollo->posy,realapollo->posx,
  			    Base)) {
  			    apolloflag |= 2;
  			}
  		    }
  		    else if (lookfor(root.next->posy,root.next->posx,
  			Base)) {
  			apolloflag |= 2;
  			realapollo = root.next;
  			mvaddch(realapollo->posy+1,realapollo->posx*2,
  			    'A');
  			realapollo->image = 'A';
  			realapollo->mass = 6000;
  			inumapollos = 1;
  			numenemies++;
  			inumenemies++;
  			possiblescore += 5000;
  		    }
  		    if (apolloflag & 2) {
  			if (blast[realapollo->posy][realapollo->posx] <= 32000)
  			    bvely = bvelx = 0;
  			realapollo->energy = 32000;
  		    }
  		}
  		else
  		    numapollos = 0;
  	    }
  	    base->vely = bvely;
  	    base->velx = bvelx;
  	}
  	if (aretorps) {
  	    aretorps = 0;
  	    for (i=0;i<2;i++) for (y=0;y<3;y++) for (x=0;x<3;x++) {
  		if (curobj = isatorp[i][y][x]) {
  		    to = occupant[(curobj->posy+curobj->vely+YSIZE00)%YSIZE]
  				 [(curobj->posx+curobj->velx+XSIZE00)%XSIZE];
  		    if (to && !to->vely && !to->velx) {
  			unmake_object(curobj);
  			if (i)
  			    btorp++;
  			else
  			    etorp++;
  		    }
  		    isatorp[i][y][x]=0;
  		}
  	    }
  	}
  	move_universe();
  	if (finish) {
  	    finish--;
  	    if (!finish && (!(numenemies || numos) || (!ent && !base))) {
  		done = TRUE;
  		timer -= 5;
  	    }
  	}
  	else if (!banging && (!(numenemies || numos) || (!ent && !base)))
  	    finish = 5;
      } while (!done);
  }
  