From 10fa535e98f3e1043b04895aaab2e916549fcf69 Mon Sep 17 00:00:00 2001
From: Colin Noga <Tempus@chronometry.ca>
Date: Sun, 24 Jun 2012 19:34:56 -0500
Subject: Lots of bug fixes, bowser improvements, summer sun hacks, JPN
 support, etc.

---
 NewerProject.yaml         |    1 +
 NewerProjectKP.yaml       |    1 +
 SummerSun.yaml            |    1 -
 bugfixes.yaml             |   30 +-
 growup.yaml               |   30 +-
 kamek_configs.yaml        |   10 +
 kamek_jpn.x               | 1523 +++++++++++++++++++++++++++++++++++++++++++++
 makeSummerSun             |    8 +
 poweruphax.yaml           |   21 +-
 singAlong.yaml            |   39 ++
 spritetex.yaml            |   30 +-
 src/bonusRoom.cpp         |  708 +++++++++++++++++++++
 src/bossCaptainBowser.cpp |    4 +-
 src/fix38.S               |    4 +
 src/growup.s              |   96 +++
 src/poweruphax.cpp        |   21 +
 src/shyguy.cpp            |    7 +-
 src/spritetex.S           |   54 ++
 src/summermodel.cpp       |   69 +-
 summerhax.yaml            |  192 +++++-
 tools/mapfile_tool.py     |    6 +-
 21 files changed, 2818 insertions(+), 37 deletions(-)
 create mode 100644 kamek_jpn.x
 create mode 100644 singAlong.yaml
 create mode 100644 src/bonusRoom.cpp
 create mode 100644 src/poweruphax.cpp

diff --git a/NewerProject.yaml b/NewerProject.yaml
index c308818..f514baf 100644
--- a/NewerProject.yaml
+++ b/NewerProject.yaml
@@ -50,5 +50,6 @@ modules:
   - processed/electricLine.yaml
   - processed/makeYourOwn.yaml
   - processed/challengeStar.yaml
+  - processed/singAlong.yaml
   # - processed/pengi.yaml
 #  - processed/actorlog.yaml
diff --git a/NewerProjectKP.yaml b/NewerProjectKP.yaml
index d7d4343..ced24a8 100644
--- a/NewerProjectKP.yaml
+++ b/NewerProjectKP.yaml
@@ -49,5 +49,6 @@ modules:
   - processed/electricLine.yaml
   - processed/makeYourOwn.yaml
   - processed/challengeStar.yaml
+  - processed/singAlong.yaml
   # - processed/pengi.yaml
 #  - processed/actorlog.yaml
diff --git a/SummerSun.yaml b/SummerSun.yaml
index 078243c..e58fb93 100644
--- a/SummerSun.yaml
+++ b/SummerSun.yaml
@@ -3,4 +3,3 @@ code_address: 0x808D9000
 modules:
   - processed/prolog.yaml
   - processed/summerhax.yaml
-  - processed/bugfixes.yaml
diff --git a/bugfixes.yaml b/bugfixes.yaml
index 8d17f79..1504dcd 100644
--- a/bugfixes.yaml
+++ b/bugfixes.yaml
@@ -90,9 +90,33 @@ hooks:
     addr_pal: 0x8001F93C
     data: '48000014'
 
-  - name: RockyWrenchFix
+  - name: StarsDontKillSpikesUD
     type: patch
-    addr_pal: 0x808A9448
-    data: '60000000'
+    addr_pal: 0x80AFF4D8
+    data: '809A5490'
 
+  - name: StarsDontKillSpikesD
+    type: patch
+    addr_pal: 0x80AFF784
+    data: '809A5490'
+
+  - name: StarsDontKillSpikesU
+    type: patch
+    addr_pal: 0x80AFFA30
+    data: '809A5490'
+
+  - name: StarsDontKillSpikesLR
+    type: patch
+    addr_pal: 0x80AFFCDC
+    data: '809A5490'
+
+  - name: StarsDontKillSpikesR
+    type: patch
+    addr_pal: 0x80AFFF88
+    data: '809A5490'
+
+  - name: StarsDontKillSpikesL
+    type: patch
+    addr_pal: 0x80B00234
+    data: '809A5490'
 
diff --git a/growup.yaml b/growup.yaml
index 0fe73ed..5e8b54e 100644
--- a/growup.yaml
+++ b/growup.yaml
@@ -42,6 +42,22 @@ hooks:
     target_func: 'ModifySpeedUpdatesB'
 
 
+# Prevent large enemies from being fireballed, unless they subclass the fireball state
+
+  - name: TooBigToBurn
+    type: branch_insn
+    branch_type: bl
+    src_addr_pal: 0x800A08F0
+    target_func: 'TooBigToBurn'
+
+  - name: TooBigToFreeze
+    type: branch_insn
+    branch_type: bl
+    src_addr_pal: 0x800A0A50
+    target_func: 'TooBigToFreeze'
+
+
+
 # Loading Patches
 
 #  - name: Global_SizeLoader_X
@@ -286,12 +302,16 @@ hooks:
     target_func: 'GabonRockZOrderDeathDrop'
 
 
+  - name: BigBooZOrderHack
+    type: patch
+    addr_pal: 0x8042C6BC
+    data: "45ABE000"
 
-#  - name: BooZOrderHack
-#    type: branch_insn
-#    branch_type: bl
-#    src_addr_pal: 0x80AAEA90 
-#    target_func: 'BooZOrderHack'
+  - name: BooZOrderHack
+    type: branch_insn
+    branch_type: bl
+    src_addr_pal: 0x80AAEAAC 
+    target_func: 'BooZOrderHack'
 
 
 #
diff --git a/kamek_configs.yaml b/kamek_configs.yaml
index a65f321..94bbccc 100644
--- a/kamek_configs.yaml
+++ b/kamek_configs.yaml
@@ -26,6 +26,15 @@
   rel_area_start: 0x807684C0
   rel_area_end: 0x80B8E33C
 
+- friendly_name: "New Super Mario Bros. JPN v1"
+  short_name: 'jpn'
+  defines: [REGION_JPN, VERSION_1]
+  include_dirs: ['include', 'src']
+  dynamic_link: true
+  linker_script: kamek_jpn.x
+  rel_area_start: 0x807684C0
+  rel_area_end: 0x80B8E33C
+
 #- friendly_name: "New Super Mario Bros. PAL v2"
 #  short_name: 'pal2'
 #  defines: [REGION_PAL, VERSION_2]
@@ -33,3 +42,4 @@
 #  linker_script: kamek_pal2.x
 #  rel_area_start: 0x807684C0
 #  rel_area_end: 0x80B75CA8
