From bbbfb856e0265fdff3f6520032fd5795d1815d8c Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Sun, 22 Jun 2025 16:25:39 -0500 Subject: [PATCH] Decomped GetEntityMoveTargetAndRange --- asm/include/overlay_29_0231A9F8.inc | 29 +- asm/include/overlay_29_0231AD38.inc | 20 ++ asm/overlay_29_0231A9F8.s | 419 ---------------------------- asm/overlay_29_0231AD38.s | 381 +++++++++++++++++++++++++ include/item.h | 137 +++++++++ include/overlay_29_0231ACAC.h | 13 + main.lsf | 2 + src/dungeon_ai_attack.c | 4 +- src/overlay_29_0231ACAC.c | 26 ++ 9 files changed, 586 insertions(+), 445 deletions(-) create mode 100644 asm/include/overlay_29_0231AD38.inc create mode 100644 asm/overlay_29_0231AD38.s create mode 100644 include/overlay_29_0231ACAC.h create mode 100644 src/overlay_29_0231ACAC.c diff --git a/asm/include/overlay_29_0231A9F8.inc b/asm/include/overlay_29_0231A9F8.inc index 1895646f..ecf2ba88 100644 --- a/asm/include/overlay_29_0231A9F8.inc +++ b/asm/include/overlay_29_0231A9F8.inc @@ -1,39 +1,20 @@ #pragma once .public AiConsiderMove .public AreOrbsAllowed -.public BoostSpeedOneStage .public DUNGEON_PTR -.public DungeonRandInt .public EnemyEvolution .public EntityIsValid__02319F8C -.public EntityIsValid__0231B194 -.public ExclusiveItemEffectIsActive__0231A87C -.public GetApparentWeather .public GetItemMoveId16 .public GetItemToUse -.public GetMoveTargetAndRange -.public GetTreasureBoxChances .public InitMove .public IsFloorOver -.public IsMonster__0231A9D4 -.public IsMoveRangeString19 -.public LogMessageByIdWithPopupCheckParticipants .public LogMessageByIdWithPopupCheckUser -.public LogMessageByIdWithPopupCheckUserTarget -.public MonsterIsType -.public NATURAL_GIFT_ITEM_TABLE -.public ov29_022E4110 -.public ov29_022EB4E8 -.public ov29_022FB9E0 -.public ov29_022FBAB4 -.public ov29_02321274 -.public ov29_0232145C -.public ov29_02322374 -.public ov29_0232E80C -.public ov29_02344B44 .public RemoveUsedItem -.public SetActionUseMoveAi .public SubstitutePlaceholderStringTags .public TryActivateTruant .public UpdateAiTargetPos -.public WEATHER_BALL_TYPE_TABLE +.public ov29_022EB4E8 +.public ov29_022FBAB4 +.public ov29_02321274 +.public ov29_02322374 +.public ov29_02344B44 diff --git a/asm/include/overlay_29_0231AD38.inc b/asm/include/overlay_29_0231AD38.inc new file mode 100644 index 00000000..0318e07c --- /dev/null +++ b/asm/include/overlay_29_0231AD38.inc @@ -0,0 +1,20 @@ +#pragma once +.public BoostSpeedOneStage +.public DUNGEON_PTR +.public DungeonRandInt +.public EntityIsValid__0231B194 +.public GetApparentWeather +.public GetEntityMoveTargetAndRange +.public GetTreasureBoxChances +.public IsMonster__0231A9D4 +.public LogMessageByIdWithPopupCheckParticipants +.public LogMessageByIdWithPopupCheckUserTarget +.public NATURAL_GIFT_ITEM_TABLE +.public SetActionUseMoveAi +.public SubstitutePlaceholderStringTags +.public WEATHER_BALL_TYPE_TABLE +.public ov29_022E4110 +.public ov29_022FB9E0 +.public ov29_0232145C +.public ov29_0232E80C +.public ov29_02344B44 diff --git a/asm/overlay_29_0231A9F8.s b/asm/overlay_29_0231A9F8.s index 612afda8..d19a200b 100644 --- a/asm/overlay_29_0231A9F8.s +++ b/asm/overlay_29_0231A9F8.s @@ -207,422 +207,3 @@ _0231ACA0: .word 0x00000DFB + OV29_0231A9F8_OFFSET _0231ACA4: .word 0x00000DFC + OV29_0231A9F8_OFFSET _0231ACA8: .word 0x00000141 arm_func_end ov29_0231A9F8 - - arm_func_start GetEntityMoveTargetAndRange -GetEntityMoveTargetAndRange: ; 0x0231ACAC - stmdb sp!, {r4, r5, r6, lr} - mov r5, r1 - ldrh r1, [r5, #4] - mov r4, r2 - mov r6, r0 - cmp r1, #0xed - cmpeq r4, #0 - bne _0231ACE0 - mov r1, #0xe - bl MonsterIsType - cmp r0, #0 - moveq r0, #0x73 - ldmeqia sp!, {r4, r5, r6, pc} -_0231ACE0: - mov r0, r5 - mov r1, r4 - bl GetMoveTargetAndRange - mov r4, r0 - mov r0, r5 - bl IsMoveRangeString19 - cmp r0, #0 - beq _0231AD2C - mov r0, r6 - mov r1, #0x55 - bl ExclusiveItemEffectIsActive__0231A87C - cmp r0, #0 - beq _0231AD2C - ldr r0, _0231AD34 ; =0x00000273 - cmp r4, r0 - subeq r4, r0, #0x12 - beq _0231AD2C - cmp r4, #0x73 - moveq r4, #0x61 -_0231AD2C: - mov r0, r4 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0231AD34: .word 0x00000273 - arm_func_end GetEntityMoveTargetAndRange - - arm_func_start ov29_0231AD38 -ov29_0231AD38: ; 0x0231AD38 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r2, #1 - bl GetEntityMoveTargetAndRange - and r4, r0, #0xf - mov r0, r6 - mov r1, r5 - mov r2, #0 - bl GetEntityMoveTargetAndRange - cmp r4, #3 - and r0, r0, #0xf - cmpne r4, #1 - cmpne r0, #4 - cmpne r0, #3 - cmpne r0, #1 - cmpne r0, #6 - beq _0231ADA0 - mov r0, r6 - mov r1, r5 - mov r2, #0 - bl GetEntityMoveTargetAndRange - and r0, r0, #0xf0 - cmp r0, #0x70 - movne r0, #0 - ldmneia sp!, {r4, r5, r6, pc} -_0231ADA0: - mov r0, #1 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end ov29_0231AD38 - - arm_func_start ov29_0231ADA8 -ov29_0231ADA8: ; 0x0231ADA8 - stmdb sp!, {r3, r4, r5, lr} - sub sp, sp, #8 - ldr r1, [r0, #0xb4] - mov r0, #0 - mov r5, r0 -#ifdef JAPAN - add r4, r1, #0x120 -#else - add r4, r1, #0x124 -#endif - mov ip, r0 - mov lr, #1 - add r2, sp, #0 -_0231ADCC: - ldrb r1, [r4, r5, lsl #3] - add r3, r4, r5, lsl #3 - tst r1, #1 - movne r1, lr - moveq r1, ip - tst r1, #0xff - beq _0231AE00 - ldrh r3, [r3, #4] - add r1, r0, #1 - mov r0, r0, lsl #1 - mov r1, r1, lsl #0x10 - strh r3, [r2, r0] - mov r0, r1, lsr #0x10 -_0231AE00: - add r1, r5, #1 - mov r1, r1, lsl #0x10 - mov r5, r1, lsr #0x10 - cmp r5, #4 - blo _0231ADCC - cmp r0, #0 - moveq r0, #0 - beq _0231AE34 - bl DungeonRandInt - mov r0, r0, lsl #0x10 - add r1, sp, #0 - mov r0, r0, lsr #0xf - ldrh r0, [r1, r0] -_0231AE34: - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_0231ADA8 - - arm_func_start ov29_0231AE3C -ov29_0231AE3C: ; 0x0231AE3C - stmdb sp!, {r3, lr} - ldr ip, [r0, #0xb4] - mov r0, #0 - mov lr, r0 - mov r2, r0 - mov r3, #1 -_0231AE54: - add r1, ip, lr, lsl #3 -#ifdef JAPAN - ldrb r1, [r1, #0x120] -#else - ldrb r1, [r1, #0x124] -#endif - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - add r1, lr, #1 - addne r0, r0, #1 - mov r1, r1, lsl #0x10 - movne r0, r0, lsl #0x10 - mov lr, r1, lsr #0x10 - movne r0, r0, lsr #0x10 - cmp lr, #4 - blo _0231AE54 - ldmia sp!, {r3, pc} - arm_func_end ov29_0231AE3C - - arm_func_start GetEntityNaturalGiftInfo -GetEntityNaturalGiftInfo: ; 0x0231AE90 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r0 - bl IsMonster__0231A9D4 - cmp r0, #0 - ldrne r4, [r4, #0xb4] - ldrnesh r0, [r4, #0x66] - cmpne r0, #0 - beq _0231AF00 - mov ip, #0 - ldr r3, _0231AF08 ; =NATURAL_GIFT_ITEM_TABLE - mov lr, ip - mov r1, #6 -_0231AEC0: - smulbb r5, lr, r1 - ldrsh r2, [r3, r5] - cmp r2, #0 - beq _0231AEF0 - ldrsh r0, [r4, #0x66] - cmp r0, r2 - moveq ip, #1 - beq _0231AEF0 - add r0, lr, #1 - mov r0, r0, lsl #0x10 - mov lr, r0, asr #0x10 - b _0231AEC0 -_0231AEF0: - cmp ip, #0 - ldrne r0, _0231AF08 ; =NATURAL_GIFT_ITEM_TABLE - addne r0, r0, r5 - ldmneia sp!, {r3, r4, r5, pc} -_0231AF00: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0231AF08: .word NATURAL_GIFT_ITEM_TABLE - arm_func_end GetEntityNaturalGiftInfo - - arm_func_start GetEntityWeatherBallType -GetEntityWeatherBallType: ; 0x0231AF0C - stmdb sp!, {r3, lr} - bl GetApparentWeather - ldr r1, _0231AF20 ; =WEATHER_BALL_TYPE_TABLE - ldrb r0, [r1, r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_0231AF20: .word WEATHER_BALL_TYPE_TABLE - arm_func_end GetEntityWeatherBallType - - arm_func_start ov29_0231AF24 -ov29_0231AF24: ; 0x0231AF24 -#ifdef JAPAN -#define OV29_0231AF24_OFFSET -4 -#else -#define OV29_0231AF24_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #4 - mov r6, r0 - mov r5, r1 - mov r4, r2 - bl IsMonster__0231A9D4 - cmp r0, #0 - beq _0231AFAC - mov r0, r6 - mov r1, r5 - bl ov29_022FB9E0 - mov r1, r0 - cmp r4, #0 - beq _0231AF98 - cmp r1, #0 - bge _0231AF98 - ldr r4, [r6, #0xb4] - mov r1, #0 - mov r2, r1 - add r0, r4, #0x4a - bl SetActionUseMoveAi - mov r2, #1 - strb r2, [r4, #0x124 + OV29_0231AF24_OFFSET] - add r0, r4, #0x100 - mov r1, #0 - strh r1, [r0, #0x26 + OV29_0231AF24_OFFSET] - strh r5, [r0, #0x28 + OV29_0231AF24_OFFSET] - strb r2, [r4, #0x12a + OV29_0231AF24_OFFSET] - strb r1, [r4, #0x12b + OV29_0231AF24_OFFSET] -_0231AF98: - mov r3, #0 - mov r0, r6 - mov r2, #1 - str r3, [sp] - bl ov29_0232145C -_0231AFAC: - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, pc} - arm_func_end ov29_0231AF24 - - arm_func_start ov29_0231AFB4 -ov29_0231AFB4: ; 0x0231AFB4 - stmdb sp!, {r4, lr} - mov ip, #0 - ldr r1, _0231B004 ; =DUNGEON_PTR - mov r2, ip - mov r3, ip -_0231AFC8: - ldr r0, [r1] - mov r4, r3 -#ifdef JAPAN - add r0, r0, #0x1840 - add r0, r0, #0x18000 -#else - add r0, r0, #0xe4 - add r0, r0, #0x19800 -#endif - add lr, r0, ip, lsl #4 -_0231AFDC: - str r2, [lr, r4, lsl #3] - add r0, lr, r4, lsl #3 - add r4, r4, #1 - str r2, [r0, #4] - cmp r4, #2 - blt _0231AFDC - add ip, ip, #1 - cmp ip, #2 - blt _0231AFC8 - ldmia sp!, {r4, pc} - .align 2, 0 -_0231B004: .word DUNGEON_PTR - arm_func_end ov29_0231AFB4 - - arm_func_start ov29_0231B008 -ov29_0231B008: ; 0x0231B008 - stmdb sp!, {r3, r4, r5, lr} - mov lr, #0 - ldr r1, _0231B05C ; =DUNGEON_PTR - mov r3, lr - mov r2, #2 - mov ip, lr -_0231B020: - ldr r0, [r1] - mov r5, ip -#ifdef JAPAN - add r0, r0, #0x1840 - add r0, r0, #0x18000 -#else - add r0, r0, #0xe4 - add r0, r0, #0x19800 -#endif - add r4, r0, lr, lsl #4 -_0231B034: - str r3, [r4, r5, lsl #3] - add r0, r4, r5, lsl #3 - add r5, r5, #1 - str r2, [r0, #4] - cmp r5, #2 - blt _0231B034 - add lr, lr, #1 - cmp lr, #2 - blt _0231B020 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_0231B05C: .word DUNGEON_PTR - arm_func_end ov29_0231B008 - - arm_func_start ActivateMotorDrive -ActivateMotorDrive: ; 0x0231B060 - stmdb sp!, {r3, r4, lr} - sub sp, sp, #4 -#ifdef JAPAN - mov ip, #0x66 - mov r4, r0 - rsb r2, ip, #0x9e0 -#else - ldr r2, _0231B0A0 ; =0x00000C3B - mov ip, #0x66 - mov r4, r0 -#endif - mov r1, #0 - mov r3, #2 - str ip, [sp] - bl LogMessageByIdWithPopupCheckParticipants - mov r0, r4 - mov r1, r4 - mov r2, #0 - mov r3, #1 - bl BoostSpeedOneStage - add sp, sp, #4 - ldmia sp!, {r3, r4, pc} - .align 2, 0 -#ifndef JAPAN -_0231B0A0: .word 0x00000C3B -#endif - arm_func_end ActivateMotorDrive - - arm_func_start TryActivateFrisk -TryActivateFrisk: ; 0x0231B0A4 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #8 - mov r5, r0 - mov r4, r1 - bl EntityIsValid__0231B194 - cmp r0, #0 - beq _0231B184 - mov r0, r4 - bl EntityIsValid__0231B194 - cmp r0, #0 - beq _0231B184 - ldr r0, [r5, #0xb4] - ldr r6, [r4, #0xb4] - ldrb r0, [r0, #6] - cmp r0, #0 - bne _0231B184 - bl ov29_0232E80C - cmp r4, r0 - ldrneb r0, [r6, #6] - cmpne r0, #0 - beq _0231B184 - ldrsh r0, [r6, #0x66] - cmp r0, #0 - bne _0231B150 - ldrsh r0, [r6, #2] - add r1, sp, #0 - bl GetTreasureBoxChances - ldrsh r0, [sp, #4] - cmp r0, #0 - ldrlesh r0, [sp, #6] - cmple r0, #0 - ble _0231B184 - mov r0, r5 - bl ov29_022E4110 - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - ldr r2, _0231B18C ; =0x00000C3D - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget - b _0231B184 -_0231B150: - mov r0, r5 - bl ov29_022E4110 - mov r1, r4 - mov r0, #1 - mov r2, #0 - bl SubstitutePlaceholderStringTags - add r1, r6, #0x62 - mov r0, #2 - bl ov29_02344B44 - ldr r2, _0231B190 ; =0x00000C3C - mov r0, r5 - mov r1, r4 - bl LogMessageByIdWithPopupCheckUserTarget -_0231B184: - add sp, sp, #8 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -#ifdef JAPAN -_0231B18C: .word 0x0000097C -_0231B190: .word 0x0000097B -#else -_0231B18C: .word 0x00000C3D -_0231B190: .word 0x00000C3C -#endif - arm_func_end TryActivateFrisk diff --git a/asm/overlay_29_0231AD38.s b/asm/overlay_29_0231AD38.s new file mode 100644 index 00000000..13217d06 --- /dev/null +++ b/asm/overlay_29_0231AD38.s @@ -0,0 +1,381 @@ + .include "asm/macros.inc" + .include "overlay_29_0231AD38.inc" + + .text + + arm_func_start ov29_0231AD38 +ov29_0231AD38: ; 0x0231AD38 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r0 + mov r5, r1 + mov r2, #1 + bl GetEntityMoveTargetAndRange + and r4, r0, #0xf + mov r0, r6 + mov r1, r5 + mov r2, #0 + bl GetEntityMoveTargetAndRange + cmp r4, #3 + and r0, r0, #0xf + cmpne r4, #1 + cmpne r0, #4 + cmpne r0, #3 + cmpne r0, #1 + cmpne r0, #6 + beq _0231ADA0 + mov r0, r6 + mov r1, r5 + mov r2, #0 + bl GetEntityMoveTargetAndRange + and r0, r0, #0xf0 + cmp r0, #0x70 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, pc} +_0231ADA0: + mov r0, #1 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end ov29_0231AD38 + + arm_func_start ov29_0231ADA8 +ov29_0231ADA8: ; 0x0231ADA8 + stmdb sp!, {r3, r4, r5, lr} + sub sp, sp, #8 + ldr r1, [r0, #0xb4] + mov r0, #0 + mov r5, r0 +#ifdef JAPAN + add r4, r1, #0x120 +#else + add r4, r1, #0x124 +#endif + mov ip, r0 + mov lr, #1 + add r2, sp, #0 +_0231ADCC: + ldrb r1, [r4, r5, lsl #3] + add r3, r4, r5, lsl #3 + tst r1, #1 + movne r1, lr + moveq r1, ip + tst r1, #0xff + beq _0231AE00 + ldrh r3, [r3, #4] + add r1, r0, #1 + mov r0, r0, lsl #1 + mov r1, r1, lsl #0x10 + strh r3, [r2, r0] + mov r0, r1, lsr #0x10 +_0231AE00: + add r1, r5, #1 + mov r1, r1, lsl #0x10 + mov r5, r1, lsr #0x10 + cmp r5, #4 + blo _0231ADCC + cmp r0, #0 + moveq r0, #0 + beq _0231AE34 + bl DungeonRandInt + mov r0, r0, lsl #0x10 + add r1, sp, #0 + mov r0, r0, lsr #0xf + ldrh r0, [r1, r0] +_0231AE34: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov29_0231ADA8 + + arm_func_start ov29_0231AE3C +ov29_0231AE3C: ; 0x0231AE3C + stmdb sp!, {r3, lr} + ldr ip, [r0, #0xb4] + mov r0, #0 + mov lr, r0 + mov r2, r0 + mov r3, #1 +_0231AE54: + add r1, ip, lr, lsl #3 +#ifdef JAPAN + ldrb r1, [r1, #0x120] +#else + ldrb r1, [r1, #0x124] +#endif + tst r1, #1 + movne r1, r3 + moveq r1, r2 + tst r1, #0xff + add r1, lr, #1 + addne r0, r0, #1 + mov r1, r1, lsl #0x10 + movne r0, r0, lsl #0x10 + mov lr, r1, lsr #0x10 + movne r0, r0, lsr #0x10 + cmp lr, #4 + blo _0231AE54 + ldmia sp!, {r3, pc} + arm_func_end ov29_0231AE3C + + arm_func_start GetEntityNaturalGiftInfo +GetEntityNaturalGiftInfo: ; 0x0231AE90 + stmdb sp!, {r3, r4, r5, lr} + mov r4, r0 + bl IsMonster__0231A9D4 + cmp r0, #0 + ldrne r4, [r4, #0xb4] + ldrnesh r0, [r4, #0x66] + cmpne r0, #0 + beq _0231AF00 + mov ip, #0 + ldr r3, _0231AF08 ; =NATURAL_GIFT_ITEM_TABLE + mov lr, ip + mov r1, #6 +_0231AEC0: + smulbb r5, lr, r1 + ldrsh r2, [r3, r5] + cmp r2, #0 + beq _0231AEF0 + ldrsh r0, [r4, #0x66] + cmp r0, r2 + moveq ip, #1 + beq _0231AEF0 + add r0, lr, #1 + mov r0, r0, lsl #0x10 + mov lr, r0, asr #0x10 + b _0231AEC0 +_0231AEF0: + cmp ip, #0 + ldrne r0, _0231AF08 ; =NATURAL_GIFT_ITEM_TABLE + addne r0, r0, r5 + ldmneia sp!, {r3, r4, r5, pc} +_0231AF00: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0231AF08: .word NATURAL_GIFT_ITEM_TABLE + arm_func_end GetEntityNaturalGiftInfo + + arm_func_start GetEntityWeatherBallType +GetEntityWeatherBallType: ; 0x0231AF0C + stmdb sp!, {r3, lr} + bl GetApparentWeather + ldr r1, _0231AF20 ; =WEATHER_BALL_TYPE_TABLE + ldrb r0, [r1, r0] + ldmia sp!, {r3, pc} + .align 2, 0 +_0231AF20: .word WEATHER_BALL_TYPE_TABLE + arm_func_end GetEntityWeatherBallType + + arm_func_start ov29_0231AF24 +ov29_0231AF24: ; 0x0231AF24 +#ifdef JAPAN +#define OV29_0231AF24_OFFSET -4 +#else +#define OV29_0231AF24_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, r6, lr} + sub sp, sp, #4 + mov r6, r0 + mov r5, r1 + mov r4, r2 + bl IsMonster__0231A9D4 + cmp r0, #0 + beq _0231AFAC + mov r0, r6 + mov r1, r5 + bl ov29_022FB9E0 + mov r1, r0 + cmp r4, #0 + beq _0231AF98 + cmp r1, #0 + bge _0231AF98 + ldr r4, [r6, #0xb4] + mov r1, #0 + mov r2, r1 + add r0, r4, #0x4a + bl SetActionUseMoveAi + mov r2, #1 + strb r2, [r4, #0x124 + OV29_0231AF24_OFFSET] + add r0, r4, #0x100 + mov r1, #0 + strh r1, [r0, #0x26 + OV29_0231AF24_OFFSET] + strh r5, [r0, #0x28 + OV29_0231AF24_OFFSET] + strb r2, [r4, #0x12a + OV29_0231AF24_OFFSET] + strb r1, [r4, #0x12b + OV29_0231AF24_OFFSET] +_0231AF98: + mov r3, #0 + mov r0, r6 + mov r2, #1 + str r3, [sp] + bl ov29_0232145C +_0231AFAC: + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, pc} + arm_func_end ov29_0231AF24 + + arm_func_start ov29_0231AFB4 +ov29_0231AFB4: ; 0x0231AFB4 + stmdb sp!, {r4, lr} + mov ip, #0 + ldr r1, _0231B004 ; =DUNGEON_PTR + mov r2, ip + mov r3, ip +_0231AFC8: + ldr r0, [r1] + mov r4, r3 +#ifdef JAPAN + add r0, r0, #0x1840 + add r0, r0, #0x18000 +#else + add r0, r0, #0xe4 + add r0, r0, #0x19800 +#endif + add lr, r0, ip, lsl #4 +_0231AFDC: + str r2, [lr, r4, lsl #3] + add r0, lr, r4, lsl #3 + add r4, r4, #1 + str r2, [r0, #4] + cmp r4, #2 + blt _0231AFDC + add ip, ip, #1 + cmp ip, #2 + blt _0231AFC8 + ldmia sp!, {r4, pc} + .align 2, 0 +_0231B004: .word DUNGEON_PTR + arm_func_end ov29_0231AFB4 + + arm_func_start ov29_0231B008 +ov29_0231B008: ; 0x0231B008 + stmdb sp!, {r3, r4, r5, lr} + mov lr, #0 + ldr r1, _0231B05C ; =DUNGEON_PTR + mov r3, lr + mov r2, #2 + mov ip, lr +_0231B020: + ldr r0, [r1] + mov r5, ip +#ifdef JAPAN + add r0, r0, #0x1840 + add r0, r0, #0x18000 +#else + add r0, r0, #0xe4 + add r0, r0, #0x19800 +#endif + add r4, r0, lr, lsl #4 +_0231B034: + str r3, [r4, r5, lsl #3] + add r0, r4, r5, lsl #3 + add r5, r5, #1 + str r2, [r0, #4] + cmp r5, #2 + blt _0231B034 + add lr, lr, #1 + cmp lr, #2 + blt _0231B020 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_0231B05C: .word DUNGEON_PTR + arm_func_end ov29_0231B008 + + arm_func_start ActivateMotorDrive +ActivateMotorDrive: ; 0x0231B060 + stmdb sp!, {r3, r4, lr} + sub sp, sp, #4 +#ifdef JAPAN + mov ip, #0x66 + mov r4, r0 + rsb r2, ip, #0x9e0 +#else + ldr r2, _0231B0A0 ; =0x00000C3B + mov ip, #0x66 + mov r4, r0 +#endif + mov r1, #0 + mov r3, #2 + str ip, [sp] + bl LogMessageByIdWithPopupCheckParticipants + mov r0, r4 + mov r1, r4 + mov r2, #0 + mov r3, #1 + bl BoostSpeedOneStage + add sp, sp, #4 + ldmia sp!, {r3, r4, pc} + .align 2, 0 +#ifndef JAPAN +_0231B0A0: .word 0x00000C3B +#endif + arm_func_end ActivateMotorDrive + + arm_func_start TryActivateFrisk +TryActivateFrisk: ; 0x0231B0A4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #8 + mov r5, r0 + mov r4, r1 + bl EntityIsValid__0231B194 + cmp r0, #0 + beq _0231B184 + mov r0, r4 + bl EntityIsValid__0231B194 + cmp r0, #0 + beq _0231B184 + ldr r0, [r5, #0xb4] + ldr r6, [r4, #0xb4] + ldrb r0, [r0, #6] + cmp r0, #0 + bne _0231B184 + bl ov29_0232E80C + cmp r4, r0 + ldrneb r0, [r6, #6] + cmpne r0, #0 + beq _0231B184 + ldrsh r0, [r6, #0x66] + cmp r0, #0 + bne _0231B150 + ldrsh r0, [r6, #2] + add r1, sp, #0 + bl GetTreasureBoxChances + ldrsh r0, [sp, #4] + cmp r0, #0 + ldrlesh r0, [sp, #6] + cmple r0, #0 + ble _0231B184 + mov r0, r5 + bl ov29_022E4110 + mov r1, r4 + mov r0, #1 + mov r2, #0 + bl SubstitutePlaceholderStringTags + ldr r2, _0231B18C ; =0x00000C3D + mov r0, r5 + mov r1, r4 + bl LogMessageByIdWithPopupCheckUserTarget + b _0231B184 +_0231B150: + mov r0, r5 + bl ov29_022E4110 + mov r1, r4 + mov r0, #1 + mov r2, #0 + bl SubstitutePlaceholderStringTags + add r1, r6, #0x62 + mov r0, #2 + bl ov29_02344B44 + ldr r2, _0231B190 ; =0x00000C3C + mov r0, r5 + mov r1, r4 + bl LogMessageByIdWithPopupCheckUserTarget +_0231B184: + add sp, sp, #8 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +#ifdef JAPAN +_0231B18C: .word 0x0000097C +_0231B190: .word 0x0000097B +#else +_0231B18C: .word 0x00000C3D +_0231B190: .word 0x00000C3C +#endif + arm_func_end TryActivateFrisk diff --git a/include/item.h b/include/item.h index 8501618e..222ccf4a 100644 --- a/include/item.h +++ b/include/item.h @@ -1460,6 +1460,143 @@ enum item_data_flag { ITEM_DATA_FLAG_THROWABLE_AT_ENEMY = 1 << 7, }; +// Exclusive effect ID. These are usually encoded as bitvectors. +// Some of these are unused in-game but still labeled if easy to infer. +// See https://docs.google.com/spreadsheets/d/1XfE0x6JtLKDlCCvp5doNwyFpMX0C2HZCUCiDc1eMb1g +// for a list of exclusive items that map to each effect. +enum exclusive_item_effect_id { + EXCLUSIVE_EFF_STAT_BOOST = 0, // Normal stat boosts; don't have a unique effect + EXCLUSIVE_EFF_NO_PARALYSIS = 1, + EXCLUSIVE_EFF_NO_CONFUSION = 2, + EXCLUSIVE_EFF_NO_INFATUATION = 3, + EXCLUSIVE_EFF_NO_FREEZE = 4, + EXCLUSIVE_EFF_NO_CRITICAL_HITS = 5, + EXCLUSIVE_EFF_HALVED_EXPLOSION_DAMAGE = 6, + EXCLUSIVE_EFF_NO_EXPLOSION_DAMAGE = 7, + EXCLUSIVE_EFF_NO_MOVE_DISABLING = 8, + EXCLUSIVE_EFF_NO_WEATHER_DAMAGE = 9, + EXCLUSIVE_EFF_NO_SLEEP = 10, + EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS = 11, + EXCLUSIVE_EFF_UNUSED_0xC = 12, // Probably "may afflict on attackers" + EXCLUSIVE_EFF_MAY_SLEEP_ATTACKERS = 13, + EXCLUSIVE_EFF_MAY_NIGHTMARE_ATTACKERS = 14, + EXCLUSIVE_EFF_MAY_BURN_ATTACKERS = 15, + EXCLUSIVE_EFF_MAY_PARALYZE_ATTACKERS = 16, + EXCLUSIVE_EFF_MAY_CONFUSE_ATTACKERS = 17, + EXCLUSIVE_EFF_MAY_INFATUATE_ATTACKERS = 18, + EXCLUSIVE_EFF_MAY_FREEZE_ATTACKERS = 19, + EXCLUSIVE_EFF_MAY_SHADOW_HOLD_ATTACKERS = 20, + EXCLUSIVE_EFF_MAY_CONSTRICT_ATTACKERS = 21, + EXCLUSIVE_EFF_MAY_CRINGE_ATTACKERS = 22, + EXCLUSIVE_EFF_MAY_BLINKER_ATTACKERS = 23, + EXCLUSIVE_EFF_MAY_SEAL_ATTACKER_MOVES = 24, + EXCLUSIVE_EFF_MAY_GO_INVISIBLE_WHEN_ATTACKED = 25, + EXCLUSIVE_EFF_MAY_BOOST_MOVEMENT_SPEED_WHEN_ATTACKED = 26, + EXCLUSIVE_EFF_MAY_WARP_WHEN_ATTACKED = 27, + EXCLUSIVE_EFF_MAY_PERISH_SONG_ATTACKERS = 28, + EXCLUSIVE_EFF_MAY_SLOW_ATTACKERS = 29, + EXCLUSIVE_EFF_HALVED_PHYSICAL_DAMAGE = 30, + EXCLUSIVE_EFF_HALVED_SPECIAL_DAMAGE = 31, + EXCLUSIVE_EFF_COUNTER_PHYSICAL_DAMAGE = 32, + EXCLUSIVE_EFF_MAY_BOUNCE_STATUS_MOVES = 33, + EXCLUSIVE_EFF_MAY_ENDURE = 34, + EXCLUSIVE_EFF_COUNTER_25_PCT_PHYSICAL_DAMAGE = 35, + EXCLUSIVE_EFF_LONG_TOSS = 36, + EXCLUSIVE_EFF_MAY_BOUNCE_MOVES = 37, + EXCLUSIVE_EFF_NO_STAT_DROPS = 38, + EXCLUSIVE_EFF_CONVERSION_2_WHEN_HIT = 39, + EXCLUSIVE_EFF_NO_STATUS_WHEN_CLEAR = 40, + EXCLUSIVE_EFF_NO_STATUS_WHEN_SUNNY = 41, + EXCLUSIVE_EFF_NO_STATUS_WHEN_SANDSTORM = 42, + EXCLUSIVE_EFF_NO_STATUS_WHEN_CLOUDY = 43, + EXCLUSIVE_EFF_NO_STATUS_WHEN_RAINY = 44, + EXCLUSIVE_EFF_NO_STATUS_WHEN_HAIL = 45, + EXCLUSIVE_EFF_NO_STATUS_WHEN_FOGGY = 46, + EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_CLEAR = 47, + EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_SUNNY = 48, + EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_SANDSTORM = 49, + EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_CLOUDY = 50, + EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_RAINY = 51, + EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_HAIL = 52, + EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_FOGGY = 53, + EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_CLEAR = 54, + EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_SUNNY = 55, + EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_SANDSTORM = 56, // Unused in-game + EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_CLOUDY = 57, // Unused in-game + EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_RAINY = 58, + EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_HAIL = 59, + EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_FOGGY = 60, // Unused in-game + EXCLUSIVE_EFF_EVASION_BOOST_WHEN_CLEAR = 61, + EXCLUSIVE_EFF_EVASION_BOOST_WHEN_SUNNY = 62, + EXCLUSIVE_EFF_EVASION_BOOST_WHEN_SANDSTORM = 63, + EXCLUSIVE_EFF_EVASION_BOOST_WHEN_CLOUDY = 64, + EXCLUSIVE_EFF_EVASION_BOOST_WHEN_RAINY = 65, + EXCLUSIVE_EFF_EVASION_BOOST_WHEN_HAIL = 66, // Unused in-game + EXCLUSIVE_EFF_EVASION_BOOST_WHEN_FOGGY = 67, + EXCLUSIVE_EFF_BYPASS_REFLECT_LIGHT_SCREEN = 68, + EXCLUSIVE_EFF_SCRAPPY = 69, + EXCLUSIVE_EFF_MIRACLE_EYE = 70, + EXCLUSIVE_EFF_RESTORE_PP_ON_NEW_FLOORS = 71, + EXCLUSIVE_EFF_RESTORE_HP_ON_NEW_FLOORS = 72, + EXCLUSIVE_EFF_INCREASED_HP_RECOVERY = 73, + EXCLUSIVE_EFF_MAX_PP_BOOST = 74, + EXCLUSIVE_EFF_UNUSED_0x4B = 75, + EXCLUSIVE_EFF_MAX_HP_BOOST_10 = 76, + EXCLUSIVE_EFF_MAX_HP_BOOST_20 = 77, // Unused in-game + EXCLUSIVE_EFF_MAX_HP_BOOST_30 = 78, // Unused in-game + EXCLUSIVE_EFF_EXP_BOOST = 79, + EXCLUSIVE_EFF_EXP_FROM_DAMAGE = 80, + EXCLUSIVE_EFF_MAY_RESTORE_PP_FROM_DAMAGE = 81, + EXCLUSIVE_EFF_MAY_NOT_CONSUME_PP = 82, + EXCLUSIVE_EFF_THROWN_ITEM_PROTECTION = 83, + EXCLUSIVE_EFF_BOUNCE_THROWN_ITEMS = 84, + EXCLUSIVE_EFF_EXTEND_SELF_EFFECTS_TO_TEAM = 85, + EXCLUSIVE_EFF_MORE_TREASURE_DROPS = 86, + EXCLUSIVE_EFF_HP_DRAIN_RECOVERY_BOOST = 87, + EXCLUSIVE_EFF_PRESSURE_BOOST = 88, + EXCLUSIVE_EFF_NO_STATUS = 89, + EXCLUSIVE_EFF_HALVED_DAMAGE = 90, + EXCLUSIVE_EFF_DAMAGE_BOOST_50_PCT = 91, + EXCLUSIVE_EFF_ABSORB_TEAMMATE_POISON = 92, + EXCLUSIVE_EFF_RECOVER_HP_FROM_APPLES_AND_BERRIES = 93, + EXCLUSIVE_EFF_MORE_KECLEON_SHOPS = 94, + EXCLUSIVE_EFF_MORE_HIDDEN_STAIRS = 95, + EXCLUSIVE_EFF_NO_FRIENDLY_FIRE = 96, + EXCLUSIVE_EFF_PICKUP_BOOST = 97, + EXCLUSIVE_EFF_MORE_MONEY_DROPS = 98, + EXCLUSIVE_EFF_UNUSED_0x63 = 99, + EXCLUSIVE_EFF_RECOVER_HP_FROM_WATERY_TERRAIN = 100, + EXCLUSIVE_EFF_HEAL_STATUS_FROM_WATERY_TERRAIN = 101, + EXCLUSIVE_EFF_NO_FIRE_DAMAGE = 102, + EXCLUSIVE_EFF_NO_WATER_DAMAGE = 103, + EXCLUSIVE_EFF_NO_GRASS_DAMAGE = 104, + EXCLUSIVE_EFF_NO_ELECTRIC_DAMAGE = 105, + EXCLUSIVE_EFF_NO_FIGHTING_DAMAGE = 106, + EXCLUSIVE_EFF_NO_GROUND_DAMAGE = 107, + EXCLUSIVE_EFF_NO_FLYING_DAMAGE = 108, + EXCLUSIVE_EFF_NO_PSYCHIC_DAMAGE = 109, + EXCLUSIVE_EFF_NO_GHOST_DAMAGE = 110, + EXCLUSIVE_EFF_NO_DRAGON_DAMAGE = 111, + EXCLUSIVE_EFF_NO_DARK_DAMAGE = 112, + EXCLUSIVE_EFF_NO_STEEL_DAMAGE = 113, + EXCLUSIVE_EFF_ABSORB_FIRE_DAMAGE = 114, + EXCLUSIVE_EFF_ABSORB_WATER_DAMAGE = 115, + EXCLUSIVE_EFF_ABSORB_GRASS_DAMAGE = 116, + EXCLUSIVE_EFF_ABSORB_ELECTRIC_DAMAGE = 117, + EXCLUSIVE_EFF_ABSORB_ICE_DAMAGE = 118, + EXCLUSIVE_EFF_ABSORB_FIGHTING_DAMAGE = 119, + EXCLUSIVE_EFF_ABSORB_GROUND_DAMAGE = 120, + EXCLUSIVE_EFF_ABSORB_FLYING_DAMAGE = 121, + EXCLUSIVE_EFF_ABSORB_PSYCHIC_DAMAGE = 122, + EXCLUSIVE_EFF_ABSORB_BUG_DAMAGE = 123, + EXCLUSIVE_EFF_ABSORB_ROCK_DAMAGE = 124, + EXCLUSIVE_EFF_ABSORB_GHOST_DAMAGE = 125, + EXCLUSIVE_EFF_ABSORB_DRAGON_DAMAGE = 126, + EXCLUSIVE_EFF_ABSORB_DARK_DAMAGE = 127, + EXCLUSIVE_EFF_ABSORB_STEEL_DAMAGE = 128, + EXCLUSIVE_EFF_LAST = 129, // Used as a null-terminator in some places +}; + #define GROUND_ITEM_TOOLBOX_INDEX 0x80 #define HELD_ITEM_TOOLBOX_INDEX 0x81 #define INVENTORY_SIZE 52 diff --git a/include/overlay_29_0231ACAC.h b/include/overlay_29_0231ACAC.h new file mode 100644 index 00000000..25f1294c --- /dev/null +++ b/include/overlay_29_0231ACAC.h @@ -0,0 +1,13 @@ +#ifndef PMDSKY_OVERLAY_29_0231ACAC_H +#define PMDSKY_OVERLAY_29_0231ACAC_H + +#include "dungeon_mode.h" + +// Gets the move target-and-range field when used by a given entity. +// entity: entity pointer +// move: move pointer +// is_ai: AI flag (same as GetMoveTargetAndRange) +// return: move target and range +u32 GetEntityMoveTargetAndRange(struct entity *entity, struct move *move, bool8 is_ai); + +#endif //PMDSKY_OVERLAY_29_0231ACAC_H diff --git a/main.lsf b/main.lsf index 18058a1b..fa33b30a 100644 --- a/main.lsf +++ b/main.lsf @@ -427,6 +427,8 @@ Overlay OVY_29 Object asm/overlay_29_0231A7A0.o Object src/overlay_29_0231A9D4.o Object asm/overlay_29_0231A9F8.o + Object src/overlay_29_0231ACAC.o + Object asm/overlay_29_0231AD38.o Object src/overlay_29_0231B194.o Object asm/overlay_29_0231B1B8.o Object src/overlay_29_0231B318.o diff --git a/src/dungeon_ai_attack.c b/src/dungeon_ai_attack.c index 36f77c0e..c3897fc0 100644 --- a/src/dungeon_ai_attack.c +++ b/src/dungeon_ai_attack.c @@ -10,6 +10,7 @@ #include "dungeon_visibility.h" #include "main_0208655C.h" #include "move_data.h" +#include "overlay_29_0231ACAC.h" #include "position_util.h" extern struct dungeon *DUNGEON_PTR[]; @@ -18,7 +19,6 @@ extern u8 AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS[NUM_DIRECTIONS]; extern s32 AI_POTENTIAL_ATTACK_TARGET_WEIGHTS[NUM_DIRECTIONS]; extern struct entity *AI_POTENTIAL_ATTACK_TARGETS[NUM_DIRECTIONS]; -extern u16 GetEntityMoveTargetAndRange(struct entity *entity, struct move *move, bool8 is_ai); extern bool8 IsAffectedByTaunt(struct move *move); extern bool8 StatusCheckerCheck(struct entity *attacker, struct move *move); extern u16 GetMoveTargetAndRange(struct move *move, bool8 is_ai); @@ -47,7 +47,7 @@ u32 AiConsiderMove(struct ai_possible_move *ai_possible_move, struct entity *mon if (has_status_checker && !StatusCheckerCheck(monster, move)) return move_weight; - if (GetMoveTargetAndRange(move, FALSE) == TARGET_USER + RANGE_USER + AI_CONDITION_HP_25) + if (GetMoveTargetAndRange(move, FALSE) == TARGET_USER | RANGE_USER | AI_CONDITION_HP_25) { s32 max_hp = MIN(pokemon_info->max_hp_stat + pokemon_info->max_hp_boost, 999); if (pokemon_info->hp == max_hp) diff --git a/src/overlay_29_0231ACAC.c b/src/overlay_29_0231ACAC.c new file mode 100644 index 00000000..ef74b5c8 --- /dev/null +++ b/src/overlay_29_0231ACAC.c @@ -0,0 +1,26 @@ +#include "overlay_29_0231ACAC.h" +#include "item.h" +#include "move_data.h" + +extern bool8 MonsterIsType(struct entity *entity, enum type_id type_id); +extern u16 GetMoveTargetAndRange(struct move *move, bool8 is_ai); +extern bool8 IsMoveRangeString19(struct move *move); +bool8 ExclusiveItemEffectIsActive__0231A87C(struct entity *entity, enum exclusive_item_effect_id effect_id); + +u32 GetEntityMoveTargetAndRange(struct entity *entity, struct move *move, bool8 is_ai) +{ + if (move->id == MOVE_CURSE && !is_ai && !MonsterIsType(entity, TYPE_GHOST)) + return TARGET_USER | RANGE_USER; + + u16 move_target_and_range = GetMoveTargetAndRange(move, is_ai); + + if (IsMoveRangeString19(move) && ExclusiveItemEffectIsActive__0231A87C(entity, EXCLUSIVE_EFF_EXTEND_SELF_EFFECTS_TO_TEAM)) + { + if (move_target_and_range == (TARGET_USER | RANGE_USER | AI_CONDITION_HP_25)) + move_target_and_range = TARGET_PARTY | RANGE_FLOOR | AI_CONDITION_HP_25; + else if (move_target_and_range == (TARGET_USER | RANGE_USER)) + move_target_and_range = TARGET_PARTY | RANGE_FLOOR; + } + + return move_target_and_range; +}