diff options
-rwxr-xr-x | asm/field_specials.s | 212 | ||||
-rwxr-xr-x | data/field_specials.s | 13 | ||||
-rwxr-xr-x | ld_script.txt | 1 | ||||
-rwxr-xr-x | src/field_specials.c | 78 |
4 files changed, 78 insertions, 226 deletions
diff --git a/asm/field_specials.s b/asm/field_specials.s index 1b5c88fed..5ac79cc5a 100755 --- a/asm/field_specials.s +++ b/asm/field_specials.s @@ -6,218 +6,6 @@ .text - thumb_func_start sub_810FB10 -sub_810FB10: @ 810FB10 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _0810FB54 @ =0x00004095 - bl VarGet - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x2 - bne _0810FB80 - ldr r0, _0810FB58 @ =gSaveBlock1 - ldr r1, _0810FB5C @ =0x000013c2 - adds r4, r0, r1 - ldrh r2, [r4] - movs r1, 0x7F - ands r1, r2 - ldr r0, _0810FB60 @ =gUnknown_083F8404 - adds r0, r5, r0 - ldrb r0, [r0] - adds r1, r0 - cmp r1, 0x13 - ble _0810FB7C - bl sub_810FCB0 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x2 - bhi _0810FB68 - bl sub_810FB9C - ldrh r1, [r4] - ldr r0, _0810FB64 @ =0x0000ff80 - ands r0, r1 - b _0810FB7E - .align 2, 0 -_0810FB54: .4byte 0x00004095 -_0810FB58: .4byte gSaveBlock1 -_0810FB5C: .4byte 0x000013c2 -_0810FB60: .4byte gUnknown_083F8404 -_0810FB64: .4byte 0x0000ff80 -_0810FB68: - ldrh r0, [r4] - ldr r1, _0810FB78 @ =0x0000ff80 - ands r1, r0 - movs r0, 0x14 - orrs r1, r0 - strh r1, [r4] - b _0810FB80 - .align 2, 0 -_0810FB78: .4byte 0x0000ff80 -_0810FB7C: - adds r0, r2, r0 -_0810FB7E: - strh r0, [r4] -_0810FB80: - ldr r0, _0810FB94 @ =gSaveBlock1 - ldr r1, _0810FB98 @ =0x000013c2 - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x7F - ands r0, r1 - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_0810FB94: .4byte gSaveBlock1 -_0810FB98: .4byte 0x000013c2 - thumb_func_end sub_810FB10 - - thumb_func_start sub_810FB9C -sub_810FB9C: @ 810FB9C - push {r4-r7,lr} - sub sp, 0x4 - movs r3, 0 - movs r5, 0 - ldr r7, _0810FBD8 @ =gSaveBlock1 + 0x13C2 - movs r6, 0x1 -_0810FBA8: - ldrh r1, [r7] - ldr r0, _0810FBDC @ =gUnknown_083F8408 - adds r0, r5, r0 - ldrb r4, [r0] - asrs r1, r4 - ands r1, r6 - cmp r1, 0 - bne _0810FBE0 - adds r3, r5, 0 - str r3, [sp] - bl Random - adds r1, r6, 0 - ands r1, r0 - ldr r3, [sp] - cmp r1, 0 - beq _0810FBE0 - adds r0, r6, 0 - lsls r0, r4 - ldrh r1, [r7] - orrs r0, r1 - strh r0, [r7] - b _0810FC00 - .align 2, 0 -_0810FBD8: .4byte gSaveBlock1 + 0x13C2 -_0810FBDC: .4byte gUnknown_083F8408 -_0810FBE0: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x7 - bls _0810FBA8 - ldr r2, _0810FC0C @ =gSaveBlock1 - ldr r0, _0810FC10 @ =0x000013c2 - adds r2, r0 - ldr r1, _0810FC14 @ =gUnknown_083F8408 - adds r1, r3, r1 - movs r0, 0x1 - ldrb r1, [r1] - lsls r0, r1 - ldrh r1, [r2] - orrs r0, r1 - strh r0, [r2] -_0810FC00: - adds r0, r3, 0 - add sp, 0x4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0810FC0C: .4byte gSaveBlock1 -_0810FC10: .4byte 0x000013c2 -_0810FC14: .4byte gUnknown_083F8408 - thumb_func_end sub_810FB9C - - thumb_func_start sub_810FC18 -sub_810FC18: @ 810FC18 - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - movs r0, 0 - mov r8, r0 - bl sub_810FCB0 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bne _0810FC3E - movs r0, 0 - b _0810FC94 -_0810FC34: - lsls r4, r6 - ldrh r0, [r2] - eors r4, r0 - strh r4, [r2] - b _0810FC92 -_0810FC3E: - movs r5, 0 - ldr r2, _0810FCA0 @ =gSaveBlock1 + 0x13C2 - movs r4, 0x1 -_0810FC44: - ldrh r1, [r2] - ldr r7, _0810FCA4 @ =gUnknown_083F8410 - adds r0, r5, r7 - ldrb r6, [r0] - asrs r1, r6 - ands r1, r4 - cmp r1, 0 - beq _0810FC66 - mov r8, r5 - str r2, [sp] - bl Random - adds r1, r4, 0 - ands r1, r0 - ldr r2, [sp] - cmp r1, 0 - bne _0810FC34 -_0810FC66: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x7 - bls _0810FC44 - ldr r0, _0810FCA8 @ =gSaveBlock1 - ldr r1, _0810FCAC @ =0x000013c2 - adds r4, r0, r1 - ldrh r1, [r4] - mov r2, r8 - adds r0, r2, r7 - ldrb r2, [r0] - adds r0, r1, 0 - asrs r0, r2 - movs r3, 0x1 - ands r0, r3 - cmp r0, 0 - beq _0810FC92 - adds r0, r3, 0 - lsls r0, r2 - eors r1, r0 - strh r1, [r4] -_0810FC92: - mov r0, r8 -_0810FC94: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0810FCA0: .4byte gSaveBlock1 + 0x13C2 -_0810FCA4: .4byte gUnknown_083F8410 -_0810FCA8: .4byte gSaveBlock1 -_0810FCAC: .4byte 0x000013c2 - thumb_func_end sub_810FC18 - thumb_func_start sub_810FCB0 sub_810FCB0: @ 810FCB0 push {r4,r5,lr} diff --git a/data/field_specials.s b/data/field_specials.s deleted file mode 100755 index 191f4d947..000000000 --- a/data/field_specials.s +++ /dev/null @@ -1,13 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - -gUnknown_083F8404:: @ 83F8404 - .byte 2, 1, 2, 1 - -gUnknown_083F8408:: @ 83F8408 - .byte 8, 9, 10, 11, 12, 13, 14, 15 - -gUnknown_083F8410:: @ 83F8410 - .byte 8, 13, 14, 11, 10, 12, 15, 9 diff --git a/ld_script.txt b/ld_script.txt index 24f018abc..41b9a7803 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -439,7 +439,6 @@ SECTIONS { data/fldeff_flash.o(.rodata); src/time_events.o(.rodata); src/field_specials.o(.rodata); - data/field_specials.o(.rodata); data/pokedex_area_screen.o(.rodata); data/evolution_scene.o(.rodata); data/roulette.o(.rodata); diff --git a/src/field_specials.c b/src/field_specials.c index 214afebf8..13a726ee3 100755 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -34,6 +34,7 @@ #include "battle_tower.h" #include "field_weather.h" #include "pokemon_summary_screen.h" +#include "rng.h" #if ENGLISH #define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD @@ -2088,10 +2089,16 @@ void sub_810F9AC(void) } } +const u8 gUnknown_083F8404[] = {2, 1, 2, 1}; +const u8 gUnknown_083F8408[] = {8, 9, 10, 11, 12, 13, 14, 15}; +const u8 gUnknown_083F8410[] = {8, 13, 14, 11, 10, 12, 15, 9}; + bool8 sub_810FF30(void); void sub_810FCE8(void); void sub_810FF48(void); void sub_810FD80(void); +u16 sub_810FCB0(void); +int sub_810FB9C(void); void ResetFanClub(void) { @@ -2122,3 +2129,74 @@ void sub_810FAA0(void) VarSet(VAR_0x4095, 1); } } + +u8 sub_810FB10(u8 a0) +{ + if (VarGet(VAR_0x4095) == 2) + { + if ((gSaveBlock1.vars[0x41] & 0x7f) + gUnknown_083F8404[a0] >= 20) + { + if (sub_810FCB0() < 3) + { + sub_810FB9C(); + gSaveBlock1.vars[0x41] &= 0xff80; + } + else + { + gSaveBlock1.vars[0x41] = (gSaveBlock1.vars[0x41] & 0xff80) | 20; + } + } + else + { + gSaveBlock1.vars[0x41] += gUnknown_083F8404[a0]; + } + } + return gSaveBlock1.vars[0x41] & 0x7f; +} + +int sub_810FB9C(void) +{ + u8 i; + int retval = 0; + for (i=0; i<8; i++) + { + if (!((gSaveBlock1.vars[0x41] >> gUnknown_083F8408[i]) & 0x01)) + { + retval = i; + if (Random() & 1) + { + gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[i]); + return retval; + } + } + } + gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[retval]); + return retval; +} + +int sub_810FC18(void) +{ + u8 i; + int retval = 0; + if (sub_810FCB0() == TRUE) + { + return 0; + } + for (i=0; i<8; i++) + { + if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[i]) & 1) + { + retval = i; + if (Random() & 1) + { + gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[i]); + return retval; + } + } + } + if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[retval]) & 1) + { + gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[retval]); + } + return retval; +} |