summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Simpson <megazig@gmail.com>2011-10-14 00:35:39 -0500
committerStephen Simpson <megazig@gmail.com>2011-10-14 00:35:39 -0500
commit1897a8a60cec5bf43bf5cf04cc6b188138aed3ee (patch)
tree8b075ca427fce385425c5d530e3a3074eaeb9279
parentb3c762b06e3238208ba54651545ca51b23e008c9 (diff)
parent48713b7a405c95022e85f4cf5ce7c27363815d74 (diff)
downloadkamek-1897a8a60cec5bf43bf5cf04cc6b188138aed3ee.tar.gz
kamek-1897a8a60cec5bf43bf5cf04cc6b188138aed3ee.zip
Merge branch 'megaTestBoss' into level-select
-rw-r--r--include/g3dhax.h176
-rw-r--r--kamek_pal.x52
-rw-r--r--src/bossMegaGoomba.cpp193
-rw-r--r--src/effects.cpp9
-rw-r--r--src/effects.h8
5 files changed, 343 insertions, 95 deletions
diff --git a/include/g3dhax.h b/include/g3dhax.h
index d816a24..f2cdd29 100644
--- a/include/g3dhax.h
+++ b/include/g3dhax.h
@@ -1,6 +1,8 @@
#ifndef __KAMEK_G3DHAX_H
#define __KAMEK_G3DHAX_H
+#include <common.h>
+
// nw4r::g3d wrapper
namespace nw4r {
@@ -26,6 +28,10 @@ namespace nw4r {
void * /*ResMat*/ GetResMat(const char *str) const;
};
+ class ResAnmChr { public: void* data; ResAnmChr(void *p = NULL) { data = p; } };
+ class ResAnmTexPat { public: void* data; ResAnmTexPat(void *p = NULL) { data = p; } };
+ class ResAnmTexSrt { public: void* data; ResAnmTexSrt(void *p = NULL) { data = p; } };
+
class ResFile {
public:
void * /*ResFileData*/ data;
@@ -42,11 +48,11 @@ namespace nw4r {
void * /*ResTex*/ GetResTex(const char *str) const;
void * /*ResTex*/ GetResTex(const ResName n) const;
void * /*ResTex*/ GetResTex(u32 idx) const;
- void * /*ResAnmChr*/ GetResAnmChr(const char *str) const;
+ ResAnmChr GetResAnmChr(const char *str) const;
void * /*ResAnmVis*/ GetResAnmVis(const char *str) const;
void * /*ResAnmClr*/ GetResAnmClr(const char *str) const;
- void * /*ResAnmTexPat*/ GetResAnmTexPat(const char *str) const;
- void * /*ResAnmTexSrt*/ GetResAnmTexSrt(const char *str) const;
+ ResAnmTexPat GetResAnmTexPat(const char *str) const;
+ ResAnmTexSrt GetResAnmTexSrt(const char *str) const;
void * /*ResAnmScn*/ GetResAnmScn(const char *str) const;
bool Bind(ResFile rhs);
@@ -133,19 +139,40 @@ namespace nw4r {
}
-class mHeapAllocator_c { // Actually that weird subclass. INCOMPLETE!!
+namespace EGG {
+ class Allocator {
+ public:
+ char data1[0x10];
+
+ Allocator(void *heap, s32 align);
+ virtual ~Allocator();
+
+ virtual void *alloc(u32 size);
+ virtual void free(void *block);
+
+ void *heap;
+ s32 alignment;
+ };
+}
+
+class mAllocator_c : public EGG::Allocator {
public:
- char data1[0x10];
+ mAllocator_c();
+ ~mAllocator_c();
+
+ void *alloc(u32 size);
+ void free(void *block);
+};
+class mHeapAllocator_c : public mAllocator_c {
+ public:
mHeapAllocator_c();
- virtual ~mHeapAllocator_c();
- virtual void *alloc(u32 size);
- virtual void free(void *block);
+ ~mHeapAllocator_c();
bool link(s32 size, void *heap, const char *name, int align);
u32 unlink();
- char data2[8];
+ bool linkAndBecomeCurrentHeap(s32 size, void *heap, const char *name, int align);
};
namespace m3d {
@@ -186,6 +213,8 @@ namespace m3d {
void *scnObj;
};
+ class banm_c;
+
class mdl_c {
public:
mdl_c();
@@ -206,8 +235,137 @@ namespace m3d {
void setScale(Vec *scale);
void calcWorld(bool unk);
+ void bindAnim(banm_c *animation, float unk);
+
char data[0x3C];
};
+
+
+
+
+ class banm_c {
+ public:
+ virtual ~banm_c();
+
+ virtual int _vf0C() = 0;
+ virtual void detach();
+ virtual void process();
+
+ bool testAnmFlag(u32 flag); /* nw4r::g3d::AnmObj::AnmFlag */
+
+ void *anmObj; // should be NW4R AnmObj class
+ void *frameHeap; // should be a frame heap
+ mAllocator_c allocator;
+
+ private:
+ void setupHeap(mAllocator_c *allocator, u32 *sizeOutput);
+ float _getCurrentFrame();
+ float _setCurrentFrame(float value);
+ float _getUpdateRate();
+ float _setUpdateRate(float value);
+ };
+
+ class fanm_c : public banm_c {
+ public:
+ fanm_c();
+ ~fanm_c();
+
+ void process();
+
+ void _80169050(float _unk, float updateRate, float _unk2, u8 _unk3);
+ void setCurrentFrame(float value);
+ bool isAnimationDone(); // I think
+ bool querySomething(float value);
+
+ // 28 might be Max Frame?
+ float _28, _2C, currentFrame;
+ u8 _34;
+ };
+
+ class anmChr_c : public fanm_c {
+ public:
+ ~anmChr_c();
+ int _vf0C();
+
+ bool setup(nw4r::g3d::ResMdl modelRes, nw4r::g3d::ResAnmChr anmRes,
+ mAllocator_c *allocator, u32 *sizeOutPtr);
+
+ void bind(/*b*/mdl_c *model, nw4r::g3d::ResAnmChr anmRes, int unk);
+ };
+
+ class anmTexPat_c : public banm_c {
+ public:
+ class child_c : public fanm_c {
+ ~child_c();
+ int _vf0C();
+
+ // some methods missing
+ };
+
+ // some methods missing
+
+ ~anmTexPat_c();
+ int _vf0C();
+ void detach();
+ void process();
+
+ bool setup(nw4r::g3d::ResMdl modelRes, nw4r::g3d::ResAnmTexPat anmRes,
+ mAllocator_c *allocator, u32 *sizeOutPtr, int count);
+
+ void bindEntry(/*b*/mdl_c *model, nw4r::g3d::ResAnmTexPat *resource,
+ int entryNumber, int _param4);
+
+ float getFrameForEntry(int number);
+ void setFrameForEntry(float value, int number);
+ float getUpdateRateForEntry(int number);
+ void setUpdateRateForEntry(float value, int number);
+ bool isEntryAnimationDone(int number);
+ bool queryEntrySomething(float value, int number);
+ void setEntryByte34(u8 value, int number);
+ float getEntryField28(int number);
+
+ private:
+ child_c *children;
+
+ void processOneEntry(int number);
+ };
+
+ class anmTexSrt_c : public banm_c {
+ public:
+ class child_c : public fanm_c {
+ ~child_c();
+ int _vf0C();
+
+ // some methods missing
+ };
+
+ // some methods missing
+
+ ~anmTexSrt_c();
+ int _vf0C();
+ void detach();
+ void process();
+
+ bool setup(nw4r::g3d::ResMdl modelRes, nw4r::g3d::ResAnmTexSrt anmRes,
+ mAllocator_c *allocator, u32 *sizeOutPtr, int count);
+
+ void bindEntry(/*b*/mdl_c *model, nw4r::g3d::ResAnmTexSrt resource,
+ int entryNumber, int _param4);
+
+ float getFrameForEntry(int number);
+ void setFrameForEntry(float value, int number);
+ float getUpdateRateForEntry(int number);
+ void setUpdateRateForEntry(float value, int number);
+ bool isEntryAnimationDone(int number);
+ void setEntryByte34(u8 value, int number);
+ float getEntryField28(int number);
+ float getEntryField2C(int number);
+
+ private:
+ child_c *children;
+
+ void processOneEntry(int number);
+ };
};
diff --git a/kamek_pal.x b/kamek_pal.x
index 2a6e3e4..8030c51 100644
--- a/kamek_pal.x
+++ b/kamek_pal.x
@@ -545,6 +545,7 @@ SECTIONS {
setScale__Q23m3d5mdl_cFfff = 0x8016A270;
setScale__Q23m3d5mdl_cFP7Point3d = 0x8016A290;
calcWorld__Q23m3d5mdl_cFb = 0x8016A2E0;
+ bindAnim__Q23m3d5mdl_cFPQ23m3d6banm_cf = 0x8016a0c0;
SetupTextures_Player__FPQ23m3d5mdl_ci = 0x800B3E50;
SetupTextures_Map__FPQ23m3d5mdl_ci = 0x800B3F50;
@@ -982,6 +983,57 @@ SECTIONS {
GetResAnmChr = 0x8023A1F0;
GetResAnmTexPat = 0x8023A340;
+ GetResAnmChr__Q34nw4r3g3d7ResFileCFPCc = 0x8023a1f0;
+ GetResAnmTexPat__Q34nw4r3g3d7ResFileCFPCc = 0x8023a340;
+
+ __ct__12mAllocator_cFv = 0x8016a720;
+ __vt__12mAllocator_cFv = 0x80329a04;
+ __dt__12mAllocator_cFv = 0x8016a770;
+
+ __vt__Q23m3d6banm_c = 0x80329920;
+ __dt__Q23m3d6banm_cFv = 0x80168000;
+ detach__Q23m3d6banm_cFv = 0x80168070;
+ process__Q23m3d6banm_cFv = 0x8002a1f0;
+ setupHeap__Q23m3d6banm_cFv = 0x801680e0;
+ testAnmFlag__Q23m3d6banm_cFv = 0x801681a0;
+ getFrameFromObj__Q23m3d6banm_cFv = 0x801681c0;
+ setFrameOnObj__Q23m3d6banm_cFv = 0x801681e0;
+ getUpdateRate__Q23m3d6banm_cFv = 0x80168200;
+ setUpdateRate__Q23m3d6banm_cFv = 0x80168220;
+ __ct__Q23m3d6fanm_cFv = 0x80168e50;
+ __vt__Q23m3d6fanm_c = 0x80329968;
+ __dt__Q23m3d6fanm_cFv = 0x80168ec0;
+ process__Q23m3d6fanm_cFv = 0x80168f20;
+ setFrame__Q23m3d6fanm_cFv = 0x80169120;
+ isAnimationDone__Q23m3d6fanm_cFv = 0x80169160;
+ querySomething__Q23m3d6fanm_cFv = 0x80169220;
+
+ /*FIXME not right dtor ?*/
+ __vt__Q23m3d8anmChr_c = 0x80303708;
+ __dt__Q23m3d8anmChr_cFv = 0x800260c0;
+ vf0C__Q23m3d8anmChr_cFv = 0x8002a210;
+ setup__Q23m3d8anmChr_cFQ34nw4r3g3d6ResMdlQ34nw4r3g3d9ResAnmChrP12mAllocator_cPUi = 0x80165210;
+ bind__Q23m3d8anmChr_cFPQ23m3d5mdl_cQ34nw4r3g3d9ResAnmChri = 0x80165330;
+ internalBind__Q23m3d8anmChr_cFv = 0x801653c0;
+
+ __vt__Q23m3d11anmTexPat_c = 0x80329890;
+ __dt__Q23m3d11anmTexPat_cFv = 0x80166bb0;
+ detach__Q23m3d11anmTexPat_cFv = 0x80166c20;
+ setup__Q23m3d11anmTexPat_cFQ34nw4r3g3d6ResMdlQ34nw4r3g3d12ResAnmTexPatP12mAllocator_cPUii = 0x80166970;
+ bindEntry__Q23m3d11anmTexPat_cFv = 0x80166d10;
+ bindEntry__Q23m3d11anmTexPat_cFPQ23m3d5mdl_cPQ34nw4r3g3d12ResAnmTexPatii = 0x80166d10;
+ process__Q23m3d11anmTexPat_cFv = 0x80166f10;
+ processOneEntry__Q23m3d11anmTexPat_cFv = 0x80166fc0;
+ getFrameForEntry__Q23m3d11anmTexPat_cFv = 0x80167020;
+ setFrameForEntry__Q23m3d11anmTexPat_cFfi = 0x80167020;
+ getUpdateRateForEntry__Q23m3d11anmTexPat_cFv = 0x80167040;
+ setUpdateRateForEntry__Q23m3d11anmTexPat_cFfi = 0x80167050;
+ isEntryAnimationDone__Q23m3d11anmTexPat_cFv = 0x80167060;
+ queryEntrySomething__Q23m3d11anmTexPat_cFv = 0x80167070;
+ setEntryByte34__Q23m3d11anmTexPat_cFUci = 0x80167080;
+ getEntryField28__Q23m3d11anmTexPat_cFv = 0x801670a0;
+ vf0C__Q23m3d11anmTexPat_cFv = 0x801670c0;
+
m3d__mdl_c__DoStuff = 0x80169ED0;
__ashldi3 = 0x802DD4DC;
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);