summaryrefslogtreecommitdiff
path: root/src/berry_powder.c
blob: 3ebffed48daf21d0ef65bda4f6ac727ae9f6bb91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "global.h"
#include "event_data.h"
#include "load_save.h"
#include "menu.h"
#include "quest_log.h"
#include "script_menu.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
#include "text_window.h"

#define MAX_BERRY_POWDER 99999

static EWRAM_DATA u8 sBerryPowderVendorWindowId = 0;

u32 DecryptBerryPowder(u32 *powder)
{
    return *powder ^ gSaveBlock2Ptr->encryptionKey;
}

void SetBerryPowder(u32 *powder, u32 amount)
{
    *powder = amount ^ gSaveBlock2Ptr->encryptionKey;
}

void ApplyNewEncryptionKeyToBerryPowder(u32 encryptionKey)
{
    ApplyNewEncryptionKeyToWord(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, encryptionKey);
}

static bool8 HasEnoughBerryPowder(u32 cost)
{
    if (DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < cost)
        return FALSE;
    else
        return TRUE;
}

bool8 Script_HasEnoughBerryPowder(void)
{
    if (DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount) < 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;
    else
    {
        u32 amount = DecryptBerryPowder(powder);
        SetBerryPowder(powder, amount - cost);
        return TRUE;
    }
}

bool8 Script_TakeBerryPowder(void)
{
    u32 *powder = &gSaveBlock2Ptr->berryCrush.berryPowderAmount;
    if (!HasEnoughBerryPowder(gSpecialVar_0x8004))
        return FALSE;
    else
    {
        u32 amount = DecryptBerryPowder(powder);
        SetBerryPowder(powder, amount - gSpecialVar_0x8004);
        return TRUE;
    }
}

u32 GetBerryPowder(void)
{
    return DecryptBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount);
}

static void PrintBerryPowderAmount(u8 windowId, u32 amount, u8 x, u8 y, u8 speed)
{
    ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_RIGHT_ALIGN, 5);
    AddTextPrinterParameterized(windowId, 0, gStringVar1, x, y, speed, NULL);
}

static void DrawPlayerPowderAmount(u8 windowId, u16 baseBlock, u8 palette, u32 amount)
{
    DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, baseBlock, palette);
    AddTextPrinterParameterized(windowId, 0, gOtherText_Powder, 0, 0, -1, NULL);
    PrintBerryPowderAmount(windowId, amount, 39, 12, 0);
}

void PrintPlayerBerryPowderAmount(void)
{
    PrintBerryPowderAmount(sBerryPowderVendorWindowId, GetBerryPowder(), 39, 12, 0);
}

void DisplayBerryPowderVendorMenu(void)
{
    struct WindowTemplate template;

    if (QuestLog_SchedulePlaybackCB(QLPlaybackCB_DestroyScriptMenuMonPicSprites) != TRUE)
    {
        template = SetWindowTemplateFields(0, 1, 1, 8, 3, 15, 32);
        sBerryPowderVendorWindowId = AddWindow(&template);
        FillWindowPixelBuffer(sBerryPowderVendorWindowId, 0);
        PutWindowTilemap(sBerryPowderVendorWindowId);
        TextWindow_SetStdFrame0_WithPal(sBerryPowderVendorWindowId, 0x21D, 0xD0);
        DrawPlayerPowderAmount(sBerryPowderVendorWindowId, 0x21D, 0xD, GetBerryPowder());
    }
}

void RemoveBerryPowderVendorMenu(void)
{
    ClearWindowTilemap(sBerryPowderVendorWindowId);
    ClearStdWindowAndFrameToTransparent(sBerryPowderVendorWindowId, 1);
    RemoveWindow(sBerryPowderVendorWindowId);
}