diff options
-rw-r--r-- | asm/code_807001C.s | 163 | ||||
-rw-r--r-- | asm/code_8070B28.s | 54 | ||||
-rw-r--r-- | include/dungeon_entity.h | 6 | ||||
-rw-r--r-- | include/status_checks.h | 9 | ||||
-rwxr-xr-x | ld_script.txt | 2 | ||||
-rw-r--r-- | src/dungeon_ai_item_weight.c | 5 | ||||
-rw-r--r-- | src/status_checks.c | 44 |
7 files changed, 116 insertions, 167 deletions
diff --git a/asm/code_807001C.s b/asm/code_807001C.s index 958db4f..a9c4a93 100644 --- a/asm/code_807001C.s +++ b/asm/code_807001C.s @@ -1397,165 +1397,4 @@ _08070A50: .4byte gRecruitedPokemonRef _08070A54: .4byte 0x00008df8 thumb_func_end sub_80709C8 - thumb_func_start HasNegativeStatus -HasNegativeStatus: - push {r4,lr} - ldr r0, [r0, 0x70] - mov r12, r0 - adds r0, 0xA8 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08070ADE - cmp r0, 0x3 - beq _08070ADE - cmp r0, 0x4 - beq _08070ADE - mov r0, r12 - adds r0, 0xAC - ldrb r0, [r0] - cmp r0, 0 - bne _08070ADE - mov r0, r12 - adds r0, 0xB0 - ldrb r0, [r0] - cmp r0, 0x5 - beq _08070A86 - cmp r0, 0 - bne _08070ADE -_08070A86: - mov r0, r12 - adds r0, 0xBC - ldrb r0, [r0] - cmp r0, 0 - bne _08070ADE - mov r0, r12 - adds r0, 0xC8 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08070ADE - cmp r0, 0x2 - beq _08070ADE - mov r0, r12 - adds r0, 0xD0 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08070ADE - mov r0, r12 - adds r0, 0xDC - ldrb r0, [r0] - cmp r0, 0x2 - beq _08070ADE - mov r0, r12 - adds r0, 0xE8 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08070ADE - cmp r0, 0x2 - beq _08070ADE - mov r0, r12 - adds r0, 0xEC - ldrb r0, [r0] - cmp r0, 0x1 - beq _08070ADE - mov r0, r12 - adds r0, 0xF5 - ldrb r0, [r0] - cmp r0, 0 - bne _08070ADE - mov r0, r12 - adds r0, 0xFD - ldrb r0, [r0] - cmp r0, 0 - beq _08070AE2 -_08070ADE: - movs r0, 0x1 - b _08070B1E -_08070AE2: - movs r3, 0 - movs r4, 0x1 - movs r2, 0x8C - lsls r2, 1 - add r2, r12 -_08070AEC: - ldrb r1, [r2] - adds r0, r4, 0 - ands r0, r1 - cmp r0, 0 - beq _08070B00 - ldrb r1, [r2, 0x1] - adds r0, r4, 0 - ands r0, r1 - cmp r0, 0 - bne _08070ADE -_08070B00: - adds r2, 0x8 - adds r3, 0x1 - cmp r3, 0x3 - ble _08070AEC - movs r3, 0 - ldr r1, _08070B24 - add r1, r12 -_08070B0E: - adds r0, r1, r3 - ldrb r0, [r0] - cmp r0, 0 - bne _08070ADE - adds r3, 0x1 - cmp r3, 0x4 - ble _08070B0E - movs r0, 0 -_08070B1E: - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08070B24: .4byte 0x0000010d - thumb_func_end HasNegativeStatus - - thumb_func_start IsSleeping -IsSleeping: - push {lr} - ldr r0, [r0, 0x70] - adds r0, 0xA8 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08070B40 - cmp r0, 0x5 - beq _08070B40 - cmp r0, 0x3 - beq _08070B40 - movs r0, 0 - b _08070B42 -_08070B40: - movs r0, 0x1 -_08070B42: - pop {r1} - bx r1 - thumb_func_end IsSleeping - - thumb_func_start HasQuarterHPOrLess -HasQuarterHPOrLess: - push {lr} - ldr r0, [r0, 0x70] - adds r1, r0, 0 - movs r2, 0x10 - ldrsh r0, [r1, r2] - cmp r0, 0 - bge _08070B58 - adds r0, 0x3 -_08070B58: - movs r2, 0xE - ldrsh r1, [r1, r2] - asrs r0, 2 - cmp r1, r0 - ble _08070B66 - movs r0, 0 - b _08070B68 -_08070B66: - movs r0, 0x1 -_08070B68: - pop {r1} - bx r1 - thumb_func_end HasQuarterHPOrLess - - .align 2, 0 + .align 2, 0
\ No newline at end of file diff --git a/asm/code_8070B28.s b/asm/code_8070B28.s new file mode 100644 index 0000000..65b82a2 --- /dev/null +++ b/asm/code_8070B28.s @@ -0,0 +1,54 @@ + #include "asm/constants/gba_constants.inc" + #include "asm/macros.inc" + + .syntax unified + + .text + + thumb_func_start IsSleeping +IsSleeping: + push {lr} + ldr r0, [r0, 0x70] + adds r0, 0xA8 + ldrb r0, [r0] + cmp r0, 0x1 + beq _08070B40 + cmp r0, 0x5 + beq _08070B40 + cmp r0, 0x3 + beq _08070B40 + movs r0, 0 + b _08070B42 +_08070B40: + movs r0, 0x1 +_08070B42: + pop {r1} + bx r1 + thumb_func_end IsSleeping + + thumb_func_start HasQuarterHPOrLess +HasQuarterHPOrLess: + push {lr} + ldr r0, [r0, 0x70] + adds r1, r0, 0 + movs r2, 0x10 + ldrsh r0, [r1, r2] + cmp r0, 0 + bge _08070B58 + adds r0, 0x3 +_08070B58: + movs r2, 0xE + ldrsh r1, [r1, r2] + asrs r0, 2 + cmp r1, r0 + ble _08070B66 + movs r0, 0 + b _08070B68 +_08070B66: + movs r0, 0x1 +_08070B68: + pop {r1} + bx r1 + thumb_func_end HasQuarterHPOrLess + + .align 2, 0 diff --git a/include/dungeon_entity.h b/include/dungeon_entity.h index 640183f..7e562fc 100644 --- a/include/dungeon_entity.h +++ b/include/dungeon_entity.h @@ -6,6 +6,8 @@ #include "item.h" #include "position.h" +#define NUM_SPEED_TURN_COUNTERS 5 + struct DungeonActionContainer { /* 0x0 */ u16 action; @@ -167,8 +169,8 @@ struct DungeonEntityData /* 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]; - /* 0x10D */ u8 slowTurnsLeft[5]; + /* 0x108 */ u8 speedUpTurnsLeft[NUM_SPEED_TURN_COUNTERS]; + /* 0x10D */ u8 slowTurnsLeft[NUM_SPEED_TURN_COUNTERS]; /* 0x112 */ u8 stockpileCount; u8 fill113; // When true, an AI Pokémon will move in a random direction every turn. diff --git a/include/status_checks.h b/include/status_checks.h new file mode 100644 index 0000000..e899f74 --- /dev/null +++ b/include/status_checks.h @@ -0,0 +1,9 @@ +#ifndef GUARD_STATUS_CHECKS_H +#define GUARD_STATUS_CHECKS_H + +#include "dungeon_entity.h" + +// 0x70A58 +bool8 HasNegativeStatus(struct DungeonEntity *pokemon); + +#endif diff --git a/ld_script.txt b/ld_script.txt index 46e4fa2..cdfbd8f 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -208,6 +208,8 @@ SECTIONS { src/code_806CD90.o(.text); asm/code_806CD90.o(.text); asm/code_807001C.o(.text); + src/status_checks.o(.text); + asm/code_8070B28.o(.text); src/dungeon_capabilities.o(.text); asm/code_8070BC0.o(.text); src/dungeon_capabilities_1.o(.text); diff --git a/src/dungeon_ai_item_weight.c b/src/dungeon_ai_item_weight.c index 2f497cc..34e3440 100644 --- a/src/dungeon_ai_item_weight.c +++ b/src/dungeon_ai_item_weight.c @@ -9,8 +9,7 @@ #include "dungeon_util.h" #include "moves.h" #include "number_util.h" - -extern bool8 HasNegativeStatus(struct DungeonEntity*); +#include "status_checks.h" u32 EvaluateItem(struct DungeonEntity *targetPokemon, struct ItemSlot *item, u32 itemTargetFlags) { @@ -96,7 +95,7 @@ u32 EvaluateItem(struct DungeonEntity *targetPokemon, struct ItemSlot *item, u32 } } } - if (itemWeight > 98) + if (itemWeight >= 99) { itemWeight = 99; } diff --git a/src/status_checks.c b/src/status_checks.c new file mode 100644 index 0000000..346afb5 --- /dev/null +++ b/src/status_checks.c @@ -0,0 +1,44 @@ +#include "global.h" +#include "status_checks.h" + +#include "constants/status.h" + +bool8 HasNegativeStatus(struct DungeonEntity *pokemon) +{ + struct DungeonEntityData *pokemonData = pokemon->entityData; + s32 i; + if (pokemonData->sleepStatus == SLEEP_STATUS_SLEEP || + pokemonData->sleepStatus == SLEEP_STATUS_NIGHTMARE || + pokemonData->sleepStatus == SLEEP_STATUS_YAWNING || + pokemonData->nonVolatileStatus != NON_VOLATILE_STATUS_NONE || + (pokemonData->immobilizeStatus != IMMOBILIZE_STATUS_INGRAIN && pokemonData->immobilizeStatus != IMMOBILIZE_STATUS_NONE) || + pokemonData->volatileStatus != VOLATILE_STATUS_NONE || + pokemonData->waitingStatus == WAITING_STATUS_CURSED || + pokemonData->waitingStatus == WAITING_STATUS_DECOY || + pokemonData->linkedStatus == LINKED_STATUS_LEECH_SEED || + pokemonData->moveStatus == MOVE_STATUS_WHIFFER || + pokemonData->eyesightStatus == EYESIGHT_STATUS_BLINKER || + pokemonData->eyesightStatus == EYESIGHT_STATUS_CROSS_EYED || + pokemonData->muzzledStatus == MUZZLED_STATUS_MUZZLED || + pokemonData->exposedStatus || + pokemonData->perishSongTimer != 0) + { + return TRUE; + } + for (i = 0; i < MAX_MON_MOVES; i++) + { + struct PokemonMove *moves = pokemonData->moves; + if (moves[i].moveFlags & MOVE_FLAG_EXISTS && moves[i].sealed & TRUE) + { + return TRUE; + } + } + for (i = 0; i < NUM_SPEED_TURN_COUNTERS; i++) + { + if (pokemonData->slowTurnsLeft[i] != 0) + { + return TRUE; + } + } + return FALSE; +} |