📄 p_henemy.c
字号:
if(P_CheckMeleeRange(actor)) { damage = ((P_Random()%7)+3); P_DamageMobj(actor->target, actor, actor, damage); }}//----------------------------------------------------------------------------//// PROC A_GhostOff////----------------------------------------------------------------------------void A_GhostOff(mobj_t *actor){ actor->flags &= ~MF_SHADOW;}//----------------------------------------------------------------------------//// PROC A_WizAtk1////----------------------------------------------------------------------------void A_WizAtk1(mobj_t *actor){ A_FaceTarget(actor); actor->flags &= ~MF_SHADOW;}//----------------------------------------------------------------------------//// PROC A_WizAtk2////----------------------------------------------------------------------------void A_WizAtk2(mobj_t *actor){ A_FaceTarget(actor); actor->flags |= MF_SHADOW;}//----------------------------------------------------------------------------//// PROC A_WizAtk3////----------------------------------------------------------------------------void A_WizAtk3(mobj_t *actor){ mobj_t *mo; angle_t angle; fixed_t momz; actor->flags &= ~MF_SHADOW; if(!actor->target) { return; } S_StartSound(actor, actor->info->attacksound); if(P_CheckMeleeRange(actor)) { P_DamageMobj(actor->target, actor, actor, HITDICE(4)); return; } mo = P_SpawnMissile(actor, actor->target, MT_WIZFX1); if(mo) { momz = mo->momz; angle = mo->angle; P_SpawnMissileAngle(actor, MT_WIZFX1, angle-(ANG45/8), momz); P_SpawnMissileAngle(actor, MT_WIZFX1, angle+(ANG45/8), momz); }}//----------------------------------------------------------------------------//// PROC A_Scream////----------------------------------------------------------------------------void A_HScream(mobj_t *actor){ switch(actor->type) { case MT_CHICPLAYER: case MT_SORCERER1: case MT_MINOTAUR: // Make boss death sounds full volume S_StartSound(NULL, actor->info->deathsound); break; case MT_PLAYER: // Handle the different player death screams if(actor->special1 < 10) { // Wimpy death sound S_StartSound(actor, sfx_plrwdth); } else if(actor->health > -50) { // Normal death sound S_StartSound(actor, actor->info->deathsound); } else if(actor->health > -100) { // Crazy death sound S_StartSound(actor, sfx_plrcdth); } else { // Extreme death sound S_StartSound(actor, sfx_gibdth); } break; default: S_StartSound(actor, actor->info->deathsound); break; }}//---------------------------------------------------------------------------//// PROC P_DropItem////---------------------------------------------------------------------------void P_DropItem(mobj_t *source, mobjtype_t type, int special, int chance){ mobj_t *mo; if(P_Random() > chance) { return; } mo = P_SpawnMobj(source->x, source->y, source->z+(source->height>>1), type); mo->momx = P_SignedRandom()<<8; mo->momy = P_SignedRandom()<<8; mo->momz = FRACUNIT*5+(P_Random()<<10); mo->flags |= MF_DROPPED; mo->health = special;}//----------------------------------------------------------------------------//// PROC A_NoBlocking////----------------------------------------------------------------------------void A_NoBlocking(mobj_t *actor){ A_Fall(actor); // Check for monsters dropping things switch(actor->type) { case MT_MUMMY: case MT_MUMMYLEADER: case MT_MUMMYGHOST: case MT_MUMMYLEADERGHOST: P_DropItem(actor, MT_AMGWNDWIMPY, 3, 84); break; case MT_KNIGHT: case MT_KNIGHTGHOST: P_DropItem(actor, MT_AMCBOWWIMPY, 5, 84); break; case MT_WIZARD: P_DropItem(actor, MT_AMBLSRWIMPY, 10, 84); P_DropItem(actor, MT_ARTITOMEOFPOWER, 0, 4); break; case MT_HHEAD: P_DropItem(actor, MT_AMBLSRWIMPY, 10, 84); P_DropItem(actor, MT_ARTIEGG, 0, 51); break; case MT_BEAST: P_DropItem(actor, MT_AMCBOWWIMPY, 10, 84); break; case MT_CLINK: P_DropItem(actor, MT_AMSKRDWIMPY, 20, 84); break; case MT_SNAKE: P_DropItem(actor, MT_AMPHRDWIMPY, 5, 84); break; case MT_MINOTAUR: P_DropItem(actor, MT_ARTISUPERHEAL, 0, 51); P_DropItem(actor, MT_AMPHRDWIMPY, 10, 84); break; default: break; }}//----------------------------------------------------------------------------//// PROC A_PodPain////----------------------------------------------------------------------------void A_PodPain(mobj_t *actor){ int i; int count; int chance; mobj_t *goo; chance = P_Random(); if(chance < 128) { return; } count = chance > 240 ? 2 : 1; for(i = 0; i < count; i++) { goo = P_SpawnMobj(actor->x, actor->y, actor->z+48*FRACUNIT, MT_PODGOO); goo->target = actor; goo->momx = P_SignedRandom()<<9; goo->momy = P_SignedRandom()<<9; goo->momz = FRACUNIT/2+(P_Random()<<9); }}//----------------------------------------------------------------------------//// PROC A_RemovePod////----------------------------------------------------------------------------void A_RemovePod(mobj_t *actor){ mobj_t *mo; if(actor->special2) { mo = (mobj_t *)actor->special2; if(mo->special1 > 0) { mo->special1--; } }}//----------------------------------------------------------------------------//// PROC A_MakePod////----------------------------------------------------------------------------#define MAX_GEN_PODS 16void A_MakePod(mobj_t *actor){ mobj_t *mo; fixed_t x; fixed_t y; fixed_t z; if(actor->special1 == MAX_GEN_PODS) { // Too many generated pods return; } x = actor->x; y = actor->y; z = actor->z; mo = P_SpawnMobj(x, y, ONFLOORZ, MT_POD); if(P_CheckPosition(mo, x, y) == false) { // Didn't fit P_RemoveMobj(mo); return; } P_SetMobjState(mo, S_POD_GROW1); P_ThrustMobj(mo, P_Random()<<24, (fixed_t)(4.5*FRACUNIT)); S_StartSound(mo, sfx_newpod); actor->special1++; // Increment generated pod count mo->special2 = (int)actor; // Link the generator to the pod return;}//----------------------------------------------------------------------------//// PROC P_Massacre//// Kills all monsters.////----------------------------------------------------------------------------void P_Massacre(void){ mobj_t *mo; thinker_t *think; for(think = thinkercap.next; think != &thinkercap; think = think->next) { if(think->function.acp1 != (actionf_p1)P_MobjThinker) { // Not a mobj thinker continue; } mo = (mobj_t *)think; if((mo->flags&MF_COUNTKILL) && (mo->health > 0)) { P_DamageMobj(mo, NULL, NULL, 10000); } }}//----------------------------------------------------------------------------//// PROC A_BossDeath//// Trigger special effects if all bosses are dead.////----------------------------------------------------------------------------void A_HBossDeath(mobj_t *actor){ mobj_t *mo; thinker_t *think; line_t dummyLine; static const mobjtype_t bossType[6] = { MT_HHEAD, MT_MINOTAUR, MT_SORCERER2, MT_HHEAD, MT_MINOTAUR, -1 }; if(gamemap != 8) { // Not a boss level return; } if(actor->type != bossType[gameepisode-1]) { // Not considered a boss in this episode return; } // Make sure all bosses are dead for(think = thinkercap.next; think != &thinkercap; think = think->next) { if(think->function.acp1 != (actionf_p1)P_MobjThinker) { // Not a mobj thinker continue; } mo = (mobj_t *)think; if((mo != actor) && (mo->type == actor->type) && !(mo->flags & MF_CORPSE)) { // Found a living boss return; } } if(gameepisode > 1) { // Kill any remaining monsters P_Massacre(); } dummyLine.tag = 666; EV_DoFloor(&dummyLine, lowerFloor);}//----------------------------------------------------------------------------//// PROC A_ESound////----------------------------------------------------------------------------void A_ESound(mobj_t *mo){ int sound; switch(mo->type) { case MT_SOUNDWATERFALL: sound = sfx_waterfl; break; case MT_SOUNDWIND: sound = sfx_wind; break; default: sound = sfx_None; break; } S_StartSound(mo, sound);}//----------------------------------------------------------------------------//// PROC A_SpawnTeleGlitter////----------------------------------------------------------------------------void A_SpawnTeleGlitter(mobj_t *actor){ mobj_t *mo; int r,s; r = P_Random(); s = P_Random(); mo = P_SpawnMobj(actor->x+((r&31)-16)*FRACUNIT, actor->y+((s&31)-16)*FRACUNIT, actor->subsector->sector->floorheight, MT_TELEGLITTER); mo->momz = FRACUNIT/4;}//----------------------------------------------------------------------------//// PROC A_SpawnTeleGlitter2////----------------------------------------------------------------------------void A_SpawnTeleGlitter2(mobj_t *actor){ mobj_t *mo; int r,s; r = P_Random(); s = P_Random(); mo = P_SpawnMobj(actor->x+((r&31)-16)*FRACUNIT, actor->y+((s&31)-16)*FRACUNIT, actor->subsector->sector->floorheight, MT_TELEGLITTER2); mo->momz = FRACUNIT/4;}//----------------------------------------------------------------------------//// PROC A_AccTeleGlitter////----------------------------------------------------------------------------void A_AccTeleGlitter(mobj_t *actor){ if(++actor->health > 35) { actor->momz += actor->momz/2; }}//----------------------------------------------------------------------------//// PROC A_InitKeyGizmo////----------------------------------------------------------------------------void A_InitKeyGizmo(mobj_t *gizmo){ mobj_t *mo; statenum_t state; switch(gizmo->type) { case MT_KEYGIZMOBLUE: state = S_KGZ_BLUEFLOAT1; break; case MT_KEYGIZMOGREEN: state = S_KGZ_GREENFLOAT1; break; case MT_KEYGIZMOYELLOW: state = S_KGZ_YELLOWFLOAT1; break; default: state = S_NULL; break; } mo = P_SpawnMobj(gizmo->x, gizmo->y, gizmo->z+60*FRACUNIT, MT_KEYGIZMOFLOAT); P_SetMobjState(mo, state);}//----------------------------------------------------------------------------//// PROC A_VolcanoSet////----------------------------------------------------------------------------void A_VolcanoSet(mobj_t *volcano){ volcano->tics = 105+(P_Random()&127);}//----------------------------------------------------------------------------//// PROC A_VolcanoBlast////----------------------------------------------------------------------------void A_VolcanoBlast(mobj_t *volcano){ int i; int count; mobj_t *blast; angle_t angle; count = 1+(P_Random()%3); for(i = 0; i < count; i++) { blast = P_SpawnMobj(volcano->x, volcano->y, volcano->z+44*FRACUNIT, MT_VOLCANOBLAST); // MT_VOLCANOBLAST blast->target = volcano; angle = P_Random()<<24; blast->angle = angle; angle >>= ANGLETOFINESHIFT; blast->momx = FixedMul(1*FRACUNIT, finecosine[angle]); blast->momy = FixedMul(1*FRACUNIT, finesine[angle]); blast->momz = (2.5*FRACUNIT)+(P_Random()<<10); S_StartSound(blast, sfx_volsht); P_CheckMissileSpawn(blast); }}//----------------------------------------------------------------------------//// PROC A_VolcBallImpact////----------------------------------------------------------------------------void A_VolcBallImpact(mobj_t *ball){ int i; mobj_t *tiny; angle_t angle; if(ball->z <= ball->floorz) { ball->flags |= MF_NOGRAVITY; ball->flags2 &= ~MF2_LOGRAV; ball->z += 28*FRACUNIT; //ball->momz = 3*FRACUNIT; } P_RadiusAttack(ball, ball->target, 25); for(i = 0; i < 4; i++) { tiny = P_SpawnMobj(ball->x, ball->y, ball->z, MT_VOLCANOTBLAST); tiny->target = ball; angle = i*ANG90; tiny->angle = angle; angle >>= ANGLETOFINESHIFT; tiny->momx = FixedMul(FRACUNIT*.7, finecosine[angle]); tiny->momy = FixedMul(FRACUNIT*.7, finesine[angle]); tiny->momz = FRACUNIT+(P_Random()<<9); P_CheckMissileSpawn(tiny); }}//----------------------------------------------------------------------------//// PROC A_SkullPop////----------------------------------------------------------------------------void A_SkullPop(mobj_t *actor){ mobj_t *mo; player_t *player; actor->flags &= ~MF_SOLID; mo = P_SpawnMobj(actor->x, actor->y, actor->z+48*FRACUNIT, MT_BLOODYSKULL); //mo->target = actor; mo->momx = P_SignedRandom()<<9; mo->momy = P_SignedRandom()<<9; mo->momz = FRACUNIT*2+(P_Random()<<6); // Attach player mobj to bloody skull player = actor->player; actor->player = NULL; mo->player = player; mo->health = actor->health; mo->angle = actor->angle; player->mo = mo; player->aiming = 0; player->damagecount = 32;}//----------------------------------------------------------------------------//// PROC A_CheckSkullFloor////----------------------------------------------------------------------------void A_CheckSkullFloor(mobj_t *actor){ if(actor->z <= actor->floorz) { P_SetMobjState(actor, S_BLOODYSKULLX1); }}//----------------------------------------------------------------------------//// PROC A_CheckSkullDone////----------------------------------------------------------------------------void A_CheckSkullDone(mobj_t *actor){ if(actor->special2 == 666) { P_SetMobjState(actor, S_BLOODYSKULLX2); }}//----------------------------------------------------------------------------//// PROC A_CheckBurnGone////----------------------------------------------------------------------------void A_CheckBurnGone(mobj_t *actor){ if(actor->special2 == 666) { //P_SetMobjState(actor, S_PLAY_FDTH20); }}//----------------------------------------------------------------------------//// PROC A_FreeTargMobj////----------------------------------------------------------------------------void A_FreeTargMobj(mobj_t *mo){ mo->momx = mo->momy = mo->momz = 0; mo->z = mo->ceilingz+4*FRACUNIT; mo->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SKULLFLY|MF_SOLID); mo->flags |= MF_CORPSE|MF_DROPOFF|MF_NOGRAVITY; mo->flags2 &= ~(MF2_PASSMOBJ|MF2_LOGRAV); mo->player = NULL;}//----------------------------------------------------------------------------//// PROC A_AddPlayerCorpse////----------------------------------------------------------------------------/*#define BODYQUESIZE 32mobj_t *bodyque[BODYQUESIZE];int bodyqueslot;*/void A_AddPlayerCorpse(mobj_t *actor){ if(bodyqueslot >= BODYQUESIZE) { // Too many player corpses - remove an old one P_RemoveMobj(bodyque[bodyqueslot%BODYQUESIZE]); } bodyque[bodyqueslot%BODYQUESIZE] = actor; bodyqueslot++;}//----------------------------------------------------------------------------//// PROC A_FlameSnd////----------------------------------------------------------------------------void A_FlameSnd(mobj_t *actor){ S_StartSound(actor, sfx_hedat1); // Burn sound}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -