Match CreateRescueTitle and CreateRescueDescription thanks to @jiang

This commit is contained in:
Seth Barberee 2023-08-14 10:46:55 -07:00
parent c374c094d9
commit 9bf38c7e47
36 changed files with 1260 additions and 2164 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,301 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
@ Menu that gets created when you talk to friend
thumb_func_start CreateFriendActionMenu
CreateFriendActionMenu:
push {r4-r7,lr}
ldr r3, _080274E4
ldr r4, _080274E8
ldr r0, [r4]
movs r1, 0x8
ldrsh r2, [r0, r1]
movs r1, 0x58
muls r2, r1
ldr r1, [r3]
adds r5, r1, r2
movs r2, 0xB6
lsls r2, 1
adds r0, r2
movs r1, 0
movs r2, 0x14
bl MemoryFill16
ldrh r0, [r5]
lsrs r0, 1
movs r6, 0x1
ands r0, r6
cmp r0, 0
beq _080274F4
ldr r2, [r4]
movs r3, 0x8E
lsls r3, 1
adds r1, r2, r3
ldr r0, _080274EC
str r0, [r1]
movs r0, 0x90
lsls r0, 1
adds r1, r2, r0
movs r0, 0x7
str r0, [r1]
adds r0, r5, 0
bl sub_8027D9C
lsls r0, 24
cmp r0, 0
bne _080274B6
ldr r0, [r4]
movs r1, 0xB6
lsls r1, 1
adds r0, r1
strh r6, [r0]
_080274B6:
movs r7, 0x1
movs r0, 0x8
bl sub_80023E4
lsls r0, 24
cmp r0, 0
beq _08027552
ldrb r0, [r5, 0x2]
cmp r0, 0
bne _08027552
ldr r3, [r4]
movs r2, 0x8
movs r4, 0x92
lsls r4, 1
adds r1, r3, r4
ldr r0, _080274F0
str r0, [r1]
movs r1, 0x94
lsls r1, 1
adds r0, r3, r1
str r2, [r0]
b _08027550
.align 2, 0
_080274E4: .4byte gRecruitedPokemonRef
_080274E8: .4byte gUnknown_203B2BC
_080274EC: .4byte gFriendActionStandby
_080274F0: .4byte gFriendActionMakeLeader
_080274F4:
ldr r2, [r4]
movs r3, 0x8E
lsls r3, 1
adds r1, r2, r3
ldr r0, _08027658
str r0, [r1]
movs r0, 0x90
lsls r0, 1
adds r1, r2, r0
movs r0, 0x6
str r0, [r1]
movs r1, 0x8
ldrsh r0, [r2, r1]
bl sub_808D750
lsls r0, 24
cmp r0, 0
bne _08027522
ldr r0, [r4]
movs r2, 0xB6
lsls r2, 1
adds r0, r2
strh r6, [r0]
_08027522:
movs r7, 0x1
ldr r2, [r4]
movs r3, 0x92
lsls r3, 1
adds r1, r2, r3
ldr r0, _0802765C
str r0, [r1]
movs r0, 0x94
lsls r0, 1
adds r1, r2, r0
movs r0, 0x9
str r0, [r1]
adds r0, r5, 0
bl sub_8027DCC
lsls r0, 24
cmp r0, 0
bne _08027550
ldr r0, [r4]
movs r1, 0xB7
lsls r1, 1
adds r0, r1
strh r7, [r0]
_08027550:
movs r7, 0x2
_08027552:
ldr r4, _08027660
ldr r2, [r4]
lsls r3, r7, 3
movs r6, 0x8E
lsls r6, 1
adds r0, r2, r6
adds r0, r3
ldr r1, _08027664
str r1, [r0]
movs r5, 0x90
lsls r5, 1
adds r2, r5
adds r2, r3
movs r0, 0xA
str r0, [r2]
bl GetNumberOfFilledInventorySlots
cmp r0, 0
bne _08027588
ldr r0, [r4]
lsls r1, r7, 1
movs r2, 0xB6
lsls r2, 1
adds r0, r2
adds r0, r1
movs r1, 0x1
strh r1, [r0]
_08027588:
adds r7, 0x1
ldr r2, [r4]
lsls r3, r7, 3
adds r0, r2, r6
adds r0, r3
ldr r1, _08027668
str r1, [r0]
adds r2, r5
adds r2, r3
movs r0, 0xB
str r0, [r2]
bl GetNumberOfFilledInventorySlots
cmp r0, 0x13
bgt _080275AE
ldr r0, [r4]
ldrb r0, [r0, 0x14]
cmp r0, 0
bne _080275BE
_080275AE:
ldr r0, [r4]
lsls r1, r7, 1
movs r3, 0xB6
lsls r3, 1
adds r0, r3
adds r0, r1
movs r1, 0x1
strh r1, [r0]
_080275BE:
adds r7, 0x1
ldr r4, _08027660
ldr r5, [r4]
lsls r1, r7, 3
movs r0, 0x8E
lsls r0, 1
adds r3, r5, r0
adds r2, r3, r1
ldr r0, _0802766C
str r0, [r2]
movs r2, 0x90
lsls r2, 1
adds r6, r5, r2
adds r1, r6, r1
movs r0, 0x4
str r0, [r1]
adds r7, 0x1
lsls r1, r7, 3
adds r2, r3, r1
ldr r0, _08027670
str r0, [r2]
adds r1, r6, r1
movs r0, 0xC
str r0, [r1]
adds r7, 0x1
lsls r1, r7, 3
adds r2, r3, r1
ldr r0, _08027674
str r0, [r2]
adds r1, r6, r1
movs r0, 0x5
str r0, [r1]
adds r7, 0x1
lsls r1, r7, 3
adds r3, r1
movs r0, 0
str r0, [r3]
adds r1, r6, r1
movs r0, 0x1
str r0, [r1]
movs r3, 0
mov r12, r4
cmp r3, r7
bge _08027636
adds r4, r6, 0
movs r0, 0xB6
lsls r0, 1
adds r2, r5, r0
_0802761E:
ldrh r0, [r2]
cmp r0, 0
bne _0802762C
ldr r1, [r4]
ldr r0, [r5, 0x70]
cmp r1, r0
beq _080276A0
_0802762C:
adds r4, 0x8
adds r2, 0x2
adds r3, 0x1
cmp r3, r7
blt _0802761E
_08027636:
movs r3, 0
cmp r3, r7
bge _080276A0
mov r2, r12
ldr r1, [r2]
movs r4, 0xB6
lsls r4, 1
adds r0, r1, r4
ldrh r0, [r0]
cmp r0, 0
bne _08027678
movs r2, 0x90
lsls r2, 1
adds r0, r1, r2
ldr r0, [r0]
str r0, [r1, 0x70]
b _080276A0
.align 2, 0
_08027658: .4byte gFriendActionJoinTeam
_0802765C: .4byte gFriendActionSayFarewell
_08027660: .4byte gUnknown_203B2BC
_08027664: .4byte gFriendActionGive
_08027668: .4byte gFriendActionTake
_0802766C: .4byte gFriendActionSummary
_08027670: .4byte gFriendActionMoves
_08027674: .4byte gFriendActionCheckIQ
_08027678:
adds r3, 0x1
cmp r3, r7
bge _080276A0
mov r4, r12
ldr r2, [r4]
lsls r0, r3, 1
movs r4, 0xB6
lsls r4, 1
adds r1, r2, r4
adds r1, r0
ldrh r0, [r1]
cmp r0, 0
bne _08027678
lsls r0, r3, 3
movs r3, 0x90
lsls r3, 1
adds r1, r2, r3
adds r1, r0
ldr r0, [r1]
str r0, [r2, 0x70]
_080276A0:
pop {r4-r7}
pop {r0}
bx r0
thumb_func_end CreateFriendActionMenu
.align 2,0

View File

