diff options
Diffstat (limited to '')
-rw-r--r-- | src/shyguy.cpp | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/src/shyguy.cpp b/src/shyguy.cpp new file mode 100644 index 0000000..0e4024a --- /dev/null +++ b/src/shyguy.cpp @@ -0,0 +1,219 @@ +#include <common.h> +#include <game.h> +#include <g3dhax.h> +#include <sfx.h> +#include <stage.h> +#include "effects.h" +#include "player.h" + + +class daShyGuy : public dEn_c { + int onCreate(); + int onDelete(); + int onExecute(); + int onDraw(); + + mHeapAllocator_c allocator; + nw4r::g3d::ResFile resFile; + + m3d::mdl_c body_h; + m3d::mdl_c body_m; + m3d::mdl_c body_l; + m3d::mdl_c body_s; + + // m3d::anmChr_c animationChr; + + static daShyGuy *build(); + + // void bindAnimChr_and_setUpdateRate(const char* name, int unk, float unk2, float rate); + void setupBodyModel(); + void updateModelMatrices(); + + // USING_STATES(daShyGuy); + // DECLARE_STATE(Grow); +}; + +daShyGuy *daShyGuy::build() { + void *buffer = AllocFromGameHeap1(sizeof(daShyGuy)); + return new(buffer) daShyGuy; +} + + +extern "C" void *PlaySound(daShyGuy *, int soundID); +extern "C" void *StopSound(int soundID); + +extern "C" u32 GenerateRandomNumber(int max); +extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer); +extern "C" u8 dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(daShyGuy *, Vec pos); +extern "C" dStageActor_c *GetSpecificPlayerActor(int number); + + +// CREATE_STATE(daShyGuy, Grow); + + +// void daShyGuy::bindAnimChr_and_setUpdateRate(const char* name, int unk, float unk2, float rate) { +// nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr(name); +// this->animationChr.bind(&this->bodyModel, anmChr, unk); +// this->bodyModel.bindAnim(&this->animationChr, unk2); +// this->animationChr.setUpdateRate(rate); +// } + + +void daShyGuy::setupBodyModel() { + allocator.link(-1, GameHeaps[0], 0, 0x20); + + // body_h # Maybe Head and body + // body_m # Same as h + // body_l # Just head + // body_s # A shadow? + + this->resFile.data = getResource("block_snake", "g3d/ShyGuyRed.brres"); + + nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("body_h"); + body_h.setup(mdl, &allocator, 0x224, 1, 0); + SetupTextures_Enemy(&body_h, 0); + + nw4r::g3d::ResMdl mdlb = this->resFile.GetResMdl("body_m"); + body_m.setup(mdlb, &allocator, 0x224, 1, 0); + SetupTextures_Enemy(&body_m, 0); + + nw4r::g3d::ResMdl mdlc = this->resFile.GetResMdl("body_l"); + body_l.setup(mdlc, &allocator, 0x224, 1, 0); + SetupTextures_Enemy(&body_l, 0); + + nw4r::g3d::ResMdl mdld = this->resFile.GetResMdl("body_s"); + body_s.setup(mdld, &allocator, 0x224, 1, 0); + SetupTextures_Enemy(&body_s, 0); + + + //Animations start here + // nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("run"); + // ret = this->animationChr.setup(mdl, anmChr, &this->allocator, 0); + + allocator.unlink(); +} + + +int daShyGuy::onCreate() { + + OSReport("Creating the ShyGuy Model"); + setupBodyModel(); + + int tscale = this->settings >> 28; + float scale = (float)tscale * 2.0; + + OSReport("Setting ShyGuy's Size to 1.0"); + this->scale = (Vec){scale, scale, scale}; + + OSReport("Creating ShyGuy's Physics Struct"); + + ActivePhysics::Info HitMeBaby; + HitMeBaby.xDistToCenter = 0.0; + HitMeBaby.yDistToCenter = 0.0; + + HitMeBaby.xDistToEdge = 32.0; + HitMeBaby.yDistToEdge = 32.0; + + HitMeBaby.category1 = 0x3; + HitMeBaby.category2 = 0x0; + HitMeBaby.bitfield1 = 0x4F; + HitMeBaby.bitfield2 = 0x8828E; + HitMeBaby.unkShort1C = 0; + HitMeBaby.callback = &dEn_c::collisionCallback; + + OSReport("Making the Physics Class and adding to the list"); + this->aPhysics.initWithStruct(this, &HitMeBaby); + this->aPhysics.addToList(); + + OSReport("Setting up ShyGuy's Box of Goodies"); + this->rot.x = 0; // X is vertical axis + this->rot.y = 0; // Y is horizontal axis + this->rot.z = 0; // Z is ... an axis >.> + this->direction = 0; // Heading left. + + this->speed.x = 0; + + // bindAnimChr_and_setUpdateRate("run", 1, 0.0, 1.0); + + // OSReport("Setting ShyGuy's State"); + // doStateChange(&StateID_Grow); + + OSReport("Going to Execute ShyGuy"); + this->onExecute(); + return true; +} + +int daShyGuy::onDelete() { + return true; +} + +int daShyGuy::onExecute() { + acState.execute(); + updateModelMatrices(); + + this->rot.x = this->rot.x + 10; + this->rot.y = this->rot.y + 5; + this->rot.z = this->rot.z + 15; + + // if(this->animationChr.isAnimationDone()) + // this->animationChr.setCurrentFrame(0.0); + + // if (this->aPhysics.result1 == 1) { + // char PlayerID = NearestPlayer(this); + // dStageActor_c *Player = GetSpecificPlayerActor(PlayerID); + + // this->_vf220(Player); + // } + + return true; +} + + +int daShyGuy::onDraw() { + body_h.scheduleForDrawing(); + body_h._vf1C(); + + body_m.scheduleForDrawing(); + body_m._vf1C(); + + body_l.scheduleForDrawing(); + body_l._vf1C(); + + body_s.scheduleForDrawing(); + body_s._vf1C(); + + return true; +} + +void daShyGuy::updateModelMatrices() { + // This won't work with wrap because I'm lazy. + matrix.translation(pos.x, pos.y, pos.z); + matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); + + body_h.setDrawMatrix(matrix); + body_h.setScale(&scale); + body_h.calcWorld(false); + + matrix.translation(pos.x+40.0, pos.y, pos.z); + + body_m.setDrawMatrix(matrix); + body_m.setScale(&scale); + body_m.calcWorld(false); + + matrix.translation(pos.x+80.0, pos.y, pos.z); + + body_l.setDrawMatrix(matrix); + body_l.setScale(&scale); + body_l.calcWorld(false); + + matrix.translation(pos.x+120.0, pos.y, pos.z); + + body_s.setDrawMatrix(matrix); + body_s.setScale(&scale); + body_s.calcWorld(false); + +} + + + + |