diff options
-rw-r--r-- | asm/code_8048480.s | 634 | ||||
-rw-r--r-- | asm/code_80494EC.s | 59 | ||||
-rw-r--r-- | include/constants/item.h | 14 | ||||
-rw-r--r-- | include/dungeon_ai_item_weight.h | 9 | ||||
-rw-r--r-- | include/dungeon_entity.h | 3 | ||||
-rw-r--r-- | include/moves.h | 8 | ||||
-rwxr-xr-x | ld_script.txt | 2 | ||||
-rw-r--r-- | src/dungeon_ai_item_weight.c | 442 | ||||
-rw-r--r-- | src/dungeon_ai_items.c | 2 | ||||
-rw-r--r-- | src/dungeon_items.c | 8 | ||||
-rw-r--r-- | src/items.c | 4 | ||||
-rw-r--r-- | src/moves.c | 4 |
12 files changed, 537 insertions, 652 deletions
diff --git a/asm/code_8048480.s b/asm/code_8048480.s index 37e3310..5f533e2 100644 --- a/asm/code_8048480.s +++ b/asm/code_8048480.s @@ -1310,638 +1310,4 @@ sub_8048F00: _08048F24: .4byte gPtrMusicBoxPlayedCrumbledMessage thumb_func_end sub_8048F00 - thumb_func_start EvaluateItem -EvaluateItem: - push {r4-r7,lr} - sub sp, 0x4 - adds r4, r0, 0 - ldr r3, [r4, 0x70] - movs r6, 0 - movs r0, 0x1 - adds r5, r2, 0 - ands r5, r0 - lsrs r2, 1 - movs r0, 0x1 - ands r2, r0 - ldrb r0, [r1, 0x2] - subs r0, 0x1 - cmp r0, 0xCC - bls _08048F48 - b _080494E0 -_08048F48: - lsls r0, 2 - ldr r1, _08048F54 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08048F54: .4byte _08048F58 - .align 2, 0 -_08048F58: - .4byte _0804928C - .4byte _0804928C - .4byte _0804928C - .4byte _0804928C - .4byte _0804928C - .4byte _0804928C - .4byte _0804928C - .4byte _0804928C - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _08049408 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _08049296 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080492B0 - .4byte _080492B0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _08049320 - .4byte _080494E0 - .4byte _080492B8 - .4byte _080492B8 - .4byte _0804935E - .4byte _080494E0 - .4byte _080493E0 - .4byte _0804948E - .4byte _08049394 - .4byte _08049344 - .4byte _0804946E - .4byte _0804947A - .4byte _08049378 - .4byte _080493CE - .4byte _080493AC - .4byte _080493B8 - .4byte _08049436 - .4byte _080494E0 - .4byte _080493F6 - .4byte _080494B2 - .4byte _0804946A - .4byte _08049462 - .4byte _08049454 - .4byte _08049498 - .4byte _080492DC - .4byte _0804932C - .4byte _08049338 - .4byte _0804933C - .4byte _08049340 - .4byte _080494C2 - .4byte _080494C2 - .4byte _080494D6 - .4byte _080494C2 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494E0 - .4byte _080494DA -_0804928C: - cmp r5, 0 - bne _08049292 - b _080494E2 -_08049292: - movs r6, 0x46 - b _080494E2 -_08049296: - cmp r5, 0 - bne _0804929C - b _080494E0 -_0804929C: - movs r1, 0x9E - lsls r1, 1 - adds r0, r3, r1 - ldr r0, [r0] - bl GetBellyRoundedUp - cmp r0, 0 - ble _080492AE - b _0804948A -_080492AE: - b _080494E0 -_080492B0: - cmp r5, 0 - beq _080492B6 - b _0804948A -_080492B6: - b _080494E0 -_080492B8: - movs r2, 0xE - ldrsh r1, [r3, r2] - movs r2, 0x10 - ldrsh r0, [r3, r2] - cmp r1, r0 - blt _080492C6 - b _080494E2 -_080492C6: - cmp r0, 0 - bge _080492CC - adds r0, 0x3 -_080492CC: - asrs r0, 2 - cmp r1, r0 - ble _080492D4 - b _080494E2 -_080492D4: - cmp r5, 0 - bne _080492DA - b _08049420 -_080492DA: - b _08049432 -_080492DC: - movs r6, 0 - movs r0, 0x8C - lsls r0, 1 - adds r5, r3, r0 - adds r7, r5, 0 - movs r2, 0x3 -_080492E8: - ldrb r1, [r5] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0804930C - ldrb r0, [r5, 0x4] - cmp r0, 0 - bne _080492FA - adds r6, 0x1E -_080492FA: - ldrb r4, [r5, 0x4] - adds r0, r7, 0 - str r2, [sp] - bl GetMoveMaxPP - ldr r2, [sp] - cmp r4, r0 - beq _0804930C - adds r6, 0x6 -_0804930C: - adds r5, 0x8 - adds r7, 0x8 - subs r2, 0x1 - cmp r2, 0 - bge _080492E8 - cmp r6, 0x62 - bgt _0804931C - b _080494E2 -_0804931C: - movs r6, 0x63 - b _080494E2 -_08049320: - adds r0, r4, 0 - bl HasNegativeStatus - lsls r0, 24 - movs r6, 0 - b _080494BC -_0804932C: - ldrb r0, [r3, 0x14] -_0804932E: - movs r6, 0x64 - cmp r0, 0xF9 - bhi _08049336 - b _080494E2 -_08049336: - b _080494E0 -_08049338: - ldrb r0, [r3, 0x15] - b _0804932E -_0804933C: - ldrb r0, [r3, 0x16] - b _0804932E -_08049340: - ldrb r0, [r3, 0x17] - b _0804932E -_08049344: - cmp r5, 0 - beq _0804934A - b _080494E0 -_0804934A: - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x64 - cmp r0, 0 - bne _0804935A - b _080494E2 -_0804935A: - movs r6, 0xA - b _080494E2 -_0804935E: - adds r0, r4, 0 - bl CanSeeInvisible - lsls r0, 24 - cmp r0, 0 - beq _0804936C - b _080494A2 -_0804936C: - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x5 - b _080494BC -_08049378: - ldr r0, [r4, 0x70] - movs r1, 0x82 - lsls r1, 1 - adds r0, r1 - ldr r0, [r0] - cmp r0, 0x3 - ble _08049388 - b _080494A2 -_08049388: - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x5 - b _080494BC -_08049394: - adds r0, r3, 0 - adds r0, 0xE8 - ldrb r0, [r0] - cmp r0, 0x2 - bne _080493A0 - b _080494A2 -_080493A0: - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x5 - b _080494BC -_080493AC: - adds r0, r3, 0 - adds r0, 0xAC - ldrb r0, [r0] - cmp r0, 0x4 - bne _080494A2 - b _080494B2 -_080493B8: - adds r0, r3, 0 - adds r0, 0xBC - ldrb r0, [r0] - cmp r0, 0x2 - beq _080494A2 - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0xF - b _080494BC -_080493CE: - adds r0, r3, 0 - adds r0, 0xAC - ldrb r0, [r0] - subs r0, 0x2 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bhi _080494A2 - b _08049420 -_080493E0: - adds r0, r3, 0 - adds r0, 0xE8 - ldrb r0, [r0] - cmp r0, 0x1 - beq _080494A2 - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x5 - b _080494BC -_080493F6: - cmp r2, 0 - bne _0804940C - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x5 - cmp r0, 0 - beq _080494E2 -_08049408: - movs r6, 0x28 - b _080494E2 -_0804940C: - movs r2, 0xE - ldrsh r1, [r3, r2] - movs r2, 0x10 - ldrsh r0, [r3, r2] - cmp r1, r0 - bge _080494E2 - cmp r1, 0x13 - bgt _080494E2 - cmp r5, 0 - bne _08049432 -_08049420: - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x32 - cmp r0, 0 - beq _080494E2 - movs r6, 0x64 - b _080494E2 -_08049432: - movs r6, 0x32 - b _080494E2 -_08049436: - adds r0, r3, 0 - adds r0, 0xA8 - ldrb r0, [r0] - cmp r0, 0x1 - beq _080494A2 - cmp r0, 0x5 - beq _080494A2 - cmp r0, 0x3 - beq _080494A2 - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x5 - b _080494BC -_08049454: - adds r0, r3, 0 - adds r0, 0xA8 - ldrb r0, [r0] - cmp r0, 0x2 - beq _080494A2 - movs r6, 0x5 - b _080494E2 -_08049462: - ldrb r0, [r3, 0x9] - movs r6, 0 - cmp r0, 0x62 - bhi _080494E2 -_0804946A: - movs r6, 0x50 - b _080494E2 -_0804946E: - adds r0, r3, 0 - adds r0, 0xAC - ldrb r0, [r0] - cmp r0, 0x1 - beq _0804948A - b _080494E0 -_0804947A: - movs r1, 0x9E - lsls r1, 1 - adds r0, r3, r1 - ldr r0, [r0] - bl GetBellyRoundedUp - cmp r0, 0 - ble _080494E0 -_0804948A: - movs r0, 0x32 - b _080494E4 -_0804948E: - ldrb r0, [r3, 0x9] - movs r6, 0 - cmp r0, 0x1 - bls _080494E2 - b _0804946A -_08049498: - adds r0, r3, 0 - adds r0, 0xB0 - ldrb r0, [r0] - cmp r0, 0x6 - bne _080494A6 -_080494A2: - movs r0, 0 - b _080494E4 -_080494A6: - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x5 - b _080494BC -_080494B2: - adds r0, r4, 0 - bl CanTargetAdjacentPokemon - lsls r0, 24 - movs r6, 0x1E -_080494BC: - cmp r0, 0 - beq _080494E2 - b _0804946A -_080494C2: - movs r2, 0x9E - lsls r2, 1 - adds r0, r3, r2 - ldr r0, [r0] - bl GetBellyRoundedUp - cmp r0, 0x9 - bgt _080494E0 - movs r0, 0x64 - b _080494E4 -_080494D6: - movs r6, 0x1E - b _080494E2 -_080494DA: - movs r6, 0x14 - cmp r5, 0 - beq _080494E2 -_080494E0: - movs r6, 0 -_080494E2: - adds r0, r6, 0 -_080494E4: - add sp, 0x4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end EvaluateItem - - thumb_func_start CanTargetAdjacentPokemon -CanTargetAdjacentPokemon: - push {r4-r6,lr} - adds r5, r0, 0 - movs r6, 0 -_080494F2: - movs r1, 0x4 - ldrsh r0, [r5, r1] - ldr r1, _08049538 - lsls r2, r6, 2 - adds r2, r1 - movs r3, 0 - ldrsh r1, [r2, r3] - adds r0, r1 - movs r3, 0x6 - ldrsh r1, [r5, r3] - movs r3, 0x2 - ldrsh r2, [r2, r3] - adds r1, r2 - bl GetMapTileAtPosition - ldr r4, [r0, 0x10] - cmp r4, 0 - beq _0804953C - adds r0, r4, 0 - bl GetEntityType - cmp r0, 0 - beq _0804953C - adds r0, r5, 0 - adds r1, r4, 0 - movs r2, 0 - movs r3, 0x1 - bl CanTarget - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _0804953C - movs r0, 0x1 - b _08049544 - .align 2, 0 -_08049538: .4byte gAdjacentTileOffsets -_0804953C: - adds r6, 0x1 - cmp r6, 0x7 - ble _080494F2 - movs r0, 0 -_08049544: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end CanTargetAdjacentPokemon - .align 2, 0
\ No newline at end of file diff --git a/asm/code_80494EC.s b/asm/code_80494EC.s new file mode 100644 index 0000000..a38b22b --- /dev/null +++ b/asm/code_80494EC.s @@ -0,0 +1,59 @@ + #include "asm/constants/gba_constants.inc" + #include "asm/macros.inc" + + .syntax unified + + .text + + thumb_func_start CanTargetAdjacentPokemon +CanTargetAdjacentPokemon: + push {r4-r6,lr} + adds r5, r0, 0 + movs r6, 0 +_080494F2: + movs r1, 0x4 + ldrsh r0, [r5, r1] + ldr r1, _08049538 + lsls r2, r6, 2 + adds r2, r1 + movs r3, 0 + ldrsh r1, [r2, r3] + adds r0, r1 + movs r3, 0x6 + ldrsh r1, [r5, r3] + movs r3, 0x2 + ldrsh r2, [r2, r3] + adds r1, r2 + bl GetMapTileAtPosition + ldr r4, [r0, 0x10] + cmp r4, 0 + beq _0804953C + adds r0, r4, 0 + bl GetEntityType + cmp r0, 0 + beq _0804953C + adds r0, r5, 0 + adds r1, r4, 0 + movs r2, 0 + movs r3, 0x1 + bl CanTarget + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0x1 + bne _0804953C + movs r0, 0x1 + b _08049544 + .align 2, 0 +_08049538: .4byte gAdjacentTileOffsets +_0804953C: + adds r6, 0x1 + cmp r6, 0x7 + ble _080494F2 + movs r0, 0 +_08049544: + pop {r4-r6} + pop {r1} + bx r1 + thumb_func_end CanTargetAdjacentPokemon + + .align 2, 0
\ No newline at end of file diff --git a/include/constants/item.h b/include/constants/item.h index 1268bd8..2f79b4d 100644 --- a/include/constants/item.h +++ b/include/constants/item.h @@ -162,18 +162,18 @@ #define ITEM_ID_CALM_MIND 0x80 #define ITEM_ID_ROAR 0x81 #define ITEM_ID_TOXIC 0x82 -#define ITEM_ID_HAIL_ORB 0x83 +#define ITEM_ID_HAIL 0x83 #define ITEM_ID_BULK_UP 0x84 #define ITEM_ID_BULLET_SEED 0x85 #define ITEM_ID_HIDDEN_POWER 0x86 -#define ITEM_ID_SUNNY_ORB 0x87 +#define ITEM_ID_SUNNY_DAY 0x87 #define ITEM_ID_TAUNT 0x88 #define ITEM_ID_ICE_BEAM 0x89 #define ITEM_ID_BLIZZARD 0x8A #define ITEM_ID_HYPER_BEAM 0x8B #define ITEM_ID_LIGHT_SCREEN 0x8C #define ITEM_ID_PROTECT 0x8D -#define ITEM_ID_RAINY_ORB 0x8E +#define ITEM_ID_RAIN_DANCE 0x8E #define ITEM_ID_GIGA_DRAIN 0x8F #define ITEM_ID_SAFEGUARD 0x90 #define ITEM_ID_FRUSTRATION 0x91 @@ -187,14 +187,14 @@ #define ITEM_ID_PSYCHIC 0x99 #define ITEM_ID_SHADOW_BALL 0x9A #define ITEM_ID_BRICK_BREAK 0x9B -#define ITEM_ID_EVASION_ORB 0x9C +#define ITEM_ID_DOUBLE_TEAM 0x9C #define ITEM_ID_REFLECT 0x9D #define ITEM_ID_SHOCK_WAVE 0x9E #define ITEM_ID_FLAMETHROWER 0x9F #define ITEM_ID_SLUDGE_BOMB 0xA0 -#define ITEM_ID_SANDY_ORB 0xA1 +#define ITEM_ID_SANDSTORM 0xA1 #define ITEM_ID_FIRE_BLAST 0xA2 -#define ITEM_ID_ROCKY_ORB 0xA3 +#define ITEM_ID_ROCK_TOMB 0xA3 #define ITEM_ID_AERIAL_ACE 0xA4 #define ITEM_ID_TORMENT 0xA5 #define ITEM_ID_FACADE 0xA6 @@ -204,7 +204,7 @@ #define ITEM_ID_THIEF 0xAA #define ITEM_ID_STEEL_WING 0xAB #define ITEM_ID_SKILL_SWAP 0xAC -#define ITEM_ID_SNATCH_ORB 0xAD +#define ITEM_ID_SNATCH 0xAD #define ITEM_ID_OVERHEAT 0xAE #define ITEM_ID_WIDE_SLASH 0xAF #define ITEM_ID_EXCAVATE 0xB0 diff --git a/include/dungeon_ai_item_weight.h b/include/dungeon_ai_item_weight.h new file mode 100644 index 0000000..705c0ca --- /dev/null +++ b/include/dungeon_ai_item_weight.h @@ -0,0 +1,9 @@ +#ifndef GUARD_DUNGEON_AI_ITEM_WEIGHT_H +#define GUARD_DUNGEON_AI_ITEM_WEIGHT_H + +#include "dungeon_entity.h" + +// 0x48F28 +u32 EvaluateItem(struct DungeonEntity *targetPokemon, struct ItemSlot *item, u32 itemTargetFlags); + +#endif diff --git a/include/dungeon_entity.h b/include/dungeon_entity.h index 233ef8e..d5c2871 100644 --- a/include/dungeon_entity.h +++ b/include/dungeon_entity.h @@ -164,8 +164,7 @@ struct DungeonEntityData u8 fillFE[0x100 - 0xFE]; /* 0x100 */ u8 targetingDecoy; // If the Pokémon is targeting a decoy, this indicates whether the decoy target is a team or wild Pokémon. u8 fill101[0x104 - 0x101]; - /* 0x104 */ u8 movementSpeed; - u8 fill105[0x108 - 0x105]; + /* 0x104 */ s32 movementSpeed; // The turn counter for movement speed up/down is split into five timers each. Multiple timers are used if the Pokémon is affected by multiple // speed-up/slow effects at once, like using Agility twice. /* 0x108 */ u8 speedUpTurnsLeft[5]; diff --git a/include/moves.h b/include/moves.h new file mode 100644 index 0000000..bba50b3 --- /dev/null +++ b/include/moves.h @@ -0,0 +1,8 @@ +#ifndef GUARD_MOVES_H +#define GUARD_MOVES_H + +#include "constants/move.h" + +u32 GetMoveMaxPP(struct PokemonMove *move); + +#endif diff --git a/ld_script.txt b/ld_script.txt index 3e9309b..570f487 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -196,6 +196,8 @@ SECTIONS { asm/code_8046CE4.o(.text); src/code_8048480.o(.text); asm/code_8048480.o(.text); + src/dungeon_ai_item_weight.o(.text); + asm/code_80494EC.o(.text); src/dungeon_map_access.o(.text); asm/code_8049590.o(.text); src/code_80521D0.o(.text); diff --git a/src/dungeon_ai_item_weight.c b/src/dungeon_ai_item_weight.c new file mode 100644 index 0000000..438c064 --- /dev/null +++ b/src/dungeon_ai_item_weight.c @@ -0,0 +1,442 @@ +#include "global.h" +#include "dungeon_ai_item_weight.h" + +#include "constants/status.h" +#include "dungeon_pokemon_attributes_1.h" +#include "moves.h" + +extern s32 GetBellyRoundedUp(u32); +extern bool8 CanTargetAdjacentPokemon(struct DungeonEntity*); +extern bool8 HasNegativeStatus(struct DungeonEntity*); + +u32 EvaluateItem(struct DungeonEntity *targetPokemon, struct ItemSlot *item, u32 itemTargetFlags) +{ + struct DungeonEntityData *pokemonData = targetPokemon->entityData; + s32 itemWeight = 0; + bool8 targetOther = itemTargetFlags & 1; + u16 targetAlly = (itemTargetFlags >> 1) & 1; + s32 i; + struct PokemonMove *move; + struct PokemonMove *move2; + switch (item->itemIndex) + { + case ITEM_ID_STICK: + case ITEM_ID_IRON_THORN: + case ITEM_ID_SILVER_SPIKE: + case ITEM_ID_GOLD_FANG: + case ITEM_ID_CACNEA_SPIKE: + case ITEM_ID_CORSOLA_TWIG: + case ITEM_ID_GRAVELEROCK: + case ITEM_ID_GEO_PEBBLE: + if (targetOther) + { + itemWeight = 70; + } + break; + case ITEM_ID_DIET_RIBBON: + if (targetOther && GetBellyRoundedUp(pokemonData->belly) > 0) + { + return 50; + } + else + { + itemWeight = 0; + } + break; + case ITEM_ID_WHIFF_SPECS: + case ITEM_ID_NO_AIM_SCOPE: + if (targetOther) + { + return 50; + } + else + { + itemWeight = 0; + } + break; + case ITEM_ID_ORAN_BERRY: + case ITEM_ID_SITRUS_BERRY: + if (pokemonData->HP < pokemonData->maxHP && pokemonData->HP <= pokemonData->maxHP / 4) + { + if (!targetOther) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 100; + } + else + { + itemWeight = 50; + } + } + else + { + itemWeight = 50; + } + } + break; + case ITEM_ID_MAX_ELIXIR: + itemWeight = 0; + move = pokemonData->moves; + move2 = move; + for (i = 0; i < MAX_MON_MOVES; move++, move2++, i++) + { + if (move->moveFlags & MOVE_FLAG_EXISTS) + { + if (move->pp == 0) + { + itemWeight += 30; + } + if (move->pp != GetMoveMaxPP(move2)) + { + itemWeight += 6; + } + } + } + if (itemWeight > 98) + { + itemWeight = 99; + } + break; + case ITEM_ID_HEAL_SEED: + if (HasNegativeStatus(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 0; + } + break; + case ITEM_ID_PROTEIN: + if (pokemonData->attack > 249) + { + itemWeight = 0; + } + else + { + itemWeight = 100; + } + break; + case ITEM_ID_CALCIUM: + if (pokemonData->specialAttack > 249) + { + itemWeight = 0; + } + else + { + itemWeight = 100; + } + break; + case ITEM_ID_IRON: + if (pokemonData->defense > 249) + { + itemWeight = 0; + } + else + { + itemWeight = 100; + } + break; + case ITEM_ID_ZINC: + if (pokemonData->specialDefense > 249) + { + itemWeight = 0; + } + else + { + itemWeight = 100; + } + break; + case ITEM_ID_LIFE_SEED: + if (!targetOther) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 10; + } + else + { + itemWeight = 100; + } + } + else + { + itemWeight = 0; + } + break; + case ITEM_ID_EYEDROP_SEED: + if (!CanSeeInvisible(targetPokemon)) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 5; + } + } + else + { + return 0; + } + break; + case ITEM_ID_QUICK_SEED: + if (targetPokemon->entityData->movementSpeed <= 3) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 5; + } + } + else + { + return 0; + } + break; + case ITEM_ID_ALLURE_SEED: + if (pokemonData->eyesightStatus != EYESIGHT_STATUS_CROSS_EYED) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 5; + } + } + else + { + return 0; + } + break; + case ITEM_ID_CHERI_BERRY: + if (pokemonData->nonVolatileStatus != NON_VOLATILE_STATUS_PARALYZED) + { + return 0; + } + else if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 30; + } + break; + case ITEM_ID_TOTTER_SEED: + if (pokemonData->volatileStatus != VOLATILE_STATUS_CONFUSED) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 15; + } + } + else + { + return 0; + } + break; + case ITEM_ID_PECHA_BERRY: + if (pokemonData->nonVolatileStatus != NON_VOLATILE_STATUS_POISONED && + pokemonData->nonVolatileStatus != NON_VOLATILE_STATUS_BADLY_POISONED) + { + return 0; + } + else if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 100; + } + else + { + itemWeight = 50; + } + break; + case ITEM_ID_BLINKER_SEED: + if (pokemonData->eyesightStatus != EYESIGHT_STATUS_BLINKER) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 5; + } + } + else + { + return 0; + } + break; + case ITEM_ID_WARP_SEED: + if (!targetAlly) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 40; + } + else + { + itemWeight = 5; + } + } + else if (pokemonData->HP < pokemonData->maxHP && pokemonData->HP < 20) + { + if (!targetOther) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 100; + } + else + { + itemWeight = 50; + } + } + else + { + itemWeight = 50; + } + } + break; + case ITEM_ID_PATSY_BAND: + itemWeight = 40; + break; + case ITEM_ID_SLEEP_SEED: + if (pokemonData->sleepStatus != SLEEP_STATUS_SLEEP && + pokemonData->sleepStatus != SLEEP_STATUS_NAPPING && + pokemonData->sleepStatus != SLEEP_STATUS_NIGHTMARE) + { + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 5; + } + } + else + { + return 0; + } + break; + case ITEM_ID_CHESTO_BERRY: + if (pokemonData->sleepStatus != SLEEP_STATUS_SLEEPLESS) + { + itemWeight = 5; + } + else + { + return 0; + } + break; + case ITEM_ID_JOY_SEED: + if (pokemonData->level < 99) + { + itemWeight = 80; + } + else + { + itemWeight = 0; + } + break; + case ITEM_ID_GINSENG: + itemWeight = 80; + break; + case ITEM_ID_RAWST_BERRY: + if (pokemonData->nonVolatileStatus == NON_VOLATILE_STATUS_BURNED) + { + return 50; + } + else + { + itemWeight = 0; + } + break; + case ITEM_ID_HUNGER_SEED: + if (GetBellyRoundedUp(pokemonData->belly) > 0) + { + return 50; + } + else + { + itemWeight = 0; + } + break; + case ITEM_ID_DOOM_SEED: + if (pokemonData->level > 1) + { + itemWeight = 80; + } + else + { + itemWeight = 0; + } + break; + case ITEM_ID_STUN_SEED: + if (pokemonData->immobilizeStatus == IMMOBILIZE_STATUS_PETRIFIED) + { + return 0; + } + else if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 5; + } + break; + case ITEM_ID_BLAST_SEED: + if (CanTargetAdjacentPokemon(targetPokemon)) + { + itemWeight = 80; + } + else + { + itemWeight = 30; + } + break; + case ITEM_ID_APPLE: + case ITEM_ID_BIG_APPLE: + case ITEM_ID_HUGE_APPLE: + if (GetBellyRoundedUp(pokemonData->belly) < 10) + { + return 100; + } + else + { + itemWeight = 0; + } + break; + case ITEM_ID_GRIMY_FOOD: + itemWeight = 30; + break; + case ITEM_ID_ROLLCALL_ORB: + move = pokemonData->moves; // Fixes a regswap. + if (targetOther) + { + itemWeight = 0; + } + else + { + itemWeight = 20; + } + break; + default: + itemWeight = 0; + } + return itemWeight; +} diff --git a/src/dungeon_ai_items.c b/src/dungeon_ai_items.c index 56e4447..8751eb1 100644 --- a/src/dungeon_ai_items.c +++ b/src/dungeon_ai_items.c @@ -8,6 +8,7 @@ #include "dungeon_action.h" #include "dungeon_ai_1.h" #include "dungeon_ai_attack.h" +#include "dungeon_ai_item_weight.h" #include "dungeon_ai_items.h" #include "dungeon_capabilities.h" #include "dungeon_capabilities_1.h" @@ -35,7 +36,6 @@ enum ItemTargetFlag }; extern s32 CalculateFacingDir(struct Position*, struct Position*); -extern u32 EvaluateItem(struct DungeonEntity*, struct ItemSlot*, u32); extern void sub_8077274(struct DungeonEntity *, struct DungeonEntity *); extern s32 gNumPotentialTargets; diff --git a/src/dungeon_items.c b/src/dungeon_items.c index 5614e9b..bfaab53 100644 --- a/src/dungeon_items.c +++ b/src/dungeon_items.c @@ -4,16 +4,16 @@ bool8 HasItem(struct DungeonEntity *pokemon, u8 itemIndex) { // Weird assignment to fix a regswap. - struct DungeonEntityData *entityData = entityData = pokemon->entityData; - if (!(entityData->heldItem.itemFlags & ITEM_FLAG_EXISTS)) + struct DungeonEntityData *pokemonData = pokemonData = pokemon->entityData; + if (!(pokemonData->heldItem.itemFlags & ITEM_FLAG_EXISTS)) { return FALSE; } - if (entityData->heldItem.itemFlags & ITEM_FLAG_STICKY) + if (pokemonData->heldItem.itemFlags & ITEM_FLAG_STICKY) { return FALSE; } - if (entityData->heldItem.itemIndex != itemIndex) + if (pokemonData->heldItem.itemIndex != itemIndex) { return FALSE; } diff --git a/src/items.c b/src/items.c index ff79822..a19b71b 100644 --- a/src/items.c +++ b/src/items.c @@ -1,6 +1,7 @@ #include "global.h" #include "file_system.h" #include "item.h" +#include "moves.h" #include "team_inventory.h" #include "random.h" #include "pokemon.h" @@ -42,7 +43,6 @@ extern void InitPokemonMove(void*, u16); // first arg is some struct extern void sub_80078A4(u32, u32, u32, u32, u32); extern u32 GetMoveType(void*); extern u8* GetUnformattedTypeString(s16); -extern u32 GetMoveMaxPP(void*); extern void sub_80073E0(u32); extern void xxx_format_and_draw(u32, u32, u8 *, u32, u32); extern s32 sub_8091E94(s32 a1, s32 a2, s32 a3); @@ -698,7 +698,7 @@ u32 sub_80913E0(struct ItemSlot* slot, u32 a2, struct subStruct_203B240 ** a3) xxx_format_and_draw(8, 24, GetItemDescription(slot->itemIndex), a2, 0); if (GetItemType(slot->itemIndex) == ITEM_TYPE_TM) { - u8* buffer8 = buffer88 + 0x50; // field in struct + struct PokemonMove *buffer8 = (struct PokemonMove*) (buffer88 + 0x50); // field in struct u16 move = GetItemMove(slot->itemIndex); u8 moves_data; u8* typestring; diff --git a/src/moves.c b/src/moves.c index e5998db..f2e334c 100644 --- a/src/moves.c +++ b/src/moves.c @@ -1,6 +1,7 @@ #include "global.h" +#include "moves.h" + #include "file_system.h" -#include "constants/move.h" #include "constants/move_id.h" struct MoveDataFile @@ -36,7 +37,6 @@ extern u8 gUnknown_810992C[]; extern void sub_8093F10(struct PokemonMove *, struct PokemonMove *); extern void sub_80928C0(u8 *, struct PokemonMove *, struct unkStruct_80928C0 *); -extern u32 GetMoveMaxPP(struct PokemonMove*); bool8 DoesMoveCharge(u16 move); extern void ExpandPlaceholdersBuffer(u8 *, u8 *, ...); |