Trade through sub_804FFE4

This commit is contained in:
PikalaxALT
2019-10-29 12:58:40 -04:00
parent a1ec6ccff1
commit ce5c3fdd77
5 changed files with 170 additions and 397 deletions
-389
View File
@@ -5,395 +5,6 @@
.text
thumb_func_start sub_804FE24
sub_804FE24: @ 804FE24
push {r4,r5,lr}
sub sp, 0x20
ldr r0, _0804FEB0 @ =gUnknown_2031DAC
ldr r0, [r0]
mov r12, r0
adds r0, 0xD4
ldrh r1, [r0]
lsls r1, 8
adds r0, 0x2
ldrh r2, [r0]
lsls r2, 8
adds r0, 0x6
movs r4, 0
ldrsh r3, [r0, r4]
adds r0, 0x2
movs r5, 0
ldrsh r0, [r0, r5]
str r0, [sp]
mov r4, r12
adds r4, 0xE8
movs r5, 0
ldrsh r0, [r4, r5]
str r0, [sp, 0x4]
movs r5, 0
ldrsh r0, [r4, r5]
str r0, [sp, 0x8]
mov r0, r12
adds r0, 0xEC
ldrh r0, [r0]
str r0, [sp, 0xC]
add r0, sp, 0x10
bl DoBgAffineSet
add r0, sp, 0x10
ldrh r1, [r0]
movs r0, 0x20
bl SetGpuReg
add r0, sp, 0x10
ldrh r1, [r0, 0x2]
movs r0, 0x22
bl SetGpuReg
add r0, sp, 0x10
ldrh r1, [r0, 0x4]
movs r0, 0x24
bl SetGpuReg
add r0, sp, 0x10
ldrh r1, [r0, 0x6]
movs r0, 0x26
bl SetGpuReg
ldr r1, [sp, 0x18]
lsls r1, 16
lsrs r1, 16
movs r0, 0x28
bl SetGpuReg
ldr r1, [sp, 0x1C]
lsls r1, 16
lsrs r1, 16
movs r0, 0x2C
bl SetGpuReg
add sp, 0x20
pop {r4,r5}
pop {r0}
bx r0
.align 2, 0
_0804FEB0: .4byte gUnknown_2031DAC
thumb_func_end sub_804FE24
thumb_func_start sub_804FEB4
sub_804FEB4: @ 804FEB4
push {r4,lr}
ldr r4, _0804FEFC @ =gUnknown_2031DAC
ldr r0, [r4]
adds r0, 0xE0
ldrh r1, [r0]
movs r0, 0x16
bl SetGpuReg
ldr r0, [r4]
adds r0, 0xE2
ldrh r1, [r0]
movs r0, 0x14
bl SetGpuReg
movs r0, 0
bl GetGpuReg
lsls r0, 16
movs r1, 0xE0
lsls r1, 11
ands r1, r0
cmp r1, 0
bne _0804FF00
ldr r0, [r4]
adds r0, 0xE4
ldrh r1, [r0]
movs r0, 0x1A
bl SetGpuReg
ldr r0, [r4]
adds r0, 0xE6
ldrh r1, [r0]
movs r0, 0x18
bl SetGpuReg
b _0804FF04
.align 2, 0
_0804FEFC: .4byte gUnknown_2031DAC
_0804FF00:
bl sub_804FE24
_0804FF04:
pop {r4}
pop {r0}
bx r0
thumb_func_end sub_804FEB4
thumb_func_start sub_804FF0C
sub_804FF0C: @ 804FF0C
push {lr}
bl sub_804FEB4
bl LoadOam
bl ProcessSpriteCopyRequests
bl TransferPlttBuffer
pop {r0}
bx r0
thumb_func_end sub_804FF0C
thumb_func_start sub_804FF24
sub_804FF24: @ 804FF24
push {r4,lr}
ldr r3, _0804FF48 @ =gUnknown_2031DAC
ldr r1, [r3]
movs r0, 0x8A
adds r0, r1
mov r12, r0
movs r2, 0
movs r0, 0
mov r4, r12
strh r0, [r4]
adds r1, 0x88
strb r2, [r1]
ldr r0, [r3]
adds r0, 0x89
strb r2, [r0]
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0804FF48: .4byte gUnknown_2031DAC
thumb_func_end sub_804FF24
thumb_func_start sub_804FF4C
sub_804FF4C: @ 804FF4C
push {r4,r5,lr}
ldr r0, _0804FF70 @ =gUnknown_2031DAC
ldr r2, [r0]
adds r1, r2, 0
adds r1, 0x88
adds r3, r2, 0
adds r3, 0x89
ldrb r1, [r1]
adds r5, r0, 0
ldrb r3, [r3]
cmp r1, r3
bne _0804FF74
adds r1, r2, 0
adds r1, 0x8A
ldrh r0, [r1]
adds r0, 0x1
b _0804FF7A
.align 2, 0
_0804FF70: .4byte gUnknown_2031DAC
_0804FF74:
adds r1, r2, 0
adds r1, 0x8A
movs r0, 0
_0804FF7A:
strh r0, [r1]
adds r4, r5, 0
ldr r0, [r4]
adds r0, 0x8A
ldrh r1, [r0]
movs r0, 0x96
lsls r0, 1
cmp r1, r0
bls _0804FFAC
bl CloseLink
ldr r0, _0804FFC0 @ =CB2_LinkError
bl SetMainCallback2
ldr r1, [r4]
adds r3, r1, 0
adds r3, 0x8A
movs r2, 0
movs r0, 0
strh r0, [r3]
adds r1, 0x89
strb r2, [r1]
ldr r0, [r4]
adds r0, 0x88
strb r2, [r0]
_0804FFAC:
ldr r0, [r5]
adds r1, r0, 0
adds r1, 0x88
ldrb r1, [r1]
adds r0, 0x89
strb r1, [r0]
pop {r4,r5}
pop {r0}
bx r0
.align 2, 0
_0804FFC0: .4byte CB2_LinkError
thumb_func_end sub_804FF4C
thumb_func_start sub_804FFC4
sub_804FFC4: @ 804FFC4
push {lr}
ldr r0, _0804FFD4 @ =gReceivedRemoteLinkPlayers
ldrb r0, [r0]
cmp r0, 0
bne _0804FFD8
movs r0, 0
b _0804FFE0
.align 2, 0
_0804FFD4: .4byte gReceivedRemoteLinkPlayers
_0804FFD8:
bl GetMultiplayerId
lsls r0, 24
lsrs r0, 24
_0804FFE0:
pop {r1}
bx r1
thumb_func_end sub_804FFC4
thumb_func_start sub_804FFE4
sub_804FFE4: @ 804FFE4
push {r4-r7,lr}
mov r7, r8
push {r7}
lsls r0, 24
lsrs r6, r0, 24
lsls r1, 24
lsrs r5, r1, 24
movs r4, 0
mov r8, r4
cmp r6, 0
bne _0805000A
ldr r0, _08050034 @ =gUnknown_2031DA4
ldrb r1, [r0]
movs r0, 0x64
muls r1, r0
ldr r0, _08050038 @ =gPlayerParty
adds r1, r0
mov r8, r1
movs r4, 0x1
_0805000A:
cmp r6, 0x1
bne _08050028
ldr r0, _08050034 @ =gUnknown_2031DA4
ldrb r0, [r0, 0x1]
movs r1, 0x6
bl __umodsi3
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
muls r1, r0
ldr r0, _0805003C @ =gEnemyParty
adds r1, r0
mov r8, r1
movs r4, 0x3
_08050028:
cmp r5, 0
beq _08050040
cmp r5, 0x1
beq _080500C8
b _0805011E
.align 2, 0
_08050034: .4byte gUnknown_2031DA4
_08050038: .4byte gPlayerParty
_0805003C: .4byte gEnemyParty
_08050040:
mov r0, r8
movs r1, 0x41
bl GetMonData
lsls r0, 16
lsrs r5, r0, 16
mov r0, r8
movs r1, 0
bl GetMonData
adds r7, r0, 0
cmp r6, 0
bne _0805007C
lsls r0, r5, 3
ldr r1, _08050074 @ =gMonFrontPicTable
adds r0, r1
ldr r1, _08050078 @ =gMonSpritesGfxPtr
ldr r1, [r1]
ldr r1, [r1, 0x8]
adds r2, r5, 0
adds r3, r7, 0
bl HandleLoadSpecialPokePic
movs r4, 0
b _0805009A
.align 2, 0
_08050074: .4byte gMonFrontPicTable
_08050078: .4byte gMonSpritesGfxPtr
_0805007C:
lsls r0, r5, 3
ldr r1, _080500BC @ =gMonFrontPicTable
adds r0, r1
ldr r1, _080500C0 @ =gMonSpritesGfxPtr
ldr r2, [r1]
lsls r4, r6, 1
adds r1, r4, 0x1
lsls r1, 2
adds r2, 0x4
adds r2, r1
ldr r1, [r2]
adds r2, r5, 0
adds r3, r7, 0
bl HandleLoadSpecialPokePic_DontHandleDeoxys
_0805009A:
mov r0, r8
bl GetMonSpritePalStruct
bl LoadCompressedSpritePalette
ldr r0, _080500C4 @ =gUnknown_2031DAC
ldr r1, [r0]
adds r0, r1, 0
adds r0, 0xF0
adds r0, r4
strh r5, [r0]
lsls r0, r6, 2
adds r1, 0x68
adds r1, r0
str r7, [r1]
b _0805011E
.align 2, 0
_080500BC: .4byte gMonFrontPicTable
_080500C0: .4byte gMonSpritesGfxPtr
_080500C4: .4byte gUnknown_2031DAC
_080500C8:
mov r0, r8
bl GetMonSpritePalStruct
ldrh r0, [r0, 0x4]
adds r1, r4, 0
bl SetMultiuseSpriteTemplateToPokemon
ldr r0, _08050128 @ =gMultiuseSpriteTemplate
movs r1, 0x78
movs r2, 0x3C
movs r3, 0x6
bl CreateSprite
ldr r4, _0805012C @ =gUnknown_2031DAC
ldr r1, [r4]
adds r1, 0x8E
adds r1, r6
strb r0, [r1]
ldr r3, _08050130 @ =gSprites
ldr r0, [r4]
adds r0, 0x8E
adds r0, r6
ldrb r1, [r0]
lsls r0, r1, 4
adds r0, r1
lsls r0, 2
adds r0, r3
adds r0, 0x3E
ldrb r1, [r0]
movs r2, 0x4
orrs r1, r2
strb r1, [r0]
ldr r0, [r4]
adds r0, 0x8E
adds r0, r6
ldrb r1, [r0]
lsls r0, r1, 4
adds r0, r1
lsls r0, 2
adds r3, 0x1C
adds r0, r3
ldr r1, _08050134 @ =SpriteCallbackDummy
str r1, [r0]
_0805011E:
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_08050128: .4byte gMultiuseSpriteTemplate
_0805012C: .4byte gUnknown_2031DAC
_08050130: .4byte gSprites
_08050134: .4byte SpriteCallbackDummy
thumb_func_end sub_804FFE4
thumb_func_start sub_8050138
sub_8050138: @ 8050138
push {r4-r6,lr}
+1 -1
View File
@@ -809,7 +809,7 @@ gUnknown_826CF30:: @ 826CF30
gUnknown_826CF48:: @ 826CF48
spr_template 5556, 5555, gOamData_826CED0, gSpriteAnimTable_826CF24, NULL, gDummySpriteAffineAnimTable, sub_804FE00
gUnknown_826CF60:: @ 826CF60
gTradeGlow2PaletteAnimTable:: @ 826CF60
.2byte RGB(18, 24, 31)
.2byte RGB(18, 24, 31)
.2byte RGB(18, 24, 31)
-1
View File
@@ -23,7 +23,6 @@ void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, void* buf
void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void* buffer, s32 species);
void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality);
void HandleLoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality);
void HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality);
void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality);
+1
View File
@@ -16,5 +16,6 @@ u16 CalcCRC16(const u8 *data, u32 length);
u16 CalcCRC16WithTable(const u8 *data, u32 length);
u32 CalcByteArraySum(const u8* data, u32 length);
void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor);
void DoBgAffineSet(struct BgAffineDstData * dest, u32 texX, u32 texY, s16 srcX, s16 srcY, s16 sx, s16 sy, u16 alpha);
#endif // GUARD_UTIL_H
+168 -6
View File
@@ -22,6 +22,7 @@
#include "overworld.h"
#include "battle_anim.h"
#include "party_menu.h"
#include "util.h"
#include "daycare.h"
#include "event_data.h"
#include "battle_interface.h"
@@ -74,6 +75,52 @@ struct TradeResources
/*0x08F0*/ u16 tilemapBuffer[BG_SCREEN_SIZE / 2];
};
struct TradeResources2 {
/*0x00*/ struct Pokemon mon;
/*0x64*/ u32 timer;
/*0x68*/ u32 unk_68[2];
/*0x70*/ u8 filler_70[2];
/*0x72*/ u8 unk_72;
/*0x73*/ u8 unk_73;
/*0x74*/ u16 linkData[10];
/*0x88*/ u8 unk_88;
/*0x89*/ u8 unk_89;
/*0x8A*/ u16 unk_8A;
/*0x8C*/ u16 unk_8C;
/*0x8E*/ u8 pokePicSpriteIdxs[2];
/*0x90*/ u8 unk_90;
/*0x91*/ u8 unk_91;
/*0x92*/ u8 unk_92;
/*0x93*/ u8 unk_93;
/*0x94*/ u16 state;
/*0x96*/ u8 filler_96[0xD2 - 0x96];
/*0xD2*/ u8 unk_D2;
/*0xD3*/ u8 unk_D3;
/*0xD4*/ u16 unk_D4;
/*0xD6*/ u16 unk_D6;
/*0xD8*/ u16 unk_D8;
/*0xDA*/ u16 unk_DA;
/*0xDC*/ u16 unk_DC;
/*0xDE*/ u16 unk_DE;
/*0xE0*/ s16 bg1vofs;
/*0xE2*/ s16 bg1hofs;
/*0xE4*/ s16 bg2vofs;
/*0xE6*/ s16 bg2hofs;
/*0xE8*/ u16 unk_E8;
/*0xEA*/ u16 unk_EA;
/*0xEC*/ u16 unk_EC;
/*0xEE*/ bool8 isLinkTrade;
/*0xF0*/ u16 tradeSpecies[2];
/*0xF4*/ u16 cachedMapMusic;
/*0xF6*/ u8 unk_F6[3];
/*0xF9*/ u8 filler_F9;
/*0xFA*/ u8 unk_FA;
/*0xFB*/ u8 unk_FB;
/*0xFC*/ u8 unk_FC;
/*0xFD*/ u8 unk_FD;
/*0xFE*/ u8 unk_FE;
};
IWRAM_DATA vu16 gUnknown_3000E78;
EWRAM_DATA u8 *gUnknown_2031C90 = NULL;
@@ -81,7 +128,7 @@ EWRAM_DATA u8 *gUnknown_2031C94[14] = {};
EWRAM_DATA u8 gUnknown_2031CCC[216] = {};
EWRAM_DATA u8 gUnknown_2031DA4[2] = {0};
EWRAM_DATA struct TradeResources * gUnknown_2031DA8 = NULL;
EWRAM_DATA void * gUnknown_2031DAC = NULL;
EWRAM_DATA struct TradeResources2 * gUnknown_2031DAC = NULL;
void sub_804C728(void);
void sub_804D4F8(void);
@@ -137,7 +184,7 @@ extern const u8 *const gUnknown_8261EF4[];
extern const struct SpritePalette gUnknown_8261D00;
extern const struct SpritePalette gUnknown_8261C60;
extern const struct SpriteSheet gUnknown_8261C58;
extern const u16 gUnknown_826CF60[];
extern const u16 gTradeGlow2PaletteAnimTable[];
void sub_804C600(void)
{
@@ -3959,7 +4006,7 @@ int sub_804FCE0(struct UnkLinkRfuStruct_02022B14Substruct a0, u16 species, u16 a
return 0;
}
// Sprite callback for link cable transfer glow
// Sprite callback for link cable trade glow
void sub_804FD24(struct Sprite * sprite)
{
sprite->data[0]++;
@@ -3970,7 +4017,7 @@ void sub_804FD24(struct Sprite * sprite)
}
}
// Sprite callback for wireless transfer glow
// Sprite callback for wireless trade glow
void sub_804FD48(struct Sprite * sprite)
{
if (!sprite->invisible)
@@ -3984,7 +4031,7 @@ void sub_804FD48(struct Sprite * sprite)
}
}
// Palette flash for transfer glow core
// Palette flash for trade glow core
void sub_804FD78(struct Sprite * sprite)
{
if (sprite->data[1] == 0)
@@ -3992,7 +4039,7 @@ void sub_804FD78(struct Sprite * sprite)
sprite->data[0]++;
if (sprite->data[0] == 12)
sprite->data[0] = 0;
LoadPalette(&gUnknown_826CF60[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2);
LoadPalette(&gTradeGlow2PaletteAnimTable[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2);
}
}
@@ -4021,3 +4068,118 @@ void sub_804FE00(struct Sprite * sprite)
sprite->data[0] = 0;
}
}
void sub_804FE24(void)
{
struct BgAffineDstData affine;
DoBgAffineSet(&affine, gUnknown_2031DAC->unk_D4 * 0x100, gUnknown_2031DAC->unk_D6 * 0x100, gUnknown_2031DAC->unk_DC, gUnknown_2031DAC->unk_DE, gUnknown_2031DAC->unk_E8, gUnknown_2031DAC->unk_E8, gUnknown_2031DAC->unk_EC);
SetGpuReg(REG_OFFSET_BG2PA, affine.pa);
SetGpuReg(REG_OFFSET_BG2PB, affine.pb);
SetGpuReg(REG_OFFSET_BG2PC, affine.pc);
SetGpuReg(REG_OFFSET_BG2PD, affine.pd);
SetGpuReg(REG_OFFSET_BG2X, affine.dx);
SetGpuReg(REG_OFFSET_BG2Y, affine.dy);
}
void sub_804FEB4(void)
{
u16 dispcnt;
SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_2031DAC->bg1vofs);
SetGpuReg(REG_OFFSET_BG1HOFS, gUnknown_2031DAC->bg1hofs);
dispcnt = GetGpuReg(REG_OFFSET_DISPCNT);
if ((dispcnt & 7) == DISPCNT_MODE_0)
{
SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_2031DAC->bg2vofs);
SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_2031DAC->bg2hofs);
}
else
{
sub_804FE24();
}
}
void sub_804FF0C(void)
{
sub_804FEB4();
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
void sub_804FF24(void)
{
gUnknown_2031DAC->unk_8A = 0;
gUnknown_2031DAC->unk_88 = 0;
gUnknown_2031DAC->unk_89 = 0;
}
void sub_804FF4C(void)
{
if (gUnknown_2031DAC->unk_88 == gUnknown_2031DAC->unk_89)
gUnknown_2031DAC->unk_8A++;
else
gUnknown_2031DAC->unk_8A = 0;
if (gUnknown_2031DAC->unk_8A > 300)
{
CloseLink();
SetMainCallback2(CB2_LinkError);
gUnknown_2031DAC->unk_8A = 0;
gUnknown_2031DAC->unk_89 = 0;
gUnknown_2031DAC->unk_88 = 0;
}
gUnknown_2031DAC->unk_89 = gUnknown_2031DAC->unk_88;
}
u32 sub_804FFC4(void)
{
if (gReceivedRemoteLinkPlayers)
return GetMultiplayerId();
return 0;
}
void sub_804FFE4(u8 whichParty, u8 a1)
{
int pos = 0;
struct Pokemon *mon = NULL;
u16 species;
u32 personality;
if (whichParty == 0)
{
mon = &gPlayerParty[gUnknown_2031DA4[0]];
pos = 1;
}
if (whichParty == 1)
{
mon = &gEnemyParty[gUnknown_2031DA4[1] % PARTY_SIZE];
pos = 3;
}
switch (a1)
{
case 0:
species = GetMonData(mon, MON_DATA_SPECIES2);
personality = GetMonData(mon, MON_DATA_PERSONALITY);
if (whichParty == 0)
HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
else
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[whichParty * 2 + 1], species, personality);
LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));
gUnknown_2031DAC->tradeSpecies[whichParty] = species;
gUnknown_2031DAC->unk_68[whichParty] = personality;
break;
case 1:
SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos);
gUnknown_2031DAC->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6);
gSprites[gUnknown_2031DAC->pokePicSpriteIdxs[whichParty]].invisible = TRUE;
gSprites[gUnknown_2031DAC->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy;
break;
}
}