diff options
-rw-r--r-- | asm/event_object_movement.s | 2 | ||||
-rw-r--r-- | asm/trainer_see.s | 405 | ||||
-rw-r--r-- | data/field_effect_scripts.s | 8 | ||||
-rw-r--r-- | data/maps/CeladonCity_GameCorner/scripts.inc | 4 | ||||
-rw-r--r-- | data/trainer_see.s | 71 | ||||
-rw-r--r-- | include/constants/field_effects.h | 6 | ||||
-rw-r--r-- | include/trainer_see.h | 10 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/trainer_see.c | 364 |
9 files changed, 327 insertions, 545 deletions
diff --git a/asm/event_object_movement.s b/asm/event_object_movement.s index 3bd824767..16420d048 100644 --- a/asm/event_object_movement.s +++ b/asm/event_object_movement.s @@ -19567,7 +19567,7 @@ sub_80669D4: @ 80669D4 cmp r0, 0x3F bne _080669EA adds r0, r4, 0 - bl sub_80824EC + bl MovementAction_RevealTrainer_RunTrainerSeeFuncList movs r0, 0 b _08066A12 _080669EA: diff --git a/asm/trainer_see.s b/asm/trainer_see.s deleted file mode 100644 index e56433bd5..000000000 --- a/asm/trainer_see.s +++ /dev/null @@ -1,405 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_808243C -sub_808243C: @ 808243C - push {r4,r5,lr} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - adds r5, r0, 0 - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - ldr r1, _080824D0 @ =gTasks - adds r4, r0, r1 - adds r0, r4, 0 - adds r0, 0xA - mov r1, sp - bl LoadWordFromTwoHalfwords - movs r1, 0x16 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _0808246E - ldr r0, [sp] - bl ObjectEventClearAnim - ldrh r0, [r4, 0x16] - adds r0, 0x1 - strh r0, [r4, 0x16] -_0808246E: - ldr r1, _080824D4 @ =gUnknown_83C7294 - movs r2, 0x8 - ldrsh r0, [r4, r2] - lsls r0, 2 - adds r0, r1 - ldr r2, [sp] - ldr r3, [r0] - adds r0, r5, 0 - adds r1, r4, 0 - bl _call_via_r3 - movs r1, 0x8 - ldrsh r0, [r4, r1] - cmp r0, 0x3 - bne _080824D8 - movs r0, 0x31 - bl FieldEffectActiveListContains - lsls r0, 24 - cmp r0, 0 - bne _080824D8 - ldr r4, [sp] - ldrb r0, [r4, 0x18] - lsls r0, 28 - lsrs r0, 28 - bl GetTrainerFacingDirectionMovementType - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - bl SetTrainerMovementType - ldr r4, [sp] - ldrb r0, [r4, 0x18] - lsls r0, 28 - lsrs r0, 28 - bl GetTrainerFacingDirectionMovementType - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - bl TryOverrideTemplateCoordsForObjectEvent - adds r0, r5, 0 - bl DestroyTask - b _080824E2 - .align 2, 0 -_080824D0: .4byte gTasks -_080824D4: .4byte gUnknown_83C7294 -_080824D8: - ldr r2, [sp] - ldrb r1, [r2] - movs r0, 0x7F - ands r0, r1 - strb r0, [r2] -_080824E2: - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_808243C - - thumb_func_start sub_80824EC -sub_80824EC: @ 80824EC - push {r4,lr} - adds r4, r0, 0 - ldr r0, _08082518 @ =sub_808243C - movs r1, 0 - bl CreateTask - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 3 - ldr r1, _0808251C @ =gTasks+0x8 - adds r0, r1 - adds r0, 0x2 - adds r1, r4, 0 - bl StoreWordInTwoHalfwords - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08082518: .4byte sub_808243C -_0808251C: .4byte gTasks+0x8 - thumb_func_end sub_80824EC - - thumb_func_start ScrSpecial_EndTrainerApproach -ScrSpecial_EndTrainerApproach: @ 8082520 - push {lr} - ldr r0, _0808252C @ =sub_8082530 - bl sub_8081E9C - pop {r0} - bx r0 - .align 2, 0 -_0808252C: .4byte sub_8082530 - thumb_func_end ScrSpecial_EndTrainerApproach - - thumb_func_start sub_8082530 -sub_8082530: @ 8082530 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl DestroyTask - bl EnableBothScriptContexts - pop {r0} - bx r0 - thumb_func_end sub_8082530 - - thumb_func_start FldEff_ExclamationMarkIcon1 -FldEff_ExclamationMarkIcon1: @ 8082544 - push {lr} - ldr r0, _08082574 @ =gUnknown_83C7388 - movs r1, 0 - movs r2, 0 - movs r3, 0x53 - bl CreateSpriteAtEnd - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x40 - beq _0808256C - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _08082578 @ =gSprites - adds r0, r1 - movs r1, 0 - movs r2, 0 - bl sub_808265C -_0808256C: - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_08082574: .4byte gUnknown_83C7388 -_08082578: .4byte gSprites - thumb_func_end FldEff_ExclamationMarkIcon1 - - thumb_func_start sub_808257C -sub_808257C: @ 808257C - push {lr} - ldr r0, _080825AC @ =gUnknown_83C7388 - movs r1, 0 - movs r2, 0 - movs r3, 0x52 - bl CreateSpriteAtEnd - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x40 - beq _080825A4 - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _080825B0 @ =gSprites - adds r0, r1 - movs r1, 0x42 - movs r2, 0x1 - bl sub_808265C -_080825A4: - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_080825AC: .4byte gUnknown_83C7388 -_080825B0: .4byte gSprites - thumb_func_end sub_808257C - - thumb_func_start sub_80825B4 -sub_80825B4: @ 80825B4 - push {lr} - ldr r0, _080825E4 @ =gUnknown_83C7388 - movs r1, 0 - movs r2, 0 - movs r3, 0x52 - bl CreateSpriteAtEnd - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x40 - beq _080825DC - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _080825E8 @ =gSprites - adds r0, r1 - movs r1, 0x2E - movs r2, 0x2 - bl sub_808265C -_080825DC: - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_080825E4: .4byte gUnknown_83C7388 -_080825E8: .4byte gSprites - thumb_func_end sub_80825B4 - - thumb_func_start sub_80825EC -sub_80825EC: @ 80825EC - push {lr} - ldr r0, _0808261C @ =gUnknown_83C7388 - movs r1, 0 - movs r2, 0 - movs r3, 0x52 - bl CreateSpriteAtEnd - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x40 - beq _08082614 - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _08082620 @ =gSprites - adds r0, r1 - movs r1, 0x40 - movs r2, 0x3 - bl sub_808265C -_08082614: - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_0808261C: .4byte gUnknown_83C7388 -_08082620: .4byte gSprites - thumb_func_end sub_80825EC - - thumb_func_start sub_8082624 -sub_8082624: @ 8082624 - push {lr} - ldr r0, _08082654 @ =gUnknown_83C7388 - movs r1, 0 - movs r2, 0 - movs r3, 0x52 - bl CreateSpriteAtEnd - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x40 - beq _0808264C - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _08082658 @ =gSprites - adds r0, r1 - movs r1, 0x21 - movs r2, 0x4 - bl sub_808265C -_0808264C: - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_08082654: .4byte gUnknown_83C7388 -_08082658: .4byte gSprites - thumb_func_end sub_8082624 - - thumb_func_start sub_808265C -sub_808265C: @ 808265C - push {r4,lr} - lsls r2, 24 - lsrs r2, 24 - ldrb r4, [r0, 0x5] - movs r3, 0xD - negs r3, r3 - ands r3, r4 - movs r4, 0x4 - orrs r3, r4 - strb r3, [r0, 0x5] - movs r3, 0x3E - adds r3, r0 - mov r12, r3 - ldrb r3, [r3] - movs r4, 0x2 - orrs r3, r4 - mov r4, r12 - strb r3, [r4] - ldr r4, _080826A0 @ =gFieldEffectArguments - ldr r3, [r4] - strh r3, [r0, 0x2E] - ldr r3, [r4, 0x4] - strh r3, [r0, 0x30] - ldr r3, [r4, 0x8] - strh r3, [r0, 0x32] - ldr r3, _080826A4 @ =0x0000fffb - strh r3, [r0, 0x34] - strh r1, [r0, 0x3C] - adds r1, r2, 0 - bl StartSpriteAnim - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080826A0: .4byte gFieldEffectArguments -_080826A4: .4byte 0x0000fffb - thumb_func_end sub_808265C - - thumb_func_start objc_exclamation_mark_probably -objc_exclamation_mark_probably: @ 80826A8 - push {r4,lr} - sub sp, 0x4 - adds r4, r0, 0 - ldrh r0, [r4, 0x2E] - lsls r0, 24 - lsrs r0, 24 - ldrh r1, [r4, 0x30] - lsls r1, 24 - lsrs r1, 24 - ldrh r2, [r4, 0x32] - lsls r2, 24 - lsrs r2, 24 - mov r3, sp - bl TryGetObjectEventIdByLocalIdAndMap - lsls r0, 24 - cmp r0, 0 - bne _080826DA - adds r0, r4, 0 - adds r0, 0x3F - ldrb r1, [r0] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _080826E8 -_080826DA: - ldrh r1, [r4, 0x3C] - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - bl FieldEffectStop - b _08082736 -_080826E8: - ldr r2, _0808272C @ =gObjectEvents - mov r0, sp - ldrb r1, [r0] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x4] - lsls r1, r0, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, _08082730 @ =gSprites - adds r1, r0 - ldrh r3, [r4, 0x34] - ldrh r0, [r4, 0x36] - adds r2, r3, r0 - strh r2, [r4, 0x36] - ldrh r0, [r1, 0x20] - strh r0, [r4, 0x20] - ldrh r0, [r1, 0x22] - subs r0, 0x10 - strh r0, [r4, 0x22] - ldrh r0, [r1, 0x24] - strh r0, [r4, 0x24] - ldrh r0, [r1, 0x26] - adds r0, r2 - strh r0, [r4, 0x26] - lsls r2, 16 - asrs r2, 16 - cmp r2, 0 - beq _08082734 - adds r0, r3, 0x1 - strh r0, [r4, 0x34] - b _08082736 - .align 2, 0 -_0808272C: .4byte gObjectEvents -_08082730: .4byte gSprites -_08082734: - strh r2, [r4, 0x34] -_08082736: - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - thumb_func_end objc_exclamation_mark_probably - - .align 2, 0 @ Don't pad with nop. diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 98685da05..35f307e43 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -204,7 +204,7 @@ gFldEffScript_FlyIn:: @ 81D98BE end gFldEffScript_ExclamationMarkIcon2:: @ 81D98C4 - callnative sub_8082624 + callnative FldEff_QuestionMarkIcon end gFldEffScript_FeetInFlowingWater:: @ 81D98CA @@ -257,7 +257,7 @@ gFldEffScript_Pokeball:: @ 81D9920 end gFldEffScript_HeartIcon:: @ 81D992B - callnative sub_80825B4 + callnative FldEff_XIcon end gFldEffScript_Nop47:: @ 81D9931 @@ -322,7 +322,7 @@ gFldEffScript_UseTeleport:: @ 81D9986 end gFldEffScript_Unk40:: @ 81D998C - callnative sub_80825EC + callnative FldEff_SmileyFaceIcon end gFldEffScript_Unk41:: @ 81D9992 @@ -330,7 +330,7 @@ gFldEffScript_Unk41:: @ 81D9992 end gFldEffScript_Unk42:: @ 81D9998 - callnative sub_808257C + callnative FldEff_DoubleExclMarkIcon end gFldEffScript_Unk43:: @ 81D999E diff --git a/data/maps/CeladonCity_GameCorner/scripts.inc b/data/maps/CeladonCity_GameCorner/scripts.inc index c206f38b4..f44c2d29b 100644 --- a/data/maps/CeladonCity_GameCorner/scripts.inc +++ b/data/maps/CeladonCity_GameCorner/scripts.inc @@ -257,8 +257,8 @@ CeladonCity_GameCorner_EventScript_SlotMachine:: @ 816C96C setfieldeffectarg 0, 255 setfieldeffectarg 1, 10 setfieldeffectarg 2, 14 - dofieldeffect FLDEFF_UNK_40 - waitfieldeffect FLDEFF_UNK_40 @ Smile icon? + dofieldeffect FLDEFF_SMILEY_FACE_ICON + waitfieldeffect FLDEFF_SMILEY_FACE_ICON @ Smile icon? specialvar VAR_RESULT, Special_GetRandomSlotMachine playslotmachine VAR_RESULT releaseall diff --git a/data/trainer_see.s b/data/trainer_see.s deleted file mode 100644 index f10a0b2c4..000000000 --- a/data/trainer_see.s +++ /dev/null @@ -1,71 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnknown_83C7294:: @ 83C7294 - .4byte sub_8082150 - .4byte sub_8082184 - .4byte sub_80821DC - .4byte sub_8082250 - -gOamData_83C72A4:: - .4byte 0x40000000, 0x00000400 - -gSpriteImages_83C72AC:: - .4byte gUnknown_83C6AC8 + 0x000, 0x80 - .4byte gUnknown_83C6AC8 + 0x080, 0x80 - .4byte gUnknown_83C6AC8 + 0x100, 0x80 - .4byte gUnknown_83C6AC8 + 0x300, 0x80 - .4byte gUnknown_83C6AC8 + 0x380, 0x80 - .4byte gUnknown_83C6AC8 + 0x400, 0x80 - .4byte gUnknown_83C6AC8 + 0x180, 0x80 - .4byte gUnknown_83C6AC8 + 0x200, 0x80 - .4byte gUnknown_83C6AC8 + 0x280, 0x80 - .4byte gUnknown_83C6AC8 + 0x480, 0x80 - .4byte gUnknown_83C6AC8 + 0x500, 0x80 - .4byte gUnknown_83C6AC8 + 0x580, 0x80 - .4byte gUnknown_83C6AC8 + 0x600, 0x80 - .4byte gUnknown_83C6AC8 + 0x680, 0x80 - .4byte gUnknown_83C6AC8 + 0x700, 0x80 - -gAnimCmd_83C7324:: - obj_image_anim_frame 0x0000, 0x0004 - obj_image_anim_frame 0x0001, 0x0004 - obj_image_anim_frame 0x0002, 0x0034 - obj_image_anim_end - -gAnimCmd_83C7334:: - obj_image_anim_frame 0x0006, 0x0004 - obj_image_anim_frame 0x0007, 0x0004 - obj_image_anim_frame 0x0008, 0x0034 - obj_image_anim_end - -gAnimCmd_83C7344:: - obj_image_anim_frame 0x0003, 0x0004 - obj_image_anim_frame 0x0004, 0x0004 - obj_image_anim_frame 0x0005, 0x0034 - obj_image_anim_end - -gAnimCmd_83C7354:: - obj_image_anim_frame 0x0009, 0x0004 - obj_image_anim_frame 0x000a, 0x0004 - obj_image_anim_frame 0x000b, 0x0034 - obj_image_anim_end - -gAnimCmd_83C7364:: - obj_image_anim_frame 0x000c, 0x0004 - obj_image_anim_frame 0x000d, 0x0004 - obj_image_anim_frame 0x000e, 0x0034 - obj_image_anim_end - -gSpriteAnimTable_83C7374:: - .4byte gAnimCmd_83C7324 - .4byte gAnimCmd_83C7334 - .4byte gAnimCmd_83C7344 - .4byte gAnimCmd_83C7354 - .4byte gAnimCmd_83C7364 - -gUnknown_83C7388:: @ 83C7388 - spr_template 65535, 65535, gOamData_83C72A4, gSpriteAnimTable_83C7374, gSpriteImages_83C72AC, gDummySpriteAffineAnimTable, objc_exclamation_mark_probably diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index 1fd6777f0..f0086c0c8 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -47,7 +47,7 @@ #define FLDEFF_USE_WATERFALL 43 #define FLDEFF_USE_DIVE 44 #define FLDEFF_POKEBALL 45 -#define FLDEFF_HEART_ICON 46 +#define FLDEFF_X_ICON 46 #define FLDEFF_NOP_47 47 #define FLDEFF_NOP_48 48 #define FLDEFF_POP_OUT_OF_ASH 49 @@ -65,9 +65,9 @@ #define FLDEFF_PCTURN_ON 61 #define FLDEFF_HALL_OF_FAME_RECORD 62 #define FLDEFF_USE_TELEPORT 63 -#define FLDEFF_UNK_40 64 // TODO: game corner smile icon? +#define FLDEFF_SMILEY_FACE_ICON 64 // TODO: game corner smile icon? #define FLDEFF_UNK_41 65 // TODO: related to vs_seeker -#define FLDEFF_UNK_42 66 // TODO: related to trainer see +#define FLDEFF_DOUBLE_EXCL_MARK_ICON 66 // TODO: related to trainer see #define FLDEFF_UNK_43 67 // TODO: related to deoxys #define FLDEFF_UNK_44 68 // TODO: related to trainer see #define FLDEFF_UNK_45 69 // TODO: related to fame checker photos diff --git a/include/trainer_see.h b/include/trainer_see.h index 511edf404..65d4a9efe 100644 --- a/include/trainer_see.h +++ b/include/trainer_see.h @@ -3,8 +3,12 @@ #include "global.h" -void sub_80B4578(struct ObjectEvent *); -u8 sub_80B47BC(void); -void sub_8155D78(struct ObjectEvent *); +bool8 CheckForTrainersWantingBattle(void); +void MovementAction_RevealTrainer_RunTrainerSeeFuncList(struct ObjectEvent *var); +u8 FldEff_ExclamationMarkIcon1(void); +u8 FldEff_DoubleExclMarkIcon(void); +u8 FldEff_XIcon(void); +u8 FldEff_SmileyFaceIcon(void); +u8 FldEff_QuestionMarkIcon(void); #endif //GUARD_TRAINER_SEE_H diff --git a/ld_script.txt b/ld_script.txt index a11f859f9..db044b969 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -123,7 +123,6 @@ SECTIONS { src/battle_setup.o(.text); asm/cable_club.o(.text); src/trainer_see.o(.text); - asm/trainer_see.o(.text); src/wild_encounter.o(.text); asm/field_effect.o(.text); src/scanline_effect.o(.text); @@ -446,7 +445,6 @@ SECTIONS { src/battle_setup.o(.rodata); data/cable_club.o(.rodata); src/trainer_see.o(.rodata); - data/trainer_see.o(.rodata); src/wild_encounter.o(.rodata); data/field_effect.o(.rodata); src/option_menu.o(.rodata); diff --git a/src/trainer_see.c b/src/trainer_see.c index 93b22d2a3..abc68b5c5 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -4,7 +4,10 @@ #include "field_effect.h" #include "field_player_avatar.h" #include "quest_log.h" +#include "script.h" #include "task.h" +#include "trainer_see.h" +#include "util.h" #include "constants/battle_setup.h" #include "constants/event_object_movement.h" #include "constants/event_objects.h" @@ -20,32 +23,35 @@ static u8 GetTrainerApproachDistanceNorth(struct ObjectEvent * trainerObj, s16 r static u8 GetTrainerApproachDistanceWest(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y); static u8 GetTrainerApproachDistanceEast(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y); static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent * trainerObj, u8 approachDistance, u8 facingDirection); -void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance); -void Task_RunTrainerSeeFuncList(u8 taskId); -bool8 sub_8081F34(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_8081F38(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_8081F90(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_8081FD0(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_808202C(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_80820BC(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_8082100(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_8082134(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_8082150(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_8082184(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_80821DC(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_8082250(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_808226C(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_80822CC(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); -bool8 sub_808237C(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); - -const u16 gUnknown_83C6AC8[] = INCBIN_U16("graphics/object_events/emoticons.4bpp"); +static void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance); +static void Task_RunTrainerSeeFuncList(u8 taskId); +static bool8 TrainerSeeFunc_Dummy(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_StartExclMark(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_WaitExclMark(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_TrainerApproach(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_PrepareToEngage(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_End(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_BeginRemoveDisguise(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_WaitRemoveDisguise(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_TrainerInAshFacesPlayer(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_BeginJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_WaitJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_EndJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj); +static void Task_DestroyTrainerApproachTask(u8 taskId); +static void SpriteCB_TrainerIcons(struct Sprite * sprite); +static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum); + +static const u16 sGfx_Emoticons[] = INCBIN_U16("graphics/object_events/emoticons.4bpp"); // u8 func(struct ObjectEvent * trainerObj, s16 range, s16 x, s16 y) // range is the maximum distance the trainer can see // x and y are the player's coordinates // Returns distance to walk if trainer has unobstructed view of player // Returns 0 if trainer can't see player -const TRAINER_APPROACH_FUNC sDirectionalApproachDistanceFuncs[] = { +static const TRAINER_APPROACH_FUNC sDirectionalApproachDistanceFuncs[] = { GetTrainerApproachDistanceSouth, GetTrainerApproachDistanceNorth, GetTrainerApproachDistanceWest, @@ -55,22 +61,29 @@ const TRAINER_APPROACH_FUNC sDirectionalApproachDistanceFuncs[] = { // bool8 func(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) // Returns TRUE to run the next func immediately // Returns FALSE to delay the next func to the next frame -const TRAINER_SEE_FUNC sTrainerSeeFuncList[] = { - sub_8081F34, - sub_8081F38, - sub_8081F90, - sub_8081FD0, - sub_808202C, - sub_80820BC, - sub_8082100, - sub_8082134, - sub_8082150, - sub_8082184, - sub_80821DC, - sub_8082250, - sub_808226C, - sub_80822CC, - sub_808237C +static const TRAINER_SEE_FUNC sTrainerSeeFuncList[] = { + TrainerSeeFunc_Dummy, + TrainerSeeFunc_StartExclMark, + TrainerSeeFunc_WaitExclMark, + TrainerSeeFunc_TrainerApproach, + TrainerSeeFunc_PrepareToEngage, + TrainerSeeFunc_End, + TrainerSeeFunc_BeginRemoveDisguise, + TrainerSeeFunc_WaitRemoveDisguise, + TrainerSeeFunc_TrainerInAshFacesPlayer, + TrainerSeeFunc_BeginJumpOutOfAsh, + TrainerSeeFunc_WaitJumpOutOfAsh, + TrainerSeeFunc_EndJumpOutOfAsh, + TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj, + TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp, + TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown +}; + +static const TRAINER_SEE_FUNC sTrainerSeeFuncList2[] = { + TrainerSeeFunc_TrainerInAshFacesPlayer, + TrainerSeeFunc_BeginJumpOutOfAsh, + TrainerSeeFunc_WaitJumpOutOfAsh, + TrainerSeeFunc_EndJumpOutOfAsh }; bool8 CheckForTrainersWantingBattle(void) @@ -234,7 +247,7 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 ap (dest) = (struct ObjectEvent *)(((task)->tTrainerObjHi << 16) | ((u16)(task)->tTrainerObjLo)); \ } while (0) -void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance) +static void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance) { u8 taskId = CreateTask(Task_RunTrainerSeeFuncList, 80); struct Task * task = &gTasks[taskId]; @@ -243,7 +256,7 @@ void TrainerApproachPlayer(struct ObjectEvent * trainerObj, u8 approachDistance) task->tTrainerRange = approachDistance; } -void sub_8081E9C(TaskFunc taskFunc) +static void StartTrainerApproachWithFollowupTask(TaskFunc taskFunc) { u8 taskId = FindTaskIdByFunc(Task_RunTrainerSeeFuncList); SetTaskFuncWithFollowupFunc(taskId, Task_RunTrainerSeeFuncList, taskFunc); @@ -251,7 +264,7 @@ void sub_8081E9C(TaskFunc taskFunc) Task_RunTrainerSeeFuncList(taskId); } -void Task_RunTrainerSeeFuncList(u8 taskId) +static void Task_RunTrainerSeeFuncList(u8 taskId) { struct Task * task = &gTasks[taskId]; struct ObjectEvent * trainerObj; @@ -270,12 +283,12 @@ void Task_RunTrainerSeeFuncList(u8 taskId) // TrainerSeeFuncs -bool8 sub_8081F34(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_Dummy(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { return FALSE; } -bool8 sub_8081F38(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_StartExclMark(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { u8 action; // FRLG introduces trainers who can see the player from offscreen above. @@ -295,7 +308,7 @@ bool8 sub_8081F38(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj return TRUE; } -bool8 sub_8081F90(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_WaitExclMark(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON_1)) { @@ -312,7 +325,7 @@ bool8 sub_8081F90(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj } } -bool8 sub_8081FD0(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_TrainerApproach(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj)) { @@ -330,7 +343,7 @@ bool8 sub_8081FD0(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj return FALSE; } -bool8 sub_808202C(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_PrepareToEngage(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { struct ObjectEvent *playerObj; @@ -352,7 +365,7 @@ bool8 sub_808202C(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj return FALSE; } -bool8 sub_80820BC(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_End(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; @@ -363,7 +376,7 @@ bool8 sub_80820BC(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj } // Jumps here if disguised. Not used in FRLG. -bool8 sub_8082100(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_BeginRemoveDisguise(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj)) @@ -374,7 +387,7 @@ bool8 sub_8082100(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj return FALSE; } -bool8 sub_8082134(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_WaitRemoveDisguise(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { if (ObjectEventClearHeldMovementIfFinished(trainerObj)) task->tFuncId = 3; @@ -383,7 +396,7 @@ bool8 sub_8082134(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj } // Jump here if hidden in ash. Not used in FRLG. -bool8 sub_8082150(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_TrainerInAshFacesPlayer(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj)) @@ -394,7 +407,7 @@ bool8 sub_8082150(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj return FALSE; } -bool8 sub_8082184(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_BeginJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { if (ObjectEventCheckHeldMovementStatus(trainerObj)) { @@ -408,7 +421,7 @@ bool8 sub_8082184(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj return FALSE; } -bool8 sub_80821DC(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_WaitJumpOutOfAsh(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { struct Sprite *sprite; @@ -427,7 +440,7 @@ bool8 sub_80821DC(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj return FALSE; } -bool8 sub_8082250(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) +static bool8 TrainerSeeFunc_EndJumpOutOfAsh(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) task->tFuncId = 3; @@ -436,7 +449,7 @@ bool8 sub_8082250(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) } // FRLG exclusive: Scroll the camera up to reveal an offscreen above trainer -bool8 sub_808226C(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) +static bool8 TrainerSeeFunc_OffscreenAboveTrainerCreateCameraObj(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { int specialObjectId; task->tData5 = 0; @@ -447,7 +460,7 @@ bool8 sub_808226C(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) return FALSE; } -bool8 sub_80822CC(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) +static bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveUp(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { u8 specialObjectId; TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &specialObjectId); @@ -470,7 +483,7 @@ bool8 sub_80822CC(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) return FALSE; } -bool8 sub_808237C(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) +static bool8 TrainerSeeFunc_OffscreenAboveTrainerCameraObjMoveDown(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj) { u8 specialObjectId; TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &specialObjectId); @@ -495,3 +508,246 @@ bool8 sub_808237C(u8 taskId, struct Task * task, struct ObjectEvent * trainerObj } return FALSE; } + +#undef tData5 +#undef tOutOfAshSpriteId +#undef tTrainerRange +#undef tTrainerObjLo +#undef tTrainerObjHi +#undef tFuncId + +static void Task_RevealTrainer_RunTrainerSeeFuncList(u8 taskId) +{ + struct Task * task = &gTasks[taskId]; + struct ObjectEvent * trainerObj; + + // another objEvent loaded into by loadword? + LoadWordFromTwoHalfwords((u16 *)&task->data[1], (uintptr_t *)&trainerObj); + if (!task->data[7]) + { + ObjectEventClearAnim(trainerObj); + task->data[7]++; + } + sTrainerSeeFuncList2[task->data[0]](taskId, task, trainerObj); + if (task->data[0] == 3 && !FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) + { + SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); + TryOverrideTemplateCoordsForObjectEvent(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); + DestroyTask(taskId); + } + else + { + trainerObj->heldMovementFinished = 0; + } +} + +void MovementAction_RevealTrainer_RunTrainerSeeFuncList(struct ObjectEvent *var) +{ + StoreWordInTwoHalfwords((u16 *)&gTasks[CreateTask(Task_RevealTrainer_RunTrainerSeeFuncList, 0)].data[1], (u32)var); +} + +void ScrSpecial_EndTrainerApproach(void) +{ + StartTrainerApproachWithFollowupTask(Task_DestroyTrainerApproachTask); +} + +static void Task_DestroyTrainerApproachTask(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +// Trainer See Excl Mark Field Effect + +#define sLocalId data[0] +#define sMapNum data[1] +#define sMapGroup data[2] +#define sData3 data[3] +#define sData4 data[4] +#define sFldEffId data[7] + +static const struct OamData sOamData_Emoticons = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteFrameImage sSpriteImages_Emoticons[] = { + {sGfx_Emoticons + 0x000, 0x80}, + {sGfx_Emoticons + 0x040, 0x80}, + {sGfx_Emoticons + 0x080, 0x80}, + + {sGfx_Emoticons + 0x180, 0x80}, + {sGfx_Emoticons + 0x1C0, 0x80}, + {sGfx_Emoticons + 0x200, 0x80}, + + {sGfx_Emoticons + 0x0C0, 0x80}, + {sGfx_Emoticons + 0x100, 0x80}, + {sGfx_Emoticons + 0x140, 0x80}, + + {sGfx_Emoticons + 0x240, 0x80}, + {sGfx_Emoticons + 0x280, 0x80}, + {sGfx_Emoticons + 0x2C0, 0x80}, + + {sGfx_Emoticons + 0x300, 0x80}, + {sGfx_Emoticons + 0x340, 0x80}, + {sGfx_Emoticons + 0x380, 0x80}, +}; + +static const union AnimCmd sAnimCmd_ExclamationMark1[] = { + ANIMCMD_FRAME( 0, 4), + ANIMCMD_FRAME( 1, 4), + ANIMCMD_FRAME( 2, 52), + ANIMCMD_END +}; + +static const union AnimCmd sAnimCmd_DoubleExclMark[] = { + ANIMCMD_FRAME( 6, 4), + ANIMCMD_FRAME( 7, 4), + ANIMCMD_FRAME( 8, 52), + ANIMCMD_END +}; + +static const union AnimCmd sAnimCmd_X[] = { + ANIMCMD_FRAME( 3, 4), + ANIMCMD_FRAME( 4, 4), + ANIMCMD_FRAME( 5, 52), + ANIMCMD_END +}; + +static const union AnimCmd sAnimCmd_SmileyFace[] = { + ANIMCMD_FRAME( 9, 4), + ANIMCMD_FRAME(10, 4), + ANIMCMD_FRAME(11, 52), + ANIMCMD_END +}; + +static const union AnimCmd sAnimCmd_QuestionMark[] = { + ANIMCMD_FRAME(12, 4), + ANIMCMD_FRAME(13, 4), + ANIMCMD_FRAME(14, 52), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_Emoticons[] = { + sAnimCmd_ExclamationMark1, + sAnimCmd_DoubleExclMark, + sAnimCmd_X, + sAnimCmd_SmileyFace, + sAnimCmd_QuestionMark +}; + +static const struct SpriteTemplate sSpriteTemplate_Emoticons = { + .tileTag = 0xFFFF, + .paletteTag = 0xFFFF, + .oam = &sOamData_Emoticons, + .anims = sSpriteAnimTable_Emoticons, + .images = sSpriteImages_Emoticons, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_TrainerIcons +}; + +u8 FldEff_ExclamationMarkIcon1(void) +{ + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x53); + + if (spriteId != MAX_SPRITES) + SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON_1, 0); + + return 0; +} + +u8 FldEff_DoubleExclMarkIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52); + + if (spriteId != MAX_SPRITES) + SetIconSpriteData(&gSprites[spriteId], FLDEFF_DOUBLE_EXCL_MARK_ICON, 1); + + return 0; +} + +u8 FldEff_XIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52); + + if (spriteId != MAX_SPRITES) + SetIconSpriteData(&gSprites[spriteId], FLDEFF_X_ICON, 2); + + return 0; +} + +u8 FldEff_SmileyFaceIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52); + + if (spriteId != MAX_SPRITES) + SetIconSpriteData(&gSprites[spriteId], FLDEFF_SMILEY_FACE_ICON, 3); + + return 0; +} + +u8 FldEff_QuestionMarkIcon(void) +{ + u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Emoticons, 0, 0, 0x52); + + if (spriteId != MAX_SPRITES) + SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON_2, 4); + + return 0; +} + +static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum) +{ + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = 1; + + sprite->sLocalId = gFieldEffectArguments[0]; + sprite->sMapNum = gFieldEffectArguments[1]; + sprite->sMapGroup = gFieldEffectArguments[2]; + sprite->sData3 = -5; + sprite->sFldEffId = fldEffId; + + StartSpriteAnim(sprite, spriteAnimNum); +} + +static void SpriteCB_TrainerIcons(struct Sprite *sprite) +{ + u8 objEventId; + + if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objEventId) + || sprite->animEnded) + { + FieldEffectStop(sprite, sprite->sFldEffId); + } + else + { + struct Sprite *objEventSprite = &gSprites[gObjectEvents[objEventId].spriteId]; + sprite->sData4 += sprite->sData3; + sprite->pos1.x = objEventSprite->pos1.x; + sprite->pos1.y = objEventSprite->pos1.y - 16; + sprite->pos2.x = objEventSprite->pos2.x; + sprite->pos2.y = objEventSprite->pos2.y + sprite->sData4; + if (sprite->sData4) + sprite->sData3++; + else + sprite->sData3 = 0; + } +} + +#undef sLocalId +#undef sMapNum +#undef sMapGroup +#undef sData3 +#undef sData4 +#undef sFldEffId |