diff options
Diffstat (limited to 'src/strife/p_pspr.c')
-rw-r--r-- | src/strife/p_pspr.c | 437 |
1 files changed, 157 insertions, 280 deletions
diff --git a/src/strife/p_pspr.c b/src/strife/p_pspr.c index 2d30c2d2..937b746b 100644 --- a/src/strife/p_pspr.c +++ b/src/strife/p_pspr.c @@ -506,53 +506,6 @@ A_Punch } -// -// A_Saw -// -void -A_Saw -( player_t* player, - pspdef_t* psp ) -{ - angle_t angle; - int damage; - int slope; - - damage = 2*(P_Random ()%10+1); - angle = player->mo->angle; - angle += (P_Random()-P_Random())<<18; - - // use meleerange + 1 se the puff doesn't skip the flash - slope = P_AimLineAttack (player->mo, angle, MELEERANGE+1); - P_LineAttack (player->mo, angle, MELEERANGE+1, slope, damage); - - if (!linetarget) - { - S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds - return; - } - S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds - - // turn to face target - angle = R_PointToAngle2 (player->mo->x, player->mo->y, - linetarget->x, linetarget->y); - if (angle - player->mo->angle > ANG180) - { - if ((signed int) (angle - player->mo->angle) < -ANG90/20) - player->mo->angle = angle + ANG90/21; - else - player->mo->angle -= ANG90/20; - } - else - { - if (angle - player->mo->angle > ANG90/20) - player->mo->angle = angle - ANG90/21; - else - player->mo->angle += ANG90/20; - } - player->mo->flags |= MF_JUSTATTACKED; -} - // Doom does not check the bounds of the ammo array. As a result, // it is possible to use an ammo type > 4 that overflows into the // maxammo array and affects that instead. Through dehacked, for @@ -573,54 +526,142 @@ static void DecreaseAmmo(player_t *player, int ammonum, int amount) // -// A_FireMissile +// A_FireFlameThrower +// villsa [STRIFE] completly new compared to the original // -void -A_FireMissile -( player_t* player, - pspdef_t* psp ) + +void A_FireFlameThrower(player_t* player, pspdef_t* psp) { - DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); - // villsa [STRIFE] TODO - update -// P_SpawnPlayerMissile (player->mo, MT_ROCKET); -} + mobj_t* mo; + P_SetMobjState(player->mo, S_PLAY_06); + player->ammo[weaponinfo[player->readyweapon].ammo]--; + player->mo->angle += (P_Random() - P_Random()) << 18; + + mo = P_SpawnPlayerMissile(player->mo, MT_SFIREBALL); + mo->momz += (5*FRACUNIT); +} // -// A_FireBFG +// A_FireMissile +// villsa [STRIFE] completly new compared to the original // -void -A_FireBFG -( player_t* player, - pspdef_t* psp ) + +void A_FireMissile(player_t* player, pspdef_t* psp) { - DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, - deh_bfg_cells_per_shot); - // villsa [STRIFE] unused -// P_SpawnPlayerMissile (player->mo, MT_BFG); + angle_t an; + mobj_t* mo; + + an = player->mo->angle; + player->mo->angle += (P_Random() - P_Random())<<(19 - (player->accuracy * 4 / 100)); + P_SetMobjState(player->mo, S_PLAY_06); + player->ammo[weaponinfo[player->readyweapon].ammo]--; + P_SpawnPlayerMissile(player->mo, MT_MINIMISSLE); + player->mo->angle = an; } +// +// A_FireMauler2 +// villsa [STRIFE] - new codepointer +// +void A_FireMauler2(player_t* player, pspdef_t* pspr) +{ + P_SetMobjState(player->mo, S_PLAY_06); + P_DamageMobj(player->mo, player->mo, NULL, 20); + player->ammo[weaponinfo[player->readyweapon].ammo] -= 30; + P_SpawnPlayerMissile(player->mo, MT_TORPEDO); + P_Thrust(player, player->mo->angle + ANG180, 512000); +} // -// A_FirePlasma +// A_FireGrenade +// villsa [STRIFE] - new codepointer // -void -A_FirePlasma -( player_t* player, - pspdef_t* psp ) + +void A_FireGrenade(player_t* player, pspdef_t* pspr) { - DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); + mobjtype_t type; + mobj_t* mo; + state_t* st1; + state_t* st2; + angle_t an; + fixed_t radius; - P_SetPsprite (player, - ps_flash, - weaponinfo[player->readyweapon].flashstate+(P_Random ()&1) ); + // decide on what type of grenade to spawn + if(player->readyweapon == wp_hegrenade) + type = MT_HEGRENADE; + else + { + if(player->readyweapon == wp_wpgrenade) + type = MT_PGRENADE; + } + + player->ammo[weaponinfo[player->readyweapon].ammo]--; - // villsa [STRIFE] TODO - update -// P_SpawnPlayerMissile (player->mo, MT_PLASMA); + // set flash frame + st1 = &states[(pspr->state - states) + weaponinfo[player->readyweapon].flashstate]; + st2 = &states[weaponinfo[player->readyweapon].atkstate]; + P_SetPsprite(player, ps_flash, st1 - st2); + + player->mo->z += (32*FRACUNIT); // ugh + mo = P_SpawnMortar(player->mo, type); + player->mo->z -= (32*FRACUNIT); // ugh + + // change momz based on player's pitch + mo->momz = FixedMul((player->pitch<<FRACBITS) / 160, mo->info->speed) + (8*FRACUNIT); + S_StartSound(mo, mo->info->seesound); + + radius = mobjinfo[type].radius + player->mo->info->radius; + an = (player->mo->angle >> ANGLETOFINESHIFT); + + mo->x += FixedMul(finecosine[an], radius + (4*FRACUNIT)); + mo->y += FixedMul(finesine[an], radius + (4*FRACUNIT)); + + // shoot grenade from left or right side? + if(&states[weaponinfo[player->readyweapon].atkstate] == pspr->state) + an = (player->mo->angle - ANG90) >> ANGLETOFINESHIFT; + else + an = (player->mo->angle + ANG90) >> ANGLETOFINESHIFT; + + mo->x += FixedMul((15*FRACUNIT), finecosine[an]); + mo->y += FixedMul((15*FRACUNIT), finesine[an]); + + // set bounce flag + mo->flags |= MF_BOUNCE; +} + +// +// A_FireElectricBolt +// villsa [STRIFE] - new codepointer +// + +void A_FireElectricBolt(player_t* player, pspdef_t* pspr) +{ + angle_t an = player->mo->angle; + + player->mo->angle += (P_Random() - P_Random()) << (18 - (player->accuracy * 4 / 100)); + player->ammo[weaponinfo[player->readyweapon].ammo]--; + P_SpawnPlayerMissile(player->mo, MT_ELECARROW); + player->mo->angle = an; + S_StartSound(player->mo, sfx_xbow); } +// +// A_FirePoisonBolt +// villsa [STRIFE] - new codepointer +// + +void A_FirePoisonBolt(player_t* player, pspdef_t* pspr) +{ + angle_t an = player->mo->angle; + player->mo->angle += (P_Random() - P_Random())<<(18 - (player->accuracy * 4 / 100)); + player->ammo[weaponinfo[player->readyweapon].ammo]--; + P_SpawnPlayerMissile(player->mo, MT_POISARROW); + player->mo->angle = an; + S_StartSound(player->mo, sfx_xbow); +} // // P_BulletSlope @@ -662,131 +703,75 @@ P_GunShot angle_t angle; int damage; - damage = 5*(P_Random ()%3+1); + damage = 4*(P_Random ()%3+4); // villsa [STRIFE] different damage formula angle = mo->angle; + // villsa [STRIFE] apply player accuracy if (!accurate) - angle += (P_Random()-P_Random())<<18; + angle += (P_Random()-P_Random())<<(20 - (mo->player->accuracy * 4 / 100)); P_LineAttack (mo, angle, MISSILERANGE, bulletslope, damage); } - // -// A_FirePistol +// A_FireRifle +// villsa [STRIFE] - new codepointer // -void -A_FirePistol -( player_t* player, - pspdef_t* psp ) -{ - S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds - P_SetMobjState (player->mo, S_PLAY_06); // villsa [STRIFE] TODO - verify - DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); - - P_SetPsprite (player, - ps_flash, - weaponinfo[player->readyweapon].flashstate); - - P_BulletSlope (player->mo); - P_GunShot (player->mo, !player->refire); -} - - -// -// A_FireShotgun -// -void -A_FireShotgun -( player_t* player, - pspdef_t* psp ) +void A_FireRifle(player_t* player, pspdef_t* pspr) { - int i; - - S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds - P_SetMobjState (player->mo, S_PLAY_06); // villsa [STRIFE] TODO - verify + S_StartSound(player->mo, sfx_rifle); - DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); - - P_SetPsprite (player, - ps_flash, - weaponinfo[player->readyweapon].flashstate); - - P_BulletSlope (player->mo); - - for (i=0 ; i<7 ; i++) - P_GunShot (player->mo, false); + if(player->ammo[weaponinfo[player->readyweapon].ammo]) + { + P_SetMobjState(player->mo, S_PLAY_06); + player->ammo[weaponinfo[player->readyweapon].ammo]--; + P_BulletSlope(player->mo); + P_GunShot(player->mo, !player->refire); + } } - - // -// A_FireShotgun2 +// A_FireMauler1 +// villsa [STRIFE] - new codepointer // -void -A_FireShotgun2 -( player_t* player, - pspdef_t* psp ) -{ - int i; - angle_t angle; - int damage; - - - S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds - P_SetMobjState (player->mo, S_PLAY_06); // villsa [STRIFE] TODO - verify - DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 2); - - P_SetPsprite (player, - ps_flash, - weaponinfo[player->readyweapon].flashstate); +void A_FireMauler1(player_t* player, pspdef_t* pspr) +{ + int i; + angle_t angle; + int damage; - P_BulletSlope (player->mo); - - for (i=0 ; i<20 ; i++) + if(player->ammo[weaponinfo[player->readyweapon].ammo] > 20) { - damage = 5*(P_Random ()%3+1); - angle = player->mo->angle; - angle += (P_Random()-P_Random())<<19; - P_LineAttack (player->mo, - angle, - MISSILERANGE, - bulletslope + ((P_Random()-P_Random())<<5), damage); + player->ammo[weaponinfo[player->readyweapon].ammo] -= 20; + P_BulletSlope(player->mo); + S_StartSound(player->mo, sfx_pgrdat); + + for(i = 0; i < 20; i++) + { + damage = 5*(P_Random ()%3+1); + angle = player->mo->angle; + angle += (P_Random()-P_Random())<<19; + P_LineAttack(player->mo, angle, MISSILERANGE, + bulletslope + ((P_Random()-P_Random())<<5), damage); + } } } - // -// A_FireCGun +// A_SigilSound +// villsa [STRIFE] - new codepointer // -void -A_FireCGun -( player_t* player, - pspdef_t* psp ) -{ - S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds - if (!player->ammo[weaponinfo[player->readyweapon].ammo]) - return; - - P_SetMobjState (player->mo, S_PLAY_06); // villsa [STRIFE] TODO - verify - DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); - - /*P_SetPsprite (player, - ps_flash, - weaponinfo[player->readyweapon].flashstate - + psp->state - - &states[S_CHAIN1] );*/ +void A_SigilSound(player_t* player, pspdef_t* pspr) +{ + S_StartSound(player->mo, sfx_siglup); + player->extralight = 2; - P_BulletSlope (player->mo); - - P_GunShot (player->mo, !player->refire); } - // // ? // @@ -807,114 +792,6 @@ void A_Light2 (player_t *player, pspdef_t *psp) // -// A_BFGSpray -// Spawn a BFG explosion on every monster in view -// -void A_BFGSpray (mobj_t* mo) -{ - // villsa [STRIFE] unused -/* int i; - int j; - int damage; - angle_t an; - - // offset angles from its attack angle - for (i=0 ; i<40 ; i++) - { - an = mo->angle - ANG90/2 + ANG90/40*i; - - // mo->target is the originator (player) - // of the missile - P_AimLineAttack (mo->target, an, 16*64*FRACUNIT); - - if (!linetarget) - continue; - - P_SpawnMobj (linetarget->x, - linetarget->y, - linetarget->z + (linetarget->height>>2), - MT_EXTRABFG); - - damage = 0; - for (j=0;j<15;j++) - damage += (P_Random()&7) + 1; - - P_DamageMobj (linetarget, mo->target,mo->target, damage); - }*/ -} - - -// -// A_BFGsound -// -void -A_BFGsound -( player_t* player, - pspdef_t* psp ) -{ - S_StartSound (player->mo, sfx_swish); // villsa [STRIFE] TODO - fix sounds -} - -// -// A_FireGrenade -// villsa [STRIFE] - new codepointer -// - -void A_FireGrenade(player_t* player, pspdef_t* pspr) -{ - mobjtype_t type; - mobj_t* mo; - state_t* st1; - state_t* st2; - angle_t an; - fixed_t radius; - - // decide on what type of grenade to spawn - if(player->readyweapon == wp_hegrenade) - type = MT_HEGRENADE; - else - { - if(player->readyweapon == wp_wpgrenade) - type = MT_PGRENADE; - } - - player->ammo[weaponinfo[player->readyweapon].ammo]--; - - // set flash frame - st1 = &states[(pspr->state - states) + weaponinfo[player->readyweapon].flashstate]; - st2 = &states[weaponinfo[player->readyweapon].atkstate]; - P_SetPsprite(player, ps_flash, st1 - st2); - - player->mo->z += (32*FRACUNIT); // ugh - mo = P_SpawnMortar(player->mo, type); - player->mo->z -= (32*FRACUNIT); // ugh - - // change momz based on player's pitch - mo->momz = FixedMul((player->pitch<<FRACBITS) / 160, mo->info->speed) + (8*FRACUNIT); - S_StartSound(mo, mo->info->seesound); - - radius = mobjinfo[type].radius + player->mo->info->radius; - an = (player->mo->angle >> ANGLETOFINESHIFT); - - mo->x += FixedMul(finecosine[an], radius + (4*FRACUNIT)); - mo->y += FixedMul(finesine[an], radius + (4*FRACUNIT)); - - // shoot grenade from left or right side? - if(&states[weaponinfo[player->readyweapon].atkstate] == pspr->state) - an = (player->mo->angle - ANG90) >> ANGLETOFINESHIFT; - else - an = (player->mo->angle + ANG90) >> ANGLETOFINESHIFT; - - mo->x += FixedMul((15*FRACUNIT), finecosine[an]); - mo->y += FixedMul((15*FRACUNIT), finesine[an]); - - // set bounce flag - mo->flags |= MF_BOUNCE; -} - - - -// // P_SetupPsprites // Called at start of level for each player. // |