summaryrefslogtreecommitdiff
path: root/include/save.h
blob: 6269380a613b8fc1f9c9f11ed6513a7179fa6af0 (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
#ifndef SAVE_H
#define SAVE_H

#include "global.h"
#include "player.h"
#include "room.h"

#define FILENAME_LENGTH 6

typedef struct {
    int signature;
    u8 saveFileId;
    u8 msg_speed;
    u8 brightness;
    u8 language;
    u8 name[6];
    u8 invalid;
    u8 initialized;
} SaveHeader;
#define gSaveHeader ((SaveHeader*)(0x2000000))

typedef enum {
    SAVE_BUSY = 0,
    SAVE_OK = 1,
    SAVE_ERROR = -1,
} SaveResult;

typedef enum {
    SAVE_INIT,
    SAVE_IN_PROGRESS,
    SAVE_DONE,
} SaveState;

/**
 * Attempt to save the game.
 *
 * @param idx The save slot.
 * @return #SaveResult result.
 */
extern SaveResult HandleSave(u32 idx);

/**
 * Contains save data regarding kinstones
 */
typedef struct {
    u8 unused[2];          /**< unused */
    u8 didAllFusions;      /**< completed all 100 kinstone fusions */
    u8 fusedCount;         /**< number of kinstones fused */
    u8 types[19];          /**< item id for each kinstone type present in kinstone bag */
    u8 amounts[19];        /**< amount of each kinstone type above */
    u8 filler[3];          /**< unused filler */
    u8 fuserProgress[128]; /**< indexed by fuser id, incremented after fusion */
    u8 fuserOffers[128];   /**< available kinstone fusion for each fuser */
    u8 fusedKinstones[13]; /**< bitfield for fused kinstones
                            * @see CheckKinstoneFused */
    u8 fusionUnmarked[13]; /**< bitfield for disabled fusion map markers
                            * @see CheckFusionMapMarkerDisabled */
} KinstoneSave;

/**
 * Contains all information about a save file.
 * The contents of this structure are read from and written to EEPROM.
 */
typedef struct {
    /*0x000*/ u8 invalid;                    /**< save file is invalid */
    /*0x001*/ u8 initialized;                /**< save file is initialized */
    /*0x002*/ u8 msg_speed;                  /**< message speed setting */
    /*0x003*/ u8 brightness;                 /**< brightness setting */
    /*0x004*/ u8 filler4[2];                 /**< unused filler */
    /*0x006*/ u8 saw_staffroll;              /**< beat the game and watched the credits */
    /*0x007*/ u8 dws_barrel_state;           /**< state of the big barrel in DWS, 0 or 2 */
    /*0x008*/ u8 global_progress;            /**< @see UpdateGlobalProgress */
    /*0x009*/ u8 available_figurines;        /**< figurines available to get */
    /*0x00A*/ u8 fillerA[22];                /**< unused filler */
    /*0x020*/ u16 map_hints;                 /**< bitmask, used by subtask MapHint */
    /*0x022*/ u8 filler22[30];               /**< unused filler */
    /*0x040*/ u32 windcrests;                /**< upper 8 bit Windcrest flags @see WindcrestID
                                              * lower bits used for other things */
    /*0x044*/ u8 filler44[12];               /**< unused filler */
    /*0x050*/ u32 enemies_killed;            /**< number of enemies killed */
    /*0x054*/ u8 filler54[8];                /**< unused filler */
    /*0x05C*/ u32 items_bought;              /**< number of items bought in stockwells shop */
    /*0x060*/ u32 areaVisitFlags[8];         /**< Area visit flags. */
    /*0x080*/ char name[FILENAME_LENGTH];    /**< Save file name. */
    /*0x086*/ u8 filler86[2];                /**< unused filler */
    /*0x088*/ PlayerRoomStatus saved_status; /**< Player room status. */
    /*0x0A8*/ Stats stats;                   /**< Player stats. */
    /*0x0CC*/ u8 fillerCC[2];                /**< unused filler */
    /*0x0D0*/ u8 figurines[36];              /**< figurine bitset */
    /*0x0F2*/ u8 inventory[34];              /**< 2 bit per item @see Item */
    /*0x114*/ KinstoneSave kinstones;        /**< save data for kinstones @see KinstoneSave */
    /*0x25C*/ u8 flags[0x200];               /**< flags */
    /*0x45C*/ u8 dungeonKeys[0x10];          /**< indexed by dungeon id, keys per dungeon */
    /*0x46C*/ u8 dungeonItems[0x10];         /**< dungeon items 4: compass, 2: big key, 1: small key */
    /*0x47C*/ u8 dungeonWarps[0x10];         /**< indexed by dungeon id */
    /*0x48C*/ u32 darknut_timer;             /**< timer for darknut fight before Vaati fight */
    /*0x490*/ u32 drug_kill_count;           /**< "timer" enemy kill count when turning in the last drug quest item */
    /*0x494*/ u32 biggoron_timer;            /**< timer for biggoron mirror shield */
    /*0x498*/ u32 vaati_timer;               /**< timer for vaati wrath fight */
    /*0x49C*/ u32 timer4;                    /**< "timer4" unused */
    /*0x4A0*/ u32 timer5;                    /**< "timer5" unused */
    /*0x4A4*/ u32 timer6;                    /**< "timer6" unused */
    /*0x4A8*/ u32 demo_timer;                /**< timer for US demo version playtime limit */
    /*0x4AC*/ u8 filler4ac[8];               /**< unused filler */
} SaveFile;

/**
 * The current save file.
 */
extern SaveFile gSave;

/**
 * Initialize the save system.
 *
 * @return Success
 */
u32 InitSaveData(void);

/**
 * Read save header.
 *
 * @return Success.
 */
u32 ReadSaveHeader(SaveHeader*);

/**
 * Write save header.
 *
 * @return Success.
 */
u32 WriteSaveHeader(SaveHeader*);

/**
 * Read save file.
 *
 * @return Success.
 */
s32 ReadSaveFile(u32, SaveFile*);

/**
 * Mark a save file as deleted.
 *
 * @param index The save file index.
 */
void SetFileStatusDeleted(u32 index);

extern const char gUnk_0811E470[];

/**
 * Update the global progress (0 - 10).
 * There are 10 different indicators of game completion:
    9 : Flag SEIIKI_STAINED_GLASS
    8 : Flag LV5_CLEAR
    7 : Flag OUBO_KAKERA
    6 : Flag LV4_CLEAR
    5 : Flag LV3_CLEAR
    4 : Flag SOUGEN_08_TORITSUKI
    2 : Flag LV1_CLEAR
    1 : Default
    }
 */
void UpdateGlobalProgress(void);
void sub_0807CD9C(void);

#ifdef DEMO_USA
extern const u8* const demoPointers[];
extern const u8 demoUnknown1[];
#endif

#endif // SAVE_H