+
diff --git a/kamek_jpn.x b/kamek_jpn.x
new file mode 100644
index 0000000..48deb24
--- /dev/null
+++ b/kamek_jpn.x
@@ -0,0 +1,1523 @@
+SECTIONS {
+
+/* Scrolling is annoying, clown car goes here! */
+
+	__ct__20daJrClownForPlayer_cFv = 0x80810210;
+	__dt__20daJrClownForPlayer_cFv = 0x808102D0; /* Beans indeed. */
+
+	PClownCarExecute = 0x800A3600;
+	PClownCarAfterCreate = 0x800951D0;
+	PClownCarDraw = 0x80810920;
+	PClownCarMove = 0x80811C00;
+
+	sAllocatorFunc__FrmHeap = 0x8042DFF0;
+
+	GetActivePlayerCount = 0x8005FFB0;
+	getEffectiveScreenLeft__19ClassWithCameraInfoFv = 0x80082240;
+	instance__19ClassWithCameraInfo = 0x80429B20;
+
+	BowserExitDemoState = 0x8005B5D0;
+	MagicEnd = 0x807CCBA0;
+
+/* Back to other shit I didn't want to scroll for */
+
+	GlobalTickCount = 0x8042A088;
+
+	GetSpecificPlayerActor = 0x8005F900;
+	Actor_SearchByID = 0x80162B10;
+	TimeStopFlag = 0x80429A1A;
+	TimerBranch = 0x800E3948;
+	MarioDescentRate = 0x8042B584;
+	MarioJumpArc = 0x802F543C;
+	MarioJumpMax = 0x8042B568;
+	MiniMarioJumpArc = 0x802F5484;
+	MarioSize = 0x8042B594;
+	AlwaysDrawFlag = 0x80064540;
+	AlwaysDrawBranch = 0x80064544;
+	GenerateRandomNumber = 0x800B2EE0;
+	OneofManySoundPlayers = 0x800CE840;
+	BombExplodeState = 0x80B12348;
+	NoFreezie = 0x800A0B08;
+
+	DoSceneChange__FUsUiUi = 0x800E1DE0;
+
+	SinFIdx__Q24nw4r4mathFf = 0x802379E0;
+	CosFIdx__Q24nw4r4mathFf = 0x80237A50;
+	SinCosFIdx__Q24nw4r4mathFPfPff = 0x80237AB0;
+
+	archiveHeap__5mHeap = 0x8042A16C;
+	commandHeap__5mHeap = 0x8042A170;
+	dylinkHeap__5mHeap = 0x8042A174;
+	assertHeap__5mHeap = 0x8042A178;
+	gameHeaps__5mHeap = 0x803779C8;
+
+	init__18StandOnTopColliderFP13dStageActor_cfffffsUcP7Point2d = 0x800DB100;
+	__ct__18StandOnTopColliderFv = 0x800DB0B0;
+	__dt__18StandOnTopColliderFv = 0x80044400;
+
+
+	__dt__13BasicColliderFv = 0x800DAD80;
+
+	addToList__13BasicColliderFv = 0x800DAE00;
+
+	__ct__21RideableActorColliderFv = 0x800DB3D0;
+	init__21RideableActorColliderFP13dStageActor_cP7Point2dP7Point2d = 0x800DB420;
+	init__21RideableActorColliderFP13dStageActor_cffff = 0x800DB4B0;
+	setPosition__21RideableActorColliderFP7Point2dP7Point2d = 0x800DB510;
+	setPosition__21RideableActorColliderFffff = 0x800DB570;
+
+	drawWithMatrix__21SomethingAboutShroomsFfP4mMtx = 0x800BC630;
+
+	original_onCreate__13daObjKinoko_cFv = 0x8087F660;
+
+	instance__13dCourseFull_c = 0x80429BB8;
+	getRectByID__9dCourse_cFUcP5mRect = 0x8008E890;
+
+	modifyPlayerPropertiesWithRollingObject = 0x80057820;
+	EN_LandbarrelPlayerCollision = 0x80A57BA0;
+	GetCountofActivePlayers = 0x8005FFB0;
+
+/* Boss Related */
+
+	StartBGMMusic = 0x807DB1B0;
+	StopBGMMusic = 0x807DB1C0;
+	instance__11dStage32C_c = 0x80429C30;
+	instance__7WLClass = 0x804299B4;
+
+	ShakeScreen = 0x800D8BE0;
+	StageScreen = 0x80429D28;
+
+	createChild__13dStageActor_cF6ActorsP13dStageActor_cUiP7Point3dP6S16VecUc = 0x80064680;
+	GameMgrBossEndFunc = 0x8001CDB0;
+	MakeMarioEnterDemoMode = 0x807C7CE0;
+	MakeMarioExitDemoMode = 0x8005CA50;
+	ForceMarioExitDemoMode = 0x8005CA50;
+
+	ResetPlayerState = 0x80052170;
+	UpdateGameMgr = 0x8001CDB0;
+	UnsetShit = 0x80056CB0;
+
+	StateID_DemoSt2__12daKameckDemo = 0x809998D4;
+	StateID_DemoSt__12daKameckDemo = 0x80999914;
+	StateID_DemoWait__12daKameckDemo = 0x80999954;
+
+	StateID_DemoWait__9daNeedles = 0x8099CC5C;
+	StateID_DemoAwake__9daNeedles = 0x8099CCA0;
+	StateID_Idle__9daNeedles = 0x8099CCE0;
+	StateID_Die__9daNeedles = 0x8099CD20;
+
+	StateID_None__7dPlayer = 0x80353F9C;
+	StateID_Walk__7dPlayer = 0x80353FDC;
+	StateID_Jump__7dPlayer = 0x8035401C;
+	StateID_DemoNone__7dPlayer = 0x8035441C;
+	StateID_DemoWait__7dPlayer = 0x8035449C;
+	StateID_DemoGoal__7dPlayer = 0x8035485C;
+	StateID_DemoControl__7dPlayer = 0x8035489C;
+
+	PlayWrenchSound = 0x808A9250;
+	WaterManager = 0x80429E20;
+	CheckforLiquid = 0x800EB8B0;
+
+/* Mr Sun Related */
+
+	ActivePhysics_InitWithStruct = 0x8008C3E0;
+	ActivePhysics_AddToList = 0x8008C330;
+	__ct__13ActivePhysicsFv = 0x8008C200;
+	__dt__13ActivePhysicsFv = 0x8008C260;
+	HandleXSpeed = 0x8006CD90;
+	HandleYSpeed = 0x8006CDE0;
+	UpdateObjectPosBasedOnSpeedValues_real = 0x8006CD40;
+	dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3 = 0x80096240;
+	CalculateDistanceFromActorsNextPosToFurthestPlayer = 0x80064740;
+
+	doSpriteMovement = 0x800955F0;
+
+
+	instance__17dEffectBreakMgr_c = 0x80429C08;
+	spawnTile__17dEffectBreakMgr_cFP7Point3dUic = 0x800925F0;
+
+	CollidedWithTile = 0x80070CB0;
+	SomeStrangeModification = 0x80096E60;
+
+
+	Actor_GetVec3WithValuesAdded = 0x8006CED0;
+	ConvertStagePositionIntoScreenPosition__Maybe = 0x8006A4B0;
+	AnotherSoundRelatedFunction = 0x80197D10;
+	YetAnotherSoundPlayer = 0x80198DD0;
+	CheckIfPlayingSound = 0x80196410;
+	RelatedToPlayingSoundsAlongsideAnims = 0x801051C0;
+
+	SoundRelatedClass = 0x8042A1A8;
+
+	ConvertStagePositionToScreenPosition__FP7Point2dP7Point3d = 0x8006A4B0;
+
+	PlaySoundAtPosition__17SoundPlayingClassFiP7Point2dUi = 0x80198A40;
+	instance2__17SoundPlayingClass = 0x80429A80;
+
+	ExitStage__Fiiii = 0x801021E0;
+
+
+	zero__4mMtxFv = 0x8016EF60;
+	rotationX__4mMtxFPs = 0x8016EA00;
+	applyRotationX__4mMtxFPs = 0x8016EAC0;
+	rotationY__4mMtxFPs = 0x8016EB20;
+	applyRotationY__4mMtxFPs = 0x8016EBE0;
+	rotationZ__4mMtxFPs = 0x8016EC40;
+	applyRotationZ__4mMtxFPs = 0x8016ED00;
+	applyRotationYXZ__4mMtxFPsPsPs = 0x8016ED60;
+	applyRotationZYX__4mMtxFPsPsPs = 0x8016EDE0;
+
+	_savefpr_14 = 0x802DCAB8;
+	_savefpr_15 = 0x802DCABC;
+	_savefpr_16 = 0x802DCAC0;
+	_savefpr_17 = 0x802DCAC4;
+	_savefpr_18 = 0x802DCAC8;
+	_savefpr_19 = 0x802DCACC;
+	_savefpr_20 = 0x802DCAD0;
+	_savefpr_21 = 0x802DCAD4;
+	_savefpr_22 = 0x802DCAD8;
+	_savefpr_23 = 0x802DCADC;
+	_savefpr_24 = 0x802DCAE0;
+	_savefpr_25 = 0x802DCAE4;
+	_savefpr_26 = 0x802DCAE8;
+	_savefpr_27 = 0x802DCAEC;
+	_savefpr_28 = 0x802DCAF0;
+	_savefpr_29 = 0x802DCAF4;
+	_savefpr_30 = 0x802DCAF8;
+	_savefpr_31 = 0x802DCAFC;
+
+	_restfpr_14 = 0x802DCB04;
+	_restfpr_15 = 0x802DCB08;
+	_restfpr_16 = 0x802DCB0C;
+	_restfpr_17 = 0x802DCB10;
+	_restfpr_18 = 0x802DCB14;
+	_restfpr_19 = 0x802DCB18;
+	_restfpr_20 = 0x802DCB1C;
+	_restfpr_21 = 0x802DCB20;
+	_restfpr_22 = 0x802DCB24;
+	_restfpr_23 = 0x802DCB28;
+	_restfpr_24 = 0x802DCB2C;
+	_restfpr_25 = 0x802DCB30;
+	_restfpr_26 = 0x802DCB34;
+	_restfpr_27 = 0x802DCB38;
+	_restfpr_28 = 0x802DCB3C;
+	_restfpr_29 = 0x802DCB40;
+	_restfpr_30 = 0x802DCB44;
+	_restfpr_31 = 0x802DCB48;
+
+	_savegpr_14 = 0x802DCB50;
+	_savegpr_15 = 0x802DCB54;
+	_savegpr_16 = 0x802DCB58;
+	_savegpr_17 = 0x802DCB5C;
+	_savegpr_18 = 0x802DCB60;
+	_savegpr_19 = 0x802DCB64;
+	_savegpr_20 = 0x802DCB68;
+	_savegpr_21 = 0x802DCB6C;
+	_savegpr_22 = 0x802DCB70;
+	_savegpr_23 = 0x802DCB74;
+	_savegpr_24 = 0x802DCB78;
+	_savegpr_25 = 0x802DCB7C;
+	_savegpr_26 = 0x802DCB80;
+	_savegpr_27 = 0x802DCB84;
+	_savegpr_28 = 0x802DCB88;
+	_savegpr_29 = 0x802DCB8C;
+	_savegpr_30 = 0x802DCB90;
+	_savegpr_31 = 0x802DCB94;
+
+	_restgpr_14 = 0x802DCB9C;
+	_restgpr_15 = 0x802DCBA0;
+	_restgpr_16 = 0x802DCBA4;
+	_restgpr_17 = 0x802DCBA8;
+	_restgpr_18 = 0x802DCBAC;
+	_restgpr_19 = 0x802DCBB0;
+	_restgpr_20 = 0x802DCBB4;
+	_restgpr_21 = 0x802DCBB8;
+	_restgpr_22 = 0x802DCBBC;
+	_restgpr_23 = 0x802DCBC0;
+	_restgpr_24 = 0x802DCBC4;
+	_restgpr_25 = 0x802DCBC8;
+	_restgpr_26 = 0x802DCBCC;
+	_restgpr_27 = 0x802DCBD0;
+	_restgpr_28 = 0x802DCBD4;
+	_restgpr_29 = 0x802DCBD8;
+	_restgpr_30 = 0x802DCBDC;
+	_restgpr_31 = 0x802DCBE0;
+
+	__shl2i = 0x802DCFFC;
+
+	__nw__FUl = 0x802B9020;
+	__dl__FPv = 0x802B9090;
+
+	__construct_new_array = 0x802DC5F0;
+	__destroy_new_array = 0x802DC920;
+	__destroy_arr = 0x802DC8A8;
+	sub_80024C20 = 0x80024C20;
+
+	__register_global_object = 0x802DC590;
+	__ptmf_scall = 0x802DCA0C;
+
+
+	setup__13FunctionChainFPPFPv_bUs = 0x8015F410;
+
+	/* collisionMgr_c */
+	__ct__14collisionMgr_c = 0x8006CF40;
+	__dt__14collisionMgr_c = 0x8006CF40;
+	Clear1__14collisionMgr_cFv = 0x8006CFE0;
+	Clear2__14collisionMgr_cFv = 0x8006D000;
+	Init__14collisionMgr_cFP13dStageActor_cPCUcPCUcPCUc = 0x8006D090;
+	Clear3__14collisionMgr_cFv = 0x8006D440;
+	CollidedWithTile__14collisionMgr_cFv = 0x80070CB0;
+	SomethingSemiImportant__14collisionMgr_cFUi = 0x8006EF40;
+	execute__14collisionMgr_cFv = 0x80072BC0;
+	s_8006FA40__14collisionMgr_cFPv = 0x8006FA40;
+	s_80070760__14collisionMgr_cFv = 0x80070760;
+	s_800707E0__14collisionMgr_cFv = 0x800707E0;
+
+	/* freezeMgr_c */
+	__ct_11freezeMgr_c = 0x800B83C0;
+	__dt__11freezeMgr_cFv = 0x800B8460;
+	doSomethingCool1__11freezeMgr_c = 0x800B84D0;
+	doSomethingCool2__11freezeMgr_c = 0x800B85A0;
+	setSomething__11freezeMgr_cFUiUiUi = 0x800B8670;
+	Create_ICEACTORs__11freezeMgr_cFPvi = 0x800B8680;
+	Delete_ICEACTORs__11freezeMgr_c = 0x800B87D0;
+	SetIceTimer_pt1__11freezeMgr_c = 0x800B8850;
+	SetIceTimer_pt2__11freezeMgr_c = 0x800B88B0;
+	CheckIceTimer_lte_Value__11freezeMgr_c = 0x800B8930;
+	doSomethingCool3__11freezeMgr_c = 0x800B89A0;
+	doSomethingCool4__11freezeMgr_c = 0x800B8A30;
+	doSomethingCool5__11freezeMgr_c = 0x800B8AB0;
+	doSomethingCool6__11freezeMgr_c = 0x800B8B30;
+	DoMeltNormal__11freezeMgr_c = 0x800B8BB0;
+	doSomethingCool7__11freezeMgr_c = 0x800B8C70;
+	CheckCountdownTimer__11freezeMgr_c = 0x800B8E60;
+
+	__vt__7fBase_c = 0x80329178;
+	onCreate__7fBase_cFv = 0x80161B90;
+	onDelete__7fBase_cFv = 0x80161C40;
+	onExecute__7fBase_cFv = 0x80161EE0;
+	willBeDeleted__7fBase_cFv = 0x801620E0;
+	moreHeapShit__7fBase_cFUiPv = 0x80162400;
+	createHeap__7fBase_cFUiPv = 0x80162600;
+	heapCreated__7fBase_cFv = 0x801626C0;
+	Delete__7fBase_cFv = 0x80162320;
+	findNextUninitialisedProcess__7fBase_cFv = 0x801627C0;
+	hasUninitialisedProcesses__7fBase_cFv = 0x80162830;
+	onDraw__7fBase_cFv = 0x80161FE0;
+	_Z15fBase_c__DeletePv = 0x80162320;
+	fBase_c__Delete__FPv = 0x80162320;
+
+	GetExplanationString__7dBase_cFv = 0x8006C660;
+
+	__vt__15daEnBlockMain_c = 0x80301CC8;
+	__dt__15daEnBlockMain_cFv = 0x80023340;
+	calledWhenUpMoveBegins__15daEnBlockMain_cFv = 0x80022E80;
+	calledWhenDownMoveBegins__15daEnBlockMain_cFv = 0x80022F60;
+	calledWhenUpMoveExecutes__15daEnBlockMain_cFv = 0x80022F30;
+	calledWhenUpMoveDiffExecutes__15daEnBlockMain_cFv = 0x800231A0;
+	calledWhenDownMoveExecutes__15daEnBlockMain_cFv = 0x80023010;
+	calledWhenDownMoveEndExecutes__15daEnBlockMain_cFv = 0x80023080;
+	calledWhenDownMoveDiffExecutes__15daEnBlockMain_cFv = 0x800232C0;
+	calledWhenDownMoveDiffEndExecutes__15daEnBlockMain_cFv = 0x80023330;
+	updateScale__15daEnBlockMain_cFb = 0x80022DC0;
+	upMove_Begin__15daEnBlockMain_cFv = 0x80022E60;
+	upMove_Execute__15daEnBlockMain_cFv = 0x80022EA0;
+	upMove_End__15daEnBlockMain_cFv = 0x80022E90;
+	downMove_Begin__15daEnBlockMain_cFv = 0x80022F40;
+	downMove_Execute__15daEnBlockMain_cFv = 0x80022F80;
+	downMove_End__15daEnBlockMain_cFv = 0x80022F70;
+	downMoveEnd_Begin__15daEnBlockMain_cFv = 0x80023020;
+	downMoveEnd_Execute__15daEnBlockMain_cFv = 0x80023040;
+	downMoveEnd_End__15daEnBlockMain_cFv = 0x80023030;
+	upMove_Diff_Begin__15daEnBlockMain_cFv = 0x80023090;
+	upMove_Diff_Execute__15daEnBlockMain_cFv = 0x800230D0;
+	upMove_Diff_End__15daEnBlockMain_cFv = 0x800230C0;
+	downMove_Diff_Begin__15daEnBlockMain_cFv = 0x800231B0;
+	downMove_Diff_Execute__15daEnBlockMain_cFv = 0x800231F0;
+	downMove_Diff_End__15daEnBlockMain_cFv = 0x800231E0;
+	downMove_DiffEnd_Begin__15daEnBlockMain_cFv = 0x800232D0;
+	downMove_DiffEnd_Execute__15daEnBlockMain_cFv = 0x800232F0;
+	downMove_DiffEnd_End__15daEnBlockMain_cFv = 0x800232E0;
+	blockInit__15daEnBlockMain_cFf = 0x80021690;
+	blockUpdate__15daEnBlockMain_cFv = 0x800217B0;
+	blockResult__15daEnBlockMain_cFv = 0x800212C0;
+	PhysicsCallback1__15daEnBlockMain_c = 0x80021180;
+	g = 0x80021170;
+	PhysicsCallback3__15daEnBlockMain_c = 0x800211A0;
+	OPhysicsCallback1__15daEnBlockMain_c = 0x80020BF0;
+	OPhysicsCallback2__15daEnBlockMain_c = 0x80020E70;
+	OPhysicsCallback3__15daEnBlockMain_c = 0x80021010;
+	StateID_UpMove__15daEnBlockMain_c = 0x803527B4;
+	StateID_DownMove__15daEnBlockMain_c = 0x803527F4;
+	StateID_DownMoveEnd__15daEnBlockMain_c = 0x80352834;
+	StateID_UpMove_Diff__15daEnBlockMain_c = 0x80352874;
+	StateID_DownMove_Diff__15daEnBlockMain_c = 0x803528B4;
+	StateID_DownMove_DiffEnd__15daEnBlockMain_c = 0x803528F4;
+
+	__ct__5dEn_cFv = 0x80094E80;
+	__dt__5dEn_cFv = 0x80095130;
+	afterCreate__5dEn_cFi = 0x800951D0;
+	afterExecute__5dEn_cFi = 0x80095480;
+	kill__5dEn_cFv = 0x80097F70;
+	eatIn__5dEn_cFv = 0x80097C40;
+	disableEatIn__5dEn_cFv = 0x80097CB0;
+	_vf8C__5dEn_cFPv = 0x80097D30;
+	_vfCC__5dEn_cFP7Point2df = 0x800973F0;
+	_vfD0__5dEn_cFP7Point2df = 0x800974F0;
+	doStateChange__5dEn_cFP12dStateBase_c = 0x800A7DF0;
+	collisionCallback__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095950;
+	preSpriteCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095CE0;
+	prePlayerCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095D30;
+	preYoshiCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095F50;
+	stageActorCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80096060;
+	spriteCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095C10;
+	playerCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095C20;
+	yoshiCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095C80;
+	collisionCat3_StarPower__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x8009F840;
+	collisionCat5_Mario__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x8009FB50;
+	_vf108__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x8009FE40;
+	collisionCatD_GroundPound__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x8009FFD0;
+	_vf110__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x8009FFC0;
+	collisionCat8_FencePunch__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x8009FCE0;
+	collisionCat7_WMWaggleWater__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x800A0150;
+	collisionCat7_WMWaggleWaterYoshi__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x800A02D0;
+	_vf120__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x8009FCD0;
+	collisionCatA_PenguinMario__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x8009FCC0;
+	collisionCat11_PipeCannon__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x8009F9D0;
+	collisionCat9_RollingObject__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x800A0700;
+	collisionCat1_Fireball_E_Explosion__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x800A08D0;
+	collisionCat2_IceBall_15_YoshiIce__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x800A0A30;
+	collisionCat13_Hammer__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x800A03C0;
+	collisionCat14_YoshiFire__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x800A0550;
+	_vf140__5dEn_cFP13dStageActor_c = 0x800A10B0;
+	_vf144__5dEn_cFi = 0x800A0C70;
+	_vf148__5dEn_cFv = 0x800A12A0;
+	_vf14C__5dEn_cFv = 0x800A1370;
+	_vf150__5dEn_cFv = 0x800206D0;
+	eatenByYoshiProbably__5dEn_cFv = 0x80096230;
+	playHpdpSound1__5dEn_cFv = 0x800A1C00;
+	playEnemyDownSound1__5dEn_cFv = 0x800A1BB0;
+	playEnemyDownComboSound__5dEn_cFPv = 0x800A1C80;
+	playHpdpSound2__5dEn_cFv = 0x800A1D90;
+	_vf168__5dEn_cFv = 0x800A1E10;
+	dieFumi_Begin__5dEn_cFv = 0x800A1470;
+	dieFumi_Execute__5dEn_cFv = 0x800A1600;
+	dieFumi_End__5dEn_cFv = 0x800A1820;
+	dieFall_Begin__5dEn_cFv = 0x800A16A0;
+	dieFall_Execute__5dEn_cFv = 0x800A1830;
+	dieFall_End__5dEn_cFv = 0x800A1820;
+	dieBigFall_Begin__5dEn_cFv = 0x800A1910;
+	dieBigFall_Execute__5dEn_cFv = 0x800A1930;
+	dieBigFall_End__5dEn_cFv = 0x800A1920;
+	dieSmoke_Begin__5dEn_cFv = 0x800A1980;
+	dieSmoke_Execute__5dEn_cFv = 0x800A1A00;
+	dieSmoke_End__5dEn_cFv = 0x800A19F0;
+	dieYoshiFumi_Begin__5dEn_cFv = 0x800A1AC0;
+	dieYoshiFumi_Execute__5dEn_cFv = 0x800A1B40;
+	dieYoshiFumi_End__5dEn_cFv = 0x800A1B30;
+	dieIceVanish_Begin__5dEn_cFv = 0x800A1A10;
+	dieIceVanish_Execute__5dEn_cFv = 0x800A1AB0;
+	dieIceVanish_End__5dEn_cFv = 0x800A1AA0;
+	dieGoal_Begin__5dEn_cFv = 0x800A1B50;
+	dieGoal_Execute__5dEn_cFv = 0x800A1B70;
+	dieGoal_End__5dEn_cFv = 0x800A1B60;
+	dieOther_Begin__5dEn_cFv = 0x800A1B80;
+	dieOther_Execute__5dEn_cFv = 0x800A1BA0;
+	dieOther_End__5dEn_cFv = 0x800A1B90;
+	eatIn_Begin__5dEn_cFv = 0x800A81C0;
+	eatIn_Execute__5dEn_cFv = 0x800A81E0;
+	eatIn_End__5dEn_cFv = 0x800A81D0;
+	eatNow_Begin__5dEn_cFv = 0x800A8260;
+	eatNow_Execute__5dEn_cFv = 0x800A8280;
+	eatNow_End__5dEn_cFv = 0x800A8270;
+	eatOut_Begin__5dEn_cFv = 0x800A8290;
+	eatOut_Execute__5dEn_cFv = 0x800A82B0;
+	eatOut_End__5dEn_cFv = 0x800A82A0;
+	hitSpin_Begin__5dEn_cFv = 0x800A8190;
+	hitSpin_Execute__5dEn_cFv = 0x800A81B0;
+	hitSpin_End__5dEn_cFv = 0x800A81A0;
+	ice_Begin__5dEn_cFv = 0x800A7E90;
+	ice_Execute__5dEn_cFv = 0x800A7F40;
+	ice_End__5dEn_cFv = 0x800A7F30;
+	spawnHitEffectAtPosition__5dEn_cF7Point2d = 0x80095520;
+	doSomethingWithHardHitAndSoftHitEffects__5dEn_cF7Point3d = 0x80095530;
+	playEnemyDownSound2__5dEn_cFv = 0x80095580;
+	add2ToYSpeed__5dEn_cFv = 0x800955D0;
+	_vf218__5dEn_cFv = 0x80095890;
+	_vf21C__5dEn_cFv = 0x80097770;
+	_vf220__5dEn_cFPv = 0x80097F20;
+	_vf224__5dEn_cFv = 0x80097F60;
+	_vf228__5dEn_cFv = 0x800206C0;
+	CreateIceActors__5dEn_cFv = 0x800A8060;
+	_vf230__5dEn_cFv = 0x800A8150;
+	_vf234__5dEn_cFv = 0x800A8160;
+	_vf238__5dEn_cFv = 0x800A8180;
+	_vf23C__5dEn_cFv = 0x800206B0;
+	_vf240__5dEn_cFv = 0x800206A0;
+	_vf244__5dEn_cFv = 0x80020690;
+	_vf248__5dEn_cFi = 0x800968E0;
+	_vf24C__5dEn_cFPv = 0x80096710;
+	addScoreWhenHit__5dEn_cFPv = 0x80096700;
+	_vf254__5dEn_cFPv = 0x80096720;
+	_vf258__5dEn_cFPv = 0x80096760;
+	_vf25C__5dEn_cFPv = 0x80096770;
+	_vf260__5dEn_cFPv = 0x80096910;
+	_vf264__5dEn_cFP13dStageActor_c = 0x80096D60;
+	_vf268__5dEn_cFPv = 0x80096A20;
+	spawnHitEffectAtPositionAgain__5dEn_cF7Point2d = 0x80096DF0;
+	playMameStepSound__5dEn_cFv = 0x80096C40;
+	_vf274__5dEn_cFv = 0x80096E50;
+	_vf278__5dEn_cFPv = 0x80096B30;
+	_vf27C__5dEn_cFv = 0x80096E40;
+
+	StateID_DieFumi__5dEn_c = 0x80357934;
+	StateID_DieFall__5dEn_c = 0x80357974;
+	StateID_DieBigFall__5dEn_c = 0x803579B4;
+	StateID_DieSmoke__5dEn_c = 0x803579F4;
+	StateID_DieIceVanish__5dEn_c = 0x80357A34;
+	StateID_DieYoshiFumi__5dEn_c = 0x80357A74;
+	StateID_DieGoal__5dEn_c = 0x80357AB4;
+	StateID_DieOther__5dEn_c = 0x80357AF4;
+
+	doSpriteMovement__5dEn_cFv = 0x800955F0;
+	CheckIfPlayerBelow__5dEn_cFff = 0x800978C0;
+	stuffRelatingToCollisions__5dEn_cFfff = 0x800957B0;
+	checkLiquidImmersion__5dEn_cFP7Point2df = 0x80097250;
+
+	_vfD8__18dActorMultiState_cFv = 0x80067590;
+	_vfDC__18dActorMultiState_cFv = 0x800675B0;
+	_vfE0__18dActorMultiState_cFv = 0x800675A0;
+
+	__ct__13dStageActor_cFv = 0x80064110;
+	__dt__13dStageActor_cFv = 0x800642B0;
+	beforeCreate__13dStageActor_cFv = 0x80064350;
+	afterCreate__13dStageActor_cFi = 0x80064380;
+	beforeDelete__13dStageActor_cFv = 0x80064390;
+	afterDelete__13dStageActor_cFi = 0x800643E0;
+	beforeExecute__13dStageActor_cFv = 0x800643F0;
+	afterExecute__13dStageActor_cFi = 0x80064490;
+	beforeDraw__13dStageActor_cFv = 0x80064540;
+	afterDraw__13dStageActor_cFi = 0x800645E0;
+	GetExplanationString__13dStageActor_cFv = 0x800645F0;
+	_vf60__13dStageActor_cFv = 0x80065080;
+	kill__13dStageActor_cFv = 0x80065650;
+	_vf68__13dStageActor_cFv = 0x8001D210;
+	_vf6C__13dStageActor_cFv = 0x8001D200;
+	_vf70__13dStageActor_cFv = 0x80065620;
+	_vf74__13dStageActor_cFv = 0x8001D1F0;
+	_vf78__13dStageActor_cFv = 0x80065820;
+	_vf7C__13dStageActor_cFv = 0x8001D1E0;
+	eatIn__13dStageActor_cFv = 0x80065830;
+	disableEatIn__13dStageActor_cFv = 0x80065850;
+	_vf88__13dStageActor_cFv = 0x80065860;
+	_vf8C__13dStageActor_cFPv = 0x80065870;
+	_vf90__13dStageActor_cFP13dStageActor_c = 0x80065880;
+	_vf94__13dStageActor_cFPv = 0x80065AC0;
+	removeMyActivePhysics__13dStageActor_cFv = 0x80066080;
+	addMyActivePhysics__13dStageActor_cFv = 0x80066090;
+	returnRegularScale__13dStageActor_cFv = 0x80065950;
+	_vfA4__13dStageActor_cFPv = 0x80065970;
+	_vfA8__13dStageActor_cFPv = 0x80065A00;
+	_vfAC__13dStageActor_cFPv = 0x80065A40;
+	killedByLevelClear__13dStageActor_cFv = 0x80065660;
+	_vfB4__13dStageActor_cFv = 0x80065B40;
+	_vfB8__13dStageActor_cFv = 0x8001D1D0;
+	_vfBC__13dStageActor_cFv = 0x80065B50;
+	_vfC0__13dStageActor_cFv = 0x80065B60;
+	_vfC4__13dStageActor_cFv = 0x80065B70;
+	_vfC8__13dStageActor_cFP7Point2df = 0x80065CC0;
+	_vfCC__13dStageActor_cFP7Point2df = 0x80065DC0;
+	_vfD0__13dStageActor_cFP7Point2df = 0x80065EC0;
+	outOfZone__13dStageActor_cF7Point3dPfUc = 0x80064DA0;
+	checkZoneBoundaries__13dStageActor_cFUi = 0x80064F50;
+	create__13dStageActor_cF6ActorsUiP7Point3dP6S16VecUc = 0x80064610;
+	Delete__13dStageActor_cFUc = 0x80064D10;
+
+	__ct__8dScene_cFv = 0x800E1930;
+	__dt__8dScene_cFv = 0x800E19A0;
+	beforeCreate__8dScene_cFv = 0x800E1A20;
+	afterCreate__8dScene_cFi = 0x800E1A60;
+	beforeDelete__8dScene_cFv = 0x800E1AD0;
+	afterDelete__8dScene_cFi = 0x800E1B00;
+	beforeExecute__8dScene_cFv = 0x800E1B60;
+	afterExecute__8dScene_cFi = 0x800E1CA0;
+	beforeDraw__8dScene_cFv = 0x800E1CF0;
+	afterDraw__8dScene_cFi = 0x800E1D20;
+
+	__ct__8dActor_cFv = 0x8006C6D0;
+	__dt__8dActor_cFv = 0x8006C7F0;
+	UpdateObjectPosBasedOnSpeedValuesReal__8dActor_cFv = 0x8006CD40;
+	HandleXSpeed__8dActor_cFv = 0x8006CD90;
+	HandleYSpeed__8dActor_cFv = 0x8006CDE0;
+
+	__ct__7dBase_cFv = 0x8006C420;
+	__dt__7dBase_cFv = 0x8006C490;
+	beforeCreate__7dBase_cFv = 0x8006C540;
+	afterCreate__7dBase_cFi = 0x8006C570;
+	beforeDelete__7dBase_cFv = 0x8006C580;
+	afterDelete__7dBase_cFi = 0x8006C5B0;
+	beforeExecute__7dBase_cFv = 0x8006C5C0;
+	afterExecute__7dBase_cFi = 0x8006C600;
+	beforeDraw__7dBase_cFv = 0x8006C610;
+	afterDraw__7dBase_cFi = 0x8006C650;
+
+
+	specialDraw1__8dActor_cFv = 0x8006CA50;
+	specialDraw2__8dActor_cFv = 0x8006CA60;
+	_vf58__8dActor_cFv = 0x8001D1C0;
+	_vf5C__8dActor_cFv = 0x8001D1B0;
+
+	__ct__12dStateBase_cFPCc = 0x8015F5D0;
+	__dt__12dStateBase_cFv = 0x8015F610;
+	isInvalid__12dStateBase_cFv = 0x8015F650;
+	isEqualNotUsedForSomeReason__12dStateBase_cFP12dStateBase_c = 0x8015F660;
+	isEqual__12dStateBase_cFP12dStateBase_c = 0x8015F6D0;
+	isNotEqual__12dStateBase_cFP12dStateBase_c = 0x8015F6E0;
+	getName__12dStateBase_cFv = 0x8015F730;
+	getID__12dStateBase_cFv = 0x8015F740;
+
+	/* HACK HACK */
+	/* These don't actually exist, they're just here to save us some space for newer */
+	isSameStateName__12dStateBase_cFPCc = 0x800142A0;
+	doBegin__12dStateBase_cFPv = 0x80012970;
+	doExecute__12dStateBase_cFPv = 0x80012940;
+	doEnd__12dStateBase_cFPv = 0x80012910;
+	/* END HACK */
+
+	mNoState__12dStateBase_c = 0x80377784;
+
+	__dt__15dStateMgrBase_cFv = 0x8015F800;
+
+	__ct__11dStateMgr_cFP17dStatePointless_cP20dStateExecutorBase_cP12dStateBase_c = 0x8015FAA0;
+
+	__ct__10dFlagMgr_c = 0x800E3A60;
+	setup__10dFlagMgr_cFb = 0x800E3B20;
+	applyAndClearAllTimedActions__10dFlagMgr_cFv = 0x800E3EA0;
+	execute__10dFlagMgr_cFv = 0x800E3F90;
+	set__10dFlagMgr_cFUcibbbUi = 0x800E4140;
+	findLowestFlagInSet__10dFlagMgr_cFUiUl = 0x800E43F0;
+	setSpecial__10dFlagMgr_cFUcffUcUiUl = 0x800E44D0;
+	get8__10dFlagMgr_cFUc = 0x800E4510;
+	get108__10dFlagMgr_cFUc = 0x800E4520;
+	get208__10dFlagMgr_cFUc = 0x800E4530;
+	get248__10dFlagMgr_cFUc = 0x800E4540;
+	get448__10dFlagMgr_cFUc = 0x800E4560;
+	instance__10dFlagMgr_c = 0x80429D98;
+
+
+	clear__13ActivePhysicsFv = 0x8008C2C0;
+	removeFromList__13ActivePhysicsFv = 0x8008C380;
+	addToList__13ActivePhysicsFv = 0x8008C330;
+	initWithStruct__13ActivePhysicsFP8dActor_cPCQ213ActivePhysics4Info = 0x8008C3E0;
+
+
+	__ct__7PhysicsFv = 0x8007F7A0;
+	__dt__7PhysicsFv = 0x8007F810;
+	baseSetup__7PhysicsFP8dActor_cPvPvPvUcUc = 0x8007F9B0;
+	setup__7PhysicsFP8dActor_cffffPvPvPvUcUcP7Point2d = 0x8007FA40;
+	setup__7PhysicsFP8dActor_cPQ27Physics4InfoUcUcP7Point2d = 0x8007FB10;
+
+	spinningPhysicsCallback = 0x808A2110;
+	/* spinningPhysicsCallback__7Physics = 0x808A2110; */
+
+	addToList__7PhysicsFv = 0x8007F900;
+	removeFromList__7PhysicsFv = 0x8007F950;
+	update__7PhysicsFv = 0x8007FDA0;
+
+	getTileRendererList__7dBgGm_cFi = 0x80078520;
+
+	getPointerToTile__8BgGmBaseFiiiPib = 0x80077520;
+	placeTile__8BgGmBaseFUsUsii = 0x80077860;
+
+	add__Q212TileRenderer4ListFP12TileRenderer = 0x80014820;
+	remove__Q212TileRenderer4ListFP12TileRenderer = 0x80014860;
+
+	__ct__12TileRendererFv = 0x800145B0;
+	__dt__12TileRendererFv = 0x800145F0;
+	setPosition__12TileRendererFfff = 0x800146B0;
+	setVars__12TileRendererFf = 0x800146D0;
+
+	__ct__21dPlayerModelHandler_cFUc = 0x800D6C40;
+	loadModel__21dPlayerModelHandler_cFUcii = 0x800D6D70;
+	setSRT__21dPlayerModelHandler_cF7Point3d6S16Vec7Point3d = 0x800D6EC0;
+	callVF20__21dPlayerModelHandler_cFv = 0x800D6F80;
+	draw__21dPlayerModelHandler_cFv = 0x800D6FA0;
+	update__21dPlayerModelHandler_cFv = 0x800D6E10;
+
+	_Z15FindActorByType6ActorsP5Actor = 0x80162B60;
+	FindActorByType__F6ActorsP5Actor = 0x80162B60;
+	_Z19RetrieveFileFromArcPvPcS0_ = 0x800DF100;
+	_Z8OSReportPKcz = 0x8015F540;
+	OSReport__FPCce = 0x8015F540;
+	_Z7OSFatal7GXColorS_PKc = 0x801AF3E0;
+
+	GetSomeSizeRelatedBULLSHIT__Fv = 0x800E2500;
+	CalculateSomethingAboutRatio__Fffff = 0x800E2670;
+	CalculateSomethingElseAboutRatio__Fv = 0x800E2740;
+	DoSomethingCameraRelatedWithEGGScreen__FiPQ23EGG6Screen = 0x80169030;
+
+	GlobalScreenWidth = 0x80429E0C;
+	GlobalScreenHeight = 0x80429E10;
+
+	currentScreenSizeID = 0x8042AC28;
+	ScreenSizesAndMultipliers = 0x80350240;
+
+	setOrtho__Q23EGG7FrustumFffffff = 0x802C68F0;
+
+	__ct__Q23EGG6ScreenFv = 0x802D0AD0;
+	__dt__Q23EGG6ScreenFv = 0x802D08B0;
+
+	__vt__Q23EGG12LookAtCamera = 0x8034FDD8;
+	assignToNW4RCamera__Q23EGG12LookAtCameraFRQ34nw4r3g3d6Camera = 0x802BE690;
+
+	__ct__Q23EGG12ProjectOrthoFv = 0x802BF1E0;
+	setVolume__Q23EGG12ProjectOrthoFffff = 0x802BF230;
+
+	GetCameraByID__Fi = 0x80164930;
+	GetCurrentCameraID__Fv = 0x80164950;
+	SetCurrentCameraID__Fi = 0x80164960;
+
+	LinkScene__Fi = 0x80164A20;
+	UnlinkScene__Fi = 0x801649A0;
+
+	SceneCalcWorld__Fi = 0x80164AE0;
+	SceneCameraStuff__Fi = 0x80164B70;
+
+	CalcMaterial__Fv = 0x80164B60;
+	DrawOpa__Fv = 0x80164C40;
+	DrawXlu__Fv = 0x80164C50;
+
+	ChangeAlphaUpdate__Fb = 0x802D2D90;
+	ChangeColorUpdate__Fb = 0x802D2D30;
+
+	DoSpecialDrawing1__Fv = 0x8006CAE0;
+	DoSpecialDrawing2__Fv = 0x8006CB40;
+
+	SetupLYTDrawing__Fv = 0x80163030;
+	ClearLayoutDrawList__Fv = 0x80162F80;
+
+	RenderAllLayouts__Fv = 0x800067A0;
+	DrawAllLayoutsBeforeX__Fi = 0x80163110;
+	DrawAllLayoutsAfterX__Fi = 0x801631A0;
+	DrawAllLayoutsAfterXandBeforeY__Fii = 0x80163230;
+
+	findPaneByName__Q23m2d17EmbedLayoutBase_cCFPCc = 0x80007300;
+	findTextBoxByName__Q23m2d17EmbedLayoutBase_cCFPCc = 0x80007320;
+	findPictureByName__Q23m2d17EmbedLayoutBase_cCFPCc = 0x800073D0;
+	findWindowByName__Q23m2d17EmbedLayoutBase_cCFPCc = 0x80007470;
+	__ct__Q23m2d13EmbedLayout_cFv = 0x800C88D0;
+	__dt__Q23m2d13EmbedLayout_cFv = 0x800C8920;
+	loadArc__Q23m2d13EmbedLayout_cFPCcb = 0x800C8C30;
+	loadAnimations__Q23m2d13EmbedLayout_cFPPCci = 0x800C8F30;
+	loadGroups__Q23m2d13EmbedLayout_cFPPCcPii = 0x800C9070;
+	enableNonLoopAnim__Q23m2d13EmbedLayout_cFib = 0x800C9270;
+	enableLoopAnim__Q23m2d13EmbedLayout_cFi = 0x800C9300;
+	resetAnim__Q23m2d13EmbedLayout_cFib = 0x800C9350;
+	disableAllAnimations__Q23m2d13EmbedLayout_cFv = 0x800C9480;
+	isAnimOn__Q23m2d13EmbedLayout_cFi = 0x800C9590;
+	free__Q23m2d13EmbedLayout_cFv = 0x800C98B0;
+	execAnimations__Q23m2d13EmbedLayout_cFv = 0x800C94E0;
+	scheduleForDrawing__Q23m2d6Base_cFv = 0x80163660;
+
+	RenderEffects__Fii = 0x80093F10;
+
+	RemoveAllFromScnRoot__Fv = 0x80164C80;
+	Reset3DState__Fv = 0x80164CD0;
+
+	GetRenderModeObj__Q34nw4r3g3d8G3DStateFv = 0x8024D3E0;
+
+	__ct__Q34nw4r3g3d6CameraFPQ34nw4r3g3d10CameraData = 0x802535E0;
+	SetOrtho__Q34nw4r3g3d6CameraFffffff = 0x80253A80;
+	SetPerspective__Q34nw4r3g3d6CameraFffff = 0x80253A40;
+	SetViewportJitter__Q34nw4r3g3d6CameraFUi = 0x80253C30;
+	SetPosture__Q34nw4r3g3d6CameraFRCQ44nw4r3g3d6Camera11PostureInfo = 0x802537D0;
+	SetPosition__Q34nw4r3g3d6CameraFRC7Point3d = 0x80253760;
+	SetCameraMtxDirectly__Q34nw4r3g3d6CameraFRA3_A4_Cf = 0x802539F0;
+	GetCameraMtx__Q34nw4r3g3d6CameraCFPA3_A4_f = 0x80253EC0;
+
+	CheckRevision__Q34nw4r3g3d7ResFileCFv = 0x8023A670;
+	Init__Q34nw4r3g3d7ResFileFv = 0x8023A3A0;
+	Bind__Q34nw4r3g3d7ResFileFQ34nw4r3g3d7ResFile = 0x8023A160;
+	GetResMdl__Q34nw4r3g3d7ResFileCFPCc = 0x80239C40;
+	GetResTex__Q34nw4r3g3d7ResFileCFPCc = 0x80239D30;
+	g3dMemAllocator__Q24nw4r3g3d = 0x8042A0E8;
+	__ScnMdl__Construct__Q24nw4r3g3dFPvPUiPvUii = 0x8025C830;
+	__ScnMdlSimple__Construct__Q24nw4r3g3dFPvPUiPvi = 0x8025A190;
+	InsertIntoScene__Q24nw4r3g3dFPv = 0x80164C60;
+
+	GetResMat__Q34nw4r3g3d6ResMdlCFPCc = 0x8023B570;
+
+	DisableIndirectTexturing__3m3dFv = 0x80164D60;
+	InitTexObjWithResTex__3m3dFP9_GXTexObjPv14_GXTexWrapMode14_GXTexWrapMode12_GXTexFilter12_GXTexFilter = 0x802C7A80;
+
+	/* This is preliminary and kinda strange, most of these just point to ScnLeaf for now */
+	setup__Q23m3d6proc_cFPvPUi = 0x80164DE0;
+	returnUnknown__Q23m3d6proc_cFv = 0x8000F720;
+
+	__ct__Q23m3d9scnLeaf_cFv = 0x80169E20;
+	__dt__Q23m3d9scnLeaf_cFv = 0x80169E40;
+	free__Q23m3d9scnLeaf_cFv = 0x80169EA0;
+	scheduleForDrawing__Q23m3d9scnLeaf_cFv = 0x80169EF0;
+	getViewMatrix__Q23m3d9scnLeaf_cFPA3_A4_f = 0x80169FA0;
+	/* End preliminary section */
+
+	__vt__Q23m3d5mdl_c = 0x803293A4;
+	__ct__Q23m3d5mdl_cFv = 0x80169AE0;
+	__dt__Q23m3d5mdl_cFv = 0x80169B30;
+	setup__Q23m3d5mdl_cFQ34nw4r3g3d6ResMdlPvUiiPUi = 0x80169BA0;
+	oneSetupType__Q23m3d5mdl_cFv = 0x80064C10;
+	sub_80064BF0__Q23m3d5mdl_cFv = 0x80064BF0;
+	setDrawMatrix__Q23m3d5mdl_cFPA4_Cf = 0x80169F80;
+	setScale__Q23m3d5mdl_cFfff = 0x80169F40;
+	setScale__Q23m3d5mdl_cFP7Point3d = 0x80169F60;
+	calcWorld__Q23m3d5mdl_cFb = 0x80169FB0;
+	bindAnim__Q23m3d5mdl_cFPQ23m3d6banm_cf = 0x80169D90;
+	vf1C__Q3m3d5mdl_cFv = 0x80169D50;
+
+	SetupTextures_Player__FPQ23m3d5mdl_ci = 0x800B3E50;
+	SetupTextures_Map__FPQ23m3d5mdl_ci = 0x800B3F50;
+	SetupTextures_Boss__FPQ23m3d5mdl_ci = 0x800B4050;
+	SetupTextures_Enemy__FPQ23m3d5mdl_ci = 0x800B4170;
+	SetupTextures_MapObj__FPQ23m3d5mdl_ci = 0x800B42B0;
+	SetupTextures_Item__FPQ23m3d5mdl_ci = 0x800B43D0;
+
+	__ct__16mHeapAllocator_cFv = 0x80069020;
+	__dt__16mHeapAllocator_cFv = 0x80069060;
+	link__16mHeapAllocator_cFiPvPCci = 0x800690C0;
+	unlink__16mHeapAllocator_cFv = 0x800690E0;
+
+	__ct__10mTexture_cFUsUs9_GXTexFmt = 0x802C0890;
+	load__10mTexture_cF11_GXTexMapID = 0x802C0970;
+	flushDC__10mTexture_cFv = 0x802C0A30;
+	makeLinearGradient__10mTexture_cFicUsUs8_GXColor8_GXColorb = 0x802C0C40;
+	allocateBuffer__10mTexture_cFPv = 0x802C0FF0;
+	plotPixel__10mTexture_cFUsUs8_GXColor = 0x802C1090;
+
+	SetFontSize__Q34nw4r2ut10CharWriterFff = 0x8022D100;
+
+	__ct__Q34nw4r2ut10TextWriterFv = 0x80230590;
+	__dt__Q34nw4r2ut10TextWriterFv = 0x802305F0;
+	CalcStringWidth__Q34nw4r2ut10TextWriterCFPCwi = 0x80230EE0;
+
+	GameHeaps = 0x803779C8;
+
+	BGDatClass = 0x80429B10;
+	instance__10BGDatClass = 0x80429B10;
+	GetTilesetName__FPvii = 0x800813F0;
+
+	getTilesetName__10BGDatClassFii = 0x800813F0;
+
+	getPointerToTile__12TilemapClassFiiPUib = 0x80083B40;
+
+	IsWideScreen__Fv = 0x800B5430;
+
+	Player_Active = 0x80354BD0;
+	Player_ID = 0x80354BE0;
+	Player_Powerup = 0x80354BF0;
+	Player_Flags = 0x80354C00;
+	Player_Lives = 0x80354C10;
+	Player_Coins = 0x80354C20;
+
+	AllocateMemoryBlock = 0x801626D0;
+	EnsureAllArcsAreLoaded = 0x800DF460;
+	FindRotationController = 0x8002AC00;
+	GetObjectName = 0x80101730;
+	GetObjectParent = 0x801623A0;
+	OSReport = 0x8015F540;
+
+	StagePtr = 0x80429EE8;
+
+	_Z20CreateParentedObjectsPvic = 0x80162910;
+	_Z47CheckIfMenuShouldBeCancelledForSpecifiedWiimotei = 0x800B5320;
+	_Z21StartTitleScreenStagebi = 0x80101750;
+	_Z17CreateChildObjectsPviii = 0x8006CBA0;
+
+	CreateParentedObject__FsPvic = 0x80162910;
+	CheckIfMenuShouldBeCancelledForSpecifiedWiimote__Fi = 0x800B5320;
+	StartTitleScreenStage__Fbi = 0x80101750;
+	CreateChildObject__FsPviii = 0x8006CBA0;
+
+	ObjCreate1 = 0x80162910;
+	ObjCreate2 = 0x80162930;
+	RestoreObjectState = 0x800B0FD0;
+	QueueArcLoad = 0x800DF7C0;
+	RetrieveFileFromArc = 0x800DF100;
+	RetrieveFileFromArcAlt = 0x800DF340;
+
+	SpawnSprite = 0x80064610;
+	StoreObjectState = 0x800B1100;
+	TriggerEventFlag = 0x800E49B0;
+
+	_ZN8SaveFile14CheckIfWritingEv = 0x800E03D0;
+	_Z8SaveGamePvb = 0x8092F330;
+
+	CheckIfWriting__8SaveFileFv = 0x800E03D0;
+	SaveGame__FPvb = 0x8092F330;
+
+	_Z9DVD_Startv = 0x8006A6F0;
+	_Z12DVD_LoadFilePvPcS0_S_ = 0x800DF7C0;
+	_Z12DVD_FreeFilePvPc = 0x800DF0B0;
+	_Z16DVD_StillLoadingPv = 0x800DF460;
+	_Z7DVD_Endv = 0x8006A760;
+
+	DVD_Start__Fv = 0x8006A6F0;
+	DVD_LoadFile__FPvPcPcPv = 0x800DF7C0;
+	DVD_FreeFile__FPvPc = 0x800DF0B0;
+	DVD_StillLoading__FPv = 0x800DF460;
+	DVD_End__Fv = 0x8006A760;
+	DVD_GetFile__FPvPCcPCc = 0x800DF100;
+	DVD_GetFile__FPvPCcPCcPUi = 0x800DF160;
+
+	__ct__12dDvdLoader_cFv = 0x8008F140;
+	__dt__12dDvdLoader_cFv = 0x8008F170;
+	load__12dDvdLoader_cFPCcUcPv = 0x8008F1B0;
+	unload__12dDvdLoader_cFv = 0x8008F310;
+
+	SZSDecompClass = 0x80377864;
+	LZDecompClass = 0x80377870;
+	LHDecompClass = 0x8037787C;
+	LRCDecompClass = 0x80377888;
+	RLDecompClass = 0x80377894;
+	StoreCompressionClassList = 0x8016AEA0;
+	DecompBufferPointer = 0x80429190;
+
+	TryAndFindCompressedFile = 0x8016B8B0;
+
+	_Z22BgTexMng__LoadAnimTilePvisPcS0_c = 0x80087B60; /* same for ntsc */
+	BgTexMng__LoadAnimTile__FPvisPcPcc = 0x80087B60; /* same for ntsc */
+
+	_Z12ActivateWipei = 0x800B0DB0;
+	ActivateWipe__Fi = 0x800B0DB0;
+
+	CurrentDrawFunc = 0x80429C78;
+
+	currentHeap = 0x8042AB30;
+
+	_Z20GameSetup__LoadScenePv = 0x809192A0;
+	_Z9FreeScenei = 0x801646C0;
+	_Z17GameSetupDrawFuncv = 0x809176D0;
+	_Z16WorldMapDrawFuncv = 0x809264B0;
+
+	GameSetup__LoadScene__FPv = 0x809192A0;
+	FreeScene__Fi = 0x801646C0;
+	GameSetupDrawFunc__Fv = 0x809176D0;
+	WorldMapDrawFunc__Fv = 0x809264B0;
+
+	memcpy = 0x80004364;
+	memset = 0x800046B4;
+	strncat = 0x802E1878;
+	strncpy = 0x802E1808;
+	strcmp = 0x802E18C4;
+	sprintf = 0x802E15EC;
+	strrchr = 0x802E1A50;
+
+	wcslen = 0x802E422C;
+
+	IOS_Open = 0x80224A80;
+	IOS_Close = 0x80224C70;
+	IOS_Seek = 0x80225220;
+	IOS_Read = 0x80224E20;
+	IOS_Write = 0x80225030;
+
+	ArchiveHeap = 0x8042A16C;
+	DVDClass = 0x80429D58;
+	GameMgr = 0x80429C9C;
+	SaveFileInstance = 0x80429D60;
+	SaveHandlerInstance = 0x80429CD8;
+	RemoconMng = 0x80429C70;
+	ActiveWiimoteID = 0x8042A184;
+	ActiveWiimote = 0x8042A188;
+
+	MakeScene = 0x80007610;
+	GetRes = 0x800DF100;
+	GetSceneLightInfo = 0x80164980;
+	GetAnmScn = 0x8023A0F0;
+	BindAnmScn = 0x802424E0;
+	AssignAnmScnToLightInfo = 0x802C8650;
+	LoadBlight = 0x80919630;
+	LoadBlmap = 0x80919620;
+
+	_Z23QueryPlayerAvailabilityi = 0x800B4690;
+	_Z12DoStartLevelPvP10StartLevel = 0x800BB700;
+	_Z20SetSomeConditionShitiij = 0x80102650;
+	_Z8WpadShiti = 0x8016F450;
+	_Z32CheckIfContinueShouldBeActivatedv = 0x800B5270;
+	_Z24SearchForIndexOfPlayerIDi = 0x80060110;
+
+	QueryPlayerAvailability__Fi = 0x800B4690;
+	DoStartLevel__FPvP14StartLevelInfo = 0x800BB700;
+	SetSomeConditionShit__FiiUi = 0x80102650;
+	WpadShit__Fi = 0x8016F450;
+	CheckIfContinueShouldBeActivated__Fv = 0x800B5270;
+	SearchForIndexOfPlayerID__Fi = 0x80060110;
+
+	_Z18AllocFromGameHeap1j = 0x801626D0;
+	_Z17FreeFromGameHeap1Pv = 0x80162730;
+
+	AllocFromGameHeap1__FUi = 0x801626D0;
+	FreeFromGameHeap1__FPv = 0x80162730;
+
+	AllocFromGameHeap1 = 0x801626D0;
+
+	_Z19lyt__Layout__LayoutPv = 0x802AC950;
+	_Z15lyt__Layout__dtPvi = 0x802AC990;
+	_Z18lyt__Layout__BuildPvPKvS_ = 0x802ACAC0;
+
+	_Z47nsmbw__ArcResourceAccessor__ArcResourceAccessorPv = 0x802B6430;
+	_Z30nsmbw__ArcResourceAccessor__dtPvi = 0x80006930;
+	_Z31nsmbw__ArcResourceAccessor__SetPvS_PKc = 0x802B6490;
+	_Z39nsmbw__ArcResourceAccessor__GetResourcePvmPKcPm = 0x80006A50;
+
+	_Z23lyt__DrawInfo__DrawInfoPv = 0x802B4B40;
+	_Z17lyt__DrawInfo__dtPvi = 0x802B4BC0;
+
+	_Z15PSMTXTransApplyPA4_fS0_fff = 0x801C0A20;
+
+	_Z13NSMBWLoadFileP15NSMBWFileHandlePciPv = 0x8008F1B0;
+	_Z13NSMBWFreeFileP15NSMBWFileHandle = 0x8008F310;
+
+	_Z16NSMBWBrlan__LoadPvPKcS_S_b = 0x80163C70;
+	_Z16NSMBWBrlan__FreePv = 0x80163DC0;
+
+	_Z24DVDConvertPathToEntrynumPKc = 0x801CA490;
+	_Z11DVDFastOpeniP9DVDHandle = 0x801CA7A0;
+	_Z11DVDReadPrioP9DVDHandlePviii = 0x801CA930;
+	_Z8DVDCloseP9DVDHandle = 0x801CA810;
+
+	DVDConvertPathToEntrynum__FPCc = 0x801CA490;
+	DVDFastOpen__FiP9DVDHandle = 0x801CA7A0;
+	DVDReadPrio__FP9DVDHandlePviii = 0x801CA930;
+	DVDClose__FP9DVDHandle = 0x801CA810;
+
+	DVDConvertPathToEntrynum = 0x801CA490;
+
+	_ZN8SaveFile8GetBlockEi = 0x800E0300;
+	_ZN8SaveFile10GetQSBlockEi = 0x800E0330;
+
+	GetBlock__8SaveFileFi = 0x800E0300;
+	GetQSBlock__8SaveFileFi = 0x800E0330;
+
+	_ZN9SaveBlock17GetLevelConditionEii = 0x800CE320;
+
+	GetLevelCondition__9SaveBlockFii = 0x800CE320;
+
+	_Z20CheckIfWeCantDoStuffv = 0x8076D860;
+	_Z15QueryGlobal5758j = 0x800B3B50;
+
+
+
+
+	CheckIfWeCantDoStuff__Fv = 0x8076D860;
+	QueryGlobal5758__FUi = 0x800B3B50;
+
+	_Z16EGG__Heap__allocmiPv = 0x802B8AD0;
+	_Z15EGG__Heap__freePvS_ = 0x802B8D80;
+
+	EGG__Heap__alloc__FUliPv = 0x802B8AD0;
+	EGG__Heap__free__FPvPv = 0x802B8D80;
+
+	_Z5__nwam = 0x802B9060;
+	_Z19construct_new_arrayPvS_S_ii = 0x802DC5F0;
+	_Z11DeleteArrayPvS_ = 0x802DC920;
+
+	_Z8MTXOrthoPA4_fffffff = 0x801C1160;
+	_Z15GXSetProjectionPA4_fh = 0x801C9650;
+
+	_Z8IOS_OpenPKcj = 0x80224A80;
+	_Z9IOS_WriteiPKvi = 0x80225030;
+	_Z9IOS_Closei = 0x80224C70;
+
+	_Z6strlenPKc = 0x802DC4AC;
+	strlen__FPCc = 0x802DC4AC;
+	strlen = 0x802DC4AC;
+	strcpy = 0x802E1748;
+	strncmp = 0x802E19E0;
+
+	atan = 0x802E7A24;
+	atan2 = 0x802E8420;
+	cos = 0x802E7DCC;
+	sin = 0x802E82D4;
+	ceil = 0x802E7C54;
+	floor = 0x802E7E94;
+
+	LayoutHelper_Link = 0x80163470;
+
+	__nwa__FUl = 0x802B9060;
+
+	_Z19EmbeddedLayout_ctorP6Layout = 0x800C88D0;
+	_Z19EmbeddedLayout_dtorP6Layoutb = 0x800C8920;
+	_Z19EmbeddedLayout_FreeP6Layout = 0x800C98B0;
+	_Z25EmbeddedLayout_LoadArcOldP6LayoutPKcb = 0x800C8C30;
+	_Z25EmbeddedLayout_LoadBrlansP6LayoutPPKci = 0x800C8F30;
+	_Z25EmbeddedLayout_LoadGroupsP6LayoutPPKcPii = 0x800C9070;
+	_Z38EmbeddedLayout_ResetAnimToInitialStateP6Layoutib = 0x800C9350;
+	_Z22EmbeddedLayout_ProcessP6Layout = 0x800C94E0;
+	_Z28EmbeddedLayout_AddToDrawListP6Layout = 0x80163660;
+	_Z32EmbeddedLayout_EnableNonLoopAnimP6Layoutib = 0x800C9270;
+	_Z29EmbeddedLayout_EnableLoopAnimP6Layouti = 0x800C9300;
+	_Z30EmbeddedLayout_DisableAllAnimsP6Layout = 0x800C9480;
+	_Z35EmbeddedLayout_CheckIfAnimationIsOnP6Layouti = 0x800C9590;
+	_Z29EmbeddedLayout_FindPaneByNameP6LayoutPKc = 0x80007300;
+	_Z32EmbeddedLayout_FindTextBoxByNameP6LayoutPKc = 0x80007320;
+
+	EmbeddedLayout_ctor__FP6Layout = 0x800C88D0;
+	EmbeddedLayout_dtor__FP6Layoutb = 0x800C8920;
+	EmbeddedLayout_Free__FP6Layout = 0x800C98B0;
+	EmbeddedLayout_LoadArcOld__FP6LayoutPKcb = 0x800C8C30;
+	EmbeddedLayout_LoadBrlans__FP6LayoutPPCci = 0x800C8F30;
+	EmbeddedLayout_LoadGroups__FP6LayoutPPCcPii = 0x800C9070;
+	EmbeddedLayout_ResetAnimToInitialState__FP6Layoutib = 0x800C9350;
+	EmbeddedLayout_Process__FP6Layout = 0x800C94E0;
+	EmbeddedLayout_AddToDrawList__FP6Layout = 0x80163660;
+	EmbeddedLayout_EnableNonLoopAnim__FP6Layoutib = 0x800C9270;
+	EmbeddedLayout_EnableLoopAnim__FP6Layouti = 0x800C9300;
+	EmbeddedLayout_DisableAllAnims__FP6Layout = 0x800C9480;
+	EmbeddedLayout_CheckIfAnimationIsOn__FP6Layouti = 0x800C9590;
+	EmbeddedLayout_FindPaneByName__FP6LayoutPCc = 0x80007300;
+	EmbeddedLayout_FindTextBoxByName__FP6LayoutPCc = 0x80007320;
+
+	_Z6memsetPvij = 0x800046B4;
+	_Z7sprintfPcPKcz = 0x802E15EC;
+	_Z8snprintfPciPKcz = 0x802E14F8;
+	_Z6strcatPKcS0_ = 0x802E184C;
+
+	_Z6memsetPvij = 0x800046B4;
+	sprintf__FPcPCce = 0x802E15EC;
+	snprintf__FPciPCce = 0x802E14F8;
+	memcmp__FPCvPCvUi = 0x802DEEA8;
+	_Z6strcatPKcS0_ = 0x802E184C;
+
+	_Znaj = 0x802B9020;
+
+	_Z23Hook_GetGXRenderModeObjv = 0x8024D3E0;
+	Hook_GetGXRenderModeObj__Fv = 0x8024D3E0;
+
+	_Z3sinf = 0x802E82D4;
+	_Z3cosf = 0x802E7DCC;
+
+	ARCInitHandle = 0x8019F470;
+	ARCOpen = 0x8019F510;
+	ARCFastOpen = 0x8019F7C0;
+	ARCConvertPathToEntrynum = 0x8019F810;
+	ARCGetStartAddrInMem = 0x8019FC60;
+	ARCGetStartOffset = 0x8019FC80;
+	ARCGetLength = 0x8019FC90;
+	ARCClose = 0x8019FCA0;
+	ARCChangeDir = 0x8019FCB0;
+	ARCOpenDir = 0x8019FD10;
+	ARCReadDir = 0x8019FD90;
+	ARCCloseDir = 0x8019FE50;
+
+	DCStoreRangeNoSync = 0x801AC310;
+
+	VIGetNextField = 0x801BDCF0;
+
+	PSMTXIdentity = 0x801C02E0;
+	PSMTXCopy = 0x801C0310;
+	PSMTXConcat = 0x801C0350;
+	PSMTXInverse = 0x801C05B0;
+	PSMTXRotRad = 0x801C0780;
+	PSMTXRotAxisRad = 0x801C0960;
+	PSMTXTrans = 0x801C09E0;
+	PSMTXTransApply = 0x801C0A20;
+	PSMTXScale = 0x801C0A70;
+	PSMTXScaleApply = 0x801C0AA0;
+	PSMTXMultVec = 0x801C0F70;
+
+	PSVECAdd = 0x801C1200;
+	PSVECSubtract = 0x801C1230;
+	PSVECScale = 0x801C1260;
+	PSVECNormalize = 0x801C1280;
+	/*PSVECSquareMag*/
+	PSVECMag = 0x801C12D0;
+	PSVECDotProduct = 0x801C1320;
+	PSVECCrossProduct = 0x801C1340;
+	PSVECSquareDistance = 0x801C1380;
+	PSVECDistance = 0x801C1460;
+
+	C_MTXLookAt = 0x801C0BB0;
+	C_MTXFrustum = 0x801C0FD0;
+	C_MTXPerspective = 0x801C1070;
+	C_MTXOrtho = 0x801C1160;
+
+	GXSetVtxDesc = 0x801C35D0;
+	GXClearVtxDesc = 0x801C3E80;
+	GXSetVtxAttrFmt = 0x801C3EC0;
+	GXSetArray = 0x801C4590;
+	GXInvalidateVtxCache = 0x801C45D0;
+	GXSetTexCoordGen2 = 0x801C45E0;
+	GXSetNumTexGens = 0x801C4830;
+	GXBegin = 0x801C5380;
+	GXSetCullMode = 0x801C5670;
+	GXInitLightAttn = 0x801C6240;
+	GXInitLightSpot = 0x801C6280;
+	GXInitLightDistAttn = 0x801C6420;
+	GXInitLightPos = 0x801C64F0;
+	GXInitLightDir = 0x801C6520;
+	GXInitSpecularDir = 0x801C6570;
+	GXInitLightColor = 0x801C6680;
+	GXLoadLightObjImm = 0x801C6690;
+	GXSetChanAmbColor = 0x801C6710;
+	GXSetChanMatColor = 0x801C67F0;
+	GXSetNumChans = 0x801C68D0;
+	GXSetChanCtrl = 0x801C6900;
+	GXInitTexObj = 0x801C6BA0;
+	GXInitTexObjCI = 0x801C6DB0;
+	GXInitTexObjLOD = 0x801C6E00;
+	GXInitTexObjTlut = 0x801C6F30;
+	GXInitTexObjWrapMode = 0x801C6F10;
+	GXLoadTexObj = 0x801C72D0;
+	GXInvalidateTexAll = 0x801C74D0;
+	GXSetNumIndStages = 0x801C7F20;
+	GXSetTevDirect = 0x801C7F40;
+	GXSetTevOp = 0x801C8060;
+	GXSetTevColorIn = 0x801C8100;
+	GXSetTevAlphaIn = 0x801C8140;
+	GXSetTevColorOp = 0x801C8180;
+	GXSetTevAlphaOp = 0x801C81E0;
+	GXSetTevColor = 0x801C8240;
+	GXSetTevColorS10 = 0x801C82A0;
+	GXSetTevKColor = 0x801C8310;
+	GXSetTevKColorSel = 0x801C8370;
+	GXSetTevKAlphaSel = 0x801C83C0;
+	GXSetTevSwapMode = 0x801C8410;
+	GXSetTevSwapModeTable = 0x801C8450;
+	GXSetAlphaCompare = 0x801C84D0;
+	GXSetTevOrder = 0x801C85A0;
+	GXSetNumTevStages = 0x801C8700;
+	GXSetFog = 0x801C8730;
+	GXSetFogRangeAdj = 0x801C8AC0;
+	GXSetBlendMode = 0x801C8BD0;
+	GXSetColorUpdate = 0x801C8C20;
+	GXSetAlphaUpdate = 0x801C8C50;
+	GXSetZMode = 0x801C8C80;
+	GXSetZCompLoc = 0x801C8CC0;
+	GXSetDither = 0x801C8DA0;
+	GXSetDstAlpha = 0x801C8DD0;
+	GXCallDisplayList = 0x801C93F0;
+	GXSetProjection = 0x801C9650;
+	GXLoadPosMtxImm = 0x801C9750;
+	GXLoadNrmMtxImm = 0x801C97D0;
+	GXSetCurrentMtx = 0x801C9870;
+	GXSetViewportJitter = 0x801C99E0;
+	GXSetViewport = 0x801C9A20;
+	GXDrawDone = 0x801C4CB0;
+
+	GXWGFifo = 0xCC008000;
+
+	TPLBind = 0x80227FE0;
+	TPLGet = 0x80228100;
+
+	/* Gakenoko stuff */
+	mHeapAllocatorSubclass_Link = 0x800690C0;
+	mHeapAllocatorSubclass_UnLink = 0x800690E0;
+
+	GetResMdl = 0x80239C40;
+	GetResAnmChr = 0x80239EC0;
+	GetResAnmVis = 0x80239F30;
+	GetResAnmTexPat = 0x8023A010;
+	GetResAnmTexSrt = 0x8023A080;
+
+	GetResAnmChr__Q34nw4r3g3d7ResFileCFPCc = 0x80239EC0;
+	GetResAnmVis__Q34nw4r3g3d7ResFileCFPCc = 0x80239F30;
+	GetResAnmTexPat__Q34nw4r3g3d7ResFileCFPCc = 0x8023A010;
+	GetResAnmTexSrt__Q34nw4r3g3d7ResFileCFPCc = 0x8023A080;
+
+	__vt__Q23EGG9Allocator = 0x8034F9E0;
+
+	__ct__12mAllocator_cFv = 0x8016A3F0;
+	__vt__12mAllocator_c = 0x80329424;
+	__dt__12mAllocator_cFv = 0x8016A440;
+	setup__12mAllocator_cFPvi = 0x8016A4A0;
+
+	__vt__Q23m3d6banm_c = 0x80329340;
+	__dt__Q23m3d6banm_cFv = 0x80167CD0;
+	detach__Q23m3d6banm_cFv = 0x80167D40;
+	process__Q23m3d6banm_cFv = 0x8002A1F0;
+	setupHeap__Q23m3d6banm_cFv = 0x80167DB0;
+	testAnmFlag__Q23m3d6banm_cFv = 0x80167E70;
+	getCurrentFrame__Q23m3d6banm_cFv = 0x80167E90;
+	setCurrentFrame__Q23m3d6banm_cFf = 0x80167EB0;
+	getUpdateRate__Q23m3d6banm_cFv = 0x80167ED0;
+	setUpdateRate__Q23m3d6banm_cFf = 0x80167EF0;
+	__ct__Q23m3d6fanm_cFv = 0x80168B20;
+	__vt__Q23m3d6fanm_c = 0x80329388;
+	__dt__Q23m3d6fanm_cFv = 0x80168B90;
+	process__Q23m3d6fanm_cFv = 0x80168BF0;
+	setCurrentFrame__Q23m3d6fanm_cFf = 0x80168DF0;
+	isAnimationDone__Q23m3d6fanm_cFv = 0x80168E30;
+	querySomething__Q23m3d6fanm_cFv = 0x80168EF0;
+
+	__vt__Q23m3d8anmChr_c = 0x80303228;
+	__dt__Q23m3d8anmChr_cFv = 0x800260C0;
+	vf0C__Q23m3d8anmChr_cFv = 0x8002A210;
+	setup__Q23m3d8anmChr_cFQ34nw4r3g3d6ResMdlQ34nw4r3g3d9ResAnmChrP12mAllocator_cPUi = 0x80164EE0;
+	bind__Q23m3d8anmChr_cFPQ23m3d5mdl_cQ34nw4r3g3d9ResAnmChri = 0x80165000;
+	internalBind__Q23m3d8anmChr_cFv = 0x80165090;
+
+	/* m3d::anmVis_c */
+	__vt__Q23m3d8anmVis_c = 0x80AD7A58;
+	__dt__Q23m3d8anmVis_cFv = 0x809B1990;
+	vf0C__Q23m3d8anmVis_cFv = 0x809B3520;
+	setup__Q23m3d8anmVis_cFQ34nw4r3g3d6ResMdlQ34nw4r3g3d9ResAnmVisP12mAllocator_cPUi = 0x80167A50;
+	bind__Q23m3d8anmVis_cFPQ23m3d5mdl_cQ34nw4r3g3d9ResAnmVisi = 0x80167B70;
+	internalBind__Q23m3d8anmVis_cFv = 0x80167C60;
+
+	__vt__Q23m3d11anmTexPat_c = 0x803292B0;
+	__dt__Q23m3d11anmTexPat_cFv = 0x80166880;
+	detach__Q23m3d11anmTexPat_cFv = 0x801668F0;
+	setup__Q23m3d11anmTexPat_cFQ34nw4r3g3d6ResMdlQ34nw4r3g3d12ResAnmTexPatP12mAllocator_cPUii = 0x80166640;
+	bindEntry__Q23m3d11anmTexPat_cFv = 0x801669E0;
+	bindEntry__Q23m3d11anmTexPat_cFPQ23m3d5mdl_cPQ34nw4r3g3d12ResAnmTexPatii = 0x801669E0;
+	process__Q23m3d11anmTexPat_cFv = 0x80166BE0;
+	processOneEntry__Q23m3d11anmTexPat_cFv = 0x80166C90;
+	getFrameForEntry__Q23m3d11anmTexPat_cFv = 0x80166CF0;
+	setFrameForEntry__Q23m3d11anmTexPat_cFfi = 0x80166CF0;
+	getUpdateRateForEntry__Q23m3d11anmTexPat_cFv = 0x80166D10;
+	setUpdateRateForEntry__Q23m3d11anmTexPat_cFfi = 0x80166D20;
+	isEntryAnimationDone__Q23m3d11anmTexPat_cFv = 0x80166D30;
+	queryEntrySomething__Q23m3d11anmTexPat_cFv = 0x80166D40;
+	setEntryByte34__Q23m3d11anmTexPat_cFUci = 0x80166D50;
+	getEntryField28__Q23m3d11anmTexPat_cFv = 0x80166D70;
+	vf0C__Q23m3d11anmTexPat_cFv = 0x80166D90;
+
+	AllocSizeForAnmTexSrt = 0x80167150;
+	setup__Q23m3d11anmTexSrt_cFQ34nw4r3g3d6ResMdlQ34nw4r3g3d12ResAnmTexSrtP12mAllocator_cPUii = 0x80167230;
+	__vt__Q23m3d11anmTexSrt_c = 0x803292E0;
+	__dt__Q23m3d11anmTexSrt_cFv = 0x801674B0;
+	detach__Q23m3d11anmTexSrt_cFv = 0x80167520;
+	bindEntry__Q23m3d11anmTexSrt_cFPQ23m3d5mdl_cQ34nw4r3g3d12ResAnmTexSrtii = 0x80167610;
+	sub80167a80__Q23m3d11anmTexSrt_cFv = 0x80167750;
+	process__Q23m3d11anmTexSrt_cFv = 0x80167810;
+	processOneEntry__Q23m3d11anmTexSrt_cFi = 0x801678C0;
+	getFrameForEntry__Q23m3d11anmTexSrt_cFi = 0x80167920;
+	setFrameForEntry__Q23m3d11anmTexSrt_cFfi = 0x80167930;
+	getUpdateRateForEntry__Q23m3d11anmTexSrt_cFi = 0x80167940;
+	setUpdateRateForEntry__Q23m3d11anmTexSrt_cFfi = 0x80167950;
+	isEntryAnimationDone__Q23m3d11anmTexSrt_cFi = 0x80167960;
+	setEntryByte34__Q23m3d11anmTexSrt_cFUci = 0x80167970;
+	getEntryField28__Q23m3d11anmTexSrt_cFi = 0x80167990;
+	getEntryField2C__Q23m3d11anmTexSrt_cFi = 0x801679B0;
+	vf0C__Q23m3d11anmTexSrt_cFv = 0x801679D0;
+
+	__vt__Q23m3d10anmTexSrt_c__child_cFv = 0x803292F8;
+	__dt__Q23m3d10anmTexSrt_c__child_cFv = 0x801679E0;
+	vf0C__Q23m3d10anmTexSrt_c__child_cFv = 0x80167A40;
+
+
+	m3d__mdl_c__DoStuff = 0x80169BA0;
+
+	__ashldi3 = 0x802DCFFC;
+
+
+	_Z13FindActorByIDj = 0x80162B10;
+	FindActorByID__FUi = 0x80162B10;
+
+	EventTable = 0x80429D98;
+	dBgActorManager = 0x80429AF8;
+
+	ContinueBgActorSpawn = 0x8007EA9C;
+
+	SomeModelAnimationClass_Setup = 0x80164EE0;
+
+	EGGTSystem_Pointer = 0x80429DAC;
+
+	dSys_c__RootHeapMEM1 = 0x80429DB0;
+	dSys_c__RootHeapMEM2 = 0x80429DB4;
+
+	BG_GM_ptr = 0x80429AF0;
+	instance__7dBgGm_c = 0x80429AF0;
+
+	BgActorDefs = 0x80429AFC;
+
+	_Z16GetPointerToTileP9BG_GM_haxtttPsb = 0x80077520;
+	GetPointerToTile__FP9BG_GM_haxUsUsUsPsb = 0x80077520;
+
+	GameHeap1 = 0x803779CC;
+	GameHeap2 = 0x803779D0;
+	WiimotePtr1 = 0x80377A08;
+
+	continueFromFlagObjCheck = 0x807EB9F4;
+	returnFromFlagObjCheck = 0x807EBA0C;
+
+	Global5758 = 0x80429C68;
+
+	EggControllerClassPtrMaybe = 0x80429C70;
+
+	MEMGetTotalFreeSizeForExpHeap = 0x801D45F0;
+
+	sub_80064BD0 = 0x80064BD0;
+	sub_80166970 = 0x80166640;
+	sub_80166D10 = 0x801669E0;
+
+	daEnGakeNoko_c__StateID_FoolMove = 0x80B144C0;
+
+	EnItem_BindAnimation_Continued = 0x80A28AE4;
+	dAcPy_c__ChangePowerupWithAnimation = 0x801458D0;
+	PlayerProjectileShooting = 0x8013B9A0;
+
+	PlayPlayerSound = 0x80057E70;
+	CreateActor = 0x80064610;
+	Actor_SearchByName = 0x80162B60;
+
+	daEnItem_c__GetWhetherPlayerCanGetPowerupOrNot = 0x80A2B760;
+
+	returnFromGPSFASixth = 0x80141CC8;
+
+	continuePlumberSetPowerupTexture = 0x800CA5AC;
+	doneSettingThePowerupTexture = 0x800D46CC;
+	doneSettingThePowerupTexture2 = 0x80141244;
+
+	continueToadPowerupSet = 0x800BCF04;
+
+	continuePlumberSetPowerupTextureDebug = 0x800CA544;
+
+	returnFromPowerupSoundChange = 0x8014110C;
+
+	ExitFromTileGodHack = 0x807E1414;
+
+	SomeTable_802F5440 = 0x802F4F60;
+	SomeTable_802F5580 = 0x802F50A0;
+	SomeTable_802F56C0 = 0x802F51E0;
+
+	BlahTable = 0x80324FC8;
+
+	TileTable = 0x802EF7D8;
+
+	CurrentLevel = 0x803159BD;
+	CurrentWorld = 0x803159BC;
+	CurrentStartedArea = 0x803159B6; /*WRONG*/
+	CurrentStartedEntrance = 0x803159B7; /*WRONG*/
+
+	GetRandomSeed = 0x800B2EC0;
+	RandomSeed = 0x80429C64;
+
+	MakeRandomNumber__Fi = 0x800B2EE0;
+	MakeRandomNumberForTiles__Fi = 0x801611B0;
+
+	StrangeReplayValue1 = 0x804276AE;
+	StrangeReplayValue2 = 0x80429A89;
+	StrangeReplayValue3 = 0x80429A8A;
+
+	OSGetTime = 0x801B5D90;
+	OSTicksToCalendarTime = 0x801B5E90;
+	snprintf = 0x802E14F8;
+	continueFromReplayHookStart = 0x80924424;
+	continueFromReplayEndHook = 0x801020AC;
+	returnFromRecorder = 0x800B5FF0;
+	GetSomeGlobalClass = 0x801092C0;
+	SomeUnknownClass5408 = 0x80429FB8;
+	SomeWipeClass = 0x8042A160;
+	QueryGlobal5758 = 0x800B3B50;
+
+	SoundClassRelated = 0x80429A7C;
+	BufferToCheckIfPlaying = 0x8042A1A8;
+	StopSoundBasic = 0x801952B0;
+	StopSoundRelated = 0x80195D20;
+
+	GetHermiteCurveValue = 0x8017D330;
+	GetHermiteCurveValue__FfP10HermiteKeyUi = 0x8017D330;
+
+	SpawnEffect = 0x8016C6A0;
+
+	__ct__Q23EGG6EffectFv = 0x802D78B0;
+
+	__vt__Q23mEf8effect_c = 0x80329788;
+
+	__vt__Q23mEf3es2 = 0x803296C0;
+	__dt__Q23mEf3es2Fv = 0x80025F60;
+
+	RectanglesOverlap__FP7Point3dP7Point3dP7Point3dP7Point3d = 0x800B3100;
+
+	fmod = 0x802E8424;
+
+	/* MEGA TESTS */
+	usedForDeterminingStatePress_or_playerCollision = 0x800964A0;
+	DoStuffAndMarkDead = 0x80097170;
+	SmoothRotation = 0x8015F300;
+	ClassAt1EC_Init = 0x8006D090;
+	HandlesOverallScale = 0x8009EA50;
+	posIsInZone = 0x800B5660;
+	ScreenPositionClass = 0x80429D28;
+	ShakeScreen = 0x800D8BE0;
+
+	/* daEnemy_c */
+	/*FIXME bad vtable address :( */
+	//__vt__9daEnemy_c = 0x80AE7B68;
+	_vf58__9daEnemy_cFv = 0x809A4DA0;
+	_vf5C__9daEnemy_cFv = 0x809A4D90;
+	_vf68__9daEnemy_cFv = 0x809A4DE0;
+	ptrToWhichPlayer__9daEnemy_cFv = 0x809A2E10;
+	_vf74__9daEnemy_cFv = 0x809A4DD0;
+	_vf7C__9daEnemy_cFv = 0x809A4DC0;
+	_vfB8__9daEnemy_cFv = 0x809A4DB0;
+	_vf228__9daEnemy_cFv = 0x809A4E20;
+	_vf23C__9daEnemy_cFv = 0x809A4E10;
+	_vf240__9daEnemy_cFv = 0x809A4E00;
+	_vf244__9daEnemy_cFv = 0x809A4DF0;
+
+	/* daEnDosun_c */
+	__ct_11daEnDosun_cFv = 0x809F5390;
+	__ct_14daEnBigDosun_cFv = 0x809F5420;
+	__vt__11daEnDosun_c = 0x80AE7B28;
+	onCreate__11daEnDosun_cFv = 0x809F54B0;
+	onDelete__11daEnDosun_cFv = 0x809F5890;
+	onExecute__11daEnDosun_cFv = 0x809F5710;
+	onDraw__11daEnDosun_cFv = 0x809F5760;
+	__dt_11daEnDosun_cFv = 0x809F6A00;
+	kill__11daEnDosun_cFv = 0x809F69D0;
+	killedByLevelClear__11daEnDosun_cFv = 0x809F60D0;
+	collisionCat3_StarPower__11daEnDosun_cFP13ActivePhysicsP13ActivePhysics = 0x809F5910;
+	_vf108__11daEnDosun_cFP13ActivePhysicsP13ActivePhysics = 0x809F58A0;
+	collisionCatD_GroundPound__11daEnDosun_cFP13ActivePhysicsP13ActivePhysics = 0x809F69F0;
+	_vf110__11daEnDosun_cFP13ActivePhysicsP13ActivePhysics = 0x809F5950;
+	collisionCat7_WMWaggleWater__11daEnDosun_cFP13ActivePhysicsP13ActivePhysics = 0x809F69E0;
+	collisionCat9_RollingObject__11daEnDosun_cFP13ActivePhysicsP13ActivePhysics = 0x809F6960;
+	collisionCat1_Fireball_E_Explosion__11daEnDosun_cFP13ActivePhysicsP13ActivePhysics = 0x809F69A0;
+	collisionCat2_IceBall_15_YoshiIce__11daEnDosun_cFP13ActivePhysicsP13ActivePhysics = 0x809F6970;
+	_vf144__11daEnDosun_cFi = 0x809F59E0;
+	DieFall_Begin__11daEnDosun_cFv = 0x809F66C0;
+	DieFall_Execute__11daEnDosun_cFv = 0x809F67D0;
+	DieFall_End__11daEnDosun_cFv = 0x809F67C0;
+	Ice_Begin__11daEnDosun_cFv = 0x809F68E0;
+	Ice_Execute__11daEnDosun_cFv = 0x809F6950;
+	Ice_End__11daEnDosun_cFv = 0x809F6940;
+	CreateIceActors__11daEnDosun_cFv = 0x809F5B20;
+	setupBodyModel__11daEnDosun_cFv = 0x809F5CB0;
+	s_809F6530__11daEnDosun_cFv = 0x809F5DF0;
+	spawnEffects__11daEnDosun_cFv = 0x809F5F60;
+	StateID_UpWait__11daEnDosun_c = 0x80B13C50;
+	StateID_DownMoveWait__11daEnDosun_c = 0x80B13C90;
+	StateID_PuruMove__11daEnDosun_c = 0x80B13CD0;
+	StateID_DownMove_Kameck__11daEnDosun_c = 0x80B13D10;
+	StateID_DownMove__11daEnDosun_c = 0x80B13D50;
+	StateID_DownWait__11daEnDosun_c = 0x80B13D90;
+	StateID_UpMove__11daEnDosun_c = 0x80B13DD0;
+	StateID_DieFall__11daEnDosun_c = 0x80B13E0C;
+	StateID_Ice__11daEnDosun_c = 0x80B13E4C;
+
+	SpawnThwompEffects = 0x809F5F60;
+
+	HurtMarioBecauseOfBeingSquashed = 0x80056370;
+
+
+	.text : {
+		FILL (0)
+
+		__text_start = . ;
+		*(.init)
+		*(.text)
+		__ctor_loc = . ;
+		*(.ctors)
+		__ctor_end = . ;
+		*(.dtors)
+		*(.rodata)
+		/**(.sdata)*/
+		*(.data)
+		/**(.sbss)*/
+		*(.bss)
+		*(.fini)
+		*(.rodata.*)
+		__text_end  = . ;
+	}
+}
diff --git a/makeSummerSun b/makeSummerSun
index a8b665b..5add3fb 100755
--- a/makeSummerSun
+++ b/makeSummerSun
@@ -13,6 +13,10 @@ rm ~/Dropbox/NEWERsmbw/Summer\ Sun/SystemUS_2.bin
 rm ~/Dropbox/NEWERsmbw/Summer\ Sun/DLCodeUS_2.bin
 rm ~/Dropbox/NEWERsmbw/Summer\ Sun/DLRelocsUS_2.bin
 
