Decomped TargetThrownItem()

This commit is contained in:
AnonymousRandomPerson 2021-12-26 00:03:03 -06:00
parent 6512ebff67
commit 4bf154654b
5 changed files with 79 additions and 206 deletions

View File

@ -1,211 +1,10 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start TargetThrownItem
TargetThrownItem:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
adds r4, r0, 0
adds r5, r1, 0
mov r9, r2
mov r10, r3
ldr r0, [sp, 0x20]
lsls r0, 24
lsrs r0, 24
mov r8, r0
movs r0, 0x4
ldrsh r1, [r4, r0]
movs r2, 0x4
ldrsh r0, [r5, r2]
subs r2, r1, r0
cmp r2, 0
bge _08073BA2
negs r2, r2
_08073BA2:
movs r3, 0x6
ldrsh r1, [r4, r3]
movs r6, 0x6
ldrsh r0, [r5, r6]
subs r1, r0
cmp r1, 0
bge _08073BB2
negs r1, r1
_08073BB2:
ldr r0, [r4, 0x70]
adds r0, 0xE0
ldrb r0, [r0]
cmp r0, 0
bne _08073BCA
adds r0, r1, 0
cmp r1, r2
bge _08073BC4
adds r0, r2, 0
_08073BC4:
cmp r0, 0xA
ble _08073BCA
b _08073CDC
_08073BCA:
movs r6, 0x1
negs r6, r6
cmp r2, r1
bne _08073C14
movs r7, 0x4
ldrsh r1, [r4, r7]
movs r2, 0x4
ldrsh r0, [r5, r2]
ldrh r2, [r4, 0x4]
ldrh r3, [r5, 0x4]
cmp r1, r0
bge _08073BFA
movs r6, 0x6
ldrsh r1, [r4, r6]
movs r7, 0x6
ldrsh r0, [r5, r7]
cmp r1, r0
bge _08073BF2
movs r6, 0x1
b _08073C7E
_08073BF2:
cmp r1, r0
ble _08073BFA
movs r6, 0x3
b _08073C7E
_08073BFA:
lsls r1, r2, 16
lsls r0, r3, 16
movs r6, 0x7
cmp r1, r0
ble _08073C7A
movs r0, 0x6
ldrsh r1, [r4, r0]
movs r2, 0x6
ldrsh r0, [r5, r2]
cmp r1, r0
ble _08073C7A
movs r6, 0x5
b _08073C7E
_08073C14:
movs r3, 0x4
ldrsh r1, [r4, r3]
movs r7, 0x4
ldrsh r0, [r5, r7]
ldrh r2, [r4, 0x4]
ldrh r3, [r5, 0x4]
cmp r1, r0
bne _08073C34
movs r0, 0x6
ldrsh r1, [r4, r0]
movs r7, 0x6
ldrsh r0, [r5, r7]
cmp r1, r0
bge _08073C34
movs r6, 0
b _08073C7E
_08073C34:
lsls r1, r2, 16
lsls r0, r3, 16
cmp r1, r0
bge _08073C4C
movs r0, 0x6
ldrsh r1, [r4, r0]
movs r7, 0x6
ldrsh r0, [r5, r7]
cmp r1, r0
bne _08073C4C
movs r6, 0x2
b _08073C7E
_08073C4C:
lsls r1, r2, 16
lsls r0, r3, 16
cmp r1, r0
bne _08073C64
movs r0, 0x6
ldrsh r1, [r4, r0]
movs r7, 0x6
ldrsh r0, [r5, r7]
cmp r1, r0
ble _08073C64
movs r6, 0x4
b _08073C7E
_08073C64:
lsls r1, r2, 16
lsls r0, r3, 16
cmp r1, r0
ble _08073C7A
movs r0, 0x6
ldrsh r1, [r4, r0]
movs r2, 0x6
ldrsh r0, [r5, r2]
cmp r1, r0
bne _08073C7A
movs r6, 0x6
_08073C7A:
cmp r6, 0
blt _08073CDC
_08073C7E:
ldr r0, _08073CC0
adds r7, r6, r0
ldrb r0, [r7]
cmp r0, 0
bne _08073CDC
adds r0, r4, 0
adds r1, r5, 0
adds r2, r6, 0
movs r3, 0xA
bl IsTargetStraightAhead
lsls r0, 24
cmp r0, 0
beq _08073CDC
movs r0, 0x1
strb r0, [r7]
ldr r1, _08073CC4
ldr r0, _08073CC8
ldr r0, [r0]
lsls r0, 2
adds r1, r0, r1
str r6, [r1]
ldr r1, _08073CCC
adds r4, r0, r1
mov r3, r8
cmp r3, 0
bne _08073CD0
adds r0, r5, 0
mov r1, r9
mov r2, r10
bl EvaluateItem
b _08073CD2
.align 2, 0
_08073CC0: .4byte gTargetAhead
_08073CC4: .4byte gPotentialTargetDirections
_08073CC8: .4byte gNumPotentialTargets
_08073CCC: .4byte gPotentialTargetWeights
_08073CD0:
movs r0, 0x64
_08073CD2:
str r0, [r4]
ldr r1, _08073CEC
ldr r0, [r1]
adds r0, 0x1
str r0, [r1]
_08073CDC:
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_08073CEC: .4byte gNumPotentialTargets
thumb_func_end TargetThrownItem
thumb_func_start sub_8073CF0
sub_8073CF0:
push {lr}

