mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-06-04 10:26:19 -04:00
260 lines
7.1 KiB
Plaintext
260 lines
7.1 KiB
Plaintext
#include "m_random_field.h"
|
|
|
|
#define sSC_MYK_OK (0)
|
|
#define sSC_MYK_ERR_WEATHER (1 << 0)
|
|
#define sSC_MYK_ERR_SHOP (1 << 1)
|
|
#define sSC_MYK_ERR_HOUSE (1 << 2)
|
|
#define sSC_MYK_ERR_CATTAGE (1 << 3)
|
|
#define sSC_MYK_ERR_MUSEUMDISPLAY (1 << 4)
|
|
#define sSC_MYK_ERR_NEEDLEWORK (1 << 5)
|
|
#define sSC_MYK_ERR_MAP (1 << 7)
|
|
|
|
static int sSC_CheckSaveData_Weather() {
|
|
int weather = mEnv_SAVE_GET_WEATHER_TYPE(Save_Get(weather));
|
|
int intensity = mEnv_SAVE_GET_WEATHER_INTENSITY(Save_Get(weather));
|
|
|
|
if (weather >= mEnv_WEATHER_LEAVES) {
|
|
mFRm_ERRORLINE(78);
|
|
return sSC_MYK_ERR_WEATHER;
|
|
} else if (intensity >= mEnv_WEATHER_INTENSITY_NUM) {
|
|
mFRm_ERRORLINE(82);
|
|
return sSC_MYK_ERR_WEATHER;
|
|
} else {
|
|
return sSC_MYK_OK;
|
|
}
|
|
}
|
|
|
|
static int sSC_CheckSaveData_Shop() {
|
|
Shop_c* shop = Save_GetPointer(shop);
|
|
mSP_goods_priority_list_c* prio_list = Save_GetPointer(shop)->priority_lists;
|
|
int i;
|
|
|
|
for (i = 0; i < mSP_KIND_MAX; i++) {
|
|
if (prio_list->a >= mSP_PRIORITY_NUM) {
|
|
mFRm_ERRORLINE(101);
|
|
return sSC_MYK_ERR_SHOP;
|
|
}
|
|
|
|
if (prio_list->b >= mSP_PRIORITY_NUM) {
|
|
mFRm_ERRORLINE(105);
|
|
return sSC_MYK_ERR_SHOP;
|
|
}
|
|
|
|
if (prio_list->c >= mSP_PRIORITY_NUM) {
|
|
mFRm_ERRORLINE(109);
|
|
return sSC_MYK_ERR_SHOP;
|
|
}
|
|
|
|
if (prio_list->pad != 0) {
|
|
mFRm_ERRORLINE(113);
|
|
return sSC_MYK_ERR_SHOP;
|
|
}
|
|
|
|
prio_list++;
|
|
}
|
|
|
|
return sSC_MYK_OK;
|
|
}
|
|
|
|
static int sSC_CheckHouseSize(mHm_hs_c* house) {
|
|
return house->size_info.size < mHm_HOMESIZE_NUM;
|
|
}
|
|
|
|
static int sSC_CheckHappyRoom(mHm_hs_c* house) {
|
|
return TRUE;
|
|
}
|
|
|
|
static int sSC_CheckDoorOriginal(mHm_hs_c* house) {
|
|
if (house->door_original < mPr_ORIGINAL_DESIGN_COUNT || house->door_original == 0xFF) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static int sSCCheckOneFloorData(mHm_flr_c* floor) {
|
|
return TRUE;
|
|
}
|
|
|
|
static int sSC_CheckHouseInterior(mHm_hs_c* house) {
|
|
int i;
|
|
|
|
for (i = 0; i < mHm_ROOM_NUM; i++) {
|
|
if (sSCCheckOneFloorData(house->floors + i) == 0) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static int sSC_CheckSaveData_House() {
|
|
mHm_hs_c* house;
|
|
int i;
|
|
|
|
for (i = 0; i < mHS_HOUSE_NUM; i++) {
|
|
house = Save_Get(homes) + i;
|
|
|
|
if (sSC_CheckHouseSize(house) == 0) {
|
|
mFRm_ERRORLINE(220);
|
|
return sSC_MYK_ERR_HOUSE;
|
|
}
|
|
|
|
if (sSC_CheckHappyRoom(house) == 0) {
|
|
mFRm_ERRORLINE(227);
|
|
return sSC_MYK_ERR_HOUSE;
|
|
}
|
|
|
|
if (sSC_CheckDoorOriginal(house) == 0) {
|
|
mFRm_ERRORLINE(234);
|
|
return sSC_MYK_ERR_HOUSE;
|
|
}
|
|
|
|
if (sSC_CheckHouseInterior(house) == 0) {
|
|
mFRm_ERRORLINE(241);
|
|
return sSC_MYK_ERR_HOUSE;
|
|
}
|
|
}
|
|
|
|
return sSC_MYK_OK;
|
|
}
|
|
|
|
static int sSC_CheckSaveData_Cattage() {
|
|
u8 floor = Save_Get(island).cottage.unused_wall_floor.flooring_idx;
|
|
u8 wall = Save_Get(island).cottage.unused_wall_floor.wallpaper_idx;
|
|
|
|
if (sSCCheckOneFloorData(&Save_Get(island).cottage.room) == 0) {
|
|
return sSC_MYK_ERR_CATTAGE;
|
|
} else if (floor >= CARPET_NUM && !FLOOR_IS_MY_ORIG(floor)) {
|
|
return sSC_MYK_ERR_CATTAGE;
|
|
} else if (wall >= WALL_NUM && !WALL_IS_MY_ORIG(wall)) {
|
|
return sSC_MYK_ERR_CATTAGE;
|
|
} else {
|
|
return sSC_MYK_OK;
|
|
}
|
|
}
|
|
|
|
static int sSC_CheckMuseumBitData(u8* bits, int max) {
|
|
int i;
|
|
|
|
for (i = 0; i < max; i++) {
|
|
int donator = mMmd_BIT_INFO2(bits, i);
|
|
|
|
if (donator < 0 || donator >= 6) {
|
|
mFRm_ERRORLINE(289);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static int sSC_CheckSaveData_MuseumDisplay() {
|
|
if (sSC_CheckMuseumBitData(Save_Get(museum_display).fossil_bit, mMmd_FOSSIL_NUM) == FALSE) {
|
|
mFRm_ERRORLINE(300);
|
|
return sSC_MYK_ERR_MUSEUMDISPLAY;
|
|
} else if (sSC_CheckMuseumBitData(Save_Get(museum_display).art_bit, mMmd_ART_NUM) == FALSE) {
|
|
mFRm_ERRORLINE(305);
|
|
return sSC_MYK_ERR_MUSEUMDISPLAY;
|
|
} else if (sSC_CheckMuseumBitData(Save_Get(museum_display).fish_bit, mMmd_INSECT_NUM) == FALSE) {
|
|
mFRm_ERRORLINE(310);
|
|
return sSC_MYK_ERR_MUSEUMDISPLAY;
|
|
} else if (sSC_CheckMuseumBitData(Save_Get(museum_display).insect_bit, mMmd_FISH_NUM) == FALSE) {
|
|
mFRm_ERRORLINE(315);
|
|
return sSC_MYK_ERR_MUSEUMDISPLAY;
|
|
} else {
|
|
return sSC_MYK_OK;
|
|
}
|
|
}
|
|
|
|
static int sSC_CheckOneOriginalData(mNW_original_design_c* original) {
|
|
if (original->palette >= mNW_PALETTE_NUM) {
|
|
mFRm_ERRORLINE(333);
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static int sSC_CheckSaveData_Needlework() {
|
|
int j;
|
|
int i;
|
|
|
|
for (i = 0; i < PLAYER_NUM; i++) {
|
|
for (j = 0; j < mPr_ORIGINAL_DESIGN_COUNT; j++) {
|
|
if (sSC_CheckOneOriginalData(Save_Get(private + i)->my_org + j) == FALSE) {
|
|
mFRm_ERRORLINE(348);
|
|
return sSC_MYK_ERR_NEEDLEWORK;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < mNW_TOTAL_DESIGN_NUM; i++) {
|
|
if (sSC_CheckOneOriginalData(Save_Get(needlework).original_design + i) == FALSE) {
|
|
mFRm_ERRORLINE(356);
|
|
return sSC_MYK_ERR_NEEDLEWORK;
|
|
}
|
|
}
|
|
|
|
return sSC_MYK_OK;
|
|
}
|
|
|
|
static int sSC_BlockInfo2Count(u32 block_kind) {
|
|
mFM_combo_info_c* combi_table = data_combi_table;
|
|
int bx;
|
|
int bz;
|
|
int count = 0;
|
|
|
|
for (bz = 0; bz < BLOCK_Z_NUM; bz++) {
|
|
for (bx = 0; bx < BLOCK_X_NUM; bx++) {
|
|
int block_no = Save_Get(combi_table)[bz][bx].combination_type;
|
|
|
|
if (block_no < data_combi_table_number) {
|
|
u32 info = mRF_Type2BlockInfo(combi_table[block_no].type);
|
|
|
|
if (info & block_kind) {
|
|
count++;
|
|
}
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
static u32 sSC_map_perfect_table[16] = { mRF_BLOCKKIND_PLAYER, mRF_BLOCKKIND_SHOP, mRF_BLOCKKIND_SHRINE,
|
|
mRF_BLOCKKIND_POLICE, mRF_BLOCKKIND_POSTOFFICE, mRF_BLOCKKIND_STATION,
|
|
mRF_BLOCKKIND_BRIDGE, mRF_BLOCKKIND_SLOPE, mRF_BLOCKKIND_POOL,
|
|
mRF_BLOCKKIND_DUMP, mRF_BLOCKKIND_MUSEUM, mRF_BLOCKKIND_TAILORS,
|
|
mRF_BLOCKKIND_OCEAN, mRF_BLOCKKIND_ISLAND, mRF_BLOCKKIND_DOCK,
|
|
mRF_BLOCKKIND_ISLAND_LEFT };
|
|
|
|
static int sSC_CheckSaveData_Map() {
|
|
int i;
|
|
|
|
for (i = 0; i < 16; i++) {
|
|
if (sSC_BlockInfo2Count(sSC_map_perfect_table[i]) <= 0) {
|
|
mFRm_ERRORLINE(434);
|
|
return sSC_MYK_ERR_MAP;
|
|
}
|
|
}
|
|
|
|
return sSC_MYK_OK;
|
|
}
|
|
|
|
static int sChk_CheckSaveData_MYK() {
|
|
int res;
|
|
|
|
res = sSC_CheckSaveData_Weather();
|
|
res |= sSC_CheckSaveData_Shop();
|
|
res |= sSC_CheckSaveData_House();
|
|
res |= sSC_CheckSaveData_Cattage();
|
|
res |= sSC_CheckSaveData_MuseumDisplay();
|
|
res |= sSC_CheckSaveData_Needlework();
|
|
res |= sSC_CheckSaveData_Map();
|
|
|
|
return res;
|
|
}
|