+rm ~/Dropbox/NEWERsmbw/Summer\ Sun/SystemJP_1.bin
+rm ~/Dropbox/NEWERsmbw/Summer\ Sun/DLCodeJP_1.bin
+rm ~/Dropbox/NEWERsmbw/Summer\ Sun/DLRelocsJP_1.bin
+
 python tools/mapfile_tool.py
 python tools/kamek.py SummerSun.yaml --no-rels --use-mw --use-wine --gcc-type=/usr/local/devkitPRO/devkitPPC/bin/powerpc-eabi --mw-path=tools
 if [ "$?" = "0" ]; then
@@ -33,5 +37,9 @@ mv NewerASM/ntsc2_loader.bin ~/Dropbox/NEWERsmbw/Summer\ Sun/SystemUS_2.bin
 mv NewerASM/ntsc2_dlcode.bin ~/Dropbox/NEWERsmbw/Summer\ Sun/DLCodeUS_2.bin
 mv NewerASM/ntsc2_dlrelocs.bin ~/Dropbox/NEWERsmbw/Summer\ Sun/DLRelocsUS_2.bin
 
+mv NewerASM/jpn_loader.bin ~/Dropbox/NEWERsmbw/Summer\ Sun/SystemJP_1.bin
+mv NewerASM/jpn_dlcode.bin ~/Dropbox/NEWERsmbw/Summer\ Sun/DLCodeJP_1.bin
+mv NewerASM/jpn_dlrelocs.bin ~/Dropbox/NEWERsmbw/Summer\ Sun/DLRelocsJP_1.bin
+
 echo Built all!
 
