summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/bossBridgeBowser.cpp8
-rw-r--r--src/bossMegaGoomba.cpp345
-rw-r--r--src/bossPodouble.cpp4
-rw-r--r--src/bossSamurshai.cpp803
-rw-r--r--src/makeYourOwnModelSprite.cpp9
-rwxr-xr-xsrc/mrsun.cpp9
-rw-r--r--src/music.cpp6
-rw-r--r--src/shyguy.cpp36
-rw-r--r--src/topman.cpp7
9 files changed, 1067 insertions, 160 deletions
diff --git a/src/bossBridgeBowser.cpp b/src/bossBridgeBowser.cpp
index c507e6c..9663882 100644
--- a/src/bossBridgeBowser.cpp
+++ b/src/bossBridgeBowser.cpp
@@ -15,12 +15,15 @@ extern "C" void *BowserDamageKill(dEn_c *);
extern "C" void *BowserDamageEnd(dEn_c *);
int HP = 2;
+int lastBomb = 0;
void BowserDoomSpriteCollision(dEn_c *bowser, ActivePhysics *apThis, ActivePhysics *apOther) {
// If you collide with something or other, call the fireball collision
if (apOther->owner->name == 674) {
+ if (lastBomb == apOther->owner->id) { return; }
+
// void * bowserClass = (void*)(((u32)bowser) + 0x5F8);
// int HP = *(int*)(((u32)bowserClass) + 4);
@@ -42,7 +45,7 @@ void BowserDoomSpriteCollision(dEn_c *bowser, ActivePhysics *apThis, ActivePhysi
BowserDamageEnd(bowser);
// daBossKoopaDemo_c *BowserDemo = (daBossKoopaDemo_c*)FindActorByType(BOSS_KOOPA_DEMO, 0);
- daBossKoopa_c *BowserDemo = (daBossKoopa_c*)bowser;
+ daBossKoopa_c *BowserClass = (daBossKoopa_c*)bowser;
OSReport("Koopa Controller: %x", BowserClass);
BowserClass->doStateChange(&daBossKoopa_c::StateID_Fall);
dFlagMgr_c::instance->set(3, 0, true, false, false);
@@ -59,6 +62,8 @@ void BowserDoomSpriteCollision(dEn_c *bowser, ActivePhysics *apThis, ActivePhysi
HP -= 1;
}
+ lastBomb = apOther->owner->id;
+
dEn_c * bomb = (dEn_c*)apOther->owner;
bomb->kill();
}
@@ -71,6 +76,7 @@ void BowserDoomStart(dStageActor_c *Controller) {
dEn_c *Bowser = (dEn_c*)FindActorByType(EN_BOSS_KOOPA, 0);
Bowser->Delete(1);
+ lastBomb = 0;
}
void BowserDoomExecute(dStageActor_c *Controller) {
diff --git a/src/bossMegaGoomba.cpp b/src/bossMegaGoomba.cpp
index e4bc270..0029f10 100644
--- a/src/bossMegaGoomba.cpp
+++ b/src/bossMegaGoomba.cpp
@@ -4,16 +4,33 @@
#include <sfx.h>
#include "boss.h"
+extern "C" void *ShakeScreen(void *, unsigned int, unsigned int, unsigned int, unsigned int);
+extern "C" void *ShakePlayers(dEn_c *);
+extern "C" void *StopPlayerShake(dEn_c *);
+extern "C" void *StageScreen;
+
+const char* MGarcNameList [] = {
+ "kuriboBig",
+ "kuriboBoss",
+ NULL
+};
+
//Enable this if you're fixing it
void setNewActivePhysicsRect(dStageActor_c* actor, Vec* scale) {
float amtX = scale->x;
float amtY = scale->y;
+ // 0, 20.0, 18.0, 20.0
ActivePhysics::Info info;
+ // info.xDistToCenter = 0.0;
+ // info.yDistToCenter = 7.65 * amtY;
+ // info.xDistToEdge = 8.0 * amtX;
+ // info.yDistToEdge = 8.7 * amtY;
+
info.xDistToCenter = 0.0;
- info.yDistToCenter = 7.65 * amtY;
- info.xDistToEdge = 4.0 * amtX;
- info.yDistToEdge = 7.7 * amtY;
+ info.yDistToCenter = 22.0 * amtY;
+ info.xDistToEdge = 18.0 * amtX;
+ info.yDistToEdge = 24.0 * amtY;
info.category1 = actor->aPhysics.info.category1;
info.category2 = actor->aPhysics.info.category2;
@@ -28,7 +45,7 @@ void setNewActivePhysicsRect(dStageActor_c* actor, Vec* scale) {
actor->aPhysics.addToList();
}
-class daMegaGoomba_c : public daBoss {
+class daMegaGoomba_c : public dEn_c {
int onCreate();
int onDelete();
int onExecute();
@@ -57,6 +74,9 @@ class daMegaGoomba_c : public daBoss {
float JumpDist;
float JumpTime;
+ char isBigBoss;
+ char isPanic;
+
bool takeHit(char count);
void bindAnimChr_and_setUpdateRate(const char* name, int unk, float unk2, float rate);
@@ -70,8 +90,8 @@ class daMegaGoomba_c : public daBoss {
void updateModelMatrices();
- bool preSpriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
- bool prePlayerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ // bool preSpriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ // bool prePlayerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
// bool preYoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther);
// bool stageActorCollision(ActivePhysics *apThis, ActivePhysics *apOther);
@@ -82,13 +102,15 @@ class daMegaGoomba_c : public daBoss {
void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther);
bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther);
void collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther);
- void collisionCat5_Mario(ActivePhysics *apThis, ActivePhysics *apOther);
+ // void collisionCat5_Mario(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther);
void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther);
void collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther);
void collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther);
void collisionCat11_PipeCannon(ActivePhysics *apThis, ActivePhysics *apOther);
void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther);
void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther);
+ void addScoreWhenHit(void *other);
void _vf120(ActivePhysics *apThis, ActivePhysics *apOther);
void _vf110(ActivePhysics *apThis, ActivePhysics *apOther);
void _vf108(ActivePhysics *apThis, ActivePhysics *apOther);
@@ -115,8 +137,6 @@ daMegaGoomba_c *daMegaGoomba_c::build() {
}
-
-
//FIXME make this dEn_c->used...
extern "C" int SomeStrangeModification(dStageActor_c* actor);
extern "C" void DoStuffAndMarkDead(dStageActor_c *actor, Vec vector, float unk);
@@ -129,6 +149,7 @@ CREATE_STATE(daMegaGoomba_c, Walk);
CREATE_STATE(daMegaGoomba_c, Turn);
CREATE_STATE(daMegaGoomba_c, Jump);
CREATE_STATE(daMegaGoomba_c, Launch);
+CREATE_STATE(daMegaGoomba_c, Outro);
//TODO better fix for possible bug with sign (ex. life=120; count=-9;)
@@ -140,7 +161,10 @@ bool daMegaGoomba_c::takeHit(char count) {
c = 127 - l;
}
this->life -= c;
- this->XSpeed += 0.25;
+ // this->XSpeed += 0.10;
+
+ // float rate = this->animationChr.getUpdateRate();
+ // this->animationChr.setUpdateRate(rate+0.05);
this->JumpHeight += 12.0;
this->JumpDist += 12.0;
this->JumpTime += 5.0;
@@ -153,27 +177,19 @@ bool daMegaGoomba_c::takeHit(char count) {
#define ACTIVATE 1
#define DEACTIVATE 0
-bool daMegaGoomba_c::preSpriteCollision(ActivePhysics *apThis, ActivePhysics *apOther) {
- return false;
-}
-bool daMegaGoomba_c::prePlayerCollision(ActivePhysics *apThis, ActivePhysics *apOther) {
- return false;
-}
-
-
+extern "C" void *EN_LandbarrelPlayerCollision(dEn_c* t, ActivePhysics *apThis, ActivePhysics *apOther);
void daMegaGoomba_c::spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther) {
//HE'S TOO BADASS TO STOP FOR SMALLER GOOMBAS
-#if 0
- float me = apThis->firstFloatArray[3];
- if(((this->direction == 1) && (me > 0.0)) || ((this->direction == 0) && (me < 0.0))) {
- dStateBase_c* state = this->acState.getCurrentState();
- if(!state->isEqual(&StateID_Turn)) {
- doStateChange(&StateID_Turn);
+ #if 0
+ float me = apThis->firstFloatArray[3];
+ if(((this->direction == 1) && (me > 0.0)) || ((this->direction == 0) && (me < 0.0))) {
+ dStateBase_c* state = this->acState.getCurrentState();
+ if(!state->isEqual(&StateID_Turn)) {
+ doStateChange(&StateID_Turn);
+ }
}
- }
-#endif
+ #endif
}
-
void daMegaGoomba_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) {
/* * * * * * * * * * * * * * * * * * * * *
@@ -194,6 +210,7 @@ void daMegaGoomba_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOth
//FIXME rename and make part of dStageActor_c
//unk=0 does _vfs, unk=1 does playSeCmnStep
//char ret = usedForDeterminingStatePress_or_playerCollision(this, apThis, apOther, 0);
+
char ret = usedForDeterminingStatePress_or_playerCollision(this, apThis, apOther, 2);
if(ret == 1) { // regular jump
apOther->someFlagByte |= 2;
@@ -215,13 +232,28 @@ void daMegaGoomba_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOth
this->flags_4FC |= (1<<(31-7));
this->counter_504[apOther->owner->which_player] = 0;
}
+void daMegaGoomba_c::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther) {
+ OSReport("Ground Pounded");
+ apOther->someFlagByte |= 2;
+
+ if(this->takeHit(1))
+ doStateChange(&StateID_DieFall);
+
+ // dEn_c *mario = (dEn_c*)apOther->owner;
+ // mario->speed.y = 6.0;
+ // EN_LandbarrelPlayerCollision(this, apThis, apOther);
+ // mario->speed.x += 16.0;
+ this->isDead = 0;
+ this->flags_4FC |= (1<<(31-7));
+ this->counter_504[apOther->owner->which_player] = 0;
+}
void daMegaGoomba_c::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) {}
bool daMegaGoomba_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { return false; }
-void daMegaGoomba_c::collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther) { }
-void daMegaGoomba_c::collisionCat5_Mario(ActivePhysics *apThis, ActivePhysics *apOther) { }
+void daMegaGoomba_c::collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther) { doStateChange(&StateID_DieFall); }
+// void daMegaGoomba_c::collisionCat5_Mario(ActivePhysics *apThis, ActivePhysics *apOther) { }
void daMegaGoomba_c::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) {
if(this->takeHit(1))
doStateChange(&StateID_DieFall);
@@ -237,6 +269,7 @@ void daMegaGoomba_c::collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysi
if(this->takeHit(1))
doStateChange(&StateID_DieFall);
}
+void daMegaGoomba_c::addScoreWhenHit(void *other) {}
void daMegaGoomba_c::_vf120(ActivePhysics *apThis, ActivePhysics *apOther) { }
void daMegaGoomba_c::_vf110(ActivePhysics *apThis, ActivePhysics *apOther) { }
void daMegaGoomba_c::_vf108(ActivePhysics *apThis, ActivePhysics *apOther) { }
@@ -267,15 +300,15 @@ void daMegaGoomba_c::dieFall_Execute() {
void daMegaGoomba_c::setupBodyModel() {
allocator.link(-1, GameHeaps[0], 0, 0x20);
- this->resFile.data = getResource("kuribo", "g3d/t02.brres");
- nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("kuribo");
+ this->resFile.data = getResource("kuriboBoss", "g3d/kuriboBoss.brres");
+ nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("kuriboBig");
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);
- this->bindAnimChr_and_setUpdateRate("walk", 1, 0.0, 1.0);
+ this->bindAnimChr_and_setUpdateRate("walk", 1, 0.0, 0.2);
nw4r::g3d::ResAnmTexPat anmPat = this->resFile.GetResAnmTexPat("walk");
this->resTexPat = anmPat;
@@ -328,14 +361,17 @@ int daMegaGoomba_c::onCreate() {
this->rot.y = (this->direction) ? 0xE000 : 0x2000;
this->_518 = 2;
+ isBigBoss = this->settings & 0xF;
+ this->animationChr.setCurrentFrame(69.0);
+
ActivePhysics::Info hm;
hm.xDistToCenter = 0.0;
hm.yDistToCenter = 8.0;
- hm.xDistToEdge = 8.0;
- hm.yDistToEdge = 8.0;
+ hm.xDistToEdge = 12.0;
+ hm.yDistToEdge = 12.0;
hm.category1 = 0x3;
hm.category2 = 0x0;
- hm.bitfield1 = 0x6f;
+ hm.bitfield1 = 0x4f;
hm.bitfield2 = 0xffbafffe;
hm.unkShort1C = 0;
hm.callback = &dEn_c::collisionCallback;
@@ -354,14 +390,21 @@ int daMegaGoomba_c::onCreate() {
life = 3;
already_hit = false;
this->x_speed_inc = 0.1;
+ this->pos.y -= 16.0;
// 2.0 is good final speed
- this->XSpeed = 1.5;
+ this->XSpeed = 0.2;
this->JumpHeight = 48.0;
this->JumpDist = 64.0;
this->JumpTime = 50.0;
- doStateChange(&StateID_Grow);
+ // doStateChange(&StateID_Grow);
+
+ scale.x = 5.0;
+ scale.y = 5.0;
+ scale.z = 5.0;
+ setNewActivePhysicsRect(this, &this->scale);
+ doStateChange(&StateID_Walk);
this->onExecute();
return true;
@@ -410,65 +453,66 @@ void daMegaGoomba_c::updateModelMatrices() {
///////////////
// Grow State
///////////////
- void daMegaGoomba_c::beginState_Grow() {
- this->timer = 0;
+ // void daMegaGoomba_c::beginState_Grow() {
+ // this->timer = 0;
- SetupKameck(this, Kameck);
- }
+ // SetupKameck(this, Kameck);
+ // }
- void daMegaGoomba_c::executeState_Grow() {
- this->timer += 1;
+ // void daMegaGoomba_c::executeState_Grow() {
+ // this->timer += 1;
- bool ret;
- ret = GrowBoss(this, Kameck, 1.0, 7.0, 0, this->timer);
-
- if (ret) {
- PlaySound(this, SE_EMY_KURI_CHANGE_BIG);
- doStateChange(&StateID_Walk);
- }
- }
- void daMegaGoomba_c::endState_Grow() {
- CleanupKameck(this, Kameck);
- }
-
-
-// Grow State
-// void daMegaGoomba_c::beginState_Grow() {
-// this->timer = 1.0;
-
-// float start, end, shift1, shift2;
-// start = 59.0;
-// shift1 = 90.0;
-// shift2 = 120.0;
-// end = 139.0;
-// /* keysX[i] = { frame, value, slope }; */
-// Xkey_count = 7;
-// keysX[0] = (HermiteKey){ start, 1.0, 1.0 };
-// keysX[1] = (HermiteKey){ (start+shift1)/2, 2.0, 1.0 };
-// keysX[2] = (HermiteKey){ shift1, 4.0, 1.0 };
-// keysX[3] = (HermiteKey){ (shift1+shift2)/2, 3.0, 1.0 };
-// keysX[3] = (HermiteKey){ shift2, 6.0, 1.0 };
-// keysX[3] = (HermiteKey){ (shift2+end)/2, 5.0, 1.0 };
-// keysX[6] = (HermiteKey){ end, 7.0, 1.0 };
-// }
-// void daMegaGoomba_c::executeState_Grow() {
-
-// this->timer += 1.0;
-
-// if ((this->timer > 60.0) && (this->timer < 140.0)) {
+ // bool ret;
+ // // ret = GrowBoss(this, Kameck, 1.0, 16.0, 0, this->timer);
+ // ret = GrowBoss(this, Kameck, 1.0, 5.0, 0, this->timer);
+
+ // if (ret) {
+ // setNewActivePhysicsRect(this, &this->scale);
+ // PlaySound(this, SE_EMY_KURI_CHANGE_BIG);
+ // doStateChange(&StateID_Walk);
+ // }
+ // }
+ // void daMegaGoomba_c::endState_Grow() {
+ // CleanupKameck(this, Kameck);
+ // }
+
+ // Grow State
+ // void daMegaGoomba_c::beginState_Grow() {
+ // this->timer = 1.0;
+
+ // float start, end, shift1, shift2;
+ // start = 59.0;
+ // shift1 = 90.0;
+ // shift2 = 120.0;
+ // end = 139.0;
+ // /* keysX[i] = { frame, value, slope }; */
+ // Xkey_count = 7;
+ // keysX[0] = (HermiteKey){ start, 1.0, 1.0 };
+ // keysX[1] = (HermiteKey){ (start+shift1)/2, 2.0, 1.0 };
+ // keysX[2] = (HermiteKey){ shift1, 4.0, 1.0 };
+ // keysX[3] = (HermiteKey){ (shift1+shift2)/2, 3.0, 1.0 };
+ // keysX[3] = (HermiteKey){ shift2, 6.0, 1.0 };
+ // keysX[3] = (HermiteKey){ (shift2+end)/2, 5.0, 1.0 };
+ // keysX[6] = (HermiteKey){ end, 7.0, 1.0 };
+ // }
+ // void daMegaGoomba_c::executeState_Grow() {
+
+ // this->timer += 1.0;
+
+ // if ((this->timer > 60.0) && (this->timer < 140.0)) {
-// float modifier = GetHermiteCurveValue(this->timer, this->keysX, Xkey_count);
-// this->scale = (Vec){modifier, modifier, modifier};
-// setNewActivePhysicsRect(this, &this->scale);
+ // float modifier = GetHermiteCurveValue(this->timer, this->keysX, Xkey_count);
+ // this->scale = (Vec){modifier, modifier, modifier};
+ // setNewActivePhysicsRect(this, &this->scale);
-// }
-// if(this->timer == 60.0)
-// PlaySound(this, SE_EMY_KURI_CHANGE_BIG);
-
-// if (this->timer > 170.0) { doStateChange(&StateID_Walk); }
-
-// }
-// void daMegaGoomba_c::endState_Grow() { }
+ // }
+ // if(this->timer == 60.0)
+ // PlaySound(this, SE_EMY_KURI_CHANGE_BIG);
+
+ // if (this->timer > 170.0) { doStateChange(&StateID_Walk); }
+
+ // }
+ // void daMegaGoomba_c::endState_Grow() { }
@@ -477,10 +521,10 @@ void daMegaGoomba_c::updateModelMatrices() {
void daMegaGoomba_c::beginState_Shrink() {
this->timer = 1.0;
Xkey_count = 4;
- keysX[0] = (HermiteKey){ 0.0, this->scale.y, 1.0 };
- keysX[1] = (HermiteKey){ 20.0, this->scale.y - 2.0, 1.0 };
- keysX[2] = (HermiteKey){ 40.0, this->scale.y, 1.0 };
- keysX[3] = (HermiteKey){ 59.0, this->scale.y - 2.0, 1.0 };
+ keysX[0] = (HermiteKey){ 0.0, this->scale.y, 0.5 };
+ keysX[1] = (HermiteKey){ 10.0, this->scale.y - 0.75, 0.5 };
+ keysX[2] = (HermiteKey){ 20.0, this->scale.y - 0.35, 0.5 };
+ keysX[3] = (HermiteKey){ 39.0, this->scale.y - 0.75, 0.5 };
// disable being hit
Vec tempVec = (Vec){0.0, 0.0, 0.0};
@@ -495,7 +539,7 @@ void daMegaGoomba_c::executeState_Shrink() {
if(this->timer == 2.0)
PlaySound(this, SE_EMY_KURIBO_L_DAMAGE_02);
- if (this->timer > 60.0) { doStateChange(&StateID_Walk); }
+ if (this->timer > 40.0) { doStateChange(&StateID_Walk); }
}
void daMegaGoomba_c::endState_Shrink() {
// enable being hit
@@ -616,10 +660,26 @@ void daMegaGoomba_c::executeState_Turn() {
this->pos.x = this->last_pos.x;
DoStuffAndMarkDead(this, this->pos, 1.0);
u16 amt = (this->direction == 0) ? 0x2000 : 0xE000;
- int done = SmoothRotation(&this->rot.y, amt, 0x200);
+ int done = SmoothRotation(&this->rot.y, amt, 0x80);
if(done) {
this->doStateChange(&StateID_Walk);
}
+
+ int frame = (int)(this->animationChr.getCurrentFrame() * 5.0);
+ if ((frame == 100) || (frame == 325) || (frame == 550) || (frame == 775)) {
+ ShakeScreen(StageScreen, 0, 1, 0, 0);
+ ShakePlayers(this);
+ PlaySound(this, SE_BOSS_MORTON_GROUND_SHAKE);
+ }
+
+ if (isBigBoss) {
+ if ((frame == 250) || (frame == 500) || (frame == 700) || (frame == 900))
+ StopPlayerShake(this);
+ }
+ else {
+ if ((frame == 200) || (frame == 425) || (frame == 650) || (frame == 875))
+ StopPlayerShake(this);
+ }
}
void daMegaGoomba_c::endState_Turn() {
this->max_speed.x = (this->direction) ? -this->XSpeed : this->XSpeed;
@@ -661,32 +721,30 @@ void daMegaGoomba_c::executeState_Walk() {
}
DoStuffAndMarkDead(this, this->pos, 1.0);
- if(this->animationChr.isAnimationDone()) {
- this->animationChr.setCurrentFrame(0.0);
- int Choice = GenerateRandomNumber(6);
- switch(Choice) {
- case 0:
- //doStateChange(&StateID_Jump);
- this->speed.y = 5.0 + (1.0 * (life - 2));
- break;
- case 1:
- doStateChange(&StateID_Launch);
- break;
- default:
- int new_dir = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, pos);
- if(this->direction != new_dir)
- doStateChange(&StateID_Turn);
- break;
- };
-
+ int frame = (int)(this->animationChr.getCurrentFrame() * 5.0);
+ if ((frame == 100) || (frame == 325) || (frame == 550) || (frame == 775)) {
+ ShakeScreen(StageScreen, 0, 1, 0, 0);
+ ShakePlayers(this);
+ PlaySound(this, SE_BOSS_MORTON_GROUND_SHAKE);
}
-#if 0
- //if(CollidedWithTile(this->classAt1EC)) {
- if( this->collMgr.CollidedWithTile() {
+
+ if (isBigBoss) {
+ if ((frame == 250) || (frame == 500) || (frame == 700) || (frame == 900))
+ StopPlayerShake(this);
}
-#endif
+ else {
+ if ((frame == 200) || (frame == 425) || (frame == 650) || (frame == 875))
+ StopPlayerShake(this);
+ }
+
+ if(this->animationChr.isAnimationDone()) {
+ this->animationChr.setCurrentFrame(0.0);
+ int new_dir = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, pos);
+ if(this->direction != new_dir)
+ doStateChange(&StateID_Turn);
+ }
}
void daMegaGoomba_c::endState_Walk() { }
@@ -694,35 +752,36 @@ void daMegaGoomba_c::endState_Walk() { }
-
-
///////////////
// Outro State
///////////////
- void daMegaGoomba_c::beginState_Outro() {
- OutroSetup(this);
- }
- void daMegaGoomba_c::executeState_Outro() {
+ // void daMegaGoomba_c::beginState_Outro() {
- if (this->dying == 1) {
- if (this->timer > 180) { ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE); }
- if (this->timer == 60) { PlayerVictoryCries(this); }
-
- this->timer += 1;
- return;
- }
+ // OutroSetup(this);
+ // this->aPhysics.removeFromList();
+ // }
+ // void daMegaGoomba_c::executeState_Outro() {
- bool ret;
- ret = ShrinkBoss(this, &this->pos, 0.5, this->timer);
+ // if (this->dying == 1) {
- if (ret == true) {
- BossExplode(this, &this->pos);
- this->dying = 1;
- this->timer = 0;
- }
- else { PlaySound(this, SE_EMY_BIG_KURIBO_DOWN); }
+ // if (this->timer > 180) { ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE); }
+ // if (this->timer == 60) { PlayerVictoryCries(this); }
+
+ // this->timer += 1;
+ // return;
+ // }
+
+ // bool ret;
+ // ret = ShrinkBoss(this, &this->pos, 1.0, this->timer);
+
+ // if (ret == true) {
+ // BossExplode(this, &this->pos);
+ // this->dying = 1;
+ // this->timer = 0;
+ // }
+ // else { PlaySound(this, SE_EMY_BIG_KURIBO_DOWN); }
- this->timer += 1;
- }
- void daMegaGoomba_c::endState_Outro() { }
+ // this->timer += 1;
+ // }
+ // void daMegaGoomba_c::endState_Outro() { }
diff --git a/src/bossPodouble.cpp b/src/bossPodouble.cpp
index 5d41a5c..961d760 100644
--- a/src/bossPodouble.cpp
+++ b/src/bossPodouble.cpp
@@ -82,7 +82,7 @@ daPodouble *daPodouble::build() {
// Externs and States
///////////////////////
extern "C" int SmoothRotation(short* rot, u16 amt, int unk2);
- extern "C" int GetCountofActivePlayers();
+ extern "C" int GetActivePlayerCount();
CREATE_STATE(daPodouble, Bounce);
CREATE_STATE(daPodouble, Spit);
@@ -364,7 +364,7 @@ int daPodouble::onDraw() {
if (this->timer == 382) {
- int players = GetCountofActivePlayers();
+ int players = GetActivePlayerCount();
Vec tempPos = (Vec){this->pos.x - 190.0, this->pos.y + 120.0, 3564.0};
dStageActor_c *spawner = create(AC_YOSHI_EGG, 0x71010000, &tempPos, &(S16Vec){0,0,0}, 0);
diff --git a/src/bossSamurshai.cpp b/src/bossSamurshai.cpp
new file mode 100644
index 0000000..fb906c2
--- /dev/null
+++ b/src/bossSamurshai.cpp
@@ -0,0 +1,803 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+#include <sfx.h>
+#include "boss.h"
+
+const char* SSarcNameList [] = {
+ "Shynja",
+ NULL
+};
+
+void ChucklesAndKnuckles(ActivePhysics *apThis, ActivePhysics *apOther);
+
+class daSamurshai : public daBoss {
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+
+ mHeapAllocator_c allocator;
+ nw4r::g3d::ResFile resFile;
+ m3d::mdl_c bodyModel;
+ m3d::anmChr_c chrAnimation;
+
+ mEf::es2 effect;
+
+ int isBigBoss;
+ int timer;
+ int jumpCounter;
+ char damage;
+ char isDown;
+ Vec initialPos;
+ float XSpeed;
+ u32 cmgr_returnValue;
+ dStageActor_c *chosenOne;
+ bool topHurts;
+ bool slowDown;
+ bool isBouncing;
+
+ ActivePhysics Chuckles;
+ ActivePhysics Knuckles;
+
+ static daSamurshai *build();
+
+ void bindAnimChr_and_setUpdateRate(const char* name, int unk, float unk2, float rate);
+ void updateModelMatrices();
+ bool calculateTileCollisions();
+
+ // void spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ void collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther);
+ bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther);
+ void collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ void _vf148();
+ void _vf14C();
+ int randomPlayer();
+
+ USING_STATES(daSamurshai);
+
+ DECLARE_STATE(Intro);
+ DECLARE_STATE(Walk);
+ DECLARE_STATE(Turn);
+ DECLARE_STATE(Chop);
+ DECLARE_STATE(ChargeSlash);
+ DECLARE_STATE(Uppercut);
+ DECLARE_STATE(SpinAttack);
+ DECLARE_STATE(Damage);
+ DECLARE_STATE(Outro);
+};
+
+daSamurshai *daSamurshai::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(daSamurshai));
+ return new(buffer) daSamurshai;
+}
+
+///////////////////////
+// Externs and States
+///////////////////////
+ extern "C" int SmoothRotation(short* rot, u16 amt, int unk2);
+
+ CREATE_STATE(daSamurshai, Intro);
+ CREATE_STATE(daSamurshai, Walk);
+ CREATE_STATE(daSamurshai, Turn);
+ CREATE_STATE(daSamurshai, Chop);
+ CREATE_STATE(daSamurshai, ChargeSlash);
+ CREATE_STATE(daSamurshai, Uppercut);
+ CREATE_STATE(daSamurshai, SpinAttack);
+ CREATE_STATE(daSamurshai, Damage);
+ CREATE_STATE(daSamurshai, Outro);
+
+
+////////////////////////
+// Collision Functions
+////////////////////////
+
+ void ChucklesAndKnuckles(ActivePhysics *apThis, ActivePhysics *apOther) {
+ ((dEn_c*)apThis->owner)->_vf220(apOther->owner);
+ }
+
+ void daSamurshai::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) {
+
+ char hitType = usedForDeterminingStatePress_or_playerCollision(this, apThis, apOther, 2);
+
+ if (topHurts == true) {
+ this->dEn_c::playerCollision(apThis, apOther);
+ this->_vf220(apOther->owner);
+ }
+ else if ((hitType == 1) || (hitType == 3)) {
+ apOther->someFlagByte |= 2;
+ if (this->isDown == 0) {
+ this->playEnemyDownSound1();
+ damage += 4;
+ if (damage > 15) { doStateChange(&StateID_Outro); }
+ else { doStateChange(&StateID_Damage); }
+ }
+ }
+ else {
+ this->dEn_c::playerCollision(apThis, apOther);
+ this->_vf220(apOther->owner);
+ }
+
+ this->isDead = 0;
+ this->flags_4FC |= (1<<(31-7));
+ this->counter_504[apOther->owner->which_player] = 0;
+ }
+
+ void daSamurshai::yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); }
+ void daSamurshai::collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther) { }
+ void daSamurshai::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther) {
+ apOther->someFlagByte |= 2;
+
+ if (topHurts == true) {
+ this->dEn_c::playerCollision(apThis, apOther);
+ this->_vf220(apOther->owner);
+ }
+ else if (this->isDown == 0) {
+ damage += 6;
+ if (damage > 15) { doStateChange(&StateID_Outro); }
+ else { doStateChange(&StateID_Damage); }
+ }
+
+ this->isDead = 0;
+ this->flags_4FC |= (1<<(31-7));
+ this->counter_504[apOther->owner->which_player] = 0;
+ }
+ void daSamurshai::collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther) { this->collisionCat7_WMWaggleWater(apThis, apOther); }
+ void daSamurshai::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) {
+ if (this->isDown == 0) {
+ damage += 3;
+ if (damage > 2) { doStateChange(&StateID_Outro); }
+ else { doStateChange(&StateID_Damage); }
+ }
+ }
+ void daSamurshai::collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther){ }
+ void daSamurshai::collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther){
+ if (this->isDown == 0) {
+ damage += 3;
+ if (damage > 15) { doStateChange(&StateID_Outro); }
+ else { doStateChange(&StateID_Damage); }
+ }
+
+ this->isDead = 0;
+ this->flags_4FC |= (1<<(31-7));
+ this->counter_504[apOther->owner->which_player] = 0;
+ }
+ void daSamurshai::collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther){
+ damage += 4;
+ SpawnEffect("Wm_mr_fireball_hit", 0, &apOther->owner->pos, &apOther->owner->rot, &apOther->owner->scale);
+ PlaySoundAsync(this, SE_OBJ_FIREBALL_DISAPP);
+ if (damage > 15) { doStateChange(&StateID_Outro); }
+ }
+ void daSamurshai::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) {
+ damage += 1;
+ SpawnEffect("Wm_mr_fireball_hit", 0, &apOther->owner->pos, &apOther->owner->rot, &apOther->owner->scale);
+ PlaySoundAsync(this, SE_OBJ_FIREBALL_DISAPP);
+ if (damage > 15) { doStateChange(&StateID_Outro); }
+ }
+ bool daSamurshai::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { return true; }
+ void daSamurshai::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) {
+ damage += 2;
+ this->spawnHitEffectAtPosition((Vec2){apOther->owner->pos.x, apOther->owner->pos.y});
+ if (damage > 15) { doStateChange(&StateID_Outro); }
+ }
+
+ bool daSamurshai::calculateTileCollisions() {
+ // Returns true if sprite should turn, false if not.
+
+ HandleXSpeed();
+ HandleYSpeed();
+ doSpriteMovement();
+
+ cmgr_returnValue = collMgr.CollidedWithTile();
+ collMgr.execute();
+
+ if (isBouncing) {
+ stuffRelatingToCollisions(0.1875f, 1.0f, 0.5f);
+ if (speed.y != 0.0f)
+ isBouncing = false;
+ }
+
+ float xDelta = pos.x - last_pos.x;
+ if (xDelta >= 0.0f)
+ direction = 0;
+ else
+ direction = 1;
+
+ if (collMgr.CollidedWithTile()) {
+ // Walking into a tile branch
+
+ if (cmgr_returnValue == 0)
+ isBouncing = true;
+
+ if (speed.x != 0.0f) {
+ //playWmEnIronEffect();
+ }
+
+ speed.y = 0.0f;
+
+ // u32 blah = collMgr.s_80070760();
+ // u8 one = (blah & 0xFF);
+ // static const float incs[5] = {0.00390625f, 0.0078125f, 0.015625f, 0.0234375f, 0.03125f};
+ // x_speed_inc = incs[one];
+ max_speed.x = (direction == 1) ? -1.0f : 1.0f;
+ } else {
+ x_speed_inc = 0.0f;
+ }
+
+ // Bouncing checks
+ if (_34A & 4) {
+ Vec v = (Vec){0.0f, 1.0f, 0.0f};
+ collMgr.parent_speed_ptr = &v;
+
+ if (collMgr.SomethingSemiImportant(collMgr.bitfield_for_checks))
+ speed.y = 0.0f;
+
+ collMgr.parent_speed_ptr = &speed;
+
+ } else {
+ if (collMgr.SomethingSemiImportant(collMgr.bitfield_for_checks))
+ speed.y = 0.0f;
+ }
+
+ collMgr.s_8006FA40(0);
+
+ // Switch Direction
+ if (collMgr.bitfield_for_checks & (0x15 << direction)) {
+ if (collMgr.CollidedWithTile()) {
+ isBouncing = true;
+ }
+ return true;
+ }
+ return false;
+ }
+
+void daSamurshai::bindAnimChr_and_setUpdateRate(const char* name, int unk, float unk2, float rate) {
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr(name);
+ this->chrAnimation.bind(&this->bodyModel, anmChr, unk);
+ this->bodyModel.bindAnim(&this->chrAnimation, unk2);
+ this->chrAnimation.setUpdateRate(rate);
+}
+
+int daSamurshai::onCreate() {
+
+ isBigBoss = settings & 0xF;
+
+ // Model Setup
+ allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+ this->resFile.data = getResource("Shynja", "g3d/Shynja.brres");
+ nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("Model");
+ bodyModel.setup(mdl, &allocator, 0x224, 1, 0);
+
+ // Animations start here
+ nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("c18_IDLE_R");
+ this->chrAnimation.setup(mdl, anmChr, &this->allocator, 0);
+
+ allocator.unlink();
+
+ // Character Setup
+
+ scale = (Vec){20.0, 20.0, 20.0};
+
+ pos.y = pos.y + 40.0;
+ rot.x = 0; // X is vertical axis
+ rot.y = 0xD800; // Y is horizontal axis
+ rot.z = 0; // Z is ... an axis >.>
+ direction = 1; // Heading left.
+
+ speed.x = 0.0;
+ speed.y = 0.0;
+ XSpeed = 2.0;
+ x_speed_inc = 0.2;
+ initialPos = pos;
+ topHurts = false;
+
+ // Physics
+ ActivePhysics::Info HitMeBaby;
+
+ HitMeBaby.xDistToCenter = 0.0;
+ HitMeBaby.yDistToCenter = 12.0;
+
+ HitMeBaby.xDistToEdge = 14.0;
+ HitMeBaby.yDistToEdge = 12.0;
+
+ HitMeBaby.category1 = 0x3;
+ HitMeBaby.category2 = 0x0;
+ HitMeBaby.bitfield1 = 0x4F;
+ HitMeBaby.bitfield2 = 0xffbafffe;
+ HitMeBaby.unkShort1C = 0;
+ HitMeBaby.callback = &dEn_c::collisionCallback;
+
+ this->aPhysics.initWithStruct(this, &HitMeBaby);
+ this->aPhysics.addToList();
+
+ // Tile collider
+
+ // These fucking rects do something for the tile rect
+ spriteSomeRectX = 28.0f;
+ spriteSomeRectY = 32.0f;
+ _320 = 0.0f;
+ _324 = 16.0f;
+
+ // These structs tell stupid collider what to collide with - these are from koopa troopa
+ static const u8 one[16] = {0,0,0,1, 0,0,0xC0,0, 0,0,0x40,0, 0,0,0,0};
+ static const u8 two[12] = {0,0,0,0, 0,0,0,0, 0,0,0xC0,0};
+ static const u8 three[16] = {0,0,0,1, 0,0,0x60,0, 0,0,0x90,0, 0,0,0x60,0};
+
+ collMgr.Init(this, one, two, three);
+ collMgr.execute();
+
+ cmgr_returnValue = collMgr.CollidedWithTile();
+
+ if (collMgr.CollidedWithTile())
+ isBouncing = false;
+ else
+ isBouncing = true;
+
+ // Sword Physics
+ // Chuckles is left, Knuckles is Right
+ ActivePhysics::Info iChuckles;
+ ActivePhysics::Info iKnuckles;
+
+ iChuckles.xDistToCenter = -27.0;
+ iChuckles.yDistToCenter = 12.0;
+ iChuckles.xDistToEdge = 27.0;
+ iChuckles.yDistToEdge = 10.0;
+
+ iKnuckles.xDistToCenter = 27.0;
+ iKnuckles.yDistToCenter = 12.0;
+ iKnuckles.xDistToEdge = 27.0;
+ iKnuckles.yDistToEdge = 10.0;
+
+ iKnuckles.category1 = iChuckles.category1 = 0x3;
+ iKnuckles.category2 = iChuckles.category2 = 0x0;
+ iKnuckles.bitfield1 = iChuckles.bitfield1 = 0x4F;
+ iKnuckles.bitfield2 = iChuckles.bitfield2 = 0x6;
+ iKnuckles.unkShort1C = iChuckles.unkShort1C = 0x0;
+ iKnuckles.callback = iChuckles.callback = ChucklesAndKnuckles;
+
+ Chuckles.initWithStruct(this, &iChuckles);
+ Knuckles.initWithStruct(this, &iKnuckles);
+
+ doStateChange(&StateID_Intro);
+
+ this->onExecute();
+ return true;
+}
+
+int daSamurshai::onDelete() {
+ return true;
+}
+int daSamurshai::onExecute() {
+ acState.execute();
+ updateModelMatrices();
+
+ return true;
+}
+int daSamurshai::onDraw() {
+ bodyModel.scheduleForDrawing();
+ bodyModel._vf1C();
+
+ return true;
+}
+void daSamurshai::updateModelMatrices() {
+ // This won't work with wrap because I'm lazy.
+ matrix.translation(pos.x, pos.y - 2.0, pos.z);
+ matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z);
+
+ bodyModel.setDrawMatrix(matrix);
+ bodyModel.setScale(&scale);
+ bodyModel.calcWorld(false);
+}
+
+
+///////////////
+// Intro State
+///////////////
+ void daSamurshai::beginState_Intro() {
+ this->timer = 0;
+
+ SetupKameck(this, Kameck);
+ }
+
+ void daSamurshai::executeState_Intro() {
+ this->timer += 1;
+
+ bool ret;
+ ret = GrowBoss(this, Kameck, 1.0, 5.0, 0, this->timer);
+
+ if (ret) {
+ PlaySound(this, SE_EMY_KURI_CHANGE_BIG);
+ doStateChange(&StateID_Walk);
+ }
+ }
+ void daSamurshai::endState_Intro() {
+ CleanupKameck(this, Kameck);
+ }
+
+///////////////
+// Walk State
+///////////////
+ int daSamurshai::randomPlayer() {
+ int players[4];
+ int playerCount = 0;
+
+ for (int i = 0; i < 4; i++) {
+ if (Player_Active[i] != 0 && Player_Lives[Player_ID[i]] > 0) {
+ players[playerCount] = i;
+ playerCount++;
+ }
+ }
+ return players[MakeRandomNumber(playerCount)];
+ }
+
+ void daSamurshai::beginState_Walk() {
+ bindAnimChr_and_setUpdateRate("c18_IDLE_R2", 1, 0.0, 2.0);
+
+ chosenOne = GetSpecificPlayerActor(this->randomPlayer());
+
+ this->max_speed.x = (this->direction) ? -this->XSpeed : this->XSpeed;
+ this->speed.x = (direction) ? -0.6f : 0.6f;
+ x_speed_inc = 0.2;
+
+ this->max_speed.y = -4.0;
+ this->speed.y = -4.0;
+ this->y_speed_inc = -0.1875;
+ }
+ void daSamurshai::executeState_Walk() {
+
+ float xDistance = pos.x - chosenOne->pos.x;
+ float yDistance = pos.y - chosenOne->pos.y;
+
+ OSReport("Distance: %f, %f", xDistance, yDistance);
+ if ((xDistance > 64.0) && (direction == 0)) { doStateChange(&StateID_Turn); }
+ if ((xDistance < -64.0) && (direction == 1)) { doStateChange(&StateID_Turn); }
+
+ if (xDistance < 0.0) { xDistance = -xDistance; }
+
+ // Condition for Chop
+ if (xDistance < 32.0) { doStateChange(&StateID_Chop); }
+
+ // Condition For Charge Slash
+ if (isBigBoss) {
+ if ((xDistance < 96.0) && (xDistance > 64.0)) {
+ int charge = MakeRandomNumber(100);
+ if (charge > 90) { doStateChange(&StateID_ChargeSlash); }
+ }
+ }
+
+ // Aerial Attacks!
+ if (yDistance > 24.0) {
+
+ // Condition For Spin Attack
+ if (xDistance < 32.0) { doStateChange(&StateID_SpinAttack); }
+
+ // Condition for Uppercut
+ if ((xDistance < 48.0) && (xDistance > 64.0)) { doStateChange(&StateID_Uppercut); }
+ }
+
+ bool ret = calculateTileCollisions();
+ if (ret) {
+ doStateChange(&StateID_Turn);
+ }
+
+ if(this->chrAnimation.isAnimationDone()) {
+ this->chrAnimation.setCurrentFrame(0.0);
+ }
+ }
+ void daSamurshai::endState_Walk() { }
+
+///////////////
+// Turn State
+///////////////
+ void daSamurshai::beginState_Turn() {
+ this->speed.x = (direction) ? -0.5f : 0.5f;
+ this->direction ^= 1;
+ x_speed_inc = 0.0;
+ }
+ void daSamurshai::executeState_Turn() {
+
+ if(this->chrAnimation.isAnimationDone()) {
+ this->chrAnimation.setCurrentFrame(0.0);
+ }
+
+ u16 amt = (this->direction == 0) ? 0x2800 : 0xD800;
+ int done = SmoothRotation(&this->rot.y, amt, 0x1000);
+
+ if(done) {
+ this->doStateChange(&StateID_Walk);
+ }
+ }
+ void daSamurshai::endState_Turn() { }
+
+///////////////
+// Chop State
+///////////////
+ void daSamurshai::beginState_Chop() {
+ bindAnimChr_and_setUpdateRate("c18_H_CUT_R", 1, 0.0, 1.0);
+ }
+ void daSamurshai::executeState_Chop() {
+
+ PlaySoundAsync(this, SE_EMY_CRASHER_PUNCH);
+
+ if (this->direction == 1) {
+ SpawnEffect("Wm_ob_itemget_ring", 0, &(Vec){pos.x - 18.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){1.5, 0.5, 1.5});
+ Chuckles.addToList();
+ }
+ else {
+ SpawnEffect("Wm_ob_itemget_ring", 0, &(Vec){pos.x + 18.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){1.5, 0.5, 1.5});
+ Knuckles.addToList();
+ }
+
+
+ if(this->chrAnimation.isAnimationDone()) {
+ if (this->direction == 1) {
+ SpawnEffect("Wm_ob_flagget_light", 0, &(Vec){pos.x - 38.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0});
+ SpawnEffect("Wm_en_hanapetal", 0, &(Vec){pos.x - 38.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0});
+ Chuckles.removeFromList();
+ }
+ else {
+ SpawnEffect("Wm_ob_flagget_light", 0, &(Vec){pos.x + 38.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0});
+ SpawnEffect("Wm_en_hanapetal", 0, &(Vec){pos.x + 38.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0});
+ Knuckles.removeFromList();
+ }
+
+ PlaySoundAsync(this, SE_EMY_BIG_PAKKUN_DAMAGE_1);
+
+ doStateChange(&StateID_Walk);
+ }
+ }
+ void daSamurshai::endState_Chop() { }
+
+///////////////
+// ChargeSlash State
+///////////////
+ void daSamurshai::beginState_ChargeSlash() {
+ this->timer = 0;
+
+ this->speed.x = 0.0;
+ this->max_speed.x = (this->direction) ? -8.0 : 8.0;
+ }
+ void daSamurshai::executeState_ChargeSlash() {
+
+ if (this->timer == 0) { bindAnimChr_and_setUpdateRate("c18_OB_IDLE_R", 1, 0.0, 1.0);
+ if (this->direction == 1)
+ SpawnEffect("Wm_ob_keyget02_lighit", 0, &(Vec){pos.x + 7.0, pos.y + 14.0, pos.z - 5500.0}, &(S16Vec){0,0,0}, &(Vec){0.8, 0.8, 0.8});
+ else
+ SpawnEffect("Wm_ob_keyget02_lighit", 0, &(Vec){pos.x - 7.0, pos.y + 14.0, pos.z + 5500.0}, &(S16Vec){0,0,0}, &(Vec){0.8, 0.8, 0.8});
+ }
+
+ if (this->timer == 40) {
+ speed.x = (direction) ? -8.0f : 8.0f;
+ topHurts = true;
+ }
+
+ if (this->timer > 41) {
+ if (slowDown == false) {
+ float xDistance = pos.x - chosenOne->pos.x;
+
+ if (xDistance < 8.0) {
+ bindAnimChr_and_setUpdateRate("c18_H_CUT_R", 1, 0.0, 2.0);
+ SpawnEffect("Wm_ob_itemget_ring", 0, &(Vec){pos.x, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){2.0, 0.2, 1.5});
+ slowDown == true;
+ }
+ }
+ else {
+ speed.x = speed.x / 1.5;
+ }
+
+ if (speed.x == 0.0) {
+ topHurts = false;
+ timer = 500;
+ }
+ else {
+ effect.spawn("Wm_mr_p_iceslip", 0, &(Vec){pos.x, pos.y, pos.z}, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5});
+ SpawnEffect("Wm_en_hanapetal", 0, &pos, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5});
+ }
+ }
+
+ if (this->timer == 550) {
+ doStateChange(&StateID_Walk);
+ }
+
+ bool ret = calculateTileCollisions();
+ if (ret) {
+ if (slowDown = false) {
+ bindAnimChr_and_setUpdateRate("c18_H_CUT_R", 1, 0.0, 2.0);
+ SpawnEffect("Wm_ob_itemget_ring", 0, &(Vec){pos.x, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){2.0, 0.2, 1.5});
+ slowDown == true;
+ }
+ speed.x = 0.0;
+ }
+
+ this->timer += 1;
+
+ }
+ void daSamurshai::endState_ChargeSlash() {
+ slowDown = false;
+ }
+
+///////////////
+// Uppercut State
+///////////////
+ void daSamurshai::beginState_Uppercut() {
+ bindAnimChr_and_setUpdateRate("c18_H_SHOT_R", 1, 0.0, 1.0);
+ slowDown = false;
+ }
+ void daSamurshai::executeState_Uppercut() {
+
+ if ((slowDown) && (this->chrAnimation.isAnimationDone())) {
+ doStateChange(&StateID_Walk);
+ }
+
+ if (slowDown) {
+ return;
+ }
+
+ if ((int)this->chrAnimation.getCurrentFrame() == 34) {
+ topHurts = true;
+ PlaySoundAsync(this, SE_EMY_CRASHER_PUNCH);
+
+ speed.y = 2.0;
+ y_speed_inc = -0.1875;
+
+ if (this->direction == 1) {
+ SpawnEffect("Wm_ob_itemget_ring", 0, &(Vec){pos.x - 18.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){0.5, 1.5, 1.5});
+ Chuckles.addToList();
+ }
+ else {
+ SpawnEffect("Wm_ob_itemget_ring", 0, &(Vec){pos.x + 18.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){0.5, 1.5, 1.5});
+ Knuckles.addToList();
+ }
+ }
+
+ if ((this->chrAnimation.isAnimationDone()) && (speed.y != 0)) {
+ if (topHurts) {
+ if (this->direction == 1) {
+ SpawnEffect("Wm_ob_flagget_light", 0, &(Vec){pos.x - 38.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0});
+ SpawnEffect("Wm_en_hanapetal", 0, &(Vec){pos.x - 38.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0});
+ Chuckles.removeFromList();
+ }
+ else {
+ SpawnEffect("Wm_ob_flagget_light", 0, &(Vec){pos.x + 38.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0});
+ SpawnEffect("Wm_en_hanapetal", 0, &(Vec){pos.x + 38.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0});
+ Knuckles.removeFromList();
+ }
+
+ PlaySoundAsync(this, SE_EMY_BIG_PAKKUN_DAMAGE_1);
+ topHurts = false;
+ }
+ }
+
+ if ((this->chrAnimation.isAnimationDone()) && (speed.y == 0.0)) {
+ bindAnimChr_and_setUpdateRate("c18_DIVING_STEAL_R", 1, 0.0, 1.0);
+ slowDown = true;
+ }
+
+ bool ret = calculateTileCollisions();
+
+ }
+ void daSamurshai::endState_Uppercut() { slowDown = false; }
+
+///////////////
+// SpinAttack State
+///////////////
+ void daSamurshai::beginState_SpinAttack() {
+ bindAnimChr_and_setUpdateRate("c18_NORMAL_STEAL_R", 1, 0.0, 1.0);
+ }
+ void daSamurshai::executeState_SpinAttack() {
+
+ if((int)this->chrAnimation.getCurrentFrame() == 20) {
+ topHurts = true;
+ PlaySoundAsync(this, SE_EMY_CRASHER_PUNCH);
+
+ speed.y = 3.0;
+ y_speed_inc = -0.1875;
+
+ if (this->direction == 1) { Chuckles.addToList(); }
+ else { Knuckles.addToList(); }
+ }
+
+ if (((int)chrAnimation.getCurrentFrame() > 20) && ((int)this->chrAnimation.getCurrentFrame() < 60)) {
+ scale = (Vec){1.0, 1.0, 1.0};
+ if (this->direction == 1) {
+ effect.spawn("Wm_mr_spinjump", 0, &(Vec){pos.x - 18.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &scale);
+ }
+ else {
+ effect.spawn("Wm_mr_spinjump", 0, &(Vec){pos.x + 18.0, pos.y + 16.0, pos.z}, &(S16Vec){0,0,0}, &scale);
+ }
+ }
+
+ if((int)this->chrAnimation.getCurrentFrame() == 65) {
+ topHurts = false;
+ PlaySoundAsync(this, SE_EMY_CRASHER_PUNCH);
+
+ if (this->direction == 1) { Chuckles.removeFromList(); }
+ else { Knuckles.removeFromList(); }
+ }
+
+ if ((this->chrAnimation.isAnimationDone()) && (speed.y == 0.0)) { doStateChange(&StateID_Walk); }
+
+ bool ret = calculateTileCollisions();
+
+ }
+ void daSamurshai::endState_SpinAttack() {
+ }
+
+///////////////
+// Damage State
+///////////////
+ void daSamurshai::beginState_Damage() {
+ bindAnimChr_and_setUpdateRate("c18_L_DMG_F_1_R", 1, 0.0, 2.0);
+
+ this->max_speed.x = 0;
+ this->speed.x = 0;
+ this->x_speed_inc = 0;
+
+ this->max_speed.y = -2.0;
+ this->speed.y = -2.0;
+ this->y_speed_inc = -0.1875;
+
+ this->timer = 0;
+ this->isDown = 1;
+ }
+ void daSamurshai::executeState_Damage() {
+ calculateTileCollisions();
+
+ // effect.spawn("Wm_en_spindamage", 0, &(Vec){pos.x, pos.y + 24.0, 0}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0});
+
+ if (this->chrAnimation.isAnimationDone() && (collMgr.SomethingSemiImportant(collMgr.bitfield_for_checks))) {
+ if (timer == 0) { bindAnimChr_and_setUpdateRate("c18_L_DMG_F_3_R", 1, 0.0, 2.0); timer = 1; }
+ else if (timer == 1) { bindAnimChr_and_setUpdateRate("c18_L_DMG_F_4_R", 1, 0.0, 1.0); timer = 2; }
+ else if (timer == 2) { doStateChange(&StateID_Walk); }
+ }
+ }
+ void daSamurshai::endState_Damage() {
+ this->isDown = 0;
+ this->rot.y = (direction) ? 0xD800 : 0x2800;
+ }
+
+///////////////
+// Outro State
+///////////////
+ void daSamurshai::beginState_Outro() {
+
+ OutroSetup(this);
+ this->aPhysics.removeFromList();
+ }
+ void daSamurshai::executeState_Outro() {
+
+ if (this->dying == 1) {
+
+ if (this->timer > 180) { ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE); }
+ if (this->timer == 60) { PlayerVictoryCries(this); }
+
+ this->timer += 1;
+ return;
+ }
+
+ bool ret;
+ ret = ShrinkBoss(this, &pos, 1.0, this->timer);
+
+ if (ret == true) {
+ BossExplode(this, &pos);
+ this->dying = 1;
+ this->timer = 0;
+ }
+ else { PlaySound(this, SE_EMY_BIG_KURIBO_DOWN); }
+
+ this->timer += 1;
+ }
+ void daSamurshai::endState_Outro() { }
+
diff --git a/src/makeYourOwnModelSprite.cpp b/src/makeYourOwnModelSprite.cpp
index edf70ce..9c54893 100644
--- a/src/makeYourOwnModelSprite.cpp
+++ b/src/makeYourOwnModelSprite.cpp
@@ -310,7 +310,16 @@ int dMakeYourOwn::onCreate() {
setupAnim("anim23", 1.0); // AnmChr name, animation speed
break; // ends the case
+
+ case 24: // If nyb 12 is 0, it'll load this model
+
+ setupModel("arrow", "g3d/bre24.brres", "cloud"); // arc name (no .arc), brres name, model name
+ SetupTextures_Item(&bodyModel, 0);
+ this->pos.z = -3300.0;
+
+ setupAnim("anim24", 1.0); // AnmChr name, animation speed
+ break; // ends the case
// COPY the entire case here, and then change the number
//
//case 2:
diff --git a/src/mrsun.cpp b/src/mrsun.cpp
index ebc33db..86c5bfb 100755
--- a/src/mrsun.cpp
+++ b/src/mrsun.cpp
@@ -4,6 +4,11 @@
#include "boss.h"
+const char* MSarcNameList [] = {
+ "mrsun",
+ NULL
+};
+
class daMrSun_c : public dEn_c {
int onCreate();
int onDelete();
@@ -167,7 +172,7 @@ int daMrSun_c::onCreate() {
if ((this->settings & 0xF) == 0) { // It's a sun
hasGlow = true;
- nw4r::g3d::ResFile rf(getResource("bilikyu", "g3d/sun.brres"));
+ nw4r::g3d::ResFile rf(getResource("mrsun", "g3d/sun.brres"));
bodyModel.setup(rf.GetResMdl("Sun"), &allocator, 0x224, 1, 0);
SetupTextures_Map(&bodyModel, 0);
@@ -178,7 +183,7 @@ int daMrSun_c::onCreate() {
else { // It's a moon
hasGlow = false;
- nw4r::g3d::ResFile rf(getResource("bilikyu", "g3d/moon.brres"));
+ nw4r::g3d::ResFile rf(getResource("mrsun", "g3d/moon.brres"));
bodyModel.setup(rf.GetResMdl("Moon"), &allocator, 0x224, 1, 0);
SetupTextures_Map(&bodyModel, 0);
}
diff --git a/src/music.cpp b/src/music.cpp
index 6e658f7..a47b1bf 100644
--- a/src/music.cpp
+++ b/src/music.cpp
@@ -57,9 +57,9 @@ const char* SongNameList [] = {
"TRAIN",
"YOSHIHOUSE",
"FACTORYB",
- "",
- "",
- "",
+ "CAVERN",
+ "SAND",
+ "SHYGUY",
"MINIGAME",
"BONUS_AREA",
"CHALLENGE",
diff --git a/src/shyguy.cpp b/src/shyguy.cpp
index 6ea3567..d93d77a 100644
--- a/src/shyguy.cpp
+++ b/src/shyguy.cpp
@@ -4,6 +4,12 @@
#include <sfx.h>
+const char* SGarcNameList [] = {
+ "shyguy",
+ "iron_ball",
+ NULL
+};
+
// Shy Guy Settings
//
// Nybble 5: Shy Guy Types
@@ -205,11 +211,26 @@ daShyGuy *daShyGuy::build() {
dStateBase_c *stateVar;
dStateBase_c *deathState;
+ char hitType;
if (this->type < 6) { // Regular Shy Guys
stateVar = &StateID_GoDizzy;
deathState = &StateID_Die;
}
else if (this->type > 8) { // Giants
+ hitType = usedForDeterminingStatePress_or_playerCollision(this, apThis, apOther, 0);
+ if(hitType == 1) { // regular jump
+ apOther->someFlagByte |= 2;
+ }
+ else if(hitType == 3) { // spinning jump or whatever?
+ apOther->someFlagByte |= 2;
+ }
+ else if(hitType == 0) {
+ this->dEn_c::playerCollision(apThis, apOther);
+ this->_vf220(apOther->owner);
+ }
+ this->isDead = 0;
+ this->flags_4FC |= (1<<(31-7));
+ this->counter_504[apOther->owner->which_player] = 0;
return;
}
else { // Ballooneers
@@ -223,7 +244,6 @@ daShyGuy *daShyGuy::build() {
this->counter_504[apOther->owner->which_player] = 0;
- char hitType;
if (this->isDown == 0) {
hitType = usedForDeterminingStatePress_or_playerCollision(this, apThis, apOther, 2);
}
@@ -439,7 +459,7 @@ int daShyGuy::onCreate() {
if (type == 6 || type == 7 || type == 8) {
this->renderBalloon = 1;
- this->balloonFile.data = getResource("lemmy_ball", "g3d/balloon.brres");
+ this->balloonFile.data = getResource("shyguy", "g3d/balloon.brres");
nw4r::g3d::ResMdl mdlB = this->balloonFile.GetResMdl("ballon");
balloonModel.setup(mdlB, &allocator, 0x224, 1, 0);
balloonModelB.setup(mdlB, &allocator, 0x224, 1, 0);
@@ -515,26 +535,26 @@ int daShyGuy::onCreate() {
// Shy Guy Colours
if (type == 1 || type == 8 || type == 10) {
- this->resFile.data = getResource("lemmy_ball", "g3d/ShyGuyBlue.brres");
+ this->resFile.data = getResource("shyguy", "g3d/ShyGuyBlue.brres");
}
else if (type == 5) {
- this->resFile.data = getResource("lemmy_ball", "g3d/ShyGuyGreen.brres");
+ this->resFile.data = getResource("shyguy", "g3d/ShyGuyGreen.brres");
}
else if (type == 3) {
- this->resFile.data = getResource("lemmy_ball", "g3d/ShyGuyCyan.brres");
+ this->resFile.data = getResource("shyguy", "g3d/ShyGuyCyan.brres");
}
else if (type == 4) {
- this->resFile.data = getResource("lemmy_ball", "g3d/ShyGuyPurple.brres");
+ this->resFile.data = getResource("shyguy", "g3d/ShyGuyPurple.brres");
}
else {
- this->resFile.data = getResource("lemmy_ball", "g3d/ShyGuyRed.brres");
+ this->resFile.data = getResource("shyguy", "g3d/ShyGuyRed.brres");
}
nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("body_h");
bodyModel.setup(mdl, &allocator, 0x224, 1, 0);
// Animations start here
- this->anmFile.data = getResource("lemmy_ball", "g3d/ShyGuyAnimations.brres");
+ this->anmFile.data = getResource("shyguy", "g3d/ShyGuyAnimations.brres");
nw4r::g3d::ResAnmChr anmChr = this->anmFile.GetResAnmChr("c18_IDLE_R");
this->chrAnimation.setup(mdl, anmChr, &this->allocator, 0);
diff --git a/src/topman.cpp b/src/topman.cpp
index 42527e2..edf75dd 100644
--- a/src/topman.cpp
+++ b/src/topman.cpp
@@ -3,6 +3,11 @@
#include <g3dhax.h>
#include <sfx.h>
+const char* TMarcNameList [] = {
+ "topman",
+ NULL
+};
+
class daTopman : public dEn_c {
int onCreate();
int onDelete();
@@ -300,7 +305,7 @@ int daTopman::onCreate() {
// Model creation
allocator.link(-1, GameHeaps[0], 0, 0x20);
- this->resFile.data = getResource("ben", "g3d/begoman_spike.brres");
+ this->resFile.data = getResource("topman", "g3d/begoman_spike.brres");
nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("begoman");
bodyModel.setup(mdl, &allocator, 0x224, 1, 0);
SetupTextures_Map(&bodyModel, 0);