summaryrefslogtreecommitdiff
path: root/arm9/src/event_data.c
blob: cf33b20190698e2fa913623e389cd7d9c41192c1 (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
#include "global.h"
#include "save_block_2.h"
#include "event_data.h"

#pragma thumb on

u8 UNK_021C5A14[8];

u8 * GetFlagAddr(struct ScriptState * state, u16 flag_id);

u32 SavArray_Flags_sizeof(void)
{
    return sizeof(struct ScriptState);
}

void SavArray_Flags_init(struct ScriptState * state)
{
    memset(state, 0, sizeof(struct ScriptState));
}

struct ScriptState * SavArray_Flags_get(struct SaveBlock2 * sav2)
{
    return (struct ScriptState *)SavArray_get(sav2, 4);
}

BOOL CheckFlagInArray(struct ScriptState * state, u16 flag_id)
{
    u8 * ptr = GetFlagAddr(state, flag_id);
    if (ptr != NULL)
    {
        int mask = 1 << (flag_id % 8);
        if (*ptr & mask)
            return TRUE;
    }
    return FALSE;
}

void SetFlagInArray(struct ScriptState * state, u16 flag_id)
{
    u8 * ptr = GetFlagAddr(state, flag_id);
    if (ptr != NULL)
    {
        int mask = 1 << (flag_id % 8);
        *ptr |= mask;
    }
}

void ClearFlagInArray(struct ScriptState * state, u16 flag_id)
{
    u8 * ptr = GetFlagAddr(state, flag_id);
    if (ptr != NULL)
    {
        int mask = 1 << (flag_id % 8);
        *ptr &= 0xFF ^ mask;
    }
}

u8 * GetFlagAddr(struct ScriptState * state, u16 flag_id)
{
    if (flag_id == 0)
        return 0;
    if (flag_id < 0x4000)
    {
        GF_ASSERT((flag_id / 8) < 364);
        return &state->flags[flag_id / 8];
    }
    else
    {
        GF_ASSERT(((flag_id - 0x4000) / 8) < 8);
        return &UNK_021C5A14[(flag_id - 0x4000) / 8];
    }
}

u16 * GetVarAddr(struct ScriptState * state, u16 var_id)
{
    GF_ASSERT((var_id - 0x4000) < 288);
    return &state->vars[var_id - 0x4000];
}