summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Noga <Tempus@Spectrum-Song.local>2011-07-23 11:47:43 -0500
committerColin Noga <Tempus@Spectrum-Song.local>2011-07-23 11:47:43 -0500
commit09d075c5469f64f500de70123bbb1042315d7ac0 (patch)
treeee92906230c7fa01e89afb84beeb65b8855393ad
parentffa9dabc6b535da90b3cd8a7849079c546cacfbd (diff)
downloadkamek-09d075c5469f64f500de70123bbb1042315d7ac0.tar.gz
kamek-09d075c5469f64f500de70123bbb1042315d7ac0.zip
Added Crowd clapper. Changed everything to LF only. If anyone on Windows tries to read the code now, they will be faced with a single impenetrable line!
Diffstat (limited to '')
-rw-r--r--NewerProject.yaml48
-rw-r--r--crowdclapper.yaml9
-rw-r--r--eventlooper.yaml28
-rw-r--r--growup.yaml454
-rw-r--r--include/game.h4056
-rw-r--r--kamek_pal.x15
-rw-r--r--poweruphax.yaml1071
-rw-r--r--spritespawner.yaml28
-rw-r--r--spriteswapper.yaml15
-rw-r--r--spritetex.yaml830
-rw-r--r--src/animtiles.cpp122
-rw-r--r--src/crowdclapper.s39
-rw-r--r--src/eventlooper.cpp102
-rw-r--r--src/fileload.cpp268
-rw-r--r--src/fileload.h148
-rw-r--r--src/gakenoko.S440
-rwxr-xr-xsrc/growup.s40
-rw-r--r--src/heapbar.S236
-rw-r--r--src/heapbar.cpp294
-rw-r--r--src/layoutlib.S262
-rw-r--r--src/layoutlib.h298
-rw-r--r--src/levelinfo.cpp72
-rw-r--r--src/levelinfo.h112
-rw-r--r--src/levelnames.cpp166
-rw-r--r--src/levelspecial.cpp174
-rw-r--r--src/linegod.S106
-rw-r--r--src/linegod.cpp426
-rw-r--r--src/msgbox.S74
-rw-r--r--src/msgbox.cpp454
-rw-r--r--src/poweruphax.S1378
-rw-r--r--src/randomcrap.S16
-rw-r--r--src/randtiles.cpp44
-rw-r--r--src/randtiles.h126
-rwxr-xr-xsrc/spritespawner.cpp138
-rwxr-xr-xsrc/spriteswapper.cpp144
-rwxr-xr-xsrc/spritetex.S2042
-rw-r--r--src/tilegod.S130
-rw-r--r--src/worldmap.cpp2128
-rw-r--r--src/worldmap.h126
39 files changed, 8436 insertions, 8223 deletions
diff --git a/NewerProject.yaml b/NewerProject.yaml
index a8a62e3..c628b50 100644
--- a/NewerProject.yaml
+++ b/NewerProject.yaml
@@ -1,23 +1,25 @@
----
-output_dir: "NewerASM"
-code_address: 0x808D9000
-modules:
- - processed/bugfixes.yaml
- - processed/worldmap.yaml
- - processed/levelnames.yaml
- - processed/animtiles.yaml
- - processed/spritetex.yaml
-# - processed/gakenoko.yaml
- - processed/poweruphax.yaml
-# - processed/heapbar.yaml
- - processed/tilegod.yaml
- - processed/linegod.yaml
- - processed/tilesetfixer.yaml
- - processed/switchblock.yaml
-# - processed/msgbox.yaml
-# - processed/replay.yaml
- - processed/growup.yaml
- - processed/levelspecial.yaml
- - processed/eventlooper.yaml
- - processed/spritespawner.yaml
- - processed/compression.yaml
+---
+output_dir: "NewerASM"
+code_address: 0x808D9000
+modules:
+ - processed/bugfixes.yaml
+ - processed/worldmap.yaml
+ - processed/levelnames.yaml
+ - processed/animtiles.yaml
+ - processed/spritetex.yaml
+# - processed/gakenoko.yaml
+ - processed/poweruphax.yaml
+# - processed/heapbar.yaml
+ - processed/tilegod.yaml
+ - processed/linegod.yaml
+ - processed/tilesetfixer.yaml
+ - processed/switchblock.yaml
+# - processed/msgbox.yaml
+# - processed/replay.yaml
+ - processed/growup.yaml
+ - processed/levelspecial.yaml
+ - processed/eventlooper.yaml
+ - processed/spritespawner.yaml
+ - processed/spriteswapper.yaml
+ - processed/compression.yaml
+ - processed/crowdclapper.yaml
diff --git a/crowdclapper.yaml b/crowdclapper.yaml
new file mode 100644
index 0000000..b7adea4
--- /dev/null
+++ b/crowdclapper.yaml
@@ -0,0 +1,9 @@
+---
+source_files: [../src/crowdclapper.s]
+hooks:
+
+ - name: CrowdClapperEventActivate
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80872778
+ target_func: 'CrowdClapperEventActivate'
diff --git a/eventlooper.yaml b/eventlooper.yaml
index b47d21d..f634307 100644
--- a/eventlooper.yaml
+++ b/eventlooper.yaml
@@ -1,15 +1,15 @@
----
-# Replaces EN_HELPOS
-
-source_files: [../src/eventlooper.cpp]
-hooks:
- - name: eventlooper_Create
- type: add_func_pointer
- src_addr_pal: 0x80AEE18C
- target_func: 'EventLooper_Create(EventLooper *)'
-
- - name: eventlooper_Execute
- type: add_func_pointer
- src_addr_pal: 0x80AEE1A4
- target_func: 'EventLooper_Execute(EventLooper *)'
+---
+# Replaces EN_HELPOS
+
+source_files: [../src/eventlooper.cpp]
+hooks:
+ - name: eventlooper_Create
+ type: add_func_pointer
+ src_addr_pal: 0x80AEE18C
+ target_func: 'EventLooper_Create(EventLooper *)'
+
+ - name: eventlooper_Execute
+ type: add_func_pointer
+ src_addr_pal: 0x80AEE1A4
+ target_func: 'EventLooper_Execute(EventLooper *)'
\ No newline at end of file
diff --git a/growup.yaml b/growup.yaml
index c7238ae..94790e1 100644
--- a/growup.yaml
+++ b/growup.yaml
@@ -1,82 +1,82 @@
----
-source_files: [../src/growup.s]
-hooks:
+---
+source_files: [../src/growup.s]
+hooks:
# After Actor onCreate
- - name: Global_Size
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x800951EC
- target_func: 'ModifyGlobalSizes'
+ - name: Global_Size
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x800951EC
+ target_func: 'ModifyGlobalSizes'
# Active Physics Init from Struct
- - name: Global_Collisions
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x8008C3E0
- target_func: 'ModifyCollision'
+ - name: Global_Collisions
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x8008C3E0
+ target_func: 'ModifyCollision'
# Update Object Positions Based on Speed Values
-# - name: Global_Speed_Updates
-# type: branch_insn
-# branch_type: b
-# src_addr_pal: 0x8006CD00
-# target_func: 'ModifySpeedUpdates'
+# - name: Global_Speed_Updates
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x8006CD00
+# target_func: 'ModifySpeedUpdates'
- - name: Global_Speed_UpdatesA
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x80065620
- target_func: 'ModifySpeedUpdatesA'
+ - name: Global_Speed_UpdatesA
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x80065620
+ target_func: 'ModifySpeedUpdatesA'
- - name: Global_Speed_UpdatesB
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x80095730
- target_func: 'ModifySpeedUpdatesB'
+ - name: Global_Speed_UpdatesB
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x80095730
+ target_func: 'ModifySpeedUpdatesB'
# Loading Patches
-# - name: Global_SizeLoader_X
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x800684B8
-# target_func: 'ModifyLoadSizeX'
+# - name: Global_SizeLoader_X
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x800684B8
+# target_func: 'ModifyLoadSizeX'
#
-# - name: Global_SizeLoader_Y
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x800684C0
-# target_func: 'ModifyLoadSizeY'
-
-
-# - name: Global_SizeLoader
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80068930
-# target_func: 'ModifyLoadSize'
+# - name: Global_SizeLoader_Y
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x800684C0
+# target_func: 'ModifyLoadSizeY'
+
+
+# - name: Global_SizeLoader
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80068930
+# target_func: 'ModifyLoadSize'
#
-# - name: Global_SizeLoaderNull
-# type: patch
-# data: "600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000"
-# addr_pal: 0x80068934
-
-# - name: GlobalSizeA
-# type: patch
-# data: '38600001'
-# addr_pal: 0x80064540
+# - name: Global_SizeLoaderNull
+# type: patch
+# data: "600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000060000000"
+# addr_pal: 0x80068934
+
+# - name: GlobalSizeA
+# type: patch
+# data: '38600001'
+# addr_pal: 0x80064540
#
-# - name: GlobalSizeB
-# type: patch
-# data: '4E800020'
-# addr_pal: 0x80064544
+# - name: GlobalSizeB
+# type: patch
+# data: '4E800020'
+# addr_pal: 0x80064544
@@ -84,58 +84,58 @@ hooks:
# Stand On Top Special Collisions Inits
#
-# - name: Global_StandonTopA
-# type: branch_insn
-# branch_type: b
-# src_addr_pal: 0x800DB27C
-# target_func: 'ModifyStandOnTopInitA'
+# - name: Global_StandonTopA
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x800DB27C
+# target_func: 'ModifyStandOnTopInitA'
#
-# - name: Global_StandonTopB
-# type: branch_insn
-# branch_type: b
-# src_addr_pal: 0x800DB294
-# target_func: 'ModifyStandOnTopInitB'
+# - name: Global_StandonTopB
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x800DB294
+# target_func: 'ModifyStandOnTopInitB'
#
-# - name: Global_StandonTopC
-# type: branch_insn
-# branch_type: b
-# src_addr_pal: 0x800DB30C
-# target_func: 'ModifyStandOnTopInitC'
+# - name: Global_StandonTopC
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x800DB30C
+# target_func: 'ModifyStandOnTopInitC'
#
-# - name: Global_StandonTopD
-# type: branch_insn
-# branch_type: b
-# src_addr_pal: 0x800DB32C
-# target_func: 'ModifyStandOnTopInitD'
+# - name: Global_StandonTopD
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x800DB32C
+# target_func: 'ModifyStandOnTopInitD'
# Rideable Actor Inits
- - name: Global_RiderA
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x800DB690
+ - name: Global_RiderA
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800DB690
target_func: 'ModifyRiderInitA'
- - name: Global_RiderB
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x800DB6B4
+ - name: Global_RiderB
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800DB6B4
target_func: 'ModifyRiderInitB'
- - name: Global_RiderC
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x800DB6E8
- target_func: 'ModifyRiderInitC'
+ - name: Global_RiderC
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800DB6E8
+ target_func: 'ModifyRiderInitC'
- - name: Global_RiderD
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x800DB6FC
- target_func: 'ModifyRiderInitD'
+ - name: Global_RiderD
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800DB6FC
+ target_func: 'ModifyRiderInitD'
@@ -147,207 +147,207 @@ hooks:
## Below are enemy specific hacks to fix issues that arise when resizing
- - name: FixingPipeSpawnerGoomba
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80ABB6A8
+ - name: FixingPipeSpawnerGoomba
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80ABB6A8
target_func: 'InheritSettings_C'
- - name: FixingPipeSpawnerGoombaB
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80ABB6D0
+ - name: FixingPipeSpawnerGoombaB
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80ABB6D0
target_func: 'InheritSettings_D'
- - name: FixingPipeSpawnerBobomb
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80ABB758
+ - name: FixingPipeSpawnerBobomb
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80ABB758
target_func: 'InheritSettings_B'
-
+
-# - name: FixingBlockHit
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x800883A4
+# - name: FixingBlockHit
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x800883A4
# target_func: 'InheritSettings_B'
#
#
-# - name: FixingBlockHitB
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80088938
+# - name: FixingBlockHitB
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80088938
# target_func: 'InheritSettings_C'
- - name: FixingMegaGoombaAA
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5AAA8
+ - name: FixingMegaGoombaAA
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5AAA8
target_func: 'InheritSettings'
- - name: FixingMegaGoombaAB
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5AAC4
+ - name: FixingMegaGoombaAB
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5AAC4
target_func: 'InheritSettings'
- - name: FixingMegaGoombaBA
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5AB44
+ - name: FixingMegaGoombaBA
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5AB44
target_func: 'InheritSettings'
- - name: FixingMegaGoombaBB
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5AB80
+ - name: FixingMegaGoombaBB
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5AB80
target_func: 'InheritSettings'
- - name: FixingMegaGoombaBC
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5AB9C
+ - name: FixingMegaGoombaBC
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5AB9C
target_func: 'InheritSettings'
- - name: FixingMegaGoombaBD
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5ABB8
+ - name: FixingMegaGoombaBD
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5ABB8
target_func: 'InheritSettings'
- - name: FixingLargeGoombaAA
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A6A208
+ - name: FixingLargeGoombaAA
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A6A208
target_func: 'InheritSettings'
- - name: FixingLargeGoombaAB
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A6A22C
+ - name: FixingLargeGoombaAB
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A6A22C
target_func: 'InheritSettings'
- - name: FixingLargeGoombaBA
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A6A2A8
+ - name: FixingLargeGoombaBA
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A6A2A8
target_func: 'InheritSettings'
- - name: FixingLargeGoombaBB
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A6A2CC
+ - name: FixingLargeGoombaBB
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A6A2CC
target_func: 'InheritSettings'
- - name: Piranha_Collisions
- type: patch
- data: "41C00000"
- addr_pal: 0x802EE81C
+ - name: Piranha_Collisions
+ type: patch
+ data: "41C00000"
+ addr_pal: 0x802EE81C
- - name: GlobalZOrderDeath
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x800980A4
+ - name: GlobalZOrderDeath
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x800980A4
target_func: 'GlobalZOrderDeath'
- - name: PokeyZOrderDeath
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A9ED2C
+ - name: PokeyZOrderDeath
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A9ED2C
target_func: 'PokeyZOrderDeath'
- - name: PokeyZOrderDeathFreeze
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A9EE58
+ - name: PokeyZOrderDeathFreeze
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A9EE58
target_func: 'PokeyZOrderDeathFreeze'
- - name: PokeyZOrderDamage
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x800A18E8
+ - name: PokeyZOrderDamage
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x800A18E8
target_func: 'PokeyZOrderDamage'
- - name: GabonRockZOrderDeath
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x807FAAAC
+ - name: GabonRockZOrderDeath
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x807FAAAC
target_func: 'GabonRockZOrderDeath'
- - name: GabonRockZOrderDeathDrop
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x807FA9C0
+ - name: GabonRockZOrderDeathDrop
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x807FA9C0
target_func: 'GabonRockZOrderDeathDrop'
#
-# - name: Projectile_Lakitu
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80AB7A28
+# - name: Projectile_Lakitu
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AB7A28
# target_func: 'LakituBomb'
#
#
-# - name: Projectile_LakituTwo
-# type: patch
-# data: "6000000060000000"
-# addr_pal: 0x80A37BF4
+# - name: Projectile_LakituTwo
+# type: patch
+# data: "6000000060000000"
+# addr_pal: 0x80A37BF4
#
-# - name: Projectile_LakituThree
-# type: patch
-# data: "60000000"
-# addr_pal: 0x80A37CDC
+# - name: Projectile_LakituThree
+# type: patch
+# data: "60000000"
+# addr_pal: 0x80A37CDC
#
-# - name: Projectile_LakituFour
-# type: patch
-# data: "60000000"
-# addr_pal: 0x80A37D00
+# - name: Projectile_LakituFour
+# type: patch
+# data: "60000000"
+# addr_pal: 0x80A37D00
#
-# - name: Projectile_LakituFive
-# type: patch
-# data: "60000000"
-# addr_pal: 0x80A37B0C
+# - name: Projectile_LakituFive
+# type: patch
+# data: "60000000"
+# addr_pal: 0x80A37B0C
#
-# - name: Projectile_Pirahna
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80029640
-# target_func: 'PiranhaFireType'
+# - name: Projectile_Pirahna
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80029640
+# target_func: 'PiranhaFireType'
#
-# - name: Projectile_PiranhaPos
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x8002964C
-# target_func: 'PiranhaFirePos'
+# - name: Projectile_PiranhaPos
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x8002964C
+# target_func: 'PiranhaFirePos'
#
-# - name: Projectile_PirahnaB
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80A33300
-# target_func: 'PiranhaFireType'
-
-
-# - name: PipeGenerator
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80ABB76C
-# target_func: 'PipeGeneratorSpawn'
+# - name: Projectile_PirahnaB
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A33300
+# target_func: 'PiranhaFireType'
+
+
+# - name: PipeGenerator
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80ABB76C
+# target_func: 'PipeGeneratorSpawn'
# 809EA268 - Broozer physics struct
diff --git a/include/game.h b/include/game.h
index 81f4e69..8bc0dc2 100644
--- a/include/game.h
+++ b/include/game.h
@@ -1,2038 +1,2038 @@
-#ifndef __KAMEK_GAME_H
-#define __KAMEK_GAME_H
-
-//#define offsetof(type, member) ((__std(size_t)) &(((type *) 0)->member))
-
-#include <common.h>
-#include <rvl/mtx.h>
-#include <rvl/GXEnum.h>
-#include <rvl/vifuncs.h>
-#include <rvl/arc.h>
-#define offsetof(type, member) ((u32) &(((type *) 0)->member))
-
-
-extern "C" {
-int strlen(const char *str);
-
-float atan(float x);
-float atan2(float y, float x);
-
-float cos(float x);
-float sin(float x);
-}
-
-bool DVD_Start();
-bool DVD_End();
-bool DVD_StillLoading(void *dvdclass2);
-void DVD_LoadFile(void *dvdclass, char *folder, char *file, void *callbackData);
-void DVD_FreeFile(void *dvdclass2, char *file);
-
-extern void *DVDClass;
-
-inline void *GetDVDClass() {
- return DVDClass;
-}
-
-inline void *GetDVDClass2() {
- return (void*)(((u32)GetDVDClass())+4);
-}
-
-void *DVD_GetFile(void *dvdclass2, const char *arc, const char *file);
-void *DVD_GetFile(void *dvdclass2, const char *arc, const char *file, u32 *length);
-
-
-extern int Player_Active[4];
-extern int Player_ID[4];
-extern int Player_Powerup[4];
-extern int Player_Flags[4];
-extern int Player_Lives[4];
-extern int Player_Coins[4];
-
-struct StartLevelInfo {
- int maybeUnused;
- unsigned char unk1; // 0x04
- unsigned char unk2; // 0x05
- unsigned char unk3; // 0x06
- unsigned char unk4; // 0x07
- unsigned int purpose; // 0x08
- unsigned char world1; // 0x0C
- unsigned char level1; // 0x0D
- unsigned char world2; // 0x0E
- unsigned char level2; // 0x0F
-};
-
-extern void *GameMgr;
-inline void *GetGameMgr() {
- return GameMgr;
-}
-
-bool QueryPlayerAvailability(int id);
-void DoStartLevel(void *gameMgr, StartLevelInfo *sl);
-void SetSomeConditionShit(int world, int level, unsigned int bits);
-
-bool IsWideScreen();
-
-#define GAMEMGR_GET_AFC(gmgr) (*((bool*)(((u32)(gmgr))+0xAFC)))
-
-
-#define COND_COIN1 1
-#define COND_COIN2 2
-#define COND_COIN3 4
-#define COND_NORMAL 0x10
-#define COND_SECRET 0x20
-#define COND_SGNORMAL 0x80
-#define COND_SGSECRET 0x100
-
-class SaveFirstBlock {
-public:
- char titleID[4]; // 0x00
- u8 field_00; // 0x04
- u8 field_01; // 0x05
- u8 current_file; // 0x06
- u8 field_03; // 0x07
- u16 freemode_fav[10][0x2A]; // 0x08
- u16 coinbtl_fav[10][0x2A]; // 0x350
- u16 bitfield; // 0x698
- u16 field_69A; // 0x69A
- u32 checksum; // 0x69C
-};
-
-class SaveBlock {
-public:
- u8 field_00; // 0x00
- u8 field_01; // 0x01
- u8 bitfield; // 0x02
- u8 current_world; // 0x03
- u8 field_04; // 0x04
- u8 current_path_node; // 0x05
- u8 field_06; // 0x06
- u8 switch_on; // 0x07
- u8 field_08; // 0x08
- u8 powerups_available[7]; // 0x09
- u8 toad_level_idx[10]; // 0x10
- u8 player_continues[4]; // 0x1A
- u8 player_coins[4]; // 0x1E
- u8 player_lives[4]; // 0x22
- u8 player_flags[4]; // 0x26
- u8 player_type[4]; // 0x2A
- u8 player_powerup[4]; // 0x2E
- u8 worlds_available[10]; // 0x32
- u32 ambush_countdown[10]; // 0x3C
- u16 field_64; // 0x64
- u16 credits_hiscore; // 0x66
- u16 score; // 0x68
- u32 completions[10][0x2A]; // 0x6C
- u8 hint_movie_bought[70]; // 0x6FC
- u8 toad_location[10]; // 0x742
- u8 field_74C[10][4]; // 0x74C
- u8 field_774[10][4]; // 0x774
- u8 field_79C[10][4]; // 0x79C
- u8 death_counts[10][0x2A]; // 0x7C4
- u8 death_count_3_4_switch; // 0x968
- u8 pad[0x13]; // 0x969
- u32 checksum; // 0x97C
-
- u32 GetLevelCondition(int world, int level);
- bool CheckLevelCondition(int world, int level, int cond);
- bool CheckIfCoinCollected(int world, int level, int num);
-};
-
-class SaveFile {
-public:
- u32 field_00;
- u32 field_04;
- u32 field_08;
- u32 field_0C;
- u32 field_10;
- u32 field_14;
- u32 field_18;
- u32 field_1C;
-
- // Real Savefile starts here
- SaveFirstBlock header;
- SaveBlock blocks[3];
- SaveBlock quickSave[3];
-
- SaveBlock *GetBlock(int id);
- SaveBlock *GetQSBlock(int id);
-
- bool CheckIfWriting(); // 0x800E0540
-};
-
-class SaveHandler {
-public:
- u8 unknown[0x70];
- u32 CurrentState;
- u32 CurrentError;
- u32 field_7C;
-};
-
-extern SaveFile *SaveFileInstance;
-extern SaveHandler *SaveHandlerInstance;
-
-inline SaveFile *GetSaveFile() {
- return SaveFileInstance;
-}
-
-inline SaveHandler *GetSaveHandler() {
- return SaveHandlerInstance;
-}
-
-#define WPAD_DOWN 0x0001 // Actually Left, but rotated
-#define WPAD_UP 0x0002 // Actually Right, but rotated
-#define WPAD_RIGHT 0x0004 // Actually Down, but rotated
-#define WPAD_LEFT 0x0008 // Actually Up, but rotated
-#define WPAD_PLUS 0x0010
-#define WPAD_TWO 0x0100
-#define WPAD_ONE 0x0200
-#define WPAD_B 0x0400
-#define WPAD_A 0x0800
-#define WPAD_MINUS 0x1000
-#define WPAD_HOME 0x8000
-
-struct RemoconMngClass {
- void *vtable;
- void *controllers[4];
-};
-
-/*
- * Ok, here's how the remocon/wiimote shit works:
- * Remocon is a NSMB-specific class, it handles the different control methods
- * and D-pad directions and such automatically.
- *
- * Wiimote is a generic class (part of EGG) -- well it's not actually called
- * that, but who cares. It handles different types of controllers. Only
- * query it if whatever you're accessing is control type dependent.
- */
-
-extern RemoconMngClass *RemoconMng;
-extern int ActiveWiimoteID;
-extern void *ActiveWiimote;
-
-inline RemoconMngClass *GetRemoconMng() {
- return RemoconMng;
-}
-
-inline int GetActiveWiimoteID() {
- return ActiveWiimoteID;
-}
-
-inline void *GetActiveRemocon() {
- return GetRemoconMng()->controllers[GetActiveWiimoteID()];
-}
-
-inline void *GetActiveWiimote() {
- return ActiveWiimote;
-}
-
-inline unsigned int Remocon_GetButtons(void *self) {
- return *((unsigned int*)((u32)self+0x18));
-}
-
-inline unsigned int Remocon_GetPressed(void *self) {
- return *((unsigned int*)((u32)self+0x1C));
-}
-
-typedef bool (*__Wiimote_TestButtons_type)(void*, unsigned int);
-inline bool Wiimote_TestButtons(void *self, unsigned int btns) {
- VF_BEGIN(__Wiimote_TestButtons_type, self, 8, 0)
- return VF_CALL(self, btns);
- VF_END;
-}
-
-int SearchForIndexOfPlayerID(int id);
-
-bool CheckIfContinueShouldBeActivated();
-
-bool CheckIfMenuShouldBeCancelledForSpecifiedWiimote(int num);
-
-void StartTitleScreenStage(bool realDemo, int sceneParam);
-
-bool CheckIfWeCantDoStuff();
-
-u32 QueryGlobal5758(u32 check);
-
-void SaveGame(void *classDoesntMatter, bool isQuick);
-
-#include <actors.h>
-void *CreateParentedObject(short classID, void *parent, int settings, char something);
-void *CreateChildObject(short classID, void *parent, int settings, int unk1, int unk2);
-
-
-#define WIPE_FADE 0
-#define WIPE_CIRCLE 1
-#define WIPE_BOWSER 2
-#define WIPE_WAVY 3
-#define WIPE_MARIO 4
-#define WIPE_CIRCLE_s 5
-
-void ActivateWipe(int type);
-
-typedef void (*ScreenDrawFunc)();
-
-extern ScreenDrawFunc *CurrentDrawFunc;
-void WorldMapDrawFunc();
-void GameSetupDrawFunc();
-
-void GameSetup__LoadScene(void *self); // 0x80919560
-void FreeScene(int id);
-
-void WpadShit(int unk); // 0x8016F780
-
-void *BgTexMng__LoadAnimTile(void *self, int tileset, short tile, char *name, char *delays, char reverse); // 0x80087B60
-
-extern void *GameHeaps[];
-
-
-class dFlagMgr_c {
-public:
- dFlagMgr_c();
-
- enum ActionFlag {
- ACTIVATE = 1,
- TICKS = 2
- };
-
- u64 flags;
- float _8[64], _108[64];
- u8 _208[64];
- u64 _248[64];
- u8 _448[64];
-
- u32 ticksRemainingForAction[64];
- u8 actionFlag[64];
- u32 _5C8[64]; // somehow sound related?! assigned by last param to set(); only checked for == 0
- u8 _6C8; // assigned -1 by FlagMgr, and other values by the Switch object, nothing else though
-
- void setup(bool isNewLevel);
- void applyAndClearAllTimedActions(); // only used when setup(true) is called
- void execute();
-
- void set(u8 number, int delay, bool activate, bool reverseEffect, bool makeNoise, u32 unknown=0);
-
- u8 findLowestFlagInSet(u32 unk, u64 set);
-
- void setSpecial(u8 number, float to8, float to108, u8 to208, u32 unk, u64 to248);
- float get8(u8 number);
- float get108(u8 number);
- u8 get208(u8 number);
- u64 get248(u8 number);
- u8 get448(u8 number);
-
- // convenience inline functions which may or may not actually exist in Nintendo's original code
- u64 mask(u8 number) { return (u64)1 << number; }
- bool active(u8 number) { return (flags & mask(number)) != 0; }
- bool inactive(u8 number) { return (flags & mask(number)) == 0; }
-
- static dFlagMgr_c *instance;
-};
-
-
-namespace nw4r {
-
-namespace ut {
- // this isn't 100% accurate because it doesn't use templates
- // or detail::LinkListImpl, but oh well
- // I don't need the methods anyway.
-
- class LinkListNode {
- public:
- LinkListNode *next;
- LinkListNode *prev;
- };
-
- class LinkList {
- public:
- int count;
- LinkListNode initialNode;
- };
-
- class Color : public GXColor { };
-
- class Rect {
- public:
- f32 left;
- f32 top;
- f32 right;
- f32 bottom;
- };
-
- template <class T>
- class TagProcessorBase { };
-}
-
-namespace lyt {
- class Pane; // forward declaration
- class DrawInfo;
-
- class AnimTransform; // I'll do these later
- class AnimResource;
- class AnimationLink;
- class ResourceAccessor;
- class GroupContainer;
-
- class Layout {
- public:
- Layout();
- virtual ~Layout();
-
- virtual bool Build(const void *data, ResourceAccessor *resAcc);
-
- virtual AnimTransform *CreateAnimTransform();
- virtual AnimTransform *CreateAnimTransform(const void *data, ResourceAccessor *resAcc);
- virtual AnimTransform *CreateAnimTransform(const AnimResource &res, ResourceAccessor *resAcc);
-
- virtual void BindAnimation(AnimTransform *anim);
- virtual void UnbindAnimation(AnimTransform *anim);
- virtual void UnbindAllAnimation();
- virtual bool BindAnimationAuto(const AnimResource &res, ResourceAccessor *resAcc);
-
- virtual void SetAnimationEnable(AnimTransform *anim, bool unk);
-
- virtual void CalculateMtx(const DrawInfo &info);
-
- virtual void/*?*/ Draw(const DrawInfo &info);
- virtual void/*?*/ Animate(ulong flag);
-
- virtual void/*?*/ SetTagProcessor(ut::TagProcessorBase<wchar_t> *tagProc);
-
- ut::LinkList animations;
-
- Pane *rootPane;
- GroupContainer *groupContainer;
-
- float width;
- float height;
- };
-
-
- class DrawInfo {
- public:
- DrawInfo();
- virtual ~DrawInfo();
-
- Mtx matrix;
- float left;
- float top;
- float right;
- float bottom;
- float scaleX;
- float scaleY;
- float alpha;
- u8 _50; // this is actually a bitfield. todo: investigate how CW handles bitfields, and so on
- };
-
-
- class Material {
- public:
- // ...
- };
-
- class Pane {
- public:
- //Pane(nw4r::lyt::res::Pane const *); // todo: this struct
- Pane(void *);
- virtual ~Pane();
-
- virtual void *GetRuntimeTypeInfo() const;
- virtual void CalculateMtx(const DrawInfo &info);
-
- virtual void Draw(const DrawInfo &info);
- virtual void DrawSelf(const DrawInfo &info);
- virtual void Animate(ulong flag);
- virtual void AnimateSelf(ulong flag);
-
- virtual ut::Color GetVtxColor(ulong id) const;
- virtual void SetVtxColor(ulong id, ut::Color color);
- virtual uchar GetColorElement(ulong id) const;
- virtual void SetColorElement(ulong id, uchar value);
- virtual uchar GetVtxColorElement(ulong id) const;
- virtual void SetVtxColorElement(ulong id, uchar value);
-
- virtual Pane *FindPaneByName(const char *name, bool recursive);
- virtual Material *FindMaterialByName(const char *name, bool recursive);
-
- virtual void/*?*/ BindAnimation(AnimTransform *anim, bool unk1, bool unk2);
- virtual void UnbindAnimation(AnimTransform *anim, bool unk);
- virtual void UnbindAllAnimation(bool unk);
- virtual void UnbindAnimationSelf(AnimTransform *anim);
-
- virtual ut::LinkListNode *FindAnimationLinkSelf(AnimTransform *anim);
- virtual ut::LinkListNode *FindAnimationLinkSelf(const AnimResource &anim);
-
- virtual void SetAnimationEnable(AnimTransform *anim, bool unk1, bool unk2);
- virtual void SetAnimationEnable(const AnimResource &anim, bool unk1, bool unk2);
-
- virtual ulong GetMaterialNum() const;
- virtual Material *GetMaterial() const;
- virtual Material *GetMaterial(ulong id) const;
-
- virtual void LoadMtx(const DrawInfo &info);
-
- void AppendChild(Pane *child);
-
- ut::Rect GetPaneRect(const DrawInfo &info) const;
-
- ut::LinkListNode *AddAnimationLink(AnimationLink *link);
-
- Vec2 GetVtxPos() const;
-
-
- ut::LinkListNode parentLink;
- Pane *parent;
-
- ut::LinkList children;
- ut::LinkList animations;
-
- Material *material;
-
- Vec trans;
- Vec rotate;
- Vec2 scale;
- Vec2 size;
-
- Mtx calcMtx;
- Mtx effectiveMtx;
-
- float _B4;
-
- u8 alpha;
- u8 effectiveAlpha;
- u8 origin;
- u8 flag;
-
- char name[0x11];
- char userdata[8];
-
- u8 _D5;
- u8 paneIsOwnedBySomeoneElse;
- u8 _D7;
- };
-
- class TextBox : public Pane {
- public:
- TextBox(void *, void *); // todo: TextBox((res::TextBox const *,ResBlockSet const &))
- ~TextBox();
-
- void *GetRuntimeTypeInfo() const;
-
- void DrawSelf(const DrawInfo &info);
-
- ut::Color GetVtxColor(ulong id) const;
- void SetVtxColor(ulong id, ut::Color color);
- uchar GetVtxColorElement(ulong id) const;
- void SetVtxColorElement(ulong id, uchar value);
-
- virtual void LoadMtx(const DrawInfo &info);
-
- virtual void AllocStringBuffer(u16 size);
- virtual void FreeStringBuffer();
-
- virtual u16 SetString(const wchar_t *str, u16 destOffset = 0);
- virtual u16 SetString(const wchar_t *str, u16 destOffset, u16 length);
-
- wchar_t *stringBuf;
-
- ut::Color colour1, colour2;
- void *font; // actually a ut::ResFont or whatever
-
- float fontSizeX, fontSizeY;
- float lineSpace, charSpace;
-
- void *tagProc; // actually a TagProcessor
-
- u16 bufferLength;
- u16 stringLength;
-
- u8 alignment;
- u8 flags;
- };
-}
-
-
-
-namespace g3d {
-struct CameraData
-{
-enum Flag
- {
-FLAG_CAMERA_LOOKAT = 0x00000001,
-FLAG_CAMERA_ROTATE = 0x00000002,
-FLAG_CAMERA_AIM = 0x00000004,
-MASK_CAMERA = 0x00000007,
-
-FLAG_CMTX_VALID = 0x00000008,
-
-FLAG_PROJ_FLUSTUM = 0x00000010,
-FLAG_PROJ_PERSP = 0x00000020,
-FLAG_PROJ_ORTHO = 0x00000040,
-MASK_PROJ = 0x00000070,
-
-FLAG_PMTX_VALID = 0x00000080,
-
-FLAG_VIEWPORT_JITTER_ABOVE = 0x00000100
- };
-
-Mtx cameraMtx;
-Mtx44 projMtx;
-
-u32 flags;
-
-VEC3 cameraPos;
-VEC3 cameraUp;
-VEC3 cameraTarget;
-VEC3 cameraRotate;
-f32 cameraTwist;
-
-GXProjectionType projType;
-f32 projFovy;
-f32 projAspect;
-f32 projNear;
-f32 projFar;
-f32 projTop;
-f32 projBottom;
-f32 projLeft;
-f32 projRight;
-
-f32 lightScaleS;
-f32 lightScaleT;
-f32 lightTransS;
-f32 lightTransT;
-
-VEC2 viewportOrigin;
-VEC2 viewportSize;
-f32 viewportNear;
-f32 viewportFar;
-
-u32 scissorX;
-u32 scissorY;
-u32 scissorWidth;
-u32 scissorHeight;
-
-s32 scissorOffsetX;
-s32 scissorOffsetY;
-};
-
-/* Correct camera
-cameraMtx:
-1.0 0.0 0.0 -0.0
-0.0 1.0 0.0 -0.0
-0.0 0.0 1.0 -6000.0
-
-projMtx:
-0.002345 0.000000 0.000000 -1.000000
-0.000000 0.004386 0.000000 -1.000000
-0.000000 0.000000 -0.000005 -0.500000
-0.000000 0.000000 0.000000 1.000000
-
-flags: 000000C9 : FLAG_CAMERA_LOOKAT | FLAG_CMTX_VALID | FLAG_PROJ_ORTHO | FLAG_PMTX_VALID
-
-cameraPos: {0, 0, 15}
-cameraUp: {0, 1, 0}
-cameraTarget: {0, 0, 0}
-cameraRotate: {0, 0, 0}
-cameraTwist: 0
-
-projType: 1
-projFovy: 60
-projAspect: 1.333333
-projNear: -100000
-projFar: 100000
-projTop: 456
-projBottom: 0
-projLeft: 0
-projRight: 853
-
-lightScaleS: 0.5
-lightScaleT: 0.5
-lightTransS: 0.5
-lightTransT: 0.5
-
-viewportOrigin: {0,0}
-viewportSize: {640,456}
-viewportNear: 0
-viewportFar: 1
-
-scissorX: 0
-scissorY: 0
-scissorWidth: 0x280
-scissorHeight: 0x1C8
-
-scissorOffsetX: 0
-scissorOffsetY: 0
-*/
-
-class Camera {
-public:
- enum PostureType { POSTURE_LOOKAT, POSTURE_ROTATE, POSTURE_AIM };
- struct PostureInfo
- {
- PostureType tp;
- VEC3 cameraUp;
- VEC3 cameraTarget;
- VEC3 cameraRotate;
- f32 cameraTwist;
- };
-private:
- CameraData *data;
-public:
- Camera(CameraData *pCamera);
- void Init();
- void Init(u16 efbWidth, u16 efbHeight, u16 xfbWidth, u16 xfbHeight, u16 viWidth, u16 viHeight);
- //void SetPosition(f32 x, f32 y, f32 z);
- void SetPosition(const VEC3 &pos);
- //void GetPosition(f32 *px, f32 *py, f32 *pz) const;
- void GetPosition(VEC3 *pPos) const;
- void SetPosture(const PostureInfo &info);
- //void GetPosture(PostureInfo *info) const;
- void SetCameraMtxDirectly(const Mtx &mtx);
- void GetCameraMtx(Mtx *pMtx) const;
- void SetOrtho(f32 top, f32 bottom, f32 left, f32 right, f32 near, f32 far);
- //void SetFrustum(f32 top, f32 bottom, f32 left, f32 right, f32 near, f32 far);
- void SetPerspective(f32 fovy, f32 aspect, f32 near, f32 far);
- void SetProjectionMtxDirectly(const Mtx44 *pMtx);
- void GetProjectionMtx(Mtx44 *pMtx) const;
- //GXProjectionType GetProjectionType() const;
- void SetScissor(u32 xOrigin, u32 yOrigin, u32 width, u32 height);
- void SetScissorBoxOffset(s32 xOffset, s32 yOffset);
- //void GetScissor(u32 *xOrigin, u32 *yOrigin, u32 *width, u32 *height);
- void SetViewport(f32 xOrigin, f32 yOrigin, f32 width, f32 height);
- //void SetViewport(f32 xOrigin, f32 yOrigin, f32 width, f32 height, f32 near, f32 far);
- void SetViewportZRange(f32 near, f32 far);
- void SetViewportJitter(u32 field);
- //void SetViewportJitter(f32 xOrigin, f32 yOrigin, f32 width, f32 height, f32 near, f32 far, u32 field);
- void GetViewport(f32 *xOrigin, f32 *yOrigin, f32 *width, f32 *height, f32 *near, f32 *far) const;
- void GXSetViewport() const;
- void GXSetProjection() const;
- void GXSetScissor() const;
- void GXSetScissorBoxOffset() const;
-};
-
-namespace G3DState {
- GXRenderModeObj *GetRenderModeObj();
-}
-}
-}
-
-
-nw4r::g3d::CameraData *GetCameraByID(int id);
-
-int GetCurrentCameraID(); // 80164C80
-void SetCurrentCameraID(int id); // 80164C90
-
-void LinkScene(int id); // 80164D50
-void UnlinkScene(int id); // 80164CD0
-
-void SceneCalcWorld(int sceneID); // 80164E10
-void SceneCameraStuff(int sceneID); // 80164EA0
-
-void CalcMaterial(); // 80164E90
-void DrawOpa(); // 80164F70
-void DrawXlu(); // 80164F80
-
-bool ChangeAlphaUpdate(bool enable); // 802D3270
-
-void DoSpecialDrawing1(); // 8006CAE0
-void DoSpecialDrawing2(); // 8006CB40
-
-void SetupLYTDrawing(); // 80163360
-void ClearLayoutDrawList(); // 801632B0
-
-void DrawAllLayoutsBeforeX(int x); // 80163440
-void DrawAllLayoutsAfterX(int x); // 801634D0
-void DrawAllLayoutsAfterXandBeforeY(int x, int y); // 80163560
-
-void RenderEffects(int v1, int v2); // 80093F10
-
-void RemoveAllFromScnRoot(); // 80164FB0
-void Reset3DState(); // 80165000
-
-extern "C" void GXDrawDone(); // 801C4FE0
-
-
-
-namespace m2d {
- class Base_c /*: public nw4r::ut::Link what's this? */ {
- public:
- u32 _00;
- u32 _04;
-
- Base_c();
- virtual ~Base_c();
- virtual void draw(); // don't call this directly
-
- void scheduleForDrawing();
-
- u8 drawOrder;
- };
-
- class Simple_c : public Base_c {
- public:
- nw4r::lyt::Layout layout;
- nw4r::lyt::DrawInfo drawInfo;
-
- u32 _84;
- float _88;
- float _8C;
- float _90;
- u32 _94;
-
- Simple_c();
- ~Simple_c();
-
- void draw();
- virtual void _vf10();
- virtual void _vf14();
- };
-}
-
-
-
-namespace EGG {
- class Frustum {
- public:
- GXProjectionType projType;
- int isCentered;
- float width;
- float height;
- float fovy;
- float dunno;
- float near;
- float far;
- float center_x_maybe;
- float center_y_maybe;
- float x_direction;
- float unk2;
- float unk3;
- short some_flag_bit;
-
-
- // isCentered might actually be isNotCentered, dunno
- Frustum(GXProjectionType projType, Vec2 size, bool isCentered, float near, float far); // 802C6D20
- Frustum(Frustum &f); // 802C6D90
- virtual ~Frustum(); // 802C75F0
-
- virtual void loadDirectly(); // 802C7050
- virtual void loadIntoCamera(nw4r::g3d::Camera cam); // 802C7070
-
- void setOrtho(float top, float bottom, float left, float right, float near, float far); // 802C6DD0
-
- void setFovy(float newFovy); // 802C6F60
-
- void getCenterPointsBasedOnPos(float x, float y, float *destX, float *destY); // 802C6FD0
-
- // no idea what this does
- float getSomethingForPerspective(float blah); // 802C7020
-
-
- protected:
- // not all of these might be protected, dunno
-
- void copyAllFields(Frustum &f); // 802C6EE0
-
- void saveSomething(float f1, float f2, float f3, float f4); // 802C70C0
- void loadSomething(float *f1, float *f2, float *f3, float *f4); // 802C70E0
-
- void loadPerspective(); // 802C7110
- void loadOrtho(); // 802C7140
-
- void setCameraPerspective(nw4r::g3d::Camera cam); // 802C7170
- void setCameraOrtho(nw4r::g3d::Camera cam); // 802C71E0
-
- void getPerspectiveProjMtx(Mtx44 *mtx); // 802C7250
- void getPerspectiveProjv(float *ptr); // 802C72E0
- void getOrthoProjv(float *ptr); // 802C73A0
-
- void getOrthoVars(float *top, float *bottom, float *left, float *right); // 802C7480
- };
-}
-
-
-class TileRenderer {
-public:
- TileRenderer();
- ~TileRenderer();
-
- TileRenderer *list1, *list2;
- u16 tileNumber;
- u8 unkFlag, someBool;
- float x, y, z;
- float scale;
- s16 rotation;
- u8 unkByte;
-
- u16 getTileNum();
- bool getSomeBool();
- void setSomeBool(u8 value);
-
- float getX();
- float getY();
- float getZ();
- void setPosition(float x, float y);
- void setPosition(float x, float y, float z);
-
- u8 getUnkFlag();
-
- void setVars(float scale); // sets unkFlag=1, rotation=0, unkByte=0
- void setVars(float scale, s16 rotation); // sets unkFlag=2, unkByte=0
-
- float getScale();
- float getRotationFloat();
- s16 getRotation();
-
- u8 getUnkByte();
-
- class List {
- public:
- u32 count;
- TileRenderer *first, *last; // order?
-
- void add(TileRenderer *r);
- void remove(TileRenderer *r);
- void removeAll();
-
- List();
- ~List();
- };
-};
-
-class dActor_c; // forward declaration
-
-class Physics {
-public:
- struct Unknown {
- Unknown();
- ~Unknown();
-
- float x, y;
- };
-
- struct Info {
- float x1, y1, x2, y2; // Might be distance to center/edge like APhysics
- void *otherCallback1, *otherCallback2, *otherCallback3;
- };
-
- Physics();
- ~Physics();
-
- dActor_c *owner;
- Physics *next, *prev;
- u32 _C, _10, _14, _18, _1C, _20, _24, _28, _2C, _30, _34, _38, _3C;
- void *otherCallback1, *otherCallback2, *otherCallback3;
- void *callback1, *callback2, *callback3;
- float lastX, lastY;
- Unknown unkArray[4];
- float x, y;
- float _88, _8C, _90;
- Vec lastActorPosition;
- float _A0, _A4, last_A0, last_A4, _B0, _B4;
- u32 _B8;
- s16 *ptrToRotationShort;
- s16 currentRotation;
- s16 rotDiff;
- s16 rotDiffAlt;
- u32 isRound;
- u32 _CC;
- u32 flagsMaybe;
- u32 _D4, _D8;
- u8 isAddedToList, _DD, layer;
- u32 id;
-
- void addToList();
- void removeFromList();
-
- void baseSetup(dActor_c *actor, u32 t_40, u32 t_44, u32 t_48, u8 t_DD, u8 layer);
-
- // note: Scale can be a null pointer (in that case, it'll use 1.0)
- void setup(dActor_c *actor,
- float x1, float y1, float x2, float y2,
- void *otherCB1, void *otherCB2, void *otherCB3,
- u8 t_DD, u8 layer, Vec2 *scale = 0);
-
- void setup(dActor_c *actor,
- Vec2 *p1, Vec2 *p2,
- void *otherCB1, void *otherCB2, void *otherCB3,
- u8 t_DD, u8 layer, Vec2 *scale = 0);
-
- void setup(dActor_c *actor, Info *pInfo, u8 t_DD, u8 layer, Vec2 *scale = 0);
-
- // radius might be diameter? dunno
- void setupRound(dActor_c *actor,
- float x, float y, float radius,
- void *otherCB1, void *otherCB2, void *otherCB3,
- u8 t_DD, u8 layer);
-
- void setRect(float x1, float y1, float x2, float y2, Vec2 *scale = 0);
- void setRect(Vec2 *p1, Vec2 *p2, Vec2 *scale = 0);
-
- void setX(float value);
- void setY(float value);
- void setWidth(float value);
- void setHeight(float value);
-
- void setPtrToRotation(s16 *ptr);
-
- void update();
-
- // todo: more stuff that might not be relevant atm
-};
-
-
-class ActivePhysics {
-public:
- struct Info; // forward declaration
- typedef void (*Callback)(Info *self, Info *other);
-
- struct Info {
- float xDistToCenter;
- float yDistToCenter;
- float xDistToEdge;
- float yDistToEdge;
- u8 category1;
- u8 category2;
- u32 bitfield1;
- u32 bitfield2;
- u16 unkShort1C;
- Callback callback;
- };
-
- ActivePhysics();
- virtual ~ActivePhysics();
-
- dActor_c *owner; // should be dStageActor? dunno
- u32 _8;
- u32 _C;
- ActivePhysics *listPrev, *listNext;
- u32 _18;
- Info info;
- u32 _40, _44, _48, _4C;
- float firstFloatArray[8];
- float secondFloatArray[8];
- Vec2 positionOfLastCollision;
- u16 result1;
- u16 result2;
- u16 result3;
- u8 collisionCheckType;
- u8 chainlinkMode;
- u8 layer;
- u8 someFlagByte;
- u8 isLinkedIntoList;
-};
-
-
-#include <statelib.h>
-
-class dActorState_c;
-class dActorMultiState_c;
-
-
-class AcStateMgrBase {
-public:
- virtual ~AcStateMgrBase();
-
- u32 cls1, cls2, cls3;
- dActorMultiState_c *owner;
- u32 unkZero;
-
- StateMgr<dActorMultiState_c> manager;
-
- // All these are passed straight through to the manager
- virtual void _vfC();
- virtual void _vf10();
- virtual void _vf14();
- virtual void _vf18();
- virtual void _vf1C();
- virtual void _vf20();
- virtual void _vf24();
- virtual void _vf28();
- virtual void _vf2C();
-};
-
-class AcStateMgr : public AcStateMgrBase {
-public:
- ~AcStateMgr();
-};
-
-class MultiStateMgrBase {
-public:
- virtual ~MultiStateMgrBase();
-
- AcStateMgr s1, s2;
- AcStateMgr *ptrToStateMgr;
-
- virtual void _vfC(); // calls vfC on ptrToStateMgr
- virtual void execute(); // calls vf10 on ptrToStateMgr
- virtual void _vf14(); // if (isSecondStateMgr()) { disableSecond(); } else { ptrToStateMgr->_vf14(); }
- virtual void setState(StateBase *state); // calls vf18 on ptrToStateMgr
- virtual void _vf1C(); // calls vf1C on ptrToStateMgr
- virtual void _vf20(); // calls vf20 on ptrToStateMgr
- virtual void _vf24(); // calls vf24 on ptrToStateMgr
- virtual StateBase *getCurrentState(); // calls vf28 on ptrToStateMgr
- virtual void _vf2C(); // calls vf2C on ptrToStateMgr
- virtual void enableSecond(); // sets ptrToStateMgr to s2, calls vf18 on it
- virtual void disableSecond(); // if (isSecondStateMgr()) { ptrToStateMgr->vf14(); ptrToStateMgr = &s1; }
- virtual bool isSecondStateMgr();
- virtual void _vf3C(); // calls vf28 on s1
-};
-
-class MultiStateMgr : public MultiStateMgrBase {
-public:
- // what the fuck does this do
- ~MultiStateMgr();
-};
-
-
-struct LinkListEntry {
- LinkListEntry *prev;
- LinkListEntry *next;
- void *owned_obj;
-};
-
-
-struct LinkList {
- LinkListEntry *first;
- LinkListEntry *last;
- // PTMF goes here, but I don't know how to represent it
-};
-
-
-struct OrderedLinkListEntry : LinkListEntry {
- u16 order;
- u16 _;
-};
-
-
-struct TreeNode {
- TreeNode *parent;
- TreeNode *child;
- TreeNode *prev;
- TreeNode *next;
- void *owned_obj;
-};
-
-
-struct Tree {
- TreeNode *firstNode;
- // PTMF goes here, but I don't know how to represent it
-};
-
-
-typedef bool (*ChainedFunc)(void*);
-
-class FunctionChain {
-public:
- ChainedFunc *functions;
- u16 count;
- u16 current;
-
- void setup(ChainedFunc *functions, u16 count); // 8015F740
-};
-
-
-class fBase_c {
-public:
- u32 id;
- u32 settings;
- u16 name;
- u8 _A;
- u8 _B;
- u8 _C;
- u8 _D;
- u8 base_type;
- u8 _F;
- TreeNode link_connect;
- OrderedLinkListEntry link_execute;
- OrderedLinkListEntry link_draw;
- LinkListEntry link_IDlookup;
- u32 _50;
- u32 _54;
- u32 _58;
- u32 heap;
-
- fBase_c();
-
- virtual int onCreate();
- virtual int beforeCreate();
- virtual int afterCreate(int);
-
- virtual int onDelete();
- virtual int beforeDelete();
- virtual int afterDelete(int);
-
- virtual int onExecute();
- virtual int beforeExecute();
- virtual int afterExecute(int);
-
- virtual int onDraw();
- virtual int beforeDraw();
- virtual int afterDraw(int);
-
- virtual void willBeDeleted();
-
- virtual bool moreHeapShit(u32 size, void *parentHeap);
- virtual bool createHeap(u32 size, void *parentHeap);
- virtual void heapCreated();
-
- virtual ~fBase_c();
-
- void Delete();
-
- fBase_c *GetParent();
- fBase_c *GetChild();
- fBase_c *GetNext();
-
- bool hasUninitialisedProcesses(); // 80162B60
-};
-
-class dBase_c : public fBase_c {
-public:
- u32 _64;
- const char *explanation_string;
- const char *name_string;
-
- dBase_c();
-
- int beforeCreate();
- int afterCreate(int);
- int beforeDelete();
- int afterDelete(int);
- int beforeExecute();
- int afterExecute(int);
- int beforeDraw();
- int afterDraw(int);
-
- ~dBase_c();
-
- virtual const char *GetExplanationString();
-};
-
-class dScene_c : public dBase_c {
-public:
- FunctionChain *ptrToInitChain;
-
- dScene_c();
-
- int beforeCreate();
- int afterCreate(int);
- int beforeDelete();
- int afterDelete(int);
- int beforeExecute();
- int afterExecute(int);
- int beforeDraw();
- int afterDraw(int);
-
- ~dScene_c();
-
-
- void setInitChain(FunctionChain &initChain) {
- ptrToInitChain = &initChain;
- }
-};
-
-class dActor_c : public dBase_c {
-public:
- LinkListEntry link_actor;
- Mtx matrix;
- Vec pos;
- Vec last_pos;
- Vec pos_delta;
- Vec _D0;
- Vec scale;
- Vec speed;
- Vec max_speed;
- S16Vec rot;
- S16Vec _106;
- u32 _10C;
- u32 _110;
- float y_speed_inc;
- u32 _118;
- float x_speed_inc;
- u32 _120;
- bool visible;
-
- dActor_c();
-
- virtual void specialDraw1();
- virtual void specialDraw2();
- virtual int _vf58();
- virtual void _vf5C();
-
- ~dActor_c();
-};
-
-class dStageActor_c : public dActor_c {
-public:
- u8 _125;
- u32 _128, _12C, _130, _134, _138, _13C;
- float _140;
- u32 _144;
- ActivePhysics aPhysics;
- u8 classAt1EC[236];
- u32 _2D8;
- u8 classAt2DC[0x34];
- u32 _310, _314;
- float spriteSomeRectX, spriteSomeRectY;
- float _320, _324, _328, _32C, _330, _334, _338, _33C, _340, _344;
- u8 direction;
- u8 currentZoneID;
- u8 _34A, _34B;
- u8 *spriteByteStorage;
- u16 *spriteShortStorage;
- u16 spriteEventNum;
- u64 spriteEventMask;
- u32 _360;
- u16 spriteSomeFlag;
- u8 _366, _367;
- u32 _368;
- u8 _36C, _36D;
- Vec somethingRelatedToScale;
- u32 _37C, _380, _384, _388;
- u8 _38C, _38D, enableFlag, currentLayerID;
- u8 _390, _391, _392, _padding;
-
- dStageActor_c();
-
- int beforeCreate();
- int afterCreate(int);
- int beforeDelete();
- int afterDelete(int);
- int beforeExecute();
- int afterExecute(int);
- int beforeDraw();
- int afterDraw(int);
-
- const char *GetExplanationString();
-
- virtual bool _vf60(); // does stuff with BG_GM
- virtual void kill(); // nullsub here, defined in StageActor. probably no params
- virtual int _vf68(); // params unknown. return (1) might be bool
- virtual u8 *_vf6C(); // returns byte 0x38D
- virtual Vec2 _vf70(); // returns Vec Actor.pos + Vec Actor.field_D0
- virtual int _vf74(); // params unknown. return (1) might be bool
- virtual void _vf78(); // params unknown. nullsub
- virtual void _vf7C(); // params unknown. nullsub
- virtual void eatIn(); // copies Actor.scale into StageActor.somethingRelatedToScale
- virtual void disableEatIn(); // params unknown. nullsub
- virtual void _vf88(); // params unknown. nullsub
- virtual bool _vf8C(void *other); // dAcPy_c/daPlBase_c? return (1) is probably bool. seems related to EatOut. uses vfA4
- virtual bool _vf90(dStageActor_c *other); // does something with scores
- virtual void _vf94(void *other); // dAcPy_c/daPlBase_c? modifies This's position
- virtual void removeMyActivePhysics();
- virtual void addMyActivePhysics();
- virtual void returnRegularScale(); // the reverse of vf80, yay
- virtual void _vfA4(void *other); // AcPy/PlBase? similar to vf94 but not quite the same
- virtual float _vfA8(void *other); // AcPy/PlBase? what DOES this do...? does a bit of float math
- virtual void _vfAC(void *other); // copies somethingRelatedToScale into scale, then multiplies scale by vfA8's return
- virtual void _vfB0(); // plays Wm_en_burst_s at actor position
- virtual void _vfB4(); // params unknown. nullsub
- virtual void _vfB8(); // params unknown. nullsub
- virtual void _vfBC(); // params unknown. nullsub
- virtual void _vfC0(); // params unknown. nullsub
- virtual void _vfC4(); // params unknown. nullsub
- virtual void _vfC8(Vec2 *p); // does stuff including effects and playing PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH
- virtual void _vfCC(Vec2 *p); // mostly same as vfC8, but uses PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH_LAVA
- virtual void _vfD0(Vec2 *p); // mostly same as vfC8, but uses PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH_POISON
-
- // I'll add methods as I need them
- void checkZoneBoundaries(u32 flags); // I think this method is for that, anyway
-
- ~dStageActor_c();
-
-
- static void create(Actors type, u32 settings, Vec *pos, S16Vec *rot, u8 layer);
- static void createChild(Actors type, u32 settings, Vec *pos, S16Vec *rot, u8 layer);
-};
+#ifndef __KAMEK_GAME_H
+#define __KAMEK_GAME_H
+
+//#define offsetof(type, member) ((__std(size_t)) &(((type *) 0)->member))
+
+#include <common.h>
+#include <rvl/mtx.h>
+#include <rvl/GXEnum.h>
+#include <rvl/vifuncs.h>
+#include <rvl/arc.h>
+#define offsetof(type, member) ((u32) &(((type *) 0)->member))
+
+
+extern "C" {
+int strlen(const char *str);
+
+float atan(float x);
+float atan2(float y, float x);
+
+float cos(float x);
+float sin(float x);
+}
+
+bool DVD_Start();
+bool DVD_End();
+bool DVD_StillLoading(void *dvdclass2);
+void DVD_LoadFile(void *dvdclass, char *folder, char *file, void *callbackData);
+void DVD_FreeFile(void *dvdclass2, char *file);
+
+extern void *DVDClass;
+
+inline void *GetDVDClass() {
+ return DVDClass;
+}
+
+inline void *GetDVDClass2() {
+ return (void*)(((u32)GetDVDClass())+4);
+}
+
+void *DVD_GetFile(void *dvdclass2, const char *arc, const char *file);
+void *DVD_GetFile(void *dvdclass2, const char *arc, const char *file, u32 *length);
+
+
+extern int Player_Active[4];
+extern int Player_ID[4];
+extern int Player_Powerup[4];
+extern int Player_Flags[4];
+extern int Player_Lives[4];
+extern int Player_Coins[4];
+
+struct StartLevelInfo {
+ int maybeUnused;
+ unsigned char unk1; // 0x04
+ unsigned char unk2; // 0x05
+ unsigned char unk3; // 0x06
+ unsigned char unk4; // 0x07
+ unsigned int purpose; // 0x08
+ unsigned char world1; // 0x0C
+ unsigned char level1; // 0x0D
+ unsigned char world2; // 0x0E
+ unsigned char level2; // 0x0F
+};
+
+extern void *GameMgr;
+inline void *GetGameMgr() {
+ return GameMgr;
+}
+
+bool QueryPlayerAvailability(int id);
+void DoStartLevel(void *gameMgr, StartLevelInfo *sl);
+void SetSomeConditionShit(int world, int level, unsigned int bits);
+
+bool IsWideScreen();
+
+#define GAMEMGR_GET_AFC(gmgr) (*((bool*)(((u32)(gmgr))+0xAFC)))
+
+
+#define COND_COIN1 1
+#define COND_COIN2 2
+#define COND_COIN3 4
+#define COND_NORMAL 0x10
+#define COND_SECRET 0x20
+#define COND_SGNORMAL 0x80
+#define COND_SGSECRET 0x100
+
+class SaveFirstBlock {
+public:
+ char titleID[4]; // 0x00
+ u8 field_00; // 0x04
+ u8 field_01; // 0x05
+ u8 current_file; // 0x06
+ u8 field_03; // 0x07
+ u16 freemode_fav[10][0x2A]; // 0x08
+ u16 coinbtl_fav[10][0x2A]; // 0x350
+ u16 bitfield; // 0x698
+ u16 field_69A; // 0x69A
+ u32 checksum; // 0x69C
+};
+
+class SaveBlock {
+public:
+ u8 field_00; // 0x00
+ u8 field_01; // 0x01
+ u8 bitfield; // 0x02
+ u8 current_world; // 0x03
+ u8 field_04; // 0x04
+ u8 current_path_node; // 0x05
+ u8 field_06; // 0x06
+ u8 switch_on; // 0x07
+ u8 field_08; // 0x08
+ u8 powerups_available[7]; // 0x09
+ u8 toad_level_idx[10]; // 0x10
+ u8 player_continues[4]; // 0x1A
+ u8 player_coins[4]; // 0x1E
+ u8 player_lives[4]; // 0x22
+ u8 player_flags[4]; // 0x26
+ u8 player_type[4]; // 0x2A
+ u8 player_powerup[4]; // 0x2E
+ u8 worlds_available[10]; // 0x32
+ u32 ambush_countdown[10]; // 0x3C
+ u16 field_64; // 0x64
+ u16 credits_hiscore; // 0x66
+ u16 score; // 0x68
+ u32 completions[10][0x2A]; // 0x6C
+ u8 hint_movie_bought[70]; // 0x6FC
+ u8 toad_location[10]; // 0x742
+ u8 field_74C[10][4]; // 0x74C
+ u8 field_774[10][4]; // 0x774
+ u8 field_79C[10][4]; // 0x79C
+ u8 death_counts[10][0x2A]; // 0x7C4
+ u8 death_count_3_4_switch; // 0x968
+ u8 pad[0x13]; // 0x969
+ u32 checksum; // 0x97C
+
+ u32 GetLevelCondition(int world, int level);
+ bool CheckLevelCondition(int world, int level, int cond);
+ bool CheckIfCoinCollected(int world, int level, int num);
+};
+
+class SaveFile {
+public:
+ u32 field_00;
+ u32 field_04;
+ u32 field_08;
+ u32 field_0C;
+ u32 field_10;
+ u32 field_14;
+ u32 field_18;
+ u32 field_1C;
+
+ // Real Savefile starts here
+ SaveFirstBlock header;
+ SaveBlock blocks[3];
+ SaveBlock quickSave[3];
+
+ SaveBlock *GetBlock(int id);
+ SaveBlock *GetQSBlock(int id);
+
+ bool CheckIfWriting(); // 0x800E0540
+};
+
+class SaveHandler {
+public:
+ u8 unknown[0x70];
+ u32 CurrentState;
+ u32 CurrentError;
+ u32 field_7C;
+};
+
+extern SaveFile *SaveFileInstance;
+extern SaveHandler *SaveHandlerInstance;
+
+inline SaveFile *GetSaveFile() {
+ return SaveFileInstance;
+}
+
+inline SaveHandler *GetSaveHandler() {
+ return SaveHandlerInstance;
+}
+
+#define WPAD_DOWN 0x0001 // Actually Left, but rotated
+#define WPAD_UP 0x0002 // Actually Right, but rotated
+#define WPAD_RIGHT 0x0004 // Actually Down, but rotated
+#define WPAD_LEFT 0x0008 // Actually Up, but rotated
+#define WPAD_PLUS 0x0010
+#define WPAD_TWO 0x0100
+#define WPAD_ONE 0x0200
+#define WPAD_B 0x0400
+#define WPAD_A 0x0800
+#define WPAD_MINUS 0x1000
+#define WPAD_HOME 0x8000
+
+struct RemoconMngClass {
+ void *vtable;
+ void *controllers[4];
+};
+
+/*
+ * Ok, here's how the remocon/wiimote shit works:
+ * Remocon is a NSMB-specific class, it handles the different control methods
+ * and D-pad directions and such automatically.
+ *
+ * Wiimote is a generic class (part of EGG) -- well it's not actually called
+ * that, but who cares. It handles different types of controllers. Only
+ * query it if whatever you're accessing is control type dependent.
+ */
+
+extern RemoconMngClass *RemoconMng;
+extern int ActiveWiimoteID;
+extern void *ActiveWiimote;
+
+inline RemoconMngClass *GetRemoconMng() {
+ return RemoconMng;
+}
+
+inline int GetActiveWiimoteID() {
+ return ActiveWiimoteID;
+}
+
+inline void *GetActiveRemocon() {
+ return GetRemoconMng()->controllers[GetActiveWiimoteID()];
+}
+
+inline void *GetActiveWiimote() {
+ return ActiveWiimote;
+}
+
+inline unsigned int Remocon_GetButtons(void *self) {
+ return *((unsigned int*)((u32)self+0x18));
+}
+
+inline unsigned int Remocon_GetPressed(void *self) {
+ return *((unsigned int*)((u32)self+0x1C));
+}
+
+typedef bool (*__Wiimote_TestButtons_type)(void*, unsigned int);
+inline bool Wiimote_TestButtons(void *self, unsigned int btns) {
+ VF_BEGIN(__Wiimote_TestButtons_type, self, 8, 0)
+ return VF_CALL(self, btns);
+ VF_END;
+}
+
+int SearchForIndexOfPlayerID(int id);
+
+bool CheckIfContinueShouldBeActivated();
+
+bool CheckIfMenuShouldBeCancelledForSpecifiedWiimote(int num);
+
+void StartTitleScreenStage(bool realDemo, int sceneParam);
+
+bool CheckIfWeCantDoStuff();
+
+u32 QueryGlobal5758(u32 check);
+
+void SaveGame(void *classDoesntMatter, bool isQuick);
+
+#include <actors.h>
+void *CreateParentedObject(short classID, void *parent, int settings, char something);
+void *CreateChildObject(short classID, void *parent, int settings, int unk1, int unk2);
+
+
+#define WIPE_FADE 0
+#define WIPE_CIRCLE 1
+#define WIPE_BOWSER 2
+#define WIPE_WAVY 3
+#define WIPE_MARIO 4
+#define WIPE_CIRCLE_s 5
+
+void ActivateWipe(int type);
+
+typedef void (*ScreenDrawFunc)();
+
+extern ScreenDrawFunc *CurrentDrawFunc;
+void WorldMapDrawFunc();
+void GameSetupDrawFunc();
+
+void GameSetup__LoadScene(void *self); // 0x80919560
+void FreeScene(int id);
+
+void WpadShit(int unk); // 0x8016F780
+
+void *BgTexMng__LoadAnimTile(void *self, int tileset, short tile, char *name, char *delays, char reverse); // 0x80087B60
+
+extern void *GameHeaps[];
+
+
+class dFlagMgr_c {
+public:
+ dFlagMgr_c();
+
+ enum ActionFlag {
+ ACTIVATE = 1,
+ TICKS = 2
+ };
+
+ u64 flags;
+ float _8[64], _108[64];
+ u8 _208[64];
+ u64 _248[64];
+ u8 _448[64];
+
+ u32 ticksRemainingForAction[64];
+ u8 actionFlag[64];
+ u32 _5C8[64]; // somehow sound related?! assigned by last param to set(); only checked for == 0
+ u8 _6C8; // assigned -1 by FlagMgr, and other values by the Switch object, nothing else though
+
+ void setup(bool isNewLevel);
+ void applyAndClearAllTimedActions(); // only used when setup(true) is called
+ void execute();
+
+ void set(u8 number, int delay, bool activate, bool reverseEffect, bool makeNoise, u32 unknown=0);
+
+ u8 findLowestFlagInSet(u32 unk, u64 set);
+
+ void setSpecial(u8 number, float to8, float to108, u8 to208, u32 unk, u64 to248);
+ float get8(u8 number);
+ float get108(u8 number);
+ u8 get208(u8 number);
+ u64 get248(u8 number);
+ u8 get448(u8 number);
+
+ // convenience inline functions which may or may not actually exist in Nintendo's original code
+ u64 mask(u8 number) { return (u64)1 << number; }
+ bool active(u8 number) { return (flags & mask(number)) != 0; }
+ bool inactive(u8 number) { return (flags & mask(number)) == 0; }
+
+ static dFlagMgr_c *instance;
+};
+
+
+namespace nw4r {
+
+namespace ut {
+ // this isn't 100% accurate because it doesn't use templates
+ // or detail::LinkListImpl, but oh well
+ // I don't need the methods anyway.
+
+ class LinkListNode {
+ public:
+ LinkListNode *next;
+ LinkListNode *prev;
+ };
+
+ class LinkList {
+ public:
+ int count;
+ LinkListNode initialNode;
+ };
+
+ class Color : public GXColor { };
+
+ class Rect {
+ public:
+ f32 left;
+ f32 top;
+ f32 right;
+ f32 bottom;
+ };
+
+ template <class T>
+ class TagProcessorBase { };
+}
+
+namespace lyt {
+ class Pane; // forward declaration
+ class DrawInfo;
+
+ class AnimTransform; // I'll do these later
+ class AnimResource;
+ class AnimationLink;
+ class ResourceAccessor;
+ class GroupContainer;
+
+ class Layout {
+ public:
+ Layout();
+ virtual ~Layout();
+
+ virtual bool Build(const void *data, ResourceAccessor *resAcc);
+
+ virtual AnimTransform *CreateAnimTransform();
+ virtual AnimTransform *CreateAnimTransform(const void *data, ResourceAccessor *resAcc);
+ virtual AnimTransform *CreateAnimTransform(const AnimResource &res, ResourceAccessor *resAcc);
+
+ virtual void BindAnimation(AnimTransform *anim);
+ virtual void UnbindAnimation(AnimTransform *anim);
+ virtual void UnbindAllAnimation();
+ virtual bool BindAnimationAuto(const AnimResource &res, ResourceAccessor *resAcc);
+
+ virtual void SetAnimationEnable(AnimTransform *anim, bool unk);
+
+ virtual void CalculateMtx(const DrawInfo &info);
+
+ virtual void/*?*/ Draw(const DrawInfo &info);
+ virtual void/*?*/ Animate(ulong flag);
+
+ virtual void/*?*/ SetTagProcessor(ut::TagProcessorBase<wchar_t> *tagProc);
+
+ ut::LinkList animations;
+
+ Pane *rootPane;
+ GroupContainer *groupContainer;
+
+ float width;
+ float height;
+ };
+
+
+ class DrawInfo {
+ public:
+ DrawInfo();
+ virtual ~DrawInfo();
+
+ Mtx matrix;
+ float left;
+ float top;
+ float right;
+ float bottom;
+ float scaleX;
+ float scaleY;
+ float alpha;
+ u8 _50; // this is actually a bitfield. todo: investigate how CW handles bitfields, and so on
+ };
+
+
+ class Material {
+ public:
+ // ...
+ };
+
+ class Pane {
+ public:
+ //Pane(nw4r::lyt::res::Pane const *); // todo: this struct
+ Pane(void *);
+ virtual ~Pane();
+
+ virtual void *GetRuntimeTypeInfo() const;
+ virtual void CalculateMtx(const DrawInfo &info);
+
+ virtual void Draw(const DrawInfo &info);
+ virtual void DrawSelf(const DrawInfo &info);
+ virtual void Animate(ulong flag);
+ virtual void AnimateSelf(ulong flag);
+
+ virtual ut::Color GetVtxColor(ulong id) const;
+ virtual void SetVtxColor(ulong id, ut::Color color);
+ virtual uchar GetColorElement(ulong id) const;
+ virtual void SetColorElement(ulong id, uchar value);
+ virtual uchar GetVtxColorElement(ulong id) const;
+ virtual void SetVtxColorElement(ulong id, uchar value);
+
+ virtual Pane *FindPaneByName(const char *name, bool recursive);
+ virtual Material *FindMaterialByName(const char *name, bool recursive);
+
+ virtual void/*?*/ BindAnimation(AnimTransform *anim, bool unk1, bool unk2);
+ virtual void UnbindAnimation(AnimTransform *anim, bool unk);
+ virtual void UnbindAllAnimation(bool unk);
+ virtual void UnbindAnimationSelf(AnimTransform *anim);
+
+ virtual ut::LinkListNode *FindAnimationLinkSelf(AnimTransform *anim);
+ virtual ut::LinkListNode *FindAnimationLinkSelf(const AnimResource &anim);
+
+ virtual void SetAnimationEnable(AnimTransform *anim, bool unk1, bool unk2);
+ virtual void SetAnimationEnable(const AnimResource &anim, bool unk1, bool unk2);
+
+ virtual ulong GetMaterialNum() const;
+ virtual Material *GetMaterial() const;
+ virtual Material *GetMaterial(ulong id) const;
+
+ virtual void LoadMtx(const DrawInfo &info);
+
+ void AppendChild(Pane *child);
+
+ ut::Rect GetPaneRect(const DrawInfo &info) const;
+
+ ut::LinkListNode *AddAnimationLink(AnimationLink *link);
+
+ Vec2 GetVtxPos() const;
+
+
+ ut::LinkListNode parentLink;
+ Pane *parent;
+
+ ut::LinkList children;
+ ut::LinkList animations;
+
+ Material *material;
+
+ Vec trans;
+ Vec rotate;
+ Vec2 scale;
+ Vec2 size;
+
+ Mtx calcMtx;
+ Mtx effectiveMtx;
+
+ float _B4;
+
+ u8 alpha;
+ u8 effectiveAlpha;
+ u8 origin;
+ u8 flag;
+
+ char name[0x11];
+ char userdata[8];
+
+ u8 _D5;
+ u8 paneIsOwnedBySomeoneElse;
+ u8 _D7;
+ };
+
+ class TextBox : public Pane {
+ public:
+ TextBox(void *, void *); // todo: TextBox((res::TextBox const *,ResBlockSet const &))
+ ~TextBox();
+
+ void *GetRuntimeTypeInfo() const;
+
+ void DrawSelf(const DrawInfo &info);
+
+ ut::Color GetVtxColor(ulong id) const;
+ void SetVtxColor(ulong id, ut::Color color);
+ uchar GetVtxColorElement(ulong id) const;
+ void SetVtxColorElement(ulong id, uchar value);
+
+ virtual void LoadMtx(const DrawInfo &info);
+
+ virtual void AllocStringBuffer(u16 size);
+ virtual void FreeStringBuffer();
+
+ virtual u16 SetString(const wchar_t *str, u16 destOffset = 0);
+ virtual u16 SetString(const wchar_t *str, u16 destOffset, u16 length);
+
+ wchar_t *stringBuf;
+
+ ut::Color colour1, colour2;
+ void *font; // actually a ut::ResFont or whatever
+
+ float fontSizeX, fontSizeY;
+ float lineSpace, charSpace;
+
+ void *tagProc; // actually a TagProcessor
+
+ u16 bufferLength;
+ u16 stringLength;
+
+ u8 alignment;
+ u8 flags;
+ };
+}
+
+
+
+namespace g3d {
+struct CameraData
+{
+enum Flag
+ {
+FLAG_CAMERA_LOOKAT = 0x00000001,
+FLAG_CAMERA_ROTATE = 0x00000002,
+FLAG_CAMERA_AIM = 0x00000004,
+MASK_CAMERA = 0x00000007,
+
+FLAG_CMTX_VALID = 0x00000008,
+
+FLAG_PROJ_FLUSTUM = 0x00000010,
+FLAG_PROJ_PERSP = 0x00000020,
+FLAG_PROJ_ORTHO = 0x00000040,
+MASK_PROJ = 0x00000070,
+
+FLAG_PMTX_VALID = 0x00000080,
+
+FLAG_VIEWPORT_JITTER_ABOVE = 0x00000100
+ };
+
+Mtx cameraMtx;
+Mtx44 projMtx;
+
+u32 flags;
+
+VEC3 cameraPos;
+VEC3 cameraUp;
+VEC3 cameraTarget;
+VEC3 cameraRotate;
+f32 cameraTwist;
+
+GXProjectionType projType;
+f32 projFovy;
+f32 projAspect;
+f32 projNear;
+f32 projFar;
+f32 projTop;
+f32 projBottom;
+f32 projLeft;
+f32 projRight;
+
+f32 lightScaleS;
+f32 lightScaleT;
+f32 lightTransS;
+f32 lightTransT;
+
+VEC2 viewportOrigin;
+VEC2 viewportSize;
+f32 viewportNear;
+f32 viewportFar;
+
+u32 scissorX;
+u32 scissorY;
+u32 scissorWidth;
+u32 scissorHeight;
+
+s32 scissorOffsetX;
+s32 scissorOffsetY;
+};
+
+/* Correct camera
+cameraMtx:
+1.0 0.0 0.0 -0.0
+0.0 1.0 0.0 -0.0
+0.0 0.0 1.0 -6000.0
+
+projMtx:
+0.002345 0.000000 0.000000 -1.000000
+0.000000 0.004386 0.000000 -1.000000
+0.000000 0.000000 -0.000005 -0.500000
+0.000000 0.000000 0.000000 1.000000
+
+flags: 000000C9 : FLAG_CAMERA_LOOKAT | FLAG_CMTX_VALID | FLAG_PROJ_ORTHO | FLAG_PMTX_VALID
+
+cameraPos: {0, 0, 15}
+cameraUp: {0, 1, 0}
+cameraTarget: {0, 0, 0}
+cameraRotate: {0, 0, 0}
+cameraTwist: 0
+
+projType: 1
+projFovy: 60
+projAspect: 1.333333
+projNear: -100000
+projFar: 100000
+projTop: 456
+projBottom: 0
+projLeft: 0
+projRight: 853
+
+lightScaleS: 0.5
+lightScaleT: 0.5
+lightTransS: 0.5
+lightTransT: 0.5
+
+viewportOrigin: {0,0}
+viewportSize: {640,456}
+viewportNear: 0
+viewportFar: 1
+
+scissorX: 0
+scissorY: 0
+scissorWidth: 0x280
+scissorHeight: 0x1C8
+
+scissorOffsetX: 0
+scissorOffsetY: 0
+*/
+
+class Camera {
+public:
+ enum PostureType { POSTURE_LOOKAT, POSTURE_ROTATE, POSTURE_AIM };
+ struct PostureInfo
+ {
+ PostureType tp;
+ VEC3 cameraUp;
+ VEC3 cameraTarget;
+ VEC3 cameraRotate;
+ f32 cameraTwist;
+ };
+private:
+ CameraData *data;
+public:
+ Camera(CameraData *pCamera);
+ void Init();
+ void Init(u16 efbWidth, u16 efbHeight, u16 xfbWidth, u16 xfbHeight, u16 viWidth, u16 viHeight);
+ //void SetPosition(f32 x, f32 y, f32 z);
+ void SetPosition(const VEC3 &pos);
+ //void GetPosition(f32 *px, f32 *py, f32 *pz) const;
+ void GetPosition(VEC3 *pPos) const;
+ void SetPosture(const PostureInfo &info);
+ //void GetPosture(PostureInfo *info) const;
+ void SetCameraMtxDirectly(const Mtx &mtx);
+ void GetCameraMtx(Mtx *pMtx) const;
+ void SetOrtho(f32 top, f32 bottom, f32 left, f32 right, f32 near, f32 far);
+ //void SetFrustum(f32 top, f32 bottom, f32 left, f32 right, f32 near, f32 far);
+ void SetPerspective(f32 fovy, f32 aspect, f32 near, f32 far);
+ void SetProjectionMtxDirectly(const Mtx44 *pMtx);
+ void GetProjectionMtx(Mtx44 *pMtx) const;
+ //GXProjectionType GetProjectionType() const;
+ void SetScissor(u32 xOrigin, u32 yOrigin, u32 width, u32 height);
+ void SetScissorBoxOffset(s32 xOffset, s32 yOffset);
+ //void GetScissor(u32 *xOrigin, u32 *yOrigin, u32 *width, u32 *height);
+ void SetViewport(f32 xOrigin, f32 yOrigin, f32 width, f32 height);
+ //void SetViewport(f32 xOrigin, f32 yOrigin, f32 width, f32 height, f32 near, f32 far);
+ void SetViewportZRange(f32 near, f32 far);
+ void SetViewportJitter(u32 field);
+ //void SetViewportJitter(f32 xOrigin, f32 yOrigin, f32 width, f32 height, f32 near, f32 far, u32 field);
+ void GetViewport(f32 *xOrigin, f32 *yOrigin, f32 *width, f32 *height, f32 *near, f32 *far) const;
+ void GXSetViewport() const;
+ void GXSetProjection() const;
+ void GXSetScissor() const;
+ void GXSetScissorBoxOffset() const;
+};
+
+namespace G3DState {
+ GXRenderModeObj *GetRenderModeObj();
+}
+}
+}
+
+
+nw4r::g3d::CameraData *GetCameraByID(int id);
+
+int GetCurrentCameraID(); // 80164C80
+void SetCurrentCameraID(int id); // 80164C90
+
+void LinkScene(int id); // 80164D50
+void UnlinkScene(int id); // 80164CD0
+
+void SceneCalcWorld(int sceneID); // 80164E10
+void SceneCameraStuff(int sceneID); // 80164EA0
+
+void CalcMaterial(); // 80164E90
+void DrawOpa(); // 80164F70
+void DrawXlu(); // 80164F80
+
+bool ChangeAlphaUpdate(bool enable); // 802D3270
+
+void DoSpecialDrawing1(); // 8006CAE0
+void DoSpecialDrawing2(); // 8006CB40
+
+void SetupLYTDrawing(); // 80163360
+void ClearLayoutDrawList(); // 801632B0
+
+void DrawAllLayoutsBeforeX(int x); // 80163440
+void DrawAllLayoutsAfterX(int x); // 801634D0
+void DrawAllLayoutsAfterXandBeforeY(int x, int y); // 80163560
+
+void RenderEffects(int v1, int v2); // 80093F10
+
+void RemoveAllFromScnRoot(); // 80164FB0
+void Reset3DState(); // 80165000
+
+extern "C" void GXDrawDone(); // 801C4FE0
+
+
+
+namespace m2d {
+ class Base_c /*: public nw4r::ut::Link what's this? */ {
+ public:
+ u32 _00;
+ u32 _04;
+
+ Base_c();
+ virtual ~Base_c();
+ virtual void draw(); // don't call this directly
+
+ void scheduleForDrawing();
+
+ u8 drawOrder;
+ };
+
+ class Simple_c : public Base_c {
+ public:
+ nw4r::lyt::Layout layout;
+ nw4r::lyt::DrawInfo drawInfo;
+
+ u32 _84;
+ float _88;
+ float _8C;
+ float _90;
+ u32 _94;
+
+ Simple_c();
+ ~Simple_c();
+
+ void draw();
+ virtual void _vf10();
+ virtual void _vf14();
+ };
+}
+
+
+
+namespace EGG {
+ class Frustum {
+ public:
+ GXProjectionType projType;
+ int isCentered;
+ float width;
+ float height;
+ float fovy;
+ float dunno;
+ float near;
+ float far;
+ float center_x_maybe;
+ float center_y_maybe;
+ float x_direction;
+ float unk2;
+ float unk3;
+ short some_flag_bit;
+
+
+ // isCentered might actually be isNotCentered, dunno
+ Frustum(GXProjectionType projType, Vec2 size, bool isCentered, float near, float far); // 802C6D20
+ Frustum(Frustum &f); // 802C6D90
+ virtual ~Frustum(); // 802C75F0
+
+ virtual void loadDirectly(); // 802C7050
+ virtual void loadIntoCamera(nw4r::g3d::Camera cam); // 802C7070
+
+ void setOrtho(float top, float bottom, float left, float right, float near, float far); // 802C6DD0
+
+ void setFovy(float newFovy); // 802C6F60
+
+ void getCenterPointsBasedOnPos(float x, float y, float *destX, float *destY); // 802C6FD0
+
+ // no idea what this does
+ float getSomethingForPerspective(float blah); // 802C7020
+
+
+ protected:
+ // not all of these might be protected, dunno
+
+ void copyAllFields(Frustum &f); // 802C6EE0
+
+ void saveSomething(float f1, float f2, float f3, float f4); // 802C70C0
+ void loadSomething(float *f1, float *f2, float *f3, float *f4); // 802C70E0
+
+ void loadPerspective(); // 802C7110
+ void loadOrtho(); // 802C7140
+
+ void setCameraPerspective(nw4r::g3d::Camera cam); // 802C7170
+ void setCameraOrtho(nw4r::g3d::Camera cam); // 802C71E0
+
+ void getPerspectiveProjMtx(Mtx44 *mtx); // 802C7250
+ void getPerspectiveProjv(float *ptr); // 802C72E0
+ void getOrthoProjv(float *ptr); // 802C73A0
+
+ void getOrthoVars(float *top, float *bottom, float *left, float *right); // 802C7480
+ };
+}
+
+
+class TileRenderer {
+public:
+ TileRenderer();
+ ~TileRenderer();
+
+ TileRenderer *list1, *list2;
+ u16 tileNumber;
+ u8 unkFlag, someBool;
+ float x, y, z;
+ float scale;
+ s16 rotation;
+ u8 unkByte;
+
+ u16 getTileNum();
+ bool getSomeBool();
+ void setSomeBool(u8 value);
+
+ float getX();
+ float getY();
+ float getZ();
+ void setPosition(float x, float y);
+ void setPosition(float x, float y, float z);
+
+ u8 getUnkFlag();
+
+ void setVars(float scale); // sets unkFlag=1, rotation=0, unkByte=0
+ void setVars(float scale, s16 rotation); // sets unkFlag=2, unkByte=0
+
+ float getScale();
+ float getRotationFloat();
+ s16 getRotation();
+
+ u8 getUnkByte();
+
+ class List {
+ public:
+ u32 count;
+ TileRenderer *first, *last; // order?
+
+ void add(TileRenderer *r);
+ void remove(TileRenderer *r);
+ void removeAll();
+
+ List();
+ ~List();
+ };
+};
+
+class dActor_c; // forward declaration
+
+class Physics {
+public:
+ struct Unknown {
+ Unknown();
+ ~Unknown();
+
+ float x, y;
+ };
+
+ struct Info {
+ float x1, y1, x2, y2; // Might be distance to center/edge like APhysics
+ void *otherCallback1, *otherCallback2, *otherCallback3;
+ };
+
+ Physics();
+ ~Physics();
+
+ dActor_c *owner;
+ Physics *next, *prev;
+ u32 _C, _10, _14, _18, _1C, _20, _24, _28, _2C, _30, _34, _38, _3C;
+ void *otherCallback1, *otherCallback2, *otherCallback3;
+ void *callback1, *callback2, *callback3;
+ float lastX, lastY;
+ Unknown unkArray[4];
+ float x, y;
+ float _88, _8C, _90;
+ Vec lastActorPosition;
+ float _A0, _A4, last_A0, last_A4, _B0, _B4;
+ u32 _B8;
+ s16 *ptrToRotationShort;
+ s16 currentRotation;
+ s16 rotDiff;
+ s16 rotDiffAlt;
+ u32 isRound;
+ u32 _CC;
+ u32 flagsMaybe;
+ u32 _D4, _D8;
+ u8 isAddedToList, _DD, layer;
+ u32 id;
+
+ void addToList();
+ void removeFromList();
+
+ void baseSetup(dActor_c *actor, u32 t_40, u32 t_44, u32 t_48, u8 t_DD, u8 layer);
+
+ // note: Scale can be a null pointer (in that case, it'll use 1.0)
+ void setup(dActor_c *actor,
+ float x1, float y1, float x2, float y2,
+ void *otherCB1, void *otherCB2, void *otherCB3,
+ u8 t_DD, u8 layer, Vec2 *scale = 0);
+
+ void setup(dActor_c *actor,
+ Vec2 *p1, Vec2 *p2,
+ void *otherCB1, void *otherCB2, void *otherCB3,
+ u8 t_DD, u8 layer, Vec2 *scale = 0);
+
+ void setup(dActor_c *actor, Info *pInfo, u8 t_DD, u8 layer, Vec2 *scale = 0);
+
+ // radius might be diameter? dunno
+ void setupRound(dActor_c *actor,
+ float x, float y, float radius,
+ void *otherCB1, void *otherCB2, void *otherCB3,
+ u8 t_DD, u8 layer);
+
+ void setRect(float x1, float y1, float x2, float y2, Vec2 *scale = 0);
+ void setRect(Vec2 *p1, Vec2 *p2, Vec2 *scale = 0);
+
+ void setX(float value);
+ void setY(float value);
+ void setWidth(float value);
+ void setHeight(float value);
+
+ void setPtrToRotation(s16 *ptr);
+
+ void update();
+
+ // todo: more stuff that might not be relevant atm
+};
+
+
+class ActivePhysics {
+public:
+ struct Info; // forward declaration
+ typedef void (*Callback)(Info *self, Info *other);
+
+ struct Info {
+ float xDistToCenter;
+ float yDistToCenter;
+ float xDistToEdge;
+ float yDistToEdge;
+ u8 category1;
+ u8 category2;
+ u32 bitfield1;
+ u32 bitfield2;
+ u16 unkShort1C;
+ Callback callback;
+ };
+
+ ActivePhysics();
+ virtual ~ActivePhysics();
+
+ dActor_c *owner; // should be dStageActor? dunno
+ u32 _8;
+ u32 _C;
+ ActivePhysics *listPrev, *listNext;
+ u32 _18;
+ Info info;
+ u32 _40, _44, _48, _4C;
+ float firstFloatArray[8];
+ float secondFloatArray[8];
+ Vec2 positionOfLastCollision;
+ u16 result1;
+ u16 result2;
+ u16 result3;
+ u8 collisionCheckType;
+ u8 chainlinkMode;
+ u8 layer;
+ u8 someFlagByte;
+ u8 isLinkedIntoList;
+};
+
+
+#include <statelib.h>
+
+class dActorState_c;
+class dActorMultiState_c;
+
+
+class AcStateMgrBase {
+public:
+ virtual ~AcStateMgrBase();
+
+ u32 cls1, cls2, cls3;
+ dActorMultiState_c *owner;
+ u32 unkZero;
+
+ StateMgr<dActorMultiState_c> manager;
+
+ // All these are passed straight through to the manager
+ virtual void _vfC();
+ virtual void _vf10();
+ virtual void _vf14();
+ virtual void _vf18();
+ virtual void _vf1C();
+ virtual void _vf20();
+ virtual void _vf24();
+ virtual void _vf28();
+ virtual void _vf2C();
+};
+
+class AcStateMgr : public AcStateMgrBase {
+public:
+ ~AcStateMgr();
+};
+
+class MultiStateMgrBase {
+public:
+ virtual ~MultiStateMgrBase();
+
+ AcStateMgr s1, s2;
+ AcStateMgr *ptrToStateMgr;
+
+ virtual void _vfC(); // calls vfC on ptrToStateMgr
+ virtual void execute(); // calls vf10 on ptrToStateMgr
+ virtual void _vf14(); // if (isSecondStateMgr()) { disableSecond(); } else { ptrToStateMgr->_vf14(); }
+ virtual void setState(StateBase *state); // calls vf18 on ptrToStateMgr
+ virtual void _vf1C(); // calls vf1C on ptrToStateMgr
+ virtual void _vf20(); // calls vf20 on ptrToStateMgr
+ virtual void _vf24(); // calls vf24 on ptrToStateMgr
+ virtual StateBase *getCurrentState(); // calls vf28 on ptrToStateMgr
+ virtual void _vf2C(); // calls vf2C on ptrToStateMgr
+ virtual void enableSecond(); // sets ptrToStateMgr to s2, calls vf18 on it
+ virtual void disableSecond(); // if (isSecondStateMgr()) { ptrToStateMgr->vf14(); ptrToStateMgr = &s1; }
+ virtual bool isSecondStateMgr();
+ virtual void _vf3C(); // calls vf28 on s1
+};
+
+class MultiStateMgr : public MultiStateMgrBase {
+public:
+ // what the fuck does this do
+ ~MultiStateMgr();
+};
+
+
+struct LinkListEntry {
+ LinkListEntry *prev;
+ LinkListEntry *next;
+ void *owned_obj;
+};
+
+
+struct LinkList {
+ LinkListEntry *first;
+ LinkListEntry *last;
+ // PTMF goes here, but I don't know how to represent it
+};
+
+
+struct OrderedLinkListEntry : LinkListEntry {
+ u16 order;
+ u16 _;
+};
+
+
+struct TreeNode {
+ TreeNode *parent;
+ TreeNode *child;
+ TreeNode *prev;
+ TreeNode *next;
+ void *owned_obj;
+};
+
+
+struct Tree {
+ TreeNode *firstNode;
+ // PTMF goes here, but I don't know how to represent it
+};
+
+
+typedef bool (*ChainedFunc)(void*);
+
+class FunctionChain {
+public:
+ ChainedFunc *functions;
+ u16 count;
+ u16 current;
+
+ void setup(ChainedFunc *functions, u16 count); // 8015F740
+};
+
+
+class fBase_c {
+public:
+ u32 id;
+ u32 settings;
+ u16 name;
+ u8 _A;
+ u8 _B;
+ u8 _C;
+ u8 _D;
+ u8 base_type;
+ u8 _F;
+ TreeNode link_connect;
+ OrderedLinkListEntry link_execute;
+ OrderedLinkListEntry link_draw;
+ LinkListEntry link_IDlookup;
+ u32 _50;
+ u32 _54;
+ u32 _58;
+ u32 heap;
+
+ fBase_c();
+
+ virtual int onCreate();
+ virtual int beforeCreate();
+ virtual int afterCreate(int);
+
+ virtual int onDelete();
+ virtual int beforeDelete();
+ virtual int afterDelete(int);
+
+ virtual int onExecute();
+ virtual int beforeExecute();
+ virtual int afterExecute(int);
+
+ virtual int onDraw();
+ virtual int beforeDraw();
+ virtual int afterDraw(int);
+
+ virtual void willBeDeleted();
+
+ virtual bool moreHeapShit(u32 size, void *parentHeap);
+ virtual bool createHeap(u32 size, void *parentHeap);
+ virtual void heapCreated();
+
+ virtual ~fBase_c();
+
+ void Delete();
+
+ fBase_c *GetParent();
+ fBase_c *GetChild();
+ fBase_c *GetNext();
+
+ bool hasUninitialisedProcesses(); // 80162B60
+};
+
+class dBase_c : public fBase_c {
+public:
+ u32 _64;
+ const char *explanation_string;
+ const char *name_string;
+
+ dBase_c();
+
+ int beforeCreate();
+ int afterCreate(int);
+ int beforeDelete();
+ int afterDelete(int);
+ int beforeExecute();
+ int afterExecute(int);
+ int beforeDraw();
+ int afterDraw(int);
+
+ ~dBase_c();
+
+ virtual const char *GetExplanationString();
+};
+
+class dScene_c : public dBase_c {
+public:
+ FunctionChain *ptrToInitChain;
+
+ dScene_c();
+
+ int beforeCreate();
+ int afterCreate(int);
+ int beforeDelete();
+ int afterDelete(int);
+ int beforeExecute();
+ int afterExecute(int);
+ int beforeDraw();
+ int afterDraw(int);
+
+ ~dScene_c();
+
+
+ void setInitChain(FunctionChain &initChain) {
+ ptrToInitChain = &initChain;
+ }
+};
+
+class dActor_c : public dBase_c {
+public:
+ LinkListEntry link_actor;
+ Mtx matrix;
+ Vec pos;
+ Vec last_pos;
+ Vec pos_delta;
+ Vec _D0;
+ Vec scale;
+ Vec speed;
+ Vec max_speed;
+ S16Vec rot;
+ S16Vec _106;
+ u32 _10C;
+ u32 _110;
+ float y_speed_inc;
+ u32 _118;
+ float x_speed_inc;
+ u32 _120;
+ bool visible;
+
+ dActor_c();
+
+ virtual void specialDraw1();
+ virtual void specialDraw2();
+ virtual int _vf58();
+ virtual void _vf5C();
+
+ ~dActor_c();
+};
+
+class dStageActor_c : public dActor_c {
+public:
+ u8 _125;
+ u32 _128, _12C, _130, _134, _138, _13C;
+ float _140;
+ u32 _144;
+ ActivePhysics aPhysics;
+ u8 classAt1EC[236];
+ u32 _2D8;
+ u8 classAt2DC[0x34];
+ u32 _310, _314;
+ float spriteSomeRectX, spriteSomeRectY;
+ float _320, _324, _328, _32C, _330, _334, _338, _33C, _340, _344;
+ u8 direction;
+ u8 currentZoneID;
+ u8 _34A, _34B;
+ u8 *spriteByteStorage;
+ u16 *spriteShortStorage;
+ u16 spriteEventNum;
+ u64 spriteEventMask;
+ u32 _360;
+ u16 spriteSomeFlag;
+ u8 _366, _367;
+ u32 _368;
+ u8 _36C, _36D;
+ Vec somethingRelatedToScale;
+ u32 _37C, _380, _384, _388;
+ u8 _38C, _38D, enableFlag, currentLayerID;
+ u8 _390, _391, _392, _padding;
+
+ dStageActor_c();
+
+ int beforeCreate();
+ int afterCreate(int);
+ int beforeDelete();
+ int afterDelete(int);
+ int beforeExecute();
+ int afterExecute(int);
+ int beforeDraw();
+ int afterDraw(int);
+
+ const char *GetExplanationString();
+
+ virtual bool _vf60(); // does stuff with BG_GM
+ virtual void kill(); // nullsub here, defined in StageActor. probably no params
+ virtual int _vf68(); // params unknown. return (1) might be bool
+ virtual u8 *_vf6C(); // returns byte 0x38D
+ virtual Vec2 _vf70(); // returns Vec Actor.pos + Vec Actor.field_D0
+ virtual int _vf74(); // params unknown. return (1) might be bool
+ virtual void _vf78(); // params unknown. nullsub
+ virtual void _vf7C(); // params unknown. nullsub
+ virtual void eatIn(); // copies Actor.scale into StageActor.somethingRelatedToScale
+ virtual void disableEatIn(); // params unknown. nullsub
+ virtual void _vf88(); // params unknown. nullsub
+ virtual bool _vf8C(void *other); // dAcPy_c/daPlBase_c? return (1) is probably bool. seems related to EatOut. uses vfA4
+ virtual bool _vf90(dStageActor_c *other); // does something with scores
+ virtual void _vf94(void *other); // dAcPy_c/daPlBase_c? modifies This's position
+ virtual void removeMyActivePhysics();
+ virtual void addMyActivePhysics();
+ virtual void returnRegularScale(); // the reverse of vf80, yay
+ virtual void _vfA4(void *other); // AcPy/PlBase? similar to vf94 but not quite the same
+ virtual float _vfA8(void *other); // AcPy/PlBase? what DOES this do...? does a bit of float math
+ virtual void _vfAC(void *other); // copies somethingRelatedToScale into scale, then multiplies scale by vfA8's return
+ virtual void _vfB0(); // plays Wm_en_burst_s at actor position
+ virtual void _vfB4(); // params unknown. nullsub
+ virtual void _vfB8(); // params unknown. nullsub
+ virtual void _vfBC(); // params unknown. nullsub
+ virtual void _vfC0(); // params unknown. nullsub
+ virtual void _vfC4(); // params unknown. nullsub
+ virtual void _vfC8(Vec2 *p); // does stuff including effects and playing PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH
+ virtual void _vfCC(Vec2 *p); // mostly same as vfC8, but uses PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH_LAVA
+ virtual void _vfD0(Vec2 *p); // mostly same as vfC8, but uses PLAYER_SE_OBJ/GROUP_BOOT/SE_OBJ_CMN_SPLASH_POISON
+
+ // I'll add methods as I need them
+ void checkZoneBoundaries(u32 flags); // I think this method is for that, anyway
+
+ ~dStageActor_c();
+
+
+ static void create(Actors type, u32 settings, Vec *pos, S16Vec *rot, u8 layer);
+ static void createChild(Actors type, u32 settings, Vec *pos, S16Vec *rot, u8 layer);
+};
class dAc_Py_c : public dStageActor_c {
public:
u8 data[0x1164 - 0x394];
- ActivePhysics bPhysics;
- ActivePhysics cPhysics;
- ActivePhysics dPhysics;
+ ActivePhysics bPhysics;
+ ActivePhysics cPhysics;
+ ActivePhysics dPhysics;
ActivePhysics ePhysics;
- dAc_Py_c();
+ dAc_Py_c();
- int beforeCreate();
- int afterCreate(int);
- int beforeDelete();
- int afterDelete(int);
- int beforeExecute();
- int afterExecute(int);
- int beforeDraw();
+ int beforeCreate();
+ int afterCreate(int);
+ int beforeDelete();
+ int afterDelete(int);
+ int beforeExecute();
+ int afterExecute(int);
+ int beforeDraw();
int afterDraw(int);
-
- ~dAc_Py_c();
+
+ ~dAc_Py_c();
+};
+
+
+/* TODO
+class dActorState_c : public dStageActor_c {
+public:
+ ~dActorState_c();
+
+ virtual void _vfD4();
+ virtual void _vfD8();
+ virtual void _vfDC();
+};
+*/
+
+
+class dActorMultiState_c : public dStageActor_c {
+public:
+ ~dActorMultiState_c();
+
+ MultiStateMgr acState;
+
+ virtual void doStateChange(StateBase *state); // might return bool? overridden by dEn_c
+ virtual void _vfD8(); // nullsub ??
+ virtual void _vfDC(); // nullsub ??
+ virtual void _vfE0(); // nullsub ??
+};
+
+
+class dEn_c : public dActorMultiState_c {
+public:
+ float _414, _418, _41C, _420;
+ void *nextState;
+ u32 _428, _42C;
+ u8 _430, _431, isDead;
+ u32 _434;
+ u16 _438;
+ u32 _43C;
+ Vec velocity1, velocity2;
+ u8 _458, _459, _45A, _45B, _45C, _45D, _45E;
+ u32 _460;
+ Vec initialScale;
+ float _470;
+ u32 _474, _478;
+ dEn_c *_47C;
+ u32 _480;
+ u8 classAt484[0x4EC - 0x484];
+ u32 _4EC;
+ float _4F0, _4F4, _4F8;
+ u32 flags_4FC;
+ u16 counter_500, counter_502;
+ u16 counter_504[4];
+ u16 counter_50C;
+ u32 _510, _514, _518;
+ void *_51C;
+ dEn_c *_520;
+ u32 _524, _528, _52C, _530;
+
+ dEn_c();
+
+ int afterCreate(int);
+ int beforeExecute(int);
+ int afterExecute(int);
+ int beforeDraw(int);
+
+ void kill();
+
+ void eatIn();
+ void disableEatIn();
+ bool _vf8C(void *other); // AcPy/PlBase?
+ void _vfAC();
+ void _vfCC(Vec2 *p);
+ void _vfD0(Vec2 *p);
+
+ void doStateChange(StateBase *state); // might return bool, dunno
+
+ // Now here's where the fun starts.
+
+ virtual bool preSpriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual bool prePlayerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual bool preYoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ virtual bool stageActorCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ virtual void spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ // WHAT A MESS
+ virtual void collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat5_Mario(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void _vf108(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void _vf110(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat8_FencePunch(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void _vf120(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat11_PipeCannon(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther);
+ virtual void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther);
+
+ virtual void _vf140(dStageActor_c *actor);
+ virtual void _vf144(int something);
+ virtual void _vf148(); // deletes actors held by Class484 and other stuff
+ virtual void _vf14C(); // deletes actors held by Class484 and makes an En Coin Jump
+ virtual u32 _vf150(); // reads some bits from a value in Class1EC
+ virtual void eatenByYoshiProbably(); // nullsub, params unknown
+ virtual void playHpdpSound1(); // plays PLAYER_SE_EMY/GROUP_BOOT/SE_EMY_DOWN_HPDP_S or _H
+ virtual void playEnemyDownSound1();
+ virtual void playEnemyDownComboSound(void *player); // AcPy_c/daPlBase_c?
+ virtual void playHpdpSound2(); // plays PLAYER_SE_EMY/GROUP_BOOT/SE_EMY_DOWN_HPDP_S or _H
+ virtual void _vf168(); // nullsub, params unknown
+
+ // State Functions
+ virtual void dieFumi_Begin(); // does something involving looping thruogh players
+ virtual void dieFumi_Execute(); // does movement and some other stuff
+ virtual void dieFumi_End(); // nullsub
+ virtual void dieFall_Begin(); // does something involving looping thruogh players
+ virtual void dieFall_Execute(); // does movement and some other stuff
+ virtual void dieFall_End(); // nullsub
+ virtual void dieBigFall_Begin(); // calls vf178 [dieFall_Begin]
+ virtual void dieBigFall_Execute(); // does movement and some other stuff (but less than 170 and 17C)
+ virtual void dieBigFall_End(); // calls vf180 [dieFall_End]
+ virtual void dieSmoke_Begin(); // spawns Wm_en_burst_m effect and then removeMyActivePhysics
+ virtual void dieSmoke_Execute(); // deletes actor with r4=1
+ virtual void dieSmoke_End(); // nullsub
+ virtual void dieYoshiFumi_Begin(); // spawns Wm_mr_yoshistep effect and then removeMyActivePhysics
+ virtual void dieYoshiFumi_Execute(); // deletes actor with r4=1
+ virtual void dieYoshiFumi_End(); // nullsub
+ virtual void dieIceVanish_Begin(); // lots of weird stuff
+ virtual void dieIceVanish_Execute(); // deletes actor with r4=1
+ virtual void dieIceVanish_End(); // nullsub
+ virtual void dieGoal_Begin(); // nullsub
+ virtual void dieGoal_Execute(); // nullsub
+ virtual void dieGoal_End(); // nullsub
+ virtual void dieOther_Begin(); // deletes actor with r4=1
+ virtual void dieOther_Execute(); // nullsub
+ virtual void dieOther_End(); // nullsub
+ virtual void eatIn_Begin(); // nullsub
+ virtual void eatIn_Execute(); // changes to EatNow on one condition, otherwise calls vfAC
+ virtual void eatIn_End(); // nullsub
+ virtual void eatNow_Begin(); // nullsub
+ virtual void eatNow_Execute(); // nullsub
+ virtual void eatNow_End(); // nullsub
+ virtual void eatOut_Begin(); // nullsub
+ virtual void eatOut_Execute(); // nullsub
+ virtual void eatOut_End(); // nullsub
+ virtual void hitSpin_Begin(); // nullsub
+ virtual void hitSpin_Execute(); // nullsub
+ virtual void hitSpin_End(); // nullsub
+ virtual void ice_Begin(); // does stuff with Class484 and lots of vf's
+ virtual void ice_Execute(); // tons of stuff with Class484
+ virtual void ice_End(); // sets a field in Class484 to 0
+
+ virtual void spawnHitEffectAtPosition(Vec2 pos);
+ virtual void doSomethingWithHardHitAndSoftHitEffects(Vec pos);
+ virtual void playEnemyDownSound2();
+ virtual void add2ToYSpeed();
+ virtual bool _vf218(); // stuff with floats and camera
+ virtual void _vf21C(); // does stuff with the speeds
+ virtual void _vf220(void *other); // some type of actor, PlBase? calls vf3F4 on other with r4=this, r5=0
+ virtual void _vf224(); // stores a couple of values into the struct at 464
+ virtual void _vf228(); // more fun stuff with 464 and floats
+ virtual bool _vf22C(); // does stuff involving ICE_ACTORs and arrays
+ virtual void _vf230(); // "relatedToPlayerOrYoshiCollision" apparently. nullsub, params unknown for now.
+ virtual void _vf234(); // nullsub, params unknown
+ virtual void _vf238(); // calls vf34 on class394, params unknown
+ virtual void _vf23C(); // nullsub, params unknown
+ virtual void _vf240(); // nullsub, params unknown
+ virtual int _vf244(); // returns 0. might be bool. params unknown
+ virtual int _vf248(int something); // does some math involving field510 and [7,7,4,0] and param
+ virtual void _vf24C(void *other); // deals with something in the class involving the bahp flag
+ virtual void _vf250(void *other);
+ virtual void _vf254(void *other);
+ virtual void _vf258(void *other);
+ virtual void _vf25C(void *other); // calls vf250
+ virtual void _vf260(void *other); // AcPy/PlBase? plays the SE_EMY_FUMU_%d sounds based on some value
+ virtual void _vf264(dStageActor_c *other); // if other is player or yoshi, do Wm_en_hit and a few other things
+ virtual void _vf268(void *other); // AcPy/PlBase? plays the SE_EMY_DOWN_SPIN_%d sounds based on some value
+ virtual void spawnHitEffectAtPositionAgain(Vec2 pos);
+ virtual void playMameStepSound(); // SE_EMY_MAME_STEP at actor position
+ virtual void _vf274(); // nullsub, params unknown
+ virtual void _vf278(void *other); // AcPy/PlBase? plays the SE_EMY_YOSHI_FUMU_%d sounds based on some value
+ virtual void _vf27C(); // nullsub, params unknown
+
+ ~dEn_c();
};
-
-
-/* TODO
-class dActorState_c : public dStageActor_c {
-public:
- ~dActorState_c();
-
- virtual void _vfD4();
- virtual void _vfD8();
- virtual void _vfDC();
-};
-*/
-
-
-class dActorMultiState_c : public dStageActor_c {
-public:
- ~dActorMultiState_c();
-
- MultiStateMgr acState;
-
- virtual void doStateChange(StateBase *state); // might return bool? overridden by dEn_c
- virtual void _vfD8(); // nullsub ??
- virtual void _vfDC(); // nullsub ??
- virtual void _vfE0(); // nullsub ??
-};
-
-
-class dEn_c : public dActorMultiState_c {
-public:
- float _414, _418, _41C, _420;
- void *nextState;
- u32 _428, _42C;
- u8 _430, _431, isDead;
- u32 _434;
- u16 _438;
- u32 _43C;
- Vec velocity1, velocity2;
- u8 _458, _459, _45A, _45B, _45C, _45D, _45E;
- u32 _460;
- Vec initialScale;
- float _470;
- u32 _474, _478;
- dEn_c *_47C;
- u32 _480;
- u8 classAt484[0x4EC - 0x484];
- u32 _4EC;
- float _4F0, _4F4, _4F8;
- u32 flags_4FC;
- u16 counter_500, counter_502;
- u16 counter_504[4];
- u16 counter_50C;
- u32 _510, _514, _518;
- void *_51C;
- dEn_c *_520;
- u32 _524, _528, _52C, _530;
-
- dEn_c();
-
- int afterCreate(int);
- int beforeExecute(int);
- int afterExecute(int);
- int beforeDraw(int);
-
- void kill();
-
- void eatIn();
- void disableEatIn();
- bool _vf8C(void *other); // AcPy/PlBase?
- void _vfAC();
- void _vfCC(Vec2 *p);
- void _vfD0(Vec2 *p);
-
- void doStateChange(StateBase *state); // might return bool, dunno
-
- // Now here's where the fun starts.
-
- virtual bool preSpriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual bool prePlayerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual bool preYoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther);
-
- virtual bool stageActorCollision(ActivePhysics *apThis, ActivePhysics *apOther);
-
- virtual void spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther);
-
- // WHAT A MESS
- virtual void collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat5_Mario(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void _vf108(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void _vf110(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat8_FencePunch(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void _vf120(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat11_PipeCannon(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther);
- virtual void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther);
-
- virtual void _vf140(dStageActor_c *actor);
- virtual void _vf144(int something);
- virtual void _vf148(); // deletes actors held by Class484 and other stuff
- virtual void _vf14C(); // deletes actors held by Class484 and makes an En Coin Jump
- virtual u32 _vf150(); // reads some bits from a value in Class1EC
- virtual void eatenByYoshiProbably(); // nullsub, params unknown
- virtual void playHpdpSound1(); // plays PLAYER_SE_EMY/GROUP_BOOT/SE_EMY_DOWN_HPDP_S or _H
- virtual void playEnemyDownSound1();
- virtual void playEnemyDownComboSound(void *player); // AcPy_c/daPlBase_c?
- virtual void playHpdpSound2(); // plays PLAYER_SE_EMY/GROUP_BOOT/SE_EMY_DOWN_HPDP_S or _H
- virtual void _vf168(); // nullsub, params unknown
-
- // State Functions
- virtual void dieFumi_Begin(); // does something involving looping thruogh players
- virtual void dieFumi_Execute(); // does movement and some other stuff
- virtual void dieFumi_End(); // nullsub
- virtual void dieFall_Begin(); // does something involving looping thruogh players
- virtual void dieFall_Execute(); // does movement and some other stuff
- virtual void dieFall_End(); // nullsub
- virtual void dieBigFall_Begin(); // calls vf178 [dieFall_Begin]
- virtual void dieBigFall_Execute(); // does movement and some other stuff (but less than 170 and 17C)
- virtual void dieBigFall_End(); // calls vf180 [dieFall_End]
- virtual void dieSmoke_Begin(); // spawns Wm_en_burst_m effect and then removeMyActivePhysics
- virtual void dieSmoke_Execute(); // deletes actor with r4=1
- virtual void dieSmoke_End(); // nullsub
- virtual void dieYoshiFumi_Begin(); // spawns Wm_mr_yoshistep effect and then removeMyActivePhysics
- virtual void dieYoshiFumi_Execute(); // deletes actor with r4=1
- virtual void dieYoshiFumi_End(); // nullsub
- virtual void dieIceVanish_Begin(); // lots of weird stuff
- virtual void dieIceVanish_Execute(); // deletes actor with r4=1
- virtual void dieIceVanish_End(); // nullsub
- virtual void dieGoal_Begin(); // nullsub
- virtual void dieGoal_Execute(); // nullsub
- virtual void dieGoal_End(); // nullsub
- virtual void dieOther_Begin(); // deletes actor with r4=1
- virtual void dieOther_Execute(); // nullsub
- virtual void dieOther_End(); // nullsub
- virtual void eatIn_Begin(); // nullsub
- virtual void eatIn_Execute(); // changes to EatNow on one condition, otherwise calls vfAC
- virtual void eatIn_End(); // nullsub
- virtual void eatNow_Begin(); // nullsub
- virtual void eatNow_Execute(); // nullsub
- virtual void eatNow_End(); // nullsub
- virtual void eatOut_Begin(); // nullsub
- virtual void eatOut_Execute(); // nullsub
- virtual void eatOut_End(); // nullsub
- virtual void hitSpin_Begin(); // nullsub
- virtual void hitSpin_Execute(); // nullsub
- virtual void hitSpin_End(); // nullsub
- virtual void ice_Begin(); // does stuff with Class484 and lots of vf's
- virtual void ice_Execute(); // tons of stuff with Class484
- virtual void ice_End(); // sets a field in Class484 to 0
-
- virtual void spawnHitEffectAtPosition(Vec2 pos);
- virtual void doSomethingWithHardHitAndSoftHitEffects(Vec pos);
- virtual void playEnemyDownSound2();
- virtual void add2ToYSpeed();
- virtual bool _vf218(); // stuff with floats and camera
- virtual void _vf21C(); // does stuff with the speeds
- virtual void _vf220(void *other); // some type of actor, PlBase? calls vf3F4 on other with r4=this, r5=0
- virtual void _vf224(); // stores a couple of values into the struct at 464
- virtual void _vf228(); // more fun stuff with 464 and floats
- virtual bool _vf22C(); // does stuff involving ICE_ACTORs and arrays
- virtual void _vf230(); // "relatedToPlayerOrYoshiCollision" apparently. nullsub, params unknown for now.
- virtual void _vf234(); // nullsub, params unknown
- virtual void _vf238(); // calls vf34 on class394, params unknown
- virtual void _vf23C(); // nullsub, params unknown
- virtual void _vf240(); // nullsub, params unknown
- virtual int _vf244(); // returns 0. might be bool. params unknown
- virtual int _vf248(int something); // does some math involving field510 and [7,7,4,0] and param
- virtual void _vf24C(void *other); // deals with something in the class involving the bahp flag
- virtual void _vf250(void *other);
- virtual void _vf254(void *other);
- virtual void _vf258(void *other);
- virtual void _vf25C(void *other); // calls vf250
- virtual void _vf260(void *other); // AcPy/PlBase? plays the SE_EMY_FUMU_%d sounds based on some value
- virtual void _vf264(dStageActor_c *other); // if other is player or yoshi, do Wm_en_hit and a few other things
- virtual void _vf268(void *other); // AcPy/PlBase? plays the SE_EMY_DOWN_SPIN_%d sounds based on some value
- virtual void spawnHitEffectAtPositionAgain(Vec2 pos);
- virtual void playMameStepSound(); // SE_EMY_MAME_STEP at actor position
- virtual void _vf274(); // nullsub, params unknown
- virtual void _vf278(void *other); // AcPy/PlBase? plays the SE_EMY_YOSHI_FUMU_%d sounds based on some value
- virtual void _vf27C(); // nullsub, params unknown
-
- ~dEn_c();
-};
-
-
-class daEnBlockMain_c : public dEn_c {
-public:
- Physics physics;
- float _618, _61C, _620;
- u32 _624, _628, _62C;
- float initialY;
- float _634, _638, _63C, _640;
- u32 countdown, _648, _64C;
- u32 _650, _654, _658, _65C;
- u16 _660;
- u8 _662, _663, _664, _665, _666, _667;
- u8 _668, _669, _66A, _66B, _66C, _66D, _66E, _66F;
- u8 _670, _671, _672, _673;
- u8 _674;
- u8 _675, _676, _677, _678, _679, _67A, _67B, _67C;
- u8 _67D, _67E, _67F, _680;
- u32 _684;
- u8 _688, isGroundPound, anotherFlag, _68B, _68C, _68D, _68E, _68F;
- u32 _690;
- u8 _694;
-
- // Regular methods
- void blockInit(float initialY);
- void blockUpdate();
- u8 blockResult();
-
- virtual void calledWhenUpMoveBegins();
- virtual void calledWhenDownMoveBegins();
-
- virtual void calledWhenUpMoveExecutes();
- virtual void calledWhenUpMoveDiffExecutes();
- virtual void calledWhenDownMoveExecutes();
- virtual void calledWhenDownMoveEndExecutes();
- virtual void calledWhenDownMoveDiffExecutes();
- virtual void calledWhenDownMoveDiffEndExecutes();
-
- virtual void updateScale(bool movingDown);
-
- // State functions
- virtual void upMove_Begin();
- virtual void upMove_Execute();
- virtual void upMove_End();
- virtual void downMove_Begin();
- virtual void downMove_Execute();
- virtual void downMove_End();
- virtual void downMoveEnd_Begin();
- virtual void downMoveEnd_Execute();
- virtual void downMoveEnd_End();
- virtual void upMove_Diff_Begin();
- virtual void upMove_Diff_Execute();
- virtual void upMove_Diff_End();
- virtual void downMove_Diff_Begin();
- virtual void downMove_Diff_Execute();
- virtual void downMove_Diff_End();
- virtual void downMove_DiffEnd_Begin();
- virtual void downMove_DiffEnd_Execute();
- virtual void downMove_DiffEnd_End();
-
- static void *PhysicsCallback1;
- static void *PhysicsCallback2;
- static void *PhysicsCallback3;
- static void *OPhysicsCallback1;
- static void *OPhysicsCallback2;
- static void *OPhysicsCallback3;
-
- static State<daEnBlockMain_c> StateID_UpMove;
- static State<daEnBlockMain_c> StateID_DownMove;
- static State<daEnBlockMain_c> StateID_DownMoveEnd;
- static State<daEnBlockMain_c> StateID_UpMove_Diff;
- static State<daEnBlockMain_c> StateID_DownMove_Diff;
- static State<daEnBlockMain_c> StateID_DownMove_DiffEnd;
-
- ~daEnBlockMain_c();
-};
-
-
-class dBgGm_c {
-public:
- // TODO TODO TODO TODO TODO
- static dBgGm_c *instance;
-
- TileRenderer::List *getTileRendererList(int index);
-};
-
-
-class dPlayerModelBase_c {
- // dunno what's public and what's private here
- // don't really care
-public:
- dPlayerModelBase_c(u8 player_id); // 800D5420
- virtual ~dPlayerModelBase_c(); // 800D55D0
-
- char allocator[28]; // actually a mHeapAllocatorSubclass but I don't have that
- u32 _20;
- u32 _24;
- char someAnimation[2][0x38]; // actually PlayerAnim's
- char yetAnotherAnimation[40]; // actually m3d::banm_c afaics -- is it even 40 bytes?
- Vec someVector[2]; // maybe not an array
- Vec headOffs;
- Vec scale;
- u8 player_id_1;
- u8 player_id_2;
- u8 powerup_id;
- u8 powerup_tex;
- int current_anim;
- int last_anim_maybe;
- u32 _15C;
- int someFlags;
- u32 _164;
- u32 _168; // related to jump_strings
- u32 _16C;
- u32 _170;
- u32 _174;
- u8 _178;
- char padding[3]; // not needed?
- u32 model_visibility_flags_maybe;
- u32 mode_maybe;
- float _184;
- float _188;
- u32 _18C;
- char someArray[6][12]; // some unknown class/struct
- char _1D8[0x24];
- short _1FC;
- short _1FE;
- short _200;
- char padding_[2]; // not needed?
- u32 _204;
- u32 _208;
-
- virtual int _vf0C(); // 800D6DA0
- virtual void prepare(); // 800D5720
- virtual void finaliseModel(); // 800D5740
- virtual void update(); // 800D5750
- virtual void update3DStuff(); // 800D5760
- virtual void _vf20(); // 800D6D90
- virtual void draw(); // 800D5C70
- virtual int getCurrentModel(); // 800D5870
- virtual int getCurrentResFile(); // 800D62D0
- virtual void setPowerup(u8 powerup_id); // 800D5730
- virtual void setPowerupTexture(); // 800D5CC0
- virtual void _vf38(); // 800D6D80
- virtual void _vf3C(); // 800BD750
- virtual void _vf40(); // 800D6D70
- virtual void _vf44(); // 800D6D60
- virtual void _vf48(); // 800BD740
- virtual void _vf4C(); // 800BD730
- virtual void getModelMatrix(u32 unk, MtxPtr dest); // 800D5820
- virtual int _vf54(); // 80318D0C
- virtual bool _vf58(int type, char *buf, bool unk); // 800D6930
- virtual void startAnimation(int id, float frame, float unk, float updateRate); // 800D5EC0
- virtual int _vf60(); // 800D6920
- virtual void _vf64(int id, float unk1, float unk2, float unk3); // 800D62F0
- virtual void _vf68(int id, float unk); // 800D63E0
- virtual void _vf6C(); // 800D62E0
- virtual void _vf70(); // 800D6690
- virtual void _vf74(); // 800D66A0
- virtual void _vf78(); // 800D66B0
- virtual void SomethingRelatedToPenguinAnims(); // 800D66C0
- virtual void _vf80(); // 800D6A20
- virtual void _vf84(float frame); // 800D5D00
- virtual void _vf88(float frame); // 800D5D70
- virtual void _vf8C(float updateRate); // 800D5D80
- virtual void setUpdateRateForAnim1(float updateRate); // 800D5DF0
- virtual void _vf94(); // 800D6D40
- virtual int _vf98(); // 800D6D30
- virtual void _vf9C(); // 800D6D20
- virtual int _vfA0(); // 800D6D10
- virtual void _vfA4(); // 800D6D00
- virtual int _vfA8(); // 800D6CF0
- virtual void _vfAC(bool blah); // 800BD720
-
- // I won't even bother with non-virtual functions....
-};
-
-
-class dPlayerModelHandler_c {
-public:
- dPlayerModelHandler_c(u8 player_id); // 800D6DB0
- virtual ~dPlayerModelHandler_c(); // 800D6EF0
-
- dPlayerModelBase_c *mdlClass; // might be dPlayerModel_c ?
-
- int loadModel(u8 player_id, int powerup_id, int unk); // 800D6EE0
- void update(); // 800D6F80
- void setMatrix(Mtx matrix); // 800D6FA0
- void setSRT(Vec position, S16Vec rotation, Vec scale); // 800D7030
- void callVF20(); // 800D70F0
- void draw(); // 800D7110
-
-private:
- int hasMatrix; // might be bool ?
-
- void allocPlayerClass(u8 player_id); // 800D6E00
-};
-
-
-class mTexture_c {
-public:
- mTexture_c(); // 802C0D20
- mTexture_c(u16 width, u16 height, GXTexFmt format); // 802C0D70
-
- // vtable is at 80350450
- virtual ~mTexture_c(); // 802C0DB0
- virtual void setFlagTo1(); // 802C0E20
-
- void setImageBuffer(void *buffer); // 802C0E30
- void load(GXTexMapID id); // 802C0E50
- void makeTexObj(GXTexObj *obj); // 802C0E90
- void flushDC(); // 802C0F10
-
- void makeRadialGradient(); // 802C0F60 parameters unknown yet
- void makeLinearGradient(int type, char size, u16 startPos, u16 endPos,
- GXColor begin, GXColor end, bool startAtCenter); // 802C1120
- // "type" should be enum once I figure it out
- // reverse might not be accurate
-
- void allocateBuffer(/* EGG::Heap */void *heap = 0); // 802C14D0
-
- void plotPixel(u16 x, u16 y, GXColor pixel); // 802C1570
-
-
- u16 width;
- u16 height;
- u8 flags;
- u8 format;
- u8 wrapS;
- u8 wrapT;
- u8 minFilter;
- u8 magFilter;
-
-private:
- void *buffer;
- void *myBuffer;
-};
-
-
-class dDvdLoader_c {
-public:
- dDvdLoader_c(); // 8008F140
- virtual ~dDvdLoader_c(); // 8008F170
-
- void *load(const char *filename, u8 unk = 0, void *heap = 0); // 8008F1B0
-
- bool close(); // 8008F2B0 -- Frees command, DON'T USE THIS unless you free the buffer yourself
- bool unload(); // 8008F310 -- Frees command and buffer, USE THIS
-
- int size;
- void *command; // really mDvd_toMainRam_c
- void *heap; // really EGG::Heap
- void *buffer;
-
-private:
- virtual void freeBuffer(); // 8008F380
- void freeCommand(); // 8008F3F0
-};
-
-
-
-namespace nw4r {
- namespace ut {
- class CharWriter {
- public:
- CharWriter();
- ~CharWriter();
-
- void SetupGX();
-
- void SetFontSize(float w, float h);
- void SetFontSize(float v);
- float GetFontWidth() const;
- float GetFontHeight() const;
- float GetFontAscent() const;
- float GetFontDescent() const;
-
- // returns width
- float Print(ushort character);
-
- void PrintGlyph(float, float, float, /* nw4r::ut::Glyph const & */ void*);
-
- void UpdateVertexColor();
-
- private:
- void SetupGXWithColorMapping(Color c1, Color c2);
-
- public:
- Color colors[8]; // todo: document
- u32 modeOfSomeKind;
- float scaleX;
- float scaleY;
- float posX;
- float posY;
- float posZ;
- GXTexFilter minFilt;
- GXTexFilter magFilt;
- u16 completelyUnknown;
- u8 alpha;
- u8 isFixedWidth;
- float fixedWidthValue;
- /* ResFont* */ void *font;
- };
-
- // actually TextWriterBase<w>, but ...
- class TextWriter : public CharWriter {
- public:
- TextWriter();
- ~TextWriter();
-
- float GetLineHeight() const;
-
- // left out most of these to avoid all the format string vararg bullshit
- float CalcStringWidth(wchar_t const *string, int length) const;
-
- float Print(wchar_t const *string, int length);
-
- float CalcLineWidth(wchar_t const *string, int length);
-
- float GetLineSpace() const;
-
- bool IsDrawFlagSet(ulong, ulong) const;
-
- float _4C;
- float charSpace;
- float somethingRelatedToLineHeight;
- u32 _58;
- u32 drawFlag;
- void *tagProcessorMaybe;
- };
- }
-}
-
-// More layout crap
-// This file REALLY needs to be reorganised.
-
-namespace nw4r {
-namespace lyt {
-
- class ResourceAccessor {
- public:
- ResourceAccessor();
- virtual ~ResourceAccessor();
-
- virtual void *GetResource(u32 dirKey, const char *filename, u32 *sizePtr) = 0;
- virtual void *GetFont(const char *name);
- };
-
- class ArcResourceAccessor : public ResourceAccessor {
- public:
- ArcResourceAccessor();
- ~ArcResourceAccessor();
-
- bool Attach(void *data, const char *rootDirName);
- void *GetResource(u32 dirKey, const char *filename, u32 *sizePtr);
- void *GetFont(const char *name);
-
- ARCHandle arc;
- u32 unk_20;
- ut::LinkList list; // 0x24
- char rootDirName[0x80]; // 0x30
- // class ends at 0xB0
- };
-
-}
-}
-
-namespace m2d {
- class ResAcc_c {
- public:
- ResAcc_c();
- virtual ~ResAcc_c();
- virtual void initialSetup();
-
- nw4r::lyt::ResourceAccessor *resAccPtr; // 0x04
- u32 unk_08; // 0x08
- nw4r::lyt::ArcResourceAccessor resAcc; // 0x0C
- // class ends at 0xBC
- };
-
- class ResAccLoader_c : public ResAcc_c {
- public:
- ResAccLoader_c();
- ~ResAccLoader_c();
-
- void *buffer;
- dDvdLoader_c loader; // 0xC0
- // ends at 0xD4
-
- bool loadArc(const char *path);
- bool loadArc(const char *path, u8 unk);
- void free();
- };
-
- class EmbedLayoutBase_c : public Base_c {
- public:
- EmbedLayoutBase_c();
- ~EmbedLayoutBase_c();
-
- void draw(); // don't call this directly
-
- virtual void update();
- virtual bool build(const char *brlytPath, ResAcc_c *resAcc = 0);
-
- nw4r::lyt::Pane *getRootPane();
- nw4r::lyt::Pane *findPaneByName(const char *name) const;
- nw4r::lyt::TextBox *findTextBoxByName(const char *name) const;
- nw4r::lyt::Pane *findPictureByName(const char *name) const; // TODO: change to others
- nw4r::lyt::Pane *findWindowByName(const char *name) const;
-
- void animate();
- void calculateMtx();
-
- nw4r::lyt::Layout layout; // 0x10 -- actually m2d::Layout_c but I'll add that later
- nw4r::lyt::DrawInfo drawInfo; // 0x30
- void *unk_84; // 0x84 -- a ResAcc? referenced in Build()
- float posX; // 0x88
- float posY; // 0x8C
- float clipX; // 0x90
- float clipY; // 0x94
- float clipWidth; // 0x98
- float clipHeight; // 0x9C
- bool clippingEnabled; // 0xA0
- u32 hasAnimations; // 0xA4
- u32 unk_A8; // 0xA8
- };
-
- class EmbedLayout_c : public EmbedLayoutBase_c {
- public:
- EmbedLayout_c();
- ~EmbedLayout_c();
-
- bool build(const char *brlytPath, ResAcc_c *resAcc = 0);
-
- bool loadArc(const char *name, bool isLangSpecific);
- bool loadArc(const char *name, u8 unk, bool isLangSpecific);
-
- bool loadArcForRegion(const char *name); // uses EU/Layout/$name
-
- // there's also a NedEU one, but should it really be listed here...?
-
- bool free();
-
- // does NSMBW even use consts? I have no idea. maybe not
-
- void getPanes(const char **names, nw4r::lyt::Pane *output, int count) const;
- void getWindows(const char **names, nw4r::lyt::Pane *output, int count) const; // TODO: change to others
- void getPictures(const char **names, nw4r::lyt::Pane *output, int count) const;
- void getTextBoxes(const char **names, nw4r::lyt::TextBox *output, int count) const;
-
- void setLangStrings(const char **names, const int *msgIDs, int category, int count);
-
- void loadAnimations(const char **names, int count);
- void loadGroups(const char **names, int *animLinkIDs, int count);
-
- void enableNonLoopAnim(int num, bool goToLastFrame = false);
- void enableLoopAnim(int num);
- void resetAnim(int num, bool goToLastFrame = false);
- void disableAnim(int num);
- void disableAllAnimations();
-
- bool isAnimOn(int num = -1);
- bool isAnyAnimOn();
-
- void execAnimations();
-
- ResAccLoader_c loader; // 0xAC
- void *brlanHandlers; // 0x180
- void *grpHandlers; // 0x184
- bool *animsEnabled; // 0x188
- int brlanCount; // 0x18C
- int grpCount; // 0x190
- int lastAnimTouched; // 0x194
-
- private:
- void fixTextBoxesRecursively(nw4r::lyt::Pane *pane);
- };
-}
-
-
-#endif
-
+
+
+class daEnBlockMain_c : public dEn_c {
+public:
+ Physics physics;
+ float _618, _61C, _620;
+ u32 _624, _628, _62C;
+ float initialY;
+ float _634, _638, _63C, _640;
+ u32 countdown, _648, _64C;
+ u32 _650, _654, _658, _65C;
+ u16 _660;
+ u8 _662, _663, _664, _665, _666, _667;
+ u8 _668, _669, _66A, _66B, _66C, _66D, _66E, _66F;
+ u8 _670, _671, _672, _673;
+ u8 _674;
+ u8 _675, _676, _677, _678, _679, _67A, _67B, _67C;
+ u8 _67D, _67E, _67F, _680;
+ u32 _684;
+ u8 _688, isGroundPound, anotherFlag, _68B, _68C, _68D, _68E, _68F;
+ u32 _690;
+ u8 _694;
+
+ // Regular methods
+ void blockInit(float initialY);
+ void blockUpdate();
+ u8 blockResult();
+
+ virtual void calledWhenUpMoveBegins();
+ virtual void calledWhenDownMoveBegins();
+
+ virtual void calledWhenUpMoveExecutes();
+ virtual void calledWhenUpMoveDiffExecutes();
+ virtual void calledWhenDownMoveExecutes();
+ virtual void calledWhenDownMoveEndExecutes();
+ virtual void calledWhenDownMoveDiffExecutes();
+ virtual void calledWhenDownMoveDiffEndExecutes();
+
+ virtual void updateScale(bool movingDown);
+
+ // State functions
+ virtual void upMove_Begin();
+ virtual void upMove_Execute();
+ virtual void upMove_End();
+ virtual void downMove_Begin();
+ virtual void downMove_Execute();
+ virtual void downMove_End();
+ virtual void downMoveEnd_Begin();
+ virtual void downMoveEnd_Execute();
+ virtual void downMoveEnd_End();
+ virtual void upMove_Diff_Begin();
+ virtual void upMove_Diff_Execute();
+ virtual void upMove_Diff_End();
+ virtual void downMove_Diff_Begin();
+ virtual void downMove_Diff_Execute();
+ virtual void downMove_Diff_End();
+ virtual void downMove_DiffEnd_Begin();
+ virtual void downMove_DiffEnd_Execute();
+ virtual void downMove_DiffEnd_End();
+
+ static void *PhysicsCallback1;
+ static void *PhysicsCallback2;
+ static void *PhysicsCallback3;
+ static void *OPhysicsCallback1;
+ static void *OPhysicsCallback2;
+ static void *OPhysicsCallback3;
+
+ static State<daEnBlockMain_c> StateID_UpMove;
+ static State<daEnBlockMain_c> StateID_DownMove;
+ static State<daEnBlockMain_c> StateID_DownMoveEnd;
+ static State<daEnBlockMain_c> StateID_UpMove_Diff;
+ static State<daEnBlockMain_c> StateID_DownMove_Diff;
+ static State<daEnBlockMain_c> StateID_DownMove_DiffEnd;
+
+ ~daEnBlockMain_c();
+};
+
+
+class dBgGm_c {
+public:
+ // TODO TODO TODO TODO TODO
+ static dBgGm_c *instance;
+
+ TileRenderer::List *getTileRendererList(int index);
+};
+
+
+class dPlayerModelBase_c {
+ // dunno what's public and what's private here
+ // don't really care
+public:
+ dPlayerModelBase_c(u8 player_id); // 800D5420
+ virtual ~dPlayerModelBase_c(); // 800D55D0
+
+ char allocator[28]; // actually a mHeapAllocatorSubclass but I don't have that
+ u32 _20;
+ u32 _24;
+ char someAnimation[2][0x38]; // actually PlayerAnim's
+ char yetAnotherAnimation[40]; // actually m3d::banm_c afaics -- is it even 40 bytes?
+ Vec someVector[2]; // maybe not an array
+ Vec headOffs;
+ Vec scale;
+ u8 player_id_1;
+ u8 player_id_2;
+ u8 powerup_id;
+ u8 powerup_tex;
+ int current_anim;
+ int last_anim_maybe;
+ u32 _15C;
+ int someFlags;
+ u32 _164;
+ u32 _168; // related to jump_strings
+ u32 _16C;
+ u32 _170;
+ u32 _174;
+ u8 _178;
+ char padding[3]; // not needed?
+ u32 model_visibility_flags_maybe;
+ u32 mode_maybe;
+ float _184;
+ float _188;
+ u32 _18C;
+ char someArray[6][12]; // some unknown class/struct
+ char _1D8[0x24];
+ short _1FC;
+ short _1FE;
+ short _200;
+ char padding_[2]; // not needed?
+ u32 _204;
+ u32 _208;
+
+ virtual int _vf0C(); // 800D6DA0
+ virtual void prepare(); // 800D5720
+ virtual void finaliseModel(); // 800D5740
+ virtual void update(); // 800D5750
+ virtual void update3DStuff(); // 800D5760
+ virtual void _vf20(); // 800D6D90
+ virtual void draw(); // 800D5C70
+ virtual int getCurrentModel(); // 800D5870
+ virtual int getCurrentResFile(); // 800D62D0
+ virtual void setPowerup(u8 powerup_id); // 800D5730
+ virtual void setPowerupTexture(); // 800D5CC0
+ virtual void _vf38(); // 800D6D80
+ virtual void _vf3C(); // 800BD750
+ virtual void _vf40(); // 800D6D70
+ virtual void _vf44(); // 800D6D60
+ virtual void _vf48(); // 800BD740
+ virtual void _vf4C(); // 800BD730
+ virtual void getModelMatrix(u32 unk, MtxPtr dest); // 800D5820
+ virtual int _vf54(); // 80318D0C
+ virtual bool _vf58(int type, char *buf, bool unk); // 800D6930
+ virtual void startAnimation(int id, float frame, float unk, float updateRate); // 800D5EC0
+ virtual int _vf60(); // 800D6920
+ virtual void _vf64(int id, float unk1, float unk2, float unk3); // 800D62F0
+ virtual void _vf68(int id, float unk); // 800D63E0
+ virtual void _vf6C(); // 800D62E0
+ virtual void _vf70(); // 800D6690
+ virtual void _vf74(); // 800D66A0
+ virtual void _vf78(); // 800D66B0
+ virtual void SomethingRelatedToPenguinAnims(); // 800D66C0
+ virtual void _vf80(); // 800D6A20
+ virtual void _vf84(float frame); // 800D5D00
+ virtual void _vf88(float frame); // 800D5D70
+ virtual void _vf8C(float updateRate); // 800D5D80
+ virtual void setUpdateRateForAnim1(float updateRate); // 800D5DF0
+ virtual void _vf94(); // 800D6D40
+ virtual int _vf98(); // 800D6D30
+ virtual void _vf9C(); // 800D6D20
+ virtual int _vfA0(); // 800D6D10
+ virtual void _vfA4(); // 800D6D00
+ virtual int _vfA8(); // 800D6CF0
+ virtual void _vfAC(bool blah); // 800BD720
+
+ // I won't even bother with non-virtual functions....
+};
+
+
+class dPlayerModelHandler_c {
+public:
+ dPlayerModelHandler_c(u8 player_id); // 800D6DB0
+ virtual ~dPlayerModelHandler_c(); // 800D6EF0
+
+ dPlayerModelBase_c *mdlClass; // might be dPlayerModel_c ?
+
+ int loadModel(u8 player_id, int powerup_id, int unk); // 800D6EE0
+ void update(); // 800D6F80
+ void setMatrix(Mtx matrix); // 800D6FA0
+ void setSRT(Vec position, S16Vec rotation, Vec scale); // 800D7030
+ void callVF20(); // 800D70F0
+ void draw(); // 800D7110
+
+private:
+ int hasMatrix; // might be bool ?
+
+ void allocPlayerClass(u8 player_id); // 800D6E00
+};
+
+
+class mTexture_c {
+public:
+ mTexture_c(); // 802C0D20
+ mTexture_c(u16 width, u16 height, GXTexFmt format); // 802C0D70
+
+ // vtable is at 80350450
+ virtual ~mTexture_c(); // 802C0DB0
+ virtual void setFlagTo1(); // 802C0E20
+
+ void setImageBuffer(void *buffer); // 802C0E30
+ void load(GXTexMapID id); // 802C0E50
+ void makeTexObj(GXTexObj *obj); // 802C0E90
+ void flushDC(); // 802C0F10
+
+ void makeRadialGradient(); // 802C0F60 parameters unknown yet
+ void makeLinearGradient(int type, char size, u16 startPos, u16 endPos,
+ GXColor begin, GXColor end, bool startAtCenter); // 802C1120
+ // "type" should be enum once I figure it out
+ // reverse might not be accurate
+
+ void allocateBuffer(/* EGG::Heap */void *heap = 0); // 802C14D0
+
+ void plotPixel(u16 x, u16 y, GXColor pixel); // 802C1570
+
+
+ u16 width;
+ u16 height;
+ u8 flags;
+ u8 format;
+ u8 wrapS;
+ u8 wrapT;
+ u8 minFilter;
+ u8 magFilter;
+
+private:
+ void *buffer;
+ void *myBuffer;
+};
+
+
+class dDvdLoader_c {
+public:
+ dDvdLoader_c(); // 8008F140
+ virtual ~dDvdLoader_c(); // 8008F170
+
+ void *load(const char *filename, u8 unk = 0, void *heap = 0); // 8008F1B0
+
+ bool close(); // 8008F2B0 -- Frees command, DON'T USE THIS unless you free the buffer yourself
+ bool unload(); // 8008F310 -- Frees command and buffer, USE THIS
+
+ int size;
+ void *command; // really mDvd_toMainRam_c
+ void *heap; // really EGG::Heap
+ void *buffer;
+
+private:
+ virtual void freeBuffer(); // 8008F380
+ void freeCommand(); // 8008F3F0
+};
+
+
+
+namespace nw4r {
+ namespace ut {
+ class CharWriter {
+ public:
+ CharWriter();
+ ~CharWriter();
+
+ void SetupGX();
+
+ void SetFontSize(float w, float h);
+ void SetFontSize(float v);
+ float GetFontWidth() const;
+ float GetFontHeight() const;
+ float GetFontAscent() const;
+ float GetFontDescent() const;
+
+ // returns width
+ float Print(ushort character);
+
+ void PrintGlyph(float, float, float, /* nw4r::ut::Glyph const & */ void*);
+
+ void UpdateVertexColor();
+
+ private:
+ void SetupGXWithColorMapping(Color c1, Color c2);
+
+ public:
+ Color colors[8]; // todo: document
+ u32 modeOfSomeKind;
+ float scaleX;
+ float scaleY;
+ float posX;
+ float posY;
+ float posZ;
+ GXTexFilter minFilt;
+ GXTexFilter magFilt;
+ u16 completelyUnknown;
+ u8 alpha;
+ u8 isFixedWidth;
+ float fixedWidthValue;
+ /* ResFont* */ void *font;
+ };
+
+ // actually TextWriterBase<w>, but ...
+ class TextWriter : public CharWriter {
+ public:
+ TextWriter();
+ ~TextWriter();
+
+ float GetLineHeight() const;
+
+ // left out most of these to avoid all the format string vararg bullshit
+ float CalcStringWidth(wchar_t const *string, int length) const;
+
+ float Print(wchar_t const *string, int length);
+
+ float CalcLineWidth(wchar_t const *string, int length);
+
+ float GetLineSpace() const;
+
+ bool IsDrawFlagSet(ulong, ulong) const;
+
+ float _4C;
+ float charSpace;
+ float somethingRelatedToLineHeight;
+ u32 _58;
+ u32 drawFlag;
+ void *tagProcessorMaybe;
+ };
+ }
+}
+
+// More layout crap
+// This file REALLY needs to be reorganised.
+
+namespace nw4r {
+namespace lyt {
+
+ class ResourceAccessor {
+ public:
+ ResourceAccessor();
+ virtual ~ResourceAccessor();
+
+ virtual void *GetResource(u32 dirKey, const char *filename, u32 *sizePtr) = 0;
+ virtual void *GetFont(const char *name);
+ };
+
+ class ArcResourceAccessor : public ResourceAccessor {
+ public:
+ ArcResourceAccessor();
+ ~ArcResourceAccessor();
+
+ bool Attach(void *data, const char *rootDirName);
+ void *GetResource(u32 dirKey, const char *filename, u32 *sizePtr);
+ void *GetFont(const char *name);
+
+ ARCHandle arc;
+ u32 unk_20;
+ ut::LinkList list; // 0x24
+ char rootDirName[0x80]; // 0x30
+ // class ends at 0xB0
+ };
+
+}
+}
+
+namespace m2d {
+ class ResAcc_c {
+ public:
+ ResAcc_c();
+ virtual ~ResAcc_c();
+ virtual void initialSetup();
+
+ nw4r::lyt::ResourceAccessor *resAccPtr; // 0x04
+ u32 unk_08; // 0x08
+ nw4r::lyt::ArcResourceAccessor resAcc; // 0x0C
+ // class ends at 0xBC
+ };
+
+ class ResAccLoader_c : public ResAcc_c {
+ public:
+ ResAccLoader_c();
+ ~ResAccLoader_c();
+
+ void *buffer;
+ dDvdLoader_c loader; // 0xC0
+ // ends at 0xD4
+
+ bool loadArc(const char *path);
+ bool loadArc(const char *path, u8 unk);
+ void free();
+ };
+
+ class EmbedLayoutBase_c : public Base_c {
+ public:
+ EmbedLayoutBase_c();
+ ~EmbedLayoutBase_c();
+
+ void draw(); // don't call this directly
+
+ virtual void update();
+ virtual bool build(const char *brlytPath, ResAcc_c *resAcc = 0);
+
+ nw4r::lyt::Pane *getRootPane();
+ nw4r::lyt::Pane *findPaneByName(const char *name) const;
+ nw4r::lyt::TextBox *findTextBoxByName(const char *name) const;
+ nw4r::lyt::Pane *findPictureByName(const char *name) const; // TODO: change to others
+ nw4r::lyt::Pane *findWindowByName(const char *name) const;
+
+ void animate();
+ void calculateMtx();
+
+ nw4r::lyt::Layout layout; // 0x10 -- actually m2d::Layout_c but I'll add that later
+ nw4r::lyt::DrawInfo drawInfo; // 0x30
+ void *unk_84; // 0x84 -- a ResAcc? referenced in Build()
+ float posX; // 0x88
+ float posY; // 0x8C
+ float clipX; // 0x90
+ float clipY; // 0x94
+ float clipWidth; // 0x98
+ float clipHeight; // 0x9C
+ bool clippingEnabled; // 0xA0
+ u32 hasAnimations; // 0xA4
+ u32 unk_A8; // 0xA8
+ };
+
+ class EmbedLayout_c : public EmbedLayoutBase_c {
+ public:
+ EmbedLayout_c();
+ ~EmbedLayout_c();
+
+ bool build(const char *brlytPath, ResAcc_c *resAcc = 0);
+
+ bool loadArc(const char *name, bool isLangSpecific);
+ bool loadArc(const char *name, u8 unk, bool isLangSpecific);
+
+ bool loadArcForRegion(const char *name); // uses EU/Layout/$name
+
+ // there's also a NedEU one, but should it really be listed here...?
+
+ bool free();
+
+ // does NSMBW even use consts? I have no idea. maybe not
+
+ void getPanes(const char **names, nw4r::lyt::Pane *output, int count) const;
+ void getWindows(const char **names, nw4r::lyt::Pane *output, int count) const; // TODO: change to others
+ void getPictures(const char **names, nw4r::lyt::Pane *output, int count) const;
+ void getTextBoxes(const char **names, nw4r::lyt::TextBox *output, int count) const;
+
+ void setLangStrings(const char **names, const int *msgIDs, int category, int count);
+
+ void loadAnimations(const char **names, int count);
+ void loadGroups(const char **names, int *animLinkIDs, int count);
+
+ void enableNonLoopAnim(int num, bool goToLastFrame = false);
+ void enableLoopAnim(int num);
+ void resetAnim(int num, bool goToLastFrame = false);
+ void disableAnim(int num);
+ void disableAllAnimations();
+
+ bool isAnimOn(int num = -1);
+ bool isAnyAnimOn();
+
+ void execAnimations();
+
+ ResAccLoader_c loader; // 0xAC
+ void *brlanHandlers; // 0x180
+ void *grpHandlers; // 0x184
+ bool *animsEnabled; // 0x188
+ int brlanCount; // 0x18C
+ int grpCount; // 0x190
+ int lastAnimTouched; // 0x194
+
+ private:
+ void fixTextBoxesRecursively(nw4r::lyt::Pane *pane);
+ };
+}
+
+
+#endif
+
diff --git a/kamek_pal.x b/kamek_pal.x
index 1692927..dbb213f 100644
--- a/kamek_pal.x
+++ b/kamek_pal.x
@@ -1,10 +1,10 @@
-OUTPUT_FORMAT ("binary")
-
-/*MEMORY {
- loader_section : ORIGIN = 0x80001800, LENGTH = 0x1800
-}*/
-
-SECTIONS {
+OUTPUT_FORMAT ("binary")
+
+/*MEMORY {
+ loader_section : ORIGIN = 0x80001800, LENGTH = 0x1800
+}*/
+
+SECTIONS {
GetSpecificPlayerActor = 0x8005F900;
Actor_SearchByID = 0x80162E40;
TimeStopFlag = 0x80429FDA;
@@ -17,6 +17,7 @@ SECTIONS {
AlwaysDrawFlag = 0x80064540;
AlwaysDrawBranch = 0x80064544;
GenerateRandomNumber = 0x800B2EE0;
+ OneofManySoundPlayers = 0x800CE9B0;
_savefpr_14 = 0x802DCF98;
_savefpr_15 = 0x802DCF9C;
diff --git a/poweruphax.yaml b/poweruphax.yaml
index 550d58c..281c9ea 100644
--- a/poweruphax.yaml
+++ b/poweruphax.yaml
@@ -1,598 +1,601 @@
----
-source_files: [../src/poweruphax.S]
-hooks:
- - name: GetInfoFromDumbTable
- type: branch_insn
- branch_type: b
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80142650
- target_func: 'GetInfoFromDumbTable'
-
- - name: FukidashiFix
- type: branch_insn
- branch_type: b
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x800B1A50
- target_func: 'FukidashiFix'
-
- - name: PlayerGetHeightFix
- type: branch_insn
- branch_type: b
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80132670
- target_func: 'PlayerGetHeight'
-
-# - name: EnItem_BindAnimation_Fix
-# type: branch_insn
-# branch_type: b
-# src_addr_ntsc: 0xdeadbeef
-# src_addr_pal: 0x80A291E0
-# target_func: 'EnItem_BindAnimation_Fix'
-
- - name: DealWithBlahTable
- type: branch_insn
- branch_type: b
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80141F70
- target_func: 'DealWithBlahTable'
-
- - name: GetAsdfTable
- type: branch_insn
- branch_type: b
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x801466C0
- target_func: 'GetAsdfTable'
-
- - name: GetBlahTableOffset
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x801421AC
- target_func: 'GetBlahTableOffset'
-
- - name: GetWeirdScaleTable
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x8014676C
- target_func: 'GetWeirdScaleTable'
-
- - name: WtfEver
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80133E48
- target_func: 'WtfEver'
-
- - name: YetAnother
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80138840
- target_func: 'YetAnother'
-
- - name: ExtendHammerStruct
- type: patch
- addr_ntsc: 0xdeadbeef
- addr_pal: 0x807FCBA8
- data: '3860 045C'
-
- - name: ThrowHammer
- type: branch_insn
- branch_type: b
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x8013BEE4
- target_func: 'ThrowHammer'
-
- - name: MoreProjectileStuff_Fix
- type: branch_insn
- branch_type: b
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x8013C3A0
- target_func: 'MoreProjectileStuff_Fix'
-
- - name: ProjectileShootCheck_Fix1
- type: patch
- addr_ntsc: 0xdeadbeef
- addr_pal: 0x8013BB7C
- data: '4181003C'
-
- - name: ProjectileShootCheck_Fix2
- type: branch_insn
- branch_type: b
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x8013BBB8
- target_func: 'ProjectileShootCheck_Fix'
-
- - name: QBlockItemChange
- type: patch
- addr_ntsc: 0xdeadbeef
- addr_pal: 0x802ee628
- data: '00000006'
-
- - name: QBlockItemFix
- type: patch
- addr_ntsc: 0xdeadbeef
- addr_pal: 0x8002288c
- data: '60000000'
-
- - name: FixMushroomIfSmallBlock
- type: patch
- addr_ntsc: 0xdeadbeef
- addr_pal: 0x800221ac
- data: '2800 0003'
-
- - name: SomeEnItemFix
- type: patch
- addr_ntsc: 0xdeadbeef
- addr_pal: 0x80A2BE98
- data: '2800 0003'
-
- - name: MushroomEnItemFix
- type: patch
- addr_ntsc: 0xdeadbeef
- addr_pal: 0x80A28598
- data: '2800 0003'
-
- - name: DisablePowerupValidityCheck
- type: patch
- addr_ntsc: 0xdeadbeef
- addr_pal: 0x800611C4
- data: '60000000'
-
- - name: TinyTableFix
- type: patch
- addr_ntsc: 0xdeadbeef
- addr_pal: 0x802F5AEC
- data: '00000001'
-
- #It's not actually a function but who cares?
- - name: AlwaysLoadBrosArc
- type: add_func_pointer
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x8098C488
- target_func: 'BrosArcFileName'
-
- - name: AlwaysLoadBrosArc
- type: add_func_pointer
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x8098C490
- target_func: 'I_hammerArcFilename'
-
- - name: ChangeHammerBrres
- type: add_func_pointer
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80AF0FA8
- target_func: 'I_hammerResFile'
-
- - name: ChangeHammerArc
- type: add_func_pointer
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80AF0ECC
- target_func: 'I_hammerArcFilename'
-
- - name: ChangeHammerModel
- type: add_func_pointer
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80AF1000
- target_func: 'I_hammerModelName'
-
- - name: LetPlayerGetHammerItem
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80A285FC
- target_func: 'TryToGiveMarioHammerSuit'
-
- - name: WeirdAnimLoadHack
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80A27CE4
- target_func: 'WeirdAnimLoadHack'
-
- - name: SetHammerToEnItemDCA
- type: add_func_pointer
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80AF117C
- target_func: 'SetHammerToEnItemDCA'
-
- - name: PlumberSetPowerupFix
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x800D47D4
- target_func: 'PlumberSetPowerupFix'
-
- - name: PlumberSetPowerupFix2
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x80141510
- target_func: 'PlumberSetPowerupFix2'
-
- - name: PlumberSetPowerupTextureFix
- type: branch_insn
- branch_type: b
- src_addr_pal: 0x800CA6F8
- target_func: 'PlumberSetPowerupTextureFix'
-
-# - name: PlumberSetPowerupTextureDebug
-# type: branch_insn
-# branch_type: b
-# src_addr_pal: 0x800CA6B0
-# target_func: 'PlumberSetPowerupTextureDebug'
-
- - name: FixPowerupScale_First
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x800d6fdc
- target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r4_dest'
-
- - name: FixPowerupScale_Second
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x8004cc80
- target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest'
-
- - name: FixPowerupScale_Third
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x800d7064
- target_func: 'GetPowerupScaleFloatAddr_r8_trash_r0_valshl2_r7_dest'
-
- - name: FixPowerupScale_Fourth
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x801293D0
- target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest'
-
- - name: FixPowerupScale_Fifth
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80137CDC
- target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest'
-
- - name: FixPowerupScale_Sixth
- type: branch_insn
- branch_type: b
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80141FF4
- target_func: 'GetPowerupScaleFloatAddr_fixForSixth'
-
- - name: FixPowerupScale_Seventh
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x8014378C
- target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest'
-
- - name: FixPowerupScale_Eighth
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0xdeadbeef
- src_addr_pal: 0x80143884
- target_func: 'GetPowerupScaleFloatAddr_r8_trash_r0_valshl2_r7_dest'
+---
+source_files: [../src/poweruphax.S]
+hooks:
+ - name: GetInfoFromDumbTable
+ type: branch_insn
+ branch_type: b
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80142650
+ target_func: 'GetInfoFromDumbTable'
+
+ - name: FukidashiFix
+ type: branch_insn
+ branch_type: b
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x800B1A50
+ target_func: 'FukidashiFix'
+
+ - name: PlayerGetHeightFix
+ type: branch_insn
+ branch_type: b
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80132670
+ target_func: 'PlayerGetHeight'
+
+# - name: EnItem_BindAnimation_Fix
+# type: branch_insn
+# branch_type: b
+# src_addr_ntsc: 0xdeadbeef
+# src_addr_pal: 0x80A291E0
+# target_func: 'EnItem_BindAnimation_Fix'
+
+ - name: DealWithBlahTable
+ type: branch_insn
+ branch_type: b
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80141F70
+ target_func: 'DealWithBlahTable'
+
+ - name: GetAsdfTable
+ type: branch_insn
+ branch_type: b
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x801466C0
+ target_func: 'GetAsdfTable'
+
+ - name: GetBlahTableOffset
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x801421AC
+ target_func: 'GetBlahTableOffset'
+
+ - name: GetWeirdScaleTable
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x8014676C
+ target_func: 'GetWeirdScaleTable'
+
+ - name: WtfEver
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80133E48
+ target_func: 'WtfEver'
+
+ - name: YetAnother
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80138840
+ target_func: 'YetAnother'
+
+ - name: ExtendHammerStruct
+ type: patch
+ addr_ntsc: 0xdeadbeef
+ addr_pal: 0x807FCBA8
+ data: '3860 045C'
+
+ - name: ThrowHammer
+ type: branch_insn
+ branch_type: b
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x8013BEE4
+ target_func: 'ThrowHammer'
+
+ - name: MoreProjectileStuff_Fix
+ type: branch_insn
+ branch_type: b
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x8013C3A0
+ target_func: 'MoreProjectileStuff_Fix'
+
+ - name: ProjectileShootCheck_Fix1
+ type: patch
+ addr_ntsc: 0xdeadbeef
+ addr_pal: 0x8013BB7C
+ data: '4181003C'
+
+ - name: ProjectileShootCheck_Fix2
+ type: branch_insn
+ branch_type: b
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x8013BBB8
+ target_func: 'ProjectileShootCheck_Fix'
+
+ - name: QBlockItemChange
+ type: patch
+ addr_ntsc: 0xdeadbeef
+ addr_pal: 0x802ee628
+ data: '00000006'
+
+ - name: QBlockItemFix
+ type: patch
+ addr_ntsc: 0xdeadbeef
+ addr_pal: 0x8002288c
+ data: '60000000'
+
+ - name: FixMushroomIfSmallBlock
+ type: patch
+ addr_ntsc: 0xdeadbeef
+ addr_pal: 0x800221ac
+ data: '2800 0003'
+
+ - name: SomeEnItemFix
+ type: patch
+ addr_ntsc: 0xdeadbeef
+ addr_pal: 0x80A2BE98
+ data: '2800 0003'
+
+ - name: MushroomEnItemFix
+ type: patch
+ addr_ntsc: 0xdeadbeef
+ addr_pal: 0x80A28598
+ data: '2800 0003'
+
+ - name: DisablePowerupValidityCheck
+ type: patch
+ addr_ntsc: 0xdeadbeef
+ addr_pal: 0x800611C4
+ data: '60000000'
+
+ - name: TinyTableFix
+ type: patch
+ addr_ntsc: 0xdeadbeef
+ addr_pal: 0x802F5AEC
+ data: '00000001'
+
+ #It's not actually a function but who cares?
+ - name: AlwaysLoadBrosArc
+ type: add_func_pointer
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x8098C488
+ target_func: 'BrosArcFileName'
+
+ - name: AlwaysLoadBrosArc
+ type: add_func_pointer
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x8098C490
+ target_func: 'I_hammerArcFilename'
+
+ - name: ChangeHammerBrres
+ type: add_func_pointer
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80AF0FA8
+ target_func: 'I_hammerResFile'
+
+ - name: ChangeHammerArc
+ type: add_func_pointer
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80AF0ECC
+ target_func: 'I_hammerArcFilename'
+
+ - name: ChangeHammerModel
+ type: add_func_pointer
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80AF1000
+ target_func: 'I_hammerModelName'
+
+ - name: LetPlayerGetHammerItem
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80A285FC
+ target_func: 'TryToGiveMarioHammerSuit'
+
+ - name: WeirdAnimLoadHack
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80A27CE4
+ target_func: 'WeirdAnimLoadHack'
+
+ - name: SetHammerToEnItemDCA
+ type: add_func_pointer
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80AF117C
+ target_func: 'SetHammerToEnItemDCA'
+
+ - name: PlumberSetPowerupFix
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800D47D4
+ target_func: 'PlumberSetPowerupFix'
+
+ - name: PlumberSetPowerupFix2
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x80141510
+ target_func: 'PlumberSetPowerupFix2'
+
+ - name: PlumberSetPowerupTextureFix
+ type: branch_insn
+ branch_type: b
+ src_addr_pal: 0x800CA6F8
+ target_func: 'PlumberSetPowerupTextureFix'
+
+# - name: PlumberSetPowerupTextureDebug
+# type: branch_insn
+# branch_type: b
+# src_addr_pal: 0x800CA6B0
+# target_func: 'PlumberSetPowerupTextureDebug'
+
+ - name: FixPowerupScale_First
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x800d6fdc
+ target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r4_dest'
+
+ - name: FixPowerupScale_Second
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x8004cc80
+ target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest'
+
+ - name: FixPowerupScale_Third
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x800d7064
+ target_func: 'GetPowerupScaleFloatAddr_r8_trash_r0_valshl2_r7_dest'
+
+ - name: FixPowerupScale_Fourth
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x801293D0
+ target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest'
+
+ - name: FixPowerupScale_Fifth
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80137CDC
+ target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest'
+
+ - name: FixPowerupScale_Sixth
+ type: branch_insn
+ branch_type: b
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80141FF4
+ target_func: 'GetPowerupScaleFloatAddr_fixForSixth'
+
+ - name: FixPowerupScale_Seventh
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x8014378C
+ target_func: 'GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest'
+
+ - name: FixPowerupScale_Eighth
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0xdeadbeef
+ src_addr_pal: 0x80143884
+ target_func: 'GetPowerupScaleFloatAddr_r8_trash_r0_valshl2_r7_dest'
# Below Here are added all the Hammer Collision hacks
- - name: HammerPodooboo
- type: patch
- addr_pal: 0x80ACE8E4
- data: '0008820C'
-
- - name: HammerThwomp
- type: patch
- addr_pal: 0x80ACF9D0
- data: '0008820e'
-
- - name: HammerBigThwomp
- type: patch
- addr_pal: 0x80ACF9F4
- data: '0008820e'
-
- - name: HammerBigBoo
- type: patch
- addr_pal: 0x80AD4AA0
- data: '0008a80e'
-
- - name: HammerBigBooTwo
- type: patch
- addr_pal: 0x80AD4AA4
- data: '20020000'
-
- - name: HammerAmp
- type: patch
- addr_pal: 0x80ACE17C
- data: '00080a04'
-
- - name: HammerSpikeBall
- type: patch
- addr_pal: 0x80AD4D88
- data: '00080006'
-
- - name: HammerBigSpikeBall
- type: patch
- addr_pal: 0x80ACDD50
- data: '00080006'
-
- - name: HammerUrchin
- type: patch
- addr_pal: 0x80AD4F48
- data: '00088a1e'
-
- - name: HammerChainChomp
- type: patch
- addr_pal: 0x80AD5214
- data: '00088206'
-
- - name: HammerFireSnake
- type: patch
- addr_pal: 0x80ACFBC4
- data: '00088206'
-
- - name: HammerFishbones
- type: patch
- addr_pal: 0x80AD2748
- data: '0008881e'
-
- - name: HammerBeanGoomba
- type: patch
- addr_pal: 0x80acd988
- data: '0008A2BE'
-
- - name: HammerPukucoinOne
- type: patch
- addr_pal: 0x80AD3C60
- data: '00088a0e'
+ - name: HammerPodooboo
+ type: patch
+ addr_pal: 0x80ACE8E4
+ data: '0008820C'
+
+ - name: HammerThwomp
+ type: patch
+ addr_pal: 0x80ACF9D0
+ data: '0008820e'
+
+ - name: HammerBigThwomp
+ type: patch
+ addr_pal: 0x80ACF9F4
+ data: '0008820e'
+
+ - name: HammerBigBoo
+ type: patch
+ addr_pal: 0x80AD4AA0
+ data: '0008a80e'
+
+ - name: HammerBigBooTwo
+ type: patch
+ addr_pal: 0x80AD4AA4
+ data: '20020000'
+
+ - name: HammerAmp
+ type: patch
+ addr_pal: 0x80ACE17C
+ data: '00080a04'
+
+ - name: HammerSpikeBall
+ type: patch
+ addr_pal: 0x80AD4D88
+ data: '00080006'
+
+ - name: HammerBigSpikeBall
+ type: patch
+ addr_pal: 0x80ACDD50
+ data: '00080006'
+
+ - name: HammerUrchin
+ type: patch
+ addr_pal: 0x80AD4F48
+ data: '00088a1e'
+
+ - name: HammerChainChomp
+ type: patch
+ addr_pal: 0x80AD5214
+ data: '00088206'
+
+ - name: HammerFireSnake
+ type: patch
+ addr_pal: 0x80ACFBC4
+ data: '00088206'
+
+ - name: HammerFishbones
+ type: patch
+ addr_pal: 0x80AD2748
+ data: '0008881e'
+
+ - name: HammerBeanGoomba
+ type: patch
+ addr_pal: 0x80acd988
+ data: '0008A2BE'
+
+ - name: HammerPukucoinOne
+ type: patch
+ addr_pal: 0x80AD3C60
+ data: '00088a0e'
- name: HammerPukucoinTwo
- type: patch
- addr_pal: 0x80AD3C3C
- data: '00088a0e'
-
- - name: HammerBulber
- type: patch
- addr_pal: 0x80ACEC60
- data: '00088a0e'
-
- - name: HammerFuzzyOne
- type: patch
- addr_pal: 0x80ACECF8
- data: '0008828e'
-
- - name: HammerFuzzyTwo
- type: patch
- addr_pal: 0x80ACED1C
- data: '0008828e'
-
- - name: HammerGhostCircle
- type: patch
- addr_pal: 0x80AD4158
- data: '0008a80e'
-
- - name: HammerPiranhaLily
- type: patch
- addr_pal: 0x80AD5538
- data: '003AFFFE'
-
-
-# - name: HammerClam
-# type: patch
-# addr_pal: 0x80acd4BC
-# data: '00000047'
+ type: patch
+ addr_pal: 0x80AD3C3C
+ data: '00088a0e'
+
+ - name: HammerBulber
+ type: patch
+ addr_pal: 0x80ACEC60
+ data: '00088a0e'
+
+ - name: HammerFuzzyOne
+ type: patch
+ addr_pal: 0x80ACECF8
+ data: '0008828e'
+
+ - name: HammerFuzzyTwo
+ type: patch
+ addr_pal: 0x80ACED1C
+ data: '0008828e'
+
+ - name: HammerGhostCircle
+ type: patch
+ addr_pal: 0x80AD4158
+ data: '0008a80e'
+
+ - name: HammerPiranhaLily
+ type: patch
+ addr_pal: 0x80AD5538
+ data: '003AFFFE'
+
+
+# - name: HammerClam
+# type: patch
+# addr_pal: 0x80acd4BC
+# data: '00000047'
#
-# - name: HammerClamTwo
-# type: patch
-# addr_pal: 0x80acd4e0
-# data: '00000047'
+# - name: HammerClamTwo
+# type: patch
+# addr_pal: 0x80acd4e0
+# data: '00000047'
#
-# - name: HammerClamNull
-# type: patch
-# addr_pal: 0x80AD5BF0
-# data: '80095C10'
+# - name: HammerClamNull
+# type: patch
+# addr_pal: 0x80AD5BF0
+# data: '80095C10'
- - name: HammerGiantWigglerNull
- type: patch
- addr_pal: 0x80AD7FC8
- data: '80095C10'
+ - name: HammerGiantWigglerNull
+ type: patch
+ addr_pal: 0x80AD7FC8
+ data: '80095C10'
- - name: HammerParabeetleNull
- type: patch
- addr_pal: 0x80B028D8
- data: '80095C10'
+ - name: HammerParabeetleNull
+ type: patch
+ addr_pal: 0x80B028D8
+ data: '80095C10'
- - name: HammerGiantBuzzyNull
- type: patch
- addr_pal: 0x80AD8A10
- data: '80095C10'
+ - name: HammerGiantBuzzyNull
+ type: patch
+ addr_pal: 0x80AD8A10
+ data: '80095C10'
- - name: HammerGiantBuzzy
- type: patch
- addr_pal: 0x80ACDC8C
- data: '0000004F'
+ - name: HammerGiantBuzzy
+ type: patch
+ addr_pal: 0x80ACDC8C
+ data: '0000004F'
- - name: HammerGiantBuzzy
- type: patch
- addr_pal: 0x80ACDC90
- data: 'FFBAFFBC'
+ - name: HammerGiantBuzzy
+ type: patch
+ addr_pal: 0x80ACDC90
+ data: 'FFBAFFBC'
- - name: HammerKingBill
- type: patch
- addr_pal: 0x80AD2618
- data: '0000004F'
+ - name: HammerKingBill
+ type: patch
+ addr_pal: 0x80AD2618
+ data: '0000004F'
- - name: HammerKingBillTwo
- type: patch
- addr_pal: 0x80AD261C
- data: '00088806'
+ - name: HammerKingBillTwo
+ type: patch
+ addr_pal: 0x80AD261C
+ data: '00088806'
- - name: HammerKingBillNull
- type: patch
- addr_pal: 0x80AF72A8
- data: '80095C10'
+ - name: HammerKingBillNull
+ type: patch
+ addr_pal: 0x80AF72A8
+ data: '80095C10'
- - name: HammerBulletBill
- type: patch
- addr_pal: 0x80AD22B8
- data: '03000000'
+ - name: HammerBulletBill
+ type: patch
+ addr_pal: 0x80AD22B8
+ data: '03000000'
- - name: HammerBanzaiBill
- type: patch
- addr_pal: 0x80ad22Dc
- data: '03000000'
+ - name: HammerBanzaiBill
+ type: patch
+ addr_pal: 0x80ad22Dc
+ data: '03000000'
- - name: HammerPolterOne
- type: patch
- addr_pal: 0x80AD3ADC
- data: '00000047'
+ - name: HammerPolterOne
+ type: patch
+ addr_pal: 0x80AD3ADC
+ data: '00000047'
- - name: HammerPolterTwo
- type: patch
- addr_pal: 0x80AD3B00
- data: '00000047'
+ - name: HammerPolterTwo
+ type: patch
+ addr_pal: 0x80AD3B00
+ data: '00000047'
- - name: Icicle
- type: patch
- data: "0000004F"
- addr_pal: 0x80AD0EB4
+ - name: Icicle
+ type: patch
+ data: "0000004F"
+ addr_pal: 0x80AD0EB4
- - name: IcicleOne
- type: patch
- data: "0000004F"
- addr_pal: 0x80AD0ED8
+ - name: IcicleOne
+ type: patch
+ data: "0000004F"
+ addr_pal: 0x80AD0ED8
+ - name: IcicleTwo
+ type: patch
+ data: "0000004F"
+ addr_pal: 0x80ACFD08
- - name: IcicleTwo
- type: patch
- data: "0000004F"
- addr_pal: 0x80ACFD08
+ - name: IcicleThree
+ type: patch
+ data: "0000004F"
+ addr_pal: 0x80ACFD2C
- - name: IcicleThree
- type: patch
- data: "0000004F"
- addr_pal: 0x80ACFD2C
+ - name: IcicleNormalNoIceball
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80AEFFFC
- - name: IcicleFour
- type: patch
- data: "0000004F"
- addr_pal: 0x80acdb58
+ - name: IcicleFixationNoIceball
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80AE9DC0
+ - name: FuckinCastleLarryNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B76C90
- - name: FuckinCastleLarryNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B76C90
+ - name: FuckinLarryNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B81F44
- - name: FuckinLarryNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B81F44
+ - name: FuckinCastleLemmyNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B777A8
- - name: FuckinCastleLemmyNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B777A8
+ - name: FuckinLemmyNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B82DF0
- - name: FuckinLemmyNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B82DF0
+ - name: FuckinCastleWendyNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B7AD70
- - name: FuckinCastleWendyNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B7AD70
+ - name: FuckinWendyNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B87644
- - name: FuckinWendyNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B87644
+ - name: FuckinCastleLudwigNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B78380
- - name: FuckinCastleLudwigNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B78380
+ - name: FuckinLudwigNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B840D8
- - name: FuckinLudwigNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B840D8
+ - name: FuckinCastleIggyNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B75F80
- - name: FuckinCastleIggyNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B75F80
+ - name: FuckinIggyNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B7BC28
- - name: FuckinIggyNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B7BC28
+ - name: FuckinCastleMortonNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B79060
- - name: FuckinCastleMortonNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B79060
+ - name: FuckinMortonNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B853A8
- - name: FuckinMortonNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B853A8
+ - name: FuckinCastleRoyNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B79DC8
- - name: FuckinCastleRoyNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B79DC8
+ - name: FuckinRoyNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B86410
- - name: FuckinRoyNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B86410
+ - name: FuckinKamekNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B7CBDC
- - name: FuckinKamekNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B7CBDC
+ - name: FuckinBowserNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B7E800
- - name: FuckinBowserNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B7E800
+ - name: FuckinJrANull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B804B4
- - name: FuckinJrANull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B804B4
+ - name: FuckinJrBNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B80BBC
- - name: FuckinJrBNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B80BBC
-
- - name: FuckinJrCNull
- type: patch
- data: "80095C10"
- addr_pal: 0x80B81468
+ - name: FuckinJrCNull
+ type: patch
+ data: "80095C10"
+ addr_pal: 0x80B81468
diff --git a/spritespawner.yaml b/spritespawner.yaml
index e75bf09..8c2e7ca 100644
--- a/spritespawner.yaml
+++ b/spritespawner.yaml
@@ -1,15 +1,15 @@
----
-# Replaces Ac_Lift_ObjBg_HMove_Big
-
-source_files: [../src/spritespawner.cpp]
-hooks:
- - name: SpriteSpawner_Create
- type: add_func_pointer
- src_addr_pal: 0x80ADEA18
- target_func: 'SpriteSpawner_Create(SpriteSpawner *)'
-
- - name: SpriteSpawner_Execute
- type: add_func_pointer
- src_addr_pal: 0x80ADEA30
- target_func: 'SpriteSpawner_Execute(SpriteSpawner *)'
+---
+# Replaces Ac_Lift_ObjBg_HMove_Big
+
+source_files: [../src/spritespawner.cpp]
+hooks:
+ - name: SpriteSpawner_Create
+ type: add_func_pointer
+ src_addr_pal: 0x80ADEA18
+ target_func: 'SpriteSpawner_Create(SpriteSpawner *)'
+
+ - name: SpriteSpawner_Execute
+ type: add_func_pointer
+ src_addr_pal: 0x80ADEA30
+ target_func: 'SpriteSpawner_Execute(SpriteSpawner *)'
\ No newline at end of file
diff --git a/spriteswapper.yaml b/spriteswapper.yaml
new file mode 100644
index 0000000..38e0160
--- /dev/null
+++ b/spriteswapper.yaml
@@ -0,0 +1,15 @@
+---
+# Replaces EN_Remocon_ToriMochi
+
+source_files: [../src/spriteSwapper.cpp]
+hooks:
+ - name: SpriteSwapper_Create
+ type: add_func_pointer
+ src_addr_pal: 0x80B05E28
+ target_func: 'SpriteSwapper_Create(SpriteSwapper *)'
+
+ - name: SpriteSwapper_Execute
+ type: add_func_pointer
+ src_addr_pal: 0x80B05E40
+ target_func: 'SpriteSwapper_Execute(SpriteSwapper *)'
+ \ No newline at end of file
diff --git a/spritetex.yaml b/spritetex.yaml
index 9eda5c0..453ab24 100644
--- a/spritetex.yaml
+++ b/spritetex.yaml
@@ -1,565 +1,565 @@
----
-source_files: [../src/spritetex.s]
-hooks:
-# - name: TEX_WoodBox
-# type: branch_insn
-# branch_type: bl
-# NOTES: 'fix ntsc addr later'
-# src_addr_ntsc: 0x80ACBFB0
-# src_addr_pal: 0x80ACBFB0
-# target_func: 'TEX_WoodBox'
-
- - name: TEX_Bush
- type: branch_insn
- branch_type: bl
- src_addr_ntsc: 0x80875BB4
- src_addr_pal: 0x80875BB4
- target_func: 'TEX_Bush'
-
-
-
+---
+source_files: [../src/spritetex.s]
+hooks:
+# - name: TEX_WoodBox
+# type: branch_insn
+# branch_type: bl
+# NOTES: 'fix ntsc addr later'
+# src_addr_ntsc: 0x80ACBFB0
+# src_addr_pal: 0x80ACBFB0
+# target_func: 'TEX_WoodBox'
+
+ - name: TEX_Bush
+ type: branch_insn
+ branch_type: bl
+ src_addr_ntsc: 0x80875BB4
+ src_addr_pal: 0x80875BB4
+ target_func: 'TEX_Bush'
+
+
+
# The below was added by Tempus
- - name: TEX_Goomba
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80031384
- target_func: 'TEX_Goomba'
+ - name: TEX_Goomba
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80031384
+ target_func: 'TEX_Goomba'
- - name: TEX_BigGoomba
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80033350
- target_func: 'TEX_BigGoomba'
+ - name: TEX_BigGoomba
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80033350
+ target_func: 'TEX_BigGoomba'
- - name: TEX_Barrel
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x809AB3B4
- target_func: 'TEX_Barrel'
+ - name: TEX_Barrel
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809AB3B4
+ target_func: 'TEX_Barrel'
-# - name: TEX_Blooper
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80A0451C
-# target_func: 'TEX_Blooper'
+# - name: TEX_Blooper
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A0451C
+# target_func: 'TEX_Blooper'
-# - name: TEX_BigBlock
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x809B8DB8
-# target_func: 'TEX_BigBlock'
+# - name: TEX_BigBlock
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x809B8DB8
+# target_func: 'TEX_BigBlock'
- - name: TEX_Thwomp
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x809F63F4
- target_func: 'TEX_Thwomp'
+ - name: TEX_Thwomp
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809F63F4
+ target_func: 'TEX_Thwomp'
- - name: TEX_GiantBuzzy
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x809B6B44
- target_func: 'TEX_GiantBuzzy'
+ - name: TEX_GiantBuzzy
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809B6B44
+ target_func: 'TEX_GiantBuzzy'
- - name: TEX_Buzzy
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A67834
- target_func: 'TEX_Buzzy'
+ - name: TEX_Buzzy
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A67834
+ target_func: 'TEX_Buzzy'
- - name: TEX_BuzzyShell
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A67540
- target_func: 'TEX_BuzzyShell'
+ - name: TEX_BuzzyShell
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A67540
+ target_func: 'TEX_BuzzyShell'
- - name: TEX_SpikeTop
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80AB2C34
- target_func: 'TEX_SpikeTop'
+ - name: TEX_SpikeTop
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80AB2C34
+ target_func: 'TEX_SpikeTop'
- - name: TEX_SpinyShell
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x8003DBF8
- target_func: 'TEX_SpinyShell'
+ - name: TEX_SpinyShell
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x8003DBF8
+ target_func: 'TEX_SpinyShell'
- - name: TEX_Spiny
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x8003DD0C
+ - name: TEX_Spiny
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x8003DD0C
target_func: 'TEX_Spiny'
- - name: TEX_SpringBlock
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80AC8640
- target_func: 'TEX_SpringBlock'
+ - name: TEX_SpringBlock
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80AC8640
+ target_func: 'TEX_SpringBlock'
- - name: TEX_Coaster
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80859714
- target_func: 'TEX_Coaster'
+ - name: TEX_Coaster
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80859714
+ target_func: 'TEX_Coaster'
- - name: TEX_Koopa
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A72904
- target_func: 'TEX_Koopa'
+ - name: TEX_Koopa
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A72904
+ target_func: 'TEX_Koopa'
- - name: TEX_KoopaShell
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A72644
- target_func: 'TEX_Koopa'
+ - name: TEX_KoopaShell
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A72644
+ target_func: 'TEX_Koopa'
- - name: TEX_Gabon
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A00290
- target_func: 'TEX_Gabon'
+ - name: TEX_Gabon
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A00290
+ target_func: 'TEX_Gabon'
- - name: TEX_Gabon_Spike
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A00984
- target_func: 'TEX_Gabon_Spike'
+ - name: TEX_Gabon_Spike
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A00984
+ target_func: 'TEX_Gabon_Spike'
- - name: TEX_GabonRock
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x807F8CD4
- target_func: 'TEX_GabonRock'
+ - name: TEX_GabonRock
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x807F8CD4
+ target_func: 'TEX_GabonRock'
- - name: TEX_Podoboo
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x809D0CC0
- target_func: 'TEX_Podoboo'
+ - name: TEX_Podoboo
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809D0CC0
+ target_func: 'TEX_Podoboo'
- - name: TEX_Switch
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A19ED4
- target_func: 'TEX_Switch'
+ - name: TEX_Switch
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A19ED4
+ target_func: 'TEX_Switch'
-# - name: TEX_WiggleShroom
-# type: branch_insn
-# branch_type: bl
+# - name: TEX_WiggleShroom
+# type: branch_insn
+# branch_type: bl
# src_addr_pal: 0x800BC9D8
-# target_func: 'TEX_WiggleShroom'
+# target_func: 'TEX_WiggleShroom'
- - name: TEX_Bramball
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A1C844
- target_func: 'TEX_Bramball'
+ - name: TEX_Bramball
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A1C844
+ target_func: 'TEX_Bramball'
- - name: TEX_Monty
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x809D8DB4
- target_func: 'TEX_Monty'
+ - name: TEX_Monty
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809D8DB4
+ target_func: 'TEX_Monty'
-# - name: TEX_ChainChomp
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80ABF934
-# target_func: 'TEX_ChainChomp'
+# - name: TEX_ChainChomp
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80ABF934
+# target_func: 'TEX_ChainChomp'
- - name: TEX_Manta
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x8085DAA8
- target_func: 'TEX_Manta'
+ - name: TEX_Manta
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x8085DAA8
+ target_func: 'TEX_Manta'
- - name: TEX_Parabeetle
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A83260
- target_func: 'TEX_Parabeetle'
+ - name: TEX_Parabeetle
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A83260
+ target_func: 'TEX_Parabeetle'
- - name: TEX_Bomb
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x809C90A4
- target_func: 'TEX_Bomb'
+ - name: TEX_Bomb
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809C90A4
+ target_func: 'TEX_Bomb'
- - name: TEX_ParaBomb
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A7EEF8
- target_func: 'TEX_ParaBomb'
+ - name: TEX_ParaBomb
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A7EEF8
+ target_func: 'TEX_ParaBomb'
-# - name: TEX_CheepA
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80A3B8F8
-# target_func: 'TEX_CheepA'
+# - name: TEX_CheepA
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A3B8F8
+# target_func: 'TEX_CheepA'
-# - name: TEX_CheepB
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80AB2288
-# target_func: 'TEX_CheepB'
+# - name: TEX_CheepB
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AB2288
+# target_func: 'TEX_CheepB'
-# - name: TEX_CheepC
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80A8A008
-# target_func: 'TEX_CheepC'
+# - name: TEX_CheepC
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A8A008
+# target_func: 'TEX_CheepC'
-# - name: TEX_CheepChomp
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x809A67F4
-# target_func: 'TEX_CheepChomp'
+# - name: TEX_CheepChomp
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x809A67F4
+# target_func: 'TEX_CheepChomp'
# - name: TEX_BigBoo
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80AAF5E0
-# target_func: 'TEX_BigBoo'
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AAF5E0
+# target_func: 'TEX_BigBoo'
#
#
# - name: TEX_Boo
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x808F0628
-# target_func: 'TEX_Boo'
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x808F0628
+# target_func: 'TEX_Boo'
- - name: TEX_Midway
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x807E22C4
- target_func: 'TEX_Midway'
+ - name: TEX_Midway
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x807E22C4
+ target_func: 'TEX_Midway'
- - name: TEX_Goal
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A0A0E8
- target_func: 'TEX_Goal'
+ - name: TEX_Goal
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A0A0E8
+ target_func: 'TEX_Goal'
-# - name: TEX_StretchMush
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x8084AD10
-# target_func: 'TEX_StretchMush'
+# - name: TEX_StretchMush
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x8084AD10
+# target_func: 'TEX_StretchMush'
- - name: TEX_BlockSlide
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x807E54AC
- target_func: 'TEX_BlockSlide'
+ - name: TEX_BlockSlide
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x807E54AC
+ target_func: 'TEX_BlockSlide'
-# - name: TEX_Spinner
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x8084F9E0
-# target_func: 'TEX_Spinner'
+# - name: TEX_Spinner
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x8084F9E0
+# target_func: 'TEX_Spinner'
-# - name: TEX_Platforms
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x800C03A0
-# target_func: 'TEX_Platforms'
+# - name: TEX_Platforms
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x800C03A0
+# target_func: 'TEX_Platforms'
-# - name: TEX_Platform_ShifterH
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80841CBC
-# target_func: 'TEX_Platform_ShifterH'
+# - name: TEX_Platform_ShifterH
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80841CBC
+# target_func: 'TEX_Platform_ShifterH'
-# - name: TEX_Platform_ShifterF
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x808374FC
-# target_func: 'TEX_Platform_ShifterF'
+# - name: TEX_Platform_ShifterF
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x808374FC
+# target_func: 'TEX_Platform_ShifterF'
#
-# - name: TEX_Platform_ShifterL
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80839810
-# target_func: 'TEX_Platform_ShifterL'
+# - name: TEX_Platform_ShifterL
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80839810
+# target_func: 'TEX_Platform_ShifterL'
#
-# - name: TEX_Platform_ShifterV
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80844D68
-# target_func: 'TEX_Platform_ShifterF'
+# - name: TEX_Platform_ShifterV
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80844D68
+# target_func: 'TEX_Platform_ShifterF'
#
-# - name: TEX_Platform_ShifterR
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80845B08
-# target_func: 'TEX_Platform_ShifterR'
+# - name: TEX_Platform_ShifterR
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80845B08
+# target_func: 'TEX_Platform_ShifterR'
#
-# - name: TEX_Platform_ShifterS
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80848A64
-# target_func: 'TEX_Platform_ShifterS'
+# - name: TEX_Platform_ShifterS
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80848A64
+# target_func: 'TEX_Platform_ShifterS'
#
-# - name: TEX_Platform_ShifterK
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x8084A778
-# target_func: 'TEX_Platform_ShifterK'
+# - name: TEX_Platform_ShifterK
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x8084A778
+# target_func: 'TEX_Platform_ShifterK'
#
-# - name: TEX_Platform_ShifterW
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x8084F344
-# target_func: 'TEX_Platform_ShifterW'
+# - name: TEX_Platform_ShifterW
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x8084F344
+# target_func: 'TEX_Platform_ShifterW'
#
-# - name: TEX_Platform_ShifterSL
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80858870
-# target_func: 'TEX_Platform_ShifterSL'
+# - name: TEX_Platform_ShifterSL
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80858870
+# target_func: 'TEX_Platform_ShifterSL'
#
-# - name: TEX_Platform_ShifterWL
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x808BF040
-# target_func: 'TEX_Platform_ShifterW'
+# - name: TEX_Platform_ShifterWL
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x808BF040
+# target_func: 'TEX_Platform_ShifterW'
#
- - name: TEX_PokeyA
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80AA1DB0
- target_func: 'TEX_PokeyA'
+ - name: TEX_PokeyA
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80AA1DB0
+ target_func: 'TEX_PokeyA'
- - name: TEX_PokeyB
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A9F834
- target_func: 'TEX_PokeyB'
+ - name: TEX_PokeyB
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A9F834
+ target_func: 'TEX_PokeyB'
- - name: TEX_PokeyC
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A9D028
- target_func: 'TEX_PokeyC'
+ - name: TEX_PokeyC
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A9D028
+ 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
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80A9F7C0
-# target_func: 'TEX_PokeySnowmanPos'
+# - name: TEX_PokeySnowmanPos
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A9F7C0
+# target_func: 'TEX_PokeySnowmanPos'
#
-# - name: TEX_PokeySnowmanPosA
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80A9FEF8
-# target_func: 'TEX_PokeySnowmanPosA'
+# - name: TEX_PokeySnowmanPosA
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80A9FEF8
+# target_func: 'TEX_PokeySnowmanPosA'
#
-# - name: TEX_PokeySnowmanPosB
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80AA002C
-# target_func: 'TEX_PokeySnowmanPosB'
+# - name: TEX_PokeySnowmanPosB
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AA002C
+# target_func: 'TEX_PokeySnowmanPosB'
#
#
-# - name: TEX_PokeySnowmanPosC
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80AA04D0
-# target_func: 'TEX_PokeySnowmanPosC'
+# - name: TEX_PokeySnowmanPosC
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AA04D0
+# target_func: 'TEX_PokeySnowmanPosC'
#
#
-# - name: TEX_PokeySnowmanPosD
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80AA0644
-# target_func: 'TEX_PokeySnowmanPosD'
+# - name: TEX_PokeySnowmanPosD
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AA0644
+# target_func: 'TEX_PokeySnowmanPosD'
#
-# - name: TEX_PokeySnowmanPosE
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80AA0848
-# target_func: 'TEX_PokeySnowmanPosE'
+# - name: TEX_PokeySnowmanPosE
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AA0848
+# target_func: 'TEX_PokeySnowmanPosE'
#
-# - name: TEX_PokeySnowmanPosF
-# type: branch_insn
-# branch_type: bl
-# src_addr_pal: 0x80AA0A5C
-# target_func: 'TEX_PokeySnowmanPosF'
+# - name: TEX_PokeySnowmanPosF
+# type: branch_insn
+# branch_type: bl
+# src_addr_pal: 0x80AA0A5C
+# target_func: 'TEX_PokeySnowmanPosF'
#
#
#
-# - name: TEX_PokeySnowmanPosZ
-# type: patch
-# data: '60000000'
-# addr_pal: 0x80A9D054
+# - name: TEX_PokeySnowmanPosZ
+# type: patch
+# data: '60000000'
+# addr_pal: 0x80A9D054
- - name: TEX_PokeySnowman
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A9F714
- target_func: 'TEX_PokeySnowman'
+ - name: TEX_PokeySnowman
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A9F714
+ target_func: 'TEX_PokeySnowman'
- - name: TEX_CloudBounce
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5C900
- target_func: 'TEX_CloudBounce'
+ - name: TEX_CloudBounce
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5C900
+ target_func: 'TEX_CloudBounce'
- - name: TEX_SpikeBall
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x809B7620
- target_func: 'TEX_SpikeBall'
+ - name: TEX_SpikeBall
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809B7620
+ target_func: 'TEX_SpikeBall'
- - name: TEX_SpikeBallSmall
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80AB6054
- target_func: 'TEX_SpikeBall'
+ - name: TEX_SpikeBallSmall
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80AB6054
+ target_func: 'TEX_SpikeBall'
- - name: TEX_Huckit
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A3F004
- target_func: 'TEX_Huckit'
+ - name: TEX_Huckit
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A3F004
+ target_func: 'TEX_Huckit'
- - name: TEX_HuckitBalls
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A40B70
- target_func: 'TEX_HuckitBalls'
+ - name: TEX_HuckitBalls
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A40B70
+ target_func: 'TEX_HuckitBalls'
- - name: HammerTime
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5BCB0
- target_func: 'HammerTime'
+ - name: HammerTime
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5BCB0
+ target_func: 'HammerTime'
- - name: HammerLaunch
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5BA68
+ - name: HammerLaunch
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5BA68
target_func: 'HammerLaunch'
- - name: HammerSpin
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80A5BA90
- target_func: 'HammerSpin'
+ - name: HammerSpin
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80A5BA90
+ target_func: 'HammerSpin'
- - name: TEX_YoshiEggSetColour
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80911050
- target_func: 'TEX_YoshiEggSetColour'
+ - name: TEX_YoshiEggSetColour
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80911050
+ target_func: 'TEX_YoshiEggSetColour'
- - name: TEX_YoshiEggSetBrres
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x809113D0
- target_func: 'TEX_YoshiEggSetBrres'
+ - name: TEX_YoshiEggSetBrres
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809113D0
+ target_func: 'TEX_YoshiEggSetBrres'
- - name: TEX_YoshiEggSetFrame
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x809114B4
+ - name: TEX_YoshiEggSetFrame
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809114B4
target_func: 'TEX_YoshiEggSetFrame'
- - name: TEX_YoshiEggEffect
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x80911658
- target_func: 'TEX_YoshiEggEffect'
-
- - name: TEX_YoshiSetColour
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x8005E9C8
- target_func: 'TEX_YoshiSetColour'
-
- - name: TEX_YoshiHack
- type: branch_insn
- branch_type: bl
- src_addr_pal: 0x800FE58C
- target_func: 'TEX_YoshiHack'
-
- - name: TEX_YoshiColourOrderA
- type: patch
- data: '3F8000004000000040400000'
- addr_pal: 0x8093DAB4
-
- - name: TEX_YoshiColourOrderB
- type: patch
- data: '00000003000000010000000200000000'
- addr_pal: 0x8093DAD8
+ - name: TEX_YoshiEggEffect
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x80911658
+ target_func: 'TEX_YoshiEggEffect'
+
+ - name: TEX_YoshiSetColour
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x8005E9C8
+ target_func: 'TEX_YoshiSetColour'
+
+ - name: TEX_YoshiHack
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x800FE58C
+ target_func: 'TEX_YoshiHack'
+
+ - name: TEX_YoshiColourOrderA
+ type: patch
+ data: '3F8000004000000040400000'
+ addr_pal: 0x8093DAB4
+
+ - name: TEX_YoshiColourOrderB
+ type: patch
+ data: '00000003000000010000000200000000'
+ addr_pal: 0x8093DAD8
diff --git a/src/animtiles.cpp b/src/animtiles.cpp
index 26cdbf8..2efba16 100644
--- a/src/animtiles.cpp
+++ b/src/animtiles.cpp
@@ -1,61 +1,61 @@
-#include <common.h>
-#include <game.h>
-#include "fileload.h"
-
-struct AnimDef_Header {
- u32 magic;
- u32 entryCount;
-};
-
-struct AnimDef_Entry {
- u16 texNameOffset;
- u16 frameDelayOffset;
- u16 tileNum;
- u8 tilesetNum;
- u8 reverse;
-};
-
-FileHandle fh;
-
-void DoTiles(void* self) {
- //OSReport("fucker\n");
- AnimDef_Header *header;
-
- header = (AnimDef_Header*)LoadFile(&fh, "/NewerRes/AnimTiles.bin");
-
- if (!header) {
- OSReport("anim load fail\n");
- return;
- }
-
- if (header->magic != 'NWRa') {
- OSReport("anim info incorrect\n");
- FreeFile(&fh);
- return;
- }
-
- AnimDef_Entry *entries = (AnimDef_Entry*)(header+1);
-
- OSReport("Loading animated tiles\n");
-
- for (int i = 0; i < header->entryCount; i++) {
- AnimDef_Entry *entry = &entries[i];
- char *name = (char*)fh.filePtr+entry->texNameOffset;
- char *frameDelays = (char*)fh.filePtr+entry->frameDelayOffset;
-
- char realName[0x40];
- snprintf(realName, 0x40, "BG_tex/%s", name);
-
- void *blah = BgTexMng__LoadAnimTile(self, entry->tilesetNum, entry->tileNum, realName, frameDelays, entry->reverse);
-
- OSReport("[%d] %s %08x\n", i, name, blah);
- //OSReport("Returned: %08x\n", blah);
- }
-
- OSReport("Animated tiles complete\n");
-}
-
-
-void DestroyTiles(void *self) {
- FreeFile(&fh);
-}
+#include <common.h>
+#include <game.h>
+#include "fileload.h"
+
+struct AnimDef_Header {
+ u32 magic;
+ u32 entryCount;
+};
+
+struct AnimDef_Entry {
+ u16 texNameOffset;
+ u16 frameDelayOffset;
+ u16 tileNum;
+ u8 tilesetNum;
+ u8 reverse;
+};
+
+FileHandle fh;
+
+void DoTiles(void* self) {
+ //OSReport("fucker\n");
+ AnimDef_Header *header;
+
+ header = (AnimDef_Header*)LoadFile(&fh, "/NewerRes/AnimTiles.bin");
+
+ if (!header) {
+ OSReport("anim load fail\n");
+ return;
+ }
+
+ if (header->magic != 'NWRa') {
+ OSReport("anim info incorrect\n");
+ FreeFile(&fh);
+ return;
+ }
+
+ AnimDef_Entry *entries = (AnimDef_Entry*)(header+1);
+
+ OSReport("Loading animated tiles\n");
+
+ for (int i = 0; i < header->entryCount; i++) {
+ AnimDef_Entry *entry = &entries[i];
+ char *name = (char*)fh.filePtr+entry->texNameOffset;
+ char *frameDelays = (char*)fh.filePtr+entry->frameDelayOffset;
+
+ char realName[0x40];
+ snprintf(realName, 0x40, "BG_tex/%s", name);
+
+ void *blah = BgTexMng__LoadAnimTile(self, entry->tilesetNum, entry->tileNum, realName, frameDelays, entry->reverse);
+
+ OSReport("[%d] %s %08x\n", i, name, blah);
+ //OSReport("Returned: %08x\n", blah);
+ }
+
+ OSReport("Animated tiles complete\n");
+}
+
+
+void DestroyTiles(void *self) {
+ FreeFile(&fh);
+}
diff --git a/src/crowdclapper.s b/src/crowdclapper.s
new file mode 100644
index 0000000..786013f
--- /dev/null
+++ b/src/crowdclapper.s
@@ -0,0 +1,39 @@
+.extern OneofManySoundPlayers
+.extern EventTable
+
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+#endif
+
+.text
+.align 4
+
+.global CrowdClapperEventActivate
+CrowdClapperEventActivate:
+
+ mflr r0
+ bl OneofManySoundPlayers
+ mtlr r0
+
+ lis r8, EventTable@h
+ ori r8, r8, EventTable@l
+
+ lwz r11, 4(r8)
+
+ lwz r9, 4(r31)
+ srwi r9, r9, 24
+
+ subi r9, r9, 1
+
+ li r10, 1
+ slw r10, r10, r9
+
+ or r11, r11, r10
+ stw r11, 0(r8)
+ blr \ No newline at end of file
diff --git a/src/eventlooper.cpp b/src/eventlooper.cpp
index 755742d..6bc0526 100644
--- a/src/eventlooper.cpp
+++ b/src/eventlooper.cpp
@@ -1,37 +1,37 @@
-#include <common.h>
-#include <game.h>
-
-struct EventLooper {
- u32 id; // 0x00
- u32 settings; // 0x04
- u16 name; // 0x08
- u8 _0A[6]; // 0x0A
- u8 _10[0x9C]; // 0x10
- float x; // 0xAC
- float y; // 0xB0
- float z; // 0xB4
- u8 _B8[0x318]; // 0xB8
- // Any variables you add to the class go here; starting at offset 0x3D0
- u64 eventFlag; // 0x3D0
- u64 eventActive; // 0x3D0
- u8 delay; // 0x3D4
- u8 delayCount; // 0x3D7
-};
-
-struct EventTable_t {
- u64 events;
- // ...
-};
-
-extern EventTable_t *EventTable;
+#include <common.h>
+#include <game.h>
-void EventLooper_Update(EventLooper *self);
+struct EventLooper {
+ u32 id; // 0x00
+ u32 settings; // 0x04
+ u16 name; // 0x08
+ u8 _0A[6]; // 0x0A
+ u8 _10[0x9C]; // 0x10
+ float x; // 0xAC
+ float y; // 0xB0
+ float z; // 0xB4
+ u8 _B8[0x318]; // 0xB8
+ // Any variables you add to the class go here; starting at offset 0x3D0
+ u64 eventFlag; // 0x3D0
+ u64 eventActive; // 0x3D0
+ u8 delay; // 0x3D4
+ u8 delayCount; // 0x3D7
+};
+struct EventTable_t {
+ u64 events;
+ // ...
+};
-
-bool EventLooper_Create(EventLooper *self) {
- char eventStart = (self->settings >> 24) & 0xFF;
- char eventEnd = (self->settings >> 16) & 0xFF;
+extern EventTable_t *EventTable;
+
+void EventLooper_Update(EventLooper *self);
+
+
+
+bool EventLooper_Create(EventLooper *self) {
+ char eventStart = (self->settings >> 24) & 0xFF;
+ char eventEnd = (self->settings >> 16) & 0xFF;
// Putting all the events into the flag
int i;
@@ -41,41 +41,41 @@ bool EventLooper_Create(EventLooper *self) {
q = q | ((u64)1 << (i - 1));
}
- self->eventFlag = q;
+ self->eventFlag = q;
- self->delay = (((self->settings) & 0xFF) + 1) * 10;
- self->delayCount = 0;
+ self->delay = (((self->settings) & 0xFF) + 1) * 10;
+ self->delayCount = 0;
- char tmpEvent= (self->settings >> 8) & 0xFF;
+ char tmpEvent= (self->settings >> 8) & 0xFF;
if (tmpEvent == 0)
{
self->eventActive = (u64)0xFFFFFFFFFFFFFFFF;
}
else
{
- self->eventActive = (u64)1 << (tmpEvent - 1);
+ self->eventActive = (u64)1 << (tmpEvent - 1);
}
if (EventTable->events & self->eventActive)
- {
+ {
u64 evState = (u64)1 << (eventStart - 1);
EventTable->events = EventTable->events | evState;
}
- EventLooper_Update(self);
-
- return true;
-}
-
-bool EventLooper_Execute(EventLooper *self) {
- EventLooper_Update(self);
- return true;
-}
-
+ EventLooper_Update(self);
+
+ return true;
+}
+
+bool EventLooper_Execute(EventLooper *self) {
+ EventLooper_Update(self);
+ return true;
+}
+
-void EventLooper_Update(EventLooper *self) {
+void EventLooper_Update(EventLooper *self) {
if ((EventTable->events & self->eventActive) == 0)
return;
@@ -83,7 +83,7 @@ void EventLooper_Update(EventLooper *self) {
// Waiting for the right moment
if (self->delayCount < self->delay)
{
-// OSReport("Delaying: %d / %d\n", self->delayCount, self->delay);
+// OSReport("Delaying: %d / %d\n", self->delayCount, self->delay);
self->delayCount = self->delayCount + 1;
return;
@@ -93,7 +93,7 @@ void EventLooper_Update(EventLooper *self) {
self->delayCount = 0;
// Find which event(s) is/are on
- u64 evState = EventTable->events & self->eventFlag;
+ u64 evState = EventTable->events & self->eventFlag;
// Turn off the old events
EventTable->events = EventTable->events & (~self->eventFlag);
@@ -107,7 +107,7 @@ void EventLooper_Update(EventLooper *self) {
else
{
- char eventStart = (self->settings >> 24) & 0xFF;
+ char eventStart = (self->settings >> 24) & 0xFF;
evState = (u64)1 << (eventStart - 1);
EventTable->events = EventTable->events | evState;
}
diff --git a/src/fileload.cpp b/src/fileload.cpp
index 5f60e8c..fac7576 100644
--- a/src/fileload.cpp
+++ b/src/fileload.cpp
@@ -1,134 +1,134 @@
-#include "fileload.h"
-
-extern "C" void UncompressBackward(void *bottom);
-
-
-void *LoadFile(FileHandle *handle, const char *name) {
- OSReport("[LoadFile %s]\n", name);
-
- int entryNum = DVDConvertPathToEntrynum(name);
-
- DVDHandle dvdhandle;
- if (!DVDFastOpen(entryNum, &dvdhandle)) {
- OSReport("Cannot open file %s [%d]\n", name, entryNum);
- return 0;
- }
-
- handle->length = dvdhandle.length;
- handle->filePtr = EGG__Heap__alloc((handle->length+0x1F) & ~0x1F, 0x20, GetArchiveHeap());
-
- int ret = DVDReadPrio(&dvdhandle, handle->filePtr, (handle->length+0x1F) & ~0x1F, 0, 2);
-
- DVDClose(&dvdhandle);
-
- OSReport("[Success %p]\n", handle->filePtr);
-
- return handle->filePtr;
-}
-
-void *LoadCompressedFile(FileHandle *handle, const char *name) {
- OSReport("[LoadCompressedFile %s]\n", name);
-
- int entryNum = DVDConvertPathToEntrynum(name);
-
- DVDHandle dvdhandle;
- if (!DVDFastOpen(entryNum, &dvdhandle)) {
- OSReport("Cannot open file %s [%d]\n", name, entryNum);
- return 0;
- }
-
- u32 infoBlock[0x20 / sizeof(u32)] __attribute__ ((aligned(32)));
- DVDReadPrio(&dvdhandle, infoBlock, 0x20, dvdhandle.length - 8, 2);
-
- // Reverse it!
- infoBlock[1] = (infoBlock[1] >> 24) | ((infoBlock[1] >> 8) & 0xFF00) | ((infoBlock[1] & 0xFF00) << 8) | ((infoBlock[1] & 0xFF) << 24);
-
- u32 uncompSize = dvdhandle.length + infoBlock[1];
- OSReport("[Comp:%d UnComp:%d]\n", dvdhandle.length, uncompSize);
- handle->length = uncompSize;
- handle->filePtr = EGG__Heap__alloc((uncompSize+0x1F) & ~0x1F, 0x20, GetArchiveHeap());
-
- int ret = DVDReadPrio(&dvdhandle, handle->filePtr, (dvdhandle.length+0x1F) & ~0x1F, 0, 2);
-
- DVDClose(&dvdhandle);
-
- UncompressBackward((void*)((u32)handle->filePtr + dvdhandle.length));
-
- OSReport("[Success %p]\n", handle->filePtr);
-
- return handle->filePtr;
-}
-
-bool FreeFile(FileHandle *handle) {
- if (!handle) return false;
-
- if (handle->filePtr) {
- OSReport("[FreeFile %p]\n", handle->filePtr);
- EGG__Heap__free(handle->filePtr, GetArchiveHeap());
- }
-
- handle->filePtr = 0;
- handle->length = 0;
-
- return true;
-}
-
-
-
-
-File::File() {
- m_loaded = false;
-}
-
-File::~File() {
- close();
-}
-
-bool File::open(const char *filename) {
- if (m_loaded)
- close();
-
- void *ret = LoadFile(&m_handle, filename);
- if (ret != 0)
- m_loaded = true;
-
- return (ret != 0);
-}
-
-bool File::openCompressed(const char *filename) {
- if (m_loaded)
- close();
-
- void *ret = LoadCompressedFile(&m_handle, filename);
- if (ret != 0)
- m_loaded = true;
-
- return (ret != 0);
-}
-
-void File::close() {
- if (!m_loaded)
- return;
-
- m_loaded = false;
- FreeFile(&m_handle);
-}
-
-bool File::isOpen() {
- return m_loaded;
-}
-
-void *File::ptr() {
- if (m_loaded)
- return m_handle.filePtr;
- else
- return 0;
-}
-
-u32 File::length() {
- if (m_loaded)
- return m_handle.length;
- else
- return 0xFFFFFFFF;
-}
-
+#include "fileload.h"
+
+extern "C" void UncompressBackward(void *bottom);
+
+
+void *LoadFile(FileHandle *handle, const char *name) {
+ OSReport("[LoadFile %s]\n", name);
+
+ int entryNum = DVDConvertPathToEntrynum(name);
+
+ DVDHandle dvdhandle;
+ if (!DVDFastOpen(entryNum, &dvdhandle)) {
+ OSReport("Cannot open file %s [%d]\n", name, entryNum);
+ return 0;
+ }
+
+ handle->length = dvdhandle.length;
+ handle->filePtr = EGG__Heap__alloc((handle->length+0x1F) & ~0x1F, 0x20, GetArchiveHeap());
+
+ int ret = DVDReadPrio(&dvdhandle, handle->filePtr, (handle->length+0x1F) & ~0x1F, 0, 2);
+
+ DVDClose(&dvdhandle);
+
+ OSReport("[Success %p]\n", handle->filePtr);
+
+ return handle->filePtr;
+}
+
+void *LoadCompressedFile(FileHandle *handle, const char *name) {
+ OSReport("[LoadCompressedFile %s]\n", name);
+
+ int entryNum = DVDConvertPathToEntrynum(name);
+
+ DVDHandle dvdhandle;
+ if (!DVDFastOpen(entryNum, &dvdhandle)) {
+ OSReport("Cannot open file %s [%d]\n", name, entryNum);
+ return 0;
+ }
+
+ u32 infoBlock[0x20 / sizeof(u32)] __attribute__ ((aligned(32)));
+ DVDReadPrio(&dvdhandle, infoBlock, 0x20, dvdhandle.length - 8, 2);
+
+ // Reverse it!
+ infoBlock[1] = (infoBlock[1] >> 24) | ((infoBlock[1] >> 8) & 0xFF00) | ((infoBlock[1] & 0xFF00) << 8) | ((infoBlock[1] & 0xFF) << 24);
+
+ u32 uncompSize = dvdhandle.length + infoBlock[1];
+ OSReport("[Comp:%d UnComp:%d]\n", dvdhandle.length, uncompSize);
+ handle->length = uncompSize;
+ handle->filePtr = EGG__Heap__alloc((uncompSize+0x1F) & ~0x1F, 0x20, GetArchiveHeap());
+
+ int ret = DVDReadPrio(&dvdhandle, handle->filePtr, (dvdhandle.length+0x1F) & ~0x1F, 0, 2);
+
+ DVDClose(&dvdhandle);
+
+ UncompressBackward((void*)((u32)handle->filePtr + dvdhandle.length));
+
+ OSReport("[Success %p]\n", handle->filePtr);
+
+ return handle->filePtr;
+}
+
+bool FreeFile(FileHandle *handle) {
+ if (!handle) return false;
+
+ if (handle->filePtr) {
+ OSReport("[FreeFile %p]\n", handle->filePtr);
+ EGG__Heap__free(handle->filePtr, GetArchiveHeap());
+ }
+
+ handle->filePtr = 0;
+ handle->length = 0;
+
+ return true;
+}
+
+
+
+
+File::File() {
+ m_loaded = false;
+}
+
+File::~File() {
+ close();
+}
+
+bool File::open(const char *filename) {
+ if (m_loaded)
+ close();
+
+ void *ret = LoadFile(&m_handle, filename);
+ if (ret != 0)
+ m_loaded = true;
+
+ return (ret != 0);
+}
+
+bool File::openCompressed(const char *filename) {
+ if (m_loaded)
+ close();
+
+ void *ret = LoadCompressedFile(&m_handle, filename);
+ if (ret != 0)
+ m_loaded = true;
+
+ return (ret != 0);
+}
+
+void File::close() {
+ if (!m_loaded)
+ return;
+
+ m_loaded = false;
+ FreeFile(&m_handle);
+}
+
+bool File::isOpen() {
+ return m_loaded;
+}
+
+void *File::ptr() {
+ if (m_loaded)
+ return m_handle.filePtr;
+ else
+ return 0;
+}
+
+u32 File::length() {
+ if (m_loaded)
+ return m_handle.length;
+ else
+ return 0xFFFFFFFF;
+}
+
diff --git a/src/fileload.h b/src/fileload.h
index 5dcdb2b..e5667ff 100644
--- a/src/fileload.h
+++ b/src/fileload.h
@@ -1,74 +1,74 @@
-#ifndef __NEWER_FILELOAD_H
-#define __NEWER_FILELOAD_H
-
-#include <common.h>
-
-struct FileHandle {
- void *filePtr;
- int length;
-};
-
-struct DVDHandle {
- int unk1; // 00
- int unk2; // 04
- int unk3; // 08
- int unk4; // 0C
- int unk5; // 10
- int unk6; // 14
- int unk7; // 18
- int unk8; // 1C
- int unk9; // 20
- int unk10; // 24
- int unk11; // 28
- int unk12; // 2C
- int address; // 30
- int length; // 34
- int unk13; // 38
-};
-
-
-int DVDConvertPathToEntrynum(const char *path);
-bool DVDFastOpen(int entrynum, DVDHandle *handle);
-int DVDReadPrio(DVDHandle *handle, void *buffer, int length, int offset, int unk);
-bool DVDClose(DVDHandle *handle);
-
-// EGG::Heap
-void *EGG__Heap__alloc(unsigned long size, int unk, void *heap);
-void EGG__Heap__free(void *ptr, void *heap);
-
-void *LoadFile(FileHandle *handle, const char *name);
-void *LoadCompressedFile(FileHandle *handle, const char *name);
-bool FreeFile(FileHandle *handle);
-
-void inline *GetArchiveHeap() {
- return ArchiveHeap;
-
-}
-
-
-// C++ interface
-class File {
-public:
- File();
- ~File();
-
- bool open(const char *filename);
- void close();
-
- bool openCompressed(const char *filename);
-
- bool isOpen();
-
- void *ptr();
- u32 length();
-
-private:
- FileHandle m_handle;
- bool m_loaded;
-};
-
-
-// Todo: input stream maybe?
-
-#endif
-
+#ifndef __NEWER_FILELOAD_H
+#define __NEWER_FILELOAD_H
+
+#include <common.h>
+
+struct FileHandle {
+ void *filePtr;
+ int length;
+};
+
+struct DVDHandle {
+ int unk1; // 00
+ int unk2; // 04
+ int unk3; // 08
+ int unk4; // 0C
+ int unk5; // 10
+ int unk6; // 14
+ int unk7; // 18
+ int unk8; // 1C
+ int unk9; // 20
+ int unk10; // 24
+ int unk11; // 28
+ int unk12; // 2C
+ int address; // 30
+ int length; // 34
+ int unk13; // 38
+};
+
+
+int DVDConvertPathToEntrynum(const char *path);
+bool DVDFastOpen(int entrynum, DVDHandle *handle);
+int DVDReadPrio(DVDHandle *handle, void *buffer, int length, int offset, int unk);
+bool DVDClose(DVDHandle *handle);
+
+// EGG::Heap
+void *EGG__Heap__alloc(unsigned long size, int unk, void *heap);
+void EGG__Heap__free(void *ptr, void *heap);
+
+void *LoadFile(FileHandle *handle, const char *name);
+void *LoadCompressedFile(FileHandle *handle, const char *name);
+bool FreeFile(FileHandle *handle);
+
+void inline *GetArchiveHeap() {
+ return ArchiveHeap;
+
+}
+
+
+// C++ interface
+class File {
+public:
+ File();
+ ~File();
+
+ bool open(const char *filename);
+ void close();
+
+ bool openCompressed(const char *filename);
+
+ bool isOpen();
+
+ void *ptr();
+ u32 length();
+
+private:
+ FileHandle m_handle;
+ bool m_loaded;
+};
+
+
+// Todo: input stream maybe?
+
+#endif
+
diff --git a/src/gakenoko.S b/src/gakenoko.S
index 9443ce4..3f12501 100644
--- a/src/gakenoko.S
+++ b/src/gakenoko.S
@@ -1,220 +1,220 @@
-# GAKE CLASS LAYOUT
-#
-# 524: SomeMHeapAllocatorSubclass
-# 540: 0 [[ResFile maybe?]]
-# 544: mdl_c
-# 584: SomeModelAnimationClass
-# 5BC: ResAnmTexPat (maybe?)
-# 5C0: Some type of animation: 80329890
-# 5C4: Set to 0 in ctor
-# 5C8: Set to 0 in ctor
-# 5CC: mAllocator_c
-# 5F4: EGG::Effect subclass 80329CA0
-#
-#
-# NET CLASS LAYOUT
-#
-# 524: 0
-# 528: SomeMHeapAllocatorSubclass
-# 544: ResFile
-# 548: mdl_c
-# 588: SomeModelAnimationClass
-# 5C0: ResAnmTexPat
-# 5C4: Some type of animation: 80329890
-# 5C8: Set to 0 in ctor
-# 5CC: Set to 0 in ctor
-# 5D0: mAllocator_c
-
-.extern mHeapAllocatorSubclass_Link
-.extern mHeapAllocatorSubclass_UnLink
-.extern RetrieveFileFromArc
-.extern GetResMdl
-.extern m3d__mdl_c__DoStuff
-.extern sub_80064BD0
-.extern GetResAnmChr
-.extern SomeModelAnimationClass_Setup
-.extern GetResAnmTexPat
-.extern sub_80166970
-.extern sub_80166D10
-.extern daEnGakeNoko_c__StateID_FoolMove
-
-#ifndef __MWERKS__
-.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
-.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
-.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
-.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
-.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
-.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
-.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
-#endif
-
-.set sp,1
-.set rtoc,2
-.set this,31
-
-.text
-
-.align 4
-.global gakenoko_create
-
-.set AnmTexPat,0x24
-.set ResMdlForTexPat,0x20
-.set AnmChr,0x1C
-.set ResMdlForChr,0x18
-.set ResMdlForScnMdl,0x14
-.set AnmTexPatAgain,0x10
-
-# Stack layout:
-# 0x34 : LR
-# 0x30 : SP
-# 0x2C : save this
-# 0x28 : save r30
-# 0x24 : AnmTexPat
-# 0x20 : ResMdlForTexPat
-# 0x1C : AnmChr
-# 0x18 : ResMdlForChr
-# 0x14 : ResMdlForScnMdl
-# 0x10 : AnmTexPatAgain
-
-# Local register vars:
-# r31 = this
-# r30 = resmdl
-
-gakenoko_create:
- stwu r1, -0x30(sp)
- mflr r0
- stw r0, 0x34(sp)
- stw this, 0x2C(sp)
- stw r30, 0x28(sp)
-
- mr this, r3
-
- # Create a heap
- addi r3, r3, 0x524 # SomeMHeapAllocatorSubclass
- li r4, -1
- lis r5, 0x8037
- lwz r5, 0x7F48(r5)
- bl mHeapAllocatorSubclass_Link
-
- # Get ResFile
- lwz r3, -0x5668(r13)
- addi r3, r3, 4
- lis r4, arcName@h
- ori r4, r4, arcName@l
- lis r5, fileName@h
- ori r5, r5, fileName@l
- bl RetrieveFileFromArc
-
- stw r3, 0x540(this)
-
- # Get model
- addi r3, this, 0x540 # ResFile
- lis r4, arcName@h
- ori r4, r4, arcName@l
- bl GetResMdl
-
- mr r30, r3
- stw r3, ResMdlForScnMdl(sp) # store resmdl
-
- # Do scnmdl stuff
- addi r3, this, 0x544 # mdl_c
- addi r4, sp, ResMdlForScnMdl
- addi r5, this, 0x524 # SomeMHeapAllocatorSubclass
- li r6, 0x7fff
- li r7, 1
- li r8, 0
- bl m3d__mdl_c__DoStuff
-
- addi r3, this, 0x544 # mdl_c
- bl sub_80064BD0
-
- # Handle anim
- addi r3, this, 0x540 # ResFile
- lis r4, animName@h
- ori r4, r4, animName@l
- bl GetResAnmChr
-
- stw r3, AnmChr(sp)
-
- # Set it up
- stw r30, ResMdlForChr(sp)
-
- addi r3, this, 0x584 # SomeModelAnimationClass
- addi r4, sp, ResMdlForChr
- addi r5, sp, AnmChr
- addi r6, this, 0x524 # SomeMHeapAllocatorSubclass
- li r7, 0
- bl SomeModelAnimationClass_Setup
-
- # Now handle the texpat anim
- addi r3, this, 0x540 # ResFile
- lis r4, arcName@h
- ori r4, r4, arcName@l
- bl GetResAnmTexPat
-
- stw r3, 0x5BC(this) # ResAnmTexPat
- stw r3, AnmTexPat(sp)
-
- # Set it up
- stw r30, ResMdlForTexPat(sp)
-
- addi r3, this, 0x5C0 # Weird Animation
- addi r4, sp, ResMdlForTexPat
- addi r5, sp, AnmTexPat
- addi r6, this, 0x524 # SomeMHeapAllocatorSubclass
- li r7, 0
- li r8, 1
- bl sub_80166970
-
-
- lwz r0, 0x5BC(this)
- stw r0, AnmTexPatAgain(sp)
-
- addi r3, this, 0x5C0 # Weird Animation
- addi r4, this, 0x544 # mdl_c
- addi r5, sp, AnmTexPatAgain
- li r6, 0
- li r7, 1
- bl sub_80166D10
-
- # Unbind the MHeapAllocatorSubclass
- addi r3, this, 0x524 # SomeMHeapAllocatorSubclass
- bl mHeapAllocatorSubclass_UnLink
-
-
- # Model's done
- # Set a state
- mr r3, this
- lis r4, daEnGakeNoko_c__StateID_FoolMove@h
- ori r4, r4, daEnGakeNoko_c__StateID_FoolMove@l
-
- lwz r12, 0x60(this)
- lwz r12, 0xD4(r12)
- mtctr r12
-
-
- li r3, 1
-
- # Clean up stack
- lwz r0, 0x34(sp)
- lwz this, 0x2C(sp)
- lwz r30, 0x28(sp)
- mtlr r0
- addi sp, sp, 0x30
-
- blr
-
-
-.data
-
-fileName:
- .string "g3d/nokonokoB.brres"
-
-arcName:
- .string "nokonokoB"
-
-animName:
- .string "net_walk2"
-
-debugString:
- .string "X> %08x\n"
+# GAKE CLASS LAYOUT
+#
+# 524: SomeMHeapAllocatorSubclass
+# 540: 0 [[ResFile maybe?]]
+# 544: mdl_c
+# 584: SomeModelAnimationClass
+# 5BC: ResAnmTexPat (maybe?)
+# 5C0: Some type of animation: 80329890
+# 5C4: Set to 0 in ctor
+# 5C8: Set to 0 in ctor
+# 5CC: mAllocator_c
+# 5F4: EGG::Effect subclass 80329CA0
+#
+#
+# NET CLASS LAYOUT
+#
+# 524: 0
+# 528: SomeMHeapAllocatorSubclass
+# 544: ResFile
+# 548: mdl_c
+# 588: SomeModelAnimationClass
+# 5C0: ResAnmTexPat
+# 5C4: Some type of animation: 80329890
+# 5C8: Set to 0 in ctor
+# 5CC: Set to 0 in ctor
+# 5D0: mAllocator_c
+
+.extern mHeapAllocatorSubclass_Link
+.extern mHeapAllocatorSubclass_UnLink
+.extern RetrieveFileFromArc
+.extern GetResMdl
+.extern m3d__mdl_c__DoStuff
+.extern sub_80064BD0
+.extern GetResAnmChr
+.extern SomeModelAnimationClass_Setup
+.extern GetResAnmTexPat
+.extern sub_80166970
+.extern sub_80166D10
+.extern daEnGakeNoko_c__StateID_FoolMove
+
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+#endif
+
+.set sp,1
+.set rtoc,2
+.set this,31
+
+.text
+
+.align 4
+.global gakenoko_create
+
+.set AnmTexPat,0x24
+.set ResMdlForTexPat,0x20
+.set AnmChr,0x1C
+.set ResMdlForChr,0x18
+.set ResMdlForScnMdl,0x14
+.set AnmTexPatAgain,0x10
+
+# Stack layout:
+# 0x34 : LR
+# 0x30 : SP
+# 0x2C : save this
+# 0x28 : save r30
+# 0x24 : AnmTexPat
+# 0x20 : ResMdlForTexPat
+# 0x1C : AnmChr
+# 0x18 : ResMdlForChr
+# 0x14 : ResMdlForScnMdl
+# 0x10 : AnmTexPatAgain
+
+# Local register vars:
+# r31 = this
+# r30 = resmdl
+
+gakenoko_create:
+ stwu r1, -0x30(sp)
+ mflr r0
+ stw r0, 0x34(sp)
+ stw this, 0x2C(sp)
+ stw r30, 0x28(sp)
+
+ mr this, r3
+
+ # Create a heap
+ addi r3, r3, 0x524 # SomeMHeapAllocatorSubclass
+ li r4, -1
+ lis r5, 0x8037
+ lwz r5, 0x7F48(r5)
+ bl mHeapAllocatorSubclass_Link
+
+ # Get ResFile
+ lwz r3, -0x5668(r13)
+ addi r3, r3, 4
+ lis r4, arcName@h
+ ori r4, r4, arcName@l
+ lis r5, fileName@h
+ ori r5, r5, fileName@l
+ bl RetrieveFileFromArc
+
+ stw r3, 0x540(this)
+
+ # Get model
+ addi r3, this, 0x540 # ResFile
+ lis r4, arcName@h
+ ori r4, r4, arcName@l
+ bl GetResMdl
+
+ mr r30, r3
+ stw r3, ResMdlForScnMdl(sp) # store resmdl
+
+ # Do scnmdl stuff
+ addi r3, this, 0x544 # mdl_c
+ addi r4, sp, ResMdlForScnMdl
+ addi r5, this, 0x524 # SomeMHeapAllocatorSubclass
+ li r6, 0x7fff
+ li r7, 1
+ li r8, 0
+ bl m3d__mdl_c__DoStuff
+
+ addi r3, this, 0x544 # mdl_c
+ bl sub_80064BD0
+
+ # Handle anim
+ addi r3, this, 0x540 # ResFile
+ lis r4, animName@h
+ ori r4, r4, animName@l
+ bl GetResAnmChr
+
+ stw r3, AnmChr(sp)
+
+ # Set it up
+ stw r30, ResMdlForChr(sp)
+
+ addi r3, this, 0x584 # SomeModelAnimationClass
+ addi r4, sp, ResMdlForChr
+ addi r5, sp, AnmChr
+ addi r6, this, 0x524 # SomeMHeapAllocatorSubclass
+ li r7, 0
+ bl SomeModelAnimationClass_Setup
+
+ # Now handle the texpat anim
+ addi r3, this, 0x540 # ResFile
+ lis r4, arcName@h
+ ori r4, r4, arcName@l
+ bl GetResAnmTexPat
+
+ stw r3, 0x5BC(this) # ResAnmTexPat
+ stw r3, AnmTexPat(sp)
+
+ # Set it up
+ stw r30, ResMdlForTexPat(sp)
+
+ addi r3, this, 0x5C0 # Weird Animation
+ addi r4, sp, ResMdlForTexPat
+ addi r5, sp, AnmTexPat
+ addi r6, this, 0x524 # SomeMHeapAllocatorSubclass
+ li r7, 0
+ li r8, 1
+ bl sub_80166970
+
+
+ lwz r0, 0x5BC(this)
+ stw r0, AnmTexPatAgain(sp)
+
+ addi r3, this, 0x5C0 # Weird Animation
+ addi r4, this, 0x544 # mdl_c
+ addi r5, sp, AnmTexPatAgain
+ li r6, 0
+ li r7, 1
+ bl sub_80166D10
+
+ # Unbind the MHeapAllocatorSubclass
+ addi r3, this, 0x524 # SomeMHeapAllocatorSubclass
+ bl mHeapAllocatorSubclass_UnLink
+
+
+ # Model's done
+ # Set a state
+ mr r3, this
+ lis r4, daEnGakeNoko_c__StateID_FoolMove@h
+ ori r4, r4, daEnGakeNoko_c__StateID_FoolMove@l
+
+ lwz r12, 0x60(this)
+ lwz r12, 0xD4(r12)
+ mtctr r12
+
+
+ li r3, 1
+
+ # Clean up stack
+ lwz r0, 0x34(sp)
+ lwz this, 0x2C(sp)
+ lwz r30, 0x28(sp)
+ mtlr r0
+ addi sp, sp, 0x30
+
+ blr
+
+
+.data
+
+fileName:
+ .string "g3d/nokonokoB.brres"
+
+arcName:
+ .string "nokonokoB"
+
+animName:
+ .string "net_walk2"
+
+debugString:
+ .string "X> %08x\n"
diff --git a/src/growup.s b/src/growup.s
index b8d8922..11fa5b4 100755
--- a/src/growup.s
+++ b/src/growup.s
@@ -1,14 +1,14 @@
-#ifndef __MWERKS__
-.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
-.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
-.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
-.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
-.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
-.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
.set r30,30; .set r31,31; .set f0,0; .set f1,1; .set f2,2
.set f3,3; .set f4,4; .set f5,5; .set f6,6; .set f8,8
-.set f31,31; .set f30,30
-#endif
+.set f31,31; .set f30,30
+#endif
.text
@@ -24,7 +24,7 @@ LoadFromSettingsS:
# we can trash r12 for now, it's not supposed to be guaranteed anyway
lwz r12, 4(r3) # get the sprite settings
srwi r12, r12, 20 # get the highest nybble as r10 (maps to Nyb7 in Reggie)
- andi. r12, r12, 0xF
+ andi. r12, r12, 0xF
# first off, get the value from the lookup table
lis r11, LookupTable@h
@@ -38,7 +38,7 @@ LoadFromSettingsSF:
# we can trash r12 for now, it's not supposed to be guaranteed anyway
lwz r12, 4(r3) # get the sprite settings
srwi r12, r12, 28 # get the highest nybble as r12 (maps to Nyb5 in Reggie)
- andi. r12, r12, 0xF
+ andi. r12, r12, 0xF
# first off, get the value from the lookup table
lis r11, LookupTable@h
@@ -52,7 +52,7 @@ LoadFromSettingsC:
# we can trash r12 for now, it's not supposed to be guaranteed anyway
lwz r12, 4(r4) # get the sprite settings
srwi r12, r12, 20 # get the highest nybble as r12 (maps to Nyb7 in Reggie)
- andi. r12, r12, 0xF
+ andi. r12, r12, 0xF
# first off, get the value from the lookup table
lis r11, LookupTable@h
@@ -66,7 +66,7 @@ LoadFromSettingsCF:
# we can trash r12 for now, it's not supposed to be guaranteed anyway
lwz r12, 4(r4) # get the sprite settings
srwi r12, r12, 28 # get the highest nybble as r12 (maps to Nyb5 in Reggie)
- andi. r12, r12, 0xF
+ andi. r12, r12, 0xF
# first off, get the value from the lookup table
lis r11, LookupTable@h
@@ -80,7 +80,7 @@ LoadFromSettingsH:
# we can trash r12 for now, it's not supposed to be guaranteed anyway
lwz r12, 4(r30) # get the sprite settings
srwi r12, r12, 20 # get the highest nybble as r12 (maps to Nyb7 in Reggie)
- andi. r12, r12, 0xF
+ andi. r12, r12, 0xF
# first off, get the value from the lookup table
lis r11, RiderLookupTable@h
@@ -94,7 +94,7 @@ LoadFromSettingsHF:
# we can trash r12 for now, it's not supposed to be guaranteed anyway
lwz r12, 4(r30) # get the sprite settings
srwi r12, r12, 28 # get the highest nybble as r12 (maps to Nyb5 in Reggie)
- andi. r12, r12, 0xF
+ andi. r12, r12, 0xF
# first off, get the value from the lookup table
lis r11, RiderLookupTable@h
@@ -108,7 +108,7 @@ LoadFromSettingsL:
# we can trash r12 for now, it's not supposed to be guaranteed anyway
lwz r12, 8(r30) # get the sprite settings
srwi r12, r12, 20 # get the highest nybble as r12 (maps to Nyb7 in Reggie)
- andi. r12, r12, 0xF
+ andi. r12, r12, 0xF
# first off, get the value from the lookup table
lis r11, LookupTable@h
@@ -122,7 +122,7 @@ LoadFromSettingsLF:
# we can trash r12 for now, it's not supposed to be guaranteed anyway
lwz r12, 8(r30) # get the sprite settings
srwi r12, r12, 28 # get the highest nybble as r12 (maps to Nyb5 in Reggie)
- andi. r12, r12, 0xF
+ andi. r12, r12, 0xF
# first off, get the value from the lookup table
lis r11, LookupTable@h
@@ -531,7 +531,7 @@ ModifyStandOnTopInitA:
lwz r10, 4(r3)
lwz r10, 4(r10) # get the sprite settings
srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
- andi. r10, r10, 0xF
+ andi. r10, r10, 0xF
# first off, get the value from the lookup table
lis r11, LookupTable@h
@@ -562,7 +562,7 @@ ModifyStandOnTopInitB:
lwz r10, 4(r3)
lwz r10, 4(r10) # get the sprite settings
srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
- andi. r10, r10, 0xF
+ andi. r10, r10, 0xF
# first off, get the value from the lookup table
lis r11, LookupTable@h
@@ -618,7 +618,7 @@ ModifyStandOnTopInitD:
lwz r10, 4(r3)
lwz r10, 4(r10) # get the sprite settings
srwi r10, r10, 20 # get the highest nybble as r10 (maps to Nyb5 in Reggie)
- andi. r10, r10, 0xF
+ andi. r10, r10, 0xF
# first off, get the value from the lookup table
lis r11, LookupTable@h
diff --git a/src/heapbar.S b/src/heapbar.S
index 35d45e5..4f86fbe 100644
--- a/src/heapbar.S
+++ b/src/heapbar.S
@@ -1,118 +1,118 @@
-# memory debugger - fun!
-# GX stuff is implemented in C++, this just gets the lowlevel info
-
-#ifndef __MWERKS__
-.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
-.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
-.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
-.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
-.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
-.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
-.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
-#endif
-
-#define HEAP_EGGRootMEM1 1
-#define HEAP_EGGRootMEM2 2
-
-.extern cppGXStart
-.extern cppGXEnd
-.extern cppProcessHeap
-.extern MEMGetTotalFreeSizeForExpHeap
-.extern GameHeap1
-.extern GameHeap2
-
-.set sp,1
-.set rtoc,2
-.set this,31
-
-.text
-
-.align 4
-
-.global doHeapBar
-
-doHeapBar:
- blr
-
- stwu sp, -0x10(sp)
- mflr r0
- stw r0, 0x14(sp)
-
- stw this, 0xC(sp)
-
- #lis r3, EGGTSystem_Pointer@h
- #ori r3, r3, EGGTSystem_Pointer@l
- #lwz this, 0(r3)
-
- bl cppGXStart
-
- #lwz r3, 0x18(this)
- #lis r3, dSys_c__RootHeapMEM1@h
- #ori r3, r3, dSys_c__RootHeapMEM1@l
- lis r3, GameHeap1@h
- ori r3, r3, GameHeap1@l
- lwz r3, 0(r3)
- li r4, HEAP_EGGRootMEM1
- bl asmProcessHeap
-
- #lwz r3, 0x1C(this)
- #lis r3, dSys_c__RootHeapMEM2@h
- #ori r3, r3, dSys_c__RootHeapMEM2@l
- lis r3, GameHeap2@h
- ori r3, r3, GameHeap2@l
- lwz r3, 0(r3)
- li r4, HEAP_EGGRootMEM2
- bl asmProcessHeap
-
- bl cppGXEnd
-
- lwz this, 0xC(sp)
- lwz r0, 0x14(sp)
- mtlr r0
- addi sp, sp, 0x10
- blr
-
-
-
-asmProcessHeap:
-
- stwu sp, -0x10(sp)
- mflr r0
- stw r0, 0x14(sp)
-
- stw r31, 0xC(sp)
- stw r30, 0x8(sp)
-
- mr r31, r3
- mr r30, r4
-
- # get all the required data from the heap
- # cppProcessHeap(u32 freeSize, u32 heapSize, int heapID, char *name)
-
- # get free size first so the function doesn't destroy our volatile regs
- # because I'm too lazy to save them >.>
- lwz r3, 0x10(r31)
- bl MEMGetTotalFreeSizeForExpHeap
-
- # get name
- lwz r6, 0x34(r31)
-
- # get heapID
- mr r5, r30
-
- # get heap size
- # this was a fucking pain to figure out -_-
- lwz r4, 0x10(r31) # get the MEMiHeapHead*
- lwz r7, 0x18(r4) # get heapStart
- lwz r8, 0x1C(r4) # get heapEnd
- sub r4, r8, r7 # heapSize = heapEnd - heapStart probably
-
- # now do it
- bl cppProcessHeap
-
- lwz r30, 0x8(sp)
- lwz r31, 0xC(sp)
- lwz r0, 0x14(sp)
- mtlr r0
- addi sp, sp, 0x10
- blr
+# memory debugger - fun!
+# GX stuff is implemented in C++, this just gets the lowlevel info
+
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+#endif
+
+#define HEAP_EGGRootMEM1 1
+#define HEAP_EGGRootMEM2 2
+
+.extern cppGXStart
+.extern cppGXEnd
+.extern cppProcessHeap
+.extern MEMGetTotalFreeSizeForExpHeap
+.extern GameHeap1
+.extern GameHeap2
+
+.set sp,1
+.set rtoc,2
+.set this,31
+
+.text
+
+.align 4
+
+.global doHeapBar
+
+doHeapBar:
+ blr
+
+ stwu sp, -0x10(sp)
+ mflr r0
+ stw r0, 0x14(sp)
+
+ stw this, 0xC(sp)
+
+ #lis r3, EGGTSystem_Pointer@h
+ #ori r3, r3, EGGTSystem_Pointer@l
+ #lwz this, 0(r3)
+
+ bl cppGXStart
+
+ #lwz r3, 0x18(this)
+ #lis r3, dSys_c__RootHeapMEM1@h
+ #ori r3, r3, dSys_c__RootHeapMEM1@l
+ lis r3, GameHeap1@h
+ ori r3, r3, GameHeap1@l
+ lwz r3, 0(r3)
+ li r4, HEAP_EGGRootMEM1
+ bl asmProcessHeap
+
+ #lwz r3, 0x1C(this)
+ #lis r3, dSys_c__RootHeapMEM2@h
+ #ori r3, r3, dSys_c__RootHeapMEM2@l
+ lis r3, GameHeap2@h
+ ori r3, r3, GameHeap2@l
+ lwz r3, 0(r3)
+ li r4, HEAP_EGGRootMEM2
+ bl asmProcessHeap
+
+ bl cppGXEnd
+
+ lwz this, 0xC(sp)
+ lwz r0, 0x14(sp)
+ mtlr r0
+ addi sp, sp, 0x10
+ blr
+
+
+
+asmProcessHeap:
+
+ stwu sp, -0x10(sp)
+ mflr r0
+ stw r0, 0x14(sp)
+
+ stw r31, 0xC(sp)
+ stw r30, 0x8(sp)
+
+ mr r31, r3
+ mr r30, r4
+
+ # get all the required data from the heap
+ # cppProcessHeap(u32 freeSize, u32 heapSize, int heapID, char *name)
+
+ # get free size first so the function doesn't destroy our volatile regs
+ # because I'm too lazy to save them >.>
+ lwz r3, 0x10(r31)
+ bl MEMGetTotalFreeSizeForExpHeap
+
+ # get name
+ lwz r6, 0x34(r31)
+
+ # get heapID
+ mr r5, r30
+
+ # get heap size
+ # this was a fucking pain to figure out -_-
+ lwz r4, 0x10(r31) # get the MEMiHeapHead*
+ lwz r7, 0x18(r4) # get heapStart
+ lwz r8, 0x1C(r4) # get heapEnd
+ sub r4, r8, r7 # heapSize = heapEnd - heapStart probably
+
+ # now do it
+ bl cppProcessHeap
+
+ lwz r30, 0x8(sp)
+ lwz r31, 0xC(sp)
+ lwz r0, 0x14(sp)
+ mtlr r0
+ addi sp, sp, 0x10
+ blr
diff --git a/src/heapbar.cpp b/src/heapbar.cpp
index 3759b22..386427d 100644
--- a/src/heapbar.cpp
+++ b/src/heapbar.cpp
@@ -1,147 +1,147 @@
-#define GEKKO
-
-#include <common.h>
-#include "rvl/mtx.h"
-#include "rvl/GXEnum.h"
-#include "rvl/GXStruct.h"
-#include "rvl/GXTransform.h"
-#include "rvl/GXGeometry.h"
-#include "rvl/GXDispList.h"
-#include "rvl/GXLighting.h"
-#include "rvl/GXTev.h"
-#include "rvl/GXTexture.h"
-#include "rvl/GXCull.h"
-#include "rvl/GXPixel.h"
-#include "rvl/GXBump.h"
-//#include "rvl/GXVert.h"
-#include "rvl/vifuncs.h"
-
-extern u32 Global5758;
-
-#define GXPosition3f32(x,y,z) \
- *((volatile float*)0xCC008000) = (x); \
- *((volatile float*)0xCC008000) = (y); \
- *((volatile float*)0xCC008000) = (z);
-
-#define GXColor1u32(x) \
- *((volatile u32*)0xCC008000) = (x);
-
-
-extern "C" {
-
-
-void cppGXStart() {
- Mtx44 ortho;
-
- MTXOrtho(ortho, 0, 456, 0, 686, 0.0F, 1.0F);
- GXSetProjection(ortho, GX_ORTHOGRAPHIC);
-
- Mtx identity;
- MTXIdentity(identity);
-
- GXLoadPosMtxImm(identity, GX_PNMTX0);
-
- GXSetNumTevStages(1);
- GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
- GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
- GXSetTevDirect(GX_TEVSTAGE0);
-
- GXSetNumChans(1);
- GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_VTX, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
-
- GXClearVtxDesc();
- GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
- GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
- GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
- GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBX8, 0);
-
- GXSetZMode(GX_TRUE, GX_ALWAYS, GX_TRUE);
-}
-
-void cppGXEnd() {
-}
-
-
-
-float y_positions[] = {
- -1,
- 0.0,
- 16.0
-};
-
-u32 colours[] = {
- -1,
- 0x0000ffff,
- 0xff0000ff
-};
-
-u32 col_5758[] = {
- 0x00ff00ff,
- 0xffff00ff,
- 0x00ffffff,
- 0xf0ff0fff
-};
-
-void cppProcessHeap(u32 freeSize, u32 heapSize, int heapID, char *name) {
- // get the info needed
- float y_pos = y_positions[heapID];
- u32 colour = colours[heapID];
-
- // width: 686
-
- //OSReport("%s => size %d, free %d\n", name, heapSize, freeSize);
-
- float left = 0;
- float right = ((heapSize - freeSize) * 686.0f) / heapSize;
- float top = y_pos;
- float bottom = y_pos+16;
-
- GXBegin(GX_QUADS, GX_VTXFMT0, 4);
-
- GXPosition3f32(left, top, 0.0);
- GXColor1u32(colour);
- GXPosition3f32(right, top, 0.0);
- GXColor1u32(colour);
- GXPosition3f32(right, bottom, 0.0);
- GXColor1u32(colour);
- GXPosition3f32(left, bottom, 0.0);
- GXColor1u32(colour);
-
- GXEnd();
-
-
- GXBegin(GX_QUADS, GX_VTXFMT0, 16);
-
- for (int i = 0; i < 4; i++) {
- GXPosition3f32(16*i, 32, 0.0);
- GXColor1u32(col_5758[i]);
- GXPosition3f32(16*i+16, 32, 0.0);
- GXColor1u32(col_5758[i]);
- GXPosition3f32(16*i+16, 48, 0.0);
- GXColor1u32(col_5758[i]);
- GXPosition3f32(16*i, 48, 0.0);
- GXColor1u32(col_5758[i]);
- }
-
- GXEnd();
-
- for (int i = 0; i < 4; i++) {
- if (Global5758 & (1 << i)) {
- GXBegin(GX_QUADS, GX_VTXFMT0, 4);
-
- GXPosition3f32(16*i, 48, 0.0);
- GXColor1u32(0xffffffff);
- GXPosition3f32(16*i+16, 48, 0.0);
- GXColor1u32(0xffffffff);
- GXPosition3f32(16*i+16, 56, 0.0);
- GXColor1u32(0xffffffff);
- GXPosition3f32(16*i, 56, 0.0);
- GXColor1u32(0xffffffff);
-
- GXEnd();
- }
- }
-}
-
-
-};
+#define GEKKO
+
+#include <common.h>
+#include "rvl/mtx.h"
+#include "rvl/GXEnum.h"
+#include "rvl/GXStruct.h"
+#include "rvl/GXTransform.h"
+#include "rvl/GXGeometry.h"
+#include "rvl/GXDispList.h"
+#include "rvl/GXLighting.h"
+#include "rvl/GXTev.h"
+#include "rvl/GXTexture.h"
+#include "rvl/GXCull.h"
+#include "rvl/GXPixel.h"
+#include "rvl/GXBump.h"
+//#include "rvl/GXVert.h"
+#include "rvl/vifuncs.h"
+
+extern u32 Global5758;
+
+#define GXPosition3f32(x,y,z) \
+ *((volatile float*)0xCC008000) = (x); \
+ *((volatile float*)0xCC008000) = (y); \
+ *((volatile float*)0xCC008000) = (z);
+
+#define GXColor1u32(x) \
+ *((volatile u32*)0xCC008000) = (x);
+
+
+extern "C" {
+
+
+void cppGXStart() {
+ Mtx44 ortho;
+
+ MTXOrtho(ortho, 0, 456, 0, 686, 0.0F, 1.0F);
+ GXSetProjection(ortho, GX_ORTHOGRAPHIC);
+
+ Mtx identity;
+ MTXIdentity(identity);
+
+ GXLoadPosMtxImm(identity, GX_PNMTX0);
+
+ GXSetNumTevStages(1);
+ GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
+ GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
+ GXSetTevDirect(GX_TEVSTAGE0);
+
+ GXSetNumChans(1);
+ GXSetChanCtrl(GX_COLOR0A0, GX_DISABLE, GX_SRC_VTX, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE);
+
+ GXClearVtxDesc();
+ GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
+ GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
+ GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
+ GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBX8, 0);
+
+ GXSetZMode(GX_TRUE, GX_ALWAYS, GX_TRUE);
+}
+
+void cppGXEnd() {
+}
+
+
+
+float y_positions[] = {
+ -1,
+ 0.0,
+ 16.0
+};
+
+u32 colours[] = {
+ -1,
+ 0x0000ffff,
+ 0xff0000ff
+};
+
+u32 col_5758[] = {
+ 0x00ff00ff,
+ 0xffff00ff,
+ 0x00ffffff,
+ 0xf0ff0fff
+};
+
+void cppProcessHeap(u32 freeSize, u32 heapSize, int heapID, char *name) {
+ // get the info needed
+ float y_pos = y_positions[heapID];
+ u32 colour = colours[heapID];
+
+ // width: 686
+
+ //OSReport("%s => size %d, free %d\n", name, heapSize, freeSize);
+
+ float left = 0;
+ float right = ((heapSize - freeSize) * 686.0f) / heapSize;
+ float top = y_pos;
+ float bottom = y_pos+16;
+
+ GXBegin(GX_QUADS, GX_VTXFMT0, 4);
+
+ GXPosition3f32(left, top, 0.0);
+ GXColor1u32(colour);
+ GXPosition3f32(right, top, 0.0);
+ GXColor1u32(colour);
+ GXPosition3f32(right, bottom, 0.0);
+ GXColor1u32(colour);
+ GXPosition3f32(left, bottom, 0.0);
+ GXColor1u32(colour);
+
+ GXEnd();
+
+
+ GXBegin(GX_QUADS, GX_VTXFMT0, 16);
+
+ for (int i = 0; i < 4; i++) {
+ GXPosition3f32(16*i, 32, 0.0);
+ GXColor1u32(col_5758[i]);
+ GXPosition3f32(16*i+16, 32, 0.0);
+ GXColor1u32(col_5758[i]);
+ GXPosition3f32(16*i+16, 48, 0.0);
+ GXColor1u32(col_5758[i]);
+ GXPosition3f32(16*i, 48, 0.0);
+ GXColor1u32(col_5758[i]);
+ }
+
+ GXEnd();
+
+ for (int i = 0; i < 4; i++) {
+ if (Global5758 & (1 << i)) {
+ GXBegin(GX_QUADS, GX_VTXFMT0, 4);
+
+ GXPosition3f32(16*i, 48, 0.0);
+ GXColor1u32(0xffffffff);
+ GXPosition3f32(16*i+16, 48, 0.0);
+ GXColor1u32(0xffffffff);
+ GXPosition3f32(16*i+16, 56, 0.0);
+ GXColor1u32(0xffffffff);
+ GXPosition3f32(16*i, 56, 0.0);
+ GXColor1u32(0xffffffff);
+
+ GXEnd();
+ }
+ }
+}
+
+
+};
diff --git a/src/layoutlib.S b/src/layoutlib.S
index 2fae70a..96c69cb 100644
--- a/src/layoutlib.S
+++ b/src/layoutlib.S
@@ -1,131 +1,131 @@
-.extern LayoutHelper_Link
-
-#ifndef __MWERKS__
-.extern _Z8LoadFileP10FileHandlePc
-.extern _Z8FreeFileP10FileHandle
-#define LoadFileFunc _Z8LoadFileP10FileHandlePc
-#define FreeFileFunc _Z8FreeFileP10FileHandle
-.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
-.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
-.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
-.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
-.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
-.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
-.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
-#else
-.extern LoadFile__FP10FileHandlePCc
-.extern FreeFile__FP10FileHandle
-#define LoadFileFunc LoadFile__FP10FileHandlePCc
-#define FreeFileFunc FreeFile__FP10FileHandle
-#endif
-
-.text
-
-.set sp,1
-.set rtoc,2
-.set this,31
-
-
-
-
-.global EmbeddedLayout_LoadArc
-EmbeddedLayout_LoadArc:
- # stack setup
- stwu sp, -0x20(sp)
- mflr r0
- stw r0, 0x24(sp)
- stw r31, 0x1C(sp)
- stw r30, 0x18(sp)
-
- # r31 is a pointer to the LayoutHelper (must be converted)
- # r30 stores the filename
- addi r31, r3, 0xAC
- mr r30, r4
-
- # check to see if an arc has already been loaded
- lwz r0, 0xBC(r3)
- cmpwi r0, 0
- bne return_0
-
- # ok, no
- # create a FileHandle where a NSMBWFile would be
- # don't know if this will work but it's worth a try
- addi r3, r31, 0xC0
- mr r4, r30
- bl LoadFileFunc
-
- # check retval
- cmpwi r3, 0
- stw r3, 0xBC(r31)
- beq return_0
-
- # link it
- mr r4, r3
- mr r3, r31
- lis r5, arcString@h
- ori r5, r5, arcString@l
- bl LayoutHelper_Link
-
- # now add a pointer to the LayoutHelper into the Layout at offset 0x84
- # turn r3 into an EmbeddedLayout pointer
- subi r3, r31, 0xAC
- stw r31, 0x84(r3)
-
- b return_1
-
-return_0:
- li r3, 0
- b return
-
-return_1:
- li r3, 1
-
-return:
- lwz r30, 0x18(sp)
- lwz r31, 0x1C(sp)
- lwz r0, 0x24(sp)
- mtlr r0
- addi sp, sp, 0x20
- blr
-
-.align 4
-
-.global EmbeddedLayout_FreeArc
-EmbeddedLayout_FreeArc:
- # stack setup
- stwu sp, -0x10(sp)
- mflr r0
- stw r0, 0x14(sp)
- stw r31, 0xC(sp)
-
- # r31 is a pointer to the LayoutHelper (must be converted)
- addi r31, r3, 0xAC
-
- # - if an arc has been loaded, then free the NSMBWFile
- lwz r0, 0xBC(r3)
- cmpwi r0, 0
- beq xreturn_1
-
- # no, so free it
- addi r3, r31, 0xC0
- bl FreeFileFunc
-
- li r3, 0
- stw r3, 0xBC(r31)
-
-xreturn_1:
- li r3, 1
- lwz r31, 0xC(sp)
- lwz r0, 0x14(sp)
- mtlr r0
- addi sp, sp, 0x10
- blr
-
-
-
-.data
-arcString:
- .string "arc"
-
-.align 4
-
+.extern LayoutHelper_Link
+
+#ifndef __MWERKS__
+.extern _Z8LoadFileP10FileHandlePc
+.extern _Z8FreeFileP10FileHandle
+#define LoadFileFunc _Z8LoadFileP10FileHandlePc
+#define FreeFileFunc _Z8FreeFileP10FileHandle
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+#else
+.extern LoadFile__FP10FileHandlePCc
+.extern FreeFile__FP10FileHandle
+#define LoadFileFunc LoadFile__FP10FileHandlePCc
+#define FreeFileFunc FreeFile__FP10FileHandle
+#endif
+
+.text
+
+.set sp,1
+.set rtoc,2
+.set this,31
+
+
+
+
+.global EmbeddedLayout_LoadArc
+EmbeddedLayout_LoadArc:
+ # stack setup
+ stwu sp, -0x20(sp)
+ mflr r0
+ stw r0, 0x24(sp)
+ stw r31, 0x1C(sp)
+ stw r30, 0x18(sp)
+
+ # r31 is a pointer to the LayoutHelper (must be converted)
+ # r30 stores the filename
+ addi r31, r3, 0xAC
+ mr r30, r4
+
+ # check to see if an arc has already been loaded
+ lwz r0, 0xBC(r3)
+ cmpwi r0, 0
+ bne return_0
+
+ # ok, no
+ # create a FileHandle where a NSMBWFile would be
+ # don't know if this will work but it's worth a try
+ addi r3, r31, 0xC0
+ mr r4, r30
+ bl LoadFileFunc
+
+ # check retval
+ cmpwi r3, 0
+ stw r3, 0xBC(r31)
+ beq return_0
+
+ # link it
+ mr r4, r3
+ mr r3, r31
+ lis r5, arcString@h
+ ori r5, r5, arcString@l
+ bl LayoutHelper_Link
+
+ # now add a pointer to the LayoutHelper into the Layout at offset 0x84
+ # turn r3 into an EmbeddedLayout pointer
+ subi r3, r31, 0xAC
+ stw r31, 0x84(r3)
+
+ b return_1
+
+return_0:
+ li r3, 0
+ b return
+
+return_1:
+ li r3, 1
+
+return:
+ lwz r30, 0x18(sp)
+ lwz r31, 0x1C(sp)
+ lwz r0, 0x24(sp)
+ mtlr r0
+ addi sp, sp, 0x20
+ blr
+
+.align 4
+
+.global EmbeddedLayout_FreeArc
+EmbeddedLayout_FreeArc:
+ # stack setup
+ stwu sp, -0x10(sp)
+ mflr r0
+ stw r0, 0x14(sp)
+ stw r31, 0xC(sp)
+
+ # r31 is a pointer to the LayoutHelper (must be converted)
+ addi r31, r3, 0xAC
+
+ # - if an arc has been loaded, then free the NSMBWFile
+ lwz r0, 0xBC(r3)
+ cmpwi r0, 0
+ beq xreturn_1
+
+ # no, so free it
+ addi r3, r31, 0xC0
+ bl FreeFileFunc
+
+ li r3, 0
+ stw r3, 0xBC(r31)
+
+xreturn_1:
+ li r3, 1
+ lwz r31, 0xC(sp)
+ lwz r0, 0x14(sp)
+ mtlr r0
+ addi sp, sp, 0x10
+ blr
+
+
+
+.data
+arcString:
+ .string "arc"
+
+.align 4
+
diff --git a/src/layoutlib.h b/src/layoutlib.h
index 6b7d275..55a3027 100644
--- a/src/layoutlib.h
+++ b/src/layoutlib.h
@@ -1,149 +1,149 @@
-#ifndef __NEWER_LAYOUTLIB_H
-#define __NEWER_LAYOUTLIB_H
-
-/* Treeki's LayoutLib for New Super Mario Bros Wii */
-#include <common.h>
-
-typedef float MTX[3][4];
-
-struct nw4r__lyt__Layout {
- void *vtable;
- void *field_04;
- void *field_08;
- void *field_0C;
- void *rootPane;
- void *field_14;
- void *field_18;
- void *field_1C;
-};
-
-struct nw4r__lyt__DrawInfo {
- // 0x00
- void *vtable;
- MTX matrix;
-
- // 0x34
- float left;
- float top;
- float right;
-
- // 0x40
- float bottom;
- float scale_x;
- float scale_y;
- float opacity;
-
- // 0x50
- unsigned char widescreenFlag;
-};
-
-struct FrameCtrl_c {
-
-};
-
-struct Anm_c {
- FrameCtrl_c *fc_ptr;
- void *brlanHandler;
- void *field_08;
- char field_0C;
- char pad[3];
- FrameCtrl_c fc;
-};
-
-struct Layout {
- void *field_00;
- void *field_04;
- void *vtable;
- unsigned char drawOrder; // 0x0C
- char pad1[3];
-
- // offset 0x10
- nw4r__lyt__Layout layout; // Actually m2d::Layout_c, but the struct is the same
-
- // offset 0x30
- nw4r__lyt__DrawInfo drawInfo;
-
- // offset 0x84
- //LayoutHelper *field_84;
- void *field_84;
- float posX; // 0x88
- float posY; // 0x8C
- float clipX; // 0x90
- float clipY; // 0x94
- float clipWidth; // 0x98
- float clipHeight; // 0x9C
- unsigned char clipEnabled; // 0xA0
- char pad2[3];
- unsigned int animEnabled; // 0xA4
- void *field_A8;
-
- // offset 0xAC
- //LayoutHelper lh; // actually a m2d::ResAccLoader_c
- char lh[0xD4]; // don't feel like figuring this one out -_-
-
- // offset 0x180
- //BrlanHandler *brlanHandlers; // 0x180, points to brlan handlers
- void *brlanHandlers;
- //GrpHandler *grpHandlers; // 0x184
- void *grpHandlers;
- char *field_188; // char array, probably "anim enabled"
- int brlanCount; // 0x18C
- int grpCount; // 0x190
- int field_194; // no idea
-};
-
-
-void EmbeddedLayout_ctor(Layout *self); // 0x800C89A0
-void EmbeddedLayout_dtor(Layout *self, bool del); // 0x800C89F0
-void EmbeddedLayout_Free(Layout *self); // 0x800C9A20
-bool EmbeddedLayout_LoadArcOld(Layout *self, const char *path, bool isLangSpecific); // 0x800C8D00
-
-extern "C" {
-bool EmbeddedLayout_LoadArc(Layout *self, const char *path); // custom
-bool EmbeddedLayout_FreeArc(Layout *self); // custom
-};
-
-void EmbeddedLayout_LoadBrlans(Layout *self, const char **names, int count); // 0x800C90A0
-void EmbeddedLayout_LoadGroups(Layout *self, const char **names, int *brlanLinkIDs, int count); // 0x800C91E0
-
-void EmbeddedLayout_AddToDrawList(Layout *self); // 0x80163990
-
-void *EmbeddedLayout_FindPaneByName(Layout *self, const char *name);
-void *EmbeddedLayout_FindTextBoxByName(Layout *self, const char *name);
-void *EmbeddedLayout_FindPictureByName(Layout *self, const char *name);
-void *EmbeddedLayout_FindWindowByName(Layout *self, const char *name);
-
-void EmbeddedLayout_EnableNonLoopAnim(Layout *self, int animNum, bool pointlessShit); // 0x800C93E0
-void EmbeddedLayout_EnableLoopAnim(Layout *self, int animNum); // 0x800C9470
-void EmbeddedLayout_ResetAnimToInitialState(Layout *self, int animNum, bool isLoop_maybe); // 0x800C94C0
-void EmbeddedLayout_DisableAnim(Layout *self, int animNum); // 0x800C9580
-void EmbeddedLayout_DisableAllAnims(Layout *self); // 0x800C95F0
-void EmbeddedLayout_Process(Layout *self); // 0x800C9650
-bool EmbeddedLayout_CheckIfAnimationIsOn(Layout *self, int animNum); // 0x800C9700
-bool EmbeddedLayout_CheckIfAnyAnimationsAreOn(Layout *self); // 0x800C9730
-
-
-typedef bool (*__EmbeddedLayout_Build_type)(Layout*, const char*, void*);
-inline bool EmbeddedLayout_Build(Layout *self, const char *brlytName, void *lh) {
- VF_BEGIN(__EmbeddedLayout_Build_type, self, 5, 8)
- return VF_CALL(self, brlytName, lh);
- VF_END;
-}
-
-typedef void (*__EmbeddedLayout_UpdateMatrix_type)(Layout*);
-inline void EmbeddedLayout_UpdateMatrix(Layout *self) {
- VF_BEGIN(__EmbeddedLayout_UpdateMatrix_type, self, 4, 8)
- VF_CALL(self);
- VF_END;
-}
-
-typedef void (*__TextBox_SetString_type)(void*, unsigned short const *, unsigned short);
-inline void TextBox_SetString(void *self, unsigned short const *str, unsigned short unk) {
- VF_BEGIN(__TextBox_SetString_type, self, 31, 0)
- VF_CALL(self, str, unk);
- VF_END;
-}
-
-#define PANE_FLAGS(pane) (*((u8*)(((u32)(pane))+0xBB)))
-
-#endif
+#ifndef __NEWER_LAYOUTLIB_H
+#define __NEWER_LAYOUTLIB_H
+
+/* Treeki's LayoutLib for New Super Mario Bros Wii */
+#include <common.h>
+
+typedef float MTX[3][4];
+
+struct nw4r__lyt__Layout {
+ void *vtable;
+ void *field_04;
+ void *field_08;
+ void *field_0C;
+ void *rootPane;
+ void *field_14;
+ void *field_18;
+ void *field_1C;
+};
+
+struct nw4r__lyt__DrawInfo {
+ // 0x00
+ void *vtable;
+ MTX matrix;
+
+ // 0x34
+ float left;
+ float top;
+ float right;
+
+ // 0x40
+ float bottom;
+ float scale_x;
+ float scale_y;
+ float opacity;
+
+ // 0x50
+ unsigned char widescreenFlag;
+};
+
+struct FrameCtrl_c {
+
+};
+
+struct Anm_c {
+ FrameCtrl_c *fc_ptr;
+ void *brlanHandler;
+ void *field_08;
+ char field_0C;
+ char pad[3];
+ FrameCtrl_c fc;
+};
+
+struct Layout {
+ void *field_00;
+ void *field_04;
+ void *vtable;
+ unsigned char drawOrder; // 0x0C
+ char pad1[3];
+
+ // offset 0x10
+ nw4r__lyt__Layout layout; // Actually m2d::Layout_c, but the struct is the same
+
+ // offset 0x30
+ nw4r__lyt__DrawInfo drawInfo;
+
+ // offset 0x84
+ //LayoutHelper *field_84;
+ void *field_84;
+ float posX; // 0x88
+ float posY; // 0x8C
+ float clipX; // 0x90
+ float clipY; // 0x94
+ float clipWidth; // 0x98
+ float clipHeight; // 0x9C
+ unsigned char clipEnabled; // 0xA0
+ char pad2[3];
+ unsigned int animEnabled; // 0xA4
+ void *field_A8;
+
+ // offset 0xAC
+ //LayoutHelper lh; // actually a m2d::ResAccLoader_c
+ char lh[0xD4]; // don't feel like figuring this one out -_-
+
+ // offset 0x180
+ //BrlanHandler *brlanHandlers; // 0x180, points to brlan handlers
+ void *brlanHandlers;
+ //GrpHandler *grpHandlers; // 0x184
+ void *grpHandlers;
+ char *field_188; // char array, probably "anim enabled"
+ int brlanCount; // 0x18C
+ int grpCount; // 0x190
+ int field_194; // no idea
+};
+
+
+void EmbeddedLayout_ctor(Layout *self); // 0x800C89A0
+void EmbeddedLayout_dtor(Layout *self, bool del); // 0x800C89F0
+void EmbeddedLayout_Free(Layout *self); // 0x800C9A20
+bool EmbeddedLayout_LoadArcOld(Layout *self, const char *path, bool isLangSpecific); // 0x800C8D00
+
+extern "C" {
+bool EmbeddedLayout_LoadArc(Layout *self, const char *path); // custom
+bool EmbeddedLayout_FreeArc(Layout *self); // custom
+};
+
+void EmbeddedLayout_LoadBrlans(Layout *self, const char **names, int count); // 0x800C90A0
+void EmbeddedLayout_LoadGroups(Layout *self, const char **names, int *brlanLinkIDs, int count); // 0x800C91E0
+
+void EmbeddedLayout_AddToDrawList(Layout *self); // 0x80163990
+
+void *EmbeddedLayout_FindPaneByName(Layout *self, const char *name);
+void *EmbeddedLayout_FindTextBoxByName(Layout *self, const char *name);
+void *EmbeddedLayout_FindPictureByName(Layout *self, const char *name);
+void *EmbeddedLayout_FindWindowByName(Layout *self, const char *name);
+
+void EmbeddedLayout_EnableNonLoopAnim(Layout *self, int animNum, bool pointlessShit); // 0x800C93E0
+void EmbeddedLayout_EnableLoopAnim(Layout *self, int animNum); // 0x800C9470
+void EmbeddedLayout_ResetAnimToInitialState(Layout *self, int animNum, bool isLoop_maybe); // 0x800C94C0
+void EmbeddedLayout_DisableAnim(Layout *self, int animNum); // 0x800C9580
+void EmbeddedLayout_DisableAllAnims(Layout *self); // 0x800C95F0
+void EmbeddedLayout_Process(Layout *self); // 0x800C9650
+bool EmbeddedLayout_CheckIfAnimationIsOn(Layout *self, int animNum); // 0x800C9700
+bool EmbeddedLayout_CheckIfAnyAnimationsAreOn(Layout *self); // 0x800C9730
+
+
+typedef bool (*__EmbeddedLayout_Build_type)(Layout*, const char*, void*);
+inline bool EmbeddedLayout_Build(Layout *self, const char *brlytName, void *lh) {
+ VF_BEGIN(__EmbeddedLayout_Build_type, self, 5, 8)
+ return VF_CALL(self, brlytName, lh);
+ VF_END;
+}
+
+typedef void (*__EmbeddedLayout_UpdateMatrix_type)(Layout*);
+inline void EmbeddedLayout_UpdateMatrix(Layout *self) {
+ VF_BEGIN(__EmbeddedLayout_UpdateMatrix_type, self, 4, 8)
+ VF_CALL(self);
+ VF_END;
+}
+
+typedef void (*__TextBox_SetString_type)(void*, unsigned short const *, unsigned short);
+inline void TextBox_SetString(void *self, unsigned short const *str, unsigned short unk) {
+ VF_BEGIN(__TextBox_SetString_type, self, 31, 0)
+ VF_CALL(self, str, unk);
+ VF_END;
+}
+
+#define PANE_FLAGS(pane) (*((u8*)(((u32)(pane))+0xBB)))
+
+#endif
diff --git a/src/levelinfo.cpp b/src/levelinfo.cpp
index 9807fc4..ec65350 100644
--- a/src/levelinfo.cpp
+++ b/src/levelinfo.cpp
@@ -1,36 +1,36 @@
-#include "levelinfo.h"
-
-void LevelInfo_Prepare(FileHandle *fh) {
- void *file = fh->filePtr;
-
- // decrypt all the level names
- for (int sect = 0; sect < LevelInfo_GetSectionCount(file); sect++) {
- // parse this section
- LevelInfo_Section *thisSect = LevelInfo_GetSection(file, sect);
- LevelInfo_Entry *levels = LevelInfo_GetLevels(file, thisSect);
-
- for (int lev = 0; lev < thisSect->levelCount; lev++) {
- LevelInfo_Entry *level = &levels[lev];
-
- char *name = LevelInfo_GetName(file, level);
-
- for (int i = 0; i < level->nameLength+1; i++) {
- name[i] -= 0xD0;
- }
- }
- }
-}
-
-LevelInfo_Entry *LevelInfo_Search(void *file, int world, int level) {
- for (int i = 0; i < LevelInfo_GetSectionCount(file); i++) {
- LevelInfo_Section *sect = LevelInfo_GetSection(file, i);
-
- for (int j = 0; j < sect->levelCount; j++) {
- LevelInfo_Entry *entry = &LevelInfo_GetLevels(file, sect)[j];
- if (entry->world == world && entry->level == level)
- return entry;
- }
- }
-
- return 0;
-}
+#include "levelinfo.h"
+
+void LevelInfo_Prepare(FileHandle *fh) {
+ void *file = fh->filePtr;
+
+ // decrypt all the level names
+ for (int sect = 0; sect < LevelInfo_GetSectionCount(file); sect++) {
+ // parse this section
+ LevelInfo_Section *thisSect = LevelInfo_GetSection(file, sect);
+ LevelInfo_Entry *levels = LevelInfo_GetLevels(file, thisSect);
+
+ for (int lev = 0; lev < thisSect->levelCount; lev++) {
+ LevelInfo_Entry *level = &levels[lev];
+
+ char *name = LevelInfo_GetName(file, level);
+
+ for (int i = 0; i < level->nameLength+1; i++) {
+ name[i] -= 0xD0;
+ }
+ }
+ }
+}
+
+LevelInfo_Entry *LevelInfo_Search(void *file, int world, int level) {
+ for (int i = 0; i < LevelInfo_GetSectionCount(file); i++) {
+ LevelInfo_Section *sect = LevelInfo_GetSection(file, i);
+
+ for (int j = 0; j < sect->levelCount; j++) {
+ LevelInfo_Entry *entry = &LevelInfo_GetLevels(file, sect)[j];
+ if (entry->world == world && entry->level == level)
+ return entry;
+ }
+ }
+
+ return 0;
+}
diff --git a/src/levelinfo.h b/src/levelinfo.h
index 1b75275..8e1e916 100644
--- a/src/levelinfo.h
+++ b/src/levelinfo.h
@@ -1,56 +1,56 @@
-#ifndef __NEWER_LEVELINFO_H
-#define __NEWER_LEVELINFO_H
-
-#include <common.h>
-#include "fileload.h"
-
-struct LevelInfo_Header {
- u32 magic;
- u32 sectionCount;
-};
-
-struct LevelInfo_Section {
- u32 levelCount;
-};
-
-struct LevelInfo_Entry {
- u8 world;
- u8 level;
- u8 reserved1;
- u8 reserved2;
- u8 nameLength;
- u8 reserved3;
- u16 flags;
- u32 nameOffset;
-};
-
-inline u32 LevelInfo_GetSectionCount(void *file) {
- return ((LevelInfo_Header*)file)->sectionCount;
-}
-
-inline u32 *LevelInfo_GetOffsets(void *file) {
- return (u32*)(((LevelInfo_Header*)file)+1);
-}
-
-inline LevelInfo_Section *LevelInfo_GetSection(void *file, int id) {
- u32 offs = LevelInfo_GetOffsets(file)[id];
- return (LevelInfo_Section*)(((char*)file)+offs);
-};
-
-inline LevelInfo_Entry *LevelInfo_GetLevels(void *file, LevelInfo_Section *section) {
- return (LevelInfo_Entry*)(section+1);
-}
-
-inline LevelInfo_Entry *LevelInfo_GetLevels(void *file, int sectionID) {
- return (LevelInfo_Entry*)(LevelInfo_GetSection(file, sectionID)+1);
-}
-
-inline char *LevelInfo_GetName(void *file, LevelInfo_Entry *entry) {
- return ((char*)file)+entry->nameOffset;
-}
-
-void LevelInfo_Prepare(FileHandle *fh);
-LevelInfo_Entry *LevelInfo_Search(void *file, int world, int level);
-
-
-#endif
+#ifndef __NEWER_LEVELINFO_H
+#define __NEWER_LEVELINFO_H
+
+#include <common.h>
+#include "fileload.h"
+
+struct LevelInfo_Header {
+ u32 magic;
+ u32 sectionCount;
+};
+
+struct LevelInfo_Section {
+ u32 levelCount;
+};
+
+struct LevelInfo_Entry {
+ u8 world;
+ u8 level;
+ u8 reserved1;
+ u8 reserved2;
+ u8 nameLength;
+ u8 reserved3;
+ u16 flags;
+ u32 nameOffset;
+};
+
+inline u32 LevelInfo_GetSectionCount(void *file) {
+ return ((LevelInfo_Header*)file)->sectionCount;
+}
+
+inline u32 *LevelInfo_GetOffsets(void *file) {
+ return (u32*)(((LevelInfo_Header*)file)+1);
+}
+
+inline LevelInfo_Section *LevelInfo_GetSection(void *file, int id) {
+ u32 offs = LevelInfo_GetOffsets(file)[id];
+ return (LevelInfo_Section*)(((char*)file)+offs);
+};
+
+inline LevelInfo_Entry *LevelInfo_GetLevels(void *file, LevelInfo_Section *section) {
+ return (LevelInfo_Entry*)(section+1);
+}
+
+inline LevelInfo_Entry *LevelInfo_GetLevels(void *file, int sectionID) {
+ return (LevelInfo_Entry*)(LevelInfo_GetSection(file, sectionID)+1);
+}
+
+inline char *LevelInfo_GetName(void *file, LevelInfo_Entry *entry) {
+ return ((char*)file)+entry->nameOffset;
+}
+
+void LevelInfo_Prepare(FileHandle *fh);
+LevelInfo_Entry *LevelInfo_Search(void *file, int world, int level);
+
+
+#endif
diff --git a/src/levelnames.cpp b/src/levelnames.cpp
index b6f440e..95d7e5d 100644
--- a/src/levelnames.cpp
+++ b/src/levelnames.cpp
@@ -1,83 +1,83 @@
-#include <common.h>
-#include <actors.h>
-#include <stage.h>
-#include "levelinfo.h"
-#include "fileload.h"
-#include "layoutlib.h"
-
-//#define DEBUG_NAMES
-
-#ifndef DEBUG_NAMES
-#define OSReport(...)
-#endif
-
-extern char CurrentLevel;
-extern char CurrentWorld;
-
-int DoNames(int state) {
- OSReport("DoNames called - State param is %d\n", state);
- int wnum = (int)CurrentWorld;
- int lnum = (int)CurrentLevel;
- OSReport("Current Level: %d-%d\n", wnum+1, lnum+1);
-
- // Skip the title screen
- // and only process the code if the State is set to 1
- // (the screen has been initialised)
- if (state == 1 && lnum != STAGE_TITLE) {
- OSReport("Processing\n");
- // grab the CRSIN object
- Actor *ptr = FindActorByType(CRSIN, 0);
- //OSReport("CRSIN actor found at : %08X\n", ptr);
-
- // FIX !!!!!
-
- if (ptr != 0) {
- void *worldObj = EmbeddedLayout_FindTextBoxByName((Layout*)((u32)ptr+0xB0), "TXT_WorldName");
- void *levelObj = EmbeddedLayout_FindTextBoxByName((Layout*)((u32)ptr+0xB0), "TXT_LevelName");
- //OSReport("WorldObj TextBox : %08X; LevelObj TextBox : %08X\n", worldObj, levelObj);
- if (worldObj == 0 || levelObj == 0) return state;
-
- /*char *file = RetrieveFileFromArc(ARC_TABLE, "Mario", "newer/names.bin");
- //OSReport("RetrieveFileFromArc returned : %08X\n", file);
- char *worldname = file + (wnum * 0x40);
- char *levelname = file + 0x280 + (wnum * 0xA80) + (lnum * 0x40);*/
- OSReport("Loading file...\n");
- FileHandle fh;
- void *info = LoadFile(&fh, "/NewerRes/LevelInfo.bin");
-
- LevelInfo_Prepare(&fh);
- LevelInfo_Entry *entry = LevelInfo_Search(info, wnum, lnum);
- char *worldname = LevelInfo_GetName(info, entry);
- char *levelname = "";
- OSReport("Got name : %s\n", worldname);
-
- void *vtable = *((void**)levelObj);
- void *funcaddr = *((void**)((u32)vtable+0x7C));
- int (*SetString)(void*, unsigned short*, unsigned short);
- SetString = (int(*)(void*, unsigned short*, unsigned short))funcaddr;
-
- unsigned short wbuffer[0x40], lbuffer[0x40];
- for (int i = 0; i < 0x40; i++) {
- wbuffer[i] = (unsigned short)worldname[i];
- lbuffer[i] = (unsigned short)levelname[i];
- }
-
- SetString(worldObj, wbuffer, 0);
- SetString(levelObj, lbuffer, 0);
-
- OSReport("Freeing file\n");
- FreeFile(&fh);
- OSReport("Inserted strings\n");
- }
- } else {
- OSReport("Skipped\n");
- }
-
- OSReport("Reached the end of DoNames\n");
- return state;
-}
-
-int DoNamesTest2(int state, u32 ptr) {
- OSReport("TEST 1:%08X 2:%08X\n", state, ptr);
- return DoNames(state);
-}
+#include <common.h>
+#include <actors.h>
+#include <stage.h>
+#include "levelinfo.h"
+#include "fileload.h"
+#include "layoutlib.h"
+
+//#define DEBUG_NAMES
+
+#ifndef DEBUG_NAMES
+#define OSReport(...)
+#endif
+
+extern char CurrentLevel;
+extern char CurrentWorld;
+
+int DoNames(int state) {
+ OSReport("DoNames called - State param is %d\n", state);
+ int wnum = (int)CurrentWorld;
+ int lnum = (int)CurrentLevel;
+ OSReport("Current Level: %d-%d\n", wnum+1, lnum+1);
+
+ // Skip the title screen
+ // and only process the code if the State is set to 1
+ // (the screen has been initialised)
+ if (state == 1 && lnum != STAGE_TITLE) {
+ OSReport("Processing\n");
+ // grab the CRSIN object
+ Actor *ptr = FindActorByType(CRSIN, 0);
+ //OSReport("CRSIN actor found at : %08X\n", ptr);
+
+ // FIX !!!!!
+
+ if (ptr != 0) {
+ void *worldObj = EmbeddedLayout_FindTextBoxByName((Layout*)((u32)ptr+0xB0), "TXT_WorldName");
+ void *levelObj = EmbeddedLayout_FindTextBoxByName((Layout*)((u32)ptr+0xB0), "TXT_LevelName");
+ //OSReport("WorldObj TextBox : %08X; LevelObj TextBox : %08X\n", worldObj, levelObj);
+ if (worldObj == 0 || levelObj == 0) return state;
+
+ /*char *file = RetrieveFileFromArc(ARC_TABLE, "Mario", "newer/names.bin");
+ //OSReport("RetrieveFileFromArc returned : %08X\n", file);
+ char *worldname = file + (wnum * 0x40);
+ char *levelname = file + 0x280 + (wnum * 0xA80) + (lnum * 0x40);*/
+ OSReport("Loading file...\n");
+ FileHandle fh;
+ void *info = LoadFile(&fh, "/NewerRes/LevelInfo.bin");
+
+ LevelInfo_Prepare(&fh);
+ LevelInfo_Entry *entry = LevelInfo_Search(info, wnum, lnum);
+ char *worldname = LevelInfo_GetName(info, entry);
+ char *levelname = "";
+ OSReport("Got name : %s\n", worldname);
+
+ void *vtable = *((void**)levelObj);
+ void *funcaddr = *((void**)((u32)vtable+0x7C));
+ int (*SetString)(void*, unsigned short*, unsigned short);
+ SetString = (int(*)(void*, unsigned short*, unsigned short))funcaddr;
+
+ unsigned short wbuffer[0x40], lbuffer[0x40];
+ for (int i = 0; i < 0x40; i++) {
+ wbuffer[i] = (unsigned short)worldname[i];
+ lbuffer[i] = (unsigned short)levelname[i];
+ }
+
+ SetString(worldObj, wbuffer, 0);
+ SetString(levelObj, lbuffer, 0);
+
+ OSReport("Freeing file\n");
+ FreeFile(&fh);
+ OSReport("Inserted strings\n");
+ }
+ } else {
+ OSReport("Skipped\n");
+ }
+
+ OSReport("Reached the end of DoNames\n");
+ return state;
+}
+
+int DoNamesTest2(int state, u32 ptr) {
+ OSReport("TEST 1:%08X 2:%08X\n", state, ptr);
+ return DoNames(state);
+}
diff --git a/src/levelspecial.cpp b/src/levelspecial.cpp
index 7ad69ff..e075773 100644
--- a/src/levelspecial.cpp
+++ b/src/levelspecial.cpp
@@ -1,30 +1,30 @@
-#include <common.h>
-#include <game.h>
-
-struct LevelSpecial {
- u32 id; // 0x00
- u32 settings; // 0x04
- u16 name; // 0x08
- u8 _0A[6]; // 0x0A
- u8 _10[0x9C]; // 0x10
- float x; // 0xAC
- float y; // 0xB0
- float z; // 0xB4
- u8 _B8[0x318]; // 0xB8
- // Any variables you add to the class go here; starting at offset 0x3D0
- u64 eventFlag; // 0x3D0
- u8 type; // 0x3D4
- u8 effect; // 0x3D5
- u8 lastEvState; // 0x3D6
- u8 func; // 0x3D7
-};
-
-struct EventTable_t {
- u64 events;
- // ...
-};
-
-extern EventTable_t *EventTable;
+#include <common.h>
+#include <game.h>
+
+struct LevelSpecial {
+ u32 id; // 0x00
+ u32 settings; // 0x04
+ u16 name; // 0x08
+ u8 _0A[6]; // 0x0A
+ u8 _10[0x9C]; // 0x10
+ float x; // 0xAC
+ float y; // 0xB0
+ float z; // 0xB4
+ u8 _B8[0x318]; // 0xB8
+ // Any variables you add to the class go here; starting at offset 0x3D0
+ u64 eventFlag; // 0x3D0
+ u8 type; // 0x3D4
+ u8 effect; // 0x3D5
+ u8 lastEvState; // 0x3D6
+ u8 func; // 0x3D7
+};
+
+struct EventTable_t {
+ u64 events;
+ // ...
+};
+
+extern EventTable_t *EventTable;
extern u16 TimeStopFlag;
extern u32 TimerBranch;
@@ -50,17 +50,17 @@ float GlobalRiderFloatModifications [] = {1, 0.6, 0.7, 0.9, 1, 1, 1, 1.1, 1.25,
extern "C" dAc_Py_c *GetSpecificPlayerActor(int number);
-void LevelSpecial_Update(LevelSpecial *self);
+void LevelSpecial_Update(LevelSpecial *self);
bool ResetAfterLevel();
-#define ACTIVATE 1
-#define DEACTIVATE 0
-
-fBase_c *FindActorByID(u32 id);
+#define ACTIVATE 1
+#define DEACTIVATE 0
+fBase_c *FindActorByID(u32 id);
-bool ResetAfterLevel(void) {
+
+bool ResetAfterLevel(void) {
TimeStopFlag = 0;
TimerBranch = 0x3403FFA4;
MarioDescentRate = -4;
@@ -75,50 +75,50 @@ bool ResetAfterLevel(void) {
AlwaysDrawFlag = 0x9421FFF0;
AlwaysDrawBranch = 0x7C0802A6;
ZOrderOn = 0;
- return true;
-}
-
-bool LevelSpecial_Create(LevelSpecial *self) {
- char eventNum = (self->settings >> 24) & 0xFF;
- self->eventFlag = (u64)1 << (eventNum - 1);
-
- OSReport("Special Event created @%p event %d\n", self, eventNum);
-
- OSReport("Eventnum: %d. Event flag: %08x %08x\n", eventNum, self->eventFlag >> 32, self->eventFlag & 0xFFFFFFFF);
-
- self->type = (self->settings) & 15;
- self->effect = (self->settings >> 4) & 15;
-
- self->lastEvState = 0xFF;
-
- LevelSpecial_Update(self);
-
- return true;
-}
-
-bool LevelSpecial_Execute(LevelSpecial *self) {
- LevelSpecial_Update(self);
- return true;
-}
-
-
-void LevelSpecial_Update(LevelSpecial *self) {
- //OSReport("%08x%08x", EventTable->events >> 32, EventTable->events & 0xFFFFFFFF);
-
- u8 newEvState = 0;
- if (EventTable->events & self->eventFlag)
- newEvState = 1;
-
- if (newEvState == self->lastEvState)
- return;
-
- OSReport("Event state changed from %d to %d\n", self->lastEvState, newEvState);
-
- u8 offState;
+ return true;
+}
+
+bool LevelSpecial_Create(LevelSpecial *self) {
+ char eventNum = (self->settings >> 24) & 0xFF;
+ self->eventFlag = (u64)1 << (eventNum - 1);
+
+ OSReport("Special Event created @%p event %d\n", self, eventNum);
+
+ OSReport("Eventnum: %d. Event flag: %08x %08x\n", eventNum, self->eventFlag >> 32, self->eventFlag & 0xFFFFFFFF);
+
+ self->type = (self->settings) & 15;
+ self->effect = (self->settings >> 4) & 15;
+
+ self->lastEvState = 0xFF;
+
+ LevelSpecial_Update(self);
+
+ return true;
+}
+
+bool LevelSpecial_Execute(LevelSpecial *self) {
+ LevelSpecial_Update(self);
+ return true;
+}
+
+
+void LevelSpecial_Update(LevelSpecial *self) {
+ //OSReport("%08x%08x", EventTable->events >> 32, EventTable->events & 0xFFFFFFFF);
+
+ u8 newEvState = 0;
+ if (EventTable->events & self->eventFlag)
+ newEvState = 1;
+
+ if (newEvState == self->lastEvState)
+ return;
+
+ OSReport("Event state changed from %d to %d\n", self->lastEvState, newEvState);
+
+ u8 offState;
if (newEvState == ACTIVATE)
- {
- offState = (newEvState == 1) ? 1 : 0;
- OSReport("Activate Special Event!", offState);
+ {
+ offState = (newEvState == 1) ? 1 : 0;
+ OSReport("Activate Special Event!", offState);
switch (self->type) {
case 1: // Time Freeze
@@ -251,12 +251,12 @@ void LevelSpecial_Update(LevelSpecial *self) {
default:
break;
}
- }
-
+ }
+
else
- {
- offState = (newEvState == 1) ? 0 : 1;
- OSReport("Deactivate Special Event", offState);
+ {
+ offState = (newEvState == 1) ? 0 : 1;
+ OSReport("Deactivate Special Event", offState);
switch (self->type) {
case 1: // Time Freeze
@@ -371,14 +371,14 @@ void LevelSpecial_Update(LevelSpecial *self) {
default:
break;
}
- }
- OSReport("Special Event is %d\n", offState);
+ }
+ OSReport("Special Event is %d\n", offState);
- OSReport("Success!\n");
-
-
- self->lastEvState = newEvState;
+ OSReport("Success!\n");
+
+
+ self->lastEvState = newEvState;
}
diff --git a/src/linegod.S b/src/linegod.S
index ed636dd..811fa84 100644
--- a/src/linegod.S
+++ b/src/linegod.S
@@ -1,53 +1,53 @@
-.text
-
-#ifndef __MWERKS__
-.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
-.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
-.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
-.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
-.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
-.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
-.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
-#endif
-
-.align 4
-.extern ContinueBgActorSpawn
-.global BgActorSpawnFix
-BgActorSpawnFix:
- mr 30, 3
-
- #lis 3, TestStr@h
- #ori 3, 3, TestStr@l
- #mr 4, 30
- #crclr 4*cr1+eq
- #bl OSReport
-
- lbz 0, 7(30)
- cmpwi 0, 1
- beq JustRet
- b ContinueBgActorSpawn
-JustRet:
-
- lwz 31, 0x3C(1)
- lwz 30, 0x38(1)
- lwz 0, 0x44(1)
- mtlr 0
- addi 1, 1, 0x40
- blr
-
-
-.global BgActorSetInfoFix
-BgActorSetInfoFix:
- sth 4, 0(3)
- sth 5, 2(3)
- sth 6, 4(3)
- stb 7, 6(3)
- li 4, 0
- stb 4, 7(3)
- blr
-
-
-#.data
-#TestStr:
-# .string "Spawning actor %p\n"
-# .align 4
+.text
+
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+#endif
+
+.align 4
+.extern ContinueBgActorSpawn
+.global BgActorSpawnFix
+BgActorSpawnFix:
+ mr 30, 3
+
+ #lis 3, TestStr@h
+ #ori 3, 3, TestStr@l
+ #mr 4, 30
+ #crclr 4*cr1+eq
+ #bl OSReport
+
+ lbz 0, 7(30)
+ cmpwi 0, 1
+ beq JustRet
+ b ContinueBgActorSpawn
+JustRet:
+
+ lwz 31, 0x3C(1)
+ lwz 30, 0x38(1)
+ lwz 0, 0x44(1)
+ mtlr 0
+ addi 1, 1, 0x40
+ blr
+
+
+.global BgActorSetInfoFix
+BgActorSetInfoFix:
+ sth 4, 0(3)
+ sth 5, 2(3)
+ sth 6, 4(3)
+ stb 7, 6(3)
+ li 4, 0
+ stb 4, 7(3)
+ blr
+
+
+#.data
+#TestStr:
+# .string "Spawning actor %p\n"
+# .align 4
diff --git a/src/linegod.cpp b/src/linegod.cpp
index de08fa0..dcadf59 100644
--- a/src/linegod.cpp
+++ b/src/linegod.cpp
@@ -1,213 +1,213 @@
-#include <common.h>
-#include <game.h>
-
-// TODO: make "No Deactivation"
-
-struct BgActor {
- u16 def_id; // 0x00
- u16 x; // 0x02
- u16 y; // 0x04
- u8 layer; // 0x06
- u8 EXTRA_off; // 0x07
- u32 actor_id; // 0x08
-};
-
-struct BgActorDef {
- u32 tilenum;
- u16 actor;
- u8 _06[2];
- float x;
- float y;
- float z;
- float another_x;
- float another_y;
- u32 extra_var;
-};
-
-struct dBgActorManager_c {
- u32 vtable; // 0x00
- u8 _04[0x34]; // 0x04
- BgActor *array; // 0x38
- u32 count; // 0x3C
- u32 type; // 0x40
-};
-
-extern dBgActorManager_c *dBgActorManager;
-
-extern BgActorDef *BgActorDefs;
-
-struct BG_GM_hax {
- u8 _00[0x8FE64];
- float _0x8FE64;
- float _0x8FE68;
- float _0x8FE6C;
- float _0x8FE70;
-};
-
-extern BG_GM_hax *BG_GM_ptr;
-
-// Regular class is 0x3D0.
-// Let's add stuff to the end just to be safe.
-// Size is now 0x400
-// 80898798 38600400
-
-#define LINEGOD_FUNC_ACTIVATE 0
-#define LINEGOD_FUNC_DEACTIVATE 1
-
-struct LineGod {
- u32 id; // 0x00
- u32 settings; // 0x04
- u16 name; // 0x08
- u8 _0A[6]; // 0x0A
- u8 _10[0x9C]; // 0x10
- float x; // 0xAC
- float y; // 0xB0
- float z; // 0xB4
- u8 _B8[0x318]; // 0xB8
- u64 eventFlag; // 0x3D0
- u8 func; // 0x3D4
- u8 width; // 0x3D5
- u8 height; // 0x3D6
- u8 lastEvState; // 0x3D7
- BgActor *ac[8]; // 0x3D8
-};
-
-struct EventTable_t {
- u64 events;
- // ...
-};
-
-extern EventTable_t *EventTable;
-
-fBase_c *FindActorByID(u32 id);
-
-u16 *GetPointerToTile(BG_GM_hax *self, u16 x, u16 y, u16 layer, short *blockID_p, bool unused);
-
-
-
-void LineGod_BuildList(LineGod *self);
-bool LineGod_AppendToList(LineGod *self, BgActor *ac);
-void LineGod_Update(LineGod *self);
-
-
-bool LineGod_Create(LineGod *self) {
- char eventNum = (self->settings >> 24) & 0xFF;
- self->eventFlag = (u64)1 << (eventNum - 1);
-
- OSReport("LineGod created @%p event %d\n", self, eventNum);
-
- //OSReport("Eventnum: %d. Event flag: %08x %08x\n", eventNum, self->eventFlag >> 32, self->eventFlag & 0xFFFFFFFF);
-
- self->func = (self->settings) & 1;
- self->width = (self->settings >> 4) & 15;
- self->height = (self->settings >> 8) & 15;
-
- self->lastEvState = 0xFF;
-
- LineGod_BuildList(self);
- LineGod_Update(self);
-
- return true;
-}
-
-bool LineGod_Execute(LineGod *self) {
- LineGod_Update(self);
- return true;
-}
-
-void LineGod_BuildList(LineGod *self) {
- for (int clearIdx = 0; clearIdx < 8; clearIdx++) {
- self->ac[clearIdx] = 0;
- }
-
-
- u16 x1 = self->x / 16;
- u16 x2 = x1 + self->width - 1;
- u16 y1 = (-self->y) / 16;
- u16 y2 = y1 + self->height - 1;
- OSReport("Searching ... %d,%d - %d,%d\n", x1, y1, x2, y2);
-
- x1 -= (BG_GM_ptr->_0x8FE64 / 16);
- x2 -= (BG_GM_ptr->_0x8FE64 / 16);
- y1 += (BG_GM_ptr->_0x8FE6C / 16);
- y2 += (BG_GM_ptr->_0x8FE6C / 16);
- OSReport("Manipulated offsets ... %d,%d - %d,%d\n", x1, y1, x2, y2);
-
- OSReport("My array: %p\n", &self->ac[0]);
-
- for (int i = 0; i < dBgActorManager->count; i++) {
- BgActor *ac = &dBgActorManager->array[i];
- //OSReport("Actor %p: %d,%d", ac, ac->x, ac->y);
-
- if (ac->x >= x1 && ac->x <= x2 && ac->y >= y1 && ac->y <= y2)
- LineGod_AppendToList(self, ac);
- }
-}
-
-bool LineGod_AppendToList(LineGod *self, BgActor *ac) {
- OSReport("Adding %p to the list (pos: %d,%d)\n", ac, ac->x, ac->y);
-
- for (int search = 0; search < 8; search++) {
- if (self->ac[search] == 0) {
- self->ac[search] = ac;
- return true;
- }
- }
-
- return false;
-}
-
-void LineGod_Update(LineGod *self) {
- //OSReport("%08x%08x", EventTable->events >> 32, EventTable->events & 0xFFFFFFFF);
-
- u8 newEvState = 0;
- if (EventTable->events & self->eventFlag)
- newEvState = 1;
-
- if (newEvState == self->lastEvState)
- return;
-
- u16 x_bias = (BG_GM_ptr->_0x8FE64 / 16);
- u16 y_bias = -(BG_GM_ptr->_0x8FE6C / 16);
-
- OSReport("Event state changed from %d to %d\n", self->lastEvState, newEvState);
-
- u8 offState;
- if (self->func == LINEGOD_FUNC_ACTIVATE)
- offState = (newEvState == 1) ? 1 : 0;
- else
- offState = (newEvState == 1) ? 0 : 1;
-
- //OSReport("offState is %d\n", offState);
-
- for (int i = 0; i < 8; i++) {
- if (self->ac[i] != 0) {
- BgActor *ac = self->ac[i];
-
- //OSReport("Assigning %d to %p->EXTRA_off (actor ID is %d)\n", offState, ac, ac->actor_id);
-
- ac->EXTRA_off = offState;
- if (offState == 1 && ac->actor_id != 0) {
- fBase_c *assoc_ac = FindActorByID(ac->actor_id);
- //OSReport("Got actor: %p\n", assoc_ac);
- if (assoc_ac != 0)
- assoc_ac->Delete();
- ac->actor_id = 0;
- }
-
- u16 *tile = GetPointerToTile(BG_GM_ptr, (ac->x + x_bias) * 16, (ac->y + y_bias) * 16, 0, 0, 0);
- if (offState == 1)
- *tile = 0;
- else
- *tile = BgActorDefs[ac->def_id].tilenum;
-
- //OSReport("def_id: %d; def_ptr: %p\n", ac->def_id, &(BgActorDefs[ac->def_id]));
- //OSReport("Placed tile %d at %p [%d,%d]\n", *tile, tile, ac->x+x_bias, ac->y+y_bias);
- }
- }
-
- //OSReport("Success!\n");
-
-
- self->lastEvState = newEvState;
-}
+#include <common.h>
+#include <game.h>
+
+// TODO: make "No Deactivation"
+
+struct BgActor {
+ u16 def_id; // 0x00
+ u16 x; // 0x02
+ u16 y; // 0x04
+ u8 layer; // 0x06
+ u8 EXTRA_off; // 0x07
+ u32 actor_id; // 0x08
+};
+
+struct BgActorDef {
+ u32 tilenum;
+ u16 actor;
+ u8 _06[2];
+ float x;
+ float y;
+ float z;
+ float another_x;
+ float another_y;
+ u32 extra_var;
+};
+
+struct dBgActorManager_c {
+ u32 vtable; // 0x00
+ u8 _04[0x34]; // 0x04
+ BgActor *array; // 0x38
+ u32 count; // 0x3C
+ u32 type; // 0x40
+};
+
+extern dBgActorManager_c *dBgActorManager;
+
+extern BgActorDef *BgActorDefs;
+
+struct BG_GM_hax {
+ u8 _00[0x8FE64];
+ float _0x8FE64;
+ float _0x8FE68;
+ float _0x8FE6C;
+ float _0x8FE70;
+};
+
+extern BG_GM_hax *BG_GM_ptr;
+
+// Regular class is 0x3D0.
+// Let's add stuff to the end just to be safe.
+// Size is now 0x400
+// 80898798 38600400
+
+#define LINEGOD_FUNC_ACTIVATE 0
+#define LINEGOD_FUNC_DEACTIVATE 1
+
+struct LineGod {
+ u32 id; // 0x00
+ u32 settings; // 0x04
+ u16 name; // 0x08
+ u8 _0A[6]; // 0x0A
+ u8 _10[0x9C]; // 0x10
+ float x; // 0xAC
+ float y; // 0xB0
+ float z; // 0xB4
+ u8 _B8[0x318]; // 0xB8
+ u64 eventFlag; // 0x3D0
+ u8 func; // 0x3D4
+ u8 width; // 0x3D5
+ u8 height; // 0x3D6
+ u8 lastEvState; // 0x3D7
+ BgActor *ac[8]; // 0x3D8
+};
+
+struct EventTable_t {
+ u64 events;
+ // ...
+};
+
+extern EventTable_t *EventTable;
+
+fBase_c *FindActorByID(u32 id);
+
+u16 *GetPointerToTile(BG_GM_hax *self, u16 x, u16 y, u16 layer, short *blockID_p, bool unused);
+
+
+
+void LineGod_BuildList(LineGod *self);
+bool LineGod_AppendToList(LineGod *self, BgActor *ac);
+void LineGod_Update(LineGod *self);
+
+
+bool LineGod_Create(LineGod *self) {
+ char eventNum = (self->settings >> 24) & 0xFF;
+ self->eventFlag = (u64)1 << (eventNum - 1);
+
+ OSReport("LineGod created @%p event %d\n", self, eventNum);
+
+ //OSReport("Eventnum: %d. Event flag: %08x %08x\n", eventNum, self->eventFlag >> 32, self->eventFlag & 0xFFFFFFFF);
+
+ self->func = (self->settings) & 1;
+ self->width = (self->settings >> 4) & 15;
+ self->height = (self->settings >> 8) & 15;
+
+ self->lastEvState = 0xFF;
+
+ LineGod_BuildList(self);
+ LineGod_Update(self);
+
+ return true;
+}
+
+bool LineGod_Execute(LineGod *self) {
+ LineGod_Update(self);
+ return true;
+}
+
+void LineGod_BuildList(LineGod *self) {
+ for (int clearIdx = 0; clearIdx < 8; clearIdx++) {
+ self->ac[clearIdx] = 0;
+ }
+
+
+ u16 x1 = self->x / 16;
+ u16 x2 = x1 + self->width - 1;
+ u16 y1 = (-self->y) / 16;
+ u16 y2 = y1 + self->height - 1;
+ OSReport("Searching ... %d,%d - %d,%d\n", x1, y1, x2, y2);
+
+ x1 -= (BG_GM_ptr->_0x8FE64 / 16);
+ x2 -= (BG_GM_ptr->_0x8FE64 / 16);
+ y1 += (BG_GM_ptr->_0x8FE6C / 16);
+ y2 += (BG_GM_ptr->_0x8FE6C / 16);
+ OSReport("Manipulated offsets ... %d,%d - %d,%d\n", x1, y1, x2, y2);
+
+ OSReport("My array: %p\n", &self->ac[0]);
+
+ for (int i = 0; i < dBgActorManager->count; i++) {
+ BgActor *ac = &dBgActorManager->array[i];
+ //OSReport("Actor %p: %d,%d", ac, ac->x, ac->y);
+
+ if (ac->x >= x1 && ac->x <= x2 && ac->y >= y1 && ac->y <= y2)
+ LineGod_AppendToList(self, ac);
+ }
+}
+
+bool LineGod_AppendToList(LineGod *self, BgActor *ac) {
+ OSReport("Adding %p to the list (pos: %d,%d)\n", ac, ac->x, ac->y);
+
+ for (int search = 0; search < 8; search++) {
+ if (self->ac[search] == 0) {
+ self->ac[search] = ac;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void LineGod_Update(LineGod *self) {
+ //OSReport("%08x%08x", EventTable->events >> 32, EventTable->events & 0xFFFFFFFF);
+
+ u8 newEvState = 0;
+ if (EventTable->events & self->eventFlag)
+ newEvState = 1;
+
+ if (newEvState == self->lastEvState)
+ return;
+
+ u16 x_bias = (BG_GM_ptr->_0x8FE64 / 16);
+ u16 y_bias = -(BG_GM_ptr->_0x8FE6C / 16);
+
+ OSReport("Event state changed from %d to %d\n", self->lastEvState, newEvState);
+
+ u8 offState;
+ if (self->func == LINEGOD_FUNC_ACTIVATE)
+ offState = (newEvState == 1) ? 1 : 0;
+ else
+ offState = (newEvState == 1) ? 0 : 1;
+
+ //OSReport("offState is %d\n", offState);
+
+ for (int i = 0; i < 8; i++) {
+ if (self->ac[i] != 0) {
+ BgActor *ac = self->ac[i];
+
+ //OSReport("Assigning %d to %p->EXTRA_off (actor ID is %d)\n", offState, ac, ac->actor_id);
+
+ ac->EXTRA_off = offState;
+ if (offState == 1 && ac->actor_id != 0) {
+ fBase_c *assoc_ac = FindActorByID(ac->actor_id);
+ //OSReport("Got actor: %p\n", assoc_ac);
+ if (assoc_ac != 0)
+ assoc_ac->Delete();
+ ac->actor_id = 0;
+ }
+
+ u16 *tile = GetPointerToTile(BG_GM_ptr, (ac->x + x_bias) * 16, (ac->y + y_bias) * 16, 0, 0, 0);
+ if (offState == 1)
+ *tile = 0;
+ else
+ *tile = BgActorDefs[ac->def_id].tilenum;
+
+ //OSReport("def_id: %d; def_ptr: %p\n", ac->def_id, &(BgActorDefs[ac->def_id]));
+ //OSReport("Placed tile %d at %p [%d,%d]\n", *tile, tile, ac->x+x_bias, ac->y+y_bias);
+ }
+ }
+
+ //OSReport("Success!\n");
+
+
+ self->lastEvState = newEvState;
+}
diff --git a/src/msgbox.S b/src/msgbox.S
index db0021c..ac49676 100644
--- a/src/msgbox.S
+++ b/src/msgbox.S
@@ -1,37 +1,37 @@
-.text
-
-#ifndef __MWERKS__
-.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
-.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
-.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
-.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
-.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
-.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
-.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
-#endif
-
-.extern Global5758
-
-# -if param & 1 /and/ messagebox is on,
-# otherwise, return Global5758 & param
-
-.global Query5758Replacement
-Query5758Replacement:
- mr 5, 3 # save param
- lis 4, Global5758@h
- ori 4, 4, Global5758@l
- lwz 0, 0(4) # get 5758
- and 3, 0, 3 # AND with param
- andi. 5, 5, 1 # if param & 1 == 0..
- beqlr # then return
-
- lis 4, MessageBoxIsShowing@h
- ori 4, 4, MessageBoxIsShowing@l
- lwz 4, 0(4)
- or 3, 3, 4 # otherwise, OR with MessageBoxIsShowing
- blr # then return
-
-
-.data
-MessageBoxIsShowing:
- .long 0
+.text
+
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+#endif
+
+.extern Global5758
+
+# -if param & 1 /and/ messagebox is on,
+# otherwise, return Global5758 & param
+
+.global Query5758Replacement
+Query5758Replacement:
+ mr 5, 3 # save param
+ lis 4, Global5758@h
+ ori 4, 4, Global5758@l
+ lwz 0, 0(4) # get 5758
+ and 3, 0, 3 # AND with param
+ andi. 5, 5, 1 # if param & 1 == 0..
+ beqlr # then return
+
+ lis 4, MessageBoxIsShowing@h
+ ori 4, 4, MessageBoxIsShowing@l
+ lwz 4, 0(4)
+ or 3, 3, 4 # otherwise, OR with MessageBoxIsShowing
+ blr # then return
+
+
+.data
+MessageBoxIsShowing:
+ .long 0
diff --git a/src/msgbox.cpp b/src/msgbox.cpp
index 63eb994..f99f73f 100644
--- a/src/msgbox.cpp
+++ b/src/msgbox.cpp
@@ -1,227 +1,227 @@
-#include <common.h>
-#include <game.h>
-#include "layoutlib.h"
-#include "fileload.h"
-
-
-struct MsgData_Header {
- u32 magic;
- u32 msgCount;
-};
-
-struct MsgData_Entry {
- u32 number;
- u32 titleOffset;
- u32 msgOffset;
-};
-
-
-
-struct dMsgBoxManager_c {
- // 0x00
- int ID;
- unsigned int Settings;
- short Type;
- char Unk_0A;
- char Unk_0B;
- char Unk_0C;
- char Unk_0D;
- char Unk_0E;
- char Unk_0F;
-
- // 0x10
- void *CONNECT_parent;
- void *CONNECT_child;
- void *CONNECT_prev;
- void *CONNECT_next;
-
- // 0x20
- void *CONNECT_thisObj;
- void *EXECUTE_prev;
- void *EXECUTE_next;
- void *EXECUTE_thisObj;
-
- // 0x30
- short Unk_30;
- short Unk_32;
- void *DRAW_prev;
- void *DRAW_next;
- void *DRAW_thisObj;
-
- // 0x40
- short Unk_40;
- short Unk_42;
- void *IDLookup_prev;
- void *IDLookup_next;
- void *IDLookup_thisObj;
-
- // 0x50
- void *Unk_50;
- int Unk_54;
- int Unk_58;
- void *Unk_5C;
-
- // 0x60
- void *vtable;
- int Unk_64; // dBase_c starts here
- char *weirdTypeString;
- char *actorName;
-
- // dMsgBoxManager_c starts here (offset 0x70)
- Layout *layout;
- int state;
- FileHandle msgDataFH;
-
- // 0x80
- void *msgData;
-
- // current allocated class size: 0xD0
-};
-
-
-#define STATE_NULL 0
-#define STATE_BOX_APPEAR_WAIT 1
-#define STATE_BUTTON_APPEAR_WAIT 2
-#define STATE_SHOWN 3
-#define STATE_BUTTON_DISAPPEAR_WAIT 4
-#define STATE_BOX_DISAPPEAR_WAIT 5
-
-#define animBoxAppear 0
-#define animBoxDisappear 1
-#define animButtonAppear 2
-#define animButtonDisappear 3
-
-extern int MessageBoxIsShowing;
-dMsgBoxManager_c *CurrentMsgBoxManager;
-
-const char *brlan_BoxAppear = "BoxAppear.brlan";
-const char *brlan_BoxDisappear = "BoxDisappear.brlan";
-const char *brlan_ButtonAppear = "ButtonAppear.brlan";
-const char *brlan_ButtonDisappear = "ButtonDisappear.brlan";
-
-const char *group_Box = "G_Box";
-const char *group_Button = "G_Button";
-
-bool dMsgBoxManager_c__Create(dMsgBoxManager_c *self) {
- self->layout = (Layout*)AllocFromGameHeap1(sizeof(Layout));
-
- if (!self->layout) {
- OSReport("memalloc fail\n");
- InfiniteLoop;
- }
-
- EmbeddedLayout_ctor(self->layout);
- EmbeddedLayout_LoadArc(self->layout, "NewerRes/msgbox.arc");
-
- if (!EmbeddedLayout_Build(self->layout, "MessageBox.brlyt", 0)) {
- OSReport("build fail\n");
- InfiniteLoop;
- }
-
-
- const char *anims[4] = {brlan_BoxAppear, brlan_BoxDisappear, brlan_ButtonAppear, brlan_ButtonDisappear};
- EmbeddedLayout_LoadBrlans(self->layout, anims, 4);
-
- const char *groups[4] = {group_Box, group_Box, group_Button, group_Button};
-
- int mappings[4] = {0, 1, 2, 3};
- EmbeddedLayout_LoadGroups(self->layout, groups, mappings, 4);
-
- EmbeddedLayout_DisableAllAnims(self->layout);
-
- for (int i = 0; i < 4; i++) {
- EmbeddedLayout_ResetAnimToInitialState(self->layout, i, false);
- }
-
- self->msgData = LoadFile(&self->msgDataFH, "/NewerRes/MsgData.bin");
-
- self->state = STATE_NULL;
- self->layout->drawOrder = 0xA0;
-
- CurrentMsgBoxManager = self;
-
- return true;
-}
-
-bool dMsgBoxManager_c__Execute(dMsgBoxManager_c *self) {
- if (self->state == STATE_NULL)
- return true;
-
-
- switch (self->state) {
- /**************************************************************************/
- case STATE_BOX_APPEAR_WAIT:
- if (!EmbeddedLayout_CheckIfAnimationIsOn(self->layout, animBoxAppear)) {
- EmbeddedLayout_EnableNonLoopAnim(self->layout, animButtonAppear, false);
- self->state = STATE_BUTTON_APPEAR_WAIT;
- }
-
- break;
-
- /**************************************************************************/
- case STATE_BUTTON_APPEAR_WAIT:
- if (!EmbeddedLayout_CheckIfAnimationIsOn(self->layout, animButtonAppear)) {
- self->state = STATE_SHOWN;
- }
-
- break;
-
- /**************************************************************************/
- case STATE_SHOWN:
- if (false) {
- EmbeddedLayout_EnableNonLoopAnim(self->layout, animButtonDisappear, false);
- self->state = STATE_BUTTON_DISAPPEAR_WAIT;
- }
-
- break;
-
- /**************************************************************************/
- case STATE_BUTTON_DISAPPEAR_WAIT:
- if (!EmbeddedLayout_CheckIfAnimationIsOn(self->layout, animButtonDisappear)) {
- EmbeddedLayout_EnableNonLoopAnim(self->layout, animBoxDisappear, false);
- self->state = STATE_BOX_DISAPPEAR_WAIT;
- }
-
- break;
-
- /**************************************************************************/
- case STATE_BOX_DISAPPEAR_WAIT:
- if (!EmbeddedLayout_CheckIfAnimationIsOn(self->layout, animBoxDisappear)) {
- self->state = STATE_NULL;
-
- EmbeddedLayout_DisableAllAnims(self->layout);
-
- for (int i = 0; i < 4; i++) {
- EmbeddedLayout_ResetAnimToInitialState(self->layout, i, false);
- }
- }
- break;
- }
-
-
- EmbeddedLayout_Process(self->layout);
- EmbeddedLayout_UpdateMatrix(self->layout);
-
- return true;
-}
-
-bool dMsgBoxManager_c__Draw(dMsgBoxManager_c *self) {
- if (self->state != STATE_NULL) {
- EmbeddedLayout_AddToDrawList(self->layout);
- }
-
- return true;
-}
-
-bool dMsgBoxManager_c__Delete(dMsgBoxManager_c *self) {
- EmbeddedLayout_FreeArc(self->layout);
- EmbeddedLayout_Free(self->layout);
- EmbeddedLayout_dtor(self->layout, false);
- FreeFromGameHeap1(self->layout);
-
- CurrentMsgBoxManager = 0;
-
- return true;
-}
-
-
+#include <common.h>
+#include <game.h>
+#include "layoutlib.h"
+#include "fileload.h"
+
+
+struct MsgData_Header {
+ u32 magic;
+ u32 msgCount;
+};
+
+struct MsgData_Entry {
+ u32 number;
+ u32 titleOffset;
+ u32 msgOffset;
+};
+
+
+
+struct dMsgBoxManager_c {
+ // 0x00
+ int ID;
+ unsigned int Settings;
+ short Type;
+ char Unk_0A;
+ char Unk_0B;
+ char Unk_0C;
+ char Unk_0D;
+ char Unk_0E;
+ char Unk_0F;
+
+ // 0x10
+ void *CONNECT_parent;
+ void *CONNECT_child;
+ void *CONNECT_prev;
+ void *CONNECT_next;
+
+ // 0x20
+ void *CONNECT_thisObj;
+ void *EXECUTE_prev;
+ void *EXECUTE_next;
+ void *EXECUTE_thisObj;
+
+ // 0x30
+ short Unk_30;
+ short Unk_32;
+ void *DRAW_prev;
+ void *DRAW_next;
+ void *DRAW_thisObj;
+
+ // 0x40
+ short Unk_40;
+ short Unk_42;
+ void *IDLookup_prev;
+ void *IDLookup_next;
+ void *IDLookup_thisObj;
+
+ // 0x50
+ void *Unk_50;
+ int Unk_54;
+ int Unk_58;
+ void *Unk_5C;
+
+ // 0x60
+ void *vtable;
+ int Unk_64; // dBase_c starts here
+ char *weirdTypeString;
+ char *actorName;
+
+ // dMsgBoxManager_c starts here (offset 0x70)
+ Layout *layout;
+ int state;
+ FileHandle msgDataFH;
+
+ // 0x80
+ void *msgData;
+
+ // current allocated class size: 0xD0
+};
+
+
+#define STATE_NULL 0
+#define STATE_BOX_APPEAR_WAIT 1
+#define STATE_BUTTON_APPEAR_WAIT 2
+#define STATE_SHOWN 3
+#define STATE_BUTTON_DISAPPEAR_WAIT 4
+#define STATE_BOX_DISAPPEAR_WAIT 5
+
+#define animBoxAppear 0
+#define animBoxDisappear 1
+#define animButtonAppear 2
+#define animButtonDisappear 3
+
+extern int MessageBoxIsShowing;
+dMsgBoxManager_c *CurrentMsgBoxManager;
+
+const char *brlan_BoxAppear = "BoxAppear.brlan";
+const char *brlan_BoxDisappear = "BoxDisappear.brlan";
+const char *brlan_ButtonAppear = "ButtonAppear.brlan";
+const char *brlan_ButtonDisappear = "ButtonDisappear.brlan";
+
+const char *group_Box = "G_Box";
+const char *group_Button = "G_Button";
+
+bool dMsgBoxManager_c__Create(dMsgBoxManager_c *self) {
+ self->layout = (Layout*)AllocFromGameHeap1(sizeof(Layout));
+
+ if (!self->layout) {
+ OSReport("memalloc fail\n");
+ InfiniteLoop;
+ }
+
+ EmbeddedLayout_ctor(self->layout);
+ EmbeddedLayout_LoadArc(self->layout, "NewerRes/msgbox.arc");
+
+ if (!EmbeddedLayout_Build(self->layout, "MessageBox.brlyt", 0)) {
+ OSReport("build fail\n");
+ InfiniteLoop;
+ }
+
+
+ const char *anims[4] = {brlan_BoxAppear, brlan_BoxDisappear, brlan_ButtonAppear, brlan_ButtonDisappear};
+ EmbeddedLayout_LoadBrlans(self->layout, anims, 4);
+
+ const char *groups[4] = {group_Box, group_Box, group_Button, group_Button};
+
+ int mappings[4] = {0, 1, 2, 3};
+ EmbeddedLayout_LoadGroups(self->layout, groups, mappings, 4);
+
+ EmbeddedLayout_DisableAllAnims(self->layout);
+
+ for (int i = 0; i < 4; i++) {
+ EmbeddedLayout_ResetAnimToInitialState(self->layout, i, false);
+ }
+
+ self->msgData = LoadFile(&self->msgDataFH, "/NewerRes/MsgData.bin");
+
+ self->state = STATE_NULL;
+ self->layout->drawOrder = 0xA0;
+
+ CurrentMsgBoxManager = self;
+
+ return true;
+}
+
+bool dMsgBoxManager_c__Execute(dMsgBoxManager_c *self) {
+ if (self->state == STATE_NULL)
+ return true;
+
+
+ switch (self->state) {
+ /**************************************************************************/
+ case STATE_BOX_APPEAR_WAIT:
+ if (!EmbeddedLayout_CheckIfAnimationIsOn(self->layout, animBoxAppear)) {
+ EmbeddedLayout_EnableNonLoopAnim(self->layout, animButtonAppear, false);
+ self->state = STATE_BUTTON_APPEAR_WAIT;
+ }
+
+ break;
+
+ /**************************************************************************/
+ case STATE_BUTTON_APPEAR_WAIT:
+ if (!EmbeddedLayout_CheckIfAnimationIsOn(self->layout, animButtonAppear)) {
+ self->state = STATE_SHOWN;
+ }
+
+ break;
+
+ /**************************************************************************/
+ case STATE_SHOWN:
+ if (false) {
+ EmbeddedLayout_EnableNonLoopAnim(self->layout, animButtonDisappear, false);
+ self->state = STATE_BUTTON_DISAPPEAR_WAIT;
+ }
+
+ break;
+
+ /**************************************************************************/
+ case STATE_BUTTON_DISAPPEAR_WAIT:
+ if (!EmbeddedLayout_CheckIfAnimationIsOn(self->layout, animButtonDisappear)) {
+ EmbeddedLayout_EnableNonLoopAnim(self->layout, animBoxDisappear, false);
+ self->state = STATE_BOX_DISAPPEAR_WAIT;
+ }
+
+ break;
+
+ /**************************************************************************/
+ case STATE_BOX_DISAPPEAR_WAIT:
+ if (!EmbeddedLayout_CheckIfAnimationIsOn(self->layout, animBoxDisappear)) {
+ self->state = STATE_NULL;
+
+ EmbeddedLayout_DisableAllAnims(self->layout);
+
+ for (int i = 0; i < 4; i++) {
+ EmbeddedLayout_ResetAnimToInitialState(self->layout, i, false);
+ }
+ }
+ break;
+ }
+
+
+ EmbeddedLayout_Process(self->layout);
+ EmbeddedLayout_UpdateMatrix(self->layout);
+
+ return true;
+}
+
+bool dMsgBoxManager_c__Draw(dMsgBoxManager_c *self) {
+ if (self->state != STATE_NULL) {
+ EmbeddedLayout_AddToDrawList(self->layout);
+ }
+
+ return true;
+}
+
+bool dMsgBoxManager_c__Delete(dMsgBoxManager_c *self) {
+ EmbeddedLayout_FreeArc(self->layout);
+ EmbeddedLayout_Free(self->layout);
+ EmbeddedLayout_dtor(self->layout, false);
+ FreeFromGameHeap1(self->layout);
+
+ CurrentMsgBoxManager = 0;
+
+ return true;
+}
+
+
diff --git a/src/poweruphax.S b/src/poweruphax.S
index bfd8c83..3db06c7 100644
--- a/src/poweruphax.S
+++ b/src/poweruphax.S
@@ -1,689 +1,689 @@
-.text
-.align 4
-.set sp, 1
-
-.extern returnFromGPSFASixth
-.extern daEnItem_c__GetWhetherPlayerCanGetPowerupOrNot
-.extern dAcPy_c__ChangePowerupWithAnimation
-.extern PlayPlayerSound
-.extern CreateActor
-.extern PlayerProjectileShooting
-.extern Actor_SearchByName
-.extern SomeTable_802F5440
-.extern SomeTable_802F5580
-.extern SomeTable_802F56C0
-.extern BlahTable
-.extern continuePlumberSetPowerupTexture
-.extern doneSettingThePowerupTexture
-.extern doneSettingThePowerupTexture2
-
-#ifndef __MWERKS__
-.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
-.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
-.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
-.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
-.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
-.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
-.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
-.set f1,1; .set f30,30; .set f31,31
-#endif
-
-.global GetInfoFromDumbTable
-GetInfoFromDumbTable:
- lis r3, SomeTable@h
- ori r3, r3, SomeTable@l
-
- slwi r4, r4, 2
- slwi r0, r5, 6
-
- lwzx r3, r3, r4
- add r3, r3, r0
- blr
-
-
-
-
-.global FukidashiFix
-FukidashiFix:
- lis r7, ZeroFloat@h
- ori r7, r7, ZeroFloat@l
-
- lis r8, FukidashiTable2@h
- ori r8, r8, FukidashiTable2@l
-
- mulli r6, r4, 0x20
- slwi r0, r5, 2
- add r0, r0, r6
-
- lfs f0, 0(r7)
- lfsx f1, r8, r0
-
- stfs f0, 0x1DC(r3)
- stfs f1, 0x1E0(r3)
- stfs f0, 0x1E4(r3)
-
- blr
-
-
-
-
-.global PlayerGetHeight
-PlayerGetHeight:
- lwz r0, 0x14D4(r3)
-
- lwz r4, 0x1090(r3)
- slwi r4, r4, 3
-
- cmpwi r0, 0
- beq useNormal
- cmpwi r0, 1
- bne useDucking
-
-useNormal:
- lis r3, PlayerHeightsNormal@h
- ori r3, r3, PlayerHeightsNormal@l
- b gotOffset
-
-useDucking:
- lis r3, PlayerHeightsDucking@h
- ori r3, r3, PlayerHeightsDucking@l
-
-gotOffset:
- lfsx f1, r3, r4
- blr
-
-
-
-.global WtfEver
-WtfEver:
- lis r3, WtfEverTable@h
- ori r3, r3, WtfEverTable@l
- lfsx f0, r3, r0
- blr
-
-
-
-.global YetAnother
-YetAnother:
- lis r3, YetAnotherTable@h
- ori r3, r3, YetAnotherTable@l
- lfsx f0, r3, r0
- blr
-
-
-
-
-.global GetWeirdScaleTable
-GetWeirdScaleTable:
- lis r5, WeirdScaleTable@h
- ori r5, r5, WeirdScaleTable@l
- lfsx f1, r5, r0
- blr
-
-
-
-
-
-.global GetAsdfTable
-GetAsdfTable:
- extsb r0, r4
- cmpwi r0, -1
- bne dontGetThisOne
-
- lwz r0, 0x1090(r3)
- extsb r4, r0
-
-dontGetThisOne:
- extsb r0, r4
-
- lis r3, AsdfTable@h
- ori r3, r3, AsdfTable@l
- lbzx r3, r3, r0
-
- blr
-
-
-
-
-
-.global GetBlahTableOffset
-GetBlahTableOffset:
- lis r5, BlahTableOffsets@h
- ori r5, r5, BlahTableOffsets@l
- lwzx r30, r5, r4
- blr
-
-
-.global DealWithBlahTable
-DealWithBlahTable:
- lis r5, BlahTableOffsets@h
- ori r5, r5, BlahTableOffsets@l
-
- # points to BlahTable
- lis r4, BlahTable@h
- ori r4, r4, BlahTable@l
-
- # get blahtableoffset entry based on powerup
- lwz r0, 0x1090(r3)
- slwi r0, r0, 2
- lwzx r0, r5, r0
-
- # now get the entry from the blahtable
- slwi r0, r0, 2
- lwzx r4, r4, r0
-
- # do shit here
-
- lfs f3, 0(r4)
- stfs f3, 0x14E4(r3)
- stfs f3, 0x164(r3)
-
- lfs f1, 0x2A70(r3)
- lfs f0, 0x2A74(r3)
-
- lfs f2, 4(r4)
- fadds f1, f2, f1
- fadds f0, f0, f1
- stfs f0, 0x14E8(r3)
- stfs f0, 0x168(r3)
-
- lfs f0, 0x8(r4)
- lfs f1, 0xC(r4)
- stfs f0, 0x16C(r3)
- stfs f1, 0x170(r3)
-
- # hope I did this right
- blr
-
-
-
-
-
-.global GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r4_dest
-GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r4_dest:
- lis r6, PowerupScaleFloats@h
- ori r6, r6, PowerupScaleFloats@l
- add r4, r6, r0
- blr
-
-.global GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest
-GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest:
- lis r6, PowerupScaleFloats@h
- ori r6, r6, PowerupScaleFloats@l
- add r3, r6, r0
- blr
-
-.global GetPowerupScaleFloatAddr_r8_trash_r0_valshl2_r7_dest
-GetPowerupScaleFloatAddr_r8_trash_r0_valshl2_r7_dest:
- lis r8, PowerupScaleFloats@h
- ori r8, r8, PowerupScaleFloats@l
- add r7, r8, r0
- blr
-
-.global GetPowerupScaleFloatAddr_fixForSixth
-GetPowerupScaleFloatAddr_fixForSixth:
- lis r5, PowerupScaleFloats@h
- ori r5, r5, PowerupScaleFloats@l
- add r4, r5, r4
- b returnFromGPSFASixth
-
-
-
-.global PlumberSetPowerupFix
-PlumberSetPowerupFix:
- lbz r0, 0x152(r31) # get powerup id
-
- cmpwi r0, 2
- beq doFireTex
-
- cmpwi r0, 6
- beq doIceTex
-
- cmpwi r0, 7
- beq doHammerTex
-
- li r4, 0
- b gotTexID
-
-doFireTex:
- li r4, 1
- b gotTexID
-
-doIceTex:
- li r4, 2
- b gotTexID
-
-doHammerTex:
- li r4, 3
-
-gotTexID:
- lwz r12, 0(r31)
- mr r3, r31
- lwz r12, 0x34(r12)
- mtctr r12
- bctrl
-
- b doneSettingThePowerupTexture
-
-
-
-.global PlumberSetPowerupFix2
-PlumberSetPowerupFix2:
- cmpwi r31, 2
- beq doFireTex2
-
- cmpwi r31, 6
- beq doIceTex2
-
- cmpwi r31, 7
- beq doHammerTex2
-
- li r4, 0
- b gotTexID2
-
-doFireTex2:
- li r4, 1
- b gotTexID2
-
-doIceTex2:
- li r4, 2
- b gotTexID2
-
-doHammerTex2:
- li r4, 3
-
-gotTexID2:
- lwz r3, 0x2A64(r30)
- lwz r12, 0(r3)
- lwz r12, 0x34(r12)
- mtctr r12
- bctrl
-
- b doneSettingThePowerupTexture2
-
-
-
-
-.global PlumberSetPowerupTextureDebug
-.extern OSReport
-.extern continuePlumberSetPowerupTextureDebug
-PlumberSetPowerupTextureDebug:
- stwu sp, -0x30(sp)
- mflr r0
- stw r0, 0x34(sp)
- stw r3, 0x20(sp)
- stw r4, 0x24(sp)
-
- mr r6, r0
- mr r5, r4
- mr r4, r3
- lis r3, PowerupTexDebugStr@h
- ori r3, r3, PowerupTexDebugStr@l
- crclr 4*cr1+eq
- bl OSReport
-
- lwz r3, 0x20(sp)
- lwz r4, 0x24(sp)
- lwz r0, 0x34(sp)
- mtlr r0
- addi sp, sp, 0x30
-
- stwu sp, -0x30(sp)
-
- b continuePlumberSetPowerupTextureDebug
-
-
-
-
-
-.global PlumberSetPowerupTextureFix
-PlumberSetPowerupTextureFix:
- stb r4, 0x153(r3)
-
- lis r5, PowerupTextures@h
- ori r5, r5, PowerupTextures@l
-
- slwi r4, r4, 2
- lfsx f31, r5, r4
-
- b continuePlumberSetPowerupTexture
-
-
-
-.global SetHammerToEnItemDCA
-SetHammerToEnItemDCA:
- bl daEnItem_c__GetWhetherPlayerCanGetPowerupOrNot
- cmpwi r3, 1
- bne DontSetHammer
-
- li r0, 5
- sth r0, 0xDCA(r31)
-
-DontSetHammer:
- lwz r0, 0x14(sp)
- lwz r31, 0xC(sp)
- mtlr r0
- addi sp, sp, 0x10
- blr
-
-
-#.global EnItem_BindAnimation_Fix
-#EnItem_BindAnimation_Fix:
-# lhz r0, 0xDCA(r3)
-# cmpwi r0, 5
-# beqlr
-# stwu sp, -0x20(sp)
-# b EnItem_BindAnimation_Continued
-
-
-.global WeirdAnimLoadHack
-WeirdAnimLoadHack:
- cmplwi r4, 5 #hammersuit
- beqlr
- cmplwi r4, 6 #1up
- beqlr
- # neither of those succeeded
- crclr 4*cr0+eq
- blr
-
-
-
-.global TryToGiveMarioHammerSuit
-TryToGiveMarioHammerSuit:
- stwu sp, -0x10(sp)
- mflr r0
- stw r0, 0x14(sp)
-
- # check the obtained item number
- cmplwi r3, 5
- bne IsntGettingHammerSuit
-
- # check the current player powerup
- cmplwi r4, 7
- bne DontHaveHammerSuit
-
- li r28, 0
- li r29, 2
- b ReturnFromTTGMHS
-
-DontHaveHammerSuit:
- mr r3, r30
- li r4, 7
- bl dAcPy_c__ChangePowerupWithAnimation
-
- cmpwi r3, 0
- beq ReturnFromTTGMHS
-
- li r29, 1
-
-IsntGettingHammerSuit:
-ReturnFromTTGMHS:
- # end of function
- lwz r0, 0x14(sp)
- mtlr r0
- addi sp, sp, 0x10
-
- # leftover instruction from what we replaced to add the bl
- cmpwi r29, 0
- blr
-
-
-
-.global ThrowHammer
-ThrowHammer:
- # continues on from PlayerProjectileShooting
-
- # get powerup
- lwz r3, 0x1090(r30)
- cmplwi r3, 7
- bne ReturnFromThrowHammer
-
- mr r3, r30
- li r4, 498
- li r5, 0
- bl PlayPlayerSound
-
- li r3, 0x73 # Hammer
- li r4, 0 # Settings
- addi r5, sp, 0x2C # Position
- li r6, 0 # Rotation
- lbz r7, 0x38F(r30) # Layer
- bl CreateActor
-
- # Store player ID
- lwz r4, 0(r30)
- stw r4, 0x450(r3)
-
- # store player number, but add 0x100 to differentiate it from 0
- lbz r4, 0x38D(r30)
- addi r4, r4, 0x100
- stw r4, 0x458(r3)
-
- # Fix scale
- lis r4, OneFloat@h
- ori r4, r4, OneFloat@l
- lfs f0, 0(r4)
- stfs f0, 0xDC(r3)
- stfs f0, 0xE0(r3)
- stfs f0, 0xE4(r3)
-
- mr r4, r30
- lwz r12, 0x60(r3)
- lwz r12, 0x8C(r12)
- mtctr r12
- bctrl
-
-ReturnFromThrowHammer:
- lwz r0, 0xC4(sp)
- psq_l f31, 0xB8(sp), 1, 0
- lfd f31, 0xB0(sp)
- psq_l f30, 0xA8(sp), 1, 0
- lfd f30, 0xA0(sp)
- lwz r31, 0x9C(sp)
- lwz r30, 0x98(sp)
- mtlr r0
- addi sp, sp, 0xC0
- blr
-
-
-
-.global MoreProjectileStuff_Fix
-MoreProjectileStuff_Fix:
- lwz r3, 0x1090(r31)
- cmplwi r3, 7
- bne ReturnFromMPSFix
-
- mr r3, r31
- li r4, 1
- bl PlayerProjectileShooting
-
-ReturnFromMPSFix:
- lwz r0, 0x14(sp)
- lwz r31, 0xC(sp)
- mtlr r0
- addi sp, sp, 0x10
- blr
-
-
-
-.global ProjectileShootCheck_Fix
-ProjectileShootCheck_Fix:
- lwz r3, 0x1090(r31)
- cmplwi r3, 7
- bne Return0fromPSCFix
-
- lbz r3, 0x38D(r31)
- li r4, 0
- extsb r3, r3
- bl CheckHammerLimit
-
- cmpwi r3, 0
- beq Return0fromPSCFix
-
- b Return1fromPSCFix
-
-Return0fromPSCFix:
- li r3, 0
- b ReturnFromPSCFix
-
-Return1fromPSCFix:
- li r3, 1
-
-ReturnFromPSCFix:
- lwz r0, 0x14(sp)
- lwz r31, 0xC(sp)
- mtlr r0
- addi sp, sp, 0x10
- blr
-
-
-.global CheckHammerLimit
-CheckHammerLimit:
- stwu sp, -0x10(sp)
- mflr r0
- stw r0, 0x14(sp)
- stw r31, 0xC(sp)
- stw r30, 0x8(sp)
-
- # r30 = player number
- mr r30, r3
- addi r30, r30, 0x100
-
- # r31 = hammer count so far
- li r31, 0
-
- # search for every Hammer
-
- li r3, 0
- b startOrContinueLoop
-loop:
-
- lwz r4, 0x458(r3)
- cmpw r4, r30
- bne startOrContinueLoop
-
- addi r31, r31, 1
-
-startOrContinueLoop:
- mr r4, r3
- li r3, 0x73
- bl Actor_SearchByName
-
- cmpwi r3, 0
- bne loop
-
- # now if the current count is >= 2, return 0
- # otherwise return 1
- cmpwi r31, 2
- bge tooManyHammers
-
- li r3, 1
- b gotHammerStatus
-
-tooManyHammers:
- li r3, 0
-
-gotHammerStatus:
- lwz r0, 0x14(sp)
- lwz r31, 0xC(sp)
- lwz r30, 0x8(sp)
- mtlr r0
- addi sp, sp, 0x10
- blr
-
-
-
-
-
-
-.data
-
-SomeTable:
- .long SomeTable_802F5580
- .long SomeTable_802F56C0
- .long SomeTable_802F56C0
- .long SomeTable_802F5440
- .long SomeTable_802F56C0
- .long SomeTable_802F56C0
- .long SomeTable_802F56C0
- .long SomeTable_802F56C0
-
-ZeroFloat:
- .float 0.0
-
-OneFloat:
- .float 1.0
-
-FukidashiTable2:
- .float 20.0, 32.0, 32.0, 12.0, 38.0, 33.0, 32.0, 32.0
- .float 20.0, 34.0, 34.0, 12.0, 39.0, 35.0, 34.0, 34.0
- .float 20.0, 29.0, 29.0, 11.0, 34.0, 29.0, 29.0, 29.0
- .float 20.0, 29.0, 29.0, 11.0, 34.0, 29.0, 29.0, 29.0
-
-PlayerHeightsNormal:
- .float 16.0, 27.0, 27.0, 12.0, 27.0, 27.0, 27.0, 27.0
-
-PlayerHeightsDucking:
- .float 13.0, 21.0, 21.0, 9.0, 21.0, 21.0, 21.0, 21.0
-
-WtfEverTable:
- .float 4.5, 10.0, 10.0, 1.0, 10.0, 9.0, 10.0, 10.0
-
-YetAnotherTable:
- .float 0.0, -4.0, -4.0, 4.0, -6.0, -2.0, -4.0, -4.0
-
-WeirdScaleTable:
- .float 16.0, 31.0, 31.0, 6.0, 34.0, 31.0, 31.0, 31.0
-
-AsdfTable:
- .byte 1, 2, 2, 0, 2, 2, 2, 2
-
-BlahTableOffsets:
- .long 1, 2, 2, 0, 3, 2, 2, 2
-
-PowerupScaleFloats:
- .long 0xDEADBEEF, 0xDEADBEEF # padding
- .float 1.0
- .float 1.0
- .float 1.0
- .float 0.6
- .float 1.0
- .float 1.0
- .float 1.0
- .float 1.0
-
-PowerupTextures:
- .float 0.0
- .float 1.0
- .float 2.0
- .float 3.0
-
-.global BrosArcFileName
-BrosArcFileName:
- .string "bros"
-
-.global I_hammerArcFilename
-I_hammerArcFilename:
- .string "I_hammer"
-
-.global I_hammerResFile
-I_hammerResFile:
-# .string "g3d/I_hammer.brres"
- .string "g3d/I_fireflower.brres"
-
-.global I_hammerModelName
-I_hammerModelName:
-# .string "I_hammer"
- .string "I_fireflower"
-
-
-PowerupTexDebugStr:
- .string "Plumber::SetPowerupTexture() called on class %p with texnum %d lr=%p\n"
-
-#.global BrosModelFilename
-#BrosModelFilename:
-# .string "g3d/bros.brres"
-
-#.global HammerModelName
-#HammerModelName:
-# .string "bros_hammer"
+.text
+.align 4
+.set sp, 1
+
+.extern returnFromGPSFASixth
+.extern daEnItem_c__GetWhetherPlayerCanGetPowerupOrNot
+.extern dAcPy_c__ChangePowerupWithAnimation
+.extern PlayPlayerSound
+.extern CreateActor
+.extern PlayerProjectileShooting
+.extern Actor_SearchByName
+.extern SomeTable_802F5440
+.extern SomeTable_802F5580
+.extern SomeTable_802F56C0
+.extern BlahTable
+.extern continuePlumberSetPowerupTexture
+.extern doneSettingThePowerupTexture
+.extern doneSettingThePowerupTexture2
+
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+.set f1,1; .set f30,30; .set f31,31
+#endif
+
+.global GetInfoFromDumbTable
+GetInfoFromDumbTable:
+ lis r3, SomeTable@h
+ ori r3, r3, SomeTable@l
+
+ slwi r4, r4, 2
+ slwi r0, r5, 6
+
+ lwzx r3, r3, r4
+ add r3, r3, r0
+ blr
+
+
+
+
+.global FukidashiFix
+FukidashiFix:
+ lis r7, ZeroFloat@h
+ ori r7, r7, ZeroFloat@l
+
+ lis r8, FukidashiTable2@h
+ ori r8, r8, FukidashiTable2@l
+
+ mulli r6, r4, 0x20
+ slwi r0, r5, 2
+ add r0, r0, r6
+
+ lfs f0, 0(r7)
+ lfsx f1, r8, r0
+
+ stfs f0, 0x1DC(r3)
+ stfs f1, 0x1E0(r3)
+ stfs f0, 0x1E4(r3)
+
+ blr
+
+
+
+
+.global PlayerGetHeight
+PlayerGetHeight:
+ lwz r0, 0x14D4(r3)
+
+ lwz r4, 0x1090(r3)
+ slwi r4, r4, 3
+
+ cmpwi r0, 0
+ beq useNormal
+ cmpwi r0, 1
+ bne useDucking
+
+useNormal:
+ lis r3, PlayerHeightsNormal@h
+ ori r3, r3, PlayerHeightsNormal@l
+ b gotOffset
+
+useDucking:
+ lis r3, PlayerHeightsDucking@h
+ ori r3, r3, PlayerHeightsDucking@l
+
+gotOffset:
+ lfsx f1, r3, r4
+ blr
+
+
+
+.global WtfEver
+WtfEver:
+ lis r3, WtfEverTable@h
+ ori r3, r3, WtfEverTable@l
+ lfsx f0, r3, r0
+ blr
+
+
+
+.global YetAnother
+YetAnother:
+ lis r3, YetAnotherTable@h
+ ori r3, r3, YetAnotherTable@l
+ lfsx f0, r3, r0
+ blr
+
+
+
+
+.global GetWeirdScaleTable
+GetWeirdScaleTable:
+ lis r5, WeirdScaleTable@h
+ ori r5, r5, WeirdScaleTable@l
+ lfsx f1, r5, r0
+ blr
+
+
+
+
+
+.global GetAsdfTable
+GetAsdfTable:
+ extsb r0, r4
+ cmpwi r0, -1
+ bne dontGetThisOne
+
+ lwz r0, 0x1090(r3)
+ extsb r4, r0
+
+dontGetThisOne:
+ extsb r0, r4
+
+ lis r3, AsdfTable@h
+ ori r3, r3, AsdfTable@l
+ lbzx r3, r3, r0
+
+ blr
+
+
+
+
+
+.global GetBlahTableOffset
+GetBlahTableOffset:
+ lis r5, BlahTableOffsets@h
+ ori r5, r5, BlahTableOffsets@l
+ lwzx r30, r5, r4
+ blr
+
+
+.global DealWithBlahTable
+DealWithBlahTable:
+ lis r5, BlahTableOffsets@h
+ ori r5, r5, BlahTableOffsets@l
+
+ # points to BlahTable
+ lis r4, BlahTable@h
+ ori r4, r4, BlahTable@l
+
+ # get blahtableoffset entry based on powerup
+ lwz r0, 0x1090(r3)
+ slwi r0, r0, 2
+ lwzx r0, r5, r0
+
+ # now get the entry from the blahtable
+ slwi r0, r0, 2
+ lwzx r4, r4, r0
+
+ # do shit here
+
+ lfs f3, 0(r4)
+ stfs f3, 0x14E4(r3)
+ stfs f3, 0x164(r3)
+
+ lfs f1, 0x2A70(r3)
+ lfs f0, 0x2A74(r3)
+
+ lfs f2, 4(r4)
+ fadds f1, f2, f1
+ fadds f0, f0, f1
+ stfs f0, 0x14E8(r3)
+ stfs f0, 0x168(r3)
+
+ lfs f0, 0x8(r4)
+ lfs f1, 0xC(r4)
+ stfs f0, 0x16C(r3)
+ stfs f1, 0x170(r3)
+
+ # hope I did this right
+ blr
+
+
+
+
+
+.global GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r4_dest
+GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r4_dest:
+ lis r6, PowerupScaleFloats@h
+ ori r6, r6, PowerupScaleFloats@l
+ add r4, r6, r0
+ blr
+
+.global GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest
+GetPowerupScaleFloatAddr_r6_trash_r0_valshl2_r3_dest:
+ lis r6, PowerupScaleFloats@h
+ ori r6, r6, PowerupScaleFloats@l
+ add r3, r6, r0
+ blr
+
+.global GetPowerupScaleFloatAddr_r8_trash_r0_valshl2_r7_dest
+GetPowerupScaleFloatAddr_r8_trash_r0_valshl2_r7_dest:
+ lis r8, PowerupScaleFloats@h
+ ori r8, r8, PowerupScaleFloats@l
+ add r7, r8, r0
+ blr
+
+.global GetPowerupScaleFloatAddr_fixForSixth
+GetPowerupScaleFloatAddr_fixForSixth:
+ lis r5, PowerupScaleFloats@h
+ ori r5, r5, PowerupScaleFloats@l
+ add r4, r5, r4
+ b returnFromGPSFASixth
+
+
+
+.global PlumberSetPowerupFix
+PlumberSetPowerupFix:
+ lbz r0, 0x152(r31) # get powerup id
+
+ cmpwi r0, 2
+ beq doFireTex
+
+ cmpwi r0, 6
+ beq doIceTex
+
+ cmpwi r0, 7
+ beq doHammerTex
+
+ li r4, 0
+ b gotTexID
+
+doFireTex:
+ li r4, 1
+ b gotTexID
+
+doIceTex:
+ li r4, 2
+ b gotTexID
+
+doHammerTex:
+ li r4, 3
+
+gotTexID:
+ lwz r12, 0(r31)
+ mr r3, r31
+ lwz r12, 0x34(r12)
+ mtctr r12
+ bctrl
+
+ b doneSettingThePowerupTexture
+
+
+
+.global PlumberSetPowerupFix2
+PlumberSetPowerupFix2:
+ cmpwi r31, 2
+ beq doFireTex2
+
+ cmpwi r31, 6
+ beq doIceTex2
+
+ cmpwi r31, 7
+ beq doHammerTex2
+
+ li r4, 0
+ b gotTexID2
+
+doFireTex2:
+ li r4, 1
+ b gotTexID2
+
+doIceTex2:
+ li r4, 2
+ b gotTexID2
+
+doHammerTex2:
+ li r4, 3
+
+gotTexID2:
+ lwz r3, 0x2A64(r30)
+ lwz r12, 0(r3)
+ lwz r12, 0x34(r12)
+ mtctr r12
+ bctrl
+
+ b doneSettingThePowerupTexture2
+
+
+
+
+.global PlumberSetPowerupTextureDebug
+.extern OSReport
+.extern continuePlumberSetPowerupTextureDebug
+PlumberSetPowerupTextureDebug:
+ stwu sp, -0x30(sp)
+ mflr r0
+ stw r0, 0x34(sp)
+ stw r3, 0x20(sp)
+ stw r4, 0x24(sp)
+
+ mr r6, r0
+ mr r5, r4
+ mr r4, r3
+ lis r3, PowerupTexDebugStr@h
+ ori r3, r3, PowerupTexDebugStr@l
+ crclr 4*cr1+eq
+ bl OSReport
+
+ lwz r3, 0x20(sp)
+ lwz r4, 0x24(sp)
+ lwz r0, 0x34(sp)
+ mtlr r0
+ addi sp, sp, 0x30
+
+ stwu sp, -0x30(sp)
+
+ b continuePlumberSetPowerupTextureDebug
+
+
+
+
+
+.global PlumberSetPowerupTextureFix
+PlumberSetPowerupTextureFix:
+ stb r4, 0x153(r3)
+
+ lis r5, PowerupTextures@h
+ ori r5, r5, PowerupTextures@l
+
+ slwi r4, r4, 2
+ lfsx f31, r5, r4
+
+ b continuePlumberSetPowerupTexture
+
+
+
+.global SetHammerToEnItemDCA
+SetHammerToEnItemDCA:
+ bl daEnItem_c__GetWhetherPlayerCanGetPowerupOrNot
+ cmpwi r3, 1
+ bne DontSetHammer
+
+ li r0, 5
+ sth r0, 0xDCA(r31)
+
+DontSetHammer:
+ lwz r0, 0x14(sp)
+ lwz r31, 0xC(sp)
+ mtlr r0
+ addi sp, sp, 0x10
+ blr
+
+
+#.global EnItem_BindAnimation_Fix
+#EnItem_BindAnimation_Fix:
+# lhz r0, 0xDCA(r3)
+# cmpwi r0, 5
+# beqlr
+# stwu sp, -0x20(sp)
+# b EnItem_BindAnimation_Continued
+
+
+.global WeirdAnimLoadHack
+WeirdAnimLoadHack:
+ cmplwi r4, 5 #hammersuit
+ beqlr
+ cmplwi r4, 6 #1up
+ beqlr
+ # neither of those succeeded
+ crclr 4*cr0+eq
+ blr
+
+
+
+.global TryToGiveMarioHammerSuit
+TryToGiveMarioHammerSuit:
+ stwu sp, -0x10(sp)
+ mflr r0
+ stw r0, 0x14(sp)
+
+ # check the obtained item number
+ cmplwi r3, 5
+ bne IsntGettingHammerSuit
+
+ # check the current player powerup
+ cmplwi r4, 7
+ bne DontHaveHammerSuit
+
+ li r28, 0
+ li r29, 2
+ b ReturnFromTTGMHS
+
+DontHaveHammerSuit:
+ mr r3, r30
+ li r4, 7
+ bl dAcPy_c__ChangePowerupWithAnimation
+
+ cmpwi r3, 0
+ beq ReturnFromTTGMHS
+
+ li r29, 1
+
+IsntGettingHammerSuit:
+ReturnFromTTGMHS:
+ # end of function
+ lwz r0, 0x14(sp)
+ mtlr r0
+ addi sp, sp, 0x10
+
+ # leftover instruction from what we replaced to add the bl
+ cmpwi r29, 0
+ blr
+
+
+
+.global ThrowHammer
+ThrowHammer:
+ # continues on from PlayerProjectileShooting
+
+ # get powerup
+ lwz r3, 0x1090(r30)
+ cmplwi r3, 7
+ bne ReturnFromThrowHammer
+
+ mr r3, r30
+ li r4, 498
+ li r5, 0
+ bl PlayPlayerSound
+
+ li r3, 0x73 # Hammer
+ li r4, 0 # Settings
+ addi r5, sp, 0x2C # Position
+ li r6, 0 # Rotation
+ lbz r7, 0x38F(r30) # Layer
+ bl CreateActor
+
+ # Store player ID
+ lwz r4, 0(r30)
+ stw r4, 0x450(r3)
+
+ # store player number, but add 0x100 to differentiate it from 0
+ lbz r4, 0x38D(r30)
+ addi r4, r4, 0x100
+ stw r4, 0x458(r3)
+
+ # Fix scale
+ lis r4, OneFloat@h
+ ori r4, r4, OneFloat@l
+ lfs f0, 0(r4)
+ stfs f0, 0xDC(r3)
+ stfs f0, 0xE0(r3)
+ stfs f0, 0xE4(r3)
+
+ mr r4, r30
+ lwz r12, 0x60(r3)
+ lwz r12, 0x8C(r12)
+ mtctr r12
+ bctrl
+
+ReturnFromThrowHammer:
+ lwz r0, 0xC4(sp)
+ psq_l f31, 0xB8(sp), 1, 0
+ lfd f31, 0xB0(sp)
+ psq_l f30, 0xA8(sp), 1, 0
+ lfd f30, 0xA0(sp)
+ lwz r31, 0x9C(sp)
+ lwz r30, 0x98(sp)
+ mtlr r0
+ addi sp, sp, 0xC0
+ blr
+
+
+
+.global MoreProjectileStuff_Fix
+MoreProjectileStuff_Fix:
+ lwz r3, 0x1090(r31)
+ cmplwi r3, 7
+ bne ReturnFromMPSFix
+
+ mr r3, r31
+ li r4, 1
+ bl PlayerProjectileShooting
+
+ReturnFromMPSFix:
+ lwz r0, 0x14(sp)
+ lwz r31, 0xC(sp)
+ mtlr r0
+ addi sp, sp, 0x10
+ blr
+
+
+
+.global ProjectileShootCheck_Fix
+ProjectileShootCheck_Fix:
+ lwz r3, 0x1090(r31)
+ cmplwi r3, 7
+ bne Return0fromPSCFix
+
+ lbz r3, 0x38D(r31)
+ li r4, 0
+ extsb r3, r3
+ bl CheckHammerLimit
+
+ cmpwi r3, 0
+ beq Return0fromPSCFix
+
+ b Return1fromPSCFix
+
+Return0fromPSCFix:
+ li r3, 0
+ b ReturnFromPSCFix
+
+Return1fromPSCFix:
+ li r3, 1
+
+ReturnFromPSCFix:
+ lwz r0, 0x14(sp)
+ lwz r31, 0xC(sp)
+ mtlr r0
+ addi sp, sp, 0x10
+ blr
+
+
+.global CheckHammerLimit
+CheckHammerLimit:
+ stwu sp, -0x10(sp)
+ mflr r0
+ stw r0, 0x14(sp)
+ stw r31, 0xC(sp)
+ stw r30, 0x8(sp)
+
+ # r30 = player number
+ mr r30, r3
+ addi r30, r30, 0x100
+
+ # r31 = hammer count so far
+ li r31, 0
+
+ # search for every Hammer
+
+ li r3, 0
+ b startOrContinueLoop
+loop:
+
+ lwz r4, 0x458(r3)
+ cmpw r4, r30
+ bne startOrContinueLoop
+
+ addi r31, r31, 1
+
+startOrContinueLoop:
+ mr r4, r3
+ li r3, 0x73
+ bl Actor_SearchByName
+
+ cmpwi r3, 0
+ bne loop
+
+ # now if the current count is >= 2, return 0
+ # otherwise return 1
+ cmpwi r31, 2
+ bge tooManyHammers
+
+ li r3, 1
+ b gotHammerStatus
+
+tooManyHammers:
+ li r3, 0
+
+gotHammerStatus:
+ lwz r0, 0x14(sp)
+ lwz r31, 0xC(sp)
+ lwz r30, 0x8(sp)
+ mtlr r0
+ addi sp, sp, 0x10
+ blr
+
+
+
+
+
+
+.data
+
+SomeTable:
+ .long SomeTable_802F5580
+ .long SomeTable_802F56C0
+ .long SomeTable_802F56C0
+ .long SomeTable_802F5440
+ .long SomeTable_802F56C0
+ .long SomeTable_802F56C0
+ .long SomeTable_802F56C0
+ .long SomeTable_802F56C0
+
+ZeroFloat:
+ .float 0.0
+
+OneFloat:
+ .float 1.0
+
+FukidashiTable2:
+ .float 20.0, 32.0, 32.0, 12.0, 38.0, 33.0, 32.0, 32.0
+ .float 20.0, 34.0, 34.0, 12.0, 39.0, 35.0, 34.0, 34.0
+ .float 20.0, 29.0, 29.0, 11.0, 34.0, 29.0, 29.0, 29.0
+ .float 20.0, 29.0, 29.0, 11.0, 34.0, 29.0, 29.0, 29.0
+
+PlayerHeightsNormal:
+ .float 16.0, 27.0, 27.0, 12.0, 27.0, 27.0, 27.0, 27.0
+
+PlayerHeightsDucking:
+ .float 13.0, 21.0, 21.0, 9.0, 21.0, 21.0, 21.0, 21.0
+
+WtfEverTable:
+ .float 4.5, 10.0, 10.0, 1.0, 10.0, 9.0, 10.0, 10.0
+
+YetAnotherTable:
+ .float 0.0, -4.0, -4.0, 4.0, -6.0, -2.0, -4.0, -4.0
+
+WeirdScaleTable:
+ .float 16.0, 31.0, 31.0, 6.0, 34.0, 31.0, 31.0, 31.0
+
+AsdfTable:
+ .byte 1, 2, 2, 0, 2, 2, 2, 2
+
+BlahTableOffsets:
+ .long 1, 2, 2, 0, 3, 2, 2, 2
+
+PowerupScaleFloats:
+ .long 0xDEADBEEF, 0xDEADBEEF # padding
+ .float 1.0
+ .float 1.0
+ .float 1.0
+ .float 0.6
+ .float 1.0
+ .float 1.0
+ .float 1.0
+ .float 1.0
+
+PowerupTextures:
+ .float 0.0
+ .float 1.0
+ .float 2.0
+ .float 3.0
+
+.global BrosArcFileName
+BrosArcFileName:
+ .string "bros"
+
+.global I_hammerArcFilename
+I_hammerArcFilename:
+ .string "I_hammer"
+
+.global I_hammerResFile
+I_hammerResFile:
+# .string "g3d/I_hammer.brres"
+ .string "g3d/I_fireflower.brres"
+
+.global I_hammerModelName
+I_hammerModelName:
+# .string "I_hammer"
+ .string "I_fireflower"
+
+
+PowerupTexDebugStr:
+ .string "Plumber::SetPowerupTexture() called on class %p with texnum %d lr=%p\n"
+
+#.global BrosModelFilename
+#BrosModelFilename:
+# .string "g3d/bros.brres"
+
+#.global HammerModelName
+#HammerModelName:
+# .string "bros_hammer"
diff --git a/src/randomcrap.S b/src/randomcrap.S
index e7b6451..808009b 100644
--- a/src/randomcrap.S
+++ b/src/randomcrap.S
@@ -1,8 +1,8 @@
-.text
-.global HeapChangeAttempt
-HeapChangeAttempt:
- lis 4, 0x8037
- ori 4, 4, 0x7F50
- lwz 4, 0(4)
- blr
-
+.text
+.global HeapChangeAttempt
+HeapChangeAttempt:
+ lis 4, 0x8037
+ ori 4, 4, 0x7F50
+ lwz 4, 0(4)
+ blr
+
diff --git a/src/randtiles.cpp b/src/randtiles.cpp
index c7388dd..0bc2ede 100644
--- a/src/randtiles.cpp
+++ b/src/randtiles.cpp
@@ -1,22 +1,22 @@
-#include "randtiles.h"
-
-u32 djb2(u8 *str) {
- u32 hash = 5381;
- int c;
-
- while (c = *str++)
- hash = ((hash << 5) + hash) + c;
-
- return hash;
-}
-
-RandTiles_Section *RandTiles_Search(void *file, u32 nameHash) {
- for (int i = 0; i < RandTiles_GetSectionCount(file); i++) {
- RandTiles_Section *sect = RandTiles_GetSection(file, i);
-
- if (sect->nameHash == nameHash)
- return sect;
- }
-
- return 0;
-}
+#include "randtiles.h"
+
+u32 djb2(u8 *str) {
+ u32 hash = 5381;
+ int c;
+
+ while (c = *str++)
+ hash = ((hash << 5) + hash) + c;
+
+ return hash;
+}
+
+RandTiles_Section *RandTiles_Search(void *file, u32 nameHash) {
+ for (int i = 0; i < RandTiles_GetSectionCount(file); i++) {
+ RandTiles_Section *sect = RandTiles_GetSection(file, i);
+
+ if (sect->nameHash == nameHash)
+ return sect;
+ }
+
+ return 0;
+}
diff --git a/src/randtiles.h b/src/randtiles.h
index ab2553d..14355da 100644
--- a/src/randtiles.h
+++ b/src/randtiles.h
@@ -1,63 +1,63 @@
-#ifndef __NEWER_RANDTILES_H
-#define __NEWER_RANDTILES_H
-
-#include <common.h>
-#include "fileload.h"
-
-#define RAND_CHECK_HORZ
-#define RAND_CHECK_VERT
-#define RAND_CHECK_BOTH
-
-struct RandTiles_Header {
- u32 magic;
- u32 sectionCount;
-};
-
-struct RandTiles_Section {
- u32 nameHash;
- u32 entryCount;
-};
-
-struct RandTiles_Entry {
- u16 startTile;
- u16 endTile;
- u8 count;
- u8 type;
- u16 reserved;
- u32 dataOffset;
-};
-
-inline u32 RandTiles_GetSectionCount(void *file) {
- return ((RandTiles_Header*)file)->sectionCount;
-}
-
-inline u32 *RandTiles_GetOffsets(void *file) {
- return (u32*)(((RandTiles_Header*)file)+1);
-}
-
-inline RandTiles_Section *RandTiles_GetSection(void *file, int id) {
- u32 offs = RandTiles_GetOffsets(file)[id];
- return (RandTiles_Section*)(((char*)file)+offs);
-};
-
-inline RandTiles_Entry *RandTiles_GetTiles(void *file, RandTiles_Section *section) {
- return (RandTiles_Entry*)(section+1);
-}
-
-inline RandTiles_Entry *RandTiles_GetTiles(void *file, int sectionID) {
- return (RandTiles_Entry*)(RandTiles_GetSection(file, sectionID)+1);
-}
-
-inline char *RandTiles_GetName(void *file, RandTiles_Section *section) {
- return ((char*)file)+section->nameOffset;
-}
-
-inline u16 *RandTiles_GetData(void *file, RandTiles_Entry *entry) {
- return (u16*)(((char*)file)+entry->dataOffset);
-}
-
-u32 djb2(u8 *str);
-RandTiles_Section *RandTiles_Search(void *file, u32 nameHash);
-
-
-#endif
+#ifndef __NEWER_RANDTILES_H
+#define __NEWER_RANDTILES_H
+
+#include <common.h>
+#include "fileload.h"
+
+#define RAND_CHECK_HORZ
+#define RAND_CHECK_VERT
+#define RAND_CHECK_BOTH
+
+struct RandTiles_Header {
+ u32 magic;
+ u32 sectionCount;
+};
+
+struct RandTiles_Section {
+ u32 nameHash;
+ u32 entryCount;
+};
+
+struct RandTiles_Entry {
+ u16 startTile;
+ u16 endTile;
+ u8 count;
+ u8 type;
+ u16 reserved;
+ u32 dataOffset;
+};
+
+inline u32 RandTiles_GetSectionCount(void *file) {
+ return ((RandTiles_Header*)file)->sectionCount;
+}
+
+inline u32 *RandTiles_GetOffsets(void *file) {
+ return (u32*)(((RandTiles_Header*)file)+1);
+}
+
+inline RandTiles_Section *RandTiles_GetSection(void *file, int id) {
+ u32 offs = RandTiles_GetOffsets(file)[id];
+ return (RandTiles_Section*)(((char*)file)+offs);
+};
+
+inline RandTiles_Entry *RandTiles_GetTiles(void *file, RandTiles_Section *section) {
+ return (RandTiles_Entry*)(section+1);
+}
+
+inline RandTiles_Entry *RandTiles_GetTiles(void *file, int sectionID) {
+ return (RandTiles_Entry*)(RandTiles_GetSection(file, sectionID)+1);
+}
+
+inline char *RandTiles_GetName(void *file, RandTiles_Section *section) {
+ return ((char*)file)+section->nameOffset;
+}
+
+inline u16 *RandTiles_GetData(void *file, RandTiles_Entry *entry) {
+ return (u16*)(((char*)file)+entry->dataOffset);
+}
+
+u32 djb2(u8 *str);
+RandTiles_Section *RandTiles_Search(void *file, u32 nameHash);
+
+
+#endif
diff --git a/src/spritespawner.cpp b/src/spritespawner.cpp
index 1d6a071..5335dfe 100755
--- a/src/spritespawner.cpp
+++ b/src/spritespawner.cpp
@@ -1,74 +1,74 @@
-#include <common.h>
-#include <game.h>
-
-struct SpriteSpawner {
- u32 id; // 0x00
- u32 settings; // 0x04
- u16 name; // 0x08
- u8 _0A[6]; // 0x0A
- u8 _10[0x9C]; // 0x10
- float x; // 0xAC
- float y; // 0xB0
- float z; // 0xB4
- u8 _B8[0x318]; // 0xB8
- // Any variables you add to the class go here; starting at offset 0x3D0
- u64 eventFlag; // 0x3D0
- u16 type; // 0x3D4
- u32 inheritSet; // 0x3D6
+#include <common.h>
+#include <game.h>
+
+struct SpriteSpawner {
+ u32 id; // 0x00
+ u32 settings; // 0x04
+ u16 name; // 0x08
+ u8 _0A[6]; // 0x0A
+ u8 _10[0x9C]; // 0x10
+ float x; // 0xAC
+ float y; // 0xB0
+ float z; // 0xB4
+ u8 _B8[0x318]; // 0xB8
+ // Any variables you add to the class go here; starting at offset 0x3D0
+ u64 eventFlag; // 0x3D0
+ u16 type; // 0x3D4
+ u32 inheritSet; // 0x3D6
u8 lastEvState; // 0x3DA
- u32 createdActor;
-};
-
-struct EventTable_t {
- u64 events;
-};
-
-
-struct VEC {
- float x;
- float y;
- float z;
-};
-
-
-extern EventTable_t *EventTable;
+ u32 createdActor;
+};
+
+struct EventTable_t {
+ u64 events;
+};
+
+
+struct VEC {
+ float x;
+ float y;
+ float z;
+};
+
+
+extern EventTable_t *EventTable;
extern "C" dStageActor_c *CreateActor(u16 classID, int settings, VEC pos, char rot, char layer);
extern "C" dStageActor_c *Actor_SearchByID(u32 actorID);
-void SpriteSpawner_Update(SpriteSpawner *self);
-
-#define ACTIVATE 1
-#define DEACTIVATE 0
-
-
-
-
-bool SpriteSpawner_Create(SpriteSpawner *self) {
- OSReport("I exist, dammit!");
-
- char eventNum = (self->settings >> 28) & 0xF;
- OSReport("Event to activate: %d", eventNum);
-
- self->eventFlag = (u64)1 << (eventNum - 1);
- self->createdActor = 0;
- self->type = (self->settings >> 16) & 0xFFF;
-
- short tempSet = self->settings & 0xFFFF;
- self->inheritSet = (tempSet & 3) | ((tempSet & 0xC) << 2) | ((tempSet & 0x30) << 4) | ((tempSet & 0xC0) << 6) | ((tempSet & 0x300) << 8) | ((tempSet & 0xC00) << 10) | ((tempSet & 0x3000) << 12) | ((tempSet & 0xC000) << 14);
-
- SpriteSpawner_Update(self);
-
- return true;
-}
-
-bool SpriteSpawner_Execute(SpriteSpawner *self) {
- SpriteSpawner_Update(self);
- return true;
-}
-
-
-void SpriteSpawner_Update(SpriteSpawner *self) {
-
+void SpriteSpawner_Update(SpriteSpawner *self);
+
+#define ACTIVATE 1
+#define DEACTIVATE 0
+
+
+
+
+bool SpriteSpawner_Create(SpriteSpawner *self) {
+ OSReport("I exist, dammit!");
+
+ char eventNum = (self->settings >> 28) & 0xF;
+ OSReport("Event to activate: %d", eventNum);
+
+ self->eventFlag = (u64)1 << (eventNum - 1);
+ self->createdActor = 0;
+ self->type = (self->settings >> 16) & 0xFFF;
+
+ short tempSet = self->settings & 0xFFFF;
+ self->inheritSet = (tempSet & 3) | ((tempSet & 0xC) << 2) | ((tempSet & 0x30) << 4) | ((tempSet & 0xC0) << 6) | ((tempSet & 0x300) << 8) | ((tempSet & 0xC00) << 10) | ((tempSet & 0x3000) << 12) | ((tempSet & 0xC000) << 14);
+
+ SpriteSpawner_Update(self);
+
+ return true;
+}
+
+bool SpriteSpawner_Execute(SpriteSpawner *self) {
+ SpriteSpawner_Update(self);
+ return true;
+}
+
+
+void SpriteSpawner_Update(SpriteSpawner *self) {
+
if (EventTable->events & self->eventFlag)
{
// Put an action for when the event turns on here
@@ -80,7 +80,7 @@ void SpriteSpawner_Update(SpriteSpawner *self) {
pos.y = self->y;
pos.z = self->z;
- OSReport("Spawning Sprite: %d at %f,%f,%f\n", self->type, pos.x, pos.y, pos.z);
+ OSReport("Spawning Sprite: %d at %f,%f,%f\n", self->type, pos.x, pos.y, pos.z);
dStageActor_c *spawned = CreateActor(self->type, self->inheritSet, pos, 0, 0);
self->createdActor = spawned->id;
@@ -99,5 +99,5 @@ void SpriteSpawner_Update(SpriteSpawner *self) {
}
self->createdActor = 0;
}
- }
+ }
}
diff --git a/src/spriteswapper.cpp b/src/spriteswapper.cpp
new file mode 100755
index 0000000..cbff99f
--- /dev/null
+++ b/src/spriteswapper.cpp
@@ -0,0 +1,144 @@
+#include <common.h>
+#include <game.h>
+
+struct SpriteSwapper {
+ u32 id; // 0x00
+ u32 settings; // 0x04
+ u16 name; // 0x08
+ u8 _0A[6]; // 0x0A
+ u8 _10[0x9C]; // 0x10
+ float x; // 0xAC
+ float y; // 0xB0
+ float z; // 0xB4
+ u8 _B8[0x318]; // 0xB8
+ // Any variables you add to the class go here; starting at offset 0x3D0
+ u64 eventFlag; // 0x3D0
+ u16 firstType; // 0x3D4
+ u16 secondType; // 0x3D4
+ u8 lastEvState; // 0x3DA
+ u32 firstActor;
+ u32 secondActor;
+};
+
+struct EventTable_t {
+ u64 events;
+};
+
+
+struct VEC {
+ float x;
+ float y;
+ float z;
+};
+
+
+extern EventTable_t *EventTable;
+extern "C" dStageActor_c *CreateActor(u16 classID, int settings, VEC pos, char rot, char layer);
+extern "C" dStageActor_c *Actor_SearchByID(u32 actorID);
+
+void SpriteSwapper_Update(SpriteSwapper *self);
+
+#define ACTIVATE 1
+#define DEACTIVATE 0
+
+
+
+
+bool SpriteSwapper_Create(SpriteSwapper *self) {
+ OSReport("I exist, dammit!");
+
+ char eventNum = (self->settings >> 28) & 0xF;
+ OSReport("Event to activate: %d", eventNum);
+
+ self->eventFlag = (u64)1 << (eventNum - 1);
+ self->firstActor = 0;
+ self->secondActor = 0;
+ self->firstType = (self->settings >> 16) & 0xFFF;
+ self->secondType = self->settings & 0xFFF;
+
+ VEC pos;
+ pos.x = self->x;
+ pos.y = self->y;
+ pos.z = self->z;
+
+ OSReport("Spawning first sprite.");
+
+ dStageActor_c *spawned = CreateActor(self->firstType, 0, pos, 0, 0);
+ self->firstActor = spawned->id;
+
+ OSReport("Spawned %d.", self->firstActor);
+
+ SpriteSwapper_Update(self);
+
+ return true;
+}
+
+bool SpriteSwapper_Execute(SpriteSwapper *self) {
+ SpriteSwapper_Update(self);
+ return true;
+}
+
+
+void SpriteSwapper_Update(SpriteSwapper *self) {
+
+ if (EventTable->events & self->eventFlag)
+ {
+ // Put an action for when the event turns on here
+ OSReport("Event turned on.");
+
+ if (self->firstActor != 0)
+ {
+ OSReport("Found the first sprite.");
+
+ dStageActor_c *spawned = Actor_SearchByID(self->firstActor);
+ if (spawned != 0) {
+ OSReport("It's still alive.");
+ self->x = spawned->pos.x;
+ self->y = spawned->pos.y;
+ self->z = spawned->pos.z;
+ spawned->Delete();
+ }
+ self->firstActor = 0;
+ OSReport("Now it's deleted.");
+
+ VEC pos;
+ pos.x = self->x;
+ pos.y = self->y;
+ pos.z = self->z;
+
+ OSReport("Making second sprite.");
+ dStageActor_c *spawner = CreateActor(self->secondType, 0, pos, 0, 0);
+ self->secondActor = spawner->id;
+ OSReport("Spawned %d.", self->secondActor);
+ }
+// EventTable->events = EventTable->events & ~self->eventFlag;
+ }
+ else
+ {
+ OSReport("Event turned off.");
+ if (self->secondActor != 0)
+ {
+ OSReport("Found the second sprite.");
+ dStageActor_c *spawned = Actor_SearchByID(self->secondActor);
+ if (spawned != 0) {
+ OSReport("It's still alive.");
+ self->x = spawned->pos.x;
+ self->y = spawned->pos.y;
+ self->z = spawned->pos.z;
+ spawned->Delete();
+ }
+ self->secondActor = 0;
+ OSReport("Now it's deleted.");
+
+ VEC pos;
+ pos.x = self->x;
+ pos.y = self->y;
+ pos.z = self->z;
+
+ OSReport("Making first sprite again.");
+ dStageActor_c *spawner = CreateActor(self->firstType, 0, pos, 0, 0);
+ self->firstActor = spawner->id;
+ OSReport("Spawned %d.", self->firstActor);
+ }
+ }
+}
diff --git a/src/spritetex.S b/src/spritetex.S
index c636943..75e0256 100755
--- a/src/spritetex.S
+++ b/src/spritetex.S
@@ -1,869 +1,869 @@
-.extern sprintf
-.extern GenerateRandomNumber
-
-#ifndef __MWERKS__
-.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
-.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
-.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
-.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
-.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
-.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
-.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
-#endif
-
-.text
-.align 4
-.global GetTexFilenameForR5, TexFilenameBuffer, TexFormatString
-
-.set sp, 1
-
-GetTexFilenameForR5:
- # obj number should be put into r5
- # returned filename is in r5
- # this makes it easy to use with dRes_c::GetResource
-
- stwu sp, -0x20(sp)
- mflr r0
- stw r0, 0x24(sp)
- stw r3, 0x1C(sp)
- stw r4, 0x18(sp)
- stw r6, 0x14(sp)
- stw r7, 0x10(sp)
- stw r8, 0xC(sp)
- stw r9, 0x8(sp)
-
- lis r3, TexFilenameBuffer@h
- ori r3, r3, TexFilenameBuffer@l
-
- lis r4, TexFormatString@h
- ori r4, r4, TexFormatString@l
-
- crclr 4*cr1+eq
- bl sprintf
-
- lis r5, TexFilenameBuffer@h
- ori r5, r5, TexFilenameBuffer@l
-
- lwz r0, 0x24(sp)
- lwz r3, 0x1C(sp)
- lwz r4, 0x18(sp)
- lwz r6, 0x14(sp)
- lwz r7, 0x10(sp)
- lwz r8, 0xC(sp)
- lwz r9, 0x8(sp)
- mtlr r0
- addi sp, sp, 0x20
- blr
-
-
-.global TEX_YoshiEggSetColour
-TEX_YoshiEggSetColour:
-
- stwu sp, -0x30(sp)
- mflr r0
- stw r0, 0x24(sp)
- mr r9, r3
- stw r4, 0x18(sp)
- stw r5, 0x14(sp)
- stw r6, 0x10(sp)
- stw r7, 0x0C(sp)
-
- li r3, 10
- bl GenerateRandomNumber
- stw r3, 0x5F8(r9)
-
- lwz r0, 0x24(sp)
- mr r3, r9
- lwz r4, 0x18(sp)
- lwz r5, 0x14(sp)
- lwz r6, 0x10(sp)
- lwz r7, 0x0C(sp)
- mtlr r0
- addi sp, sp, 0x30
- blr
-
-
-.global TEX_YoshiEggSetBrres
-TEX_YoshiEggSetBrres:
-
- lwz r5, 0x5F8(r27)
- clrlwi r5, r5, 28
-
- cmpwi r5, 4
- blt YoshiEggOne
-
- cmpwi r5, 8
- blt YoshiEggTwo
-
- li r5, 2
- b GetTexFilenameForR5
-
-
-YoshiEggOne:
- li r5, 0
- b GetTexFilenameForR5
-
-YoshiEggTwo:
- li r5, 1
- b GetTexFilenameForR5
-
-
-
-.global TEX_YoshiEggSetFrame
-TEX_YoshiEggSetFrame:
-
- lwz r5, 0x5F8(r27)
- clrlwi r5, r5, 30
- blr
-
-
-.global TEX_YoshiEggEffect
-TEX_YoshiEggEffect:
-
- lwz r0, 0x5F8(r3)
- clrlwi r0, r0, 30
- blr
-
-
-.global TEX_YoshiSetColour
-TEX_YoshiSetColour:
-
- lwz r4, 0x5F8(r31)
- oris r4, r4, 1
- blr
-
-
-.global TEX_YoshiHack
-TEX_YoshiHack:
-
- stwu sp, -0x30(sp)
- mflr r0
- stw r0, 0x24(sp)
- stw r3, 0x1C(sp)
- stw r4, 0x18(sp)
- stw r5, 0x14(sp)
- stw r6, 0x10(sp)
- stw r7, 0x0C(sp)
- stw r8, 0x08(sp)
- stw r9, 0x04(sp)
-
- lwz r5, 0x24C(r31)
- clrlwi r5, r5, 28
-
- lis r3, TexFilenameBuffer@h
- ori r3, r3, TexFilenameBuffer@l
-
- lis r4, TexFormatString@h
- ori r4, r4, TexFormatString@l
-
- crclr 4*cr1+eq
- bl sprintf
-
- lis r5, TexFilenameBuffer@h
- ori r5, r5, TexFilenameBuffer@l
-
- lis r4, YoshiArc@h
- ori r4, r4, YoshiArc@l
-
- lwz r0, 0x24(sp)
- lwz r3, 0x1C(sp)
- lwz r6, 0x10(sp)
- lwz r7, 0x0C(sp)
- lwz r8, 0x08(sp)
- lwz r9, 0x04(sp)
- mtlr r0
- addi sp, sp, 0x30
- blr
-
-
-
-
-.global TEX_WoodBox
-TEX_WoodBox:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- b GetTexFilenameForR5
-
-
-.global TEX_Bush
-TEX_Bush:
- srwi r5, r27, 28
- b GetTexFilenameForR5
-
-
-# The below was added by Tempus
-
-
-.global TEX_Goomba
-TEX_Goomba:
- lwz r5, 4(r3)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_BigGoomba
-TEX_BigGoomba:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Barrel
-TEX_Barrel:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Blooper
-TEX_Blooper:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_BigBlock
-TEX_BigBlock:
- lwz r5, 4(r28)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Thwomp
-TEX_Thwomp:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_GiantBuzzy
-TEX_GiantBuzzy:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Buzzy
-TEX_Buzzy:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-.global TEX_BuzzyShell
-TEX_BuzzyShell:
- lwz r5, 4(r3)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_SpikeTop
-TEX_SpikeTop:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Spiny
-TEX_Spiny:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_SpinyShell
-TEX_SpinyShell:
- lwz r5, 4(r3)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_SpringBlock
-TEX_SpringBlock:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Coaster
-TEX_Coaster:
- lwz r5, 4(r3)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Koopa
-TEX_Koopa:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Gabon
-TEX_Gabon:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Gabon_Spike
-TEX_Gabon_Spike:
- andis. r4, r4, 0xFFF0
- blr
-
-.global TEX_GabonRock
-TEX_GabonRock:
- lwz r5, 4(r28)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Podoboo
-TEX_Podoboo:
- lwz r5, 4(r31)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Switch
-TEX_Switch:
- lwz r5, 4(r29)
- srwi r5, r5, 16
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_WiggleShroom
-TEX_WiggleShroom:
- lwz r5, -0x520(r3)
- # This sprite is pretty complex
- # The register with THIS is r29
- # before the loading function,
- # it passes it into r3, and then mr's
- # it into r30. r3 is then overwritten.
- # Then, it puts r31 into r5, r30 partly
- # into r3 and partly into r4. Why?
- # So, the possibilities for THIS are
- # r30, r3, and r4, no? In the next function,
- # r30 is stored over before our getFile, as
- # are r29/r28.
-
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Bramball
-TEX_Bramball:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Monty
-TEX_Monty:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_ChainChomp
-TEX_ChainChomp:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Manta
-TEX_Manta:
- lwz r5, 4(r28)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Parabeetle
-TEX_Parabeetle:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Bomb
-TEX_Bomb:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_ParaBomb
-TEX_ParaBomb:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_CheepA
-TEX_CheepA:
- lwz r5, 4(r27)
- srwi r5, r5, 20
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_CheepB
-TEX_CheepB:
- lwz r5, 4(r28)
- srwi r5, r5, 20
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_CheepC
-TEX_CheepC:
- lwz r5, 4(r28)
- srwi r5, r5, 20
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_CheepChomp
-TEX_CheepChomp:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_BigBoo
-TEX_BigBoo:
- lwz r5, 4(r27)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-.global TEX_Boo
-TEX_Boo:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-.global TEX_Midway
-TEX_Midway:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xFF
- b GetTexFilenameForR5
-
-
-.global TEX_Goal
-TEX_Goal:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_StretchMush
-TEX_StretchMush:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_BlockSlide
-TEX_BlockSlide:
- lwz r5, 4(r28)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Spinner
-TEX_Spinner:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Platforms
-TEX_Platforms:
-
- li r5, 1
- b GetTexFilenameForR5
-# cmpwi r0, 9
-# blt ReplacePlatforms
-#
-# lwzx r5, r5, r0
-# blr
-
-
-ReplacePlatforms:
-
- lwz r5, 4(r29)
- srwi r5, r5, 4
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Platform_ShifterH
-TEX_Platform_ShifterH:
-
- stw r5, 0x504(r30)
- lwz r5, 4(r30)
- stw r5, 0x3D8(r30)
- blr
-
-.global TEX_Platform_ShifterF
-TEX_Platform_ShifterF:
-
- stw r4, 0x504(r30)
- lwz r4, 4(r30)
- stw r4, 0x3D8(r30)
- blr
-
-.global TEX_Platform_ShifterL
-TEX_Platform_ShifterL:
-
- stw r5, 0x504(r28)
- lwz r5, 4(r28)
- stw r5, 0x3D8(r28)
- blr
-
-.global TEX_Platform_ShifterR
-TEX_Platform_ShifterR:
-
- stw r4, 0x504(r31)
- lwz r4, 4(r31)
- stw r4, 0x3D8(r31)
- blr
-
-.global TEX_Platform_ShifterS
-TEX_Platform_ShifterS:
-
- stw r30, 0x4C4(r27)
- lwz r30, 4(r27)
- stw r30, 0x398(r27)
- blr
-
-.global TEX_Platform_ShifterK
-TEX_Platform_ShifterK:
-
- stw r4, 0x5A4(r27)
- lwz r4, 4(r27)
- stw r4, 0x478(r27)
- blr
-
-.global TEX_Platform_ShifterW
-TEX_Platform_ShifterW:
-
- stw r0, 0x504(r29)
- lwz r0, 4(r29)
- stw r0, 0x3D8(r29)
- blr
-
-.global TEX_Platform_ShifterSL
-TEX_Platform_ShifterSL:
-
- stw r4, 0x504(r29)
- lwz r4, 4(r29)
- stw r4, 0x3D8(r29)
- blr
-
-
-
-
-.global TEX_PokeyA
-TEX_PokeyA:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_PokeyB
-TEX_PokeyB:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
-
- b GetTexFilenameForR5
-
-
-.global TEX_PokeySnowman
-TEX_PokeySnowman:
-
- lwz r10, 4(r30)
- srwi r10, r10, 24
- andi. r10, r10, 0xF
-
- cmpwi r10, 0x2
- bne SnowmanPokey
-
- lwz r10, 4(r30)
- # r10 is the current height
- andi. r10, r10, 0xF
-
- # Find it
- lis r11, SnowmanTable@h
- ori r11, r11, SnowmanTable@l
- slwi r10, r10, 2 # size *= 4 (size of float)
- lfsx f0, r11, r10 # get it from the array
-
- blr
-
-
-SnowmanPokey:
-
- lfs f0, 0x54(r31)
- blr
-
-
-
-
-.global TEX_PokeySnowmanPosF
-TEX_PokeySnowmanPosF:
-
- lwz r10, 4(r31)
- andi. r10, r10, 0xF
-
- lis r11, SnowmanTable@h
- ori r11, r11, SnowmanTable@l
- slwi r10, r10, 2 # size *= 4 (size of float)
- lfsx f2, r11, r10 # get it from the array
-
- fmuls f0, f0, f2
- stfs f0, 0xB0(r30)
- blr
-
-.global TEX_PokeySnowmanPosE
-TEX_PokeySnowmanPosE:
-
- lwz r10, 4(r31)
- andi. r10, r10, 0xF
-
- lis r11, SnowmanTable@h
- ori r11, r11, SnowmanTable@l
- slwi r10, r10, 2 # size *= 4 (size of float)
- lfsx f2, r11, r10 # get it from the array
-
- fmuls f31, f31, f2
- stfs f31, 0xB0(r29)
- blr
-
-.global TEX_PokeySnowmanPosD
-TEX_PokeySnowmanPosD:
-
- lwz r10, 4(r31)
- andi. r10, r10, 0xF
-
- lis r11, SnowmanTable@h
- ori r11, r11, SnowmanTable@l
- slwi r10, r10, 2 # size *= 4 (size of float)
- lfsx f2, r11, r10 # get it from the array
-
- fmuls f1, f1, f2
- stfs f1, 0xB0(r30)
- blr
-
-
-.global TEX_PokeySnowmanPosC
-TEX_PokeySnowmanPosC:
-
- lwz r10, 4(r31)
- andi. r10, r10, 0xF
-
- lis r11, SnowmanTable@h
- ori r11, r11, SnowmanTable@l
- slwi r10, r10, 2 # size *= 4 (size of float)
- lfsx f2, r11, r10 # get it from the array
-
- fmuls f0, f0, f2
- stfs f0, 0xB0(r31)
- blr
-
-
-.global TEX_PokeySnowmanPosB
-TEX_PokeySnowmanPosB:
-
- lwz r10, 4(r31)
- andi. r10, r10, 0xF
-
- lis r11, SnowmanTable@h
- ori r11, r11, SnowmanTable@l
- slwi r10, r10, 2 # size *= 4 (size of float)
- lfsx f0, r11, r10 # get it from the array
-
- fmuls f1, f1, f0
- stfs f1, 0x18(r1)
- blr
-
-
-
-.global TEX_PokeySnowmanPosA
-TEX_PokeySnowmanPosA:
-
- lwz r10, 4(r31)
- andi. r10, r10, 0xF
-
- lis r11, SnowmanTable@h
- ori r11, r11, SnowmanTable@l
- slwi r10, r10, 2 # size *= 4 (size of float)
- lfsx f0, r11, r10 # get it from the array
-
- fmuls f3, f3, f0
- stfs f3, 0x168(r31)
- blr
-
-
-.global TEX_PokeySnowmanPos
-TEX_PokeySnowmanPos:
-
- mr r3, r30
-
- lwz r10, 4(r30)
- andi. r10, r10, 0xF
-
- lis r11, SnowmanTable@h
- ori r11, r11, SnowmanTable@l
- slwi r10, r10, 2 # size *= 4 (size of float)
- lfsx f0, r11, r10 # get it from the array
-
- lis r5, AddAmount@h
- ori r5, r5, AddAmount@l
- slwi r6, r6, 2 # size *= 4 (size of float)
- lfsx f3, r5, r6 # get it from the array
-
- lfs f2, 0xB0(r30)
- fmuls f3, f3, f0
- fmuls f3, f3, f0
- fmuls f3, f3, f0
- fsubs f2, f2, f3
- stfs f2, 0xB0(r30)
-
- blr
-
-SnowmanPokeyPos:
-
- fsubs f0, f0, f31
- fsubs f0, f0, f31
- fsubs f1, f1, f31
- fsubs f1, f1, f31
-
-
- lfs f2, 8(r1)
- fadds f2, f2, f31
- stfs f2, 8(r1)
- blr
-
-
-.global TEX_PokeyC
-TEX_PokeyC:
-
- lwz r5, 4(r30)
- andis. r5, r5, 0xFFF0
- or r5, r5, r31
- or r5, r5, r0
-
- lwz r0, 0x524(r30)
- slwi r0, r0, 8
- or r5, r5, r0
-
- blr
-
-
-.global TEX_PokeyNoSand
-TEX_PokeyNoSand:
- cmpwi r3, 0x20
- blr
-
-
-
-.global TEX_CloudBounce
-TEX_CloudBounce:
- lwz r5, 4(r28)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_SpikeBall
-TEX_SpikeBall:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_Huckit
-TEX_Huckit:
- lwz r5, 4(r29)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-.global TEX_HuckitBalls
-TEX_HuckitBalls:
- lwz r5, 4(r30)
- srwi r5, r5, 24
- andi. r5, r5, 0xF
- b GetTexFilenameForR5
-
-
-
-
-
-.global HammerTime
-HammerTime:
- lwz r8, 4(r31)
+.extern sprintf
+.extern GenerateRandomNumber
+
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+#endif
+
+.text
+.align 4
+.global GetTexFilenameForR5, TexFilenameBuffer, TexFormatString
+
+.set sp, 1
+
+GetTexFilenameForR5:
+ # obj number should be put into r5
+ # returned filename is in r5
+ # this makes it easy to use with dRes_c::GetResource
+
+ stwu sp, -0x20(sp)
+ mflr r0
+ stw r0, 0x24(sp)
+ stw r3, 0x1C(sp)
+ stw r4, 0x18(sp)
+ stw r6, 0x14(sp)
+ stw r7, 0x10(sp)
+ stw r8, 0xC(sp)
+ stw r9, 0x8(sp)
+
+ lis r3, TexFilenameBuffer@h
+ ori r3, r3, TexFilenameBuffer@l
+
+ lis r4, TexFormatString@h
+ ori r4, r4, TexFormatString@l
+
+ crclr 4*cr1+eq
+ bl sprintf
+
+ lis r5, TexFilenameBuffer@h
+ ori r5, r5, TexFilenameBuffer@l
+
+ lwz r0, 0x24(sp)
+ lwz r3, 0x1C(sp)
+ lwz r4, 0x18(sp)
+ lwz r6, 0x14(sp)
+ lwz r7, 0x10(sp)
+ lwz r8, 0xC(sp)
+ lwz r9, 0x8(sp)
+ mtlr r0
+ addi sp, sp, 0x20
+ blr
+
+
+.global TEX_YoshiEggSetColour
+TEX_YoshiEggSetColour:
+
+ stwu sp, -0x30(sp)
+ mflr r0
+ stw r0, 0x24(sp)
+ mr r9, r3
+ stw r4, 0x18(sp)
+ stw r5, 0x14(sp)
+ stw r6, 0x10(sp)
+ stw r7, 0x0C(sp)
+
+ li r3, 10
+ bl GenerateRandomNumber
+ stw r3, 0x5F8(r9)
+
+ lwz r0, 0x24(sp)
+ mr r3, r9
+ lwz r4, 0x18(sp)
+ lwz r5, 0x14(sp)
+ lwz r6, 0x10(sp)
+ lwz r7, 0x0C(sp)
+ mtlr r0
+ addi sp, sp, 0x30
+ blr
+
+
+.global TEX_YoshiEggSetBrres
+TEX_YoshiEggSetBrres:
+
+ lwz r5, 0x5F8(r27)
+ clrlwi r5, r5, 28
+
+ cmpwi r5, 4
+ blt YoshiEggOne
+
+ cmpwi r5, 8
+ blt YoshiEggTwo
+
+ li r5, 2
+ b GetTexFilenameForR5
+
+
+YoshiEggOne:
+ li r5, 0
+ b GetTexFilenameForR5
+
+YoshiEggTwo:
+ li r5, 1
+ b GetTexFilenameForR5
+
+
+
+.global TEX_YoshiEggSetFrame
+TEX_YoshiEggSetFrame:
+
+ lwz r5, 0x5F8(r27)
+ clrlwi r5, r5, 30
+ blr
+
+
+.global TEX_YoshiEggEffect
+TEX_YoshiEggEffect:
+
+ lwz r0, 0x5F8(r3)
+ clrlwi r0, r0, 30
+ blr
+
+
+.global TEX_YoshiSetColour
+TEX_YoshiSetColour:
+
+ lwz r4, 0x5F8(r31)
+ oris r4, r4, 1
+ blr
+
+
+.global TEX_YoshiHack
+TEX_YoshiHack:
+
+ stwu sp, -0x30(sp)
+ mflr r0
+ stw r0, 0x24(sp)
+ stw r3, 0x1C(sp)
+ stw r4, 0x18(sp)
+ stw r5, 0x14(sp)
+ stw r6, 0x10(sp)
+ stw r7, 0x0C(sp)
+ stw r8, 0x08(sp)
+ stw r9, 0x04(sp)
+
+ lwz r5, 0x24C(r31)
+ clrlwi r5, r5, 28
+
+ lis r3, TexFilenameBuffer@h
+ ori r3, r3, TexFilenameBuffer@l
+
+ lis r4, TexFormatString@h
+ ori r4, r4, TexFormatString@l
+
+ crclr 4*cr1+eq
+ bl sprintf
+
+ lis r5, TexFilenameBuffer@h
+ ori r5, r5, TexFilenameBuffer@l
+
+ lis r4, YoshiArc@h
+ ori r4, r4, YoshiArc@l
+
+ lwz r0, 0x24(sp)
+ lwz r3, 0x1C(sp)
+ lwz r6, 0x10(sp)
+ lwz r7, 0x0C(sp)
+ lwz r8, 0x08(sp)
+ lwz r9, 0x04(sp)
+ mtlr r0
+ addi sp, sp, 0x30
+ blr
+
+
+
+
+.global TEX_WoodBox
+TEX_WoodBox:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ b GetTexFilenameForR5
+
+
+.global TEX_Bush
+TEX_Bush:
+ srwi r5, r27, 28
+ b GetTexFilenameForR5
+
+
+# The below was added by Tempus
+
+
+.global TEX_Goomba
+TEX_Goomba:
+ lwz r5, 4(r3)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_BigGoomba
+TEX_BigGoomba:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Barrel
+TEX_Barrel:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Blooper
+TEX_Blooper:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_BigBlock
+TEX_BigBlock:
+ lwz r5, 4(r28)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Thwomp
+TEX_Thwomp:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_GiantBuzzy
+TEX_GiantBuzzy:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Buzzy
+TEX_Buzzy:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+.global TEX_BuzzyShell
+TEX_BuzzyShell:
+ lwz r5, 4(r3)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_SpikeTop
+TEX_SpikeTop:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Spiny
+TEX_Spiny:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_SpinyShell
+TEX_SpinyShell:
+ lwz r5, 4(r3)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_SpringBlock
+TEX_SpringBlock:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Coaster
+TEX_Coaster:
+ lwz r5, 4(r3)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Koopa
+TEX_Koopa:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Gabon
+TEX_Gabon:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Gabon_Spike
+TEX_Gabon_Spike:
+ andis. r4, r4, 0xFFF0
+ blr
+
+.global TEX_GabonRock
+TEX_GabonRock:
+ lwz r5, 4(r28)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Podoboo
+TEX_Podoboo:
+ lwz r5, 4(r31)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Switch
+TEX_Switch:
+ lwz r5, 4(r29)
+ srwi r5, r5, 16
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_WiggleShroom
+TEX_WiggleShroom:
+ lwz r5, -0x520(r3)
+ # This sprite is pretty complex
+ # The register with THIS is r29
+ # before the loading function,
+ # it passes it into r3, and then mr's
+ # it into r30. r3 is then overwritten.
+ # Then, it puts r31 into r5, r30 partly
+ # into r3 and partly into r4. Why?
+ # So, the possibilities for THIS are
+ # r30, r3, and r4, no? In the next function,
+ # r30 is stored over before our getFile, as
+ # are r29/r28.
+
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Bramball
+TEX_Bramball:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Monty
+TEX_Monty:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_ChainChomp
+TEX_ChainChomp:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Manta
+TEX_Manta:
+ lwz r5, 4(r28)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Parabeetle
+TEX_Parabeetle:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Bomb
+TEX_Bomb:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_ParaBomb
+TEX_ParaBomb:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_CheepA
+TEX_CheepA:
+ lwz r5, 4(r27)
+ srwi r5, r5, 20
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_CheepB
+TEX_CheepB:
+ lwz r5, 4(r28)
+ srwi r5, r5, 20
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_CheepC
+TEX_CheepC:
+ lwz r5, 4(r28)
+ srwi r5, r5, 20
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_CheepChomp
+TEX_CheepChomp:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_BigBoo
+TEX_BigBoo:
+ lwz r5, 4(r27)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+.global TEX_Boo
+TEX_Boo:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+.global TEX_Midway
+TEX_Midway:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xFF
+ b GetTexFilenameForR5
+
+
+.global TEX_Goal
+TEX_Goal:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_StretchMush
+TEX_StretchMush:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_BlockSlide
+TEX_BlockSlide:
+ lwz r5, 4(r28)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Spinner
+TEX_Spinner:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Platforms
+TEX_Platforms:
+
+ li r5, 1
+ b GetTexFilenameForR5
+# cmpwi r0, 9
+# blt ReplacePlatforms
+#
+# lwzx r5, r5, r0
+# blr
+
+
+ReplacePlatforms:
+
+ lwz r5, 4(r29)
+ srwi r5, r5, 4
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Platform_ShifterH
+TEX_Platform_ShifterH:
+
+ stw r5, 0x504(r30)
+ lwz r5, 4(r30)
+ stw r5, 0x3D8(r30)
+ blr
+
+.global TEX_Platform_ShifterF
+TEX_Platform_ShifterF:
+
+ stw r4, 0x504(r30)
+ lwz r4, 4(r30)
+ stw r4, 0x3D8(r30)
+ blr
+
+.global TEX_Platform_ShifterL
+TEX_Platform_ShifterL:
+
+ stw r5, 0x504(r28)
+ lwz r5, 4(r28)
+ stw r5, 0x3D8(r28)
+ blr
+
+.global TEX_Platform_ShifterR
+TEX_Platform_ShifterR:
+
+ stw r4, 0x504(r31)
+ lwz r4, 4(r31)
+ stw r4, 0x3D8(r31)
+ blr
+
+.global TEX_Platform_ShifterS
+TEX_Platform_ShifterS:
+
+ stw r30, 0x4C4(r27)
+ lwz r30, 4(r27)
+ stw r30, 0x398(r27)
+ blr
+
+.global TEX_Platform_ShifterK
+TEX_Platform_ShifterK:
+
+ stw r4, 0x5A4(r27)
+ lwz r4, 4(r27)
+ stw r4, 0x478(r27)
+ blr
+
+.global TEX_Platform_ShifterW
+TEX_Platform_ShifterW:
+
+ stw r0, 0x504(r29)
+ lwz r0, 4(r29)
+ stw r0, 0x3D8(r29)
+ blr
+
+.global TEX_Platform_ShifterSL
+TEX_Platform_ShifterSL:
+
+ stw r4, 0x504(r29)
+ lwz r4, 4(r29)
+ stw r4, 0x3D8(r29)
+ blr
+
+
+
+
+.global TEX_PokeyA
+TEX_PokeyA:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_PokeyB
+TEX_PokeyB:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+
+ b GetTexFilenameForR5
+
+
+.global TEX_PokeySnowman
+TEX_PokeySnowman:
+
+ lwz r10, 4(r30)
+ srwi r10, r10, 24
+ andi. r10, r10, 0xF
+
+ cmpwi r10, 0x2
+ bne SnowmanPokey
+
+ lwz r10, 4(r30)
+ # r10 is the current height
+ andi. r10, r10, 0xF
+
+ # Find it
+ lis r11, SnowmanTable@h
+ ori r11, r11, SnowmanTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f0, r11, r10 # get it from the array
+
+ blr
+
+
+SnowmanPokey:
+
+ lfs f0, 0x54(r31)
+ blr
+
+
+
+
+.global TEX_PokeySnowmanPosF
+TEX_PokeySnowmanPosF:
+
+ lwz r10, 4(r31)
+ andi. r10, r10, 0xF
+
+ lis r11, SnowmanTable@h
+ ori r11, r11, SnowmanTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f2, r11, r10 # get it from the array
+
+ fmuls f0, f0, f2
+ stfs f0, 0xB0(r30)
+ blr
+
+.global TEX_PokeySnowmanPosE
+TEX_PokeySnowmanPosE:
+
+ lwz r10, 4(r31)
+ andi. r10, r10, 0xF
+
+ lis r11, SnowmanTable@h
+ ori r11, r11, SnowmanTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f2, r11, r10 # get it from the array
+
+ fmuls f31, f31, f2
+ stfs f31, 0xB0(r29)
+ blr
+
+.global TEX_PokeySnowmanPosD
+TEX_PokeySnowmanPosD:
+
+ lwz r10, 4(r31)
+ andi. r10, r10, 0xF
+
+ lis r11, SnowmanTable@h
+ ori r11, r11, SnowmanTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f2, r11, r10 # get it from the array
+
+ fmuls f1, f1, f2
+ stfs f1, 0xB0(r30)
+ blr
+
+
+.global TEX_PokeySnowmanPosC
+TEX_PokeySnowmanPosC:
+
+ lwz r10, 4(r31)
+ andi. r10, r10, 0xF
+
+ lis r11, SnowmanTable@h
+ ori r11, r11, SnowmanTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f2, r11, r10 # get it from the array
+
+ fmuls f0, f0, f2
+ stfs f0, 0xB0(r31)
+ blr
+
+
+.global TEX_PokeySnowmanPosB
+TEX_PokeySnowmanPosB:
+
+ lwz r10, 4(r31)
+ andi. r10, r10, 0xF
+
+ lis r11, SnowmanTable@h
+ ori r11, r11, SnowmanTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f0, r11, r10 # get it from the array
+
+ fmuls f1, f1, f0
+ stfs f1, 0x18(r1)
+ blr
+
+
+
+.global TEX_PokeySnowmanPosA
+TEX_PokeySnowmanPosA:
+
+ lwz r10, 4(r31)
+ andi. r10, r10, 0xF
+
+ lis r11, SnowmanTable@h
+ ori r11, r11, SnowmanTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f0, r11, r10 # get it from the array
+
+ fmuls f3, f3, f0
+ stfs f3, 0x168(r31)
+ blr
+
+
+.global TEX_PokeySnowmanPos
+TEX_PokeySnowmanPos:
+
+ mr r3, r30
+
+ lwz r10, 4(r30)
+ andi. r10, r10, 0xF
+
+ lis r11, SnowmanTable@h
+ ori r11, r11, SnowmanTable@l
+ slwi r10, r10, 2 # size *= 4 (size of float)
+ lfsx f0, r11, r10 # get it from the array
+
+ lis r5, AddAmount@h
+ ori r5, r5, AddAmount@l
+ slwi r6, r6, 2 # size *= 4 (size of float)
+ lfsx f3, r5, r6 # get it from the array
+
+ lfs f2, 0xB0(r30)
+ fmuls f3, f3, f0
+ fmuls f3, f3, f0
+ fmuls f3, f3, f0
+ fsubs f2, f2, f3
+ stfs f2, 0xB0(r30)
+
+ blr
+
+SnowmanPokeyPos:
+
+ fsubs f0, f0, f31
+ fsubs f0, f0, f31
+ fsubs f1, f1, f31
+ fsubs f1, f1, f31
+
+
+ lfs f2, 8(r1)
+ fadds f2, f2, f31
+ stfs f2, 8(r1)
+ blr
+
+
+.global TEX_PokeyC
+TEX_PokeyC:
+
+ lwz r5, 4(r30)
+ andis. r5, r5, 0xFFF0
+ or r5, r5, r31
+ or r5, r5, r0
+
+ lwz r0, 0x524(r30)
+ slwi r0, r0, 8
+ or r5, r5, r0
+
+ blr
+
+
+.global TEX_PokeyNoSand
+TEX_PokeyNoSand:
+ cmpwi r3, 0x20
+ blr
+
+
+
+.global TEX_CloudBounce
+TEX_CloudBounce:
+ lwz r5, 4(r28)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_SpikeBall
+TEX_SpikeBall:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_Huckit
+TEX_Huckit:
+ lwz r5, 4(r29)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+.global TEX_HuckitBalls
+TEX_HuckitBalls:
+ lwz r5, 4(r30)
+ srwi r5, r5, 24
+ andi. r5, r5, 0xF
+ b GetTexFilenameForR5
+
+
+
+
+
+.global HammerTime
+HammerTime:
+ lwz r8, 4(r31)
srwi r8, r8, 8
andi. r8, r8, 0xF
cmpwi r8, 1
- beq ThrowBobomb
+ beq ThrowBobomb
cmpwi r8, 2
- beq ThrowGoomba
+ beq ThrowGoomba
cmpwi r8, 3
- beq ThrowSpiny
+ beq ThrowSpiny
cmpwi r8, 4
- beq ThrowCoin
+ beq ThrowCoin
cmpwi r8, 5
- beq ThrowLemmyBall
-
- blr
-
+ beq ThrowLemmyBall
+
+ blr
+
ThrowBobomb:
li r3, 133
@@ -883,37 +883,37 @@ ThrowSpiny:
ThrowCoin:
li r3, 10
- mflr r8
+ mflr r8
mr r9, r5
- bl GenerateRandomNumber
+ bl GenerateRandomNumber
mr r5, r9
- mtlr r8
- cmpwi r3, 1
- beq ThrowItem
-
+ mtlr r8
+ cmpwi r3, 1
+ beq ThrowItem
+
li r3, 0x193
li r4, 0
li r6, 0
li r7, 0
blr
-
-ThrowItem:
+
+ThrowItem:
li r3, 6
- mflr r8
+ mflr r8
mr r9, r5
- bl GenerateRandomNumber
+ bl GenerateRandomNumber
mtlr r8
mr r5, r9
- li r4, 0
+ li r4, 0
- mr r4, r3
- li r3, 0x3C
+ mr r4, r3
+ li r3, 0x3C
li r6, 0
li r7, 0
- blr
-
+ blr
+
ThrowLemmyBall:
li r3, 0x232
@@ -921,156 +921,156 @@ ThrowLemmyBall:
blr
-
-
-.global HammerLaunch
-HammerLaunch:
- mr r3, r30
- # r31 is the new actor currently
- # r30 is self, all others are volatile
-
- lwz r5, 4(r30)
- lwz r8, 0x348(r30)
-
- srwi r5, r5, 8
- andi. r5, r5, 0xF
-
- cmpwi r5, 0
- beqlr
-
- lis r7, LaunchAngle@h
- ori r7, r7, LaunchAngle@l
-
-# lfs f0, 0(r7)
-# stfs f0, 0xDC(r31)
-# stfs f0, 0xE0(r31)
-# stfs f0, 0xE4(r31)
-
- # Nybble 11 is for y right now
- li r6, 0
- slwi r6, r6, 2 # size *= 4 (size of float)
- lfsx f0, r7, r6 # get it from the array
-
- stfs f0, 0xEC(r31)
-
- cmpwi r5, 5
- beq LemmyLaunch
-
- li r6, 1
- slwi r6, r6, 2 # size *= 4 (size of float)
-
- cmpwi r8, 0
- bne FacingLeft
-
- # Nybble 12 is for x right now
- lfsx f0, r7, r6 # get it from the array
-
- stfs f0, 0xE8(r31)
-
- blr
-
-
-FacingLeft:
-
- lis r7, LaunchAngleLeft@h
- ori r7, r7, LaunchAngleLeft@l
-
- # Nybble 12 is for x right now
- lfsx f0, r7, r6 # get it from the array
-
- stfs f0, 0xE8(r31)
- li r7, 270
- sth r7, 0x102(r31)
-
- blr
-
-
-LemmyLaunch:
-
- li r6, 2
- slwi r6, r6, 2 # size *= 4 (size of float)
-
- cmpwi r8, 0
- bne FacingLeft
-
- # Nybble 12 is for x right now
- lfsx f0, r7, r6 # get it from the array
-
- stfs f0, 0xE8(r31)
- blr
-
-
-.global HammerSpin
-HammerSpin:
-# sth r3, 0x100(r31)
- blr
-
-
-
-
-.data
-TexFilenameBuffer:
- .long 0,0,0,0
-
-TexFormatString:
- .string "g3d/t%02d.brres"
-
-ConvertFloat:
- .word 0x43300000,0x0,0x43300000,0x80000000
-
-.align 4
-
-SnowmanTable:
- .float 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5
-
-AddAmount:
- .float 32.0
-
-LaunchAngle:
- .float 4.0, 2.5, 1.5
-
-LaunchAngleLeft:
- .float -4.0, -2.5, -1.5
-
-
-
-.align 4
-
-YoshiArc:
- .string "Y_TexGreen"
-.align 4
-
-Y_TexGreen:
- .string "Y_TexGreen"
-.align 4
-Y_TexRed:
- .string "Y_TexRed"
-.align 4
-Y_TexYellow:
- .string "Y_TexYellow"
-.align 4
-Y_TexBlue:
- .string "Y_TexBlue"
-.align 4
-Y_TexPurple:
- .string "Y_TexPurple"
-.align 4
-Y_TexOrange:
- .string "Y_TexOrange"
-.align 4
-Y_TexSkyBlue:
- .string "Y_TexSkyBlue"
-.align 4
-Y_TexBlack:
- .string "Y_TexBlack"
-.align 4
-Y_TexWhite:
- .string "Y_TexWhite"
-.align 4
-
-YoshiStrings:
- .long Y_TexGreen, Y_TexRed, Y_TexYellow, Y_TexBlue, Y_TexPurple, Y_TexOrange, Y_TexSkyBlue, Y_TexBlack, Y_TexWhite
-
-.align 4
-
-
+
+
+.global HammerLaunch
+HammerLaunch:
+ mr r3, r30
+ # r31 is the new actor currently
+ # r30 is self, all others are volatile
+
+ lwz r5, 4(r30)
+ lwz r8, 0x348(r30)
+
+ srwi r5, r5, 8
+ andi. r5, r5, 0xF
+
+ cmpwi r5, 0
+ beqlr
+
+ lis r7, LaunchAngle@h
+ ori r7, r7, LaunchAngle@l
+
+# lfs f0, 0(r7)
+# stfs f0, 0xDC(r31)
+# stfs f0, 0xE0(r31)
+# stfs f0, 0xE4(r31)
+
+ # Nybble 11 is for y right now
+ li r6, 0
+ slwi r6, r6, 2 # size *= 4 (size of float)
+ lfsx f0, r7, r6 # get it from the array
+
+ stfs f0, 0xEC(r31)
+
+ cmpwi r5, 5
+ beq LemmyLaunch
+
+ li r6, 1
+ slwi r6, r6, 2 # size *= 4 (size of float)
+
+ cmpwi r8, 0
+ bne FacingLeft
+
+ # Nybble 12 is for x right now
+ lfsx f0, r7, r6 # get it from the array
+
+ stfs f0, 0xE8(r31)
+
+ blr
+
+
+FacingLeft:
+
+ lis r7, LaunchAngleLeft@h
+ ori r7, r7, LaunchAngleLeft@l
+
+ # Nybble 12 is for x right now
+ lfsx f0, r7, r6 # get it from the array
+
+ stfs f0, 0xE8(r31)
+ li r7, 270
+ sth r7, 0x102(r31)
+
+ blr
+
+
+LemmyLaunch:
+
+ li r6, 2
+ slwi r6, r6, 2 # size *= 4 (size of float)
+
+ cmpwi r8, 0
+ bne FacingLeft
+
+ # Nybble 12 is for x right now
+ lfsx f0, r7, r6 # get it from the array
+
+ stfs f0, 0xE8(r31)
+ blr
+
+
+.global HammerSpin
+HammerSpin:
+# sth r3, 0x100(r31)
+ blr
+
+
+
+
+.data
+TexFilenameBuffer:
+ .long 0,0,0,0
+
+TexFormatString:
+ .string "g3d/t%02d.brres"
+
+ConvertFloat:
+ .word 0x43300000,0x0,0x43300000,0x80000000
+
+.align 4
+
+SnowmanTable:
+ .float 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5
+
+AddAmount:
+ .float 32.0
+
+LaunchAngle:
+ .float 4.0, 2.5, 1.5
+
+LaunchAngleLeft:
+ .float -4.0, -2.5, -1.5
+
+
+
+.align 4
+
+YoshiArc:
+ .string "Y_TexGreen"
+.align 4
+
+Y_TexGreen:
+ .string "Y_TexGreen"
+.align 4
+Y_TexRed:
+ .string "Y_TexRed"
+.align 4
+Y_TexYellow:
+ .string "Y_TexYellow"
+.align 4
+Y_TexBlue:
+ .string "Y_TexBlue"
+.align 4
+Y_TexPurple:
+ .string "Y_TexPurple"
+.align 4
+Y_TexOrange:
+ .string "Y_TexOrange"
+.align 4
+Y_TexSkyBlue:
+ .string "Y_TexSkyBlue"
+.align 4
+Y_TexBlack:
+ .string "Y_TexBlack"
+.align 4
+Y_TexWhite:
+ .string "Y_TexWhite"
+.align 4
+
+YoshiStrings:
+ .long Y_TexGreen, Y_TexRed, Y_TexYellow, Y_TexBlue, Y_TexPurple, Y_TexOrange, Y_TexSkyBlue, Y_TexBlack, Y_TexWhite
+
+.align 4
+
+
diff --git a/src/tilegod.S b/src/tilegod.S
index 248b3dc..474b16c 100644
--- a/src/tilegod.S
+++ b/src/tilegod.S
@@ -1,65 +1,65 @@
-.text
-
-#ifndef __MWERKS__
-.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
-.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
-.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
-.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
-.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
-.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
-.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
-#endif
-
-.align 4
-.extern ExitFromTileGodHack
-.extern TileTable
-
-.global NEW_GetTileFromTileTable
-NEW_GetTileFromTileTable:
- andi. r0, r3, 0x8000
- beq UseRegular
-
- li r4, 0x7FFF
- and r3, r3, r4
- blr
-
-UseRegular:
- lis r4, TileTable@h
- ori r4, r4, TileTable@l
-
- clrlslwi r0, r3, 16, 1
- lhzx r3, r4, r0
- blr
-
-
-.global TileGodHack
-TileGodHack:
- lwz r4, 4(r3) # Load settings
- extrwi. r0, r4, 1, 16 # Get and check the "use regular tile" flag
- extrwi r4, r4, 3, 17 # Get the tile number OR tileset number
- bne Special
-
- lis r3, TileGodTiles@h
- ori r3, r3, TileGodTiles@l
- slwi r4, r4, 1
- lhzx r25, r3, r4
-
- b ExitFromTileGodHack
-
-Special:
- lwz r3, 4(r3) # Load settings
- srwi r3, r3, 20 # Get tile number
- andi. r3, r3, 0xFF # Cut off top nybble
- slwi r4, r4, 8 # Shift tileset number
- or r3, r3, r4 # Add tileset number
- ori r25, r3, 0x8000 # Add "get regular tile" flag
-
- b ExitFromTileGodHack
-
-
-
-.data
-TileGodTiles:
- .short 0x7C, 0x02, 0x0C, 0x7B, 0x0F, 0x00
-
-
+.text
+
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+#endif
+
+.align 4
+.extern ExitFromTileGodHack
+.extern TileTable
+
+.global NEW_GetTileFromTileTable
+NEW_GetTileFromTileTable:
+ andi. r0, r3, 0x8000
+ beq UseRegular
+
+ li r4, 0x7FFF
+ and r3, r3, r4
+ blr
+
+UseRegular:
+ lis r4, TileTable@h
+ ori r4, r4, TileTable@l
+
+ clrlslwi r0, r3, 16, 1
+ lhzx r3, r4, r0
+ blr
+
+
+.global TileGodHack
+TileGodHack:
+ lwz r4, 4(r3) # Load settings
+ extrwi. r0, r4, 1, 16 # Get and check the "use regular tile" flag
+ extrwi r4, r4, 3, 17 # Get the tile number OR tileset number
+ bne Special
+
+ lis r3, TileGodTiles@h
+ ori r3, r3, TileGodTiles@l
+ slwi r4, r4, 1
+ lhzx r25, r3, r4
+
+ b ExitFromTileGodHack
+
+Special:
+ lwz r3, 4(r3) # Load settings
+ srwi r3, r3, 20 # Get tile number
+ andi. r3, r3, 0xFF # Cut off top nybble
+ slwi r4, r4, 8 # Shift tileset number
+ or r3, r3, r4 # Add tileset number
+ ori r25, r3, 0x8000 # Add "get regular tile" flag
+
+ b ExitFromTileGodHack
+
+
+
+.data
+TileGodTiles:
+ .short 0x7C, 0x02, 0x0C, 0x7B, 0x0F, 0x00
+
+
diff --git a/src/worldmap.cpp b/src/worldmap.cpp
index d7f73d0..d650fce 100644
--- a/src/worldmap.cpp
+++ b/src/worldmap.cpp
@@ -1,1064 +1,1064 @@
-#include "worldmap.h"
-
-extern "C" void LoadMapScene();
-
-dScNewerWorldMap_c *dScNewerWorldMap_c::instance = 0;
-
-
-dScNewerWorldMap_c *dScNewerWorldMap_c::build() {
- // return new dScNewerWorldMap_c;
- OSReport("Creating WorldMap\n");
-
- void *buffer = AllocFromGameHeap1(sizeof(dScNewerWorldMap_c));
- dScNewerWorldMap_c *c = new(buffer) dScNewerWorldMap_c;
-
- OSReport("Created WorldMap @ %p\n", c);
-
- instance = c;
- return c;
-}
-
-
-#define SELC_SETUP_DONE(sc) (*((bool*)(((u32)(sc))+0xD38)))
-
-#define EASYP_SETUP_DONE(ep) (*((bool*)(((u32)(ep))+0x278)))
-#define EASYP_ACTIVE(ep) (*((bool*)(((u32)(ep))+0x279)))
-
-#define CSMENU_SETUP_DONE(csm) (*((bool*)(((u32)(csm))+0x270)))
-#define CSMENU_ACTIVE(csm) (*((bool*)(((u32)(csm))+0x271)))
-#define CSMENU_CHOICE_OK(csm) (*((bool*)(((u32)(csm))+0x272)))
-#define CSMENU_UNK(csm) (*((bool*)(((u32)(csm))+0x273)))
-#define CSMENU_CURRENT(csm) (*((int*)(((u32)(csm))+0x268)))
-
-#define YESNO_SETUP_DONE(ynw) (*((bool*)(((u32)(ynw))+0x294)))
-#define YESNO_VISIBLE(ynw) (*((bool*)(((u32)(ynw))+0x295)))
-#define YESNO_CLOSE(ynw) (*((bool*)(((u32)(ynw))+0x296)))
-#define YESNO_OPENING(ynw) (*((bool*)(((u32)(ynw))+0x297)))
-#define YESNO_REFUSED(ynw) (*((bool*)(((u32)(ynw))+0x298)))
-#define YESNO_CANCELLED(ynw) (*((bool*)(((u32)(ynw))+0x299)))
-#define YESNO_CANCELLED2(ynw) (*((bool*)(((u32)(ynw))+0x29A)))
-#define YESNO_CURRENT(ynw) (*((int*)(((u32)(ynw))+0x284)))
-#define YESNO_TYPE(ynw) (*((int*)(((u32)(ynw))+0x28C)))
-
-#define NPCHG_SETUP_DONE(npc) (*((bool*)(((u32)(npc))+0x67C)))
-#define NPCHG_ACTIVE(npc) (*((bool*)(((u32)(npc))+0x67E)))
-#define NPCHG_HIDE_FOR_EASYP(npc) (*((bool*)(((u32)(npc))+0x67F)))
-#define NPCHG_READY(npc) (*((bool*)(((u32)(npc))+0x680)))
-#define NPCHG_CCSB(npc,idx) (((void**)(((u32)(npc))+0x74))[(idx)])
-#define NPCHG_CCSC(npc,idx) (((void**)(((u32)(npc))+0x84))[(idx)])
-#define NPCHG_CCSA(npc,idx) (((void**)(((u32)(npc))+0x94))[(idx)])
-#define NPCHG_CCI(npc,idx) (((void**)(((u32)(npc))+0xA4))[(idx)])
-#define NPCHG_2DPLAYER(npc,idx) (((void**)(((u32)(npc))+0x64C))[(idx)])
-
-#define STKI_SETUP_DONE(si) (*((bool*)(((u32)(si))+0x310)))
-#define STKI_SHADOW(si) (*((void**)(((u32)(si))+0x310)))
-#define STKI_2DPLAYER(si,idx) (((void**)(((u32)(si))+0x2E4))[(idx)])
-#define STKI_ITEM(si,idx) (((void**)(((u32)(si))+0x2F4))[(idx)])
-#define STKI_SHOW(si) (*((bool*)(((u32)(si))+0x8DD)))
-
-#define SIS_SETUP_DONE(sis) (*((bool*)(((u32)(sis))+0x260)))
-
-#define CCSB_ACTIVE(ccsb) (*((bool*)(((u32)(ccsb))+0x29C)))
-
-#define CCSC_ACTIVE(ccsc) (*((bool*)(((u32)(ccsc))+0x2A1)))
-
-#define PLAYER2D_SHOW_EASY_PAIRING(p2d) (*((bool*)(((u32)(p2d))+0x264)))
-
-#define CONT_LIVES(cont,idx) (((int*)(((u32)(cont))+0x2B8))[(idx)])
-#define CONT_SETUP_DONE(cont) (*((bool*)(((u32)(cont))+0x2D4)))
-#define CONT_UNK1(cont) (*((bool*)(((u32)(cont))+0x2D5)))
-#define CONT_UNK2(cont) (*((bool*)(((u32)(cont))+0x2D6)))
-#define CONT_DONE(cont) (*((bool*)(((u32)(cont))+0x2D7)))
-#define CONT_UNK3(cont) (*((bool*)(((u32)(cont))+0x2E0)))
-
-inline u8 GetSwitchStatus() {
- return *((u8*)(((u32)GameMgr)+0x380));
-}
-
-inline void SetSwitchStatus(u8 stat) {
- *((u8*)(((u32)GameMgr)+0x380)) = stat;
-}
-
-#define STATE_START_DVD 0
-#define STATE_LOAD_RES 1
-#define STATE_END_DVD 2
-#define STATE_SETUP_WAIT 3
-#define STATE_LIMBO 4
-#define STATE_CONTINUE_WAIT 5
-#define STATE_NORMAL 6
-#define STATE_OPT_CHANGE_WAIT 7
-#define STATE_CSMENU 8
-#define STATE_TITLE_CONFIRM_OPEN_WAIT 9
-#define STATE_TITLE_CONFIRM_SELECT 10
-#define STATE_TITLE_CONFIRM_HIT_WAIT 11
-#define STATE_PLAYER_CHANGE_WAIT 12
-#define STATE_EASY_PAIRING_WAIT 13
-#define STATE_POWERUPS_WAIT 14
-#define STATE_SAVE_OPEN 15
-#define STATE_SAVE_SELECT 16
-#define STATE_SAVE_WINDOW_CLOSE 17
-#define STATE_SAVE_DO 18
-#define STATE_SAVE_END_WINDOW 19
-#define STATE_SAVE_END_CLOSE_WAIT 20
-#define STATE_QUICKSAVE_OPEN 21
-#define STATE_QUICKSAVE_SELECT 22
-#define STATE_QUICKSAVE_WINDOW_CLOSE 23
-#define STATE_QUICKSAVE_DO 24
-#define STATE_QUICKSAVE_END_WINDOW 25
-#define STATE_QUICKSAVE_END_CLOSE_WAIT 26
-#define STATE_SAVE_ERROR 27
-
-#define MENU_HEIGHT 15
-
-const char *anim1 = "optionActivated.brlan";
-const char *anim2 = "optionDeactivated.brlan";
-
-const char *group1 = "G_opt00";
-const char *group2 = "G_opt01";
-const char *group3 = "G_opt02";
-const char *group4 = "G_opt03";
-const char *group5 = "G_opt04";
-const char *group6 = "G_opt05";
-const char *group7 = "G_opt06";
-const char *group8 = "G_opt07";
-const char *group9 = "G_opt08";
-const char *group10 = "G_opt09";
-const char *group11 = "G_opt10";
-const char *group12 = "G_opt11";
-const char *group13 = "G_opt12";
-const char *group14 = "G_opt13";
-const char *group15 = "G_opt14";
-
-
-void dScNewerWorldMap_c::StartLevel() {
- LevelInfo_Entry *level = LevelInfo_GetLevels(this->levelInfo, this->currentPage);
- level += this->selections[this->currentPage];
- StartLevel(level);
-}
-
-void dScNewerWorldMap_c::StartLevel(LevelInfo_Entry *entry) {
- for (int i = 0; i < 4; i++) {
- bool isThere = QueryPlayerAvailability(i);
- int id = Player_ID[i];
- Player_Active[i] = isThere ? 1 : 0;
- if (!isThere) Player_Flags[i] = 0;
- }
-
- StartLevelInfo sl;
- sl.unk1 = 0;
- sl.unk2 = 0xFF;
- sl.unk3 = 0;
- sl.unk4 = 0;
- sl.purpose = 0;
-
- sl.world1 = entry->world;
- sl.world2 = entry->world;
- sl.level1 = entry->level;
- sl.level2 = entry->level;
-
- // hopefully this will fix the Star Coin issues
- SetSomeConditionShit(entry->world, entry->level, 2);
-
- ActivateWipe(WIPE_MARIO);
-
- DoStartLevel(GetGameMgr(), &sl);
-}
-
-void dScNewerWorldMap_c::SetTitle(const char *text) {
- unsigned short conv_buf[0x200];
- int length = strlen(text);
- if (length > 0x1FF)
- length = 0x1FF;
-
- for (int i = 0; i < length; i++) {
- conv_buf[i] = text[i];
- }
- conv_buf[length] = 0;
-
- void *textBox = EmbeddedLayout_FindTextBoxByName(this->layout, "ScreenTitle");
- TextBox_SetString(textBox, conv_buf, 0);
-}
-
-void dScNewerWorldMap_c::GenSBTitle() {
- char buf[0x100];
- sprintf(buf, "Switches: R:%s; G:%s; Y:%s; B:%s",
- ((GetSwitchStatus() & 1) != 0) ? "On" : "Off",
- ((GetSwitchStatus() & 2) != 0) ? "On" : "Off",
- ((GetSwitchStatus() & 4) != 0) ? "On" : "Off",
- ((GetSwitchStatus() & 8) != 0) ? "On" : "Off");
- this->SetTitle(buf);
-}
-
-void dScNewerWorldMap_c::GenText() {
- char buf[0x1FF];
- char paneNameBuf[0x20];
- char textBoxNameBuf[0x20];
- unsigned short wchars[0x1FF];
-
- SaveBlock *save = GetSaveFile()->GetBlock(-1);
-
- LevelInfo_Section *section = LevelInfo_GetSection(this->levelInfo, this->currentPage);
- LevelInfo_Entry *levels = LevelInfo_GetLevels(this->levelInfo, section);
-
- int count = section->levelCount;
-
- for (int i = 0; i < MENU_HEIGHT; i++) {
- sprintf(paneNameBuf, "Opt%02d", i);
- sprintf(textBoxNameBuf, "OptText%02d", i);
- void *pane = EmbeddedLayout_FindPaneByName(this->layout, paneNameBuf);
- void *textBox = EmbeddedLayout_FindTextBoxByName(this->layout, textBoxNameBuf);
-
- if (i < count) {
- // valid level
- PANE_FLAGS(pane) |= 1;
-
- u32 conds = save->GetLevelCondition(levels[i].world, levels[i].level);
-
- char cond1, cond2, cond3, cond4, cond5;
- cond1 = (conds & COND_NORMAL ? 'x' : '.');
- cond2 = (conds & COND_SECRET ? 'x' : '.');
- cond3 = (conds & COND_COIN1 ? 'x' : '.');
- cond4 = (conds & COND_COIN2 ? 'x' : '.');
- cond5 = (conds & COND_COIN3 ? 'x' : '.');
-
- sprintf(buf, "%s %c%c %c%c%c", LevelInfo_GetName(this->levelInfo, &levels[i]), cond1, cond2, cond3, cond4, cond5);
-
- for (int i = 0; i < 0x1FF; i++) {
- wchars[i] = buf[i];
- if (buf[i] == 0) break;
- }
-
- TextBox_SetString(textBox, wchars, 0);
- } else {
- // invalid, hide the pane
- PANE_FLAGS(pane) &= ~1;
- }
- }
-}
-
-int dScNewerWorldMap_c::onCreate() {
- OSReport("1:Loading scene\n");
-
- LoadMapScene();
- OSReport("2:Loading scene\n");
- GameSetup__LoadScene(0); // lol, stolen from GAME_SETUP
-
- OSReport("3:Layout alloc\n");
- this->layout = (Layout*)AllocFromGameHeap1(sizeof(Layout));
- if (!this->layout) {
- OSReport("memalloc fail\n");
- InfiniteLoop;
- }
-
- OSReport("4:Layout ctor\n");
- EmbeddedLayout_ctor(this->layout);
- OSReport("5:Layout load arc\n");
- EmbeddedLayout_LoadArc(this->layout, "NewerRes/wmap.arc");
-
- OSReport("6:Layout build\n");
- if (!EmbeddedLayout_Build(this->layout, "levelSelect.brlyt", 0)) {
- OSReport("build fail\n");
- InfiniteLoop;
- }
-
-
- OSReport("7:Layout load brlan\n");
- const char *anims[2] = {anim1, anim2};
- EmbeddedLayout_LoadBrlans(this->layout, anims, 2);
-
- const char *groups[30] = {
- group1, group2, group3, group4, group5,
- group6, group7, group8, group9, group10,
- group11, group12, group13, group14, group15,
- group1, group2, group3, group4, group5,
- group6, group7, group8, group9, group10,
- group11, group12, group13, group14, group15,
- };
-
- int mappings[30] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
- OSReport("8:Layout load group\n");
- EmbeddedLayout_LoadGroups(this->layout, groups, mappings, 30);
-
- OSReport("9:Layout reset anims\n");
- EmbeddedLayout_DisableAllAnims(this->layout);
-
- for (int i = 0; i < 15; i++) {
- EmbeddedLayout_ResetAnimToInitialState(this->layout, i, false);
- }
-
-
- OSReport("10:Item 1\n");
- this->selectCursor = CreateParentedObject(SELECT_CURSOR, this, 0, 0);
- OSReport("11:Item 2\n");
- this->csMenu = CreateParentedObject(COURSE_SELECT_MENU, this, 0, 0);
- OSReport("12:Item 3\n");
- this->yesNoWindow = CreateParentedObject(YES_NO_WINDOW, this, 0, 0);
- OSReport("13:Item 4\n");
- this->numPeopleChange = CreateParentedObject(NUMBER_OF_PEOPLE_CHANGE, this, 0, 0);
-
- for (int i = 0; i < 4; i++) {
- OSReport("14:Character change select %d\n", i);
- void *ccsb = CreateParentedObject(CHARACTER_CHANGE_SELECT_BASE, this, i, 0);
- void *ccsc = CreateParentedObject(CHARACTER_CHANGE_SELECT_CONTENTS, this, i, 0);
- void *ccsa = CreateParentedObject(CHARACTER_CHANGE_SELECT_ARROW, this, i, 0);
- void *cci = CreateParentedObject(CHARACTER_CHANGE_INDICATOR, this, i, 0);
-
- NPCHG_CCSB(this->numPeopleChange, i) = ccsb;
- NPCHG_CCSC(this->numPeopleChange, i) = ccsc;
- NPCHG_CCSA(this->numPeopleChange, i) = ccsa;
- NPCHG_CCI(this->numPeopleChange, i) = cci;
- }
-
- OSReport("15:Item 5\n");
- this->continueObj = CreateParentedObject(CONTINUE, this, 0, 0);
-
- OSReport("16:Item 6\n");
- this->stockItem = CreateParentedObject(STOCK_ITEM, this, 0, 0);
- OSReport("17:Item 7\n");
- this->stockItemShadow = CreateParentedObject(STOCK_ITEM_SHADOW, this, 0, 0);
- STKI_SHADOW(this->stockItem) = this->stockItemShadow;
-
- OSReport("18:Item 8\n");
- this->easyPairing = CreateParentedObject(EASY_PAIRING, this, 0, 0);
-
- this->state = STATE_START_DVD;
-
- this->layout->drawOrder = 0;
-
- *CurrentDrawFunc = NewerMapDrawFunc;
-
- // level info
- OSReport("19:Load level info\n");
- this->levelInfo = LoadFile(&this->levelInfoFH, "/NewerRes/LevelInfo.bin");
- OSReport("20:Prepare level info\n");
- LevelInfo_Prepare(&this->levelInfoFH);
-
- // load the menu info
- OSReport("21:Load save info\n");
- SaveBlock *save = GetSaveFile()->GetBlock(-1);
-
- this->currentPage = save->current_world;
-
- // bounds check
- if (save->current_path_node >= 15)
- save->current_path_node = 0;
-
- int sCount = LevelInfo_GetSectionCount(this->levelInfo);
- this->selections = (int*)AllocFromGameHeap1(sizeof(int) * sCount);
-
- for (int i = 0; i < sCount; i++) {
- this->selections[i] = 0;
- }
-
- this->selections[this->currentPage] = save->current_path_node;
-
- // show button anim
- OSReport("22:Enable anim\n");
- EmbeddedLayout_EnableNonLoopAnim(this->layout, save->current_path_node, false);
-
- OSReport("23:Make text\n");
- this->GenText();
- this->GenSBTitle();
-
- OSReport("24:onCreate complete\n");
- return true;
-}
-
-int dScNewerWorldMap_c::onDelete() {
- EmbeddedLayout_FreeArc(this->layout);
- EmbeddedLayout_Free(this->layout);
- EmbeddedLayout_dtor(this->layout, false);
- FreeFromGameHeap1(this->layout);
-
- FreeFromGameHeap1(this->selections);
-
- FreeFile(&this->levelInfoFH);
-
- FreeScene(0);
- FreeScene(1);
-
- DVD_FreeFile(GetDVDClass2(), "SI_kinoko");
- DVD_FreeFile(GetDVDClass2(), "SI_fireflower");
- DVD_FreeFile(GetDVDClass2(), "SI_iceflower");
- DVD_FreeFile(GetDVDClass2(), "SI_penguin");
- DVD_FreeFile(GetDVDClass2(), "SI_propeller");
- DVD_FreeFile(GetDVDClass2(), "SI_star");
-
- return true;
-}
-
-int dScNewerWorldMap_c::onExecute() {
-
- if (QueryGlobal5758(0xFFFFFFFF)) return true;
- if (CheckIfWeCantDoStuff()) return true;
-
- /**************************************************************************/
- // Read Wiimote Buttons
-
- int heldButtons = Remocon_GetButtons(GetActiveRemocon());
- int nowPressed = Remocon_GetPressed(GetActiveRemocon());
-
- /**************************************************************************/
- // State Specific
-
- switch (this->state) {
- /**********************************************************************/
- // STATE_START_DVD : Set up DVD
- case STATE_START_DVD:
-
- DVD_Start();
- this->state = STATE_LOAD_RES;
-
- break;
-
- /**********************************************************************/
- // STATE_LOAD_RES : Load extra stuff we need
- case STATE_LOAD_RES:
-
- DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_kinoko", 0);
- DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_fireflower", 0);
- DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_iceflower", 0);
- DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_penguin", 0);
- DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_propeller", 0);
- DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_star", 0);
- //DVD_LoadFile(GetDVDClass(), "Object", "fruits_kusa_gake", 0);
-
- this->state = STATE_END_DVD;
-
- break;
-
- /**********************************************************************/
- // STATE_END_DVD : Wait for files to load, end DVD
- case STATE_END_DVD:
-
- if (!DVD_StillLoading(GetDVDClass2())) {
- if (DVD_End()) {
- this->state = STATE_SETUP_WAIT;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_SETUP_WAIT : Waiting for the world map managers to be set up
- case STATE_SETUP_WAIT: {
-
- bool success = true;
-
- success &= CSMENU_SETUP_DONE(this->csMenu);
- success &= SELC_SETUP_DONE(this->selectCursor);
- success &= NPCHG_SETUP_DONE(this->numPeopleChange);
- success &= YESNO_SETUP_DONE(this->yesNoWindow);
- success &= CONT_SETUP_DONE(this->continueObj);
- success &= STKI_SETUP_DONE(this->stockItem);
- success &= SIS_SETUP_DONE(this->stockItemShadow);
- success &= EASYP_SETUP_DONE(this->easyPairing);
-
- if (success) {
- // ok, now we can set up other required shit
-
- // first up: player models for Stocked Items
- for (int i = 0; i < 4; i++) {
- void *obj = CreateChildObject(WM_2D_PLAYER, this, i, 0, 0);
- STKI_2DPLAYER(this->stockItem,i) = obj;
- NPCHG_2DPLAYER(this->numPeopleChange,i) = obj;
- }
-
- // next: items for the Powerup screen
- for (int i = 0; i < 7; i++) {
- void *obj = CreateChildObject(WM_ITEM, this, i, 0, 0);
- STKI_ITEM(this->stockItem,i) = obj;
- }
-
- // now, check if we need to handle Continue
- if (CheckIfContinueShouldBeActivated()) {
- this->state = STATE_CONTINUE_WAIT;
- CONT_UNK1(this->continueObj) = true;
- CONT_UNK2(this->continueObj) = true;
- CONT_UNK3(this->continueObj) = false;
- } else {
- this->state = STATE_OPT_CHANGE_WAIT;
- }
- }
-
- } break;
-
- /**********************************************************************/
- // STATE_CONTINUE_WAIT : Waiting for the Continue anim to finish
- case STATE_CONTINUE_WAIT:
-
- if (CONT_DONE(this->continueObj)) {
- CONT_UNK1(this->continueObj) = 0;
- CONT_UNK2(this->continueObj) = 0;
- CONT_UNK3(this->continueObj) = 0;
-
- for (int i = 0; i < 4; i++) {
- int idx = SearchForIndexOfPlayerID(i);
- Player_Lives[Player_ID[idx]] = CONT_LIVES(this->continueObj, i);
- }
-
- this->state = STATE_OPT_CHANGE_WAIT;
- }
-
- break;
-
- /**********************************************************************/
- // STATE_NORMAL : Nothing related to the menu is going on
- case STATE_NORMAL: {
-
- int currentPage = this->currentPage;
- int currentSelection = this->selections[currentPage];
- int newPage = currentPage;
- int newSelection = currentSelection;
-
- // Activate the menu
- if (nowPressed & WPAD_PLUS) {
- CSMENU_ACTIVE(this->csMenu) = true;
- this->state = STATE_CSMENU;
- }
-
- if (nowPressed & WPAD_B) {
- SetSwitchStatus((GetSwitchStatus() + 1) & 15);
- this->GenSBTitle();
- }
-
- // Change the current level
- if ((nowPressed & WPAD_UP) && currentSelection > 0) {
- newSelection = currentSelection - 1;
- }
-
- if ((nowPressed & WPAD_DOWN) && currentSelection < (LevelInfo_GetSection(this->levelInfo, currentPage)->levelCount - 1)) {
- newSelection = currentSelection + 1;
- }
-
- // Change the current world
- if ((nowPressed & WPAD_LEFT) && currentPage > 0) {
- newPage = currentPage - 1;
- }
-
- if ((nowPressed & WPAD_RIGHT) && currentPage < (LevelInfo_GetSectionCount(this->levelInfo) - 1)) {
- newPage = currentPage + 1;
- }
-
-
- if (newPage != currentPage) {
- this->currentPage = newPage;
- this->GenText();
-
- // do this to let the rest of the code handle animations
- newSelection = this->selections[newPage];
- }
-
- if (newSelection != currentSelection) {
- EmbeddedLayout_DisableAllAnims(this->layout);
-
- // enable On animation
- EmbeddedLayout_EnableNonLoopAnim(this->layout, newSelection, false);
-
- // enable Off animation
- EmbeddedLayout_EnableNonLoopAnim(this->layout, currentSelection+15, false);
-
- this->selections[newPage] = newSelection;
- this->state = STATE_OPT_CHANGE_WAIT;
- }
-
-
- // save the info to the file
- if (currentSelection != newSelection || currentPage != newPage) {
- SaveBlock *save = GetSaveFile()->GetBlock(-1);
- save->current_world = newPage;
- save->current_path_node = newSelection;
- }
-
-
- // Enter the current level
- if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
- this->StartLevel();
- this->state = STATE_LIMBO; // just in case
- }
-
- if (nowPressed & WPAD_ONE) {
- STKI_SHOW(this->stockItem) = true;
- this->state = STATE_POWERUPS_WAIT;
- }
- } break;
-
- /**********************************************************************/
- // STATE_OPT_CHANGE_WAIT : Waiting for the option change animation to
- // finish playing
- case STATE_OPT_CHANGE_WAIT:
-
- if (!EmbeddedLayout_CheckIfAnimationIsOn(this->layout, -1)) {
- this->state = STATE_NORMAL;
- }
-
- break;
- /**********************************************************************/
- // STATE_CSMENU : The course select menu is currently being shown
- case STATE_CSMENU:
-
- // First off, check to see if it's been hidden
- if (!CSMENU_ACTIVE(this->csMenu)) {
- // That means something happened
- if (CSMENU_CHOICE_OK(this->csMenu)) {
- // Player pressed a button
-
- switch (CSMENU_CURRENT(this->csMenu)) {
- case 0:
- // Star Coins
- //OSReport("Star Coins was pressed\n");
- this->state = STATE_NORMAL;
- break;
-
- case 1:
- // Add/Drop Players
- //OSReport("Add/Drop Players was pressed\n");
- this->state = STATE_PLAYER_CHANGE_WAIT;
- NPCHG_ACTIVE(this->numPeopleChange) = true;
- WpadShit(10);
-
- break;
-
- case 2:
- // Save or Quick Save
- //OSReport("Save or Quick Save was pressed\n");
- if (GetSaveFile()->GetBlock(-1)->bitfield & 2) {
- this->state = STATE_SAVE_OPEN;
- YESNO_TYPE(this->yesNoWindow) = 1;
- YESNO_VISIBLE(this->yesNoWindow) = 1;
-
- } else {
- this->state = STATE_QUICKSAVE_OPEN;
- YESNO_TYPE(this->yesNoWindow) = 15;
- YESNO_VISIBLE(this->yesNoWindow) = 1;
-
- }
-
- break;
-
- case 3:
- // Title Screen
- //OSReport("Title Screen was pressed\n");
- this->state = STATE_TITLE_CONFIRM_OPEN_WAIT;
- YESNO_VISIBLE(this->yesNoWindow) = true;
- YESNO_TYPE(this->yesNoWindow) = 10;
- break;
- }
-
- } else {
- // Ok, change back to STATE_NORMAL
- this->state = STATE_NORMAL;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_TITLE_CONFIRM_OPEN_WAIT : Waiting for the "Go to Title Screen"
- // YesNoWindow to finish opening
- case STATE_TITLE_CONFIRM_OPEN_WAIT:
-
- if (!YESNO_OPENING(this->yesNoWindow)) {
- this->state = STATE_TITLE_CONFIRM_SELECT;
- }
-
- break;
-
- /**********************************************************************/
- // STATE_TITLE_CONFIRM_SELECT : Let the user choose an option on the
- // "Go to Title Screen" YesNoWindow.
- case STATE_TITLE_CONFIRM_SELECT:
-
- if (nowPressed & WPAD_LEFT) {
- // Select "OK!"
- YESNO_CURRENT(this->yesNoWindow) = 1;
-
- } else if (nowPressed & WPAD_RIGHT) {
- // Select "Cancel"
- YESNO_CURRENT(this->yesNoWindow) = 0;
-
- } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
- // Pick the current option
- YESNO_CLOSE(this->yesNoWindow) = true;
- if (YESNO_CURRENT(this->yesNoWindow) != 1)
- YESNO_REFUSED(this->yesNoWindow) = true;
- this->state = STATE_TITLE_CONFIRM_HIT_WAIT;
-
- } else {
- // Cancel using B or 1
- if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) {
- YESNO_CANCELLED(this->yesNoWindow) = true;
- YESNO_CURRENT(this->yesNoWindow) = true;
- this->state = STATE_TITLE_CONFIRM_HIT_WAIT;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_TITLE_CONFIRM_HIT_WAIT : Process the user's chosen option on
- // the "Go to Title Screen" YesNoWindow. Also, wait for the
- // animation to be complete.
- case STATE_TITLE_CONFIRM_HIT_WAIT:
-
- if (!YESNO_OPENING(this->yesNoWindow)) {
- if (YESNO_CURRENT(this->yesNoWindow) == 1) {
- this->state = STATE_NORMAL;
- } else {
- this->state = STATE_LIMBO;
- StartTitleScreenStage(false, 0);
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_PLAYER_CHANGE_WAIT : Wait for the user to do something on the
- // Add/Drop Players screen.
- case STATE_PLAYER_CHANGE_WAIT:
-
- if (NPCHG_READY(this->numPeopleChange)) {
- if (nowPressed & WPAD_PLUS) {
- // activate easy pairing. FUN !!
- NPCHG_HIDE_FOR_EASYP(this->numPeopleChange) = 1;
-
- for (int i = 0; i < 4; i++) {
- void *obj = NPCHG_2DPLAYER(this->numPeopleChange, i);
- void *ccsb = NPCHG_CCSB(this->numPeopleChange, i);
- void *ccsc = NPCHG_CCSC(this->numPeopleChange, i);
-
- PLAYER2D_SHOW_EASY_PAIRING(obj) = 1;
- CCSB_ACTIVE(ccsb) = 1;
- CCSC_ACTIVE(ccsc) = 1;
- }
-
- EASYP_ACTIVE(this->easyPairing) = 1;
- this->state = STATE_EASY_PAIRING_WAIT;
- }
- } else {
- if (!NPCHG_ACTIVE(this->numPeopleChange)) {
- this->state = STATE_NORMAL;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_EASY_PAIRING_WAIT : Wait for the user to exit Easy Pairing.
- case STATE_EASY_PAIRING_WAIT:
-
- if (!EASYP_ACTIVE(this->easyPairing)) {
- NPCHG_HIDE_FOR_EASYP(this->numPeopleChange) = 0;
-
- for (int i = 0; i < 4; i++) {
- void *obj = NPCHG_2DPLAYER(this->numPeopleChange, i);
- void *ccsb = NPCHG_CCSB(this->numPeopleChange, i);
- void *ccsc = NPCHG_CCSC(this->numPeopleChange, i);
-
- PLAYER2D_SHOW_EASY_PAIRING(obj) = 0;
- CCSB_ACTIVE(ccsb) = 0;
- CCSC_ACTIVE(ccsc) = 0;
- }
-
- this->state = STATE_PLAYER_CHANGE_WAIT;
- WpadShit(10);
- }
-
- break;
-
- /**********************************************************************/
- // STATE_POWERUPS_WAIT : Wait for the user to exit the Powerups screen.
- case STATE_POWERUPS_WAIT:
-
- if (!STKI_SHOW(this->stockItem)) {
- this->state = STATE_NORMAL;
- }
-
- break;
-
- /**********************************************************************/
- // STATE_SAVE_OPEN : Waiting for the "Save?" YesNoWindow to open
- case STATE_SAVE_OPEN:
-
- if (!YESNO_OPENING(this->yesNoWindow)) {
- this->state = STATE_SAVE_SELECT;
- }
-
- break;
-
- /**********************************************************************/
- // STATE_SAVE_SELECT : Let the user choose an option on the
- // "Save?" YesNoWindow.
- case STATE_SAVE_SELECT:
-
- if (nowPressed & WPAD_LEFT) {
- // Select "OK!"
- YESNO_CURRENT(this->yesNoWindow) = 1;
-
- } else if (nowPressed & WPAD_RIGHT) {
- // Select "Cancel"
- YESNO_CURRENT(this->yesNoWindow) = 0;
-
- } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
- // Pick the current option
- YESNO_CLOSE(this->yesNoWindow) = true;
-
- if (YESNO_CURRENT(this->yesNoWindow) != 1)
- YESNO_CANCELLED2(this->yesNoWindow) = true;
- this->state = STATE_SAVE_WINDOW_CLOSE;
-
- } else {
- // Cancel using B or 1
- if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) {
- YESNO_CANCELLED(this->yesNoWindow) = true;
- YESNO_CURRENT(this->yesNoWindow) = 1;
- this->state = STATE_SAVE_WINDOW_CLOSE;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_SAVE_WINDOW_CLOSE : Process the user's chosen option on the
- // "Save?" YesNoWindow. Also, wait for the animation to be complete.
- case STATE_SAVE_WINDOW_CLOSE:
-
- if (!YESNO_VISIBLE(this->yesNoWindow)) {
- if (YESNO_CURRENT(this->yesNoWindow) == 1) {
- this->state = STATE_NORMAL;
- } else {
- this->state = STATE_SAVE_DO;
- SaveGame(0, false);
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_SAVE_DO : Save the game.
- case STATE_SAVE_DO:
-
- if (!GetSaveFile()->CheckIfWriting()) {
- if (GetSaveHandler()->CurrentError == 0) {
- YESNO_TYPE(this->yesNoWindow) = 2;
- YESNO_VISIBLE(this->yesNoWindow) = true;
- this->state = STATE_SAVE_END_WINDOW;
- } else {
- this->state = STATE_SAVE_ERROR;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_SAVE_END_WINDOW : Handle the Save End window.
- case STATE_SAVE_END_WINDOW:
-
- if (!YESNO_OPENING(this->yesNoWindow)) {
- if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
- YESNO_CLOSE(this->yesNoWindow) = true;
- this->state = STATE_SAVE_END_CLOSE_WAIT;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_SAVE_END_CLOSE_WAIT : Wait for the Save End window to close.
- case STATE_SAVE_END_CLOSE_WAIT:
-
- if (!YESNO_OPENING(this->yesNoWindow)) {
- this->state = STATE_NORMAL;
- }
-
- break;
-
- /**********************************************************************/
- // STATE_QUICKSAVE_OPEN : Waiting for the "Save?" YesNoWindow to open
- case STATE_QUICKSAVE_OPEN:
-
- if (!YESNO_OPENING(this->yesNoWindow)) {
- this->state = STATE_QUICKSAVE_SELECT;
- }
-
- break;
-
- /**********************************************************************/
- // STATE_QUICKSAVE_SELECT : Let the user choose an option on the
- // "Save?" YesNoWindow.
- case STATE_QUICKSAVE_SELECT:
-
- if (nowPressed & WPAD_LEFT) {
- // Select "OK!"
- YESNO_CURRENT(this->yesNoWindow) = 1;
-
- } else if (nowPressed & WPAD_RIGHT) {
- // Select "Cancel"
- YESNO_CURRENT(this->yesNoWindow) = 0;
-
- } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
- // Pick the current option
- YESNO_CLOSE(this->yesNoWindow) = true;
-
- if (YESNO_CURRENT(this->yesNoWindow) != 1)
- YESNO_CANCELLED2(this->yesNoWindow) = true;
- this->state = STATE_QUICKSAVE_WINDOW_CLOSE;
-
- } else {
- // Cancel using B or 1
- if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) {
- YESNO_CANCELLED(this->yesNoWindow) = true;
- YESNO_CURRENT(this->yesNoWindow) = 1;
- this->state = STATE_QUICKSAVE_WINDOW_CLOSE;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_QUICKSAVE_WINDOW_CLOSE : Process the user's chosen option on
- // the "Save?" YesNoWindow. Also, wait for the animation to be complete
- case STATE_QUICKSAVE_WINDOW_CLOSE:
-
- if (!YESNO_VISIBLE(this->yesNoWindow)) {
- if (YESNO_CURRENT(this->yesNoWindow) == 1) {
- this->state = STATE_NORMAL;
- } else {
- this->state = STATE_QUICKSAVE_DO;
- SaveGame(0, true);
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_QUICKSAVE_DO : Save the game.
- case STATE_QUICKSAVE_DO:
-
- if (!GetSaveFile()->CheckIfWriting()) {
- if (GetSaveHandler()->CurrentError == 0) {
- YESNO_TYPE(this->yesNoWindow) = 16;
- YESNO_VISIBLE(this->yesNoWindow) = true;
- this->state = STATE_QUICKSAVE_END_WINDOW;
- } else {
- this->state = STATE_SAVE_ERROR;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_QUICKSAVE_END_WINDOW : Handle the Save End window.
- case STATE_QUICKSAVE_END_WINDOW:
-
- if (!YESNO_OPENING(this->yesNoWindow)) {
- if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
- YESNO_CLOSE(this->yesNoWindow) = true;
- YESNO_REFUSED(this->yesNoWindow) = true;
- this->state = STATE_QUICKSAVE_END_CLOSE_WAIT;
- }
- }
-
- break;
-
- /**********************************************************************/
- // STATE_QUICKSAVE_END_CLOSE_WAIT : Wait for Save End window to close
- case STATE_QUICKSAVE_END_CLOSE_WAIT:
-
- if (!YESNO_OPENING(this->yesNoWindow)) {
- if (YESNO_CURRENT(this->yesNoWindow) == 1) {
- this->state = STATE_NORMAL;
- } else {
- this->state = STATE_LIMBO;
- StartTitleScreenStage(false, 0);
- }
- }
-
- break;
-
- }
-
- if (this->state >= STATE_NORMAL) {
- EmbeddedLayout_Process(this->layout);
- EmbeddedLayout_UpdateMatrix(this->layout);
- }
-
- return true;
-}
-
-int dScNewerWorldMap_c::onDraw() {
- EmbeddedLayout_AddToDrawList(this->layout);
-
- return true;
-}
-
-
-
-void NewerMapDrawFunc() {
- int keepCamera = GetCurrentCameraID();
-
- // All drawing uses scene 1, since that's the only one loaded by GAME_SETUP.
- // Todo: Newer-specific scenes?
-
- // Stage 1
- SetupLYTDrawing();
- DrawAllLayoutsBeforeX(129);
- GXDrawDone(); // is all GXDrawDone really needed..?
-
- // Stage 2
- Reset3DState();
- SetCurrentCameraID(0);
- LinkScene(0);
- SceneCalcWorld(0);
- SceneCameraStuff(0);
- ChangeAlphaUpdate(false);
- CalcMaterial();
- DrawOpa();
- DrawXlu();
- UnlinkScene(0);
- GXDrawDone();
-
- //Reset3DState();
- //T3D::DrawQueue();
-
- // Stage 3
- Reset3DState();
- SetupLYTDrawing();
- DrawAllLayoutsAfterXandBeforeY(128, 146);
- GXDrawDone();
-
- // Stage 4
- RemoveAllFromScnRoot();
- Reset3DState();
- SetCurrentCameraID(1);
-
- DoSpecialDrawing1();
- LinkScene(1);
- SceneCalcWorld(1);
- SceneCameraStuff(1);
- CalcMaterial();
- DrawOpa();
- DrawXlu();
-
- // Stage 5
- if (GAMEMGR_GET_AFC(GameMgr)) {
- for (int i = 0; i < 4; i++) {
- RenderEffects(0, 11+i);
- }
-
- for (int i = 0; i < 4; i++) {
- RenderEffects(0, 7+i);
- }
- }
-
- RenderEffects(0, 2); // need to investigate how this thing works
-
- DrawAllLayoutsAfterX(145);
- ClearLayoutDrawList(); // this is REALLY IMPORTANT!
-
- UnlinkScene(1);
-
- // End
- SetCurrentCameraID(0);
-}
-
+#include "worldmap.h"
+
+extern "C" void LoadMapScene();
+
+dScNewerWorldMap_c *dScNewerWorldMap_c::instance = 0;
+
+
+dScNewerWorldMap_c *dScNewerWorldMap_c::build() {
+ // return new dScNewerWorldMap_c;
+ OSReport("Creating WorldMap\n");
+
+ void *buffer = AllocFromGameHeap1(sizeof(dScNewerWorldMap_c));
+ dScNewerWorldMap_c *c = new(buffer) dScNewerWorldMap_c;
+
+ OSReport("Created WorldMap @ %p\n", c);
+
+ instance = c;
+ return c;
+}
+
+
+#define SELC_SETUP_DONE(sc) (*((bool*)(((u32)(sc))+0xD38)))
+
+#define EASYP_SETUP_DONE(ep) (*((bool*)(((u32)(ep))+0x278)))
+#define EASYP_ACTIVE(ep) (*((bool*)(((u32)(ep))+0x279)))
+
+#define CSMENU_SETUP_DONE(csm) (*((bool*)(((u32)(csm))+0x270)))
+#define CSMENU_ACTIVE(csm) (*((bool*)(((u32)(csm))+0x271)))
+#define CSMENU_CHOICE_OK(csm) (*((bool*)(((u32)(csm))+0x272)))
+#define CSMENU_UNK(csm) (*((bool*)(((u32)(csm))+0x273)))
+#define CSMENU_CURRENT(csm) (*((int*)(((u32)(csm))+0x268)))
+
+#define YESNO_SETUP_DONE(ynw) (*((bool*)(((u32)(ynw))+0x294)))
+#define YESNO_VISIBLE(ynw) (*((bool*)(((u32)(ynw))+0x295)))
+#define YESNO_CLOSE(ynw) (*((bool*)(((u32)(ynw))+0x296)))
+#define YESNO_OPENING(ynw) (*((bool*)(((u32)(ynw))+0x297)))
+#define YESNO_REFUSED(ynw) (*((bool*)(((u32)(ynw))+0x298)))
+#define YESNO_CANCELLED(ynw) (*((bool*)(((u32)(ynw))+0x299)))
+#define YESNO_CANCELLED2(ynw) (*((bool*)(((u32)(ynw))+0x29A)))
+#define YESNO_CURRENT(ynw) (*((int*)(((u32)(ynw))+0x284)))
+#define YESNO_TYPE(ynw) (*((int*)(((u32)(ynw))+0x28C)))
+
+#define NPCHG_SETUP_DONE(npc) (*((bool*)(((u32)(npc))+0x67C)))
+#define NPCHG_ACTIVE(npc) (*((bool*)(((u32)(npc))+0x67E)))
+#define NPCHG_HIDE_FOR_EASYP(npc) (*((bool*)(((u32)(npc))+0x67F)))
+#define NPCHG_READY(npc) (*((bool*)(((u32)(npc))+0x680)))
+#define NPCHG_CCSB(npc,idx) (((void**)(((u32)(npc))+0x74))[(idx)])
+#define NPCHG_CCSC(npc,idx) (((void**)(((u32)(npc))+0x84))[(idx)])
+#define NPCHG_CCSA(npc,idx) (((void**)(((u32)(npc))+0x94))[(idx)])
+#define NPCHG_CCI(npc,idx) (((void**)(((u32)(npc))+0xA4))[(idx)])
+#define NPCHG_2DPLAYER(npc,idx) (((void**)(((u32)(npc))+0x64C))[(idx)])
+
+#define STKI_SETUP_DONE(si) (*((bool*)(((u32)(si))+0x310)))
+#define STKI_SHADOW(si) (*((void**)(((u32)(si))+0x310)))
+#define STKI_2DPLAYER(si,idx) (((void**)(((u32)(si))+0x2E4))[(idx)])
+#define STKI_ITEM(si,idx) (((void**)(((u32)(si))+0x2F4))[(idx)])
+#define STKI_SHOW(si) (*((bool*)(((u32)(si))+0x8DD)))
+
+#define SIS_SETUP_DONE(sis) (*((bool*)(((u32)(sis))+0x260)))
+
+#define CCSB_ACTIVE(ccsb) (*((bool*)(((u32)(ccsb))+0x29C)))
+
+#define CCSC_ACTIVE(ccsc) (*((bool*)(((u32)(ccsc))+0x2A1)))
+
+#define PLAYER2D_SHOW_EASY_PAIRING(p2d) (*((bool*)(((u32)(p2d))+0x264)))
+
+#define CONT_LIVES(cont,idx) (((int*)(((u32)(cont))+0x2B8))[(idx)])
+#define CONT_SETUP_DONE(cont) (*((bool*)(((u32)(cont))+0x2D4)))
+#define CONT_UNK1(cont) (*((bool*)(((u32)(cont))+0x2D5)))
+#define CONT_UNK2(cont) (*((bool*)(((u32)(cont))+0x2D6)))
+#define CONT_DONE(cont) (*((bool*)(((u32)(cont))+0x2D7)))
+#define CONT_UNK3(cont) (*((bool*)(((u32)(cont))+0x2E0)))
+
+inline u8 GetSwitchStatus() {
+ return *((u8*)(((u32)GameMgr)+0x380));
+}
+
+inline void SetSwitchStatus(u8 stat) {
+ *((u8*)(((u32)GameMgr)+0x380)) = stat;
+}
+
+#define STATE_START_DVD 0
+#define STATE_LOAD_RES 1
+#define STATE_END_DVD 2
+#define STATE_SETUP_WAIT 3
+#define STATE_LIMBO 4
+#define STATE_CONTINUE_WAIT 5
+#define STATE_NORMAL 6
+#define STATE_OPT_CHANGE_WAIT 7
+#define STATE_CSMENU 8
+#define STATE_TITLE_CONFIRM_OPEN_WAIT 9
+#define STATE_TITLE_CONFIRM_SELECT 10
+#define STATE_TITLE_CONFIRM_HIT_WAIT 11
+#define STATE_PLAYER_CHANGE_WAIT 12
+#define STATE_EASY_PAIRING_WAIT 13
+#define STATE_POWERUPS_WAIT 14
+#define STATE_SAVE_OPEN 15
+#define STATE_SAVE_SELECT 16
+#define STATE_SAVE_WINDOW_CLOSE 17
+#define STATE_SAVE_DO 18
+#define STATE_SAVE_END_WINDOW 19
+#define STATE_SAVE_END_CLOSE_WAIT 20
+#define STATE_QUICKSAVE_OPEN 21
+#define STATE_QUICKSAVE_SELECT 22
+#define STATE_QUICKSAVE_WINDOW_CLOSE 23
+#define STATE_QUICKSAVE_DO 24
+#define STATE_QUICKSAVE_END_WINDOW 25
+#define STATE_QUICKSAVE_END_CLOSE_WAIT 26
+#define STATE_SAVE_ERROR 27
+
+#define MENU_HEIGHT 15
+
+const char *anim1 = "optionActivated.brlan";
+const char *anim2 = "optionDeactivated.brlan";
+
+const char *group1 = "G_opt00";
+const char *group2 = "G_opt01";
+const char *group3 = "G_opt02";
+const char *group4 = "G_opt03";
+const char *group5 = "G_opt04";
+const char *group6 = "G_opt05";
+const char *group7 = "G_opt06";
+const char *group8 = "G_opt07";
+const char *group9 = "G_opt08";
+const char *group10 = "G_opt09";
+const char *group11 = "G_opt10";
+const char *group12 = "G_opt11";
+const char *group13 = "G_opt12";
+const char *group14 = "G_opt13";
+const char *group15 = "G_opt14";
+
+
+void dScNewerWorldMap_c::StartLevel() {
+ LevelInfo_Entry *level = LevelInfo_GetLevels(this->levelInfo, this->currentPage);
+ level += this->selections[this->currentPage];
+ StartLevel(level);
+}
+
+void dScNewerWorldMap_c::StartLevel(LevelInfo_Entry *entry) {
+ for (int i = 0; i < 4; i++) {
+ bool isThere = QueryPlayerAvailability(i);
+ int id = Player_ID[i];
+ Player_Active[i] = isThere ? 1 : 0;
+ if (!isThere) Player_Flags[i] = 0;
+ }
+
+ StartLevelInfo sl;
+ sl.unk1 = 0;
+ sl.unk2 = 0xFF;
+ sl.unk3 = 0;
+ sl.unk4 = 0;
+ sl.purpose = 0;
+
+ sl.world1 = entry->world;
+ sl.world2 = entry->world;
+ sl.level1 = entry->level;
+ sl.level2 = entry->level;
+
+ // hopefully this will fix the Star Coin issues
+ SetSomeConditionShit(entry->world, entry->level, 2);
+
+ ActivateWipe(WIPE_MARIO);
+
+ DoStartLevel(GetGameMgr(), &sl);
+}
+
+void dScNewerWorldMap_c::SetTitle(const char *text) {
+ unsigned short conv_buf[0x200];
+ int length = strlen(text);
+ if (length > 0x1FF)
+ length = 0x1FF;
+
+ for (int i = 0; i < length; i++) {
+ conv_buf[i] = text[i];
+ }
+ conv_buf[length] = 0;
+
+ void *textBox = EmbeddedLayout_FindTextBoxByName(this->layout, "ScreenTitle");
+ TextBox_SetString(textBox, conv_buf, 0);
+}
+
+void dScNewerWorldMap_c::GenSBTitle() {
+ char buf[0x100];
+ sprintf(buf, "Switches: R:%s; G:%s; Y:%s; B:%s",
+ ((GetSwitchStatus() & 1) != 0) ? "On" : "Off",
+ ((GetSwitchStatus() & 2) != 0) ? "On" : "Off",
+ ((GetSwitchStatus() & 4) != 0) ? "On" : "Off",
+ ((GetSwitchStatus() & 8) != 0) ? "On" : "Off");
+ this->SetTitle(buf);
+}
+
+void dScNewerWorldMap_c::GenText() {
+ char buf[0x1FF];
+ char paneNameBuf[0x20];
+ char textBoxNameBuf[0x20];
+ unsigned short wchars[0x1FF];
+
+ SaveBlock *save = GetSaveFile()->GetBlock(-1);
+
+ LevelInfo_Section *section = LevelInfo_GetSection(this->levelInfo, this->currentPage);
+ LevelInfo_Entry *levels = LevelInfo_GetLevels(this->levelInfo, section);
+
+ int count = section->levelCount;
+
+ for (int i = 0; i < MENU_HEIGHT; i++) {
+ sprintf(paneNameBuf, "Opt%02d", i);
+ sprintf(textBoxNameBuf, "OptText%02d", i);
+ void *pane = EmbeddedLayout_FindPaneByName(this->layout, paneNameBuf);
+ void *textBox = EmbeddedLayout_FindTextBoxByName(this->layout, textBoxNameBuf);
+
+ if (i < count) {
+ // valid level
+ PANE_FLAGS(pane) |= 1;
+
+ u32 conds = save->GetLevelCondition(levels[i].world, levels[i].level);
+
+ char cond1, cond2, cond3, cond4, cond5;
+ cond1 = (conds & COND_NORMAL ? 'x' : '.');
+ cond2 = (conds & COND_SECRET ? 'x' : '.');
+ cond3 = (conds & COND_COIN1 ? 'x' : '.');
+ cond4 = (conds & COND_COIN2 ? 'x' : '.');
+ cond5 = (conds & COND_COIN3 ? 'x' : '.');
+
+ sprintf(buf, "%s %c%c %c%c%c", LevelInfo_GetName(this->levelInfo, &levels[i]), cond1, cond2, cond3, cond4, cond5);
+
+ for (int i = 0; i < 0x1FF; i++) {
+ wchars[i] = buf[i];
+ if (buf[i] == 0) break;
+ }
+
+ TextBox_SetString(textBox, wchars, 0);
+ } else {
+ // invalid, hide the pane
+ PANE_FLAGS(pane) &= ~1;
+ }
+ }
+}
+
+int dScNewerWorldMap_c::onCreate() {
+ OSReport("1:Loading scene\n");
+
+ LoadMapScene();
+ OSReport("2:Loading scene\n");
+ GameSetup__LoadScene(0); // lol, stolen from GAME_SETUP
+
+ OSReport("3:Layout alloc\n");
+ this->layout = (Layout*)AllocFromGameHeap1(sizeof(Layout));
+ if (!this->layout) {
+ OSReport("memalloc fail\n");
+ InfiniteLoop;
+ }
+
+ OSReport("4:Layout ctor\n");
+ EmbeddedLayout_ctor(this->layout);
+ OSReport("5:Layout load arc\n");
+ EmbeddedLayout_LoadArc(this->layout, "NewerRes/wmap.arc");
+
+ OSReport("6:Layout build\n");
+ if (!EmbeddedLayout_Build(this->layout, "levelSelect.brlyt", 0)) {
+ OSReport("build fail\n");
+ InfiniteLoop;
+ }
+
+
+ OSReport("7:Layout load brlan\n");
+ const char *anims[2] = {anim1, anim2};
+ EmbeddedLayout_LoadBrlans(this->layout, anims, 2);
+
+ const char *groups[30] = {
+ group1, group2, group3, group4, group5,
+ group6, group7, group8, group9, group10,
+ group11, group12, group13, group14, group15,
+ group1, group2, group3, group4, group5,
+ group6, group7, group8, group9, group10,
+ group11, group12, group13, group14, group15,
+ };
+
+ int mappings[30] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
+ OSReport("8:Layout load group\n");
+ EmbeddedLayout_LoadGroups(this->layout, groups, mappings, 30);
+
+ OSReport("9:Layout reset anims\n");
+ EmbeddedLayout_DisableAllAnims(this->layout);
+
+ for (int i = 0; i < 15; i++) {
+ EmbeddedLayout_ResetAnimToInitialState(this->layout, i, false);
+ }
+
+
+ OSReport("10:Item 1\n");
+ this->selectCursor = CreateParentedObject(SELECT_CURSOR, this, 0, 0);
+ OSReport("11:Item 2\n");
+ this->csMenu = CreateParentedObject(COURSE_SELECT_MENU, this, 0, 0);
+ OSReport("12:Item 3\n");
+ this->yesNoWindow = CreateParentedObject(YES_NO_WINDOW, this, 0, 0);
+ OSReport("13:Item 4\n");
+ this->numPeopleChange = CreateParentedObject(NUMBER_OF_PEOPLE_CHANGE, this, 0, 0);
+
+ for (int i = 0; i < 4; i++) {
+ OSReport("14:Character change select %d\n", i);
+ void *ccsb = CreateParentedObject(CHARACTER_CHANGE_SELECT_BASE, this, i, 0);
+ void *ccsc = CreateParentedObject(CHARACTER_CHANGE_SELECT_CONTENTS, this, i, 0);
+ void *ccsa = CreateParentedObject(CHARACTER_CHANGE_SELECT_ARROW, this, i, 0);
+ void *cci = CreateParentedObject(CHARACTER_CHANGE_INDICATOR, this, i, 0);
+
+ NPCHG_CCSB(this->numPeopleChange, i) = ccsb;
+ NPCHG_CCSC(this->numPeopleChange, i) = ccsc;
+ NPCHG_CCSA(this->numPeopleChange, i) = ccsa;
+ NPCHG_CCI(this->numPeopleChange, i) = cci;
+ }
+
+ OSReport("15:Item 5\n");
+ this->continueObj = CreateParentedObject(CONTINUE, this, 0, 0);
+
+ OSReport("16:Item 6\n");
+ this->stockItem = CreateParentedObject(STOCK_ITEM, this, 0, 0);
+ OSReport("17:Item 7\n");
+ this->stockItemShadow = CreateParentedObject(STOCK_ITEM_SHADOW, this, 0, 0);
+ STKI_SHADOW(this->stockItem) = this->stockItemShadow;
+
+ OSReport("18:Item 8\n");
+ this->easyPairing = CreateParentedObject(EASY_PAIRING, this, 0, 0);
+
+ this->state = STATE_START_DVD;
+
+ this->layout->drawOrder = 0;
+
+ *CurrentDrawFunc = NewerMapDrawFunc;
+
+ // level info
+ OSReport("19:Load level info\n");
+ this->levelInfo = LoadFile(&this->levelInfoFH, "/NewerRes/LevelInfo.bin");
+ OSReport("20:Prepare level info\n");
+ LevelInfo_Prepare(&this->levelInfoFH);
+
+ // load the menu info
+ OSReport("21:Load save info\n");
+ SaveBlock *save = GetSaveFile()->GetBlock(-1);
+
+ this->currentPage = save->current_world;
+
+ // bounds check
+ if (save->current_path_node >= 15)
+ save->current_path_node = 0;
+
+ int sCount = LevelInfo_GetSectionCount(this->levelInfo);
+ this->selections = (int*)AllocFromGameHeap1(sizeof(int) * sCount);
+
+ for (int i = 0; i < sCount; i++) {
+ this->selections[i] = 0;
+ }
+
+ this->selections[this->currentPage] = save->current_path_node;
+
+ // show button anim
+ OSReport("22:Enable anim\n");
+ EmbeddedLayout_EnableNonLoopAnim(this->layout, save->current_path_node, false);
+
+ OSReport("23:Make text\n");
+ this->GenText();
+ this->GenSBTitle();
+
+ OSReport("24:onCreate complete\n");
+ return true;
+}
+
+int dScNewerWorldMap_c::onDelete() {
+ EmbeddedLayout_FreeArc(this->layout);
+ EmbeddedLayout_Free(this->layout);
+ EmbeddedLayout_dtor(this->layout, false);
+ FreeFromGameHeap1(this->layout);
+
+ FreeFromGameHeap1(this->selections);
+
+ FreeFile(&this->levelInfoFH);
+
+ FreeScene(0);
+ FreeScene(1);
+
+ DVD_FreeFile(GetDVDClass2(), "SI_kinoko");
+ DVD_FreeFile(GetDVDClass2(), "SI_fireflower");
+ DVD_FreeFile(GetDVDClass2(), "SI_iceflower");
+ DVD_FreeFile(GetDVDClass2(), "SI_penguin");
+ DVD_FreeFile(GetDVDClass2(), "SI_propeller");
+ DVD_FreeFile(GetDVDClass2(), "SI_star");
+
+ return true;
+}
+
+int dScNewerWorldMap_c::onExecute() {
+
+ if (QueryGlobal5758(0xFFFFFFFF)) return true;
+ if (CheckIfWeCantDoStuff()) return true;
+
+ /**************************************************************************/
+ // Read Wiimote Buttons
+
+ int heldButtons = Remocon_GetButtons(GetActiveRemocon());
+ int nowPressed = Remocon_GetPressed(GetActiveRemocon());
+
+ /**************************************************************************/
+ // State Specific
+
+ switch (this->state) {
+ /**********************************************************************/
+ // STATE_START_DVD : Set up DVD
+ case STATE_START_DVD:
+
+ DVD_Start();
+ this->state = STATE_LOAD_RES;
+
+ break;
+
+ /**********************************************************************/
+ // STATE_LOAD_RES : Load extra stuff we need
+ case STATE_LOAD_RES:
+
+ DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_kinoko", 0);
+ DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_fireflower", 0);
+ DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_iceflower", 0);
+ DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_penguin", 0);
+ DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_propeller", 0);
+ DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_star", 0);
+ //DVD_LoadFile(GetDVDClass(), "Object", "fruits_kusa_gake", 0);
+
+ this->state = STATE_END_DVD;
+
+ break;
+
+ /**********************************************************************/
+ // STATE_END_DVD : Wait for files to load, end DVD
+ case STATE_END_DVD:
+
+ if (!DVD_StillLoading(GetDVDClass2())) {
+ if (DVD_End()) {
+ this->state = STATE_SETUP_WAIT;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_SETUP_WAIT : Waiting for the world map managers to be set up
+ case STATE_SETUP_WAIT: {
+
+ bool success = true;
+
+ success &= CSMENU_SETUP_DONE(this->csMenu);
+ success &= SELC_SETUP_DONE(this->selectCursor);
+ success &= NPCHG_SETUP_DONE(this->numPeopleChange);
+ success &= YESNO_SETUP_DONE(this->yesNoWindow);
+ success &= CONT_SETUP_DONE(this->continueObj);
+ success &= STKI_SETUP_DONE(this->stockItem);
+ success &= SIS_SETUP_DONE(this->stockItemShadow);
+ success &= EASYP_SETUP_DONE(this->easyPairing);
+
+ if (success) {
+ // ok, now we can set up other required shit
+
+ // first up: player models for Stocked Items
+ for (int i = 0; i < 4; i++) {
+ void *obj = CreateChildObject(WM_2D_PLAYER, this, i, 0, 0);
+ STKI_2DPLAYER(this->stockItem,i) = obj;
+ NPCHG_2DPLAYER(this->numPeopleChange,i) = obj;
+ }
+
+ // next: items for the Powerup screen
+ for (int i = 0; i < 7; i++) {
+ void *obj = CreateChildObject(WM_ITEM, this, i, 0, 0);
+ STKI_ITEM(this->stockItem,i) = obj;
+ }
+
+ // now, check if we need to handle Continue
+ if (CheckIfContinueShouldBeActivated()) {
+ this->state = STATE_CONTINUE_WAIT;
+ CONT_UNK1(this->continueObj) = true;
+ CONT_UNK2(this->continueObj) = true;
+ CONT_UNK3(this->continueObj) = false;
+ } else {
+ this->state = STATE_OPT_CHANGE_WAIT;
+ }
+ }
+
+ } break;
+
+ /**********************************************************************/
+ // STATE_CONTINUE_WAIT : Waiting for the Continue anim to finish
+ case STATE_CONTINUE_WAIT:
+
+ if (CONT_DONE(this->continueObj)) {
+ CONT_UNK1(this->continueObj) = 0;
+ CONT_UNK2(this->continueObj) = 0;
+ CONT_UNK3(this->continueObj) = 0;
+
+ for (int i = 0; i < 4; i++) {
+ int idx = SearchForIndexOfPlayerID(i);
+ Player_Lives[Player_ID[idx]] = CONT_LIVES(this->continueObj, i);
+ }
+
+ this->state = STATE_OPT_CHANGE_WAIT;
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_NORMAL : Nothing related to the menu is going on
+ case STATE_NORMAL: {
+
+ int currentPage = this->currentPage;
+ int currentSelection = this->selections[currentPage];
+ int newPage = currentPage;
+ int newSelection = currentSelection;
+
+ // Activate the menu
+ if (nowPressed & WPAD_PLUS) {
+ CSMENU_ACTIVE(this->csMenu) = true;
+ this->state = STATE_CSMENU;
+ }
+
+ if (nowPressed & WPAD_B) {
+ SetSwitchStatus((GetSwitchStatus() + 1) & 15);
+ this->GenSBTitle();
+ }
+
+ // Change the current level
+ if ((nowPressed & WPAD_UP) && currentSelection > 0) {
+ newSelection = currentSelection - 1;
+ }
+
+ if ((nowPressed & WPAD_DOWN) && currentSelection < (LevelInfo_GetSection(this->levelInfo, currentPage)->levelCount - 1)) {
+ newSelection = currentSelection + 1;
+ }
+
+ // Change the current world
+ if ((nowPressed & WPAD_LEFT) && currentPage > 0) {
+ newPage = currentPage - 1;
+ }
+
+ if ((nowPressed & WPAD_RIGHT) && currentPage < (LevelInfo_GetSectionCount(this->levelInfo) - 1)) {
+ newPage = currentPage + 1;
+ }
+
+
+ if (newPage != currentPage) {
+ this->currentPage = newPage;
+ this->GenText();
+
+ // do this to let the rest of the code handle animations
+ newSelection = this->selections[newPage];
+ }
+
+ if (newSelection != currentSelection) {
+ EmbeddedLayout_DisableAllAnims(this->layout);
+
+ // enable On animation
+ EmbeddedLayout_EnableNonLoopAnim(this->layout, newSelection, false);
+
+ // enable Off animation
+ EmbeddedLayout_EnableNonLoopAnim(this->layout, currentSelection+15, false);
+
+ this->selections[newPage] = newSelection;
+ this->state = STATE_OPT_CHANGE_WAIT;
+ }
+
+
+ // save the info to the file
+ if (currentSelection != newSelection || currentPage != newPage) {
+ SaveBlock *save = GetSaveFile()->GetBlock(-1);
+ save->current_world = newPage;
+ save->current_path_node = newSelection;
+ }
+
+
+ // Enter the current level
+ if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
+ this->StartLevel();
+ this->state = STATE_LIMBO; // just in case
+ }
+
+ if (nowPressed & WPAD_ONE) {
+ STKI_SHOW(this->stockItem) = true;
+ this->state = STATE_POWERUPS_WAIT;
+ }
+ } break;
+
+ /**********************************************************************/
+ // STATE_OPT_CHANGE_WAIT : Waiting for the option change animation to
+ // finish playing
+ case STATE_OPT_CHANGE_WAIT:
+
+ if (!EmbeddedLayout_CheckIfAnimationIsOn(this->layout, -1)) {
+ this->state = STATE_NORMAL;
+ }
+
+ break;
+ /**********************************************************************/
+ // STATE_CSMENU : The course select menu is currently being shown
+ case STATE_CSMENU:
+
+ // First off, check to see if it's been hidden
+ if (!CSMENU_ACTIVE(this->csMenu)) {
+ // That means something happened
+ if (CSMENU_CHOICE_OK(this->csMenu)) {
+ // Player pressed a button
+
+ switch (CSMENU_CURRENT(this->csMenu)) {
+ case 0:
+ // Star Coins
+ //OSReport("Star Coins was pressed\n");
+ this->state = STATE_NORMAL;
+ break;
+
+ case 1:
+ // Add/Drop Players
+ //OSReport("Add/Drop Players was pressed\n");
+ this->state = STATE_PLAYER_CHANGE_WAIT;
+ NPCHG_ACTIVE(this->numPeopleChange) = true;
+ WpadShit(10);
+
+ break;
+
+ case 2:
+ // Save or Quick Save
+ //OSReport("Save or Quick Save was pressed\n");
+ if (GetSaveFile()->GetBlock(-1)->bitfield & 2) {
+ this->state = STATE_SAVE_OPEN;
+ YESNO_TYPE(this->yesNoWindow) = 1;
+ YESNO_VISIBLE(this->yesNoWindow) = 1;
+
+ } else {
+ this->state = STATE_QUICKSAVE_OPEN;
+ YESNO_TYPE(this->yesNoWindow) = 15;
+ YESNO_VISIBLE(this->yesNoWindow) = 1;
+
+ }
+
+ break;
+
+ case 3:
+ // Title Screen
+ //OSReport("Title Screen was pressed\n");
+ this->state = STATE_TITLE_CONFIRM_OPEN_WAIT;
+ YESNO_VISIBLE(this->yesNoWindow) = true;
+ YESNO_TYPE(this->yesNoWindow) = 10;
+ break;
+ }
+
+ } else {
+ // Ok, change back to STATE_NORMAL
+ this->state = STATE_NORMAL;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_TITLE_CONFIRM_OPEN_WAIT : Waiting for the "Go to Title Screen"
+ // YesNoWindow to finish opening
+ case STATE_TITLE_CONFIRM_OPEN_WAIT:
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ this->state = STATE_TITLE_CONFIRM_SELECT;
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_TITLE_CONFIRM_SELECT : Let the user choose an option on the
+ // "Go to Title Screen" YesNoWindow.
+ case STATE_TITLE_CONFIRM_SELECT:
+
+ if (nowPressed & WPAD_LEFT) {
+ // Select "OK!"
+ YESNO_CURRENT(this->yesNoWindow) = 1;
+
+ } else if (nowPressed & WPAD_RIGHT) {
+ // Select "Cancel"
+ YESNO_CURRENT(this->yesNoWindow) = 0;
+
+ } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
+ // Pick the current option
+ YESNO_CLOSE(this->yesNoWindow) = true;
+ if (YESNO_CURRENT(this->yesNoWindow) != 1)
+ YESNO_REFUSED(this->yesNoWindow) = true;
+ this->state = STATE_TITLE_CONFIRM_HIT_WAIT;
+
+ } else {
+ // Cancel using B or 1
+ if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) {
+ YESNO_CANCELLED(this->yesNoWindow) = true;
+ YESNO_CURRENT(this->yesNoWindow) = true;
+ this->state = STATE_TITLE_CONFIRM_HIT_WAIT;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_TITLE_CONFIRM_HIT_WAIT : Process the user's chosen option on
+ // the "Go to Title Screen" YesNoWindow. Also, wait for the
+ // animation to be complete.
+ case STATE_TITLE_CONFIRM_HIT_WAIT:
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ if (YESNO_CURRENT(this->yesNoWindow) == 1) {
+ this->state = STATE_NORMAL;
+ } else {
+ this->state = STATE_LIMBO;
+ StartTitleScreenStage(false, 0);
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_PLAYER_CHANGE_WAIT : Wait for the user to do something on the
+ // Add/Drop Players screen.
+ case STATE_PLAYER_CHANGE_WAIT:
+
+ if (NPCHG_READY(this->numPeopleChange)) {
+ if (nowPressed & WPAD_PLUS) {
+ // activate easy pairing. FUN !!
+ NPCHG_HIDE_FOR_EASYP(this->numPeopleChange) = 1;
+
+ for (int i = 0; i < 4; i++) {
+ void *obj = NPCHG_2DPLAYER(this->numPeopleChange, i);
+ void *ccsb = NPCHG_CCSB(this->numPeopleChange, i);
+ void *ccsc = NPCHG_CCSC(this->numPeopleChange, i);
+
+ PLAYER2D_SHOW_EASY_PAIRING(obj) = 1;
+ CCSB_ACTIVE(ccsb) = 1;
+ CCSC_ACTIVE(ccsc) = 1;
+ }
+
+ EASYP_ACTIVE(this->easyPairing) = 1;
+ this->state = STATE_EASY_PAIRING_WAIT;
+ }
+ } else {
+ if (!NPCHG_ACTIVE(this->numPeopleChange)) {
+ this->state = STATE_NORMAL;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_EASY_PAIRING_WAIT : Wait for the user to exit Easy Pairing.
+ case STATE_EASY_PAIRING_WAIT:
+
+ if (!EASYP_ACTIVE(this->easyPairing)) {
+ NPCHG_HIDE_FOR_EASYP(this->numPeopleChange) = 0;
+
+ for (int i = 0; i < 4; i++) {
+ void *obj = NPCHG_2DPLAYER(this->numPeopleChange, i);
+ void *ccsb = NPCHG_CCSB(this->numPeopleChange, i);
+ void *ccsc = NPCHG_CCSC(this->numPeopleChange, i);
+
+ PLAYER2D_SHOW_EASY_PAIRING(obj) = 0;
+ CCSB_ACTIVE(ccsb) = 0;
+ CCSC_ACTIVE(ccsc) = 0;
+ }
+
+ this->state = STATE_PLAYER_CHANGE_WAIT;
+ WpadShit(10);
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_POWERUPS_WAIT : Wait for the user to exit the Powerups screen.
+ case STATE_POWERUPS_WAIT:
+
+ if (!STKI_SHOW(this->stockItem)) {
+ this->state = STATE_NORMAL;
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_SAVE_OPEN : Waiting for the "Save?" YesNoWindow to open
+ case STATE_SAVE_OPEN:
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ this->state = STATE_SAVE_SELECT;
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_SAVE_SELECT : Let the user choose an option on the
+ // "Save?" YesNoWindow.
+ case STATE_SAVE_SELECT:
+
+ if (nowPressed & WPAD_LEFT) {
+ // Select "OK!"
+ YESNO_CURRENT(this->yesNoWindow) = 1;
+
+ } else if (nowPressed & WPAD_RIGHT) {
+ // Select "Cancel"
+ YESNO_CURRENT(this->yesNoWindow) = 0;
+
+ } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
+ // Pick the current option
+ YESNO_CLOSE(this->yesNoWindow) = true;
+
+ if (YESNO_CURRENT(this->yesNoWindow) != 1)
+ YESNO_CANCELLED2(this->yesNoWindow) = true;
+ this->state = STATE_SAVE_WINDOW_CLOSE;
+
+ } else {
+ // Cancel using B or 1
+ if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) {
+ YESNO_CANCELLED(this->yesNoWindow) = true;
+ YESNO_CURRENT(this->yesNoWindow) = 1;
+ this->state = STATE_SAVE_WINDOW_CLOSE;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_SAVE_WINDOW_CLOSE : Process the user's chosen option on the
+ // "Save?" YesNoWindow. Also, wait for the animation to be complete.
+ case STATE_SAVE_WINDOW_CLOSE:
+
+ if (!YESNO_VISIBLE(this->yesNoWindow)) {
+ if (YESNO_CURRENT(this->yesNoWindow) == 1) {
+ this->state = STATE_NORMAL;
+ } else {
+ this->state = STATE_SAVE_DO;
+ SaveGame(0, false);
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_SAVE_DO : Save the game.
+ case STATE_SAVE_DO:
+
+ if (!GetSaveFile()->CheckIfWriting()) {
+ if (GetSaveHandler()->CurrentError == 0) {
+ YESNO_TYPE(this->yesNoWindow) = 2;
+ YESNO_VISIBLE(this->yesNoWindow) = true;
+ this->state = STATE_SAVE_END_WINDOW;
+ } else {
+ this->state = STATE_SAVE_ERROR;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_SAVE_END_WINDOW : Handle the Save End window.
+ case STATE_SAVE_END_WINDOW:
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
+ YESNO_CLOSE(this->yesNoWindow) = true;
+ this->state = STATE_SAVE_END_CLOSE_WAIT;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_SAVE_END_CLOSE_WAIT : Wait for the Save End window to close.
+ case STATE_SAVE_END_CLOSE_WAIT:
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ this->state = STATE_NORMAL;
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_QUICKSAVE_OPEN : Waiting for the "Save?" YesNoWindow to open
+ case STATE_QUICKSAVE_OPEN:
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ this->state = STATE_QUICKSAVE_SELECT;
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_QUICKSAVE_SELECT : Let the user choose an option on the
+ // "Save?" YesNoWindow.
+ case STATE_QUICKSAVE_SELECT:
+
+ if (nowPressed & WPAD_LEFT) {
+ // Select "OK!"
+ YESNO_CURRENT(this->yesNoWindow) = 1;
+
+ } else if (nowPressed & WPAD_RIGHT) {
+ // Select "Cancel"
+ YESNO_CURRENT(this->yesNoWindow) = 0;
+
+ } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
+ // Pick the current option
+ YESNO_CLOSE(this->yesNoWindow) = true;
+
+ if (YESNO_CURRENT(this->yesNoWindow) != 1)
+ YESNO_CANCELLED2(this->yesNoWindow) = true;
+ this->state = STATE_QUICKSAVE_WINDOW_CLOSE;
+
+ } else {
+ // Cancel using B or 1
+ if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) {
+ YESNO_CANCELLED(this->yesNoWindow) = true;
+ YESNO_CURRENT(this->yesNoWindow) = 1;
+ this->state = STATE_QUICKSAVE_WINDOW_CLOSE;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_QUICKSAVE_WINDOW_CLOSE : Process the user's chosen option on
+ // the "Save?" YesNoWindow. Also, wait for the animation to be complete
+ case STATE_QUICKSAVE_WINDOW_CLOSE:
+
+ if (!YESNO_VISIBLE(this->yesNoWindow)) {
+ if (YESNO_CURRENT(this->yesNoWindow) == 1) {
+ this->state = STATE_NORMAL;
+ } else {
+ this->state = STATE_QUICKSAVE_DO;
+ SaveGame(0, true);
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_QUICKSAVE_DO : Save the game.
+ case STATE_QUICKSAVE_DO:
+
+ if (!GetSaveFile()->CheckIfWriting()) {
+ if (GetSaveHandler()->CurrentError == 0) {
+ YESNO_TYPE(this->yesNoWindow) = 16;
+ YESNO_VISIBLE(this->yesNoWindow) = true;
+ this->state = STATE_QUICKSAVE_END_WINDOW;
+ } else {
+ this->state = STATE_SAVE_ERROR;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_QUICKSAVE_END_WINDOW : Handle the Save End window.
+ case STATE_QUICKSAVE_END_WINDOW:
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
+ YESNO_CLOSE(this->yesNoWindow) = true;
+ YESNO_REFUSED(this->yesNoWindow) = true;
+ this->state = STATE_QUICKSAVE_END_CLOSE_WAIT;
+ }
+ }
+
+ break;
+
+ /**********************************************************************/
+ // STATE_QUICKSAVE_END_CLOSE_WAIT : Wait for Save End window to close
+ case STATE_QUICKSAVE_END_CLOSE_WAIT:
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ if (YESNO_CURRENT(this->yesNoWindow) == 1) {
+ this->state = STATE_NORMAL;
+ } else {
+ this->state = STATE_LIMBO;
+ StartTitleScreenStage(false, 0);
+ }
+ }
+
+ break;
+
+ }
+
+ if (this->state >= STATE_NORMAL) {
+ EmbeddedLayout_Process(this->layout);
+ EmbeddedLayout_UpdateMatrix(this->layout);
+ }
+
+ return true;
+}
+
+int dScNewerWorldMap_c::onDraw() {
+ EmbeddedLayout_AddToDrawList(this->layout);
+
+ return true;
+}
+
+
+
+void NewerMapDrawFunc() {
+ int keepCamera = GetCurrentCameraID();
+
+ // All drawing uses scene 1, since that's the only one loaded by GAME_SETUP.
+ // Todo: Newer-specific scenes?
+
+ // Stage 1
+ SetupLYTDrawing();
+ DrawAllLayoutsBeforeX(129);
+ GXDrawDone(); // is all GXDrawDone really needed..?
+
+ // Stage 2
+ Reset3DState();
+ SetCurrentCameraID(0);
+ LinkScene(0);
+ SceneCalcWorld(0);
+ SceneCameraStuff(0);
+ ChangeAlphaUpdate(false);
+ CalcMaterial();
+ DrawOpa();
+ DrawXlu();
+ UnlinkScene(0);
+ GXDrawDone();
+
+ //Reset3DState();
+ //T3D::DrawQueue();
+
+ // Stage 3
+ Reset3DState();
+ SetupLYTDrawing();
+ DrawAllLayoutsAfterXandBeforeY(128, 146);
+ GXDrawDone();
+
+ // Stage 4
+ RemoveAllFromScnRoot();
+ Reset3DState();
+ SetCurrentCameraID(1);
+
+ DoSpecialDrawing1();
+ LinkScene(1);
+ SceneCalcWorld(1);
+ SceneCameraStuff(1);
+ CalcMaterial();
+ DrawOpa();
+ DrawXlu();
+
+ // Stage 5
+ if (GAMEMGR_GET_AFC(GameMgr)) {
+ for (int i = 0; i < 4; i++) {
+ RenderEffects(0, 11+i);
+ }
+
+ for (int i = 0; i < 4; i++) {
+ RenderEffects(0, 7+i);
+ }
+ }
+
+ RenderEffects(0, 2); // need to investigate how this thing works
+
+ DrawAllLayoutsAfterX(145);
+ ClearLayoutDrawList(); // this is REALLY IMPORTANT!
+
+ UnlinkScene(1);
+
+ // End
+ SetCurrentCameraID(0);
+}
+
diff --git a/src/worldmap.h b/src/worldmap.h
index 0cf567e..82032e6 100644
--- a/src/worldmap.h
+++ b/src/worldmap.h
@@ -1,63 +1,63 @@
-/*
- * Newer Super Mario Bros. Wii
- * World Maps
- *
- * Wish me luck. That's all I'm saying. --Treeki
- * Started: 03/06/2010; 11:52pm
- */
-
-// TODO: add Save Error state
-
-//#define WM_DEBUGGING
-
-#include <common.h>
-#include <game.h>
-
-#include "layoutlib.h"
-#include "fileload.h"
-#include "levelinfo.h"
-
-#ifdef WM_DEBUGGING
-#define MapReport OSReport
-#else
-inline void MapReport(const char *str, ...) { }
-#endif
-
-void NewerMapDrawFunc();
-
-
-// WORLD MAP CLASS LAYOUT
-class dScNewerWorldMap_c : public dScene_c {
-public:
- Layout *layout;
- int currentPage;
- int *selections;
- int state;
- void *csMenu;
- void *selectCursor;
- void *numPeopleChange;
- void *yesNoWindow;
- void *continueObj;
- void *stockItem;
- void *stockItemShadow;
- void *easyPairing;
-
- void *levelInfo;
- FileHandle levelInfoFH;
-
- void StartLevel(LevelInfo_Entry *entry);
-
- void StartLevel();
- void GenText();
- void GenSBTitle();
- void SetTitle(const char *text);
-
- int onCreate();
- int onDelete();
- int onExecute();
- int onDraw();
-
- static dScNewerWorldMap_c *build();
- static dScNewerWorldMap_c *instance;
-};
-
+/*
+ * Newer Super Mario Bros. Wii
+ * World Maps
+ *
+ * Wish me luck. That's all I'm saying. --Treeki
+ * Started: 03/06/2010; 11:52pm
+ */
+
+// TODO: add Save Error state
+
+//#define WM_DEBUGGING
+
+#include <common.h>
+#include <game.h>
+
+#include "layoutlib.h"
+#include "fileload.h"
+#include "levelinfo.h"
+
+#ifdef WM_DEBUGGING
+#define MapReport OSReport
+#else
+inline void MapReport(const char *str, ...) { }
+#endif
+
+void NewerMapDrawFunc();
+
+
+// WORLD MAP CLASS LAYOUT
+class dScNewerWorldMap_c : public dScene_c {
+public:
+ Layout *layout;
+ int currentPage;
+ int *selections;
+ int state;
+ void *csMenu;
+ void *selectCursor;
+ void *numPeopleChange;
+ void *yesNoWindow;
+ void *continueObj;
+ void *stockItem;
+ void *stockItemShadow;
+ void *easyPairing;
+
+ void *levelInfo;
+ FileHandle levelInfoFH;
+
+ void StartLevel(LevelInfo_Entry *entry);
+
+ void StartLevel();
+ void GenText();
+ void GenSBTitle();
+ void SetTitle(const char *text);
+
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+
+ static dScNewerWorldMap_c *build();
+ static dScNewerWorldMap_c *instance;
+};
+