138 lines
3.5 KiB
C
138 lines
3.5 KiB
C
#ifndef __SNS_H__
|
|
#define __SNS_H__
|
|
#include <ultra64.h>
|
|
|
|
/**
|
|
* sns sets
|
|
*/
|
|
// Flag set used when collecting an already-unlocked Stop 'n' Swop item in-game
|
|
#define SNS_COLLECTED (0)
|
|
// Flag set used when making a Stop 'n' Swop item visible and collectable in-game
|
|
#define SNS_UNLOCKED (1)
|
|
|
|
/**
|
|
* sns mode (read FROM other game, or write TO other game)
|
|
*/
|
|
#define SNS_MODE_READ (0)
|
|
#define SNS_MODE_WRITE (1)
|
|
|
|
/**
|
|
* sns item keys
|
|
*/
|
|
#define SNS_ITEM_COLLECTED_EggYellow (0x100)
|
|
#define SNS_ITEM_COLLECTED_EggRed (0x101)
|
|
#define SNS_ITEM_COLLECTED_EggGreen (0x102)
|
|
#define SNS_ITEM_COLLECTED_EggBlue (0x103)
|
|
#define SNS_ITEM_COLLECTED_EggPink (0x104)
|
|
#define SNS_ITEM_COLLECTED_EggCyan (0x105)
|
|
#define SNS_ITEM_COLLECTED_IceKey (0x106)
|
|
/* 0x107 unknown */
|
|
#define SNS_ITEM_UNLOCKED_EggYellow (0x108)
|
|
#define SNS_ITEM_UNLOCKED_EggRed (0x109)
|
|
#define SNS_ITEM_UNLOCKED_EggGreen (0x10A)
|
|
#define SNS_ITEM_UNLOCKED_EggBlue (0x10B)
|
|
#define SNS_ITEM_UNLOCKED_EggPink (0x10C)
|
|
#define SNS_ITEM_UNLOCKED_EggCyan (0x10D)
|
|
#define SNS_ITEM_UNLOCKED_IceKey (0x10E)
|
|
|
|
#define SNS_NUM_FLAGS (14)
|
|
|
|
#define SNS_PAYLOAD_DATALEN (0x1C)
|
|
#define SNS_HEADER_MAGIC (('2B1K' << 2 | 3)) /* 0xC908C52F */
|
|
|
|
enum StopNSwop_Item {
|
|
SNS_ITEM_NULL,
|
|
|
|
SNS_ITEM_EGG_YELLOW,
|
|
SNS_ITEM_EGG_RED,
|
|
SNS_ITEM_EGG_GREEN,
|
|
SNS_ITEM_EGG_BLUE,
|
|
SNS_ITEM_EGG_PINK,
|
|
SNS_ITEM_EGG_CYAN,
|
|
SNS_ITEM_ICE_KEY,
|
|
|
|
SNS_ITEM_length
|
|
};
|
|
|
|
struct StopNSwop_Bitfield {
|
|
/* Flags to record that the item is UNLOCKED and can be collected */
|
|
u32 uEggYellow : 1;
|
|
u32 uEggRed : 1;
|
|
u32 uEggGreen : 1;
|
|
u32 uEggBlue : 1;
|
|
u32 uEggPink : 1;
|
|
u32 uEggCyan : 1;
|
|
u32 uIceKey : 1;
|
|
|
|
/* Flags to record that the item was COLLECTED */
|
|
u32 cEggYellow : 1;
|
|
u32 cEggRed : 1;
|
|
u32 cEggGreen : 1;
|
|
u32 cEggBlue : 1;
|
|
u32 cEggPink : 1;
|
|
u32 cEggCyan : 1;
|
|
u32 cIceKey : 1;
|
|
|
|
u32 : 18;
|
|
};
|
|
|
|
typedef u32 StopNSwop_Data[SNS_PAYLOAD_DATALEN];
|
|
|
|
struct SnsPayload {
|
|
u32 magic;
|
|
StopNSwop_Data data;
|
|
u32 pad;
|
|
u32 checksum[2];
|
|
};
|
|
|
|
struct GlobalSave {
|
|
union {
|
|
struct StopNSwop_Bitfield sns;
|
|
u32 snsw;
|
|
};
|
|
u8 UNUSED[0x18];
|
|
u32 crc;
|
|
};
|
|
|
|
/**
|
|
* Global save data area.
|
|
*
|
|
* It's saved to the cartridge in a special area at
|
|
* the end of the EEPROM which is shared by all
|
|
* three in-game save slots.
|
|
*
|
|
* Only the first two bytes are ever used in the
|
|
* game, and it's for saving the Stop 'n' Swop items.
|
|
*/
|
|
extern struct GlobalSave gSaveData;
|
|
|
|
/**
|
|
* An array of keys that were read in from a payload
|
|
* at boot.
|
|
*/
|
|
extern StopNSwop_Data snsParsedKeys;
|
|
|
|
extern s32 snsMinKeyToParse;
|
|
extern s32 snsMaxKeyToParse;
|
|
extern s32 snsParsedCurrPos;
|
|
|
|
extern bool snsToRestoreItems;
|
|
extern u32 snsBackedUpItems;
|
|
|
|
// the 4 base areas that outgoing payloads are written to
|
|
extern struct SnsPayload *snsBasePayloadPtr1;
|
|
extern struct SnsPayload *snsBasePayloadPtr2;
|
|
extern struct SnsPayload *snsBasePayloadPtr3;
|
|
extern struct SnsPayload *snsBasePayloadPtr4;
|
|
|
|
struct SnsPayload *snspayload_find_payload_in_ram (void);
|
|
struct SnsPayload *snspayload_init_new_payload (struct SnsPayload *payload);
|
|
|
|
void sns_unlock_parsed_items (void);
|
|
void sns_stub (void);
|
|
|
|
void snspayload_append_key_to_outgoing_payload (struct SnsPayload *payload, s32 key);
|
|
void snspayload_calc_checksum (struct SnsPayload *payload);
|
|
|
|
#endif
|