2018-10-07 03:42:33 +00:00
|
|
|
#pragma once
|
2016-04-27 19:59:38 +00:00
|
|
|
|
|
|
|
#include "CActor.hpp"
|
|
|
|
#include "CDamageInfo.hpp"
|
|
|
|
#include "zeus/CTransform.hpp"
|
|
|
|
#include "zeus/CColor.hpp"
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
namespace urde {
|
|
|
|
class CScriptSpecialFunction : public CActor {
|
2016-04-27 19:59:38 +00:00
|
|
|
public:
|
2018-12-08 05:30:43 +00:00
|
|
|
enum class ESpecialFunction {
|
|
|
|
What = 0,
|
|
|
|
PlayerFollowLocator = 1,
|
|
|
|
SpinnerController = 2,
|
|
|
|
ObjectFollowLocator = 3,
|
|
|
|
ChaffTarget = 4,
|
|
|
|
InventoryActivator = 5,
|
|
|
|
MapStation = 6,
|
|
|
|
SaveStation = 7,
|
|
|
|
IntroBossRingController = 8,
|
|
|
|
ViewFrustumTester = 9,
|
|
|
|
ShotSpinnerController = 10,
|
|
|
|
EscapeSequence = 11,
|
|
|
|
BossEnergyBar = 12,
|
|
|
|
EndGame = 13,
|
|
|
|
HUDFadeIn = 14,
|
|
|
|
CinematicSkip = 15,
|
|
|
|
ScriptLayerController = 16,
|
|
|
|
RainSimulator = 17,
|
|
|
|
AreaDamage = 18,
|
|
|
|
ObjectFollowObject = 19,
|
|
|
|
RedundantHintSystem = 20,
|
|
|
|
DropBomb = 21,
|
|
|
|
ScaleActor = 22,
|
|
|
|
MissileStation = 23,
|
|
|
|
Billboard = 24,
|
|
|
|
PlayerInAreaRelay = 25,
|
|
|
|
HUDTarget = 26,
|
|
|
|
FogFader = 27,
|
|
|
|
EnterLogbook = 28,
|
|
|
|
PowerBombStation = 29,
|
|
|
|
Ending = 30,
|
|
|
|
FusionRelay = 31,
|
|
|
|
WeaponSwitch = 32,
|
|
|
|
FogVolume = 47,
|
|
|
|
RadialDamage = 48,
|
|
|
|
EnvFxDensityController = 49,
|
|
|
|
RumbleEffect = 50
|
|
|
|
};
|
2016-04-27 19:59:38 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
enum class ESpinnerControllerMode {
|
|
|
|
Zero,
|
|
|
|
One,
|
|
|
|
};
|
2016-12-19 18:27:58 +00:00
|
|
|
|
2019-03-09 08:58:27 +00:00
|
|
|
enum class ERingState {
|
|
|
|
Scramble,
|
|
|
|
Rotate,
|
|
|
|
Stopped,
|
|
|
|
Breakup
|
|
|
|
};
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
struct SRingController {
|
|
|
|
TUniqueId x0_id;
|
2019-03-09 08:58:27 +00:00
|
|
|
float x4_rotateSpeed;
|
|
|
|
bool x8_reachedTarget;
|
2018-12-08 05:30:43 +00:00
|
|
|
zeus::CVector3f xc_;
|
2019-03-10 09:37:36 +00:00
|
|
|
SRingController(TUniqueId uid, float rotateSpeed, bool reachedTarget);
|
2018-12-08 05:30:43 +00:00
|
|
|
};
|
2016-12-19 18:27:58 +00:00
|
|
|
|
2016-04-27 19:59:38 +00:00
|
|
|
private:
|
2018-12-08 05:30:43 +00:00
|
|
|
ESpecialFunction xe8_function;
|
|
|
|
std::string xec_locatorName;
|
2019-03-09 08:58:27 +00:00
|
|
|
float xfc_float1;
|
|
|
|
float x100_float2;
|
|
|
|
float x104_float3;
|
|
|
|
float x108_float4;
|
|
|
|
zeus::CVector3f x10c_vector3f;
|
|
|
|
zeus::CColor x118_color;
|
2018-12-08 05:30:43 +00:00
|
|
|
CDamageInfo x11c_damageInfo;
|
|
|
|
float x138_ = 0.f;
|
2019-02-24 07:15:54 +00:00
|
|
|
zeus::CTransform x13c_ = zeus::CTransform();
|
2018-12-08 05:30:43 +00:00
|
|
|
float x16c_ = 0.f;
|
2019-03-09 08:58:27 +00:00
|
|
|
s16 x170_sfx1;
|
|
|
|
s16 x172_sfx2;
|
|
|
|
s16 x174_sfx3;
|
2018-12-08 05:30:43 +00:00
|
|
|
CSfxHandle x178_sfxHandle;
|
|
|
|
u32 x17c_;
|
|
|
|
float x180_ = 0.f;
|
|
|
|
std::vector<float> x184_;
|
|
|
|
float x194_ = 0.f;
|
|
|
|
std::vector<SRingController> x198_ringControllers;
|
2019-03-09 08:58:27 +00:00
|
|
|
ERingState x1a8_ringState = ERingState::Stopped;
|
|
|
|
zeus::CVector3f x1ac_ringRotateTarget = zeus::skZero3f;
|
|
|
|
bool x1b8_ringReverse = true;
|
2018-12-08 05:30:43 +00:00
|
|
|
s32 x1bc_areaSaveId;
|
|
|
|
s32 x1c0_layerIdx;
|
|
|
|
CPlayerState::EItemType x1c4_item;
|
2019-01-29 08:28:35 +00:00
|
|
|
rstl::optional<zeus::CAABox> x1c8_;
|
2018-12-08 05:30:43 +00:00
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
bool x1e4_24_ : 1;
|
|
|
|
bool x1e4_25_spinnerCanMove : 1;
|
|
|
|
bool x1e4_26_ : 1;
|
|
|
|
bool x1e4_27_ : 1;
|
|
|
|
bool x1e4_28_frustumEntered : 1;
|
|
|
|
bool x1e4_29_frustumExited : 1;
|
|
|
|
bool x1e4_30_ : 1;
|
|
|
|
bool x1e4_31_ : 1;
|
|
|
|
bool x1e5_24_doSave : 1;
|
|
|
|
bool x1e5_25_playerInArea : 1;
|
|
|
|
bool x1e5_26_displayBillboard : 1;
|
2016-12-19 18:27:58 +00:00
|
|
|
};
|
2018-12-08 05:30:43 +00:00
|
|
|
u32 x1e4_dummy = 0;
|
|
|
|
};
|
|
|
|
TLockedToken<CTexture> x1e8_; // Used to be optional
|
2016-04-27 19:59:38 +00:00
|
|
|
public:
|
2018-12-08 05:30:43 +00:00
|
|
|
CScriptSpecialFunction(TUniqueId, std::string_view, const CEntityInfo&, const zeus::CTransform&, ESpecialFunction,
|
|
|
|
std::string_view, float, float, float, float, const zeus::CVector3f&, const zeus::CColor&,
|
|
|
|
bool, const CDamageInfo&, s32, s32, CPlayerState::EItemType, s16, s16, s16);
|
2016-12-19 18:27:58 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
void Accept(IVisitor& visitor);
|
|
|
|
void Think(float, CStateManager&);
|
|
|
|
void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&);
|
|
|
|
void PreRender(CStateManager&, const zeus::CFrustum&);
|
|
|
|
void AddToRenderer(const zeus::CFrustum&, const CStateManager&) const;
|
|
|
|
void Render(const CStateManager&) const;
|
2016-12-19 18:27:58 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
void SkipCinematic(CStateManager&);
|
|
|
|
void RingScramble(CStateManager&);
|
|
|
|
void ThinkIntroBossRingController(float, CStateManager&);
|
|
|
|
void ThinkPlayerFollowLocator(float, CStateManager&);
|
|
|
|
void ThinkSpinnerController(float, CStateManager&, ESpinnerControllerMode);
|
|
|
|
void ThinkObjectFollowLocator(float, CStateManager&);
|
|
|
|
void ThinkObjectFollowObject(float, CStateManager&);
|
|
|
|
void ThinkChaffTarget(float, CStateManager&);
|
|
|
|
void ThinkActorScale(float, CStateManager&);
|
|
|
|
void ThinkSaveStation(float, CStateManager&);
|
|
|
|
void ThinkRainSimulator(float, CStateManager&);
|
|
|
|
void ThinkAreaDamage(float, CStateManager&);
|
|
|
|
void ThinkPlayerInArea(float, CStateManager&);
|
2017-02-18 02:19:50 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
bool ShouldSkipCinematic(CStateManager& stateMgr) const;
|
2018-05-20 05:01:17 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
void DeleteEmitter(const CSfxHandle& handle);
|
|
|
|
u32 GetSpecialEnding(const CStateManager&) const;
|
2016-04-27 19:59:38 +00:00
|
|
|
};
|
2018-12-08 05:30:43 +00:00
|
|
|
} // namespace urde
|