summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--NewerProject.yaml3
-rw-r--r--growup.yaml230
-rw-r--r--kamek_pal.x9
-rw-r--r--levelspecial.yaml25
-rw-r--r--spritetex.yaml85
-rw-r--r--src/growup.s536
-rw-r--r--src/levelspecial.cpp185
-rw-r--r--src/spritetex.S57
8 files changed, 1092 insertions, 38 deletions
diff --git a/NewerProject.yaml b/NewerProject.yaml
index 7a4e07d..367d0c5 100644
--- a/NewerProject.yaml
+++ b/NewerProject.yaml
@@ -16,4 +16,5 @@ modules:
- processed/switchblock.yaml
# - processed/msgbox.yaml
# - processed/replay.yaml
-
+ - processed/growup.yaml
+ - processed/levelspecial.yaml
diff --git a/growup.yaml b/growup.yaml
new file mode 100644
index 0000000..d6480db
--- /dev/null
+++ b/growup.yaml
@@ -0,0 +1,230 @@
+---
+source_files: [../src/growup.s]
+hooks:
+
+
+# After Actor onCreate
+
+ - name: Global_Size
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x800951EC
+ target_func: 'ModifyGlobalSizes'
+
+
+# Active Physics Init from Struct
+
+ - name: Global_Collisions
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x8008C3E0
+ target_func: 'ModifyCollision'
+
+
+
+# Stand On Top Special Collisions Inits
+
+# - name: Global_StandonTopA
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x800DB27C
+# target_func: 'ModifyStandOnTopInitA'
+#
+# - name: Global_StandonTopB
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x800DB294
+# target_func: 'ModifyStandOnTopInitB'
+#
+# - name: Global_StandonTopC
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x800DB30C
+# target_func: 'ModifyStandOnTopInitC'
+#
+# - name: Global_StandonTopD
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x800DB32C
+# target_func: 'ModifyStandOnTopInitD'
+
+
+
+# Rideable Actor Inits
+
+
+ - name: Global_RiderA
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800DB690
+ target_func: 'ModifyRiderInitA'
+
+ - name: Global_RiderB
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800DB6B4
+ target_func: 'ModifyRiderInitB'
+
+ - name: Global_RiderC
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800DB6E8
+ target_func: 'ModifyRiderInitC'
+
+ - name: Global_RiderD
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800DB6FC
+ target_func: 'ModifyRiderInitD'
+
+
+
+
+
+
+
+
+## Below are enemy specific hacks to fix issues that arise when resizing
+#
+#
+# - name: FixingPipeSpawnerGoomba
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80ABB6D0
+# target_func: 'InheritSettings_A'
+#
+#
+# - name: FixingPipeSpawnerBobomb
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80ABB760
+# target_func: 'InheritSettings_A'
+#
+#
+# - name: FixingBlockHit
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x800883A4
+# target_func: 'InheritSettings_B'
+#
+#
+# - name: FixingBlockHitB
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80088938
+# target_func: 'InheritSettings_C'
+#
+#
+# - name: FixingMegaGoomba
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A5AAA8
+# target_func: 'InheritSettings_D'
+#
+# - name: FixingMegaGoombaB
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A5AAC4
+# target_func: 'InheritSettings_E'
+#
+# - name: FixingMegaGoombaC
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A5AB44
+# target_func: 'InheritSettings_D'
+#
+# - name: FixingMegaGoombaD
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x880A5AB80
+# target_func: 'InheritSettings_E'
+#
+# - name: FixingMegaGoombaE
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A5AB9C
+# target_func: 'InheritSettings_E'
+#
+# - name: FixingMegaGoombaF
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A5ABB8
+# target_func: 'InheritSettings_E'
+#
+#
+# - name: FixingLargeGoomba
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A6A208
+# target_func: 'InheritSettings_D'
+#
+# - name: FixingLargeGoombaB
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A6A22C
+# target_func: 'InheritSettings_E'
+#
+# - name: FixingLargeGoombaC
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A6A2A8
+# target_func: 'InheritSettings_D'
+#
+# - name: FixingLargeGoombaD
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A6A2CC
+# target_func: 'InheritSettings_E'
+#
+#
+#
+# - name: Piranha_Collisions
+# type: patch
+# data: "41800000"
+# addr_pal: 0x802EE81C
+#
+#
+#
+#
+#
+#
+#
+#
+# - name: Projectile_Pirahna
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80029640
+# target_func: 'PiranhaFireType'
+#
+# - name: Projectile_PiranhaPos
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x8002964C
+# target_func: 'PiranhaFirePos'
+
+#
+# - name: Projectile_PirahnaB
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A33300
+# target_func: 'PiranhaFireType'
+
+
+# - name: Projectile_Lakitu
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AB7A28
+# target_func: 'LakituBomb'
+# li r3, 0x85 to switch to bobomb
+
+# - name: PipeGenerator
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80ABB76C
+# target_func: 'PipeGeneratorSpawn'
+
+
+# 809EA268 - Broozer physics struct
+# 80ABB6E0 - Pipe Generator
+
+#80AB7910 \ No newline at end of file
diff --git a/kamek_pal.x b/kamek_pal.x
index ed71ded..ddf407c 100644
--- a/kamek_pal.x
+++ b/kamek_pal.x
@@ -5,6 +5,15 @@ OUTPUT_FORMAT ("binary")
}*/
SECTIONS {
+ GetSpecificPlayerActor = 0x8005F900;
+ TimeStopFlag = 0x80429FDA;
+ TimerBranch = 0x800E3AB8;
+ MarioDescentRate = 0x8042BB44;
+ MarioJumpArc = 0x802F591C;
+ MarioJumpMax = 0x8042BB28;
+ MiniMarioJumpArc = 0x802F5964;
+ MarioSize = 0x8042BB54;
+
_savefpr_14 = 0x802DCF98;
_savefpr_15 = 0x802DCF9C;
_savefpr_16 = 0x802DCFA0;
diff --git a/levelspecial.yaml b/levelspecial.yaml
new file mode 100644
index 0000000..cc8d33a
--- /dev/null
+++ b/levelspecial.yaml
@@ -0,0 +1,25 @@
+---
+# Replaces TAG_THUNDER
+
+source_files: [../src/levelspecial.cpp]
+hooks:
+ - name: LevelSpecial_Create
+ type: add_func_pointer
+ src_addr_pal: 0x8097CD3C
+ target_func: 'LevelSpecial_Create(LevelSpecial *)'
+
+ - name: LevelSpecial_Execute
+ type: add_func_pointer
+ src_addr_pal: 0x8097CD54
+ target_func: 'LevelSpecial_Execute(LevelSpecial *)'
+
+ - name: ResetAfterLevel
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x809259E0
+ target_func: 'ResetAfterLevel(void)'
+
+ - name: LevelSpecial_MemFix
+ type: patch
+ addr_pal: 0x808AC778
+ data: '38600400'
diff --git a/spritetex.yaml b/spritetex.yaml
index feeec7c..6f2a177 100644
--- a/spritetex.yaml
+++ b/spritetex.yaml
@@ -70,6 +70,13 @@ hooks:
target_func: 'TEX_Buzzy'
+ - name: TEX_BuzzyShell
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A67540
+ target_func: 'TEX_BuzzyShell'
+
+
- name: TEX_SpikeTop
type: branch_insn
branch_type: bl
@@ -77,11 +84,18 @@ hooks:
target_func: 'TEX_SpikeTop'
+ - name: TEX_SpinyShell
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x8003DBF8
+ target_func: 'TEX_SpinyShell'
+
+
- name: TEX_Spiny
type: branch_insn
branch_type: bl
- src_addr_pal: 0x80038208
- target_func: 'TEX_Spiny'
+ src_addr_pal: 0x8003DD0C
+ target_func: 'TEX_Spiny'
- name: TEX_SpringBlock
@@ -105,13 +119,27 @@ hooks:
target_func: 'TEX_Koopa'
+ - name: TEX_KoopaShell
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A72644
+ target_func: 'TEX_Koopa'
+
+
- name: TEX_Gabon
type: branch_insn
branch_type: bl
- src_addr_pal: 0x80A00284
+ src_addr_pal: 0x80A00290
target_func: 'TEX_Gabon'
+ - name: TEX_GabonRock
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x807F8CC8
+ target_func: 'TEX_GabonRock'
+
+
- name: TEX_Podoboo
type: branch_insn
branch_type: bl
@@ -122,15 +150,15 @@ hooks:
- name: TEX_Switch
type: branch_insn
branch_type: bl
- src_addr_pal: 0x80A19EC8
+ src_addr_pal: 0x80A19ED4
target_func: 'TEX_Switch'
- - name: TEX_WiggleShroom
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x800BC9D8
- target_func: 'TEX_WiggleShroom'
+# - name: TEX_WiggleShroom
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x800BC9D8
+# target_func: 'TEX_WiggleShroom'
- name: TEX_Bramball
@@ -164,7 +192,7 @@ hooks:
- name: TEX_Parabeetle
type: branch_insn
branch_type: bl
- src_addr_pal: 0x80A83254
+ src_addr_pal: 0x80A83260
target_func: 'TEX_Parabeetle'
@@ -175,6 +203,13 @@ hooks:
target_func: 'TEX_Bomb'
+ - name: TEX_ParaBomb
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A7EEF8
+ target_func: 'TEX_ParaBomb'
+
+
# - name: TEX_CheepA
# type: branch_insn
# branch_type: bl
@@ -224,11 +259,11 @@ hooks:
# target_func: 'TEX_Goal'
- - name: TEX_StretchMush
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x8084AD10
- target_func: 'TEX_StretchMush'
+# - name: TEX_StretchMush
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x8084AD10
+# target_func: 'TEX_StretchMush'
- name: TEX_BlockSlide
@@ -252,17 +287,17 @@ hooks:
# target_func: 'TEX_Platforms'
- - name: TEX_PokeyA
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80AA1DB0
- target_func: 'TEX_PokeyA'
+# - name: TEX_PokeyA
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AA1DB0
+# target_func: 'TEX_PokeyA'
- - name: TEX_PokeyB
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A9F834
- target_func: 'TEX_PokeyB'
+# - name: TEX_PokeyB
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A9F834
+# target_func: 'TEX_PokeyB'
diff --git a/src/growup.s b/src/growup.s
new file mode 100644
index 0000000..903b766
--- /dev/null
+++ b/src/growup.s
@@ -0,0 +1,536 @@
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f1,1; .set f2,2
+.set f3,3; .set f4,4; .set f5,5; .set f8,8;
+#endif
+
+
+.text
+
+.extern OSReport
+
+
+.align 4
+
+
+.global ModifyGlobalSizes
+ModifyGlobalSizes:
+
+# lhz r10, 8(r3)
+# cmpwi r10, 60
+# beq dontDoAnything
+
+ # we can trash r10 for now, it's not supposed to be guaranteed anyway
+ lwz r10, 4(r3) # get the sprite settings
+ srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
+ andi. r10, r10, 0xF
+
+ # first off, get the value from the lookup table
+ lis r11, LookupTable@h
+ ori r11, r11, LookupTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f5, r11, r10 # get it from the array
+
+ # Modify the actor
+ lwz r4, 0x47C(r3)
+
+ lfs f0, 0xDC(r4)
+ fmuls f0, f0, f5
+ stfs f0, 0xDC(r3)
+ stfs f0, 0x464(r4)
+
+ lfs f0, 0xE0(r4)
+ fmuls f0, f0, f5
+ stfs f0, 0xE0(r3)
+ stfs f0, 0x468(r4)
+
+ lfs f0, 0xE4(r4)
+ fmuls f0, f0, f5
+ stfs f0, 0xE4(r3)
+ stfs f0, 0x46C(r4)
+
+ # Modify the initial actor speeds
+# lfs f0, 0xD0(r3)
+# fmuls f0, f0, f5
+# stfs f0, 0xD0(r3)
+#
+# lfs f0, 0xE8(r3)
+# fmuls f0, f0, f5
+# stfs f0, 0xE8(r3)
+#
+# lfs f0, 0xC4(r3)
+# fmuls f0, f0, f5
+# stfs f0, 0xC4(r3)
+#
+# lfs f0, 0x110(r3)
+# fmuls f0, f0, f5
+# stfs f0, 0x110(r3)
+#
+# lfs f0, 0xF4(r3)
+# fmuls f0, f0, f5
+# stfs f0, 0xF4(r3)
+#
+# lfs f0, 0x11C(r3)
+# fmuls f0, f0, f5
+# stfs f0, 0x11C(r3)
+#
+# lfs f0, 0x108(r3)
+# fmuls f0, f0, f5
+# stfs f0, 0x108(r3)
+
+ blr
+
+
+
+
+#dontDoAnything:
+# blr
+
+
+
+.global ModifyCollision
+ModifyCollision:
+
+ # we can trash r10 for now, it's not supposed to be guaranteed anyway
+ lwz r10, 4(r4) # get the sprite settings
+ srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
+ andi. r10, r10, 0xF
+
+ # first off, get the value from the lookup table
+ lis r11, LookupTable@h
+ ori r11, r11, LookupTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f8, r11, r10 # get it from the array
+
+ #This is the old ActivePhysics_InitWithStruct function.
+ stw r4, 4(r3)
+ li r0, 0
+
+ # x_dist_to_center
+ lfs f0, 0(r5) #Load it
+# fmuls f0, f0, f8 #Multiply it by the setting
+ stfs f0, 0x1C(r3) #Store it
+
+ # y_dist_to_center Time to do all the other ones
+ lfs f0, 4(r5)
+ fmuls f0, f0, f8
+ stfs f0, 0x20(r3)
+
+ # x_dist_to_edge
+ lfs f0, 8(r5)
+ fmuls f0, f0, f8
+ stfs f0, 0x24(r3)
+
+ # y_dist_to_edge
+ lfs f0, 0xC(r5)
+ fmuls f0, f0, f8
+ stfs f0, 0x28(r3)
+
+ # Rest of the function
+ lbz r4, 0x10(r5)
+ stb r4, 0x2C(r3)
+ lbz r4, 0x11(r5)
+ stb r4, 0x2D(r3)
+ lwz r4, 0x14(r5)
+ stw r4, 0x30(r3)
+ lwz r4, 0x18(r5)
+ stw r4, 0x34(r3)
+ lhz r4, 0x1C(r5)
+ sth r4, 0x38(r3)
+ lwz r4, 0x20(r5)
+ stw r4, 0x3C(r3)
+ stb r0, 0xA1(r3)
+
+ blr # Off we go!
+
+
+.global ModifyStandOnTopInitA
+ModifyStandOnTopInitA:
+
+ # we can trash r10 for now, it's not supposed to be guaranteed anyway
+ lwz r10, 4(r4) # get the sprite settings
+ srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
+ andi. r10, r10, 0xF
+
+ # first off, get the value from the lookup table
+ lis r11, LookupTable@h
+ ori r11, r11, LookupTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f8, r11, r10 # get it from the array
+
+ fmuls f1, f1, f8
+ fmuls f2, f2, f8
+ fmuls f3, f3, f8
+ fmuls f4, f4, f8
+ fmuls f5, f5, f8
+
+ #This is the old function.
+ stfs f1, 0x4C(r3)
+ stfs f2, 0x50(r3)
+ stfs f3, 0x54(r3)
+ stfs f4, 0x58(r3)
+ stfs f5, 0x5C(r3)
+
+ blr # Off we go!
+
+
+.global ModifyStandOnTopInitB
+ModifyStandOnTopInitB:
+
+ # we can trash r10 for now, it's not supposed to be guaranteed anyway
+ lwz r10, 4(r4) # get the sprite settings
+ srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
+ andi. r10, r10, 0xF
+
+ # first off, get the value from the lookup table
+ lis r11, LookupTable@h
+ ori r11, r11, LookupTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f8, r11, r10 # get it from the array
+
+ fmuls f1, f1, f8
+ fmuls f2, f2, f8
+ fmuls f3, f3, f8
+ fmuls f4, f4, f8
+ fmuls f5, f5, f8
+
+
+ #This is the old function. I optimized it a tad. A big tad.
+ lfs f0, 0(r7)
+ fmuls f1, f1, f0
+ fmuls f4, f4, f0
+ fmuls f5, f5, f0
+
+ lfs f0, 4(r7)
+ fmuls f2, f2, f0
+ fmuls f3, f3, f0
+
+
+ stfs f1, 0x4C(r3)
+ stfs f2, 0x50(r3)
+ stfs f3, 0x54(r3)
+ stfs f4, 0x58(r3)
+ stfs f5, 0x5C(r3)
+
+ blr # Off we go!
+
+
+
+.global ModifyStandOnTopInitC
+ModifyStandOnTopInitC:
+
+ fmr f5, f3
+ fmr f4, f2
+ fmr f3, f1
+ lfs f1, 0(r5)
+ lfs f2, 4(r5)
+
+ b ModifyStandOnTopInitA
+
+
+.global ModifyStandOnTopInitD
+ModifyStandOnTopInitD:
+
+
+ # we can trash r10 for now, it's not supposed to be guaranteed anyway
+ lwz r10, 4(r4) # get the sprite settings
+ srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
+ andi. r10, r10, 0xF
+
+ # first off, get the value from the lookup table
+ lis r11, LookupTable@h
+ ori r11, r11, LookupTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f8, r11, r10 # get it from the array
+
+ fmr f5, f3
+ fmr f4, f2
+ fmr f3, f1
+ lfs f1, 0(r5)
+ lfs f2, 4(r5)
+
+ fmuls f1, f1, f8
+ fmuls f2, f2, f8
+ fmuls f3, f3, f8
+ fmuls f4, f4, f8
+ fmuls f5, f5, f8
+
+ lfs f0, 0(r8)
+ fmuls f1, f1, f0
+ fmuls f4, f4, f0
+ fmuls f5, f5, f0
+
+ lfs f0, 4(r8)
+ fmuls f2, f2, f0
+ fmuls f3, f3, f0
+
+ stfs f1, 0x4C(r3)
+ stfs f2, 0x50(r3)
+ stfs f3, 0x54(r3)
+ stfs f4, 0x58(r3)
+ stfs f5, 0x5C(r3)
+
+ blr # Off we go!
+
+
+
+.global ModifyRiderInitA
+ModifyRiderInitA:
+
+ # we can trash r10 for now, it's not supposed to be guaranteed anyway
+ lwz r10, 4(r4) # get the sprite settings
+ srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
+ andi. r10, r10, 0xF
+
+ # first off, get the value from the lookup table
+ lis r11, RiderLookupTable@h
+ ori r11, r11, RiderLookupTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f8, r11, r10 # get it from the array
+
+ lfs f0, 0(r4)
+ fmuls f0, f0, f8
+ stfs f0, 0x4C(r3)
+
+ lfs f0, 4(r4)
+ fmuls f0, f0, f8
+ stfs f0, 0x50(r3)
+
+ lfs f0, 0(r5)
+ fmuls f0, f0, f8
+ stfs f0, 0x54(r3)
+
+ lfs f0, 4(r5)
+ fmuls f0, f0, f8
+ stfs f0, 0x58(r3)
+
+ blr # Off we go!
+
+
+.global ModifyRiderInitB
+ModifyRiderInitB:
+
+ # we can trash r10 for now, it's not supposed to be guaranteed anyway
+ lwz r10, 4(r4) # get the sprite settings
+ srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
+ andi. r10, r10, 0xF
+
+ # first off, get the value from the lookup table
+ lis r11, RiderLookupTable@h
+ ori r11, r11, RiderLookupTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f8, r11, r10 # get it from the array
+
+ lfs f0, 0(r5)
+ fmuls f0, f0, f8
+ stfs f0, 0x4C(r3)
+
+ lfs f0, 4(r5)
+ fmuls f0, f0, f8
+ stfs f0, 0x50(r3)
+
+ lfs f0, 0(r4)
+ fmuls f0, f0, f8
+ stfs f0, 0x54(r3)
+
+ lfs f0, 4(r4)
+ fmuls f0, f0, f8
+ stfs f0, 0x58(r3)
+
+ blr # Off we go!
+
+
+
+.global ModifyRiderInitC
+ModifyRiderInitC:
+
+ # we can trash r10 for now, it's not supposed to be guaranteed anyway
+ lwz r10, 4(r4) # get the sprite settings
+ srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
+ andi. r10, r10, 0xF
+
+ # first off, get the value from the lookup table
+ lis r11, RiderLookupTable@h
+ ori r11, r11, RiderLookupTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f8, r11, r10 # get it from the array
+
+ fmuls f1, f1, f8
+ fmuls f2, f2, f8
+ fmuls f3, f3, f8
+ fmuls f4, f4, f8
+
+ stfs f1, 0x4C(r3)
+ stfs f2, 0x50(r3)
+ stfs f3, 0x54(r3)
+ stfs f4, 0x58(r3)
+
+ blr # Off we go!
+
+
+.global ModifyRiderInitD
+ModifyRiderInitD:
+
+ # we can trash r10 for now, it's not supposed to be guaranteed anyway
+ lwz r10, 4(r4) # get the sprite settings
+ srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
+ andi. r10, r10, 0xF
+
+ # first off, get the value from the lookup table
+ lis r11, RiderLookupTable@h
+ ori r11, r11, RiderLookupTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f8, r11, r10 # get it from the array
+
+ fmuls f1, f1, f8
+ fmuls f2, f2, f8
+ fmuls f3, f3, f8
+ fmuls f4, f4, f8
+
+ stfs f3, 0x4C(r3)
+ stfs f4, 0x50(r3)
+ stfs f1, 0x54(r3)
+ stfs f2, 0x58(r3)
+
+ blr # Off we go!
+
+
+
+.global InheritSettings_A
+InheritSettings_A:
+
+ li r4, 0
+ blr
+
+ lwz r4, 4(r0)
+
+ li r10, 0
+ stw r10, 8(r4)
+
+ blr
+
+
+.global InheritSettings_B
+InheritSettings_B:
+
+ li r4, 0
+ blr
+
+ or r4, r31, r0
+ lwz r10, 4(r28)
+ or r4, r10, r4
+
+ blr
+
+
+.global InheritSettings_C
+InheritSettings_C:
+
+ li r4, 0
+ blr
+
+ or r4, r8, r18
+ lwz r10, 4(r27)
+ or r4, r10, r4
+
+ blr
+
+
+.global InheritSettings_D
+InheritSettings_D:
+
+ li r4, 0
+ blr
+
+ lwz r4, 4(r3)
+ li r10, 0
+ stw r10, 8(r4)
+ mr r11, r4
+
+ blr
+
+.global InheritSettings_E
+InheritSettings_E:
+
+ li r4, 0
+ blr
+
+ mr r4, r11
+
+ blr
+
+
+
+
+
+
+
+
+
+
+
+
+.global PiranhaFireType
+PiranhaFireType:
+
+ li r3, 0x76
+ blr
+
+
+.global PiranhaFirePos
+PiranhaFirePos:
+ lis r11, PiranhaPosF@h
+ ori r11, r11, PiranhaPosF@l
+ lfs f8, 0(r11)
+
+ fadds f1, f1, f8
+ fadds f2, f2, f8
+ fadds f0, f0, f8
+
+ stfs f0, 0x8(r1)
+ stfs f1, 0xC(r1)
+ stfs f2, 0x10(r1)
+
+ blr
+
+
+
+.global PipeGeneratorSpawn
+PipeGeneratorSpawn:
+
+ li r3, 0x87
+ li r4, 0
+ blr
+
+.global LakituBomb
+LakituBomb:
+
+ li r3, 0x85
+ li r4, 0x3000
+ slwi r4, r4, 16
+ blr
+
+
+
+
+
+.data
+LookupTable:
+ .float 1, 1, 1, 1, 0.25, 0.5, 0.75, 1.25, 1.5, 2, 2.5, 3, 4, 5, 8, 10
+
+RiderLookupTable:
+ .float 1, 1, 1, 1, 0.6, 0.7, 0.85, 1, 1, 1.1, 1.25, 1.5, 2, 2.5, 4, 5
+
+PiranhaPosF:
+ .float 4.0
+
+
+Stupid: .string "Fucking Sprite was enlarged by %f times\n"
+.align 4
+
+
diff --git a/src/levelspecial.cpp b/src/levelspecial.cpp
new file mode 100644
index 0000000..245dc87
--- /dev/null
+++ b/src/levelspecial.cpp
@@ -0,0 +1,185 @@
+#include <common.h>
+#include <game.h>
+
+struct LevelSpecial {
+ 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
+ u8 _B8[0x318]; // 0xB8
+ // Any variables you add to the class go here; starting at offset 0x3D0
+ u64 eventFlag; // 0x3D0
+ u8 type; // 0x3D4
+ u8 effect; // 0x3D5
+ u8 lastEvState; // 0x3D6
+ u8 func; // 0x3D7
+};
+
+struct EventTable_t {
+ u64 events;
+ // ...
+};
+
+extern EventTable_t *EventTable;
+
+extern u16 TimeStopFlag;
+extern u32 TimerBranch;
+
+extern float MarioDescentRate;
+extern float MarioJumpMax;
+extern float MarioJumpArc;
+extern float MiniMarioJumpArc;
+extern float MarioSize;
+
+
+extern "C" void GetSpecificPlayerActor(int number);
+void LevelSpecial_Update(LevelSpecial *self);
+bool ResetAfterLevel();
+
+#define ACTIVATE 1
+#define DEACTIVATE 0
+
+fBase_c *FindActorByID(u32 id);
+
+
+
+bool ResetAfterLevel(void) {
+ TimeStopFlag = 0;
+ TimerBranch = 0x3403FFA4;
+ MarioDescentRate = -4;
+ MarioJumpMax = 3.628;
+ MarioJumpArc = 2.5;
+ MiniMarioJumpArc = 2.5;
+ MarioSize = 1.0;
+ return true;
+}
+
+bool LevelSpecial_Create(LevelSpecial *self) {
+ char eventNum = (self->settings >> 24) & 0xFF;
+ self->eventFlag = (u64)1 << (eventNum - 1);
+
+ OSReport("Special Event created @%p event %d\n", self, eventNum);
+
+ OSReport("Eventnum: %d. Event flag: %08x %08x\n", eventNum, self->eventFlag >> 32, self->eventFlag & 0xFFFFFFFF);
+
+ self->type = (self->settings) & 15;
+ self->effect = (self->settings >> 4) & 15;
+
+ self->lastEvState = 0xFF;
+
+ LevelSpecial_Update(self);
+
+ return true;
+}
+
+bool LevelSpecial_Execute(LevelSpecial *self) {
+ LevelSpecial_Update(self);
+ return true;
+}
+
+
+void LevelSpecial_Update(LevelSpecial *self) {
+ //OSReport("%08x%08x", EventTable->events >> 32, EventTable->events & 0xFFFFFFFF);
+
+ u8 newEvState = 0;
+ if (EventTable->events & self->eventFlag)
+ newEvState = 1;
+
+ if (newEvState == self->lastEvState)
+ return;
+
+ OSReport("Event state changed from %d to %d\n", self->lastEvState, newEvState);
+
+ u8 offState;
+ if (newEvState == ACTIVATE)
+ {
+ offState = (newEvState == 1) ? 1 : 0;
+ OSReport("Activate Special Event!", offState);
+
+ switch (self->type) {
+ case 1: // Time Freeze
+ TimeStopFlag = self->effect * 0x100;
+ break;
+
+ case 2: // Stop Timer
+ TimerBranch = 0x7C601B78;
+ break;
+
+
+ case 3: // Mario Gravity
+ if (self->effect == 0)
+ { //Low grav
+ MarioDescentRate = -2;
+ MarioJumpArc = 0.5;
+ MiniMarioJumpArc = 0.5;
+ MarioJumpMax = 4.5;
+ }
+ else
+ { //Anti-grav
+ MarioDescentRate = 0.5;
+ MarioJumpArc = 4.0;
+ MiniMarioJumpArc = 4.0;
+ MarioJumpMax = 0.0;
+ }
+ break;
+
+ case 4: // Mario Size
+ if (self->effect == 0) //Super Size
+ MarioSize = 4.0;
+ else //Half-Pint
+ MarioSize = 0.25;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ else
+ {
+ offState = (newEvState == 1) ? 0 : 1;
+ OSReport("Deactivate Special Event", offState);
+
+ switch (self->type) {
+ case 1: // Time Freeze
+ TimeStopFlag = 0;
+ break;
+
+ case 2: // Stop Timer
+ TimerBranch = 0x3403FFA4;
+ break;
+
+
+ case 3: // Mario Gravity
+ MarioDescentRate = -4;
+ MarioJumpArc = 2.5;
+ MiniMarioJumpArc = 2.5;
+ MarioJumpMax = 3.628;
+ break;
+
+ case 4: // Mario Size
+ MarioSize = 1.0;
+ break;
+
+ default:
+ break;
+ }
+ }
+ OSReport("Special Event is %d\n", offState);
+
+
+
+
+ OSReport("Success!\n");
+
+
+ self->lastEvState = newEvState;
+}
+
+
+
+
diff --git a/src/spritetex.S b/src/spritetex.S
index 504cf5f..7464820 100644
--- a/src/spritetex.S
+++ b/src/spritetex.S
@@ -121,6 +121,13 @@ TEX_Buzzy:
andi. r5, r5, 0xF
b GetTexFilenameForR5
+.global TEX_BuzzyShell
+TEX_BuzzyShell:
+ lwz r5, 4(r3)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
.global TEX_SpikeTop
TEX_SpikeTop:
@@ -132,7 +139,15 @@ TEX_SpikeTop:
.global TEX_Spiny
TEX_Spiny:
- lwz r5, 4(r27)
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_SpinyShell
+TEX_SpinyShell:
+ lwz r5, 4(r3)
srwi r5, r5, 24
andi. r5, r5, 0xF
b GetTexFilenameForR5
@@ -156,14 +171,9 @@ TEX_Coaster:
.global TEX_Koopa
TEX_Koopa:
-<<<<<<< HEAD
lwz r5, 4(r29)
srwi r5, r5, 24
andi. r5, r5, 0xF
-=======
- lwz r5, 4(r30)
- andi. r5, r5, 0xF
->>>>>>> 6e93a3612c2d4ce6e11ab53d2490eb30c0e262bf
b GetTexFilenameForR5
@@ -175,6 +185,14 @@ TEX_Gabon:
b GetTexFilenameForR5
+.global TEX_GabonRock
+TEX_GabonRock:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
.global TEX_Podoboo
TEX_Podoboo:
lwz r5, 4(r31)
@@ -193,8 +211,19 @@ TEX_Switch:
.global TEX_WiggleShroom
TEX_WiggleShroom:
- lwz r5, 4(r30)
- # This could be r29, or r28
+ lwz r5, -0x520(r3)
+ # This sprite is pretty complex
+ # The register with THIS is r29
+ # before the loading function,
+ # it passes it into r3, and then mr's
+ # it into r30. r3 is then overwritten.
+ # Then, it puts r31 into r5, r30 partly
+ # into r3 and partly into r4. Why?
+ # So, the possibilities for THIS are
+ # r30, r3, and r4, no? In the next function,
+ # r30 is stored over before our getFile, as
+ # are r29/r28.
+
srwi r5, r5, 24
andi. r5, r5, 0xF
b GetTexFilenameForR5
@@ -246,6 +275,14 @@ TEX_Bomb:
srwi r5, r5, 24
andi. r5, r5, 0xF
b GetTexFilenameForR5
+
+
+.global TEX_ParaBomb
+TEX_ParaBomb:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
.global TEX_CheepA
@@ -292,11 +329,7 @@ TEX_Boo:
TEX_Midway:
lwz r5, 4(r29)
srwi r5, r5, 24
-<<<<<<< HEAD
andi. r5, r5, 0xFF
-=======
- andi. r5, r5, 0xF
->>>>>>> 6e93a3612c2d4ce6e11ab53d2490eb30c0e262bf
b GetTexFilenameForR5