📄 p_hpspr.c
字号:
if(linetarget) { //S_StartSound(player->mo, sfx_stfhit); // turn to face target player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, linetarget->x, linetarget->y); }}//----------------------------------------------------------------------------//// PROC A_StaffAttackPL2////----------------------------------------------------------------------------void A_StaffAttackPL2(player_t *player, pspdef_t *psp){ angle_t angle; int damage; int slope; // P_inter.c:P_DamageMobj() handles target momentums damage = 18+(P_Random()&63); angle = player->mo->angle; angle += P_SignedRandom()<<18; slope = P_AimLineAttack(player->mo, angle, MELEERANGE); PuffType = MT_STAFFPUFF2; P_LineAttack(player->mo, angle, MELEERANGE, slope, damage); if(linetarget) { //S_StartSound(player->mo, sfx_stfpow); // turn to face target player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, linetarget->x, linetarget->y); }}//----------------------------------------------------------------------------//// PROC A_FireBlasterPL1////----------------------------------------------------------------------------void A_FireBlasterPL1(player_t *player, pspdef_t *psp){ mobj_t *mo; angle_t angle; int damage; mo = player->mo; S_StartSound(mo, sfx_gldhit); player->ammo[am_blaster] -= USE_BLSR_AMMO_1; P_BulletSlope(mo); damage = HITDICE(4); angle = mo->angle; if(player->refire) angle += P_SignedRandom()<<18; PuffType = MT_BLASTERPUFF1; P_LineAttack(mo, angle, MISSILERANGE, bulletslope, damage); S_StartSound(player->mo, sfx_blssht);}//----------------------------------------------------------------------------//// PROC P_BlasterMobjThinker//// Thinker for the ultra-fast blaster PL2 ripper-spawning missile.////----------------------------------------------------------------------------void P_BlasterMobjThinker(mobj_t *mobj){ int i; fixed_t xfrac; fixed_t yfrac; fixed_t zfrac; fixed_t z; boolean changexy; // Handle movement if(mobj->momx || mobj->momy || (mobj->z != mobj->floorz) || mobj->momz) { xfrac = mobj->momx>>3; yfrac = mobj->momy>>3; zfrac = mobj->momz>>3; changexy = xfrac || yfrac; for(i = 0; i < 8; i++) { if(changexy) { if(!P_TryMove(mobj, mobj->x+xfrac, mobj->y+yfrac, true)) { // Blocked move P_ExplodeMissile(mobj); return; } } mobj->z += zfrac; if(mobj->z <= mobj->floorz) { // Hit the floor mobj->z = mobj->floorz; P_HitFloor(mobj); P_ExplodeMissile(mobj); return; } if(mobj->z+mobj->height > mobj->ceilingz) { // Hit the ceiling mobj->z = mobj->ceilingz-mobj->height; P_ExplodeMissile(mobj); return; } if(changexy && (P_Random() < 64)) { z = mobj->z-8*FRACUNIT; if(z < mobj->floorz) { z = mobj->floorz; } P_SpawnMobj(mobj->x, mobj->y, z, MT_BLASTERSMOKE); } } } // Advance the state if(mobj->tics != -1) { mobj->tics--; while(!mobj->tics) { if(!P_SetMobjState(mobj, mobj->state->nextstate)) { // mobj was removed return; } } }}//----------------------------------------------------------------------------//// PROC A_FireBlasterPL2////----------------------------------------------------------------------------void A_FireBlasterPL2(player_t *player, pspdef_t *psp){ mobj_t *mo; player->ammo[am_blaster] -= cv_deathmatch.value ? USE_BLSR_AMMO_1 : USE_BLSR_AMMO_2; mo = P_SpawnPlayerMissile(player->mo, MT_BLASTERFX1); if( mo ) mo->thinker.function.acp1 = (actionf_p1)P_BlasterMobjThinker; S_StartSound(player->mo, sfx_blssht);}//----------------------------------------------------------------------------//// PROC A_FireGoldWandPL1////----------------------------------------------------------------------------void A_FireGoldWandPL1(player_t *player, pspdef_t *psp){ mobj_t *mo; angle_t angle; int damage; mo = player->mo; player->ammo[am_goldwand] -= USE_GWND_AMMO_1; P_BulletSlope(mo); damage = 7+(P_Random()&7); angle = mo->angle; if(player->refire) angle += P_SignedRandom()<<18; PuffType = MT_GOLDWANDPUFF1; P_LineAttack(mo, angle, MISSILERANGE, bulletslope, damage); S_StartSound(player->mo, sfx_gldhit);}//----------------------------------------------------------------------------//// PROC A_FireGoldWandPL2////----------------------------------------------------------------------------void A_FireGoldWandPL2(player_t *player, pspdef_t *psp){ int i; mobj_t *mo; angle_t angle; int damage; fixed_t momz; mo = player->mo; player->ammo[am_goldwand] -= cv_deathmatch.value ? USE_GWND_AMMO_1 : USE_GWND_AMMO_2; PuffType = MT_GOLDWANDPUFF2; P_BulletSlope(mo); momz = FixedMul(mobjinfo[MT_GOLDWANDFX2].speed, bulletslope);// P_SpawnMissileAngle(mo, MT_GOLDWANDFX2, mo->angle-(ANG45/8), momz);// P_SpawnMissileAngle(mo, MT_GOLDWANDFX2, mo->angle+(ANG45/8), momz); angle = mo->angle-(ANG45/8); for(i = 0; i < 5; i++) { damage = 1+(P_Random()&7); P_LineAttack(mo, angle, MISSILERANGE, bulletslope, damage); angle += ((ANG45/8)*2)/4; } S_StartSound(player->mo, sfx_gldhit);}//----------------------------------------------------------------------------//// PROC A_FireMacePL1B////----------------------------------------------------------------------------void A_FireMacePL1B(player_t *player, pspdef_t *psp){ mobj_t *pmo; mobj_t *ball; angle_t angle; if(player->ammo[am_mace] < USE_MACE_AMMO_1) { return; } player->ammo[am_mace] -= USE_MACE_AMMO_1; pmo = player->mo; ball = P_SpawnMobj(pmo->x, pmo->y, pmo->z+28*FRACUNIT - FOOTCLIPSIZE*((pmo->flags2&MF2_FEETARECLIPPED) != 0), MT_MACEFX2); ball->momz = 2*FRACUNIT+((player->aiming)<<(FRACBITS-5)); angle = pmo->angle; ball->target = pmo; ball->angle = angle; ball->z += (player->aiming)<<(FRACBITS-4); angle >>= ANGLETOFINESHIFT; ball->momx = (pmo->momx>>1) +FixedMul(ball->info->speed, finecosine[angle]); ball->momy = (pmo->momy>>1) +FixedMul(ball->info->speed, finesine[angle]); S_StartSound(ball, sfx_lobsht); P_CheckMissileSpawn(ball);}//----------------------------------------------------------------------------//// PROC A_FireMacePL1////----------------------------------------------------------------------------void A_FireMacePL1(player_t *player, pspdef_t *psp){ mobj_t *ball; if(P_Random() < 28) { A_FireMacePL1B(player, psp); return; } if(player->ammo[am_mace] < USE_MACE_AMMO_1) { return; } player->ammo[am_mace] -= USE_MACE_AMMO_1; psp->sx = ((P_Random()&3)-2)*FRACUNIT; psp->sy = WEAPONTOP+(P_Random()&3)*FRACUNIT; ball = P_SPMAngle(player->mo, MT_MACEFX1, player->mo->angle +(((P_Random()&7)-4)<<24)); if(ball) { ball->special1 = 16; // tics till dropoff }}//----------------------------------------------------------------------------//// PROC A_MacePL1Check////----------------------------------------------------------------------------void A_MacePL1Check(mobj_t *ball){ angle_t angle; if(ball->special1 == 0) { return; } ball->special1 -= 4; if(ball->special1 > 0) { return; } ball->special1 = 0; ball->flags2 |= MF2_LOGRAV; angle = ball->angle>>ANGLETOFINESHIFT; ball->momx = FixedMul(7*FRACUNIT, finecosine[angle]); ball->momy = FixedMul(7*FRACUNIT, finesine[angle]); ball->momz -= ball->momz>>1;}//----------------------------------------------------------------------------//// PROC A_MaceBallImpact////----------------------------------------------------------------------------void A_MaceBallImpact(mobj_t *ball){ if((ball->z <= ball->floorz) && (P_HitFloor(ball) != FLOOR_SOLID)) { // Landed in some sort of liquid P_RemoveMobj(ball); return; } if((ball->health != MAGIC_JUNK) && (ball->z <= ball->floorz) && ball->momz) { // Bounce ball->health = MAGIC_JUNK; ball->momz = (ball->momz*192)>>8; ball->flags2 &= ~MF2_FLOORBOUNCE; P_SetMobjState(ball, ball->info->spawnstate); S_StartSound(ball, sfx_bounce); } else { // Explode ball->flags |= MF_NOGRAVITY; ball->flags2 &= ~MF2_LOGRAV; S_StartSound(ball, sfx_lobhit); }}//----------------------------------------------------------------------------//// PROC A_MaceBallImpact2////----------------------------------------------------------------------------void A_MaceBallImpact2(mobj_t *ball){ mobj_t *tiny; angle_t angle; if((ball->z <= ball->floorz) && (P_HitFloor(ball) != FLOOR_SOLID)) { // Landed in some sort of liquid P_RemoveMobj(ball); return; } if((ball->z != ball->floorz) || (ball->momz < 2*FRACUNIT)) { // Explode ball->momx = ball->momy = ball->momz = 0; ball->flags |= MF_NOGRAVITY; ball->flags2 &= ~(MF2_LOGRAV|MF2_FLOORBOUNCE); } else { // Bounce ball->momz = (ball->momz*192)>>8; P_SetMobjState(ball, ball->info->spawnstate); tiny = P_SpawnMobj(ball->x, ball->y, ball->z, MT_MACEFX3); angle = ball->angle+ANG90; tiny->target = ball->target; tiny->angle = angle; angle >>= ANGLETOFINESHIFT; tiny->momx = (ball->momx>>1)+FixedMul(ball->momz-FRACUNIT, finecosine[angle]); tiny->momy = (ball->momy>>1)+FixedMul(ball->momz-FRACUNIT, finesine[angle]); tiny->momz = ball->momz; P_CheckMissileSpawn(tiny); tiny = P_SpawnMobj(ball->x, ball->y, ball->z, MT_MACEFX3); angle = ball->angle-ANG90; tiny->target = ball->target; tiny->angle = angle; angle >>= ANGLETOFINESHIFT; tiny->momx = (ball->momx>>1)+FixedMul(ball->momz-FRACUNIT, finecosine[angle]); tiny->momy = (ball->momy>>1)+FixedMul(ball->momz-FRACUNIT, finesine[angle]); tiny->momz = ball->momz; P_CheckMissileSpawn(tiny); }}//----------------------------------------------------------------------------//// PROC A_FireMacePL2////----------------------------------------------------------------------------void A_FireMacePL2(player_t *player, pspdef_t *psp){ mobj_t *mo; player->ammo[am_mace] -= cv_deathmatch.value ? USE_MACE_AMMO_1 : USE_MACE_AMMO_2; mo = P_SpawnPlayerMissile(player->mo, MT_MACEFX4); if(mo) { mo->momx += player->mo->momx; mo->momy += player->mo->momy; mo->momz = 2*FRACUNIT+((player->aiming)<<(FRACBITS-5)); if(linetarget) { mo->special1 = (int)linetarget; } } S_StartSound(player->mo, sfx_lobsht);}//----------------------------------------------------------------------------//// PROC A_DeathBallImpact////----------------------------------------------------------------------------void A_DeathBallImpact(mobj_t *ball){ int i; mobj_t *target; angle_t angle = 0; boolean newAngle; if((ball->z <= ball->floorz) && (P_HitFloor(ball) != FLOOR_SOLID)) { // Landed in some sort of liquid P_RemoveMobj(ball); return; } if((ball->z <= ball->floorz) && ball->momz) { // Bounce newAngle = false; target = (mobj_t *)ball->special1; if(target) { if(!(target->flags&MF_SHOOTABLE)) { // Target died ball->special1 = 0; } else { // Seek angle = R_PointToAngle2(ball->x, ball->y, target->x, target->y); newAngle = true; } } else { // Find new target for(i = 0; i < 16; i++) { P_AimLineAttack(ball, angle, 10*64*FRACUNIT); if(linetarget && ball->target != linetarget) { ball->special1 = (int)linetarget; angle = R_PointToAngle2(ball->x, ball->y, linetarget->x, linetarget->y); newAngle = true; break; } angle += ANGLE_45/2; } } if(newAngle) { ball->angle = angle; angle >>= ANGLETOFINESHIFT; ball->momx = FixedMul(ball->info->speed, finecosine[angle]); ball->momy = FixedMul(ball->info->speed, finesine[angle]); } P_SetMobjState(ball, ball->info->spawnstate); S_StartSound(ball, sfx_pstop); } else { // Explode ball->flags |= MF_NOGRAVITY; ball->flags2 &= ~MF2_LOGRAV; S_StartSound(ball, sfx_phohit); }}//----------------------------------------------------------------------------//// PROC A_SpawnRippers////----------------------------------------------------------------------------void A_SpawnRippers(mobj_t *actor){ int i; angle_t angle; mobj_t *ripper; for(i = 0; i < 8; i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -