diff options
| author | Colin Noga <Tempus@Spectrum-Song.local> | 2011-05-16 12:22:38 -0500 | 
|---|---|---|
| committer | Colin Noga <Tempus@Spectrum-Song.local> | 2011-05-16 12:22:38 -0500 | 
| commit | 7c5d2a4dd2a81282c38a6bbddacb3fe9c12808c4 (patch) | |
| tree | 401107f34008631843067609eb8ff6c0a2096db7 | |
| parent | 80688e9e682a1fb354160f729d4caff394831e9e (diff) | |
| download | kamek-7c5d2a4dd2a81282c38a6bbddacb3fe9c12808c4.tar.gz kamek-7c5d2a4dd2a81282c38a6bbddacb3fe9c12808c4.zip | |
Pushed last mostly stable Tempus hacks
| -rw-r--r-- | NewerProject.yaml | 3 | ||||
| -rw-r--r-- | growup.yaml | 230 | ||||
| -rw-r--r-- | kamek_pal.x | 9 | ||||
| -rw-r--r-- | levelspecial.yaml | 25 | ||||
| -rw-r--r-- | spritetex.yaml | 64 | ||||
| -rw-r--r-- | src/growup.s | 536 | ||||
| -rw-r--r-- | src/levelspecial.cpp | 185 | ||||
| -rw-r--r-- | src/spritetex.S | 40 | 
8 files changed, 1044 insertions, 48 deletions
| diff --git a/NewerProject.yaml b/NewerProject.yaml index 20a7d9a..1983c88 100644 --- a/NewerProject.yaml +++ b/NewerProject.yaml @@ -15,4 +15,5 @@ modules:    - processed/tilesetfixer.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 34bbba8..e543336 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 0981298..6f2a177 100644 --- a/spritetex.yaml +++ b/spritetex.yaml @@ -84,11 +84,11 @@ hooks:      target_func: 'TEX_SpikeTop'
 -#  - name: TEX_SpinyShell
 -#    type: branch_insn
 -#    branch_type: bl
 -#    src_addr_pal: 0x8003DBF8
 -#    target_func: 'TEX_SpinyShell'
 +  - name: TEX_SpinyShell
 +    type: branch_insn
 +    branch_type: bl
 +    src_addr_pal: 0x8003DBF8
 +    target_func: 'TEX_SpinyShell'
    - name: TEX_Spiny
 @@ -133,6 +133,13 @@ hooks:      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
 @@ -147,11 +154,11 @@ hooks:      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
 @@ -196,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
 @@ -245,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
 @@ -273,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 920036c..7464820 100644 --- a/src/spritetex.S +++ b/src/spritetex.S @@ -185,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)
 @@ -203,7 +211,7 @@ TEX_Switch:  .global TEX_WiggleShroom
  TEX_WiggleShroom:
 -	lwz r5, 4(r4)
 +	lwz r5, -0x520(r3)
  	# This sprite is pretty complex  	# The register with THIS is r29  	# before the loading function, @@ -220,26 +228,6 @@ TEX_WiggleShroom:  	andi. r5, r5, 0xF
  	b GetTexFilenameForR5
 -	lwz r5, 4(r3)
 -	srwi r5, r5, 24
 -	andi. r5, r5, 0xF
 -	b GetTexFilenameForR5
 - -	lwz r5, 4(r29)
 -	srwi r5, r5, 24
 -	andi. r5, r5, 0xF
 -	b GetTexFilenameForR5
 - -	lwz r5, 4(r30)
 -	srwi r5, r5, 24
 -	andi. r5, r5, 0xF
 -	b GetTexFilenameForR5
 - -	lwz r5, 4(r31)
 -	srwi r5, r5, 24
 -	andi. r5, r5, 0xF
 -	b GetTexFilenameForR5
 -  .global TEX_Bramball
  TEX_Bramball:
 @@ -287,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
 @@ -347,7 +343,7 @@ TEX_Goal:  .global TEX_StretchMush
  TEX_StretchMush:
 -	lwz r5, 4(r27)
 +	lwz r5, 4(r30)
  	srwi r5, r5, 24
  	andi. r5, r5, 0xF  	b GetTexFilenameForR5
 | 
