summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mrsun.yaml25
-rw-r--r--spritetex.yaml7
-rwxr-xr-xsrc/mrsun.cpp134
-rwxr-xr-xsrc/spriteswapper.cpp307
-rwxr-xr-xsrc/spritetex.S20
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