#ifndef GUARD_CONSTANTS_SECRET_BASES_H
#define GUARD_CONSTANTS_SECRET_BASES_H

#define SECRET_BASE_RED_CAVE 1
#define SECRET_BASE_BROWN_CAVE 2
#define SECRET_BASE_BLUE_CAVE 3
#define SECRET_BASE_YELLOW_CAVE 4
#define SECRET_BASE_TREE 5
#define SECRET_BASE_SHRUB 6

// Each secret base location is assigned an identifier value.
// The secret base's map is determined by (id / 10). The ones
// digit is used to differentiate secret bases using the same map.
// Therefore, each secret base map can be used by up to 10 different
// secret bases in the game.

// * 4 is for each byte of data per secret base group in sSecretBaseEntrancePositions
// They are the map number, the entrance warp id, and the x/y position in front of the computer
#define SECRET_BASE_GROUP(idx) ((idx) * 4)
#define SECRET_BASE_ID_TO_GROUP(baseId) SECRET_BASE_GROUP((baseId) / 10)

#define SECRET_BASE_RED_CAVE1_1     1
#define SECRET_BASE_RED_CAVE1_2     2
#define SECRET_BASE_RED_CAVE1_3     3

#define SECRET_BASE_RED_CAVE1 SECRET_BASE_GROUP(0)

#define SECRET_BASE_RED_CAVE2_1     11
#define SECRET_BASE_RED_CAVE2_2     12
#define SECRET_BASE_RED_CAVE2_3     13

#define SECRET_BASE_RED_CAVE2 SECRET_BASE_GROUP(1)

#define SECRET_BASE_RED_CAVE3_1     21
#define SECRET_BASE_RED_CAVE3_2     22
#define SECRET_BASE_RED_CAVE3_3     23

#define SECRET_BASE_RED_CAVE3 SECRET_BASE_GROUP(2)

#define SECRET_BASE_RED_CAVE4_1     31
#define SECRET_BASE_RED_CAVE4_2     32
#define SECRET_BASE_RED_CAVE4_3     33

#define SECRET_BASE_RED_CAVE4 SECRET_BASE_GROUP(3)

#define SECRET_BASE_BROWN_CAVE1_1   41
#define SECRET_BASE_BROWN_CAVE1_2   42
#define SECRET_BASE_BROWN_CAVE1_3   43

#define SECRET_BASE_BROWN_CAVE1 SECRET_BASE_GROUP(4)

#define SECRET_BASE_BROWN_CAVE2_1   51
#define SECRET_BASE_BROWN_CAVE2_2   52
#define SECRET_BASE_BROWN_CAVE2_3   53

#define SECRET_BASE_BROWN_CAVE2 SECRET_BASE_GROUP(5)

#define SECRET_BASE_BROWN_CAVE3_1   61
#define SECRET_BASE_BROWN_CAVE3_2   62
#define SECRET_BASE_BROWN_CAVE3_3   63

#define SECRET_BASE_BROWN_CAVE3 SECRET_BASE_GROUP(6)

#define SECRET_BASE_BROWN_CAVE4_1   71
#define SECRET_BASE_BROWN_CAVE4_2   72
#define SECRET_BASE_BROWN_CAVE4_3   73

#define SECRET_BASE_BROWN_CAVE4 SECRET_BASE_GROUP(7)

#define SECRET_BASE_BLUE_CAVE1_1    81
#define SECRET_BASE_BLUE_CAVE1_2    82
#define SECRET_BASE_BLUE_CAVE1_3    83

#define SECRET_BASE_BLUE_CAVE1 SECRET_BASE_GROUP(8)

#define SECRET_BASE_BLUE_CAVE2_1    91
#define SECRET_BASE_BLUE_CAVE2_2    92
#define SECRET_BASE_BLUE_CAVE2_3    93

#define SECRET_BASE_BLUE_CAVE2 SECRET_BASE_GROUP(9)

