/**********************************************************\ * Bugs : a bit-mapped arcade game for the AT&T UNIX PC. * * * * By : Hans Jespersen * * * \**********************************************************/ #include "bugs.h" movebase( direction ) int direction; { int i; struct position tmpbase; if( direction != STOP ) wrastop(wn,base,4,0,0,0,0,mybase.x,mybase.y,REAL_BASE_WIDTH,BASE_HEIGHT,SRCAND,DSTSRC,patblack); mybase.x += direction * BASEINC; if ( (mybase.x < 0) || (mybase.x + BASE_WIDTH > SCREEN_WIDTH) ) mybase.x -= direction * BASEINC; wrastop(wn,base,4,0,0,0,0,mybase.x,mybase.y,REAL_BASE_WIDTH,BASE_HEIGHT,SRCAND,DSTSRC,patwhite); /* exclude laser canon from collision check */ tmpbase.x = mybase.x; tmpbase.y = mybase.y + 4; for( i = 0; i <= nshots; i++ ) { if( collide( shotlist[i], REAL_SHOT_WIDTH, SHOT_HEIGHT, tmpbase, REAL_BASE_WIDTH, BASE_HEIGHT ) ) { quitflag = TRUE; explode(); } } } movebug(index) int index; { int newbugflag; newbugflag = 1 - bugflag; wrastop(wn,bug[bugflag],4,0,0,0,0,buglist[index].x,buglist[index].y,REAL_BUG_WIDTH,BUG_HEIGHT,SRCAND,DSTSRC,patblack); if( (shelterflag == 0) && (buglist[index].y > SHELTER_LEVEL - BUG_HEIGHT) ) { shelterflag = TRUE; killshelters(); } if( dropflag ) buglist[index].y += DROPINC; else buglist[index].x += MOVEINC * bugdir; if( index <= nbugs ) wrastop(wn,bug[newbugflag],4,0,0,0,0,buglist[index].x,buglist[index].y,REAL_BUG_WIDTH,BUG_HEIGHT,SRCAND,DSTSRC,patwhite); if( buglist[index].y >= BASE_LEVEL - BUG_HEIGHT ) { quitflag = TRUE; } if( index >= nbugs ) { bugflag = newbugflag; if( dropflag ) { dropflag = FALSE; bugdir *= LEFT; } else if( (bugdir == RIGHT ) && (buglist[nbugs].x > SCREEN_WIDTH - BUG_WIDTH - MOVEINC) ) dropflag = TRUE; else if( (bugdir == LEFT) && (buglist[0].x < MOVEINC) ) dropflag = TRUE; bugnum = 0; } else bugnum = index + 1; } moveshot() { if( shotflag ) movemyshot(); if( nshots >= 0 ) movebugshot( shotnum ); } moveufo() { int xpos; int ufoscore; if( ufoflag ) { wrastop(wn,ufo,4,0,0,0,0,ufopos.x,ufopos.y,UFO_WIDTH,UFO_HEIGHT,SRCAND,DSTSRC,patblack); ufopos.x -= UFOINC; if( ufopos.x < 0 ) ufoflag = FALSE; else if( collide( myshot, REAL_SHOT_WIDTH, SHOT_HEIGHT, ufopos, UFO_WIDTH, UFO_HEIGHT ) ) { wrastop(wn,shot,2,0,0,0,0,myshot.x,myshot.y,REAL_SHOT_WIDTH,SHOT_HEIGHT,SRCAND,DSTSRC,patblack); if( beepflag ) beep(); ufoscore = ((rand() % 4) + 1) * 100; score += ufoscore; xpos = (ufopos.x - (ufopos.x % 9)) / 9; wgoto( wn, 0, xpos ); wprintf( wn, "%d", ufoscore ); printscore(); ufoflag = FALSE; shotflag = FALSE; } else wrastop(wn,ufo,4,0,0,0,0,ufopos.x,ufopos.y,UFO_WIDTH,UFO_HEIGHT,SRCAND,DSTSRC,patwhite); } else { if( rand() % UFOCHANCE == 0 ) { ufoflag = TRUE; ufopos.x = SCREEN_WIDTH; ufopos.y = 0; } } }