Slot Machine Chances
Anleitungen
/
Slot Machine Chances
Aktualisiert 3 years ago von instasquid

TL;DR Do 4-5 wrestling moves at the beginning of the level to max out your chances for slot machine power ups.

I reverse engineered the slot machine and here's the basic formula:

Wrestling percent = starts at 1 (probably each level? definitely at the start of level 1), goes up with each wrestling move (finishing them afterwards doesn't matter) On the first level the wrestling move swinging the wiimote down is 30 and swinging up is 20. Max 100. x = random number between 0-99 if x < 3 and random0-99 < wrestling percent then 777 else if x < 7 and random0-99 < wrestling percent then BAR x3 else if x < 11 and random0-99 < wrestling percent then Bell x3 else if x < 15 and random0-99 < wrestling percent then Grasshopper x3 else if x < 25 and random0-99 < wrestling percent then Cherry x3

(each chance (e.g. 3, 7, 11...) seems to be increased by 1 for each additional enemy killed with the same slash, instead of rolling the whole thing again (might need to confirm this again))

There's another trigger for each powerup that makes it more likely,. For 777 on a specific level (i don't know which) if you have enough enemies killed there's an additional 5% chance. There is some additional override for each other power up too that I haven't investigated yet.

So with max wrestling percent: about 26% chance to get a power up 3% for 777 4.12% for BARx3 4.30% for Bellx3 4.49% for GrassHopper x 3 11.76% for Cherryx3 (If I did my math correctly...)

---------------------------- REVERSE ENGINEERED SPECIFICS -----------------------------------

I got the address for the amount of 7s you have stored by using the dolpin-memory-engine (https://github.com/aldelaro5/Dolphin-memory-engine). I also had to use an old version of dolphin that worked with it. (It hasn't been updated to get the extra wii memory when in the new versions). (dolphin-master-5.0-11333). (I used an nkit compressed backup of my wii version of nmh, which I hope that won't affect the ram addresses.) The address that holds the amount of 7s you have stored is 92F073C8. Using memory breakpoints to work backward I eventually saw that the slots are determined in the function at address 800ce4fc (I call it Sets55r24SetSlot in my symbol map). I forgot most of the details of getting to that function but I have some of those addresses in the watch list I'll include at the end. This was mostly just frame counters based on the slots finishing and the banner finishing.

Anyway the Sets55r24SetSlot does a bunch of checks and then some RNG calls and then calls the function 8009C778 (SetSlotToActive) with an argument in r5 indicating what the result of the slot should be. -1 means the slots shouldn't result in a dark side mode. 55 means it will be 777. The main logic that determines what r5 is and thus what the slot result starts at 800ce6a8 (after some additional non rng checks which I haven't seen changing in my experimenting):

1st check 800ce6a8 (777 enemies killed on a specific level chance and 5%):

It calls a function at 800ADC80 (I called it PRNGProcessor0-99 since it processes the RNG func to get a range) which returns a random number between 0 and 99. Sets55r24SetSlot does some caculation on that number which I don't understand but usually results in a low number around 10-15 and compares it to the value at in ram at 92F0747C (92f05ce0 + 0x179C (4 bytes)) which seems to be the number of enemies killed before getting a slot result or at least before triggering this. If the random number is less than the number of enemies killed it sets the enemies killed to 0 and calls 8011454C (GetCurrentSTG). That function compares what seems to be the name of the level against a table of level names and returns a number. The level string is stored at 92F04BBC and is at least 7 bytes long. For level one it's STG083, for the intro menu screen it's STG0001. If that func returns 66 (it returns 42 in level 1). Then we call PRNGProcessor again and compare it to 5. So all in all its some unknown chance on a specific level * 5%. The function then goes back to the normal 7 check and if that fails but the the level check and the 5% didn't then it gives you a 7 anyway (see 800ce7c8, r30 was set after the 5% check succeeds).

