diff options
Diffstat (limited to '')
| -rw-r--r-- | NewerProject.yaml | 1 | ||||
| -rw-r--r-- | bossBalboaWrench.yaml | 10 | ||||
| -rw-r--r-- | src/bossBalboaWrench.cpp | 711 | ||||
| -rw-r--r-- | src/bossFuzzyBear.cpp | 1 | ||||
| -rw-r--r-- | src/bossRamboo.cpp | 140 | 
5 files changed, 824 insertions, 39 deletions
| diff --git a/NewerProject.yaml b/NewerProject.yaml index 650ba6e..7566896 100644 --- a/NewerProject.yaml +++ b/NewerProject.yaml @@ -34,5 +34,6 @@ modules:    - processed/bossFuzzyBear.yaml    - processed/bossThwompaDomp.yaml    - processed/bossRamboo.yaml +  - processed/bossBalboaWrench.yaml    - processed/effectVideo.yaml    - processed/fakeStarCoin.yaml diff --git a/bossBalboaWrench.yaml b/bossBalboaWrench.yaml new file mode 100644 index 0000000..f649aa0 --- /dev/null +++ b/bossBalboaWrench.yaml @@ -0,0 +1,10 @@ +--- +# Replaces EN_Iwao + +source_files: [../src/bossBalboaWrench.cpp] +hooks: +  - name: BalboaWrenchBuild +    type: add_func_pointer +    src_addr_pal: 0x80967548 +    target_func: 'daBalboa_c::build(void)' + diff --git a/src/bossBalboaWrench.cpp b/src/bossBalboaWrench.cpp new file mode 100644 index 0000000..efb3abe --- /dev/null +++ b/src/bossBalboaWrench.cpp @@ -0,0 +1,711 @@ +#include <common.h> +#include <game.h> +#include <g3dhax.h> +#include <sfx.h> +#include <stage.h> +#include "effects.h" +#include "player.h" + +class daBalboa_c : public dEn_c { +	int onCreate(); +	int onDelete(); +	int onExecute(); +	int onDraw(); + +	mHeapAllocator_c allocator; +	m3d::mdl_c bodyModel; +	m3d::mdl_c manholeModel; +	m3d::mdl_c holeModel; + +	nw4r::g3d::ResFile resFile; +	m3d::anmChr_c anmDead; +	m3d::anmChr_c anmDead_2; +	m3d::anmChr_c anmGo_out_ed; +	m3d::anmChr_c anmGo_out_st; +	m3d::anmChr_c anmThrow_1; +	m3d::anmChr_c anmThrow_2; +	m3d::anmChr_c anmThrow_3; +	m3d::anmChr_c anmThrow_4Left; +	m3d::anmChr_c anmThrow_4Right; +	m3d::anmChr_c anmThrow_5; + +	int timer; +	float Baseline; +	float dying; +	Vec PopUp [4];  +	dStageActor_c *homingWrench; +	int homingWrenchLifeSpan; +	float homingWrenchDirection; +	char throwCount; +	 +	static daBalboa_c *build(); + +	void setupModels(); +	void updateModelMatrices(); + +	void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); +	void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther); +	bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); +	void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther); +	void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther); + +	USING_STATES(daBalboa_c); +	DECLARE_STATE(Grow); +	DECLARE_STATE(ManholeUp); +	DECLARE_STATE(HeadPoke); +	DECLARE_STATE(AllOut); +	DECLARE_STATE(ThrowHoming); +	DECLARE_STATE(ThrowWrench); +	DECLARE_STATE(BackDown); +	DECLARE_STATE(Outro); +}; + +daBalboa_c *daBalboa_c::build() { +	void *buffer = AllocFromGameHeap1(sizeof(daBalboa_c)); +	return new(buffer) daBalboa_c; +} + + +extern "C" void *HandleXSpeed(daBalboa_c *); +extern "C" void *HandleYSpeed(daBalboa_c *); +extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daBalboa_c *); +extern "C" u32 GenerateRandomNumber(int max); +extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer); +extern "C" u8 dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(daBalboa_c *, Vec pos); +extern "C" dStageActor_c *GetSpecificPlayerActor(int number); +extern "C" void *PlaySound(daBalboa_c *, int soundID); + + +CREATE_STATE(daBalboa_c, Grow); +CREATE_STATE(daBalboa_c, ManholeUp); +CREATE_STATE(daBalboa_c, HeadPoke); +CREATE_STATE(daBalboa_c, AllOut); +CREATE_STATE(daBalboa_c, ThrowHoming); +CREATE_STATE(daBalboa_c, ThrowWrench); +CREATE_STATE(daBalboa_c, BackDown); +CREATE_STATE(daBalboa_c, Outro); + + + +void daBalboa_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) {  +	this->_vf220(apOther->owner); +	OSReport("I hit Mario.");  +} +void daBalboa_c::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) {  +	OSReport("Hit Fireball");  +	CreateEffect(378, &apOther->owner->pos, &(S16Vec){0,0,0}, &(Vec){0.5, 0.5, 0.5}); +	this->pos.x += 6.0; +} +bool daBalboa_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Iceball"); return false; } +void daBalboa_c::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) {  +	OSReport("Hit Rolling Object");  +	 +	if (apOther->owner->name == 412) { // Check if it's a glow block +		CreateEffect(378, &apOther->owner->pos); +		CreateEffect(380, &apOther->owner->pos); + +		apOther->owner->Delete(); +		doStateChange(&StateID_Outro); +	}	 +} +void daBalboa_c::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Hammer"); } + + + + +void daBalboa_c::setupModels() { +	allocator.link(-1, GameHeaps[0], 0, 0x20); + +	nw4r::g3d::ResMdl mdl; +	nw4r::g3d::ResAnmChr anmChr; + +	this->resFile.data = getResource("choropoo", "g3d/choropoo.brres"); + +	mdl = this->resFile.GetResMdl("manhole"); +	this->manholeModel.setup(mdl, &allocator, 0x224, 1, 0); +	SetupTextures_Enemy(&this->manholeModel, 0); + +	mdl = this->resFile.GetResMdl("choropoo_hole"); +	this->holeModel.setup(mdl, &allocator, 0x224, 1, 0); +	SetupTextures_Enemy(&this->holeModel, 0); + +	mdl = this->resFile.GetResMdl("choropoo"); +	this->bodyModel.setup(mdl, &allocator, 0x224, 1, 0); +	SetupTextures_Enemy(&this->bodyModel, 0); + + + +	anmChr = this->resFile.GetResAnmChr("dead"); +	this->anmDead.setup(mdl, anmChr, &this->allocator, 0); + +	anmChr = this->resFile.GetResAnmChr("dead_2"); +	this->anmDead_2.setup(mdl, anmChr, &this->allocator, 0); + +	anmChr = this->resFile.GetResAnmChr("go_out_ed"); +	this->anmGo_out_ed.setup(mdl, anmChr, &this->allocator, 0); + +	anmChr = this->resFile.GetResAnmChr("go_out_st"); +	this->anmGo_out_st.setup(mdl, anmChr, &this->allocator, 0); + +	anmChr = this->resFile.GetResAnmChr("throw_1"); +	this->anmThrow_1.setup(mdl, anmChr, &this->allocator, 0); + +	anmChr = this->resFile.GetResAnmChr("throw_2"); +	this->anmThrow_2.setup(mdl, anmChr, &this->allocator, 0); + +	anmChr = this->resFile.GetResAnmChr("throw_3"); +	this->anmThrow_3.setup(mdl, anmChr, &this->allocator, 0); + +	anmChr = this->resFile.GetResAnmChr("throw_4_left_hand"); +	this->anmThrow_4Left.setup(mdl, anmChr, &this->allocator, 0); + +	anmChr = this->resFile.GetResAnmChr("throw_4_right_hand"); +	this->anmThrow_4Right.setup(mdl, anmChr, &this->allocator, 0); + +	anmChr = this->resFile.GetResAnmChr("throw_5"); +	this->anmThrow_5.setup(mdl, anmChr, &this->allocator, 0); + + +	allocator.unlink(); +} + + + +// Animation Order...  +// AppearLittle - Throw One, sound 0x21F +// Search - Throw two +// AppearFull - Throw 3 and sound 0x220 +// Attack - Throw 4 +// Disappear - Throw 5 + + + +int daBalboa_c::onCreate() { + +	OSReport("Creating the Balboa Model"); +	setupModels(); + + +	OSReport("Setting Balboa's Size to 4.0"); +	this->scale = (Vec){1.0, 1.0, 1.0}; + +	OSReport("Creating Balboa's Physics Struct"); + +	ActivePhysics::Info HitMeBaby; +	HitMeBaby.xDistToCenter = 0.0; +	HitMeBaby.yDistToCenter = 36.0; + +	HitMeBaby.xDistToEdge = 24.0; +	HitMeBaby.yDistToEdge = 30.0; + +	HitMeBaby.category1 = 0x3; +	HitMeBaby.category2 = 0x0; +	HitMeBaby.bitfield1 = 0x4F; +	HitMeBaby.bitfield2 = 0xFFBAFFFE; +	HitMeBaby.unkShort1C = 0; +	HitMeBaby.callback = &dEn_c::collisionCallback; + + +	OSReport("Making the Physics Class and adding to the list"); +	this->aPhysics.initWithStruct(this, &HitMeBaby); +	this->aPhysics.addToList(); + +	OSReport("Setting up the Box of Goodies"); +	 +	this->rot.x = 0; // X is vertical axis +	this->rot.y = 0xE000; // Y is horizontal axis +	this->rot.z = 0; // Z is ... an axis >.> +	this->direction = 0; // Heading left. +	this->pos.z = -800.0; + +	this->PopUp[0] = (Vec){this->pos.x, this->pos.y + 120.0, this->pos.z}; +	this->PopUp[1] = (Vec){this->pos.x - 320.0, this->pos.y - 60.0, this->pos.z}; +	this->PopUp[2] = (Vec){this->pos.x, this->pos.y + 120.0, this->pos.z}; +	this->PopUp[3] = (Vec){this->pos.x - 320.0, this->pos.y - 60.0, this->pos.z}; + + +	OSReport("Setting the State"); +	doStateChange(&StateID_Grow); + +	OSReport("Going to Execute Balboa"); +	this->onExecute(); +	return true; +} + +int daBalboa_c::onDelete() { +	return true; +} + +int daBalboa_c::onExecute() { +	acState.execute(); +	updateModelMatrices(); + +	if (this->aPhysics.result1 == 1) { +		char PlayerID = NearestPlayer(this); +		dStageActor_c *Player = GetSpecificPlayerActor(PlayerID); +		 +		this->_vf220(Player); +	} +	 +	if (this->homingWrenchLifeSpan > 1) { +		this->homingWrench->pos.y += this->homingWrenchDirection;  +		this->homingWrenchLifeSpan -= 1; +	} +	 +	if (this->homingWrenchLifeSpan == 1) { +		this->homingWrench->Delete(); +		CreateEffect(&this->homingWrench->pos, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5}, 242); +		 +		this->homingWrenchLifeSpan = 0; +	} + +	 +	return true; +} + +int daBalboa_c::onDraw() { +	 +	bodyModel.scheduleForDrawing();  + +	return true; +} + + +void daBalboa_c::updateModelMatrices() { +	// This won't work with wrap because I'm lazy. +	matrix.translation(pos.x, pos.y, pos.z); +	matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); + +	bodyModel.setDrawMatrix(matrix); +	bodyModel.setScale(&scale); +	bodyModel.calcWorld(false);  + +} + + +// Grow State + +void daBalboa_c::beginState_Grow() {  +	OSReport("Growing when Kameck Tells me to."); +	this->timer = 0; + +} + +void daBalboa_c::executeState_Grow() {  +	 +	this->timer = this->timer + 1; +	 +	float scaleSpeed, yPosScaling; +	 +	if (this->timer == 60) { PlaySound(this, SE_BOSS_IGGY_WANWAN_TO_L); } +	if ((this->timer > 60) && (this->timer < 140)) { +		scaleSpeed = 0.025; +//	 	yPosScaling = 0; +	 +		float modifier; + +		modifier = 2.0 + ((this->timer - 60) * scaleSpeed); +		 +		this->scale = (Vec){modifier, modifier, modifier}; +//		this->pos.y = this->pos.y + (yPosScaling/80); +		 +	} +	 +	if (this->timer > 170) { 	 +		PlaySound(this, SE_EMY_CHOROPU_BOUND); +		doStateChange(&StateID_BackDown);  +	} +	 +} +void daBalboa_c::endState_Grow() {  + +	OSReport("OK. All grown up now.");  +} + + + + + +// ManholeUp State + +void daBalboa_c::beginState_ManholeUp() {  + +	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_1"); +	this->anmThrow_1.bind(&this->bodyModel, anmChr, 1); +	this->bodyModel.bindAnim(&this->anmThrow_1, 0.0); +	this->anmThrow_1.setUpdateRate(1.0); + +	this->timer = 0; +		 +	int randChoice; +	randChoice = GenerateRandomNumber(4); +	 +	this->pos = this->PopUp[randChoice]; +	 +	if (randChoice < 2) { // On the left side! +		this->rot.y = 0xE000;  +		this->direction = 0; } +	else {	// On the right side! +		this->rot.y = 0x2000;  +		this->direction = 1; } + +	PlaySound(this, 0x21F); +} + +void daBalboa_c::executeState_ManholeUp() {  + +	this->bodyModel._vf1C(); +	 +	if (this->timer < 30) { +		this->pos.y += 0.5; } // Height is 80 pixels, move up 15 pixels. +		 +	if (this->timer > 90) { +		doStateChange(&StateID_HeadPoke); } +		 +	this->timer += 1; + +} +void daBalboa_c::endState_ManholeUp() { } + + + + +// HeadPoke State + +void daBalboa_c::beginState_HeadPoke() {  + +	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_2"); +	this->anmThrow_2.bind(&this->bodyModel, anmChr, 1); +	this->bodyModel.bindAnim(&this->anmThrow_2, 0.0); +	this->anmThrow_2.setUpdateRate(1.0); + +	this->timer = 0; +} + +void daBalboa_c::executeState_HeadPoke() {  + +	if (this->timer < 30) { +		this->pos.y += 1.0; } // Height is 80 pixels, move up another 30 pixels. +		 +	if (this->timer > 90) { +		doStateChange(&StateID_AllOut); } +		 +	this->timer += 1; +	this->bodyModel._vf1C(); + +} +void daBalboa_c::endState_HeadPoke() { } + + + + + +// AllOut State + +void daBalboa_c::beginState_AllOut() {  + +	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_3"); +	this->anmThrow_3.bind(&this->bodyModel, anmChr, 1); +	this->bodyModel.bindAnim(&this->anmThrow_1, 0.0); +	this->anmThrow_3.setUpdateRate(1.0); + +	this->timer = 0; + +	PlaySound(this, 0x220); +} + +void daBalboa_c::executeState_AllOut() {  + +	this->bodyModel._vf1C(); + +	if (this->timer < 30) { +		this->pos.y += 1.2; } // Height is 80 pixels, move up another 35 pixels. +		 +	if (this->timer > 90) { +		int randChoice; +		randChoice = GenerateRandomNumber(2); +	 +		if (randChoice == 0) {		 +			doStateChange(&StateID_ThrowHoming); } +		else { +			doStateChange(&StateID_ThrowWrench); } +	} +	 +	this->timer += 1; + +} +void daBalboa_c::endState_AllOut() { } + + + + +// ThrowHoming State + +void daBalboa_c::beginState_ThrowHoming() {  + +	if (this->direction == 0) { +		nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_4_left_hand"); +		this->anmThrow_4Left.bind(&this->bodyModel, anmChr, 1); +		this->bodyModel.bindAnim(&this->anmThrow_4Left, 0.0); +		this->anmThrow_4Left.setUpdateRate(1.0);  +	} +	else { +		nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_4_right_hand"); +		this->anmThrow_4Right.bind(&this->bodyModel, anmChr, 1); +		this->bodyModel.bindAnim(&this->anmThrow_4Right, 0.0); +		this->anmThrow_4Right.setUpdateRate(1.0);  +	} + + +	Vec tempPos = this->pos; +	if (this->direction == 0) { +		tempPos.x -= 32.0; +		tempPos.y += 10.0; + +		this->homingWrench = CreateActor(372, this->direction << 28, tempPos, 0, 0); +		this->homingWrench->speed.x = -7.0; +		this->homingWrench->scale = (Vec){3.0, 3.0, 3.0}; + +	} +	else { +		tempPos.x += 32.0; +		tempPos.y += 10.0; + +		this->homingWrench = CreateActor(372, this->direction << 28, tempPos, 0, 0); +		this->homingWrench->speed.x = 7.0; +		this->homingWrench->scale = (Vec){3.0, 3.0, 3.0}; + +	} + +	 +	char PlayerID = NearestPlayer(this); +	dStageActor_c *Player = GetSpecificPlayerActor(PlayerID); + +	 +	if ((Player->pos.y >= tempPos.y - 16.0) && (Player->pos.y <= tempPos.y + 16.0)) { +		this->homingWrenchDirection = 0.0; } + +	else if ((Player->pos.y >= tempPos.y - 106.0) && (Player->pos.y < tempPos.y - 16.0)) { +		this->homingWrenchDirection = -0.4; } + +	else if ((Player->pos.y <= tempPos.y + 106.0) && (Player->pos.y > tempPos.y + 16.0)) { +		this->homingWrenchDirection = 0.4; } + +	else if (Player->pos.y < tempPos.y - 106.0) { +		this->homingWrenchDirection = -0.8; } + +	else if (Player->pos.y > tempPos.y + 106.0) { +		this->homingWrenchDirection = 0.8; } + +	else { +		this->homingWrenchDirection = 0.0; } + + +	PlaySound(this, 0x222); +	this->homingWrenchLifeSpan = 360; + +	this->timer = 0; +} + +void daBalboa_c::executeState_ThrowHoming() {  +	this->bodyModel._vf1C(); + +	if (this->timer > 60) { +		doStateChange(&StateID_BackDown); } +		 +	this->timer += 1; +	this->bodyModel._vf1C(); +} +void daBalboa_c::endState_ThrowHoming() { } + + + + +// ThrowWrench State + +void daBalboa_c::beginState_ThrowWrench() {  + +	this->timer = 0; +} + +void daBalboa_c::executeState_ThrowWrench() {  + + + +	if (this->timer == 60) { + +		if (this->throwCount & 1) { +			nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_4_left_hand"); +			this->anmThrow_4Left.bind(&this->bodyModel, anmChr, 1); +			this->bodyModel.bindAnim(&this->anmThrow_4Left, 0.0); +			this->anmThrow_4Left.setUpdateRate(1.0);  +		} +		else { +			nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_4_right_hand"); +			this->anmThrow_4Right.bind(&this->bodyModel, anmChr, 1); +			this->bodyModel.bindAnim(&this->anmThrow_4Right, 0.0); +			this->anmThrow_4Right.setUpdateRate(1.0);  +		} + + +		char PlayerID = NearestPlayer(this); +		dStageActor_c *Player = GetSpecificPlayerActor(PlayerID); + + +		float slope = ( (this->pos.y - Player->pos.y) / (this->pos.x - Player->pos.x) ); + + +		Vec tempPos = this->pos; +		if (this->direction == 0) { +			tempPos.x -= 32.0; +			tempPos.y += 10.0; +	 +			dStageActor_c *wrench = CreateActor(372, this->direction << 28, tempPos, 0, 0); +			wrench->speed.x = -8.0; +			wrench->speed.y = -8.0 * slope; +		} +		 +		else { +			tempPos.x += 32.0; +			tempPos.y += 10.0; + +			dStageActor_c *wrench = CreateActor(372, this->direction << 28, tempPos, 0, 0); +			wrench->speed.x = 8.0; +			wrench->speed.y = 8.0 * slope; +		} + +		PlaySound(this, 0x222); + +		this->timer = 0; +		this->throwCount += 1; +	} +	 +	if (this->throwCount == 5) { +		doStateChange(&StateID_BackDown); } + +	this->timer += 1; +	this->bodyModel._vf1C(); +	 +} +void daBalboa_c::endState_ThrowWrench() { this->throwCount = 0; } + + + +// BackDown State + +void daBalboa_c::beginState_BackDown() {  + +	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("throw_5"); +	this->anmThrow_5.bind(&this->bodyModel, anmChr, 1); +	this->bodyModel.bindAnim(&this->anmThrow_5, 0.0); +	this->anmThrow_5.setUpdateRate(1.0); + +	this->timer = 0; + +	PlaySound(this, 0x221); + +	CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){2.0, 1.0, 1.0}, 351);  +	CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){2.0, 1.0, 1.0}, 352);  +} + +void daBalboa_c::executeState_BackDown() {  + +	if (this->timer < 60) { +		this->pos.y -= 2.6667; } // Height is 80 pixels, move down 80 pixels. +		 +	if (this->timer > 90) { +		doStateChange(&StateID_ManholeUp); } +		 +	this->timer += 1; +	this->bodyModel._vf1C(); + +} +void daBalboa_c::endState_BackDown() { } + + + + +void daBalboa_c::beginState_Outro() {  + +	this->removeMyActivePhysics(); +	this->timer = 0; +	this->rot.x = 0x0; // X is vertical axis +	this->rot.y = 0xE000; // Y is horizontal axis +	this->rot.z = 0x0; // Z is ... an axis >.> + +} +void daBalboa_c::executeState_Outro() { + +	if (this->dying == 1) {  +		if (this->timer > 180) { +			ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE); +		} +		 +		if (this->timer == 60) { +			 +			if (GetSpecificPlayerActor(0) != 0) { +				PlaySound(this, SE_VOC_MA_CLEAR_BOSS); +				// Send PlBase into DemoGoal State here, kthxbai +			} +			 +			if (GetSpecificPlayerActor(1) != 0) { +				PlaySound(this, SE_VOC_LU_CLEAR_BOSS); +				// Send PlBase into DemoGoal State here, kthxbai +			} + +			if (GetSpecificPlayerActor(2) != 0) { +				PlaySound(this, SE_VOC_KO_CLEAR_BOSS); +				// Send PlBase into DemoGoal State here, kthxbai +			} + +			if (GetSpecificPlayerActor(3) != 0) { +				PlaySound(this, SE_VOC_KO2_CLEAR_BOSS); +				// Send PlBase into DemoGoal State here, kthxbai +			} +		}	 +		 +		this->timer += 1; +		return;  +	}	 + +	if (this->scale.x > 0.1) { + +		PlaySound(this, SE_BOSS_CMN_DAMAGE_LAST); +		PlaySound(this, SE_EMY_BIG_TERESA_DEAD); + +		// Adjust this to equal the scale of your boss / 80. +		this->scale.x -= 0.175; +		this->scale.y -= 0.175; +		this->scale.z -= 0.175; + +		this->pos.y += 2.0; +		 +		Vec tempPos = (Vec){this->pos.x + 160.0, this->pos.y - 80.0, 5500.0}; + +		if (this->timer == 30) {   +			CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 756);  +			CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 801);  +			CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 957);  +			this->timer = 0; +		} +	} +	else { +		this->scale.x = 0.0; +		this->scale.y = 0.0; +		this->scale.z = 0.0; +		 +		Vec tempPos = (Vec){this->pos.x + 160.0, this->pos.y - 80.0, 5500.0}; + +		CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 588); +		this->dying = 1; +		this->timer = 0; + +		PlaySound(this, STRM_BGM_SHIRO_BOSS_CLEAR); +	} + +	this->timer += 1; + +} +void daBalboa_c::endState_Outro() { } + + diff --git a/src/bossFuzzyBear.cpp b/src/bossFuzzyBear.cpp index 7ad7dcd..0c16d42 100644 --- a/src/bossFuzzyBear.cpp +++ b/src/bossFuzzyBear.cpp @@ -714,6 +714,7 @@ void daFuzzyBear_c::endState_Wait() { }  void daFuzzyBear_c::beginState_Outro() {  +	this->removeMyActivePhysics();  	this->timer = 0;  } diff --git a/src/bossRamboo.cpp b/src/bossRamboo.cpp index 15304c5..6bc7e51 100644 --- a/src/bossRamboo.cpp +++ b/src/bossRamboo.cpp @@ -14,18 +14,19 @@ class daRamboo_c : public dEn_c {  	mHeapAllocator_c allocator;  	m3d::mdl_c bodyModel; +	m3d::mdl_c hideModel;  	m3d::mdl_c fogModel;  	nw4r::g3d::ResFile resFile; -	m3d::anmChr_c animationChrA; -	m3d::anmChr_c animationChrB; -	m3d::anmChr_c animationChrC; -	m3d::anmChr_c animationChrD; - +	m3d::anmChr_c anmFog; +	m3d::anmChr_c anmWaitA; +	m3d::anmChr_c anmShayA; +	m3d::anmChr_c anmWaitB; +	m3d::anmChr_c anmShayB;  	int timer;  	int ytimer; -	char BigBossRamboo; +	char Hiding;  	float Baseline;  	float dying; @@ -123,25 +124,33 @@ void daRamboo_c::setupModels() {  	bool ret;  	nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("fog"); -	fogModel.setup(mdl, &allocator, 0x224, 1, 0); -	SetupTextures_Enemy(&fogModel, 0); +	this->fogModel.setup(mdl, &allocator, 0x224, 1, 0); +	SetupTextures_Enemy(&this->fogModel, 0);  	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("fog"); -	ret = this->animationChrA.setup(mdl, anmChr, &this->allocator, 0); +	ret = this->anmFog.setup(mdl, anmChr, &this->allocator, 0);  	nw4r::g3d::ResMdl mdlB = this->resFile.GetResMdl("teresaA"); -	bodyModel.setup(mdlB, &allocator, 0x224, 1, 0); -	SetupTextures_Enemy(&bodyModel, 0); - -	nw4r::g3d::ResAnmChr anmChrB = this->resFile.GetResAnmChr("move_cartain"); -	ret = this->animationChrB.setup(mdlB, anmChrB, &this->allocator, 0); +	this->bodyModel.setup(mdlB, &allocator, 0x224, 1, 0); +	SetupTextures_Enemy(&this->bodyModel, 0);  	nw4r::g3d::ResAnmChr anmChrC = this->resFile.GetResAnmChr("shay_teresaA"); -	ret = this->animationChrC.setup(mdlB, anmChrC, &this->allocator, 0); +	ret = this->anmShayA.setup(mdlB, anmChrC, &this->allocator, 0);  	nw4r::g3d::ResAnmChr anmChrD = this->resFile.GetResAnmChr("wait"); -	ret = this->animationChrD.setup(mdlB, anmChrD, &this->allocator, 0); +	ret = this->anmWaitA.setup(mdlB, anmChrD, &this->allocator, 0); + + +	nw4r::g3d::ResMdl mdlC = this->resFile.GetResMdl("teresaB"); +	this->hideModel.setup(mdlC, &allocator, 0x224, 1, 0); +	SetupTextures_Enemy(&this->bodyModel, 0); + +	nw4r::g3d::ResAnmChr anmChrE = this->resFile.GetResAnmChr("shay_teresaB"); +	ret = this->anmShayB.setup(mdlC, anmChrE, &this->allocator, 0); + +	nw4r::g3d::ResAnmChr anmChrF = this->resFile.GetResAnmChr("shay_teresaB_wait"); +	ret = this->anmWaitB.setup(mdlC, anmChrF, &this->allocator, 0);  	allocator.unlink();  } @@ -185,6 +194,7 @@ int daRamboo_c::onCreate() {  	this->rot.y = 0xE000; // Y is horizontal axis  	this->rot.z = 0; // Z is ... an axis >.>  	this->direction = 0; // Heading left. +	this->Hiding = 0;  	this->speed.x = 0.0;  	this->ytimer = 0; @@ -194,7 +204,10 @@ int daRamboo_c::onCreate() {  	this->eventFlag = (u64)1 << (eventNum - 1); -	bindAnimChr_and_setUpdateRates("fog", this->animationChrA, this->fogModel, 1.0); +	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("fog"); +	this->anmFog.bind(&this->fogModel, anmChr, 1); +	this->fogModel.bindAnim(&this->anmFog, 0.0); +	this->anmFog.setUpdateRate(1.0);  	OSReport("Setting the State");  	doStateChange(&StateID_Grow); @@ -212,8 +225,10 @@ int daRamboo_c::onExecute() {  	acState.execute();  	updateModelMatrices(); -	if(this->animationChrA.isAnimationDone()) -		this->animationChrA.setCurrentFrame(0.0); +	this->fogModel._vf1C(); + +	if(this->anmFog.isAnimationDone()) +		this->anmFog.setCurrentFrame(0.0);  	if (this->aPhysics.result1 == 1) {  		char PlayerID = NearestPlayer(this); @@ -231,7 +246,11 @@ int daRamboo_c::onExecute() {  int daRamboo_c::onDraw() {  	fogModel.scheduleForDrawing(); -	bodyModel.scheduleForDrawing(); +	 +	if (this->Hiding == 0) { +		bodyModel.scheduleForDrawing(); } +	else { +		hideModel.scheduleForDrawing(); }  	return true;  } @@ -247,9 +266,14 @@ void daRamboo_c::updateModelMatrices() {  	matrix.translation(pos.x + 160.0, pos.y - 80.0, pos.z + 200.0);  	matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); -	bodyModel.setDrawMatrix(matrix); -	bodyModel.setScale(&scale); -	bodyModel.calcWorld(false); +	if (this->Hiding == 0) { +		bodyModel.setDrawMatrix(matrix); +		bodyModel.setScale(&scale); +		bodyModel.calcWorld(false); } +	else { +		hideModel.setDrawMatrix(matrix); +		hideModel.setScale(&scale); +		hideModel.calcWorld(false); }  } @@ -259,21 +283,17 @@ void daRamboo_c::beginState_Grow() {  	OSReport("Growing when Kameck Tells me to.");  	this->timer = 0;  //	PlaySound(this, SE_BOSS_ROY_MAGIC_MAKE_FAST); -	bindAnimChr_and_setUpdateRates("wait", this->animationChrD, this->bodyModel, 1.0);  }  void daRamboo_c::executeState_Grow() {  -	if(this->animationChrD.isAnimationDone()) -		this->animationChrD.setCurrentFrame(0.0); -  	this->timer = this->timer + 1;  	float scaleSpeed, yPosScaling; +	if (this->timer == 60) { PlaySound(this, SE_BOSS_IGGY_WANWAN_TO_L); }  	if ((this->timer > 60) && (this->timer < 140)) { -		PlaySound(this, SE_BOSS_IGGY_WANWAN_L_TO_M);  		scaleSpeed = 0.175;  //	 	yPosScaling = 0; @@ -311,13 +331,11 @@ void daRamboo_c::beginState_Advance() {  	this->speed.z = 0;  	this->timer = 0; -	bindAnimChr_and_setUpdateRates("move_cartain", this->animationChrB, this->bodyModel, 1.0);  }  void daRamboo_c::executeState_Advance() {  -	if(this->animationChrB.isAnimationDone()) -		this->animationChrB.setCurrentFrame(0.0); +	this->bodyModel._vf1C();  	this->pos.x -= this->timer / 32;  	this->pos.y = this->Baseline + sin(this->ytimer * 3.14 / 192) * 48; @@ -349,16 +367,36 @@ void daRamboo_c::beginState_Wait() {  }  void daRamboo_c::executeState_Wait() {  + +	if (this->timer == 55) { +		nw4r::g3d::ResAnmChr anmChrB = this->resFile.GetResAnmChr("shay_teresaB"); +		this->anmShayB.bind(&this->hideModel, anmChrB, 1); +		this->hideModel.bindAnim(&this->anmShayB, 0.0); +		this->anmShayB.setUpdateRate(1.0); +	}		 +  	if (this->timer > 60) {   		PlaySound(this, SE_EMY_CS_TERESA_BEAT_YOU);  		doStateChange(&StateID_Advance);   	} + + +	this->hideModel._vf1C();  	this->timer += 1;  } -void daRamboo_c::endState_Wait() { OSReport("No more bouncing."); } +void daRamboo_c::endState_Wait() {  +	 +	this->Hiding = 0; + +	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("shay_teresaA"); +	this->anmShayA.bind(&this->bodyModel, anmChr, 1); +	this->bodyModel.bindAnim(&this->anmShayA, 0.0); +	this->anmShayA.setUpdateRate(1.0); +	 +	OSReport("No more bouncing."); } @@ -368,31 +406,55 @@ void daRamboo_c::endState_Wait() { OSReport("No more bouncing."); }  void daRamboo_c::beginState_Flee() {  -	bindAnimChr_and_setUpdateRates("shay_teresaA", this->animationChrC, this->bodyModel, 1.0); +//	bindAnimChr_and_setUpdateRates("shay_teresaA", this->animationChrC, this->bodyModel, 1.0); + +	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("wait"); +	this->anmWaitA.bind(&this->bodyModel, anmChr, 1); +	this->bodyModel.bindAnim(&this->anmWaitA, 0.0); +	this->anmWaitA.setUpdateRate(1.0);  	OSReport("Damnit that hurt.");   	this->timer = 0; +  }  void daRamboo_c::executeState_Flee() {  - -	if(this->animationChrC.isAnimationDone()) -		this->animationChrC.setCurrentFrame(0.0); - +	 +	if (timer == 10) { +		this->Hiding = 1; +	 +		nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("shay_teresaB_wait"); +		this->anmWaitB.bind(&this->hideModel, anmChr, 1); +		this->hideModel.bindAnim(&this->anmWaitB, 0.0); +		this->anmWaitB.setUpdateRate(1.0); +	} +	  	this->pos.x += (60 - this->timer) / 8; -	if (this->timer > 60) { doStateChange(&StateID_Wait); } +	if (timer < 10) { +		this->bodyModel._vf1C(); } +	else { +		this->hideModel._vf1C(); } + + +	if (this->timer > 60) {  +		doStateChange(&StateID_Wait);  +	}  	this->timer += 1;  } -void daRamboo_c::endState_Flee() { OSReport("Ugh, so dizzy."); } +void daRamboo_c::endState_Flee() {  + +	OSReport("Ugh, so dizzy.");  +}  void daRamboo_c::beginState_Outro() {  +	this->removeMyActivePhysics();  	this->timer = 0;  	this->rot.x = 0x0; // X is vertical axis  	this->rot.y = 0xE000; // Y is horizontal axis | 
