diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/player_pc.c | 116 | 
1 files changed, 116 insertions, 0 deletions
| 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; +}*/ | 