View File

@ -10,5 +10,7 @@ void DecideUseItem(struct DungeonEntity *pokemon);
void FindStraightThrowableTargets(struct DungeonEntity *pokemon, s32 thrownAIFlag, struct ItemSlot *item, bool8 ignoreRollChance);
// 0x73AA0
void FindRockItemTargets(struct DungeonEntity *pokemon, struct ItemSlot *item, struct Position potentialTargets[], bool8 ignoreRollChance);
// 0x73B78
void TargetThrownItem(struct DungeonEntity *pokemon, struct DungeonEntity *targetPokemon, struct ItemSlot *item, s32 targetingFlags, bool8 ignoreRollChance);
#endif

View File

@ -2,6 +2,7 @@
#define GUARD_DUNGEON_ENTITY_H
#include "constants/move.h"
#include "global.h"
#include "item.h"
#include "position.h"

View File

@ -218,7 +218,7 @@ SECTIONS {
src/dungeon_pokemon_attributes_1.o(.text);
asm/code_80718D8.o(.text);
src/dungeon_ai_items.o(.text);
asm/code_8073B78.o(.text);
asm/code_8073CF0.o(.text);
src/dungeon_movement.o(.text);
asm/code_8075BA4.o(.text);
src/dungeon_range.o(.text);

View File

@ -3,6 +3,7 @@
#include "constants/direction.h"
#include "constants/dungeon_action.h"
#include "constants/iq_skill.h"
#include "constants/status.h"
#include "constants/targeting.h"
#include "dungeon_action.h"
#include "dungeon_ai_1.h"
@ -24,6 +25,7 @@
#define NUM_POTENTIAL_ROCK_TARGETS 20
#define GROUND_ITEM_TOOLBOX_INDEX 0x80
#define HELD_ITEM_TOOLBOX_INDEX 0x81
#define RANGED_ATTACK_RANGE 10
enum ItemTargetFlag
{
@ -32,9 +34,9 @@ enum ItemTargetFlag
};
extern s32 CalculateFacingDir(struct Position*, struct Position*);
extern u32 EvaluateItem(struct DungeonEntity*, struct ItemSlot*, u8);
extern u32 EvaluateItem(struct DungeonEntity*, struct ItemSlot*, u32);
extern void sub_8077274(struct DungeonEntity *, struct DungeonEntity *);
extern void TargetThrownItem(struct DungeonEntity*, struct DungeonEntity*, struct ItemSlot*, u8, bool8);
extern bool8 IsTargetStraightAhead(struct DungeonEntity*, struct DungeonEntity*, s32, s32);
extern s32 gNumPotentialTargets;
extern u32 gPotentialTargetWeights[NUM_DIRECTIONS];
@ -284,7 +286,7 @@ void FindStraightThrowableTargets(struct DungeonEntity *pokemon, s32 thrownAIFla
struct DungeonEntity* targetPokemon = gDungeonGlobalData->allPokemon[i];
if (EntityExists(targetPokemon) && pokemon != targetPokemon)
{
u8 targetingFlags;
s32 targetingFlags;
if (thrownAIFlag == ITEM_AI_FLAG_TARGET_ALLY)
{
if (CanTarget(pokemon, targetPokemon, FALSE, FALSE) == TARGET_CAPABILITY_CANNOT_ATTACK)
@ -357,3 +359,72 @@ void FindRockItemTargets(struct DungeonEntity *pokemon, struct ItemSlot *item, s
}
}
}
void TargetThrownItem(struct DungeonEntity *pokemon, struct DungeonEntity *targetPokemon, struct ItemSlot *item, s32 targetingFlags, bool8 ignoreRollChance)
{
s32 posDiffX = pokemon->posWorld.x - targetPokemon->posWorld.x;
s32 posDiffY;
s32 targetDirection;
posDiffX = posDiffX < 0 ? -posDiffX : posDiffX;
posDiffY = pokemon->posWorld.y - targetPokemon->posWorld.y;
posDiffY = posDiffY < 0 ? -posDiffY : posDiffY;
if (pokemon->entityData->itemStatus == ITEM_STATUS_NONE)
{
s32 maxPosDiff = posDiffY < posDiffX ? posDiffX : posDiffY;
if (maxPosDiff > RANGED_ATTACK_RANGE)
{
return;
}
}
targetDirection = -1;
if (posDiffX == posDiffY)
{
if (pokemon->posWorld.x < targetPokemon->posWorld.x && pokemon->posWorld.y < targetPokemon->posWorld.y)
{
targetDirection = DIRECTION_SOUTHEAST;
}
else if (pokemon->posWorld.x < targetPokemon->posWorld.x && pokemon->posWorld.y > targetPokemon->posWorld.y)
{
targetDirection = DIRECTION_NORTHEAST;
}
else if (pokemon->posWorld.x > targetPokemon->posWorld.x && pokemon->posWorld.y > targetPokemon->posWorld.y)
{
targetDirection = DIRECTION_NORTHWEST;
}
else
{
targetDirection = DIRECTION_SOUTHWEST;
}
}
else
{
if (pokemon->posWorld.x == targetPokemon->posWorld.x && pokemon->posWorld.y < targetPokemon->posWorld.y)
{
targetDirection = DIRECTION_SOUTH;
}
else if (pokemon->posWorld.x < targetPokemon->posWorld.x && pokemon->posWorld.y == targetPokemon->posWorld.y)
{
targetDirection = DIRECTION_EAST;
}
else if (pokemon->posWorld.x == targetPokemon->posWorld.x && pokemon->posWorld.y > targetPokemon->posWorld.y)
{
targetDirection = DIRECTION_NORTH;
}
else if (pokemon->posWorld.x > targetPokemon->posWorld.x && pokemon->posWorld.y == targetPokemon->posWorld.y)
{
targetDirection = DIRECTION_WEST;
}
}
if (targetDirection > -1 && !gTargetAhead[targetDirection] && IsTargetStraightAhead(pokemon, targetPokemon, targetDirection, RANGED_ATTACK_RANGE))
{
u32 itemWeight;
u32 *targetWeight;
gTargetAhead[targetDirection] = TRUE;
gPotentialTargetDirections[gNumPotentialTargets] = targetDirection;
targetWeight = &gPotentialTargetWeights[gNumPotentialTargets];
itemWeight = !ignoreRollChance ? EvaluateItem(targetPokemon, item, targetingFlags) : 100;
*targetWeight = itemWeight;
gNumPotentialTargets++;
}
}