#define SECRET_BASE_BLUE_CAVE3_1    101
#define SECRET_BASE_BLUE_CAVE3_2    102
#define SECRET_BASE_BLUE_CAVE3_3    103

#define SECRET_BASE_BLUE_CAVE3 SECRET_BASE_GROUP(10)

#define SECRET_BASE_BLUE_CAVE4_1    111
#define SECRET_BASE_BLUE_CAVE4_2    112
#define SECRET_BASE_BLUE_CAVE4_3    113

#define SECRET_BASE_BLUE_CAVE4 SECRET_BASE_GROUP(11)

#define SECRET_BASE_YELLOW_CAVE1_1  121
#define SECRET_BASE_YELLOW_CAVE1_2  122
#define SECRET_BASE_YELLOW_CAVE1_3  123

#define SECRET_BASE_YELLOW_CAVE1 SECRET_BASE_GROUP(12)

#define SECRET_BASE_YELLOW_CAVE2_1  131
#define SECRET_BASE_YELLOW_CAVE2_2  132
#define SECRET_BASE_YELLOW_CAVE2_3  133

#define SECRET_BASE_YELLOW_CAVE2 SECRET_BASE_GROUP(13)

#define SECRET_BASE_YELLOW_CAVE3_1  141
#define SECRET_BASE_YELLOW_CAVE3_2  142
#define SECRET_BASE_YELLOW_CAVE3_3  143

#define SECRET_BASE_YELLOW_CAVE3 SECRET_BASE_GROUP(14)

#define SECRET_BASE_YELLOW_CAVE4_1  151
#define SECRET_BASE_YELLOW_CAVE4_2  152
#define SECRET_BASE_YELLOW_CAVE4_3  153

#define SECRET_BASE_YELLOW_CAVE4 SECRET_BASE_GROUP(15)

#define SECRET_BASE_TREE1_1         161
#define SECRET_BASE_TREE1_2         162
#define SECRET_BASE_TREE1_3         163
#define SECRET_BASE_TREE1_4         164

#define SECRET_BASE_TREE1 SECRET_BASE_GROUP(16)

#define SECRET_BASE_TREE2_1         171
#define SECRET_BASE_TREE2_2         172
#define SECRET_BASE_TREE2_3         173
#define SECRET_BASE_TREE2_4         174

#define SECRET_BASE_TREE2 SECRET_BASE_GROUP(17)

#define SECRET_BASE_TREE3_1         181
#define SECRET_BASE_TREE3_2         182
#define SECRET_BASE_TREE3_3         183

#define SECRET_BASE_TREE3 SECRET_BASE_GROUP(18)

#define SECRET_BASE_TREE4_1         191
#define SECRET_BASE_TREE4_2         192
#define SECRET_BASE_TREE4_3         193

#define SECRET_BASE_TREE4 SECRET_BASE_GROUP(19)

#define SECRET_BASE_SHRUB1_1        201
#define SECRET_BASE_SHRUB1_2        202
#define SECRET_BASE_SHRUB1_3        203
#define SECRET_BASE_SHRUB1_4        204

#define SECRET_BASE_SHRUB1 SECRET_BASE_GROUP(20)

#define SECRET_BASE_SHRUB2_1        211
#define SECRET_BASE_SHRUB2_2        212
#define SECRET_BASE_SHRUB2_3        213

#define SECRET_BASE_SHRUB2 SECRET_BASE_GROUP(21)

#define SECRET_BASE_SHRUB3_1        221
#define SECRET_BASE_SHRUB3_2        222
#define SECRET_BASE_SHRUB3_3        223

#define SECRET_BASE_SHRUB3 SECRET_BASE_GROUP(22)

#define SECRET_BASE_SHRUB4_1        231
#define SECRET_BASE_SHRUB4_2        232
#define SECRET_BASE_SHRUB4_3        233

#define SECRET_BASE_SHRUB4 SECRET_BASE_GROUP(23)

#define NUM_SECRET_BASE_GROUPS 24

#endif  // GUARD_CONSTANTS_SECRET_BASES_H