@Vague Rant Hi. Do you have the knowledge for making wii u controllers hacks ?
Some games like planes have multiplayer mode, but the second player must play with wiimote+nunchuk instead of pro controller. Thanks.
Any chance we could get a "Classic Controller = GameCube Controller" hack? I have a bunch of the GameCube styled classic controllers and it would be nice to have them recognized as GameCube controllers in the games that support the GC controller.
@Vague Rant
Re: Accelerometer data
Do you have an example PPC assembly for accelerometer stuff? I know i put the 0x20 wiimote unused values in the button assembly, but we need an example for the calc_acc assembly part
I can't really give an example that applies to many games simultaneously (like the button or pointer support) because the read_kpad_acc() function changed a lot over the course of the Wii's lifespan, so my accelerometer hacks are never the same between any two games. Basically you have to locate where the accelerometer data gets loaded into read_kpad_acc() (where this data is pulled from also varies) and insert your own floating point values. Here's an example of a basic single-frame, single-axis swing:
Code:
lfs f1, 0x???(r3) ; load in the real accelerometer data
lwz r4, 0x4(r3) ; read newly pressed buttons this frame
andi. r0, r4, 0x80 ; was fake shake 0x80 pressed?
beq- RETURN ; if not, don't do anything
; magic
bl GRAB
MAGIC:
SHAKE: .float 3.4 ; maximum value registered by the wiimote accelerometer
GRAB:
mflr r5
lfs f1, SHAKE-MAGIC(r5) ; replace real accelerometer data with 3.4
RETURN:
And here's another example, I'll put this one in a spoiler because it's quite a bit longer due to the specific requirements of the game:
This one handles shaking both the Wiimote and Nunchuk on two axes, oscillating continuous shakes in alternating directions while also ensuring that the Wiimote and Nunchuk are shaking in opposite directions to one another, because that was important for this game (Simpsons). It also handles doing this separately for two players, since the game is multiplayer.
You can sometimes locate where the data gets read from by looking for calc_acc() as I mentioned in a previous post, but older games don't use calc_acc() at all. Also, because different games have different expectations for what swinging, shaking, etc. looks like, they all have different requirements. Some games want a swing or shake to last for multiple frames, some expect the shake to first go in one direction then return again (as the forces would naturally from you moving the Wiimote), etc.
Accelerometer support is 100% the toughest part of any of these hacks. To the extent that many of them have stumped me, the two things I hit up against are the accelerometers (both Wiimote and Nunchuk have eluded me many times) and games not using KPAD at all. Since I don't have a solid handle on it myself and it's just something I have to work on individually each game, I don't really have much in the way of general advice for accelerometer stuff.
@Vague Rant Hi. Do you have the knowledge for making wii u controllers hacks ?
Some games like planes have multiplayer mode, but the second player must play with wiimote+nunchuk instead of pro controller. Thanks.
I don't really know much at all about Wii U game hacking, unfortunately. JGecko U never really worked for me, but apparently there was an attempt a while back at making a more reliable Gecko code tool for Wii U. I haven't heard any news about it in a while ago though, so it may not have ended up happening. It's definitely something I'd be interested to look into if it ever becomes more approachable, because I have a similar problem with games that only support the GamePad, e.g. all the Lego games require player 1 to be on the Wii U GamePad. It would be nice to not have to start a 2-player game then drop player 1 and play as player 2 forever, etc.
Any chance we could get a "Classic Controller = GameCube Controller" hack? I have a bunch of the GameCube styled classic controllers and it would be nice to have them recognized as GameCube controllers in the games that support the GC controller.
Not something I have planned or that I know anything about currently, but I'm in the same situation, so I agree it would be nice. It's a lot more complex translating between one controller library and another, and GameCube pads have their own separate library to Wii Remotes/Nunchuks/Classic Controllers.
The second entry in Next Level Games' Strikers series, many would argue Mario Strikers Charged remains the best in the franchise. Building upon the solid foundations set by the GameCube debut, the titular charging mechanic rewards players who make more dynamic plays by enabling Skillshots. In classic Mario style, characters and fields in the game all have their own uniquely themed characteristics, making every match different. However, unlike the rest of the Mario sports games, the Strikers titles have a unique style that's explosive and sometimes downright violent, something we don't often see in the Mushroom Kingdom.
Highlight for @awesomeee who was interested in this game.
Menus
Navigation Gameplay
Defend Goal against Mega-Strike
Wiimote Shake
Y
Gameplay
Big Hit
(rough tackle)
Nunchuk Stick
Left Stick
Gameplay
Movement
Nunchuk C
X
Gameplay
Use Item
Nunchuk Z
ZL
Gameplay
Chip Ball
Modify Shots and Passes
Nunchuk Shake
L
Gameplay
Switch Item
General Notes
If you're using this hack in a Wii VC injection on Wii U, you must use the "Force Classic Controller connected" option in your injection software. Thanks to @awesomeee for the report!
The control scheme here is adapted from both the GameCube prequel and Switch sequel. Where possible it mostly mimics the Switch version due to the more similar controller layout compared to the GameCube, but both get some decent representation here.
The biggest difference compared to the Switch version is that it uses B to Pass and A to Shoot, while this hack has those the opposite way around (like the GameCube and Wii games). This is mainly so that the menu behavior is normal, but it's also perfectly fine. I'm not sure why Nintendo swapped them on Switch anyway.
The Switch game doesn't include the feature of being able to toggle between your held items. That was performed with Z on the GameCube version, but here it's on L. That's because the R button was added as an additional way to Deke/Slide Tackle in the Switch release, so I mirrored that here. That function is also available on the Right Stick, as it was in both the GameCube and Switch games.
The GameCube and Switch games both have a Dash button (R/ZR), but there's no dashing in Charged, so the extra trigger is just a backup Shoot button. I couldn't think of anything else particularly useful to put there.
Technical Notes
Code breakdown:
C2: Bypass Nunchuk error and read controllers in "Nunchuk mode" when Classic is connected
C2: simulate Wiimote shakes
C2: read Classic Controller left stick as Nunchuk stick and simulate Nunchuk shakes
C2 in calc_dpd_variable: IR pointer emulation
C2 and C2 in __a1_37_data_type() (WOR)/__parse_cl_data() (KOR): right stick d-pad emulation and button injector
; __a1_37_data_type
; note: separate d-pad emulation after injector
; button injector
; 803D4F80 for USA
; 803D31D8 for EUR (Rev 1)
; 803D3768 for EUR (Rev 2)
; 803D53E0 for JPN
lha r3, 0x0(r30)
CLASSIC_HOME:
andi. r4, r0, 0x800
beq- CLASSIC_UP
ori r3, r3, 0x8000 ; home
CLASSIC_UP:
andi. r4, r0, 0x1
beq- CLASSIC_DOWN
ori r3, r3, 0x8 ; up (v) / left (h)
CLASSIC_DOWN:
andi. r4, r0, 0x4000
beq- CLASSIC_LEFT
ori r3, r3, 0x4 ; down (v) / right (h)
CLASSIC_LEFT:
andi. r4, r0, 0x2
beq- CLASSIC_RIGHT
ori r3, r3, 0x1 ; left (v) / down (h)
CLASSIC_RIGHT:
andi. r4, r0, 0x8000
beq- CLASSIC_A
ori r3, r3, 0x2 ; right (v) / up (h)
CLASSIC_A:
andi. r4, r0, 0x10
beq- CLASSIC_B
ori r3, r3, 0x800 ; a
CLASSIC_B:
andi. r4, r0, 0x40
beq- CLASSIC_X
ori r3, r3, 0x400 ; b
CLASSIC_X:
andi. r4, r0, 0x8
beq- CLASSIC_Y
ori r3, r3, 0x4000 ; c
CLASSIC_Y:
andi. r4, r0, 0x20
beq- CLASSIC_L
ori r3, r3, 0x80 ; wiimote shake
CLASSIC_L:
andi. r4, r0, 0x2000
beq- CLASSIC_R
ori r3, r3, 0x40 ; nunchuk shake
CLASSIC_R:
andi. r4, r0, 0x200
beq- CLASSIC_ZL
ori r3, r3, 0x2 ; right (v) / up (h)
CLASSIC_ZL:
andi. r4, r0, 0x80
beq- CLASSIC_ZR
ori r3, r3, 0x2000 ; z
CLASSIC_ZR:
andi. r4, r0, 0x4
beq- CLASSIC_PLUS
ori r3, r3, 0x400 ; b
CLASSIC_PLUS:
andi. r4, r0, 0x400
beq- CLASSIC_MINUS
ori r3, r3, 0x200 ; 1
CLASSIC_MINUS:
andi. r4, r0, 0x1000
beq- CLASSIC_DONE
ori r3, r3, 0x200 ; 1
CLASSIC_DONE:
sth r3, 0x0(r30)
Code:
; __parse_cl_data
; note: separate d-pad emulation after injector
; button injector
; 803DE414 for KOR
lha r7, 0x0(r5)
CLASSIC_HOME:
andi. r6, r0, 0x800
beq- CLASSIC_UP
ori r7, r7, 0x8000 ; home
CLASSIC_UP:
andi. r6, r0, 0x1
beq- CLASSIC_DOWN
ori r7, r7, 0x8 ; up (v) / left (h)
CLASSIC_DOWN:
andi. r6, r0, 0x4000
beq- CLASSIC_LEFT
ori r7, r7, 0x4 ; down (v) / right (h)
CLASSIC_LEFT:
andi. r6, r0, 0x2
beq- CLASSIC_RIGHT
ori r7, r7, 0x1 ; left (v) / down (h)
CLASSIC_RIGHT:
andi. r6, r0, 0x8000
beq- CLASSIC_A
ori r7, r7, 0x2 ; right (v) / up (h)
CLASSIC_A:
andi. r6, r0, 0x10
beq- CLASSIC_B
ori r7, r7, 0x800 ; a
CLASSIC_B:
andi. r6, r0, 0x40
beq- CLASSIC_X
ori r7, r7, 0x400 ; b
CLASSIC_X:
andi. r6, r0, 0x8
beq- CLASSIC_Y
ori r7, r7, 0x4000 ; c
CLASSIC_Y:
andi. r6, r0, 0x20
beq- CLASSIC_L
ori r7, r7, 0x80 ; wiimote shake
CLASSIC_L:
andi. r6, r0, 0x2000
beq- CLASSIC_R
ori r7, r7, 0x40 ; nunchuk shake
CLASSIC_R:
andi. r6, r0, 0x200
beq- CLASSIC_ZL
ori r7, r7, 0x2 ; right (v) / up (h)
CLASSIC_ZL:
andi. r6, r0, 0x80
beq- CLASSIC_ZR
ori r7, r7, 0x2000 ; z
CLASSIC_ZR:
andi. r6, r0, 0x4
beq- CLASSIC_PLUS
ori r7, r7, 0x400 ; b
CLASSIC_PLUS:
andi. r6, r0, 0x400
beq- CLASSIC_MINUS
ori r7, r7, 0x200 ; 1
CLASSIC_MINUS:
andi. r6, r0, 0x1000
beq- CLASSIC_DONE
ori r7, r7, 0x200 ; 1
CLASSIC_DONE:
sth r7, 0x0(r5)
The dreaded Next Level Games! Again! Doing Spider-Man first ended up being a huge help here, as the games do some things similarly. The major difference between them is that Mario Strikers uses low-level WPAD accelerometer data, meaning this game is a step more difficult again from Spider-Man. The rest was all pretty much adapted from Spider-Man, which was nice. Like with the Nunchuk stick stuff in Spider-Man, my approach to the WPAD accelerometer stuff was very much game-specific, so it's not likely to be portable to other games, possibly barring other NLG titles.
Without looking up release dates, it seems like this game's region ports must have spanned a long time. The EUR versions seem the oldest, SDK-wise, followed by USA/JPN and lastly KOR. This mostly just amounted to finding everything again multiple times, but the much-newer SDK used in the KOR release meant I had to track down a completely separate function to do the button injections. Ubisoft's Rabbids Go Home was useful when doing the KOR version, as it seems to be from about the same period and comes with debug symbols.
I can't really give an example that applies to many games simultaneously (like the button or pointer support) because the read_kpad_acc() function changed a lot over the course of the Wii's lifespan, so my accelerometer hacks are never the same between any two games. Basically you have to locate where the accelerometer data gets loaded into read_kpad_acc() (where this data is pulled from also varies) and insert your own floating point values. Here's an example of a basic single-frame, single-axis swing:
Code:
lfs f1, 0x???(r3) ; load in the real accelerometer data
lwz r4, 0x4(r3) ; read newly pressed buttons this frame
andi. r0, r4, 0x80 ; was fake shake 0x80 pressed?
beq- RETURN ; if not, don't do anything
; magic
bl GRAB
MAGIC:
SHAKE: .float 3.4 ; maximum value registered by the wiimote accelerometer
GRAB:
mflr r5
lfs f1, SHAKE-MAGIC(r5) ; replace real accelerometer data with 3.4
RETURN:
And here's another example, I'll put this one in a spoiler because it's quite a bit longer due to the specific requirements of the game:
This one handles shaking both the Wiimote and Nunchuk on two axes, oscillating continuous shakes in alternating directions while also ensuring that the Wiimote and Nunchuk are shaking in opposite directions to one another, because that was important for this game (Simpsons). It also handles doing this separately for two players, since the game is multiplayer.
You can sometimes locate where the data gets read from by looking for calc_acc() as I mentioned in a previous post, but older games don't use calc_acc() at all. Also, because different games have different expectations for what swinging, shaking, etc. looks like, they all have different requirements. Some games want a swing or shake to last for multiple frames, some expect the shake to first go in one direction then return again (as the forces would naturally from you moving the Wiimote), etc.
Accelerometer support is 100% the toughest part of any of these hacks. To the extent that many of them have stumped me, the two things I hit up against are the accelerometers (both Wiimote and Nunchuk have eluded me many times) and games not using KPAD at all. Since I don't have a solid handle on it myself and it's just something I have to work on individually each game, I don't really have much in the way of general advice for accelerometer stuff.
I don't really know much at all about Wii U game hacking, unfortunately. JGecko U never really worked for me, but apparently there was an attempt a while back at making a more reliable Gecko code tool for Wii U. I haven't heard any news about it in a while ago though, so it may not have ended up happening. It's definitely something I'd be interested to look into if it ever becomes more approachable, because I have a similar problem with games that only support the GamePad, e.g. all the Lego games require player 1 to be on the Wii U GamePad. It would be nice to not have to start a 2-player game then drop player 1 and play as player 2 forever, etc.
Not something I have planned or that I know anything about currently, but I'm in the same situation, so I agree it would be nice. It's a lot more complex translating between one controller library and another, and GameCube pads have their own separate library to Wii Remotes/Nunchuks/Classic Controllers.
The second entry in Next Level Games' Strikers series, many would argue Mario Strikers Charged remains the best in the franchise. Building upon the solid foundations set by the GameCube debut, the titular charging mechanic rewards players who make more dynamic plays by enabling Skillshots. In classic Mario style, characters and fields in the game all have their own uniquely themed characteristics, making every match different. However, unlike the rest of the Mario sports games, the Strikers titles have a unique style that's explosive and sometimes downright violent, something we don't often see in the Mushroom Kingdom.
Highlight for @awesomeee who was interested in this game.
Menus
Navigation Gameplay
Defend Goal against Mega-Strike
Wiimote Shake
Y
Gameplay
Big Hit
(rough tackle)
Nunchuk Stick
Left Stick
Gameplay
Movement
Nunchuk C
X
Gameplay
Use Item
Nunchuk Z
ZL
Gameplay
Chip Ball
Modify Shots and Passes
Nunchuk Shake
L
Gameplay
Switch Item
General Notes
The control scheme here is adapted from both the GameCube prequel and Switch sequel. Where possible it mostly mimics the Switch version due to the more similar controller layout compared to the GameCube, but both get some decent representation here.
The biggest difference compared to the Switch version is that it uses B to Pass and A to Shoot, while this hack has those the opposite way around (like the GameCube and Wii games). This is mainly so that the menu behavior is normal, but it's also perfectly fine. I'm not sure why Nintendo swapped them on Switch anyway.
The Switch game doesn't include the feature of being able to toggle between your held items. That was performed with Z on the GameCube version, but here it's on L. That's because the R button was added as an additional way to Deke/Slide Tackle in the Switch release, so I mirrored that here. That function is also available on the Right Stick, as it was in both the GameCube and Switch games.
The GameCube and Switch games both have a Dash button (R/ZR), but there's no dashing in Charged, so the extra trigger is just a backup Shoot button. I couldn't think of anything else particularly useful to put there.
Technical Notes
Code breakdown:
C2: Bypass Nunchuk error and read controllers in "Nunchuk mode" when Classic is connected
C2: simulate Wiimote shakes
C2: read Classic Controller left stick as Nunchuk stick and simulate Nunchuk shakes
C2 in calc_dpd_variable: IR pointer emulation
C2 and C2 in __a1_37_data_type() (WOR)/__parse_cl_data() (KOR): right stick d-pad emulation and button injector
; __a1_37_data_type
; note: separate d-pad emulation after injector
; button injector
; 803D4F80 for USA
; 803D31D8 for EUR (Rev 1)
; 803D3768 for EUR (Rev 2)
; 803D53E0 for JPN
lha r3, 0x0(r30)
CLASSIC_HOME:
andi. r4, r0, 0x800
beq- CLASSIC_UP
ori r3, r3, 0x8000 ; home
CLASSIC_UP:
andi. r4, r0, 0x1
beq- CLASSIC_DOWN
ori r3, r3, 0x8 ; up (v) / left (h)
CLASSIC_DOWN:
andi. r4, r0, 0x4000
beq- CLASSIC_LEFT
ori r3, r3, 0x4 ; down (v) / right (h)
CLASSIC_LEFT:
andi. r4, r0, 0x2
beq- CLASSIC_RIGHT
ori r3, r3, 0x1 ; left (v) / down (h)
CLASSIC_RIGHT:
andi. r4, r0, 0x8000
beq- CLASSIC_A
ori r3, r3, 0x2 ; right (v) / up (h)
CLASSIC_A:
andi. r4, r0, 0x10
beq- CLASSIC_B
ori r3, r3, 0x800 ; a
CLASSIC_B:
andi. r4, r0, 0x40
beq- CLASSIC_X
ori r3, r3, 0x400 ; b
CLASSIC_X:
andi. r4, r0, 0x8
beq- CLASSIC_Y
ori r3, r3, 0x4000 ; c
CLASSIC_Y:
andi. r4, r0, 0x20
beq- CLASSIC_L
ori r3, r3, 0x80 ; wiimote shake
CLASSIC_L:
andi. r4, r0, 0x2000
beq- CLASSIC_R
ori r3, r3, 0x40 ; nunchuk shake
CLASSIC_R:
andi. r4, r0, 0x200
beq- CLASSIC_ZL
ori r3, r3, 0x2 ; right (v) / up (h)
CLASSIC_ZL:
andi. r4, r0, 0x80
beq- CLASSIC_ZR
ori r3, r3, 0x2000 ; z
CLASSIC_ZR:
andi. r4, r0, 0x4
beq- CLASSIC_PLUS
ori r3, r3, 0x400 ; b
CLASSIC_PLUS:
andi. r4, r0, 0x400
beq- CLASSIC_MINUS
ori r3, r3, 0x200 ; 1
CLASSIC_MINUS:
andi. r4, r0, 0x1000
beq- CLASSIC_DONE
ori r3, r3, 0x200 ; 1
CLASSIC_DONE:
sth r3, 0x0(r30)
Code:
; __parse_cl_data
; note: separate d-pad emulation after injector
; button injector
; 803DE414 for KOR
lha r7, 0x0(r5)
CLASSIC_HOME:
andi. r6, r0, 0x800
beq- CLASSIC_UP
ori r7, r7, 0x8000 ; home
CLASSIC_UP:
andi. r6, r0, 0x1
beq- CLASSIC_DOWN
ori r7, r7, 0x8 ; up (v) / left (h)
CLASSIC_DOWN:
andi. r6, r0, 0x4000
beq- CLASSIC_LEFT
ori r7, r7, 0x4 ; down (v) / right (h)
CLASSIC_LEFT:
andi. r6, r0, 0x2
beq- CLASSIC_RIGHT
ori r7, r7, 0x1 ; left (v) / down (h)
CLASSIC_RIGHT:
andi. r6, r0, 0x8000
beq- CLASSIC_A
ori r7, r7, 0x2 ; right (v) / up (h)
CLASSIC_A:
andi. r6, r0, 0x10
beq- CLASSIC_B
ori r7, r7, 0x800 ; a
CLASSIC_B:
andi. r6, r0, 0x40
beq- CLASSIC_X
ori r7, r7, 0x400 ; b
CLASSIC_X:
andi. r6, r0, 0x8
beq- CLASSIC_Y
ori r7, r7, 0x4000 ; c
CLASSIC_Y:
andi. r6, r0, 0x20
beq- CLASSIC_L
ori r7, r7, 0x80 ; wiimote shake
CLASSIC_L:
andi. r6, r0, 0x2000
beq- CLASSIC_R
ori r7, r7, 0x40 ; nunchuk shake
CLASSIC_R:
andi. r6, r0, 0x200
beq- CLASSIC_ZL
ori r7, r7, 0x2 ; right (v) / up (h)
CLASSIC_ZL:
andi. r6, r0, 0x80
beq- CLASSIC_ZR
ori r7, r7, 0x2000 ; z
CLASSIC_ZR:
andi. r6, r0, 0x4
beq- CLASSIC_PLUS
ori r7, r7, 0x400 ; b
CLASSIC_PLUS:
andi. r6, r0, 0x400
beq- CLASSIC_MINUS
ori r7, r7, 0x200 ; 1
CLASSIC_MINUS:
andi. r6, r0, 0x1000
beq- CLASSIC_DONE
ori r7, r7, 0x200 ; 1
CLASSIC_DONE:
sth r7, 0x0(r5)
The dreaded Next Level Games! Again! Doing Spider-Man first ended up being a huge help here, as the games do some things similarly. The major difference between them is that Mario Strikers uses low-level WPAD accelerometer data, meaning this game is a step more difficult again from Spider-Man. The rest was all pretty much adapted from Spider-Man, which was nice. Like with the Nunchuk stick stuff in Spider-Man, my approach to the WPAD accelerometer stuff was very much game-specific, so it's not likely to be portable to other games, possibly barring other NLG titles.
Without looking up release dates, it seems like this game's region ports must have spanned a long time. The EUR versions seem the oldest, SDK-wise, followed by USA/JPN and lastly KOR. This mostly just amounted to finding everything again multiple times, but the much-newer SDK used in the KOR release meant I had to track down a completely separate function to do the button injections. Ubisoft's Rabbids Go Home was useful when doing the KOR version, as it seems to be from about the same period and comes with debug symbols.
For first player gamepad games like lego games, the only way i know is to map a usb hid pad as gamepad with hid2vpad.
You can play wirelessly with cronus adapter (zen or max, i don't remember).
Aroma plugin gamepad2pro seems to do the same thing. I didn't test it yet because i'm still on haxchi cfw lol.
Alright, im working on another hack, but an andi. instruction I found has different register values then usual. It is andi. r6, r0, 0x9F1F. Is this normal for some games? Thanks in advance.
Update: this was a game that read buttons inside of read_kpad_button.
Alright, im working on another hack, but an andi. instruction I found has different register values then usual. It is andi. r6, r0, 0x9F1F. Is this normal for some games? Thanks in advance.
Update: this was a game that read buttons inside of read_kpad_button.
I've never seen that myself, but it's probably not that unusual. That mask is filtering out 0x2000 and 0x4000 (the Nunchuk buttons) as well as 0x80, 0x40 and 0x20 (three unused Wiimote button values, which are what I use to check for fake inputs that I've created, e.g. Wiimote shakes, etc.), so nothing that would harm things in an unmodified game.
Hudson Soft's Lost in Shadow (USA)/A Shadow's Tale (EUR) is a creative puzzle-platformer about light and shadow. Taking on the role of a shadow severed from the body it belongs to, players must navigate what would traditionally be the background of a platforming landscape, the shadows cast by the world resting in the foreground. With its art direction headed up by Studio Ghibli's Hiromasa Ogura, its gentle aesthetic also saw frequent comparisons to Fumito Ueda's Ico. To be clear, this is not an Ico-tier game by any measure, but it's a fun and creative twist on platforming which asks players to consider light and perspective in a way no other platformers do, and that's cool.
This was actually one of the very first games I looked at when exploring Classic Controller hacks. At the time, I had no idea how to handle the IR pointer, so I discounted it and moved on. Looking at my list of failed hacks (it's about as long as the success list!) I saw this and realized it deserved another shot.
This game makes pretty light use of the IR pointer, so I don't think traditional controls hurt it at all. You're mostly doing fairly conventional platforming (albeit with an unconventional presentation), with occasional interactive obstacles you can point at to change the environment. Doing this with the Right Stick and ZR feels pretty good, so I'm surprised the game has never been ported away from the Wii (unless you count the official Wii U VC release).
Shadow is practically a three-button game (A/B/Z), so there's lots of room to double map things here. Each of the three main buttons has two mappings, so you should be able to find something that feels satisfying to you. The menus are only slightly weird (with Cancel on X/ZR) but if you've played a Wii game before you should be used to canceling with the right trigger button.
I fixed a potential bug with this hack where the KPAD library might (rarely) return a bunch of random button values. In my testing, I've only encountered this with one game (a hack that didn't end up on that success list) but if you're playing any of the previous hacks and notice the controls ever going nuts, please tell me about it so I can add this fix to that game as well.
If you're interested in what I think is going on internally, I'll break it down in the Technical Notes.
Technical Notes
Code breakdown:
C2: still read Nunchuk analog stick when Classic is connected
C2 and C2: bypass Nunchuk error
C2 in calc_dpd_variable(): IR pointer emulation, on a timer; because some obstacles just have you pointing and pressing B a few times in a row, pressing B also resets the delay before the IR pointer switches off again
04 in read_kpad_ext(): redirect Classic into Nunchuk stick
04 and 04 in KPADRead(): potential bug fix for lag frames, I'll go into more detail below
C2 in read_kpad_button(): button injector
Code:
; read_kpad_button
; 80171444 for USA
; 80171614 for EUR
; 80171AF4 for JPN
; r4 holds extType
; r6 holds wiimote bitfield
; r7 holds wiimote+nunchuk bitfield
; r8 holds classic bitfield
cmpwi r4, 0x2
bne- RETURN
li r4, 0x1 ; i'm a nunchuk
CLASSIC_HOME:
andi. r0, r8, 0x800
beq- CLASSIC_UP
ori r7, r7, 0x8000 ; home
CLASSIC_UP:
andi. r0, r8, 0x1
beq- CLASSIC_DOWN
ori r7, r7, 0x8 ; up (v) / left (h)
CLASSIC_DOWN:
andi. r0, r8, 0x4000
beq- CLASSIC_LEFT
ori r7, r7, 0x4 ; down (v) / right (h)
CLASSIC_LEFT:
andi. r0, r8, 0x2
beq- CLASSIC_RIGHT
ori r7, r7, 0x1 ; left (v) / down (h)
CLASSIC_RIGHT:
andi. r0, r8, 0x8000
beq- CLASSIC_A
ori r7, r7, 0x2 ; right (v) / up (h)
CLASSIC_A:
andi. r0, r8, 0x10
beq- CLASSIC_B
ori r7, r7, 0x800 ; a
CLASSIC_B:
andi. r0, r8, 0x40
beq- CLASSIC_X
ori r7, r7, 0x800 ; a
CLASSIC_X:
andi. r0, r8, 0x8
beq- CLASSIC_Y
ori r7, r7, 0x400 ; b
CLASSIC_Y:
andi. r0, r8, 0x20
beq- CLASSIC_L
ori r7, r7, 0x2000 ; z
CLASSIC_L:
andi. r0, r8, 0x2000
beq- CLASSIC_R
ori r7, r7, 0x1 ; left (v) / down (h)
CLASSIC_R:
andi. r0, r8, 0x200
beq- CLASSIC_ZL
ori r7, r7, 0x2 ; right (v) / up (h)
CLASSIC_ZL:
andi. r0, r8, 0x80
beq- CLASSIC_ZR
ori r7, r7, 0x2000 ; z
CLASSIC_ZR:
andi. r0, r8, 0x4
beq- CLASSIC_PLUS
ori r7, r7, 0x400 ; b
CLASSIC_PLUS:
andi. r0, r8, 0x400
beq- CLASSIC_MINUS
ori r7, r7, 0x10 ; plus
CLASSIC_MINUS:
andi. r0, r8, 0x1000
beq- CLASSIC_DONE
ori r7, r7, 0x1000 ; minus
CLASSIC_DONE:
or r6, r6, r7
RETURN:
andi. r0, r6, 0x9FFF
In a previous hack which I didn't release because I wasn't able to figure out all of the required motions, I had a super rare bug where sometimes the buttons would go haywire for a single frame, for no apparent reason. I think I've figured out what was going wrong in that game and I'll be including the above fix in any future hacks (and any I return to with fixes) just in case.
I don't know for certain this is what's going on, but KPADRead() has special handling for some type of input reads where instead of receiving new button values, the library gets back a -1/0xFFFF. In this event, KPADRead() will instead use the previous frame's buttons. The problem with that in these hacks is that the "previous frame's buttons" is the Nunchuk analog stick in these hacks, because we're emulating having a Nunchuk stick, which reads from the same location.
When the library tries to read back the previous frame's buttons, it gets a bunch of garbage data (analog stick movement) and then it feeds that garbage data into the button injector to translate into Wiimote button inputs, hence the buttons going haywire for a single frame. This workaround simply ensures that the CC buttons are blanked out in that situation instead, so nothing gets injected into the Wiimote.
I don't know what exactly causes this situation, whether it's games with poor performance that drop frames, missed packets in the Bluetooth controller connection or anything else. While I don't know why it happens, this fix should at least prevent random unintended inputs from occurring in future. Again, if you've encountered this in any other games, it'd be hugely helpful if you could let me know. It's difficult to test because it occurs so rarely in my experience, so I don't actually have confirmation that this workaround resolves the issue, but I'm almost certain it does.
I've never seen that myself, but it's probably not that unusual. That mask is filtering out 0x2000 and 0x4000 (the Nunchuk buttons) as well as 0x80, 0x40 and 0x20 (three unused Wiimote button values, which are what I use to check for fake inputs that I've created, e.g. Wiimote shakes, etc.), so nothing that would harm things in an unmodified game.
Sounds interesting! Are there enough buttons left for all of the things you can do in Mario Kart Wii? Accelerate, Brake, Slide, Item, Trick, Wheelie ... there's only really four buttons on the Wiimote that are (somewhat) usable in sideways layout, so it'd be pretty crowded. But it might be fun to see if anything could be worked out.
Classic Con Hacking Returns! Donkey Kong Country Returns is the revival of the classic SNES trilogy, crafted by Retro Studios (Metroid Prime). The game was critically acclaimed then and now, and remains one of the least controversial sequels on the Wii. There's no Kremlings, some people didn't like that. But the game is stellar in all respects and one of the best Wii games and/or 2D platformers ever created. Can you tell I like this one?
That said, this needs a bit more intro than most, because crediar's original Classic Controller hack for Donkey Kong Country Returns a) already exists and b) kicked off this entire genre of Wii hack. Where the original hack had the Classic Controller simulate a sideways Wii Remote, in revisiting this game, I've instead had the Classic Controller be recognized as a Wii Remote & Nunchuk combo, which provides full analog movement on the Classic Controller. As a small bonus, this feature is optional and can be toggled on/off individually for both players while in-game. Highlight for @NestorM who asked about this game.
As mentioned in the intro, this is essentially two Classic Controller hacks working in tandem, so there are two button layouts: one when simulating the Wiimote and Nunchuk and another for simulating the solo Wiimote.
The default is the Nunchuk layout, so let's start with that. This layout matches the one used by Donkey Kong Country Returns 3D on the 3DS and Tropical Freeze on Wii U and Switch.
Next, let's take a look at the Wiimote layout. I matched the later games in the series as closely as possible here, but since there's no analog movement on the Wii Remote, the Grab buttons are now both Grab and Run, as in the actual, physical Wiimote button layout.
[TABLE=full]
[TR]
[TH]Wii Remote[/TH]
[TH]Classic Controller[/TH]
[TH]Game Function[/TH]
[/TR]
[TR]
[TD]Home[/TD]
[TD]Home
Home Menu works as normal[/TD]
[TD]Open/Close Home Button Menu[/TD]
[/TR]
[TR]
[TD]D-Pad[/TD]
[TD]D-Pad[/TD]
[TD]Menus
Navigation Gameplay
Movement[/TD]
[/TR]
[TR]
[TD]A[/TD]
[TD]A[/TD]
[TD]World Map
Zoom Out[/TD]
[/TR]
[TR]
[TD]B[/TD]
[TD][/TD]
crediar's original hack is amazing and brought this game to many who might otherwise have been turned off by the motion controls. If this updated hack seems useless to you, it probably is. That said, this was an opportunity to expand on crediar's incredible work and make the game even more flexible in its controls. I credit crediar in all of my Classic Controller hacks, since they continue to use parts of the original DKCR hack, but obviously this one owes even more to crediar. A fun note is that the very first line of the code comes unchanged from crediar's original, which was pleasing to me.
In North America, two different disc revisions of Donkey Kong Country Returns were pressed, the original (Rev 0) and Rev 1 which included some minor fixes. You will need to know which hack to apply depending on which disc you own. Lazy approach: just try both and see which one works. Slightly less lazy: inspect the disc and look for the revision marking (00 or 01) etched on the inner ring. High effort: back up your disc, load it up in Dolphin, right click it, and look at Properties > Info > Name. It will say either Donkey Kong Country Returns (Disc 1, Revision 0) or (Disc 1, Revision 1). And then you'll know.
The Wiimote/Nunchuk toggle feature is relatively pointless, I know. Generally, people want to play with one or the other, not alternate between two different control schemes. Honestly, my main motivation was just that toggling between two different extension controllers with a button combo seemed funny. That said, there is maybe one situation where this is useful. If you've got one actual Classic Controller and one SNES Classic Mini controller and want to play multiplayer, the player with the SNES pad can toggle to Wiimote mode and have D-Pad control, while the Classic Controller retains analog support. Will anybody ever actually do this? Nope. Technically, this satisfies NestorM's request that you be able to play with both the D-Pad and analog stick, you just have to be two different people.
Technical Notes
Besides the first line of the code mentioned earlier and the standard button injector, this is a complete rewrite of the Classic Controller hack. It's of course still derived from crediar's hack in other ways, as that hack provided something of a roadmap to several of the relevant functions. For example, while my approach ended up being completely different, the original Wiimote shaking hack was hugely informative when tracking down shaking on the Nunchuk. Anyway, let's break down the code.
04
crediar's original patch which prevents shaking from being disabled when a Classic Controller is inserted into the base of the Wiimote.
C2
This is the actual shake hack. In a point of difference from most Wii games, DKCR does not use read_kpad_acc() to read the accelerometers. That was a significant challenge since I've mostly worked with that function to emulate motion controls. Where crediar's original hack injected some fake motion data into the low-level accelerometer data, I took a different approach where I'm coming in at the "other end" (after the motion controls have been evaluated) and enabling the "player shook the controller/s" bits. This amounts to setting and unsetting six bits (presumably six axes?) on alternating frames. In Nunchuk mode, the shakes alternate each frame (Wiimote on frame 0, Nunchuk on frame 1, Wiimote on frame 2) so you're shaking every single frame. On the solo Wiimote, this is just Wiimote, no shake, Wiimote, no shake. I'm storing whether you're currently on the Wiimote or Nunchuk/no shake frame separately for each player.
C2, C2 and C2
The next three codes are all just checking if the user is on a Classic Controller and redirecting Nunchuk analog stick reads to the Classic Controller left stick. The third one is checking for relatively small movements; I don't know what it actually does but my guess is that it's keeping the controller awake (resetting the five minute sleep timer) if the player is touching the analog stick, while leaving some leeway for bad dead zone inputs. Just a guess, though.
04
This patches a check that your extension controller is not >1 (Nunchuk) to >2 (Classic Controller).
20 and C2
The first of these is setting up the default controller mode (Nunchuk style) in some free memory, then patching the game to read the mode from memory instead of using the hardcoded values. Then the C2 is handling multiplayer: adjusting the offset where the values should be read from depending on whether you're player 1 or 2. DKCR aligns all functions to 0x10 (16) bytes, so there's a lot of free space if you add it all up (between 0-12 bytes free between every function). I only needed 4 bytes to save both controllers, so that was fine. There was a one-in-four risk that one of the disc regions would have, by pure coincidence, already been aligned to 0x10 bytes, rendering this approach slightly more complicated, but thankfully none of them were and the hack was able to be reused unchanged.
C2 and C2
Finally getting to some SDK stuff, this is read_kpad_dpd() and read_kpad_button(). The former has nothing interesting going on, but button is doing a lot of heavy lifting this time around. Since we're using it to toggle between Nunchuk and Wiimote modes, we have to call the function which handles extension changes from within the button injector. This is actually the function from the above paragraph. DKCR doesn't have symbols, so the name I came up with for it was ControllerTypeEnumerator(), since it reads the extension and then sets different values for each EXT type (including several invalid ones like Classic Controller). Anyway, when the user toggles controls with Plus and Minus, I'm adjusting the controller values set up in the previous paragraph for the current player, storing r3, r4 and the link register on the stack, then calling the extension toggle function.
Sounds interesting! Are there enough buttons left for all of the things you can do in Mario Kart Wii? Accelerate, Brake, Slide, Item, Trick, Wheelie ... there's only really four buttons on the Wiimote that are (somewhat) usable in sideways layout, so it'd be pretty crowded. But it might be fun to see if anything could be worked out.
Classic Con Hacking Returns! Donkey Kong Country Returns is the revival of the classic SNES trilogy, crafted by Retro Studios (Metroid Prime). The game was critically acclaimed then and now, and remains one of the least controversial sequels on the Wii. There's no Kremlings, some people didn't like that. But the game is stellar in all respects and one of the best Wii games and/or 2D platformers ever created. Can you tell I like this one?
That said, this needs a bit more intro than most, because crediar's original Classic Controller hack for Donkey Kong Country Returns a) already exists and b) kicked off this entire genre of Wii hack. Where the original hack had the Classic Controller simulate a sideways Wii Remote, in revisiting this game, I've instead had the Classic Controller be recognized as a Wii Remote & Nunchuk combo, which provides full analog movement on the Classic Controller. As a small bonus, this feature is optional and can be toggled on/off individually for both players while in-game. Highlight for @NestorM who asked about this game.
As mentioned in the intro, this is essentially two Classic Controller hacks working in tandem, so there are two button layouts: one when simulating the Wiimote and Nunchuk and another for simulating the solo Wiimote.
The default is the Nunchuk layout, so let's start with that. This layout matches the one used by Donkey Kong Country Returns 3D on the 3DS and Tropical Freeze on Wii U and Switch.
Next, let's take a look at the Wiimote layout. I matched the later games in the series as closely as possible here, but since there's no analog movement on the Wii Remote, the Grab buttons are now both Grab and Run, as in the actual, physical Wiimote button layout.
[TABLE=full]
[TR]
[TH]Wii Remote[/TH]
[TH]Classic Controller[/TH]
[TH]Game Function[/TH]
[/TR]
[TR]
[TD]Home[/TD]
[TD]Home
Home Menu works as normal[/TD]
[TD]Open/Close Home Button Menu[/TD]
[/TR]
[TR]
[TD]D-Pad[/TD]
[TD]D-Pad[/TD]
[TD]Menus
Navigation Gameplay
Movement[/TD]
[/TR]
[TR]
[TD]A[/TD]
[TD]A[/TD]
[TD]World Map
Zoom Out[/TD]
[/TR]
[TR]
[TD]B[/TD]
[TD][/TD]
crediar's original hack is amazing and brought this game to many who might otherwise have been turned off by the motion controls. If this updated hack seems useless to you, it probably is. That said, this was an opportunity to expand on crediar's incredible work and make the game even more flexible in its controls. I credit crediar in all of my Classic Controller hacks, since they continue to use parts of the original DKCR hack, but obviously this one owes even more to crediar. A fun note is that the very first line of the code comes unchanged from crediar's original, which was pleasing to me.
In North America, two different disc revisions of Donkey Kong Country Returns were pressed, the original (Rev 0) and Rev 1 which included some minor fixes. You will need to know which hack to apply depending on which disc you own. Lazy approach: just try both and see which one works. Slightly less lazy: inspect the disc and look for the revision marking (00 or 01) etched on the inner ring. High effort: back up your disc, load it up in Dolphin, right click it, and look at Properties > Info > Name. It will say either Donkey Kong Country Returns (Disc 1, Revision 0) or (Disc 1, Revision 1). And then you'll know.
The Wiimote/Nunchuk toggle feature is relatively pointless, I know. Generally, people want to play with one or the other, not alternate between two different control schemes. Honestly, my main motivation was just that toggling between two different extension controllers with a button combo seemed funny. That said, there is maybe one situation where this is useful. If you've got one actual Classic Controller and one SNES Classic Mini controller and want to play multiplayer, the player with the SNES pad can toggle to Wiimote mode and have D-Pad control, while the Classic Controller retains analog support. Will anybody ever actually do this? Nope. Technically, this satisfies NestorM's request that you be able to play with both the D-Pad and analog stick, you just have to be two different people.
Technical Notes
Besides the first line of the code mentioned earlier and the standard button injector, this is a complete rewrite of the Classic Controller hack. It's of course still derived from crediar's hack in other ways, as that hack provided something of a roadmap to several of the relevant functions. For example, while my approach ended up being completely different, the original Wiimote shaking hack was hugely informative when tracking down shaking on the Nunchuk. Anyway, let's break down the code.
04
crediar's original patch which prevents shaking from being disabled when a Classic Controller is inserted into the base of the Wiimote.
C2
This is the actual shake hack. In a point of difference from most Wii games, DKCR does not use read_kpad_acc() to read the accelerometers. That was a significant challenge since I've mostly worked with that function to emulate motion controls. Where crediar's original hack injected some fake motion data into the low-level accelerometer data, I took a different approach where I'm coming in at the "other end" (after the motion controls have been evaluated) and enabling the "player shook the controller/s" bits. This amounts to setting and unsetting six bits (presumably six axes?) on alternating frames. In Nunchuk mode, the shakes alternate each frame (Wiimote on frame 0, Nunchuk on frame 1, Wiimote on frame 2) so you're shaking every single frame. On the solo Wiimote, this is just Wiimote, no shake, Wiimote, no shake. I'm storing whether you're currently on the Wiimote or Nunchuk/no shake frame separately for each player.
C2, C2 and C2
The next three codes are all just checking if the user is on a Classic Controller and redirecting Nunchuk analog stick reads to the Classic Controller left stick. The third one is checking for relatively small movements; I don't know what it actually does but my guess is that it's keeping the controller awake (resetting the five minute sleep timer) if the player is touching the analog stick, while leaving some leeway for bad dead zone inputs. Just a guess, though.
04
This patches a check that your extension controller is not >1 (Nunchuk) to >2 (Classic Controller).
20 and C2
The first of these is setting up the default controller mode (Nunchuk style) in some free memory, then patching the game to read the mode from memory instead of using the hardcoded values. Then the C2 is handling multiplayer: adjusting the offset where the values should be read from depending on whether you're player 1 or 2. DKCR aligns all functions to 0x10 (16) bytes, so there's a lot of free space if you add it all up (between 0-12 bytes free between every function). I only needed 4 bytes to save both controllers, so that was fine. There was a one-in-four risk that one of the disc regions would have, by pure coincidence, already been aligned to 0x10 bytes, rendering this approach slightly more complicated, but thankfully none of them were and the hack was able to be reused unchanged.
C2 and C2
Finally getting to some SDK stuff, this is read_kpad_dpd() and read_kpad_button(). The former has nothing interesting going on, but button is doing a lot of heavy lifting this time around. Since we're using it to toggle between Nunchuk and Wiimote modes, we have to call the function which handles extension changes from within the button injector. This is actually the function from the above paragraph. DKCR doesn't have symbols, so the name I came up with for it was ControllerTypeEnumerator(), since it reads the extension and then sets different values for each EXT type (including several invalid ones like Classic Controller). Anyway, when the user toggles controls with Plus and Minus, I'm adjusting the controller values set up in the previous paragraph for the current player, storing r3, r4 and the link register on the stack, then calling the extension toggle function.
You are doing a great work, yesterday i was daydreaming about a system level wii remote emulation with the classic controller, but i guess its something difficult. You are doing the second best thing, thank you.
I would also like to ask you if there is a way to remap the buttons, it would be better to set Grap on the Y and Jump on B even if confirm on menus become B, and the use ZR to do the shaking?
You are doing a great work, yesterday i was daydreaming about a system level wii remote emulation with the classic controller, but i guess its something difficult. You are doing the second best thing, thank you.
I would also like to ask you if there is a way to remap the buttons, it would be better to set Grap on the Y and Jump on B even if confirm on menus become B, and the use ZR to do the shaking?
I would usually help, but sadly that game doesnt have any technical notes to do so. Even then the game has a complex + and - control swap which would further complicate it, apologies.
You are doing a great work, yesterday i was daydreaming about a system level wii remote emulation with the classic controller, but i guess its something difficult. You are doing the second best thing, thank you.
I would also like to ask you if there is a way to remap the buttons, it would be better to set Grap on the Y and Jump on B even if confirm on menus become B, and the use ZR to do the shaking?
For Donkey Kong Country Returns, Confirm/Jump already is on B, so it sounds like you just want Y and ZR swapped? In that case uh, sec ... you want to Ctrl+F in the code and edit these lines:
Nunchuk layout:
Code:
41820008 60E70080
41820008 60E70400
The first one is the Y button shake (0080) and the second one is the ZR button grab (0400). Swap those values to have them trigger the opposite function.
Wiimote layout:
Code:
60E70080 71062000
60E70200 71060400
Same again here (but on the left side this time), you want to swap 0080 with 0200 to swap shake and grab.
I would usually help, but sadly that game doesnt have any technical notes to do so. Even then the game has a complex + and - control swap which would further complicate it, apologies.
Yeah, Donkey Kong Country Returns was before I wrote my own button injector and other functions, so it's not entirely my code to share (being co-credited to crediar who did the original hack) so I wouldn't really be comfortable posting it. It's still possible to manually edit the code like above but not as user-friendly.
As the fourth(-ish) game in the TT Games series, Lego Indiana Jones: The Original Adventures was the first to branch out from the Star Wars branding, so at this point it's more of a Lego Harrison Ford series than anything else. Adapting the original trilogy of films from the '80s (Raiders of the Lost Ark, Temple of Doom and The Last Crusade), the game was released as a loose tie-in to the 2008 revival movie, Kingdom of the Crystal Skull, though it does not cover the events of that film. Besides the change in setting, gameplay continues in the same vein as previous entries, with the usual light platforming, puzzle-solving and combat. This one is generally regarded as the superior of the two Lego Indiana Jones games.
It won't shock you to discover that the control handling in this game is extremely similar to Lego Star Wars: The Complete Saga. I believe they get slightly more complicated after this point as they added IR aiming to the series, so we'll see how that goes.
Once again, the control scheme here is essentially that of Lego games on traditional gamepads. Due to the button layout of the Wiimote & Nunchuk, this does lead to some menu weirdness (B to Confirm, Y/ZR to Cancel), but gameplay feels like a Lego game on any other platform. Button injector source in the Technical Notes if you need to change anything.
Technical Notes
Code breakdown:
C2: support reading Nunchuk Stick from Classic Left Stick
C2 in calc_dpd_variable(): IR pointer emulation
04 in read_kpad_stick(): Classic to Nunchuk stick redirection
04 and C2 in KPADRead(): lag frame button fix and button injector
Code:
; button injector
; 80022BE8 for USA/EUR
; r4 holds extType
; r7 holds wiimote bitfield
; r8 holds wiimote+nunchuk bitfield
; r9 holds classic bitfield
CLASSIC:
cmpwi r4, 0x2
bne- RETURN
li r4, 0x1 ; i'm a nunchuk
CLASSIC_HOME:
andi. r0, r9, 0x800
beq- CLASSIC_UP
ori r8, r8, 0x8000 ; home
CLASSIC_UP:
andi. r0, r9, 0x1
beq- CLASSIC_DOWN
ori r8, r8, 0x8 ; up (v) / left (h)
CLASSIC_DOWN:
andi. r0, r9, 0x4000
beq- CLASSIC_LEFT
ori r8, r8, 0x4 ; down (v) / right (h)
CLASSIC_LEFT:
andi. r0, r9, 0x2
beq- CLASSIC_RIGHT
ori r8, r8, 0x1 ; left (v) / down (h)
CLASSIC_RIGHT:
andi. r0, r9, 0x8000
beq- CLASSIC_A
ori r8, r8, 0x2 ; right (v) / up (h)
CLASSIC_A:
andi. r0, r9, 0x10
beq- CLASSIC_B
ori r8, r8, 0x2000 ; z
CLASSIC_B:
andi. r0, r9, 0x40
beq- CLASSIC_X
ori r8, r8, 0x800 ; a
CLASSIC_X:
andi. r0, r9, 0x8
beq- CLASSIC_Y
ori r8, r8, 0x4000 ; c
CLASSIC_Y:
andi. r0, r9, 0x20
beq- CLASSIC_L
ori r8, r8, 0x400 ; b
CLASSIC_L:
andi. r0, r9, 0x2000
beq- CLASSIC_R
ori r8, r8, 0x200 ; 1
CLASSIC_R:
andi. r0, r9, 0x200
beq- CLASSIC_ZL
ori r8, r8, 0x100 ; 2
CLASSIC_ZL:
andi. r0, r9, 0x80
beq- CLASSIC_ZR
ori r8, r8, 0x2000 ; z
CLASSIC_ZR:
andi. r0, r9, 0x4
beq- CLASSIC_PLUS
ori r8, r8, 0x400 ; b
CLASSIC_PLUS:
andi. r0, r9, 0x400
beq- CLASSIC_MINUS
ori r8, r8, 0x10 ; plus
CLASSIC_MINUS:
andi. r0, r9, 0x1000
beq- RETURN
ori r8, r8, 0x1000 ; minus
RETURN:
or r7, r7, r8
andi. r0, r7, 0x9FFF
Merry christmas all! Im glad we were able to get these amazing hacks, @Vague Rant Thank you for all of your amazing work and documentation. You should 100% take a break now that i think about it, spend time with family etc. Anyways im still open to helping people remap any games controls. @tech_A_nina Do you still want the jett rocket controls remapped? If so, what WAD version are you using?
Early Happy new years aswell New hack will come out soon hopefully (one of my hacks)
Re: This whole project. @Vague Rant Before this awesome project finishes, i reccomend you make a seperate Wii thread with a LOT of documentation on these hacks. From how to make it, accelerometer examples, WPADProbe method documentation, maybe even a video.
Thanks, and have a good christmas break all! (Or whatever you celebrate lol)
I am playing Little Kings Story right now, so no need to hack Jett Rocket again any time soon, but thank you. You deserve a big break as well. After all it's Christmas. Everybody enjoy Christmas with your loved ones
Thanks for the tests, great info to have. Do those two have the same issue with the Nunchuk message unnecessarily halting the game? I'll have a look at whether I can do the same for them.
Well, it's almost Christmas, so let's all think back to the festive flop that was 2012's Rise of the Guardians from Dreamworks, and its video game adaptation from Torus Games. As a team of mythical holiday characters (Santa Claus, the Easter Bunny, the Tooth Fairy, etc.), players must defeat the villainous Pitch Black, the source of all nightmares. Gameplay is modeled after Gauntlet and similar top-down dungeon crawlers, amounting to an RPG-influenced four-player co-op hack-and-slash through environments connected to each character's respective seasonal tales.
Home
Technically, B is your A button, but see General Notes
Open/Close Home Menu
Wiimote D-Pad
D-Pad
Menus
Navigation Gameplay
Switch Characters
Wiimote A
B
Menus
Confirm Gameplay
Attack
Wiimote B
ZR
Menus
Cancel Gameplay
Block
Wiimote 1
Minus
Gameplay
View Map
Wiimote 2
Plus
Gameplay
Pause
Wiimote Plus
R
Gameplay
Dreamsand (Revive)
Co-Op Drop-In
Wiimote Minus
Not mapped
(use R instead)
Gameplay
Dreamsand (Revive)
Wiimote Pointer
Left Stick
Home Button Menu
Navigation
Wiimote A + Wiimote Shake
Y
Gameplay
Special Attack 1
Nunchuk Stick
Left Stick
Gameplay
Movement
Nunchuk C
ZL
Gameplay
Dodge
Nunchuk Z
L
Gameplay
Team Attack
Wiimote A + Nunchuk Shake
A
Gameplay
Special Attack 2
Wiimote A + Wiimote & Nunchuk Shake
X
Gameplay
Special Attack 3
General Notes
Look, all right, this game is not great. Is there a better Christmas game on Wii? Probably, I dunno. This one has solid production values but there's barely a game here, all gameplay amounts to "Kill all the stuff in this area, then go to the next area." To the extent that there's variety in the gameplay, it's that the reason why you're killing all the stuff changes. "Kill all the stuff to secure this fast travel waypoint. Kill all the stuff to rescue this NPC. Kill all the stuff just because, we didn't make a reason this time."
I'm being kind of harsh. In defense of the game, I will say that it's very competently made by a studio with a solid reputation for making pretty all right licensed games. There's some interesting mechanics here like building your characters out with skill points and gems to suit your style of play. It's just that none of it matters because all you really need to do is stand around pressing the attack button until everything dies. If you or somebody you know is into the movie, you'll have a decent time with this game. The presentation is nice, it's not buggy or anything, there's just not much going on.
If you're here because you're playing these games as Wii VC injections on Wii U, you're doing it wrong, because this game launched simultaneously on the Wii U. You can just play the actual Wii U version in HD if that's what you're after. You're being weird.
Speaking of the Wii U version, that's where the control scheme here comes from. This does lead to a bit of weirdness (the Dodge move is on Nunchuk C originally, but the left trigger (ZL button) on all the traditional versions, stuff like that. Since I'm mirroring the other versions, your Nunchuk C/Z are basically inverted from what you'd expect them to be based on the original Nunchuk controls, with Nunchuk C on Classic ZL and Nunchuk Z on Classic L. The on-screen button prompts will be confusing until you remember this.
If you read the Button Mapping table closely, you'll know that all of the motion-based attacks simultaneously have you pressing A to perform them. Rather than requiring you to actually do this, pressing any of the "motion buttons" (Y/A/X) also handles "holding the A button down" for you. While B is the "real" A button, the one you should be using to attack in gameplay, you can get away with using any of A/X/Y as Confirm in the menus since they all press A for you. The menus won't care that you're theoretically waving your controllers around simultaneously.
Technical Notes
Code breakdown:
C2: bypass Nunchuk error
C2: read "Nunchuk Stick" when Classic is connected
C2: simulate Wiimote, Nunchuk and double shakes--this game is quite particular about what it expects you to do, so pressing one of the three shake buttons actually simulates holding down the A button for 10 frames, then swinging the Wiimote/Nunchuk/both, continuing to hold the A button for another 8 frames, then releasing. When doing your ultimate (triple super) move, that's extended by another 8 frames before the shake is triggered.
C2 in calc_dpd_variable(): IR pointer emulation
04 in read_kpad_ext(): redirect Classic Left Stick into Nunchuk Stick
04 and 04 in KPADRead(): potential lag frame bug fix
C2 in read_kpad_button(): button injector
Code:
; read_kpad_button
; 800D47A4 for USA
; 800D4C64 for EUR
; r4 holds extType
; r6 holds wiimote bitfield
; r7 holds wiimote+nunchuk bitfield
; r8 holds classic bitfield
cmpwi r4, 0x2
bne- RETURN
li r4, 0x1 ; i'm a nunchuk
CLASSIC_HOME:
andi. r0, r8, 0x800
beq- CLASSIC_UP
ori r7, r7, 0x8000 ; home
CLASSIC_UP:
andi. r0, r8, 0x1
beq- CLASSIC_DOWN
ori r7, r7, 0x8 ; up (v) / left (h)
CLASSIC_DOWN:
andi. r0, r8, 0x4000
beq- CLASSIC_LEFT
ori r7, r7, 0x4 ; down (v) / right (h)
CLASSIC_LEFT:
andi. r0, r8, 0x2
beq- CLASSIC_RIGHT
ori r7, r7, 0x1 ; left (v) / down (h)
CLASSIC_RIGHT:
andi. r0, r8, 0x8000
beq- CLASSIC_A
ori r7, r7, 0x2 ; right (v) / up (h)
CLASSIC_A:
andi. r0, r8, 0x10
beq- CLASSIC_B
ori r7, r7, 0x840 ; nunchuk shake
CLASSIC_B:
andi. r0, r8, 0x40
beq- CLASSIC_X
ori r7, r7, 0x800 ; a
CLASSIC_X:
andi. r0, r8, 0x8
beq- CLASSIC_Y
ori r7, r7, 0x8C0 ; both shake
CLASSIC_Y:
andi. r0, r8, 0x20
beq- CLASSIC_L
ori r7, r7, 0x880 ; wiimote shake
CLASSIC_L:
andi. r0, r8, 0x2000
beq- CLASSIC_R
ori r7, r7, 0x2000 ; z
CLASSIC_R:
andi. r0, r8, 0x200
beq- CLASSIC_ZL
ori r7, r7, 0x10 ; plus
CLASSIC_ZL:
andi. r0, r8, 0x80
beq- CLASSIC_ZR
ori r7, r7, 0x4000 ; c
CLASSIC_ZR:
andi. r0, r8, 0x4
beq- CLASSIC_PLUS
ori r7, r7, 0x400 ; b
CLASSIC_PLUS:
andi. r0, r8, 0x400
beq- CLASSIC_MINUS
ori r7, r7, 0x100 ; 2
CLASSIC_MINUS:
andi. r0, r8, 0x1000
beq- CLASSIC_DONE
ori r7, r7, 0x200 ; 1
CLASSIC_DONE:
or r6, r6, r7
RETURN:
andi. r0, r6, 0x9FFF
I actually couldnt resist, so i tried it but sadly it handles KPAD differently, and the read_kpad functions are way different, different locations then usual. Very interesting. (Please dont work on this, its still an awfully tedious game)
Although, if you do decide to check out the symbol map, you will see why
Post automatically merged:
Update, i think the game uses Low-level WPAD controller report data. Sorry for anyone hoping this game got a classic controller hack, its extremely weird. Vague, this game has a LOT of symbols identifed, you should look into the symbol map if you are interested (but dont make a hack lol)
@Vague Rant Hi. Game resquest : Ougon No Kizuna/Golden bonds, a jap exclusive Wii game, translated in english by Brand Newman. This game looks very cool but isn't classic controller compatible. Thanks.
I am playing Little Kings Story right now, so no need to hack Jett Rocket again any time soon, but thank you. You deserve a big break as well. After all it's Christmas. Everybody enjoy Christmas with your loved ones
For first player gamepad games like lego games, the only way i know is to map a usb hid pad as gamepad with hid2vpad.
You can play wirelessly with cronus adapter (zen or max, i don't remember).
Aroma plugin gamepad2pro seems to do the same thing. I didn't test it yet because i'm still on haxchi cfw lol.
It wasn't too long ago we saw our first glimpse of Courage Reborn, another Twilight Princess PC port in the works based on last year's decompilation efforts. With...
After much speculation, Nintendo has finally followed their competitors in announcing price increases for their hardware.
You can find a breakdown of what's changing...
Seemingly out of nowhere a PC port for Pokemon Platinum has surfaced online, bundled alongside the source code for those interested in building and developing it for...
Airing last night with very little in the way of warning, a brand new Nintendo Direct was aired. Running for 15 minutes in total, it took a moment to celebrate the...
Known more widely for their unusual stock price in modern times, GameStop has seen a steady decline as the go-to retail space for US gamers. In what feels like an...
With very little in the way of announcement, Valve has today increased the price of the Steam Deck but some fairly considerable margins. Both of the available models...
As a part of their Financial Results Briefing for the previous year, Nintendo president Shuntaro Furukawa took to the floor to answer key questions around the Switch...
Earlier this year, Sony announced major price increases for the PS5, PS5 Pro, and PlayStation Portal. Now the company is raising prices again, this time for...
We are once again here to tell you about a game leaking before its release, but for once, it's not one published by Nintendo. The game files for Microsoft's upcoming...
Continuing with the great news of Pokémon Platinum getting a native unofficial PC port just a few days ago, today, yet another classic title from the franchise has...
It wasn't too long ago we saw our first glimpse of Courage Reborn, another Twilight Princess PC port in the works based on last year's decompilation efforts. With...
With very little in the way of announcement, Valve has today increased the price of the Steam Deck but some fairly considerable margins. Both of the available models...
After much speculation, Nintendo has finally followed their competitors in announcing price increases for their hardware.
You can find a breakdown of what's changing...
Airing last night with very little in the way of warning, a brand new Nintendo Direct was aired. Running for 15 minutes in total, it took a moment to celebrate the...
Known more widely for their unusual stock price in modern times, GameStop has seen a steady decline as the go-to retail space for US gamers. In what feels like an...
Seemingly out of nowhere a PC port for Pokemon Platinum has surfaced online, bundled alongside the source code for those interested in building and developing it for...
Earlier this year, Sony announced major price increases for the PS5, PS5 Pro, and PlayStation Portal. Now the company is raising prices again, this time for...
As a part of their Financial Results Briefing for the previous year, Nintendo president Shuntaro Furukawa took to the floor to answer key questions around the Switch...
The latest in a growing number of native PC ports, Paper Mario ReCut got its first pre-release build earlier this week. Based on the N64 recompilation toolchain, the...
A whole hour of PlayStation content is on the way, thanks to the latest State of Play showcase. Headlining the stream will be Marvel's Wolverine, alongside a...