diff options
Diffstat (limited to '')
| -rw-r--r-- | src/bossRamboo.cpp | 375 | 
1 files changed, 375 insertions, 0 deletions
| diff --git a/src/bossRamboo.cpp b/src/bossRamboo.cpp new file mode 100644 index 0000000..f61ec33 --- /dev/null +++ b/src/bossRamboo.cpp @@ -0,0 +1,375 @@ +#include <common.h> +#include <game.h> +#include <g3dhax.h> +#include <sfx.h> +#include "effects.h" +#include "player.h" + +class daRamboo_c : public dEn_c { +	int onCreate(); +	int onDelete(); +	int onExecute(); +	int onDraw(); + +	mHeapAllocator_c allocator; +	m3d::mdl_c bodyModel; +	m3d::mdl_c fogModel; + +	int timer; +	int ytimer; +	char BigBossRamboo; +	float Baseline; +	float dying; + +	u64 eventFlag; + +	 +	void dieBigFall_Execute(); +	static daRamboo_c *build(); + +	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(daRamboo_c); +	DECLARE_STATE(Grow); +	DECLARE_STATE(Advance); +	DECLARE_STATE(Wait); +	DECLARE_STATE(Flee); +}; + +daRamboo_c *daRamboo_c::build() { +	void *buffer = AllocFromGameHeap1(sizeof(daRamboo_c)); +	return new(buffer) daRamboo_c; +} + + +extern "C" void *HandleXSpeed(daRamboo_c *); +extern "C" void *HandleYSpeed(daRamboo_c *); +extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daRamboo_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(daRamboo_c *, Vec pos); +extern "C" dStageActor_c *GetSpecificPlayerActor(int number); +extern "C" void *PlaySound(daRamboo_c *, int soundID); + + +CREATE_STATE(daRamboo_c, Grow); +CREATE_STATE(daRamboo_c, Advance); +CREATE_STATE(daRamboo_c, Wait); +CREATE_STATE(daRamboo_c, Flee); + + +struct EventTable_t { +	u64 events; +	// ... +}; + +extern EventTable_t *EventTable; + + +void daRamboo_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) {  +	this->_vf220(apOther->owner); +	OSReport("I hit Mario.");  +} +void daRamboo_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 daRamboo_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Iceball"); return false; } +void daRamboo_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); + +		doStateChange(&StateID_Flee);		 +		apOther->owner->Delete(); +	}	 +} +void daRamboo_c::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Hammer"); } + + +void daRamboo_c::dieBigFall_Execute() { +	 +	if (this->dying == 1) { return; }	 + +	this->rot.x = 0x0; // X is vertical axis +	this->rot.y = 0xE000; // Y is horizontal axis +	this->rot.z = 0x0; // Z is ... an axis >.> + +	if (this->scale.x > 0.1) { + +		PlaySound(this, SE_BOSS_CMN_DAMAGE_LAST); +		PlaySound(this, SE_EMY_BIG_TERESA_DEAD); + +		this->scale.x -= 0.175; +		this->scale.y -= 0.175; +		this->scale.z -= 0.175; + +		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 += 1; + + + +} + + +int daRamboo_c::onCreate() { + +	OSReport("Creating the Ramboo Model"); +	allocator.link(-1, GameHeaps[0], 0, 0x20); + +	nw4r::g3d::ResFile rf(getResource("teresa", "g3d/teresa.brres")); + +	fogModel.setup(rf.GetResMdl("fog"), &allocator, 0x224, 1, 0); +	SetupTextures_Enemy(&fogModel, 0); + +	bodyModel.setup(rf.GetResMdl("teresaA"), &allocator, 0x224, 1, 0); +	SetupTextures_Enemy(&bodyModel, 0); + + +	allocator.unlink(); + +//	this->BigBossRamboo = this->settings >> 28; + + +	OSReport("Setting Ramboo's Size to 16.0"); +	this->scale = (Vec){2.0, 2.0, 2.0}; + +	OSReport("Creating Ramboo's Physics Struct"); + +	ActivePhysics::Info HitMeBaby; +	HitMeBaby.xDistToCenter = 160.0; +	HitMeBaby.yDistToCenter = -80.0; + +	HitMeBaby.xDistToEdge = 154.0; +	HitMeBaby.yDistToEdge = 154.0; + +	HitMeBaby.category1 = 0x3; +	HitMeBaby.category2 = 0x0; +	HitMeBaby.bitfield1 = 0x4F; +	HitMeBaby.bitfield2 = 0x222; +	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->Baseline = this->pos.y; +	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->speed.x = 0.0; +	this->ytimer = 0; + +	char eventNum	= (this->settings >> 16) & 0xFF; +	OSReport("Event to activate: %d", eventNum); + +	this->eventFlag = (u64)1 << (eventNum - 1); + + +		 +	OSReport("Setting the State"); +	doStateChange(&StateID_Grow); + +	OSReport("Going to Execute Ramboo"); +	this->onExecute(); +	return true; +} + +int daRamboo_c::onDelete() { +	return true; +} + +int daRamboo_c::onExecute() { +	acState.execute(); +	updateModelMatrices(); + +	if (this->aPhysics.result1 == 1) { +		char PlayerID = NearestPlayer(this); +		dStageActor_c *Player = GetSpecificPlayerActor(PlayerID); +		 +		this->_vf220(Player); +	} +	 +	if (EventTable->events & this->eventFlag) { +		doStateChange(&StateID_DieBigFall); +	} + +	return true; +} + +int daRamboo_c::onDraw() { +	fogModel.scheduleForDrawing(); +	bodyModel.scheduleForDrawing(); +	return true; +} + + +void daRamboo_c::updateModelMatrices() { +	// This won't work with wrap because I'm lazy. +	matrix.translation(pos.x + 160.0, pos.y + (scale.x * 12.0) - 80.0, pos.z); + +	fogModel.setDrawMatrix(matrix); +	fogModel.setScale(&scale); +	fogModel.calcWorld(false); + +	matrix.translation(pos.x + 160.0, pos.y - 80.0, pos.z); +	matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); + +	bodyModel.setDrawMatrix(matrix); +	bodyModel.setScale(&scale); +	bodyModel.calcWorld(false); +} + + +// Grow State + +void daRamboo_c::beginState_Grow() {  +	OSReport("Growing when Kameck Tells me to."); +	this->timer = 0; +//	PlaySound(this, SE_BOSS_ROY_MAGIC_MAKE_FAST); +} + +void daRamboo_c::executeState_Grow() {  +	 +	this->timer = this->timer + 1; +	 +	float scaleSpeed, yPosScaling; +	 +	if ((this->timer > 60) && (this->timer < 140)) { +		scaleSpeed = 0.175; +//	 	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_CS_TERESA_BRING_IT); +		doStateChange(&StateID_Advance);  +	} +	 +} +void daRamboo_c::endState_Grow() {  +	this->Baseline = this->pos.y; +//	StopSound(SE_BOSS_ROY_MAGIC_MAKE_FAST); + +	OSReport("OK. All grown up now.");  +} + + + + + +// Advance State + +void daRamboo_c::beginState_Advance() {  +	OSReport("Charge!");  +	this->speed.y = 0; +	this->speed.z = 0; +	this->timer = 0; +} +void daRamboo_c::executeState_Advance() {  + +	this->pos.x -= this->timer / 32; +	this->pos.y = this->Baseline + sin(this->ytimer * 3.14 / 192) * 48; +	 +		 +	if (this->timer >= 48) { this->timer = 47; } +	if (this->ytimer >= 384) { this->ytimer = 0; } +	 +	PlaySound(this, SE_EMY_TERESA); +	 +	this->timer += 1; +	this->ytimer += 1; +} + +void daRamboo_c::endState_Advance() { OSReport("Ouch. Stop Charging."); } + + + + + +// Wait State + +void daRamboo_c::beginState_Wait() {  + +	OSReport("Waiting");  +	this->timer = 0; +	PlaySound(this, SE_EMY_TERESA_STOP); + +} +void daRamboo_c::executeState_Wait() {  + +	if (this->timer > 60) {  +		PlaySound(this, SE_EMY_CS_TERESA_BEAT_YOU); +		doStateChange(&StateID_Advance);  +	} +	 +	this->timer += 1; + +} + +void daRamboo_c::endState_Wait() { OSReport("No more bouncing."); } + + + + + +// Flee State + +void daRamboo_c::beginState_Flee() {  + +	OSReport("Damnit that hurt.");  +	this->timer = 0; + +} +void daRamboo_c::executeState_Flee() {  + +	this->pos.x += (60 - this->timer) / 8; +	 +	if (this->timer > 60) { doStateChange(&StateID_Wait); } +	 +	this->timer += 1; +} + +void daRamboo_c::endState_Flee() { OSReport("Ugh, so dizzy."); } + | 