@ -1,24 +1,22 @@
struct unkStruct_802C39C
{
/* 0x0 */ u32 unk0[2];
/* 0x8 */ struct DungeonLocation *dungeon;
/* 0x8 */ struct WonderMailSub *unk8;
/* 0xC */ u8 *playerName;
/* 0x10 */ s16 clientSpecies;
/* 0x12 */ s16 targetSpecies;
/* 0x14 */ u8 targetItem;
/* 0x15 */ u8 fill15[0x2E - 0x15];
u8 unk2E;
u8 fill2F[0x34 - 0x2F];
u8 unk34;
/* 0x2E */ u8 rewardType;
u8 *unk30;
/* 0x34 */ u8 rewardItem;
u8 fill35[0x38 - 0x35];
/* 0x38 */ u8 unk38[0x40 - 0x38];
u8 unk40;
u8 unk41;
u8 unk42;
u8 mailTitleType;
u8 mailDescriptionType;
u8 mailMissionType;
u8 unk43;
u8 unk44;
u8 unk45;
u8 fill46[0x48 - 0x46];
u8 mailStatus; // mail status (suspend / take job / done)
/* 0x48 */ u32 y;
/* 0x4C */ u8 *unk4C;
/* 0x50 */ u8 *unk50[2];

View File

@ -3,13 +3,18 @@
#include "item.h"
struct WonderMailSub
{
/* 0x4 */ struct DungeonLocation dungeon;
u32 seed;
};
// size: 0x30
struct unkStruct_203B480
{
/* 0x0 */ u8 mailType;
/* 0x1 */ u8 missionType;
/* 0x4 */ struct DungeonLocation dungeon;
/* 0x8 */ u32 unk8;
struct WonderMailSub unk4;
/* 0xC */ s16 clientSpecies;
/* 0xE */ s16 targetSpecies;
union unk10_temp
@ -67,4 +72,4 @@ s32 GetFirstIndexofMailType(u8 mailType);
void sub_8095824(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b);
void sub_8095774(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b);
#endif
#endif

View File

@ -5,7 +5,7 @@ struct subStruct_203B490
{
// size: 0xC
struct DungeonLocation dungeon;
u32 unk4;
u32 seed;
u32 unk8;
};

View File

@ -47,9 +47,23 @@ enum WonderMailMissionTypes
WONDER_MAIL_MISSION_TYPE_UNK6 = 6,
};
enum MissionTypes
{
MISSION_TYPE_FRIEND_RESCUE,
MISSION_TYPE_FIND_ITEM,
MISSION_TYPE_DELIVER_ITEM,
MISSION_TYPE_RESCUE_CLIENT,
MISSION_TYPE_RESCUE_TARGET,
MISSION_TYPE_ESCORT_CLIENT,
MISSION_TYPE_SPECIAL_MISSION
};
#define MAIL_STATUS_SUSPENDED 0
#define NUM_POKEMON_NEWS 56 // 50 normal + 6 special issues
#define PASSWORD_BUFFER_SIZE 54
#define MAX_ITEM_REWARDS 3
#endif //GUARD_CONSTANTS_WONDER_MAIL_H

View File

@ -17,7 +17,7 @@ struct unkStruct_203B2BC
u32 moveIndex; // some sort of move index
u16 moveID;
struct Move moves[8];
u16 moveIDs[4]; // some list of move IDs
u16 moveIDs[MAX_MON_MOVES]; // some list of move IDs
u32 menuAction1;
u32 menuAction2;
u32 menuAction3;
@ -33,7 +33,29 @@ struct unkStruct_203B2BC
enum FriendAreaActionMenuStates {
FRIEND_AREA_ACTION_MENU_INIT,
FRIEND_AREA_ACTION_MENU_MAIN,
FRIEND_AREA_ACTION_MENU_MAIN_2,
FRIEND_AREA_ACTION_MENU_SUMMARY = 4,
FRIEND_AREA_ACTION_MENU_CHECK_IQ = 5,
FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_PROMPT = 8,
FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_CONFIRM,
FRIEND_AREA_ACTION_MENU_EXIT = 0x11,
};
enum FriendAreaActionMenuActions {
FRIEND_AREA_ACTION_MENU_ACTION_NONE = 1,
FRIEND_AREA_ACTION_MENU_ACTION_YES,
FRIEND_AREA_ACTION_MENU_ACTION_NO,
FRIEND_AREA_ACTION_MENU_ACTION_INFO = 4,
FRIEND_AREA_ACTION_MENU_ACTION_SUMMARY = 4,
FRIEND_AREA_ACTION_MENU_ACTION_CHECK_IQ,
FRIEND_AREA_ACTION_MENU_ACTION_JOIN_TEAM,
FRIEND_AREA_ACTION_MENU_ACTION_STANDBY,
FRIEND_AREA_ACTION_MENU_ACTION_MAKE_LEADER,
FRIEND_AREA_ACTION_MENU_ACTION_SAY_FAREWELL,
FRIEND_AREA_ACTION_MENU_ACTION_GIVE,
FRIEND_AREA_ACTION_MENU_ACTION_TAKE,
FRIEND_AREA_ACTION_MENU_ACTION_MOVES,
};
#endif

View File

@ -24,6 +24,10 @@ struct unkPokeSubStruct_C
u8 fill1[3];
};
enum PokemonUnk0Flags {
FLAG_ON_TEAM = 2,
};
// size: 0x58
struct PokemonStruct
{

View File

@ -25,14 +25,13 @@ struct unkStruct_802F204
};
// size: 0x14
struct WonderMail
{
/* 0x0 */ u8 mailType; // mail type
/* 0x1 */ u8 missionType; // mission type
u8 unk2;
u8 unk3;
/* 0x4 */ struct DungeonLocation dungeon;
u32 unk8;
/* 0x4 */ struct WonderMailSub unk4;
/* 0xC */ s16 clientSpecies; // client pokemon
/* 0xE */ s16 targetSpecies; // target
/* 0x10 */ u8 targetItem; // item to find/deliver

View File

@ -117,7 +117,6 @@ SECTIONS {
src/friend_list_menu.o(.text);
src/party_list_menu.o(.text);
src/friend_area_action_menu.o(.text);
asm/friend_area_action_menu.o(.text);
src/friend_area_action_menu_1.o(.text);
src/wonder_mail.o(.text);
src/thank_you_wonder_mail.o(.text);

View File

@ -1,15 +1,470 @@
#include "global.h"
#include "constants/wonder_mail.h"
#include "pokemon.h"
#include "pokemon_3.h"
#include "event_flag.h"
#include "exclusive_pokemon.h"
#include "code_8094F88.h"
#include "code_802C39C.h"
#include "text_util.h"
#include "text2.h"
#include "code_800D090.h"
#include "menu_input.h"
struct unkStruct_80E9920
{
s16 unkA;
s16 unkB;
u8 *text;
};
struct unkStruct_80E9F8C
{
s16 unkA;
s16 unkB;
u8 *text1;
u8 *text2;
};
extern s16 gUnknown_80E80E0[];
extern s16 gUnknown_80E8126[];
extern u8 gUnknown_80E888C[];
extern u8 *gUnknown_80E8BCC[];
extern u8 gMankeyMissionDescription[];
extern u8 gSmeargleMissionDescription[];
extern u8 gMedichamMissionDescription[];
extern u8 gUnknown_202DE58[];
extern u8 gUnknown_80E8968[];
extern u8 gUnknown_80E89B0[];
extern u8 gAvailablePokemonNames[];
extern u8 gDifficultyText[];
extern u8 gPlaceText[];
extern u8 gUnknown_80E8AD0[];
extern u8 gUnknown_80E8AE0[];
extern u8 gUnknown_80E8AEC[];
extern u8 gUnknown_80E8B10[];
extern u8 gUnknown_80E8AFC[];
extern u8 gUnknown_80E8B20[];
extern u8 gUnknown_80E8B40[];
extern u8 gUnknown_80E8B2C[];
extern u8 *gUnknown_80EB220[];
extern u8 gRewardText[];
extern u8 *gMissionRewardText[];
extern u8 gUnknown_80E8B7C[];
extern u8 *gUnknown_80EB2F0[];
extern u8 gUnknown_80E89FC[];
extern u8 gUnknown_80E8A40[];
extern u8 gUnknown_80E8A7C[];
extern u8 *gUnknown_80E8DE4[];
extern u8 *gUnknown_80E8FB0[];
extern u8 *gUnknown_80E91D4[];
extern u8 *gUnknown_80E9820[10];
extern u8 *gUnknown_80EAEB8[];
extern u8 gSpecialMissionText[];
extern u8 *gUnknown_80EB198[];
extern u8 *gUnknown_80EB3F8[];
extern u8 *gUnknown_80EB72C[22];
extern u8 gUnknown_80E8AC8[];
extern u8 gUnknown_80E8884[];
extern u8 gMankeyMission[];
extern u8 gSmeargleMission[];
extern u8 gMedichamMission[];
extern u8 gUnknown_80E8830[];
extern u8 gUnknown_80E8848[];
extern u8 gUnknown_80E885C[];
extern u8 gUnknown_80E8AC8[];
extern u8 *gUnknown_80E910C[];
extern u8 *gUnknown_80E8C98[];
extern u8 gUnknown_80E886C[];
extern u8 *gUnknown_80EAE5C[];
extern struct unkStruct_80E9F8C gUnknown_80E9F8C[10];
extern struct unkStruct_80E9920 gUnknown_80E9920[10];
extern u8 *gUnknown_80E8B94[];
extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern struct PokemonStruct *sub_808D378(void);
extern bool8 sub_803C0DC(s16);
s32 sub_8016028(void);
extern void PrintDungeonLocationtoBuffer(u8 *, void *);
extern void PrintYellowDungeonNametoBuffer(u8 *, void *);
extern u8 sub_803C1D0(struct WonderMailSub *, u8);
extern u8 *sub_803C1F0(u8);
void sub_803D414(u8 *, u8 *);
void sub_803B6B0(s32 x, s32 y, u8 index, u32 param_4)
{
xxx_call_draw_string(x,y,gUnknown_80E8B94[index],param_4,0);
}
void CreateRescueTitle(struct unkStruct_802C39C *param_1)
{
char buf_1 [200];
char buf_2 [20];
char buf_3 [100];
u8 *monName;
u8 uVar1;
sub_803B6B0(10,param_1->y,param_1->unk43,param_1->unk0[0]);
switch(param_1->mailTitleType) {
case 3:
xxx_call_draw_string(0x15,param_1->y,param_1->unk4C,param_1->unk0[0],0);
break;
case 0:
xxx_call_draw_string(0x15,param_1->y,gMankeyMission,param_1->unk0[0],0);
break;
case 1:
xxx_call_draw_string(0x15,param_1->y,gSmeargleMission,param_1->unk0[0],0);
break;
case 2:
xxx_call_draw_string(0x15,param_1->y,gMedichamMission,param_1->unk0[0],0);
break;
case 7:
PrintYellowDungeonNametoBuffer(buf_1, param_1->unk8);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
case 12:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8830,gUnknown_202DE58);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
case 11:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8848,gUnknown_202DE58);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
case 4:
xxx_call_draw_string(0x15,param_1->y,gUnknown_80E885C,param_1->unk0[0],0);
break;
case 5:
xxx_call_draw_string(0x15,param_1->y,gUnknown_80E9F8C[param_1->unk0[1]].text1,param_1->unk0[0],0);
break;
case 6:
xxx_call_draw_string(0x15,param_1->y,gUnknown_80E886C,param_1->unk0[0],0);
break;
case 10: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80EAE5C[(bVar2 & 3)],gAvailablePokemonNames);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
}
case 9: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E910C[(bVar2 % 0xA)],gAvailablePokemonNames);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
}
default: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E8C98[(bVar2 % 0xf)],gAvailablePokemonNames);
xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0);
break;
}
}
if (param_1->mailTitleType == 7) {
if (param_1->playerName == NULL) {
xxx_call_draw_string(0xb2 - sub_8016028(),param_1->y,GetMonSpecies(param_1->clientSpecies),param_1->unk0[0],0);
}
else {
sub_80922B4(buf_2,param_1->playerName,POKEMON_NAME_LENGTH);
xxx_call_draw_string(0xb2 - sub_8016028(),param_1->y,buf_2,param_1->unk0[0],0);
}
}
else {
if (param_1->mailMissionType == MISSION_TYPE_FIND_ITEM) {
PrintDungeonLocationtoBuffer(buf_3, param_1->unk8);
sprintfStatic(buf_1,gUnknown_80E8884,buf_3); // Near %s
}
else {
PrintDungeonLocationtoBuffer(buf_1, param_1->unk8);
}
xxx_call_draw_string(0x1d,param_1->y + 0xc,buf_1,param_1->unk0[0],0);
}
if (param_1->mailTitleType == 7) {
uVar1 = sub_803C1D0(param_1->unk8,0);
}
else {
uVar1 = sub_803C1D0(param_1->unk8,param_1->unk50[1][1]);
}
xxx_call_draw_string(0xb4,param_1->y,sub_803C1F0(uVar1),param_1->unk0[0],0);
}
void CreateRescueDescription(struct unkStruct_802C39C *param_1)
{
u8 uVar3;
int x;
int counter;
u32 color;
s32 y;
char buf_1 [300];
char buf_2 [40];
char buf_3 [20];
char buf_4 [20];
char buf_5 [100];
u8 local_34 [24];
u8 *monName;
y = 0;
xxx_call_draw_string(10,y,gUnknown_80E888C,param_1->unk0[0],0);
xxx_call_draw_string(0x6c,y,gUnknown_80E8BCC[param_1->mailStatus],param_1->unk0[0],0);
y += 0x10;
switch(param_1->mailDescriptionType) {
case 3:
xxx_call_draw_string(10,y,param_1->unk50[0],param_1->unk0[0],0);
break;
case 0:
xxx_call_draw_string(10,y,gMankeyMissionDescription,param_1->unk0[0],0);
break;
case 1:
xxx_call_draw_string(10,y,gSmeargleMissionDescription,param_1->unk0[0],0);
break;
case 2:
xxx_call_draw_string(10,y,gMedichamMissionDescription,param_1->unk0[0],0);
break;
case 4:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8968,gUnknown_202DE58);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
break;
case 5:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E89B0,gUnknown_202DE58);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
break;
case 6:
xxx_call_draw_string(10,y,gUnknown_80E9920[param_1->unk0[1]].text,param_1->unk0[0],0);
break;
case 7:
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E9F8C[param_1->unk0[1]].text2,gAvailablePokemonNames,gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
break;
case 9:
xxx_call_draw_string(10,y,gUnknown_80E89FC,param_1->unk0[0],0); // This is a rescue through communication. Get a friend to help you!
break;
case 10:
xxx_call_draw_string(10,y,gUnknown_80E8A40,param_1->unk0[0],0); // This is a rescue through communication. Rescue a friend!
break;
case 11:
xxx_call_draw_string(10,y,gUnknown_80E8A7C,param_1->unk0[0],0); // This is a rescue through communication. Send your thanks to a friend!
break;
case 15:
case 16: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80EB3F8[(bVar2 % 0x16)],gUnknown_202DE58);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,gUnknown_80EB72C[(bVar3 % 0x16)],gUnknown_202DE58);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
case 14: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80EAEB8[(bVar2 % 0x14)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,(gUnknown_80EB198)[(bVar3 & 3)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
case 8: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80EB220[(bVar2 % 6)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,gUnknown_80EB2F0[(bVar3 % 0x6)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
case 13: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E91D4[(bVar2 % 0x2d)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,gUnknown_80E9820[(bVar3 % 10)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
default: {
u8 bVar2 = param_1->unk8->seed + param_1->unk8->dungeon.id;
u8 bVar3 = param_1->unk8->seed + param_1->unk8->dungeon.floor;
monName = GetMonSpecies(param_1->clientSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E8DE4[(bVar2 % 0xd)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y += 0xC;
sprintfStatic(buf_1,gUnknown_80E8FB0[(bVar3 % 0xd)],gAvailablePokemonNames);
xxx_call_draw_string(10,y,buf_1,param_1->unk0[0],0);
y -= 0xC;
break;
}
}
y += 0x1C;
xxx_call_draw_string(10,y,gUnknown_80E8AC8,param_1->unk0[0],0);
if (param_1->playerName == NULL) {
xxx_call_draw_string(0x44,y,GetMonSpecies(param_1->clientSpecies),param_1->unk0[0],0);
}
else {
sub_80922B4(buf_3,param_1->playerName,POKEMON_NAME_LENGTH);
sub_808D930(buf_4,param_1->clientSpecies);
sprintfStatic(buf_2,gUnknown_80E8AD0,buf_3,buf_4);
xxx_call_draw_string(0x44,y,buf_2,param_1->unk0[0],0);
}
y += 0xC;
xxx_call_draw_string(10,y,gUnknown_80E8AE0,param_1->unk0[0],0);
switch(param_1->mailMissionType) {
case MISSION_TYPE_FRIEND_RESCUE:
xxx_call_draw_string(0x44,y,gUnknown_80E8AEC,param_1->unk0[0],0); // Friend Rescue
break;
case MISSION_TYPE_DELIVER_ITEM:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8AFC,gUnknown_202DE58); // Deliver #C4%s#R.
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case MISSION_TYPE_FIND_ITEM:
sub_8090DC4(gUnknown_202DE58,param_1->targetItem,0);
sprintfStatic(buf_1,gUnknown_80E8B10,gUnknown_202DE58); // Find #C4%s#R.
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case MISSION_TYPE_RESCUE_CLIENT:
xxx_call_draw_string(0x44,y,gUnknown_80E8B20,param_1->unk0[0],0); // Help me.
break;
case MISSION_TYPE_ESCORT_CLIENT:
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E8B2C,gAvailablePokemonNames); // Escort to #C6%s#R.
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case MISSION_TYPE_RESCUE_TARGET:
monName = GetMonSpecies(param_1->targetSpecies);
strcpy(gAvailablePokemonNames,monName);
sprintfStatic(buf_1,gUnknown_80E8B40,gAvailablePokemonNames);
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case MISSION_TYPE_SPECIAL_MISSION:
default:
xxx_call_draw_string(0x44,y,gSpecialMissionText,param_1->unk0[0],0);
break;
}
y += 0xC;
xxx_call_draw_string(10,y,gPlaceText,param_1->unk0[0],0);
// NOTE: check with TRUE is needed to match
if (param_1->mailMissionType == MISSION_TYPE_FIND_ITEM) {
PrintDungeonLocationtoBuffer(buf_5,param_1->unk8);
sprintfStatic(buf_1,gUnknown_80E8884,buf_5); // Near %s
}
else {
PrintDungeonLocationtoBuffer(buf_1,param_1->unk8);
}
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
if (param_1->mailMissionType == MISSION_TYPE_FRIEND_RESCUE) {
uVar3 = sub_803C1D0(param_1->unk8, 0);
}
else {
uVar3 = sub_803C1D0(param_1->unk8,param_1->unk50[1][1]);
}
y += 0xC;
xxx_call_draw_string(10,y,gDifficultyText,param_1->unk0[0],0);
xxx_call_draw_string(0x44,y,sub_803C1F0(uVar3),param_1->unk0[0],0);
y += 0xC;
xxx_call_draw_string(10,y,gRewardText,param_1->unk0[0],0);
switch(param_1->rewardType) {
case 0:
sprintfStatic(buf_1,gMissionRewardText[param_1->rewardType],param_1->unk30);
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case 1:
sprintfStatic(buf_1,gMissionRewardText[param_1->rewardType],param_1->unk30);
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case 2: // Item
case 3: // Item + ?
sub_8090DC4(gUnknown_202DE58,param_1->rewardItem,0);
sprintfStatic(buf_1,gMissionRewardText[param_1->rewardType],gUnknown_202DE58);
xxx_call_draw_string(0x44,y,buf_1,param_1->unk0[0],0);
break;
case 4: // Friend Area
xxx_call_draw_string(0x44,y,gMissionRewardText[param_1->rewardType],param_1->unk0[0],0);
break;
default:
xxx_call_draw_string(0x44,y,gMissionRewardText[param_1->rewardType],param_1->unk0[0],0);
break;
}
// Draw the Password
y += 0xC;
if (((2 < (u8)(param_1->mailDescriptionType - 9)) && (param_1->mailDescriptionType != 3)) && (*param_1->unk50[1] == 5))
{
xxx_call_draw_string(10,y,gUnknown_80E8B7C,param_1->unk0[0],0); // Wonder Mail:
sub_803D414(local_34,param_1->unk50[1]);
for(counter = 0; counter < 24; counter++)
{
if (counter == 12) {
y += 12;
}
color = 7;
if (((3 < counter) && (color = 6, 7 < counter)) && ((color = 7)))
{
if(counter > 15)
{
if(counter < 20)
{
color = 6;
}
}
}
x = counter % 12;
sub_8012C60(x * 10 + 0x54,y,local_34[counter],color,param_1->unk0[0]);
}
}
}
bool8 sub_803C0DC(s16 species)
{
s32 baseSpecies;
s32 index;
baseSpecies = GetBaseSpecies(species);
index = 0;
if (gUnknown_80E80E0[index] != MONSTER_NONE)
{
while(gUnknown_80E80E0[index] != MONSTER_NONE) {
if (gUnknown_80E80E0[index] == baseSpecies) {
return FALSE;
}
index++;
}
}
return TRUE;
}
bool8 sub_803C110(s16 index)
{

View File

@ -296,15 +296,15 @@ void sub_809542C(struct unkStruct_809542C *param_1)
gUnknown_203B480->mailType = 1;
preload = gUnknown_203B480;
uVar4 = param_1->unk4;
preload->dungeon = param_1->unk0;
preload->unk8 = uVar4;
preload->unk4.dungeon = param_1->unk0;
preload->unk4.seed = uVar4;
sub_8094D28(Rand32Bit());
gUnknown_203B480->unk10.unk10 = sub_8094E4C();
gUnknown_203B480->clientSpecies = GetPlayerPokemonStruct()->speciesNum;
PrintPokeNameToBuffer(buffer, GetPlayerPokemonStruct());
CopyStringtoBuffer(gUnknown_203B480->playerName, buffer);
gUnknown_203B480->unk24 = sub_8011C34();
gUnknown_203B480->rescuesAllowed = GetRescuesAllowed(gUnknown_203B480->dungeon.id);
gUnknown_203B480->rescuesAllowed = GetRescuesAllowed(gUnknown_203B480->unk4.dungeon.id);
}
void sub_8095494(struct unkStruct_809542C *param_1, u8 index)
@ -316,8 +316,8 @@ void sub_8095494(struct unkStruct_809542C *param_1, u8 index)
mail = gUnknown_203B480;
mail += index;
temp = mail->dungeon;
uVar1 = mail->unk8;
temp = mail->unk4.dungeon;
uVar1 = mail->unk4.seed;
param_1->unk0 = temp;
param_1->unk4 = uVar1;
}
@ -420,8 +420,8 @@ void sub_8095774(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b)
u8 temp;
RestoreIntegerBits(a, &b->mailType, 4);
RestoreDungeonLocation(a, &b->dungeon);
RestoreIntegerBits(a, &b->unk8, 0x18);
RestoreDungeonLocation(a, &b->unk4.dungeon);
RestoreIntegerBits(a, &b->unk4.seed, 0x18);
RestoreIntegerBits(a, &b->clientSpecies, 0x9);
RestoreIntegerBits(a, &b->unk10.unk10, 0x20);
RestoreIntegerBits(a, &b->playerName, 0x50);
@ -445,8 +445,8 @@ void sub_8095824(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b)
zero = 0;
SaveIntegerBits(a, &b->mailType, 4);
SaveDungeonLocation(a, &b->dungeon);
SaveIntegerBits(a, &b->unk8, 0x18);
SaveDungeonLocation(a, &b->unk4.dungeon);
SaveIntegerBits(a, &b->unk4.seed, 0x18);
SaveIntegerBits(a, &b->clientSpecies, 0x9);
SaveIntegerBits(a, &b->unk10.unk10, 0x20);
SaveIntegerBits(a, &b->playerName, 0x50);

View File

@ -58,7 +58,7 @@ void InitializeMailJobsNews(void)
{
gUnknown_203B490->unk230[index].dungeon.id = 99;
gUnknown_203B490->unk230[index].dungeon.floor = 1;
gUnknown_203B490->unk230[index].unk4 = 0;
gUnknown_203B490->unk230[index].seed = 0;
gUnknown_203B490->unk230[index].unk8 = 0;
}
}
@ -85,17 +85,17 @@ bool8 ValidateWonderMail(struct WonderMail *data)
return FALSE;
else
{
if(data->missionType == WONDER_MAIL_MISSION_TYPE_DELIVER_ITEM && GetMaxItemsAllowed(data->dungeon.id) == 0)
if(data->missionType == WONDER_MAIL_MISSION_TYPE_DELIVER_ITEM && GetMaxItemsAllowed(data->unk4.dungeon.id) == 0)
return FALSE;
if(data->unk2 > 9)
return FALSE;
if(sub_809095C(data->dungeon.id))
if(sub_809095C(data->unk4.dungeon.id))
return FALSE;
if(data->dungeon.floor >= GetDungeonFloorCount(data->dungeon.id))
if(data->unk4.dungeon.floor >= GetDungeonFloorCount(data->unk4.dungeon.id))
return FALSE;
if(sub_809017C(&data->dungeon))
if(sub_809017C(&data->unk4.dungeon))
return FALSE;
if(data->clientSpecies == MONSTER_NONE)
@ -127,7 +127,7 @@ bool8 ValidateWonderMail(struct WonderMail *data)
return FALSE;
// Item finding
if(data->missionType == WONDER_MAIL_MISSION_TYPE_FIND_ITEM && xxx_bit_lut_lookup_8091E50(data->dungeon.id, data->targetItem) == 0)
if(data->missionType == WONDER_MAIL_MISSION_TYPE_FIND_ITEM && xxx_bit_lut_lookup_8091E50(data->unk4.dungeon.id, data->targetItem) == 0)
return FALSE;
if(data->rewardType == BLANK_4 || data->rewardType == END_REWARDS || data->rewardType > END_REWARDS)
@ -144,7 +144,7 @@ bool8 ValidateWonderMail(struct WonderMail *data)
{
if(GetFriendAreaUnlockCondition(data->friendAreaReward) != UNLOCK_WONDER_MAIL)
return FALSE;
if(sub_803C1D0(&data->dungeon, data->missionType) == 0)
if(sub_803C1D0(&data->unk4.dungeon, data->missionType) == 0)
return FALSE;
}
return TRUE;

View File

@ -42,8 +42,8 @@ void SortPelipperJobs(void)
{
if(gUnknown_203B490->pelipperBoardJobs[index2].mailType != MAIL_TYPE_NONE)
{
if((gUnknown_203B490->pelipperBoardJobs[index1].dungeon.id > gUnknown_203B490->pelipperBoardJobs[index2].dungeon.id) ||
((gUnknown_203B490->pelipperBoardJobs[index1].dungeon.id == gUnknown_203B490->pelipperBoardJobs[index2].dungeon.id) && (gUnknown_203B490->pelipperBoardJobs[index1].dungeon.floor > gUnknown_203B490->pelipperBoardJobs[index2].dungeon.floor)))
if((gUnknown_203B490->pelipperBoardJobs[index1].unk4.dungeon.id > gUnknown_203B490->pelipperBoardJobs[index2].unk4.dungeon.id) ||
((gUnknown_203B490->pelipperBoardJobs[index1].unk4.dungeon.id == gUnknown_203B490->pelipperBoardJobs[index2].unk4.dungeon.id) && (gUnknown_203B490->pelipperBoardJobs[index1].unk4.dungeon.floor > gUnknown_203B490->pelipperBoardJobs[index2].unk4.dungeon.floor)))
{
mail = gUnknown_203B490->pelipperBoardJobs[index1];
gUnknown_203B490->pelipperBoardJobs[index1] = gUnknown_203B490->pelipperBoardJobs[index2];
@ -72,9 +72,9 @@ void GeneratePelipperJobs(void)
mail->mailType = MAIL_TYPE_UNK2;
mail->missionType = WONDER_MAIL_MISSION_TYPE_UNK6;
mail->unk2 = 1;
mail->dungeon.id = DUNGEON_UPROAR_FOREST;
mail->dungeon.floor = 10;
mail->unk8 = Rand32Bit() & 0xffffff;
mail->unk4.dungeon.id = DUNGEON_UPROAR_FOREST;
mail->unk4.dungeon.floor = 10;
mail->unk4.seed = Rand32Bit() & 0xffffff;
mail->clientSpecies = MONSTER_WYNAUT;
mail->targetSpecies = MONSTER_MANKEY;
mail->targetItem = 0;
@ -90,9 +90,9 @@ void GeneratePelipperJobs(void)
mail->mailType = MAIL_TYPE_UNK3;
mail->missionType = WONDER_MAIL_MISSION_TYPE_UNK6;
mail->unk2 = 2;
mail->dungeon.id = DUNGEON_HOWLING_FOREST;
mail->dungeon.floor = 15;
mail->unk8 = Rand32Bit() & 0xffffff;
mail->unk4.dungeon.id = DUNGEON_HOWLING_FOREST;
mail->unk4.dungeon.floor = 15;
mail->unk4.seed = Rand32Bit() & 0xffffff;
mail->clientSpecies = MONSTER_SMEARGLE;
mail->targetSpecies = MONSTER_SMEARGLE;
mail->targetItem = 0;
@ -107,9 +107,9 @@ void GeneratePelipperJobs(void)
mail->mailType = MAIL_TYPE_UNK4;
mail->missionType = WONDER_MAIL_MISSION_TYPE_UNK6;
mail->unk2 = 3;
mail->dungeon.id = DUNGEON_WISH_CAVE;
mail->dungeon.floor = 20;
mail->unk8 = Rand32Bit() & 0xffffff;
mail->unk4.dungeon.id = DUNGEON_WISH_CAVE;
mail->unk4.dungeon.floor = 20;
mail->unk4.seed = Rand32Bit() & 0xffffff;
mail->clientSpecies = MONSTER_MEDICHAM;
mail->targetSpecies = MONSTER_MEDICHAM;
mail->targetItem = 0;
@ -136,9 +136,9 @@ bool8 IsMailinJobSlot(struct WonderMail *mail)
if(jobSlot->mailType != MAIL_TYPE_NONE)
if(mail->missionType == jobSlot->missionType)
if(mail->unk2 == jobSlot->unk2)
if(mail->dungeon.id == jobSlot->dungeon.id)
if(mail->dungeon.floor == jobSlot->dungeon.floor)
if(mail->unk8 == jobSlot->unk8)
if(mail->unk4.dungeon.id == jobSlot->unk4.dungeon.id)
if(mail->unk4.dungeon.floor == jobSlot->unk4.dungeon.floor)
if(mail->unk4.seed == jobSlot->unk4.seed)
if(mail->clientSpecies == jobSlot->clientSpecies)
if(mail->targetSpecies == jobSlot->targetSpecies)
if(mail->targetItem == jobSlot->targetItem)
@ -157,8 +157,8 @@ bool8 sub_809693C(struct WonderMail *mail)
bool8 escortMission;
s32 index;
dungeonIndex = mail->dungeon.id;
floor = mail->dungeon.floor;
dungeonIndex = mail->unk4.dungeon.id;
floor = mail->unk4.dungeon.floor;
escortMission = FALSE;
if (!IsValidWonderMail(mail)) {
return FALSE;
@ -204,7 +204,7 @@ s32 CountJobsinDungeon(u8 dungeon)
for(index = 0; index < MAX_ACCEPTED_JOBS; index++)
{
mail = GetJobSlotInfo(index);
if ((mail->dungeon.id == dungeon) &&
if ((mail->unk4.dungeon.id == dungeon) &&
(((mail->mailType == MAIL_TYPE_TAKEN_JOB || (mail->mailType == MAIL_TYPE_UNK8)) || (mail->mailType == MAIL_TYPE_UNK9)))) {
count++;
}
@ -222,7 +222,7 @@ bool8 sub_8096A08(u8 dungeon, u8 *param_2)
for(index = 0; index < MAX_ACCEPTED_JOBS; index++)
{
mail = GetJobSlotInfo(index);
if(mail->dungeon.id == dungeon)
if(mail->unk4.dungeon.id == dungeon)
if(mail->mailType == MAIL_TYPE_TAKEN_JOB)
if(mail->missionType == WONDER_MAIL_MISSION_TYPE_ESCORT_CLIENT)
{
@ -281,7 +281,7 @@ void sub_8096AF8(struct unkStruct_8096AF8 *param_1, u8 slotIndex,u8 dungeon)
param_1->unk0 = FALSE;
param_1->clientSpecies = jobSlot->clientSpecies;
param_1->targetSpecies = MONSTER_NONE;
if (jobSlot->dungeon.id == dungeon) {
if (jobSlot->unk4.dungeon.id == dungeon) {
switch(jobSlot->missionType) {
case WONDER_MAIL_MISSION_TYPE_FIND_ITEM:
if (jobSlot->mailType == MAIL_TYPE_TAKEN_JOB) {
@ -322,7 +322,7 @@ s16 sub_8096B98(u8 dungeon)
mail = GetJobSlotInfo(index);
if(mail->mailType == MAIL_TYPE_TAKEN_JOB)
if(mail->missionType == WONDER_MAIL_MISSION_TYPE_ESCORT_CLIENT)
if(mail->dungeon.id == dungeon)
if(mail->unk4.dungeon.id == dungeon)
return mail->targetSpecies;
}
return 0;
@ -368,7 +368,7 @@ bool8 sub_8096C08(u8 *jobIndex)
void ResetJobSlot(u8 index)
{
gUnknown_203B490->jobSlots[index].mailType = MAIL_TYPE_NONE;
gUnknown_203B490->jobSlots[index].dungeon.id = 99;
gUnknown_203B490->jobSlots[index].dungeon.floor = 0;
gUnknown_203B490->jobSlots[index].unk4.dungeon.id = 99;
gUnknown_203B490->jobSlots[index].unk4.dungeon.floor = 0;
gUnknown_203B490->jobSlots[index].rewardType = MONEY1;
}

View File

@ -72,8 +72,8 @@ bool8 GenerateMailJobDungeonInfo(struct WonderMail *mail)
}
if (flag) {
mail->dungeon.id = dungeon;
mail->dungeon.floor = floor;
mail->unk4.dungeon.id = dungeon;
mail->unk4.dungeon.floor = floor;
return TRUE;
}
floor++;
@ -96,11 +96,11 @@ bool8 sub_8095E38(struct 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->dungeon.id == dungeon) {
if (mail->unk4.dungeon.id == dungeon) {
return TRUE;
}
}
else if ((mail->dungeon.id == dungeon) && (mail->dungeon.floor == floor)) {
else if ((mail->unk4.dungeon.id == dungeon) && (mail->unk4.dungeon.floor == floor)) {
return TRUE;
}
}

View File

@ -49,9 +49,9 @@ bool8 sub_8096F50(struct WonderMail *mail)
for(index = 0; index < 0x10; index++)
{
temp = &gUnknown_203B490->unk230[index];
if(temp->dungeon.id == mail->dungeon.id)
if(temp->dungeon.floor == mail->dungeon.floor)
if(temp->unk4 == mail->unk8)
if(temp->dungeon.id == mail->unk4.dungeon.id)
if(temp->dungeon.floor == mail->unk4.dungeon.floor)
if(temp->seed == mail->unk4.seed)
if(temp->unk8 == temp2)
return TRUE;
}
@ -96,7 +96,7 @@ u32 RestoreMailInfo(u8 *r0, u32 size)
for(index = 0; index < 0x10; index++)
{
RestoreIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk8, 0x20);
RestoreIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk4, 0x18);
RestoreIntegerBits(&backup, &gUnknown_203B490->unk230[index].seed, 0x18);
RestoreDungeonLocation(&backup, &gUnknown_203B490->unk230[index].dungeon);
}
nullsub_102(&backup);
@ -140,7 +140,7 @@ u32 SaveMailInfo(u8 *r0, u32 size)
for(index = 0; index < 0x10; index++)
{
SaveIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk8, 0x20);
SaveIntegerBits(&backup, &gUnknown_203B490->unk230[index].unk4, 0x18);
SaveIntegerBits(&backup, &gUnknown_203B490->unk230[index].seed, 0x18);
SaveDungeonLocation(&backup, &gUnknown_203B490->unk230[index].dungeon);
}
nullsub_102(&backup);
@ -158,8 +158,8 @@ void RestoreWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b)
RestoreIntegerBits(a, &b->rewardType, 4);
RestoreIntegerBits(a, &b->itemReward, 8);
RestoreIntegerBits(a, &b->friendAreaReward, 6);
RestoreIntegerBits(a, &b->unk8, 0x18);
RestoreDungeonLocation(a, &b->dungeon);
RestoreIntegerBits(a, &b->unk4.seed, 0x18);
RestoreDungeonLocation(a, &b->unk4.dungeon);
}
void SaveWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b)
@ -173,8 +173,8 @@ void SaveWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b)
SaveIntegerBits(a, &b->rewardType, 4);
SaveIntegerBits(a, &b->itemReward, 8);
SaveIntegerBits(a, &b->friendAreaReward, 6);
SaveIntegerBits(a, &b->unk8, 0x18);
SaveDungeonLocation(a, &b->dungeon);
SaveIntegerBits(a, &b->unk4.seed, 0x18);
SaveDungeonLocation(a, &b->unk4.dungeon);
}
void sub_80972F4(void)

View File

@ -1,4 +1,5 @@
#include "global.h"
#include "constants/dungeon.h"
#include "memory.h"
#include "text1.h"
#include "text2.h"
@ -12,6 +13,7 @@
#include "code_80130A8.h"
#include "code_801EE10_1.h"
#include "code_801B3C0.h"
#include "event_flag.h"
extern struct unkStruct_203B2BC *gUnknown_203B2BC;
@ -42,6 +44,33 @@ extern void sub_8027CA0();
extern void sub_8027D00();
extern void CreateFriendActionMenu();
extern void sub_80276A8();
bool8 sub_8027D9C(struct PokemonStruct *pokeStruct);
extern u8 sub_8027DCC(struct PokemonStruct *);
extern u32 sub_801EF38(u8 r0);
extern void sub_801F214();
extern void PlaySound(u32);
extern void nullsub_104();
extern void sub_8099690(u32);
extern void sub_808D31C(struct PokemonStruct *);
extern struct PokemonStruct *sub_808D3F8(void);
extern struct PokemonStruct *sub_808D3BC(void);
extern u32 sub_801F890(void);
extern void sub_801F8D0(void);
extern u8 gUnknown_202DE58[];
extern u32 sub_801F194(void);
extern u32 sub_801BF48(void);
extern void sub_801BF98(void);
extern u32 sub_80244E4(void);
extern void sub_802453C(void);
extern bool8 sub_808D750(s16 index_);
extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern void sub_808ED00(void);
u32 sub_8027E18(struct PokemonStruct *);
u8 sub_8027E4C(struct PokemonStruct *r0);
void sub_8027EB8(void);
const struct UnkTextStruct2 gUnknown_80DD6EC =
{
@ -132,25 +161,25 @@ u32 sub_80270A4(void)
{
switch(gUnknown_203B2BC->state) {
case FRIEND_AREA_ACTION_MENU_INIT:
SetFriendAreaActionMenuState(1);
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN);
break;
case 1:
case 2:
case FRIEND_AREA_ACTION_MENU_MAIN:
case FRIEND_AREA_ACTION_MENU_MAIN_2:
sub_80277FC();
break;
case 3:
sub_80278B4();
break;
case 4:
case FRIEND_AREA_ACTION_MENU_SUMMARY:
sub_8027A40();
break;
case 5:
case FRIEND_AREA_ACTION_MENU_CHECK_IQ:
sub_8027A5C();
break;
case 8:
case FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_PROMPT:
sub_8027A78();
break;
case 9:
case FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_CONFIRM:
sub_8027AE4();
break;
case 10:
@ -232,10 +261,10 @@ void sub_8027274(void)
case FRIEND_AREA_ACTION_MENU_INIT:
case FRIEND_AREA_ACTION_MENU_EXIT:
break;
case 1:
case FRIEND_AREA_ACTION_MENU_MAIN:
sub_8023868(1,0,0,7);
break;
case 2:
case FRIEND_AREA_ACTION_MENU_MAIN_2:
sub_8023B7C(1);
break;
case 3:
@ -243,10 +272,10 @@ void sub_8027274(void)
sub_8023DA4();
sub_8012D60(&gUnknown_203B2BC->unk7C,gUnknown_203B2BC->menuItems,0,gUnknown_203B2BC->unk16C,gUnknown_203B2BC->menuAction1,2);
break;
case 4:
case FRIEND_AREA_ACTION_MENU_SUMMARY:
sub_8024458(gUnknown_203B2BC->targetPoke,2);
break;
case 5:
case FRIEND_AREA_ACTION_MENU_CHECK_IQ:
sub_801BEEC(gUnknown_203B2BC->targetPoke);
break;
case 10:
@ -270,11 +299,11 @@ void sub_8027274(void)
case 0xf:
sub_801F1B0(1,0);
break;
case 8:
case FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_PROMPT:
sub_8027794();
sub_8014248(gFriendAreaActionSayFarewellPrompt,0,3,gUnknown_203B2BC->menuItems,0,4,0,0,0x101);
break;
case 9:
case FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_CONFIRM:
sub_8027794();
sub_8014248(gFriendAreaActionSayFarewellConfirm,0,3,gUnknown_203B2BC->menuItems,0,4,0,0,0x101);
break;
@ -283,16 +312,609 @@ void sub_8027274(void)
sub_801F808(gUnknown_203B2BC->moveIDs);
break;
case 6:
gUnknown_203B2BC->fallbackState = 2;
gUnknown_203B2BC->fallbackState = FRIEND_AREA_ACTION_MENU_MAIN_2;
// The {COLOR_1 GREEN}{ARG_MOVE_ITEM_0}{END_COLOR_TEXT_1} was
// returned to the Toolbox
sub_80141B4(gUnknown_80DD8A0,0,0,0x101);
break;
case 7:
gUnknown_203B2BC->fallbackState = 2;
gUnknown_203B2BC->fallbackState = FRIEND_AREA_ACTION_MENU_MAIN_2;
// The {COLOR_1 GREEN}{ARG_MOVE_ITEM_0}{END_COLOR_TEXT_1} was
// returned to storage
sub_80141B4(gUnknown_80DD8D0,0,0,0x101);
break;
}
}
extern u8 gFriendActionStandby[];
extern u8 gFriendActionMakeLeader[];
extern u8 gFriendActionJoinTeam[];
extern u8 gFriendActionSayFarewell[];
extern u8 gFriendActionGive[];
extern u8 gFriendActionTake[];
extern u8 gFriendActionSummary[];
extern u8 gFriendActionMoves[];
extern u8 gFriendActionCheckIQ[];
extern u8 *gUnknown_80D4920[];
extern u8 *gUnknown_80D4928[];
extern u8 *gUnknown_80D4970[];
extern u8 gUnknown_80DD958[];
void CreateFriendActionMenu(void)
{
int index;
s32 loopMax;
struct PokemonStruct *pokeStruct;
loopMax = 0;
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
if((pokeStruct->unk0 >> 1) % 2)
{
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionStandby;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_STANDBY;
if(!sub_8027D9C(pokeStruct))
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
if(sub_80023E4(8) && !pokeStruct->isTeamLeader)
{
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionMakeLeader;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_MAKE_LEADER;
loopMax += 1;
}
}
else
{
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionJoinTeam;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_JOIN_TEAM;
if(!sub_808D750(gUnknown_203B2BC->targetPoke))
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionSayFarewell;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_SAY_FAREWELL;
if(!sub_8027DCC(pokeStruct))
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
}
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionGive;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_GIVE;
if(GetNumberOfFilledInventorySlots() == 0)
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionTake;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_TAKE;
if(GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE || gUnknown_203B2BC->item2.id == ITEM_NOTHING)
{
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionSummary;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_SUMMARY;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionMoves;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_MOVES;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionCheckIQ;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_CHECK_IQ;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = 0;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_NONE;
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
if(gUnknown_203B2BC->menuItems[index].menuAction == gUnknown_203B2BC->menuAction1)
return;
}
}
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
gUnknown_203B2BC->menuAction1 = gUnknown_203B2BC->menuItems[index].menuAction;
break;
}
}
}
void sub_80276A8(void)
{
int index;
s32 loopMax;
loopMax = 0;
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionGive;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_GIVE;
if (GetNumberOfFilledInventorySlots() == 0) {
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4970;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_INFO;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = 0;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_NONE;
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
if(gUnknown_203B2BC->menuItems[index].menuAction == gUnknown_203B2BC->menuAction2)
return;
}
}
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
gUnknown_203B2BC->menuAction2 = gUnknown_203B2BC->menuItems[index].menuAction;
break;
}
}
}
void sub_8027794(void)
{
s32 loopMax = 0;
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4920;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_YES;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4928;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_NO;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = NULL;
gUnknown_203B2BC->menuItems[loopMax].menuAction = FRIEND_AREA_ACTION_MENU_ACTION_NONE;
}
void sub_80277FC(void)
{
struct PokemonStruct *pokeStruct;
switch(sub_8023A94(TRUE)) {
case 0:
case 1:
break;
case 3:
gUnknown_203B2BC->targetPoke = sub_8023B44();
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
gUnknown_203B2BC->pokeStruct = pokeStruct;
gUnknown_203B2BC->isTeamLeader = pokeStruct->isTeamLeader;
PeekPokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(3);
break;
case 4:
gUnknown_203B2BC->targetPoke = sub_8023B44();
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
gUnknown_203B2BC->pokeStruct = pokeStruct;
gUnknown_203B2BC->isTeamLeader = pokeStruct->isTeamLeader;
PeekPokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(4);
break;
case 2:
sub_8023C60();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_EXIT);
break;
}
}
void sub_80278B4(void)
{
struct PokemonStruct *playerStruct;
struct PokemonStruct *pokeStruct1;
struct PokemonStruct *pokeStruct2;
u32 menuAction;
menuAction = 0;
sub_8023A94(FALSE);
if ((sub_8012FD8(&gUnknown_203B2BC->unk7C) == 0) && (sub_8013114(&gUnknown_203B2BC->unk7C,&menuAction), menuAction != FRIEND_AREA_ACTION_MENU_ACTION_NONE)) {
gUnknown_203B2BC->menuAction1 = menuAction;
}
switch(menuAction) {
case FRIEND_AREA_ACTION_MENU_ACTION_JOIN_TEAM:
if (sub_808D750(gUnknown_203B2BC->targetPoke)) {
#ifdef NONMATCHING
pokeStruct1 = &gRecruiedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
#else
register size_t offset asm("r1") = offsetof(struct unkStruct_203B45C, pokemon[gUnknown_203B2BC->targetPoke]);
struct PokemonStruct* p = gRecruitedPokemonRef->pokemon;
size_t addr = offset + (size_t)p;
pokeStruct1 = (struct PokemonStruct*)addr;
#endif
pokeStruct1->unk0 |= FLAG_ON_TEAM;
nullsub_104();
}
sub_808ED00();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_STANDBY:
gUnknown_203B2BC->pokeStruct->unk0 &= ~(FLAG_ON_TEAM);
nullsub_104();
sub_808ED00();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_MAKE_LEADER:
pokeStruct2 = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
playerStruct = GetPlayerPokemonStruct();
if (!pokeStruct2->isTeamLeader) {
playerStruct->isTeamLeader = FALSE;
pokeStruct2->isTeamLeader = TRUE;
nullsub_104();
}
sub_808ED00();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_SAY_FAREWELL:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_PROMPT);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_MOVES:
SetFriendAreaActionMenuState(0xe);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_GIVE:
SetFriendAreaActionMenuState(10);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_TAKE:
PlaySound(0x14d);
if (gUnknown_203B2BC->item2.id != ITEM_NOTHING) {
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
}
FillInventoryGaps();
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
nullsub_104();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_SUMMARY:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_SUMMARY);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_CHECK_IQ:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_CHECK_IQ);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_NONE:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
}
}
void sub_8027A40(void)
{
switch(sub_80244E4())
{
case 2:
case 3:
sub_802453C();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case 0:
case 1:
break;
}
}
void sub_8027A5C(void)
{
switch(sub_801BF48())
{
case 2:
case 3:
sub_801BF98();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case 0:
case 1:
break;
}
}
static inline bool8 sub_8027A78_sub(void) {
if (gUnknown_203B2BC->pokeStruct->dungeonLocation.id == DUNGEON_HOWLING_FOREST_2 || gUnknown_203B2BC->pokeStruct->dungeonLocation.id == DUNGEON_POKEMON_SQUARE)
return TRUE;
else
return FALSE;
}
void sub_8027A78(void)
{
s32 menuAction;
if(sub_80144A4(&menuAction) == 0)
{
switch(menuAction)
{
case FRIEND_AREA_ACTION_MENU_ACTION_NONE:
case FRIEND_AREA_ACTION_MENU_ACTION_NO:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_YES:
if (sub_8027A78_sub())
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_SAY_FAREWELL_CONFIRM);
else
{
sub_8027EB8();
sub_808D31C(gUnknown_203B2BC->pokeStruct);
}
break;
}
}
}
void sub_8027AE4(void)
{
s32 menuAction;
if (sub_80144A4(&menuAction) == 0) {
switch(menuAction)
{
case FRIEND_AREA_ACTION_MENU_ACTION_NONE:
case FRIEND_AREA_ACTION_MENU_ACTION_NO:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_YES:
sub_8027EB8();
sub_808D31C(gUnknown_203B2BC->pokeStruct);
break;
}
}
}
void sub_8027B28(void)
{
switch(sub_801A6E8(TRUE))
{
case 3:
gUnknown_203B2BC->id = sub_801A8AC();
gUnknown_203B2BC->itemToGive.id = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].id;
gUnknown_203B2BC->itemToGive.quantity = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].quantity;
SetFriendAreaActionMenuState(0xc);
break;
case 4:
gUnknown_203B2BC->id = sub_801A8AC();
gUnknown_203B2BC->itemToGive.id = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].id;
gUnknown_203B2BC->itemToGive.quantity = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].quantity;
sub_8099690(0);
SetFriendAreaActionMenuState(0xd);
break;
case 2:
sub_801A928();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case 0:
case 1:
break;
}
}
void sub_8027BD8(void)
{
s32 menuAction;
menuAction = 0;
sub_801A6E8(FALSE);
if ((sub_8012FD8(&gUnknown_203B2BC->unk7C) == 0) && (sub_8013114(&gUnknown_203B2BC->unk7C,&menuAction), menuAction != FRIEND_AREA_ACTION_MENU_ACTION_NONE)) {
gUnknown_203B2BC->menuAction2 = menuAction;
}
switch(menuAction)
{
case FRIEND_AREA_ACTION_MENU_ACTION_GIVE:
PlaySound(0x14d);
ShiftItemsDownFrom(gUnknown_203B2BC->id);
FillInventoryGaps();
if (gUnknown_203B2BC->item2.id != ITEM_NOTHING) {
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
}
GivePokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->itemToGive);
sub_801A928();
nullsub_104();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_INFO:
sub_8099690(0);
SetFriendAreaActionMenuState(0xd);
break;
case FRIEND_AREA_ACTION_MENU_ACTION_NONE:
SetFriendAreaActionMenuState(0xb);
break;
}
}
void sub_8027C84()
{
switch(sub_801B410())
{
case 2:
case 3:
sub_801B450();
SetFriendAreaActionMenuState(0xB);
case 0:
case 1:
break;
}
}
void sub_8027CA0(void)
{
switch(sub_801EF38(1))
{
case 3:
case 4:
gUnknown_203B2BC->moveIndex = sub_801F194();
gUnknown_203B2BC->moveID = gUnknown_203B2BC->moves[gUnknown_203B2BC->moveIndex].id;
SetFriendAreaActionMenuState(0x10);
break;
case 2:
sub_801F214();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
case 0:
case 1:
break;
}
}
void sub_8027D00(void)
{
switch(sub_801F890())
{
case 2:
case 3:
sub_801F8D0();
SetFriendAreaActionMenuState(0xF);
break;
case 0:
case 1:
break;
}
}
void FriendAreaActionMenu_GotoFallbackState(void)
{
s32 temp;
if(sub_80144A4(&temp) == 0)
{
SetFriendAreaActionMenuState(gUnknown_203B2BC->fallbackState);
}
}
void sub_8027D40(u32 r0, struct BulkItem *heldItem)
{
struct Item slot;
struct unkStruct_8090F58 a3;
sub_8008C54(r0);
sub_80073B8(r0);
HeldItemToSlot(&slot, heldItem);
a3.unk0 = 0;
a3.unk4 = 0;
a3.unk8 = 1;
slot.flags = ITEM_FLAG_EXISTS;
sub_8090E14(gUnknown_202DE58, &slot, &a3);
xxx_format_and_draw(4, 3, gUnknown_80DD958, r0, 0);
sub_80073E0(r0);
}
bool8 sub_8027D9C(struct PokemonStruct *pokeStruct)
{
u32 var1;
if(!pokeStruct->isTeamLeader)
{
var1 = 0;
if(pokeStruct->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER)
var1 = 1;
if(var1 != 0)
{
if(!sub_80023E4(8))
return FALSE;
}
}
else
return FALSE;
return TRUE;
}
bool8 sub_8027DCC(struct PokemonStruct *pokeStruct)
{
u32 var1;
if(sub_808D3BC() != pokeStruct)
if(sub_808D3F8() != pokeStruct)
if(!pokeStruct->isTeamLeader)
{
var1 = 0;
if(pokeStruct->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER)
var1 = 1;
if(var1 != 0)
{
if(sub_80023E4(8))
goto check;
}
else
{
check:
if(sub_8027E18(pokeStruct) != 3)
return TRUE;
}
}
return FALSE;
}
u32 sub_8027E18(struct PokemonStruct *pokeStruct)
{
if(pokeStruct->heldItem.id == ITEM_NOTHING)
return 0;
else if(GetNumberOfFilledInventorySlots() < INVENTORY_SIZE)
return 1;
else if(sub_8027E4C(pokeStruct))
return 2;
else
return 3;
}
bool8 sub_8027E4C(struct PokemonStruct *pokeStruct)
{
if(!IsNotMoneyOrUsedTMItem(pokeStruct->heldItem.id))
return FALSE;
else
{
if(IsThrowableItem(pokeStruct->heldItem.id))
{
if(gTeamInventoryRef->teamStorage[pokeStruct->heldItem.id] + pokeStruct->heldItem.quantity > 0x3e7)
return FALSE;
}
else if(gTeamInventoryRef->teamStorage[pokeStruct->heldItem.id] > 0x3e6)
{
return FALSE;
}
}
return TRUE;
}
void sub_8027EB8(void)
{
switch(sub_8027E18(gUnknown_203B2BC->pokeStruct))
{
case 1:
PlaySound(0x14d);
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
FillInventoryGaps();
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke, &gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(6);
break;
case 2:
PlaySound(0x14d);
if(IsThrowableItem(gUnknown_203B2BC->item2.id))
gTeamInventoryRef->teamStorage[gUnknown_203B2BC->item2.id] += gUnknown_203B2BC->item2.quantity;
else
gTeamInventoryRef->teamStorage[gUnknown_203B2BC->item2.id] += 1;
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke, &gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(7);
break;
case 0:
default:
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_MAIN_2);
break;
}
}

