From aa053f1948dcb03213105c63ed81f197909222c6 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sun, 20 Aug 2017 21:32:22 -0400 Subject: sub_80B33D0 --- src/shop.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index d53646a88..5cc1f276e 100644 --- a/src/shop.c +++ b/src/shop.c @@ -340,3 +340,12 @@ void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s8 var4) break; } } + +void sub_80B33D0(s16 var1, int var2, u16 *var3) +{ + s16 offset1 = var1 * 2; + s16 offset2 = (var2 * 0x40) + 0x40; + + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); + BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); +} -- cgit v1.2.3 From e7f670bf790a96e63b1302bc004bfaa55c8ac7ea Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Mon, 21 Aug 2017 10:47:43 -0400 Subject: i am useless --- src/shop.c | 368 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 368 insertions(+) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 5cc1f276e..b832b5a26 100644 --- a/src/shop.c +++ b/src/shop.c @@ -16,6 +16,7 @@ #include "task.h" #include "tv.h" #include "unknown_task.h" +#include "field_map_obj.h" struct UnknownShopStruct { @@ -349,3 +350,370 @@ void sub_80B33D0(s16 var1, int var2, u16 *var3) BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3); BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); } + +// no. for loop too hard. +__attribute__((naked)) +void sub_80B3420() // dont know args +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl GetXYCoordsOneStepInFrontOfPlayer\n\ + mov r1, sp\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + subs r0, 0x3\n\ + strh r0, [r1]\n\ + ldrh r0, [r4]\n\ + subs r0, 0x3\n\ + strh r0, [r4]\n\ + movs r1, 0\n\ + ldr r0, _080B34A8 @ =0x000001ff\n\ + mov r10, r0\n\ + ldr r2, _080B34AC @ =gMapHeader\n\ + mov r9, r2\n\ +_080B3452:\n\ + movs r4, 0\n\ + lsls r1, 16\n\ + mov r8, r1\n\ + asrs r7, r1, 16\n\ +_080B345A:\n\ + mov r0, sp\n\ + movs r3, 0\n\ + ldrsh r0, [r0, r3]\n\ + lsls r4, 16\n\ + asrs r6, r4, 16\n\ + adds r0, r6\n\ + mov r2, sp\n\ + movs r3, 0x2\n\ + ldrsh r1, [r2, r3]\n\ + adds r1, r7\n\ + bl MapGridGetMetatileIdAt\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r7, 0x5\n\ + beq _080B34D0\n\ + cmp r6, 0x6\n\ + beq _080B34D0\n\ + mov r0, sp\n\ + movs r1, 0\n\ + ldrsh r0, [r0, r1]\n\ + adds r0, r6\n\ + mov r2, sp\n\ + movs r3, 0x2\n\ + ldrsh r1, [r2, r3]\n\ + adds r1, r7\n\ + bl MapGridGetMetatileLayerTypeAt\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r5, r10\n\ + bhi _080B34B0\n\ + mov r1, r9\n\ + ldr r0, [r1]\n\ + ldr r0, [r0, 0x10]\n\ + lsls r1, r5, 4\n\ + ldr r2, [r0, 0xC]\n\ + adds r2, r1\n\ + b _080B34C0\n\ + .align 2, 0\n\ +_080B34A8: .4byte 0x000001ff\n\ +_080B34AC: .4byte gMapHeader\n\ +_080B34B0:\n\ + mov r2, r9\n\ + ldr r0, [r2]\n\ + ldr r1, [r0, 0x14]\n\ + ldr r2, _080B34CC @ =0xfffffe00\n\ + adds r0, r5, r2\n\ + lsls r0, 4\n\ + ldr r2, [r1, 0xC]\n\ + adds r2, r0\n\ +_080B34C0:\n\ + adds r0, r6, 0\n\ + adds r1, r7, 0\n\ + bl BuyMenuDrawMapMetatile\n\ + b _080B3506\n\ + .align 2, 0\n\ +_080B34CC: .4byte 0xfffffe00\n\ +_080B34D0:\n\ + cmp r5, r10\n\ + bhi _080B34EC\n\ + asrs r0, r4, 16\n\ + mov r3, r9\n\ + ldr r1, [r3]\n\ + ldr r1, [r1, 0x10]\n\ + lsls r3, r5, 4\n\ + ldr r2, [r1, 0xC]\n\ + adds r2, r3\n\ + mov r3, r8\n\ + asrs r1, r3, 16\n\ + bl sub_80B33D0\n\ + b _080B3506\n\ +_080B34EC:\n\ + asrs r0, r4, 16\n\ + mov r2, r9\n\ + ldr r1, [r2]\n\ + ldr r2, [r1, 0x14]\n\ + ldr r3, _080B354C @ =0xfffffe00\n\ + adds r1, r5, r3\n\ + lsls r1, 4\n\ + ldr r2, [r2, 0xC]\n\ + adds r2, r1\n\ + mov r3, r8\n\ + asrs r1, r3, 16\n\ + bl sub_80B33D0\n\ +_080B3506:\n\ + cmp r7, 0\n\ + bne _080B3520\n\ + asrs r1, r4, 16\n\ + cmp r1, 0\n\ + beq _080B3520\n\ + cmp r1, 0x6\n\ + beq _080B3520\n\ + lsls r1, 17\n\ + asrs r1, 16\n\ + ldr r0, _080B3550 @ =gBGTilemapBuffers + 0x800\n\ + movs r2, 0x40\n\ + bl sub_80B32EC\n\ +_080B3520:\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + adds r0, r4, r1\n\ + lsrs r4, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x6\n\ + ble _080B345A\n\ + adds r0, r1, 0\n\ + add r0, r8\n\ + lsrs r1, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x5\n\ + ble _080B3452\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B354C: .4byte 0xfffffe00\n\ +_080B3550: .4byte gBGTilemapBuffers + 0x800\n\ + .syntax divided"); +} + +void BuyMenuDrawMapGraphics(void) +{ + sub_80F9020(); + sub_80B356C(); + sub_80B368C(); + sub_80B3420(); +} + +// yet another difficult multi for-loop. No. +__attribute__((naked)) +void sub_80B356C(void) // PopulateShopViewWindowObjectInfo ? +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + movs r0, 0\n\ + mov r8, r0\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl GetXYCoordsOneStepInFrontOfPlayer\n\ + bl PlayerGetZCoord\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x4]\n\ + movs r5, 0\n\ + ldr r2, _080B3674 @ =gUnknown_020386A4\n\ + movs r1, 0x10\n\ +_080B3598:\n\ + lsls r0, r5, 3\n\ + adds r0, r2\n\ + strh r1, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0xF\n\ + bls _080B3598\n\ + movs r5, 0\n\ + ldr r7, _080B3678 @ =gUnknown_020386AA\n\ + subs r1, r7, 0x6\n\ + mov r9, r1\n\ +_080B35B0:\n\ + movs r4, 0\n\ + adds r2, r5, 0x1\n\ + mov r10, r2\n\ +_080B35B6:\n\ + mov r1, sp\n\ + ldr r3, _080B367C @ =0x0000fffd\n\ + adds r0, r3, 0\n\ + ldrh r1, [r1]\n\ + adds r0, r1\n\ + adds r0, r4\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + ldr r2, _080B3680 @ =0x0000fffe\n\ + adds r1, r2, 0\n\ + mov r3, sp\n\ + ldrh r3, [r3, 0x2]\n\ + adds r1, r3\n\ + adds r1, r5\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + ldr r2, [sp, 0x4]\n\ + bl GetFieldObjectIdByXYZ\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r2, 0x10\n\ + beq _080B3650\n\ + mov r0, r8\n\ + lsls r3, r0, 3\n\ + mov r1, r9\n\ + adds r0, r3, r1\n\ + movs r6, 0\n\ + strh r2, [r0]\n\ + mov r0, r9\n\ + adds r0, 0x2\n\ + adds r0, r3, r0\n\ + strh r4, [r0]\n\ + ldr r1, _080B3684 @ =gUnknown_020386A8\n\ + adds r0, r3, r1\n\ + strh r5, [r0]\n\ + ldr r1, _080B3688 @ =gMapObjects\n\ + lsls r0, r2, 3\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + adds r2, r0, r1\n\ + ldrb r0, [r2, 0x18]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + cmp r0, 0x1\n\ + bne _080B3616\n\ + adds r0, r3, r7\n\ + strh r6, [r0]\n\ +_080B3616:\n\ + ldrb r0, [r2, 0x18]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + cmp r0, 0x2\n\ + bne _080B3626\n\ + adds r1, r3, r7\n\ + movs r0, 0x1\n\ + strh r0, [r1]\n\ +_080B3626:\n\ + ldrb r0, [r2, 0x18]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + cmp r0, 0x3\n\ + bne _080B3636\n\ + adds r1, r3, r7\n\ + movs r0, 0x2\n\ + strh r0, [r1]\n\ +_080B3636:\n\ + ldrb r0, [r2, 0x18]\n\ + lsls r0, 28\n\ + lsrs r0, 28\n\ + cmp r0, 0x4\n\ + bne _080B3646\n\ + adds r1, r3, r7\n\ + movs r0, 0x3\n\ + strh r0, [r1]\n\ +_080B3646:\n\ + mov r0, r8\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ +_080B3650:\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x6\n\ + bls _080B35B6\n\ + mov r2, r10\n\ + lsls r0, r2, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x4\n\ + bls _080B35B0\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B3674: .4byte gUnknown_020386A4\n\ +_080B3678: .4byte gUnknown_020386AA\n\ +_080B367C: .4byte 0x0000fffd\n\ +_080B3680: .4byte 0x0000fffe\n\ +_080B3684: .4byte gUnknown_020386A8\n\ +_080B3688: .4byte gMapObjects\n\ + .syntax divided"); +} +/* +struct UnkStruct_20386A4 +{ + s16 mapObjId; + u16 unk2; + u16 unk4; + u8 unk6[2]; +}; +*/ + +//extern s16 gUnknown_020386A4[][]; +//extern struct UnkStruct_20386A4 gUnknown_020386A4[]; + +// all 3 of these are incredibly hard, please help +/*void sub_80B368C(void) +{ + // r0 = spriteId + // r1 = gUnknown_020386A4 + 6 + // r2 = gSprites[spriteId] + // r3 = gUnknown_020386A4[i].unk4 + 32 + // r4 = i * 8 + // r5 = 0 (i) + // r6 = gUnknown_020386A4 + // r7 = gMapObjects + // r8 = gUnknown_020386A4 + 6 + // r9 = + // r10 = + // r11 = + // r12 = + + u8 i = 0; + u8 *unkArray = (u8 *)&gUnknown_020386A4[6]; + + for(; i < 16; i++) // max objects? + { + s16 mapObjId = unkStruct[i].mapObjId; + if(mapObjId != 16) + { + u8 spriteId = AddPseudoFieldObject( + gMapObjects[mapObjId].graphicsId, + SpriteCallbackDummy, + unkStruct[i].unk2 * 16 + 8, + unkStruct[i].unk4 + 12, + 2); + StartSpriteAnim(&gSprites[spriteId], unkArray[i]); + } + } +}*/ -- cgit v1.2.3 From 878b0d50996ba8be9d18a8c0df39b1f7f255033b Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Mon, 21 Aug 2017 18:46:20 -0400 Subject: thanks cam. --- src/shop.c | 446 +++++++++++++------------------------------------------------ 1 file changed, 94 insertions(+), 352 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index b832b5a26..06ec45292 100644 --- a/src/shop.c +++ b/src/shop.c @@ -17,6 +17,8 @@ #include "tv.h" #include "unknown_task.h" #include "field_map_obj.h" +#include "field_player_avatar.h" +#include "fieldmap.h" struct UnknownShopStruct { @@ -319,7 +321,7 @@ void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *arra array[offset1 + offset2 + 33] = array2[3]; } -void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s8 var4) +void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) { u8 tempVar4 = var4; s16 offset1 = var1 * 2; @@ -351,163 +353,44 @@ void sub_80B33D0(s16 var1, int var2, u16 *var3) BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); } -// no. for loop too hard. -__attribute__((naked)) -void sub_80B3420() // dont know args +void sub_80B3420(void) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl GetXYCoordsOneStepInFrontOfPlayer\n\ - mov r1, sp\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - subs r0, 0x3\n\ - strh r0, [r1]\n\ - ldrh r0, [r4]\n\ - subs r0, 0x3\n\ - strh r0, [r4]\n\ - movs r1, 0\n\ - ldr r0, _080B34A8 @ =0x000001ff\n\ - mov r10, r0\n\ - ldr r2, _080B34AC @ =gMapHeader\n\ - mov r9, r2\n\ -_080B3452:\n\ - movs r4, 0\n\ - lsls r1, 16\n\ - mov r8, r1\n\ - asrs r7, r1, 16\n\ -_080B345A:\n\ - mov r0, sp\n\ - movs r3, 0\n\ - ldrsh r0, [r0, r3]\n\ - lsls r4, 16\n\ - asrs r6, r4, 16\n\ - adds r0, r6\n\ - mov r2, sp\n\ - movs r3, 0x2\n\ - ldrsh r1, [r2, r3]\n\ - adds r1, r7\n\ - bl MapGridGetMetatileIdAt\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - cmp r7, 0x5\n\ - beq _080B34D0\n\ - cmp r6, 0x6\n\ - beq _080B34D0\n\ - mov r0, sp\n\ - movs r1, 0\n\ - ldrsh r0, [r0, r1]\n\ - adds r0, r6\n\ - mov r2, sp\n\ - movs r3, 0x2\n\ - ldrsh r1, [r2, r3]\n\ - adds r1, r7\n\ - bl MapGridGetMetatileLayerTypeAt\n\ - lsls r0, 24\n\ - lsrs r3, r0, 24\n\ - cmp r5, r10\n\ - bhi _080B34B0\n\ - mov r1, r9\n\ - ldr r0, [r1]\n\ - ldr r0, [r0, 0x10]\n\ - lsls r1, r5, 4\n\ - ldr r2, [r0, 0xC]\n\ - adds r2, r1\n\ - b _080B34C0\n\ - .align 2, 0\n\ -_080B34A8: .4byte 0x000001ff\n\ -_080B34AC: .4byte gMapHeader\n\ -_080B34B0:\n\ - mov r2, r9\n\ - ldr r0, [r2]\n\ - ldr r1, [r0, 0x14]\n\ - ldr r2, _080B34CC @ =0xfffffe00\n\ - adds r0, r5, r2\n\ - lsls r0, 4\n\ - ldr r2, [r1, 0xC]\n\ - adds r2, r0\n\ -_080B34C0:\n\ - adds r0, r6, 0\n\ - adds r1, r7, 0\n\ - bl BuyMenuDrawMapMetatile\n\ - b _080B3506\n\ - .align 2, 0\n\ -_080B34CC: .4byte 0xfffffe00\n\ -_080B34D0:\n\ - cmp r5, r10\n\ - bhi _080B34EC\n\ - asrs r0, r4, 16\n\ - mov r3, r9\n\ - ldr r1, [r3]\n\ - ldr r1, [r1, 0x10]\n\ - lsls r3, r5, 4\n\ - ldr r2, [r1, 0xC]\n\ - adds r2, r3\n\ - mov r3, r8\n\ - asrs r1, r3, 16\n\ - bl sub_80B33D0\n\ - b _080B3506\n\ -_080B34EC:\n\ - asrs r0, r4, 16\n\ - mov r2, r9\n\ - ldr r1, [r2]\n\ - ldr r2, [r1, 0x14]\n\ - ldr r3, _080B354C @ =0xfffffe00\n\ - adds r1, r5, r3\n\ - lsls r1, 4\n\ - ldr r2, [r2, 0xC]\n\ - adds r2, r1\n\ - mov r3, r8\n\ - asrs r1, r3, 16\n\ - bl sub_80B33D0\n\ -_080B3506:\n\ - cmp r7, 0\n\ - bne _080B3520\n\ - asrs r1, r4, 16\n\ - cmp r1, 0\n\ - beq _080B3520\n\ - cmp r1, 0x6\n\ - beq _080B3520\n\ - lsls r1, 17\n\ - asrs r1, 16\n\ - ldr r0, _080B3550 @ =gBGTilemapBuffers + 0x800\n\ - movs r2, 0x40\n\ - bl sub_80B32EC\n\ -_080B3520:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - adds r0, r4, r1\n\ - lsrs r4, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x6\n\ - ble _080B345A\n\ - adds r0, r1, 0\n\ - add r0, r8\n\ - lsrs r1, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x5\n\ - ble _080B3452\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B354C: .4byte 0xfffffe00\n\ -_080B3550: .4byte gBGTilemapBuffers + 0x800\n\ - .syntax divided"); + s16 facingX; + s16 facingY; + s16 x; + s16 y; + + GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); + facingX -= 3; + facingY -= 3; + + for (y = 0; y < 6; y++) + { + for (x = 0; x < 7; x++) + { + u16 metatileId = MapGridGetMetatileIdAt(facingX + x, facingY + y); + + if (y != 5 && x != 6) + { + s32 r3 = MapGridGetMetatileLayerTypeAt(facingX + x, facingY + y); + + if (metatileId < 512) + BuyMenuDrawMapMetatile(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8, r3); + else + BuyMenuDrawMapMetatile(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8, r3); + } + else + { + if (metatileId < 512) + sub_80B33D0(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8); + else + sub_80B33D0(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8); + } + + if (y == 0 && x != 0 && x != 6) + sub_80B32EC(gBGTilemapBuffers[1], x * 2, 64); + } + } } void BuyMenuDrawMapGraphics(void) @@ -518,202 +401,61 @@ void BuyMenuDrawMapGraphics(void) sub_80B3420(); } -// yet another difficult multi for-loop. No. -__attribute__((naked)) -void sub_80B356C(void) // PopulateShopViewWindowObjectInfo ? +extern s16 gUnknown_020386A4[][4]; + +void sub_80B356C(void) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - movs r0, 0\n\ - mov r8, r0\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl GetXYCoordsOneStepInFrontOfPlayer\n\ - bl PlayerGetZCoord\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x4]\n\ - movs r5, 0\n\ - ldr r2, _080B3674 @ =gUnknown_020386A4\n\ - movs r1, 0x10\n\ -_080B3598:\n\ - lsls r0, r5, 3\n\ - adds r0, r2\n\ - strh r1, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0xF\n\ - bls _080B3598\n\ - movs r5, 0\n\ - ldr r7, _080B3678 @ =gUnknown_020386AA\n\ - subs r1, r7, 0x6\n\ - mov r9, r1\n\ -_080B35B0:\n\ - movs r4, 0\n\ - adds r2, r5, 0x1\n\ - mov r10, r2\n\ -_080B35B6:\n\ - mov r1, sp\n\ - ldr r3, _080B367C @ =0x0000fffd\n\ - adds r0, r3, 0\n\ - ldrh r1, [r1]\n\ - adds r0, r1\n\ - adds r0, r4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - ldr r2, _080B3680 @ =0x0000fffe\n\ - adds r1, r2, 0\n\ - mov r3, sp\n\ - ldrh r3, [r3, 0x2]\n\ - adds r1, r3\n\ - adds r1, r5\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - ldr r2, [sp, 0x4]\n\ - bl GetFieldObjectIdByXYZ\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r2, 0x10\n\ - beq _080B3650\n\ - mov r0, r8\n\ - lsls r3, r0, 3\n\ - mov r1, r9\n\ - adds r0, r3, r1\n\ - movs r6, 0\n\ - strh r2, [r0]\n\ - mov r0, r9\n\ - adds r0, 0x2\n\ - adds r0, r3, r0\n\ - strh r4, [r0]\n\ - ldr r1, _080B3684 @ =gUnknown_020386A8\n\ - adds r0, r3, r1\n\ - strh r5, [r0]\n\ - ldr r1, _080B3688 @ =gMapObjects\n\ - lsls r0, r2, 3\n\ - adds r0, r2\n\ - lsls r0, 2\n\ - adds r2, r0, r1\n\ - ldrb r0, [r2, 0x18]\n\ - lsls r0, 28\n\ - lsrs r0, 28\n\ - cmp r0, 0x1\n\ - bne _080B3616\n\ - adds r0, r3, r7\n\ - strh r6, [r0]\n\ -_080B3616:\n\ - ldrb r0, [r2, 0x18]\n\ - lsls r0, 28\n\ - lsrs r0, 28\n\ - cmp r0, 0x2\n\ - bne _080B3626\n\ - adds r1, r3, r7\n\ - movs r0, 0x1\n\ - strh r0, [r1]\n\ -_080B3626:\n\ - ldrb r0, [r2, 0x18]\n\ - lsls r0, 28\n\ - lsrs r0, 28\n\ - cmp r0, 0x3\n\ - bne _080B3636\n\ - adds r1, r3, r7\n\ - movs r0, 0x2\n\ - strh r0, [r1]\n\ -_080B3636:\n\ - ldrb r0, [r2, 0x18]\n\ - lsls r0, 28\n\ - lsrs r0, 28\n\ - cmp r0, 0x4\n\ - bne _080B3646\n\ - adds r1, r3, r7\n\ - movs r0, 0x3\n\ - strh r0, [r1]\n\ -_080B3646:\n\ - mov r0, r8\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ -_080B3650:\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, 0x6\n\ - bls _080B35B6\n\ - mov r2, r10\n\ - lsls r0, r2, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x4\n\ - bls _080B35B0\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B3674: .4byte gUnknown_020386A4\n\ -_080B3678: .4byte gUnknown_020386AA\n\ -_080B367C: .4byte 0x0000fffd\n\ -_080B3680: .4byte 0x0000fffe\n\ -_080B3684: .4byte gUnknown_020386A8\n\ -_080B3688: .4byte gMapObjects\n\ - .syntax divided"); + s16 facingX; + s16 facingY; + u8 playerHeight; + u8 y; + u8 x; + u8 r8 = 0; + + GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); + playerHeight = PlayerGetZCoord(); + for (y = 0; y < 16; y++) + gUnknown_020386A4[y][0] = 16; + for (y = 0; y < 5; y++) + { + for (x = 0; x < 7; x++) + { + u8 mapObjId = GetFieldObjectIdByXYZ(facingX - 3 + x, facingY - 2 + y, playerHeight); + + if (mapObjId != 16) + { + gUnknown_020386A4[r8][0] = mapObjId; + gUnknown_020386A4[r8][1] = x; + gUnknown_020386A4[r8][2] = y; + if (gMapObjects[mapObjId].mapobj_unk_18 == 1) + gUnknown_020386A4[r8][3] = 0; + if (gMapObjects[mapObjId].mapobj_unk_18 == 2) + gUnknown_020386A4[r8][3] = 1; + if (gMapObjects[mapObjId].mapobj_unk_18 == 3) + gUnknown_020386A4[r8][3] = 2; + if (gMapObjects[mapObjId].mapobj_unk_18 == 4) + gUnknown_020386A4[r8][3] = 3; + r8++; + } + } + } } -/* -struct UnkStruct_20386A4 -{ - s16 mapObjId; - u16 unk2; - u16 unk4; - u8 unk6[2]; -}; -*/ - -//extern s16 gUnknown_020386A4[][]; -//extern struct UnkStruct_20386A4 gUnknown_020386A4[]; -// all 3 of these are incredibly hard, please help -/*void sub_80B368C(void) +void sub_80B368C(void) { - // r0 = spriteId - // r1 = gUnknown_020386A4 + 6 - // r2 = gSprites[spriteId] - // r3 = gUnknown_020386A4[i].unk4 + 32 - // r4 = i * 8 - // r5 = 0 (i) - // r6 = gUnknown_020386A4 - // r7 = gMapObjects - // r8 = gUnknown_020386A4 + 6 - // r9 = - // r10 = - // r11 = - // r12 = - - u8 i = 0; - u8 *unkArray = (u8 *)&gUnknown_020386A4[6]; - - for(; i < 16; i++) // max objects? - { - s16 mapObjId = unkStruct[i].mapObjId; - if(mapObjId != 16) - { - u8 spriteId = AddPseudoFieldObject( - gMapObjects[mapObjId].graphicsId, - SpriteCallbackDummy, - unkStruct[i].unk2 * 16 + 8, - unkStruct[i].unk4 + 12, - 2); - StartSpriteAnim(&gSprites[spriteId], unkArray[i]); - } - } -}*/ + u8 i; + + for(i = 0; i < 16; i++) // max objects? + { + if(gUnknown_020386A4[i][0] == 16) + continue; + + StartSpriteAnim(&gSprites[AddPseudoFieldObject( + gMapObjects[gUnknown_020386A4[i][0]].graphicsId, + SpriteCallbackDummy, + (u16)gUnknown_020386A4[i][1] * 16 + 8, + (u16)gUnknown_020386A4[i][2] * 16 + 32, + 2)], + gUnknown_020386A4[i][3]); + } +} -- cgit v1.2.3 From 05c2f2e4fc7ad2fc98315e53a0b1adb7d4d4c0d1 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Tue, 22 Aug 2017 02:33:18 -0400 Subject: decompile up to sub_80B37F8 --- src/shop.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 93 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 06ec45292..aca48cc2e 100644 --- a/src/shop.c +++ b/src/shop.c @@ -19,13 +19,17 @@ #include "field_map_obj.h" #include "field_player_avatar.h" #include "fieldmap.h" +#include "item.h" + +extern void sub_80B39D0(int, int, int); +extern void sub_80B3A70(void); struct UnknownShopStruct { /* 0x0 */ void (* callback) (void); /* 0x4 */ u16 *itemList; /* 0x8 */ u8 itemCount; - /* 0x9 */ u8 unk9; + /* 0x9 */ u8 cursor; /* 0xA */ u8 unkA; /* 0xB */ u8 unkB; /* 0xC */ bool8 unkC; @@ -35,10 +39,26 @@ struct UnknownShopStruct extern struct UnknownShopStruct gUnknown_03000708; extern struct MenuAction gUnknown_083CC6D0[]; +extern u8 ewram[]; + extern u8 gUnknown_083CC6E8[]; extern u8 gUnknown_083CC6EB[]; extern u8 gBuyMenuFrame_Gfx[]; +#define ewram18000 ((u16 *)(ewram + 0x18000)) +#define ewram18300 ((u16 *)(ewram + 0x18300)) + +// shop view window NPC info enum +enum +{ + MAP_OBJ_ID, + X_COORD, + Y_COORD, + ANIM_NUM +}; + +extern s16 gUnknown_020386A4[][4]; // game freak barely uses 2d arrays wtf? + extern u16 gBuyMenuFrame_Tilemap[]; extern u16 gMenuMoneyPal[16]; extern u16 gUnknown_083CC710[2]; @@ -47,7 +67,7 @@ u8 CreateShopMenu(bool8 var) { ScriptContext2_Enable(); gUnknown_03000708.unkC = var; - gUnknown_03000708.unk9 = 0; + gUnknown_03000708.cursor = 0; if(var == FALSE) { @@ -89,35 +109,35 @@ void sub_80B2E38(u8 var) { const u8 local = var; - if(gMain.newAndRepeatedKeys & 0x40) + if(gMain.newAndRepeatedKeys & DPAD_UP) { - if(gUnknown_03000708.unk9) + if(gUnknown_03000708.cursor) // can move cursor up? { PlaySE(0x5); - gUnknown_03000708.unk9 = MoveMenuCursor(-1); + gUnknown_03000708.cursor = MoveMenuCursor(-1); } } - else if(gMain.newAndRepeatedKeys & 0x80) + else if(gMain.newAndRepeatedKeys & DPAD_DOWN) { - if(gUnknown_03000708.unk9 != gUnknown_03000708.unkA) + if(gUnknown_03000708.cursor != gUnknown_03000708.unkA) // can move cursor down? { PlaySE(0x5); - gUnknown_03000708.unk9 = MoveMenuCursor(1); + gUnknown_03000708.cursor = MoveMenuCursor(1); } } - else if (gMain.newKeys & 1) + else if (gMain.newKeys & A_BUTTON) { PlaySE(0x5); if(!gUnknown_03000708.unkC) { - gUnknown_083CC6D0[gUnknown_083CC6E8[gUnknown_03000708.unk9]].func(local); + gUnknown_083CC6D0[gUnknown_083CC6E8[gUnknown_03000708.cursor]].func(local); } else { - gUnknown_083CC6D0[gUnknown_083CC6EB[gUnknown_03000708.unk9]].func(local); + gUnknown_083CC6D0[gUnknown_083CC6EB[gUnknown_03000708.cursor]].func(local); } } - else if(gMain.newKeys & 2) + else if(gMain.newKeys & B_BUTTON) { PlaySE(0x5); HandleShopMenuQuit(local); @@ -256,7 +276,7 @@ void BuyMenuDrawGraphics(void) SetUpWindowConfig(&gWindowConfig_81E6DFC); InitMenuWindow(&gWindowConfig_81E6DFC); BuyMenuDrawMapGraphics(); - gUnknown_03000708.unk9 = zero; + gUnknown_03000708.cursor = zero; gUnknown_03000708.unkB = zero2; MenuZeroFillWindowRect(0, 0, 0x20, 0x20); sub_80B7C14(gSaveBlock1.money, 0, 0); @@ -401,8 +421,6 @@ void BuyMenuDrawMapGraphics(void) sub_80B3420(); } -extern s16 gUnknown_020386A4[][4]; - void sub_80B356C(void) { s16 facingX; @@ -415,7 +433,7 @@ void sub_80B356C(void) GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); playerHeight = PlayerGetZCoord(); for (y = 0; y < 16; y++) - gUnknown_020386A4[y][0] = 16; + gUnknown_020386A4[y][MAP_OBJ_ID] = 16; for (y = 0; y < 5; y++) { for (x = 0; x < 7; x++) @@ -424,17 +442,17 @@ void sub_80B356C(void) if (mapObjId != 16) { - gUnknown_020386A4[r8][0] = mapObjId; - gUnknown_020386A4[r8][1] = x; - gUnknown_020386A4[r8][2] = y; + gUnknown_020386A4[r8][MAP_OBJ_ID] = mapObjId; + gUnknown_020386A4[r8][X_COORD] = x; + gUnknown_020386A4[r8][Y_COORD] = y; if (gMapObjects[mapObjId].mapobj_unk_18 == 1) - gUnknown_020386A4[r8][3] = 0; + gUnknown_020386A4[r8][ANIM_NUM] = 0; if (gMapObjects[mapObjId].mapobj_unk_18 == 2) - gUnknown_020386A4[r8][3] = 1; + gUnknown_020386A4[r8][ANIM_NUM] = 1; if (gMapObjects[mapObjId].mapobj_unk_18 == 3) - gUnknown_020386A4[r8][3] = 2; + gUnknown_020386A4[r8][ANIM_NUM] = 2; if (gMapObjects[mapObjId].mapobj_unk_18 == 4) - gUnknown_020386A4[r8][3] = 3; + gUnknown_020386A4[r8][ANIM_NUM] = 3; r8++; } } @@ -447,15 +465,62 @@ void sub_80B368C(void) for(i = 0; i < 16; i++) // max objects? { - if(gUnknown_020386A4[i][0] == 16) + if(gUnknown_020386A4[i][MAP_OBJ_ID] == 16) continue; StartSpriteAnim(&gSprites[AddPseudoFieldObject( - gMapObjects[gUnknown_020386A4[i][0]].graphicsId, + gMapObjects[gUnknown_020386A4[i][MAP_OBJ_ID]].graphicsId, SpriteCallbackDummy, - (u16)gUnknown_020386A4[i][1] * 16 + 8, - (u16)gUnknown_020386A4[i][2] * 16 + 32, + (u16)gUnknown_020386A4[i][X_COORD] * 16 + 8, + (u16)gUnknown_020386A4[i][Y_COORD] * 16 + 32, 2)], - gUnknown_020386A4[i][3]); + gUnknown_020386A4[i][ANIM_NUM]); + } +} + +void sub_80B3720(void) +{ + s16 i; + + for (i = 0; i < 0x400; i++) + { + if (ewram18000[i] != 0) + gBGTilemapBuffers[1][i] = ewram18000[i] + 0xC3E0; } } + +void sub_80B3764(int var1, int var2) +{ + sub_80B3720(); + sub_80B39D0(var1, var2, 0); + InitMenu(0, 0xE, 0x2, 0x8, gUnknown_03000708.cursor, 0xF); +} + +void sub_80B379C(void) +{ + u16 i, j; + + for(i = 0; i < 8; i++) + for(j = 0; j < 14; j++) + gBGTilemapBuffers[1][32 * (i + 12) + j] = ewram18300[32 * i + j] + 0xC3E0; +} + +void sub_80B37EC(void) +{ + sub_80B3A70(); +} + +void sub_80B37F8(u8 taskId) +{ + u16 itemListIndex = gUnknown_03000708.unkB + gUnknown_03000708.cursor; + u16 itemId = *(gUnknown_03000708.itemList + itemListIndex); + u32 price = (ItemId_GetPrice(itemId) >> GetPriceReduction(1)); + + sub_80B7A94(gTasks[taskId].data[1] * price, 6, 6, 11); + gStringVar1[0] = EXT_CTRL_CODE_BEGIN; + gStringVar1[1] = 0x14; + gStringVar1[2] = 0x6; + ConvertIntToDecimalStringN(&gStringVar1[3], gTasks[taskId].data[1], 1, 2); + MenuPrint(gOtherText_xString1, 1, 11); + sub_80A3FA0(gBGTilemapBuffers[1], 1, 11, 12, 2, 0xC3E1); +} -- cgit v1.2.3 From f325f2d9ca2c40ed5a728fa4bea585e3bd71ca81 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Thu, 24 Aug 2017 02:13:07 -0400 Subject: decompile up to sub_80B3A70 --- src/money.c | 2 +- src/shop.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 140 insertions(+), 41 deletions(-) (limited to 'src') diff --git a/src/money.c b/src/money.c index 5d9d0b689..67b7eb03f 100644 --- a/src/money.c +++ b/src/money.c @@ -148,7 +148,7 @@ void sub_80B7AEC(u32 arg0, u8 left, u8 top) } __attribute__((naked)) -void sub_80B7B34(void) +void sub_80B7B34(u8 var1, u8 var2, int var3) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ diff --git a/src/shop.c b/src/shop.c index aca48cc2e..91d84363e 100644 --- a/src/shop.c +++ b/src/shop.c @@ -20,23 +20,27 @@ #include "field_player_avatar.h" #include "fieldmap.h" #include "item.h" +#include "decoration.h" -extern void sub_80B39D0(int, int, int); -extern void sub_80B3A70(void); +enum +{ + MART_TYPE_0, // normal mart + MART_TYPE_1, + MART_TYPE_2, +}; -struct UnknownShopStruct +struct MartInfo { /* 0x0 */ void (* callback) (void); /* 0x4 */ u16 *itemList; /* 0x8 */ u8 itemCount; /* 0x9 */ u8 cursor; - /* 0xA */ u8 unkA; - /* 0xB */ u8 unkB; - /* 0xC */ bool8 unkC; - // unknown size + /* 0xA */ u8 numChoices; + /* 0xB */ u8 choicesAbove; + /* 0xC */ u8 martType; }; -extern struct UnknownShopStruct gUnknown_03000708; +extern struct MartInfo gMartInfo; extern struct MenuAction gUnknown_083CC6D0[]; extern u8 ewram[]; @@ -63,44 +67,47 @@ extern u16 gBuyMenuFrame_Tilemap[]; extern u16 gMenuMoneyPal[16]; extern u16 gUnknown_083CC710[2]; -u8 CreateShopMenu(bool8 var) +void sub_80B39D0(int var1, int var2, bool32 hasControlCode); +void sub_80B3A70(void); + +u8 CreateShopMenu(u8 martType) { ScriptContext2_Enable(); - gUnknown_03000708.unkC = var; - gUnknown_03000708.cursor = 0; + gMartInfo.martType = martType; + gMartInfo.cursor = 0; - if(var == FALSE) + if(martType == MART_TYPE_0) { - gUnknown_03000708.unkA = 2; + gMartInfo.numChoices = 2; MenuDrawTextWindow(0, 0, 10, 7); PrintMenuItemsReordered(1, 1, 3, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6E8); } else { - gUnknown_03000708.unkA = 1; + gMartInfo.numChoices = 1; MenuDrawTextWindow(0, 0, 10, 5); PrintMenuItemsReordered(1, 1, 2, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6EB); } - InitMenu(0, 1, 1, gUnknown_03000708.unkA + 1, 0, 9); + InitMenu(0, 1, 1, gMartInfo.numChoices + 1, 0, 9); // add 1 for cancel return CreateTask(sub_80B2E38, 8); } void SetShopMenuCallback(void *callbackPtr) { - gUnknown_03000708.callback = callbackPtr; + gMartInfo.callback = callbackPtr; } void SetShopItemsForSale(u16 *items) { u16 i = 0; - gUnknown_03000708.itemList = items; - gUnknown_03000708.itemCount = 0; + gMartInfo.itemList = items; + gMartInfo.itemCount = 0; - while (gUnknown_03000708.itemList[i]) + while (gMartInfo.itemList[i]) { - gUnknown_03000708.itemCount++; + gMartInfo.itemCount++; i++; } } @@ -111,30 +118,30 @@ void sub_80B2E38(u8 var) if(gMain.newAndRepeatedKeys & DPAD_UP) { - if(gUnknown_03000708.cursor) // can move cursor up? + if(gMartInfo.cursor) // can move cursor up? { PlaySE(0x5); - gUnknown_03000708.cursor = MoveMenuCursor(-1); + gMartInfo.cursor = MoveMenuCursor(-1); } } else if(gMain.newAndRepeatedKeys & DPAD_DOWN) { - if(gUnknown_03000708.cursor != gUnknown_03000708.unkA) // can move cursor down? + if(gMartInfo.cursor != gMartInfo.numChoices) // can move cursor down? { PlaySE(0x5); - gUnknown_03000708.cursor = MoveMenuCursor(1); + gMartInfo.cursor = MoveMenuCursor(1); } } else if (gMain.newKeys & A_BUTTON) { PlaySE(0x5); - if(!gUnknown_03000708.unkC) + if(gMartInfo.martType == MART_TYPE_0) { - gUnknown_083CC6D0[gUnknown_083CC6E8[gUnknown_03000708.cursor]].func(local); + gUnknown_083CC6D0[gUnknown_083CC6E8[gMartInfo.cursor]].func(local); } else { - gUnknown_083CC6D0[gUnknown_083CC6EB[gUnknown_03000708.cursor]].func(local); + gUnknown_083CC6D0[gUnknown_083CC6EB[gMartInfo.cursor]].func(local); } } else if(gMain.newKeys & B_BUTTON) @@ -164,12 +171,12 @@ void HandleShopMenuQuit(u8 taskId) { HandleDestroyMenuCursors(); MenuZeroFillWindowRect(0, 0, 11, 8); - sub_80BE3BC(); // in tv.s? + sub_80BE3BC(); ScriptContext2_Disable(); DestroyTask(taskId); - if(gUnknown_03000708.callback) - gUnknown_03000708.callback(); // run the callback if it exists. + if(gMartInfo.callback) + gMartInfo.callback(); // run the callback if it exists. } void sub_80B2FA0(u8 taskId) @@ -183,7 +190,7 @@ void sub_80B2FA0(u8 taskId) void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) { - CreateShopMenu(gUnknown_03000708.unkC); + CreateShopMenu(gMartInfo.martType); DestroyTask(taskId); } @@ -191,7 +198,7 @@ void Task_ExitSellMenu(u8 taskId) { if(sub_807D770() == 1) { - if(gUnknown_03000708.unkC == 2) + if(gMartInfo.martType == MART_TYPE_2) DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0); else DisplayItemMessageOnField(taskId, gOtherText_AnythingElse, ReturnToShopMenuAfterExitingSellMenu, 0); @@ -276,8 +283,8 @@ void BuyMenuDrawGraphics(void) SetUpWindowConfig(&gWindowConfig_81E6DFC); InitMenuWindow(&gWindowConfig_81E6DFC); BuyMenuDrawMapGraphics(); - gUnknown_03000708.cursor = zero; - gUnknown_03000708.unkB = zero2; + gMartInfo.cursor = zero; + gMartInfo.choicesAbove = zero2; MenuZeroFillWindowRect(0, 0, 0x20, 0x20); sub_80B7C14(gSaveBlock1.money, 0, 0); sub_80B3764(0, 7); @@ -306,7 +313,7 @@ void sub_80B3270(void) { sub_80F944C(); - if(gUnknown_03000708.itemCount > 7) + if(gMartInfo.itemCount > 7) { CreateVerticalScrollIndicators(0, 172, 12); CreateVerticalScrollIndicators(1, 172, 148); @@ -316,12 +323,12 @@ void sub_80B3270(void) void sub_80B32A4(void) { - if(gUnknown_03000708.unkB == 0) + if(gMartInfo.choicesAbove == 0) sub_80F979C(0, 1); else sub_80F979C(0, 0); - if(gUnknown_03000708.unkB + 7 >= gUnknown_03000708.itemCount) + if(gMartInfo.choicesAbove + 7 >= gMartInfo.itemCount) sub_80F979C(1, 1); else sub_80F979C(1, 0); @@ -493,7 +500,7 @@ void sub_80B3764(int var1, int var2) { sub_80B3720(); sub_80B39D0(var1, var2, 0); - InitMenu(0, 0xE, 0x2, 0x8, gUnknown_03000708.cursor, 0xF); + InitMenu(0, 0xE, 0x2, 0x8, gMartInfo.cursor, 0xF); } void sub_80B379C(void) @@ -512,8 +519,8 @@ void sub_80B37EC(void) void sub_80B37F8(u8 taskId) { - u16 itemListIndex = gUnknown_03000708.unkB + gUnknown_03000708.cursor; - u16 itemId = *(gUnknown_03000708.itemList + itemListIndex); + u16 itemListIndex = gMartInfo.choicesAbove + gMartInfo.cursor; + u16 itemId = *(gMartInfo.itemList + itemListIndex); u32 price = (ItemId_GetPrice(itemId) >> GetPriceReduction(1)); sub_80B7A94(gTasks[taskId].data[1] * price, 6, 6, 11); @@ -524,3 +531,95 @@ void sub_80B37F8(u8 taskId) MenuPrint(gOtherText_xString1, 1, 11); sub_80A3FA0(gBGTilemapBuffers[1], 1, 11, 12, 2, 0xC3E1); } + +void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode) +{ + u8 *stringPtr = gStringVar1; + + if(hasControlCode != FALSE) + { + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x1; + stringPtr[2] = 0x2; + stringPtr += 3; + } + + CopyItemName(itemId, stringPtr); + + sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); + stringPtr = gStringVar1; + + if(hasControlCode != FALSE) + stringPtr = &gStringVar1[3]; + + sub_80B79F8(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4); + MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1); +} + +void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode) +{ + u8 *stringPtr = gStringVar1; + + if(hasControlCode != FALSE) + { + stringPtr[0] = EXT_CTRL_CODE_BEGIN; + stringPtr[1] = 0x1; + stringPtr[2] = 0x2; + stringPtr += 3; + } + + StringCopy(stringPtr, gDecorations[itemId].name); + sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); + stringPtr = gStringVar1; + + if(hasControlCode != FALSE) + stringPtr = &gStringVar1[3]; + + if(gDecorations[itemId].price == 10000) + { + sub_80B7B34(0x19, var2, hasControlCode); // huh??? + } + else + { + sub_80B79F8(stringPtr, gDecorations[itemId].price, 0x4); + MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1); + } +} + +void sub_80B39D0(int var1, int var2, bool32 hasControlCode) +{ + u8 i; + + for(i = var1; i <= var2 && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++) + { + if(gMartInfo.martType == MART_TYPE_0) + sub_80B389C(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); + else + sub_80B3930(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); + } + + if(i != 8 && gMartInfo.choicesAbove + i == gMartInfo.itemCount) + { + MenuFillWindowRectWithBlankTile(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3); + MenuPrint(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2); + } +} + +void sub_80B3A70(void) +{ + if(gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) + { + if(gMartInfo.martType == MART_TYPE_0) + { + sub_8072AB0(ItemId_GetDescription(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]), + 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); + } + else + sub_8072AB0(gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].description, // doesn't consider choicesAbove? + 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); // huh?? + } + else + { + sub_8072AB0(gOtherText_QuitShopping, 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); + } +} -- cgit v1.2.3 From a8432ea708c0e2cf5443ba4286ddece562999ebb Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Thu, 24 Aug 2017 02:25:21 -0400 Subject: whatever cam --- src/shop.c | 62 +++++++++++++++++++++++++++++++------------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 91d84363e..17cebfee6 100644 --- a/src/shop.c +++ b/src/shop.c @@ -76,7 +76,7 @@ u8 CreateShopMenu(u8 martType) gMartInfo.martType = martType; gMartInfo.cursor = 0; - if(martType == MART_TYPE_0) + if (martType == MART_TYPE_0) { gMartInfo.numChoices = 2; MenuDrawTextWindow(0, 0, 10, 7); @@ -116,17 +116,17 @@ void sub_80B2E38(u8 var) { const u8 local = var; - if(gMain.newAndRepeatedKeys & DPAD_UP) + if (gMain.newAndRepeatedKeys & DPAD_UP) { - if(gMartInfo.cursor) // can move cursor up? + if (gMartInfo.cursor) // can move cursor up? { PlaySE(0x5); gMartInfo.cursor = MoveMenuCursor(-1); } } - else if(gMain.newAndRepeatedKeys & DPAD_DOWN) + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { - if(gMartInfo.cursor != gMartInfo.numChoices) // can move cursor down? + if (gMartInfo.cursor != gMartInfo.numChoices) // can move cursor down? { PlaySE(0x5); gMartInfo.cursor = MoveMenuCursor(1); @@ -135,7 +135,7 @@ void sub_80B2E38(u8 var) else if (gMain.newKeys & A_BUTTON) { PlaySE(0x5); - if(gMartInfo.martType == MART_TYPE_0) + if (gMartInfo.martType == MART_TYPE_0) { gUnknown_083CC6D0[gUnknown_083CC6E8[gMartInfo.cursor]].func(local); } @@ -144,7 +144,7 @@ void sub_80B2E38(u8 var) gUnknown_083CC6D0[gUnknown_083CC6EB[gMartInfo.cursor]].func(local); } } - else if(gMain.newKeys & B_BUTTON) + else if (gMain.newKeys & B_BUTTON) { PlaySE(0x5); HandleShopMenuQuit(local); @@ -175,13 +175,13 @@ void HandleShopMenuQuit(u8 taskId) ScriptContext2_Disable(); DestroyTask(taskId); - if(gMartInfo.callback) + if (gMartInfo.callback) gMartInfo.callback(); // run the callback if it exists. } void sub_80B2FA0(u8 taskId) { - if(!gPaletteFade.active) + if (!gPaletteFade.active) { SetMainCallback2((void *)((u16)gTasks[taskId].data[8] << 16 | (u16)gTasks[taskId].data[9])); DestroyTask(taskId); @@ -196,9 +196,9 @@ void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) void Task_ExitSellMenu(u8 taskId) { - if(sub_807D770() == 1) + if (sub_807D770() == 1) { - if(gMartInfo.martType == MART_TYPE_2) + if (gMartInfo.martType == MART_TYPE_2) DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0); else DisplayItemMessageOnField(taskId, gOtherText_AnythingElse, ReturnToShopMenuAfterExitingSellMenu, 0); @@ -313,7 +313,7 @@ void sub_80B3270(void) { sub_80F944C(); - if(gMartInfo.itemCount > 7) + if (gMartInfo.itemCount > 7) { CreateVerticalScrollIndicators(0, 172, 12); CreateVerticalScrollIndicators(1, 172, 148); @@ -323,12 +323,12 @@ void sub_80B3270(void) void sub_80B32A4(void) { - if(gMartInfo.choicesAbove == 0) + if (gMartInfo.choicesAbove == 0) sub_80F979C(0, 1); else sub_80F979C(0, 0); - if(gMartInfo.choicesAbove + 7 >= gMartInfo.itemCount) + if (gMartInfo.choicesAbove + 7 >= gMartInfo.itemCount) sub_80F979C(1, 1); else sub_80F979C(1, 0); @@ -354,7 +354,7 @@ void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) s16 offset1 = var1 * 2; s16 offset2 = (var2 * 0x40) + 0x40; - switch(tempVar4) + switch (tempVar4) { case 0: // _080B335C BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3); @@ -470,9 +470,9 @@ void sub_80B368C(void) { u8 i; - for(i = 0; i < 16; i++) // max objects? + for (i = 0; i < 16; i++) // max objects? { - if(gUnknown_020386A4[i][MAP_OBJ_ID] == 16) + if (gUnknown_020386A4[i][MAP_OBJ_ID] == 16) continue; StartSpriteAnim(&gSprites[AddPseudoFieldObject( @@ -507,8 +507,8 @@ void sub_80B379C(void) { u16 i, j; - for(i = 0; i < 8; i++) - for(j = 0; j < 14; j++) + for (i = 0; i < 8; i++) + for (j = 0; j < 14; j++) gBGTilemapBuffers[1][32 * (i + 12) + j] = ewram18300[32 * i + j] + 0xC3E0; } @@ -536,7 +536,7 @@ void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode) { u8 *stringPtr = gStringVar1; - if(hasControlCode != FALSE) + if (hasControlCode != FALSE) { stringPtr[0] = EXT_CTRL_CODE_BEGIN; stringPtr[1] = 0x1; @@ -549,7 +549,7 @@ void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode) sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); stringPtr = gStringVar1; - if(hasControlCode != FALSE) + if (hasControlCode != FALSE) stringPtr = &gStringVar1[3]; sub_80B79F8(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4); @@ -560,7 +560,7 @@ void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode) { u8 *stringPtr = gStringVar1; - if(hasControlCode != FALSE) + if (hasControlCode != FALSE) { stringPtr[0] = EXT_CTRL_CODE_BEGIN; stringPtr[1] = 0x1; @@ -572,10 +572,10 @@ void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode) sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1); stringPtr = gStringVar1; - if(hasControlCode != FALSE) + if (hasControlCode != FALSE) stringPtr = &gStringVar1[3]; - if(gDecorations[itemId].price == 10000) + if (gDecorations[itemId].price == 10000) { sub_80B7B34(0x19, var2, hasControlCode); // huh??? } @@ -590,15 +590,15 @@ void sub_80B39D0(int var1, int var2, bool32 hasControlCode) { u8 i; - for(i = var1; i <= var2 && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++) + for (i = var1; i <= var2 && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++) { - if(gMartInfo.martType == MART_TYPE_0) + if (gMartInfo.martType == MART_TYPE_0) sub_80B389C(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); else sub_80B3930(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); } - if(i != 8 && gMartInfo.choicesAbove + i == gMartInfo.itemCount) + if (i != 8 && gMartInfo.choicesAbove + i == gMartInfo.itemCount) { MenuFillWindowRectWithBlankTile(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3); MenuPrint(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2); @@ -607,16 +607,16 @@ void sub_80B39D0(int var1, int var2, bool32 hasControlCode) void sub_80B3A70(void) { - if(gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) + if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) { - if(gMartInfo.martType == MART_TYPE_0) + if (gMartInfo.martType == MART_TYPE_0) { sub_8072AB0(ItemId_GetDescription(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]), 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); } else - sub_8072AB0(gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].description, // doesn't consider choicesAbove? - 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); // huh?? + sub_8072AB0(gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].description, + 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); // huh?? if mart type isnt 0, why assume it? } else { -- cgit v1.2.3 From e427c657f2f44f06a0dd085a79d2e91c4045f0f0 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Thu, 24 Aug 2017 17:30:42 -0400 Subject: decompile up to sub_80B3BF4 --- src/shop.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 17cebfee6..6150d1b78 100644 --- a/src/shop.c +++ b/src/shop.c @@ -21,6 +21,13 @@ #include "fieldmap.h" #include "item.h" #include "decoration.h" +#include "items.h" +#include "songs.h" +#include "rom4.h" +#include "decoration_inventory.h" + +extern void sub_80B4378(u8); +extern void sub_80B4470(u8); enum { @@ -43,6 +50,8 @@ struct MartInfo extern struct MartInfo gMartInfo; extern struct MenuAction gUnknown_083CC6D0[]; +extern u32 gMartTotalCost; // the total cost of a purchase before checking out. + extern u8 ewram[]; extern u8 gUnknown_083CC6E8[]; @@ -623,3 +632,71 @@ void sub_80B3A70(void) sub_8072AB0(gOtherText_QuitShopping, 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); } } + +void sub_80B3AEC(u8 taskId) +{ + if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); // huh??? + PlaySE(SE_SELECT); + + if(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].data[1] >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) + DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, sub_80B4378, 0xC3E1); + else + sub_80B4378(taskId); + } +} + +void sub_80B3B80(u8 taskId) +{ + IncrementGameStat(0x26); + sub_80B79E0(&gSaveBlock1.money, gMartTotalCost); + PlaySE(0x5F); + sub_80B7BEC(gSaveBlock1.money, 0, 0); + gTasks[taskId].func = sub_80B3AEC; +} + +void sub_80B3BD0(u8 taskId) +{ + sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); // same thing as above? + sub_80B4378(taskId); +} + +void sub_80B3BF4(u8 taskId) +{ + MenuZeroFillWindowRect(0x7, 0x8, 0xD, 0xD); + sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0); + sub_80B379C(); + sub_80B3420(); + + if(IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) + { + if(gMartInfo.martType == MART_TYPE_0) + { + if(AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].data[1])) + { + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, sub_80B3B80, 0xC3E1); + sub_80B4470(taskId); + } + else + DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, sub_80B3BD0, 0xC3E1); + } + else // a normal mart is only type 0, so types 1 and 2 are decoration marts. + { + if(IsThereStorageSpaceForDecoration(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor])) + { + if(gMartInfo.martType == MART_TYPE_1) + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, sub_80B3B80, 0xC3E1); + else + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, sub_80B3B80, 0xC3E1); + } + else + { + StringExpandPlaceholders(gStringVar4, gOtherText_SpaceForIsFull); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3BD0, 0xC3E1); + } + } + } + else + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); +} -- cgit v1.2.3 From 28836dd9b7f1f38ba1d065e2c336d32628fb7cca Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Fri, 25 Aug 2017 00:14:33 -0400 Subject: decompile up to sub_80B3EFC --- src/shop.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 6150d1b78..0ce14c004 100644 --- a/src/shop.c +++ b/src/shop.c @@ -28,6 +28,7 @@ extern void sub_80B4378(u8); extern void sub_80B4470(u8); +extern bool8 sub_80A52C4(u8, u8); enum { @@ -45,10 +46,12 @@ struct MartInfo /* 0xA */ u8 numChoices; /* 0xB */ u8 choicesAbove; /* 0xC */ u8 martType; + /* 0xD */ u8 unkD; }; extern struct MartInfo gMartInfo; extern struct MenuAction gUnknown_083CC6D0[]; +extern struct YesNoFuncTable gUnknown_083CC708[]; extern u32 gMartTotalCost; // the total cost of a purchase before checking out. @@ -700,3 +703,60 @@ void sub_80B3BF4(u8 taskId) else DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); } + +void sub_80B3D38(u8 taskId) +{ + DisplayYesNoMenu(7, 8, 1); + sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0xC3E1); + DoYesNoFuncWithChoice(taskId, gUnknown_083CC708); +} + +void sub_80B3D7C(u8 taskId) +{ + sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); + MenuZeroFillWindowRect(0x7, 0x8, 0xD, 0xD); + sub_80A3FA0(gBGTilemapBuffers[1], 0x8, 0x9, 0x4, 0x4, 0); + sub_80B4378(taskId); +} + +void sub_80B3DC8(u8 taskId) +{ + if(sub_80A52C4(taskId, gMartInfo.unkD) == TRUE) + sub_80B37F8(taskId); + + if(gMain.newKeys & A_BUTTON) + { + gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].data[1]; // set total cost of your purchase. + MenuZeroFillWindowRect(0, 0xA, 0xD, 0xD); + sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); + sub_80B379C(); + sub_80B3420(); + CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, gTasks[taskId].data[1], 0, 0x2); + ConvertIntToDecimalStringN(gStringVar3, gMartTotalCost, 0, 0x8); + StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3D38, 0xC3E1); + } + else if(gMain.newKeys & B_BUTTON) + { + sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); + sub_80B4378(taskId); + } +} + +void sub_80B3EFC(u8 taskId) +{ + u16 var; + + gTasks[taskId].data[1] = 1; + MenuDrawTextWindow(0, 0xA, 0xD, 0xD); + sub_80B37F8(taskId); + + var = gSaveBlock1.money / (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); + if(var > 99) + gMartInfo.unkD = 99; + else + gMartInfo.unkD = var; + + gTasks[taskId].func = sub_80B3DC8; +} -- cgit v1.2.3 From 7a26678cc022f466cbee26ae8a9e7011f01b7fb3 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Fri, 25 Aug 2017 15:10:50 -0400 Subject: decompile up to sub_80B40E8 --- src/shop.c | 300 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 299 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 0ce14c004..110b5cdea 100644 --- a/src/shop.c +++ b/src/shop.c @@ -27,6 +27,7 @@ #include "decoration_inventory.h" extern void sub_80B4378(u8); +extern void sub_80B43F0(u8); extern void sub_80B4470(u8); extern bool8 sub_80A52C4(u8, u8); @@ -42,7 +43,7 @@ struct MartInfo /* 0x0 */ void (* callback) (void); /* 0x4 */ u16 *itemList; /* 0x8 */ u8 itemCount; - /* 0x9 */ u8 cursor; + /* 0x9 */ u8 cursor; // this shows the on-screen true index of the cursor and not the current item selected. /* 0xA */ u8 numChoices; /* 0xB */ u8 choicesAbove; /* 0xC */ u8 martType; @@ -760,3 +761,300 @@ void sub_80B3EFC(u8 taskId) gTasks[taskId].func = sub_80B3DC8; } + +// the next two functions are strange gMenuWindow functions that manually acccess gMenuWindow.tilemap and do weird pointer arithmetic. i'd rather not deal with these right now. +__attribute__((naked)) +void sub_80B3F88(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + ldr r0, _080B4020 @ =gMenuWindow\n\ + mov r8, r0\n\ + ldr r1, [r0, 0x28]\n\ + ldr r3, _080B4024 @ =0x000003de\n\ + adds r1, r3\n\ + adds r2, r1, 0\n\ + adds r2, 0x80\n\ + ldr r7, [r0, 0x24]\n\ + mov r10, r7\n\ + ldr r0, _080B4028 @ =0x000003ff\n\ + mov r9, r0\n\ + movs r6, 0xD\n\ +_080B3FAC:\n\ + adds r3, r2, 0\n\ + subs r3, 0x40\n\ + str r3, [sp]\n\ + movs r7, 0x40\n\ + negs r7, r7\n\ + adds r7, r1\n\ + mov r12, r7\n\ + adds r3, r2, 0\n\ + adds r4, r1, 0\n\ + movs r5, 0xE\n\ +_080B3FC0:\n\ + ldrh r2, [r4]\n\ + mov r1, r9\n\ + ands r1, r2\n\ + mov r7, r8\n\ + ldrh r0, [r7, 0x1A]\n\ + adds r0, 0x1\n\ + cmp r1, r0\n\ + ble _080B3FD4\n\ + adds r0, r2, 0\n\ + adds r0, 0x3C\n\ +_080B3FD4:\n\ + strh r0, [r3]\n\ + adds r3, 0x2\n\ + adds r4, 0x2\n\ + subs r5, 0x1\n\ + cmp r5, 0\n\ + bge _080B3FC0\n\ + ldr r2, [sp]\n\ + mov r1, r12\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080B3FAC\n\ + ldr r1, _080B402C @ =0x00003a20\n\ + add r1, r10\n\ + movs r0, 0xF0\n\ + lsls r0, 3\n\ + adds r2, r1, r0\n\ + ldr r3, _080B4030 @ =0x040000d4\n\ + ldr r5, _080B4034 @ =0x800000f0\n\ + ldr r4, _080B4038 @ =0xfffffc40\n\ + movs r6, 0xD\n\ +_080B3FFC:\n\ + str r1, [r3]\n\ + str r2, [r3, 0x4]\n\ + str r5, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ + adds r2, r4\n\ + adds r1, r4\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080B3FFC\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B4020: .4byte gMenuWindow\n\ +_080B4024: .4byte 0x000003de\n\ +_080B4028: .4byte 0x000003ff\n\ +_080B402C: .4byte 0x00003a20\n\ +_080B4030: .4byte 0x040000d4\n\ +_080B4034: .4byte 0x800000f0\n\ +_080B4038: .4byte 0xfffffc40\n\ + .syntax divided"); +} + +__attribute__((naked)) +void sub_80B403C(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + ldr r0, _080B40D8 @ =gMenuWindow\n\ + mov r8, r0\n\ + ldr r2, [r0, 0x28]\n\ + adds r1, r2, 0\n\ + adds r1, 0x9E\n\ + adds r2, r1, 0\n\ + adds r1, 0x80\n\ + ldr r3, [r0, 0x24]\n\ + mov r10, r3\n\ + ldr r7, _080B40DC @ =0x000003ff\n\ + mov r9, r7\n\ + movs r6, 0xD\n\ +_080B4060:\n\ + adds r0, r2, 0\n\ + adds r0, 0x40\n\ + str r0, [sp]\n\ + movs r3, 0x40\n\ + adds r3, r1\n\ + mov r12, r3\n\ + adds r3, r2, 0\n\ + adds r4, r1, 0\n\ + movs r5, 0xE\n\ +_080B4072:\n\ + ldrh r2, [r4]\n\ + mov r1, r9\n\ + ands r1, r2\n\ + mov r7, r8\n\ + ldrh r0, [r7, 0x1A]\n\ + adds r0, 0x1\n\ + cmp r1, r0\n\ + ble _080B4086\n\ + adds r0, r2, 0\n\ + subs r0, 0x3C\n\ +_080B4086:\n\ + strh r0, [r3]\n\ + adds r3, 0x2\n\ + adds r4, 0x2\n\ + subs r5, 0x1\n\ + cmp r5, 0\n\ + bge _080B4072\n\ + ldr r2, [sp]\n\ + mov r1, r12\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080B4060\n\ + movs r1, 0x96\n\ + lsls r1, 4\n\ + add r1, r10\n\ + adds r2, r1, 0\n\ + movs r0, 0xF0\n\ + lsls r0, 3\n\ + adds r1, r0\n\ + ldr r3, _080B40E0 @ =0x040000d4\n\ + ldr r5, _080B40E4 @ =0x800000f0\n\ + movs r4, 0xF0\n\ + lsls r4, 2\n\ + movs r6, 0xD\n\ +_080B40B4:\n\ + str r1, [r3]\n\ + str r2, [r3, 0x4]\n\ + str r5, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ + adds r2, r4\n\ + adds r1, r4\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _080B40B4\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B40D8: .4byte gMenuWindow\n\ +_080B40DC: .4byte 0x000003ff\n\ +_080B40E0: .4byte 0x040000d4\n\ +_080B40E4: .4byte 0x800000f0\n\ + .syntax divided"); +} + +void sub_80B40E8(u8 taskId) // Mart_DoCursorAction +{ + if(!gPaletteFade.active) + { + if((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) // only up can be pressed + { + if(gMartInfo.cursor == 0) + { + if(gMartInfo.choicesAbove == 0) // if there are no choices above, dont bother + return; + + PlaySE(SE_SELECT); + gMartInfo.choicesAbove--; // since cursor is at the top and there are choices above the top, scroll the menu up by updating choicesAbove. + sub_80B3F88(); + sub_80B39D0(0, 0, 0); + sub_80B3A70(); + sub_80B32A4(); + } + else // if the cursor is not 0, choicesAbove cannot be updated yet since the cursor is at the top of the menu, so update cursor. + { + PlaySE(SE_SELECT); + gMartInfo.cursor = MoveMenuCursor(-1); // move cursor up + sub_80B3A70(); + } + } + else if((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) // only down can be pressed + { + if(gMartInfo.cursor == 7) // are you at the bottom of the menu? + { + if(gMartInfo.choicesAbove + gMartInfo.cursor == gMartInfo.itemCount) // are you at cancel? + return; + + PlaySE(SE_SELECT); + gMartInfo.choicesAbove++; + sub_80B403C(); + sub_80B39D0(7, 7, 0); + sub_80B3A70(); + sub_80B32A4(); + } + else if(gMartInfo.cursor != gMartInfo.itemCount) + { + PlaySE(SE_SELECT); + gMartInfo.cursor = MoveMenuCursor(1); + sub_80B3A70(); + } + } + else if(gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + + if(gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) // did you not hit CANCEL? + { + PauseVerticalScrollIndicator(0); + PauseVerticalScrollIndicator(1); + sub_80F979C(1, 1); + sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 1); + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0xC, 0xD, 0x13); + + if(gMartInfo.martType == MART_TYPE_0) + { + gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); // set 1x price + if(!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) + { + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge + } + else // _080B42BA + { + CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_HowManyYouWant); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3EFC, 0xC3E1); + } + } + else // _080B428C + { + gMartTotalCost = gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].price; + + if(!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) + { + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge + } + else + { + StringCopy(gStringVar1, gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].name); + ConvertIntToDecimalStringN(gStringVar2, gMartTotalCost, 0, 0x8); + + if(gMartInfo.martType == MART_TYPE_1) + { + StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe2); + } + else + { + StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe3); + } + DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3D38, 0xC3E1); + } + } + } + else + sub_80B43F0(taskId); + } + else if(gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu + { + PlaySE(SE_SELECT); + sub_80B43F0(taskId); + } + } +} -- cgit v1.2.3 From 1ab4ed75e7daae4b17cfca2970e935f653236014 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Fri, 25 Aug 2017 19:09:46 -0400 Subject: decompile up to nonmatching sub_80B4470 --- src/shop.c | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 171 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 110b5cdea..b053e3f2e 100644 --- a/src/shop.c +++ b/src/shop.c @@ -26,9 +26,6 @@ #include "rom4.h" #include "decoration_inventory.h" -extern void sub_80B4378(u8); -extern void sub_80B43F0(u8); -extern void sub_80B4470(u8); extern bool8 sub_80A52C4(u8, u8); enum @@ -53,6 +50,7 @@ struct MartInfo extern struct MartInfo gMartInfo; extern struct MenuAction gUnknown_083CC6D0[]; extern struct YesNoFuncTable gUnknown_083CC708[]; +extern struct ItemSlot gUnknown_02038724[3]; extern u32 gMartTotalCost; // the total cost of a purchase before checking out. @@ -74,6 +72,8 @@ enum ANIM_NUM }; +extern u8 gUnknown_02038730; + extern s16 gUnknown_020386A4[][4]; // game freak barely uses 2d arrays wtf? extern u16 gBuyMenuFrame_Tilemap[]; @@ -82,6 +82,10 @@ extern u16 gUnknown_083CC710[2]; void sub_80B39D0(int var1, int var2, bool32 hasControlCode); void sub_80B3A70(void); +void sub_80B4378(u8); +void sub_80B43F0(u8); +void Task_ExitBuyMenu(u8); +void sub_80B4470(u8); u8 CreateShopMenu(u8 martType) { @@ -1058,3 +1062,167 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction } } } + +void sub_80B4378(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0xE, 0x1D, 0x13); + MenuZeroFillWindowRect(0, 0xA, 0xD, 0xD); + sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); + sub_80B3420(); + sub_80B3764(6, 7); + sub_80B37EC(); + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + sub_80B32A4(); + gTasks[taskId].func = sub_80B40E8; +} + +void sub_80B43F0(u8 taskId) +{ + gFieldCallback = sub_80B3050; + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_ExitBuyMenu; +} + +void Task_ExitBuyMenu(u8 taskId) +{ + if(!gPaletteFade.active) + { + RemoveMoneyLabelObject(0, 0); + BuyMenuFreeMemory(); + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + } +} + +// in the for loop, the loop prologue is not correct and loads choicesabove + cursor immediately instead of setting up the gUnknown_02038724 struct. +#ifdef NONMATCHING +void sub_80B4470(u8 taskId) +{ + u16 i; + + for(i = 0; i < 3; i++) + { + if(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] != gUnknown_02038724[i].itemId || gUnknown_02038724[i].quantity == 0) + continue; + + if(gTasks[taskId].data[1] + gUnknown_02038724[i].quantity > 255) + gUnknown_02038724[i].quantity = 255; + else + gUnknown_02038724[i].quantity += gTasks[taskId].data[1]; + return; + } + + if(gUnknown_02038730 < 3) + { + gUnknown_02038724[gUnknown_02038730].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]; + gUnknown_02038724[gUnknown_02038730].quantity = gTasks[taskId].data[1]; + gUnknown_02038730++; + } +} +#else +__attribute__((naked)) +void sub_80B4470(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + movs r2, 0\n\ + ldr r0, _080B44C8 @ =gUnknown_02038724\n\ + mov r12, r0\n\ + ldr r6, _080B44CC @ =gMartInfo\n\ + mov r8, r12\n\ + adds r4, r6, 0\n\ + ldr r1, _080B44D0 @ =gTasks\n\ + mov r9, r1\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r7, r0, 3\n\ +_080B4492:\n\ + lsls r0, r2, 2\n\ + mov r1, r8\n\ + adds r3, r0, r1\n\ + ldrb r0, [r4, 0xB]\n\ + ldrb r1, [r4, 0x9]\n\ + adds r0, r1\n\ + ldr r1, [r4, 0x4]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + ldrh r1, [r3]\n\ + ldrh r0, [r0]\n\ + cmp r1, r0\n\ + bne _080B44DC\n\ + ldrh r0, [r3, 0x2]\n\ + cmp r0, 0\n\ + beq _080B44DC\n\ + adds r2, r0, 0\n\ + mov r4, r9\n\ + adds r1, r7, r4\n\ + movs r4, 0xA\n\ + ldrsh r0, [r1, r4]\n\ + adds r0, r2, r0\n\ + cmp r0, 0xFF\n\ + ble _080B44D4\n\ + movs r0, 0xFF\n\ + strh r0, [r3, 0x2]\n\ + b _080B451E\n\ + .align 2, 0\n\ +_080B44C8: .4byte gUnknown_02038724\n\ +_080B44CC: .4byte gMartInfo\n\ +_080B44D0: .4byte gTasks\n\ +_080B44D4:\n\ + ldrh r0, [r1, 0xA]\n\ + adds r0, r2, r0\n\ + strh r0, [r3, 0x2]\n\ + b _080B451E\n\ +_080B44DC:\n\ + adds r0, r2, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + cmp r2, 0x2\n\ + bls _080B4492\n\ + ldr r3, _080B452C @ =gUnknown_02038730\n\ + ldrb r0, [r3]\n\ + cmp r0, 0x2\n\ + bhi _080B451E\n\ + adds r2, r0, 0\n\ + lsls r2, 2\n\ + add r2, r12\n\ + ldrb r0, [r6, 0xB]\n\ + ldrb r1, [r6, 0x9]\n\ + adds r0, r1\n\ + ldr r1, [r6, 0x4]\n\ + lsls r0, 1\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + strh r0, [r2]\n\ + ldrb r1, [r3]\n\ + lsls r1, 2\n\ + add r1, r12\n\ + ldr r2, _080B4530 @ =gTasks\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + ldrh r0, [r0, 0xA]\n\ + strh r0, [r1, 0x2]\n\ + ldrb r0, [r3]\n\ + adds r0, 0x1\n\ + strb r0, [r3]\n\ +_080B451E:\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B452C: .4byte gUnknown_02038730\n\ +_080B4530: .4byte gTasks\n\ + .syntax divided"); +} +#endif -- cgit v1.2.3 From efd3e208f10ed2db25871bab49b9462ab7efb903 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Fri, 25 Aug 2017 20:30:35 -0400 Subject: finish decompiling shop.c except for a few indented functions --- src/shop.c | 295 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index b053e3f2e..737d0e2bd 100644 --- a/src/shop.c +++ b/src/shop.c @@ -25,6 +25,7 @@ #include "songs.h" #include "rom4.h" #include "decoration_inventory.h" +#include "field_camera.h" extern bool8 sub_80A52C4(u8, u8); @@ -73,6 +74,7 @@ enum }; extern u8 gUnknown_02038730; +extern u8 gUnknown_02038731; extern s16 gUnknown_020386A4[][4]; // game freak barely uses 2d arrays wtf? @@ -1226,3 +1228,296 @@ _080B4530: .4byte gTasks\n\ .syntax divided"); } #endif + +void ClearItemPurchases(void) +{ + gUnknown_02038730 = 0; + ClearItemSlots(gUnknown_02038724, 3); +} + +void CreatePokemartMenu(u16 *itemList) +{ + CreateShopMenu(MART_TYPE_0); + SetShopItemsForSale(itemList); + ClearItemPurchases(); + SetShopMenuCallback(EnableBothScriptContexts); +} + +void CreateDecorationShop1Menu(u16 *itemList) +{ + CreateShopMenu(MART_TYPE_1); + SetShopItemsForSale(itemList); + SetShopMenuCallback(EnableBothScriptContexts); +} + +void CreateDecorationShop2Menu(u16 *itemList) +{ + CreateShopMenu(MART_TYPE_2); + SetShopItemsForSale(itemList); + SetShopMenuCallback(EnableBothScriptContexts); +} + +// no. +__attribute__((naked)) +void sub_80B45B4(u8 taskId, u16 *list, int var3) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x10\n\ + mov r9, r1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + mov r10, r2\n\ + ldr r2, _080B4648 @ =gTasks\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 3\n\ + adds r1, r2\n\ + ldrh r0, [r1, 0x10]\n\ + subs r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + ldrh r0, [r1, 0x12]\n\ + subs r0, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldrh r4, [r1, 0xA]\n\ + movs r2, 0xC\n\ + ldrsh r0, [r1, r2]\n\ + cmp r0, 0\n\ + bne _080B4678\n\ + movs r2, 0\n\ + lsls r5, 16\n\ + str r5, [sp, 0xC]\n\ + lsls r0, r3, 16\n\ + lsls r1, r4, 16\n\ + asrs r0, 16\n\ + str r0, [sp]\n\ + asrs r1, 16\n\ + str r1, [sp, 0x4]\n\ + lsls r0, r1, 1\n\ + mov r1, r9\n\ + adds r7, r0, r1\n\ +_080B4608:\n\ + movs r4, 0\n\ + lsls r2, 16\n\ + mov r8, r2\n\ + asrs r0, r2, 16\n\ + ldr r2, [sp]\n\ + adds r6, r2, r0\n\ +_080B4614:\n\ + ldr r0, [sp, 0xC]\n\ + asrs r1, r0, 16\n\ + lsls r4, 16\n\ + asrs r0, r4, 16\n\ + adds r5, r1, r0\n\ + adds r0, r5, 0\n\ + adds r1, r6, 0\n\ + bl MapGridGetMetatileIdAt\n\ + movs r2, 0\n\ + ldrsh r1, [r7, r2]\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + cmp r1, r0\n\ + bne _080B465C\n\ + ldr r0, [sp, 0x4]\n\ + cmp r0, 0x2\n\ + beq _080B464C\n\ + ldrh r0, [r7, 0x2]\n\ + mov r2, r10\n\ + orrs r2, r0\n\ + adds r0, r5, 0\n\ + adds r1, r6, 0\n\ + bl MapGridSetMetatileIdAt\n\ + b _080B465C\n\ + .align 2, 0\n\ +_080B4648: .4byte gTasks\n\ +_080B464C:\n\ + mov r1, r9\n\ + ldrh r0, [r1]\n\ + mov r2, r10\n\ + orrs r2, r0\n\ + adds r0, r5, 0\n\ + adds r1, r6, 0\n\ + bl MapGridSetMetatileIdAt\n\ +_080B465C:\n\ + movs r2, 0x80\n\ + lsls r2, 9\n\ + adds r0, r4, r2\n\ + lsrs r4, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x2\n\ + ble _080B4614\n\ + adds r0, r2, 0\n\ + add r0, r8\n\ + lsrs r2, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x2\n\ + ble _080B4608\n\ + b _080B4700\n\ +_080B4678:\n\ + movs r2, 0\n\ + lsls r5, 16\n\ + str r5, [sp, 0xC]\n\ + lsls r0, r3, 16\n\ + lsls r1, r4, 16\n\ + asrs r0, 16\n\ + str r0, [sp, 0x8]\n\ + asrs r7, r1, 16\n\ +_080B4688:\n\ + movs r4, 0\n\ + lsls r2, 16\n\ + mov r8, r2\n\ + asrs r0, r2, 16\n\ + ldr r1, [sp, 0x8]\n\ + adds r6, r1, r0\n\ +_080B4694:\n\ + ldr r2, [sp, 0xC]\n\ + asrs r1, r2, 16\n\ + lsls r4, 16\n\ + asrs r0, r4, 16\n\ + adds r5, r1, r0\n\ + adds r0, r5, 0\n\ + adds r1, r6, 0\n\ + bl MapGridGetMetatileIdAt\n\ + movs r1, 0x2\n\ + subs r1, r7\n\ + lsls r1, 1\n\ + add r1, r9\n\ + movs r2, 0\n\ + ldrsh r1, [r1, r2]\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + cmp r1, r0\n\ + bne _080B46E6\n\ + cmp r7, 0x2\n\ + beq _080B46D6\n\ + movs r0, 0x1\n\ + subs r0, r7\n\ + lsls r0, 1\n\ + add r0, r9\n\ + ldrh r0, [r0]\n\ + mov r2, r10\n\ + orrs r2, r0\n\ + adds r0, r5, 0\n\ + adds r1, r6, 0\n\ + bl MapGridSetMetatileIdAt\n\ + b _080B46E6\n\ +_080B46D6:\n\ + mov r1, r9\n\ + ldrh r0, [r1, 0x4]\n\ + mov r2, r10\n\ + orrs r2, r0\n\ + adds r0, r5, 0\n\ + adds r1, r6, 0\n\ + bl MapGridSetMetatileIdAt\n\ +_080B46E6:\n\ + movs r2, 0x80\n\ + lsls r2, 9\n\ + adds r0, r4, r2\n\ + lsrs r4, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x2\n\ + ble _080B4694\n\ + adds r0, r2, 0\n\ + add r0, r8\n\ + lsrs r2, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x2\n\ + ble _080B4688\n\ +_080B4700:\n\ + add sp, 0x10\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided"); +} + +extern u16 gUnknown_083CC714[]; +extern u16 gUnknown_083CC71A[]; +extern u16 gUnknown_083CC720[]; +extern u16 gUnknown_083CC726[]; +extern u16 gUnknown_083CC72C[]; +extern u16 gUnknown_083CC732[]; +extern u16 gUnknown_083CC738[]; + +void sub_80B4710(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + data[3] = 1; + + switch(data[0]) + { + case 0: + sub_80B45B4(taskId, gUnknown_083CC714, 0); + break; + case 1: + sub_80B45B4(taskId, gUnknown_083CC71A, 0); + break; + case 2: + sub_80B45B4(taskId, gUnknown_083CC720, 0xC00); + break; + case 3: + sub_80B45B4(taskId, gUnknown_083CC726, 0); + break; + case 4: + sub_80B45B4(taskId, gUnknown_083CC72C, 0xC00); + break; + case 5: + sub_80B45B4(taskId, gUnknown_083CC732, 0); + break; + case 6: + sub_80B45B4(taskId, gUnknown_083CC738, 0); + break; + } + + data[0] = (data[0] + 1) & 7; + if(!data[0]) + { + DrawWholeMapView(); + data[1] = (data[1] + 1) % 3; + data[3] = 0; + } +} + +u8 sub_80B47D8(u16 var) +{ + u8 taskId = CreateTask(sub_80B4710, 0); + s16 *data = gTasks[taskId].data; + + PlayerGetDestCoords(&data[4], &data[5]); + data[0] = 0; + data[1] = 0; + data[2] = var; + sub_80B4710(taskId); + return taskId; +} + +void sub_80B4824(u8 var) +{ + gUnknown_02038731 = sub_80B47D8(var); +} + +void sub_80B483C(void) +{ + DestroyTask(gUnknown_02038731); +} + +bool8 sub_80B4850(void) +{ + if(gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2) + return FALSE; + else + return TRUE; +} -- cgit v1.2.3 From e9037c7861b70d39686608b3eace9e9443c18c44 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Fri, 25 Aug 2017 23:38:46 -0400 Subject: move data to C --- src/shop.c | 85 ++++++++++++++++++++++++++++---------------------------------- 1 file changed, 38 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 737d0e2bd..ca7609e72 100644 --- a/src/shop.c +++ b/src/shop.c @@ -27,52 +27,20 @@ #include "decoration_inventory.h" #include "field_camera.h" -extern bool8 sub_80A52C4(u8, u8); - -enum -{ - MART_TYPE_0, // normal mart - MART_TYPE_1, - MART_TYPE_2, -}; +#define ewram18000 ((u16 *)(ewram + 0x18000)) +#define ewram18300 ((u16 *)(ewram + 0x18300)) -struct MartInfo -{ - /* 0x0 */ void (* callback) (void); - /* 0x4 */ u16 *itemList; - /* 0x8 */ u8 itemCount; - /* 0x9 */ u8 cursor; // this shows the on-screen true index of the cursor and not the current item selected. - /* 0xA */ u8 numChoices; - /* 0xB */ u8 choicesAbove; - /* 0xC */ u8 martType; - /* 0xD */ u8 unkD; -}; +extern bool8 sub_80A52C4(u8, u8); extern struct MartInfo gMartInfo; -extern struct MenuAction gUnknown_083CC6D0[]; -extern struct YesNoFuncTable gUnknown_083CC708[]; extern struct ItemSlot gUnknown_02038724[3]; extern u32 gMartTotalCost; // the total cost of a purchase before checking out. extern u8 ewram[]; -extern u8 gUnknown_083CC6E8[]; -extern u8 gUnknown_083CC6EB[]; extern u8 gBuyMenuFrame_Gfx[]; -#define ewram18000 ((u16 *)(ewram + 0x18000)) -#define ewram18300 ((u16 *)(ewram + 0x18300)) - -// shop view window NPC info enum -enum -{ - MAP_OBJ_ID, - X_COORD, - Y_COORD, - ANIM_NUM -}; - extern u8 gUnknown_02038730; extern u8 gUnknown_02038731; @@ -80,7 +48,6 @@ extern s16 gUnknown_020386A4[][4]; // game freak barely uses 2d arrays wtf? extern u16 gBuyMenuFrame_Tilemap[]; extern u16 gMenuMoneyPal[16]; -extern u16 gUnknown_083CC710[2]; void sub_80B39D0(int var1, int var2, bool32 hasControlCode); void sub_80B3A70(void); @@ -88,6 +55,38 @@ void sub_80B4378(u8); void sub_80B43F0(u8); void Task_ExitBuyMenu(u8); void sub_80B4470(u8); +void sub_80B2EFC(u8 taskId); +void sub_80B2F30(u8 taskId); +void HandleShopMenuQuit(u8 taskId); +void sub_80B3BF4(u8 taskId); +void sub_80B3D7C(u8 taskId); + +static const struct MenuAction2 gUnknown_083CC6D0[] = +{ + { MartText_Buy, sub_80B2EFC }, + { MartText_Sell, sub_80B2F30 }, + { MartText_Quit2, HandleShopMenuQuit }, +}; + +static const u8 gUnknown_083CC6E8[] = {0, 1, 2}; // BUY SELL EXIT +static const u8 gUnknown_083CC6EB[] = {0, 2}; // BUY EXIT + +static const u16 gUnusedMartArray[] = {0x2, 0x3, 0x4, 0xD, 0x121, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x0, 0x0}; + +static const struct YesNoFuncTable gUnknown_083CC708[] = +{ + sub_80B3BF4, + sub_80B3D7C +}; + +static const u16 gUnknown_083CC710[] = {0x41EE, 0x7FFF}; +static const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280}; +static const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281}; +static const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288}; +static const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289}; +static const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4}; +static const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5}; +static const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC}; u8 CreateShopMenu(u8 martType) { @@ -99,13 +98,13 @@ u8 CreateShopMenu(u8 martType) { gMartInfo.numChoices = 2; MenuDrawTextWindow(0, 0, 10, 7); - PrintMenuItemsReordered(1, 1, 3, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6E8); + PrintMenuItemsReordered(1, 1, 3, (struct MenuAction *)gUnknown_083CC6D0, (u8 *)gUnknown_083CC6E8); } else { gMartInfo.numChoices = 1; MenuDrawTextWindow(0, 0, 10, 5); - PrintMenuItemsReordered(1, 1, 2, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6EB); + PrintMenuItemsReordered(1, 1, 2, (struct MenuAction *)gUnknown_083CC6D0, (u8 *)gUnknown_083CC6EB); } InitMenu(0, 1, 1, gMartInfo.numChoices + 1, 0, 9); // add 1 for cancel @@ -1259,7 +1258,7 @@ void CreateDecorationShop2Menu(u16 *itemList) // no. __attribute__((naked)) -void sub_80B45B4(u8 taskId, u16 *list, int var3) +void sub_80B45B4(u8 taskId, const u16 *list, int var3) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -1443,14 +1442,6 @@ _080B4700:\n\ .syntax divided"); } -extern u16 gUnknown_083CC714[]; -extern u16 gUnknown_083CC71A[]; -extern u16 gUnknown_083CC720[]; -extern u16 gUnknown_083CC726[]; -extern u16 gUnknown_083CC72C[]; -extern u16 gUnknown_083CC732[]; -extern u16 gUnknown_083CC738[]; - void sub_80B4710(u8 taskId) { s16 *data = gTasks[taskId].data; -- cgit v1.2.3 From 5c7f78d8bc897f5bf4d9d18352bc81626ee09437 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 26 Aug 2017 00:03:29 -0400 Subject: iwram and ewram data --- src/shop.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index ca7609e72..060e84693 100644 --- a/src/shop.c +++ b/src/shop.c @@ -32,20 +32,8 @@ extern bool8 sub_80A52C4(u8, u8); -extern struct MartInfo gMartInfo; -extern struct ItemSlot gUnknown_02038724[3]; - -extern u32 gMartTotalCost; // the total cost of a purchase before checking out. - extern u8 ewram[]; - extern u8 gBuyMenuFrame_Gfx[]; - -extern u8 gUnknown_02038730; -extern u8 gUnknown_02038731; - -extern s16 gUnknown_020386A4[][4]; // game freak barely uses 2d arrays wtf? - extern u16 gBuyMenuFrame_Tilemap[]; extern u16 gMenuMoneyPal[16]; @@ -61,6 +49,17 @@ void HandleShopMenuQuit(u8 taskId); void sub_80B3BF4(u8 taskId); void sub_80B3D7C(u8 taskId); +// iwram +static struct MartInfo gMartInfo; + +// ewram +EWRAM_DATA u32 gMartTotalCost = 0; +EWRAM_DATA s16 gUnknown_020386A4[16][4] = {0}; // game freak barely uses 2d arrays wtf? +EWRAM_DATA struct ItemSlot gUnknown_02038724[3] = {0}; // tv.c uses this, so it cant be static +EWRAM_DATA u8 gUnknown_02038730 = 0; +EWRAM_DATA u8 gUnknown_02038731 = 0; + +// rodata static const struct MenuAction2 gUnknown_083CC6D0[] = { { MartText_Buy, sub_80B2EFC }, -- cgit v1.2.3 From 027dc5448e9a5cc90ca6fa4e37d9b73ec342cfe5 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 26 Aug 2017 00:25:28 -0400 Subject: formatting --- src/shop.c | 68 +++++++++++++++++++++++++++++++------------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 060e84693..e523f927c 100644 --- a/src/shop.c +++ b/src/shop.c @@ -643,12 +643,12 @@ void sub_80B3A70(void) void sub_80B3AEC(u8 taskId) { - if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) { sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); // huh??? PlaySE(SE_SELECT); - if(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].data[1] >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) + if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].data[1] >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, sub_80B4378, 0xC3E1); else sub_80B4378(taskId); @@ -677,11 +677,11 @@ void sub_80B3BF4(u8 taskId) sub_80B379C(); sub_80B3420(); - if(IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) + if (IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) { - if(gMartInfo.martType == MART_TYPE_0) + if (gMartInfo.martType == MART_TYPE_0) { - if(AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].data[1])) + if (AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].data[1])) { DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, sub_80B3B80, 0xC3E1); sub_80B4470(taskId); @@ -691,9 +691,9 @@ void sub_80B3BF4(u8 taskId) } else // a normal mart is only type 0, so types 1 and 2 are decoration marts. { - if(IsThereStorageSpaceForDecoration(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor])) + if (IsThereStorageSpaceForDecoration(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor])) { - if(gMartInfo.martType == MART_TYPE_1) + if (gMartInfo.martType == MART_TYPE_1) DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, sub_80B3B80, 0xC3E1); else DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, sub_80B3B80, 0xC3E1); @@ -726,10 +726,10 @@ void sub_80B3D7C(u8 taskId) void sub_80B3DC8(u8 taskId) { - if(sub_80A52C4(taskId, gMartInfo.unkD) == TRUE) + if (sub_80A52C4(taskId, gMartInfo.unkD) == TRUE) sub_80B37F8(taskId); - if(gMain.newKeys & A_BUTTON) + if (gMain.newKeys & A_BUTTON) { gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].data[1]; // set total cost of your purchase. MenuZeroFillWindowRect(0, 0xA, 0xD, 0xD); @@ -742,7 +742,7 @@ void sub_80B3DC8(u8 taskId) StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe); DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3D38, 0xC3E1); } - else if(gMain.newKeys & B_BUTTON) + else if (gMain.newKeys & B_BUTTON) { sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); sub_80B4378(taskId); @@ -758,7 +758,7 @@ void sub_80B3EFC(u8 taskId) sub_80B37F8(taskId); var = gSaveBlock1.money / (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); - if(var > 99) + if (var > 99) gMartInfo.unkD = 99; else gMartInfo.unkD = var; @@ -956,13 +956,13 @@ _080B40E4: .4byte 0x800000f0\n\ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction { - if(!gPaletteFade.active) + if (!gPaletteFade.active) { - if((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) // only up can be pressed + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) // only up can be pressed { - if(gMartInfo.cursor == 0) + if (gMartInfo.cursor == 0) { - if(gMartInfo.choicesAbove == 0) // if there are no choices above, dont bother + if (gMartInfo.choicesAbove == 0) // if there are no choices above, dont bother return; PlaySE(SE_SELECT); @@ -979,11 +979,11 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction sub_80B3A70(); } } - else if((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) // only down can be pressed + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) // only down can be pressed { - if(gMartInfo.cursor == 7) // are you at the bottom of the menu? + if (gMartInfo.cursor == 7) // are you at the bottom of the menu? { - if(gMartInfo.choicesAbove + gMartInfo.cursor == gMartInfo.itemCount) // are you at cancel? + if (gMartInfo.choicesAbove + gMartInfo.cursor == gMartInfo.itemCount) // are you at cancel? return; PlaySE(SE_SELECT); @@ -993,18 +993,18 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction sub_80B3A70(); sub_80B32A4(); } - else if(gMartInfo.cursor != gMartInfo.itemCount) + else if (gMartInfo.cursor != gMartInfo.itemCount) { PlaySE(SE_SELECT); gMartInfo.cursor = MoveMenuCursor(1); sub_80B3A70(); } } - else if(gMain.newKeys & A_BUTTON) + else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - if(gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) // did you not hit CANCEL? + if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) // did you not hit CANCEL? { PauseVerticalScrollIndicator(0); PauseVerticalScrollIndicator(1); @@ -1013,10 +1013,10 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction HandleDestroyMenuCursors(); MenuZeroFillWindowRect(0, 0xC, 0xD, 0x13); - if(gMartInfo.martType == MART_TYPE_0) + if (gMartInfo.martType == MART_TYPE_0) { gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); // set 1x price - if(!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) + if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) { DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge } @@ -1031,7 +1031,7 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction { gMartTotalCost = gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].price; - if(!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) + if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) { DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge } @@ -1040,7 +1040,7 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction StringCopy(gStringVar1, gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].name); ConvertIntToDecimalStringN(gStringVar2, gMartTotalCost, 0, 0x8); - if(gMartInfo.martType == MART_TYPE_1) + if (gMartInfo.martType == MART_TYPE_1) { StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe2); } @@ -1055,7 +1055,7 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction else sub_80B43F0(taskId); } - else if(gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu + else if (gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu { PlaySE(SE_SELECT); sub_80B43F0(taskId); @@ -1086,7 +1086,7 @@ void sub_80B43F0(u8 taskId) void Task_ExitBuyMenu(u8 taskId) { - if(!gPaletteFade.active) + if (!gPaletteFade.active) { RemoveMoneyLabelObject(0, 0); BuyMenuFreeMemory(); @@ -1101,19 +1101,19 @@ void sub_80B4470(u8 taskId) { u16 i; - for(i = 0; i < 3; i++) + for (i = 0; i < 3; i++) { - if(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] != gUnknown_02038724[i].itemId || gUnknown_02038724[i].quantity == 0) + if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] != gUnknown_02038724[i].itemId || gUnknown_02038724[i].quantity == 0) continue; - if(gTasks[taskId].data[1] + gUnknown_02038724[i].quantity > 255) + if (gTasks[taskId].data[1] + gUnknown_02038724[i].quantity > 255) gUnknown_02038724[i].quantity = 255; else gUnknown_02038724[i].quantity += gTasks[taskId].data[1]; return; } - if(gUnknown_02038730 < 3) + if (gUnknown_02038730 < 3) { gUnknown_02038724[gUnknown_02038730].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]; gUnknown_02038724[gUnknown_02038730].quantity = gTasks[taskId].data[1]; @@ -1447,7 +1447,7 @@ void sub_80B4710(u8 taskId) data[3] = 1; - switch(data[0]) + switch (data[0]) { case 0: sub_80B45B4(taskId, gUnknown_083CC714, 0); @@ -1473,7 +1473,7 @@ void sub_80B4710(u8 taskId) } data[0] = (data[0] + 1) & 7; - if(!data[0]) + if (!data[0]) { DrawWholeMapView(); data[1] = (data[1] + 1) % 3; @@ -1506,7 +1506,7 @@ void sub_80B483C(void) bool8 sub_80B4850(void) { - if(gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2) + if (gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2) return FALSE; else return TRUE; -- cgit v1.2.3 From 0c3a2fb275129567b23ef0ed520c04aece90079f Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 26 Aug 2017 14:10:07 -0400 Subject: matching sub_80B4470 and nonmatching sub_80B3F88 and sub_80B403C --- src/shop.c | 446 ++++++++++++++++++++----------------------------------------- 1 file changed, 143 insertions(+), 303 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index e523f927c..30f23e10f 100644 --- a/src/shop.c +++ b/src/shop.c @@ -726,7 +726,7 @@ void sub_80B3D7C(u8 taskId) void sub_80B3DC8(u8 taskId) { - if (sub_80A52C4(taskId, gMartInfo.unkD) == TRUE) + if (sub_80A52C4(taskId, gMartInfo.curItemCount) == TRUE) sub_80B37F8(taskId); if (gMain.newKeys & A_BUTTON) @@ -759,14 +759,55 @@ void sub_80B3EFC(u8 taskId) var = gSaveBlock1.money / (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); if (var > 99) - gMartInfo.unkD = 99; + gMartInfo.curItemCount = 99; else - gMartInfo.unkD = var; + gMartInfo.curItemCount = var; gTasks[taskId].func = sub_80B3DC8; } -// the next two functions are strange gMenuWindow functions that manually acccess gMenuWindow.tilemap and do weird pointer arithmetic. i'd rather not deal with these right now. +#ifdef NONMATCHING +void sub_80B3F88(void) +{ + u16 *r1; + u16 *r2; + register u8 *r10 asm("r10"); + s32 i; + s32 j; + struct Window *r8 = &gMenuWindow; + + r1 = r8->tilemap; + r1 += 0x1EF; + r2 = r1; + r2 += 64; + r10 = r8->tileData; + + for (i = 0; i < 14; i++) + { + for (j = 0; j < 15; j++) + { + if ((r1[j] & 0x3FF) <= r8->tileDataStartOffset + 1) + r2[j] = r8->tileDataStartOffset + 1; + else + r2[j] = r1[j] + 0x3C; + } + + r1 -= 32; + r2 -= 32; + } + + { + u8 *r1 = r10 + 0x3A20; + u8 *r2 = r1 + 0x780; + for (i = 0; i < 14; i++) + { + DmaCopy16(3, r1, r2, 0x1E0); + r2 -= 0x3C0; + r1 -= 0x3C0; + } + } +} +#else __attribute__((naked)) void sub_80B3F88(void) { @@ -860,7 +901,52 @@ _080B4034: .4byte 0x800000f0\n\ _080B4038: .4byte 0xfffffc40\n\ .syntax divided"); } +#endif +#ifdef NONMATCHING +void sub_80B403C(void) +{ + u16 *r1; + u16 *r2; + u8 *r10; + s32 i; + s32 j; + struct Window *r8 = &gMenuWindow; + + r1 = r8->tilemap; + r1 += 0x4F; + r2 = r1; + r2 += 64; + r10 = r8->tileData; + + for (i = 0; i < 14; i++) + { + for (j = 0; j < 15; j++) + { + if ((r1[j] & 0x3FF) <= r8->tileDataStartOffset + 1) + r2[j] = r8->tileDataStartOffset + 1; + else + r2[j] = r1[j] + 0x3C; + } + + r1 += 32; + r2 += 32; + } + + { + register u8 *r1 asm("r1") = r10 + 0x960; + register u8 *r2 asm("r2") = r1; + + r1 += 0x780; + for (i = 0; i < 14; i++) + { + DmaCopy16(3, r1, r2, 0x1E0); + r1 += 0x3C0; + r2 += 0x3C0; + } + } +} +#else __attribute__((naked)) void sub_80B403C(void) { @@ -953,6 +1039,7 @@ _080B40E0: .4byte 0x040000d4\n\ _080B40E4: .4byte 0x800000f0\n\ .syntax divided"); } +#endif void sub_80B40E8(u8 taskId) // Mart_DoCursorAction { @@ -1095,22 +1182,21 @@ void Task_ExitBuyMenu(u8 taskId) } } -// in the for loop, the loop prologue is not correct and loads choicesabove + cursor immediately instead of setting up the gUnknown_02038724 struct. -#ifdef NONMATCHING void sub_80B4470(u8 taskId) { u16 i; for (i = 0; i < 3; i++) { - if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] != gUnknown_02038724[i].itemId || gUnknown_02038724[i].quantity == 0) - continue; - - if (gTasks[taskId].data[1] + gUnknown_02038724[i].quantity > 255) - gUnknown_02038724[i].quantity = 255; - else - gUnknown_02038724[i].quantity += gTasks[taskId].data[1]; - return; + if (gUnknown_02038724[i].itemId == gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] + && gUnknown_02038724[i].quantity != 0) + { + if (gUnknown_02038724[i].quantity + gTasks[taskId].data[1] > 255) + gUnknown_02038724[i].quantity = 255; + else + gUnknown_02038724[i].quantity += gTasks[taskId].data[1]; + return; + } } if (gUnknown_02038730 < 3) @@ -1120,112 +1206,6 @@ void sub_80B4470(u8 taskId) gUnknown_02038730++; } } -#else -__attribute__((naked)) -void sub_80B4470(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - movs r2, 0\n\ - ldr r0, _080B44C8 @ =gUnknown_02038724\n\ - mov r12, r0\n\ - ldr r6, _080B44CC @ =gMartInfo\n\ - mov r8, r12\n\ - adds r4, r6, 0\n\ - ldr r1, _080B44D0 @ =gTasks\n\ - mov r9, r1\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r7, r0, 3\n\ -_080B4492:\n\ - lsls r0, r2, 2\n\ - mov r1, r8\n\ - adds r3, r0, r1\n\ - ldrb r0, [r4, 0xB]\n\ - ldrb r1, [r4, 0x9]\n\ - adds r0, r1\n\ - ldr r1, [r4, 0x4]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r1, [r3]\n\ - ldrh r0, [r0]\n\ - cmp r1, r0\n\ - bne _080B44DC\n\ - ldrh r0, [r3, 0x2]\n\ - cmp r0, 0\n\ - beq _080B44DC\n\ - adds r2, r0, 0\n\ - mov r4, r9\n\ - adds r1, r7, r4\n\ - movs r4, 0xA\n\ - ldrsh r0, [r1, r4]\n\ - adds r0, r2, r0\n\ - cmp r0, 0xFF\n\ - ble _080B44D4\n\ - movs r0, 0xFF\n\ - strh r0, [r3, 0x2]\n\ - b _080B451E\n\ - .align 2, 0\n\ -_080B44C8: .4byte gUnknown_02038724\n\ -_080B44CC: .4byte gMartInfo\n\ -_080B44D0: .4byte gTasks\n\ -_080B44D4:\n\ - ldrh r0, [r1, 0xA]\n\ - adds r0, r2, r0\n\ - strh r0, [r3, 0x2]\n\ - b _080B451E\n\ -_080B44DC:\n\ - adds r0, r2, 0x1\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - cmp r2, 0x2\n\ - bls _080B4492\n\ - ldr r3, _080B452C @ =gUnknown_02038730\n\ - ldrb r0, [r3]\n\ - cmp r0, 0x2\n\ - bhi _080B451E\n\ - adds r2, r0, 0\n\ - lsls r2, 2\n\ - add r2, r12\n\ - ldrb r0, [r6, 0xB]\n\ - ldrb r1, [r6, 0x9]\n\ - adds r0, r1\n\ - ldr r1, [r6, 0x4]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - strh r0, [r2]\n\ - ldrb r1, [r3]\n\ - lsls r1, 2\n\ - add r1, r12\n\ - ldr r2, _080B4530 @ =gTasks\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - ldrh r0, [r0, 0xA]\n\ - strh r0, [r1, 0x2]\n\ - ldrb r0, [r3]\n\ - adds r0, 0x1\n\ - strb r0, [r3]\n\ -_080B451E:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B452C: .4byte gUnknown_02038730\n\ -_080B4530: .4byte gTasks\n\ - .syntax divided"); -} -#endif void ClearItemPurchases(void) { @@ -1255,190 +1235,50 @@ void CreateDecorationShop2Menu(u16 *itemList) SetShopMenuCallback(EnableBothScriptContexts); } -// no. -__attribute__((naked)) -void sub_80B45B4(u8 taskId, const u16 *list, int var3) +void sub_80B45B4(u8 taskId, const s16 *list, u16 c) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x10\n\ - mov r9, r1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - mov r10, r2\n\ - ldr r2, _080B4648 @ =gTasks\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 3\n\ - adds r1, r2\n\ - ldrh r0, [r1, 0x10]\n\ - subs r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - ldrh r0, [r1, 0x12]\n\ - subs r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - ldrh r4, [r1, 0xA]\n\ - movs r2, 0xC\n\ - ldrsh r0, [r1, r2]\n\ - cmp r0, 0\n\ - bne _080B4678\n\ - movs r2, 0\n\ - lsls r5, 16\n\ - str r5, [sp, 0xC]\n\ - lsls r0, r3, 16\n\ - lsls r1, r4, 16\n\ - asrs r0, 16\n\ - str r0, [sp]\n\ - asrs r1, 16\n\ - str r1, [sp, 0x4]\n\ - lsls r0, r1, 1\n\ - mov r1, r9\n\ - adds r7, r0, r1\n\ -_080B4608:\n\ - movs r4, 0\n\ - lsls r2, 16\n\ - mov r8, r2\n\ - asrs r0, r2, 16\n\ - ldr r2, [sp]\n\ - adds r6, r2, r0\n\ -_080B4614:\n\ - ldr r0, [sp, 0xC]\n\ - asrs r1, r0, 16\n\ - lsls r4, 16\n\ - asrs r0, r4, 16\n\ - adds r5, r1, r0\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl MapGridGetMetatileIdAt\n\ - movs r2, 0\n\ - ldrsh r1, [r7, r2]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r1, r0\n\ - bne _080B465C\n\ - ldr r0, [sp, 0x4]\n\ - cmp r0, 0x2\n\ - beq _080B464C\n\ - ldrh r0, [r7, 0x2]\n\ - mov r2, r10\n\ - orrs r2, r0\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl MapGridSetMetatileIdAt\n\ - b _080B465C\n\ - .align 2, 0\n\ -_080B4648: .4byte gTasks\n\ -_080B464C:\n\ - mov r1, r9\n\ - ldrh r0, [r1]\n\ - mov r2, r10\n\ - orrs r2, r0\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl MapGridSetMetatileIdAt\n\ -_080B465C:\n\ - movs r2, 0x80\n\ - lsls r2, 9\n\ - adds r0, r4, r2\n\ - lsrs r4, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x2\n\ - ble _080B4614\n\ - adds r0, r2, 0\n\ - add r0, r8\n\ - lsrs r2, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x2\n\ - ble _080B4608\n\ - b _080B4700\n\ -_080B4678:\n\ - movs r2, 0\n\ - lsls r5, 16\n\ - str r5, [sp, 0xC]\n\ - lsls r0, r3, 16\n\ - lsls r1, r4, 16\n\ - asrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - asrs r7, r1, 16\n\ -_080B4688:\n\ - movs r4, 0\n\ - lsls r2, 16\n\ - mov r8, r2\n\ - asrs r0, r2, 16\n\ - ldr r1, [sp, 0x8]\n\ - adds r6, r1, r0\n\ -_080B4694:\n\ - ldr r2, [sp, 0xC]\n\ - asrs r1, r2, 16\n\ - lsls r4, 16\n\ - asrs r0, r4, 16\n\ - adds r5, r1, r0\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl MapGridGetMetatileIdAt\n\ - movs r1, 0x2\n\ - subs r1, r7\n\ - lsls r1, 1\n\ - add r1, r9\n\ - movs r2, 0\n\ - ldrsh r1, [r1, r2]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r1, r0\n\ - bne _080B46E6\n\ - cmp r7, 0x2\n\ - beq _080B46D6\n\ - movs r0, 0x1\n\ - subs r0, r7\n\ - lsls r0, 1\n\ - add r0, r9\n\ - ldrh r0, [r0]\n\ - mov r2, r10\n\ - orrs r2, r0\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl MapGridSetMetatileIdAt\n\ - b _080B46E6\n\ -_080B46D6:\n\ - mov r1, r9\n\ - ldrh r0, [r1, 0x4]\n\ - mov r2, r10\n\ - orrs r2, r0\n\ - adds r0, r5, 0\n\ - adds r1, r6, 0\n\ - bl MapGridSetMetatileIdAt\n\ -_080B46E6:\n\ - movs r2, 0x80\n\ - lsls r2, 9\n\ - adds r0, r4, r2\n\ - lsrs r4, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x2\n\ - ble _080B4694\n\ - adds r0, r2, 0\n\ - add r0, r8\n\ - lsrs r2, r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x2\n\ - ble _080B4688\n\ -_080B4700:\n\ - add sp, 0x10\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided"); + s16 r5 = gTasks[taskId].data[4] - 1; + s16 r3 = gTasks[taskId].data[5] - 1; + s16 r4 = gTasks[taskId].data[1]; + s16 y; + s16 x; + + if (gTasks[taskId].data[2] == 0) + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]); + } + } + } + } + else + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[2 - r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]); + } + } + } + } } void sub_80B4710(u8 taskId) -- cgit v1.2.3 From 989215ace2d94d9b11462c8db9e4acebc76ca5b1 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 26 Aug 2017 14:20:10 -0400 Subject: get rid of memcpy --- src/shop.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 30f23e10f..8bca7adc9 100644 --- a/src/shop.c +++ b/src/shop.c @@ -78,15 +78,6 @@ static const struct YesNoFuncTable gUnknown_083CC708[] = sub_80B3D7C }; -static const u16 gUnknown_083CC710[] = {0x41EE, 0x7FFF}; -static const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280}; -static const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281}; -static const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288}; -static const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289}; -static const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4}; -static const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5}; -static const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC}; - u8 CreateShopMenu(u8 martType) { ScriptContext2_Enable(); @@ -319,9 +310,8 @@ void BuyMenuDrawGraphics(void) void sub_80B3240(void) { - u16 tempArr[2]; + u16 tempArr[2] = {0x41EE, 0x7FFF}; - memcpy(tempArr, gUnknown_083CC710, sizeof(tempArr)); LoadPalette(&tempArr[1], 0xD1, 2); LoadPalette(&tempArr[0], 0xD8, 2); } @@ -629,15 +619,15 @@ void sub_80B3A70(void) if (gMartInfo.martType == MART_TYPE_0) { sub_8072AB0(ItemId_GetDescription(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]), - 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); + 0x4, 0x68, 0x68, 0x30, 0); } else sub_8072AB0(gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].description, - 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); // huh?? if mart type isnt 0, why assume it? + 0x4, 0x68, 0x68, 0x30, 0); } else { - sub_8072AB0(gOtherText_QuitShopping, 0x4, 0x68, 0x68, 0x30, MART_TYPE_0); + sub_8072AB0(gOtherText_QuitShopping, 0x4, 0x68, 0x68, 0x30, 0); } } @@ -1281,6 +1271,14 @@ void sub_80B45B4(u8 taskId, const s16 *list, u16 c) } } +static const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280}; +static const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281}; +static const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288}; +static const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289}; +static const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4}; +static const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5}; +static const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC}; + void sub_80B4710(u8 taskId) { s16 *data = gTasks[taskId].data; -- cgit v1.2.3 From a2087a9caf534be0889cf54a8202f3a88ccc09ea Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 26 Aug 2017 14:23:43 -0400 Subject: use PlaySE constants --- src/shop.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index 8bca7adc9..fa9d8c30d 100644 --- a/src/shop.c +++ b/src/shop.c @@ -128,7 +128,7 @@ void sub_80B2E38(u8 var) { if (gMartInfo.cursor) // can move cursor up? { - PlaySE(0x5); + PlaySE(SE_SELECT); gMartInfo.cursor = MoveMenuCursor(-1); } } @@ -136,13 +136,13 @@ void sub_80B2E38(u8 var) { if (gMartInfo.cursor != gMartInfo.numChoices) // can move cursor down? { - PlaySE(0x5); + PlaySE(SE_SELECT); gMartInfo.cursor = MoveMenuCursor(1); } } else if (gMain.newKeys & A_BUTTON) { - PlaySE(0x5); + PlaySE(SE_SELECT); if (gMartInfo.martType == MART_TYPE_0) { gUnknown_083CC6D0[gUnknown_083CC6E8[gMartInfo.cursor]].func(local); @@ -154,7 +154,7 @@ void sub_80B2E38(u8 var) } else if (gMain.newKeys & B_BUTTON) { - PlaySE(0x5); + PlaySE(SE_SELECT); HandleShopMenuQuit(local); } } @@ -649,7 +649,7 @@ void sub_80B3B80(u8 taskId) { IncrementGameStat(0x26); sub_80B79E0(&gSaveBlock1.money, gMartTotalCost); - PlaySE(0x5F); + PlaySE(SE_REGI); sub_80B7BEC(gSaveBlock1.money, 0, 0); gTasks[taskId].func = sub_80B3AEC; } -- cgit v1.2.3 From 6f360947a67c4fb8c0b32b07dc74bb28ff0f08a0 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 26 Aug 2017 14:27:10 -0400 Subject: correct itemId access --- src/shop.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/shop.c b/src/shop.c index fa9d8c30d..6a88f1394 100644 --- a/src/shop.c +++ b/src/shop.c @@ -527,7 +527,7 @@ void sub_80B37EC(void) void sub_80B37F8(u8 taskId) { u16 itemListIndex = gMartInfo.choicesAbove + gMartInfo.cursor; - u16 itemId = *(gMartInfo.itemList + itemListIndex); + u16 itemId = gMartInfo.itemList[itemListIndex]; u32 price = (ItemId_GetPrice(itemId) >> GetPriceReduction(1)); sub_80B7A94(gTasks[taskId].data[1] * price, 6, 6, 11); -- cgit v1.2.3