summaryrefslogtreecommitdiff
path: root/include/lb_rtc.h
blob: 09d9960aeaad1e7fde35a40b7067b63e00a6ba18 (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
#ifndef LB_RTC_H
#define LB_RTC_H

#include "ultra64.h"

/* TODO: do these have a better header? */
#define GAME_YEAR_MIN 2000 /* Minimum year supported by the game */
#define GAME_YEAR_MAX 2032 /* Maximum year supported by the game */

#define lbRTC_YEAR_MIN 1901
#define lbRTC_YEAR_MAX 2099

typedef u8 lbRTC_sec_t;
typedef u8 lbRTC_min_t;
typedef u8 lbRTC_hour_t;
typedef u8 lbRTC_day_t;
typedef u8 lbRTC_weekday_t;
typedef u8 lbRTC_month_t;
typedef u16 lbRTC_year_t;

/* Name leaked in lbRTC_time_c_save_data_check */
typedef struct lbRTC_time_c {
  /* 0x00 */ lbRTC_sec_t sec;
  /* 0x01 */ lbRTC_min_t min;
  /* 0x02 */ lbRTC_hour_t hour;
  /* 0x03 */ lbRTC_day_t day;
  /* 0x04 */ lbRTC_weekday_t weekday;
  /* 0x05 */ lbRTC_month_t month;
  /* 0x06 */ lbRTC_year_t year;
} lbRTC_time_c; // size = 0x8

/* Name leaked in mTM_ymd_2_time */
typedef struct lbRTC_ymd_t {
    /* 0x00 */ lbRTC_year_t year;
    /* 0x02 */ lbRTC_month_t month;
    /* 0x03 */ lbRTC_day_t day;
} lbRTC_ymd_t; // size = 0x4

typedef enum WEEKDAYS {
    /* 0 */ lbRTC_WEEKDAYS_BEGIN = 0,
    /* 0 */ lbRTC_SUNDAY = lbRTC_WEEKDAYS_BEGIN,
    /* 1 */ lbRTC_MONDAY,
    /* 2 */ lbRTC_TUESDAY,
    /* 3 */ lbRTC_WEDNESDAY,
    /* 4 */ lbRTC_THURSDAY,
    /* 5 */ lbRTC_FRIDAY,
    /* 6 */ lbRTC_SATURDAY,
    /* 7 */ lbRTC_WEEK,
    /* 7 */ lbRTC_WEEKDAYS_MAX = lbRTC_WEEK
} WEEKDAYS;

typedef enum MONTHS {
    /* 0 */ lbRTC_MONTHS_BEGIN = 0,
    /* 1 */ lbRTC_JANUARY = 1,
    /* 2 */ lbRTC_FEBRUARY,
    /* 3 */ lbRTC_MARCH,
    /* 4 */ lbRTC_APRIL,
    /* 5 */ lbRTC_MAY,
    /* 6 */ lbRTC_JUNE,
    /* 7 */ lbRTC_JULY,
    /* 8 */ lbRTC_AUGUST,
    /* 9 */ lbRTC_SEPTEMBER,
    /* 10 */ lbRTC_OCTOBER,
    /* 11 */ lbRTC_NOVEMBER,
    /* 12 */ lbRTC_DECEMBER,
    /* 12 */ lbRTC_MONTHS_MAX = lbRTC_DECEMBER
} MONTHS;

typedef enum RTC_EQUALITY {
    lbRTC_LESS = -1,
    lbRTC_EQUAL = 0,
    lbRTC_OVER = 1
} RTC_EQUALITY;

typedef enum RTC_EQUALITY_FLAGS {
    /* 0x00 */ lbRTC_CHECK_NONE = 0,

    /* 0x01 */ lbRTC_CHECK_SECONDS = 1 << 0,
    /* 0x02 */ lbRTC_CHECK_MINUTES = 1 << 1,
    /* 0x04 */ lbRTC_CHECK_HOURS = 1 << 2,
    /* 0x08 */ lbRTC_CHECK_WEEKDAYS = 1 << 3,
    /* 0x10 */ lbRTC_CHECK_DAYS = 1 << 4,
    /* 0x20 */ lbRTC_CHECK_MONTHS = 1 << 5,
    /* 0x40 */ lbRTC_CHECK_YEARS = 1 << 6,

    /* 0x7F */
    lbRTC_CHECK_ALL = lbRTC_CHECK_SECONDS |
                      lbRTC_CHECK_MINUTES |
                      lbRTC_CHECK_HOURS |
                      lbRTC_CHECK_WEEKDAYS |
                      lbRTC_CHECK_DAYS |
                      lbRTC_CHECK_MONTHS |
                      lbRTC_CHECK_YEARS
} RTC_EQUALITY_FLAGS;

#define lbRTC_HOURS_PER_DAY 24
#define lbRTC_MINUTES_PER_HOUR 60
#define lbRTC_SECONDS_PER_MINUTE 60

#define lbRTC_IS_LEAPYEAR(year) \
  (((year % 4) == 0 && ((year % 100) != 0)) || ((year % 400) == 0))

s32 lbRTC_Initial(void);
s32 lbRTC_IsOki(lbRTC_time_c* ptr);
s32 lbRTC_IsAbnormal(void);
void lbRTC_Sampling(void);
void func_800D4F6C_jp(lbRTC_time_c* time);
void func_800D4FB8_jp(lbRTC_time_c* time);
void lbRTC_SetTime(lbRTC_time_c* time);
void lbRTC_GetTime(lbRTC_time_c* time);
lbRTC_day_t lbRTC_GetDaysByMonth(lbRTC_year_t year, lbRTC_month_t month);
s32 lbRTC_IsEqualDate(lbRTC_year_t y0, lbRTC_month_t m0, lbRTC_day_t d0, lbRTC_year_t y1,
                      lbRTC_month_t m1, lbRTC_day_t d1);
s32 lbRTC_IsEqualTime(const lbRTC_time_c* t0, const lbRTC_time_c* t1, s32 flags);
s32 lbRTC_IsOverTime(const lbRTC_time_c* t0, const lbRTC_time_c* t1);
s32 lbRTC_IsJustAtRTC(const lbRTC_time_c* time, s32 flags);
s32 lbRTC_IsOverRTC(const lbRTC_time_c* time);
s32 lbRTC_IsOverWeekRTC(const lbRTC_time_c* t0, lbRTC_weekday_t week);
s32 lbRTC_IntervalTime(lbRTC_time_c* t0, lbRTC_time_c* t1);
s32 lbRTC_GetIntervalDays(const lbRTC_time_c* t0, const lbRTC_time_c* t1);
void lbRTC_Add_YY(lbRTC_time_c* time, s32 years);
void lbRTC_Add_MM(lbRTC_time_c* time, s32 month);
void lbRTC_Add_DD(lbRTC_time_c* time, s32 day);
void lbRTC_Add_hh(lbRTC_time_c* time, s32 hour);
void lbRTC_Add_mm(lbRTC_time_c* time, s32 min);
void lbRTC_Add_ss(lbRTC_time_c* time, s32 sec);
void lbRTC_Add_Date(lbRTC_time_c* time, const lbRTC_time_c* add_time);
void lbRTC_Sub_YY(lbRTC_time_c* time, s32 year);
void lbRTC_Sub_MM(lbRTC_time_c* time, s32 month);
void lbRTC_Sub_DD(lbRTC_time_c* time, s32 days);
void lbRTC_Sub_hh(lbRTC_time_c* time, s32 hour);
void lbRTC_Sub_mm(lbRTC_time_c* time, s32 min);
void lbRTC_Sub_ss(lbRTC_time_c* time, s32 sec);
void lbRTC_Sub_Date(lbRTC_time_c* time, const lbRTC_time_c* sub_time);
lbRTC_weekday_t lbRTC_Week(lbRTC_year_t year, lbRTC_month_t month, lbRTC_day_t day);
void lbRTC_TimeCopy(lbRTC_time_c* dst, const lbRTC_time_c* src);
s32 lbRTC_IsValidTime(const lbRTC_time_c* time);

extern s32 l_lbRTC_isInitial;
extern s32 l_lbRTC_IsSampled;

extern s32 B_80145620_jp;
extern lbRTC_time_c l_lbRTC_Time;

#endif