diff --git a/poweruphax.yaml b/poweruphax.yaml
index 3a9aa21..29f2636 100644
--- a/poweruphax.yaml
+++ b/poweruphax.yaml
@@ -1,5 +1,5 @@
 ---
-source_files: [../src/poweruphax.S]
+source_files: [../src/poweruphax.S, ../src/poweruphax.cpp]
 hooks:
   - name: GetInfoFromDumbTable
     type: branch_insn
@@ -282,6 +282,11 @@ hooks:
     addr_pal: 0x80ACF9F4
     data: '0008820e'
 
+  - name: HammerBigThwompBounce
+    type: add_func_pointer
+    src_addr_pal: 0x80AE8360
+    target_func: 'ThwompHammer(dEn_c *, ActivePhysics *, ActivePhysics *)'
+
   - name: HammerBigBoo
     type: patch
     addr_pal: 0x80AD4AA0
@@ -292,6 +297,11 @@ hooks:
     addr_pal: 0x80AD4AA4
     data: '20020000'
 
+  - name: HammerBigBooBounce
+    type: add_func_pointer
+    src_addr_pal: 0x80B0AE20
+    target_func: 'BooHammer(dEn_c *, ActivePhysics *, ActivePhysics *)'
+
   - name: HammerAmp
     type: patch
     addr_pal: 0x80ACE17C
