Oh, right. Yeah, that's why I'm asking in here.
The WAD seems fine as verified by Dolphin, but wouldn't patch. Hence why I'm asking if Vague had a chance to investigate.
Nevermind guys, I didn't know on real hardware all you need is cheatmanager homebrew app to change the file from .txt to gct .
Edit: if you guys do requests, can I request for the shake feature in one piece grand adventure to be changed to a button? the game uses with nunchuck and the shaking is with the remote, and thanks for everything
Sorry for the simple question, but how do you make them work ?
I've tried to put the codes on the cheat.txt and it doesn't show up on ocarina,
Should the file be in gct format? If so how do you make the game read the gct file, I've Googled this and found nothing
Post automatically merged:
Nevermind guys, I didn't know on real hardware all you need is cheatmanager homebrew app to change the file from .txt to gct .
Edit: if you guys do requests, can I request for the shake feature in one piece grand adventure to be changed to a button? the game uses with nunchuck and the shaking is with the remote, and thanks for everything
It might be possible, but you will need to find where buttons are injected in your game, and it also complicated by the fact that you would need to force fake accelerometer data to load, which is 100% the hardest part of these hacks. Do you have any knowledge of making these hacks?
It might be possible, but you will need to find where buttons are injected in your game, and it also complicated by the fact that you would need to force fake accelerometer data to load, which is 100% the hardest part of these hacks. Do you have any knowledge of making these hacks?
Hello! I am working on a video guide on how to make these hacks. It will probably be finished today or tomorrow
Post automatically merged:
Hello @Vague Rant, I have made a small video guide on making these hacks. It isnt much, but I tried my best, It also lacks some quality, but here, lol:
Im going to make a follow up video later on for sure
I want to be clear off the bat that this is not a Classic Controller hack, but I'm not starting a new thread for "I got rid of the Nunchuk notice on a game that supports the GameCube controller." On startup, this game checks whether there is a Nunchuk or Classic Controller in the Wiimote. Notably, it doesn't even check if there is a Wiimote connected, it goes straight to checking whether there's a valid extension controller. Good one. This is fine if you want to play with Nunchuk or Classic Controller, but it means you need a second controller handy just to get to the part with GameCube controller support. Also, it's Resident Evil 4, I'm not doing an intro where I explain what Resident Evil 4 is. Highlight for @lauty29 who noted this issue's existence.
There's two codes here. The first skips over just the "insert a Nunchuk" error, while the second skips all of the boot screens: the Wiimote strap warning, Nunchuk error and mature content warning. If you're using a GameCube controller (and no Wiimote), you can get past the Wiimote strap screen by just waiting a few seconds, but if you want to get to the game faster, you can just skip all of them. If you're using the code to skip all splashes, you don't need to use the Nunchuk one as well. It won't hurt anything though, so you can if you want.
If you're looking to play in German, you should probably stick to the Europe release. I don't know much about this Wii version, but on GameCube the German release removed two game modes entirely. The standard Europe release still has German language support, so I don't know if there's any reason to play the Germany-specific version.
Technical Notes
The most interesting thing to note here is that the SDK SCGetLanguage() function runs before displaying these screens, since they need to be localized for each supported language. After finding the first one through "proper" reverse engineering and seeing how it worked, when porting to the rest I was able to just find GetLanguage and walk back to the caller. This might be a workable approach to finding these splash screens in other games if anyone is looking to similarly modify or remove them.
A reason for me to put this game back on my USB drive. I tried doing this years ago and I got no where with it. I mostly use the Gamecube controller so this is a big help.
Huh, very weird, I'll have to double-check what's going on there.
This might be a case where the language menu is set up to support a solo Wiimote (you could try unplugging the CC entirely and see if the Wiimote works standalone) but the game after that point only responds while a Nunchuk is connected. I just had this situation with the game in this post, where the controls would work initially but then once the game starts checking if the Nunchuk is available, they quit. Fixing it was a similar process to fixing Nunchuk error messages, trying to identify some code that checks that the extension byte is 1 and misbehaves when it isn't.
If you're lucky, you can sometimes fix this by patching places where the result of a WPADProbe() run is checked. That function doesn't return the result in r3, instead the way it works is that you pass it an address and it writes the extension byte to that address. If you go back to my previous post where I screenshotted WPADProbe(), you can see the instruction at 80325638: stw r0, 0 (r30). That's where the extension is being written out (as a 32-bit value, so generally 00000002 in our case). If you breakpoint that address (the equivalent in your game, I mean), then copy the address from r30 and paste it into the top right of the Memory tab, you can see that address in memory, right click it and set a read breakpoint, to pause execution any time the game reads that value. This can sometimes be a quick way to find what's looking for a 1, because if something reads that address then immediately compares it against 1, you can be sure it's some type of Nunchuk check, and then you can insert your own code something like this, replacing the compare instruction:
(Change register as necessary. Also, some games use cmpwi for this comparison and others use cmplwi; for our purposes either is fine but just match whatever the OG game does for safety.)
You can usually safely ignore the very first call to WPADProbe() which will often be part of the WPAD library itself, as well as ignoring the call that comes from KPADRead() itself. We don't want to mess with the extension byte this early, because KPAD relies on knowing the real extension to handle reading the Classic Controller. That's why we jump in after KPAD is done for this frame to start patching extension checks.
However, a lot of games don't use WPADProbe() directly to grab the extension byte. They might grab it out of the KPADStatus struct or anywhere else that the extension byte has previously been copied to outside of either. Another approach that's sometimes decent is to set a breakpoint at the start of KPADRead() and explore the parent function to see if there's any cmpwi rX, 1s within the function after KPADRead() runs. Again, no guarantees, but sometimes that's a handy way to find extension checks. You can set a breakpoint on that compare and make sure that it's coming in as 2. If you want to be extra sure, you can change the extension in the controller settings and see if it changes on the next break as well--keep in mind, Dolphin spends a few frames reporting that the extension was removed and such before it actually updates to the new extension type.
If neither of those work, you start getting into the really heavy duty stuff, basically:
Switch extension to Nunchuk in the Dolphin settings
Hold down a button or button combo that you know the button values for
e.g. A+B together is 0x0C00
Breakpoint the start of read_kpad_button()
Take the address from r3 and paste that into the Memory tab
This is a pointer to KPADStatus
Set a read breakpoint on the first word
It should contain the buttons you're holding; if not, you're in the wrong place
Follow where the button values get copied to
Usually 3+ times within KPADRead() itself, possibly some more copies after that before they start being read for gameplay purposes
In the case we're talking about here, where buttons aren't registering because the game wants a Nunchuk connected, you should eventually find some code that's doing a compare against 1 and skipping a section if it's not equal
If you think you've found it, breakpoint it, switch back to Classic and see if you're right
This is normal Dolphin behavior. As far as I understand it, turning off a Gecko code in Dolphin means "stop writing this piece of code into memory." However, it doesn't un-write the code, so any code that you've already inserted/replaced this session is still being applied, unless or until the game itself writes over that memory. As a general rule, nothing ever writes to the area of memory where the binary is held, so patches to code like we're doing are essentially "permanent" for as long as the current session lasts.
Also, if you add a new code or modify an existing one, you'll need to toggle it off and on again to get Dolphin to update its cached instructions. If your PC is beefy enough, you won't notice any difference, but performance in theory tanks while Dolphin is regenerating the instruction cache, so if you toggle your code off and on and the game runs slow for a couple of seconds, that's a good sign that it worked and your updated codes are now active.
If you need to test from a clean slate multiple times, it can be useful to disable all your codes (from the right click -> Properties menu, before launching the game), run the game up to a sensible test point, e.g. gameplay, using regular Wiimote/Nunchuk controls, create a save state in Dolphin (Emulation -> Save State), then enable your codes in Dolphin. This way, you can load state to get the game back to its original unmodified condition (basically, what you were aiming for by turning your codes off originally). Note that you will need to toggle your codes off and on again in this situation to get them running, because they weren't enabled when you saved state and even though they're still checked in the menu, they're not enabled any more once you load state.
That is insideread_kpad_button(). In my experience it's absolutely always 0x9FFF. This code is specifically separating out the Nunchuk buttons C and Z (the two highest bits, 0x4000 and 0x2000 in hex) from the rest of the bits (0x9FFF) so that there's a register that's holding only the lower 14 bits which represent the Wiimote's buttons (plus three empty spaces where buttons theoretically could be but aren't). If it's not doing that, you might be looking at the wrong place.
read_kpad_ext() is basically the same thing as read_kpad_stick(), it's found in the same place and does mostly the same stuff. They just renamed it in some later SDK versions, probably in line with adding some extra functionality or something. I haven't actually looked into it, but technically there are other things that plug into the EXT port on the base of the Wiimote, so maybe a new accessory launched and they expanded the functionality of read_kpad_stick() and renamed it in the process. Nothing about how we interact with it changes, because we're just messing with the analog sticks, not any of the later additions.
It's also worth mentioning that I'm like 70% guessing whether I call it read_kpad_stick() or read_kpad_ext() for each hack. Basically if a game is relatively late in the Wii's lifespan I say ext, otherwise stick. I guarantee there are times where I've incorrectly guessed what the function was called internally as I go through labelling what I'm looking at, but they're basically synonymous so it's not very important to know which is which.
I haven't done much remapping of original game controls besides Mario Kart Wii which was Classic Controller, but the idea would essentially be that you'd want to build your remapped layout in another register then move it back into the register you read the real button values from. So I think you'd want something like this ...
Code:
; KPADRead
; r4 holds extType
; r7 holds wiimote bitfield
; r8 holds wiimote+nunchuk bitfield
; r9 holds classic bitfield
li r7, 0 ; blank out real wiimote buttons
WIIMOTE_HOME:
andi. r0, r8, 0x8000
beq- WIIMOTE_UP
ori r7, r7, 0x8000 ; home
WIIMOTE_UP:
andi. r0, r8, 0x8
beq- WIIMOTE_DOWN
ori r7, r7, 0x8 ; up (v) / left (h)
WIIMOTE_DOWN:
andi. r0, r8, 0x4
beq- WIIMOTE_LEFT
ori r7, r7, 0x4 ; down (v) / right (h)
WIIMOTE_LEFT:
andi. r0, r8, 0x1
beq- WIIMOTE_RIGHT
ori r7, r7, 0x1 ; left (v) / down (h)
WIIMOTE_RIGHT:
andi. r0, r8, 0x2
beq- WIIMOTE_A
ori r7, r7, 0x2 ; right (v) / up (h)
WIIMOTE_A:
andi. r0, r8, 0x800
beq- WIIMOTE_B
ori r7, r7, 0x800 ; a
WIIMOTE_B:
andi. r0, r8, 0x400
beq- WIIMOTE_1
ori r7, r7, 0x400 ; b
WIIMOTE_1:
andi. r0, r8, 0x200
beq- WIIMOTE_2
ori r7, r7, 0x200 ; 1
WIIMOTE_2:
andi. r0, r8, 0x100
beq- WIIMOTE_PLUS
ori r7, r7, 0x100 ; 2
WIIMOTE_PLUS:
andi. r0, r8, 0x10
beq- WIIMOTE_MINUS
ori r7, r7, 0x10 ; plus
WIIMOTE_MINUS:
andi. r0, r8, 0x1000
beq- NUNCHUK_C
ori r7, r7, 0x1000 ; minus
NUNCHUK_C:
andi. r0, r8, 0x4000
beq- NUNCHUK_Z
ori r7, r7, 0x4000 ; c
NUNCHUK_Z:
andi. r0, r8, 0x2000
beq- WIIMOTE_DONE
ori r7, r7, 0x2000 ; z
WIIMOTE_DONE:
mr r8, r7
RETURN:
andi. r0, r7, 0x9FFF
This is completely untested, expect typos or anything going on here, but ideally it should work basically the way the injector you're used to does. In the above snippet every button is just mapped back to itself, so the code does literally nothing, but you can rearrange the buttons (e.g. ori r7, r7, 0x800 ; a to change which button they virtually press. For newer games you'd need to adjust the registers (r7/r8 would be r6/r7 in read_kpad_button(), and the same rules apply to the garbage register as usual. If the first argument to the andi. where you're injecting the code is a different number than r0, you need to replace all the r0s with that register.
Yeah, that is definitely something that would be more complicated and not something you could do via just KPAD hacks. You'd need to find where the individual game handles its control scheme and decouple the camera and pointer as you mention. The way we're handling the pointer in these hacks is basically just tricking the games into thinking we're pointing the Wii Remote, so we can't do anything that a real pointer can't do. It would definitely be possible, but it's not something I know how to do or would be much help with.
I definitely keep quality in mind as a metric for which games to look at (except when I don't; Flip's Twisted World), but there's a lot of other factors that go into it as well. For example, the previous game I did was by Incinerator Studio, so I decided to stick with that developer for the next game, just in the hope that I could recognize some similarities while the previous game was fresh in my memory--ultimately, I didn't, but that was the plan.
Cars 1 is definitely one I would like to come back to. I suspect it will be quite similar to Mater-National (moreso than Race-o-Rama was), so hopefully I can apply some of that knowledge to the original game.
Neat, this is another one I've never heard of, sounds like a pretty cool game though. Depending on the complexity of the motions needed, it might be a tough one, but I'll definitely add it to my investigation list.
For the final game in the Nicktoons Unite!/SpongeBob SquarePants and Friends quadrilogy of co-op action games, our friends at Incinerator Studios once again took over development. The new studio created a game that aimed to fuse the combat and platforming from the previous entries into a title with a bit more variety. Incinerator ended up with what kind of amounts to another light action-platform-puzzler in the style of the TT Lego games. With a healthy dose of Nicktoons characters and worlds including SpongeBob, Jimmy Neutron, Tak and all the others that I definitely recognize, Globs is a solid crossover that doesn't break any new ground. Instead, it's content to be a goofy team-up of Nicktoons heroes and villains that's, you know, fine. It's also very easy.
I did not figure out the motion controls for this game.
Use the Skip Gadget Combo Motion Controls code to bypass these screens.
I did not figure out the motion controls for this game. However, I was able to bypass the motion control gameplay entirely and have included a separate code above for this purpose. In the base game, once the Combo Meter is full, you press the Gadget Combo button and the game freezes for a few seconds while you match the on-screen motion prompts. The above code skips this entire phase so that pressing the Gadget Combo button immediately triggers a Gadget Combo.
I'm not even sorry, this is better.
The button mapping here is mostly cribbed from the PS2 version of the game. The only major change is that the PS2 version used the D-Pad to navigate the menu and toggle characters, while the Wii version uses the D-Pad to navigate the menu and trigger Gadget Combos. Since we can't lose menu navigation, we had to leave the D-Pad as-is and cycling characters is now done with L/R while Gadget Combos are on ZL. I think it's fine, shouldn't bother anybody.
This game is infamous for its save corruption bug. If you encounter save corruption while playing this game, it's not because of anything I did. THQ acknowledged the bug and recommended that you never exit the game from the hub world. When you want to stop playing, enter a stage of your choice and shut down/exit from there. I know this sucks, tell THQ. Actually never mind, they went out of business. Stuff like this probably didn't help.
Technical Notes
This is another one with a symbol map left over on the disc. Thanks, Incinerator.
Code breakdown:
C2 in InGameDevicesCheck(): bypass Nunchuk check
C2 in AreAllAttachmentsAttached(): bypass Nunchuk check (again)
C2 in FormatDeviceMessage(): fffff are you fu--yes, it's another one
04 in Update: read Classic Controller as Nunchuk-type controller
C2 in calc_dpd_variable(): simulate IR pointer on Right Stick
04 in read_kpad_stick(): stick redirection
04 and C2 in KPADRead(): dropped connection fix and button injector
Code:
; KPADRead
; button injector
; 80087E1C for USA/EUR (En,Fr)/EUR (De,Es,It)/SCN
; 80087DDC for KOR
; r4 holds extType
; r7 holds wiimote bitfield
; r8 holds wiimote+nunchuk bitfield
; r9 holds classic bitfield
; magic
bl GRAB
MAGIC:
HELD: .double 0
GRAB:
mflr r3
slwi r0, r27, 1
add r3, r3, r0
; check dropped extension
cmplwi r9, 0xFFFF
bne- CLASSIC
lhz r9, HELD-MAGIC(r3)
b DROPPED_CONNECTION
CLASSIC:
cmpwi r4, 0x2
bne- RETURN
li r4, 0x1 ; i'm a nunchuk
sth r9, HELD-MAGIC(r3)
DROPPED_CONNECTION:
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, 0x800 ; a
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, 0x1000 ; minus
CLASSIC_R:
andi. r0, r9, 0x200
beq- CLASSIC_ZL
ori r8, r8, 0x1000 ; minus
CLASSIC_ZL:
andi. r0, r9, 0x80
beq- CLASSIC_ZR
ori r8, r8, 0x1 ; left (v) / down (h)
CLASSIC_ZR:
andi. r0, r9, 0x4
beq- CLASSIC_PLUS
ori r8, r8, 0x2000 ; z
CLASSIC_PLUS:
andi. r0, r9, 0x400
beq- CLASSIC_MINUS
ori r8, r8, 0x10 ; plus
CLASSIC_MINUS:
andi. r0, r9, 0x1000
beq- CLASSIC_DONE
ori r8, r8, 0x1000 ; minus
CLASSIC_DONE:
or r7, r7, r8
RETURN:
andi. r0, r7, 0x9FFF
The debug symbol map was an enormous help in bypassing the motion control sections, there's no chance in hell I could have figured that out otherwise. It's so many layers of stuff from the multiple menu layers, the sounds and graphical effects that are triggered when you open the Gadget Combo menu and the code for performing a Gadget Combo is nowhere near the stuff that manages the Gadget Combo QTE minigames. Extremely fortunate that debug map was available or this one would probaby have been canned.
Thank you very much for these codes! I have been patching my games and I used the automated tool from damysteryman. To create my GCT files, I used an online GCT maker from the MKWii community, and when I tried to run the patching tool, I would get an error that said ".GCT not found! Please make sure your .gct file is in the 'gct' folder, and is named .GCT" despite double checking to make sure I did everything right.
I found another user with the same issue, and further down in that thread someone provided an updated .bat file that fixed the issue. The original developer never responded to the fix, but if the first post on this thread could be updated to reflect the fix I'm sure it would be very helpful for anyone else wanting to use the tool.
If I ever do get more knowledge regarding PPC assembly, I will def consider pulling a DK with mario sports mix
Not for now though, it seems very complicated.
Re: Excite Trucks: How did you handle that game since it handled KPAD very differently? Im pretty interested in a game that has a debugging map on the disc, but it handles KPAD very differently then usual, so I do not know how to find a button injection address / an andi instruction. Any idea?
Are there any specific functions / symbols that games use for extension errors? I might be lucky and get a direct function to patch already
If i do end up getting lucky, this might be my first game that uses the nunchuk lol
That definitely sounds like a complicated one. It would almost certainly be possible to hack it to use the sideways Wiimote control mode which has steering on the D-pad, but that would be pretty unsatisfying compared to using the fully analog GameCube controls. I haven't looked into the PAD library (which handles GameCube controllers) at all, but if I do this game sounds like a strong candidate to look at for the novelty of doing a kind of "reverse Classic Controller hack" to get it to behave like a GameCube controller. Definitely seems like an interesting challenge.
Awesome to hear the game still has fans, it definitely flew under the radar. I hadn't really thought of playing these on Steam Deck, but that does seem nice. Dolphin does support "shake buttons", but my hack is just infinite shaking until you let go of the button, so that's pretty convenient on any traditional controller.
I agree that the motion controls aren't overwhelming at all in this game. The tilting is definitely more precise than what I have in this hack (where the right analog stick is the equivalent of tilting the Wii Remote), but for people who don't want to deal with that or possibly people who want to play on the Wii U GamePad, now the option is (maybe) there. Note: Wario Land hasn't been tested on Wii U as far as I know, certainly not by me. If anybody does, let me know how it goes.
There's a bit of duplicated effort in porting to all the versions (especially Korea, is anybody from Korea ever going to see this post?) but I'm glad people are able to get use out of the alternate versions, especially for a case like Wario where the localization is different between the USA/Europe releases.
That's an interesting one. They do use the pointer quite a lot, which is not as good on an analog stick, but I guess that didn't stop them releasing these games on a bunch of consoles that don't have IR pointers at all. It does use the accelerometer in the Nunchuk which I haven't learned about at all yet, so there are some wrinkles there. Interestingly, it also has a charge move when you tilt the Wiimote upward. Speaking of ...
Metroid: Other M is that Metroid game. While it performed pretty well critically, it sold very poorly and many were disappointed by the linear gameplay, the loss of upgrades discovered through exploration, childish characterization, melodramatic story and awkward sideways/upright Wiimote controls. I can help with one of those.
The "and Nunchuk" code now supports both Classic Controller and Nunchuk input. Go figure. First up, Classic Controller.
Wii Remote
Classic Controller
Game Function
Home
Home
Home Menu works but remember to press L/R to enable the pointer
Open/Close Home Button Menu
D-Pad
D-Pad
Left Stick
Third-Person
Movement
Sense Move (dodge)
Wiimote A
A/ZR
Third-Person
Morph Ball First-Person
Shoot
Wiimote B
ZL
First-Person
Free Look/Lock-On
Plus
Plus
Pause
Minus
Minus
Skip certain scenes
Wiimote 1
Y
Shoot
Wiimote 2
B
Third-Person
Jump
Wiimote Tilt
X
Third-Person
Concentration (recharge)
Wiimote IR Pointer
L/R (enable/disable)
Left Stick/Right Stick
First-Person
Aiming
Now, on to the Wiimote and Nunchuk control scheme.
Wii Remote
Wiimote and Nunchuk
Game Function
Home
Home
Home Menu works but remember that Nunchuk C is your A button
Open/Close Home Button Menu
D-Pad
Wiimote D-Pad
Nunchuk Stick
Third-Person
Movement
Sense Move (dodge)
Wiimote A
Nunchuk C
Third-Person
Morph Ball First-Person
Shoot
Wiimote B
Nunchuk Z
First-Person
Free Look/Lock-On
Plus
Plus
Pause
Minus
Minus
Skip certain scenes
Wiimote 1
Wiimote B
Shoot
Wiimote 2
Wiimote A
Third-Person
Jump
Wiimote Tilt
Wiimote 1/2
Third-Person
Concentration (recharge)
Wiimote IR Pointer
Wiimote IR Pointer
First-Person
Aiming
General Notes
About three weeks ago, I said Metroid: Other M would require somebody who understood Classic Controller hacking better than me to do a CC hack. Three weeks later, I understand Classic Controller hacking better than me, so I did. Highlights for @NestorM and @KelSolaar since they both asked.
I'm the world's biggest non-fan of playing digital games with a stick, but this game might make the exception. Since this hack allows you to use the analog stick as both your movement (third-person) and aiming (first-person) controls, it's actually pretty convenient to just use the analog stick at all times. That said, there are alternative options, e.g. left thumb on the D-pad and right thumb on the right analog stick, or you can even just stick to shooting with the Y (Wiimote 1) button, because that still works even in first-person. Play around, see what you like.
This game changes control schemes whenever you point the Wiimote at the screen, which necessitated some special handling of the pointer. You will need to enable/disable pointer mode by pressing the L or R button. This does result in some occasional weirdness, e.g. an early cutscene requires you to fire a missile at a locked door in the first person mode (press L/R). Another cutscene then plays after the door is unlocked, after which you get back gameplay control, but you'll still need to exit first-person mode by pressing L/R again. There are also scenes which lock you in first-person mode, but remember you still need to press L/R to enable the pointer. The Classic Controller hack doesn't "know" when you need to use the pointer, that's up to you to toggle.
This same hack is compatible with all five versions I tested. The only version which is untested is the USA Rev 0 disc; if you try it on that, let me know. The USA and Europe releases of this game received a second pressing with a game-breaking bug fixed, but the same hack is compatible with the (pre-bugfix) Europe and Japan Rev 0 discs, so there's a good chance it works on USA Rev 0 as well.
Mildly interesting, it's actually not known whether Japan received a second pressing of the game with the bug fixed, as the game Power Bombed in that region. We know Nintendo did prepare a Rev 1 for Japan, because that's the version that was sold on the Wii U eShop, but it's unknown whether that disc exists physically. This hack does work on that version as well if you're able to extract it from the eShop release and convert it back to a usable format.
EDIT: As mentioned below, this hack has been updated with Nunchuk support. The one big caveat of Nunchuk mode is that you need to remember that pointing the Wiimote at the screen will drop you into first-person mode. With an upright Wiimote & Nunchuk setup, there is some risk of this happening just from you naturally resting your hands in a way that points the Wiimote at the TV. My tip: don't do that. It didn't take me long to get used to holding the Wiimote slightly off to the right of the screen while playing. I'd also like to stress that you can shoot with the B button in either first-person or third-person, so feel free to just always shoot with B.
Changelog
"and Nunchuk" code added Nunchuk support and switched to the new button injector
Technical Notes
There's actually not much new in this one. Pointer support is essentially what was in Tron, Kirby and Wario with the addition of a toggle switch to enable/disable it which I put inside the button injector. This is again done with one of the unused button values of the Wii Remote, so the button with value 0x40 is our "toggle pointer" button, and the button with value 0x80 is our "tilt the Wiimote upward to recharge" button. Speaking of, that function is largely derived from the shaking implementation I used in Wario Land, minus the ... shaking.
I have written a small gecko code to sidestep the nunchuck-check. I found multiple candidates that looked like a check, but none had the desired outcome when changed.
However, at some point i had the idea to not look at the "reader", but the "writer" of the extension-bits, and that lead me back to WPADProbe. I patched this to always return an attached nunchuk. That probably has some undesired sideeffects. (I guess with this gecko code enabled, ONLY classic controllers will be supported. But i'll check that before i post it)
Now to the interesting parts: Since the button-injector works, i want to move on to the movement-controls. In the original game that is handled by the nunchuk.
From what i got in your button-mapper example, i need to write the cc-left-stick values to the register that would normally contain the nunchuck stick values. (You mentioned r7) I'd also need to write C and Z from one of the CLASSIC_?-Button-registers.
How do i do that?
I assume after the injected mapping, r8 contains the pressed buttons from the cc, and r0 should contain some bitfield made from those button-presses (A dummy-register only used to create the flag for the next beq- check?). r6 seems to be the target register for our conversion.
When i breakpoint the next instruction after the injected function returns, all those registers are 0. Is this because the emulation-window does not register my button presses since "clicking" start to step takes over window-focus? Or do i have to do something else?
(In that case, is there an exhaustive wii-assembly-document? I found the powerpc assembly guide helpful, but not quite easy to browse. For example i couldn't figure out what beq- means. Is that a negation for branch-if-equal?)
After i figure out the motion, i will need to figure out the pointer. I assume that will be "easy" in the first step, since i can just reuse the second stick of the cc. In the final version though, i want to emulate the pc-control-scheme. It activates the pointer when the stick moves AND the action-button is pressed, which i quite like.
When i am done, i need to properly document on what i learned, and what i did. I was thinking of using a git-repository for that. Would it make sense to create a shared one where you can collect all of the codes you wrote, their details and issues, guides and so on? It should be rather easy to publish that as a standalone website that is easily browseable. What do you think?
Have bug with SpongeBob SquarePants featuring NickToons globs of doom patch try both s23 plus and odin 2 pro right stick don't work most of time every it said to be the pointer could someone go into code and see what hall is going on.
I have written a small gecko code to sidestep the nunchuck-check. I found multiple candidates that looked like a check, but none had the desired outcome when changed.
However, at some point i had the idea to not look at the "reader", but the "writer" of the extension-bits, and that lead me back to WPADProbe. I patched this to always return an attached nunchuk. That probably has some undesired sideeffects. (I guess with this gecko code enabled, ONLY classic controllers will be supported. But i'll check that before i post it)
Now to the interesting parts: Since the button-injector works, i want to move on to the movement-controls. In the original game that is handled by the nunchuk.
From what i got in your button-mapper example, i need to write the cc-left-stick values to the register that would normally contain the nunchuck stick values. (You mentioned r7) I'd also need to write C and Z from one of the CLASSIC_?-Button-registers.
How do i do that?
I assume after the injected mapping, r8 contains the pressed buttons from the cc, and r0 should contain some bitfield made from those button-presses (A dummy-register only used to create the flag for the next beq- check?). r6 seems to be the target register for our conversion.
When i breakpoint the next instruction after the injected function returns, all those registers are 0. Is this because the emulation-window does not register my button presses since "clicking" start to step takes over window-focus? Or do i have to do something else?
(In that case, is there an exhaustive wii-assembly-document? I found the powerpc assembly guide helpful, but not quite easy to browse. For example i couldn't figure out what beq- means. Is that a negation for branch-if-equal?)
After i figure out the motion, i will need to figure out the pointer. I assume that will be "easy" in the first step, since i can just reuse the second stick of the cc. In the final version though, i want to emulate the pc-control-scheme. It activates the pointer when the stick moves AND the action-button is pressed, which i quite like.
When i am done, i need to properly document on what i learned, and what i did. I was thinking of using a git-repository for that. Would it make sense to create a shared one where you can collect all of the codes you wrote, their details and issues, guides and so on? It should be rather easy to publish that as a standalone website that is easily browseable. What do you think?
Excellent work! Im also curious about some of this, how do you redirect the CC stick into the Nunchuk stick? Hopefully we get knowledge lol
As for C and Z, the values go into the button assembly, with 2000 being Z, and 4000 being C. We still need knowledge on how to trick the game saying “Im a nunchuk.”
Post automatically merged:
@Vague Rant Good news! I know you arent interested in Twilight Princess and such, so I decided to give it a look. It handles KPAD differently. A lot differently. I checked your Excite Trucks technical notes, and using some of my logic I had, I managed to find where the buttons are injected! Ill keep you updated on the hack
I currently need to learn more knowledge about disabling the Nunchuk check and redirecting the Stick input to the CC stick. This might really be my first complex game!
Additionally, the game has a map leftover on the disc, so I know all the functions im patching. To clarify what I asked before, do you know any symbols that are often involved with Nunchuk checks?
Of course, im not trying to push you into doing a collab code.
Back in September, 2024, news broke out about Nintendo suing Palworld creators, PocketPair, in Japan over many of the mechanics that Palworld uses, sharing...
The Japanese gaming giant has finally met its match, and this time, no amount of ninjas could hold up against a small Costa Rican grocery shop in a legal battle.
A...
In 2021, Extremely OK Games, notable developers behind the indie hit Celeste, announced that they were working on a new project, Earthblade. The team set a launch...
The most popular Nintendo DS emulator for Android devices, DraStic, has now disappeared from the Google Play Store, and is no longer available for download.
However...
Beginning Friday afternoon, the PlayStation Network began to suffer from small issues, ranging from problems for users attempting to sign into the platform, or errors...
Three new-old titles drop on Nintendo Switch Online's retro game library. Subscribers to the service can access a trio of Super Nintendo classics, in the form of...
A Nintendo Direct was all but assured, once Nintendo announced the Switch 2, but now we have a time and date as to when we can learn more about the upcoming console...
The Nintendo Switch 2 is real, and it'll be arriving sometime later this year. Everyone has thoughts on the latest Nintendo console, including the GBAtemp Staff team...
Late last year, AYANEO revealed their next-gen handheld gaming PC, the AYANEO 3. The company has today launched the product, and, as expected, they are doing so...
The Angry Video Game Nerd is once again back into the videogame creation landscape, with a brand new videogame announced titled "Angry Video Game Nerd 8-bit" (or AVGN...
In 2021, Extremely OK Games, notable developers behind the indie hit Celeste, announced that they were working on a new project, Earthblade. The team set a launch...
The Nintendo Switch 2 is real, and it'll be arriving sometime later this year. Everyone has thoughts on the latest Nintendo console, including the GBAtemp Staff team...
Back in September, 2024, news broke out about Nintendo suing Palworld creators, PocketPair, in Japan over many of the mechanics that Palworld uses, sharing...
Beginning Friday afternoon, the PlayStation Network began to suffer from small issues, ranging from problems for users attempting to sign into the platform, or errors...
A Nintendo Direct was all but assured, once Nintendo announced the Switch 2, but now we have a time and date as to when we can learn more about the upcoming console...
The Japanese gaming giant has finally met its match, and this time, no amount of ninjas could hold up against a small Costa Rican grocery shop in a legal battle.
A...
After the recent shadow-dropped release of both Dino Crisis and Dino Crisis 2 for PC, GOG just opened a new page where users and players worldwide can vote for their...
Late last year, AYANEO revealed their next-gen handheld gaming PC, the AYANEO 3. The company has today launched the product, and, as expected, they are doing so...
The most popular Nintendo DS emulator for Android devices, DraStic, has now disappeared from the Google Play Store, and is no longer available for download.
However...
Three new-old titles drop on Nintendo Switch Online's retro game library. Subscribers to the service can access a trio of Super Nintendo classics, in the form of...