mirror of
https://github.com/pret/pmd-red.git
synced 2026-04-22 15:08:24 -05:00
Decomped TargetThrownItem()
This commit is contained in:
parent
6512ebff67
commit
4bf154654b
|
|
@ -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}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#define GUARD_DUNGEON_ENTITY_H
|
||||
|
||||
#include "constants/move.h"
|
||||
#include "global.h"
|
||||
#include "item.h"
|
||||
#include "position.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user