@@ -312,6 +322,11 @@ hooks:
     addr_pal: 0x80AD4F48
     data: '00088a1e'
 
+  - name: HammerBigUrchinBounce
+    type: add_func_pointer
+    src_addr_pal: 0x80B0CF40
+    target_func: 'UrchinHammer(dEn_c *, ActivePhysics *, ActivePhysics *)'
+
   - name: HammerChainChomp
     type: patch
     addr_pal: 0x80AD5214
@@ -367,6 +382,10 @@ hooks:
     addr_pal: 0x80AD5538
     data: '003AFFFE'
 
+  - name: HammerMicroGoomba
+    type: patch
+    addr_pal: 0x80ACD9A0
+    data: '0008A2BE'
 
 #  - name: HammerClam
 #    type: patch
diff --git a/singAlong.yaml b/singAlong.yaml
new file mode 100644
index 0000000..7c9ba66
--- /dev/null
+++ b/singAlong.yaml
@@ -0,0 +1,39 @@
+---
+# SingAlong = WM_KILLERBULLET (0x276)
+# SongBlock = WM_KILLER       (0x275)
+
+source_files: [../src/bonusRoom.cpp]
+
+hooks:
+
+  ################################################
+  # HOOKS FOR Sing Along
+  ################################################
+  - name: SingAlongBuild
+    type: add_func_pointer
+    src_addr_pal: 0x8098369C
+    target_func: 'dSingAlong::build(void)'
+
+  - name: UpdateSingAlongSpriteInfo
+    type: patch
+    addr_pal: 0x8030A598
+    data: '0276 0000 00000010 00000010  00000000 00000000 00000200 00000200  0000 0000 0200 0200 0000 0000'
+    # 0x8030A340 + sprite num * 0x28 == offset
+
+  - name: SingAlongSpriteFileInfo
+    type: add_func_pointer
+    src_addr_pal: 0x8031AB88
+    target_func: 'SAarcNameList'
+
+    # 0x8031AB4C + sprite num * 0x4 == offset
+    # That offset stores a pointer to a table of pointers to strings, followed by four bytes of padding
+    # Each string is an arcname to load
+
+
+  ################################################
+  # HOOKS FOR Song Block
+  ################################################
+  - name: SongBlockBuild
+    type: add_func_pointer
+    src_addr_pal: 0x809834F0
+    target_func: 'dSongBlock::build(void)'
diff --git a/spritetex.yaml b/spritetex.yaml
index 6d38857..c852ce9 100644
--- a/spritetex.yaml
+++ b/spritetex.yaml
@@ -293,6 +293,13 @@ hooks:
     target_func: 'TEX_Goal'
 
 
