summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/player_pc.s106
-rw-r--r--ld_script.txt1
-rw-r--r--src/player_pc.c116
3 files changed, 117 insertions, 106 deletions
diff --git a/asm/player_pc.s b/asm/player_pc.s
index da2792564..26e3576f3 100644
--- a/asm/player_pc.s
+++ b/asm/player_pc.s
@@ -6,112 +6,6 @@
.text
- thumb_func_start NewGameInitPCItems
-NewGameInitPCItems: @ 8139C18
- push {r4-r6,lr}
- movs r4, 0
- ldr r0, _08139C6C @ =gSaveBlock1 + 0x498
- movs r1, 0x32
- bl ClearItemSlots
- ldr r1, _08139C70 @ =gNewGamePCItems
- ldrh r0, [r1]
- cmp r0, 0
- beq _08139C64
- ldrh r0, [r1, 0x2]
- cmp r0, 0
- beq _08139C64
- adds r5, r1, 0
- adds r6, r5, 0x2
-_08139C36:
- lsls r1, r4, 2
- adds r0, r1, r5
- ldrh r0, [r0]
- adds r1, r6
- ldrh r1, [r1]
- bl AddPCItem
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08139C64
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, r4, 2
- adds r0, r1, r5
- ldrh r0, [r0]
- cmp r0, 0
- beq _08139C64
- adds r0, r1, r6
- ldrh r0, [r0]
- cmp r0, 0
- bne _08139C36
-_08139C64:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08139C6C: .4byte gSaveBlock1 + 0x498
-_08139C70: .4byte gNewGamePCItems
- thumb_func_end NewGameInitPCItems
-
- thumb_func_start BedroomPC
-BedroomPC: @ 8139C74
- push {lr}
- ldr r1, _08139C9C @ =gUnknown_02039314
- ldr r0, _08139CA0 @ =gUnknown_084062B8
- str r0, [r1]
- ldr r1, _08139CA4 @ =gUnknown_030007B4
- movs r0, 0x4
- strb r0, [r1]
- ldr r0, _08139CA8 @ =TaskDummy
- movs r1, 0
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08139CAC @ =gOtherText_WhatWillYouDo
- ldr r2, _08139CB0 @ =InitPlayerPCMenu
- movs r3, 0
- bl DisplayItemMessageOnField
- pop {r0}
- bx r0
- .align 2, 0
-_08139C9C: .4byte gUnknown_02039314
-_08139CA0: .4byte gUnknown_084062B8
-_08139CA4: .4byte gUnknown_030007B4
-_08139CA8: .4byte TaskDummy
-_08139CAC: .4byte gOtherText_WhatWillYouDo
-_08139CB0: .4byte InitPlayerPCMenu
- thumb_func_end BedroomPC
-
- thumb_func_start PlayerPC
-PlayerPC: @ 8139CB4
- push {lr}
- ldr r1, _08139CDC @ =gUnknown_02039314
- ldr r0, _08139CE0 @ =gUnknown_084062BC
- str r0, [r1]
- ldr r1, _08139CE4 @ =gUnknown_030007B4
- movs r0, 0x3
- strb r0, [r1]
- ldr r0, _08139CE8 @ =TaskDummy
- movs r1, 0
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08139CEC @ =gOtherText_WhatWillYouDo
- ldr r2, _08139CF0 @ =InitPlayerPCMenu
- movs r3, 0
- bl DisplayItemMessageOnField
- pop {r0}
- bx r0
- .align 2, 0
-_08139CDC: .4byte gUnknown_02039314
-_08139CE0: .4byte gUnknown_084062BC
-_08139CE4: .4byte gUnknown_030007B4
-_08139CE8: .4byte TaskDummy
-_08139CEC: .4byte gOtherText_WhatWillYouDo
-_08139CF0: .4byte InitPlayerPCMenu
- thumb_func_end PlayerPC
-
thumb_func_start InitPlayerPCMenu
InitPlayerPCMenu: @ 8139CF4
push {r4,r5,lr}
diff --git a/ld_script.txt b/ld_script.txt
index 55a779f04..8d25d812f 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -184,6 +184,7 @@ SECTIONS {
asm/field_effect_helpers.o(.text);
asm/contest_ai.o(.text);
asm/rom_81258BC.o(.text);
+ src/player_pc.o(.text);
asm/player_pc.o(.text);
src/intro.o(.text);
asm/rom_813BA94.o(.text);
diff --git a/src/player_pc.c b/src/player_pc.c
new file mode 100644
index 000000000..cbc04cd4d
--- /dev/null
+++ b/src/player_pc.c
@@ -0,0 +1,116 @@
+#include "global.h"
+#include "item.h"
+#include "task.h"
+
+/*
+this file is way too hard. I'm coming back to this one later. For one, InitPlayerPCMenu
+is treated as a u8 (wtf?) in BedroomPC and PlayerPC for some insanely stupid reason, which means
+when it actually is decompiled there's almost no way this'll match anymore. script_menu.s probably
+needs to be decompiled before this.
+*/
+
+extern void DisplayItemMessageOnField(u8, u8*, u8*, u16);
+
+extern struct ItemSlot gNewGamePCItems[];
+
+extern u8 InitPlayerPCMenu;
+extern u8 gOtherText_WhatWillYouDo[];
+
+extern u32 gUnknown_02039314;
+extern u32 gUnknown_084062B8[];
+extern u32 gUnknown_084062BC[];
+extern u8 gUnknown_030007B4[][2];
+
+// this function is insane. It functionally matches, but the compiler is extremely insistent on gNewGamePCItems going in r5 instead of r1.
+#ifdef NONMATCHING
+void NewGameInitPCItems(void)
+{
+ u8 i = 0;
+
+ ClearItemSlots(gSaveBlock1.pcItems, 0x32);
+
+ for(;gNewGamePCItems[i].itemId && gNewGamePCItems[i].quantity; i++)
+ if(AddPCItem(gNewGamePCItems[i].itemId, gNewGamePCItems[i].quantity) != 1)
+ return;
+}
+#else
+__attribute__((naked))
+void NewGameInitPCItems(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ movs r4, 0\n\
+ ldr r0, _08139C6C @ =gSaveBlock1 + 0x498\n\
+ movs r1, 0x32\n\
+ bl ClearItemSlots\n\
+ ldr r1, _08139C70 @ =gNewGamePCItems\n\
+ ldrh r0, [r1]\n\
+ cmp r0, 0\n\
+ beq _08139C64\n\
+ ldrh r0, [r1, 0x2]\n\
+ cmp r0, 0\n\
+ beq _08139C64\n\
+ adds r5, r1, 0\n\
+ adds r6, r5, 0x2\n\
+_08139C36:\n\
+ lsls r1, r4, 2\n\
+ adds r0, r1, r5\n\
+ ldrh r0, [r0]\n\
+ adds r1, r6\n\
+ ldrh r1, [r1]\n\
+ bl AddPCItem\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _08139C64\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ lsls r1, r4, 2\n\
+ adds r0, r1, r5\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _08139C64\n\
+ adds r0, r1, r6\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08139C36\n\
+_08139C64:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08139C6C: .4byte gSaveBlock1 + 0x498\n\
+_08139C70: .4byte gNewGamePCItems\n\
+ .syntax divided");
+}
+#endif
+
+void BedroomPC(void)
+{
+ u8 taskId;
+
+ gUnknown_02039314 = (int)&gUnknown_084062B8;
+ gUnknown_030007B4[0][0] = 4;
+ taskId = CreateTask(TaskDummy, 0);
+ DisplayItemMessageOnField(taskId, gOtherText_WhatWillYouDo, &InitPlayerPCMenu, 0);
+}
+
+void PlayerPC(void)
+{
+ u8 taskId;
+
+ gUnknown_02039314 = (int)&gUnknown_084062BC;
+ gUnknown_030007B4[0][0] = 3;
+ taskId = CreateTask(TaskDummy, 0);
+ DisplayItemMessageOnField(taskId, gOtherText_WhatWillYouDo, &InitPlayerPCMenu, 0);
+}
+
+// not done
+/*void InitPlayerPCMenu(u8 taskId)
+{
+ MenuDrawTextWindow(0, 0, 10, gUnknown_030007B4[1][0]);
+ PrintMenuItemsReordered(1, 1, gUnknown_030007B4, gUnknown_08406298, gUnknown_02039314);
+ InitMenu(0, 1, 1, gUnknown_030007B4, 0, 9);
+ gTasks[taskId].func = PlayerPCProcessMenuInput;
+}*/