summaryrefslogtreecommitdiff
path: root/src/field_region_map.c
blob: 10d5a4a5e29771739addd89e3fe81f8d7f899af3 (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
#include "global.h"
#include "field_region_map.h"
#include "main.h"
#include "menu.h"
#include "palette.h"
#include "region_map.h"
#include "sprite.h"
#include "strings2.h"
#include "text.h"
#include "ewram.h"

struct RegionMapStruct
{
    u8 str[0x16];
    u8 unk16;
    u8 filler[0x869];
};

struct UnkStruct
{
    MainCallback callback;
    u8 filler[4];
    // This should be RegionMap, but I can't do that because it overlaps unk888.
    struct RegionMapStruct unk8;
    u16 unk888;
};

void FieldInitRegionMap(MainCallback callback)
{
    SetVBlankCallback(NULL);
    ewram0_5.unk888 = 0;
    ewram0_5.callback = callback;
    SetMainCallback2(CB2_FieldInitRegionMap);
}

void CB2_FieldInitRegionMap(void)
{
    REG_DISPCNT = 0;
    REG_BG0HOFS = 0;
    REG_BG0VOFS = 0;
    REG_BG1HOFS = 0;
    REG_BG1VOFS = 0;
    REG_BG2HOFS = 0;
    REG_BG2VOFS = 0;
    REG_BG3HOFS = 0;
    REG_BG3VOFS = 0;
    ResetSpriteData();
    FreeAllSpritePalettes();
    // TODO: remove this cast
    InitRegionMap((void *)&ewram0_5.unk8, 0);
    CreateRegionMapPlayerIcon(0, 0);
    CreateRegionMapCursor(1, 1);
    Text_LoadWindowTemplate(&gWindowTemplate_81E709C);
    InitMenuWindow(&gWindowTemplate_81E709C);
    Menu_EraseScreen();
    REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256;
    Menu_DrawStdWindowFrame(21, 0, 29, 3);
    MenuPrint_Centered(gOtherText_Hoenn, 0x16, 1, 0x38);
    Menu_DrawStdWindowFrame(16, 16, 29, 19);
    sub_813F0C8();
    SetMainCallback2(CB2_FieldRegionMap);
    SetVBlankCallback(VBlankCB_FieldRegionMap);
    BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB(0, 0, 0));
}

void VBlankCB_FieldRegionMap(void)
{
    LoadOam();
    ProcessSpriteCopyRequests();
    TransferPlttBuffer();
}

void CB2_FieldRegionMap(void)
{
    sub_813EFDC();
    AnimateSprites();
    BuildOamBuffer();
    UpdatePaletteFade();
}

void sub_813EFDC(void)
{
    switch (ewram0_5.unk888)
    {
    case 0:
        REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
        ewram0_5.unk888++;
        break;
    case 1:
        if (!gPaletteFade.active)
            ewram0_5.unk888++;
        break;
    case 2:
        switch (sub_80FAB60())
        {
        case 3:
            sub_813F0C8();
            break;
        case 4:
        case 5:
            ewram0_5.unk888++;
        }
        break;
    case 3:
        BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0));
        ewram0_5.unk888++;
        break;
    case 4:
        if (!gPaletteFade.active)
        {
            FreeRegionMapIconResources();
            SetMainCallback2(ewram0_5.callback);
        }
        break;
    }
}

void sub_813F0C8(void)
{
    Menu_BlankWindowRect(17, 17, 28, 18);
    if (ewram0_5.unk8.unk16)
        Menu_PrintText(ewram0_5.unk8.str, 17, 17);
}