diff options
author | ProjectRevoTPP <projectrevotpp@hotmail.com> | 2016-12-18 04:58:17 +0000 |
---|---|---|
committer | ProjectRevoTPP <projectrevotpp@hotmail.com> | 2016-12-18 04:58:17 +0000 |
commit | 6d27f57aaf46cc97ef52e01c39181a08ca416eb8 (patch) | |
tree | 2bdc25a674c8bbf1c37da4e893084de8b923754e | |
parent | 921dcdba34c72681ba4d84f0cfe36060d17bd187 (diff) |
decompile a little bit of player_pc. file too hard.
-rw-r--r-- | asm/player_pc.s | 106 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/player_pc.c | 116 |
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; +}*/ |