//* firing.c - Bullet firing functions for the different weapons //* System library headers #include #include //debug //* Application headers #include "main.h" #include "procs.h" #include "preset.h" //*------------------------------------------------------------------------------------------ //* NormalFire //*------------------------------------------------------------------------------------- void NormalFire(void) { register struct SCTRL *bp; register struct SCTRL *gsp; bp = GetSprite(3); //* Bullet + 2 blur sprites gsp = GetSprite(1); //* Flash/gun smoke sprite //* Actual bullet sprite PresetSprite(bp, PRESET_NORMAL_BULLET); //* First motion-blur bullet PresetSprite(bp->freeLink, PRESET_NORMAL_BULLET_BLUR1); //* Second motion-blur bullet PresetSprite(bp->freeLink->freeLink, PRESET_NORMAL_BULLET_BLUR2); //* Gun smoke sprite PresetSprite(gsp, PRESET_GUNSMOKE); //* Consider Blitter Boy's direction for firing //* Direction is needed for handle_sprite_over_wall & handle_gunflash_over_wall switch (gsp->dir = sCtrl->dir) { case DIR_DOWN: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = 0; bp->dir = DIR_DOWN; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = -1; bp->dir = DIR_DOWN_LEFT; } else { //* Fire bullet to BB's left bp->accelX = 1; bp->dir = DIR_DOWN_RIGHT; } bp->accelY = bullSpeed; bp->wx = sCtrl->wx + 12; bp->wy = sCtrl->wy + 6; gsp->wx = sCtrl->wx + 8; //* Gun smoke service sprite gsp->wy = sCtrl->wy + 8; break; case DIR_DOWN_LEFT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = -bullSpeed; bp->accelY = bullSpeed; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = -(bullSpeed+1); bp->accelY = bullSpeed-1; } else { //* Fire bullet to BB's left bp->accelX = -(bullSpeed-1); bp->accelY = bullSpeed+1; } bp->dir = DIR_DOWN_LEFT; bp->wx = sCtrl->wx + 3; bp->wy = sCtrl->wy + 5; gsp->wx = sCtrl->wx - 1; //* Gun smoke service sprite gsp->wy = sCtrl->wy + 7; break; case DIR_LEFT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelY = 0; bp->dir = DIR_LEFT; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelY = -1; bp->dir = DIR_UP_LEFT; } else { //* Fire bullet to BB's left bp->accelY = 1; bp->dir = DIR_DOWN_LEFT; } bp->accelX = -bullSpeed; bp->wx = sCtrl->wx - 6; bp->wy = sCtrl->wy - 3; gsp->wx = sCtrl->wx - 10; //* Gun smoke service sprite gsp->wy = sCtrl->wy - 1; break; case DIR_UP_LEFT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = -bullSpeed; bp->accelY = -bullSpeed; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = -(bullSpeed-1); bp->accelY = -(bullSpeed+1); } else { //* Fire bullet to BB's left bp->accelX = -(bullSpeed+1); bp->accelY = -(bullSpeed-1); } bp->dir = DIR_UP_LEFT; bp->wx = sCtrl->wx - 1; bp->wy = sCtrl->wy - 12; gsp->wx = sCtrl->wx - 4; //* Gun smoke service sprite gsp->wy = sCtrl->wy - 11; break; case DIR_UP: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = 0; bp->dir = DIR_UP; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = 1; bp->dir = DIR_UP_RIGHT; } else { //* Fire bullet to BB's left bp->accelX = -1; bp->dir = DIR_UP_LEFT; } bp->accelY = -bullSpeed; bp->wx = sCtrl->wx + 12; bp->wy = sCtrl->wy - 17; gsp->wx = sCtrl->wx + 8; //* Gun smoke service sprite gsp->wy = sCtrl->wy - 15; break; case DIR_UP_RIGHT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = bullSpeed; bp->accelY = -bullSpeed; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = bullSpeed+1; bp->accelY = -(bullSpeed-1); } else { //* Fire bullet to BB's left bp->accelX = bullSpeed-1; bp->accelY = -(bullSpeed+1); } bp->dir = DIR_UP_RIGHT; bp->wx = sCtrl->wx + 24; bp->wy = sCtrl->wy - 12; gsp->wx = sCtrl->wx + 20; //* Gun smoke service sprite gsp->wy = sCtrl->wy - 11; break; case DIR_RIGHT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelY = 0; bp->dir = DIR_RIGHT; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelY = 1; bp->dir = DIR_DOWN_RIGHT; } else { //* Fire bullet to BB's left bp->accelY = -1; bp->dir = DIR_UP_RIGHT; } bp->accelX = bullSpeed; bp->wx = sCtrl->wx + 29; bp->wy = sCtrl->wy - 3; gsp->wx = sCtrl->wx + 26; //* Gun smoke service sprite gsp->wy = sCtrl->wy - 1; break; case DIR_DOWN_RIGHT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = bullSpeed; bp->accelY = bullSpeed; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = bullSpeed-1; bp->accelY = bullSpeed+1; } else { //* Fire bullet to BB's left bp->accelX = bullSpeed+1; bp->accelY = bullSpeed-1; } bp->dir = DIR_DOWN_RIGHT; bp->wx = sCtrl->wx + 20; bp->wy = sCtrl->wy + 5; gsp->wx = sCtrl->wx + 17; //* Gun smoke service sprite gsp->wy = sCtrl->wy + 7; break; } //* Find initial central x,y world coords bp->wxMid = bp->wx + bp->bbXOff + (bp->bbW >> 1); bp->wyMid = bp->wy - bp->bbYOff + (bp->bbH >> 1); //* Set off-ground height for new bullet & gun smoke sprites bp->high = sCtrl->high + 7; gsp->high = sCtrl->high + 4; //* Add new bullet & gun smoke sprites to aliveSprites linked list AliveLinkIn(bp); AliveLinkIn(gsp); //* Record frame count this bullet was fired on lastFireFrame = *psdcnt; SsUtKeyOn(0, SFX_GUN_NORMAL, 0, 60, rand()%128, 127, 127); } //*------------------------------------------------------------------------------------------ //* RainDeathFire //*------------------------------------------------------------------------------------- void RainDeathFire(void) { register struct SCTRL *bp; bp = GetSprite(3); //* Bullet + 2 blur sprites //* Actual bullet sprite PresetSprite(bp, PRESET_RBOW_BULLET); //* First motion-blur bullet PresetSprite(bp->freeLink, PRESET_RBOW_BULLET_BLUR1); //* Second motion-blur bullet PresetSprite(bp->freeLink->freeLink, PRESET_RBOW_BULLET_BLUR2); //* Consider Blitter Boy's direction for firing //* Direction is needed for handle_sprite_over_wall & handle_gunflash_over_wall switch (bp->dir = sCtrl->dir) { case DIR_DOWN: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = 0; bp->dir = DIR_DOWN; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = -1; bp->dir = DIR_DOWN_LEFT; } else { //* Fire bullet to BB's left bp->accelX = 1; bp->dir = DIR_DOWN_RIGHT; } bp->accelY = bullSpeed; bp->wx = sCtrl->wx + 8; bp->wy = sCtrl->wy + 6; break; case DIR_DOWN_LEFT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = -bullSpeed; bp->accelY = bullSpeed; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = -(bullSpeed+1); bp->accelY = bullSpeed-1; } else { //* Fire bullet to BB's left bp->accelX = -(bullSpeed-1); bp->accelY = bullSpeed+1; } bp->dir = DIR_DOWN_LEFT; bp->wx = sCtrl->wx - 1; bp->wy = sCtrl->wy + 5; break; case DIR_LEFT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelY = 0; bp->dir = DIR_LEFT; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelY = -1; bp->dir = DIR_UP_LEFT; } else { //* Fire bullet to BB's left bp->accelY = 1; bp->dir = DIR_DOWN_LEFT; } bp->accelX = -bullSpeed; bp->wx = sCtrl->wx - 14; bp->wy = sCtrl->wy - 3; break; case DIR_UP_LEFT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = -bullSpeed; bp->accelY = -bullSpeed; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = -(bullSpeed-1); bp->accelY = -(bullSpeed+1); } else { //* Fire bullet to BB's left bp->accelX = -(bullSpeed+1); bp->accelY = -(bullSpeed-1); } bp->dir = DIR_UP_LEFT; bp->wx = sCtrl->wx - 5; bp->wy = sCtrl->wy - 12; break; case DIR_UP: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = 0; bp->dir = DIR_UP; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = 1; bp->dir = DIR_UP_RIGHT; } else { //* Fire bullet to BB's left bp->accelX = -1; bp->dir = DIR_UP_LEFT; } bp->accelY = -bullSpeed; bp->wx = sCtrl->wx + 8; bp->wy = sCtrl->wy - 17; break; case DIR_UP_RIGHT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = bullSpeed; bp->accelY = -bullSpeed; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = bullSpeed+1; bp->accelY = -(bullSpeed-1); } else { //* Fire bullet to BB's left bp->accelX = bullSpeed-1; bp->accelY = -(bullSpeed+1); } bp->dir = DIR_UP_RIGHT; bp->wx = sCtrl->wx + 20; bp->wy = sCtrl->wy - 12; break; case DIR_RIGHT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelY = 0; bp->dir = DIR_RIGHT; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelY = 1; bp->dir = DIR_DOWN_RIGHT; } else { //* Fire bullet to BB's left bp->accelY = -1; bp->dir = DIR_UP_RIGHT; } bp->accelX = bullSpeed; bp->wx = sCtrl->wx + 29; bp->wy = sCtrl->wy - 3; break; case DIR_DOWN_RIGHT: if (!(strafe & 0x00000001)) { //* Fire bullet forward (strafe is 0 or 2) bp->accelX = bullSpeed; bp->accelY = bullSpeed; } else if (strafe==1) { //* Fire bullet to BB's right bp->accelX = bullSpeed-1; bp->accelY = bullSpeed+1; } else { //* Fire bullet to BB's left bp->accelX = bullSpeed+1; bp->accelY = bullSpeed-1; } bp->dir = DIR_DOWN_RIGHT; bp->wx = sCtrl->wx + 16; bp->wy = sCtrl->wy + 5; break; } //* Find initial central x,y world coords bp->wxMid = bp->wx + bp->bbXOff + (bp->bbW >> 1); bp->wyMid = bp->wy - bp->bbYOff + (bp->bbH >> 1); //* Set off-ground height for new bullet bp->high = sCtrl->high + 3; //* Add new bullet & gun smoke sprites to aliveSprites linked list AliveLinkIn(bp); //* Record frame count this bullet was fired on lastFireFrame = *psdcnt; SsUtKeyOn(0, SFX_GUN_RAINBOW, 0, 60, rand()%128, 127, 127); } //*------------------------------------------------------------------------------------------ //* FruitDropFire //*------------------------------------------------------------------------------------- void FruitDropFire(void) { static int clutOff=0; register struct SCTRL *bup; bup = GetSprite(1); //* Gun build-up sprite //* Gun build-up sprite PresetSprite(bup, PRESET_FDROP_BUILDUP); bup->spriteLink->cy += clutOff; (clutOff==4) ? clutOff=0 : ++clutOff; //* Set next clut y offset //* Direction is needed for handle_sprite_over_wall & handle_gunflash_over_wall // bup->dir = sCtrl->dir; //* Add new build-up sprite to aliveSprites linked list AliveLinkIn(bup); //* Record frame count this bullet was fired on lastFireFrame = *psdcnt; }