diff --git a/doomsday/apps/libdoomsday/include/doomsday/world/mobjthinkerdata.h b/doomsday/apps/libdoomsday/include/doomsday/world/mobjthinkerdata.h index 366786719e..09889423ff 100644 --- a/doomsday/apps/libdoomsday/include/doomsday/world/mobjthinkerdata.h +++ b/doomsday/apps/libdoomsday/include/doomsday/world/mobjthinkerdata.h @@ -49,6 +49,15 @@ class LIBDOOMSDAY_PUBLIC MobjThinkerData : public ThinkerData */ virtual void stateChanged(state_t const *previousState); + /** + * Called whenever the mobj receives damage. This is a notification of + * damage already received. + * + * @param points Amount of damage. + * @param direction If not @c nullptr, identifies the source of the damage. + */ + virtual void damageReceived(int points, mobj_t const *inflictor); + private: DENG2_PRIVATE(d) }; diff --git a/doomsday/apps/libdoomsday/src/world/mobjthinkerdata.cpp b/doomsday/apps/libdoomsday/src/world/mobjthinkerdata.cpp index 33d482d860..ca3ea7a24e 100644 --- a/doomsday/apps/libdoomsday/src/world/mobjthinkerdata.cpp +++ b/doomsday/apps/libdoomsday/src/world/mobjthinkerdata.cpp @@ -70,3 +70,6 @@ void MobjThinkerData::stateChanged(state_t const *) { // overridden } + +void MobjThinkerData::damageReceived(int, mobj_t const *) +{} diff --git a/doomsday/apps/plugins/common/include/mobj.h b/doomsday/apps/plugins/common/include/mobj.h index d172a801ff..e6eb601c2c 100644 --- a/doomsday/apps/plugins/common/include/mobj.h +++ b/doomsday/apps/plugins/common/include/mobj.h @@ -214,6 +214,8 @@ mobj_t *Mobj_LaunchMissileAtAngle (mobj_t *mob, mobj_t *missile, angle_t angle, mobj_t *Mobj_LaunchMissile2(mobj_t *mob, mobj_t *missile, coord_t const targetPos[3], coord_t const sourcePos[3], coord_t extraMomZ); mobj_t *Mobj_LaunchMissile (mobj_t *mob, mobj_t *missile, coord_t const targetPos[3], coord_t const sourcePos[3]/*, coord_t extraMomZ = 0*/); +void Mobj_InflictDamage(mobj_t *mob, mobj_t const *inflictor, int damage); + #ifdef __cplusplus } // extern "C" #endif diff --git a/doomsday/apps/plugins/common/src/mobj.cpp b/doomsday/apps/plugins/common/src/mobj.cpp index 1ae9f87247..aa4c69d392 100644 --- a/doomsday/apps/plugins/common/src/mobj.cpp +++ b/doomsday/apps/plugins/common/src/mobj.cpp @@ -29,6 +29,7 @@ #include "mobj.h" #include +#include #include #include "dmu_lib.h" #include "mapstatereader.h" @@ -1020,3 +1021,14 @@ mobj_t *Mobj_LaunchMissile(mobj_t *mob, mobj_t *missile, coord_t const targetPos { return Mobj_LaunchMissile2(mob, missile, targetPos, sourcePos, 0/*no extra z-momentum*/); } + +void Mobj_InflictDamage(mobj_t *mob, mobj_t const *inflictor, int damage) +{ + DENG_ASSERT(mob); + + // Do the damage. + mob->health -= damage; + + // Notify the engine. + THINKER_DATA(mob->thinker, MobjThinkerData).damageReceived(damage, inflictor); +} diff --git a/doomsday/apps/plugins/doom/src/p_inter.c b/doomsday/apps/plugins/doom/src/p_inter.c index 0326f5e57e..6b2a69f3c8 100644 --- a/doomsday/apps/plugins/doom/src/p_inter.c +++ b/doomsday/apps/plugins/doom/src/p_inter.c @@ -1249,12 +1249,8 @@ int P_DamageMobj2(mobj_t *target, mobj_t *inflictor, mobj_t *source, ST_HUDUnHide(player - players, HUE_ON_DAMAGE); } - // How about some particles, yes? - // Only works when both target and inflictor are real mobjs. - Mobj_SpawnDamageParticleGen(target, inflictor, damage); + Mobj_InflictDamage(target, inflictor, damage); - // Do the damage. - target->health -= damage; if(target->health > 0) { // Still alive, phew! if((P_Random() < target->info->painChance) && diff --git a/doomsday/apps/plugins/doom64/src/p_inter.c b/doomsday/apps/plugins/doom64/src/p_inter.c index a9133d0d3a..a0d579eff1 100644 --- a/doomsday/apps/plugins/doom64/src/p_inter.c +++ b/doomsday/apps/plugins/doom64/src/p_inter.c @@ -1197,12 +1197,8 @@ int P_DamageMobj2(mobj_t *target, mobj_t *inflictor, mobj_t *source, ST_HUDUnHide(player - players, HUE_ON_DAMAGE); } - // How about some particles, yes? - // Only works when both target and inflictor are real mobjs. - Mobj_SpawnDamageParticleGen(target, inflictor, damage); + Mobj_InflictDamage(target, inflictor, damage); - // Do the damage. - target->health -= damage; if(target->health > 0) { // Still alive, phew! if((P_Random() < target->info->painChance) && diff --git a/doomsday/apps/plugins/heretic/src/p_inter.c b/doomsday/apps/plugins/heretic/src/p_inter.c index 45f8534084..160b1156e7 100644 --- a/doomsday/apps/plugins/heretic/src/p_inter.c +++ b/doomsday/apps/plugins/heretic/src/p_inter.c @@ -1566,12 +1566,8 @@ int P_DamageMobj2(mobj_t *target, mobj_t *inflictor, mobj_t *source, ST_HUDUnHide(player - players, HUE_ON_DAMAGE); } - // How about some particles, yes? - // Only works when both target and inflictor are real mobjs. - Mobj_SpawnDamageParticleGen(target, inflictor, damage); + Mobj_InflictDamage(target, inflictor, damage); - // Do the damage. - target->health -= damage; if(target->health > 0) { // Still alive, phew! diff --git a/doomsday/apps/plugins/hexen/src/p_inter.c b/doomsday/apps/plugins/hexen/src/p_inter.c index 93e0aa363e..88400cb0d6 100644 --- a/doomsday/apps/plugins/hexen/src/p_inter.c +++ b/doomsday/apps/plugins/hexen/src/p_inter.c @@ -2308,12 +2308,8 @@ int P_DamageMobj2(mobj_t *target, mobj_t *inflictor, mobj_t *source, int damageP R_UpdateViewFilter(player - players); } - // How about some particles, yes? - // Only works when both target and inflictor are real mobjs. - Mobj_SpawnDamageParticleGen(target, inflictor, damage); + Mobj_InflictDamage(target, inflictor, damage); - // Do the damage. - target->health -= damage; if(target->health > 0) { // Still alive, phew! if((P_Random() < target->info->painChance) &&