From 382d8caf6d3649c66d2fef38890f6ea9c1b753fc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 11 Oct 2023 21:39:52 +0200 Subject: [PATCH] move cerberus states into the respective actors. This is also a place where it allows to simplify the code. --- source/core/namedef_custom.h | 30 ++-- source/games/blood/src/actor.cpp | 2 + source/games/blood/src/ai.cpp | 28 ++-- source/games/blood/src/aicerber.cpp | 141 +++--------------- .../zscript/games/blood/actors/dudes.zs | 42 +++--- 5 files changed, 69 insertions(+), 174 deletions(-) diff --git a/source/core/namedef_custom.h b/source/core/namedef_custom.h index 8c6b50fa8..040f405f1 100644 --- a/source/core/namedef_custom.h +++ b/source/core/namedef_custom.h @@ -110,6 +110,17 @@ xx(BurnGoto) xx(BurnSearch) xx(BurnAttack) +xx(Turn) +xx(Search) +xx(Idle) +xx(Chase) +xx(Recoil) +xx(TeslaRecoil) +xx(Goto) +xx(Bite) +xx(Burn) +xx(Burn2) + // Blood state names. Most of these can be removed after the state system refactor is complete. xx(genIdle) xx(genRecoil) @@ -188,25 +199,6 @@ xx(tinycalebSwimRecoil) xx(tinycalebSwimUnused) xx(tinycalebSwimMoveIn) xx(tinycalebSwimTurn) -xx(cerberusIdle) -xx(cerberusSearch) -xx(cerberusChase) -xx(cerberusRecoil) -xx(cerberusTeslaRecoil) -xx(cerberusGoto) -xx(cerberusBite) -xx(cerberusBurn) -xx(cerberus3Burn) -xx(cerberus2Idle) -xx(cerberus2Search) -xx(cerberus2Chase) -xx(cerberus2Recoil) -xx(cerberus2Goto) -xx(cerberus2Bite) -xx(cerberus2Burn) -xx(cerberus4Burn) -xx(cerberusTurn1) -xx(cerberusTurn2) xx(cultistIdle) xx(cultistProneIdle) xx(fanaticProneIdle) diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index 1efc7d42e..bc6530432 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -902,6 +902,7 @@ static void actInitDudes() else act->xspr.health = act->startHealth() << 4; } + act->spr.xint = 0; // not used by default, but if pre-inited it can be used as an internal flag. seqSpawn(act->seqStartName(), act->seqStartID(), act); } @@ -3902,6 +3903,7 @@ static void actCheckDudes() { actor->ChangeType(dmt); actor->xspr.health = actor->startHealth() << 4; + actor->spr.xint = 1; if (actor->GetTarget() != nullptr) aiSetTarget(actor, actor->GetTarget()); aiActivateDude(actor); } diff --git a/source/games/blood/src/ai.cpp b/source/games/blood/src/ai.cpp index fa4dfd092..d9e53c8ce 100644 --- a/source/games/blood/src/ai.cpp +++ b/source/games/blood/src/ai.cpp @@ -720,21 +720,13 @@ void aiActivateDude(DBloodActor* actor) #endif break; case kDudeCerberusTwoHead: - if (actor->GetTarget() == nullptr) - aiNewState(actor, NAME_cerberusSearch); - else - { - aiPlay3DSound(actor, 2300, AI_SFX_PRIORITY_1, -1); - aiNewState(actor, NAME_cerberusChase); - } - break; case kDudeCerberusOneHead: if (actor->GetTarget() == nullptr) - aiNewState(actor, NAME_cerberus2Search); + aiNewState(actor, NAME_Search); else { aiPlay3DSound(actor, 2300, AI_SFX_PRIORITY_1, -1); - aiNewState(actor, NAME_cerberus2Chase); + aiNewState(actor, NAME_Chase); } break; case kDudeHellHound: @@ -1239,15 +1231,12 @@ void RecoilDude(DBloodActor* actor) aiNewState(actor, NAME_gargoyleFRecoil); break; case kDudeCerberusTwoHead: - aiPlay3DSound(actor, 2302 + Random(2), AI_SFX_PRIORITY_2, -1); - if (pDudeExtra->teslaHit && actor->xspr.data3 > actor->startHealth() / 3) - aiNewState(actor, NAME_cerberusTeslaRecoil); - else - aiNewState(actor, NAME_cerberusRecoil); - break; case kDudeCerberusOneHead: aiPlay3DSound(actor, 2302 + Random(2), AI_SFX_PRIORITY_2, -1); - aiNewState(actor, NAME_cerberus2Recoil); + if (pDudeExtra->teslaHit && actor->xspr.data3 > actor->startHealth() / 3 && actor->FindState(NAME_tinycalebTeslaRecoil)) + aiNewState(actor, NAME_TeslaRecoil); + else + aiNewState(actor, NAME_Recoil); break; case kDudeHellHound: aiPlay3DSound(actor, 1302, AI_SFX_PRIORITY_2, -1); @@ -1637,13 +1626,14 @@ void aiInitSprite(DBloodActor* actor) break; case kDudeCerberusTwoHead: { actor->dudeExtra.thinkTime = 0; - aiNewState(actor, NAME_cerberusIdle); + aiNewState(actor, NAME_Idle); break; } case kDudeCerberusOneHead: { if (!VanillaMode()) { + actor->spr.xint = 1; actor->dudeExtra.thinkTime = 0; - aiNewState(actor, NAME_cerberus2Idle); + aiNewState(actor, NAME_Idle); break; } aiNewState(actor, NAME_genIdle); diff --git a/source/games/blood/src/aicerber.cpp b/source/games/blood/src/aicerber.cpp index c4786c423..9ab243f3e 100644 --- a/source/games/blood/src/aicerber.cpp +++ b/source/games/blood/src/aicerber.cpp @@ -98,15 +98,8 @@ void cerberusBurnSeqCallback(DBloodActor* actor) } } } - switch (actor->GetType()) { - case kDudeCerberusTwoHead: - actFireMissile(actor, -Cerberus_XYOff, 0, Aim, kMissileFireballCerberus); - actFireMissile(actor, Cerberus_XYOff, -Cerberus_ZOff, Aim, kMissileFireballCerberus); - break; - case kDudeCerberusOneHead: - actFireMissile(actor, Cerberus_XYOff, -Cerberus_ZOff, Aim, kMissileFireballCerberus); - break; - } + if (actor->spr.xint == 0) actFireMissile(actor, -Cerberus_XYOff, 0, Aim, kMissileFireballCerberus); + actFireMissile(actor, Cerberus_XYOff, -Cerberus_ZOff, Aim, kMissileFireballCerberus); } void cerberusBurnSeqCallback2(DBloodActor* actor) @@ -166,16 +159,8 @@ void cerberusBurnSeqCallback2(DBloodActor* actor) } } } - switch (actor->GetType()) { - - case kDudeCerberusTwoHead: - actFireMissile(actor, Cerberus_XYOff, -Cerberus_ZOff, Aim, kMissileFlameHound); - actFireMissile(actor, -Cerberus_XYOff, 0, Aim2, kMissileFlameHound); - break; - case kDudeCerberusOneHead: - actFireMissile(actor, Cerberus_XYOff, -Cerberus_ZOff, Aim, kMissileFlameHound); - break; - } + actFireMissile(actor, Cerberus_XYOff, -Cerberus_ZOff, Aim, kMissileFlameHound); + if (actor->spr.xint == 0) actFireMissile(actor, -Cerberus_XYOff, 0, Aim2, kMissileFlameHound); } void cerberusThinkSearch(DBloodActor* actor) @@ -186,21 +171,13 @@ void cerberusThinkSearch(DBloodActor* actor) void cerberusThinkTarget(DBloodActor* actor) { - if (!(actor->IsDudeActor())) { - Printf(PRINT_HIGH, "actor->IsDudeActor()"); - return; - } - if (actor->dudeExtra.active && actor->dudeExtra.thinkTime < 10) actor->dudeExtra.thinkTime++; else if (actor->dudeExtra.thinkTime >= 10 && actor->dudeExtra.active) { actor->xspr.goalAng += DAngle45; aiSetTarget(actor, actor->basePoint); - if (actor->GetType() == kDudeCerberusTwoHead) - aiNewState(actor, NAME_cerberusTurn1); - else - aiNewState(actor, NAME_cerberusTurn2); + aiNewState(actor, NAME_Turn); return; } if (Chance(actor->alertChance())) @@ -251,14 +228,7 @@ void cerberusThinkGoto(DBloodActor* actor) aiChooseDirection(actor, nAngle); if (nDist < 32 && absangle(actor->spr.Angles.Yaw, nAngle) < actor->Periphery()) { - switch (actor->GetType()) { - case kDudeCerberusTwoHead: - aiNewState(actor, NAME_cerberusSearch); - break; - case kDudeCerberusOneHead: - aiNewState(actor, NAME_cerberus2Search); - break; - } + aiNewState(actor, NAME_Search); } aiThinkTarget(actor); } @@ -266,14 +236,7 @@ void cerberusThinkGoto(DBloodActor* actor) void cerberusThinkChase(DBloodActor* actor) { if (actor->GetTarget() == nullptr) { - switch (actor->GetType()) { - case kDudeCerberusTwoHead: - aiNewState(actor, NAME_cerberusGoto); - break; - case kDudeCerberusOneHead: - aiNewState(actor, NAME_cerberus2Goto); - break; - } + aiNewState(actor, NAME_Goto); return; } @@ -293,26 +256,12 @@ void cerberusThinkChase(DBloodActor* actor) aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { - switch (actor->GetType()) { - case kDudeCerberusTwoHead: - aiNewState(actor, NAME_cerberusSearch); - break; - case kDudeCerberusOneHead: - aiNewState(actor, NAME_cerberus2Search); - break; - } + aiNewState(actor, NAME_Search); return; } if (target->IsPlayerActor() && powerupCheck(getPlayer(target), kPwUpShadowCloak) > 0) { - switch (actor->GetType()) { - case kDudeCerberusTwoHead: - aiNewState(actor, NAME_cerberusSearch); - break; - case kDudeCerberusOneHead: - aiNewState(actor, NAME_cerberus2Search); - break; - } + aiNewState(actor, NAME_Search); return; } @@ -329,64 +278,29 @@ void cerberusThinkChase(DBloodActor* actor) if (nDist < 0x1b0 && nDist > 0xd0 && nDeltaAngle < DAngle15) { - switch (actor->GetType()) { - case kDudeCerberusTwoHead: - aiNewState(actor, NAME_cerberusBurn); - break; - case kDudeCerberusOneHead: - aiNewState(actor, NAME_cerberus2Burn); - break; - } + aiNewState(actor, NAME_Burn); } else if (nDist < 0xb0 && nDist > 0x50 && nDeltaAngle < DAngle15) { - switch (actor->GetType()) { - case kDudeCerberusTwoHead: - aiNewState(actor, NAME_cerberus3Burn); - break; - case kDudeCerberusOneHead: - aiNewState(actor, NAME_cerberus4Burn); - break; - } + aiNewState(actor, NAME_Burn2); } else if (nDist < 0x20 && nDeltaAngle < DAngle15) { int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); - switch (actor->GetType()) { - case kDudeCerberusTwoHead: - switch (hit) { - case -1: - aiNewState(actor, NAME_cerberusBite); - break; - case 3: - if (actor->GetType() != gHitInfo.actor()->GetType() && gHitInfo.actor()->GetType() != kDudeHellHound) - aiNewState(actor, NAME_cerberusBite); - break; - case 0: - case 4: - break; - default: - aiNewState(actor, NAME_cerberusBite); - break; - } + switch (hit) { + case -1: + aiNewState(actor, NAME_Bite); break; - case kDudeCerberusOneHead: - switch (hit) { - case -1: - aiNewState(actor, NAME_cerberus2Bite); - break; - case 3: - if (actor->GetType() != gHitInfo.actor()->GetType() && gHitInfo.actor()->GetType() != kDudeHellHound) - aiNewState(actor, NAME_cerberus2Bite); - break; - case 0: - case 4: - break; - default: - aiNewState(actor, NAME_cerberus2Bite); - break; - } + case 3: + if (actor->GetType() != gHitInfo.actor()->GetType() && gHitInfo.actor()->GetType() != kDudeHellHound) + aiNewState(actor, NAME_Bite); + break; + case 0: + case 4: + break; + default: + aiNewState(actor, NAME_Bite); break; } } @@ -395,14 +309,7 @@ void cerberusThinkChase(DBloodActor* actor) } } - switch (actor->GetType()) { - case kDudeCerberusTwoHead: - aiNewState(actor, NAME_cerberusGoto); - break; - case kDudeCerberusOneHead: - aiNewState(actor, NAME_cerberus2Goto); - break; - } + aiNewState(actor, NAME_Goto); actor->SetTarget(nullptr); } diff --git a/wadsrc/static/zscript/games/blood/actors/dudes.zs b/wadsrc/static/zscript/games/blood/actors/dudes.zs index ecdde229d..75b258efd 100644 --- a/wadsrc/static/zscript/games/blood/actors/dudes.zs +++ b/wadsrc/static/zscript/games/blood/actors/dudes.zs @@ -132,25 +132,6 @@ class BloodDudeBase : Bloodactor AISTATE "tinycalebSwimUnused", "+8", -1, 120, null, null, calebSwimUnused, calebThinkSwimChase, "tinycalebSwimChase"; AISTATE "tinycalebSwimMoveIn", "+8", -1, 0, null, null, calebSwimMoveIn, calebThinkSwimChase, "tinycalebSwimChase"; AISTATE "tinycalebSwimTurn", "+8", -1, 120, null, null, aiMoveTurn, null, "tinycalebSwimChase"; - AISTATE "cerberusIdle", "+0", 0, 0, null, null, null, cerberusThinkTarget, "none"; - AISTATE "cerberusSearch", "+7", 3, 1800, null, null, aiMoveForward, cerberusThinkSearch, "cerberusIdle"; - AISTATE "cerberusChase", "+7", 4, 0, null, null, aiMoveForward, cerberusThinkChase, "none"; - AISTATE "cerberusRecoil", "+5", 5, 0, null, null, null, null, "cerberusSearch"; - AISTATE "cerberusTeslaRecoil", "+4", 5, 0, null, null, null, null, "cerberusSearch"; - AISTATE "cerberusGoto", "+7", 2, 600, null, null, aiMoveForward, cerberusThinkGoto, "cerberusIdle"; - AISTATE "cerberusBite", "+6", 4, 60, cerberusBiteSeqCallback, null, null, null, "cerberusChase"; - AISTATE "cerberusBurn", "+6", 4, 60, cerberusBurnSeqCallback, null, null, null, "cerberusChase"; - AISTATE "cerberus3Burn", "+6", 4, 60, cerberusBurnSeqCallback2, null, null, null, "cerberusChase"; - AISTATE "cerberus2Idle", "+0", 0, 0, null, null, null, cerberusThinkTarget, "none"; - AISTATE "cerberus2Search", "+7", 3, 1800, null, null, aiMoveForward, cerberusThinkSearch, "cerberus2Idle"; - AISTATE "cerberus2Chase", "+7", 4, 0, null, null, aiMoveForward, cerberusThinkChase, "none"; - AISTATE "cerberus2Recoil", "+5", 5, 0, null, null, null, null, "cerberus2Search"; - AISTATE "cerberus2Goto", "+7", 2, 600, null, null, aiMoveForward, cerberusThinkGoto, "cerberus2Idle"; - AISTATE "cerberus2Bite", "+6", 4, 60, cerberusBiteSeqCallback, null, null, null, "cerberus2Chase"; - AISTATE "cerberus2Burn", "+6", 4, 60, cerberusBurnSeqCallback, null, null, null, "cerberus2Chase"; - AISTATE "cerberus4Burn", "+6", 4, 60, cerberusBurnSeqCallback2, null, null, null, "cerberus2Chase"; - AISTATE "cerberusTurn1", "+7", -1, 120, null, null, aiMoveTurn, null, "cerberusChase"; - AISTATE "cerberusTurn2", "+7", -1, 120, null, null, aiMoveTurn, null, "cerberusChase"; AISTATE "cultistIdle", "+0", 0, 0, null, null, null, aiThinkTarget, "none"; AISTATE "cultistProneIdle", "+17", 0, 0, null, null, null, aiThinkTarget, "none"; AISTATE "fanaticProneIdle", "+17", 0, 0, null, null, null, aiThinkTarget, "none"; @@ -1168,6 +1149,18 @@ class BloodDudeCerberusTwoHead : BloodDudeBase turnrange 67.5; gibtype 7, -1, -1; dmgcontrol 16, 0, 16, 16, 0, 96, 48; + + AISTATE "Turn", "+7", -1, 120, null, null, aiMoveTurn, null, "cerberusChase"; + AISTATE "Search", "+7", 3, 1800, null, null, aiMoveForward, cerberusThinkSearch, "cerberusIdle"; + AISTATE "Idle", "+0", 0, 0, null, null, null, cerberusThinkTarget, "none"; + AISTATE "Chase", "+7", 4, 0, null, null, aiMoveForward, cerberusThinkChase, "none"; + AISTATE "Recoil", "+5", 5, 0, null, null, null, null, "Search"; + AISTATE "TeslaRecoil", "+4", 5, 0, null, null, null, null, "Search"; + AISTATE "Goto", "+7", 2, 600, null, null, aiMoveForward, cerberusThinkGoto, "Idle"; + AISTATE "Bite", "+6", 4, 60, cerberusBiteSeqCallback, null, null, null, "Chase"; + AISTATE "Burn", "+6", 4, 60, cerberusBurnSeqCallback, null, null, null, "Chase"; + AISTATE "Burn2", "+6", 4, 60, cerberusBurnSeqCallback2, null, null, null, "Chase"; + deathMorphType "BloodDudeCerberusOneHead"; +BloodDudeBase.floorhitdamage; preloadseq 6, 7; @@ -1198,6 +1191,17 @@ class BloodDudeCerberusOneHead : BloodDudeBase turnrange 67.5; gibtype 7, -1, -1; dmgcontrol 16, 0, 16, 16, 0, 96, 48; + + AISTATE "Turn", "+7", -1, 120, null, null, aiMoveTurn, null, "cerberusChase"; + AISTATE "Search", "+7", 3, 1800, null, null, aiMoveForward, cerberusThinkSearch, "cerberus2Idle"; + AISTATE "Idle", "+0", 0, 0, null, null, null, cerberusThinkTarget, "none"; + AISTATE "Chase", "+7", 4, 0, null, null, aiMoveForward, cerberusThinkChase, "none"; + AISTATE "Recoil", "+5", 5, 0, null, null, null, null, "cerberus2Search"; + AISTATE "Goto", "+7", 2, 600, null, null, aiMoveForward, cerberusThinkGoto, "Idle"; + AISTATE "Bite", "+6", 4, 60, cerberusBiteSeqCallback, null, null, null, "Chase"; + AISTATE "Burn", "+6", 4, 60, cerberusBurnSeqCallback, null, null, null, "Chase"; + AISTATE "Burn2", "+6", 4, 60, cerberusBurnSeqCallback2, null, null, null, "Chase"; + +BloodDudeBase.floorhitdamage; preloadseq 6, 7; }