From 7c5d2a4dd2a81282c38a6bbddacb3fe9c12808c4 Mon Sep 17 00:00:00 2001
From: Colin Noga <Tempus@Spectrum-Song.local>
Date: Mon, 16 May 2011 12:22:38 -0500
Subject: Pushed last mostly stable Tempus hacks

---
 NewerProject.yaml    |   3 +-
 growup.yaml          | 230 ++++++++++++++++++++++
 kamek_pal.x          |   9 +
 levelspecial.yaml    |  25 +++
 spritetex.yaml       |  64 +++---
 src/growup.s         | 536 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/levelspecial.cpp | 185 ++++++++++++++++++
 src/spritetex.S      |  40 ++--
 8 files changed, 1044 insertions(+), 48 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 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
-- 
cgit v1.2.3