bullet.c bullet.cNHhdB@LLLPTEXTCWIE//#include #include #include #include #include "bullet.h" #include "map.h" #include "sprite.h" #include "global.h" #include "addrs.h" #include "assert.h" typedef struct bulletentry { long x,y; // Position of bullet short dirn; char startdel; u_char sender; // 0 - Player, 1 - Gunner u_char lifespan; struct bulletentry *next; } bullet; static bullet *bullets = NULL; static u_char bouncing = 0; extern u_char screen; void WipeBullets(void) { bullet *temp; while (bullets!=NULL) { temp = bullets; bullets = bullets->next; free(temp); } } void AddBullet(long x, long y, short dirn, u_char sender) { bullet *temp; temp = (bullet*)malloc(sizeof(bullet)); temp->x = x; temp->y = y; temp->dirn = dirn; temp->sender = sender; temp->startdel = 0; temp->lifespan = 192; temp->next = bullets; bullets = temp; } void Bullets(GsOT* OT) { bullet *bulletptr = bullets; bullet *temp, *last = NULL; GsSPRITE bulletspr; long x,y; u_char *scrpos = (u_char*)mapaddr + screen*300; int i; InitSpr(&bulletspr); bulletspr.mx = 1; bulletspr.my = 1; while (bulletptr!=NULL) { if (bulletptr->sender!=1) { // Player's bullet bulletptr->x+=DJsin(bulletptr->dirn)*96; bulletptr->y-=DJcos(bulletptr->dirn)*96; if (Target(bulletptr->x>>16, bulletptr->y>>16)) { GetPlPos(&x, &y); switch(screen) { case 95: if (x>>20!=12 && x>>20!=13) { if (bulletptr->y>>20 > 8) { *(scrpos+(1*20)+13)=44; *(scrpos+(2*20)+13)=44; *(scrpos+(3*20)+13)=44; *(scrpos+(5*20)+13)=14; *(scrpos+(6*20)+13)=14; *(scrpos+(7*20)+13)=14; } else { *(scrpos+(1*20)+13)=14; *(scrpos+(2*20)+13)=14; *(scrpos+(3*20)+13)=14; *(scrpos+(5*20)+13)=44; *(scrpos+(6*20)+13)=44; *(scrpos+(7*20)+13)=44; } } break; case 97: if ((x>>20!=12 && x>>20!=13) || y>>20<4) { for (i=5;i<9;i++) *(scrpos+(i*20)+13)=44; for (i=10;i<14;i++) *(scrpos+(i*20)+13)=14; } break; case 98: for (i=0;i<5;i++) *(scrpos+(i*20)+11)=44; for (i=5;i<10;i++) *(scrpos+(i*20)+11)=14; break; } } bulletptr->y+=DJcos(bulletptr->dirn)*96; if (SolidPix(bulletptr->x>>16, bulletptr->y>>16) && bouncing && bulletptr->sender==0) { // Bounce horizontally bulletptr->x-=DJsin(bulletptr->dirn)*96; if ((bulletptr->dirn=4096-bulletptr->dirn) == 4096) bulletptr->dirn = 0; } bulletptr->y-=DJcos(bulletptr->dirn)*96; if (SolidPix(bulletptr->x>>16, bulletptr->y>>16) && bouncing && bulletptr->sender==0) { // Bounce vertically bulletptr->y+=DJcos(bulletptr->dirn)*96; if ((bulletptr->dirn=2048-bulletptr->dirn) < 0) bulletptr->dirn+=4096; } if (bulletptr->x>>16<0 || bulletptr->x>>16>320 || bulletptr->y>>16<0 || bulletptr->y>>16>240 || SolidPix(bulletptr->x>>16, bulletptr->y>>16) || CheckHitEnemy(bulletptr->x>>16, bulletptr->y>>16) || (bulletptr->lifespan--)==0) { // Remove bullet from list if (last==NULL) { bullets = bulletptr->next; } else last->next = bulletptr->next; temp = bulletptr; bulletptr = bulletptr->next; free(temp); } else { // Plot bullet bulletspr.x = bulletptr->x>>16; bulletspr.y = bulletptr->y>>16; bulletspr.w = 4; bulletspr.h = 8; bulletspr.rotate = bulletptr->dirn*360; CalcSprPos(bulletspr, 640, 272); last = bulletptr; if ((bulletptr->startdel++) > 0) { bulletptr->startdel = 1; GsSortSprite(&bulletspr, OT, 8); } bulletptr = bulletptr->next; } } else { // Goblin gunner's bullet bulletptr->x+=DJsin(bulletptr->dirn)*56; bulletptr->y-=DJcos(bulletptr->dirn)*56; if (bulletptr->x>>16<0 || bulletptr->x>>16>320 || bulletptr->y>>16<0 || bulletptr->y>>16>240 || SolidPix(bulletptr->x>>16, bulletptr->y>>16) || ShotPlayer(bulletptr->x>>16, bulletptr->y>>16)) { // Remove bullet from list if (last==NULL) { bullets = bulletptr->next; } else last->next = bulletptr->next; temp = bulletptr; bulletptr = bulletptr->next; free(temp); } else { // Plot bullet bulletspr.x = bulletptr->x>>16; bulletspr.y = bulletptr->y>>16; bulletspr.w = 4; bulletspr.h = 4; CalcSprPos(bulletspr, 640, 280); last = bulletptr; if ((bulletptr->startdel++) > 2) { bulletptr->startdel = 3; GsSortFastSprite(&bulletspr, OT, 8); } bulletptr = bulletptr->next; } } } } void SetBounce(u_char bounce) { bouncing = bounce; }ZZRNavigator 3.01 %bullet.cior IDE 2.0.3encesallerETEXTCWIE//cache27443.gifNetscape Navigator 3.01 %ˋϳC>H Monaco;6;6 $ $ZZRsx4&RMPSRMWBB*LR