+  - name: TEX_ColorBlock
+    type: branch_insn
+    branch_type: bl
+    src_addr_pal: 0x800BEBD4
+    target_func: 'TEX_ColorBlock'
+
+
 #  - name: TEX_StretchMush
 #    type: branch_insn
 #    branch_type: bl
@@ -404,11 +411,11 @@ hooks:
     target_func: 'TEX_PokeyC'
 
 
-  - name: TEX_PokeyNoSand
-    type: branch_insn
-    branch_type: bl
-    src_addr_pal: 0x80A9E7A8
-    target_func: 'TEX_PokeyNoSand'
+  # - name: TEX_PokeyNoSand
+  #   type: branch_insn
+  #   branch_type: bl
+  #   src_addr_pal: 0x80A9E7A8
+  #   target_func: 'TEX_PokeyNoSand'
 
 
  # - name: TEX_PokeySnowmanPos
@@ -418,6 +425,19 @@ hooks:
  #   target_func: 'TEX_PokeySnowmanPos'
 
 
+  - name: TEX_SnowmanSandToSnow
+    type: branch_insn
+    branch_type: bl
+    src_addr_pal: 0x80A9E7D0
+    target_func: 'TEX_SnowmanSandToSnow'
+
+  - name: TEX_SnowmanSandToSnowB
+    type: branch_insn
+    branch_type: bl
+    src_addr_pal: 0x80A9EA00
+    target_func: 'TEX_SnowmanSandToSnowB'
+
+
 #  - name: TEX_PokeySnowmanPosZ
 #    type: patch
 #    data: '60000000'
