summaryrefslogtreecommitdiff
path: root/src/bossThwompaDomp.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/bossThwompaDomp.cpp312
1 files changed, 276 insertions, 36 deletions
diff --git a/src/bossThwompaDomp.cpp b/src/bossThwompaDomp.cpp
index 1c366b8..268b4bd 100644
--- a/src/bossThwompaDomp.cpp
+++ b/src/bossThwompaDomp.cpp
@@ -1,6 +1,7 @@
#include <common.h>
#include <game.h>
#include <g3dhax.h>
+#include <sfx.h>
#include "daEnDosun_c.h"
@@ -22,30 +23,65 @@ void sub_8009ea50( _464_struct* data ) {
}
#endif
+
+//FIXME find if needed
+extern "C" int s_800b56e0(Vec,float*,float*,u8 zone);
+//FIXME
+extern "C" void* unk_8042A008;
+extern "C" void UnknownBullshit(void*,int,int,int,int);
+//FIXME
+extern "C" void* SoundRelatedClass;
+extern "C" Vec ConvertStagePositionIntoScreenPosition__Maybe(Vec);
+extern "C" void AnotherSoundRelatedFunction(void*,SFX,Vec,int);
+
+#define OLD 0
+#define STATES_NEEDED 1
+#define SETTINGS1CHANGE 1
class daEnMegaDosun_c : public daEnDosun_c {
- //int onCreate(); // overload for mega
- //int onExecute();
+ int onCreate(); // overload for mega
+ int onExecute();
static daEnMegaDosun_c *build();
//int checkZoneBoundaries(int);
+#if STATES_NEEDED
//FIXME
- //USING_STATES(daEnMegaDosun_c);
- //DECLARE_STATE(Wait);
+ USING_STATES(daEnMegaDosun_c);
+ DECLARE_STATE(UpWait);
+ DECLARE_STATE(DownMoveWait);
+ DECLARE_STATE(PuruMove);
+ DECLARE_STATE(DownMoveKameck);
+ DECLARE_STATE(DownMove);
+ DECLARE_STATE(DownWait);
+ DECLARE_STATE(UpMove);
+#endif
};
+#if STATES_NEEDED
+CREATE_STATE(daEnMegaDosun_c, UpWait);
+CREATE_STATE(daEnMegaDosun_c, DownMoveWait);
+CREATE_STATE(daEnMegaDosun_c, PuruMove);
+CREATE_STATE(daEnMegaDosun_c, DownMoveKameck);
+CREATE_STATE(daEnMegaDosun_c, DownMove);
+CREATE_STATE(daEnMegaDosun_c, DownWait);
+CREATE_STATE(daEnMegaDosun_c, UpMove);
+#endif
+
daEnMegaDosun_c *daEnMegaDosun_c::build() {
+ OSReport("Building MegaThwomp\n");
void *buffer = AllocFromGameHeap1(sizeof(daEnMegaDosun_c));
return new(buffer) daEnMegaDosun_c;
}
-#if 0
+#if 1
+//FIXME stops halfway up
int daEnMegaDosun_c::onCreate() {
- //FIXME
+ OSReport("daEnMegaDosun::onCreate()\n");
+
this->bigOrSmall = 1; // 0=small,1=big,2=mega
this->setupBodyModel(); // add this for linking/rename
-
+
this->_36D = 0; // byte
this->holdsFromSettings = this->settings & 0xf; //0=normal,1=??,2=fall
@@ -54,17 +90,10 @@ int daEnMegaDosun_c::onCreate() {
this->pos.y -= 21.0;
this->pos.z = -280.0; // behind layer1 (hides spikes)
- //FIXME might be u32 0x11804101
- /*
- this->collision_struct[0] = 0x11;
- this->collision_struct[1] = 0x80;
- this->collision_struct[2] = 0x41;
- this->collision_struct[3] = 0x01;
- */
- this->collision_struct = 0x11804101;
- this->_5C0 = 0xFFFE1000;
- this->_5C4 = 0x1F000;
- this->_5C8 = 0x5000;
+ this->collision_struct[0] = 0x11804101;
+ this->collision_struct[1] = 0xFFFE1000;
+ this->collision_struct[2] = 0x0001F000;
+ this->collision_struct[3] = 0x00005000;
/*
//0x80ACF990 + 0x8C = 80acfa1C
@@ -74,6 +103,7 @@ int daEnMegaDosun_c::onCreate() {
*/
ActivePhysics::Info hm;
hm.xDistToCenter = 0.0;
+ //FIXME find the missing link
hm.yDistToCenter = 41.0;
hm.xDistToEdge = 36.0;
hm.yDistToEdge = 38.0;
@@ -83,6 +113,7 @@ int daEnMegaDosun_c::onCreate() {
hm.bitfield2 = 0x0000820E;
hm.unkShort1C = 0x0100;
hm.callback = &dEn_c::collisionCallback;
+ OSReport("this->aPhysiscs.initWithStruct(this,&hm);\n");
this->aPhysics.initWithStruct(this, &hm);
/* 0x00000001,0xfffe1000,0x0001f000,0x00055000,
@@ -90,8 +121,9 @@ int daEnMegaDosun_c::onCreate() {
* 0x03000000,0x0000004f,0x0000820e,0x01000000,
* dEn_c::collisionCallback
*/
- u8 s3[] = {0,0,0,1,0xff,0xfe,0x10,0,0,1,0xf0,0,0,5,0x50,0};
- //FIXME 0x80ACF990 + 0x58 = 80acf9e8
+ //u8 s3[] = {0,0,0,1,0xff,0xfe,0x10,0,0,1,0xf0,0,0,5,0x50,0};
+ u8 s3[] = {0,0,0,1,0xff,0xfe,0x10,0,0,1,0xf0,0,0xff,0xfe,0x10,0};
+ OSReport("this->collMgr.Init(this,(u8*)&this->collision_struct,(u8*)&s3,0);\n");
this->collMgr.Init(this,(u8*)&this->collision_struct,(u8*)&s3,0);
this->pos_delta2.x = 0.0;
@@ -100,6 +132,7 @@ int daEnMegaDosun_c::onCreate() {
this->_320 = 0.0;
this->_324 = 48.0;
+ OSReport("this->aPhysics.addToList();\n");
this->aPhysics.addToList();
this->scale.x = 1.0;
@@ -113,6 +146,7 @@ int daEnMegaDosun_c::onCreate() {
this->rot.y = 0;
this->rot.z = 0;
+ OSReport("this->doStateChange(FOO): %d\n", this->holdsFromSettings);
// check settings bit
if(this->holdsFromSettings == 2) {
this->doStateChange(&StateID_DownMove_Kameck);
@@ -124,22 +158,230 @@ int daEnMegaDosun_c::onCreate() {
}
#endif
-#if 0
int daEnMegaDosun_c::onExecute() {
acState.execute();
- //FIXME change to do outro when leaving screen
- //this->checkZoneBoundaries(0);
+ /*
+ float tempRect[4] = {this->_320,this->_324,0.5*this->spriteSomeRectX,0.5*this->spriteSomeRectY};
+ int foo = this->outOfZone(this->pos, tempRect, this->currentZoneID);
+ //float tempRect2[4] = {this->_338, this->_33C, this->_340, this->_344};
+ //OSReport("s_800b56e0()\n");
+ //int bar = s_800b56e0(this->pos, tempRect, tempRect2, this->currentZoneID);
+ //OSReport("foo: %d, bar: %d\n", foo, bar);
+ if(foo) {
+ OSReport("this->outOfZone(%d) : %d\n", this->currentZoneID, foo);
+ OSReport("daEnMegaDosun_c has left the building\n");
+ this->Delete(this->_390);
+ //FIXME change to do outro when leaving screen
+ }else{
+ OSReport("this->outOfZone(%d) : %d\n", this->currentZoneID, foo);
+ }
+ */
+ int ret = this->checkZoneBoundaries(0);
+ if(ret) {
+ OSReport("daEnMegaDosun_c has left the building\n");
+ }
return 1;
}
+
+#if STATES_NEEDED
+//FIXME add sideways moving
+//StateID_UpWait
+void daEnMegaDosun_c::beginState_UpWait() {
+ OSReport("beginState_UpWait()\n");
+ this->countdownTimer = 0;
+ if(!this->bigOrSmall)
+ return;
+ this->collision_struct[0] = 0x11804101;
+}
+void daEnMegaDosun_c::executeState_UpWait() {
+ OSReport("executeState_UpWait()\n");
+ if(this->countdownTimer != 0) {
+ this->countdownTimer--;
+ return;
+ }
+
+ //FIXME need megasized - also needs to be less leeway
+ float _array[] = { 48.0, 80.0 }; // small, big
+ //CheckIfPlayerBelow(xDelta, yDelta);
+ //if(this->CheckIfPlayerBelow(80.0, 256.0)) {
+ if(this->CheckIfPlayerBelow(40.0, 256.0)) {
+ this->doStateChange(&StateID_DownMoveWait);
+ this->speed.y = 0.0;
+ }
+}
+void daEnMegaDosun_c::endState_UpWait() {
+ OSReport("endState_UpWait()\n");
+ return;
+}
+
+//StateID_DownMoveWait
+void daEnMegaDosun_c::beginState_DownMoveWait() {
+ OSReport("beginState_DownMoveWait()\n");
+ this->anmVis.playState = 1;
+ this->bodyModel.bindAnim(&this->anmVis, 0.5);
+}
+void daEnMegaDosun_c::executeState_DownMoveWait() {
+ OSReport("executeState_DownMoveWait()\n");
+ if(this->anmVis.isAnimationDone())
+ this->doStateChange(&StateID_PuruMove);
+ this->anmVis.process();
+}
+void daEnMegaDosun_c::endState_DownMoveWait() {
+ OSReport("endState_DownMoveWait()\n");
+ return;
+}
+
+//StateID_PuruMove
+void daEnMegaDosun_c::beginState_PuruMove() {
+ OSReport("beginState_PuruMove()\n");
+ this->puruMoveCounter = 8;
+ this->shakeIndex = 0;
+}
+void daEnMegaDosun_c::executeState_PuruMove() {
+ OSReport("executeState_PuruMove()\n");
+ if(this->puruMoveCounter == 0) {
+ this->shakePosXoffset = 0.0;
+ this->doStateChange(&StateID_DownMove);
+ return;
+ }
+
+ this->puruMoveCounter--;
+ if(this->puruMoveCounter & 2 == 0)
+ return;
+
+ float _array[] = {2.0, 0.0};
+ this->shakeIndex ^= 1;
+ this->shakePosXoffset = _array[this->shakeIndex];
+}
+void daEnMegaDosun_c::endState_PuruMove() {
+ OSReport("endState_PuruMove()\n");
+ return;
+}
+
+//StateID_DownMoveKameck
+void daEnMegaDosun_c::beginState_DownMoveKameck() {
+ OSReport("beginState_DownMoveKameck()\n");
+ this->anmVis.playState = 1;
+ this->bodyModel.bindAnim(&this->anmVis, 0.5);
+}
+void daEnMegaDosun_c::executeState_DownMoveKameck() {
+ OSReport("executeState_DownMoveKameck()\n");
+ if(this->anmVis.isAnimationDone())
+ this->doStateChange(&StateID_DownMove);
+ this->anmVis.process();
+}
+void daEnMegaDosun_c::endState_DownMoveKameck() {
+ OSReport("endState_DownMoveKameck()\n");
+ return;
+}
+
+//StateID_DownMove
+void daEnMegaDosun_c::beginState_DownMove() {
+ OSReport("beginState_DownMove()\n");
+ this->speed.y = 0.0;
+}
+void daEnMegaDosun_c::executeState_DownMove() {
+ OSReport("executeState_DownMove()\n");
+ this->HandleYSpeed();
+ this->UpdateObjectPosBasedOnSpeedValuesReal();
+
+ //FIXME what do I do? - bottom detection
+ int ret = this->collMgr.s_80072BC0();
+ OSReport("s_80072BC0(): %08x\n", ret);
+ if(!ret)
+ return;
+
+#if SETTINGS1CHANGE
+ if((this->holdsFromSettings == 1) && (ret & 0x8000)) {
+ OSReport("this->speed.y = 0.0;\n");
+ this->speed.y = 0.0;
+ }
+
+ if(this->holdsFromSettings == 2) {
+ OSReport("ret |= 0x400000\n");
+ ret |= 0x400000;
+ }
+#else
+ if(this->holdsFromSettings == 1) {
+ OSReport("ret |= 0x400000\n");
+ ret |= 0x400000;
+ }
+#endif
+
+ if(!(ret & 0x400000)) {
+ OSReport("doStateChange(&StateID_DownWait)\n");
+ this->doStateChange(&StateID_DownWait);
+ this->countdownTimer = 0x40;
+ this->speed.y = 0.0;
+ UnknownBullshit(unk_8042A008, 0, 1, 0, 0);
+ }else{
+ this->collision_struct[0] = 0x00000001;
+ this->speed.y = 0.0;
+ OSReport("UnknownBullshit(%x,%d,%d,%d,%d)\n", unk_8042A008,0,1,0,0);
+ UnknownBullshit(unk_8042A008, 0, 1, 0, 0);
+ this->collMgr.Clear2();
+ }
+
+ this->spawnEffects();
+ Vec p = ConvertStagePositionIntoScreenPosition__Maybe(this->pos);
+ AnotherSoundRelatedFunction(SoundRelatedClass, SE_EMY_BIG_DOSSUN, p, 0);
+ //SoundRelatedClass.AnotherSoundRelatedFunction(SE_EMY_BIG_DOSSUN, p, 0);
+}
+void daEnMegaDosun_c::endState_DownMove() {
+ OSReport("endState_DownMove()\n");
+ return;
+}
+
+//StateID_DownWait
+void daEnMegaDosun_c::beginState_DownWait() {
+ OSReport("beginState_DownWait()\n");
+ return;
+}
+void daEnMegaDosun_c::executeState_DownWait() {
+ OSReport("executeState_DownWait()\n");
+ if(this->countdownTimer == 0) {
+ this->doStateChange(&StateID_UpMove);
+ }else{
+ this->countdownTimer--;
+ if(this->countdownTimer & 0xff == 0x20)
+ this->anmVis.playState = 3;
+ }
+
+ this->anmVis.process();
+}
+void daEnMegaDosun_c::endState_DownWait() {
+ OSReport("endState_DownWait()\n");
+ return;
+}
+
+//StateID_UpMove
+void daEnMegaDosun_c::beginState_UpMove() {
+ OSReport("beginState_UpMove()\n");
+ this->collMgr.Clear2();
+}
+void daEnMegaDosun_c::executeState_UpMove() {
+ OSReport("executeState_UpMove()\n");
+ this->speed.y = 0.875;
+ this->UpdateObjectPosBasedOnSpeedValuesReal();
+ int ret = this->collMgr.SomethingSemiImportant(0);
+ OSReport("this->collMgr.SomethingSemiImportant(0): %08x\n", ret);
+ if(ret != 0) { // at top
+ this->doStateChange(&StateID_UpWait);
+ this->countdownTimer = 0xc;
+ }
+}
+void daEnMegaDosun_c::endState_UpMove() {
+ OSReport("endState_UpMove()\n");
+ return;
+}
#endif
-//FIXME
#if 0
int daEnMegaDosun_c::checkZoneBoundaries(int foo) {
- if(this->_36C == 2) { // is eaten
+ if(this->eatenState == 2) { // is eaten
return 0;
}
@@ -150,16 +392,14 @@ int daEnMegaDosun_c::checkZoneBoundaries(int foo) {
int ret = 0;
-#if 0
Rect tempRect = (Rect){this->_320, this->_324,
0.5 * this->spriteSomeRectX, 0.5 * this->spriteSomeRectY};
Rect tempRect2 = (Rect){_338, _33C, _340, _344};
- if(this->s800064da0(pos, &tempRect, currentZoneId) ||
+ if(this->outOfZone(this->pos, &tempRect, currentZoneId) ||
(!(foo&0x4) && s_800b56e0(pos, &tempRect, &tempRect2, currentZoneId)) )
{
ret = 1;
}
-#endif
if(ret && !(foo & 0x2))
this->Delete(this->_390);
@@ -173,22 +413,22 @@ extern "C" bool CollidedWithTile(u8 *);
extern "C" void *SomeStrangeModification(dEn_c *);
void ThwompaDompMoveC(dEn_c *Sprite) {
-
-
-
+
+
+
bool FirstCheck;
bool SecondCheck;
-
+
// Check for collisions with walls?
FirstCheck = CollidedWithTile(Sprite->collMgr);
SomeStrangeModification(Sprite);
SecondCheck = CollidedWithTile(Sprite->collMgr);
-
+
OSReport("XPos = %f, FirstCheck = %d, SecondCheck = %d", Sprite->pos.x, FirstCheck, SecondCheck);
if ((FirstCheck != 0) && (SecondCheck != 0)) {
OSReport("Actually doing something, I swear");
-
+
Sprite->pos.y = Sprite->pos.y + 16.0;
Sprite->pos.x = Sprite->pos.x - 180.0;
@@ -205,8 +445,8 @@ void ThwompaDompMoveC(dEn_c *Sprite) {
else {
Sprite->pos.x = Sprite->pos.x - 1.0; }
}
-
-
+
+
return;
}
#endif