summaryrefslogtreecommitdiff
path: root/src/code_801AFA4.c
blob: e12bd0d84a564e19bb2951f4e3fde0aa95c259d9 (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
#include "global.h"
#include "memory.h"
#include "text.h"
#include "item.h"
#include "team_inventory.h"
#include "menu.h"
#include "pokemon.h"

extern void sub_8092C84(u8 *, u16);
extern void sub_8099690(u32);
extern s32 GetNumMonsAbleToLearnItemMove(void);
extern void sub_801B064(s32);


extern void sub_801B200(void);
extern void sub_801B2AC(void);
extern void sub_801B2D8(void);
extern void nullsub_37();
extern void sub_801B080();

extern u32 gUnknown_80DB9BC;
extern u32 gUnknown_80DB9E4;
extern u32 gUnknown_80DBA0C;

extern u8 gUnknown_202E1C8[0x50];
extern u8 gAvailablePokemonNames[0x50];
extern u8 gUnknown_202E218[0x50];

extern void InitZeroedPPPokemonMove(struct PokemonMove*, u16);
extern void sub_809401C(struct PokemonMove *, struct PokemonMove *);
extern bool8 IsHMItem(u8);
extern void DisplayGulpinDialogueSprite(u32, u32, void *);
extern void sub_801B178(void);
extern void sub_8094060(void *, struct PokemonMove *);
extern void PlaySound(u32);
extern void sub_80141B4(u32 *, u32, u32 ,u32);
extern void sub_8014248(u32 *, u32, u32, struct MenuItem *, u32, u32, u32, u32, u32);
extern void PrintPokeNameToBuffer(u8 *buffer, struct PokemonStruct *pokemon);
extern s32 sub_80144A4(s32 *);
extern u32 sub_801E8C0(void);
extern void sub_801E93C(void);

extern bool8 CanMonLearnMove(u16 moveID, s16 _species);
extern s32 sub_808D580(s32*);

struct unkStruct_203B22C
{
    // size: 0xa4
    /* 0x0 */ s32 state;
    /* 0x4 */ u32 teamItemIndex;
    /* 0x8 */ u8 itemIndex; // item index
    /* 0xA */ u16 moveID; // item move??
    /* 0xC */ struct PokemonMove moves[MAX_MON_MOVES * 2];
    /* 0x4C */ s32 monsAbleToLearnMove; // number of party members able to learn move
    /* 0x50 */ s16 unk50[MAX_TEAM_MEMBERS]; // species IDs of each member able to learn move
    /* 0x58 */ s16 chosenPokemon; // species of pokemon that will learn move
    /* 0x5C */ struct PokemonStruct *pokeStruct; // PokemonStruct of said pokemon
    u32 unk60;
    /* 0x64 */ struct MenuItem menuItems[8];
};
extern struct unkStruct_203B22C *gUnknown_203B22C;

u32 sub_801AFA4(u32 index)
{
    gUnknown_203B22C = MemoryAlloc(sizeof(struct unkStruct_203B22C), 8);
    gUnknown_203B22C->teamItemIndex = index;
    gUnknown_203B22C->itemIndex = gTeamInventory_203B460->teamItems[index].itemIndex;
    gUnknown_203B22C->moveID = GetItemMove(gUnknown_203B22C->itemIndex);
    sub_8092C84(gUnknown_202E1C8, gUnknown_203B22C->moveID);
    sub_8099690(0);
    if(GetNumMonsAbleToLearnItemMove() == 0)
    {
        sub_801B064(3);
    }
    else
    {
        gUnknown_203B22C->unk60 = 4;
        sub_801B064(0);
    }
    return 1;
}

u32 sub_801B00C(void)
{
    switch(gUnknown_203B22C->state)
    {
        case 4:
            return 3;
        case 0:
            sub_801B200();
            break;
        case 1:
            sub_801B2AC();
            break;
        default:
            sub_801B2D8();
            break;
    }
    return 0;
}

void sub_801B048(void)
{
    if(gUnknown_203B22C != NULL)
    {
        MemoryFree(gUnknown_203B22C);
        gUnknown_203B22C = NULL;
    }
}

void sub_801B064(s32 newState)
{
    gUnknown_203B22C->state = newState;
    nullsub_37();
    sub_801B080();
}

void nullsub_37(void)
{
}

void sub_801B080(void)
{
    switch(gUnknown_203B22C->state)
    {
        case 0:
            sub_801B178();
            // {CENTER_ALIGN}Who will learn the move
            // {CENTER_ALIGN}{COLOR_1 CYAN}{ARG_POKEMON_7}{END_COLOR_TEXT_1}?
            sub_8014248(&gUnknown_80DB9BC, 0, gUnknown_203B22C->unk60, gUnknown_203B22C->menuItems, 0, 4, 0, 0, 0x20);
            break;
        case 1:
            DisplayGulpinDialogueSprite(2, gUnknown_203B22C->chosenPokemon, gUnknown_203B22C->moves);
            break;
        case 2:
            sub_8094060(gUnknown_203B22C->moves, gUnknown_203B22C->pokeStruct->moves);
            if(!IsHMItem(gUnknown_203B22C->itemIndex))
            {
                gTeamInventory_203B460->teamItems[gUnknown_203B22C->teamItemIndex].numItems = gUnknown_203B22C->itemIndex - 0x7D;
                gTeamInventory_203B460->teamItems[gUnknown_203B22C->teamItemIndex].itemIndex = ITEM_ID_USED_TM;
            }
            PlaySound(0x9C << 1);
            // {CENTER_ALIGN}CM{ARG_POKEMON_8}{END_COLOR_TEXT_1} learned
            // {CENTER_ALIGN}the move {COLOR_1 CYAN}{ARG_POKEMON_7}{END_COLOR_TEXT_1}!
            sub_80141B4(&gUnknown_80DB9E4, 0, 0, 0x121);
            break;
        case 3:
            // {CENTER_ALIGN}No one in the current team
            // {CENTER_ALIGN}can learn this move.
            sub_80141B4(&gUnknown_80DBA0C, 0, 0, 0x121);
            break;
        default:
        case 4:
            break;
    }
}

void sub_801B178(void)
{
    int monIndex;
    u8 *bufferPtr;

    for(monIndex = 0; monIndex < gUnknown_203B22C->monsAbleToLearnMove; monIndex++)
    {
        bufferPtr = gAvailablePokemonNames + (0x50 * monIndex);
        PrintPokeNameToBuffer(bufferPtr, &gRecruitedPokemonRef->pokemon[gUnknown_203B22C->unk50[monIndex]]);
        gUnknown_203B22C->menuItems[monIndex].text = bufferPtr;
        gUnknown_203B22C->menuItems[monIndex].menuAction = monIndex + 4;
    }
    gUnknown_203B22C->menuItems[monIndex].text = NULL;
    gUnknown_203B22C->menuItems[monIndex].menuAction = 1;
}

void sub_801B200(void)
{
    s32 temp;
    s32 moveIndex;
    struct PokemonMove *pokeMove;

    if(sub_80144A4(&temp) == 0)
    {
        gUnknown_203B22C->unk60 = temp;
        switch(temp)
        {
            case 1:
                sub_801B064(4);
                break;
            default:
                gUnknown_203B22C->chosenPokemon = gUnknown_203B22C->unk50[temp - 4];
                gUnknown_203B22C->pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B22C->chosenPokemon];
                PrintPokeNameToBuffer(gUnknown_202E218, gUnknown_203B22C->pokeStruct);
                sub_809401C(gUnknown_203B22C->moves, gUnknown_203B22C->pokeStruct->moves);
                for(moveIndex = 0; moveIndex < MAX_MON_MOVES * 2; moveIndex++)
                {
                    pokeMove = &gUnknown_203B22C->moves[moveIndex];
                    if((pokeMove->moveFlags & MOVE_FLAG_EXISTS) == 0)
                    {
                        InitZeroedPPPokemonMove(pokeMove, gUnknown_203B22C->moveID);
                        break;
                    }
                }
                if(moveIndex >= MAX_MON_MOVES)
                    sub_801B064(1);
                else
                    sub_801B064(2);
                break;
            case 0:
                break;
        }
    }
}

