/**********************************************************\ * Rocks : a bit-mapped arcade game for the AT&T UNIX PC. * * * * By : Hans Jespersen * * * \**********************************************************/ #include "rocks.h" movedebris() { int i; for( i = 0; i < 3; i++){ /* * move debris */ debrislist[i].x += debrislist[i].xdelta; debrislist[i].y += debrislist[i].ydelta; /* * check for wrap around */ if ( debrislist[i].x > SCREEN_WIDTH - SHIP_WIDTH ) debrislist[i].x = 0; else if ( debrislist[i].x < 0 ) debrislist[i].x = SCREEN_WIDTH - SHIP_WIDTH; if ( debrislist[i].y > SCREEN_HEIGHT - SHIP_HEIGHT ) debrislist[i].y = 0; else if ( debrislist[i].y < 0 ) debrislist[i].y = SCREEN_HEIGHT - SHIP_HEIGHT; /* * place debris in new position */ wrastop(wn,debris[i],2,screen,WIDTH,0,0,debrislist[i].x,debrislist[i].y,SHIP_WIDTH,SHIP_HEIGHT,SRCSRC,DSTOR,0); } } moveship() { /* * move ship */ myship.x += myship.xdelta; myship.y += myship.ydelta; /* * check for wrap around */ if ( myship.x > SCREEN_WIDTH - SHIP_WIDTH ) myship.x = 0; else if ( myship.x < 0 ) myship.x = SCREEN_WIDTH - SHIP_WIDTH; if ( myship.y > SCREEN_HEIGHT - SHIP_HEIGHT ) myship.y = 0; else if ( myship.y < 0 ) myship.y = SCREEN_HEIGHT - SHIP_HEIGHT; /* * place ship in new position */ wrastop(wn,ship[direction],2,screen,WIDTH,0,0,myship.x,myship.y,SHIP_WIDTH,SHIP_HEIGHT,SRCSRC,DSTOR,0); } moverocks() { int i; /* * erase screen bitmap */ wrastop(wn,0,0,screen,WIDTH,0,0,0,0,SCREEN_WIDTH,SCREEN_HEIGHT+LARGE_ROCK_HEIGHT,SRCPAT,DSTSRC,0); /* * move each rock one at a time */ for ( i = 0; i < nrocks; i++ ){ /* move rock to new location */ rocklist[i].x += rocklist[i].xdelta; rocklist[i].y += rocklist[i].ydelta; /* check for wrap around */ if ( rocklist[i].x > SCREEN_WIDTH ) rocklist[i].x = 0; else if ( rocklist[i].x < 0 ) rocklist[i].x = SCREEN_WIDTH; if ( rocklist[i].y > SCREEN_HEIGHT ) rocklist[i].y = 0; else if ( rocklist[i].y < 0 ) rocklist[i].y = SCREEN_HEIGHT; /* put rock in new location */ wrastop(wn,rock[rocklist[i].size],8,screen,WIDTH,0,0,rocklist[i].x,rocklist[i].y,rockwidth[ rocklist[i].size ],rockheight[ rocklist[i].size ],SRCSRC,DSTOR,0); } } moveshots() { int i,j,splitflag = FALSE; /* * move shots one at a time */ for ( i = 0; i <= nshots; i++ ){ /* move shot */ shotlist[i].x += shotlist[i].xdelta; shotlist[i].y += shotlist[i].ydelta; /* wrap around */ if ( shotlist[i].x >= SCREEN_WIDTH ) shotlist[i].x = 0; else if ( shotlist[i].x < 0 ) shotlist[i].x = SCREEN_WIDTH - 1; if ( shotlist[i].y >= SCREEN_HEIGHT ) shotlist[i].y = 0; else if ( shotlist[i].y < 0 ) shotlist[i].y = SCREEN_HEIGHT - 1; /* print new shot */ point(shotlist[i].x, shotlist[i].y); /* check for collisions between each rock and each shot */ for ( j = 0; (j <= nrocks) && (splitflag == FALSE); j++ ){ if( collide( shotlist[i], 1, 1, rocklist[j], rockwidth[rocklist[j].size], rockheight[rocklist[j].size ]) ){ /* erase shot */ point(shotlist[i].x, shotlist[i].y); /* remove shot from shotlist */ removeshot( i ); /* update score */ score += (3 - rocklist[j].size ) * 100; printscore(); /* split rock into smaller units */ split_rock( j ); splitflag = TRUE; } } /* reduce range of shot by one */ shotlist[i].size -= 1; /* if shot has worn out erase it */ if ( shotlist[i].size == 0 ){ point(shotlist[i].x, shotlist[i].y); removeshot( i ); } } } split_rock( index ) int index; { int i; wrastop(wn,rock[rocklist[index].size],8,screen,WIDTH,0,0,rocklist[index].x,rocklist[index].y,rockwidth[ rocklist[index].size ], rockheight[ rocklist[index].size ],SRCSRC,DSTCAM,0); if ( rocklist[index].size != SMALL ){ for ( i = 0; i < 2; i++ ){ rocklist[nrocks+i].x = rocklist[ index ].x + ( rockwidth[ rocklist[ index ].size ] / 2 ); rocklist[nrocks+i].y = rocklist[ index ].y + ( rockheight[ rocklist[ index ].size ] / 2 ); rocklist[nrocks+i].xdelta = randdir() * ((rand()%4)+(3-rocklist[nrocks+i].size)); rocklist[nrocks+i].ydelta = randdir() * ((rand()%4)+(3-rocklist[nrocks+i].size)); rocklist[nrocks+i].size = rocklist[ index ].size - 1; } nrocks += 2; } removerock( index ); if( nrocks == 0 ) quitflag = TRUE; } removerock( index ) int index; { int i; for( i = index; i < nrocks; i++ ) rocklist[ i ] = rocklist[ i + 1 ]; nrocks -= 1; } removeshot( index ) int index; { int i; for( i = index; i < nshots; i++ ) shotlist[ i ] = shotlist[ i + 1 ]; nshots -= 1; } printscreen() { wrastop(wn,screen,WIDTH,screen,WIDTH,0,SCREEN_HEIGHT,0,0,SCREEN_WIDTH,LARGE_ROCK_HEIGHT,SRCSRC,DSTOR,0); wrastop(wn,screen,WIDTH,0,0,0,0,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,SRCSRC,DSTSRC,0); } clearscreen() { wrastop(wn,screen,WIDTH,screen,WIDTH,0,0,0,0,SCREEN_WIDTH,SPACE_HEIGHT,SRCSRC,DSTCAM,0); } thrust() { switch ( direction ) { case 0: myship.ydelta -= 1; break; case 1: myship.xdelta += 1; myship.ydelta -= 1; break; case 2: myship.xdelta += 1; break; case 3: myship.xdelta += 1; myship.ydelta += 1; break; case 4: myship.ydelta += 1; break; case 5: myship.xdelta -= 1; myship.ydelta += 1; break; case 6: myship.xdelta -= 1; break; case 7: myship.xdelta -= 1; myship.ydelta -= 1; break; } if( myship.xdelta > MAXTHRUST ) myship.xdelta = MAXTHRUST; else if( myship.xdelta < (-1 * MAXTHRUST ) ) myship.xdelta = -1 * MAXTHRUST; if( myship.ydelta > MAXTHRUST ) myship.ydelta = MAXTHRUST; else if( myship.ydelta < (-1 * MAXTHRUST ) ) myship.ydelta = -1 * MAXTHRUST; } hyperspace() { myship.x = rand() % SCREEN_WIDTH; myship.y = rand() % SCREEN_HEIGHT; myship.xdelta = 0; myship.ydelta = 0; }