CElitePirate: DoUserAnimEvent; create CShockWave

This commit is contained in:
Luke Street 2020-03-26 18:09:50 -04:00
parent 6150548e91
commit 0886a39d81
5 changed files with 221 additions and 52 deletions

View File

@ -255,16 +255,70 @@ const CDamageVulnerability* CElitePirate::GetDamageVulnerability(const zeus::CVe
}
zeus::CVector3f CElitePirate::GetOrbitPosition(const CStateManager& mgr) const {
return CPatterned::GetOrbitPosition(mgr);
if (x772_launcherId != kInvalidUniqueId &&
mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::Thermal) {
if (const CActor* actor = static_cast<const CActor*>(mgr.GetObjectById(x772_launcherId))) {
return sub_80228864(actor);
}
}
if (sub_802273a8()) {
if (TCastToConstPtr<CCollisionActor> actor = mgr.GetObjectById(x770_collisionHeadId)) {
return actor->GetTranslation();
}
}
return GetLctrTransform("lockon_target_LCTR").origin;
}
zeus::CVector3f CElitePirate::GetAimPosition(const CStateManager& mgr, float dt) const {
return CPatterned::GetAimPosition(mgr, dt);
std::shared_ptr<CPlayerState> playerState = mgr.GetPlayerState();
if (x5d4_collisionActorMgr1->GetActive() && playerState->IsFiringComboBeam() &&
playerState->GetCurrentBeam() == CPlayerState::EBeamId::Wave) {
if (TCastToConstPtr<CCollisionActor> actor = mgr.GetObjectById(x79c_)) {
return actor->GetTranslation();
}
}
return GetOrbitPosition(mgr);
}
void CElitePirate::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, EUserEventType type, float dt) {
bool handled = false;
switch (type) {
case EUserEventType::Projectile:
if (x772_launcherId != kInvalidUniqueId) {
CEntity* launcher = mgr.ObjectById(x772_launcherId);
mgr.SendScriptMsg(launcher, GetUniqueId(), EScriptObjectMessage::Action);
}
handled = true;
break;
case EUserEventType::DamageOn:
handled = true;
x988_24_ = true;
break;
case EUserEventType::DamageOff:
handled = true;
x988_24_ = false;
break;
case EUserEventType::ScreenShake:
sub_802273a8();
handled = true;
break;
case EUserEventType::BeginAction: {
zeus::CTransform xf; // TODO
mgr.AddObject(new CShockWave(mgr.AllocateUniqueId(), "Shock Wave", {GetAreaIdAlways(), CEntity::NullConnectionList},
xf, GetUniqueId(), GetShockWaveData(), sub_802273b0() ? 2.f : 1.3f,
sub_802273b0() ? 0.4f : 0.5f));
break;
}
case EUserEventType::BecomeShootThrough:
// TODO
break;
default:
break;
}
if (!handled) {
CPatterned::DoUserAnimEvent(mgr, node, type, dt);
}
}
const CCollisionPrimitive* CElitePirate::GetCollisionPrimitive() const { return &x738_; }
@ -545,4 +599,9 @@ void CElitePirate::sub_80228920(CStateManager& mgr, bool b, TUniqueId uid) {
mgr.SendScriptMsg(entity, GetUniqueId(), b ? EScriptObjectMessage::Start : EScriptObjectMessage::Stop);
}
}
zeus::CVector3f CElitePirate::sub_80228864(const CActor* actor) const {
const zeus::CTransform& targetTransform = actor->GetLocatorTransform("lockon_target_LCTR");
return actor->GetTranslation() + actor->GetTransform().rotate(targetTransform.origin);
}
} // namespace urde::MP1

View File

@ -2,10 +2,11 @@
#include "Runtime/Character/CBoneTracking.hpp"
#include "Runtime/Collision/CJointCollisionDescription.hpp"
#include "Runtime/MP1/World/CShockWave.hpp"
#include "Runtime/World/CActorParameters.hpp"
#include "Runtime/World/CAnimationParameters.hpp"
#include "Runtime/World/CPatterned.hpp"
#include "Runtime/World/CPathFindSearch.hpp"
#include "Runtime/World/CPatterned.hpp"
namespace urde {
class CCollisionActorManager;
@ -62,21 +63,6 @@ class CElitePirate : public CPatterned {
SUnknownStruct(float f) : x0_(f * f) {}
};
struct SUnknownStruct2 {
u32 x0_ = 8;
CAssetId x4_particleDesc;
CDamageInfo x8_damageInfo;
float x24_ = 0.f;
float x28_ = 0.5f;
float x2c_ = 16.5217f;
float x30_ = 0.f;
CAssetId x34_weaponDesc;
s16 x38_sfx;
SUnknownStruct2(CAssetId part, const CDamageInfo& dInfo, CAssetId weapon, s16 sfx)
: x4_particleDesc(part), x8_damageInfo(dInfo), x34_weaponDesc(weapon), x38_sfx(sfx) {}
};
s32 x568_ = -1;
CDamageVulnerability x56c_vulnerability;
std::unique_ptr<CCollisionActorManager> x5d4_collisionActorMgr1;
@ -162,11 +148,11 @@ public:
bool ShouldSpecialAttack(CStateManager&, float arg) override;
bool ShouldCallForBackup(CStateManager&, float arg) override;
CPathFindSearch* GetSearchPath() override;
virtual bool sub_802273a8() { return true; }
virtual bool sub_802273b0() { return true; }
virtual bool sub_802273a8() const { return true; }
virtual bool sub_802273b0() const { return true; }
virtual void sub_80229114(CStateManager& mgr);
virtual void sub_802289b0(CStateManager& mgr, bool b);
virtual SUnknownStruct2 sub_802273b8() const {
virtual SShockWaveData GetShockWaveData() const {
return {x5d8_data.GetXF8(), x5d8_data.GetXFC(), x5d8_data.GetX118(), x5d8_data.GetX11C()};
}
@ -186,6 +172,7 @@ private:
void sub_802281d8(CStateManager& mgr, const zeus::CTransform& xf);
void sub_8022902c(CStateManager& mgr, TUniqueId uid);
void sub_80228920(CStateManager& mgr, bool b, TUniqueId uid);
zeus::CVector3f sub_80228864(const CActor* actor) const;
};
} // namespace MP1
} // namespace urde

