diff --git a/src/dehacked.c b/src/dehacked.c index da806615d..e824b0652 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2225,6 +2225,7 @@ static actionpointer_t actionpointers[] = {{A_ParentTriesToSleep}, "A_PARENTTRIESTOSLEEP"}, {{A_CryingToMomma}, "A_CRYINGTOMOMMA"}, {{A_CheckFlags2}, "A_CHECKFLAGS2"}, + {{A_DoNPCSkid}, "A_DONPCSKID"}, {{A_DoNPCPain}, "A_DONPCPAIN"}, {{A_PrepareRepeat}, "A_PREPAREREPEAT"}, {{A_Boss5ExtraRepeat}, "A_BOSS5EXTRAREPEAT"}, diff --git a/src/info.h b/src/info.h index 4db5d46b2..cb98e6962 100644 --- a/src/info.h +++ b/src/info.h @@ -239,6 +239,7 @@ void A_WhoCaresIfYourSonIsABee(); void A_ParentTriesToSleep(); void A_CryingToMomma(); void A_CheckFlags2(); +void A_DoNPCSkid(); void A_DoNPCPain(); void A_PrepareRepeat(); void A_Boss5ExtraRepeat(); diff --git a/src/p_enemy.c b/src/p_enemy.c index 2fac0fa39..469730483 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -266,6 +266,7 @@ void A_WhoCaresIfYourSonIsABee(mobj_t *actor); void A_ParentTriesToSleep(mobj_t *actor); void A_CryingToMomma(mobj_t *actor); void A_CheckFlags2(mobj_t *actor); +void A_DoNPCSkid(mobj_t *actor); void A_DoNPCPain(mobj_t *actor); void A_PrepareRepeat(mobj_t *actor); void A_Boss5ExtraRepeat(mobj_t *actor); @@ -11861,6 +11862,57 @@ void A_CheckFlags2(mobj_t *actor) P_SetMobjState(actor, (statenum_t)locvar2); } +// Function: A_DoNPCSkid +// +// Description: Something that looks like a player is skidding. +// +// var1 = state to change to upon being slow enough +// var2 = minimum speed +// +void A_DoNPCSkid(mobj_t *actor) +{ + INT32 locvar1 = var1; + INT32 locvar2 = var2; + fixed_t x, y, z; +#ifdef HAVE_BLUA + if (LUA_CallAction("A_DoNPCSkid", actor)) + return; +#endif + + x = actor->x; + y = actor->y; + z = actor->y; + + if (!locvar2) + locvar2 = FRACUNIT/2; + + if ((FixedHypot(actor->momx, actor->momy) < locvar2) + || !P_TryMove(actor, actor->x + actor->momx, actor->y + actor->momy, false)) + { + actor->momx = actor->momy = 0; + P_SetMobjState(actor, locvar1); + return; + } + else + { + actor->momx = (2*actor->momx)/3; + actor->momy = (2*actor->momy)/3; + } + + P_TeleportMove(actor, x, y, z); + + // Spawn a particle every 3 tics. + if (!(leveltime % 3)) + { + mobj_t *particle = P_SpawnMobjFromMobj(actor, 0, 0, 0, MT_SPINDUST); + particle->tics = 10; + + P_SetScale(particle, 2*actor->scale/3); + particle->destscale = actor->scale; + P_SetObjectMomZ(particle, FRACUNIT, false); + } +} + // Function: A_DoNPCPain // // Description: Something that looks like a player was hit, put them in pain.