Files
ac-decomp/include/m_card.h
T
2024-11-29 08:43:18 -05:00

266 lines
6.0 KiB
C

#ifndef M_CARD_H
#define M_CARD_H
#include "types.h"
#include "libu64/gfxprint.h"
#include "m_personal_id.h"
#include "m_land_h.h"
#include "m_private.h"
#include "m_diary.h"
#include "dolphin/card.h"
#ifdef __cplusplus
extern "C" {
#endif
#define mCD_LAND_SAVE_SIZE 0x72000
#define mCD_ORIGINAL_SAVE_SIZE 0xE000
#define mCD_MAIL_SAVE_SIZE 0xC000
#define mCD_DIARY_SAVE_SIZE 0xC000
#define mCD_PRESENT_SAVE_SIZE 0x2000
#define mCD_PLAYER_SAVE_SIZE 0x6000
/* Offset to start of save data when loading from card.
Skips the comment, banner, & icon data. */
#define mCD_SAVE_DATA_OFS 0x1440
#define mCD_LAND_PROTECT_CODE_MAGIC0 0x3C1C
enum {
mCD_SLOT_A,
mCD_SLOT_B,
mCD_SLOT_NUM
};
enum {
mCD_START_COND_0,
mCD_START_COND_1,
mCD_START_COND_2,
mCD_START_COND_INCOMING_FOREIGNER,
mCD_START_COND_OUTGOING_FOREIGNER,
mCD_START_COND_NUM
};
enum {
mCD_ERROR_NOT_ENABLED, // N [not enabled?]
mCD_ERROR_AREA, // A [area?]
mCD_ERROR_WRITE, // W [write]
mCD_ERROR_READ, // R [read?]
mCD_ERROR_CHECKSUM, // C [checksum]
mCD_ERROR_OUTDATED, // O [outdated]
mCD_ERROR_CREATE, // c [create]
mCD_ERROR_NUM
};
enum {
mCD_SPACE_BG_GET_SLOT,
mCD_SPACE_BG_MAIN,
mCD_SPACE_BG_NUM
};
enum {
mCD_ARAM_DATA_ORIGINAL,
mCD_ARAM_DATA_MAIL,
mCD_ARAM_DATA_DIARY,
mCD_ARAM_DATA_NUM
};
enum {
mCD_FILE_SAVE_MISC,
mCD_FILE_SAVE_MAIN,
mCD_FILE_SAVE_MAIN_BAK,
mCD_FILE_SAVE_MAIL,
mCD_FILE_SAVE_ORIGINAL,
mCD_FILE_SAVE_DIARY,
mCD_FILE_PRESENT,
mCD_FILE_PLAYER,
mCD_FILE_NUM
};
/* This is also a priority table where lower = higher priority */
enum {
mCD_TRANS_ERR_NONE,
mCD_TRANS_ERR_NONE_NEXTLAND, // leave town
mCD_TRANS_ERR_IOERROR,
mCD_TRANS_ERR_DAMAGED,
mCD_TRANS_ERR_BROKEN_WRONGENCODING,
mCD_TRANS_ERR_REPAIR,
mCD_TRANS_ERR_NOT_MEMCARD,
mCD_TRANS_ERR_WRONG_LAND,
mCD_TRANS_ERR_INVALID_NOLAND_CODE,
mCD_TRANS_ERR_LAND_EXIST,
mCD_TRANS_ERR_PASSPORT_EXIST,
mCD_TRANS_ERR_NO_FILES,
mCD_TRANS_ERR_NO_SPACE,
mCD_TRANS_ERR_TOWN_INVALID,
mCD_TRANS_ERR_OTHER_TOWN,
mCD_TRANS_ERR_15,
mCD_TRANS_ERR_16,
mCD_TRANS_ERR_CORRUPT,
mCD_TRANS_ERR_18,
mCD_TRANS_ERR_TRAVEL_DATA_MISSING,
mCD_TRANS_ERR_TRAVEL_DATA_EXISTS,
mCD_TRANS_ERR_WRONGDEVICE,
mCD_TRANS_ERR_NOCARD,
mCD_TRANS_ERR_NO_TOWN_DATA,
mCD_TRANS_ERR_GENERIC,
mCD_TRANS_ERR_BUSY,
mCD_TRANS_ERR_NUM
};
enum {
mCD_HOME_SFX_NORMAL,
mCD_HOME_SFX_DELETE,
mCD_HOME_SFX_NUM
};
#define mCD_RESULT_ERROR -1
#define mCD_RESULT_BUSY 0
#define mCD_RESULT_SUCCESS 1
#define mCD_MEMCARD_SECTORSIZE 0x2000
#define mCD_ALIGN_SECTORSIZE(s) ALIGN_NEXT(s, mCD_MEMCARD_SECTORSIZE)
typedef struct {
mLd_land_info_c land;
PersonalID_c pid[PLAYER_NUM];
} mCD_persistent_data_c;
#define mCD_KEEP_ORIGINAL_PAGE_COUNT 8
#define mCD_KEEP_ORIGINAL_COUNT 12
typedef struct {
int count;
u8 _0004[mCD_KEEP_ORIGINAL_PAGE_COUNT][12];
mNW_original_design_c original[mCD_KEEP_ORIGINAL_PAGE_COUNT][mCD_KEEP_ORIGINAL_COUNT];
int _CC80; // force size to 0xCCA0
} mCD_keep_original_c ATTRIBUTE_ALIGN(32);
#define mCD_KEEP_MAIL_PAGE_COUNT 8
#define mCD_KEEP_MAIL_COUNT 20
typedef struct {
int count;
u8 _0004[mCD_KEEP_MAIL_PAGE_COUNT][12];
Mail_c mail[mCD_KEEP_MAIL_PAGE_COUNT][mCD_KEEP_MAIL_COUNT];
} mCD_keep_mail_c ATTRIBUTE_ALIGN(32);
#define mCD_KEEP_DIARY_COUNT PLAYER_NUM
#define mCD_KEEP_DIARY_ENTRY_COUNT lbRTC_MONTHS_MAX
typedef struct {
u16 checksum;
mDi_entry_c entries[mCD_KEEP_DIARY_COUNT][mCD_KEEP_DIARY_ENTRY_COUNT];
} mCD_keep_diary_c ATTRIBUTE_ALIGN(32);
typedef struct {
CARDStat stat;
s32 fileNo;
s32 freeBlocks;
s32 result;
s32 game_result;
void* workArea;
u8 _80[0x94 - 0x80];
} mCD_memMgr_card_info_c;
typedef struct {
int proc;
int _04;
s32 fileNo;
s32 chan;
int _10;
int _14;
s32 game_result;
int _1C;
} mCD_memMgr_fileInfo_c;
typedef struct {
s32 chan;
int loaded_file_type;
u32 workArea_size;
void* workArea;
int _0010;
int load_proc;
u8 _0018[0x0054 - 0x0018];
mCD_memMgr_card_info_c cards[CARD_NUM_CHANS];
int _017C;
int land_saved;
int copy_protect;
int _0188;
int _018C;
int _0190;
int _0194;
int _0198;
int _019C;
int _01A0;
int broken_file_idx;
u8 _01A8[0x11BC - 0x01A8];
char filename[32];
} mCD_memMgr_c;
/* Bonus letter */
#define mCD_PRESENT_MAX 9
typedef struct present_save_s {
u16 checksum;
u16 present_count;
Mail_c letters[mCD_PRESENT_MAX];
} PresentSave_c;
typedef union {
struct {
char comment[CARD_COMMENT_SIZE];
u8 banner[0xE00];
u8 icon[0x600];
PresentSave_c save;
};
u8 __align_sector[mCD_MEMCARD_SECTORSIZE];
} PresentSaveFile_c ATTRIBUTE_ALIGN(32);
enum {
mCD_PRESENT_TYPE_BONUS,
mCD_PRESENT_TYPE_GIFT,
mCD_PRESENT_TYPE_NUM
};
extern s32 mCD_GetThisLandSlotNo_code(int* player_no, s32* slot_card_results);
extern int mCD_GetThisLandSlotNo(void);
extern void mCD_save_data_aram_malloc();
extern void mCD_set_aram_save_data();
extern void mCD_init_card();
extern s32 mCD_InitGameStart_bg(int player_no, int card_private_idx, int start_cond, s32* mounted_chan);
extern int mCD_GetCardPrivateNameCopy(u8* name, int idx);
extern int mCD_CheckCardPlayerNative(int idx);
extern int mCD_CheckPassportFile(void);
extern int mCD_CheckBrokenPassportFile(int slot);
extern int mCD_GetPlayerNum(void);
extern int mCD_CheckStation_bg(s32* chan);
extern int mCD_SaveStation_NextLand_bg(s32* chan);
extern int mCD_SaveStation_Passport_bg(s32* chan);
extern void mCD_PrintErrInfo(gfxprint_t* gfxprint);
extern void mCD_InitAll();
extern void mCD_LoadLand();
extern void mCD_toNextLand();
extern int mCD_EraseBrokenLand_bg(void*);
extern int mCD_EraseLand_bg(int* slot);
extern int mCD_ErasePassportFile_bg(int slot);
extern int mCD_SaveErasePlayer_bg(int* slot);
extern int mCD_card_format_bg(u8);
extern void mCD_ReCheckLoadLand(GAME_PLAY* play);
#ifdef __cplusplus
}
#endif
#endif