View File

@ -57,495 +57,3 @@ ALIGNED(4) const u8 gFriendActionCheckIQ[] = "Check IQ";
ALIGNED(4) const u8 gUnknown_80DD958[] = _("Item: {COLOR_1 GREEN}{ARG_MOVE_ITEM_0}{END_COLOR_TEXT_1} ");
static const u8 filler[] = "pksdir0";
extern u8 *gUnknown_80D4920[];
extern u8 *gUnknown_80D4928[];
extern u8 *gUnknown_80D4970[];
void sub_80276A8(void)
{
int index;
s32 loopMax;
loopMax = 0;
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
gUnknown_203B2BC->menuItems[loopMax].text = gFriendActionGive;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 10;
if (GetNumberOfFilledInventorySlots() == 0) {
gUnknown_203B2BC->unk16C[loopMax] = 1;
}
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4970;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 4;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = 0;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 1;
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
if(gUnknown_203B2BC->menuItems[index].menuAction == gUnknown_203B2BC->menuAction2)
return;
}
}
for(index = 0; index < loopMax; index++)
{
if(gUnknown_203B2BC->unk16C[index] == 0)
{
gUnknown_203B2BC->menuAction2 = gUnknown_203B2BC->menuItems[index].menuAction;
break;
}
}
}
void sub_8027794(void)
{
s32 loopMax = 0;
MemoryFill16(gUnknown_203B2BC->unk16C,0,sizeof(gUnknown_203B2BC->unk16C));
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4920;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 0x2;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = *gUnknown_80D4928;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 3;
loopMax += 1;
gUnknown_203B2BC->menuItems[loopMax].text = NULL;
gUnknown_203B2BC->menuItems[loopMax].menuAction = 1;
}
void sub_80277FC(void)
{
struct PokemonStruct *pokeStruct;
switch(sub_8023A94(TRUE)) {
case 0:
case 1:
break;
case 3:
gUnknown_203B2BC->targetPoke = sub_8023B44();
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
gUnknown_203B2BC->pokeStruct = pokeStruct;
gUnknown_203B2BC->isTeamLeader = pokeStruct->isTeamLeader;
PeekPokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(3);
break;
case 4:
gUnknown_203B2BC->targetPoke = sub_8023B44();
pokeStruct = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
gUnknown_203B2BC->pokeStruct = pokeStruct;
gUnknown_203B2BC->isTeamLeader = pokeStruct->isTeamLeader;
PeekPokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(4);
break;
case 2:
sub_8023C60();
SetFriendAreaActionMenuState(FRIEND_AREA_ACTION_MENU_EXIT);
break;
}
}
void sub_80278B4(void)
{
struct PokemonStruct *playerStruct;
struct PokemonStruct *pokeStruct1;
struct PokemonStruct *pokeStruct2;
u32 menuAction;
menuAction = 0;
sub_8023A94(FALSE);
if ((sub_8012FD8(&gUnknown_203B2BC->unk7C) == 0) && (sub_8013114(&gUnknown_203B2BC->unk7C,&menuAction), menuAction != 1)) {
gUnknown_203B2BC->menuAction1 = menuAction;
}
switch(menuAction) {
case 6:
if (sub_808D750(gUnknown_203B2BC->targetPoke)) {
#ifdef NONMATCHING
pokeStruct1 = &gRecruiedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
#else
register size_t offset asm("r1") = offsetof(struct unkStruct_203B45C, pokemon[gUnknown_203B2BC->targetPoke]);
struct PokemonStruct* p = gRecruitedPokemonRef->pokemon;
size_t addr = offset + (size_t)p;
pokeStruct1 = (struct PokemonStruct*)addr;
#endif
pokeStruct1->unk0 |= 2;
nullsub_104();
}
sub_808ED00();
SetFriendAreaActionMenuState(2);
break;
case 7:
gUnknown_203B2BC->pokeStruct->unk0 &= 0xfffd;
nullsub_104();
sub_808ED00();
SetFriendAreaActionMenuState(2);
break;
case 8:
pokeStruct2 = &gRecruitedPokemonRef->pokemon[gUnknown_203B2BC->targetPoke];
playerStruct = GetPlayerPokemonStruct();
if (!pokeStruct2->isTeamLeader) {
playerStruct->isTeamLeader = FALSE;
pokeStruct2->isTeamLeader = TRUE;
nullsub_104();
}
sub_808ED00();
SetFriendAreaActionMenuState(2);
break;
case 9:
SetFriendAreaActionMenuState(8);
break;
case 0xc:
SetFriendAreaActionMenuState(0xe);
break;
case 10:
SetFriendAreaActionMenuState(10);
break;
case 0xb:
PlaySound(0x14d);
if (gUnknown_203B2BC->item2.id != ITEM_NOTHING) {
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
}
FillInventoryGaps();
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->item2);
nullsub_104();
SetFriendAreaActionMenuState(2);
break;
case 4:
SetFriendAreaActionMenuState(4);
break;
case 5:
SetFriendAreaActionMenuState(5);
break;
case 1:
SetFriendAreaActionMenuState(2);
break;
}
}
void sub_8027A40(void)
{
switch(sub_80244E4())
{
case 2:
case 3:
sub_802453C();
SetFriendAreaActionMenuState(2);
break;
case 0:
case 1:
break;
}
}
void sub_8027A5C(void)
{
switch(sub_801BF48())
{
case 2:
case 3:
sub_801BF98();
SetFriendAreaActionMenuState(2);
break;
case 0:
case 1:
break;
}
}
static inline bool8 sub_8027A78_sub(void) {
if (gUnknown_203B2BC->pokeStruct->dungeonLocation.id == DUNGEON_HOWLING_FOREST_2 || gUnknown_203B2BC->pokeStruct->dungeonLocation.id == DUNGEON_POKEMON_SQUARE)
return TRUE;
else
return FALSE;
}
void sub_8027A78(void)
{
s32 menuAction;
if(sub_80144A4(&menuAction) == 0)
{
switch(menuAction)
{
case 1:
case 3:
SetFriendAreaActionMenuState(2);
break;
case 2:
if (sub_8027A78_sub())
SetFriendAreaActionMenuState(9);
else
{
sub_8027EB8();
sub_808D31C(gUnknown_203B2BC->pokeStruct);
}
break;
}
}
}
void sub_8027AE4(void)
{
s32 menuAction;
if (sub_80144A4(&menuAction) == 0) {
switch(menuAction)
{
case 1:
case 3:
SetFriendAreaActionMenuState(2);
break;
case 2:
sub_8027EB8();
sub_808D31C(gUnknown_203B2BC->pokeStruct);
break;
}
}
}
void sub_8027B28(void)
{
switch(sub_801A6E8(TRUE))
{
case 3:
gUnknown_203B2BC->id = sub_801A8AC();
gUnknown_203B2BC->itemToGive.id = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].id;
gUnknown_203B2BC->itemToGive.quantity = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].quantity;
SetFriendAreaActionMenuState(0xc);
break;
case 4:
gUnknown_203B2BC->id = sub_801A8AC();
gUnknown_203B2BC->itemToGive.id = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].id;
gUnknown_203B2BC->itemToGive.quantity = gTeamInventoryRef->teamItems[gUnknown_203B2BC->id].quantity;
sub_8099690(0);
SetFriendAreaActionMenuState(0xd);
break;
case 2:
sub_801A928();
SetFriendAreaActionMenuState(2);
break;
case 0:
case 1:
break;
}
}
void sub_8027BD8(void)
{
s32 menuAction;
menuAction = 0;
sub_801A6E8(FALSE);
if ((sub_8012FD8(&gUnknown_203B2BC->unk7C) == 0) && (sub_8013114(&gUnknown_203B2BC->unk7C,&menuAction), menuAction != 1)) {
gUnknown_203B2BC->menuAction2 = menuAction;
}
switch(menuAction)
{
case 10:
PlaySound(0x14d);
ShiftItemsDownFrom(gUnknown_203B2BC->id);
FillInventoryGaps();
if (gUnknown_203B2BC->item2.id != ITEM_NOTHING) {
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
}
GivePokemonItem(gUnknown_203B2BC->targetPoke,&gUnknown_203B2BC->itemToGive);
sub_801A928();
nullsub_104();
SetFriendAreaActionMenuState(2);
break;
case 4:
sub_8099690(0);
SetFriendAreaActionMenuState(0xd);
break;
case 1:
SetFriendAreaActionMenuState(0xb);
break;
}
}
void sub_8027C84()
{
switch(sub_801B410())
{
case 2:
case 3:
sub_801B450();
SetFriendAreaActionMenuState(0xB);
case 0:
case 1:
break;
}
}
void sub_8027CA0(void)
{
switch(sub_801EF38(1))
{
case 3:
case 4:
gUnknown_203B2BC->moveIndex = sub_801F194();
gUnknown_203B2BC->moveID = gUnknown_203B2BC->moves[gUnknown_203B2BC->moveIndex].id;
SetFriendAreaActionMenuState(0x10);
break;
case 2:
sub_801F214();
SetFriendAreaActionMenuState(0x2);
break;
case 0:
case 1:
break;
}
}
void sub_8027D00(void)
{
switch(sub_801F890())
{
case 2:
case 3:
sub_801F8D0();
SetFriendAreaActionMenuState(0xF);
break;
case 0:
case 1:
break;
}
}
void FriendAreaActionMenu_GotoFallbackState(void)
{
s32 temp;
if(sub_80144A4(&temp) == 0)
{
SetFriendAreaActionMenuState(gUnknown_203B2BC->fallbackState);
}
}
void sub_8027D40(u32 r0, struct BulkItem *heldItem)
{
struct Item slot;
struct unkStruct_8090F58 a3;
sub_8008C54(r0);
sub_80073B8(r0);
HeldItemToSlot(&slot, heldItem);
a3.unk0 = 0;
a3.unk4 = 0;
a3.unk8 = 1;
slot.flags = ITEM_FLAG_EXISTS;
sub_8090E14(gUnknown_202DE58, &slot, &a3);
xxx_format_and_draw(4, 3, gUnknown_80DD958, r0, 0);
sub_80073E0(r0);
}
bool8 sub_8027D9C(struct PokemonStruct *pokeStruct)
{
u32 var1;
if(!pokeStruct->isTeamLeader)
{
var1 = 0;
if(pokeStruct->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER)
var1 = 1;
if(var1 != 0)
{
if(!sub_80023E4(8))
return FALSE;
}
}
else
return FALSE;
return TRUE;
}
bool8 sub_8027DCC(struct PokemonStruct *pokeStruct)
{
u32 var1;
if(sub_808D3BC() != pokeStruct)
if(sub_808D3F8() != pokeStruct)
if(!pokeStruct->isTeamLeader)
{
var1 = 0;
if(pokeStruct->dungeonLocation.id == DUNGEON_JOIN_LOCATION_PARTNER)
var1 = 1;
if(var1 != 0)
{
if(sub_80023E4(8))
goto check;
}
else
{
check:
if(sub_8027E18(pokeStruct) != 3)
return TRUE;
}
}
return FALSE;
}
u32 sub_8027E18(struct PokemonStruct *pokeStruct)
{
if(pokeStruct->heldItem.id == ITEM_NOTHING)
return 0;
else if(GetNumberOfFilledInventorySlots() < INVENTORY_SIZE)
return 1;
else if(sub_8027E4C(pokeStruct))
return 2;
else
return 3;
}
bool8 sub_8027E4C(struct PokemonStruct *pokeStruct)
{
if(!IsNotMoneyOrUsedTMItem(pokeStruct->heldItem.id))
return FALSE;
else
{
if(IsThrowableItem(pokeStruct->heldItem.id))
{
if(gTeamInventoryRef->teamStorage[pokeStruct->heldItem.id] + pokeStruct->heldItem.quantity > 0x3e7)
return FALSE;
}
else if(gTeamInventoryRef->teamStorage[pokeStruct->heldItem.id] > 0x3e6)
{
return FALSE;
}
}
return TRUE;
}
void sub_8027EB8(void)
{
switch(sub_8027E18(gUnknown_203B2BC->pokeStruct))
{
case 1:
PlaySound(0x14d);
AddHeldItemToInventory(&gUnknown_203B2BC->item2);
FillInventoryGaps();
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke, &gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(6);
break;
case 2:
PlaySound(0x14d);
if(IsThrowableItem(gUnknown_203B2BC->item2.id))
gTeamInventoryRef->teamStorage[gUnknown_203B2BC->item2.id] += gUnknown_203B2BC->item2.quantity;
else
gTeamInventoryRef->teamStorage[gUnknown_203B2BC->item2.id] += 1;
gUnknown_203B2BC->item2.id = ITEM_NOTHING;
gUnknown_203B2BC->item2.quantity = 0;
GivePokemonItem(gUnknown_203B2BC->targetPoke, &gUnknown_203B2BC->item2);
SetFriendAreaActionMenuState(7);
break;
case 0:
default:
SetFriendAreaActionMenuState(2);
break;
}
}

