diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-05-22 14:00:37 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-05-22 14:00:37 -0400 |
commit | 88bd9d4d062e7e750f470149f6454efa4d817f36 (patch) | |
tree | 188acc362a06f7062d1d19d44985ed93aee44657 | |
parent | 5a03fca0374e2c9e13360ac184acb321096fb527 (diff) |
slot_machine through sub_8140A80
-rw-r--r-- | asm/slot_machine.s | 401 | ||||
-rw-r--r-- | src/slot_machine.c | 141 |
2 files changed, 134 insertions, 408 deletions
diff --git a/asm/slot_machine.s b/asm/slot_machine.s index df42b5d5c..0e3a7d8a7 100644 --- a/asm/slot_machine.s +++ b/asm/slot_machine.s @@ -5,407 +5,6 @@ .text - thumb_func_start sub_81408F4 -sub_81408F4: @ 81408F4 - push {lr} - adds r2, r1, 0 - cmp r0, 0x6 - bhi _08140966 - lsls r0, 2 - ldr r1, _08140908 @ =_0814090C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08140908: .4byte _0814090C - .align 2, 0 -_0814090C: - .4byte _08140928 - .4byte _08140934 - .4byte _08140934 - .4byte _0814093E - .4byte _08140944 - .4byte _08140952 - .4byte _0814095C -_08140928: - movs r1, 0x4 - eors r1, r2 - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 - b _08140968 -_08140934: - movs r0, 0 - cmp r2, 0x4 - bne _08140968 - movs r0, 0x1 - b _08140968 -_0814093E: - movs r1, 0 - subs r0, r2, 0x5 - b _08140948 -_08140944: - movs r1, 0 - subs r0, r2, 0x2 -_08140948: - cmp r0, 0x1 - bhi _0814094E - movs r1, 0x1 -_0814094E: - adds r0, r1, 0 - b _08140968 -_08140952: - movs r0, 0 - cmp r2, 0x1 - bne _08140968 - movs r0, 0x1 - b _08140968 -_0814095C: - movs r0, 0 - cmp r2, 0 - bne _08140968 - movs r0, 0x1 - b _08140968 -_08140966: - movs r0, 0 -_08140968: - pop {r1} - bx r1 - thumb_func_end sub_81408F4 - - thumb_func_start sub_814096C -sub_814096C: @ 814096C - push {lr} - cmp r0, 0x6 - bhi _0814099C - lsls r0, 2 - ldr r1, _0814097C @ =_08140980 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0814097C: .4byte _08140980 - .align 2, 0 -_08140980: - .4byte _081409AC - .4byte _081409A8 - .4byte _081409A4 - .4byte _081409A4 - .4byte _0814099C - .4byte _081409A0 - .4byte _081409A0 -_0814099C: - movs r0, 0x1 - b _081409AE -_081409A0: - movs r0, 0x3 - b _081409AE -_081409A4: - movs r0, 0x4 - b _081409AE -_081409A8: - movs r0, 0x5 - b _081409AE -_081409AC: - movs r0, 0x6 -_081409AE: - pop {r1} - bx r1 - thumb_func_end sub_814096C - - thumb_func_start sub_81409B4 -sub_81409B4: @ 81409B4 - push {r4-r6,lr} - bl Random - lsls r0, 16 - lsrs r2, r0, 18 - ldr r0, _08140A60 @ =sSlotMachineState - ldr r0, [r0] - ldrh r1, [r0, 0x4] - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 1 - ldr r1, _08140A64 @ =gUnknown_84648D2 - adds r4, r0, r1 - movs r5, 0 - ldrh r0, [r4] - cmp r2, r0 - bcc _081409E6 - adds r0, r4, 0 -_081409D8: - adds r0, 0x2 - adds r5, 0x1 - cmp r5, 0x5 - bgt _081409E6 - ldrh r1, [r0] - cmp r2, r1 - bcs _081409D8 -_081409E6: - ldr r6, _08140A60 @ =sSlotMachineState - ldr r1, [r6] - ldrh r0, [r1, 0x8] - cmp r0, 0x4 - bhi _08140A5A - ldrh r0, [r1, 0xC] - cmp r0, 0 - bne _08140A22 - bl Random - ldr r1, _08140A68 @ =0x00003fff - ands r1, r0 - ldrh r4, [r4, 0xC] - cmp r1, r4 - bcs _08140A18 - ldr r4, [r6] - bl Random - movs r1, 0x1 - ands r1, r0 - movs r0, 0x3C - cmp r1, 0 - beq _08140A16 - movs r0, 0x5 -_08140A16: - strh r0, [r4, 0xC] -_08140A18: - ldr r0, _08140A60 @ =sSlotMachineState - ldr r1, [r0] - ldrh r1, [r1, 0xC] - cmp r1, 0 - beq _08140A56 -_08140A22: - cmp r5, 0 - bne _08140A4A - bl Random - ldr r1, _08140A68 @ =0x00003fff - ands r1, r0 - ldr r0, _08140A6C @ =0x00002ccb - cmp r1, r0 - bhi _08140A4A - ldr r0, _08140A60 @ =sSlotMachineState - ldr r4, [r0] - bl Random - movs r1, 0x1 - ands r1, r0 - movs r0, 0x3C - cmp r1, 0 - beq _08140A48 - movs r0, 0x5 -_08140A48: - strh r0, [r4, 0xC] -_08140A4A: - ldr r2, _08140A60 @ =sSlotMachineState - ldr r1, [r2] - ldrh r0, [r1, 0xC] - subs r0, 0x1 - strh r0, [r1, 0xC] - adds r0, r2, 0 -_08140A56: - ldr r0, [r0] - strh r5, [r0, 0x8] -_08140A5A: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08140A60: .4byte sSlotMachineState -_08140A64: .4byte gUnknown_84648D2 -_08140A68: .4byte 0x00003fff -_08140A6C: .4byte 0x00002ccb - thumb_func_end sub_81409B4 - - thumb_func_start sub_8140A70 -sub_8140A70: @ 8140A70 - ldr r0, _08140A7C @ =sSlotMachineState - ldr r1, [r0] - movs r0, 0 - strh r0, [r1, 0x8] - bx lr - .align 2, 0 -_08140A7C: .4byte sSlotMachineState - thumb_func_end sub_8140A70 - - thumb_func_start sub_8140A80 -sub_8140A80: @ 8140A80 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0xC - mov r0, sp - movs r1, 0 - movs r2, 0x9 - bl memset - movs r5, 0 - ldr r2, _08140B58 @ =sSlotMachineState - movs r3, 0 - adds r4, r2, 0 -_08140A9C: - ldr r0, [r2] - lsls r1, r5, 2 - adds r0, 0x3C - adds r0, r1 - str r3, [r0] - adds r5, 0x1 - cmp r5, 0x4 - ble _08140A9C - movs r0, 0 - mov r9, r0 - ldr r0, [r4] - movs r1, 0x20 - ldrsh r4, [r0, r1] - movs r7, 0x22 - ldrsh r3, [r0, r7] - movs r1, 0x24 - ldrsh r2, [r0, r1] - ldr r6, _08140B5C @ =gUnknown_8464926 - movs r7, 0x2A - adds r7, r6 - mov r8, r7 - mov r1, sp - movs r0, 0x15 - adds r0, r6 - mov r12, r0 - movs r5, 0x2 -_08140AD0: - adds r4, 0x1 - cmp r4, 0x14 - ble _08140AD8 - movs r4, 0 -_08140AD8: - adds r3, 0x1 - cmp r3, 0x14 - ble _08140AE0 - movs r3, 0 -_08140AE0: - adds r2, 0x1 - cmp r2, 0x14 - ble _08140AE8 - movs r2, 0 -_08140AE8: - adds r0, r4, r6 - ldrb r0, [r0] - strb r0, [r1] - mov r7, r12 - adds r0, r3, r7 - ldrb r0, [r0] - strb r0, [r1, 0x3] - mov r7, r8 - adds r0, r2, r7 - ldrb r0, [r0] - strb r0, [r1, 0x6] - adds r1, 0x1 - subs r5, 0x1 - cmp r5, 0 - bge _08140AD0 - ldr r0, _08140B58 @ =sSlotMachineState - ldr r0, [r0] - adds r0, 0x50 - movs r1, 0 - strh r1, [r0] - ldr r7, _08140B60 @ =gUnknown_84648BD - mov r8, r7 - movs r6, 0 - movs r5, 0x4 -_08140B18: - ldr r0, _08140B58 @ =sSlotMachineState - ldr r1, [r0] - mov r0, r8 - adds r0, 0x3 - adds r0, r6, r0 - ldrh r1, [r1, 0xE] - ldrb r0, [r0] - cmp r1, r0 - bcc _08140BB6 - ldrb r0, [r7] - mov r1, sp - adds r4, r1, r0 - ldrb r1, [r4] - movs r0, 0x1 - bl sub_81408F4 - cmp r0, 0 - beq _08140B64 - mov r0, r8 - adds r0, 0x1 - adds r0, r6, r0 - ldrb r0, [r0] - add r0, sp - ldrb r1, [r0] - movs r0, 0x2 - bl sub_81408F4 - movs r3, 0x1 - cmp r0, 0 - beq _08140B8E - movs r3, 0x2 - b _08140B92 - .align 2, 0 -_08140B58: .4byte sSlotMachineState -_08140B5C: .4byte gUnknown_8464926 -_08140B60: .4byte gUnknown_84648BD -_08140B64: - mov r0, r8 - adds r0, 0x1 - adds r0, r6, r0 - ldrb r0, [r0] - add r0, sp - ldrb r1, [r4] - ldrb r0, [r0] - cmp r1, r0 - bne _08140B8C - ldrb r0, [r7, 0x2] - add r0, sp - ldrb r0, [r0] - cmp r1, r0 - bne _08140B8C - adds r0, r1, 0 - bl sub_814096C - lsls r0, 24 - lsrs r3, r0, 24 - b _08140B8E -_08140B8C: - movs r3, 0 -_08140B8E: - cmp r3, 0 - beq _08140BB0 -_08140B92: - ldr r0, _08140BD4 @ =sSlotMachineState - ldr r2, [r0] - adds r0, r2, 0 - adds r0, 0x3C - adds r0, r6 - movs r1, 0x1 - str r1, [r0] - adds r2, 0x50 - ldr r1, _08140BD8 @ =gUnknown_8464966 - lsls r0, r3, 1 - adds r0, r1 - ldrh r0, [r0] - ldrh r1, [r2] - adds r0, r1 - strh r0, [r2] -_08140BB0: - cmp r3, r9 - ble _08140BB6 - mov r9, r3 -_08140BB6: - adds r7, 0x4 - adds r6, 0x4 - subs r5, 0x1 - cmp r5, 0 - bge _08140B18 - mov r7, r9 - lsls r0, r7, 16 - lsrs r0, 16 - add sp, 0xC - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08140BD4: .4byte sSlotMachineState -_08140BD8: .4byte gUnknown_8464966 - thumb_func_end sub_8140A80 - thumb_func_start sub_8140BDC sub_8140BDC: @ 8140BDC ldr r0, _08140BE8 @ =sSlotMachineState diff --git a/src/slot_machine.c b/src/slot_machine.c index 064105bba..172a4014a 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -19,7 +19,7 @@ struct SlotMachineState u16 field_06; u16 field_08; u16 slotRewardClass; - u8 filler_0C[2]; + u16 field_0C; u16 bet; u8 field_10; u8 field_11; @@ -29,7 +29,7 @@ struct SlotMachineState s16 field_2C[3]; s16 field_32[3]; u32 field_38; - u8 filler_3C[0x14]; + u32 field_3C[5]; u16 payout; }; @@ -98,11 +98,11 @@ const u8 gUnknown_84648AE[][3] = { }; const u8 gUnknown_84648BD[][4] = { - {0x00, 0x04, 0x08, 0x03}, - {0x00, 0x03, 0x06, 0x02}, - {0x01, 0x04, 0x07, 0x01}, - {0x02, 0x05, 0x08, 0x02}, - {0x02, 0x04, 0x06, 0x03} + {0x00, 0x04, 0x08, 0x03}, // tl-br + {0x00, 0x03, 0x06, 0x02}, // top row + {0x01, 0x04, 0x07, 0x01}, // middle row + {0x02, 0x05, 0x08, 0x02}, // bottom row + {0x02, 0x04, 0x06, 0x03} // bl-tr }; const u16 gUnknown_84648D2[][7] = { @@ -1195,3 +1195,130 @@ bool32 sub_81406E8(s32 a0, s32 a1, s32 a2) "_081408F0: .4byte gUnknown_84648AE"); } #endif //NONMATCHING + +bool32 sub_81408F4(s32 a0, s32 a1) +{ + switch (a0) + { + case 0: + return a1 ^ 4 ? TRUE : FALSE; + case 1: + case 2: + return a1 == 4 ? TRUE : FALSE; + case 3: + return a1 == 5 || a1 == 6 ? TRUE : FALSE; + case 4: + return a1 == 2 || a1 == 3 ? TRUE : FALSE; + case 5: + return a1 == 1 ? TRUE : FALSE; + case 6: + return a1 == 0 ? TRUE : FALSE; + default: + return FALSE; + } +} + +u8 sub_814096C(s32 a0) +{ + switch (a0) + { + default: + case 4: + return 1; + case 5: + case 6: + return 3; + case 2: + case 3: + return 4; + case 1: + return 5; + case 0: + return 6; + } +} + +void sub_81409B4(void) +{ + u16 r2 = Random() / 4; + s32 i; + const u16 * r4 = gUnknown_84648D2[sSlotMachineState->machineidx]; + for (i = 0; i < 6; i++) + { + if (r2 < r4[i]) + break; + } + if (sSlotMachineState->field_08 < 5) + { + if (sSlotMachineState->field_0C == 0) + { + if ((Random() & 0x3FFF) < r4[6]) + sSlotMachineState->field_0C = (Random() & 1) ? 5 : 60; + } + if (sSlotMachineState->field_0C != 0) + { + if (i == 0 && (Random() & 0x3FFF) < 0x2CCC) + sSlotMachineState->field_0C = (Random() & 1) ? 5 : 60; + sSlotMachineState->field_0C--; + } + sSlotMachineState->field_08 = i; + } +} + +void sub_8140A70(void) +{ + sSlotMachineState->field_08 = 0; +} + +u16 sub_8140A80(void) +{ + u8 sp0[9] = {}; + s32 i; + s32 r4, r3, r2; + s32 r9; + + for (i = 0; i < 5; i++) + sSlotMachineState->field_3C[i] = 0; + + r9 = 0; + r4 = sSlotMachineState->field_20[0]; + r3 = sSlotMachineState->field_20[1]; + r2 = sSlotMachineState->field_20[2]; + + for (i = 0; i < 3; i++) + { + r4++; + if (r4 >= 21) + r4 = 0; + r3++; + if (r3 >= 21) + r3 = 0; + r2++; + if (r2 >= 21) + r2 = 0; + sp0[0 * 3 + i] = gUnknown_8464926[0][r4]; + sp0[1 * 3 + i] = gUnknown_8464926[1][r3]; + sp0[2 * 3 + i] = gUnknown_8464926[2][r2]; + } + sSlotMachineState->payout = 0; + for (i = 0; i < 5; i++) + { + if (sSlotMachineState->bet >= gUnknown_84648BD[i][3]) + { + if (sub_81408F4(1, sp0[gUnknown_84648BD[i][0]])) + r3 = sub_81408F4(2, sp0[gUnknown_84648BD[i][1]]) ? 2 : 1; + else if (sp0[gUnknown_84648BD[i][0]] == sp0[gUnknown_84648BD[i][1]] && sp0[gUnknown_84648BD[i][0]] == sp0[gUnknown_84648BD[i][2]]) + r3 = sub_814096C(sp0[gUnknown_84648BD[i][0]]); + else + r3 = 0; + if (r3 != 0) + { + sSlotMachineState->field_3C[i] = 1; + sSlotMachineState->payout += gUnknown_8464966[r3]; + } + if (r3 > r9) + r9 = r3; + } + } + return r9; +} |