From 0e5f20a6dc5f179cc38692b79a233ff2c1d86450 Mon Sep 17 00:00:00 2001 From: Colin Noga Date: Sun, 11 Sep 2011 06:13:25 -0500 Subject: MrSun prototype and some fixes --- mrsun.yaml | 25 ++++ spritetex.yaml | 7 ++ src/mrsun.cpp | 134 ++++++++++++++++++++++ src/spriteswapper.cpp | 307 ++++++++++++++++++++++---------------------------- src/spritetex.S | 20 +++- 5 files changed, 313 insertions(+), 180 deletions(-) create mode 100644 mrsun.yaml create mode 100755 src/mrsun.cpp 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 +#include + +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 -- cgit v1.2.3