code_8045A00 decompiled

This commit is contained in:
DizzyEggg
2025-03-12 09:49:31 +01:00
parent 5b29b42126
commit d01fcb4b9c
4 changed files with 174 additions and 712 deletions

View File

@@ -1,705 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start sub_8046734
sub_8046734:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x18
mov r8, r0
ldr r0, _08046858
ldr r0, [r0]
ldr r2, _0804685C
adds r0, r2
ldrb r0, [r0]
str r0, [sp, 0xC]
movs r0, 0
ldrsh r2, [r1, r0]
lsls r0, r2, 1
adds r0, r2
lsls r0, 3
adds r0, 0x4
lsls r4, r0, 8
movs r2, 0x2
ldrsh r1, [r1, r2]
lsls r0, r1, 1
adds r0, r1
lsls r0, 3
adds r0, 0x4
lsls r5, r0, 8
mov r1, r8
ldr r0, [r1, 0xC]
subs r0, r4
cmp r0, 0
bge _08046776
negs r0, r0
_08046776:
mov r2, r8
ldr r2, [r2, 0x10]
mov r9, r2
cmp r0, 0xB
bgt _0804678C
subs r0, r2, r5
cmp r0, 0
bge _08046788
negs r0, r0
_08046788:
cmp r0, 0xB
ble _08046822
_0804678C:
movs r0, 0
mov r10, r0
movs r1, 0
str r1, [sp, 0x10]
mov r2, r8
ldr r0, [r2, 0xC]
str r0, [sp, 0x4]
mov r1, r9
str r1, [sp, 0x8]
subs r0, r4, r0
movs r1, 0x18
bl __divsi3
adds r6, r0, 0
mov r2, r9
subs r0, r5, r2
movs r1, 0x18
bl __divsi3
adds r7, r0, 0
movs r0, 0
mov r9, r0
mov r1, sp
adds r1, 0x4
str r1, [sp, 0x14]
_080467BE:
ldr r0, [sp, 0x4]
adds r0, r6
str r0, [sp, 0x4]
ldr r2, [sp, 0x14]
ldr r0, [r2, 0x4]
adds r0, r7
str r0, [r2, 0x4]
ldr r0, [sp, 0x10]
bl sin_4096
lsls r1, r0, 1
adds r1, r0
lsls r1, 2
mov r0, r8
str r1, [r0, 0x1C]
add r1, sp, 0x4
bl sub_804535C
mov r1, r10
lsls r3, r1, 24
lsrs r3, 24
movs r0, 0
str r0, [sp]
mov r0, r8
ldr r1, [sp, 0xC]
movs r2, 0
bl sub_80462AC
movs r0, 0x13
bl DungeonRunFrameActions
ldr r2, [sp, 0x10]
adds r2, 0x55
str r2, [sp, 0x10]
movs r0, 0x3
mov r1, r9
ands r0, r1
cmp r0, 0
bne _08046810
movs r2, 0x1
add r10, r2
_08046810:
movs r0, 0x7
mov r1, r10
ands r1, r0
mov r10, r1
movs r2, 0x1
add r9, r2
mov r0, r9
cmp r0, 0x17
ble _080467BE
_08046822:
mov r0, r8
adds r1, r4, 0
adds r2, r5, 0
bl SetEntityPixelPos
movs r0, 0
mov r1, r8
str r0, [r1, 0x1C]
str r0, [sp]
mov r0, r8
ldr r1, [sp, 0xC]
movs r2, 0x1
movs r3, 0xFF
bl sub_80462AC
movs r0, 0x13
bl DungeonRunFrameActions
add sp, 0x18
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_08046858: .4byte gDungeon
_0804685C: .4byte 0x00018210
thumb_func_end sub_8046734
thumb_func_start sub_8046860
sub_8046860:
push {r4,r5,lr}
sub sp, 0x4
adds r4, r1, 0
adds r5, r2, 0
str r3, [sp]
adds r2, r4, 0
adds r3, r5, 0
bl sub_804687C
add sp, 0x4
pop {r4,r5}
pop {r0}
bx r0
thumb_func_end sub_8046860
thumb_func_start sub_804687C
sub_804687C:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
ldr r4, _08046970
add sp, r4
ldr r5, _08046974
add r5, sp
str r0, [r5]
movs r0, 0xA5
lsls r0, 3
add r0, sp
str r1, [r0]
mov r8, r2
ldr r1, _08046978
add r1, sp
str r3, [r1]
movs r1, 0
movs r7, 0x1D
ldr r0, _0804697C
add r0, sp
_080468A8:
strb r1, [r0]
subs r0, 0x1
subs r7, 0x1
cmp r7, 0
bge _080468A8
movs r7, 0
movs r2, 0xAD
lsls r2, 3
add r2, sp
ldr r2, [r2]
cmp r7, r2
blt _080468C2
b _080469DE
_080468C2:
ldr r3, _08046980
mov r9, r3
ldr r5, _08046984
movs r0, 0
ldrsh r5, [r5, r0]
ldr r0, _08046988
add r0, sp
str r5, [r0]
_080468D2:
mov r1, r8
ldrh r0, [r1]
ldr r1, _0804698C
ands r4, r1
orrs r4, r0
mov r2, r8
ldrh r0, [r2, 0x2]
lsls r0, 16
mov r3, r9
ands r4, r3
orrs r4, r0
movs r5, 0
adds r0, r7, 0x1
mov r10, r0
ldr r1, _08046984
ldr r2, _08046988
add r2, sp
ldr r2, [r2]
cmp r2, 0x63
beq _080469B0
ldr r3, _08046990
add r3, sp
ldr r0, _08046994
add r0, sp
str r3, [r0]
_08046904:
ldr r0, _08046998
add r0, sp
adds r6, r0, r5
ldrb r0, [r6]
cmp r0, 0
bne _0804699C
lsls r2, r5, 2
adds r2, r1
ldrh r0, [r2]
mov r1, r8
ldrh r1, [r1]
adds r0, r1
lsls r0, 16
lsrs r0, 16
ldr r1, _0804698C
ands r4, r1
orrs r4, r0
ldrh r0, [r2, 0x2]
mov r2, r8
ldrh r2, [r2, 0x2]
adds r0, r2
lsls r0, 16
mov r3, r9
ands r4, r3
orrs r4, r0
lsls r0, r4, 16
asrs r0, 16
asrs r1, r4, 16
bl GetTile
adds r2, r0, 0
ldrh r1, [r2]
movs r0, 0x3
ands r0, r1
cmp r0, 0
beq _0804699C
movs r3, 0x80
lsls r3, 2
adds r0, r3, 0
ands r0, r1
cmp r0, 0
bne _0804699C
ldr r0, [r2, 0x14]
cmp r0, 0
bne _0804699C
lsls r0, r7, 2
ldr r5, _08046994
add r5, sp
ldr r5, [r5]
adds r0, r5, r0
str r4, [r0]
movs r0, 0x1
strb r0, [r6]
b _080469CE
.align 2, 0
_08046970: .4byte 0xfffffab8
_08046974: .4byte 0x00000524
_08046978: .4byte 0x0000052c
_0804697C: .4byte 0x00000521
_08046980: .4byte 0x0000ffff
_08046984: .4byte gUnknown_80F4468
_08046988: .4byte 0x00000534
_0804698C: .4byte 0xffff0000
_08046990: .4byte 0x0000048c
_08046994: .4byte 0x00000544
_08046998: .4byte 0x00000504
_0804699C:
adds r5, 0x1
cmp r5, 0x1D
bgt _080469B0
lsls r0, r5, 2
ldr r1, _08046A18
adds r0, r1
movs r2, 0
ldrsh r0, [r0, r2]
cmp r0, 0x63
bne _08046904
_080469B0:
movs r3, 0
cmp r3, 0
bne _080469CE
ldr r1, _08046A1C
add r1, sp
lsls r0, r7, 2
adds r1, r0
ldrh r2, [r1]
mov r0, r9
orrs r0, r2
strh r0, [r1]
ldrh r2, [r1, 0x2]
mov r0, r9
orrs r0, r2
strh r0, [r1, 0x2]
_080469CE:
mov r7, r10
movs r5, 0xAD
lsls r5, 3
add r5, sp
ldr r5, [r5]
cmp r7, r5
bge _080469DE
b _080468D2
_080469DE:
movs r1, 0
mov r9, r1
movs r7, 0
movs r0, 0xAD
lsls r0, 3
add r0, sp
ldr r0, [r0]
cmp r7, r0
blt _080469F2
b _08046B0A
_080469F2:
movs r2, 0
mov r8, r2
_080469F6:
ldr r0, _08046A1C
add r0, sp
lsls r2, r7, 2
adds r3, r0, r2
movs r4, 0
ldrsh r0, [r3, r4]
cmp r0, 0
bge _08046A20
movs r0, 0x74
muls r0, r7
add r0, sp
adds r0, 0x4
mov r5, r8
str r5, [r0]
movs r0, 0x1
mov r9, r0
b _08046AFA
.align 2, 0
_08046A18: .4byte gUnknown_80F4468
_08046A1C: .4byte 0x0000048c
_08046A20:
movs r0, 0x74
adds r6, r7, 0
muls r6, r0
mov r4, sp
adds r4, r6
adds r4, 0x4
movs r0, 0x3
str r0, [r4]
adds r0, r4, 0
adds r0, 0x24
mov r1, r8
strb r1, [r0]
adds r1, r4, 0
adds r1, 0x20
movs r0, 0x1
strb r0, [r1]
adds r0, r4, 0
adds r0, 0x22
mov r5, r8
strb r5, [r0]
add r0, sp, 0x74
adds r0, r6
ldr r1, _08046B2C
add r1, sp
ldr r1, [r1]
adds r2, r1, r2
str r2, [r0]
add r0, sp, 0x8
adds r0, r6
ldr r1, [r3]
str r1, [r0]
movs r2, 0xA5
lsls r2, 3
add r2, sp
ldr r2, [r2]
movs r5, 0
ldrsh r0, [r2, r5]
lsls r1, r0, 1
adds r1, r0
lsls r1, 3
adds r1, 0x4
lsls r1, 8
movs r5, 0x2
ldrsh r0, [r2, r5]
lsls r2, r0, 1
adds r2, r0
lsls r2, 3
adds r2, 0x4
lsls r2, 8
adds r0, r4, 0
movs r5, 0xA8
lsls r5, 3
add r5, sp
str r3, [r5]
bl SetEntityPixelPos
mov r0, r8
strh r0, [r4, 0x26]
ldr r4, _08046B30
add r4, sp
lsls r5, r7, 3
adds r4, r5
movs r1, 0xA8
lsls r1, 3
add r1, sp
ldr r3, [r1]
movs r2, 0
ldrsh r1, [r3, r2]
lsls r0, r1, 1
adds r0, r1
lsls r0, 3
adds r0, 0x4
lsls r0, 8
add r1, sp, 0x10
adds r1, r6
ldr r1, [r1]
subs r0, r1
movs r1, 0x18
movs r2, 0xA8
lsls r2, 3
add r2, sp
str r3, [r2]
bl __divsi3
str r0, [r4]
movs r4, 0x97
lsls r4, 3
add r4, sp
adds r4, r5
movs r5, 0xA8
lsls r5, 3
add r5, sp
ldr r3, [r5]
movs r0, 0x2
ldrsh r1, [r3, r0]
lsls r0, r1, 1
adds r0, r1
lsls r0, 3
adds r0, 0x4
lsls r0, 8
add r1, sp, 0x14
adds r1, r6
ldr r1, [r1]
subs r0, r1
movs r1, 0x18
bl __divsi3
str r0, [r4]
movs r1, 0x1
_08046AFA:
adds r7, 0x1
movs r2, 0xAD
lsls r2, 3
add r2, sp
ldr r2, [r2]
cmp r7, r2
bge _08046B0A
b _080469F6
_08046B0A:
cmp r1, 0
bne _08046B54
movs r3, 0xAD
lsls r3, 3
add r3, sp
ldr r3, [r3]
cmp r3, 0x1
ble _08046B3C
ldr r0, _08046B34
ldr r1, [r0]
ldr r4, _08046B38
add r4, sp
ldr r0, [r4]
bl LogMessageByIdWithPopupCheckUser
b _08046C7C
.align 2, 0
_08046B2C: .4byte 0x0000052c
_08046B30: .4byte 0x000004b4
_08046B34: .4byte gAllItemsLost
_08046B38: .4byte 0x00000524
_08046B3C:
ldr r0, _08046B4C
ldr r1, [r0]
ldr r5, _08046B50
add r5, sp
ldr r0, [r5]
bl LogMessageByIdWithPopupCheckUser
b _08046C7C
.align 2, 0
_08046B4C: .4byte gItemLost
_08046B50: .4byte 0x00000524
_08046B54:
mov r0, r9
cmp r0, 0
beq _08046B68
ldr r0, _08046C90
ldr r1, [r0]
ldr r2, _08046C94
add r2, sp
ldr r0, [r2]
bl LogMessageByIdWithPopupCheckUser
_08046B68:
movs r3, 0
mov r9, r3
ldr r0, _08046C98
ldr r0, [r0]
ldr r4, _08046C9C
adds r0, r4
ldrb r0, [r0]
movs r5, 0xA6
lsls r5, 3
add r5, sp
str r0, [r5]
mov r10, r3
movs r6, 0
_08046B82:
movs r7, 0
mov r0, r10
adds r0, 0x55
movs r1, 0xA7
lsls r1, 3
add r1, sp
str r0, [r1]
adds r2, r6, 0x1
ldr r3, _08046CA0
add r3, sp
str r2, [r3]
movs r4, 0xAD
lsls r4, 3
add r4, sp
ldr r4, [r4]
cmp r7, r4
bge _08046C14
mov r5, r9
lsls r5, 24
mov r8, r5
_08046BAA:
movs r0, 0x74
adds r5, r7, 0
muls r5, r0
mov r4, sp
adds r4, r5
adds r4, 0x4
adds r0, r4, 0
bl EntityIsValid
lsls r0, 24
cmp r0, 0
beq _08046C06
ldr r0, _08046CA4
add r0, sp
lsls r2, r7, 3
adds r0, r2
ldr r1, [r0]
movs r0, 0x97
lsls r0, 3
add r0, sp
adds r0, r2
ldr r2, [r0]
adds r0, r4, 0
bl IncreaseEntityPixelPos
mov r0, r10
bl sin_4096
add r2, sp, 0x20
adds r2, r5
lsls r1, r0, 1
adds r1, r0
lsls r1, 2
str r1, [r2]
movs r0, 0
str r0, [sp]
adds r0, r4, 0
movs r2, 0xA6
lsls r2, 3
add r2, sp
ldr r1, [r2]
movs r2, 0x1
mov r4, r8
lsrs r3, r4, 24
bl sub_80462AC
_08046C06:
adds r7, 0x1
movs r5, 0xAD
lsls r5, 3
add r5, sp
ldr r5, [r5]
cmp r7, r5
blt _08046BAA
_08046C14:
movs r0, 0x13
bl DungeonRunFrameActions
movs r0, 0xA7
lsls r0, 3
add r0, sp
ldr r0, [r0]
mov r10, r0
movs r0, 0x3
ands r0, r6
cmp r0, 0
bne _08046C30
movs r1, 0x1
add r9, r1
_08046C30:
movs r0, 0x7
mov r2, r9
ands r2, r0
mov r9, r2
ldr r3, _08046CA0
add r3, sp
ldr r6, [r3]
cmp r6, 0x17
ble _08046B82
movs r4, 0xAD
lsls r4, 3
add r4, sp
ldr r4, [r4]
cmp r4, 0
ble _08046C7C
ldr r0, _08046CA8
add r0, sp
ldr r5, [r0]
ldr r4, _08046CAC
add r4, sp
movs r1, 0xAD
lsls r1, 3
add r1, sp
ldr r7, [r1]
_08046C60:
movs r2, 0
ldrsh r0, [r4, r2]
cmp r0, 0
blt _08046C72
adds r0, r4, 0
adds r1, r5, 0
movs r2, 0x1
bl sub_80460F8
_08046C72:
adds r5, 0x4
adds r4, 0x4
subs r7, 0x1
cmp r7, 0
bne _08046C60
_08046C7C:
movs r3, 0xA9
lsls r3, 3
add sp, r3
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_08046C90: .4byte gSeveralItemsLost
_08046C94: .4byte 0x00000524
_08046C98: .4byte gDungeon
_08046C9C: .4byte 0x00018210
_08046CA0: .4byte 0x0000053c
_08046CA4: .4byte 0x000004b4
_08046CA8: .4byte 0x0000052c
_08046CAC: .4byte 0x0000048c
thumb_func_end sub_804687C
.align 2, 0

