diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 645887d05..dcb0850b3 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -902,14 +902,26 @@ inline u8 dComIfGs_getBeastNum(int i_idx) { return g_dComIfG_gameInfo.save.getPlayer().getBagItemRecord().getBeastNum(i_idx); } +inline void dComIfGs_setBeastNum(int i_idx, u8 num) { + g_dComIfG_gameInfo.save.getPlayer().getBagItemRecord().setBeastNum(i_idx, num); +} + inline u8 dComIfGs_getBaitNum(int i_idx) { return g_dComIfG_gameInfo.save.getPlayer().getBagItemRecord().getBaitNum(i_idx); } +inline void dComIfGs_setBaitNum(int i_idx, u8 num) { + g_dComIfG_gameInfo.save.getPlayer().getBagItemRecord().setBaitNum(i_idx, num); +} + inline u8 dComIfGs_getReserveNum(int i_idx) { return g_dComIfG_gameInfo.save.getPlayer().getBagItemRecord().getReserveNum(i_idx); } +inline void dComIfGs_setReserveNum(int i_idx, u8 num) { + g_dComIfG_gameInfo.save.getPlayer().getBagItemRecord().setReserveNum(i_idx, num); +} + inline u8 dComIfGs_checkReserveItemEmpty() { return g_dComIfG_gameInfo.save.getPlayer().getBagItem().checkReserveItemEmpty(); } diff --git a/include/d/d_save.h b/include/d/d_save.h index 95e392007..4abd4bd65 100644 --- a/include/d/d_save.h +++ b/include/d/d_save.h @@ -245,6 +245,7 @@ public: u8 getBaitNum(int i_idx) { return mBaitNum[i_idx]; } void setBaitNum(int i_idx, u8 num) { mBaitNum[i_idx] = num; } u8 getReserveNum(int i_idx) { return mReserveNum[i_idx]; } + void setReserveNum(int i_idx, u8 num) { mReserveNum[i_idx] = num; } /* 0x00 */ u8 mBeastNum[8]; /* 0x08 */ u8 mBaitNum[8]; @@ -719,8 +720,8 @@ public: BOOL isItem(int, int); void onActor(int, int); BOOL isActor(int, int); - void memory_to_card(char*, int); - void card_to_memory(char*, int); + int memory_to_card(char*, int); + int card_to_memory(char*, int); int initdata_to_card(char*, int); dSv_save_c& getSavedata() { return mSavedata; } diff --git a/src/d/d_bg_s_acch.cpp b/src/d/d_bg_s_acch.cpp index fbd019fd7..08e0b090c 100644 --- a/src/d/d_bg_s_acch.cpp +++ b/src/d/d_bg_s_acch.cpp @@ -300,6 +300,7 @@ f32 dBgS_Acch::GetWallAddY(Vec&, int) { /* Nonmatching */ } +// TODO: Not sure why this weak function doesn't get inlined. /* 800A4434-800A444C .text getBgW__20dStage_roomControl_cFi */ dBgW* dStage_roomControl_c::getBgW(int i_roomNo) { return mStatus[i_roomNo].mpBgW; diff --git a/src/d/d_save.cpp b/src/d/d_save.cpp index dda8c26f5..08811abe1 100644 --- a/src/d/d_save.cpp +++ b/src/d/d_save.cpp @@ -28,12 +28,12 @@ void dSv_player_status_a_c::init() { field_0x8 = 0; for (int i = 0; i < 5; i++) { - mSelectItem[i] = 0xFF; + mSelectItem[i] = NO_ITEM; dComIfGp_setSelectItem(i); } for (int i = 0; i < 4; i++) { - mSelectEquip[i] = 0xFF; + mSelectEquip[i] = NO_ITEM; } mRupee = 0; @@ -74,7 +74,7 @@ void dSv_player_return_place_c::set(const char* i_name, s8 i_roomNo, u8 i_status /* 80058C60-80058C7C .text init__17dSv_player_item_cFv */ void dSv_player_item_c::init() { for (int i = 0; i < 21; i++) { - mItems[i] = 0xFF; + mItems[i] = NO_ITEM; } } @@ -118,7 +118,9 @@ void dSv_player_item_c::setEquipBottleItemIn(u8 i_btnIdx, u8 i_itemNo) { if (invIdx > 0x11) { return; } + mItems[invIdx] = i_itemNo; + dComIfGs_setItem(dComIfGs_getSelectItem(i_btnIdx), i_itemNo); dComIfGp_setItem(dComIfGs_getSelectItem(i_btnIdx), i_itemNo); dComIfGp_setSelectItem(i_btnIdx); @@ -149,7 +151,9 @@ void dSv_player_item_c::setEquipBottleItemIn(u8 i_itemNo) { if (invIdx > 0x11) { return; } + mItems[invIdx] = i_itemNo; + dComIfGs_setItem(dComIfGs_getSelectItem(btnIdx), i_itemNo); dComIfGp_setItem(dComIfGs_getSelectItem(btnIdx), i_itemNo); dComIfGp_setSelectItem(btnIdx); @@ -361,24 +365,24 @@ void dSv_player_item_max_c::init() { /* 80059908-80059968 .text init__21dSv_player_bag_item_cFv */ void dSv_player_bag_item_c::init() { for (int i = 0; i < 8; i++) { - mBeast[i] = 0xFF; + mBeast[i] = NO_ITEM; } for (int i = 0; i < 8; i++) { - mBait[i] = 0xFF; + mBait[i] = NO_ITEM; } for (int i = 0; i < 8; i++) { - mReserve[i] = 0xFF; + mReserve[i] = NO_ITEM; } } /* 80059968-800599D8 .text setBeastItem__21dSv_player_bag_item_cFUc */ -void dSv_player_bag_item_c::setBeastItem(u8 param_0) { - if (!checkBeastItem(param_0)) { +void dSv_player_bag_item_c::setBeastItem(u8 i_itemNo) { + if (!checkBeastItem(i_itemNo)) { for (int i = 0; i < 8; i++) { - if (mBeast[i] == 0xFF) { - mBeast[i] = param_0; + if (mBeast[i] == NO_ITEM) { + mBeast[i] = i_itemNo; return; } } @@ -386,14 +390,28 @@ void dSv_player_bag_item_c::setBeastItem(u8 param_0) { } /* 800599D8-80059C30 .text setBeastItemEmpty__21dSv_player_bag_item_cFUc */ -void dSv_player_bag_item_c::setBeastItemEmpty(u8) { - /* Nonmatching */ +void dSv_player_bag_item_c::setBeastItemEmpty(u8 i_itemNo) { + if (checkBeastItem(i_itemNo)) { + for (int i = 0; i < 8; i++) { + if (mBeast[i] == i_itemNo) { + mBeast[i] = NO_ITEM; + for (int btnIdx = 0; btnIdx < 3; btnIdx++) { + if (dComIfGp_getSelectItem(btnIdx) == i_itemNo) { + dComIfGs_setItem(dComIfGs_getSelectItem(btnIdx), NO_ITEM); + dComIfGp_setItem(dComIfGs_getSelectItem(btnIdx), NO_ITEM); + dComIfGp_setSelectItem(btnIdx); + } + } + return; + } + } + } } /* 80059C30-80059C60 .text checkBeastItem__21dSv_player_bag_item_cFUc */ -bool dSv_player_bag_item_c::checkBeastItem(u8 param_0) { +bool dSv_player_bag_item_c::checkBeastItem(u8 i_itemNo) { for (int i = 0; i < 8; i++) { - if (mBeast[i] == param_0) { + if (mBeast[i] == i_itemNo) { return true; } } @@ -402,28 +420,134 @@ bool dSv_player_bag_item_c::checkBeastItem(u8 param_0) { } /* 80059C60-80059EB0 .text setBaitItemChange__21dSv_player_bag_item_cFUc */ -void dSv_player_bag_item_c::setBaitItemChange(u8) { - /* Nonmatching */ +void dSv_player_bag_item_c::setBaitItemChange(u8 i_itemNo) { + u8 btnIdx = dComIfGp_event_getTalkXYBtn(); + if (btnIdx == 1) { + btnIdx = 0; + } else if (btnIdx == 2) { + btnIdx = 1; + } else if (btnIdx == 3) { + btnIdx = 2; + } else { + return; + } + + u8 invIdx = dComIfGs_getSelectItem(btnIdx); + if (invIdx < 0x24) { + return; + } + if (invIdx >= 0x2C) { + return; + } + + dComIfGs_setItem(dComIfGs_getSelectItem(btnIdx), i_itemNo); + dComIfGp_setItem(dComIfGs_getSelectItem(btnIdx), i_itemNo); + dComIfGp_setSelectItem(btnIdx); } /* 80059EB0-8005A0C8 .text setBaitItemChange__21dSv_player_bag_item_cFUcUc */ -void dSv_player_bag_item_c::setBaitItemChange(u8, u8) { - /* Nonmatching */ +void dSv_player_bag_item_c::setBaitItemChange(u8 i_btnIdx, u8 i_itemNo) { + if (i_btnIdx > 2) { + return; + } + + u8 invIdx = dComIfGs_getSelectItem(i_btnIdx); + if (invIdx < 0x24) { + return; + } + if (invIdx >= 0x2C) { + return; + } + + dComIfGs_setItem(dComIfGs_getSelectItem(i_btnIdx), i_itemNo); + dComIfGp_setItem(dComIfGs_getSelectItem(i_btnIdx), i_itemNo); + dComIfGp_setSelectItem(i_btnIdx); } /* 8005A0C8-8005A1A4 .text setBaitItemEmpty__21dSv_player_bag_item_cFv */ void dSv_player_bag_item_c::setBaitItemEmpty() { - /* Nonmatching */ + u8 btnIdx = dComIfGp_event_getTalkXYBtn(); + if (btnIdx == 1) { + btnIdx = 0; + } else if (btnIdx == 2) { + btnIdx = 1; + } else if (btnIdx == 3) { + btnIdx = 2; + } else { + return; + } + + u8 invIdx = dComIfGs_getSelectItem(btnIdx); + if (invIdx < 0x24) { + return; + } + if (invIdx >= 0x2C) { + return; + } + + int baitSlotIdx = invIdx - 0x24; + u8 num = dComIfGs_getBaitNum(baitSlotIdx); + u8 itemNo = dComIfGp_getSelectItem(btnIdx); + + if (itemNo == ANIMAL_ESA) { + u8 num = dComIfGs_getBaitNum(baitSlotIdx); + setBaitItemChange(NO_ITEM); + } else if (itemNo == BIRD_ESA_5) { + num = dComIfGs_getBaitNum(baitSlotIdx); + if (num > 0) { + num = num - 1; + } + dComIfGs_setBaitNum(baitSlotIdx, num); + if (num == 0) { + setBaitItemChange(NO_ITEM); + } + } } /* 8005A1A4-8005A248 .text setBaitItemEmpty__21dSv_player_bag_item_cFUc */ -void dSv_player_bag_item_c::setBaitItemEmpty(u8) { - /* Nonmatching */ +void dSv_player_bag_item_c::setBaitItemEmpty(u8 i_btnIdx) { + if (i_btnIdx > 2) { + return; + } + + u8 invIdx = dComIfGs_getSelectItem(i_btnIdx); + if (invIdx < 0x24) { + return; + } + if (invIdx >= 0x2C) { + return; + } + + int baitSlotIdx = invIdx - 0x24; + u8 num = dComIfGs_getBaitNum(baitSlotIdx); + u8 itemNo = dComIfGp_getSelectItem(i_btnIdx); + + if (itemNo == ANIMAL_ESA) { + u8 num = dComIfGs_getBaitNum(baitSlotIdx); + setBaitItemChange(i_btnIdx, NO_ITEM); + } else if (itemNo == BIRD_ESA_5) { + num = dComIfGs_getBaitNum(baitSlotIdx); + if (num > 0) { + num = num - 1; + } + dComIfGs_setBaitNum(baitSlotIdx, num); + if (num == 0) { + setBaitItemChange(i_btnIdx, NO_ITEM); + } + } } /* 8005A248-8005A2D0 .text setBaitItem__21dSv_player_bag_item_cFUc */ -void dSv_player_bag_item_c::setBaitItem(u8) { - /* Nonmatching */ +void dSv_player_bag_item_c::setBaitItem(u8 i_itemNo) { + if (checkBaitItemEmpty()) { + for (int i = 0; i < 8; i++) { + if (mBait[i] == NO_ITEM) { + mBait[i] = i_itemNo; + dComIfGs_setBaitNum(i, 3); + return; + } + } + } } /* 8005A2D0-8005A2F4 .text checkBaitItemEmpty__21dSv_player_bag_item_cFv */ @@ -445,13 +569,48 @@ u8 dSv_player_bag_item_c::checkBaitItem(u8 i_itemNo) { } /* 8005A334-8005A584 .text setReserveItemChange__21dSv_player_bag_item_cFUc */ -void dSv_player_bag_item_c::setReserveItemChange(u8) { - /* Nonmatching */ +void dSv_player_bag_item_c::setReserveItemChange(u8 i_itemNo) { + u8 btnIdx = dComIfGp_event_getTalkXYBtn(); + if (btnIdx == 1) { + btnIdx = 0; + } else if (btnIdx == 2) { + btnIdx = 1; + } else if (btnIdx == 3) { + btnIdx = 2; + } else { + return; + } + + u8 invIdx = dComIfGs_getSelectItem(btnIdx); + if (invIdx < 0x30) { + return; + } + if (invIdx >= 0x38) { + return; + } + + dComIfGs_setItem(dComIfGs_getSelectItem(btnIdx), i_itemNo); + dComIfGp_setItem(dComIfGs_getSelectItem(btnIdx), i_itemNo); + dComIfGp_setSelectItem(btnIdx); } /* 8005A584-8005A79C .text setReserveItemChange__21dSv_player_bag_item_cFUcUc */ -void dSv_player_bag_item_c::setReserveItemChange(u8, u8) { - /* Nonmatching */ +void dSv_player_bag_item_c::setReserveItemChange(u8 i_btnIdx, u8 i_itemNo) { + if (i_btnIdx > 2) { + return; + } + + u8 invIdx = dComIfGs_getSelectItem(i_btnIdx); + if (invIdx < 0x30) { + return; + } + if (invIdx >= 0x38) { + return; + } + + dComIfGs_setItem(dComIfGs_getSelectItem(i_btnIdx), i_itemNo); + dComIfGp_setItem(dComIfGs_getSelectItem(i_btnIdx), i_itemNo); + dComIfGp_setSelectItem(i_btnIdx); } /* 8005A79C-8005A7C0 .text setReserveItemEmpty__21dSv_player_bag_item_cFv */ @@ -460,16 +619,16 @@ void dSv_player_bag_item_c::setReserveItemEmpty() { } /* 8005A7C0-8005A7E4 .text setReserveItemEmpty__21dSv_player_bag_item_cFUc */ -void dSv_player_bag_item_c::setReserveItemEmpty(u8 param_0) { - setReserveItemChange(param_0, NO_ITEM); +void dSv_player_bag_item_c::setReserveItemEmpty(u8 i_itemNo) { + setReserveItemChange(i_itemNo, NO_ITEM); } /* 8005A7E4-8005A854 .text setReserveItem__21dSv_player_bag_item_cFUc */ -void dSv_player_bag_item_c::setReserveItem(u8 param_0) { +void dSv_player_bag_item_c::setReserveItem(u8 i_itemNo) { if (checkReserveItemEmpty()) { for (int i = 0; i < 8; i++) { - if (mReserve[i] == 0xFF) { - mReserve[i] = param_0; + if (mReserve[i] == NO_ITEM) { + mReserve[i] = i_itemNo; return; } } @@ -1255,13 +1414,19 @@ void dSv_info_c::onSwitch(int i_no, int i_roomNo) { } else { JUT_ASSERT(3424, 0 <= i_roomNo && i_roomNo < 64); - int zoneId = dStage_roomControl_c::getZoneNo(i_roomNo); + int zoneId = dComIfGp_roomControl_getZoneNo(i_roomNo); JUT_ASSERT(3426, 0 <= zoneId && zoneId < ZONE_MAX); mZone[zoneId].getZoneBit().onSwitch(i_no - (MEMORY_SWITCH + DAN_SWITCH)); } } +// TODO: Not sure why this weak function doesn't get inlined. +/* 8005DCD0-8005DCEC .text getZoneNo__20dStage_roomControl_cFi */ +int dStage_roomControl_c::getZoneNo(int i_roomNo) { + return mStatus[i_roomNo].mZoneNo; +} + /* 8005DCEC-8005DE98 .text offSwitch__10dSv_info_cFii */ void dSv_info_c::offSwitch(int i_no, int i_roomNo) { JUT_ASSERT(3448, @@ -1278,7 +1443,7 @@ void dSv_info_c::offSwitch(int i_no, int i_roomNo) { } else { JUT_ASSERT(3461, 0 <= i_roomNo && i_roomNo < 64); - int zoneNo = dStage_roomControl_c::getZoneNo(i_roomNo); + int zoneNo = dComIfGp_roomControl_getZoneNo(i_roomNo); JUT_ASSERT(3463, 0 <= zoneNo && zoneNo < ZONE_MAX); mZone[zoneNo].getZoneBit().offSwitch(i_no - (MEMORY_SWITCH + DAN_SWITCH)); @@ -1298,7 +1463,7 @@ BOOL dSv_info_c::isSwitch(int i_no, int i_roomNo) { } else { JUT_ASSERT(3509, 0 <= i_roomNo && i_roomNo < 64); - int zoneNo = dStage_roomControl_c::getZoneNo(i_roomNo); + int zoneNo = dComIfGp_roomControl_getZoneNo(i_roomNo); JUT_ASSERT(3511, 0 <= zoneNo && zoneNo < ZONE_MAX); return mZone[zoneNo].getZoneBit().isSwitch(i_no - (MEMORY_SWITCH + DAN_SWITCH)); @@ -1321,7 +1486,7 @@ BOOL dSv_info_c::revSwitch(int i_no, int i_roomNo) { } else { JUT_ASSERT(3544, 0 <= i_roomNo && i_roomNo < 64); - int zoneNo = dStage_roomControl_c::getZoneNo(i_roomNo); + int zoneNo = dComIfGp_roomControl_getZoneNo(i_roomNo); JUT_ASSERT(3546, 0 <= zoneNo && zoneNo < ZONE_MAX); return mZone[zoneNo].getZoneBit().revSwitch(i_no - (MEMORY_SWITCH + DAN_SWITCH)); @@ -1342,7 +1507,7 @@ void dSv_info_c::onItem(int i_no, int i_roomNo) { } else { JUT_ASSERT(3575, 0 <= i_roomNo && i_roomNo < 64); - int zoneNo = dStage_roomControl_c::getZoneNo(i_roomNo); + int zoneNo = dComIfGp_roomControl_getZoneNo(i_roomNo); JUT_ASSERT(3577, 0 <= zoneNo && zoneNo < ZONE_MAX); mZone[zoneNo].getZoneBit().onItem(i_no - MEMORY_ITEM); @@ -1363,7 +1528,7 @@ BOOL dSv_info_c::isItem(int i_no, int i_roomNo) { } else { JUT_ASSERT(3638, 0 <= i_roomNo && i_roomNo < 64); - int zoneNo = dStage_roomControl_c::getZoneNo(i_roomNo); + int zoneNo = dComIfGp_roomControl_getZoneNo(i_roomNo); JUT_ASSERT(3640, 0 <= zoneNo && zoneNo < ZONE_MAX); return mZone[zoneNo].getZoneBit().isItem(i_no - MEMORY_ITEM); @@ -1378,7 +1543,7 @@ void dSv_info_c::onActor(int i_id, int i_roomNo) { JUT_ASSERT(3693, (0 <= i_id && i_id < dSv_zoneActor_c::ACTOR_MAX) && (0 <= i_roomNo && i_roomNo < 64)); - int zoneNo = dStage_roomControl_c::getZoneNo(i_roomNo); + int zoneNo = dComIfGp_roomControl_getZoneNo(i_roomNo); JUT_ASSERT(3695, 0 <= zoneNo && zoneNo < ZONE_MAX); mZone[zoneNo].getActor().on(i_id); @@ -1396,20 +1561,28 @@ BOOL dSv_info_c::isActor(int i_id, int i_roomNo) { JUT_ASSERT(3746, 0 <= i_roomNo && i_roomNo < 64); - int zoneNo = dStage_roomControl_c::getZoneNo(i_roomNo); + int zoneNo = dComIfGp_roomControl_getZoneNo(i_roomNo); JUT_ASSERT(3748, 0 <= zoneNo && zoneNo < ZONE_MAX); return mZone[zoneNo].getActor().is(i_id); } /* 8005E780-8005EA24 .text memory_to_card__10dSv_info_cFPci */ -void dSv_info_c::memory_to_card(char*, int) { +int dSv_info_c::memory_to_card(char*, int) { /* Nonmatching */ + int temp_r5 = 0; + printf("SAVE size over(%d/%d)\n", 0x768, temp_r5); + printf("SAVE size:%d\n", temp_r5); + return -1; } /* 8005EA24-8005ED00 .text card_to_memory__10dSv_info_cFPci */ -void dSv_info_c::card_to_memory(char*, int) { +int dSv_info_c::card_to_memory(char*, int) { /* Nonmatching */ + int temp_r5 = 0; + printf("LOAD size over(%d/%d)\n", 0x768, temp_r5); + printf("LOAD size:%d\n", temp_r5); + return -1; } /* 8005ED00-8005EF88 .text initdata_to_card__10dSv_info_cFPci */