summaryrefslogtreecommitdiff
path: root/arm9/src/unk_02021FF8.c
blob: d578bba5dbaf2937d09c3821e97737f9fcae665a (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
133
134
135
136
#include "global.h"
#include "string16.h"
#include "heap.h"
#include "unk_02021FF8.h"

#pragma thumb on

struct UnkStruct_020220C4 * FUN_020220C4(u8 * a0, u32 a1, void (*a2)(s32, s32, u32), u32 a3, u32 a4)
{
    struct UnkStruct_020220C4 * ret;
    s32 i;
    GF_ASSERT(a1 != 0);
    ret = AllocFromHeap(a4, sizeof(struct UnkStruct_020220C4));
    if (ret != NULL)
    {
        ret->field_0 = a0;
        ret->field_4 = a1;
        ret->field_8 = a2;
        ret->field_C = a3;
        ret->field_10 = AllocFromHeap(a4, a1 * sizeof(struct UnkStruct_020220C4_sub));
        if (ret->field_10 != NULL)
        {
            for (i = 0; i < a1; i++)
            {
                FUN_02022120(&ret->field_10[i]);
            }
        }
        else
        {
            FreeToHeap(ret);
            ret = NULL;
        }
    }
    return ret;
}

void FUN_02022120(struct UnkStruct_020220C4_sub * sub)
{
    sub->field_0 = 0;
    sub->field_1 = 0;
    sub->field_2 = 0;
}

void FUN_0202212C(struct UnkStruct_020220C4 * unk)
{
    GF_ASSERT(unk != NULL);
    FreeToHeap(unk->field_10);
    FreeToHeap(unk);
}

extern u16 FUN_02020A98(void);
extern u16 FUN_02020AA4(void);
extern u8 FUN_02020A40(u8 * a0);
extern u8 FUN_02020A6C(u8 * a0);

s32 (*const UNK_020EE6CC[])(struct UnkStruct_020220C4_sub * a0, u32 a1, u32 a2) = {
    FUN_020221EC,
    FUN_02022208
};

void FUN_02022144(struct UnkStruct_020220C4 * unk)
{
    u32 sp4;
    u32 sp0 = FUN_02020A98();
    s32 i;
    s32 r1;
    if (sp0 != 0)
    {
        sp4 = FUN_02020AA4();
        for (i = 0; i < unk->field_4; i++)
        {
            u8 res;
            if (unk->field_10[i].field_1 != 0)
            {
                res = FUN_02020A40(&unk->field_0[4 * i]);
            }
            else
            {
                res = FUN_02020A6C(&unk->field_0[4 * i]);
            }
            unk->field_10[i].field_1 = res;
        }
    }
    else
    {
        sp4 = 0;
        for (i = 0; i < unk->field_4; i++)
        {
            unk->field_10[i].field_1 = 0;
        }
    }
    for (i = 0; i < unk->field_4; i++)
    {
        r1 = UNK_020EE6CC[unk->field_10[i].field_0](&unk->field_10[i], sp0, sp4);
        if (r1 != -1)
        {
            unk->field_8(i, r1, unk->field_C);
        }
    }
}

s32 FUN_020221EC(struct UnkStruct_020220C4_sub * a0, u32 a1, u32 a2)
{
#pragma unused(a1)
    if (a0->field_1 && a2)
    {
        FUN_0202223C(a0, 1);
        return 0;
    }
    return -1;
}

s32 FUN_02022208(struct UnkStruct_020220C4_sub * a0, u32 a1, u32 a2)
{
#pragma unused(a2)
    if (a0->field_1)
    {
        if (a0->field_2 < 0xFFFF)
            a0->field_2++;
        return 2;
    }
    else if (a1)
    {
        FUN_0202223C(a0, 0);
        return 3;
    }
    FUN_0202223C(a0, 0);
    return 1;
}

void FUN_0202223C(struct UnkStruct_020220C4_sub * a0, u8 a1)
{
    a0->field_0 = a1;
    a0->field_2 = 0;
}