summaryrefslogtreecommitdiff
path: root/src/credits.c
blob: 2329bd47307d90535af72043fc5302842e923809 (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
#include "global.h"
#include "input.h"

extern struct Inputs gRealInputs;

struct unkStruct_203B344
{
    u32 unk0; // state variable
    u32 unk4; // timer??
};

struct unkStruct_203B340
{
    // size: 0x84
    u32 unk0;
};

extern void MemoryFree(void *);
extern void* MemoryAlloc(u32, u32);
extern void sub_80015C0(u32, u32);

extern u16 gUnknown_80E5990[];
extern struct unkStruct_203B344 *gUnknown_203B344;
extern struct unkStruct_203B340 *gUnknown_203B340;
extern s32 sub_8001658(u32, u32);

void sub_803565C(void)
{
    if(gUnknown_203B340 != NULL)
    {
        MemoryFree(gUnknown_203B340);
        gUnknown_203B340 = NULL;
    }
}


u32 sub_8035678(void)
{
    gUnknown_203B344 = MemoryAlloc(sizeof(struct unkStruct_203B344), 8);
    gUnknown_203B344->unk0 = 0;
    gUnknown_203B344->unk4 = 0;
    sub_80015C0(0, 0x39);
    return 1;
}

u32 sub_80356A0(void)
{
  u16 uVar1;
  u16 held_input;

  held_input = gRealInputs.held;
  uVar1 = gUnknown_80E5990[gUnknown_203B344->unk4];

  switch(gUnknown_203B344->unk0) {
  case 0:
    gUnknown_203B344->unk0 = 3;
    break;
  case 1:
    if (uVar1 == 0)
      gUnknown_203B344->unk0 = 4;
    else {
      if (held_input == uVar1)
        gUnknown_203B344->unk0 = 2;
      else {
        // NOTE: couldn't match with OR'd condition so split up to match
        if ((uVar1 & held_input) != held_input)
            gUnknown_203B344->unk0 = 3;
        else
        {
            if (gUnknown_203B344->unk4 == 0)
                gUnknown_203B344->unk0 = 3;
        }
      }
    }
    break;
  case 2:
    if (held_input == 0) {
      gUnknown_203B344->unk0 = 1;
      gUnknown_203B344->unk4++;
    }
    else {
      if ((uVar1 & held_input) != held_input)
          gUnknown_203B344->unk0 = 3;
    }
    break;
  case 3:
    return 2;
  case 4:
    return 3; // sub_809C478 clears the flash data when this is returned
  }

  if (sub_8001658(0,0x39) != 0) {
    gUnknown_203B344->unk0 = 3;
    return 2;
  }
  else {
    return 0;
  }
}

void sub_8035758(void)
{
    if(gUnknown_203B344 != NULL)
    {
        MemoryFree(gUnknown_203B344);
        gUnknown_203B344 = NULL;
    }
}