View File

@ -1,43 +1,45 @@
set(MP1_WORLD_SOURCES
CNewIntroBoss.hpp CNewIntroBoss.cpp
CBeetle.hpp CBeetle.cpp
CWarWasp.hpp CWarWasp.cpp
CElitePirate.hpp CElitePirate.cpp
CBloodFlower.hpp CBloodFlower.cpp
CChozoGhost.hpp CChozoGhost.cpp
CSpacePirate.hpp CSpacePirate.cpp
CParasite.hpp CParasite.cpp
CBabygoth.hpp CBabygoth.cpp
CTryclops.hpp CTryclops.cpp
CFireFlea.hpp CFireFlea.cpp
CEnergyBall.hpp CEnergyBall.cpp
CEyeball.hpp CEyeball.cpp
CActorContraption.hpp CActorContraption.cpp
CAtomicAlpha.hpp CAtomicAlpha.cpp
CAtomicBeta.hpp CAtomicBeta.cpp
CBabygoth.hpp CBabygoth.cpp
CBeetle.hpp CBeetle.cpp
CBloodFlower.hpp CBloodFlower.cpp
CBurrower.hpp CBurrower.cpp
CChozoGhost.hpp CChozoGhost.cpp
CElitePirate.hpp CElitePirate.cpp
CEnergyBall.hpp CEnergyBall.cpp
CEyeball.hpp CEyeball.cpp
CFireFlea.hpp CFireFlea.cpp
CFlaahgra.hpp CFlaahgra.cpp
CFlaahgraProjectile.hpp CFlaahgraProjectile.cpp
CFlaahgraTentacle.hpp CFlaahgraTentacle.cpp
CFlickerBat.hpp CFlickerBat.cpp
CFlyingPirate.hpp CFlyingPirate.cpp
CGrenadeLauncher.hpp CGrenadeLauncher.cpp
CJellyZap.hpp CJellyZap.cpp
CMetroidPrimeRelay.hpp CMetroidPrimeRelay.cpp
CMagdolite.hpp CMagdolite.cpp
CMetaree.hpp CMetaree.cpp
CMetroid.hpp CMetroid.cpp
CMetroidBeta.hpp CMetroidBeta.cpp
CMetroidPrimeExo.hpp CMetroidPrimeExo.cpp
CMetroidPrimeProjectile.hpp CMetroidPrimeProjectile.cpp
CActorContraption.hpp CActorContraption.cpp
CThardusRockProjectile.hpp CThardusRockProjectile.cpp
CMetroidBeta.hpp CMetroidBeta.cpp
CMetroid.hpp CMetroid.cpp
CMetaree.hpp CMetaree.cpp
CBurrower.hpp CBurrower.cpp
CPuffer.hpp CPuffer.cpp
CMagdolite.hpp CMagdolite.cpp
CSeedling.hpp CSeedling.cpp
CRidley.hpp CRidley.cpp
CPuddleToadGamma.hpp CPuddleToadGamma.cpp
CFlaahgra.hpp CFlaahgra.cpp
CFlaahgraTentacle.hpp CFlaahgraTentacle.cpp
CFlaahgraProjectile.hpp CFlaahgraProjectile.cpp
CSpankWeed.hpp CSpankWeed.cpp
CMetroidPrimeRelay.hpp CMetroidPrimeRelay.cpp
CNewIntroBoss.hpp CNewIntroBoss.cpp
CParasite.hpp CParasite.cpp
CPuddleSpore.hpp CPuddleSpore.cpp
CPuddleToadGamma.hpp CPuddleToadGamma.cpp
CPuffer.hpp CPuffer.cpp
CRidley.hpp CRidley.cpp
CRipper.hpp CRipper.cpp
CThardus.hpp CThardus.cpp)
CSeedling.hpp CSeedling.cpp
CShockWave.hpp CShockWave.cpp
CSpacePirate.hpp CSpacePirate.cpp
CSpankWeed.hpp CSpankWeed.cpp
CThardus.hpp CThardus.cpp
CThardusRockProjectile.hpp CThardusRockProjectile.cpp
CTryclops.hpp CTryclops.cpp
CWarWasp.hpp CWarWasp.cpp
)
runtime_add_list(World MP1_WORLD_SOURCES)