View File

@ -536,7 +536,7 @@ void sub_8025A84(void)
sub_8025434(0xA);
break;
case 9:
gUnknown_203B2B4->pokeStruct->unk0 &= 0xfffd;
gUnknown_203B2B4->pokeStruct->unk0 &= ~(FLAG_ON_TEAM);
nullsub_104();
sub_808ED00();
sub_8023C60();

View File

@ -1165,7 +1165,7 @@ void sub_8032828(void)
else
gUnknown_203B33C->unk53C.itemRewards[0] = ITEM_NOTHING;
gUnknown_203B33C->unk53C.quantity = 1;
gUnknown_203B33C->unk53C.teamRankPtsReward = GetDungeonTeamRankPts(&mail->dungeon, 0);
gUnknown_203B33C->unk53C.teamRankPtsReward = GetDungeonTeamRankPts(&mail->unk4.dungeon, 0);
gUnknown_203B33C->unk53C.itemRewards[1] = 0;
gUnknown_203B33C->unk53C.itemRewards[2] = 0;
gUnknown_203B33C->unk53C.friendAreaReward = 0;

View File

@ -231,7 +231,7 @@ void sub_802E1AC(void)
case MAIL_INFO:
sub_803B35C(GetMailboxSlotInfo(gUnknown_203B304->mailboxIndex), &gUnknown_203B304->unkC);
gUnknown_203B304->unkC.unk0[0] = 3;
gUnknown_203B304->unkC.unk44 = 0;
gUnknown_203B304->unkC.mailStatus = MAIL_STATUS_SUSPENDED;
sub_802DE84(&gUnknown_203B304->unkC);
break;
case JOB_LIST_MENU:
@ -404,7 +404,7 @@ void sub_802E578(void)
mail = GetMailboxSlotInfo(gUnknown_203B304->mailboxIndex);
if(mail->mailType == 1)
{
gUnknown_203B304->mailIndex = mail->dungeon.floor;
gUnknown_203B304->mailIndex = mail->unk4.dungeon.floor;
gUnknown_203B304->fallbackState = MAIL_MENU_1;
SetMailboxState(DISPLAY_SEL_PKMN_NEWS);
}
@ -466,7 +466,7 @@ void HandleMailActionMenu(void)
case 6:
PlaySound(0x133);
mail = GetMailboxSlotInfo(gUnknown_203B304->mailboxIndex);
ReceivePKMNNews(mail->dungeon.floor);
ReceivePKMNNews(mail->unk4.dungeon.floor);
ResetMailboxSlot(gUnknown_203B304->mailboxIndex);
sub_8096078();
if(HasNoMailinMailbox())
@ -482,7 +482,7 @@ void HandleMailActionMenu(void)
case 7:
PlayMenuSoundEffect(0);
mail = GetMailboxSlotInfo(gUnknown_203B304->mailboxIndex);
gUnknown_203B304->mailIndex = mail->dungeon.floor;
gUnknown_203B304->mailIndex = mail->unk4.dungeon.floor;
gUnknown_203B304->fallbackState = MAIL_MENU_1;
SetMailboxState(DISPLAY_SEL_PKMN_NEWS);
break;

