diff options
Diffstat (limited to 'src/koopatlas/subplayer.cpp')
-rw-r--r-- | src/koopatlas/subplayer.cpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/koopatlas/subplayer.cpp b/src/koopatlas/subplayer.cpp new file mode 100644 index 0000000..8f70299 --- /dev/null +++ b/src/koopatlas/subplayer.cpp @@ -0,0 +1,116 @@ +#include "koopatlas/player.h" +#include "koopatlas/subplayer.h" + +daWMSubPlayer_c *daWMSubPlayer_c::instance; + +int daWMSubPlayer_c::onCreate() { + + this->modelHandler = new dPlayerModelHandler_c(settings); + // loadModel(u8 player_id, int powerup_id, int unk); + this->modelHandler->loadModel(settings, 3, 2); + this->modelHandler->mdlClass->startAnimation(0, 1.2, 10.0, 0.0); + this->modelHandler->setSRT((Vec){0.0,100.0,-100.0}, (S16Vec){0,0,0}, (Vec){2.0,2.0,2.0}); + this->modelHandler->draw(); + + hammerSuit.setup(this->modelHandler); + + pos = (Vec){0.0f,0.0f,3000.0f}; + rot = (S16Vec){0x1800,0,0}; + scale = (Vec){1.6f,1.6f,1.6f}; + + step = false; + timer = 0; + + return true; +} + +int daWMSubPlayer_c::onDelete() { + delete modelHandler; + + return true; +} + + +void daWMSubPlayer_c::update(daWMPlayer_c::state_s *st) { + this->modelHandler->update(); + + startAnimation(st->anim, st->animFrame, st->animUnk, st->animUpdateRate); + + pos = st->pos; + scale = st->scale; + rot = st->rot; + + mMtx myMatrix; + myMatrix.scale(scale.x, scale.y, scale.z); + myMatrix.applyTranslation(pos.x, pos.y + st->jumpOffset, pos.z); + myMatrix.applyRotationX(&rot.x); + myMatrix.applyRotationY(&rot.y); + // Z is unused for now + modelHandler->setMatrix(myMatrix); + + if (st->repeatedEffect) { + Vec effPos = {pos.x, pos.y, 3300.0f}; + effect.spawn(st->repeatedEffect, 0, &effPos, &rot, &scale); + } + + if (st->repeatedSound) { + timer++; + + if (timer == 12) { + if (step) { MapSoundPlayer(SoundRelatedClass, st->repeatedSound, 1); step = false; } + else { MapSoundPlayer(SoundRelatedClass, st->repeatedSound+1, 1); step = true; } + timer = 0; + } + + if (timer > 12) { timer = 0; } + } + + if (st->nowEffect) { + SpawnEffect(st->nowEffect, 0, &pos, 0, &scale); + } + + if (st->nowSound != SE_NULL) { + nw4r::snd::SoundHandle something; + PlaySoundWithFunctionB4(SoundRelatedClass, &something, st->nowSound, 1); + + if (st->nowSound == SE_PLY_JUMP) { + nw4r::snd::SoundHandle something2; + PlaySoundWithFunctionB4(SoundRelatedClass, &something2, SE_VOC_MA_CS_JUMP, 1); + } + } +} + +int daWMSubPlayer_c::onDraw() { + if (!visible) + return true; + + this->modelHandler->draw(); + hammerSuit.draw(); + + return true; +} + + +void daWMSubPlayer_c::startAnimation(int id, float frame, float unk, float updateRate) { + if (id == currentAnim && frame == currentFrame && unk == currentUnk && updateRate == currentUpdateRate) + return; + + currentAnim = id; + currentFrame = frame; + currentUnk = unk; + currentUpdateRate = updateRate; + this->modelHandler->mdlClass->startAnimation(id, frame, unk, updateRate); +} + + + +daWMSubPlayer_c *daWMSubPlayer_c::build() { + + void *buffer = AllocFromGameHeap1(sizeof(daWMSubPlayer_c)); + daWMSubPlayer_c *c = new(buffer) daWMSubPlayer_c; + + + instance = c; + return c; +} + |