From 5a419da6d4b948375b4e9ff1c5175460128840f4 Mon Sep 17 00:00:00 2001 From: Treeki Date: Mon, 16 May 2011 21:49:58 +0200 Subject: Tempus's updates --- NewerProject.yaml | 3 +- growup.yaml | 230 ++++++++++++++++++++++ kamek_pal.x | 9 + levelspecial.yaml | 25 +++ spritetex.yaml | 85 +++++--- src/growup.s | 536 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/levelspecial.cpp | 185 ++++++++++++++++++ src/spritetex.S | 57 ++++-- 8 files changed, 1092 insertions(+), 38 deletions(-) create mode 100644 growup.yaml create mode 100644 levelspecial.yaml create mode 100644 src/growup.s create mode 100644 src/levelspecial.cpp 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 +#include + +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 -- cgit v1.2.3