View File

@ -62,7 +62,7 @@ void ResetMailbox(void)
void ResetMailboxSlot(u8 index)
{
gUnknown_203B490->mailboxSlots[index].mailType = MAIL_TYPE_NONE;
gUnknown_203B490->mailboxSlots[index].dungeon.id = 99;
gUnknown_203B490->mailboxSlots[index].dungeon.floor = 0;
gUnknown_203B490->mailboxSlots[index].unk4.dungeon.id = 99;
gUnknown_203B490->mailboxSlots[index].unk4.dungeon.floor = 0;
gUnknown_203B490->mailboxSlots[index].rewardType = MONEY1;
}

View File

@ -638,14 +638,14 @@ void sub_80268CC(void)
pokeStruct = (struct PokemonStruct*)addr;
#endif
pokeStruct->unk0 |= 2;
pokeStruct->unk0 |= FLAG_ON_TEAM;
nullsub_104();
}
sub_808ED00();
sub_8026074(5);
break;
case 7:
gUnknown_203B2B8->pokeStruct->unk0 &= 0xfffd;
gUnknown_203B2B8->pokeStruct->unk0 &= ~(FLAG_ON_TEAM);
nullsub_104();
sub_808ED00();
sub_8026074(6);

View File

@ -220,7 +220,7 @@ void sub_802EA58(void)
case PELIPPER_JOB_INFO:
sub_803B35C(GetPelipperBoardSlotInfo(gPelipperBoard->jobIndex), &gPelipperBoard->unkC);
gPelipperBoard->unkC.unk0[0] = 3;
gPelipperBoard->unkC.unk44 = 0;
gPelipperBoard->unkC.mailStatus = MAIL_STATUS_SUSPENDED;
sub_802DE84(&gPelipperBoard->unkC);
break;
case PELIPPER_JOB_LIST_MENU:
@ -467,4 +467,4 @@ void CreatePelipperAcceptedStatusBox(u32 r0)
xxx_call_draw_string(0x16, 0xD, gPelipperStatusSlash, r0, 0); // "/"
sub_8012BC4(0x23, 0xD, MAX_ACCEPTED_JOBS, 2, 7, r0);
sub_80073E0(r0);
}
}

