diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2016-10-27 01:34:13 -0500 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2016-10-26 23:34:13 -0700 |
commit | d7223321288cdc7ad2e8de0b80b0e15e2445b090 (patch) | |
tree | 2da7b5d295ac4243f8c6778fb8e07c521ea73159 | |
parent | c027821c09ca6cf3470f13d31eaea2548bec5672 (diff) |
decompile lottery corner functions (#73)
* save current work
* finish decompiling
* clean up a bit
* new line at end of file
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | asm/lottery_corner.s | 389 | ||||
-rw-r--r-- | data/specials.s | 2 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/lottery_corner.c | 167 | ||||
-rw-r--r-- | sym_ewram.txt | 6 |
6 files changed, 170 insertions, 397 deletions
@@ -144,7 +144,6 @@ asm/field_effect_helpers.o \ asm/contest_ai.o \ asm/rom_81258BC.o \ asm/rom_813BA94.o \ -asm/lottery_corner.o \ asm/berry_tag_screen.o \ asm/mystery_event_menu.o \ asm/save_failed_screen.o \ diff --git a/asm/lottery_corner.s b/asm/lottery_corner.s deleted file mode 100644 index 732e94ed7..000000000 --- a/asm/lottery_corner.s +++ /dev/null @@ -1,389 +0,0 @@ - .include "constants/gba_constants.s" - .include "constants/species_constants.s" - .include "asm/macros.s" - - .syntax unified - - .text - - thumb_func_start sub_8145A78 -sub_8145A78: @ 8145A78 - push {r4,lr} - bl Random - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - bl Random - lsls r0, 16 - orrs r0, r4 - bl sub_8145D14 - ldr r0, _08145AA0 @ =0x00004045 - movs r1, 0 - bl VarSet - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08145AA0: .4byte 0x00004045 - thumb_func_end sub_8145A78 - - thumb_func_start sub_8145AA4 -sub_8145AA4: @ 8145AA4 - push {r4,r5,lr} - lsls r0, 16 - lsrs r4, r0, 16 - bl Random - lsls r0, 16 - lsrs r1, r0, 16 - subs r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - ldr r0, _08145AE0 @ =0x0000ffff - cmp r4, r0 - beq _08145AD4 - ldr r5, _08145AE4 @ =0x41c64e6d - ldr r3, _08145AE8 @ =0x00003039 - adds r2, r0, 0 -_08145AC4: - adds r0, r1, 0 - muls r0, r5 - adds r1, r0, r3 - subs r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - cmp r4, r2 - bne _08145AC4 -_08145AD4: - adds r0, r1, 0 - bl sub_8145D14 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08145AE0: .4byte 0x0000ffff -_08145AE4: .4byte 0x41c64e6d -_08145AE8: .4byte 0x00003039 - thumb_func_end sub_8145AA4 - - thumb_func_start sub_8145AEC -sub_8145AEC: @ 8145AEC - push {lr} - bl sub_8145D3C - ldr r1, _08145AFC @ =gScriptResult - strh r0, [r1] - pop {r0} - bx r0 - .align 2, 0 -_08145AFC: .4byte gScriptResult - thumb_func_end sub_8145AEC - - thumb_func_start sub_8145B00 -sub_8145B00: @ 8145B00 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - ldr r1, _08145C24 @ =gUnknown_0202E8CC - movs r0, 0 - strh r0, [r1] - movs r0, 0 - mov r10, r0 - mov r9, r0 - movs r6, 0 -_08145B18: - movs r0, 0x64 - adds r1, r6, 0 - muls r1, r0 - ldr r0, _08145C28 @ =gPlayerParty - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0xB - bl GetMonData - cmp r0, 0 - beq _08145B74 - adds r0, r4, 0 - movs r1, 0x2D - bl GetMonData - cmp r0, 0 - bne _08145B6A - adds r0, r4, 0 - movs r1, 0x1 - bl GetMonData - adds r1, r0, 0 - ldr r0, _08145C2C @ =gScriptResult - ldrh r0, [r0] - lsls r1, 16 - lsrs r1, 16 - bl sub_8145C8C - lsls r0, 24 - lsrs r0, 24 - ldr r1, _08145C24 @ =gUnknown_0202E8CC - ldrh r2, [r1] - cmp r0, r2 - bls _08145B6A - cmp r0, 0x1 - bls _08145B6A - subs r0, 0x1 - strh r0, [r1] - movs r0, 0xE - mov r9, r0 - mov r10, r6 -_08145B6A: - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - cmp r6, 0x5 - bls _08145B18 -_08145B74: - movs r6, 0 -_08145B76: - movs r5, 0 - adds r1, r6, 0x1 - mov r8, r1 - lsls r0, r6, 2 - adds r7, r0, r6 -_08145B80: - lsls r2, r7, 4 - subs r2, r7 - lsls r2, 5 - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 4 - ldr r1, _08145C30 @ =gUnknown_020300A4 - adds r0, r1 - adds r4, r2, r0 - adds r0, r4, 0 - movs r1, 0xB - bl GetBoxMonData - cmp r0, 0 - beq _08145BD8 - adds r0, r4, 0 - movs r1, 0x2D - bl GetBoxMonData - cmp r0, 0 - bne _08145BD8 - adds r0, r4, 0 - movs r1, 0x1 - bl GetBoxMonData - adds r1, r0, 0 - ldr r0, _08145C2C @ =gScriptResult - ldrh r0, [r0] - lsls r1, 16 - lsrs r1, 16 - bl sub_8145C8C - lsls r0, 24 - lsrs r0, 24 - ldr r1, _08145C24 @ =gUnknown_0202E8CC - ldrh r2, [r1] - cmp r0, r2 - bls _08145BD8 - cmp r0, 0x1 - bls _08145BD8 - subs r0, 0x1 - strh r0, [r1] - mov r9, r6 - mov r10, r5 -_08145BD8: - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0x1D - bls _08145B80 - mov r1, r8 - lsls r0, r1, 16 - lsrs r6, r0, 16 - cmp r6, 0xD - bls _08145B76 - ldr r3, _08145C24 @ =gUnknown_0202E8CC - ldrh r0, [r3] - cmp r0, 0 - beq _08145C72 - ldr r2, _08145C34 @ =gUnknown_0202E8CE - ldr r1, _08145C38 @ =gUnknown_0840CB04 - subs r0, 0x1 - lsls r0, 1 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r2] - mov r2, r9 - cmp r2, 0xE - bne _08145C44 - ldr r1, _08145C3C @ =gUnknown_0202E8D0 - movs r0, 0 - strh r0, [r1] - movs r0, 0x64 - mov r1, r10 - muls r1, r0 - adds r0, r1, 0 - ldr r1, _08145C28 @ =gPlayerParty - adds r0, r1 - ldr r2, _08145C40 @ =gStringVar1 - movs r1, 0x2 - bl GetMonData - b _08145C6C - .align 2, 0 -_08145C24: .4byte gUnknown_0202E8CC -_08145C28: .4byte gPlayerParty -_08145C2C: .4byte gScriptResult -_08145C30: .4byte gUnknown_020300A4 -_08145C34: .4byte gUnknown_0202E8CE -_08145C38: .4byte gUnknown_0840CB04 -_08145C3C: .4byte gUnknown_0202E8D0 -_08145C40: .4byte gStringVar1 -_08145C44: - ldr r1, _08145C80 @ =gUnknown_0202E8D0 - movs r0, 0x1 - strh r0, [r1] - mov r2, r9 - lsls r1, r2, 2 - add r1, r9 - lsls r0, r1, 4 - subs r0, r1 - lsls r0, 5 - mov r2, r10 - lsls r1, r2, 2 - add r1, r10 - lsls r1, 4 - ldr r2, _08145C84 @ =gUnknown_020300A4 - adds r1, r2 - adds r0, r1 - ldr r2, _08145C88 @ =gStringVar1 - movs r1, 0x2 - bl GetBoxMonData -_08145C6C: - ldr r0, _08145C88 @ =gStringVar1 - bl StringGetEnd10 -_08145C72: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08145C80: .4byte gUnknown_0202E8D0 -_08145C84: .4byte gUnknown_020300A4 -_08145C88: .4byte gStringVar1 - thumb_func_end sub_8145B00 - - thumb_func_start sub_8145C8C -sub_8145C8C: @ 8145C8C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - lsls r0, 16 - lsrs r6, r0, 16 - lsls r1, 16 - lsrs r5, r1, 16 - movs r0, 0 - mov r8, r0 - movs r7, 0 - ldr r1, _08145D0C @ =gUnknown_02039328 - mov r10, r1 - ldr r0, _08145D10 @ =gUnknown_0203932A - mov r9, r0 -_08145CAC: - adds r0, r6, 0 - movs r1, 0xA - bl __umodsi3 - adds r4, r0, 0 - mov r1, r10 - strh r4, [r1] - adds r0, r5, 0 - movs r1, 0xA - bl __umodsi3 - mov r1, r9 - strh r0, [r1] - lsls r4, 16 - lsls r0, 16 - cmp r4, r0 - bne _08145CFA - adds r0, r6, 0 - movs r1, 0xA - bl __udivsi3 - lsls r0, 16 - lsrs r6, r0, 16 - adds r0, r5, 0 - movs r1, 0xA - bl __udivsi3 - lsls r0, 16 - lsrs r5, r0, 16 - mov r0, r8 - adds r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - adds r0, r7, 0x1 - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0x4 - bls _08145CAC -_08145CFA: - mov r0, r8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08145D0C: .4byte gUnknown_02039328 -_08145D10: .4byte gUnknown_0203932A - thumb_func_end sub_8145C8C - - thumb_func_start sub_8145D14 -sub_8145D14: @ 8145D14 - push {r4,lr} - adds r1, r0, 0 - lsrs r4, r1, 16 - lsls r1, 16 - lsrs r1, 16 - ldr r0, _08145D34 @ =0x0000404b - bl VarSet - ldr r0, _08145D38 @ =0x0000404c - adds r1, r4, 0 - bl VarSet - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08145D34: .4byte 0x0000404b -_08145D38: .4byte 0x0000404c - thumb_func_end sub_8145D14 - - thumb_func_start sub_8145D3C -sub_8145D3C: @ 8145D3C - push {r4,lr} - ldr r0, _08145D5C @ =0x0000404b - bl VarGet - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - ldr r0, _08145D60 @ =0x0000404c - bl VarGet - lsls r0, 16 - orrs r0, r4 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08145D5C: .4byte 0x0000404b -_08145D60: .4byte 0x0000404c - thumb_func_end sub_8145D3C - - thumb_func_start unref_sub_8145D64 -unref_sub_8145D64: @ 8145D64 - push {lr} - lsls r0, 16 - lsrs r0, 16 - bl sub_8145D14 - pop {r0} - bx r0 - thumb_func_end unref_sub_8145D64 - - .align 2, 0 @ Don't pad with nop. diff --git a/data/specials.s b/data/specials.s index 3b13fab37..71715b2c6 100644 --- a/data/specials.s +++ b/data/specials.s @@ -258,7 +258,7 @@ gSpecials:: .4byte sub_804DB2C .4byte GetWeekCount .4byte sub_8145AEC - .4byte sub_8145B00 + .4byte PickLotteryCornerTicket .4byte ShowBerryBlenderRecordWindow .4byte ResetTrickHouseEndRoomFlag .4byte SetTrickHouseEndRoomFlag diff --git a/ld_script.txt b/ld_script.txt index 4f67527a7..7c2e952aa 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -172,7 +172,7 @@ SECTIONS { asm/rom_81258BC.o(.text); src/intro.o(.text); asm/rom_813BA94.o(.text); - asm/lottery_corner.o(.text); + src/lottery_corner.o(.text); src/diploma.o(.text); asm/berry_tag_screen.o(.text); asm/mystery_event_menu.o(.text); diff --git a/src/lottery_corner.c b/src/lottery_corner.c new file mode 100644 index 000000000..67499f6d2 --- /dev/null +++ b/src/lottery_corner.c @@ -0,0 +1,167 @@ +#include "gba/gba.h" +#include "global.h" +#include "pokemon.h" +#include "rng.h" +#include "string_util.h" + +extern bool8 VarSet(u16 id, u16 value); +extern u16 VarGet(u16 id); + +extern u16 gScriptResult; +extern u16 gUnknown_0202E8CC; +extern struct Pokemon gPlayerParty[6]; +extern struct PokemonStorage gPokemonStorage; +extern u16 gUnknown_0202E8CE; +extern u16 gUnknown_0840CB04[]; +extern u16 gUnknown_0202E8D0; +static EWRAM_DATA u16 sWinNumberDigit = 0; +static EWRAM_DATA u16 sOtIdDigit = 0; + +void sub_8145D14(u32); +u32 sub_8145D3C(void); +static u8 GetMatchingDigits(u16, u16); + +void sub_8145A78(void) +{ + u16 rand = Random(); + + sub_8145D14((Random() << 16) | rand); + VarSet(0x4045, 0); +} + +void sub_8145AA4(u16 a) +{ + u32 var = Random(); + + while(--a != 0xFFFF) + { + var = var * 1103515245 + 12345; + } + sub_8145D14(var); +} + +void sub_8145AEC(void) +{ + u16 a = sub_8145D3C(); + gScriptResult = a; +} + +//Script special function +void PickLotteryCornerTicket(void) +{ + u16 i; + u16 j; + u32 box; + u32 slot; + + gUnknown_0202E8CC = 0; + slot = 0; + box = 0; + for(i = 0; i < 6; i++) + { + struct Pokemon *pkmn = &gPlayerParty[i]; + + // UB: Too few arguments for function GetMonData + if(GetMonData(pkmn, MON_DATA_SPECIES) != 0) + { + if(!GetMonData(pkmn, MON_DATA_IS_EGG)) + { + u32 otId = GetMonData(pkmn, MON_DATA_OT_ID); + u8 a = GetMatchingDigits(gScriptResult, otId); + + if(a > gUnknown_0202E8CC && a > 1) + { + gUnknown_0202E8CC = a - 1; + box = 14; + slot = i; + } + } + } + else + break; + } + + for(i = 0; i < 14; i++) + { + for(j = 0; j < 0x1E; j++) + { + struct BoxPokemon *pkmn = &gPokemonStorage.boxes[i][j]; + + // UB: Too few arguments for function GetMonData + if(GetBoxMonData(pkmn, MON_DATA_SPECIES) != 0 && + !GetBoxMonData(pkmn, MON_DATA_IS_EGG)) + { + u32 otId = GetBoxMonData(pkmn, MON_DATA_OT_ID); + u8 a = GetMatchingDigits(gScriptResult, otId); + + if(a > gUnknown_0202E8CC && a > 1) + { + gUnknown_0202E8CC = a - 1; + box = i; + slot = j; + } + } + } + } + + if(gUnknown_0202E8CC != 0) + { + gUnknown_0202E8CE = gUnknown_0840CB04[gUnknown_0202E8CC - 1]; + + if(box == 14) + { + gUnknown_0202E8D0 = 0; + GetMonData(&gPlayerParty[slot], MON_DATA_NICKNAME, gStringVar1); + } + else + { + gUnknown_0202E8D0 = 1; + GetBoxMonData(&gPokemonStorage.boxes[box][slot], MON_DATA_NICKNAME, gStringVar1); + } + StringGetEnd10(gStringVar1); + } +} + +static u8 GetMatchingDigits(u16 winNumber, u16 otId) +{ + u8 i; + u8 matchingDigits = 0; //Why not just use i? + + for(i = 0; i < 5; i++) + { + sWinNumberDigit = winNumber % 10; + sOtIdDigit = otId % 10; + + if(sWinNumberDigit == sOtIdDigit) + { + winNumber = winNumber / 10; + otId = otId / 10; + matchingDigits++; + } + else + break; + } + return matchingDigits; +} + +void sub_8145D14(u32 a) +{ + u16 b = a >> 16; + u16 c = a; + + VarSet(0x404B, c); + VarSet(0x404C, b); +} + +u32 sub_8145D3C(void) +{ + u16 var1 = VarGet(0x404B); + u16 var2 = VarGet(0x404C); + + return (var2 << 16) | var1; +} + +void unref_sub_8145D64(u16 a) +{ + sub_8145D14(a); +} diff --git a/sym_ewram.txt b/sym_ewram.txt index cf1d64fc3..21c3fe7fa 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -1126,11 +1126,7 @@ gUnknown_02039324: @ 2039324 gUnknown_02039325: @ 2039325 .space 0x3 -gUnknown_02039328: @ 2039328 - .space 0x2 - -gUnknown_0203932A: @ 203932A - .space 0x2 + .include "src/lottery_corner.o" gUnknown_0203932C: @ 203932C .space 0x2 |