summaryrefslogtreecommitdiff
path: root/src/shop.c
diff options
context:
space:
mode:
authoryenatch <yenatch@gmail.com>2017-03-22 18:34:29 -0400
committeryenatch <yenatch@gmail.com>2017-03-22 18:34:29 -0400
commit7acbfe40778bfbd03b0e2d357efef9ee9b0a34e9 (patch)
tree90c0b95146f3d768b536658eac6a63ff9adcaaec /src/shop.c
parentc0a27d5455014bfe54f7ea73e8a38ce0ed8da6da (diff)
parente3c26e52ae6ab881ade913ca1fad2cd9629bbcb1 (diff)
Merge remote-tracking branch 'origin/master'
Conflicts: Makefile
Diffstat (limited to 'src/shop.c')
-rw-r--r--src/shop.c358
1 files changed, 358 insertions, 0 deletions
diff --git a/src/shop.c b/src/shop.c
new file mode 100644
index 000000000..5148ddcca
--- /dev/null
+++ b/src/shop.c
@@ -0,0 +1,358 @@
+#include "global.h"
+#include "menu.h"
+#include "script.h"
+#include "task.h"
+#include "main.h"
+#include "sound.h"
+#include "weather.h"
+#include "palette.h"
+#include "sprite.h"
+#include "asm.h"
+#include "decompress.h"
+#include "money.h"
+
+struct UnknownShopStruct
+{
+ /* 0x0 */ void (* callback) (void);
+ /* 0x4 */ u16 *itemList;
+ /* 0x8 */ u8 itemCount;
+ /* 0x9 */ u8 unk9;
+ /* 0xA */ u8 unkA;
+ /* 0xB */ u8 unkB;
+ /* 0xC */ bool8 unkC;
+ // unknown size
+};
+
+extern struct UnknownShopStruct gUnknown_03000708;
+extern struct MenuAction gUnknown_083CC6D0[];
+
+extern u8 gUnknown_083CC6E8[];
+extern u8 gUnknown_083CC6EB[];
+extern u8 gOtherText_CanIHelpYou[];
+extern u8 gOtherText_AnythingElse[];
+extern u8 gBuyMenuFrame_Gfx[];
+
+extern u16 gBuyMenuFrame_Tilemap[];
+extern u16 gMenuMoneyPal[16];
+extern u16 gUnknown_083CC710[2];
+
+extern void sub_80A6300(void);
+extern void sub_80BE3BC(void);
+extern void DisplayItemMessageOnField(u8, u8*, TaskFunc, u16);
+extern u8 sub_807D770(void);
+extern void pal_fill_black(void);
+extern void sub_80B3764(int, int);
+extern void sub_80B37EC(void);
+extern void sub_80B40E8(u8);
+extern void BuyMenuDrawMapGraphics(void);
+extern void sub_80F944C(void);
+extern void CreateVerticalScrollIndicators(u32, u32, u32); // unknown args
+extern void sub_80F979C(u32, u32); // unknown args
+
+void sub_80B2E38(u8);
+void HandleShopMenuQuit(u8);
+void sub_80B2FA0(u8);
+void BuyMenuDrawGraphics(void);
+void sub_80B3240(void);
+void sub_80B3270(void);
+
+u8 CreateShopMenu(bool8 var)
+{
+ ScriptContext2_Enable();
+ gUnknown_03000708.unkC = var;
+ gUnknown_03000708.unk9 = 0;
+
+ if(var == FALSE)
+ {
+ gUnknown_03000708.unkA = 2;
+ MenuDrawTextWindow(0, 0, 10, 7);
+ PrintMenuItemsReordered(1, 1, 3, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6E8);
+ }
+ else
+ {
+ gUnknown_03000708.unkA = 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);
+
+ return CreateTask(sub_80B2E38, 8);
+}
+
+void SetShopMenuCallback(void *callbackPtr)
+{
+ gUnknown_03000708.callback = callbackPtr;
+}
+
+void SetShopItemsForSale(u16 *items)
+{
+ u16 i = 0;
+
+ gUnknown_03000708.itemList = items;
+ gUnknown_03000708.itemCount = 0;
+
+ while (gUnknown_03000708.itemList[i])
+ {
+ gUnknown_03000708.itemCount++;
+ i++;
+ }
+}
+
+void sub_80B2E38(u8 var)
+{
+ const u8 local = var;
+
+ if(gMain.newAndRepeatedKeys & 0x40)
+ {
+ if(gUnknown_03000708.unk9)
+ {
+ PlaySE(0x5);
+ gUnknown_03000708.unk9 = MoveMenuCursor(-1);
+ }
+ }
+ else if(gMain.newAndRepeatedKeys & 0x80)
+ {
+ if(gUnknown_03000708.unk9 != gUnknown_03000708.unkA)
+ {
+ PlaySE(0x5);
+ gUnknown_03000708.unk9 = MoveMenuCursor(1);
+ }
+ }
+ else if (gMain.newKeys & 1)
+ {
+ PlaySE(0x5);
+ if(!gUnknown_03000708.unkC)
+ {
+ gUnknown_083CC6D0[gUnknown_083CC6E8[gUnknown_03000708.unk9]].func(local);
+ }
+ else
+ {
+ gUnknown_083CC6D0[gUnknown_083CC6EB[gUnknown_03000708.unk9]].func(local);
+ }
+ }
+ else if(gMain.newKeys & 2)
+ {
+ PlaySE(0x5);
+ HandleShopMenuQuit(local);
+ }
+}
+
+void sub_80B2EFC(u8 taskId)
+{
+ gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16;
+ gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics;
+ gTasks[taskId].func = sub_80B2FA0;
+ fade_screen(1, 0);
+}
+
+void sub_80B2F30(u8 taskId)
+{
+ gTasks[taskId].data[8] = (u32)sub_80A6300 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_80A6300;
+ gTasks[taskId].func = sub_80B2FA0;
+ fade_screen(1, 0);
+}
+
+void HandleShopMenuQuit(u8 taskId)
+{
+ sub_8072DEC();
+ MenuZeroFillWindowRect(0, 0, 11, 8);
+ sub_80BE3BC(); // in tv.s?
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+
+ if(gUnknown_03000708.callback)
+ gUnknown_03000708.callback(); // run the callback if it exists.
+}
+
+void sub_80B2FA0(u8 taskId)
+{
+ if(!gPaletteFade.active)
+ {
+ SetMainCallback2((void *)((u16)gTasks[taskId].data[8] << 16 | (u16)gTasks[taskId].data[9]));
+ DestroyTask(taskId);
+ }
+}
+
+void ReturnToShopMenuAfterExitingSellMenu(u8 taskId)
+{
+ CreateShopMenu(gUnknown_03000708.unkC);
+ DestroyTask(taskId);
+}
+
+void Task_ExitSellMenu(u8 taskId)
+{
+ if(sub_807D770() == 1)
+ {
+ if(gUnknown_03000708.unkC == 2)
+ DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0);
+ else
+ DisplayItemMessageOnField(taskId, gOtherText_AnythingElse, ReturnToShopMenuAfterExitingSellMenu, 0);
+ }
+}
+
+void sub_80B3050(void)
+{
+ pal_fill_black();
+ CreateTask(Task_ExitSellMenu, 0x8);
+}
+
+void sub_80B3068(u8 taskId)
+{
+ Task_ExitSellMenu(taskId);
+}
+
+void unref_sub_80B3078(u8 taskId)
+{
+ gTasks[taskId].func = Task_ExitSellMenu;
+}
+
+void sub_80B3094(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTasks();
+ UpdatePaletteFade();
+}
+
+void sub_80B30AC(void)
+{
+ void *addr;
+ void *addr2;
+ void *addr3;
+ u16 *tempArr;
+ u16 *tempArr2;
+ u16 *tempArr3;
+
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+
+ // temp vars needed to match for some dumb reason
+ tempArr = gBGTilemapBuffers[1];
+ addr = (void *)(VRAM + 0xE800);
+ DmaCopy16(3, tempArr, addr, 0x800);
+ tempArr2 = gBGTilemapBuffers[2];
+ addr2 = (void *)(VRAM + 0xE000);
+ DmaCopy16(3, tempArr2, addr2, 0x800);
+ tempArr3 = gBGTilemapBuffers[3];
+ addr3 = (void *)(VRAM + 0xF000);
+ DmaCopy16(3, tempArr3, addr3, 0x800);
+}
+
+// this function is fugly. pls fix
+void BuyMenuDrawGraphics(void)
+{
+ void *addr;
+ register u16 zero2 asm("r5");
+
+ sub_80F9438();
+ remove_some_task();
+ REG_BG1HOFS = (zero2 = 0);
+ REG_BG1VOFS = zero2;
+ REG_BG2HOFS = zero2;
+ REG_BG2VOFS = zero2;
+ REG_BG3HOFS = zero2;
+ REG_BG3VOFS = zero2;
+ gPaletteFade.bufferTransferDisabled = 1;
+ addr = (void*)OAM;
+ {
+ register const u32 zero asm("r6") = 0;
+ DmaFill32(3, zero, addr, OAM_SIZE);
+ LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00));
+ sub_800D238(gBuyMenuFrame_Tilemap, (void *)0x02018000);
+ LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal));
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ SetUpWindowConfig(&gWindowConfig_81E6DFC);
+ InitMenuWindow(&gWindowConfig_81E6DFC);
+ BuyMenuDrawMapGraphics();
+ gUnknown_03000708.unk9 = zero;
+ gUnknown_03000708.unkB = zero2;
+ MenuZeroFillWindowRect(0, 0, 0x20, 0x20);
+ sub_80B7C14(gSaveBlock1.money, 0, 0);
+ sub_80B3764(0, 7);
+ sub_80B37EC();
+ sub_80B3270();
+ CreateTask(sub_80B40E8, 0x8);
+ sub_80B3240();
+ asm("":::"r4"); // what??
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, zero);
+ gPaletteFade.bufferTransferDisabled = 0;
+ SetVBlankCallback(sub_80B30AC);
+ SetMainCallback2(sub_80B3094);
+ }
+}
+
+void sub_80B3240(void)
+{
+ u16 tempArr[2];
+
+ memcpy(tempArr, gUnknown_083CC710, sizeof(tempArr));
+ LoadPalette(&tempArr[1], 0xD1, 2);
+ LoadPalette(&tempArr[0], 0xD8, 2);
+}
+
+void sub_80B3270(void)
+{
+ sub_80F944C();
+
+ if(gUnknown_03000708.itemCount > 7)
+ {
+ CreateVerticalScrollIndicators(0, 172, 12);
+ CreateVerticalScrollIndicators(1, 172, 148);
+ sub_80F979C(0, 1);
+ }
+}
+
+void sub_80B32A4(void)
+{
+ if(gUnknown_03000708.unkB == 0)
+ sub_80F979C(0, 1);
+ else
+ sub_80F979C(0, 0);
+
+ if(gUnknown_03000708.unkB + 7 >= gUnknown_03000708.itemCount)
+ sub_80F979C(1, 1);
+ else
+ sub_80F979C(1, 0);
+}
+
+void sub_80B32EC(u16 *array, s16 offset1, s16 offset2)
+{
+ array[offset1 + offset2] = 0xC3E1;
+ array[offset1 + offset2 + 1] = 0xC3E1;
+}
+
+void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2)
+{
+ array[offset1 + offset2] = array2[0];
+ array[offset1 + offset2 + 1] = array2[1];
+ array[offset1 + offset2 + 32] = array2[2];
+ array[offset1 + offset2 + 33] = array2[3];
+}
+
+void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s8 var4)
+{
+ u8 tempVar4 = var4;
+ s16 offset1 = var1 * 2;
+ s16 offset2 = (var2 * 0x40) + 0x40;
+
+ switch(tempVar4)
+ {
+ case 0: // _080B335C
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3);
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4);
+ break;
+ case 1: // _080B3364
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3);
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4);
+ break;
+ case 2: // _080B3398
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3);
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4);
+ break;
+ }
+}