diff options
| -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; +} | 
