mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-09 13:47:43 +00:00
Camera shakers and controller action scripting
This commit is contained in:
@@ -1,13 +1,59 @@
|
||||
#include "CCameraShakeData.hpp"
|
||||
#include "CRandom16.hpp"
|
||||
#include "World/ScriptLoader.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
|
||||
CCameraShakeData::CCameraShakeData(float xA, float xB, float yA, float yB,
|
||||
float zA, float zB, float duration, bool shakeY)
|
||||
: x0_pointA(xA, yA, zA), xc_pointB(xB, yB, zB), x18_duration(duration), x40_shakeY(shakeY) {}
|
||||
SCameraShakePoint SCameraShakePoint::LoadCameraShakePoint(CInputStream& in)
|
||||
{
|
||||
u32 flags = ScriptLoader::LoadParameterFlags(in);
|
||||
float f1 = in.readFloatBig();
|
||||
float f2 = in.readFloatBig();
|
||||
float f3 = in.readFloatBig();
|
||||
float f4 = in.readFloatBig();
|
||||
return {flags, f1, f2, f3, f4};
|
||||
}
|
||||
|
||||
CCameraShakerComponent CCameraShakerComponent::LoadNewCameraShakerComponent(CInputStream& in)
|
||||
{
|
||||
u32 flags = ScriptLoader::LoadParameterFlags(in);
|
||||
SCameraShakePoint sp1 = SCameraShakePoint::LoadCameraShakePoint(in);
|
||||
SCameraShakePoint sp2 = SCameraShakePoint::LoadCameraShakePoint(in);
|
||||
return {flags, sp1, sp2};
|
||||
}
|
||||
|
||||
CCameraShakeData::CCameraShakeData(float f1, float f2, u32 w1, const zeus::CVector3f& v1,
|
||||
const CCameraShakerComponent& shaker1, const CCameraShakerComponent& shaker2,
|
||||
const CCameraShakerComponent& shaker3)
|
||||
: x0_duration(f1), x8_shaker1(shaker1), x44_shaker2(shaker2), x80_shaker3(shaker3), xc0_flags(w1), xc4_sfxPos(v1), xd0_f2(f2)
|
||||
{}
|
||||
|
||||
float CCameraShakeData::GetSomething() const
|
||||
{
|
||||
float ret = 0.f;
|
||||
if (x8_shaker1.x4_w1)
|
||||
ret = x8_shaker1.x8_sp1.GetSomething();
|
||||
if (x44_shaker2.x4_w1)
|
||||
ret = std::max(ret, x44_shaker2.x8_sp1.GetSomething());
|
||||
if (x80_shaker3.x4_w1)
|
||||
ret = std::max(ret, x80_shaker3.x8_sp1.GetSomething());
|
||||
return ret;
|
||||
}
|
||||
|
||||
float CCameraShakeData::GetSomething2() const
|
||||
{
|
||||
float ret = 0.f;
|
||||
if (x8_shaker1.x4_w1)
|
||||
ret = x8_shaker1.x20_sp2.GetSomething();
|
||||
if (x44_shaker2.x4_w1)
|
||||
ret = std::max(ret, x44_shaker2.x20_sp2.GetSomething());
|
||||
if (x80_shaker3.x4_w1)
|
||||
ret = std::max(ret, x80_shaker3.x20_sp2.GetSomething());
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if 0
|
||||
zeus::CVector3f CCameraShakeData::GeneratePoint(float dt, CRandom16& r)
|
||||
{
|
||||
x3c_cycleTimeLeft -= dt;
|
||||
@@ -33,5 +79,30 @@ zeus::CVector3f CCameraShakeData::GeneratePoint(float dt, CRandom16& r)
|
||||
x1c_curTime += dt;
|
||||
return x24_position * zeus::CVector3f::lerp(x0_pointA, xc_pointB, interp);
|
||||
}
|
||||
#endif
|
||||
|
||||
CCameraShakeData CCameraShakeData::LoadCameraShakeData(CInputStream& in)
|
||||
{
|
||||
float f1 = in.readFloatBig();
|
||||
float f2 = in.readFloatBig();
|
||||
float f3 = in.readFloatBig();
|
||||
float f4 = in.readFloatBig();
|
||||
float f5 = in.readFloatBig();
|
||||
float f6 = in.readFloatBig();
|
||||
float duration = in.readFloatBig();
|
||||
|
||||
SCameraShakePoint sp1(0, 0.f, 0.f, duration, 2.f * f1);
|
||||
SCameraShakePoint sp2(0, 0.f, 0.f, duration, 2.f * f3);
|
||||
SCameraShakePoint sp3(0, 0.f, 0.f, duration, 2.f * f5);
|
||||
SCameraShakePoint sp4(0, 0.f, 0.f, 0.5f * duration, 3.f);
|
||||
SCameraShakePoint sp5(0, 0.f, 0.f, 0.5f * duration, 0.f);
|
||||
SCameraShakePoint sp6(0, 0.f, 0.f, 0.5f * duration, 3.f);
|
||||
|
||||
CCameraShakerComponent shaker1(1, sp1, sp4);
|
||||
CCameraShakerComponent shaker2;
|
||||
CCameraShakerComponent shaker3(1, sp3, sp6);
|
||||
|
||||
return {duration, 100.f, 0, zeus::CVector3f::skZero, shaker1, shaker2, shaker3};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user