mirror of
https://github.com/pret/pmd-red.git
synced 2026-06-13 12:10:49 -05:00
178 lines
4.2 KiB
C
178 lines
4.2 KiB
C
#include "global.h"
|
|
#include "constants/dungeon.h"
|
|
#include "constants/friend_area.h"
|
|
#include "constants/wonder_mail.h"
|
|
#include "items.h"
|
|
#include "random.h"
|
|
#include "friend_area.h"
|
|
#include "code_80958E8.h"
|
|
#include "code_80A26CC.h"
|
|
|
|
bool8 sub_8095E38(WonderMail *mail, u8 dungeon, u32 floor, u8 param_4);
|
|
extern s32 GetDungeonFloorCount(u8);
|
|
extern bool8 sub_809017C(DungeonLocation *);
|
|
|
|
bool8 GenerateMailJobDungeonInfo(WonderMail *mail)
|
|
{
|
|
s32 counter;
|
|
s32 floor;
|
|
s32 index;
|
|
u8 dungeon;
|
|
bool8 flag;
|
|
u8 dungeonStack [64];
|
|
s32 counter_1;
|
|
s32 cap;
|
|
s32 floor_1;
|
|
s32 halfFloorCount;
|
|
s32 floorCount;
|
|
DungeonLocation dungeonLoc;
|
|
|
|
|
|
cap = sub_80A29B0(dungeonStack);
|
|
if (cap == 0) {
|
|
dungeonStack[0] = DUNGEON_TINY_WOODS;
|
|
dungeonStack[1] = DUNGEON_THUNDERWAVE_CAVE;
|
|
cap = 2;
|
|
}
|
|
counter = RandInt(cap);
|
|
counter_1 = counter;
|
|
do {
|
|
dungeon = dungeonStack[counter];
|
|
floorCount = GetDungeonFloorCount(dungeon);
|
|
halfFloorCount = floorCount / 2;
|
|
floor = RandRange(halfFloorCount, floorCount);
|
|
floor_1 = floor;
|
|
do {
|
|
flag = TRUE;
|
|
dungeonLoc.id = dungeon;
|
|
dungeonLoc.floor = floor;
|
|
|
|
if(sub_809017C(&dungeonLoc))
|
|
flag = FALSE;
|
|
|
|
for(index = 0; index < 4; index++)
|
|
{
|
|
if (sub_8095E38(&gUnknown_203B490->mailboxSlots[index],dungeon,floor,1)) {
|
|
flag = FALSE;
|
|
}
|
|
}
|
|
|
|
for(index = 0; index < 8; index++)
|
|
{
|
|
if (sub_8095E38(&gUnknown_203B490->pelipperBoardJobs[index],dungeon,floor,1)) {
|
|
flag = FALSE;
|
|
}
|
|
}
|
|
|
|
for(index = 0; index < 8; index++)
|
|
{
|
|
if (sub_8095E38(&gUnknown_203B490->jobSlots[index],dungeon,floor,1)) {
|
|
flag = FALSE;
|
|
}
|
|
}
|
|
|
|
if (flag) {
|
|
mail->unk4.dungeon.id = dungeon;
|
|
mail->unk4.dungeon.floor = floor;
|
|
return TRUE;
|
|
}
|
|
floor++;
|
|
if (floor >= floorCount) {
|
|
floor = halfFloorCount;
|
|
}
|
|
} while (floor != floor_1);
|
|
|
|
counter++;
|
|
if (counter == cap) {
|
|
counter = 0;
|
|
}
|
|
if (counter == counter_1) {
|
|
return FALSE;
|
|
}
|
|
} while( TRUE );
|
|
}
|
|
|
|
bool8 sub_8095E38(WonderMail *mail, u8 dungeon, u32 floor, u8 param_4)
|
|
{
|
|
if (mail->mailType != MAIL_TYPE_NONE) {
|
|
if ((mail->missionType == WONDER_MAIL_MISSION_TYPE_ESCORT_CLIENT) && (param_4 == 1)) {
|
|
if (mail->unk4.dungeon.id == dungeon) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
else if ((mail->unk4.dungeon.id == dungeon) && (mail->unk4.dungeon.floor == floor)) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
u8 sub_8095E78(void)
|
|
{
|
|
bool8 flag;
|
|
s32 index;
|
|
s32 friendAreaIndex;
|
|
s32 counter;
|
|
|
|
u8 friendAreaStack[NUM_FRIEND_AREAS];
|
|
|
|
counter = 0;
|
|
for(friendAreaIndex = BOUNTIFUL_SEA; friendAreaIndex < NUM_FRIEND_AREAS; friendAreaIndex++)
|
|
{
|
|
if ((!gFriendAreas[friendAreaIndex]) &&
|
|
(GetFriendAreaUnlockCondition(friendAreaIndex) == UNLOCK_WONDER_MAIL)) {
|
|
flag = FALSE;
|
|
|
|
|
|
for(index = 0; index < 4; index++)
|
|
{
|
|
if((gUnknown_203B490->mailboxSlots[index].mailType != MAIL_TYPE_NONE) && (gUnknown_203B490->mailboxSlots[index].rewardType == FRIEND_AREA))
|
|
flag = TRUE;
|
|
}
|
|
|
|
|
|
for(index = 0; index < 8; index++)
|
|
{
|
|
if((gUnknown_203B490->jobSlots[index].mailType != MAIL_TYPE_NONE) && (gUnknown_203B490->jobSlots[index].rewardType == FRIEND_AREA))
|
|
flag = TRUE;
|
|
}
|
|
|
|
if (!flag) {
|
|
friendAreaStack[counter] = friendAreaIndex;
|
|
counter++;
|
|
}
|
|
}
|
|
}
|
|
if (counter != 0) {
|
|
return friendAreaStack[RandInt(counter)];
|
|
}
|
|
else {
|
|
return FRIEND_AREA_NONE;
|
|
}
|
|
}
|
|
|
|
u8 sub_8095F28(u8 param_1)
|
|
{
|
|
s32 itemID;
|
|
s32 counter;
|
|
u8 itemStack [NUMBER_OF_ITEM_IDS];
|
|
|
|
counter = 0;
|
|
for(itemID = ITEM_STICK; itemID < NUMBER_OF_ITEM_IDS; itemID++)
|
|
{
|
|
if ((param_1 == 0x63) ||
|
|
(xxx_bit_lut_lookup_8091E50(param_1, itemID) != 0)) {
|
|
if ((!IsThrowableItem(itemID)) && (IsNotMoneyOrUsedTMItem(itemID))) {
|
|
itemStack[counter] = itemID;
|
|
counter++;
|
|
}
|
|
}
|
|
}
|
|
if (counter == 0) {
|
|
return ITEM_NOTHING;
|
|
}
|
|
else {
|
|
return itemStack[RandInt(counter)];
|
|
}
|
|
}
|