sub_8056F80

This commit is contained in:
DizzyEggg 2024-10-24 19:28:40 +02:00
parent 80e20f5c09
commit f28ab41acb
3 changed files with 159 additions and 255 deletions

View File

@ -1,139 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start sub_8056F80
sub_8056F80:
push {r4-r7,lr}
mov r7, r8
push {r7}
adds r5, r0, 0
mov r8, r1
adds r4, r3, 0
ldr r7, [sp, 0x18]
ldr r0, [sp, 0x20]
lsls r2, 16
asrs r2, 16
lsls r0, 24
lsrs r0, 24
mov r12, r0
movs r6, 0
ldr r1, [r7, 0x70]
ldr r3, [sp, 0x1C]
ldrh r0, [r3, 0x2]
cmp r0, 0xFC
bne _08056FAA
cmp r4, r7
beq _08057060
_08056FAA:
ldrb r0, [r1, 0x8]
cmp r0, 0x1
beq _08057060
adds r0, r1, 0
adds r0, 0xA4
ldrb r0, [r0]
cmp r0, 0x4
beq _08057060
cmp r0, 0x1
beq _08057060
mov r0, r12
cmp r0, 0
bne _0805702C
movs r0, 0xF
ands r0, r2
cmp r0, 0
beq _08056FD0
cmp r0, 0x4
bne _08056FE6
_08056FD0:
adds r0, r4, 0
adds r1, r7, 0
movs r2, 0x1
movs r3, 0
bl GetTreatmentBetweenMonsters
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
bne _0805702E
b _0805702C
_08056FE6:
cmp r0, 0x1
bne _08056FFE
adds r0, r4, 0
adds r1, r7, 0
movs r2, 0x1
movs r3, 0
bl GetTreatmentBetweenMonsters
lsls r0, 24
cmp r0, 0
bne _0805702E
b _0805702C
_08056FFE:
cmp r0, 0x2
beq _0805702C
cmp r0, 0x5
bne _0805700C
cmp r4, r7
beq _0805702E
b _0805702C
_0805700C:
cmp r0, 0x6
bne _08057028
adds r0, r4, 0
adds r1, r7, 0
movs r2, 0x1
movs r3, 0
bl GetTreatmentBetweenMonsters
lsls r0, 24
cmp r0, 0
bne _0805702E
cmp r4, r7
beq _0805702E
b _0805702C
_08057028:
cmp r0, 0x3
bne _0805702E
_0805702C:
movs r6, 0x1
_0805702E:
adds r0, r7, 0
ldr r1, [sp, 0x1C]
bl sub_80571F0
lsls r0, 24
cmp r0, 0
beq _0805703E
movs r6, 0
_0805703E:
cmp r6, 0
beq _08057060
cmp r5, 0x3F
bgt _08057060
lsls r0, r5, 2
add r0, r8
str r7, [r0]
ldr r0, [r7, 0x70]
ldrb r0, [r0, 0x6]
cmp r0, 0
bne _0805705E
ldr r1, _0805706C
ldr r0, [r1]
cmp r0, 0
bne _0805705E
str r7, [r1]
_0805705E:
adds r5, 0x1
_08057060:
adds r0, r5, 0
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r1}
bx r1
.align 2, 0
_0805706C: .4byte gUnknown_203B438
thumb_func_end sub_8056F80
.align 2, 0

View File