View File

@ -0,0 +1,65 @@
#include "Runtime/MP1/World/CShockWave.hpp"
#include "Runtime/CSimplePool.hpp"
#include "Runtime/CStateManager.hpp"
#include "Runtime/GameGlobalObjects.hpp"
#include "Runtime/Graphics/CBooRenderer.hpp"
#include "Runtime/World/CActorParameters.hpp"
#include "TCastTo.hpp" // Generated file, do not modify include path
namespace urde {
namespace MP1 {
CShockWave::CShockWave(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf,
TUniqueId parent, const SShockWaveData& data, float f1, float f2)
: CActor(uid, true, name, info, xf, CModelData::CModelDataNull(), {EMaterialTypes::Projectile},
CActorParameters::None(), kInvalidUniqueId)
, xe8_id1(parent)
, xec_damageInfo(data.x8_damageInfo)
, x108_elementGenDesc(g_SimplePool->GetObj({SBIG('PART'), data.x4_particleDesc}))
, x110_elementGen(std::make_unique<CElementGen>(x108_elementGenDesc))
, x114_data(data)
, x150_(data.x24_)
, x154_(data.x2c_)
, x15c_(f1)
, x160_(f2) {
if (data.x34_weaponDesc.IsValid()) {
x974_electricDesc = g_SimplePool->GetObj({SBIG('ELSC'), data.x34_weaponDesc});
}
x110_elementGen->SetParticleEmission(true);
x110_elementGen->SetOrientation(GetTransform().getRotation());
x110_elementGen->SetGlobalTranslation(GetTranslation());
xe6_27_thermalVisorFlags = 2;
}
void CShockWave::Accept(IVisitor& visitor) { visitor.Visit(this); }
void CShockWave::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) {
// TODO
CActor::AcceptScriptMsg(msg, uid, mgr);
}
void CShockWave::AddToRenderer(const zeus::CFrustum& frustum, const CStateManager& mgr) const {
CActor::AddToRenderer(frustum, mgr);
g_Renderer->AddParticleGen(*x110_elementGen);
}
std::optional<zeus::CAABox> CShockWave::GetTouchBounds() const {
// TODO
return CActor::GetTouchBounds();
}
void CShockWave::Render(const CStateManager& mgr) const {
CActor::Render(mgr);
x110_elementGen->Render();
}
void CShockWave::Think(float dt, CStateManager& mgr) {
// TODO
}
void CShockWave::Touch(CActor& actor, CStateManager& mgr) {
// TODO
}
} // namespace MP1
} // namespace urde

View File

@ -0,0 +1,56 @@
#pragma once
#include "Runtime/World/CActor.hpp"
#include "Runtime/World/CDamageInfo.hpp"
#include "Runtime/Particle/CElementGen.hpp"
namespace urde {
namespace MP1 {
struct SShockWaveData {
u32 x0_ = 8;
CAssetId x4_particleDesc;
CDamageInfo x8_damageInfo;
float x24_ = 0.f;
float x28_ = 0.5f;
float x2c_ = 16.5217f;
float x30_ = 0.f;
CAssetId x34_weaponDesc;
s16 x38_sfx;
SShockWaveData(CAssetId part, const CDamageInfo& dInfo, CAssetId weapon, s16 sfx)
: x4_particleDesc(part), x8_damageInfo(dInfo), x34_weaponDesc(weapon), x38_sfx(sfx) {}
};
class CShockWave : public CActor {
public:
TUniqueId xe8_id1;
CDamageInfo xec_damageInfo;
TToken<CGenDescription> x108_elementGenDesc;
std::unique_ptr<CElementGen> x110_elementGen;
SShockWaveData x114_data;
float x150_;
float x154_;
float x158_ = 0.f;
float x15c_;
float x160_;
float x164_ = 0.f;
float x168_ = 0.f;
char x16c_flags1;
char x16d_flags2;
// x368 => very large reserved_vector of ?
std::optional<TToken<CElectricDescription>> x974_electricDesc;
TUniqueId x980_id2 = kInvalidUniqueId;
CShockWave(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf,
TUniqueId parent, const SShockWaveData& data, float f1, float f2);
void Accept(IVisitor& visitor) override;
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;
void AddToRenderer(const zeus::CFrustum& frustum, const CStateManager& mgr) const override;
std::optional<zeus::CAABox> GetTouchBounds() const override;
void Render(const CStateManager& mgr) const override;
void Think(float dt, CStateManager& mgr) override;
void Touch(CActor& actor, CStateManager& mgr) override;
};
} // namespace MP1
} // namespace urde