diff options
author | YamaArashi <shadow962@live.com> | 2016-09-25 22:11:44 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-09-25 22:11:44 -0700 |
commit | 25dd8729e559e28772dd1a86361767c07442c641 (patch) | |
tree | 0ec26bbe35a46ea4a9f5ee167e8c3c86470276f8 | |
parent | 0a2857a7dce54b3b16cad1a3b605bae35ff748a9 (diff) |
decompile new game init code
-rw-r--r-- | asm/rom4.s | 281 | ||||
-rw-r--r-- | include/global.h | 45 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/new_game.c | 132 |
4 files changed, 175 insertions, 284 deletions
diff --git a/asm/rom4.s b/asm/rom4.s index 14e965139..e186e3e52 100644 --- a/asm/rom4.s +++ b/asm/rom4.s @@ -5,287 +5,6 @@ .text - thumb_func_start write_word_to_mem -write_word_to_mem: @ 8052D00 - strb r0, [r1] - lsrs r2, r0, 8 - strb r2, [r1, 0x1] - lsrs r2, r0, 16 - strb r2, [r1, 0x2] - lsrs r0, 24 - strb r0, [r1, 0x3] - bx lr - thumb_func_end write_word_to_mem - - thumb_func_start sub_8052D10 -sub_8052D10: @ 8052D10 - push {r4,lr} - adds r4, r0, 0 - adds r3, r1, 0 - movs r2, 0 -_08052D18: - adds r0, r4, r2 - adds r1, r3, r2 - ldrb r1, [r1] - strb r1, [r0] - adds r2, 0x1 - cmp r2, 0x3 - ble _08052D18 - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_8052D10 - - thumb_func_start set_player_trainer_id -set_player_trainer_id: @ 8052D2C - push {r4,lr} - bl Random - adds r4, r0, 0 - bl Random - lsls r4, 16 - lsls r0, 16 - lsrs r0, 16 - orrs r4, r0 - ldr r1, _08052D50 - adds r0, r4, 0 - bl write_word_to_mem - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08052D50: .4byte gSaveBlock2 + 0xA - thumb_func_end set_player_trainer_id - - thumb_func_start sub_8052D54 -sub_8052D54: @ 8052D54 - ldr r2, _08052D74 - movs r0, 0x1 - strb r0, [r2, 0x14] - ldrb r1, [r2, 0x15] - subs r0, 0x3 - ands r0, r1 - movs r1, 0x3 - negs r1, r1 - ands r0, r1 - subs r1, 0x2 - ands r0, r1 - subs r1, 0x4 - ands r0, r1 - strb r0, [r2, 0x15] - bx lr - .align 2, 0 -_08052D74: .4byte gSaveBlock2 - thumb_func_end sub_8052D54 - - thumb_func_start sub_8052D78 -sub_8052D78: @ 8052D78 - push {r4,lr} - ldr r0, _08052DA0 - movs r1, 0 - strb r1, [r0] - ldr r4, _08052DA4 - adds r0, r4, 0 - movs r1, 0 - movs r2, 0x34 - bl memset - adds r4, 0x34 - adds r0, r4, 0 - movs r1, 0 - movs r2, 0x34 - bl memset - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08052DA0: .4byte gUnknown_03005CE8 -_08052DA4: .4byte gSaveBlock2 + 0x28 - thumb_func_end sub_8052D78 - - thumb_func_start sub_8052DA8 -sub_8052DA8: @ 8052DA8 - push {r4-r7,lr} - bl sub_80B2D1C - ldr r0, _08052DD8 - ldr r4, _08052DDC - ldr r1, _08052DE0 - adds r3, r0, r1 - movs r2, 0x4 -_08052DB8: - adds r1, r3, 0 - adds r0, r4, 0 - ldm r0!, {r5-r7} - stm r1!, {r5-r7} - ldm r0!, {r5-r7} - stm r1!, {r5-r7} - ldm r0!, {r5,r6} - stm r1!, {r5,r6} - adds r3, 0x20 - subs r2, 0x1 - cmp r2, 0 - bge _08052DB8 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08052DD8: .4byte gSaveBlock1 -_08052DDC: .4byte gUnknown_08216604 -_08052DE0: .4byte 0x00002efc - thumb_func_end sub_8052DA8 - - thumb_func_start sub_8052DE4 -sub_8052DE4: @ 8052DE4 - push {lr} - sub sp, 0x4 - movs r0, 0 - str r0, [sp] - ldr r1, _08052DFC - ldr r2, _08052E00 - mov r0, sp - bl CpuSet - add sp, 0x4 - pop {r0} - bx r0 - .align 2, 0 -_08052DFC: .4byte gSaveBlock2 + 0xA8 -_08052E00: .4byte 0x050001fa - thumb_func_end sub_8052DE4 - - thumb_func_start sub_8052E04 -sub_8052E04: @ 8052E04 - push {lr} - sub sp, 0x4 - movs r3, 0x1 - negs r3, r3 - str r3, [sp] - movs r0, 0x19 - movs r1, 0x28 - adds r2, r3, 0 - bl warp1_set - bl warp_in - add sp, 0x4 - pop {r0} - bx r0 - thumb_func_end sub_8052E04 - - thumb_func_start ClearSav2 -ClearSav2: @ 8052E24 - push {lr} - sub sp, 0x4 - mov r1, sp - movs r0, 0 - strh r0, [r1] - ldr r1, _08052E44 - ldr r2, _08052E48 - mov r0, sp - bl CpuSet - bl sub_8052D54 - add sp, 0x4 - pop {r0} - bx r0 - .align 2, 0 -_08052E44: .4byte gSaveBlock2 -_08052E48: .4byte 0x01000448 - thumb_func_end ClearSav2 - - thumb_func_start sub_8052E4C -sub_8052E4C: @ 8052E4C - push {lr} - ldr r1, _08052E68 - movs r0, 0 - strb r0, [r1] - bl sub_808C0A0 - bl ZeroPlayerPartyMons - bl ZeroEnemyPartyMons - bl sub_80A3684 - pop {r0} - bx r0 - .align 2, 0 -_08052E68: .4byte gUnknown_020297EC - thumb_func_end sub_8052E4C - - thumb_func_start NewGameInitData -NewGameInitData: @ 8052E6C - push {r4,r5,lr} - ldr r0, _08052F3C - ldrh r0, [r0] - cmp r0, 0 - beq _08052E7A - cmp r0, 0x2 - bne _08052E7E -_08052E7A: - bl RtcReset -_08052E7E: - ldr r1, _08052F40 - movs r0, 0x1 - strb r0, [r1] - bl ZeroPlayerPartyMons - bl ZeroEnemyPartyMons - bl sub_808C02C - bl sub_8052DE4 - ldr r4, _08052F44 - movs r2, 0xEB - lsls r2, 6 - adds r0, r4, 0 - movs r1, 0 - bl memset - bl sub_80A2B18 - ldr r0, _08052F48 - movs r5, 0 - strb r5, [r0, 0x9] - bl set_player_trainer_id - bl PlayTimeCounter_Reset - bl sub_8052D78 - bl sub_8069030 - bl sub_80BD7A8 - bl sub_80BDAB4 - bl sub_80BB5B4 - bl sub_80B4A90 - movs r0, 0x92 - lsls r0, 3 - adds r1, r4, r0 - ldr r0, _08052F4C - str r0, [r1] - bl sub_80AB1B0 - bl sub_80530AC - bl sub_8052DA8 - bl GameFreakRTC_Reset - bl sub_80C5B84 - bl sub_80C5BDC - ldr r0, _08052F50 - strb r5, [r0] - bl ZeroPlayerPartyMons - bl sub_80961D8 - bl sub_81341F8 - bl sub_813420C - ldr r0, _08052F54 - adds r4, r0 - strh r5, [r4] - bl sub_80A3714 - bl sub_8139C18 - bl sub_810C994 - bl sub_8133F80 - bl sub_80E6764 - bl sub_80F7AA4 - bl sub_80FA17C - bl sub_810FA54 - bl sub_8145A78 - bl sub_8052E04 - ldr r0, _08052F58 - bl ScriptContext2_RunNewScript - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08052F3C: .4byte gSaveFileStatus -_08052F40: .4byte gUnknown_020297EC -_08052F44: .4byte gSaveBlock1 -_08052F48: .4byte gSaveBlock2 -_08052F4C: .4byte 0x00000bb8 -_08052F50: .4byte gPlayerPartyCount -_08052F54: .4byte 0x00000496 -_08052F58: .4byte gUnknown_0819FA81 - thumb_func_end NewGameInitData - thumb_func_start sub_8052F5C sub_8052F5C: @ 8052F5C push {lr} diff --git a/include/global.h b/include/global.h index b50aa7d2f..68ec7c6ca 100644 --- a/include/global.h +++ b/include/global.h @@ -46,6 +46,18 @@ enum OPTIONS_TEXT_SPEED_FAST }; +enum +{ + OPTIONS_SOUND_MONO, + OPTIONS_SOUND_STEREO +}; + +enum +{ + OPTIONS_BATTLE_STYLE_SHIFT, + OPTIONS_BATTLE_STYLE_SET +}; + struct Coords16 { s16 x; @@ -102,6 +114,11 @@ struct RamScript struct RamScriptData data; }; +struct SB1_2EFC_Struct +{ + u8 unknown[0x20]; +}; + struct SaveBlock1 { struct Coords16 pos; @@ -109,7 +126,10 @@ struct SaveBlock1 u8 filler_C[0x484]; u32 money; u16 coins; - u8 filler_496[0x31FA]; + u16 registeredItem; // registered for use with SELECT button + u8 filler_498[0x2A64]; + struct SB1_2EFC_Struct sb1_2EFC_struct[5]; + u8 filler_2F9C[0x6F4]; struct RamScript ramScript; u8 filler_3A7C[0x44]; }; @@ -124,6 +144,19 @@ struct Time s8 seconds; }; +struct Pokedex +{ + u8 order; + u8 unknown1; + u8 nationalMagic; // must equal 0xDA in order to have National mode + u8 unknown2; + u32 unownPersonality; // set when you first see Unown + u32 spindaPersonality; // set when you first see Spinda + u32 unknown3; + u8 owned[52]; + u8 seen[52]; +}; + struct SaveBlock2 { u8 playerName[8]; @@ -137,9 +170,15 @@ struct SaveBlock2 u8 optionsButtonMode; // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A] u8 optionsTextSpeed:3; // OPTIONS_TEXT_SPEED_[SLOW/MID/FAST] u8 optionsWindowFrameType:5; // Specifies one of the 20 decorative borders for text boxes - u8 filler_15[0x83]; + u8 optionsSound:1; // OPTIONS_SOUND_[MONO/STEREO] + u8 optionsBattleStyle:1; // OPTIONS_BATTLE_STYLE_[SHIFT/SET] + u8 optionsBattleSceneOff:1; // whether battle animations are disabled + u8 regionMapZoom:1; // whether the map is zoomed in + struct Pokedex pokedex; + u8 filler_90[0x8]; struct Time localTimeOffset; - u8 filler_A0[0x7F0]; + struct Time lastBerryTreeUpdate; + u8 filler_A8[0x7E8]; }; extern struct SaveBlock2 gSaveBlock2; diff --git a/ld_script.txt b/ld_script.txt index 40f28e59e..8905ced71 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -55,6 +55,7 @@ SECTIONS { src/rng.o(.text); asm/rom_8040EB4.o(.text); src/play_time.o(.text); + src/new_game.o(.text); asm/rom4.o(.text); src/map_obj_80643A4.o(.text); src/field_message_box.o(.text); diff --git a/src/new_game.c b/src/new_game.c new file mode 100644 index 000000000..3d7722505 --- /dev/null +++ b/src/new_game.c @@ -0,0 +1,132 @@ +#include "global.h" +#include "rng.h" +#include "rtc.h" +#include "pokemon.h" + +extern void warp1_set(s8, s8, s8, s8, s8); + +extern u8 gUnknown_020297EC; + +extern u8 gPlayerPartyCount; +extern u8 gUnknown_03005CE8; +extern u16 gSaveFileStatus; + +extern u8 gUnknown_0819FA81[]; +extern const struct SB1_2EFC_Struct gUnknown_08216604; + +void write_word_to_mem(u32 a1, u8 *a2) +{ + a2[0] = a1; + a2[1] = a1 >> 8; + a2[2] = a1 >> 16; + a2[3] = a1 >> 24; +} + +void sub_8052D10(u8 *a1, u8 *a2) +{ + s32 i; + for (i = 0; i < 4; i++) + a1[i] = a2[i]; +} + +void set_player_trainer_id(void) +{ + write_word_to_mem((Random() << 16) | Random(), gSaveBlock2.playerTrainerId); +} + +void sub_8052D54(void) +{ + gSaveBlock2.optionsTextSpeed = OPTIONS_TEXT_SPEED_MID; + gSaveBlock2.optionsWindowFrameType = 0; + gSaveBlock2.optionsSound = OPTIONS_SOUND_MONO; + gSaveBlock2.optionsBattleStyle = OPTIONS_BATTLE_STYLE_SHIFT; + gSaveBlock2.optionsBattleSceneOff = FALSE; + gSaveBlock2.regionMapZoom = FALSE; +} + +void sub_8052D78(void) +{ + gUnknown_03005CE8 = 0; + memset(&gSaveBlock2.pokedex.owned, 0, sizeof(gSaveBlock2.pokedex.owned)); + memset(&gSaveBlock2.pokedex.seen, 0, sizeof(gSaveBlock2.pokedex.seen)); +} + +void sub_8052DA8(void) +{ + s32 i; + sub_80B2D1C(); + for (i = 0; i < 5; i++) + gSaveBlock1.sb1_2EFC_struct[i] = gUnknown_08216604; +} + +void sub_8052DE4(void) +{ + CpuFill32(0, gSaveBlock2.filler_A8, sizeof(gSaveBlock2.filler_A8)); +} + +void sub_8052E04(void) +{ + warp1_set(25, 40, -1, -1, -1); // inside of truck + warp_in(); +} + +void ClearSav2(void) +{ + CpuFill16(0, &gSaveBlock2, sizeof(gSaveBlock2)); + sub_8052D54(); +} + +void sub_8052E4C(void) +{ + gUnknown_020297EC = 0; + sub_808C0A0(); + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + sub_80A3684(); +} + +void NewGameInitData(void) +{ + if (!gSaveFileStatus || gSaveFileStatus == 2) + RtcReset(); + gUnknown_020297EC = 1; + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + sub_808C02C(); + sub_8052DE4(); + memset(&gSaveBlock1, 0, sizeof(gSaveBlock1)); + sub_80A2B18(); + gSaveBlock2.sb2_field_9 = 0; + set_player_trainer_id(); + PlayTimeCounter_Reset(); + sub_8052D78(); + sub_8069030(); + sub_80BD7A8(); + sub_80BDAB4(); + sub_80BB5B4(); + sub_80B4A90(); + gSaveBlock1.money = 3000; + sub_80AB1B0(); + sub_80530AC(); + sub_8052DA8(); + GameFreakRTC_Reset(); + sub_80C5B84(); + sub_80C5BDC(); + gPlayerPartyCount = 0; + ZeroPlayerPartyMons(); + sub_80961D8(); + sub_81341F8(); + sub_813420C(); + gSaveBlock1.registeredItem = 0; + sub_80A3714(); + sub_8139C18(); + sub_810C994(); + sub_8133F80(); + sub_80E6764(); + sub_80F7AA4(); + sub_80FA17C(); + sub_810FA54(); + sub_8145A78(); + sub_8052E04(); + ScriptContext2_RunNewScript(gUnknown_0819FA81); +} |