CFlyingPirate: Fixes; implement all functions

This commit is contained in:
Luke Street 2020-03-13 15:22:21 -04:00
parent 13d8c3fdd1
commit 1bcd0916ca
2 changed files with 133 additions and 49 deletions

View File

@ -195,8 +195,8 @@ CFlyingPirate::CFlyingPirate(TUniqueId uid, std::string_view name, const CEntity
, x6a0_28_(false)
, x6a0_29_checkForProjectiles(false)
, x6a0_30_(false)
, x6a0_31_(true)
, x6a1_24_(false)
, x6a0_31_canSeePlayer(true)
, x6a1_24_prevInCineCam(false)
, x6a1_25_(false)
, x6a1_26_isAttackingObject(false)
, x6a1_27_(false)
@ -261,6 +261,7 @@ void CFlyingPirate::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CSt
if (x450_bodyController->GetPercentageFrozen() == 0.f && !x400_28_pendingMassiveDeath && !x6a1_30_) {
SetMomentumWR({0.f, 0.f, -GetGravityConstant() * xe8_mass});
}
x7ec_burstFire.SetBurstType(0);
break;
case EScriptObjectMessage::Registered:
x86c_ = x568_data.xc0_ * mgr.GetActiveRandom()->Float() + x568_data.xbc_;
@ -294,10 +295,9 @@ void CFlyingPirate::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CSt
if (dist.z() < 0.f) {
zeus::CVector3f velocity = GetVelocity();
const float gravity = GetGravityConstant();
float fVar1 = (2.f * gravity) * dist.z() - (velocity.z() * velocity.z());
float fVar2 = -fVar1;
float fVar2 = -(2.f * gravity) * dist.z() - (velocity.z() * velocity.z());
float fVar3 = 0.f;
if (0.f != -fVar1) {
if (0.f != fVar2) {
fVar3 = fVar2 * (1.f / std::sqrt(fVar2));
}
float dVar9 = (-velocity.z() + fVar3) / gravity;
@ -382,7 +382,7 @@ void CFlyingPirate::Attack(CStateManager& mgr, EStateMsg msg, float arg) {
TryCommand(mgr, pas::EAnimationState::ProjectileAttack, &CPatterned::TryProjectileAttack, 1);
x450_bodyController->FaceDirection((mgr.GetPlayer().GetTranslation() - GetTranslation()).normalized(), arg);
DeliverGetUp();
UpdateCantSeePlayer(mgr);
UpdateCanSeePlayer(mgr);
break;
case EStateMsg::Deactivate:
x32c_animState = EAnimState::NotReady;
@ -547,7 +547,7 @@ void CFlyingPirate::Dodge(CStateManager& mgr, EStateMsg msg, float arg) {
UpdateParticleEffects(mgr, 1.f, true);
} else if (msg == EStateMsg::Update) {
TryCommand(mgr, pas::EAnimationState::Step, &CPatterned::TryDodge, static_cast<int>(x84c_dodgeDirection));
UpdateCantSeePlayer(mgr);
UpdateCanSeePlayer(mgr);
x898_ = std::max(1.f, 2.f - x330_stateMachineState.GetTime());
DeliverGetUp();
} else if (msg == EStateMsg::Deactivate) {
@ -888,7 +888,7 @@ bool CFlyingPirate::Landed(CStateManager& mgr, float arg) {
return x450_bodyController->GetCurrentStateId() == pas::EAnimationState::LieOnGround;
}
bool CFlyingPirate::LineOfSight(CStateManager& mgr, float arg) { return !x6a0_31_; }
bool CFlyingPirate::LineOfSight(CStateManager& mgr, float arg) { return !x6a0_31_canSeePlayer; }
bool CFlyingPirate::LineOfSightTest(CStateManager& mgr, const zeus::CVector3f& start, const zeus::CVector3f& end,
CMaterialList exclude) {
@ -914,7 +914,7 @@ bool CFlyingPirate::Listen(const zeus::CVector3f& pos, EListenNoiseType type) {
void CFlyingPirate::Lurk(CStateManager& mgr, EStateMsg msg, float arg) {
if (msg == EStateMsg::Activate) {
ReleaseCoverPoint(mgr, x6a4_currentCoverPoint);
x6a0_31_ = true;
x6a0_31_canSeePlayer = true;
x7d8_ = 0.f;
x7dc_ = 0;
CTeamAiMgr::ResetTeamAiRole(CTeamAiMgr::EAttackType::Ranged, mgr, x890_teamAiMgr, x8_uid, true);
@ -922,7 +922,7 @@ void CFlyingPirate::Lurk(CStateManager& mgr, EStateMsg msg, float arg) {
UpdateParticleEffects(mgr, 0.f, true);
x6a2_25_aggressionChecked = false;
} else if (msg == EStateMsg::Update) {
UpdateCantSeePlayer(mgr);
UpdateCanSeePlayer(mgr);
if (x32c_animState != EAnimState::NotReady) {
TryCommand(mgr, pas::EAnimationState::Turn, &CPatterned::TryTurn, 0);
}
@ -992,7 +992,7 @@ void CFlyingPirate::PathFind(CStateManager& mgr, EStateMsg msg, float arg) {
const zeus::CVector3f& face = (GetTargetPos(mgr) - GetTranslation()).normalized();
x450_bodyController->GetCommandMgr().DeliverCmd(CBCLocomotionCmd(move, face, 1.f));
UpdateCantSeePlayer(mgr);
UpdateCanSeePlayer(mgr);
} else if (msg == EStateMsg::Deactivate) {
x6a1_29_isMoving = false;
}
@ -1022,7 +1022,7 @@ void CFlyingPirate::Patrol(CStateManager& mgr, EStateMsg msg, float arg) {
if (x30c_behaviourOrient == EBehaviourOrient::Constant) {
x450_bodyController->GetCommandMgr().SetTargetVector(GetTargetPos(mgr) - GetTranslation());
}
UpdateCantSeePlayer(mgr);
UpdateCanSeePlayer(mgr);
} else if (msg == EStateMsg::Deactivate) {
x450_bodyController->GetCommandMgr().SetSteeringBlendMode(ESteeringBlendMode::Normal);
}
@ -1109,7 +1109,7 @@ void CFlyingPirate::Retreat(CStateManager& mgr, EStateMsg msg, float arg) {
const zeus::CVector3f& face = (GetTargetPos(mgr) - GetTranslation()).normalized();
x450_bodyController->GetCommandMgr().DeliverCmd(CBCLocomotionCmd(move, face, 1.f));
UpdateCantSeePlayer(mgr);
UpdateCanSeePlayer(mgr);
}
}
@ -1289,25 +1289,114 @@ void CFlyingPirate::DeliverGetUp() {
}
}
void CFlyingPirate::UpdateCantSeePlayer(CStateManager& mgr) {
// TODO
void CFlyingPirate::UpdateCanSeePlayer(CStateManager& mgr) {
int iVar3 = x7dc_;
int iVar1 = iVar3 / 7 + (iVar3 >> 0x1f) * 7;
// x7dc % 7 == ?
if (iVar3 == (iVar1 - (iVar1 >> 0x1f)) * 7) {
bool bVar4 = true;
const zeus::CVector3f& start = GetGunEyePos() - x34_transform.rightVector();
const zeus::CVector3f& end = GetAimPosition(mgr, 0.f);
const CMaterialList matList(EMaterialTypes::Player, EMaterialTypes::ProjectilePassthrough);
if (LineOfSightTest(mgr, start, end, matList)) {
bVar4 = !LineOfSightTest(mgr, start, end, matList);
}
x6a0_31_canSeePlayer = bVar4;
}
x7dc_++;
}
void CFlyingPirate::TargetPatrol(CStateManager& mgr, EStateMsg msg, float arg) {
// TODO
CPatterned::TargetPatrol(mgr, msg, arg);
if (msg == EStateMsg::Activate) {
x450_bodyController->GetCommandMgr().SetSteeringBlendMode(ESteeringBlendMode::Normal);
x2dc_destObj = GetWaypointForState(mgr, EScriptObjectState::Attack, EScriptObjectMessage::Follow);
if (x2dc_destObj != kInvalidUniqueId) {
if (TCastToPtr<CScriptWaypoint> waypoint = mgr.ObjectById(x2dc_destObj)) {
x30c_behaviourOrient = EBehaviourOrient(waypoint->GetBehaviourOrient());
x3b0_moveSpeed = waypoint->GetSpeed();
}
}
x8a0_patrolTarget = x2dc_destObj;
x8a4_ = 0.f;
} else if (msg == EStateMsg::Update) {
if (x2dc_destObj != x8a0_patrolTarget) {
x8a0_patrolTarget = x2dc_destObj;
x8a4_ = 0.f;
}
if (x2d8_patrolState == EPatrolState::Patrol) {
float f80 = x3b0_moveSpeed * x568_data.xc4_;
x8a4_ = std::min(arg * f80 + x8a4_, f80);
x87c_ = (arg * x8a4_ * arg) * (x2e0_destPos - GetTranslation()).normalized();
x898_ = 1.5f * x3b0_moveSpeed;
x870_ += x87c_;
}
if (x30c_behaviourOrient == EBehaviourOrient::Constant) {
x450_bodyController->GetCommandMgr().SetTargetVector(GetTargetPos(mgr) - GetTranslation());
}
UpdateCanSeePlayer(mgr);
}
}
void CFlyingPirate::Taunt(CStateManager& mgr, EStateMsg msg, float arg) {
// TODO
if (msg == EStateMsg::Activate) {
x6a0_28_ = true;
x7a0_boneTracking.SetActive(true);
x7a0_boneTracking.SetTarget(x8_uid);
bool foundPirate = false;
for (const auto& obj : *mgr.ObjectListById(EGameObjectList::AiWaypoint)) {
if (const CSpacePirate* const pirate = CPatterned::CastTo<CSpacePirate>(obj)) {
if (pirate->GetEnableAim() && pirate->IsAlive() && pirate->GetAreaIdAlways() == x4_areaId &&
(pirate->GetTranslation() - GetTranslation()).magSquared() <
x568_data.x4_hearingDistance * x568_data.x4_hearingDistance) {
foundPirate = true;
}
}
}
x79c_ = foundPirate ? 0 : 1;
if (x7e8_targetId == kInvalidUniqueId) {
x7e8_targetId = mgr.GetPlayer().GetUniqueId();
}
} else if (msg == EStateMsg::Deactivate) {
if (x79c_ == 0) {
mgr.InformListeners(GetTranslation(), EListenNoiseType::PlayerFire);
}
}
}
void CFlyingPirate::TurnAround(CStateManager& mgr, EStateMsg msg, float arg) {
// TODO
if (msg == EStateMsg::Activate) {
x2e0_destPos = GetTargetPos(mgr);
if (x34_transform.frontVector().dot((x2e0_destPos - GetTranslation()).normalized()) < 0.8f) {
x32c_animState = EAnimState::Ready;
}
} else if (msg == EStateMsg::Update) {
TryCommand(mgr, pas::EAnimationState::Turn, &CPatterned::TryTurn, 0);
} else if (msg == EStateMsg::Deactivate) {
x32c_animState = EAnimState::NotReady;
}
}
void CFlyingPirate::Walk(CStateManager& mgr, EStateMsg msg, float arg) {
// TODO
if (msg == EStateMsg::Activate) {
UpdateParticleEffects(mgr, 0.f, false);
} else if (msg == EStateMsg::Update) {
if (x32c_animState != EAnimState::Ready) {
TryCommand(mgr, pas::EAnimationState::Turn, &CPatterned::TryTurn, 0);
}
if (x32c_animState != EAnimState::Repeat) {
x2e0_destPos = GetTargetPos(mgr);
zeus::CVector3f dist = x2e0_destPos - GetTranslation();
dist.z() = 0.f;
if (x34_transform.frontVector().dot(dist.normalized()) < 0.8f) {
x32c_animState = EAnimState::Ready;
}
}
} else if (msg == EStateMsg::Deactivate) {
x32c_animState = EAnimState::NotReady;
x450_bodyController->SetLocomotionType(pas::ELocomotionType::Combat);
x328_25_verticalMovement = true;
x150_momentum.zeroOut();
}
}
void CFlyingPirate::Think(float dt, CStateManager& mgr) {
@ -1321,23 +1410,20 @@ void CFlyingPirate::Think(float dt, CStateManager& mgr) {
x328_25_verticalMovement = true;
}
}
bool bVar17 = mgr.GetCameraManager()->IsInCinematicCamera();
if (!bVar17 || x6a1_24_) {
if (!bVar17 && x6a1_24_) {
AddMaterial(EMaterialTypes::AIBlock, mgr);
const CMaterialFilter& filter = GetMaterialFilter();
CMaterialList includes = filter.GetIncludeList();
includes.Add(EMaterialTypes::AIBlock);
SetMaterialFilter(CMaterialFilter::MakeIncludeExclude(includes, filter.GetExcludeList()));
}
} else {
bool inCineCam = mgr.GetCameraManager()->IsInCinematicCamera();
if (inCineCam && !x6a1_24_prevInCineCam) {
RemoveMaterial(EMaterialTypes::AIBlock, mgr);
const CMaterialFilter& filter = GetMaterialFilter();
CMaterialList includes = filter.GetIncludeList();
includes.Remove(EMaterialTypes::AIBlock);
SetMaterialFilter(CMaterialFilter::MakeIncludeExclude(includes, filter.GetExcludeList()));
CMaterialFilter filter = GetMaterialFilter();
filter.IncludeList().Remove(EMaterialTypes::AIBlock);
SetMaterialFilter(filter);
} else if (!inCineCam && x6a1_24_prevInCineCam) {
AddMaterial(EMaterialTypes::AIBlock, mgr);
CMaterialFilter filter = GetMaterialFilter();
filter.IncludeList().Add(EMaterialTypes::AIBlock);
SetMaterialFilter(filter);
}
x6a1_24_ = bVar17;
x6a1_24_prevInCineCam = inCineCam;
for (const auto& gen : x684_particleGens) {
gen->Update(dt);
@ -1371,10 +1457,10 @@ void CFlyingPirate::Think(float dt, CStateManager& mgr) {
x86c_ = std::max(0.f, x86c_ - dt);
x860_ = std::max(0.f, x860_ - dt);
x888_ = std::max(0.f, x888_ - dt);
if (x6a0_31_) {
x7d8_ = 0.f;
} else {
if (x6a0_31_canSeePlayer) {
x7d8_ += dt;
} else {
x7d8_ = 0.f;
}
if (x400_25_alive) {
CheckForProjectiles(mgr);
@ -1472,20 +1558,18 @@ LAB_801f7bb8:
if (vf8.canBeNormalized()) {
vf8.normalize();
}
float f290 = 0.333f * x87c_.magnitude();
zeus::CVector3f v1cc = std::min(f290, 0.333f) * vf8;
const zeus::CVector3f& origin = GetTranslation();
const zeus::CVector3f& v104 = (zeus::skUp + v1cc).normalized();
float f26c = std::abs(zeus::CVector3f::getAngleDiff(origin, v104));
zeus::CVector3f v1d0 = std::min(0.333f * x87c_.magnitude(), 0.333f) * vf8;
const zeus::CVector3f& v104 = (zeus::skUp + v1d0).normalized();
const zeus::CVector3f& v110 = x34_transform.upVector();
float f26c = std::abs(zeus::CVector3f::getAngleDiff(v110, v104));
if (f26c > 0.f) {
float f1f4 = std::min(f26c, 30.f * zeus::degToRad(dt)); // ?
float f200 = f26c - f1f4;
zeus::CVector3f v1dc = (f1f4 * v104 + (f200 * origin)).normalized();
zeus::CVector3f v1dc = (f1f4 * v104 + (f200 * v110)).normalized();
zeus::CVector3f v128 = x34_transform.frontVector().cross(v1dc);
zeus::CVector3f v20c = v1dc.cross(v128).normalized();
zeus::CVector3f v128_2 = v20c.cross(v1dc);
x34_transform = zeus::CTransform(v128_2, v20c, v1dc, origin);
x34_transform = zeus::CTransform(v128_2, v20c, v1dc, GetTranslation());
xe4_27_notInSortedLists = true;
xe4_28_transformDirty = true;
xe4_29_actorLightsDirty = true;

View File

@ -147,8 +147,8 @@ private:
bool x6a0_28_ : 1;
bool x6a0_29_checkForProjectiles : 1;
bool x6a0_30_ : 1;
bool x6a0_31_ : 1;
bool x6a1_24_ : 1;
bool x6a0_31_canSeePlayer : 1;
bool x6a1_24_prevInCineCam : 1;
bool x6a1_25_ : 1;
bool x6a1_26_isAttackingObject : 1;
bool x6a1_27_ : 1;
@ -206,7 +206,7 @@ private:
void UpdateLandingSmoke(CStateManager& mgr, bool active);
void UpdateParticleEffects(CStateManager& mgr, float intensity, bool active);
void DeliverGetUp();
void UpdateCantSeePlayer(CStateManager& mgr);
void UpdateCanSeePlayer(CStateManager& mgr);
void AddToTeam(CStateManager& mgr);
void RemoveFromTeam(CStateManager& mgr);
};