1#include <game/bases/d_wm_demo_actor.hpp>
2#include <game/bases/d_cs_seq_manager.hpp>
3#include <game/bases/d_res.hpp>
5#include <game/bases/d_wm_lib.hpp>
8#include <game/mLib/m_heap.hpp>
9#include <lib/nw4r/g3d/res_file.hpp>
11dWmDemoActor_c::dWmDemoActor_c() {}
15 if (actor ==
nullptr) {
24 next = (dWmDemoActor_c *) actor;
34 if (cutsceneId == -1) {
37 dWmDemoActor_c::setCutEnd();
40bool dWmDemoActor_c::isStaff() {
43 if (a1 ==
this || a2 ==
this) {
49void dWmDemoActor_c::InitJumpParam(
const mVec3_c &startPos,
const mVec3_c &targetPos,
50 int numFrames,
float jumpSpeed,
float maxYSpeed) {
51 if (startPos.y == targetPos.y) {
52 __initJumpParam1(startPos, targetPos, numFrames, jumpSpeed, maxYSpeed);
54 __initJumpParam2(startPos, targetPos, numFrames, jumpSpeed, maxYSpeed);
58void dWmDemoActor_c::__initJumpParam1(
const mVec3_c &startPos,
const mVec3_c &targetPos,
59 int numFrames,
float jumpSpeed,
float maxYSpeed) {
73 float numFramesF = numFrames;
74 float accel = -(2.0f * jumpSpeed) / numFramesF;
75 mSpeedF = (targetPos - startPos).xzLen() / numFramesF;
81void dWmDemoActor_c::__initJumpParam2(
const mVec3_c &startPos,
const mVec3_c &targetPos,
82 int numFrames,
float jumpSpeed,
float maxYSpeed) {
93 float numFramesF = numFrames;
94 float accel = ((jumpSpeed * numFramesF - (targetPos.y - startPos.y)) * -2.0f) / (numFramesF * numFramesF);
95 mSpeedF = (targetPos - startPos).xzLen() / numFramesF;
101void dWmDemoActor_c::initJumpBase(
mVec3_c pos,
int numFrames,
float jumpSpeed) {
103 InitJumpParam(
mPos, mTargetPos, numFrames, jumpSpeed, -50.0f);
104 s16 ang = cLib::targetAngleY(
mPos, mTargetPos);
109bool dWmDemoActor_c::procJumpBase() {
112 if (
mLastPos.y >= mTargetPos.y &&
mPos.y <= mTargetPos.y) {
119void dWmDemoActor_c::setDirection(
const mVec3_c &dir) {
120 mVec3_c direction = dir;
122 if (EGG::Mathf::abs(direction.x) < 0.1f && EGG::Mathf::abs(direction.z) < 0.1f) {
123 direction = mVec3_c(0.0f, 0.0f, -1.0f);
125 s16 ang =
cM::atan2s(direction.x, direction.z);
130void dWmDemoActor_c::rotDirectionY(
short angle,
bool is3D) {
137void dWmDemoActor_c::rotDirectionX(
short angle,
bool is3D) {
144bool dWmDemoActor_c::checkArriveTargetXYZ(
const mVec3_c &startPos,
const mVec3_c &targetPos) {
145 float dist = startPos.distTo(targetPos);
146 float distToLast = startPos.distTo(
mLastPos);
147 float distToCurr = startPos.distTo(
mPos);
148 if (distToLast - dist < 0 && distToCurr - dist >= 0) {
154bool dWmDemoActor_c::checkArriveTargetXZ(
const mVec3_c &startPos,
const mVec3_c &targetPos) {
155 float dist = (targetPos - startPos).xzLen();
156 float distToLast = (
mLastPos - startPos).xzLen();
157 float distToCurr = (
mPos - startPos).xzLen();
158 if (distToLast - dist < 0 && distToCurr - dist >= 0) {
164void dWmDemoActor_c::CreateShadowModel(
const char *arc,
const char *path,
const char *mdlName,
bool param4) {
165 mHeapAllocator.createHeapRestoreCurrent(-1, mHeap::g_gameHeaps[0],
nullptr, 0x20, 0);
168 mModel.create(resFile.GetResMdl(mdlName), &mHeapAllocator, 0x20, 1, 0);
170 mSvMdl =
new dWmSVMdl_c();
171 mSvMdl->create(&mHeapAllocator, mModel);
173 mHeapAllocator.adjustFrmHeapRestoreCurrent();
176void dWmDemoActor_c::CalcShadow(
float yOffs,
float scaleX,
float scaleY,
float scaleZ) {
177 mVec3_c shadowPos =
mPos;
178 mAng3_c shadowRot = mAng3_c::onlyY(
mAngle.y);
179 shadowPos.y =
mPos.y + yOffs;
183 mModel.setScale(scaleX, scaleY, scaleZ);
187void dWmDemoActor_c::CalcShadow(
float yOffs,
float scale) {
188 CalcShadow(yOffs, scale, 1.0f, scale);
191void dWmDemoActor_c::DrawShadow(
bool param1) {
192 if (mSvMdl !=
nullptr) {
197void dWmDemoActor_c::_initDemoJumpBaseCore(
const mVec3_c &pos,
int delay,
int frames,
float jumpSpeed,
198 float scaleStart,
float scaleTarget,
const short &angY) {
199 mScaleCurr = scaleStart;
200 mScale.x = scaleStart * 1.0;
201 mScale.y = scaleStart * 1.0;
202 mScale.z = scaleStart * 1.0;
203 mScaleDelta = (scaleTarget - scaleStart) / frames;
204 mScaleTarget = scaleTarget;
206 initJumpBase(pos, frames, jumpSpeed);
210void dWmDemoActor_c::_initDemoJumpBase(
const mVec3_c &pos,
int delay,
int frames,
float jumpSpeed,
211 float scaleStart,
float scaleTarget,
const mVec3_c &dir) {
213 _initDemoJumpBaseCore(pos, delay, frames, jumpSpeed, scaleStart, scaleTarget, ang);
216bool dWmDemoActor_c::_procDemoJumpBase() {
217 if (mScaleDelay > 0) {
220 mScaleCurr += mScaleDelta;
221 if (mScaleDelta > 0.0f) {
222 if (mScaleCurr < mScaleTarget) {
223 mScale.set(mScaleCurr, mScaleCurr, mScaleCurr);
225 mScaleCurr = mScaleTarget;
226 mScale.set(mScaleTarget, mScaleTarget, mScaleTarget);
229 if (mScaleCurr > mScaleTarget) {
230 mScale.set(mScaleCurr, mScaleCurr, mScaleCurr);
232 mScaleCurr = mScaleTarget;
233 mScale.set(mScaleTarget, mScaleTarget, mScaleTarget);
236 return procJumpBase();
241float dWmDemoActor_c::GetBgPosY(
const mVec3_c &startPos,
const mVec3_c &targetPos,
int directionType) {
243 switch (directionType) {
244 case dWmLib::DIR3D_FRONT:
245 case dWmLib::DIR3D_BACK: {
246 float diffz = EGG::Mathf::abs(startPos.z - targetPos.z);
247 float diffpz = EGG::Mathf::abs(
mPos.z - startPos.z);
248 float ratio = diffpz / diffz;
250 float delta = targetPos.y - startPos.y;
251 if (EGG::Mathf::abs(delta) < 5.0f) {
254 yPos = delta * ratio + startPos.y;
257 case dWmLib::DIR3D_LEFT:
258 case dWmLib::DIR3D_RIGHT: {
259 float diffx = EGG::Mathf::abs(startPos.x - targetPos.x);
260 float diffpx = EGG::Mathf::abs(
mPos.x - startPos.x);
261 float ratio = diffpx / diffx;
263 float delta = targetPos.y - startPos.y;
264 if (EGG::Mathf::abs(delta) < 5.0f) {
267 yPos = delta * ratio + startPos.y;
270 case dWmLib::DIR3D_UP:
271 case dWmLib::DIR3D_DOWN:
277void dWmDemoActor_c::CsSPosSimple(
int directionType,
float yTarget) {
278 switch (directionType) {
279 case dWmLib::DIR3D_FRONT:
280 case dWmLib::DIR3D_BACK:
281 case dWmLib::DIR3D_LEFT:
282 case dWmLib::DIR3D_RIGHT:
287 case dWmLib::DIR3D_UP:
288 if (
mPos.y > yTarget) {
292 case dWmLib::DIR3D_DOWN:
293 if (
mPos.y < yTarget) {
300void dWmDemoActor_c::clearSpeedAll() {
307void dWmDemoActor_c::adjustHeightBase(
const mVec3_c &startPos,
const mVec3_c &targetPos,
int directionType) {
308 if (directionType < 0) {
309 directionType = dWmLib::getPointDir(startPos, targetPos);
311 CsSPosSimple(directionType, GetBgPosY(startPos, targetPos, directionType));
315 int cutName = dCsSeqMng_c::ms_instance->GetCutName();
317 for (
int i = 0; i < csCount; i++) {
318 if (csList[i] == cutName) {
mAng3_c mAngle3D
The actor's rotation (for 3D actors).
mMtx_c mMatrix
The actor's partial transformation matrix. See makeMtx for details.
mVec3_c mScale
The actor's scale (defaults to 1).
mVec3_c mSpeed
The actor's speed.
mVec3_c mLastPos
The actor's position in the previous frame.
mVec3_c mPos
The actor's position.
float mSpeedF
The actor's horizontal speed.
void posMove()
Moves the actor by its speed.
virtual int GetActorType()
Gets the actor kind. See ACTOR_KIND_e.
float mMaxFallSpeed
The actor's maximum fall speed.
void calcSpeed()
Updates the actor's speed (3D actors). See here for details.
mAng3_c mAngle
The actor's rotation (for 2D actors).
float mAccelY
The actor's vertical acceleration.
@ ACTOR_MAP_ENEMY
A map enemy (dWmEnemy_c).
@ ACTOR_MAP_OBJECT
A map object (dWmObjActor_c).
@ ACTOR_MAP_DEMO
A map actor affected by cutscenes (dWmDemoActor_c).
@ ACTOR_MAP_PLAYER
The worldmap player actor (dWmPlayer_c).
dBaseActor_c()
Constructs a new actor.
static dResMng_c * m_instance
The instance of this class.
dRes_c mRes
The resource manager.
void * getRes(const char *arcName, const char *resPath) const
Gets a resource.
virtual void setCutEndSpecific(int cutsceneId, bool param2)
bool isCutscenePlaying(int *csList, int csCount)
static dBaseActor_c * GetChildDemoActor(dBaseActor_c *prev, dWmDemoActor_c *&next)
@ ACTOR
The base is an actor.
static fBase_c * searchBaseByGroupType(unsigned char groupType, const fBase_c *parent)
Searches for a base with a given group type, optionally under a given parent.
A three-dimensional floating point vector.
float normalize()
Normalizes the vector.
s16 atan2s(float sin, float cos)
Converts a sine and a cosine to an angle in units.