diff options
| author | Colin Noga <Tempus@Spectrum-Song.local> | 2011-09-11 06:13:25 -0500 | 
|---|---|---|
| committer | Colin Noga <Tempus@Spectrum-Song.local> | 2011-09-11 06:13:25 -0500 | 
| commit | 0e5f20a6dc5f179cc38692b79a233ff2c1d86450 (patch) | |
| tree | 3d5957e1fc5eae2fc62db0016c48b8d1d0ae3faf | |
| parent | dd486705285fa58fe8a292203329b9a35ff1d77d (diff) | |
| download | kamek-0e5f20a6dc5f179cc38692b79a233ff2c1d86450.tar.gz kamek-0e5f20a6dc5f179cc38692b79a233ff2c1d86450.zip  | |
MrSun prototype and some fixes
Diffstat (limited to '')
| -rw-r--r-- | mrsun.yaml | 25 | ||||
| -rw-r--r-- | spritetex.yaml | 7 | ||||
| -rwxr-xr-x | src/mrsun.cpp | 134 | ||||
| -rwxr-xr-x | src/spriteswapper.cpp | 307 | ||||
| -rwxr-xr-x | src/spritetex.S | 20 | 
5 files changed, 313 insertions, 180 deletions
diff --git a/mrsun.yaml b/mrsun.yaml new file mode 100644 index 0000000..ffcad10 --- /dev/null +++ b/mrsun.yaml @@ -0,0 +1,25 @@ +--- +# Replaces EN_WALLINSECT + +source_files: [../src/mrsun.cpp] +hooks: +  - name: MrSun_Create +    type: add_func_pointer +    src_addr_pal: 0x80B0DFB8 +    target_func: 'MrSun_Create(MrSun *self)' +     +  - name: MrSun_Execute +    type: add_func_pointer +    src_addr_pal: 0x80B0DFD0 +    target_func: 'MrSun_Execute(MrSun *self)' + +  - name: MrSun_Draw +    type: patch +    addr_pal: 0x80B0DFDC +    data: '809D0810' + +  - name: MrSun_HeapDeallocated +    type: patch +    addr_pal: 0x80B0DFF8 +    data: '809D1F70' + diff --git a/spritetex.yaml b/spritetex.yaml index 65f846a..1982fdc 100644 --- a/spritetex.yaml +++ b/spritetex.yaml @@ -203,6 +203,13 @@ hooks:      target_func: 'TEX_Manta' +#  - name: TEX_MantaInherit +#    type: branch_insn +#    branch_type: bl +#    src_addr_pal: 0x8085F6D4 +#    target_func: 'TEX_MantaInherit' + +    - name: TEX_Parabeetle      type: branch_insn      branch_type: bl diff --git a/src/mrsun.cpp b/src/mrsun.cpp new file mode 100755 index 0000000..6d3eccb --- /dev/null +++ b/src/mrsun.cpp @@ -0,0 +1,134 @@ +#include <common.h> +#include <game.h> + +struct MrSun { +	u32 id;			// 0x00 +	u32 settings;	// 0x04 +	u16 name;		// 0x08 +	u8 _0A[6];		// 0x0A +	u8 _10[0x9C];	// 0x10 +	float x;		// 0xAC +	float y;		// 0xB0 +	float z;		// 0xB4 +	float last_x; +	float last_y; +	float last_z; +	float x_delta; +	float y_delta; +	float z_delta; +	float d0; +	float d4; +	float d8; +	float scale_x; +	float scale_y; +	float scale_z; +	float speed_x; +	float speed_y; +	float speed_z; +	float maxspeed_x; +	float maxspeed_y; +	float maxspeed_z; +	u16 rot_x; +	u16 rot_y; +	u16 rot_z; +	u8 _106[0x42];	// 0x106 +	u8 _148[0x288]; +	 +	// Any variables you add to the class go here; starting at offset 0x3D0 +	u64 eventFlag; +	u32 location; +	u8 damage; +	u8 respawn; +}; + +struct EventTable_t { +	u64 events; +}; + +struct VEC { +	float x; +	float y; +	float z; +}; + +struct APInfo { +	float xDistToCenter;	// 0 +	float yDistToCenter;	// 4 +	float xDistToEdge;		// 8 +	float yDistToEdge;		// C +	u8 category1;			// 10 +	u8 category2;			// 11 +	u16 nulls;				// 12 +	u32 bitfield1;			// 14 +	u16 bitfield2;			// 18 +	u16 unkShort;			// 1C +	u32 callback;			// 20 +}; + + +extern EventTable_t *EventTable; +extern "C" dStageActor_c *CreateActor(u16 classID, int settings, VEC pos, char rot, char layer); +extern "C" dStageActor_c *Actor_SearchByID(u32 actorID); + +extern "C" void *BubbleModel(MrSun *self); +extern "C" void *ActivePhysics_InitWithStruct(u8 *thing, MrSun *self, APInfo physstruct); +extern "C" void *ActivePhysics_AddToList(u8 *thing); + + + +bool MrSun_Execute(MrSun *self); +bool MrSun_Create(MrSun *self); + +#define ACTIVATE	1 +#define DEACTIVATE	0 + + + + +bool MrSun_Create(MrSun *self) { + +	OSReport("Creating the Mr.Sun Model"); + +	BubbleModel(self); +	 + +	OSReport("Setting Mr.Sun's Size to 4.0"); + +	self->scale_x = 4.0; +	self->scale_y = 4.0; +	self->scale_z = 4.0; + + +	OSReport("Creating Mr.Sun's Physics Struct"); + +	APInfo HitMeBaby; +	HitMeBaby.xDistToCenter = 0.0; +	HitMeBaby.yDistToCenter = 0.0; +	HitMeBaby.xDistToEdge = 8.0; +	HitMeBaby.yDistToEdge = 8.0; +	HitMeBaby.category1 = 0x3; +	HitMeBaby.category2 = 0x0; +	HitMeBaby.bitfield1 = 0x4F; +	HitMeBaby.bitfield2 = 0x820C; +	HitMeBaby.unkShort = 0; +	HitMeBaby.callback = 0x80095950; + + +	OSReport("Making the Physics Class and adding to the list"); + +	ActivePhysics_InitWithStruct(self->_148, self, HitMeBaby); +	ActivePhysics_AddToList(self->_148); +	 + +	OSReport("Going to Execute Mr.Sun"); +		 +	MrSun_Execute(self); +	return true; +} + +bool MrSun_Execute(MrSun *self) { +	OSReport("Oh Mr.Sun, Sun, Mr.Golden Sun"); +	return true; +} + + diff --git a/src/spriteswapper.cpp b/src/spriteswapper.cpp index 0eec8b1..4929e7c 100755 --- a/src/spriteswapper.cpp +++ b/src/spriteswapper.cpp @@ -12,16 +12,19 @@ struct SpriteSwapper {  	float z;		// 0xB4  	u8 _B8[0x318];	// 0xB8  	// Any variables you add to the class go here; starting at offset 0x3D0 -	u64 eventFlag;	// 0x3D0 -	u64 alteventFlag;	// 0x3D0 +	u64 eventFlag; +	u64 alteventFlag;  	u8 alteventState;  	u8 alteventTrue; -	u16 firstType;		// 0x3D4 -	u16 secondType;		// 0x3D4 -	u8 lastEvState;	// 0x3DA -	u32 firstActor; -	u32 secondActor; -	u8 direction;	// 0x3D0 +	u16 firstType; +	u16 secondType; +	u8 lastEvState; +	u32 spawnedActor; +	u16 spawn; +	u16 spawned; +	u8 direction; +	Vec speed; +	S16Vec rot;  };  struct EventTable_t { @@ -36,6 +39,8 @@ extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char r  extern "C" dStageActor_c *Actor_SearchByID(u32 actorID);  void SpriteSwapper_Update(SpriteSwapper *self); +void SpriteSwapper_CopyAndDestroy(SpriteSwapper *self, dStageActor_c *actor); +void SpriteSwapper_SpawnActor(SpriteSwapper *self, u16 newActorName);  #define ACTIVATE	1  #define DEACTIVATE	0 @@ -49,11 +54,11 @@ bool SpriteSwapper_Create(SpriteSwapper *self) {  	char eventNum	= (self->settings >> 28)	& 0xF;  	char alteventNum	= (self->settings >> 12)	& 0xF;  	OSReport("Event to activate: %d", eventNum); +	OSReport("AltEvent to activate: %d", alteventNum);  	self->eventFlag = (u64)1 << (eventNum - 1);  	self->alteventFlag = (u64)1 << (alteventNum - 1); -	self->firstActor = 0; -	self->secondActor = 0; +	self->spawnedActor = 0;  	self->firstType = (self->settings >> 16) & 0xFFF;  	self->secondType = self->settings & 0xFFF; @@ -71,9 +76,11 @@ bool SpriteSwapper_Create(SpriteSwapper *self) {  	OSReport("Spawning first sprite.");  	dStageActor_c *spawned = CreateActor(self->firstType, 0, pos, 0, 0); -	self->firstActor = spawned->id; +	self->spawnedActor = spawned->id; +	self->spawned = self->firstType; +	self->spawn = 0; -	OSReport("Spawned %d.", self->firstActor); +	OSReport("Spawned %d.", self->spawnedActor);  	SpriteSwapper_Update(self); @@ -86,155 +93,136 @@ bool SpriteSwapper_Execute(SpriteSwapper *self) {  } + +void SpriteSwapper_CopyAndDestroy(SpriteSwapper *self) { + +	dStageActor_c *spawned = Actor_SearchByID(self->spawnedActor); +	if (spawned != 0) { +		OSReport("It's still alive."); +		self->x = spawned->pos.x; +		self->y = spawned->pos.y; +		self->z = spawned->pos.z; +		self->direction = spawned->direction; +		self->speed = spawned->speed; +		self->rot = spawned->rot; +		spawned->Delete(); +	 +		self->spawnedActor = 0; +		OSReport("Now it's deleted."); +	} +	 +	else { +		OSReport("Is dead, turn it off.... forever."); +		self->spawn = 0; +	} +} + + +void SpriteSwapper_SpawnActor(SpriteSwapper *self, u16 newActorName) { + +	Vec pos; +	pos.x = self->x; +	pos.y = self->y; +	pos.z = self->z; + +	OSReport("Making sprite."); +	dStageActor_c *spawner = CreateActor(newActorName, 0, pos, 0, 0); +	self->spawnedActor = spawner->id; +//	spawner->direction = self->direction; +//	spawner->speed = self->speed; + +//	OSReport("Direction is %d.", spawner->direction); +//	OSReport("Initial Rotation is %x %x.", spawner->rot.y, spawner->_106.y); +//	if (spawner->direction == 0) { +//		spawner->rot.y = 0xF556 + spawner->rot.y; } +//	else { +//		spawner->rot.y = 0xC000; } +//	OSReport("Current Rotation is %x %x.", spawner->rot.y, spawner->_106.y); + + + +//Direction is 1. +//Initial Rotation is ffffd556 +// +// Direction is 0. +//Initial Rotation is ffffc000 +// +//Direction is 0 +//Initial Rotation is ffffd556 + +		 +		 +//	spawner->rot = self->rot; +	OSReport("Spawned %d.", self->spawnedActor); +	 +} + +  void SpriteSwapper_Update(SpriteSwapper *self) { +	if (self->spawn != 0) +	{ +		OSReport("Spawning %d.", self->spawn); +		SpriteSwapper_SpawnActor(self, self->spawn); +		self->spawned = self->spawn; +		self->spawn = 0; +		return; +	} + +	// Sprites alternate when event a is turned on or off.  	if (self->alteventTrue == 0)  	{ +		OSReport("Single Event Type.");  		if (EventTable->events & self->eventFlag)  		{		 -			// Put an action for when the event turns on here -			OSReport("Event turned on."); -			 -			if (self->firstActor != 0) +			OSReport("Spawning Event is on."); +			if (self->spawned == self->secondType)  			{ -				OSReport("Found the first sprite."); -	 -				dStageActor_c *spawned = Actor_SearchByID(self->firstActor); -				if (spawned != 0) { -					OSReport("It's still alive."); -					self->x = spawned->pos.x; -					self->y = spawned->pos.y; -					self->z = spawned->pos.z; -					self->direction = spawned->direction; -					Vec speed = spawned->speed; -					S16Vec rot = spawned->rot; -					spawned->Delete(); -				 -					self->firstActor = 0; -					OSReport("Now it's deleted."); -		 -					Vec pos; -					pos.x = self->x; -					pos.y = self->y; -					pos.z = self->z; +				OSReport("Second sprite already there."); +				return; +			} -					int x = 0; -					while (x < 100000) { -						x = x+1; -					} +			OSReport("Event turned on."); -					OSReport("Making second sprite."); -					dStageActor_c *spawner = CreateActor(self->secondType, 0, pos, 0, 0); -					self->secondActor = spawner->id; -					spawner->direction = self->direction; -					spawner->speed = speed; -					spawner->rot = rot; -					OSReport("Spawned %d.", self->secondActor); -				} -				 -				else { -					OSReport("Looks dead to me."); -				} -			}		 -	//		EventTable->events = EventTable->events & ~self->eventFlag; +			self->spawn = self->secondType; +			SpriteSwapper_CopyAndDestroy(self);  		}  		else  		{ -			OSReport("Event turned off."); -			if (self->secondActor != 0) +			OSReport("Spawning Event is off."); +			if (self->spawned == self->firstType)  			{ -				OSReport("Found the second sprite."); -				dStageActor_c *spawned = Actor_SearchByID(self->secondActor); -				if (spawned != 0) { -					OSReport("It's still alive."); -					self->x = spawned->pos.x; -					self->y = spawned->pos.y; -					self->z = spawned->pos.z; -					self->direction = spawned->direction; -					Vec speed = spawned->speed; -					S16Vec rot = spawned->rot; -					spawned->Delete(); +				OSReport("First sprite already there."); +				return; +			} -					self->secondActor = 0; -					OSReport("Now it's deleted."); -		 -					Vec pos; -					pos.x = self->x; -					pos.y = self->y; -					pos.z = self->z; -			 -					int x = 0; -					while (x < 100000) { -						x = x+1; -					} - -					OSReport("Making first sprite again."); -					dStageActor_c *spawner = CreateActor(self->firstType, 0, pos, 0, 0); -					self->firstActor = spawner->id; -					spawner->direction = self->direction; -					spawner->speed = speed; -					spawner->rot = rot; -					OSReport("Spawned %d.", self->firstActor); -				} +			OSReport("Event turned off."); -				else { -					OSReport("Looks dead to me."); -				} -			}		 +			self->spawn = self->firstType; +			SpriteSwapper_CopyAndDestroy(self);  		} -  	} +	 +	// Sprites alternate when event a or b is turned on.  	else  	{ +		OSReport("Dual Event Type. EventState is %d.", self->alteventState);  		if (EventTable->events & self->eventFlag)  		{		 +			OSReport("First Event on, spawning is alteventState is 0.");  			if (self->alteventState == 0)  			{ -				// Put an action for when the event turns on here -				OSReport("Event turned on."); -				 -				if (self->firstActor != 0) +				if (self->spawned == self->secondType)  				{ -					OSReport("Found the first sprite."); -		 -					dStageActor_c *spawned = Actor_SearchByID(self->firstActor); -					if (spawned != 0) { -						OSReport("It's still alive."); -						self->x = spawned->pos.x; -						self->y = spawned->pos.y; -						self->z = spawned->pos.z; -						self->direction = spawned->direction; -						Vec speed = spawned->speed; -						S16Vec rot = spawned->rot; -						spawned->Delete(); +					OSReport("Second sprite already there."); +					return; +				} -						self->firstActor = 0; -						OSReport("Now it's deleted."); -			 -						Vec pos; -						pos.x = self->x; -						pos.y = self->y; -						pos.z = self->z; - -						int x = 0; -						while (x < 100000) { -							x = x+1; -						} +				OSReport("Event turned on."); -						OSReport("Making second sprite."); -						dStageActor_c *spawner = CreateActor(self->secondType, 0, pos, 0, 0); -						self->secondActor = spawner->id; -						spawner->direction = self->direction; -						spawner->speed = speed; -						spawner->rot = rot; -						OSReport("Spawned %d.", self->secondActor); -					} - -					else { -						OSReport("Looks dead to me."); -					} - -				}		 +				self->spawn = self->secondType; +				SpriteSwapper_CopyAndDestroy(self); +  				EventTable->events = EventTable->events & ~self->alteventFlag;  				self->alteventState = 1;  			} @@ -242,51 +230,20 @@ void SpriteSwapper_Update(SpriteSwapper *self) {  		if (EventTable->events & self->alteventFlag)  		{ +			OSReport("Second Event on, spawning is alteventState is 1.");  			if (self->alteventState == 1)  			{ -				OSReport("Event turned off."); -				if (self->secondActor != 0) +				if (self->spawned == self->firstType)  				{ -					OSReport("Found the second sprite."); -					dStageActor_c *spawned = Actor_SearchByID(self->secondActor); -					if (spawned != 0) { -						OSReport("It's still alive."); -						self->x = spawned->pos.x; -						self->y = spawned->pos.y; -						self->z = spawned->pos.z; -						self->direction = spawned->direction; -						Vec speed = spawned->speed; -						S16Vec rot = spawned->rot; -						spawned->Delete(); +					OSReport("First sprite already there."); +					return; +				} -						self->secondActor = 0; -						OSReport("Now it's deleted."); -			 -						Vec pos; -						pos.x = self->x; -						pos.y = self->y; -						pos.z = self->z; +				OSReport("Alt Event turned on."); +				 +				self->spawn = self->firstType; +				SpriteSwapper_CopyAndDestroy(self); -						int x = 0; -						while (x < 100000) { -							x = x+1; -						} - -						OSReport("Making first sprite again."); -						dStageActor_c *spawner = CreateActor(self->firstType, 0, pos, 0, 0); -						self->firstActor = spawner->id; -						spawner->direction = self->direction; -						spawner->speed = speed; -						spawner->rot = rot; -						OSReport("Spawned %d.", self->firstActor); -					} - - -					else { -						OSReport("Looks dead to me."); -					} - -				}		  				EventTable->events = EventTable->events & ~self->eventFlag;  				self->alteventState = 0;  			} diff --git a/src/spritetex.S b/src/spritetex.S index fa4d6e8..431d29f 100755 --- a/src/spritetex.S +++ b/src/spritetex.S @@ -403,6 +403,15 @@ TEX_Manta:  	andi. r5, r5, 0xF  	b GetTexFilenameForR5 +.global TEX_MantaInherit +TEX_MantaInherit: +	lwz r5, 4(r28) +	andis. r5, r5, 0x0F00 +	 +	or r5, r5, r0 +	oris r5, r5, 0x8000 +	blr +  .global TEX_Parabeetle  TEX_Parabeetle: @@ -1241,11 +1250,9 @@ FlakeyStardust:  .global TEX_Flakes  TEX_Flakes: -	lwz r5, 4(r30) -	srwi r5, r5, 24 -	andi. r5, r5, 0xF -	b GetTexFilenameForR5 - +	lis r5, snowstring@h +	ori r5, r5, snowstring@l +	blr  .data @@ -1258,6 +1265,9 @@ TexFilenameBuffer:  TexFormatString:  	.string "g3d/t%02d.brres" +snowstring: +	.string "g3d/t00.brres" +  ConvertFloat:  	.word  0x43300000,0x0,0x43300000,0x80000000  | 