diff --git a/src/bonusRoom.cpp b/src/bonusRoom.cpp
new file mode 100644
index 0000000..6b61f27
--- /dev/null
+++ b/src/bonusRoom.cpp
@@ -0,0 +1,708 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+#include <sfx.h>
+#include <stage.h>
+
+extern "C" bool SpawnEffect(const char*, int, Vec*, S16Vec*, Vec*);
+extern "C" void *PlaySound(dStageActor_c *, int soundID);
+extern "C" void *PlaySoundAsync(dStageActor_c *, int soundID);
+extern "C" void *StopBGMMusic();
+extern "C" void *StartBGMMusic();
+
+int Songs[2][4][15][2] = { 
+ 
+	{ // Song 1 -
+		{{3,0},{3,15},{3,45},{1,75},{3,90},{5,120},{0,0}}, // First number is the note, Second is timing: 30 is one quarter note at 120 bpm, 0,0 ends the sequence
+		{{8,0},{5,22},{3,45},{6,67},{7,82},{6,97},{6,105},{0,0}},
+		{{1,0},{1,7},{1,22},{1,37},{2,45},{3,60},{1,67},{7,82},{6,90},{0,0}},
+		{{1,0},{1,7},{1,22},{1,37},{2,45},{3,52},{0,0}}
+	},
+
+	{ // Song 2 -
+		{{1,30},{2,60},{3,90},{4,120}},
+		{},
+		{},
+		{}		
+	}
+
+};
+
+
+const char* Prizes[10][4] = { 
+	{ "I_kinoko", 		"g3d/I_kinoko.brres", 			"I_kinoko", 			"wait2" },
+	{ "I_fireflower", 	"g3d/I_fireflower.brres", 		"I_fireflower", 		"wait2" },
+	{ "I_iceflower", 	"g3d/I_iceflower.brres", 		"I_iceflower", 			"wait2" },
+	{ "I_penguin", 		"g3d/I_penguin.brres", 			"I_penguin", 			"wait2" },
+	{ "I_propeller", 	"g3d/I_propeller_model.brres", 	"I_propeller_model", 	"wait2" },
+	{ "I_kinoko_bundle","g3d/I_mini_kinoko.brres", 		"I_mini_kinoko", 		"wait2" },
+	{ "I_hammer", 		"g3d/I_hammer.brres", 			"I_hammer", 			"wait2" },
+	{ "I_star", 		"g3d/I_star.brres", 			"I_star", 				"wait2" },
+	{ "I_kinoko_bundle","g3d/I_life_kinoko.brres", 		"I_life_kinoko", 		"wait2" },
+	{ "obj_coin", 		"g3d/obj_coin.brres", 			"obj_coin", 			"wait2" }
+};
+
+int PrizePacks[2][4] = { // Numbers list prizes for each level
+	// 0 = Mushroom
+	// 1 = Fireflower
+	// 2 = Iceflower
+	// 3 = Penguin
+	// 4 = Propeller
+	// 5 = MiniShroom
+	// 6 = Starman
+	// 7 = Hammer
+	// 8 = 1-ups
+	// 9 = Coins
+
+	{9, 0, 8, 1},
+	{0, 0, 8, 5}
+};
+
+int Notes[9] = {
+	SE_EMY_PATAMET_STEP, 
+	SE_EMY_PATAMET_STEP_2, 
+	SE_EMY_PATAMET_STEP_3, 
+	SE_EMY_PATAMET_STEP_4, 
+	SE_EMY_PATAMET_STEP_5, 
+	SE_EMY_PATAMET_STEP_6, 
+	SE_EMY_PATAMET_STEP_7, 
+	SE_EMY_PATAMET_STEP_8, 
+	SE_EMY_PATAMET_COMPLETE
+};
+
+
+
+const char* SAarcNameList [] = {
+	"obj_coin",
+	"I_hammer",
+	"I_star",
+	"light_block",
+	"light_block_color",
+	"I_kinoko_bundle",
+	NULL	
+};
+
+class dSongBlock;
+
+class dSingAlong : public dStageActor_c {
+	public:
+		static dSingAlong *instance;
+		static dSingAlong *build();
+
+		void RegisterNote(int note);
+		void addPowerups();
+
+		int onCreate();
+		int onDelete();
+		int onExecute();
+		int onDraw();
+
+		int beforeExecute() { return true; }
+		int afterExecute(int) { return true; }
+
+		dSingAlong() : state(this, &StateID_Intro) { }
+
+		mHeapAllocator_c allocator;
+		nw4r::g3d::ResFile resFile[4];
+		m3d::mdl_c pModel[4];
+		m3d::anmChr_c pAnim[4];
+		Vec prizePos[4];
+		Vec prizeScale[4];
+
+		HermiteKey keysX[0x10];
+		unsigned int Xkey_count;
+		HermiteKey keysY[0x10];
+		unsigned int Ykey_count;
+		HermiteKey keysS[0x10];
+		unsigned int Skey_count;
+
+
+		dSongBlock *Cblock;
+		dSongBlock *Dblock;
+		dSongBlock *Eblock;
+		dSongBlock *Fblock;
+		dSongBlock *Gblock;
+		dSongBlock *Ablock;
+		dSongBlock *Bblock;
+
+
+		// you might get casting issues. due to C++. blah = (int (*)[15][2])BigArray; fixes it
+		// int (*song)[4][15][2];
+		// int (*prizes)[4];
+		int song;
+		int prize;
+ 		int chorus;
+		// int (*currentNote)[2];
+		int currentNote;
+		int endNote;
+		int timer;
+		int counter;
+		int Powerups[10];
+		int isResponding;
+
+		dStateWrapper_c<dSingAlong> state;
+
+		// Intro, Call, Response, Display Prize, Failure, Win, Collect Prizes
+		USING_STATES(dSingAlong);
+		DECLARE_STATE(Intro);
+		DECLARE_STATE(Call);
+		DECLARE_STATE(Response);
+		DECLARE_STATE(Prize);
+		DECLARE_STATE(Failure);
+		DECLARE_STATE(Win);
+};
+
+dSingAlong *dSingAlong::instance = 0;
+dSingAlong *dSingAlong::build() {
+	OSReport("Building Sing Along.");
+	void *buffer = AllocFromGameHeap1(sizeof(dSingAlong));
+	dSingAlong *c = new(buffer) dSingAlong;
+
+	instance = c;
+	return c;
+}
+
+
+/*****************************************************************************/
+// Events
+int dSingAlong::onCreate() {
+
+	OSReport("Creating the Sing Along gang.");
+	// Load in the settings
+	// this->song = Songs;
+	this->song = this->settings & 0xF;
+	// this->prizes = PrizePacks;
+	this->prize = (this->settings >> 4) & 0xF;
+	this->chorus = -1;
+	// this->currentNote = song[chorus][0];
+	this->currentNote = 0;
+
+	this->Powerups[0] = 0; // Mushroom
+	this->Powerups[1] = 0; // Fireflower
+	this->Powerups[2] = 0; // Iceflower
+	this->Powerups[3] = 0; // Penguin
+	this->Powerups[4] = 0; // Propeller
+	this->Powerups[5] = 0; // MiniShroom
+	this->Powerups[6] = 0; // Starman
+	this->Powerups[7] = 0; // Hammer
+	this->Powerups[8] = 0; // 1-ups
+	this->Powerups[9] = 0; // Coins
+
+	// Load in the prize models
+	allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+	int p;
+	nw4r::g3d::ResMdl mdl;
+	nw4r::g3d::ResAnmChr anmChr;
+
+	for (int i = 0; i < 4; i++) { 
+		p = PrizePacks[prize][i];
+
+		// nw4r::g3d::ResFile file;
+		// resFile[i] = file;
+		// m3d::mdl_c model;
+		// pModel[i] = model;
+		// m3d::anmChr_c anim;
+		// pAnim[i] = anim;
+
+		OSReport("Model %d: %s, %s, %s", i, Prizes[p][0], Prizes[p][1], Prizes[p][2]);
+		resFile[i].data = getResource(Prizes[p][0], Prizes[p][1]);
+		mdl = resFile[i].GetResMdl(Prizes[p][2]);
+		pModel[i].setup(mdl, &allocator, 0x224, 1, 0);
+		SetupTextures_Item(&pModel[i], 0); // 800B43D0
+
+		anmChr = resFile[i].GetResAnmChr("wait2");
+		pAnim[i].setup(mdl, anmChr, &allocator, 0);
+		// pAnim[i].bind(&pModel[i], anmChr, 1);
+		// pModel[i].bindAnim(&pAnim[i], 0.0);
+		pAnim[i].setUpdateRate(1.0);
+
+		prizePos[i] = (Vec){ pos.x, pos.y, pos.z };
+		prizeScale[i] = (Vec){ 5.0, 5.0, 5.0 };
+	}
+
+	allocator.unlink();
+
+	// Create and prepare the blocks
+	float x = pos.x;
+	float y = pos.y - 40.0;
+	float z = pos.z;
+	S16Vec rot = (S16Vec){0,0,0};
+
+	Cblock = (dSongBlock*)create(WM_KILLER, 1, &(Vec){x-96.0, y, z}, &rot, 0);
+	Dblock = (dSongBlock*)create(WM_KILLER, 2, &(Vec){x-64.0, y, z}, &rot, 0);
+	Eblock = (dSongBlock*)create(WM_KILLER, 3, &(Vec){x-32.0, y, z}, &rot, 0);
+	Fblock = (dSongBlock*)create(WM_KILLER, 4, &(Vec){x     , y, z}, &rot, 0);
+	Gblock = (dSongBlock*)create(WM_KILLER, 5, &(Vec){x+32.0, y, z}, &rot, 0);
+	Ablock = (dSongBlock*)create(WM_KILLER, 6, &(Vec){x+64.0, y, z}, &rot, 0);
+	Bblock = (dSongBlock*)create(WM_KILLER, 7, &(Vec){x+96.0, y, z}, &rot, 0);
+
+	// // Trigger the intro state
+	// state.setState(&StateID_Intro);
+
+	isResponding = 0;
+	OSReport("Is now responding: %d", isResponding);
+	OSReport("Daddy is at: %x", this);
+
+	return true;
+}
+
+int dSingAlong::onExecute() {
+	state.execute();
+
+	return true;
+}
+
+int dSingAlong::onDraw() {
+
+	if (chorus == -1) { return true; }
+
+	for (int i = 0; i < (chorus + 1); i++) { 
+		matrix.translation(prizePos[i].x, prizePos[i].y, prizePos[i].z);
+		matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z);
+
+		pModel[i].setDrawMatrix(matrix);
+
+		pModel[i].setScale(&prizeScale[i]);
+
+		// OSReport("Calc World");
+		// pModel[i].calcWorld(false);
+
+		// OSReport("Schedule");
+		// pModel[i].scheduleForDrawing();
+
+		// if (pAnim[i].isAnimationDone()) {
+		// 	pAnim[i].setCurrentFrame(0.0); }
+		
+		// OSReport("vf1C");
+		// pModel[i]._vf1C();
+	}
+	
+	return true;
+}
+
+int dSingAlong::onDelete() {
+	return 1;
+}
+
+/*****************************************************************************/
+// Register a Note being played by the players
+void dSingAlong::RegisterNote(int note) {
+	OSReport("Register Note begins: %d", note);
+	OSReport("Responding is: %d", isResponding);
+
+	if (isResponding == 1) {
+		OSReport("State was checked");
+
+		if (note == Songs[song][chorus][currentNote][0]) {
+			OSReport("Note was correct");
+
+			currentNote += 1;
+		}
+		else {
+			OSReport("Player failed");
+			isResponding = 0;
+			state.setState(&StateID_Failure);
+		}
+	}
+}
+
+
+// Game Flow
+//
+// 1) Intro, maybe a banner 'Match the music'
+// 2) Present the prize
+// 3) Play the music
+// 4) Wait for responses
+// 6) If failure, make prize disappear, award banked prizes, end stage, play failure music
+// 7) If successful, place the prize in the bank, and proceed to step 3 on the next segment
+// 8) If all things are successful, play the victory theme and award the banked prizes, end stage
+
+
+/*****************************************************************************/
+// Intro
+CREATE_STATE(dSingAlong, Intro);
+
+void dSingAlong::executeState_Intro() {
+	state.setState(&StateID_Prize);
+}
+
+//*****************************************************************************/
+// Prize
+CREATE_STATE(dSingAlong, Prize);
+
+void dSingAlong::beginState_Prize() {
+	this->timer = 0;
+
+	if (chorus != 0) {
+		this->timer = 120;
+	}
+
+	Xkey_count = 2;
+	Ykey_count = 2;
+	Skey_count = 2;
+
+	// /* keysX[i] = { frame, value, slope }; */
+	keysX[0] = (HermiteKey){ 0.0, pos.x, 0.8 };
+	keysY[0] = (HermiteKey){ 0.0, pos.y, 0.8 };
+	keysS[0] = (HermiteKey){ 0.0, 5.0, 0.8 };
+
+	keysX[1] = (HermiteKey){ 60.0, pos.x + (30.0 * (chorus + 1)) - 320.0, 0.8 };
+	keysY[1] = (HermiteKey){ 60.0, pos.y - 80.0, 0.8 };
+	keysS[1] = (HermiteKey){ 60.0, 1.0, 0.8 };
+}
+void dSingAlong::executeState_Prize() {
+
+	if (timer == 120) { // Play a nice success sound, and wait a second
+		PlaySound(this, SE_MG_IH_PAIR_OK); // SE_MG_IH_NICE or SE_MG_UH_NICE
+		
+		int p;
+		p = PrizePacks[prize][chorus];
+		this->Powerups[p] += 1;
+	}
+
+	if (timer < 60 && timer >= 0) { // Move last time's model to the corner.
+		float modX = GetHermiteCurveValue(60.0 - timer, keysX, Xkey_count);
+		float modY = GetHermiteCurveValue(60.0 - timer, keysY, Ykey_count);
+		float modS = GetHermiteCurveValue(60.0 - timer, keysS, Skey_count);
+
+
+		prizePos[chorus] = (Vec){ modX, modY, prizePos[chorus].z };
+		prizeScale[chorus] = (Vec){ modS, modS, modS };
+	}
+
+	if (timer == 0) {
+		chorus += 1;
+
+		SpawnEffect("Wm_en_blockcloud", 0, &(Vec){pos.x, pos.y, pos.z+500.0}, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5});
+		PlaySound(this, SE_OBJ_ITEM_APPEAR); // SE_OBJ_GOOD_ITEM_APPEAR
+	}
+
+	if (timer == -90) {
+		state.setState(&StateID_Call);
+	}
+
+	timer -= 1;
+}
+
+//*****************************************************************************/
+// Call
+CREATE_STATE(dSingAlong, Call);
+
+void dSingAlong::beginState_Call() { 
+	timer = 0;
+	currentNote = 0;
+
+	OSReport("SONG: {%d, %d} {%d %d} {%d %d}", Songs[song][chorus][0][0], Songs[song][chorus][0][1], Songs[song][chorus][1][0], Songs[song][chorus][1][1], Songs[song][chorus][2][0], Songs[song][chorus][2][1]);
+}
+void dSingAlong::executeState_Call() {
+
+	// OSReport("%d: Waiting for timer %d", timer, *currentNote[1]);
+
+	if (timer == Songs[song][chorus][currentNote][1]) {
+		OSReport("Playing Note %d", Songs[song][chorus][currentNote][0]);
+
+		// int play = Notes[Songs[song][chorus][currentNote][0]-1];
+
+		// if ((currentNote > 1) && 
+		// 	(Notes[Songs[song][chorus][currentNote][0]-1] == Notes[Songs[song][chorus][currentNote-1][0]-1]) &&
+		// 	(Notes[Songs[song][chorus][currentNote][0]-1] == Notes[Songs[song][chorus][currentNote-2][0]-1])) 
+		// {
+		// 	SoundPlayingClass::instance3->PlaySoundAtPosition(play, &(Vec2){pos.x,pos.y}, 0);
+		// }
+
+		// else if ((currentNote > 0) && (Notes[Songs[song][chorus][currentNote][0]-1] == Notes[Songs[song][chorus][currentNote-1][0]-1])) {
+		// 	SoundPlayingClass::instance2->PlaySoundAtPosition(play, &(Vec2){pos.x,pos.y}, 0);
+		// }
+		// else {
+		// 	SoundPlayingClass::instance1->PlaySoundAtPosition(play, &(Vec2){pos.x,pos.y}, 0);
+		// }
+
+		SoundPlayingClass::instance1->PlaySoundAtPosition(Notes[Songs[song][chorus][currentNote][0]-1], &(Vec2){pos.x,pos.y}, 0);
+
+		// PlaySoundAsync(this, Notes[Songs[song][chorus][currentNote][0]-1]);
+
+
+
+		currentNote += 1;
+		// currentNote = song[chorus][counter];
+		OSReport("Next Note %d", Songs[song][chorus][currentNote][0]);
+
+		if (Songs[song][chorus][currentNote][0] == 0) {
+			OSReport("Switching to Response Mode");
+			state.setState(&StateID_Response);
+		}
+	}
+
+	timer += 1;
+}
+
+/*****************************************************************************/
+// Response
+CREATE_STATE(dSingAlong, Response);
+
+void dSingAlong::beginState_Response() { 
+	timer = 0;
+	currentNote = 0;
+	isResponding = 1;
+	OSReport("Is now responding: %d", isResponding);
+}
+void dSingAlong::executeState_Response() {
+	if (Songs[song][chorus][currentNote][0] == 0) {
+		isResponding = 0;
+		OSReport("Switching to some other mode: %d", isResponding);
+		if (chorus == 3) {
+			state.setState(&StateID_Win);
+		}
+		else {
+			state.setState(&StateID_Prize);
+		}
+	}
+}
+
+/*****************************************************************************/
+// Failure
+CREATE_STATE(dSingAlong, Failure);
+
+void dSingAlong::beginState_Failure() {
+	this->timer = 0;
+
+	PlaySound(this, SE_MG_CMN_WIN_CLOSE);
+}
+void dSingAlong::executeState_Failure() {
+	if (timer == 240) {
+		this->addPowerups();
+		ExitStage(3, 0, 0, 4);
+	}
+	timer += 1;
+}
+
+/*****************************************************************************/
+// Win
+CREATE_STATE(dSingAlong, Win);
+
+void dSingAlong::beginState_Win() {
+	this->timer = 0;
+
+	PlaySound(this, SE_MG_CMN_FANFARE_GREAT);
+}
+void dSingAlong::executeState_Win() {
+	if (timer == 240) {
+		this->addPowerups();
+		ExitStage(3, 0, 0, 4);
+	}
+	timer += 1;	
+}
+
+/*****************************************************************************/
+// Add Powerups at the End of the Stage
+void dSingAlong::addPowerups() {
+	SaveFile *file = GetSaveFile();
+	SaveBlock *block = file->GetBlock(file->header.current_file);
+
+	for (int i = 0; i < 7; i++) { // Change this to 8 to support hammers
+		
+		block->powerups_available[i] = block->powerups_available[i] + this->Powerups[i];
+
+		if (block->powerups_available[i] > 99) { block->powerups_available[i] = 99; }
+	}
+
+
+	for (int i = 0; i < 4; i++) { // Make sure all players get the reward!
+		block->player_coins[i] = (this->Powerups[9] * 50) + block->player_coins[i];
+
+		for (;block->player_coins[i] < 100; block->player_coins[i] - 100) {
+			block->player_lives[i] = 1 + block->player_lives[i];
+		}
+
+		block->player_lives[i] = this->Powerups[8] + block->player_lives[i];
+		if (block->player_lives[i] > 99) { block->player_lives[i] = 99; }
+	}
+
+	return;
+}
+
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+// Replaces: Nothing yet
+
+class dSongBlock : public daEnBlockMain_c {
+public:
+	Physics::Info physicsInfo;
+
+	int onCreate();
+	int onDelete();
+	int onExecute();
+	int onDraw();
+
+	mHeapAllocator_c allocator;
+	nw4r::g3d::ResFile resFile;
+
+	m3d::mdl_c bodyModel;
+	m3d::anmChr_c glow;
+
+	int note;
+
+	void calledWhenUpMoveExecutes();
+	void calledWhenDownMoveExecutes();
+	void blockWasHit(bool isDown);
+	USING_STATES(dSongBlock);
+	DECLARE_STATE(Wait);
+
+	static dSongBlock *build();
+};
+
+
+CREATE_STATE(dSongBlock, Wait);
+
+
+dSongBlock *dSongBlock::build() {
+	void *buffer = AllocFromGameHeap1(sizeof(dSongBlock));
+	return new(buffer) dSongBlock;
+}
+
+
+int dSongBlock::onCreate() {
+
+	// Settings
+	this->note = this->settings;
+
+	// Model creation	
+	allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+	this->resFile.data = getResource("light_block", "g3d/light_block.brres");
+	nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("light_block");
+	bodyModel.setup(mdl, &allocator, 0x224, 1, 0);
+	SetupTextures_MapObj(&bodyModel, 0); // 800B42B0
+
+	// Animation Assignment
+	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("light_block");
+	this->glow.setup(mdl, anmChr, &this->allocator, 0);
+	glow.bind(&bodyModel, anmChr, 1);
+	bodyModel.bindAnim(&glow, 0.0);
+	glow.setUpdateRate(1.0);
+	allocator.unlink();
+
+	// Block Physics
+	blockInit(pos.y);
+
+	physicsInfo.x1 = -8;
+	physicsInfo.y1 = 16;
+	physicsInfo.x2 = 8;
+	physicsInfo.y2 = 0;
+
+	physicsInfo.otherCallback1 = &daEnBlockMain_c::OPhysicsCallback1;
+	physicsInfo.otherCallback2 = &daEnBlockMain_c::OPhysicsCallback2;
+	physicsInfo.otherCallback3 = &daEnBlockMain_c::OPhysicsCallback3;
+
+	physics.setup(this, &physicsInfo, 3, currentLayerID);
+	physics.flagsMaybe = 0x260;
+	physics.callback1 = &daEnBlockMain_c::PhysicsCallback1;
+	physics.callback2 = &daEnBlockMain_c::PhysicsCallback2;
+	physics.callback3 = &daEnBlockMain_c::PhysicsCallback3;
+	physics.addToList();
+
+	// Change State
+	doStateChange(&dSongBlock::StateID_Wait);
+
+	return true;
+}
+
+
+int dSongBlock::onDelete() {
+	physics.removeFromList();
+	return true;
+}
+
+
+int dSongBlock::onExecute() {
+	acState.execute();
+	physics.update();
+	blockUpdate();
+
+	// now check zone bounds based on state
+	if (acState.getCurrentState()->isEqual(&StateID_Wait)) {
+		checkZoneBoundaries(0);
+	}
+
+	return true;
+}
+
+
+int dSongBlock::onDraw() {
+
+	// tile.x = pos.x - 8;
+	// tile.y = -(16 + pos.y);
+
+	matrix.translation(pos.x, pos.y+8.0, pos.z);
+	matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z);
+
+	bodyModel.setDrawMatrix(matrix);
+	Vec myScale = (Vec){scale.x * 0.5, scale.y * 0.5, scale.z * 0.5};
+	bodyModel.setScale(&myScale);
+	bodyModel.calcWorld(false);
+
+	bodyModel.scheduleForDrawing();
+	return true;
+}
+
+
+void dSongBlock::blockWasHit(bool isDown) {
+	pos.y = initialY;
+
+	PlaySoundAsync(this, Notes[this->note-1]);
+	// Play an effect?
+	OSReport("Note is: %d", this->note);
+	dSingAlong::instance->RegisterNote(this->note);
+	OSReport("Note successfully registered");
+
+	physics.setup(this, &physicsInfo, 3, currentLayerID);
+	physics.addToList();
+	
+	doStateChange(&StateID_Wait);
+}
+
+
+void dSongBlock::calledWhenUpMoveExecutes() {
+	this->bodyModel._vf1C();
+
+	if (this->glow.isAnimationDone()) {
+		this->glow.setCurrentFrame(0.0); }
+
+	if (initialY >= pos.y)
+		blockWasHit(false);
+}
+
+void dSongBlock::calledWhenDownMoveExecutes() {
+	this->bodyModel._vf1C();
+
+	if (this->glow.isAnimationDone()) {
+		this->glow.setCurrentFrame(0.0); }
+
+	if (initialY <= pos.y)
+		blockWasHit(true);
+}
+
+
+void dSongBlock::beginState_Wait() {}
+void dSongBlock::endState_Wait() {}
+void dSongBlock::executeState_Wait() {
+	int result = blockResult();
+
+	if (result == 0)
+		return;
+
+	if (result == 1) {
+		doStateChange(&daEnBlockMain_c::StateID_UpMove);
+		anotherFlag = 2;
+		isGroundPound = false;
+	} else {
+		doStateChange(&daEnBlockMain_c::StateID_DownMove);
+		anotherFlag = 1;
+		isGroundPound = true;
+	}
+}
+
+
diff --git a/src/bossCaptainBowser.cpp b/src/bossCaptainBowser.cpp
index a8602c2..9157efb 100644
--- a/src/bossCaptainBowser.cpp
+++ b/src/bossCaptainBowser.cpp
@@ -318,8 +318,8 @@ int daCaptainBowser::onExecute() {
 
 	if(this->isIntro == 0) {
 
-		float xmod = sin(this->sinTimer * 3.14 / 180.0) * 80.0;
-		float ymod = sin(this->sinTimer * 3.14 / 130.0) * 112.0;
+		float xmod = sin(this->sinTimer * 3.14 / 180.0) * 60.0;
+		float ymod = sin(this->sinTimer * 3.14 / 130.0) * 84.0;
 
 		pos.x = ClassWithCameraInfo::instance->screenCentreX + 200.0 + xmod;
 		pos.y = ClassWithCameraInfo::instance->screenCentreY - 180.0 + ymod;
diff --git a/src/fix38.S b/src/fix38.S
index cdbf3d0..b91c4b8 100644
--- a/src/fix38.S
+++ b/src/fix38.S
@@ -28,3 +28,7 @@ fix38WithJumpCoin:
 isExemptedActor:
 	b continueFromFlagObjCheck
 
+.global PreventW5Vine
+PreventW5Vine:
+	li r3, 1
+	blr
\ No newline at end of file
diff --git a/src/growup.s b/src/growup.s
index 6e78e52..f9b06c9 100755
--- a/src/growup.s
+++ b/src/growup.s
@@ -441,6 +441,74 @@ ModifySpeedUpdatesA:
 #	blr
 
 
+NotTooBigToBurn:
+    lwz       r4, 4(r5)
+    blr
+
+.global TooBigToBurn
+TooBigToBurn:
+
+	# Go back if Type is a Player, Yoshi, or World Map Shit
+	lhz r10, 8(r31)
+	cmpwi r10, 0x12
+	blt NotTooBigToBurn
+
+	# Go back if it's 60
+	cmpwi r10, 60
+	beq NotTooBigToBurn
+
+	# Go back if SizerOn is 0 (off)
+	lis r10, SizerOn@h
+	ori r10, r10, SizerOn@l
+	lbz r10, 0(r10)
+	cmpwi r10, 0
+	beq NotTooBigToBurn
+
+	stb r30, 0x34(r1)
+	lwz r31, 0x4C(r1)
+	stb r29, 0x35(r1)
+	lwz r30, 0x48(r1)
+	lwz r29, 0x44(r1)
+	lwz r0, 0x54(r1)
+	mtlr r0
+	addi r1, r1, 0x50
+	blr
+
+
+NotTooBigToFreeze:
+    lwz       r0, 0x490(r3)
+    blr
+
+.global TooBigToFreeze
+TooBigToFreeze:
+
+	# Go back if Type is a Player, Yoshi, or World Map Shit
+	lhz r10, 8(r28)
+	cmpwi r10, 0x12
+	blt NotTooBigToFreeze
+
+	# Go back if it's 60
+	cmpwi r10, 60
+	beq NotTooBigToFreeze
+
+	# Go back if SizerOn is 0 (off)
+	lis r10, SizerOn@h
+	ori r10, r10, SizerOn@l
+	lbz r10, 0(r10)
+	cmpwi r10, 0
+	beq NotTooBigToFreeze
+
+	lwz r31, 0x1C(r1)
+	li r3, 1
+	lwz r30, 0x18(r1)
+	lwz r29, 0x14(r1)
+	lwz r28, 0x10(r1)
+	lwz r0, 0x24(r1)
+	mtlr r0
+	addi r1, r1, 0x20
+	blr
+
+
 
 CollisionNoChanges:
 	stw r4, 4(r3)
@@ -1276,6 +1344,32 @@ NormalGabonRockZorderDrop:
 	blr
 
 
+notRegularTeresa:
+	li r5, 1
+	blr
+
+.global BooZOrderHack
+BooZOrderHack:
+
+	lhz r0, 8(r3)
+	cmplwi r0, 0xB0
+	bne notRegularTeresa
+
+	lfs f8, 0xB4(r30)
+
+	lis r11, booZorderPlus@h
+	ori r11, r11, booZorderPlus@l
+	lfs f7, 0(r11)
+
+	fadds f8, f8, f7
+
+	stfs f7, 0xB4(r30)
+	stfs f7, 0x990(r30)
+	stfs f7, 0x99C(r30)
+
+	li r5, 1
+	blr
+
 
 .data
 
@@ -1326,4 +1420,6 @@ ConvertFloat:
 Stupid:	.string "Fucking Sprite was enlarged by %f times\n"
 .align 4
 
+booZorderPlus:
+	.float 5500.0
 
diff --git a/src/poweruphax.cpp b/src/poweruphax.cpp
new file mode 100644
index 0000000..787e88f
--- /dev/null
+++ b/src/poweruphax.cpp
@@ -0,0 +1,21 @@
+#include <common.h>
+#include <game.h>
+
+
+void ThwompHammer(dEn_c *thwomp, ActivePhysics *apThis, ActivePhysics *apOther) {
+	if (thwomp->name == 0x51) {
+		thwomp->dEn_c::collisionCat13_Hammer(apThis, apOther);
+	}
+	return;
+}
+
+void BooHammer(dEn_c *boo, ActivePhysics *apThis, ActivePhysics *apOther) {
+	if (boo->name == 0xB0) {
+		boo->dEn_c::collisionCat13_Hammer(apThis, apOther);
+	}
+	return;
+}
+
+void UrchinHammer(dEn_c *urchin, ActivePhysics *apThis, ActivePhysics *apOther) {
+	return;
+}
diff --git a/src/shyguy.cpp b/src/shyguy.cpp
index f65ed17..8f311de 100644
--- a/src/shyguy.cpp
+++ b/src/shyguy.cpp
@@ -1050,15 +1050,13 @@ void daShyGuy::updateModelMatrices() {
 // Spike State
 ///////////////
 	void daShyGuy::beginState_Spike() { 
-		this->timer = 0;
+		this->timer = 80;
 		spikeTurn = 0;
 	}
 	void daShyGuy::executeState_Spike() {
 
 		if (this->timer == 0) { bindAnimChr_and_setUpdateRate("c18_OB_IDLE_R", 1, 0.0, 1.0); }
 
-		this->timer = this->timer + 1;
-
 		if (this->timer < 120) {
 			// Always face Mario
 			u8 facing = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos);
@@ -1162,6 +1160,9 @@ void daShyGuy::updateModelMatrices() {
 				this->timer = 0;
 			}
 		}
+
+		this->timer = this->timer + 1;
+
 	}
 	void daShyGuy::endState_Spike() { 
 	}
diff --git a/src/spritetex.S b/src/spritetex.S
index 18a09e1..51e4cb7 100755
--- a/src/spritetex.S
+++ b/src/spritetex.S
@@ -415,6 +415,13 @@ TEX_Midway:
 	b GetTexFilenameForR5
 
 
+.global TEX_ColorBlock
+TEX_ColorBlock:
+	lwz r5, 4(r30)
+	srwi r5, r5, 28
+	andi. r5, r5, 0xFF
+	b GetTexFilenameForR5
+
 
 
 .global TEX_Platforms
@@ -503,6 +510,45 @@ TEX_Platform_ShifterSL:
 
 
 
+# The small sand pieces that fall from the snowman
+.global TEX_SnowmanSandToSnow
+TEX_SnowmanSandToSnow:
+
+	lwz r10, 4(r29)
+	srwi r10, r10, 24
+	andi. r10, r10, 0xF
+	
+	cmpwi r10, 0x2
+	bne SnowmanSandToSnow
+
+	lis r4, snoweffectC@h
+	ori r4, r4, snoweffectC@l
+	blr
+
+SnowmanSandToSnow:
+	addi r4, r4, 0x792C
+	blr
+
+
+# The small sand puffs that occur when it moves
+.global TEX_SnowmanSandToSnowB
+TEX_SnowmanSandToSnowB:
+
+	lwz r10, 4(r30)
+	srwi r10, r10, 24
+	andi. r10, r10, 0xF
+	
+	cmpwi r10, 0x2
+	bne SnowmanSandToSnowB
+
+	lis r4, snoweffectD@h
+	ori r4, r4, snoweffectD@l
+	blr
+
+SnowmanSandToSnowB:
+	addi r4, r4, 0x7944
+	blr
+
 
 .global TEX_PokeySnowman
 TEX_PokeySnowman:
@@ -1192,6 +1238,14 @@ rockeffectB:
 	.string "Wm_ob_cmnrockpiece"
 .align 4
 
+snoweffectD:
+	.string "Wm_ob_icebreaksmk"
+.align 4
+
+snoweffectC:
+	.string "Wm_ob_icewait"
+.align 4
+
 
 
 ConvertFloat:
diff --git a/src/summermodel.cpp b/src/summermodel.cpp
index ddbc2e5..5a76549 100644
--- a/src/summermodel.cpp
+++ b/src/summermodel.cpp
@@ -186,57 +186,102 @@ int dMakeYourOwn::onCreate() {
 			
 		case 10:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
 
-			setupModel("morton", "g3d/model0.brres", "model0"); // arc name (no .arc), brres name, model name
+			setupModel("morton", "g3d/model1.brres", "model1"); // arc name (no .arc), brres name, model name
 			SetupTextures_Item(&bodyModel, 0);
 			this->pos.z = 3300.0;
 
-			setupAnim("anim10", 1.0); // AnmChr name, animation speed
+			setupAnim("anim00", 1.0); // AnmChr name, animation speed
 			break;	// ends the case
 			
 		case 11:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
 
-			setupModel("morton", "g3d/model0.brres", "model0"); // arc name (no .arc), brres name, model name
+			setupModel("morton", "g3d/model1.brres", "model1"); // arc name (no .arc), brres name, model name
 			SetupTextures_Item(&bodyModel, 0);
 			this->pos.z = 3300.0;
 
-			setupAnim("anim11", 1.0); // AnmChr name, animation speed
+			setupAnim("anim01", 1.0); // AnmChr name, animation speed
 			break;	// ends the case	
 
 		case 12:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
 
-			setupModel("morton", "g3d/model0.brres", "model0"); // arc name (no .arc), brres name, model name
+			setupModel("morton", "g3d/model1.brres", "model1"); // arc name (no .arc), brres name, model name
 			SetupTextures_Item(&bodyModel, 0);
 			this->pos.z = 3300.0;
 
-			setupAnim("anim12", 1.0); // AnmChr name, animation speed
+			setupAnim("anim02", 1.0); // AnmChr name, animation speed
 			break;	// ends the case
 			
 		case 13:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
 
-			setupModel("morton", "g3d/model0.brres", "model0"); // arc name (no .arc), brres name, model name
+			setupModel("morton", "g3d/model1.brres", "model1"); // arc name (no .arc), brres name, model name
 			SetupTextures_Item(&bodyModel, 0);
 			this->pos.z = 3300.0;
 
-			setupAnim("anim13", 1.0); // AnmChr name, animation speed
+			setupAnim("anim03", 1.0); // AnmChr name, animation speed
 			break;	// ends the case
 
 		case 14:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
 
-			setupModel("morton", "g3d/model0.brres", "model0"); // arc name (no .arc), brres name, model name
+			setupModel("morton", "g3d/model1.brres", "model1"); // arc name (no .arc), brres name, model name
 			SetupTextures_Item(&bodyModel, 0);
 			this->pos.z = 3300.0;
 
-			setupAnim("anim14", 1.0); // AnmChr name, animation speed
+			setupAnim("anim04", 1.0); // AnmChr name, animation speed
 			break;	// ends the case
 			
 		case 15:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
 
-			setupModel("morton", "g3d/model0.brres", "model0"); // arc name (no .arc), brres name, model name
+			setupModel("morton", "g3d/model1.brres", "model1"); // arc name (no .arc), brres name, model name
+			SetupTextures_Item(&bodyModel, 0);
+			this->pos.z = 3300.0;
+
+			setupAnim("anim05", 1.0); // AnmChr name, animation speed
+			break;	// ends the case
+			
+		case 16:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
+
+			setupModel("morton", "g3d/model3.brres", "model3"); // arc name (no .arc), brres name, model name
+			SetupTextures_Item(&bodyModel, 0);
+			this->pos.z = 3300.0;
+
+			setupAnim("anim01", 1.0); // AnmChr name, animation speed
+			break;	// ends the case	
+
+		case 17:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
+
+			setupModel("morton", "g3d/model3.brres", "model3"); // arc name (no .arc), brres name, model name
+			SetupTextures_Item(&bodyModel, 0);
+			this->pos.z = 3300.0;
+
+			setupAnim("anim02", 1.0); // AnmChr name, animation speed
+			break;	// ends the case	
+
+		case 18:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
+
+			setupModel("morton", "g3d/model3.brres", "model3"); // arc name (no .arc), brres name, model name
 			SetupTextures_Item(&bodyModel, 0);
 			this->pos.z = 3300.0;
 
-			setupAnim("anim15", 1.0); // AnmChr name, animation speed
+			setupAnim("anim03", 1.0); // AnmChr name, animation speed
 			break;	// ends the case
+
+		case 19:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
+
+			setupModel("morton", "g3d/model3.brres", "model3"); // arc name (no .arc), brres name, model name
+			SetupTextures_Item(&bodyModel, 0);
+			this->pos.z = 3300.0;
+
+			setupAnim("anim04", 1.0); // AnmChr name, animation speed
+			break;	// ends the case
+
+		case 20:		// If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like!
+
+			setupModel("morton", "g3d/model3.brres", "model3"); // arc name (no .arc), brres name, model name
+			SetupTextures_Item(&bodyModel, 0);
+			this->pos.z = 3300.0;
+
+			setupAnim("anim05", 1.0); // AnmChr name, animation speed
+			break;	// ends the case			
 			
 	}
 
diff --git a/summerhax.yaml b/summerhax.yaml
index b943cb4..2f24d33 100644
--- a/summerhax.yaml
+++ b/summerhax.yaml
@@ -1,16 +1,200 @@
-source_files: [../src/summermodel.cpp]
+source_files: [../src/summermodel.cpp, ../src/fix38.S]
 hooks:
 - {name: RemoveTitleReplay, addr_pal: 0x80781FBC, type: patch, data: '60000000 60000000 60000000'}
 - {name: RemoveToadHouseMsg1, addr_pal: 0x808FB974, type: patch, data: '60000000'}
 - {name: RemoveToadHouseMsg2, addr_pal: 0x808FB968, type: patch, data: '60000000'}
-- {name: UpdateChompModelInfo, addr_pal: 0x8030B998, type: patch, data: '0200BC0000000000100000001000000000000000000000080000000800000000000000000000080000'}
+- {name: UpdateChompModelInfo, addr_pal: 0x8030B998, type: patch, data: '00BC0000000000100000001000000000000000000000080000000800000000000000000000000000'}
+
+- name: Fix38WithJumpCoin
+  src_addr_pal: 0x807EBC5C
+  type: branch_insn
+  branch_type: b
+  target_func: 'fix38WithJumpCoin'
+
+- name: PreventW5Vine
+  type: patch
+  addr_pal: 0x809882A4
+  data: '808FCEF0'
+
+- name: PreventW5VineSoundA
+  type: patch
+  addr_pal: 0x80803144
+  data: '38800305'
+
+- name: PreventW5VineSoundB
+  type: patch
+  addr_pal: 0x80803344
+  data: '38800306'
 
 - name: BuildYourOwnModel
   type: add_func_pointer
-  src_addr_pal: 0x80988574
+  src_addr_pal: 0x8098FEAC
   target_func: 'dMakeYourOwn::build(void)'
 
 - name: UpdateModelSpriteInfo
   type: patch
   addr_pal: 0x8030A4F8
-  data: '029E 0000  00000000 00000000  FFFFFC00 FFFFFC00 00000400 00000400  0400 0400 0000 0000  0008 0000'
+  data: '0010 0000  00000000 00000000  FFFFFF80 FFFFFF80 00000080 00000080  0080 0080 0000 0000  0000 0000'
+
+- name: FixMemoryLeaks
+  type: patch
+  addr_pal: 0x800E53E0
+  data: '4E800020'
+
+- name: 1-1 BG Fix
+  type: patch
+  addr_pal: 0x801180AC
+  data: '38000003'
+
+- name: PipeFix_NodeCalc
+  type: patch
+  addr_pal: 0x800508F8
+  data: 'A01E0010540007FF41820014A0E300043807FFFEB01F042C4800000C38000001B01F042CA0A30002A89F042C80C6003C7C052214540020367CA60214A8850002'
+
+- name: PipeFix_ExitPatch1
+  type: patch
+  addr_pal: 0x80050A5C
+  data: '88030013'
+
+- name: PipeFix_ExitPatch2
+  type: patch
+  addr_pal: 0x80050A60
+  data: '2C000000'
+
+- name: PipeFix_ExitPatch3
+  type: patch
+  addr_pal: 0x80050A68
+  data: '2C000001'
+
+- name: PipeFix_ExitPatch4
+  type: patch
+  addr_pal: 0x80050A70
+  data: '2C000002'
+
+- name: PipeFix_ExitPatch5
+  type: patch
+  addr_pal: 0x80050A78
+  data: '2C000003'
+
+- name: PipeFix_ExitPatch6
+  type: patch
+  addr_pal: 0x80050A88
+  data: '389F065C'
+
+- name: TileGodLayerFix
+  type: patch
+  addr_pal: 0x807E16D0
+  data: '88D2038F'
+
+- name: EN_BIGPILEFix
+  type: patch
+  addr_pal: 0x8001F93C
+  data: '48000014'
+
+- name: StarsDontKillSpikesUD
+  type: patch
+  addr_pal: 0x80AFF4D8
+  data: '809A5490'
+
+- name: StarsDontKillSpikesD
+  type: patch
+  addr_pal: 0x80AFF784
+  data: '809A5490'
+
+- name: StarsDontKillSpikesU
+  type: patch
+  addr_pal: 0x80AFFA30
+  data: '809A5490'
+
+- name: StarsDontKillSpikesLR
+  type: patch
+  addr_pal: 0x80AFFCDC
+  data: '809A5490'
+
+- name: StarsDontKillSpikesR
+  type: patch
+  addr_pal: 0x80AFFF88
+  data: '809A5490'
+
+- name: StarsDontKillSpikesL
+  type: patch
+  addr_pal: 0x80B00234
+  data: '809A5490'
+
+
+- name: WaterEffectsWm_ob_sandpillar02
+  type: patch
+  addr_pal: 0x8095E0DC
+  data: '576D5F6D725F7761746572776176655F696E00' # Wm_mr_waterwave_in
+
+- name: WaterEffectsWm_ob_sandpillar01
+  type: patch
+  addr_pal: 0x8095E0F0
+  data: '576D5F6D725F7761746572776176655F6F757400' # Wm_mr_waterwave_out
+
+- name: WaterEffectsWm_ob_spillarsign01
+  type: patch
+  addr_pal: 0x8095DE34
+  data: '576D5F656E5F776174657273706C61736800' # Wm_en_watersplash
+
+- name: WaterEffectsWm_ob_spillarsign02
+  type: patch
+  addr_pal: 0x8095DE48
+  data: '576D5F656E5F62757273745F7761746572303200' # Wm_en_burst_water02
+
+- name: WaterEffectsWm_en_sphitsmoke
+  type: patch
+  addr_pal: 0x8095DE10
+  data: '576D5F6D725F77666C6F617473706C61736800' # Wm_mr_wfloatsplash
+
+
+
+# - name: NoSandEffectsA
+#   type: patch
+#   addr_pal: 0x80803124
+#   data: '60000000'
+
+# - name: NoSandEffectsB
+#   type: patch
+#   addr_pal: 0x80803150
+#   data: '60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000'
+
+# - name: NoSandEffectsC
+#   type: patch
+#   addr_pal: 0x80803350
+#   data: '60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000'
+
+# - name: NoSandEffectsD
+#   type: patch
+#   addr_pal: 0x8080337C
+#   data: '60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000'
+
+# - name: NoSandEffectsE
+#   type: patch
+#   addr_pal: 0x808032DC
+#   data: '60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000'
+
+# - name: NoSandEffectsG
+#   type: patch
+#   addr_pal: 0x808034CC
+#   data: '60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000'
+
+# - name: NoSandEffectsH
+#   type: patch
+#   addr_pal: 0x808034F8
+#   data: '60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000'
+
+# - name: NoSandEffectsI
+#   type: patch
+#   addr_pal: 0x80803524
+#   data: '60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000'
+
+# - name: NoSandEffectsJ
+#   type: patch
+#   addr_pal: 0x808038D8
+#   data: '60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000'
+
+# - name: NoSandEffectsK
+#   type: patch
+#   addr_pal: 0x80803904
+#   data: '60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000 60000000'
diff --git a/tools/mapfile_tool.py b/tools/mapfile_tool.py
index 540d3e0..92e53ad 100755
--- a/tools/mapfile_tool.py
+++ b/tools/mapfile_tool.py
@@ -185,6 +185,7 @@ def fix_offs_jpn_v1(offs):
 	if offs >= 0x8010F430 and offs <= 0xDEADBEEF:
 		return offs - 0x330
 
+	return offs
 
 
 import yaml
@@ -193,7 +194,8 @@ original = 'pal'
 fix_for = {
 	'pal2': fix_offs_ntsc_v1,
 	'ntsc': fix_offs_ntsc_v1,
-	'ntsc2': fix_offs_ntsc_v2
+	'ntsc2': fix_offs_ntsc_v2,
+	'jpn': fix_offs_jpn_v1
 }
 
 def do_mapfile(src, dest, fix_offset):
@@ -265,10 +267,12 @@ def main():
 	do_mapfile('kamek_pal.x', 'kamek_pal2.x', fix_offs_pal_v2)
 	do_mapfile('kamek_pal.x', 'kamek_ntsc.x', fix_offs_ntsc_v1)
 	do_mapfile('kamek_pal.x', 'kamek_ntsc2.x', fix_offs_ntsc_v2)
+	do_mapfile('kamek_pal.x', 'kamek_jpn.x', fix_offs_jpn_v1)
 
 	already_done = set()
 	do_project('NewerProject.yaml', already_done)
 	do_project('NewerProjectKP.yaml', already_done)
+	do_project('SummerSun.yaml', already_done)
 
 	do_module('anotherhax.yaml', 'processed/anotherhax.yaml')
 
-- 
cgit v1.2.3