View File

@ -682,7 +682,7 @@ s32 SaveRecruitedPokemon(u8 *a1, s32 a2)
pokemon = &gRecruitedPokemonRef->pokemon[i];
if (pokemon->unk0 & 1) {
if (pokemon->unk0 & 2) {
if (pokemon->unk0 & FLAG_ON_TEAM) {
buffer[count++] = i;
}
if (pokemon->isTeamLeader) {
@ -730,7 +730,7 @@ s32 RestoreRecruitedPokemon(u8 *a1, s32 a2)
RestoreIntegerBits(&backup, &data_u8, 1);
RestorePokemonStruct(&backup, &gRecruitedPokemonRef->team[i]);
if (data_u8 & 1) {
gRecruitedPokemonRef->team[i].unk0 = 3;
gRecruitedPokemonRef->team[i].unk0 = 3; // FLAG_ON_TEAM (2) + ??? (1)
}
else {
gRecruitedPokemonRef->team[i].unk0 = 0;
@ -740,12 +740,12 @@ s32 RestoreRecruitedPokemon(u8 *a1, s32 a2)
for (i = 0; i < 6; i++) {
RestoreIntegerBits(&backup, &data_s16, 16);
if ((u16)data_s16 < NUM_MONSTERS) {
gRecruitedPokemonRef->pokemon[data_s16].unk0 |= 2;
gRecruitedPokemonRef->pokemon[data_s16].unk0 |= FLAG_ON_TEAM;
}
}
RestoreIntegerBits(&backup, &data_s16, 16);
if ((u16)data_s16 < NUM_MONSTERS) {
gRecruitedPokemonRef->pokemon[data_s16].isTeamLeader = 1;
gRecruitedPokemonRef->pokemon[data_s16].isTeamLeader = TRUE;
}
nullsub_102(&backup);
return backup.unk8;

View File

@ -605,7 +605,7 @@ void DisplayMissionObjectives(void)
mail = GetMailatIndex(local_94);
sub_803B6B0(10,16,3,gUnknown_203B330->unk10);
// %dF
sprintfStatic(buffer,gUnknown_80E1F3C,mail->dungeon.floor);
sprintfStatic(buffer,gUnknown_80E1F3C,mail->unk4.dungeon.floor);
xxx_call_draw_string(0x15,16,buffer,gUnknown_203B330->unk10,0);
// Rescue #C6%s#R
sprintfStatic(buffer,gUnknown_80E1F40,GetMonSpecies(mail->clientSpecies));
@ -624,11 +624,11 @@ void DisplayMissionObjectives(void)
for(jobSlotIdx = 0; jobSlotIdx < MAX_ACCEPTED_JOBS; jobSlotIdx++)
{
jobInfo = GetJobSlotInfo(jobSlotIdx);
if ((((jobInfo->dungeon.id == gUnknown_203B330->dungeonIndex) && (jobInfo->mailType != 0)
if ((((jobInfo->unk4.dungeon.id == gUnknown_203B330->dungeonIndex) && (jobInfo->mailType != 0)
) && (jobInfo->mailType != MAIL_TYPE_SUSPENDED_JOB)) && (jobInfo->mailType != MAIL_TYPE_UNK7)) {
sub_803B6B0(10,yCoord,3,gUnknown_203B330->unk10);
if (jobInfo->missionType != WONDER_MAIL_MISSION_TYPE_FIND_ITEM) {
sprintfStatic(buffer1,gUnknown_80E1F3C,jobInfo->dungeon.floor);
sprintfStatic(buffer1,gUnknown_80E1F3C,jobInfo->unk4.dungeon.floor);
xxx_call_draw_string(21,yCoord,buffer1,gUnknown_203B330->unk10,0);
}
switch(jobInfo->missionType)

View File

@ -635,8 +635,8 @@ u32 ConvertMenutoRescuePasswordState(u32 unused)
u32 sub_8039068(u32 mailMode, u8 *passwordBuffer, struct unkStruct_203B480 *param_3)
{
if ( (!sub_803D204(passwordBuffer, param_3)) || (WONDER_MAIL_TYPE_OKD < param_3->mailType) ||
(param_3->dungeon.floor >= GetDungeonFloorCount(param_3->dungeon.id)) ||
(param_3->clientSpecies == MONSTER_NONE) || (MONSTER_MAX < param_3->clientSpecies) ||
(param_3->unk4.dungeon.floor >= GetDungeonFloorCount(param_3->unk4.dungeon.id)) ||
(param_3->clientSpecies == MONSTER_NONE) || (MONSTER_RAYQUAZA_CUTSCENE < param_3->clientSpecies) ||
(IsInvalidItemReward(param_3->item.id))) {
return PASSWORD_ENTRY_INCORRECT_PASSWORD;
}

View File

@ -1396,7 +1396,7 @@ void UpdateThankYouMailText(void)
else
gUnknown_203B2C4->unk53C.itemRewards[0] = ITEM_NOTHING; // unk558
gUnknown_203B2C4->unk53C.quantity = 1; // unk55B
gUnknown_203B2C4->unk53C.teamRankPtsReward = GetDungeonTeamRankPts(&mail->dungeon, 0); // unk560
gUnknown_203B2C4->unk53C.teamRankPtsReward = GetDungeonTeamRankPts(&mail->unk4.dungeon, 0); // unk560
gUnknown_203B2C4->unk53C.itemRewards[1] = 0; // unk559
gUnknown_203B2C4->unk53C.itemRewards[2] = 0; // unk55A
gUnknown_203B2C4->unk53C.friendAreaReward = 0; // unk55C

View File

@ -1162,7 +1162,7 @@ void sub_8028FDC(void)
{
case 8:
mail = GetMailatIndex(gUnknown_203B2C0->mailIndex);
if(!sub_80A2824(mail->dungeon.id))
if(!sub_80A2824(mail->unk4.dungeon.id))
{
SetFriendRescueCounterState(CANT_GO_TO_DUNGEON);
}

View File

@ -175,8 +175,8 @@ void sub_802B3E0(void)
gUnknown_203B2C8->unk114.moneyReward = 0;
sub_8097790();
mail = GetMailatIndex(gUnknown_203B2C8->unk1);
sub_803C37C(&mail->dungeon, 0, gUnknown_203B2C8->unk114.itemRewards);
gUnknown_203B2C8->unk114.teamRankPtsReward = GetDungeonTeamRankPts(&mail->dungeon, 0);
sub_803C37C(&mail->unk4.dungeon, 0, gUnknown_203B2C8->unk114.itemRewards);
gUnknown_203B2C8->unk114.teamRankPtsReward = GetDungeonTeamRankPts(&mail->unk4.dungeon, 0);
gUnknown_203B2C8->unk114.itemRewards[1] = ITEM_NOTHING;
gUnknown_203B2C8->unk114.itemRewards[2] = ITEM_NOTHING;
gUnknown_203B2C8->unk114.quantity = 10;

View File

@ -80,7 +80,7 @@ void CreateMailMenu(void)
y = sub_8013800(&gUnknown_203B2D8->input, index);
sub_803B6B0(10,y,6,gUnknown_203B2D8->unk38);
PrintPokeNameToBuffer(gAvailablePokemonNames, GetPlayerPokemonStruct());
sprintfStatic(buffer, GetPokemonMailHeadline(mail->dungeon.floor), gAvailablePokemonNames);
sprintfStatic(buffer, GetPokemonMailHeadline(mail->unk4.dungeon.floor), gAvailablePokemonNames);
xxx_call_draw_string(0x15,y,buffer,gUnknown_203B2D8->unk38,0);
}
else {

View File

@ -189,7 +189,7 @@ void sub_802CAA4(void) {
{
case 5:
gUnknown_203B2F0->unk10C[loopMax].text = gUnknown_80DFD70; // Take Job
if(sub_809693C(mail) || !sub_80A2824(mail->dungeon.id))
if(sub_809693C(mail) || !sub_80A2824(mail->unk4.dungeon.id))
{
gUnknown_203B2F0->unk10C[loopMax].menuAction = -1;
}
@ -679,7 +679,7 @@ void sub_802D2A8(void)
MemoryCopy8(sub_8096DD8(),gUnknown_203B2F8->mail->unk14,0x28);
MemoryCopy8(sub_8096DE8(),gUnknown_203B2F8->mail->unk18,0x78);
}
switch(gUnknown_203B2F8->mail->wonderMail.dungeon.id)
switch(gUnknown_203B2F8->mail->wonderMail.unk4.dungeon.id)
{
// NOTE: subtract 1 from each of the case as the input??
case DUNGEON_ODDITY_CAVE: // 0x2B
@ -730,7 +730,7 @@ void sub_802D2A8(void)
case 0x10:
sub_803B35C(&gUnknown_203B2F8->mail->wonderMail,&gUnknown_203B2F8->unk14);
gUnknown_203B2F8->unk14.unk0[0] = 3;
gUnknown_203B2F8->unk14.unk44 = 0;
gUnknown_203B2F8->unk14.mailStatus = MAIL_STATUS_SUSPENDED;
gUnknown_203B2F8->unk14.unk50[0] = gUnknown_203B2F8->mail->unk18;
sub_802DE84(&gUnknown_203B2F8->unk14);
break;
@ -928,7 +928,7 @@ void sub_802D940(void)
{
// Delete
case 2:
if ((gUnknown_203B2F8->unk9) && (((mail = &gUnknown_203B490->jobSlots[gUnknown_203B2F8->jobSlotIndex]), mail->mailType > MAIL_TYPE_SUSPENDED_JOB) && (gUnknown_203B2F8->dungeonID == mail->dungeon.id)))
if ((gUnknown_203B2F8->unk9) && (((mail = &gUnknown_203B490->jobSlots[gUnknown_203B2F8->jobSlotIndex]), mail->mailType > MAIL_TYPE_SUSPENDED_JOB) && (gUnknown_203B2F8->dungeonID == mail->unk4.dungeon.id)))
{
sub_802D1A0(7);
}
@ -1008,7 +1008,7 @@ bool8 sub_802DAA8(void)
return TRUE;
}
else {
if ( (mail->mailType != WONDER_MAIL_TYPE_THANK_YOU) && (gUnknown_203B2F8->dungeonID == mail->dungeon.id)) return FALSE;
if ( (mail->mailType != WONDER_MAIL_TYPE_THANK_YOU) && (gUnknown_203B2F8->dungeonID == mail->unk4.dungeon.id)) return FALSE;
return TRUE;
}
}
@ -1028,7 +1028,7 @@ _0802DAE8:
{
mailType = mail->mailType;
if (((mailType == 0) || (mailType == WONDER_MAIL_TYPE_THANK_YOU)) ||
((WONDER_MAIL_TYPE_THANK_YOU < mailType && (gUnknown_203B2F8->dungeonID != mail->dungeon.id)))) goto _0802DAE8;
((WONDER_MAIL_TYPE_THANK_YOU < mailType && (gUnknown_203B2F8->dungeonID != mail->unk4.dungeon.id)))) goto _0802DAE8;
}
return FALSE;
}

View File

@ -347,7 +347,7 @@ void sub_802F088(void)
temp = sub_803B344(gUnknown_203B30C->unk4);
sub_803B35C(&temp->mail, &gUnknown_203B30C->unk8);
gUnknown_203B30C->unk8.unk0[0] = 3;
gUnknown_203B30C->unk8.unk44 = 0;
gUnknown_203B30C->unk8.mailStatus = MAIL_STATUS_SUSPENDED;
gUnknown_203B30C->unk8.unk50[0] = temp->unk18;
sub_802DE84(&gUnknown_203B30C->unk8);
}

View File

@ -265,17 +265,17 @@ void sub_803092C(void)
mail = GetMailatIndex(gUnknown_203B320->unk0[(gUnknown_203B320->input.unk1E * gUnknown_203B320->input.unk1C) + index]);
local.unk0[0] = gUnknown_203B320->unk58;
local.y = sub_8013800(&gUnknown_203B320->input,index);
local.unk40 = 7;
local.unk42 = 0;
local.unk44 = 0;
local.mailTitleType = 7;
local.mailMissionType = MISSION_TYPE_FRIEND_RESCUE;
local.mailStatus = MAIL_STATUS_SUSPENDED;
local.dungeon = &mail->dungeon;
local.unk8 = &mail->unk4;
local.playerName = mail->playerName;
local.clientSpecies = mail->clientSpecies;
local.targetSpecies = mail->clientSpecies;
local.targetItem = ITEM_NOTHING;
local.unk2E = 5;
local.rewardType = 5;
switch(mail->mailType)
{

View File

@ -117,33 +117,33 @@ void sub_8030E48(void)
mail = &gUnknown_203B480[gUnknown_203B324->mailIndex];
sub_80073B8(gUnknown_203B324->unk10);
stack.unk0[0] = gUnknown_203B324->unk10;
stack.unk40 = 7;
stack.unk42 = 0;
stack.unk44 = 0;
stack.dungeon = &mail->dungeon;
stack.mailTitleType = 7;
stack.mailMissionType = MISSION_TYPE_FRIEND_RESCUE;
stack.mailStatus = MAIL_STATUS_SUSPENDED;
stack.unk8 = &mail->unk4;
stack.playerName = mail->playerName;
stack.clientSpecies = mail->clientSpecies;
stack.targetSpecies = mail->clientSpecies;
stack.targetItem = ITEM_NOTHING;
if (mail->item.id == ITEM_NOTHING) {
stack.unk2E = 5;
stack.rewardType = 5;
}
else {
stack.unk2E = 2;
stack.unk34 = mail->item.id;
stack.rewardType = 2;
stack.rewardItem = mail->item.id;
}
switch(mail->mailType)
{
case 2:
case WONDER_MAIL_TYPE_AOK:
stack.unk41 = 10;
stack.mailDescriptionType = 10;
break;
case 5:
stack.unk41 = 11;
stack.mailDescriptionType = 11;
break;
case WONDER_MAIL_TYPE_NONE:
default:
stack.unk41 = 9;
stack.mailDescriptionType = 9;
break;
}
CreateRescueDescription(&stack);

View File

@ -14,11 +14,7 @@ struct unkStruct_203B2FC
// size: 0xA8
/* 0x0 */ u32 state;
/* 0x4 */ u32 fallbackState;
u32 unk8;
s16 unkC;
s16 unkE;
u8 unk10;
u8 fill11[0x30 - 0x11];
struct unkStruct_802F204 unk8;
u8 jobSlotIndex;
struct WonderMail *jobInfo;
struct OpenedFile *faceFile;
@ -38,7 +34,7 @@ struct unkStruct_203B300
{
// size: 0x7C
struct MenuInputStructSub unk0;
struct unkStruct_802C39C *unkC;
struct unkStruct_802C39C *mail;
u32 unk10;
struct UnkTextStruct2 *unk14;
struct UnkTextStruct2 unk18[4];
@ -109,13 +105,13 @@ extern void sub_802DC28(u32);
extern void sub_802F2C0(void);
extern void sub_802DC28(u32);
extern u32 sub_802F298(void);
extern void sub_802F204(u32 *, u32);
extern void sub_802F204(struct unkStruct_802F204*, u32);
extern void sub_802DC40(void);
extern void sub_802DC9C(void);
struct WonderMail *GetJobSlotInfo(u8);
extern void sub_8096AF8(u8 *, u32, u32);
extern void sub_8096EEC(void);
extern void sub_803C21C(struct WonderMail *, u32 *);
extern void sub_803C21C(struct WonderMail *, struct unkStruct_802F204*);
extern u32 sub_802C598(s32);
extern void sub_802C688(void);
extern void sub_8096C80(void);
@ -306,12 +302,12 @@ void sub_802DE60(void)
}
}
u32 sub_802DE84(struct unkStruct_802C39C *r0)
u32 sub_802DE84(struct unkStruct_802C39C *mail)
{
gUnknown_203B300 = MemoryAlloc(sizeof(struct unkStruct_203B300), 8);
gUnknown_203B300->unkC = r0;
gUnknown_203B300->mail = mail;
sub_801317C(&gUnknown_203B300->unk0);
gUnknown_203B300->unk10 = gUnknown_203B300->unkC->unk0[0];
gUnknown_203B300->unk10 = gUnknown_203B300->mail->unk0[0];
gUnknown_203B300->unk14 = &gUnknown_203B300->unk18[gUnknown_203B300->unk10];
sub_8006518(gUnknown_203B300->unk18);
gUnknown_203B300->unk18[gUnknown_203B300->unk10] = gUnknown_80E0264;
@ -361,6 +357,6 @@ void sub_802DF6C(void)
void sub_802DF88(void)
{
sub_80073B8(gUnknown_203B300->unk10);
CreateRescueDescription(gUnknown_203B300->unkC);
CreateRescueDescription(gUnknown_203B300->mail);
sub_80073E0(gUnknown_203B300->unk10);
}