📄 a_action.c
字号:
{ for (playnum=0; playnum < MAXPLAYERS; playnum++) { player = &players[playnum]; if (!playeringame[playnum]) continue; victim = player->mo; dist = P_AproxDistance(actor->x - victim->x, actor->y - victim->y) >> (FRACBITS+6); // Tested in tile units (64 pixels) if (dist < actor->args[3]) // In tremor radius { localQuakeHappening[playnum] = richters; } // Check if in damage radius if ((dist < actor->args[2]) && (victim->z <= victim->floorz)) { if (P_Random() < 50) { P_DamageMobj(victim, NULL, NULL, HITDICE(1)); } // Thrust player around an = victim->angle + ANGLE_1*P_Random(); P_ThrustMobj(victim,an,richters<<(FRACBITS-1)); } } } else { for (playnum=0; playnum < MAXPLAYERS; playnum++) { localQuakeHappening[playnum] = false; } P_SetMobjState(actor, S_NULL); }}//===========================================================================//// Teleport other stuff////===========================================================================#define TELEPORT_LIFE 1void A_TeloSpawnA(mobj_t *actor){ mobj_t *mo; mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_TELOTHER_FX2); if (mo) { mo->special1 = TELEPORT_LIFE; // Lifetime countdown mo->angle = actor->angle; mo->target = actor->target; mo->momx = actor->momx>>1; mo->momy = actor->momy>>1; mo->momz = actor->momz>>1; }}void A_TeloSpawnB(mobj_t *actor){ mobj_t *mo; mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_TELOTHER_FX3); if (mo) { mo->special1 = TELEPORT_LIFE; // Lifetime countdown mo->angle = actor->angle; mo->target = actor->target; mo->momx = actor->momx>>1; mo->momy = actor->momy>>1; mo->momz = actor->momz>>1; }}void A_TeloSpawnC(mobj_t *actor){ mobj_t *mo; mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_TELOTHER_FX4); if (mo) { mo->special1 = TELEPORT_LIFE; // Lifetime countdown mo->angle = actor->angle; mo->target = actor->target; mo->momx = actor->momx>>1; mo->momy = actor->momy>>1; mo->momz = actor->momz>>1; }}void A_TeloSpawnD(mobj_t *actor){ mobj_t *mo; mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_TELOTHER_FX5); if (mo) { mo->special1 = TELEPORT_LIFE; // Lifetime countdown mo->angle = actor->angle; mo->target = actor->target; mo->momx = actor->momx>>1; mo->momy = actor->momy>>1; mo->momz = actor->momz>>1; }}void A_CheckTeleRing(mobj_t *actor){ if (actor->special1-- <= 0) { P_SetMobjState(actor, actor->info->deathstate); }}// Dirt stuffvoid P_SpawnDirt(mobj_t *actor, fixed_t radius){ fixed_t x,y,z; int dtype=0; mobj_t *mo; angle_t angle; angle = P_Random()<<5; // <<24 >>19 x = actor->x + FixedMul(radius,finecosine[angle]); y = actor->y + FixedMul(radius,finesine[angle]);// x = actor->x + ((P_Random()-P_Random())%radius)<<FRACBITS;// y = actor->y + ((P_Random()-P_Random()<<FRACBITS)%radius); z = actor->z + (P_Random()<<9) + FRACUNIT; switch(P_Random()%6) { case 0: dtype = MT_DIRT1; break; case 1: dtype = MT_DIRT2; break; case 2: dtype = MT_DIRT3; break; case 3: dtype = MT_DIRT4; break; case 4: dtype = MT_DIRT5; break; case 5: dtype = MT_DIRT6; break; } mo = P_SpawnMobj(x,y,z,dtype); if (mo) { mo->momz = P_Random()<<10; }}//===========================================================================//// Thrust floor stuff//// Thrust Spike Variables// special1 pointer to dirt clump mobj// special2 speed of raise// args[0] 0 = lowered, 1 = raised// args[1] 0 = normal, 1 = bloody//===========================================================================void A_ThrustInitUp(mobj_t *actor){ actor->special2 = 5; // Raise speed actor->args[0] = 1; // Mark as up actor->floorclip = 0; actor->flags = MF_SOLID; actor->flags2 = MF2_NOTELEPORT|MF2_FLOORCLIP; actor->special1 = 0L;}void A_ThrustInitDn(mobj_t *actor){ mobj_t *mo; actor->special2 = 5; // Raise speed actor->args[0] = 0; // Mark as down actor->floorclip = actor->info->height; actor->flags = 0; actor->flags2 = MF2_NOTELEPORT|MF2_FLOORCLIP|MF2_DONTDRAW; mo = P_SpawnMobj(actor->x, actor->y, actor->z, MT_DIRTCLUMP); actor->special1 = (int)mo;}void A_ThrustRaise(mobj_t *actor){ if (A_RaiseMobj(actor)) { // Reached it's target height actor->args[0] = 1; if (actor->args[1]) P_SetMobjStateNF(actor, S_BTHRUSTINIT2_1); else P_SetMobjStateNF(actor, S_THRUSTINIT2_1); } // Lose the dirt clump if ((actor->floorclip < actor->height) && actor->special1) { P_RemoveMobj( (mobj_t *)actor->special1 ); actor->special1 = 0; } // Spawn some dirt if (P_Random()<40) P_SpawnDirt(actor, actor->radius); actor->special2++; // Increase raise speed}void A_ThrustLower(mobj_t *actor){ if (A_SinkMobj(actor)) { actor->args[0] = 0; if (actor->args[1]) P_SetMobjStateNF(actor, S_BTHRUSTINIT1_1); else P_SetMobjStateNF(actor, S_THRUSTINIT1_1); }}void A_ThrustBlock(mobj_t *actor){ actor->flags |= MF_SOLID;}void A_ThrustImpale(mobj_t *actor){ // Impale all shootables in radius PIT_ThrustSpike(actor);}//===========================================================================//// A_SoAExplode - Suit of Armor Explode////===========================================================================void A_SoAExplode(mobj_t *actor){ mobj_t *mo; int i; for(i = 0; i < 10; i++) { mo = P_SpawnMobj(actor->x+((P_Random()-128)<<12), actor->y+((P_Random()-128)<<12), actor->z+(P_Random()*actor->height/256), MT_ZARMORCHUNK); P_SetMobjState(mo, mo->info->spawnstate+i); if(mo) { mo->momz = ((P_Random()&7)+5)*FRACUNIT; mo->momx = (P_Random()-P_Random())<<(FRACBITS-6); mo->momy = (P_Random()-P_Random())<<(FRACBITS-6); } } if(actor->args[0]) { // Spawn an item if(!nomonsters || !(mobjinfo[TranslateThingType[actor->args[0]]].flags&MF_COUNTKILL)) { // Only spawn monsters if not -nomonsters P_SpawnMobj(actor->x, actor->y, actor->z, TranslateThingType[actor->args[0]]); } } S_StartSound(mo, SFX_SUITOFARMOR_BREAK); P_RemoveMobj(actor);}//===========================================================================//// A_BellReset1////===========================================================================void A_BellReset1(mobj_t *actor){ actor->flags |= MF_NOGRAVITY; actor->height <<= 2; }//===========================================================================//// A_BellReset2////===========================================================================void A_BellReset2(mobj_t *actor){ actor->flags |= MF_SHOOTABLE; actor->flags &= ~MF_CORPSE; actor->health = 5;}//===========================================================================//// A_FlameCheck////===========================================================================void A_FlameCheck(mobj_t *actor){ if(!actor->args[0]--) // Called every 8 tics { P_SetMobjState(actor, S_NULL); }}//===========================================================================// Bat Spawner Variables// special1 frequency counter// special2 // args[0] frequency of spawn (1=fastest, 10=slowest)// args[1] spread angle (0..255)// args[2] // args[3] duration of bats (in octics)// args[4] turn amount per move (in degrees)//// Bat Variables// special2 lifetime counter// args[4] turn amount per move (in degrees)//===========================================================================void A_BatSpawnInit(mobj_t *actor){ actor->special1 = 0; // Frequency count}void A_BatSpawn(mobj_t *actor){ mobj_t *mo; int delta; angle_t angle; // Countdown until next spawn if (actor->special1-- > 0) return; actor->special1 = actor->args[0]; // Reset frequency count delta = actor->args[1]; if (delta==0) delta=1; angle = actor->angle + (((P_Random()%delta)-(delta>>1))<<24); mo = P_SpawnMissileAngle(actor, MT_BAT, angle, 0); if (mo) { mo->args[0] = P_Random()&63; // floatbob index mo->args[4] = actor->args[4]; // turn degrees mo->special2 = actor->args[3]<<3; // Set lifetime mo->target = actor; }}void A_BatMove(mobj_t *actor){ angle_t newangle; fixed_t speed; if (actor->special2 < 0) { P_SetMobjState(actor, actor->info->deathstate); } actor->special2 -= 2; // Called every 2 tics if (P_Random()<128) { newangle = actor->angle + ANGLE_1*actor->args[4]; } else { newangle = actor->angle - ANGLE_1*actor->args[4]; } // Adjust momentum vector to new direction newangle >>= ANGLETOFINESHIFT; speed = FixedMul(actor->info->speed, P_Random()<<10); actor->momx = FixedMul(speed, finecosine[newangle]); actor->momy = FixedMul(speed, finesine[newangle]); if (P_Random()<15) S_StartSound(actor, SFX_BAT_SCREAM); // Handle Z movement actor->z = actor->target->z + 2*FloatBobOffsets[actor->args[0]]; actor->args[0] = (actor->args[0]+3)&63; }//===========================================================================//// A_TreeDeath////===========================================================================void A_TreeDeath(mobj_t *actor){ if(!(actor->flags2&MF2_FIREDAMAGE)) { actor->height <<= 2; actor->flags |= MF_SHOOTABLE; actor->flags &= ~(MF_CORPSE+MF_DROPOFF); actor->health = 35; return; } else { P_SetMobjState(actor, actor->info->meleestate); }}//===========================================================================//// A_NoGravity////===========================================================================void A_NoGravity(mobj_t *actor){ actor->flags |= MF_NOGRAVITY;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -