summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/bossMegaGoomba.cpp193
-rw-r--r--src/effects.cpp9
-rw-r--r--src/effects.h8
3 files changed, 124 insertions, 86 deletions
diff --git a/src/bossMegaGoomba.cpp b/src/bossMegaGoomba.cpp
index 36f521c..e836afb 100644
--- a/src/bossMegaGoomba.cpp
+++ b/src/bossMegaGoomba.cpp
@@ -1,6 +1,7 @@
#include <common.h>
#include <game.h>
#include <g3dhax.h>
+#include <sfx.h>
#include "player.h"
@@ -11,7 +12,14 @@ class daMegaGoomba_c : public dEn_c {
int onDraw();
mHeapAllocator_c allocator;
+ nw4r::g3d::ResFile resFile;
m3d::mdl_c bodyModel;
+ m3d::anmChr_c animationChr;
+ nw4r::g3d::ResAnmTexPat resTexPat;
+ m3d::anmTexPat_c animationPat;
+ //mAllocator_c allocator2;
+ //FIXME add this back in ?
+ //EGG::Effect effect;
float timer;
float dying;
@@ -20,8 +28,6 @@ class daMegaGoomba_c : public dEn_c {
unsigned int Xkey_count;
HermiteKey keysY[0x10];
unsigned int Ykey_count;
-// HermiteKey keysZ[0x10];
-// unsigned int Zkey_count;
char life;
@@ -32,33 +38,17 @@ class daMegaGoomba_c : public dEn_c {
u32 marker2_start;
int pickedChoice;
u32 marker2_end;
- u32 marker3_start;
float XSpeed;
- u32 marker3_end;
- u32 marker4_start;
float JumpHeight;
- u32 marker4_end;
- u32 marker5_start;
float JumpDist;
- u32 marker5_end;
- u32 marker6_start;
float JumpTime;
- u32 marker6_end;
- u32 marker7_start;
- int playIt;
- u32 marker7_end;
- u32 marker8_start;
- int toPlay;
- u32 marker8_end;
- u32 marker9_start;
- bool timeToPlay;
- u32 marker9_end;
bool takeHit(char count);
void dieFall_Execute();
static daMegaGoomba_c *build();
+ void setupBodyModel();
void updateModelMatrices();
// bool preSpriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
@@ -92,16 +82,15 @@ class daMegaGoomba_c : public dEn_c {
DECLARE_STATE(Launch);
};
-extern "C" void *PlaySound(dStageActor_c *, int soundID);
-//extern void * HandleXSpeed(daMegaGoomba_c*);
-//extern void * HandleYSpeed(daMegaGoomba_c*);
-
daMegaGoomba_c *daMegaGoomba_c::build() {
void *buffer = AllocFromGameHeap1(sizeof(daMegaGoomba_c));
return new(buffer) daMegaGoomba_c;
}
+extern "C" void *PlaySound(daMegaGoomba_c *, int soundID);
+
+//FIXME makes these dEn_c::HandleXSpeed();
extern "C" void *HandleXSpeed(daMegaGoomba_c *);
extern "C" void *HandleYSpeed(daMegaGoomba_c *);
extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daMegaGoomba_c *);
@@ -126,6 +115,10 @@ bool daMegaGoomba_c::takeHit(char count) {
c = 127 - l;
}
this->life -= c;
+ this->XSpeed += 0.25;
+ this->JumpHeight += 12.0;
+ this->JumpDist += 12.0;
+ this->JumpTime += 5.0;
doStateChange(&StateID_Shrink);
setNewActivePhysicsRect(this, &this->scale);
return (life <= 0) ? true : false;
@@ -189,27 +182,63 @@ void daMegaGoomba_c::dieFall_Execute() {
this->dEn_c::dieFall_Execute();
}
-int daMegaGoomba_c::onCreate() {
+void HexDump(char* address, u32 length) {
+ length = (length + 0x1f) & ~0x1f;
+ char line[0x11] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+ for(u32 ii=0; ii < length; ii += 0x10) {
+ for(u32 jj=0; jj < 0x10; jj++) {
+ line[jj] = address[ii+jj];
+ }
+ OSReport("%08x: %04x %04x %04x %04x %04x %04x %04x %04x |%s|\n",
+ (u32)(address+ii),
+ *(u16*)(address+ii+0x00),
+ *(u16*)(address+ii+0x02),
+ *(u16*)(address+ii+0x04),
+ *(u16*)(address+ii+0x06),
+ *(u16*)(address+ii+0x08),
+ *(u16*)(address+ii+0x0a),
+ *(u16*)(address+ii+0x0c),
+ *(u16*)(address+ii+0x0e),
+ line);
+ for(u32 jj=0; jj<0x10; jj++) line[jj] = 0;
+ }
+}
- OSReport("Creating the MegaGoomba Model\n");
+void daMegaGoomba_c::setupBodyModel() {
allocator.link(-1, GameHeaps[0], 0, 0x20);
- nw4r::g3d::ResFile rf(getResource("kuribo", "g3d/t02.brres"));
- bodyModel.setup(rf.GetResMdl("kuribo"), &allocator, 0x224, 1, 0);
+ this->resFile.data = getResource("kuribo", "g3d/t02.brres");
+ nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("kuribo");
+ bodyModel.setup(mdl, &allocator, 0x224, 1, 0);
SetupTextures_Enemy(&bodyModel, 0);
+ bool ret;
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("walk");
+ ret = this->animationChr.setup(mdl, anmChr, &this->allocator, 0);
+
+ nw4r::g3d::ResAnmTexPat anmPat = this->resFile.GetResAnmTexPat("walk");
+ this->resTexPat = anmPat;
+ ret = this->animationPat.setup(mdl, anmPat, &this->allocator, 0, 1);
+ this->animationPat.bindEntry(&this->bodyModel, &anmPat, 0, 0);
+ this->bodyModel.bindAnim(&this->animationPat, 1.0);
+ this->animationPat.setFrameForEntry(1.0, 0);
+
+
allocator.unlink();
+}
- OSReport("Creating MegaGoomba's Physics Struct\n");
+int daMegaGoomba_c::onCreate() {
- // Keeping naming
+ OSReport("Creating MG's body model\n");
+ setupBodyModel();
+
+ OSReport("Creating MegaGoomba's Physics Struct\n");
+ //TODO find data for a fun, yet challenging, battle
ActivePhysics::Info HitMeBaby;
HitMeBaby.xDistToCenter = 0.0;
HitMeBaby.yDistToCenter = 18.0;
HitMeBaby.xDistToEdge = 24.0;
HitMeBaby.yDistToEdge = 24.0;
-
- //TODO find data for a fun, yet challenging, battle
HitMeBaby.category1 = 0x3;
HitMeBaby.category2 = 0x0;
HitMeBaby.bitfield1 = 0x4f;
@@ -217,14 +246,17 @@ int daMegaGoomba_c::onCreate() {
HitMeBaby.unkShort1C = 0;
HitMeBaby.callback = &dEn_c::collisionCallback;
-
- OSReport("Making the Physics Class and adding to the list\n");
this->aPhysics.initWithStruct(this, &HitMeBaby);
this->aPhysics.addToList();
+ //sub_80034060();
+
+ //FIXME move this stuff elsewhere
pos.y -= 16.0;
pos.z = 3000.0;
- rot.x = rot.y = rot.z = speed.x = dying = 0.0;
+ speed.x = dying = 0.0;
+ rot.x = rot.z = 0;
+ rot.y = 0x2000; // 0x2000 is left. 0xe000 is for right.
direction = 0;
life = 3;
//TODO 1) allow setting bounding rect with settings
@@ -239,28 +271,13 @@ int daMegaGoomba_c::onCreate() {
this->marker1_end = 0xaabbff11;
this->marker2_start = 0xaabbcc12;
this->marker2_end = 0xaabbff12;
- this->marker3_start = 0xaabbcc13;
- this->marker3_end = 0xaabbff13;
- this->marker4_start = 0xaabbcc14;
- this->marker4_end = 0xaabbff14;
- this->marker5_start = 0xaabbcc15;
- this->marker5_end = 0xaabbff15;
- this->marker6_start = 0xaabbcc16;
- this->marker6_end = 0xaabbff16;
- this->marker7_start = 0xaabbcc17;
- this->marker7_end = 0xaabbff17;
- this->marker8_start = 0xaabbcc18;
- this->marker8_end = 0xaabbff18;
- this->marker9_start = 0xaabbcc19;
- this->marker9_end = 0xaabbff19;
+
this->pickedChoice = -1;
- this->XSpeed = 2.0; // GOOD FOR FINAL SPEED?
+ // 2.0 is good final speed
+ this->XSpeed = 1.5;
this->JumpHeight = 48.0;
this->JumpDist = 64.0;
this->JumpTime = 50.0;
- this->playIt = 0;
- this->toPlay = 0;
- this->timeToPlay = false;
OSReport("Setting MegaGoomba's State\n");
doStateChange(&StateID_Grow);
@@ -292,6 +309,8 @@ int daMegaGoomba_c::onExecute() {
int daMegaGoomba_c::onDraw() {
bodyModel.scheduleForDrawing();
+ animationChr.process();
+ animationPat.process();
return true;
}
@@ -302,10 +321,12 @@ void daMegaGoomba_c::updateModelMatrices() {
if(this->life > 0) {
if(this->pos.x < this->Bounding.left) {
this->direction = !this->direction;
+ rot.y = (this->direction) ? 0xe000 : 0x2000;
this->speed.x = -this->speed.x;
this->pos.x = this->Bounding.left;
} else if (this->pos.x > this->Bounding.right) {
this->direction = !this->direction;
+ rot.y = (this->direction) ? 0xe000 : 0x2000;
this->speed.x = -this->speed.x;
this->pos.x = this->Bounding.right;
}
@@ -358,9 +379,8 @@ void daMegaGoomba_c::executeState_Grow() {
setNewActivePhysicsRect(this, &this->scale);
}
- //TODO grow sound
- //if(this->timer == 60.0)
- // PlaySound(this, SE_GROW);
+ if(this->timer == 60.0)
+ PlaySound(this, SE_EMY_KURI_CHANGE_BIG);
if (this->timer > 170.0) { doStateChange(&StateID_Walk); }
@@ -384,9 +404,8 @@ void daMegaGoomba_c::executeState_Shrink() {
this->scale = (Vec){modifier, modifier, modifier};
setNewActivePhysicsRect(this, &this->scale);
- //TODO shrink sound
- //if(this->timer == 2.0)
- // PlaySound(this, SE_SHRINK);
+ if(this->timer == 2.0)
+ PlaySound(this, SE_EMY_KURIBO_L_DAMAGE_02);
if (this->timer > 60.0) { doStateChange(&StateID_Walk); }
}
@@ -405,8 +424,8 @@ void daMegaGoomba_c::executeState_Launch() {
this->rot.y = sin(this->timer * 3.14 / 5) * 4000;
dStageActor_c *spawner = NULL;
- // 120ticks / 80numbers * 4cases = 6avg kuribo
- int randChoice = GenerateRandomNumber(80);
+ // 120ticks / 120numbers * 3cases = 3avg kuribo
+ int randChoice = GenerateRandomNumber(120);
int randChoiceX = GenerateRandomNumber(12);
int randChoiceY = GenerateRandomNumber(7);
switch(randChoice) {
@@ -429,12 +448,6 @@ void daMegaGoomba_c::executeState_Launch() {
spawner->speed.y = randChoiceY + 3.0;
spawner->scale = (Vec){1.0, 1.0, 1.0};
break;
- case 4:
- spawner = CreateActor(EN_MAME_KURIBO, 0, this->pos, 0, 0);
- spawner->speed.x = randChoiceX - 6.0;
- spawner->speed.y = randChoiceY + 3.0;
- spawner->scale = (Vec){1.0, 1.0, 1.0};
- break;
default:
break;
};
@@ -444,7 +457,7 @@ void daMegaGoomba_c::executeState_Launch() {
this->timer = this->timer + 1.0;
}
void daMegaGoomba_c::endState_Launch() {
- this->rot.y = 0;
+ rot.y = (this->direction) ? 0xe000 : 0x2000;
}
// Jump State
@@ -491,13 +504,37 @@ void daMegaGoomba_c::endState_Jump() { }
void daMegaGoomba_c::beginState_Walk() {
this->timer = 1.0;
this->direction = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos);
- //TODO add rot.changing on switching directions until animations added
+ rot.y = (this->direction) ? 0xe000 : 0x2000;
+
+ //SETUP WALK ANIMATION//
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("walk");
+ this->animationChr.bind(&this->bodyModel, anmChr, 0);
+ this->bodyModel.bindAnim(&this->animationChr, 2.0);
+ /*this->animationChr._setUpdateRate(2.0); FIXME*/
+ this->bodyModel.bindAnim(&this->animationPat, 0.0);
+ this->animationPat.setUpdateRateForEntry(1.0, 0);
+ this->animationPat.setEntryByte34(0, 0);
+ float num = (float)GenerateRandomNumber(0xB4);
+ this->animationPat.setFrameForEntry(num, 0);
}
void daMegaGoomba_c::executeState_Walk() {
-
+ /*
+ nw4r::g3d::ResMdl mdl* = this->bodyModel.GetResMdl();
+ ResNode resNode = mdl->GetResNode("leg_left");
+ resNode._C;
+ mMtx mtx;
+ this->bodyModel.GetSomeMatrix(resNode._C, &mtx);
+ Vec vctr;
+ ConvertMatrixToTranslationVector(&mtx, &vctr);
+ */
+
+ //HandleAcceleration(this);
+ //HandleXSpeed(this);
+ //UpdateObjectPosBasedOnSpeedValues_real(this);
+ //DoGravityMaybe();
float delta = (this->direction) ? -this->XSpeed : this->XSpeed;
this->pos.x += delta;
-
+
int Choice;
float TimerMax = 150.0;
if (this->timer > TimerMax) {
@@ -514,23 +551,9 @@ void daMegaGoomba_c::executeState_Walk() {
case 1:
doStateChange(&StateID_Launch);
break;
- case 2:
- break;
- //FIXME test case for sound effects
- case 3:
- OSReport("PlaySound(this, %d)\n", this->toPlay);
- if(this->timeToPlay) {
- PlaySound(this, this->toPlay);
- this->timeToPlay = false;
- this->toPlay++;
- if(this->toPlay > 1977)
- this->toPlay = 0;
- } else {
- this->timeToPlay = true;
- }
- break;
default:
this->direction = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, pos);
+ rot.y = (this->direction) ? 0xe000 : 0x2000;
this->timer = 0;
break;
};
diff --git a/src/effects.cpp b/src/effects.cpp
index 40f08a2..3b2d5c7 100644
--- a/src/effects.cpp
+++ b/src/effects.cpp
@@ -1041,6 +1041,15 @@ bool CreateEffect(const char* name, Vec* pos) {
return SpawnEffect(name, 0, pos, 0, 0);
}
+bool CreateEffect(int effect_num, Vec* pos, S16Vec* rot, Vec* scale) {
+ if (effect_num > 1000)
+ return false;
+ if (effect_num < 0)
+ return false;
+ const char* effect_name = effects_name_list[effect_num];
+ return SpawnEffect(effect_name, 0, pos, rot, scale);
+}
+
/*
void* CustomEffectSpawn(const char* name) {
// FILL ME IN
diff --git a/src/effects.h b/src/effects.h
index ea4ba2a..ceda53f 100644
--- a/src/effects.h
+++ b/src/effects.h
@@ -4,9 +4,15 @@
#include <common.h>
#include <game.h>
+/*
+S16Vec* tRot = &(S16Vec){ 0, 0, 0};
+Vec* tScale = &(Vec){0.0, 0.0, 0.0};
+*/
+
bool CreateEffect(dEn_c* enemy, int effect_num);
bool CreateEffect(Vec* pos, S16Vec* rot, Vec* scale, int effect_num);
-bool CreateEffect(const char* name, Vec* pos);
+bool CreateEffect(Vec* pos, S16Vec* rot, Vec* scale, int effect_num);
+bool CreateEffect(int effect_num, Vec* pos, S16Vec* rot = 0, Vec* scale = 0);
// Actually will return an EGG::Effect instance
//void* CustomEffectSpawn(const char* name);