summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2016-09-25 22:11:44 -0700
committerYamaArashi <shadow962@live.com>2016-09-25 22:11:44 -0700
commit25dd8729e559e28772dd1a86361767c07442c641 (patch)
tree0ec26bbe35a46ea4a9f5ee167e8c3c86470276f8
parent0a2857a7dce54b3b16cad1a3b605bae35ff748a9 (diff)
decompile new game init code
-rw-r--r--asm/rom4.s281
-rw-r--r--include/global.h45
-rw-r--r--ld_script.txt1
-rw-r--r--src/new_game.c132
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);
+}