@ -235,7 +235,6 @@ SECTIONS {
src/code_804AFAC.o(.text);
asm/code_804FD30.o(.text);
src/dungeon_message.o(.text);
asm/dungeon_message.o(.text);
src/charge_move.o(.text);
src/move_util.o(.text);
src/move_actions.o(.text);

View File

@ -1106,6 +1106,100 @@ static void CreateMessageLogArrow(bool8 upArrow, s32 y)
#include "text_util.h"
#include "dungeon_visibility.h"
extern void HandleDealingDamage(Entity *attacker, Entity *target, struct DamageStruct *dmgStruct, bool32 isFalseSwipe, bool32 giveExp, s16 arg4, bool32 arg8, s32 argC);
extern void sub_806EAF4(Entity *, Entity *, u8, u32, u32, struct DamageStruct *dmgStruct, u32, u16, u32);
extern s16 sub_8057600(Move *move, s32 itemID);
extern void sub_803ED30(s32, Entity *r0, u8, s32);
extern void sub_8042238(Entity *pokemon, Entity *target);
extern void sub_806A1E8(Entity *pokemon);
extern void sub_80574C4(Entity **a0, Entity *a1);
extern bool8 sub_8044B28(void);
extern void sub_804178C(u32);
extern void sub_8071DA4(Entity *);
extern void sub_80428A0(Entity *r0);
extern bool8 sub_8040BB0(Entity *entity, Move *move, bool8);
extern void sub_8040DA0(Entity *entity, Move *move);
extern u16 sub_80412E0(u16 moveId, u8 weather, u8 a2);
extern void sub_800569C(Position *, EntitySpriteInfo *, u8);
extern u8 GetBodySize(s16 index);
extern void sub_800EF10(u16 r0);
extern s32 sub_800E710(s16 a0, u16 a1);
extern void sub_800E3AC(s32 a0, Position *pos, s32 a2);
extern void sub_8041168(Entity *entity, Entity *entity2, Move *,Position *);
extern Entity *sub_80696A8(Entity *a0);
extern Entity *sub_804AD0C(Position *pos);
extern Entity *sub_80696FC(Entity *);
extern Entity *sub_806977C(Entity *);
extern void sub_806F2BC(Entity *attacker, Entity *target, u8 moveType, s32 a2, struct DamageStruct *dmgStruct);
extern void sub_806ACE8(Entity *entity, Move *move);
extern s32 sub_8057070(Move *move);
extern bool8 sub_805755C(Entity* pokemon,u16 param_2);
extern s32 sub_800ED20(u16 param_1);
s32 sub_8055640(Entity *, Entity *, Move *, s32, s32);
s32 sub_8055728(Entity *attacker, Entity *target, Move *move, struct DamageStruct *dmgStruct, s16 unk);
static bool8 CalcIfMoveHits(Entity *attacker, Entity *target, Move *move, s32 accuracyType, bool8 selfAlwaysHits);
bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg_0, struct Move *move);
bool8 sub_8056468(Entity *entity, Move *move, const u8 *str, Entity **unkArray, bool32 itemId, bool8 arg_4, bool32 unused);
bool8 sub_805744C(Entity * pokemon, Move *move, bool8 param_3);
void sub_8056CE8(Entity **, Entity * pokemon, Move *move);
void sub_80566F8(Entity*, Move *, s32 a2, bool8 a3, s32 a4, s32 a5);
s32 sub_8056F80(s32 a0, Entity **entitiesArray, s32 target, Entity *entity1, Entity *entity2, Move *move, bool32 arg8);
extern const s32 gUnknown_80F519C;
extern const s32 gUnknown_80F51A0;
extern const s32 gUnknown_80F50F4[2][21];
extern const s32 gUnknown_81069D4[];
extern const s32 gUnknown_81069BC[];
extern const s16 gUnknown_80F4E70[];
extern const s16 gUnknown_80F4E74[];
extern const u16 gUnknown_80F5004;
extern const u8 *const gUnknown_80FEEA4;
extern const u8 *const gUnknown_80FEEC8;
extern const u8 *const gUnknown_80FEEEC;
extern const u8 *const gUnknown_80FEF0C;
extern const u8 *const gUnknown_80FEF30;
extern const u8 *const gUnknown_80FEF4C;
extern const u8 *const gUnknown_80FEF50;
extern const u8 *const gUnknown_80FEF54;
extern const u8 *const gUnknown_80FEF74;
extern const u8 *const gUnknown_80FEF98;
extern const u8 *const gUnknown_80FEFD0;
extern const u8 *const gUnknown_80FECA4;
extern const u8 *const gUnknown_80F9158;
extern const u8 *const gUnknown_80FC72C;
extern const u8 *const gUnknown_80FC700;
extern const u8 *const gUnknown_80FC6D0;
extern const u8 *const gUnknown_80FC710;
extern const u8 *const gUnknown_80FC6FC;
extern const u8 *const gUnknown_80FECBC;
extern const u8 *const gUnknown_80FECE0;
extern const u8 *const gUnknown_80F9688;
extern const u8 *const gUnknown_80FC714;
extern const u8 *const gUnknown_80FC718;
extern const u8 *const gUnknown_80FC6A8;
extern const u8 *const gUnknown_80FD2D0;
extern const u8 *const gUnknown_80FD2DC;
extern const u8 *const gUnknown_80F93C8;
extern const u8 *const gUnknown_80FC690;
extern const u8 *const gUnknown_80FC6A4;
extern u8 gFormatItems[];
extern u8 gUnknown_202F221;
extern u8 gUnknown_202F222;
extern s32 gUnknown_202F208;
extern s32 gMetronomeCalledArrayId;
extern s32 gUnknown_202F214;
extern s32 gUnknown_202F20C;
extern s32 gUnknown_202F210;
extern s32 gUnknown_202F21C;
extern Entity *gUnknown_203B438;
extern u8 gUnknown_202F218;
extern u8 gUnknown_202F219;
extern u8 gUnknown_202F21A;
extern u8 gUnknown_202F220;
extern u8 gUnknown_202F221;
NAKED void sub_8053704(Entity **unkArray, Entity *entity, Move *move, s32 itemId, s32 a4)
{
asm_unified("\n"
@ -4515,26 +4609,11 @@ NAKED void sub_8053704(Entity **unkArray, Entity *entity, Move *move, s32 itemId
"_0805561C: .4byte gUnknown_8106A50\n");
}
s32 sub_8055640(Entity *, Entity *, Move *, s32, s32);
s32 sub_8055728(Entity *attacker, Entity *target, Move *move, struct DamageStruct *dmgStruct, s16 unk);
static bool8 CalcIfMoveHits(Entity *attacker, Entity *target, Move *move, s32 accuracyType, bool8 selfAlwaysHits);
bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg_0, struct Move *move);
UNUSED bool32 sub_8055620(Entity *a0, Entity *a1, Move *a2, s32 a3)
{
return (sub_8055640(a0, a1, a2, 0x100, a3) != FALSE);
}
extern void HandleDealingDamage(Entity *attacker, Entity *target, struct DamageStruct *dmgStruct, bool32 isFalseSwipe, bool32 giveExp, s16 arg4, bool32 arg8, s32 argC);
extern void sub_806EAF4(Entity *, Entity *, u8, u32, u32, struct DamageStruct *dmgStruct, u32, u16, u32);
extern s16 sub_8057600(Move *move, s32 itemID);
extern void sub_803ED30(s32, Entity *r0, u8, s32);
extern void sub_8042238(Entity *pokemon, Entity *target);
extern void sub_806A1E8(Entity *pokemon);
extern void sub_80574C4(Entity **a0, Entity *a1);
extern const u8 *const gUnknown_80F9688;
s32 sub_8055640(Entity *attacker, Entity *target, Move *move, s32 r9, s32 itemId)
{
struct DamageStruct dmgStruct;
@ -4598,8 +4677,6 @@ s32 sub_8055728(Entity *attacker, Entity *target, Move *move, struct DamageStruc
return dmgStruct->dmg;
}
extern void sub_806F2BC(Entity *attacker, Entity *target, u8 moveType, s32 a2, struct DamageStruct *dmgStruct);
s32 sub_8055864(Entity *attacker, Entity *target, Move *move, s32 param_4, s32 itemId)
{
struct DamageStruct dmgStruct;
@ -4617,8 +4694,6 @@ s32 sub_8055864(Entity *attacker, Entity *target, Move *move, s32 param_4, s32 i
return dmgStruct.dmg;
}
extern const s32 gUnknown_81069BC[];
// This unused function returns FALSE if target's typing makes it immune to move's type.
UNUSED bool32 TargetNotImmuneTo(Move *move, Entity *target)
{
@ -4673,29 +4748,6 @@ void sub_80559DC(Entity *entity1, Entity *entity2)
sub_806CE68(entity1, direction);
}
extern const u8 *const gUnknown_80FC714;
extern const u8 *const gUnknown_80FC718;
extern const u8 *const gUnknown_80FC6A8;
extern const u8 *const gUnknown_80FD2D0;
extern const u8 *const gUnknown_80FD2DC;
extern const u8 *const gUnknown_80F93C8;
extern const u8 *const gUnknown_80FC690;
extern const u8 *const gUnknown_80FC6A4;
extern const s16 gUnknown_80F4E70[];
extern const s16 gUnknown_80F4E74[];
extern u8 gFormatItems[];
extern u8 gUnknown_202F221;
extern u8 gUnknown_202F222;
extern s32 gUnknown_202F208;
extern bool8 sub_8044B28(void);
extern void sub_804178C(u32);
extern void sub_8071DA4(Entity *);
extern void sub_80428A0(Entity *r0);
bool32 sub_8055A00(Entity *entity, s32 firstMoveId, s32 var_34, s32 itemId, s32 arg_0)
{
s32 i, j;
@ -4865,28 +4917,6 @@ bool32 sub_8055A00(Entity *entity, s32 firstMoveId, s32 var_34, s32 itemId, s32
return TRUE;
}
extern const u16 gUnknown_80F5004;
extern const u8 *const gUnknown_80FEEA4;
extern const u8 *const gUnknown_80FEEC8;
extern const u8 *const gUnknown_80FEEEC;
extern const u8 *const gUnknown_80FEF0C;
extern const u8 *const gUnknown_80FEF30;
extern const u8 *const gUnknown_80FEF4C;
extern const u8 *const gUnknown_80FEF50;
extern const u8 *const gUnknown_80FEF54;
extern const u8 *const gUnknown_80FEF74;
extern const u8 *const gUnknown_80FEF98;
extern const u8 *const gUnknown_80FEFD0;
extern const u8 *const gUnknown_80FECA4;
extern const u8 *const gUnknown_80F9158;
extern const u8 *const gUnknown_80FC72C;
extern const u8 *const gUnknown_80FC700;
extern const u8 *const gUnknown_80FC6D0;
extern const u8 *const gUnknown_80FC710;
extern const u8 *const gUnknown_80FC6FC;
extern const u8 *const gUnknown_80FECBC;
extern const u8 *const gUnknown_80FECE0;
void TriggerAbilityEffect(Entity *entity)
{
if (EntityExists(entity)) {
@ -4943,29 +4973,6 @@ void TriggerAbilityEffect(Entity *entity)
}
}
extern s32 gMetronomeCalledArrayId;
extern void sub_806ACE8(Entity *entity, Move *move);
extern s32 sub_8057070(Move *move);
bool8 sub_8056468(Entity *entity, Move *move, const u8 *str, Entity **unkArray, bool32 itemId, bool8 arg_4, bool32 unused);
bool8 sub_805744C(Entity * pokemon, Move *move, bool8 param_3);
void sub_8056CE8(Entity **, Entity * pokemon, Move *move);
void sub_80566F8(Entity*, Move *, s32 a2, bool8 a3, s32 a4, s32 a5);
extern s32 gUnknown_202F214;
extern s32 gUnknown_202F20C;
extern s32 gUnknown_202F210;
extern s32 gUnknown_202F21C;
extern Entity *gUnknown_203B438;
extern u8 gUnknown_202F218;
extern u8 gUnknown_202F219;
extern u8 gUnknown_202F21A;
extern u8 gUnknown_202F220;
extern u8 gUnknown_202F221;
bool8 sub_805755C(Entity* pokemon,u16 param_2);
bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg_0, struct Move *move)
{
s32 i;
@ -5160,9 +5167,6 @@ bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg
return TRUE;
}
extern bool8 sub_8040BB0(Entity *entity, Move *move, bool8);
extern void sub_8040DA0(Entity *entity, Move *move);
bool8 sub_8056468(Entity *entity, Move *move, const u8 *str, Entity **unkArray, bool32 itemId, bool8 arg_4, bool32 unused)
{
s32 i;
@ -5214,9 +5218,6 @@ bool8 sub_8056468(Entity *entity, Move *move, const u8 *str, Entity **unkArray,
return ret;
}
extern u16 sub_80412E0(u16 moveId, u8 weather, u8 a2);
extern void sub_800569C(Position *, EntitySpriteInfo *, u8);
struct UnkStruct_sub_800E308_1
{
s16 unk0;
@ -5235,9 +5236,6 @@ struct UnkStruct_sub_800E308_2
};
extern s32 sub_800E308(struct UnkStruct_sub_800E308_1 *, struct UnkStruct_sub_800E308_2 *);
extern u8 GetBodySize(s16 index);
extern void sub_800EF10(u16 r0);
extern s32 sub_800E710(s16 a0, u16 a1);
#ifdef NONMATCHING // https://decomp.me/scratch/fTUsI
s32 sub_8056564(Entity *entity, Position *pos, Move *move, s32 r4)
@ -5480,15 +5478,6 @@ NAKED s32 sub_8056564(Entity *entity, Position *pos, Move *move, s32 r4)
}
#endif // NONMATCHING
extern s32 sub_800ED20(u16 param_1);
extern const s32 gUnknown_81069D4[];
extern void sub_800E3AC(s32 a0, Position *pos, s32 a2);
extern void sub_8041168(Entity *entity, Entity *entity2, Move *,Position *);
s32 sub_8056F80(s32 a0, Entity **entitiesArray, s32 target, Entity *entity1, Entity *entity2, Move *move, bool8 arg8);
// This function looks important, but what does it do?
void sub_80566F8(Entity *entity, Move *move, s32 a2, bool8 a3, s32 itemId, s32 a5)
{
@ -5652,10 +5641,6 @@ void sub_80566F8(Entity *entity, Move *move, s32 a2, bool8 a3, s32 itemId, s32 a
}
}
extern const s32 gUnknown_80F519C;
extern const s32 gUnknown_80F51A0;
extern const s32 gUnknown_80F50F4[2][21];
static bool8 CalcIfMoveHits(Entity *attacker, Entity *target, Move *move, s32 accuracyType, bool8 selfAlwaysHits)
{
s32 statStageAccuracy, statStageEvasion;
@ -5736,11 +5721,6 @@ static bool8 CalcIfMoveHits(Entity *attacker, Entity *target, Move *move, s32 ac
return FALSE;
}
extern Entity *sub_80696A8(Entity *a0);
extern Entity *sub_804AD0C(Position *pos);
extern Entity *sub_80696FC(Entity *);
extern Entity *sub_806977C(Entity *);
void sub_8056CE8(Entity **entitiesArray, Entity *entity, Move *move)
{
s32 target;
@ -5853,4 +5833,68 @@ void sub_8056CE8(Entity **entitiesArray, Entity *entity, Move *move)
entitiesArray[arrId] = NULL;
}
//
s32 sub_8056F80(s32 a0, Entity **entitiesArray, s32 target_, Entity *entity1, Entity *entity2, Move *move, bool32 arg8_)
{
bool32 r6;
EntityInfo *ent2Info;
// It's happening again, all over the codebase there are problems with s16 arguments, where the lsl/asr asm can't be matched. What is going on with that?
s32 target = (s16)target_;
bool8 arg8 = arg8_;
r6 = FALSE;
ent2Info = GetEntInfo(entity2);
if (move->id == MOVE_BATON_PASS && entity1 == entity2)
return a0;
if (ent2Info->shopkeeper == SHOPKEEPER_MODE_SHOPKEEPER)
return a0;
if (ent2Info->clientType == CLIENT_TYPE_DONT_MOVE || ent2Info->clientType == CLIENT_TYPE_CLIENT)
return a0;
if (arg8) {
r6 = TRUE;
}
else {
s32 targetFlags = target & 0xF;
if (targetFlags == 0 || targetFlags == 4) {
if (GetTreatmentBetweenMonsters(entity1, entity2, TRUE, FALSE) == 1) {
r6 = TRUE;
}
}
else if (targetFlags == 1) {
if (GetTreatmentBetweenMonsters(entity1, entity2, TRUE, FALSE) == 0) {
r6 = TRUE;
}
}
else if (targetFlags == 2) {
r6 = TRUE;
}
else if (targetFlags == 5) {
if (entity1 != entity2) {
r6 = TRUE;
}
}
else if (targetFlags == 6) {
if (GetTreatmentBetweenMonsters(entity1, entity2, TRUE, FALSE) == 0 && entity1 != entity2) {
r6 = TRUE;
}
}
else if (targetFlags == 3) {
r6 = TRUE;
}
}
if (sub_80571F0(entity2, move)) {
r6 = FALSE;
}
if (r6 && a0 < 64) {
entitiesArray[a0] = entity2;
if (!GetEntInfo(entity2)->isNotTeamMember && gUnknown_203B438 == NULL) {
gUnknown_203B438 = entity2;
}
a0++;
}
return a0;
}