2nd check 800ce7a0 (777 3% and Wrestling percent): First it calls the PRNGProcessor0-99 and then get the one of the arguments to this function that was stored in r24 (seems to be 1 with one enemy and 2 with two enemies killed at once) and add 2 to it. So 3 for a single enemy. If that succeeds runs the PRNGProcessor0-99 again and compares it to the byte at 92F0740D (92f05ce0 + 0x172D). This is the Wrestling percent that I mentioned. Based on messing around and seeing the value in the memory watcher, it seems this starts at 1 at the start at the level and increases with each wrestling move (doesn't matter if you kill the enemy with A afterwards or not) to a max of 100. On the first level doing a wrestling move where you swing the wiimote and nunchuck down gives 30 points and up gives 20 points. The random number needs to be less than your wrestling points to trigger the 777. So if you don't do any wrestling moves you have a 0.03% (3% * 1%) chance of getting a 777. If all that succeeds, it checks to make sure you don't already have 3 777s stored at byte 92F073C8 (92f05ce0 + 0x16E8) and calls the SetSlotToActive func with r4 = 55. The magic number for 777.

3rd check 800ce82c (BAR x3 about 4.12% and Wrestling percent) Next it loads the first RNG value that was compared against the 3% and compares it against r24 (usually 1, see above) + 6. If that suceeds then we load the wrestling percent and compare it to a new PRNGProcessor0-99 result. If that suceeds we call SetSlotToActive with 54 which is BAR x3. There's another override check (like the 1st check for 777) that I haven't investigated yet. If r29 is 1 then we trigger BARx3 even if the other checks failed. 4th check 800ce8a0 (bell x3 about 4.30% and Wrestling percent):

It does the same flow as the 3rd check for BAR BAR BAR but with 10 + r24 (usually 1, see above) and the left over rng value. So 93%(leftover chance from the other powerups) * (11 -7)% = 4.30%. And another secret override check I haven't investigated yet. If r28 is 1 it will do it anyways. If this succeeds you get the dark side mode where you shoot energy balls, BELLx3 i think.

5th check 800ce918 (Grasshopper x3 about 4.49% and Wrestling percent): Same flow as above but with 14 + r24. Another override with r27.

6th check 800ce98c (51 (cherry x3) 11.76% and wrestling percent): Same flow as bove with 24 + r24. Another override with r26.

And if all of those fail then we call SetSlotToActive with -1 which will give a random non winner slot.

Interesting ram addresses (I'll add the json file to import into the dolphin memory engine): ??? gets set to current money; 91293438; 4 bytes (Word) Money display follow; 9129343C; 4 bytes (Word) Money target; 92F06FD4; 4 bytes (Word) Number of 7s; 92F073C8; Byte 7gate2 == 1 (set 7 in mem, after banner)); 91293829; Byte 7gate3m == 1 (is slot ready?); 91293828; Byte Frame counter blocking 7gate2 60f; 91293824; 4 bytes (Word) r0 slot value (slot frame counter b4 final); 9129380E; 2 bytes (Halfword) slotgate2 == 1 (after frame gate); 9129381E; Byte slotgate3 == r3 (1?); 8060FE78; 4 bytes (Word) slotgate4 frame counterfinalslot ==14; 9129381C; 2 bytes (Halfword) setafter7gate3m; 91293838; 4 bytes (Word) PRNG seed; 80611178; 4 bytes (Word) num enemies killed before powerup?; 92F0747C; 4 bytes (Word) Wrestling percent; 92F0740D; Byte 7Check in hmmr4powerupcmp == 0 (non zero if currently in a darkside mode); 91293BA2; 2 bytes (Halfword) Sets55 7 gate == 0; 92F07444; Byte cur level code; 92F04BBC; string[7]

Spielstatistiken
Follower
78
Läufe
130
Spieler
24
Neueste Threads
Veröffentlicht 1 year ago
0 Antworten
Veröffentlicht 3 years ago
3 Antworten
Veröffentlicht 3 years ago
4 Antworten
Veröffentlicht 3 years ago
2 Antworten
Veröffentlicht 7 years ago
1 Antwort