NetBSD/games/warp/play.c

181 lines
3.6 KiB
C

/* 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)
{
;
}
void
play(void)
{
bool done = false;
OBJECT *curobj;
OBJECT *to;
int i;
int x;
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]) != NULL) {
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);
}