void sub_801B2AC(void)
{
    switch(sub_801E8C0())
    {
        case 3:
            sub_801E93C();
            sub_801B064(2);
            break;
        case 2:
            sub_801E93C();
            sub_801B064(0);
            break;
        case 0:
        case 1:
            break;
    }
}


void sub_801B2D8(void)
{
    s32 temp;

    if(sub_80144A4(&temp) == 0)
    {
        sub_801B064(4);
    }
}

s32 GetNumMonsAbleToLearnItemMove(void)
{
    s32 length;
    s32 iVar4;
    s32 index;
    s32 team [MAX_TEAM_MEMBERS];
    struct PokemonStruct *preload;

    length = sub_808D580(team);
    gUnknown_203B22C->monsAbleToLearnMove = 0;

    for(index = 0; index < length; index++)
    {
        preload = &gRecruitedPokemonRef->pokemon[team[index]];
        if (CanMonLearnMove(gUnknown_203B22C->moveID, preload->speciesNum)) {
            gUnknown_203B22C->unk50[gUnknown_203B22C->monsAbleToLearnMove] = team[index];
            iVar4 = gUnknown_203B22C->monsAbleToLearnMove;
            if (iVar4 >= MAX_TEAM_MEMBERS) break;
            gUnknown_203B22C->monsAbleToLearnMove = iVar4 + 1;
        }
    }
    return gUnknown_203B22C->monsAbleToLearnMove;
}

// Unused
bool8 sub_801B374(u8 itemIndex)
{
  u16 moveID;
  struct PokemonStruct *puVar4;
  s32 iVar5;

  puVar4 = &gRecruitedPokemonRef->pokemon[0];
  moveID = GetItemMove(itemIndex);

  for(iVar5 = 0; iVar5 < NUM_SPECIES; iVar5++, puVar4++)
  {
      if((puVar4->unk0 >> 1 & 1) != 0)
        if(CanMonLearnMove(moveID, puVar4->speciesNum))
            return FALSE;
  }
  return TRUE;
}