diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-19 15:43:59 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-19 15:43:59 -0500 |
commit | 0125c1440e52404d53b4d91451cf03b625ba4634 (patch) | |
tree | 53b3c44ccd7b24fee79548efed648fb7c95f6488 | |
parent | 4280723f0ef24ff218cb81fd4ce8eb7abf063d34 (diff) |
trainer_see through CheckPathBetweenTrainerAndPlayer
-rw-r--r-- | asm/event_object_movement.s | 26 | ||||
-rw-r--r-- | asm/field_player_avatar.s | 6 | ||||
-rw-r--r-- | asm/trainer_see.s | 451 | ||||
-rw-r--r-- | data/trainer_see.s | 9 | ||||
-rw-r--r-- | include/event_object_movement.h | 5 | ||||
-rw-r--r-- | include/global.fieldmap.h | 6 | ||||
-rw-r--r-- | include/quest_log.h | 1 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/quest_log_objects.c | 44 | ||||
-rw-r--r-- | src/quest_log_player.c | 4 | ||||
-rw-r--r-- | src/trainer_see.c | 174 | ||||
-rw-r--r-- | src/vs_seeker.c | 4 |
12 files changed, 226 insertions, 506 deletions
diff --git a/asm/event_object_movement.s b/asm/event_object_movement.s index f585a60bc..49724f61d 100644 --- a/asm/event_object_movement.s +++ b/asm/event_object_movement.s @@ -10521,7 +10521,7 @@ sub_80629B8: @ 80629B8 ldrsh r2, [r5, r0] adds r0, r4, 0 adds r3, r6, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 cmp r0, 0 bne _08062A3E @@ -10610,7 +10610,7 @@ sub_8062A70: @ 8062A70 ldrsh r2, [r5, r0] adds r0, r4, 0 adds r3, r6, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 cmp r0, 0 bne _08062AF6 @@ -10699,7 +10699,7 @@ sub_8062B28: @ 8062B28 ldrsh r2, [r5, r0] adds r0, r4, 0 adds r3, r6, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 cmp r0, 0 bne _08062BAE @@ -10788,7 +10788,7 @@ sub_8062BE0: @ 8062BE0 ldrsh r2, [r5, r0] adds r0, r4, 0 adds r3, r6, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 cmp r0, 0 bne _08062C66 @@ -10913,7 +10913,7 @@ sub_8062CE0: @ 8062CE0 ldrsh r2, [r5, r0] adds r0, r4, 0 adds r3, r6, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 cmp r0, 0 bne _08062D66 @@ -11009,7 +11009,7 @@ oac_hopping: @ 8062D98 ldrsh r2, [r5, r0] adds r0, r4, 0 adds r3, r6, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 cmp r0, 0 bne _08062E2C @@ -12292,7 +12292,7 @@ npc_block_way__next_tile: @ 806366C ldrsh r2, [r4, r0] adds r0, r6, 0 adds r3, r5, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 lsrs r0, 24 add sp, 0x4 @@ -12301,8 +12301,8 @@ npc_block_way__next_tile: @ 806366C bx r1 thumb_func_end npc_block_way__next_tile - thumb_func_start npc_block_way -npc_block_way: @ 80636AC + thumb_func_start GetCollisionAtCoords +GetCollisionAtCoords: @ 80636AC push {r4-r7,lr} mov r7, r10 mov r6, r9 @@ -12400,10 +12400,10 @@ _08063762: pop {r4-r7} pop {r1} bx r1 - thumb_func_end npc_block_way + thumb_func_end GetCollisionAtCoords - thumb_func_start sub_8063770 -sub_8063770: @ 8063770 + thumb_func_start GetCollisionFlagsAtCoords +GetCollisionFlagsAtCoords: @ 8063770 push {r4-r7,lr} mov r7, r10 mov r6, r9 @@ -12503,7 +12503,7 @@ _0806382C: pop {r4-r7} pop {r1} bx r1 - thumb_func_end sub_8063770 + thumb_func_end GetCollisionFlagsAtCoords thumb_func_start IsCoordOutsideObjectEventMovementRect IsCoordOutsideObjectEventMovementRect: @ 806383C diff --git a/asm/field_player_avatar.s b/asm/field_player_avatar.s index a605f1439..7a2c5cbc5 100644 --- a/asm/field_player_avatar.s +++ b/asm/field_player_avatar.s @@ -1120,7 +1120,7 @@ sub_805BBA8: @ 805BBA8 adds r1, r5, 0 adds r2, r4, 0 adds r3, r6, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 lsrs r0, 24 mov r1, sp @@ -1323,7 +1323,7 @@ sub_805BCEC: @ 805BCEC ldrsh r2, [r5, r0] adds r0, r4, 0 adds r3, r7, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 cmp r0, 0 bne _0805BDA0 @@ -2906,7 +2906,7 @@ IsPlayerFacingSurfableFishableWater: @ 805C8B0 lsls r3, 28 lsrs r3, 28 adds r0, r4, 0 - bl npc_block_way + bl GetCollisionAtCoords lsls r0, 24 lsrs r0, 24 cmp r0, 0x3 diff --git a/asm/trainer_see.s b/asm/trainer_see.s index c12bcaeeb..11c4fcbcb 100644 --- a/asm/trainer_see.s +++ b/asm/trainer_see.s @@ -5,457 +5,6 @@ .text - thumb_func_start CheckForTrainersWantingBattle -CheckForTrainersWantingBattle: @ 8081B30 - push {r4,r5,lr} - bl sub_8111C2C - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08081B44 - b _08081B78 -_08081B40: - movs r0, 0x1 - b _08081B7A -_08081B44: - movs r4, 0 - ldr r5, _08081B80 @ =gObjectEvents -_08081B48: - lsls r0, r4, 3 - adds r0, r4 - lsls r0, 2 - adds r1, r0, r5 - ldrb r0, [r1] - lsls r0, 31 - cmp r0, 0 - beq _08081B6E - ldrb r0, [r1, 0x7] - cmp r0, 0x1 - beq _08081B62 - cmp r0, 0x3 - bne _08081B6E -_08081B62: - adds r0, r4, 0 - bl sub_8081B84 - lsls r0, 24 - cmp r0, 0 - bne _08081B40 -_08081B6E: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0xF - bls _08081B48 -_08081B78: - movs r0, 0 -_08081B7A: - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_08081B80: .4byte gObjectEvents - thumb_func_end CheckForTrainersWantingBattle - - thumb_func_start sub_8081B84 -sub_8081B84: @ 8081B84 - push {r4-r7,lr} - lsls r0, 24 - lsrs r5, r0, 24 - adds r0, r5, 0 - bl GetObjectEventScriptPointerByObjectEventId - adds r6, r0, 0 - bl GetTrainerFlagFromScriptPointer - cmp r0, 0 - bne _08081BE4 - lsls r4, r5, 3 - adds r0, r4, r5 - lsls r0, 2 - ldr r1, _08081BE0 @ =gObjectEvents - adds r0, r1 - bl sub_8081BEC - lsls r0, 24 - lsrs r7, r0, 24 - cmp r7, 0 - beq _08081BE4 - ldrb r0, [r6, 0x1] - cmp r0, 0x4 - bne _08081BC0 - bl GetMonsStateToDoubles - lsls r0, 24 - cmp r0, 0 - bne _08081BE4 -_08081BC0: - adds r0, r5, 0 - adds r1, r6, 0 - bl ConfigureAndSetUpOneTrainerBattle - adds r0, r4, r5 - lsls r0, 2 - ldr r1, _08081BE0 @ =gObjectEvents - adds r0, r1 - subs r1, r7, 0x1 - lsls r1, 24 - lsrs r1, 24 - bl sub_8081E68 - movs r0, 0x1 - b _08081BE6 - .align 2, 0 -_08081BE0: .4byte gObjectEvents -_08081BE4: - movs r0, 0 -_08081BE6: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8081B84 - - thumb_func_start sub_8081BEC -sub_8081BEC: @ 8081BEC - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x4 - adds r7, r0, 0 - mov r4, sp - adds r4, 0x2 - mov r0, sp - adds r1, r4, 0 - bl PlayerGetDestCoords - ldrb r0, [r7, 0x7] - mov r8, r4 - cmp r0, 0x1 - bne _08081C4C - ldr r1, _08081C44 @ =gUnknown_83C7248 - ldrb r0, [r7, 0x18] - lsls r0, 28 - lsrs r0, 26 - subs r0, 0x4 - adds r0, r1 - ldrb r1, [r7, 0x1D] - mov r2, sp - movs r3, 0 - ldrsh r2, [r2, r3] - movs r5, 0 - ldrsh r3, [r4, r5] - ldr r4, [r0] - adds r0, r7, 0 - bl _call_via_r4 - lsls r0, 24 - lsrs r6, r0, 24 - ldrb r2, [r7, 0x18] - lsls r2, 28 - lsrs r2, 28 - adds r0, r7, 0 - adds r1, r6, 0 - bl CheckPathBetweenTrainerAndPlayer - lsls r0, 24 - lsrs r0, 24 - b _08081C8C - .align 2, 0 -_08081C44: .4byte gUnknown_83C7248 -_08081C48: - adds r0, r6, 0 - b _08081C8C -_08081C4C: - movs r5, 0 -_08081C4E: - ldr r0, _08081C98 @ =gUnknown_83C7248 - lsls r4, r5, 2 - adds r4, r0 - ldrb r1, [r7, 0x1D] - mov r0, sp - movs r6, 0 - ldrsh r2, [r0, r6] - mov r0, r8 - movs r6, 0 - ldrsh r3, [r0, r6] - ldr r4, [r4] - adds r0, r7, 0 - bl _call_via_r4 - lsls r0, 24 - lsrs r6, r0, 24 - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - adds r0, r7, 0 - adds r1, r6, 0 - adds r2, r4, 0 - bl CheckPathBetweenTrainerAndPlayer - lsls r0, 24 - cmp r0, 0 - bne _08081C48 - adds r5, r4, 0 - cmp r5, 0x3 - bls _08081C4E - movs r0, 0 -_08081C8C: - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08081C98: .4byte gUnknown_83C7248 - thumb_func_end sub_8081BEC - - thumb_func_start IsTrainerInRangeSouth -IsTrainerInRangeSouth: @ 8081C9C - push {r4,r5,lr} - adds r4, r0, 0 - lsls r1, 16 - lsrs r1, 16 - lsls r3, 16 - lsrs r5, r3, 16 - movs r3, 0x10 - ldrsh r0, [r4, r3] - lsls r2, 16 - asrs r2, 16 - cmp r0, r2 - bne _08081CE4 - lsls r0, r5, 16 - asrs r2, r0, 16 - movs r3, 0x12 - ldrsh r0, [r4, r3] - cmp r2, r0 - ble _08081CE4 - lsls r1, 16 - asrs r1, 16 - adds r0, r1 - cmp r2, r0 - bgt _08081CE4 - cmp r1, 0x3 - ble _08081CDA - bl sub_805DF30 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x10 - beq _08081CE4 -_08081CDA: - ldrb r0, [r4, 0x12] - subs r0, r5, r0 - lsls r0, 24 - lsrs r0, 24 - b _08081CE6 -_08081CE4: - movs r0, 0 -_08081CE6: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end IsTrainerInRangeSouth - - thumb_func_start IsTrainerInRangeNorth -IsTrainerInRangeNorth: @ 8081CEC - push {r4-r6,lr} - adds r4, r0, 0 - lsls r1, 16 - lsrs r6, r1, 16 - lsls r3, 16 - lsrs r5, r3, 16 - movs r1, 0x10 - ldrsh r0, [r4, r1] - lsls r2, 16 - asrs r2, 16 - cmp r0, r2 - bne _08081D26 - lsls r0, r5, 16 - asrs r2, r0, 16 - ldrh r3, [r4, 0x12] - movs r1, 0x12 - ldrsh r0, [r4, r1] - cmp r2, r0 - bge _08081D26 - adds r1, r0, 0 - lsls r0, r6, 16 - asrs r0, 16 - subs r1, r0 - cmp r2, r1 - blt _08081D26 - subs r0, r3, r5 - lsls r0, 24 - lsrs r0, 24 - b _08081D28 -_08081D26: - movs r0, 0 -_08081D28: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end IsTrainerInRangeNorth - - thumb_func_start IsTrainerInRangeWest -IsTrainerInRangeWest: @ 8081D30 - push {r4-r6,lr} - adds r4, r0, 0 - lsls r1, 16 - lsrs r6, r1, 16 - lsls r2, 16 - lsrs r5, r2, 16 - movs r1, 0x12 - ldrsh r0, [r4, r1] - lsls r3, 16 - asrs r3, 16 - cmp r0, r3 - bne _08081D6A - lsls r0, r5, 16 - asrs r3, r0, 16 - ldrh r2, [r4, 0x10] - movs r1, 0x10 - ldrsh r0, [r4, r1] - cmp r3, r0 - bge _08081D6A - adds r1, r0, 0 - lsls r0, r6, 16 - asrs r0, 16 - subs r1, r0 - cmp r3, r1 - blt _08081D6A - subs r0, r2, r5 - lsls r0, 24 - lsrs r0, 24 - b _08081D6C -_08081D6A: - movs r0, 0 -_08081D6C: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end IsTrainerInRangeWest - - thumb_func_start IsTrainerInRangeEast -IsTrainerInRangeEast: @ 8081D74 - push {r4-r6,lr} - adds r4, r0, 0 - lsls r1, 16 - lsrs r6, r1, 16 - lsls r2, 16 - lsrs r5, r2, 16 - movs r1, 0x12 - ldrsh r0, [r4, r1] - lsls r3, 16 - asrs r3, 16 - cmp r0, r3 - bne _08081DAE - lsls r0, r5, 16 - asrs r3, r0, 16 - ldrh r2, [r4, 0x10] - movs r1, 0x10 - ldrsh r0, [r4, r1] - cmp r3, r0 - ble _08081DAE - adds r1, r0, 0 - lsls r0, r6, 16 - asrs r0, 16 - adds r1, r0 - cmp r3, r1 - bgt _08081DAE - subs r0, r5, r2 - lsls r0, 24 - lsrs r0, 24 - b _08081DB0 -_08081DAE: - movs r0, 0 -_08081DB0: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end IsTrainerInRangeEast - - thumb_func_start CheckPathBetweenTrainerAndPlayer -CheckPathBetweenTrainerAndPlayer: @ 8081DB8 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x4 - adds r6, r0, 0 - lsls r1, 24 - lsrs r1, 24 - mov r9, r1 - lsls r2, 24 - lsrs r7, r2, 24 - cmp r1, 0 - beq _08081E54 - ldrh r1, [r6, 0x10] - mov r0, sp - strh r1, [r0] - ldrh r0, [r6, 0x12] - mov r1, sp - adds r1, 0x2 - strh r0, [r1] - movs r4, 0 - mov r8, r1 - mov r5, r9 - subs r5, 0x1 - cmp r4, r5 - bgt _08081E26 -_08081DEC: - mov r0, sp - movs r2, 0 - ldrsh r1, [r0, r2] - mov r3, r8 - movs r0, 0 - ldrsh r2, [r3, r0] - adds r0, r6, 0 - adds r3, r7, 0 - bl sub_8063770 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0 - beq _08081E12 - movs r0, 0x2 - negs r0, r0 - ands r1, r0 - cmp r1, 0 - bne _08081E54 -_08081E12: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - adds r0, r7, 0 - mov r1, sp - mov r2, r8 - bl MoveCoords - cmp r4, r5 - ble _08081DEC -_08081E26: - ldrb r4, [r6, 0x19] - lsls r5, r4, 28 - lsrs r5, 28 - lsrs r4, 4 - movs r0, 0 - strb r0, [r6, 0x19] - mov r0, sp - movs r2, 0 - ldrsh r1, [r0, r2] - mov r3, r8 - movs r0, 0 - ldrsh r2, [r3, r0] - adds r0, r6, 0 - adds r3, r7, 0 - bl npc_block_way - lsls r0, 24 - lsrs r1, r0, 24 - lsls r4, 4 - orrs r5, r4 - strb r5, [r6, 0x19] - cmp r1, 0x4 - beq _08081E58 -_08081E54: - movs r0, 0 - b _08081E5A -_08081E58: - mov r0, r9 -_08081E5A: - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end CheckPathBetweenTrainerAndPlayer - thumb_func_start sub_8081E68 sub_8081E68: @ 8081E68 push {r4,r5,lr} diff --git a/data/trainer_see.s b/data/trainer_see.s index 3014d8ba0..13641f259 100644 --- a/data/trainer_see.s +++ b/data/trainer_see.s @@ -4,15 +4,6 @@ .section .rodata .align 2 -gUnknown_83C6AC8:: - .incbin "graphics/object_events/emoticons.4bpp" - -gUnknown_83C7248:: @ 83C7248 - .4byte IsTrainerInRangeSouth - .4byte IsTrainerInRangeNorth - .4byte IsTrainerInRangeWest - .4byte IsTrainerInRangeEast - gUnknown_83C7258:: @ 83C7258 .4byte sub_8081F34 .4byte sub_8081F38 diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 650f137d9..b5acd4bbb 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -76,7 +76,7 @@ u8 GetStepInPlaceDelay4AnimId(u32); u8 GetStepInPlaceDelay8AnimId(u32); u8 GetStepInPlaceDelay16AnimId(u32); u8 GetStepInPlaceDelay32AnimId(u32); -u8 npc_block_way(struct ObjectEvent *, s16, s16, u32); +u8 GetCollisionAtCoords(struct ObjectEvent *, s16, s16, u32); void MoveCoords(u8, s16 *, s16 *); bool8 ObjectEventIsSpecialAnimActive(struct ObjectEvent *); u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *); @@ -98,6 +98,9 @@ u8 GetTrainerFacingDirectionMovementType(u8 direction); void CameraObjectSetFollowedObjectId(u8 spriteId); void UnfreezeObjectEvents(void); void TurnObjectEvent(u8, u8); +const u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId); +u8 sub_805DF30(void); +u8 GetCollisionFlagsAtCoords(struct ObjectEvent * objectEvent, s16 x, s16 y, u8 direction); // Exported data declarations diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index e0053fe88..c599b68ab 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -205,9 +205,9 @@ struct ObjectEvent /*0x0A*/ u8 mapGroup; /*0x0B*/ u8 mapobj_unk_0B_0:4; u8 elevation:4; - /*0x0C*/ struct Coords16 coords1; - /*0x10*/ struct Coords16 coords2; - /*0x14*/ struct Coords16 coords3; + /*0x0C*/ struct Coords16 initialCoords; + /*0x10*/ struct Coords16 currentCoords; + /*0x14*/ struct Coords16 previousCoords; /*0x18*/ u8 facingDirection:4; //current direction? /*0x18*/ u8 placeholder18:4; /*0x19*/ union ObjectEventRange range; diff --git a/include/quest_log.h b/include/quest_log.h index eddd4c02a..25d0d5871 100644 --- a/include/quest_log.h +++ b/include/quest_log.h @@ -49,5 +49,6 @@ void *QuestLogGetFlagOrVarPtr(bool8 isFlag, u16 idx); void QuestLogSetFlagOrVar(bool8 isFlag, u16 idx, u16 value); void sub_8110840(void *oldSave); void sub_8112F18(u8 windowId); +bool8 sub_8111C2C(void); #endif //GUARD_QUEST_LOG_H diff --git a/ld_script.txt b/ld_script.txt index d15778e06..a11f859f9 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -122,6 +122,7 @@ SECTIONS { src/field_screen_effect.o(.text); 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); @@ -444,6 +445,7 @@ SECTIONS { src/field_screen_effect.o(.rodata); 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); diff --git a/src/quest_log_objects.c b/src/quest_log_objects.c index aecc5fd68..e029632f3 100644 --- a/src/quest_log_objects.c +++ b/src/quest_log_objects.c @@ -39,8 +39,8 @@ void SetQuestLogObjectEventsData(struct QuestLog * questLog) questLog->unk_008[i].localId = gObjectEvents[i].localId; questLog->unk_008[i].mapNum = gObjectEvents[i].mapNum; questLog->unk_008[i].mapGroup = gObjectEvents[i].mapGroup; - questLog->unk_008[i].x = gObjectEvents[i].coords2.x; - questLog->unk_008[i].y = gObjectEvents[i].coords2.y; + questLog->unk_008[i].x = gObjectEvents[i].currentCoords.x; + questLog->unk_008[i].y = gObjectEvents[i].currentCoords.y; questLog->unk_008[i].trainerRange_berryTreeId = gObjectEvents[i].trainerRange_berryTreeId; questLog->unk_008[i].mapobj_unk_1F = gObjectEvents[i].mapobj_unk_1F; questLog->unk_008[i].mapobj_unk_21 = gObjectEvents[i].mapobj_unk_21; @@ -83,8 +83,8 @@ void sub_815A1F8(const struct QuestLog * questLog, const struct ObjectEventTempl gObjectEvents[i].localId = questLogObjectEvents[i].localId; gObjectEvents[i].mapNum = questLogObjectEvents[i].mapNum; gObjectEvents[i].mapGroup = questLogObjectEvents[i].mapGroup; - gObjectEvents[i].coords2.x = questLogObjectEvents[i].x; - gObjectEvents[i].coords2.y = questLogObjectEvents[i].y; + gObjectEvents[i].currentCoords.x = questLogObjectEvents[i].x; + gObjectEvents[i].currentCoords.y = questLogObjectEvents[i].y; gObjectEvents[i].trainerRange_berryTreeId = questLogObjectEvents[i].trainerRange_berryTreeId; gObjectEvents[i].mapobj_unk_1F = questLogObjectEvents[i].mapobj_unk_1F; gObjectEvents[i].mapobj_unk_21 = questLogObjectEvents[i].mapobj_unk_21; @@ -94,38 +94,38 @@ void sub_815A1F8(const struct QuestLog * questLog, const struct ObjectEventTempl { if (gObjectEvents[i].localId == templates[j].localId) { - gObjectEvents[i].coords1.x = templates[j].x + 7; - gObjectEvents[i].coords1.y = templates[j].y + 7; + gObjectEvents[i].initialCoords.x = templates[j].x + 7; + gObjectEvents[i].initialCoords.y = templates[j].y + 7; gObjectEvents[i].range.as_nybbles.x = templates[j].movementRangeX; gObjectEvents[i].range.as_nybbles.y = templates[j].movementRangeY; } } - gObjectEvents[i].mapobj_unk_1E = MapGridGetMetatileBehaviorAt(gObjectEvents[i].coords2.x, gObjectEvents[i].coords2.y); - if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].coords2.x), (s16)(gObjectEvents[i].coords2.y))) + gObjectEvents[i].mapobj_unk_1E = MapGridGetMetatileBehaviorAt(gObjectEvents[i].currentCoords.x, gObjectEvents[i].currentCoords.y); + if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x), (s16)(gObjectEvents[i].currentCoords.y))) { - gObjectEvents[i].coords3.x = gObjectEvents[i].coords2.x; - gObjectEvents[i].coords3.y = gObjectEvents[i].coords2.y; + gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x; + gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y; } - else if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].coords2.x - 1), (s16)(gObjectEvents[i].coords2.y))) + else if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x - 1), (s16)(gObjectEvents[i].currentCoords.y))) { - gObjectEvents[i].coords3.x = gObjectEvents[i].coords2.x - 1; - gObjectEvents[i].coords3.y = gObjectEvents[i].coords2.y; + gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x - 1; + gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y; } - else if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].coords2.x + 1), (s16)(gObjectEvents[i].coords2.y))) + else if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x + 1), (s16)(gObjectEvents[i].currentCoords.y))) { - gObjectEvents[i].coords3.x = gObjectEvents[i].coords2.x + 1; - gObjectEvents[i].coords3.y = gObjectEvents[i].coords2.y; + gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x + 1; + gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y; } - else if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].coords2.x), (s16)(gObjectEvents[i].coords2.y - 1))) + else if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x), (s16)(gObjectEvents[i].currentCoords.y - 1))) { - gObjectEvents[i].coords3.x = gObjectEvents[i].coords2.x; - gObjectEvents[i].coords3.y = gObjectEvents[i].coords2.y - 1; + gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x; + gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y - 1; } - else if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].coords2.x), (s16)(gObjectEvents[i].coords2.y + 1))) + else if (gObjectEvents[i].mapobj_unk_1F == MapGridGetMetatileBehaviorAt((s16)(gObjectEvents[i].currentCoords.x), (s16)(gObjectEvents[i].currentCoords.y + 1))) { - gObjectEvents[i].coords3.x = gObjectEvents[i].coords2.x; - gObjectEvents[i].coords3.y = gObjectEvents[i].coords2.y + 1; + gObjectEvents[i].previousCoords.x = gObjectEvents[i].currentCoords.x; + gObjectEvents[i].previousCoords.y = gObjectEvents[i].currentCoords.y + 1; } } diff --git a/src/quest_log_player.c b/src/quest_log_player.c index 0d7a2bb50..d66c677d8 100644 --- a/src/quest_log_player.c +++ b/src/quest_log_player.c @@ -145,8 +145,8 @@ static void sub_8150708(void) sub_81507BC(objectEvent, sub_805C808(2)); ObjectEventTurn(objectEvent, objectEvent->placeholder18); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING); - gFieldEffectArguments[0] = objectEvent->coords2.x; - gFieldEffectArguments[1] = objectEvent->coords2.y; + gFieldEffectArguments[0] = objectEvent->currentCoords.x; + gFieldEffectArguments[1] = objectEvent->currentCoords.y; gFieldEffectArguments[2] = gPlayerAvatar.objectEventId; fieldEffectId = FieldEffectStart(FLDEFF_SURF_BLOB); objectEvent->mapobj_unk_1A = fieldEffectId; diff --git a/src/trainer_see.c b/src/trainer_see.c new file mode 100644 index 000000000..a04fe83ec --- /dev/null +++ b/src/trainer_see.c @@ -0,0 +1,174 @@ +#include "global.h" +#include "battle_setup.h" +#include "field_player_avatar.h" +#include "event_object_movement.h" +#include "quest_log.h" +#include "constants/battle_setup.h" + +static bool8 CheckTrainer(u8 objectEventId); +static u8 GetTrainerApproachDistance(struct ObjectEvent * objectEvent); +static u8 GetTrainerApproachDistanceSouth(struct ObjectEvent * objectEvent, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceNorth(struct ObjectEvent * objectEvent, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceWest(struct ObjectEvent * objectEvent, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceEast(struct ObjectEvent * objectEvent, s16 range, s16 x, s16 y); +static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent * objectEvent, u8 approachDistance, u8 facingDirection); +void sub_8081E68(struct ObjectEvent * objectEvent, u8 approachDistance); + +const u16 gUnknown_83C6AC8[] = INCBIN_U16("graphics/object_events/emoticons.4bpp"); + +u8 (*const sDirectionalApproachDistanceFuncs[])(struct ObjectEvent *, s16 range, s16 x, s16 y) = { + GetTrainerApproachDistanceSouth, + GetTrainerApproachDistanceNorth, + GetTrainerApproachDistanceWest, + GetTrainerApproachDistanceEast +}; + +bool8 CheckForTrainersWantingBattle(void) +{ + u8 i; + if (sub_8111C2C() == TRUE) + return FALSE; + + for (i = 0; i < OBJECT_EVENTS_COUNT; i++) + { + if (gObjectEvents[i].active + && ( + gObjectEvents[i].trainerType == 1 + || gObjectEvents[i].trainerType == 3 + ) + && CheckTrainer(i) + ) + return TRUE; + } + return FALSE; +} + +static bool8 CheckTrainer(u8 objectEventId) +{ + const u8 *script = GetObjectEventScriptPointerByObjectEventId(objectEventId); + u8 approachDistance; + if (GetTrainerFlagFromScriptPointer(script)) + return FALSE; + approachDistance = GetTrainerApproachDistance(&gObjectEvents[objectEventId]); + if (approachDistance != 0) + { + if (script[1] == TRAINER_BATTLE_DOUBLE && GetMonsStateToDoubles()) + return FALSE; + ConfigureAndSetUpOneTrainerBattle(objectEventId, script); + sub_8081E68(&gObjectEvents[objectEventId], approachDistance - 1); + return TRUE; + } + return FALSE; +} + +static u8 GetTrainerApproachDistance(struct ObjectEvent *trainerObj) +{ + s16 x, y; + u8 i; + u8 approachDistance; + + PlayerGetDestCoords(&x, &y); + if (trainerObj->trainerType == 1) // can only see in one direction + { + approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->facingDirection - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); + return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->facingDirection); + } + else // can see in all directions + { + for (i = 0; i < 4; i++) + { + approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); + if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east + return approachDistance; + } + } + + return 0; +} + +// Returns how far south the player is from trainer. 0 if out of trainer's sight. +static u8 GetTrainerApproachDistanceSouth(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->currentCoords.x == x + && y > trainerObj->currentCoords.y + && y <= trainerObj->currentCoords.y + range) + { + if (range > 3 && sub_805DF30() == OBJECT_EVENTS_COUNT) + return 0; + return (y - trainerObj->currentCoords.y); + } + else + return 0; +} + +// Returns how far north the player is from trainer. 0 if out of trainer's sight. +static u8 GetTrainerApproachDistanceNorth(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->currentCoords.x == x + && y < trainerObj->currentCoords.y + && y >= trainerObj->currentCoords.y - range) + return (trainerObj->currentCoords.y - y); + else + return 0; +} + +// Returns how far west the player is from trainer. 0 if out of trainer's sight. +static u8 GetTrainerApproachDistanceWest(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->currentCoords.y == y + && x < trainerObj->currentCoords.x + && x >= trainerObj->currentCoords.x - range) + return (trainerObj->currentCoords.x - x); + else + return 0; +} + +// Returns how far east the player is from trainer. 0 if out of trainer's sight. +static u8 GetTrainerApproachDistanceEast(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) +{ + if (trainerObj->currentCoords.y == y + && x > trainerObj->currentCoords.x + && x <= trainerObj->currentCoords.x + range) + return (x - trainerObj->currentCoords.x); + else + return 0; +} + +#define COLLISION_MASK (~1) + +static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 approachDistance, u8 direction) +{ + s16 x, y; + u8 unk19_temp; + u8 unk19b_temp; + u8 i; + u8 collision; + + if (approachDistance == 0) + return 0; + + x = trainerObj->currentCoords.x; + y = trainerObj->currentCoords.y; + + for (i = 0; i <= approachDistance - 1; i++, MoveCoords(direction, &x, &y)) + { + collision = GetCollisionFlagsAtCoords(trainerObj, x, y, direction); + if (collision != 0 && (collision & COLLISION_MASK)) + return 0; + } + + // preserve mapobj_unk_19 before clearing. + unk19_temp = trainerObj->range.as_nybbles.x; + unk19b_temp = trainerObj->range.as_nybbles.y; + trainerObj->range.as_nybbles.x = 0; + trainerObj->range.as_nybbles.y = 0; + + collision = GetCollisionAtCoords(trainerObj, x, y, direction); + + trainerObj->range.as_nybbles.x = unk19_temp; + trainerObj->range.as_nybbles.y = unk19b_temp; + if (collision == 4) + return approachDistance; + + return 0; +} diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 9c9a4d67f..221108a8f 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -798,8 +798,8 @@ static void GatherNearbyTrainerInfo(void) sVsSeeker->trainerInfo[vsSeekerObjectIdx].localId = templates[objectEventIdx].localId; TryGetObjectEventIdByLocalIdAndMap(templates[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectEventId); sVsSeeker->trainerInfo[vsSeekerObjectIdx].objectEventId = objectEventId; - sVsSeeker->trainerInfo[vsSeekerObjectIdx].xCoord = gObjectEvents[objectEventId].coords2.x - 7; - sVsSeeker->trainerInfo[vsSeekerObjectIdx].yCoord = gObjectEvents[objectEventId].coords2.y - 7; + sVsSeeker->trainerInfo[vsSeekerObjectIdx].xCoord = gObjectEvents[objectEventId].currentCoords.x - 7; + sVsSeeker->trainerInfo[vsSeekerObjectIdx].yCoord = gObjectEvents[objectEventId].currentCoords.y - 7; sVsSeeker->trainerInfo[vsSeekerObjectIdx].graphicsId = templates[objectEventIdx].graphicsId; vsSeekerObjectIdx++; } |