diff options
Diffstat (limited to '')
-rw-r--r-- | src/bossPlayerClown.cpp | 171 |
1 files changed, 133 insertions, 38 deletions
diff --git a/src/bossPlayerClown.cpp b/src/bossPlayerClown.cpp index 15aa2dd..2db1d90 100644 --- a/src/bossPlayerClown.cpp +++ b/src/bossPlayerClown.cpp @@ -5,10 +5,10 @@ #include "boss.h" -#define cPlayerOccupying (*(dStageActor_c**)(((u32)(clown)) + 0x738 )) +// #define cPlayerOccupying (*(dStageActor_c**)(((u32)(clown)) + 0x738 )) #define cAllocator ((mHeapAllocator_c*)(((u32)(clown)) + 0xFD0 )) #define cModel ((m3d::mdl_c*)( ((u32)(clown)) + 0xFEC )) - +#define cTimer (**(u32**)((u32)(clown) + sizeof(m3d::mdl_c) + 0xFEC )) extern "C" int PClownCarExecute(dEn_c *clown); extern "C" void PClownCarAfterCreate(dEn_c *clown, u32); @@ -18,12 +18,21 @@ extern "C" void PClownCarMove(dEn_c *clown); int CConDraw(dEn_c *clown) { // setup cannon model - clown->matrix.translation(clown->pos.x, clown->pos.y, clown->pos.z); - short newrot = 0x4000; - clown->matrix.applyRotationYXZ(&clown->rot.x, &newrot, &clown->rot.z); + clown->matrix.translation(clown->pos.x, clown->pos.y + 8.0, clown->pos.z-100.0); + short newrotz = -0x2000; + short newroty = ((clown->rot.y * 0x4000) / 0x800) - 0x4000; + short newrotx; + if (clown->rot.x < 0x8000) { + newrotx = -clown->rot.x; + } + else { + newrotx = clown->rot.x; + } + // OSReport("Angle?: %x, %x", clown->rot.y, newroty); + clown->matrix.applyRotationYXZ(&clown->rot.x, &newroty, &newrotz); cModel->setDrawMatrix(clown->matrix); - cModel->setScale(&clown->scale); + cModel->setScale(&(Vec){0.25, 0.5, 0.25}); cModel->calcWorld(false); cModel->scheduleForDrawing(); @@ -43,26 +52,17 @@ void CCafterCreate(dEn_c *clown, u32 param) { clown->scale.y *= 1.25; clown->scale.z *= 1.25; - OSReport("AfterCreate"); // setup the model nw4r::g3d::ResFile resFile; - OSReport("defined"); - cAllocator->link(-1, GameHeaps[0], 0, 0x20); - OSReport("allocated"); resFile.data = getResource("koopaJr_clown_ply", "g3d/cannon.brres"); - OSReport("resource"); nw4r::g3d::ResMdl mdl = resFile.GetResMdl("Cannon"); - OSReport("model"); cModel->setup(mdl, cAllocator, 0x224, 1, 0); - OSReport("setup"); SetupTextures_MapObj(cModel, 0); - OSReport("lightmaps"); cAllocator->unlink(); - OSReport("unlinked"); // Original AfterCreate PClownCarAfterCreate(clown, param); @@ -70,39 +70,38 @@ void CCafterCreate(dEn_c *clown, u32 param) { void CConExecuteMove(dEn_c *clown) { - u8 player = cPlayerOccupying->which_player; + // u8 player = cPlayerOccupying->which_player; // OSReport("Angle = %x, %x, %x", (GetSpecificPlayerActor(player))->rot.y, (GetSpecificPlayerActor(player))->rot.x, (GetSpecificPlayerActor(player))->rot.z); // OSReport("Clown = %x, %x, %x", (clown)->rot.y, (clown)->rot.x, (clown)->rot.z); - RemoconMngClass* Remo = GetRemoconMng(); - Vec tempPos; - u32 buttonPushed = Remocon_GetPressed(Remo->controllers[player]); + u32 buttonPushed = Remocon_GetPressed(GetRemoconMng()->controllers[0]); if (buttonPushed & 0x0100) { - if (clown->direction == 0) { // Going right - tempPos = (Vec){clown->pos.x + 32.0, clown->pos.y + 32.0, 3564.0}; - dStageActor_c *spawned = CreateActor(347, clown->direction, tempPos, 0, 0); - spawned->speed.x = 5.0; - } - else { - tempPos = (Vec){clown->pos.x - 32.0, clown->pos.y + 32.0, 3564.0}; - dStageActor_c *spawned = CreateActor(347, clown->direction, tempPos, 0, 0); - spawned->speed.x = -5.0; - } - - SpawnEffect("Wm_en_killervanish", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){0.25, 0.25, 0.25}); - PlaySoundAsync(clown, SE_OBJ_HOUDAI_S_SHOT); - + // if (cTimer > 90) { + if (clown->direction == 0) { // Going right + tempPos = (Vec){clown->pos.x + 32.0, clown->pos.y + 32.0, 3564.0}; + dStageActor_c *spawned = CreateActor(657, 0, tempPos, 0, 0); + spawned->speed.x = 5.0; + } + else { + tempPos = (Vec){clown->pos.x - 32.0, clown->pos.y + 32.0, 3564.0}; + dStageActor_c *spawned = CreateActor(657, 0, tempPos, 0, 0); + spawned->speed.x = -5.0; + } + + SpawnEffect("Wm_en_killervanish", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){0.1, 0.1, 0.1}); + PlaySoundAsync(clown, SE_OBJ_HOUDAI_S_SHOT); + + // cTimer = 0; + // } } + // cTimer++; + // run normal move PClownCarMove(clown); - - // check for wiimote button presses - - // spawn effect and attack if there are any } @@ -111,7 +110,6 @@ extern "C" mHeapAllocator_c *__ct__16mHeapAllocator_cFv(mHeapAllocator_c *al); extern "C" dEn_c *__ct__20daJrClownForPlayer_cFv(dEn_c *clown); dEn_c *newClownCtor(dEn_c *clown) { - OSReport("ctor"); __ct__20daJrClownForPlayer_cFv(clown); __ct__16mHeapAllocator_cFv(cAllocator); __ct__Q23m3d5mdl_cFv(cModel); @@ -128,3 +126,100 @@ void newClownDtor(dEn_c *clown, u32 willDelete) { __dt__16mHeapAllocator_cFv(cAllocator, 0xFFFFFFFF); __dt__20daJrClownForPlayer_cFv(clown, willDelete); } + + + + + + + + +// Below is the projectile used byt eh clown car - Replaces WM_PAKKUN + +class daClownShot : public dEn_c { + int onCreate(); + int onExecute(); + int onDraw(); + + mHeapAllocator_c allocator; + nw4r::g3d::ResFile resFile; + m3d::mdl_c bodyModel; + + mEf::es2 effect; + static daClownShot *build(); + + void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); +}; + +void daClownShot::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { } + +daClownShot *daClownShot::build() { + void *buffer = AllocFromGameHeap1(sizeof(daClownShot)); + return new(buffer) daClownShot; +} + + +int daClownShot::onCreate() { + allocator.link(-1, GameHeaps[0], 0, 0x20); + this->resFile.data = getResource("koopaJr_clown_ply", "g3d/houdai_ball.brres"); + nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("houdai_ball"); + bodyModel.setup(mdl, &allocator, 0x224, 1, 0); + allocator.unlink(); + + ActivePhysics::Info GreatBalls; + + GreatBalls.xDistToCenter = 0.0; + GreatBalls.yDistToCenter = 0.0; + GreatBalls.xDistToEdge = 8.0; + GreatBalls.yDistToEdge = 7.0; + + GreatBalls.category1 = 0x3; + GreatBalls.category2 = 0x0; + GreatBalls.bitfield1 = 0x6F; + GreatBalls.bitfield2 = 0xffbafffe; + GreatBalls.unkShort1C = 0; + GreatBalls.callback = &dEn_c::collisionCallback; + + this->aPhysics.initWithStruct(this, &GreatBalls); + this->aPhysics.addToList(); + + this->speed.y = 4.0; + this->y_speed_inc = -0.1875; + + this->onExecute(); + return true; +} + +int daClownShot::onDraw() { + matrix.translation(this->pos.x, this->pos.y, this->pos.z); + + matrix.applyRotationYXZ(&this->rot.x, &this->rot.y, &this->rot.z); + + bodyModel.setDrawMatrix(matrix); + bodyModel.setScale(&scale); + bodyModel.calcWorld(true); + + bodyModel.scheduleForDrawing(); + return true; +} + + +int daClownShot::onExecute() { + HandleXSpeed(); + HandleYSpeed(); + doSpriteMovement(); + + effect.spawn("Wm_en_killersmoke", 0, &(Vec){pos.x, pos.y, pos.z}, &(S16Vec){0,0,0}, &(Vec){0.7, 0.7, 0.7}); + + float rect[] = {0.0, 0.0, 8.0, 8.0}; + int ret = this->outOfZone(this->pos, (float*)&rect, this->currentZoneID); + if(ret) { + this->Delete(1); + } + + return true; +} + + + + |