summaryrefslogtreecommitdiff
path: root/src/berry_powder.c
diff options
context:
space:
mode:
authorPhlosioneer <mattmdrr2@gmail.com>2019-04-07 01:56:36 -0400
committerPhlosioneer <mattmdrr2@gmail.com>2019-04-07 01:56:36 -0400
commitd84d94e29a1424dd1d12ff821957bb6b1bc847d6 (patch)
treec5ba0778afca66a91f71815cd53fe9abef1bdac6 /src/berry_powder.c
parentad2a97935e1c1f4362f0dffa58ef437d191bab4e (diff)
parentc3cfd6065825ec8ddd5e1782998071518efaa322 (diff)
Merge branch 'master' into pokenav-decomp-again
Diffstat (limited to 'src/berry_powder.c')
-rwxr-xr-xsrc/berry_powder.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/berry_powder.c b/src/berry_powder.c
new file mode 100755
index 000000000..91f9d0d4e
--- /dev/null
+++ b/src/berry_powder.c
@@ -0,0 +1,128 @@
+#include "global.h"
+#include "berry_powder.h"
+#include "bg.h"
+#include "event_data.h"
+#include "load_save.h"
+#include "menu.h"
+#include "string_util.h"
+#include "strings.h"
+#include "text.h"
+#include "text_window.h"
+#include "window.h"
+
+#define MAX_BERRY_POWDER 99999
+
+static EWRAM_DATA u8 sBerryPowderVendorWindowId = 0;
+
+static u32 DecryptBerryPowder(u32 *powder)
+{
+ return *powder ^ gSaveBlock2Ptr->encryptionKey;
+}
+
+void SetBerryPowder(u32 *powder, u32 amount)
+{
+ *powder = amount ^ gSaveBlock2Ptr->encryptionKey;
+}
+
+void ApplyNewEncryptionKeyToBerryPowder(u32 encryptionKey)
+{
+ u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ ApplyNewEncryptionKeyToWord(powder, encryptionKey);
+}
+
+static bool8 HasEnoughBerryPowder_(u32 cost)
+{
+ u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ if (DecryptBerryPowder(powder) < cost)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 HasEnoughBerryPowder(void)
+{
+ u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ if (DecryptBerryPowder(powder) < gSpecialVar_0x8004)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 GiveBerryPowder(u32 amountToAdd)
+{
+ u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ u32 amount = DecryptBerryPowder(powder) + amountToAdd;
+ if (amount > MAX_BERRY_POWDER)
+ {
+ SetBerryPowder(powder, MAX_BERRY_POWDER);
+ return FALSE;
+ }
+ else
+ {
+ SetBerryPowder(powder, amount);
+ return TRUE;
+ }
+}
+
+static bool8 TakeBerryPowder_(u32 cost)
+{
+ u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ if (!HasEnoughBerryPowder_(cost))
+ return FALSE;
+
+ SetBerryPowder(powder, DecryptBerryPowder(powder) - cost);
+ return TRUE;
+}
+
+bool8 TakeBerryPowder(void)
+{
+ u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ if (!HasEnoughBerryPowder_(gSpecialVar_0x8004))
+ return FALSE;
+
+ SetBerryPowder(powder, DecryptBerryPowder(powder) - gSpecialVar_0x8004);
+ return TRUE;
+}
+
+u32 GetBerryPowder(void)
+{
+ u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
+ return DecryptBerryPowder(powder);
+}
+
+static void PrintBerryPowderAmount(u8 windowId, int amount, u8 x, u8 y, u8 speed)
+{
+ ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_RIGHT_ALIGN, 5);
+ AddTextPrinterParameterized(windowId, 1, gStringVar1, x, y, speed, NULL);
+}
+
+static void DrawPlayerPowderAmount(u8 windowId, u16 baseTileOffset, u8 paletteNum, u32 amount)
+{
+ DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, baseTileOffset, paletteNum);
+ AddTextPrinterParameterized(windowId, 1, gText_Powder, 0, 1, TEXT_SPEED_FF, NULL);
+ PrintBerryPowderAmount(windowId, amount, 26, 17, 0);
+}
+
+void PrintPlayerBerryPowderAmount(void)
+{
+ u32 amount = GetBerryPowder();
+ PrintBerryPowderAmount(sBerryPowderVendorWindowId, amount, 26, 17, 0);
+}
+
+void DisplayBerryPowderVendorMenu(void)
+{
+ struct WindowTemplate template;
+ SetWindowTemplateFields(&template, 0, 1, 1, 7, 4, 15, 0x1C);
+ sBerryPowderVendorWindowId = AddWindow(&template);
+ FillWindowPixelBuffer(sBerryPowderVendorWindowId, PIXEL_FILL(0));
+ PutWindowTilemap(sBerryPowderVendorWindowId);
+ LoadUserWindowBorderGfx_(sBerryPowderVendorWindowId, 0x21D, 0xD0);
+ DrawPlayerPowderAmount(sBerryPowderVendorWindowId, 0x21D, 13, GetBerryPowder());
+}
+
+void RemoveBerryPowderVendorMenu(void)
+{
+ ClearWindowTilemap(sBerryPowderVendorWindowId);
+ ClearStdWindowAndFrameToTransparent(sBerryPowderVendorWindowId, TRUE);
+ RemoveWindow(sBerryPowderVendorWindowId);
+}