diff options
| -rw-r--r-- | kamek_pal.x | 10 | ||||
| -rwxr-xr-x | src/mrsun.cpp | 291 | 
2 files changed, 279 insertions, 22 deletions
| diff --git a/kamek_pal.x b/kamek_pal.x index c9d0095..12d1ea4 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -23,12 +23,14 @@ SECTIONS {  /* Mr Sun Related */ -	BubbleModel = 0x809D0C80; -	BubbleDraw = 0x809D0810;  	ActivePhysics_InitWithStruct = 0x8008C3E0;  	ActivePhysics_AddToList = 0x8008C330; -	 -	 +	HandleXSpeed = 0x8006CD90; +	HandleYSpeed = 0x8006CDE0; +	UpdateObjectPosBasedOnSpeedValues_real = 0x8006CD40; +	dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3 = 0x80096240; + +  	_savefpr_14 = 0x802DCF98; diff --git a/src/mrsun.cpp b/src/mrsun.cpp index bce5908..00ca9ca 100755 --- a/src/mrsun.cpp +++ b/src/mrsun.cpp @@ -11,6 +11,15 @@ class daMrSun_c : public dEn_c {  	mHeapAllocator_c allocator;  	m3d::mdl_c model; +	float Baseline; +	float SwoopSlope; +	float SpiralLoop; +	float yThreshold; +	float yAccel; +	Vec	swoopTarget; +	float slope; +	u32 timer; +  	static daMrSun_c *build();  	void updateModelMatrix(); @@ -21,6 +30,7 @@ class daMrSun_c : public dEn_c {  	DECLARE_STATE(Spiral);  	DECLARE_STATE(Spit);  	DECLARE_STATE(Spin); +	DECLARE_STATE(Wait);  };  daMrSun_c *daMrSun_c::build() { @@ -28,6 +38,17 @@ daMrSun_c *daMrSun_c::build() {  	return new(buffer) daMrSun_c;  } + +extern "C" void *HandleXSpeed(daMrSun_c *); +extern "C" void *HandleYSpeed(daMrSun_c *); +extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daMrSun_c *); +extern "C" u32 GenerateRandomNumber(int max); +extern "C" u8 dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(daMrSun_c *, Vec pos); +extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer); +extern "C" dStageActor_c *GetSpecificPlayerActor(int number); + + +  CREATE_STATE(daMrSun_c, Follow);  CREATE_STATE(daMrSun_c, Swoop);  CREATE_STATE(daMrSun_c, Spiral); @@ -55,8 +76,8 @@ int daMrSun_c::onCreate() {  	ActivePhysics::Info HitMeBaby;  	HitMeBaby.xDistToCenter = 0.0;  	HitMeBaby.yDistToCenter = 0.0; -	HitMeBaby.xDistToEdge = 8.0; -	HitMeBaby.yDistToEdge = 8.0; +	HitMeBaby.xDistToEdge = 32.0; +	HitMeBaby.yDistToEdge = 32.0;  	HitMeBaby.category1 = 0x3;  	HitMeBaby.category2 = 0x0;  	HitMeBaby.bitfield1 = 0x4F; @@ -69,7 +90,17 @@ int daMrSun_c::onCreate() {  	this->aPhysics.initWithStruct(this, &HitMeBaby);  	this->aPhysics.addToList(); -	doStateChange(&StateID_Follow); +	OSReport("Setting up Mr.Sun's Box of Goodies"); +	this->Baseline = this->pos.y; +	this->SwoopSlope = 0.0; +	this->SpiralLoop = 0; +	this->yThreshold = 10.0; +	this->yAccel = 0.2; +	this->timer = 0; +	 +	 +	OSReport("Setting Mr.Sun's State"); +	doStateChange(&StateID_Swoop);  	OSReport("Going to Execute Mr.Sun");  	this->onExecute(); @@ -104,25 +135,249 @@ void daMrSun_c::updateModelMatrix() {  } +// Follow State + +void daMrSun_c::beginState_Follow() {  +	OSReport("Mr.Sun is following youuuuu."); +	this->timer = 0; +} +void daMrSun_c::executeState_Follow() {  + +	if (this->timer > 1000) +		this->doStateChange(&StateID_Wait); + +	this->direction = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); +	 +	if (this->direction == 0) { +		if (this->speed.x > 10.0) +			this->speed.x = this->speed.x + 0.1; +	} +	else { +		if (this->speed.x < -10.0) +			this->speed.x = this->speed.x - 0.1; +	} +	 +	HandleXSpeed(this); +	 +	 +	if (this->pos.y > this->Baseline) { +		if (this->speed.y > -this->yThreshold) +			this->speed.y = this->speed.y - this->yAccel; +	} +	 +	else if (this->pos.y < this->Baseline) { +		if (this->speed.y > -this->yThreshold) +			this->speed.y = this->speed.y + this->yAccel; +	} +	 +	else { +		this->pos.y = this->Baseline; +		this->speed.y = 0; +	} +	 +	HandleYSpeed(this); + +	UpdateObjectPosBasedOnSpeedValues_real(this); +	this->timer = this->timer + 1; +} +void daMrSun_c::endState_Follow() { OSReport("Mr.Sun is coming for you."); } + + +// Swoop State + +void daMrSun_c::beginState_Swoop() {  +	OSReport("Swooping down from above, Mr.Sun falls down."); +	 +	dStageActor_c *Player = GetSpecificPlayerActor(0); +	if (Player == 0) +		Player = GetSpecificPlayerActor(1); +	if (Player == 0) +		Player = GetSpecificPlayerActor(2); +	if (Player == 0) +		Player = GetSpecificPlayerActor(3); +	if (Player == 0) +		doStateChange(&StateID_Follow); +		 +	 +	this->swoopTarget = Player->pos; + +	float relativeSunX = this->swoopTarget.x - this->pos.x; +	float relativeSunY = this->swoopTarget.y - this->pos.y; +	 +	this->slope = relativeSunY / relativeSunX; +} +void daMrSun_c::executeState_Swoop() {  +	 +	if (this->pos.y > this->swoopTarget.y) +		doStateChange(&StateID_Follow); +		 +	if (this->slope < 0.0) +		this->speed.x = this->speed.x + 0.2; + +	if (this->slope > 0.0) +		this->speed.x = this->speed.x - 0.2; + +	HandleXSpeed(this); +	HandleYSpeed(this); +	UpdateObjectPosBasedOnSpeedValues_real(this); +	 +} +void daMrSun_c::endState_Swoop() {  +	OSReport("Returning to the sky, Mr.Sun flies into the sunset."); + +	this->swoopTarget = (Vec){0.0, 0.0, 0.0}; +} + + + +// Spiral State + +void daMrSun_c::beginState_Spiral() { OSReport("Super Spiral Sunspot!"); } +void daMrSun_c::executeState_Spiral() {  + +	if (this->SpiralLoop > (6.28 * 5)) +		doStateChange(&StateID_Follow); + +	this->pos.x = this->SpiralLoop * cos(this->SpiralLoop); +	this->pos.y = this->SpiralLoop * sin(this->SpiralLoop); + +	this->SpiralLoop = this->SpiralLoop + 0.1; +} +void daMrSun_c::endState_Spiral() { OSReport("Nightmare Spiral Attack Ends!"); } + + + +// Spit State + +void daMrSun_c::beginState_Spit() { OSReport("Goodness Gracious Great Balls of Fire!"); } +void daMrSun_c::executeState_Spit() {  +	 +	if (this->timer > 1000)	 +		doStateChange(&StateID_Follow); +	 +	dStageActor_c *spawner = CreateActor(107, 0, this->pos, 0, 0); +	spawner->speed.x = 10.0; +	spawner->speed.y = 10.0; +	 +	spawner = CreateActor(107, 0, this->pos, 0, 0); +	spawner->speed.x = 8.0; +	spawner->speed.y = 5.0; + +	spawner = CreateActor(107, 0, this->pos, 0, 0); +	spawner->speed.x = 4.0; +	spawner->speed.y = 0.0; +	 +	this->timer = this->timer + 1; + +} +void daMrSun_c::endState_Spit() { OSReport("Armageddon complete."); } + + + +// Spin State + +void daMrSun_c::beginState_Spin() { OSReport("Hoola hoola hoola hoop."); } +void daMrSun_c::executeState_Spin() {  +	 +	if (this->timer > 1000) +		this->doStateChange(&StateID_Wait); + +	this->direction = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); +	 +	if (this->direction == 0) { +		if (this->speed.x > 10.0) +			this->speed.x = this->speed.x + 0.1; +	} +	else { +		if (this->speed.x < -10.0) +			this->speed.x = this->speed.x - 0.1; +	} +	 +	HandleXSpeed(this); +	UpdateObjectPosBasedOnSpeedValues_real(this); + +	this->timer = this->timer + 1; +	 +	int direction; +	direction = GenerateRandomNumber(8); +	 +	float xlaunch; +	float ylaunch; +	 +	switch (direction) {  +		case 1: // E +			xlaunch = 10.0; +			ylaunch = 0.0; +		case 2: // SE +			xlaunch = 10.0; +			ylaunch = 10.0; +		case 3: // S +			xlaunch = 0.0; +			ylaunch = 10.0; +		case 4: // SW +			xlaunch = -10.0; +			ylaunch = 10.0; +		case 5:	// W +			xlaunch = -10.0; +			ylaunch = 0.0; +		case 6:	// NW +			xlaunch = -10.0; +			ylaunch = -10.0; +		case 7:	// N +			xlaunch = 0.0; +			ylaunch = -10.0; +		case 8:	// NE +			xlaunch = 10.0; +			ylaunch = -10.0; +		default: +			xlaunch = 10.0; +			ylaunch = -10.0; +	} +	 +	dStageActor_c *spawner = CreateActor(107, 0, this->pos, 0, 0); +	spawner->speed.x = xlaunch; +	spawner->speed.y = ylaunch; +	 +} +void daMrSun_c::endState_Spin() { OSReport("K, I is dizzy now."); } -void daMrSun_c::beginState_Follow() { } -void daMrSun_c::executeState_Follow() { } -void daMrSun_c::endState_Follow() { } -void daMrSun_c::beginState_Swoop() { } -void daMrSun_c::executeState_Swoop() { } -void daMrSun_c::endState_Swoop() { } -void daMrSun_c::beginState_Spiral() { } -void daMrSun_c::executeState_Spiral() { } -void daMrSun_c::endState_Spiral() { } +// Wait State -void daMrSun_c::beginState_Spit() { } -void daMrSun_c::executeState_Spit() { } -void daMrSun_c::endState_Spit() { } +void daMrSun_c::beginState_Wait() { -void daMrSun_c::beginState_Spin() { } -void daMrSun_c::executeState_Spin() { } -void daMrSun_c::endState_Spin() { } +	OSReport("Preparing an attack!"); + +	this->timer = 0; +	this->speed.x = 0.0; +} +void daMrSun_c::executeState_Wait() {  +	int Choice; + +	if (this->timer > 1000) { + +		Choice = GenerateRandomNumber(4); +		 +		switch (Choice) {  +			case 1: +				doStateChange(&StateID_Swoop); +			case 2: +				doStateChange(&StateID_Spiral); +			case 3: +				doStateChange(&StateID_Spit); +			case 4: +				doStateChange(&StateID_Follow); +			default:	 +				doStateChange(&StateID_Follow); +		} +	} + +	this->timer = this->timer + 1; +} +void daMrSun_c::endState_Wait() { +	OSReport("Mr.Sun Cometh!"); +	this->timer = 0; +} | 
