Finalized actor_weaponless

This commit is contained in:
smallmodel 2023-10-22 16:34:15 +02:00
parent 0b1e8cdbf3
commit 6eff8bc273
No known key found for this signature in database
GPG key ID: 9F2D623CEDF08512
2 changed files with 67 additions and 55 deletions

View file

@ -550,6 +550,9 @@ enum eActorState_BalconyKilled {
// //
enum eActorState_WeaponLess { enum eActorState_WeaponLess {
ACTOR_STATE_WEAPONLESS_START = ACTOR_STATE_WEAPONLESS, ACTOR_STATE_WEAPONLESS_START = ACTOR_STATE_WEAPONLESS,
ACTOR_STATE_WEAPONLESS_NORMAL = ACTOR_STATE_WEAPONLESS_START,
ACTOR_STATE_WEAPONLESS_GRENADE,
ACTOR_STATE_WEAPONLESS_LOOP
}; };
// //

View file

@ -46,16 +46,16 @@ void Actor::Begin_Weaponless(void)
if (AttackEntryAnimation()) { if (AttackEntryAnimation()) {
m_bLockThinkState = true; m_bLockThinkState = true;
TransitionState(902, 0); TransitionState(ACTOR_STATE_WEAPONLESS_LOOP, 0);
} }
} }
TransitionState(900, 0); TransitionState(ACTOR_STATE_WEAPONLESS_START, 0);
} }
void Actor::Suspend_Weaponless(void) void Actor::Suspend_Weaponless(void)
{ {
if (m_State <= 902) { if (m_State == ACTOR_STATE_WEAPONLESS_GRENADE || m_State == ACTOR_STATE_WEAPONLESS_LOOP) {
TransitionState(900, 0); TransitionState(ACTOR_STATE_WEAPONLESS_START, 0);
} }
} }
@ -65,53 +65,58 @@ void Actor::State_Weaponless_Normal(void)
if (m_bScriptGoalValid) { if (m_bScriptGoalValid) {
SetPath(m_vScriptGoal, NULL, 0, NULL, 0); SetPath(m_vScriptGoal, NULL, 0, NULL, 0);
} }
if (PathExists() && !PathComplete()) { if (PathExists() && !PathComplete()) {
FaceMotion(); FaceMotion();
Anim_RunToDanger(3); Anim_RunToDanger(ANIM_MODE_PATH_GOAL);
} else { return;
}
m_bScriptGoalValid = false; m_bScriptGoalValid = false;
AimAtTargetPos(); AimAtTargetPos();
Anim_Stand(); Anim_Stand();
if (level.inttime >= m_iStateTime) {
if (DecideToThrowGrenade(m_Enemy->velocity + m_Enemy->origin, &m_vGrenadeVel, &m_eGrenadeMode, false)) {
SetDesiredYawDir(m_vGrenadeVel);
m_State = 901; if (level.inttime < m_iStateTime) {
m_eNextAnimMode = ANIM_MODE_NORMAL; return;
m_bNextForceStart = false; }
m_csNextAnimString =
(m_eGrenadeMode == AI_GREN_TOSS_ROLL) ? STRING_ANIM_GRENADETOSS_SCR : STRING_ANIM_GRENADETHROW_SCR; if (DecideToThrowGrenade(m_Enemy->origin + m_Enemy->velocity, &m_vGrenadeVel, &m_eGrenadeMode, false)) {
iStateTime = level.inttime; SetDesiredYawDir(m_vGrenadeVel);
DesiredAnimation(
ANIM_MODE_NORMAL,
m_eGrenadeMode == AI_GREN_TOSS_ROLL ? STRING_ANIM_GRENADETOSS_SCR : STRING_ANIM_GRENADETHROW_SCR
);
TransitionState(ACTOR_STATE_WEAPONLESS_GRENADE);
} else { } else {
m_State = 900; TransitionState(ACTOR_STATE_WEAPONLESS_START, 1000);
iStateTime = level.inttime + 1000;
}
m_iStateTime = iStateTime;
}
} }
} }
void Actor::Think_Weaponless(void) void Actor::Think_Weaponless(void)
{ {
if (RequireThink()) { if (!RequireThink()) {
return;
}
UpdateEyeOrigin(); UpdateEyeOrigin();
NoPoint(); NoPoint();
UpdateEnemy(500); UpdateEnemy(500);
if (m_State == 902) { if (m_State == ACTOR_STATE_WEAPONLESS_LOOP) {
ContinueAnimation(); ContinueAnimation();
} else { } else {
m_bLockThinkState = false; m_bLockThinkState = false;
if (!m_Enemy) { if (!m_Enemy) {
SetThinkState(THINKSTATE_IDLE, THINKLEVEL_IDLE); SetThinkState(THINKSTATE_IDLE, THINKLEVEL_IDLE);
IdleThink(); IdleThink();
return; return;
} }
if (m_State == 900) {
if (m_State == ACTOR_STATE_WEAPONLESS_START) {
State_Weaponless_Normal(); State_Weaponless_Normal();
} else if (m_State == 901) { } else if (m_State == ACTOR_STATE_WEAPONLESS_GRENADE) {
State_Weaponless_Grenade(); State_Weaponless_Grenade();
} else { } else {
Com_Printf("Think_Weaponless: invalid think state %i\n", m_State); Com_Printf("Think_Weaponless: invalid think state %i\n", m_State);
@ -120,19 +125,23 @@ void Actor::Think_Weaponless(void)
Q_strcat(assertStr, sizeof(assertStr), DumpCallTrace("thinkstate = %i", m_State)); Q_strcat(assertStr, sizeof(assertStr), DumpCallTrace("thinkstate = %i", m_State));
assert(!assertStr); assert(!assertStr);
} }
if (!CheckForTransition(THINKSTATE_GRENADE, THINKLEVEL_IDLE)) {
CheckForTransition(THINKSTATE_GRENADE, THINKLEVEL_IDLE); CheckForTransition(THINKSTATE_GRENADE, THINKLEVEL_IDLE);
} }
}
PostThink(true); PostThink(true);
if (GetWeapon(WEAPON_MAIN)) { if (GetWeapon(WEAPON_MAIN)) {
SetThink(THINKSTATE_ATTACK, THINK_TURRET); SetThink(THINKSTATE_ATTACK, THINK_TURRET);
} }
}
} }
void Actor::FinishedAnimation_Weaponless(void) void Actor::FinishedAnimation_Weaponless(void)
{ {
if (m_State <= 902) { if (m_State == ACTOR_STATE_WEAPONLESS_GRENADE || m_State == ACTOR_STATE_WEAPONLESS_LOOP) {
TransitionState(900, 4000); TransitionState(ACTOR_STATE_WEAPONLESS_NORMAL, 4000);
} }
} }