View File

@@ -210,7 +210,6 @@ SECTIONS {
src/code_80450F8.o(.text);
src/dungeon_visibility.o(.text);
src/code_8045A00.o(.text);
asm/code_8045A00.o(.text);
src/dungeon_items.o(.text);
asm/code_8046CE4.o(.text);
src/code_8048480.o(.text);

View File

@@ -16,7 +16,9 @@
#include "structs/map.h"
#include "structs/str_dungeon.h"
#include "trap.h"
#include "math.h"
#include "code_80450F8.h"
#include "dungeon_util.h"
#include "structs/str_item_text.h"
extern u8 *gUnknown_80FE6F4[];
@@ -605,4 +607,174 @@ void sub_804652C(Entity *entity1, Entity *entity2, Item *item, bool8 a3, Dungeon
}
}
extern void DungeonRunFrameActions(u32);
void sub_8046734(Entity *entity, DungeonPos *pos)
{
PixelPos posPixel;
PixelPos calcPixelPos;
bool8 hallucinating = gDungeon->unk181e8.hallucinating;
posPixel.x = ((pos->x * 24) + 4) << 8;
posPixel.y = ((pos->y * 24) + 4) << 8;
if (abs(entity->pixelPos.x - posPixel.x) > 11 || abs(entity->pixelPos.y - posPixel.y) > 11) {
s32 i;
PixelPos add;
s32 unk = 0; // Direction?
s32 sinVal = 0;
calcPixelPos.x = entity->pixelPos.x;
calcPixelPos.y = entity->pixelPos.y;
add.x = (posPixel.x - calcPixelPos.x) / 24;
add.y = (posPixel.y - calcPixelPos.y) / 24;
for (i = 0; i < 24; i++) {
calcPixelPos.x += add.x;
calcPixelPos.y += add.y;
entity->unk1C.raw = sin_4096(sinVal) * 12;
sub_804535C(entity, &calcPixelPos);
sub_80462AC(entity, hallucinating, 0, unk, 0);
DungeonRunFrameActions(0x13);
sinVal += 85;
if ((i & 3) == 0) {
unk++;
}
unk &= 7;
}
}
SetEntityPixelPos(entity, posPixel.x, posPixel.y);
entity->unk1C.raw = 0;
sub_80462AC(entity, hallucinating, 1, 0xFF, 0);
DungeonRunFrameActions(0x13);
}
extern void sub_804687C(Entity *entity, DungeonPos *pos1, DungeonPos *pos2, Item *item, s32 a4);
void sub_8046860(Entity *entity, DungeonPos *pos, Item *item, s32 a4)
{
sub_804687C(entity, pos, pos, item, a4);
}
extern const u8 *gSeveralItemsLost;
extern const u8 *gItemLost;
extern const u8 *gAllItemsLost;
void sub_804687C(Entity *entity, DungeonPos *pos1, DungeonPos *pos2, Item *item, s32 count)
{
Entity itemEntities[10];
DungeonPos targetTilePos[10];
PixelPos itemVelocity[10];
u8 targetTileUsed[30];
s32 sinVal;
s32 i;
bool8 r1, r9;
for (i = 0; i < 30; i++) {
targetTileUsed[i] = 0;
}
for (i = 0; i < count; i++) {
s32 j;
bool8 foundTile = FALSE;
DungeonPos pos;
pos.x = pos2->x;
pos.y = pos2->y;
for (j = 0; j < 30; j++) {
if (gUnknown_80F4468[j].x == 99)
break;
if (!targetTileUsed[j]) {
const Tile *tile;
pos.x = pos2->x + gUnknown_80F4468[j].x;
pos.y = pos2->y + gUnknown_80F4468[j].y;
tile = GetTile(pos.x, pos.y);
if (GetTerrainType(tile) != TERRAIN_TYPE_WALL && !(tile->terrainType & TERRAIN_TYPE_STAIRS) && tile->object == NULL) {
targetTilePos[i] = pos;
targetTileUsed[j] = TRUE;
foundTile = TRUE;
break;
}
}
}
if (!foundTile) {
targetTilePos[i].x = -1;
targetTilePos[i].y = -1;
}
}
r1 = FALSE;
r9 = FALSE;
for (i = 0; i < count; i++) {
if (targetTilePos[i].x < 0) {
itemEntities[i].type = ENTITY_NOTHING;
r9 = TRUE;
}
else {
s32 x, y;
itemEntities[i].type = ENTITY_ITEM;
itemEntities[i].unk24 = 0;
itemEntities[i].isVisible = TRUE;
itemEntities[i].unk22 = 0;
itemEntities[i].axObj.info.item = &item[i];
itemEntities[i].pos = targetTilePos[i];
x = ((pos1->x * 24) + 4) << 8;
y = ((pos1->y * 24) + 4) << 8;
SetEntityPixelPos(&itemEntities[i], x, y);
itemEntities[i].spawnGenID = 0;
itemVelocity[i].x = ((((targetTilePos[i].x * 24) + 4) << 8) - (itemEntities[i].pixelPos.x)) / 24;
itemVelocity[i].y = ((((targetTilePos[i].y * 24) + 4) << 8) - (itemEntities[i].pixelPos.y)) / 24;
r1 = TRUE;
}
}
if (!r1) {
if (count > 1) {
LogMessageByIdWithPopupCheckUser(entity, gAllItemsLost);
}
else {
LogMessageByIdWithPopupCheckUser(entity, gItemLost);
}
}
else {
s32 counter;
s32 dirMaybe;
bool8 hallucinating;
if (r9) {
LogMessageByIdWithPopupCheckUser(entity, gSeveralItemsLost);
}
dirMaybe = 0;
hallucinating = gDungeon->unk181e8.hallucinating;
sinVal = 0;
for (counter = 0; counter < 24; counter++) {
for (i = 0; i < count; i++) {
if (EntityIsValid(&itemEntities[i])) {
IncreaseEntityPixelPos(&itemEntities[i], itemVelocity[i].x, itemVelocity[i].y);
itemEntities[i].unk1C.raw = sin_4096(sinVal) * 12;
sub_80462AC(&itemEntities[i], hallucinating, 1, dirMaybe, 0);
}
}
DungeonRunFrameActions(0x13);
sinVal += 85;
if ((counter & 3) == 0) {
dirMaybe++;
}
dirMaybe &= 7;
}
for (i = 0; i < count; i++) {
if (targetTilePos[i].x >= 0) {
sub_80460F8(&targetTilePos[i], &item[i], TRUE);
}
}
}
}
//

View File

@@ -292,15 +292,11 @@ void sub_8047104(void)
if(item->id == ITEM_POKE)
{
AddToTeamMoney(GetMoneyValue(item));
item->id = 0;
item->quantity = 0;
item->flags = 0;
ZeroOutItem(item);
}
if(item->flags & ITEM_FLAG_IN_SHOP)
{
item->id = 0;
item->quantity = 0;
item->flags = 0;
ZeroOutItem(item);
}
}
}