diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index cd85ebf59..5ae2a9786 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -1137,61 +1137,28 @@ bool actHealDude(DBloodActor* actor, int add, int threshold) static bool actKillDudeStage1(DBloodActor* actor, DAMAGE_TYPE damageType) { - switch (actor->GetType()) + auto deathmorph = actor->PointerVar("deathmorphtype"); + if (deathmorph) { -#ifdef NOONE_EXTENSIONS - case kDudeModernCustom: - if (actKillModernDude(actor, damageType)) return true; - break; -#endif - case kDudeCerberusTwoHead: // Cerberus - seqSpawn(actor->seqStartName(), actor->seqStartID() + 1, actor, nullptr); + auto morphSeq = actor->IntVar("morphSeqID"); + if (morphSeq != 0) + { + seqSpawn(actor->seqStartName(), actor->seqStartID() + morphSeq, actor, nullptr); + return true; + } + } + if (actor->classflags() & CF_QUICKBURN) + { + auto burn = actor->PointerVar("burntype"); + if (burn && (cl_bloodvanillaenemies || VanillaMode())) + { + auto burn2 = actor->PointerVar("vanillaburntype"); + if (burn2) return false; + } + actor->ChangeType(burn); + aiNewState(actor, NAME_BurnGoto); + actHealDude(actor, actor->startHealth(), actor->startHealth()); return true; - - case kDudeCultistTommy: - case kDudeCultistShotgun: - case kDudeCultistTesla: - case kDudeCultistTNT: - if (damageType == kDamageBurn && actor->xspr.medium == kMediumNormal) - { - actor->ChangeType(kDudeBurningCultist); - aiNewState(actor, NAME_BurnGoto); - actHealDude(actor, actor->startHealth(), actor->startHealth()); - return true; - } - break; - - case kDudeBeast: - if (damageType == kDamageBurn && actor->xspr.medium == kMediumNormal) - { - actor->ChangeType(kDudeBurningBeast); - aiNewState(actor, NAME_BurnGoto); - actHealDude(actor, actor->startHealth(), actor->startHealth()); - return true; - } - break; - - case kDudeInnocent: - if (damageType == kDamageBurn && actor->xspr.medium == kMediumNormal) - { - actor->ChangeType(kDudeBurningInnocent); - aiNewState(actor, NAME_BurnGoto); - actHealDude(actor, actor->startHealth(), actor->startHealth()); - return true; - } - break; - - case kDudeTinyCaleb: - if (cl_bloodvanillaenemies || VanillaMode()) - break; - if (damageType == kDamageBurn && actor->xspr.medium == kMediumNormal) - { - actor->ChangeType(kDudeBurningTinyCaleb); - aiNewState(actor, NAME_BurnGoto); - actHealDude(actor, actor->startHealth(), actor->startHealth()); - return true; - } - break; } return false; } @@ -1433,6 +1400,8 @@ void actKillDude(DBloodActor* killerActor, DBloodActor* actor, DAMAGE_TYPE damag { assert(actor->IsDudeActor()&& actor->hasX()); + // if (onKill(killerActor, actor, damageType, damage)) return; // call an optional script handler. + if (actKillDudeStage1(actor, damageType)) return; for (int p = connecthead; p >= 0; p = connectpoint2[p]) @@ -2267,7 +2236,7 @@ static void checkCeilHit(DBloodActor* actor) bool IsBurningDude(DBloodActor* actor) { if (actor == nullptr || !actor->IsDudeActor()) return false; - return actor->classflags() & 1; + return actor->classflags() & CF_BURNING; } //--------------------------------------------------------------------------- @@ -2404,7 +2373,7 @@ static void checkFloorHit(DBloodActor* actor) } break; default: - if (actor2->IsDudeActor() && (actor2->classflags() & 2)) + if (actor2->IsDudeActor() && (actor2->classflags() & CF_FLOORHITDAMAGE)) if (pPlayer && !isShrunk(actor)) actDamageSprite(actor, actor2, kDamageBullet, 8); break; diff --git a/source/games/blood/src/bloodactor.h b/source/games/blood/src/bloodactor.h index e32a3c0b2..8544f0d86 100644 --- a/source/games/blood/src/bloodactor.h +++ b/source/games/blood/src/bloodactor.h @@ -34,6 +34,13 @@ struct SPRITEHIT class DBloodActor; +enum classflags +{ + CF_BURNING = 1, + CF_FLOORHITDAMAGE = 2, + CF_QUICKBURN = 4, +}; + class DBloodActor : public DCoreActor { DECLARE_CLASS(DBloodActor, DCoreActor) @@ -263,6 +270,7 @@ public: return *(int*)(GetClass()->Meta + o_classflags); } + /* int hinderDamage; // recoil damage int changeTarget; // chance to change target when attacked someone else diff --git a/wadsrc/static/zscript/games/blood/actors/dudes.zs b/wadsrc/static/zscript/games/blood/actors/dudes.zs index 950ce3fc3..d40848dc7 100644 --- a/wadsrc/static/zscript/games/blood/actors/dudes.zs +++ b/wadsrc/static/zscript/games/blood/actors/dudes.zs @@ -23,7 +23,10 @@ class BloodDudeBase : Bloodactor meta int classflags; meta Sound explodeSound; + meta int morphSeqID; // always an index meta class deathMorphType; + meta class burnType; + meta class vanillaBurnType; property prefix: none; property seqStartName: seqStartName; @@ -46,11 +49,15 @@ class BloodDudeBase : Bloodactor property sideSpeed: sideSpeed; property backSpeed: backSpeed; property turnRange: turnRange; + property burnType: burnType; + property vanillaBurnType: vanillaBurnType; + property morphSeqID: morphSeqID; property explodeSound: explodeSound; property deathMorphType: deathMorphType; flagdef burning: classflags, 0; flagdef floorhitdamage: classflags, 1; + flagdef quickburn: classflags, 2; default @@ -393,7 +400,9 @@ class BloodDudeCultistTommy : BloodDudeBase explodesound 717; +BloodDudeBase.floorhitdamage; + +BloodDudeBase.quickBurn; preloadseq 6, 7, 8, 9, 13, 14, 15; + BurnType "BloodDudeBurningCultist"; } } @@ -426,7 +435,9 @@ class BloodDudeCultistShotgun : BloodDudeBase explodesound 717; +BloodDudeBase.floorhitdamage; + +BloodDudeBase.quickBurn; preloadseq 6, 7, 8, 9, 13, 14, 15; + BurnType "BloodDudeBurningCultist"; } } @@ -458,6 +469,7 @@ class BloodDudeZombieAxeNormal : BloodDudeBase dmgcontrol 256, 256, 112, 256, 256, 256, 160; +BloodDudeBase.floorhitdamage; preloadseq 6, 7, 8, 11, 13, 14; + BurnType "BloodDudeBurningZombieAxe"; } } @@ -489,6 +501,7 @@ class BloodDudeZombieButcher : BloodDudeBase dmgcontrol 256, 256, 32, 128, 256, 64, 128; +BloodDudeBase.floorhitdamage; preloadseq 6, 7, 8, 9, 10, 11; + BurnType "BloodDudeBurningZombieButcher"; } } @@ -520,6 +533,7 @@ class BloodDudeZombieAxeBuried : BloodDudeBase dmgcontrol 256, 256, 112, 256, 256, 256, 256; +BloodDudeBase.floorhitdamage; preloadseq 12, 9, 10; + BurnType "BloodDudeBurningZombieAxe"; } } @@ -1162,6 +1176,7 @@ class BloodDudeCerberusTwoHead : BloodDudeBase AISTATE "Burn2", "+6", 4, 60, cerberusBurnSeqCallback2, null, null, null, "Chase"; deathMorphType "BloodDudeCerberusOneHead"; + morphseqId 1; +BloodDudeBase.floorhitdamage; preloadseq 6, 7; } @@ -1469,6 +1484,8 @@ class BloodDudeInnocent : BloodDudeBase dmgcontrol 288, 288, 288, 288, 288, 288, 288; explodesound 717; + +BloodDudeBase.quickBurn; + BurnType "BloodDudeBurningInnocent"; } } @@ -1530,6 +1547,8 @@ class BloodDudeCultistTesla : BloodDudeBase explodesound 717; preloadseq 6, 7, 8, 9, 13, 14, 15; + +BloodDudeBase.quickBurn; + BurnType "BloodDudeBurningCultist"; } } @@ -1562,6 +1581,8 @@ class BloodDudeCultistTNT : BloodDudeBase explodesound 717; preloadseq 6, 7, 8, 9, 13, 14, 15; + +BloodDudeBase.quickBurn; + BurnType "BloodDudeBurningCultist"; } } @@ -1621,6 +1642,9 @@ class BloodDudeTinyCaleb : BloodDudeBase turnrange 67.5; gibtype 7, -1, -1; dmgcontrol 160, 160, 160, 160, 256, 128, 288; + +BloodDudeBase.quickBurn; + VanillaBurnType "BloodDudeBurningInnocent"; + BurnType "BloodDudeBurningTinyCaleb"; explodesound 717; }