summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/water.c23
-rw-r--r--src/battle_controller_opponent.c240
-rw-r--r--src/battle_interface.c78
-rw-r--r--src/battle_script_commands.c437
-rw-r--r--src/contest.c1
-rw-r--r--src/pokedex.c24
-rw-r--r--src/pokemon_storage_system_4.c8
-rw-r--r--src/record_mixing.c607
8 files changed, 294 insertions, 1124 deletions
diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c
index b7074bceb..98e50f17f 100644
--- a/src/battle/anim/water.c
+++ b/src/battle/anim/water.c
@@ -6,6 +6,8 @@
#include "sprite.h"
#include "trig.h"
#include "util.h"
+#include "scanline_effect.h"
+#include "palette.h"
#include "constants/battle_anim.h"
extern u8 gAnimVisualTaskCount;
@@ -23,6 +25,7 @@ void sub_8078F40(u8);
void sub_8079A64(u8);
void sub_80D37FC(struct Sprite *sprite);
void sub_80D3838(struct Sprite *sprite);
+void sub_80D3D68(u8 taskId);
void sub_80D4044(struct Sprite *sprite);
void sub_80D40A8(struct Sprite *);
void sub_80D4150(u8);
@@ -579,7 +582,7 @@ _080D3B5C: .4byte sub_80D3B60\n\
#ifdef NONMATCHING
void sub_80D3B60(u8 taskId)
{
- struct UnknownAnimStruct2 unk;
+ struct Struct_sub_8078914 unk;
u8 i;
u16 rgbBuffer;
u16 *BGptrX = &gBattle_BG1_X;
@@ -590,18 +593,18 @@ void sub_80D3B60(u8 taskId)
*BGptrX += gTasks[taskId].data[0];
*BGptrY += gTasks[taskId].data[1];
- sub_80A6B30(&unk);
+ sub_8078914(&unk);
gTasks[taskId].data[2] += gTasks[taskId].data[1];
if (++gTasks[taskId].data[5] == 4)
{
- rgbBuffer = gPlttBufferFaded[unk.unk8 * 16 + 7];
+ rgbBuffer = gPlttBufferFaded[unk.field_8 * 16 + 7];
for (i = 6; i != 0; i--)
{
- palNum = unk.unk8 * 16;
+ palNum = unk.field_8 * 16;
palOffset = 1 + i;
gPlttBufferFaded[palNum + palOffset] = gPlttBufferFaded[palNum + palOffset - 1];
}
- gPlttBufferFaded[unk.unk8 * 16 + 1] = rgbBuffer;
+ gPlttBufferFaded[unk.field_8 * 16 + 1] = rgbBuffer;
gTasks[taskId].data[5] = 0;
}
if (++gTasks[taskId].data[6] > 1)
@@ -622,7 +625,7 @@ void sub_80D3B60(u8 taskId)
if (!(gTasks[gTasks[taskId].data[15]].data[1] & 0x1F))
{
gTasks[taskId].data[0] = gTasks[gTasks[taskId].data[15]].data[1] & 0x1F;
- gTasks[taskId].func = sub_8107CC4;
+ gTasks[taskId].func = sub_80D3D68;
}
}
#else
@@ -1895,14 +1898,14 @@ void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff)
s16 something = sprite->data[0] / 2;
s16 combinedX = sprite->pos1.x + sprite->pos2.x;
s16 combinedY = sprite->pos1.y + sprite->pos2.y;
- s16 randomSomethingY = yDiff + (Random2() % 10) - 5;
- s16 randomSomethingX = -xDiff + (Random2() % 10) - 5;
+ s16 randomSomethingY = yDiff + (Random() % 10) - 5;
+ s16 randomSomethingX = -xDiff + (Random() % 10) - 5;
s16 i;
u8 spriteId;
for (i = 0; i <= 0; i++)
{
- spriteId = CreateSprite(&gUnknown_08595310, combinedX, combinedY + something, 130);
+ spriteId = CreateSprite(&gSpriteTemplate_83D9420, combinedX, combinedY + something, 130);
gSprites[spriteId].data[0] = 20;
gSprites[spriteId].data[1] = randomSomethingY;
gSprites[spriteId].subpriority = GetBattlerSubpriority(gBattleAnimAttacker) - 1;
@@ -1913,7 +1916,7 @@ void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff)
}
for (i = 0; i <= 0; i++)
{
- spriteId = CreateSprite(&gUnknown_08595310, combinedX, combinedY - something, 130);
+ spriteId = CreateSprite(&gSpriteTemplate_83D9420, combinedX, combinedY - something, 130);
gSprites[spriteId].data[0] = 20;
gSprites[spriteId].data[1] = randomSomethingY;
gSprites[spriteId].subpriority = GetBattlerSubpriority(gBattleAnimAttacker) - 1;
diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c
index 2cc42ca2a..2faaf5fea 100644
--- a/src/battle_controller_opponent.c
+++ b/src/battle_controller_opponent.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "battle.h"
+#include "battle_ai_script_commands.h"
#include "battle_ai_switch_items.h"
#include "battle_anim.h"
#include "battle_interface.h"
@@ -13,6 +14,7 @@
#include "palette.h"
#include "pokeball.h"
#include "pokemon.h"
+#include "random.h"
#include "rom3.h"
#include "rom_8077ABC.h"
#include "sound.h"
@@ -1435,6 +1437,11 @@ void OpponentHandlecmd19(void)
OpponentBufferExecCompleted();
}
+struct ChooseMoveStruct
+{
+ u16 moves[4];
+};
+
#if DEBUG
NAKED
void OpponentHandlecmd20(void)
@@ -1744,249 +1751,58 @@ void OpponentHandlecmd20(void)
bx r0");
}
#else
-#ifdef NONMATCHING
void OpponentHandlecmd20(void)
{
- u16 r4;
- // Needed to match closer
- struct {u16 moves[4];} *r5 = (void *)&gBattleBufferA[gActiveBattler][4];
+ u8 chosenMoveId;
+ struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBattler][4];
- if (gBattleTypeFlags & 0x498)
+ if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER))
{
BattleAI_SetupAIData();
- r4 = BattleAI_GetAIActionToUse();
- switch (r4)
+ chosenMoveId = BattleAI_GetAIActionToUse();
+
+ switch (chosenMoveId)
{
- case 5:
- BtlController_EmitTwoReturnValues(1, 4, 0);
+ case 5: // AI_CHOICE_WATCH
+ BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_WATCH_CAREFULLY, 0);
break;
- case 4:
- BtlController_EmitTwoReturnValues(1, 3, 0);
+ case 4: // AI_CHOICE_FLEE
+ BtlController_EmitTwoReturnValues(1, B_ACTION_RUN, 0);
break;
default:
- if (gBattleMoves[r5->moves[r4]].target & 0x12)
+ if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
gBattlerTarget = gActiveBattler;
- if (gBattleMoves[r5->moves[r4]].target & 8)
+ if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & 8)
{
gBattlerTarget = GetBattlerAtPosition(0);
if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
gBattlerTarget = GetBattlerAtPosition(2);
}
- r4 |= gBattlerTarget << 8;
- BtlController_EmitTwoReturnValues(1, 10, r4);
+ BtlController_EmitTwoReturnValues(1, B_ACTION_EXEC_SCRIPT, chosenMoveId | (gBattlerTarget << 8));
break;
}
OpponentBufferExecCompleted();
}
else
{
- u16 r2;
+ u16 move;
do
{
// Can't for the life of me get this to match.
- r4 = Random() % 4;
- r2 = r5->moves[r4];
- } while (r2 == 0);
+ chosenMoveId = Random() & 3;
+ move = moveInfo->moves[chosenMoveId];
+ } while (move == 0);
- if (gBattleMoves[r2].target & 0x12)
- {
- r4 |= gActiveBattler << 8;
- BtlController_EmitTwoReturnValues(1, 10, r4);
- }
+ if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
+ BtlController_EmitTwoReturnValues(1, B_ACTION_EXEC_SCRIPT, chosenMoveId | (gActiveBattler << 8));
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- {
- u16 r2 = GetBattlerAtPosition(Random() & 2) << 8;
-
- BtlController_EmitTwoReturnValues(1, 10, r4 | r2);
- }
+ BtlController_EmitTwoReturnValues(1, B_ACTION_EXEC_SCRIPT, chosenMoveId | (GetBattlerAtPosition(Random() & 2) << 8));
else
- {
- u16 r2 = GetBattlerAtPosition(0) << 8;
-
- BtlController_EmitTwoReturnValues(1, 10, r4 | r2);
- }
+ BtlController_EmitTwoReturnValues(1, B_ACTION_EXEC_SCRIPT, chosenMoveId | (GetBattlerAtPosition(0) << 8));
OpponentBufferExecCompleted();
}
}
-#else
-NAKED
-void OpponentHandlecmd20(void)
-{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- ldr r6, _0803545C @ =gActiveBattler\n\
- ldrb r0, [r6]\n\
- lsls r0, 9\n\
- ldr r1, _08035460 @ =gBattleBufferA+4\n\
- adds r5, r0, r1\n\
- ldr r0, _08035464 @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- movs r0, 0x93\n\
- lsls r0, 3\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _080354F8\n\
- bl BattleAI_SetupAIData\n\
- bl BattleAI_GetAIActionToUse\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- cmp r4, 0x4\n\
- beq _08035468\n\
- cmp r4, 0x5\n\
- bne _08035474\n\
- movs r0, 0x1\n\
- movs r1, 0x4\n\
- b _0803546C\n\
- .align 2, 0\n\
-_0803545C: .4byte gActiveBattler\n\
-_08035460: .4byte gBattleBufferA+4\n\
-_08035464: .4byte gBattleTypeFlags\n\
-_08035468:\n\
- movs r0, 0x1\n\
- movs r1, 0x3\n\
-_0803546C:\n\
- movs r2, 0\n\
- bl BtlController_EmitTwoReturnValues\n\
- b _080354E0\n\
-_08035474:\n\
- ldr r3, _080354E8 @ =gBattleMoves\n\
- lsls r0, r4, 1\n\
- adds r2, r5, r0\n\
- ldrh r1, [r2]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r3\n\
- ldrb r1, [r0, 0x6]\n\
- movs r0, 0x12\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08035494\n\
- ldr r1, _080354EC @ =gBattlerTarget\n\
- ldrb r0, [r6]\n\
- strb r0, [r1]\n\
-_08035494:\n\
- ldrh r1, [r2]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r3\n\
- ldrb r1, [r0, 0x6]\n\
- movs r0, 0x8\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _080354CE\n\
- movs r0, 0\n\
- bl GetBattlerAtPosition\n\
- ldr r5, _080354EC @ =gBattlerTarget\n\
- strb r0, [r5]\n\
- ldr r0, _080354F0 @ =gAbsentBattlerFlags\n\
- ldrb r1, [r0]\n\
- ldr r2, _080354F4 @ =gBitTable\n\
- ldrb r0, [r5]\n\
- lsls r0, 2\n\
- adds r0, r2\n\
- ldr r0, [r0]\n\
- ands r1, r0\n\
- cmp r1, 0\n\
- beq _080354CE\n\
- movs r0, 0x2\n\
- bl GetBattlerAtPosition\n\
- strb r0, [r5]\n\
-_080354CE:\n\
- ldr r0, _080354EC @ =gBattlerTarget\n\
- ldrb r0, [r0]\n\
- lsls r0, 8\n\
- orrs r4, r0\n\
- movs r0, 0x1\n\
- movs r1, 0xA\n\
- adds r2, r4, 0\n\
- bl BtlController_EmitTwoReturnValues\n\
-_080354E0:\n\
- bl OpponentBufferExecCompleted\n\
- b _0803558A\n\
- .align 2, 0\n\
-_080354E8: .4byte gBattleMoves\n\
-_080354EC: .4byte gBattlerTarget\n\
-_080354F0: .4byte gAbsentBattlerFlags\n\
-_080354F4: .4byte gBitTable\n\
-_080354F8:\n\
- movs r6, 0x3\n\
-_080354FA:\n\
- bl Random\n\
- adds r4, r0, 0\n\
- ands r4, r6\n\
- lsls r0, r4, 1\n\
- adds r0, r5, r0\n\
- ldrh r2, [r0]\n\
- cmp r2, 0\n\
- beq _080354FA\n\
- ldr r1, _08035534 @ =gBattleMoves\n\
- lsls r0, r2, 1\n\
- adds r0, r2\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r1, [r0, 0x6]\n\
- movs r0, 0x12\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803553C\n\
- ldr r0, _08035538 @ =gActiveBattler\n\
- ldrb r0, [r0]\n\
- lsls r0, 8\n\
- orrs r4, r0\n\
- movs r0, 0x1\n\
- movs r1, 0xA\n\
- adds r2, r4, 0\n\
- bl BtlController_EmitTwoReturnValues\n\
- b _08035586\n\
- .align 2, 0\n\
-_08035534: .4byte gBattleMoves\n\
-_08035538: .4byte gActiveBattler\n\
-_0803553C:\n\
- ldr r0, _0803556C @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08035570\n\
- bl Random\n\
- movs r1, 0x2\n\
- ands r1, r0\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- adds r0, r1, 0\n\
- bl GetBattlerAtPosition\n\
- adds r2, r0, 0\n\
- lsls r2, 24\n\
- lsrs r2, 16\n\
- orrs r2, r4\n\
- movs r0, 0x1\n\
- movs r1, 0xA\n\
- bl BtlController_EmitTwoReturnValues\n\
- b _08035586\n\
- .align 2, 0\n\
-_0803556C: .4byte gBattleTypeFlags\n\
-_08035570:\n\
- movs r0, 0\n\
- bl GetBattlerAtPosition\n\
- adds r2, r0, 0\n\
- lsls r2, 24\n\
- lsrs r2, 16\n\
- orrs r2, r4\n\
- movs r0, 0x1\n\
- movs r1, 0xA\n\
- bl BtlController_EmitTwoReturnValues\n\
-_08035586:\n\
- bl OpponentBufferExecCompleted\n\
-_0803558A:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided\n");
-}
-#endif
#endif
void OpponentHandleOpenBag(void)
diff --git a/src/battle_interface.c b/src/battle_interface.c
index 851c91dfd..992fcd7ae 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -15,6 +15,7 @@
#include "text.h"
#include "ewram.h"
#include "graphics.h"
+#include "pokemon_summary_screen.h"
struct UnknownStruct5
{
@@ -249,7 +250,7 @@ const struct SpritePalette gUnknown_0820A774[] =
{ gUnknown_08D1214C, 0xd713 },
};
-const struct CompressedSpriteSheet gUnknown_0820A784[] =
+const struct SpriteSheet gUnknown_0820A784[] =
{
{ Tiles_D129AC, 0x80, 0xd714 },
{ Tiles_D129AC, 0x80, 0xd715 },
@@ -269,48 +270,45 @@ const struct OamData gOamData_820A79C =
.priority = 1,
};
-const struct SpriteTemplate gSpriteTemplate_820A7A4 =
+const struct SpriteTemplate gSpriteTemplate_820A7A4[] =
{
- .tileTag = 55052,
- .paletteTag = 55056,
- .oam = &gOamData_820A4E4,
- .anims = gDummySpriteAnimTable,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8045030,
-};
-
-const struct SpriteTemplate gSpriteTemplate_820A7BC =
-{
- .tileTag = 55053,
- .paletteTag = 55057,
- .oam = &gOamData_820A4E4,
- .anims = gDummySpriteAnimTable,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8045030,
-};
-
-const struct SpriteTemplate gSpriteTemplate_820A7D4 =
-{
- .tileTag = 55060,
- .paletteTag = 55058,
- .oam = &gOamData_820A79C,
- .anims = gDummySpriteAnimTable,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_804507C,
+ {
+ .tileTag = 55052,
+ .paletteTag = 55056,
+ .oam = &gOamData_820A4E4,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8045030,
+ }, {
+ .tileTag = 55053,
+ .paletteTag = 55057,
+ .oam = &gOamData_820A4E4,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8045030,
+ }
};
-const struct SpriteTemplate gSpriteTemplate_820A7EC =
-{
- .tileTag = 55061,
- .paletteTag = 55059,
- .oam = &gOamData_820A79C,
- .anims = gDummySpriteAnimTable,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_804507C,
+const struct SpriteTemplate gSpriteTemplate_820A7D4[] = {
+ {
+ .tileTag = 55060,
+ .paletteTag = 55058,
+ .oam = &gOamData_820A79C,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_804507C,
+ }, {
+ .tileTag = 55061,
+ .paletteTag = 55059,
+ .oam = &gOamData_820A79C,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_804507C,
+ }
};
u8 *const gUnknown_0820A804[2] =
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index 01d66b77c..577a8149a 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -22,6 +22,7 @@
#include "sound.h"
#include "task.h"
#include "decompress.h"
+#include "string_util.h"
#include "pokemon_summary_screen.h"
#include "naming_screen.h"
#include "ewram.h"
@@ -205,7 +206,6 @@ void HandleLowHpMusicChange(struct Pokemon*, u8 bank);
bool8 IsTradedMon(struct Pokemon*);
void BattleScriptPop(void);
void SwitchInClearSetData(void);
-u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8);
u8 GetSetPokedexFlag(u16 nationalNum, u8 caseID);
u16 SpeciesToNationalPokedexNum(u16 species);
u8 sub_803FC34(u8 bank);
@@ -2356,7 +2356,7 @@ u8 BankGetTurnOrder(u8 bank)
return i;
}
-//Someone please decompile this monstrosity below...
+//TODO Someone please decompile this monstrosity below...
#ifdef NONMATCHING
void SetMoveEffect(bool8 primary, u8 certainArg)
{
@@ -2746,7 +2746,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg)
{gBattlescriptCurrInstr++; return;}
gLastUsedItem = gBattleMons[gBattlerTarget].item;
- USED_HELD_ITEM(bank) = gLastUsedItem;
+ *USED_HELD_ITEM(gBattlerTarget) = gLastUsedItem;
gBattleMons[gBattlerTarget].item = 0;
gActiveBattler = gBattlerAttacker;
@@ -2760,7 +2760,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg)
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_ItemSteal;
- CHOICED_MOVE(gBattlerTarget) = 0;
+ *CHOICED_MOVE(gBattlerTarget) = 0;
}
break;
case 32: //escape prevention
@@ -2835,7 +2835,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg)
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_KnockedOff;
- CHOICED_MOVE(gEffectBattler) = 0;
+ *CHOICED_MOVE(gEffectBattler) = 0;
}
break;
case 59: //overheat
@@ -5908,7 +5908,7 @@ _08020B46:\n\
_08020B50: .4byte gBattlescriptCurrInstr\n\
.syntax divided\n");
}
-#endif
+#endif // NONMATCHING
static void MoveValuesCleanUp(void)
{
@@ -6468,14 +6468,14 @@ static void atk48_playstatchangeanimation(void)
stat_animID = 0x38;
}
if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 2 && changeable_stats <= 1)
- || changeable_stats == 0 || gBattleStruct->filler2[0] != 0)
+ || changeable_stats == 0 || gBattleStruct->unk160DC != 0)
gBattlescriptCurrInstr += 4;
else
{
BtlController_EmitBattleAnimation(0, 1, stat_animID);
MarkBattlerForControllerExec(gActiveBattler);
if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 4) && changeable_stats > 1)
- gBattleStruct->filler2[0] = 1;
+ gBattleStruct->unk160DC = 1;
gBattlescriptCurrInstr += 4;
}
}
@@ -8769,21 +8769,21 @@ static void atk5D_getmoneyreward(void)
{
case 0:
{
- const struct PokeTrainerData1 *data = &gTrainers[gTrainerBattleOpponent].party->noItemNoMoves;
- r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl;
+ const struct TrainerMonNoItemDefaultMoves *data = gTrainers[gTrainerBattleOpponent].party.NoItemDefaultMoves;
+ r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].level;
}
break;
case 2:
{
- const struct PokeTrainerData2 *data = &gTrainers[gTrainerBattleOpponent].party->itemNoMoves;
- r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl;
+ const struct TrainerMonItemDefaultMoves *data = gTrainers[gTrainerBattleOpponent].party.ItemDefaultMoves;
+ r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].level;
}
break;
case 1:
case 3:
{
- const struct PokeTrainerData3 *data = &gTrainers[gTrainerBattleOpponent].party->itemMoves;
- r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].lvl;
+ const struct TrainerMonItemCustomMoves *data = gTrainers[gTrainerBattleOpponent].party.ItemCustomMoves;
+ r5 = data[gTrainers[gTrainerBattleOpponent].partySize - 1].level;
}
break;
}
@@ -8801,10 +8801,7 @@ static void atk5D_getmoneyreward(void)
gBattleTextBuff1[1] = 1;
gBattleTextBuff1[2] = 4;
gBattleTextBuff1[3] = 5;
- gBattleTextBuff1[4] = BYTE0(money_to_give);
- gBattleTextBuff1[5] = BYTE1(money_to_give);
- gBattleTextBuff1[6] = BYTE2(money_to_give);
- gBattleTextBuff1[7] = BYTE3(money_to_give);
+ T2_WRITE_32(&gBattleTextBuff1[4], money_to_give);
gBattleTextBuff1[8] = 0xFF;
gBattlescriptCurrInstr += 1;
@@ -9339,10 +9336,13 @@ static void atk6B_atknameinbuff1(void)
}
#ifdef NONMATCHING
+extern const u8 BattleText_Format2[];
+
+// TODO: finish
static void atk6C_drawlvlupbox(void)
{
- u8 r1 = 0;
- u8 r7 = 0;
+ UNUSED u8 r1 = 0;
+ UNUSED u8 r7 = 0;
switch (gBattleStruct->atk6C_statetracker)
{
case 0:
@@ -9762,7 +9762,7 @@ _08024C48: .4byte gBattlescriptCurrInstr\n\
.syntax divided");
}
-#endif
+#endif // NONMATCHING
static void atk6D_resetsentmonsvalue(void)
{
@@ -13364,338 +13364,81 @@ static void atkD1_trysethelpinghand(void)
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
-#ifdef NONMATCHING
static void atkD2_tryswapitems(void)
{
- if ((GetBattlerSide(gBattlerAttacker) != 1 || gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER) || gTrainerBattleOpponent == SECRET_BASE_OPPONENT))
- {
- u8 side = GetBattlerSide(gBattlerAttacker);
- if (gBattleTypeFlags)
+ // opponent can't swap items with player in regular battles
+ if ((GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT
+ && !(gBattleTypeFlags & (BATTLE_TYPE_LINK
+ | BATTLE_TYPE_EREADER_TRAINER
+ | BATTLE_TYPE_BATTLE_TOWER))
+ && gTrainerBattleOpponent != SECRET_BASE_OPPONENT)) {
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
+ else {
+ u8 sideAttacker = GetBattlerSide(gBattlerAttacker);
- gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
-}
+ // you can't swap items if they were knocked off in regular battles
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK
+ | BATTLE_TYPE_EREADER_TRAINER
+ | BATTLE_TYPE_BATTLE_TOWER))
+ && gTrainerBattleOpponent != SECRET_BASE_OPPONENT
+ && (gWishFutureKnock.knockedOffPokes[sideAttacker] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]]
+ )) {
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
+ }
+ // can't swap if two pokemon don't have an item
+ // or if either of them is an enigma berry or a mail
+ else if ((gBattleMons[gBattlerAttacker].item == 0 && gBattleMons[gBattlerTarget].item == 0)
+ || gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY
+ || gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY
+ || IS_ITEM_MAIL(gBattleMons[gBattlerAttacker].item)
+ || IS_ITEM_MAIL(gBattleMons[gBattlerTarget].item)) {
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
+ }
+ // check if ability prevents swapping
+ else if (gBattleMons[gBattlerTarget].ability == ABILITY_STICKY_HOLD) {
+ gBattlescriptCurrInstr = BattleScript_NoItemSteal;
+ gLastUsedAbility = gBattleMons[gBattlerTarget].ability;
+ RecordAbilityBattle(gBattlerTarget, gLastUsedAbility);
+ }
+ // took a while, but all checks passed and items can be safely swapped
+ else {
+ u16 oldItemAtk, *newItemAtk;
-#else
-NAKED
-static void atkD2_tryswapitems(void)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x4\n\
- ldr r0, _0802A30C @ =gBattlerAttacker\n\
- ldrb r0, [r0]\n\
- bl GetBattlerSide\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x1\n\
- bne _0802A24C\n\
- ldr r0, _0802A310 @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- ldr r0, _0802A314 @ =0x00000902\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0802A24C\n\
- ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\
- ldrh r1, [r0]\n\
- movs r0, 0x80\n\
- lsls r0, 3\n\
- cmp r1, r0\n\
- bne _0802A2EE\n\
-_0802A24C:\n\
- ldr r4, _0802A30C @ =gBattlerAttacker\n\
- ldrb r0, [r4]\n\
- bl GetBattlerSide\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
- ldr r0, _0802A310 @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- ldr r0, _0802A314 @ =0x00000902\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0802A290\n\
- ldr r0, _0802A318 @ =gTrainerBattleOpponent\n\
- ldrh r1, [r0]\n\
- movs r0, 0x80\n\
- lsls r0, 3\n\
- cmp r1, r0\n\
- beq _0802A290\n\
- ldr r0, _0802A31C @ =gWishFutureKnock\n\
- adds r0, 0x29\n\
- adds r0, r2, r0\n\
- ldrb r1, [r0]\n\
- ldr r3, _0802A320 @ =gBitTable\n\
- ldr r2, _0802A324 @ =gBattlerPartyIndexes\n\
- ldrb r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r2\n\
- ldrh r0, [r0]\n\
- lsls r0, 2\n\
- adds r0, r3\n\
- ldr r0, [r0]\n\
- ands r1, r0\n\
- cmp r1, 0\n\
- bne _0802A2EE\n\
-_0802A290:\n\
- ldr r0, _0802A328 @ =gBattleMons\n\
- mov r9, r0\n\
- ldr r1, _0802A30C @ =gBattlerAttacker\n\
- ldrb r4, [r1]\n\
- movs r2, 0x58\n\
- mov r8, r2\n\
- mov r0, r8\n\
- muls r0, r4\n\
- mov r3, r9\n\
- adds r5, r0, r3\n\
- ldrh r3, [r5, 0x2E]\n\
- adds r1, r3, 0\n\
- cmp r1, 0\n\
- bne _0802A2BE\n\
- ldr r0, _0802A32C @ =gBattlerTarget\n\
- ldrb r0, [r0]\n\
- mov r2, r8\n\
- muls r2, r0\n\
- adds r0, r2, 0\n\
- add r0, r9\n\
- ldrh r0, [r0, 0x2E]\n\
- cmp r0, 0\n\
- beq _0802A2EE\n\
-_0802A2BE:\n\
- cmp r1, 0xAF\n\
- beq _0802A2EE\n\
- ldr r7, _0802A32C @ =gBattlerTarget\n\
- ldrb r0, [r7]\n\
- mov r1, r8\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- mov r1, r9\n\
- adds r2, r0, r1\n\
- ldrh r1, [r2, 0x2E]\n\
- cmp r1, 0xAF\n\
- beq _0802A2EE\n\
- adds r0, r3, 0\n\
- subs r0, 0x79\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r0, 0xB\n\
- bls _0802A2EE\n\
- adds r0, r1, 0\n\
- subs r0, 0x79\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r0, 0xB\n\
- bhi _0802A334\n\
-_0802A2EE:\n\
- ldr r3, _0802A330 @ =gBattlescriptCurrInstr\n\
- ldr r2, [r3]\n\
- ldrb r1, [r2, 0x1]\n\
- ldrb r0, [r2, 0x2]\n\
- lsls r0, 8\n\
- orrs r1, r0\n\
- ldrb r0, [r2, 0x3]\n\
- lsls r0, 16\n\
- orrs r1, r0\n\
- ldrb r0, [r2, 0x4]\n\
- lsls r0, 24\n\
- orrs r1, r0\n\
- str r1, [r3]\n\
- b _0802A49A\n\
- .align 2, 0\n\
-_0802A30C: .4byte gBattlerAttacker\n\
-_0802A310: .4byte gBattleTypeFlags\n\
-_0802A314: .4byte 0x00000902\n\
-_0802A318: .4byte gTrainerBattleOpponent\n\
-_0802A31C: .4byte gWishFutureKnock\n\
-_0802A320: .4byte gBitTable\n\
-_0802A324: .4byte gBattlerPartyIndexes\n\
-_0802A328: .4byte gBattleMons\n\
-_0802A32C: .4byte gBattlerTarget\n\
-_0802A330: .4byte gBattlescriptCurrInstr\n\
-_0802A334:\n\
- adds r0, r2, 0\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x3C\n\
- bne _0802A36C\n\
- ldr r1, _0802A360 @ =gBattlescriptCurrInstr\n\
- ldr r0, _0802A364 @ =BattleScript_NoItemSteal\n\
- str r0, [r1]\n\
- ldr r1, _0802A368 @ =gLastUsedAbility\n\
- ldrb r0, [r7]\n\
- mov r2, r8\n\
- muls r2, r0\n\
- adds r0, r2, 0\n\
- add r0, r9\n\
- adds r0, 0x20\n\
- ldrb r0, [r0]\n\
- strb r0, [r1]\n\
- ldrb r0, [r7]\n\
- ldrb r1, [r1]\n\
- bl RecordAbilityBattle\n\
- b _0802A49A\n\
- .align 2, 0\n\
-_0802A360: .4byte gBattlescriptCurrInstr\n\
-_0802A364: .4byte BattleScript_NoItemSteal\n\
-_0802A368: .4byte gLastUsedAbility\n\
-_0802A36C:\n\
- lsls r0, r4, 1\n\
- ldr r4, _0802A458 @ =gSharedMem + 0x160F0\n\
- adds r6, r0, r4\n\
- ldrh r5, [r5, 0x2E]\n\
- mov r10, r5\n\
- strh r1, [r6]\n\
- ldr r3, _0802A45C @ =gBattlerAttacker\n\
- ldrb r0, [r3]\n\
- mov r1, r8\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- add r0, r9\n\
- movs r1, 0\n\
- strh r1, [r0, 0x2E]\n\
- ldrb r0, [r7]\n\
- mov r2, r8\n\
- muls r2, r0\n\
- adds r0, r2, 0\n\
- add r0, r9\n\
- mov r3, r10\n\
- strh r3, [r0, 0x2E]\n\
- ldr r5, _0802A460 @ =gActiveBattler\n\
- ldr r1, _0802A45C @ =gBattlerAttacker\n\
- ldrb r0, [r1]\n\
- strb r0, [r5]\n\
- str r6, [sp]\n\
- movs r0, 0\n\
- movs r1, 0x2\n\
- movs r2, 0\n\
- movs r3, 0x2\n\
- bl BtlController_EmitSetMonData\n\
- ldr r2, _0802A45C @ =gBattlerAttacker\n\
- ldrb r0, [r2]\n\
- bl MarkBattlerForControllerExec\n\
- ldrb r0, [r7]\n\
- strb r0, [r5]\n\
- ldrb r0, [r7]\n\
- mov r3, r8\n\
- muls r3, r0\n\
- adds r0, r3, 0\n\
- mov r1, r9\n\
- adds r1, 0x2E\n\
- adds r0, r1\n\
- str r0, [sp]\n\
- movs r0, 0\n\
- movs r1, 0x2\n\
- movs r2, 0\n\
- movs r3, 0x2\n\
- bl BtlController_EmitSetMonData\n\
- ldrb r0, [r7]\n\
- bl MarkBattlerForControllerExec\n\
- ldr r0, _0802A464 @ =0xfffe9f10\n\
- adds r4, r0\n\
- ldrb r0, [r7]\n\
- lsls r0, 1\n\
- ldr r2, _0802A468 @ =0x000160e8\n\
- adds r0, r2\n\
- adds r0, r4\n\
- movs r1, 0\n\
- strb r1, [r0]\n\
- ldrb r0, [r7]\n\
- lsls r0, 1\n\
- ldr r1, _0802A46C @ =0x000160e9\n\
- adds r0, r1\n\
- adds r0, r4\n\
- movs r3, 0\n\
- strb r3, [r0]\n\
- ldr r3, _0802A45C @ =gBattlerAttacker\n\
- ldrb r0, [r3]\n\
- lsls r0, 1\n\
- adds r0, r2\n\
- adds r0, r4\n\
- movs r2, 0\n\
- strb r2, [r0]\n\
- ldrb r0, [r3]\n\
- lsls r0, 1\n\
- adds r0, r1\n\
- adds r0, r4\n\
- strb r2, [r0]\n\
- ldr r1, _0802A470 @ =gBattlescriptCurrInstr\n\
- ldr r0, [r1]\n\
- adds r0, 0x5\n\
- str r0, [r1]\n\
- ldr r1, _0802A474 @ =gBattleTextBuff1\n\
- movs r3, 0xFD\n\
- strb r3, [r1]\n\
- movs r2, 0xA\n\
- strb r2, [r1, 0x1]\n\
- ldrh r0, [r6]\n\
- strb r0, [r1, 0x2]\n\
- ldrh r0, [r6]\n\
- lsrs r0, 8\n\
- strb r0, [r1, 0x3]\n\
- movs r0, 0xFF\n\
- strb r0, [r1, 0x4]\n\
- ldr r1, _0802A478 @ =gBattleTextBuff2\n\
- strb r3, [r1]\n\
- strb r2, [r1, 0x1]\n\
- mov r3, r10\n\
- strb r3, [r1, 0x2]\n\
- mov r2, r10\n\
- lsrs r0, r2, 8\n\
- strb r0, [r1, 0x3]\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- strb r0, [r1, 0x4]\n\
- cmp r2, 0\n\
- beq _0802A480\n\
- ldrh r0, [r6]\n\
- cmp r0, 0\n\
- beq _0802A494\n\
- ldr r1, _0802A47C @ =gBattleCommunication\n\
- movs r0, 0x2\n\
- b _0802A498\n\
- .align 2, 0\n\
-_0802A458: .4byte gSharedMem + 0x160F0\n\
-_0802A45C: .4byte gBattlerAttacker\n\
-_0802A460: .4byte gActiveBattler\n\
-_0802A464: .4byte 0xfffe9f10\n\
-_0802A468: .4byte 0x000160e8\n\
-_0802A46C: .4byte 0x000160e9\n\
-_0802A470: .4byte gBattlescriptCurrInstr\n\
-_0802A474: .4byte gBattleTextBuff1\n\
-_0802A478: .4byte gBattleTextBuff2\n\
-_0802A47C: .4byte gBattleCommunication\n\
-_0802A480:\n\
- ldrh r0, [r6]\n\
- cmp r0, 0\n\
- beq _0802A494\n\
- ldr r0, _0802A490 @ =gBattleCommunication\n\
- movs r3, 0\n\
- strb r3, [r0, 0x5]\n\
- b _0802A49A\n\
- .align 2, 0\n\
-_0802A490: .4byte gBattleCommunication\n\
-_0802A494:\n\
- ldr r1, _0802A4AC @ =gBattleCommunication\n\
- movs r0, 0x1\n\
-_0802A498:\n\
- strb r0, [r1, 0x5]\n\
-_0802A49A:\n\
- add sp, 0x4\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_0802A4AC: .4byte gBattleCommunication\n\
- .syntax divided");
+ newItemAtk = (u16 *)(ewram160F0 + 2 * gBattlerAttacker);
+ oldItemAtk = gBattleMons[gBattlerAttacker].item;
+ *newItemAtk = gBattleMons[gBattlerTarget].item;
+
+ gBattleMons[gBattlerAttacker].item = 0;
+ gBattleMons[gBattlerTarget].item = oldItemAtk;
+
+ gActiveBattler = gBattlerAttacker;
+ BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, newItemAtk);
+ MarkBattlerForControllerExec(gBattlerAttacker);
+
+ gActiveBattler = gBattlerTarget;
+ BtlController_EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBattlerTarget].item);
+ MarkBattlerForControllerExec(gBattlerTarget);
+
+ ewram160E8arr2(0, gBattlerTarget) = 0;
+ ewram160E8arr2(1, gBattlerTarget) = 0;
+ ewram160E8arr2(0, gBattlerAttacker) = 0;
+ ewram160E8arr2(1, gBattlerAttacker) = 0;
+
+ gBattlescriptCurrInstr += 5;
+
+ PREPARE_ITEM_BUFFER(gBattleTextBuff1, *newItemAtk)
+ PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk)
+
+ if (oldItemAtk != 0 && *newItemAtk != 0)
+ gBattleCommunication[MULTISTRING_CHOOSER] = 2; // attacker's item -> <- target's item
+ else if (oldItemAtk == 0 && *newItemAtk != 0)
+ gBattleCommunication[MULTISTRING_CHOOSER] = 0; // nothing -> <- target's item
+ else
+ gBattleCommunication[MULTISTRING_CHOOSER] = 1; // attacker's item -> <- nothing
+ }
+ }
}
-#endif // NONMATCHING
static void atkD3_trycopyability(void) //role play
{
diff --git a/src/contest.c b/src/contest.c
index b66a0ed93..54294fdfa 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -3758,6 +3758,7 @@ u8 unref_sub_80B06E0(u8 *a)
void sub_80B0748(u8 taskId)
{
u8 i;
+ u8 r4;
u8 r4_2;
u8 r1;
u8 r7;
diff --git a/src/pokedex.c b/src/pokedex.c
index ad02efc1e..8d7ecb896 100644
--- a/src/pokedex.c
+++ b/src/pokedex.c
@@ -3487,10 +3487,10 @@ static void sub_8090584(u8 a, u16 b)
u32 r0 = b * 0x800 + (r7 + j) * 2;
u8 *ptr;
- ptr = VRAM;
- *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6;
- ptr = VRAM + 0x40;
- *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6;
+ ptr = (void *)VRAM;
+ *(u16 *)(ptr + r0) = (*(u16 *)(ptr + r0) & 0xFFF) | r6;
+ ptr = (void *)VRAM + 0x40;
+ *(u16 *)(ptr + r0) = (*(u16 *)(ptr + r0) & 0xFFF) | r6;
}
}
r6 = 0x4000;
@@ -3499,10 +3499,10 @@ static void sub_8090584(u8 a, u16 b)
u32 r0 = b * 0x800 + j * 2;
u8 *ptr;
- ptr = VRAM + 0x32;
- *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6;
- ptr = VRAM + 0x72;
- *(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6;
+ ptr = (void *)VRAM + 0x32;
+ *(u16 *)(ptr + r0) = (*(u16 *)(ptr + r0) & 0xFFF) | r6;
+ ptr = (void *)VRAM + 0x72;
+ *(u16 *)(ptr + r0) = (*(u16 *)(ptr + r0) & 0xFFF) | r6;
}
}
#else
@@ -3633,9 +3633,9 @@ static void sub_8090644(u8 a, u16 b)
u16 (*vramData)[0x400];
vramData = (u16 (*)[])VRAM;
- vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5;
+ vramData[b][r8 + j] = (vramData[b][r8 + j] & 0xFFF) | r5;
vramData = (u16 (*)[])(VRAM + 0x40);
- vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5;
+ vramData[b][r8 + j] = (vramData[b][r8 + j] & 0xFFF) | r5;
}
}
@@ -3644,9 +3644,9 @@ static void sub_8090644(u8 a, u16 b)
u16 (*vramData)[0x400];
vramData = (u16 (*)[])(VRAM + 0x32);
- vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000;
+ vramData[b][j] = (vramData[b][j] & 0xFFF) | 0x4000;
vramData = (u16 (*)[])(VRAM + 0x72);
- vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000;
+ vramData[b][j] = (vramData[b][j] & 0xFFF) | 0x4000;
}
}
#else
diff --git a/src/pokemon_storage_system_4.c b/src/pokemon_storage_system_4.c
index 876e21f67..db35d60ea 100644
--- a/src/pokemon_storage_system_4.c
+++ b/src/pokemon_storage_system_4.c
@@ -12,6 +12,8 @@
#include "item.h"
#include "pokemon_summary_screen.h"
#include "pokemon_storage_system.h"
+#include "sound.h"
+#include "constants/songs.h"
// Static type declarations
@@ -3120,18 +3122,18 @@ s16 sub_809CF30(void)
{
if (gMain.newKeys & B_BUTTON)
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
textId++;
}
if (gMain.newKeys & DPAD_UP)
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
Menu_MoveCursor(-1);
}
else if (gMain.newKeys & DPAD_DOWN)
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
Menu_MoveCursor(1);
}
}
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 374e73d2e..8588bf637 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -88,7 +88,7 @@ void RecordMixing_ReceiveExchangePacket(u32 a)
sub_80C0514(ewram_2008000.pokeNews, sizeof(struct PlayerRecords), a);
sub_80B9B1C((u8 *)&ewram_2008000.mauvilleMan, sizeof(struct PlayerRecords), a);
sub_80FA4E4(ewram_2008000.easyChatPairs, sizeof(struct PlayerRecords), a);
- sub_80B9C6C((u8 *)&ewram_2008000.daycareMailRecord, sizeof(struct PlayerRecords), a, ewram_2008000.tvShows);
+ sub_80B9C6C(&ewram_2008000.daycareMailRecord, sizeof(struct PlayerRecords), a, ewram_2008000.tvShows);
sub_80B9B70(&ewram_2008000.battleTowerRecord, sizeof(struct PlayerRecords), a);
sub_80B9F3C(ewram_2008000.filler11C8, a);
}
@@ -451,9 +451,9 @@ void sub_80B9B70(void *battleTowerRecord, u32 size, u8 index)
sub_8134AC0(battleTowerRecord + size * index);
}
-u8 sub_80B9BBC(u16 *a)
+u8 sub_80B9BBC(struct DayCareMail *a)
{
- return a[16];
+ return a->message.itemId;
}
void sub_80B9BC4(u8 *a, size_t b, u8 c[][2], u8 d, u8 e)
@@ -494,519 +494,126 @@ const u8 gUnknown_083D02BA[3][4] =
{0, 3, 2, 1},
};
-#ifdef NONMATCHING
-void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d)
+void sub_80B9C6C(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows)
{
- u8 r8;
- u8 sp4[4];
- u8 sp8[4];
- void *spC[4];
- u8 sp1C[4][2];
- u8 sp24[4][2];
- u8 sp3C;
- u16 sp40 = Random();
- u16 i; // r3
- u16 r7;
- u8 r1;
- struct DayCareMisc *r6;
-
- //asm("":::"r8");
- SeedRng(gLinkPlayers[0].trainerId);
- r8 = GetLinkPlayerCount();
- for (i = 0; i < 4; i++)
{
- sp4[i] = 0xFF;
- sp8[i] = 0;
- sp1C[i][0] = 0;
- sp1C[i][1] = 0;
- }
- sp3C = 0;
- for (i = 0; i < r8; i++)
- {
- r6 = (struct DayCareMisc *)(a + b * i);
- if (r6->numDaycareMons != 0)
- {
- for (r7 = 0; r7 < r6->numDaycareMons; r7++)
- {
- if (r6->itemsHeld[r7] == 0)
- sp1C[i][r7] = 1;
- }
- }
- //_080B9D3C
- }
- //_080B9D46
- for (r7 = 0, i = 0; i < r8; i++)
- {
- r6 = (struct DayCareMisc *)(a + b * i);
- if (sp1C[i][0] == 1 || sp1C[i][1] == 1)
- sp3C++;
- if (sp1C[i][0] == 1 && sp1C[i][1] == 0)
+ u16 i, j;
+ u8 linkPlayerCount;
+ u8 tableId;
+ struct RecordMixingDayCareMail *_src;
+ u8 which0, which1;
+ void *ptr;
+ u8 sp04[4];
+ u8 sp08[4];
+ struct RecordMixingDayCareMail *sp0c[4];
+ u8 sp1c[4][2];
+ u8 sp24[4][2];
+ u8 sp34;
+ u16 oldSeed;
+
+ oldSeed = Random();
+ SeedRng(gLinkPlayers[0].trainerId);
+ linkPlayerCount = GetLinkPlayerCount();
+ for (i = 0; i < 4; i++)
{
- sp24[r7][0] = i;
- sp24[r7][1] = 0;
- r7++;
+ sp04[i] = 0xFF;
+ sp08[i] = 0;
+ sp1c[i][0] = 0;
+ sp1c[i][1] = 0;
}
- else if (sp1C[i][0] == 0 && sp1C[i][1] == 1)
+ sp34 = 0;
+ for (i = 0; i < linkPlayerCount; i++)
{
- sp24[r7][0] = i;
- sp24[r7][1] = 0;
- r7++;
+ _src = (void *)src + recordSize * i;
+ if (_src->numDaycareMons == 0)
+ continue;
+
+ for (j = 0; j < _src->numDaycareMons; j ++)
+ {
+ if (!_src->itemsHeld[j])
+ sp1c[i][j] = 1;
+ }
}
- //else if (sp1C[i][0] == 1 + 1 && sp1C[i][1] + 1 == 1 + 1)
- else if (sp1C[i][0] == 1 && sp1C[i][1] == 1)
+
+ j = 0;
+ for (i = 0; i < linkPlayerCount; i++)
{
- u8 r4, r1;
+ _src = (void *)src + recordSize * i;
+ if (sp1c[i][0] == TRUE || sp1c[i][1] == TRUE)
+ sp34++;
- sp24[r7][0] = i;
- r4 = sub_80B9BBC((u16 *)&r6->data[0]);
- r1 = sub_80B9BBC((u16 *)&r6->data[1]);
+ if (sp1c[i][0] == TRUE && sp1c[i][1] == FALSE)
+ {
+ sp24[j][0] = i;
+ sp24[j][1] = 0;
+ j++;
+ }
+ else if (sp1c[i][0] == FALSE && sp1c[i][1] == TRUE)
+ {
+ sp24[j][0] = i;
+ sp24[j][1] = 1;
+ j++;
+ }
+ else if (sp1c[i][0] == TRUE && sp1c[i][1] == TRUE)
+ {
+ u32 var1, var2;
- asm("");
- if (r4 == 0 && r1 != 0)
- sp24[r7][1] = 1;
- else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0))
- sp24[r7][1] = Random() % 2;
- else
- sp24[r7][1] = 0;
- /*
- if (r4 == 0 && r1 != 0)
- sp24[r7][1] = 1;
- else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0))
- sp24[r7][1] = Random() % 2;
- else
- sp24[r7][1] = 0;
- */
-
- /*
- if (r4 == 0 && r1 != 0)
- sp24[r7][1] = 1;
- else if ((r4 == 0 && r1 == 0) || (r4 != 0 && r1 != 0))
- //sp24[r7][1] = ((Random() << 16) >> 16) % 2;
- sp24[r7][1] = Random() % 2;
- else
- sp24[r7][1] = 0;
- */
- //_080B9E2C:
- r7++;
- }
- }
- //_080B9E3E
- for (i = 0; i < 4; i++)
- {
- r6 = (struct DayCareMisc *)a + b * c;
- spC[i] = r6;
- }
- r1 = sub_80B9C4C(d) % 3;
- switch (sp3C)
- {
- case 2:
- sub_80B9BC4(a, b, (u8 *)sp24, 0, 1);
- break;
- case 3:
- {
- u8 var1 = gUnknown_083D02B4[r1][0];
- u8 var2 = gUnknown_083D02B4[r1][1];
- sub_80B9BC4(a, b, (u8 *)sp24, var1, var2);
+ sp24[j][0] = i;
+ var1 = sub_80B9BBC(&_src->mail[0]);
+ var2 = sub_80B9BBC(&_src->mail[1]);
+ if (!var1 && var2)
+ {
+ register u8 one asm("r0") = 1; // boo, a fakematch
+ sp24[j][1] = one;
+ }
+ else if ((var1 && var2) || (!var1 && !var2))
+ {
+ sp24[j][1] = Random() % 2;
+ }
+ else if (var1 && !var2)
+ {
+ sp24[j][1] = 0;
+ }
+ j++;
+ }
}
- break;
- case 4:
+
+ for (i = 0; i < 4; i++)
{
- u8 *r6 = (u8 *)sp24;
- u8 var1 = gUnknown_083D02BA[r1][0];
- u8 var2 = gUnknown_083D02BA[r1][1];
- sub_80B9BC4(a, b, r6, var1, var2);
+ _src = &src[recordSize * which];
+ sp0c[i] = _src;
}
+
+ tableId = sub_80B9C4C((void *)shows) % 3;
+ switch (sp34)
{
- u8 *r6 = (u8 *)sp24;
- u8 var1 = gUnknown_083D02BA[r1][2];
- u8 var2 = gUnknown_083D02BA[r1][3];
- sub_80B9BC4(a, b, r6, var1, var2);
+ case 2:
+ sub_80B9BC4((void *)src, recordSize, sp24, 0, 1);
+ break;
+ case 3:
+ which0 = gUnknown_083D02B4[tableId][0];
+ which1 = gUnknown_083D02B4[tableId][1];
+ sub_80B9BC4((void *)src, recordSize, sp24, which0, which1);
+ break;
+ case 4:
+ ptr = sp24;
+ which0 = gUnknown_083D02BA[tableId][0];
+ which1 = gUnknown_083D02BA[tableId][1];
+ sub_80B9BC4((void *)src, recordSize, ptr, which0, which1);
+ which0 = gUnknown_083D02BA[tableId][2];
+ which1 = gUnknown_083D02BA[tableId][3];
+ sub_80B9BC4((void *)src, recordSize, ptr, which0, which1);
+ break;
}
- break;
+
+ _src = (void *)src + which * recordSize;
+ gSaveBlock1.daycare.misc.mail[0] = _src->mail[0];
+ gSaveBlock1.daycare.misc.mail[1] = _src->mail[1];
+ //memcpy(&gSaveBlock1.daycare.misc.mail[0], &_src->mail[0], sizeof(struct DayCareMail));
+ //memcpy(&gSaveBlock1.daycare.misc.mail[1], &_src->mail[1], sizeof(struct DayCareMail));
+ SeedRng(oldSeed);
}
- //_080B9EF0
- //memcpy(&gSaveBlock1.filler_303C.data[0], a + b * c, 0x38);
- //memcpy(&gSaveBlock1.filler_303C.data[1], a + b * c + 0x38, 0x38);
- r6 = (struct DayCareMisc *)(a + b * c);
- gSaveBlock1.filler_303C.data[0] = r6->data[0];
- gSaveBlock1.filler_303C.data[1] = r6->data[1];
- //memcpy(&gSaveBlock1.filler_303C.data[0], &r6->data[0], 0x38);
- //memcpy(&gSaveBlock1.filler_303C.data[1], &r6->data[1], 0x38);
- SeedRng(sp40);
-}
-#else
-NAKED
-void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x58\n\
- str r0, [sp, 0x2C]\n\
- str r1, [sp, 0x30]\n\
- str r3, [sp, 0x38]\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- str r2, [sp, 0x34]\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x40]\n\
- ldr r0, _080B9DA8 @ =gLinkPlayers\n\
- ldrh r0, [r0, 0x4]\n\
- bl SeedRng\n\
- bl GetLinkPlayerCount\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r8, r0\n\
- movs r3, 0\n\
- add r0, sp, 0x1C\n\
- mov r9, r0\n\
- movs r1, 0x1D\n\
- add r1, sp\n\
- mov r10, r1\n\
- mov r2, sp\n\
- adds r2, 0xC\n\
- str r2, [sp, 0x4C]\n\
- movs r7, 0xFF\n\
- add r4, sp, 0x8\n\
- movs r2, 0\n\
- mov r6, r9\n\
- mov r5, r10\n\
-_080B9CBC:\n\
- mov r1, sp\n\
- adds r1, r3\n\
- adds r1, 0x4\n\
- ldrb r0, [r1]\n\
- orrs r0, r7\n\
- strb r0, [r1]\n\
- adds r0, r4, r3\n\
- strb r2, [r0]\n\
- lsls r1, r3, 1\n\
- adds r0, r6, r1\n\
- strb r2, [r0]\n\
- adds r1, r5, r1\n\
- strb r2, [r1]\n\
- adds r0, r3, 0x1\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- cmp r3, 0x3\n\
- bls _080B9CBC\n\
- movs r4, 0\n\
- str r4, [sp, 0x3C]\n\
- movs r3, 0\n\
- mov r1, r8\n\
- lsls r0, r1, 16\n\
- lsrs r1, r0, 16\n\
- str r0, [sp, 0x50]\n\
- ldr r4, [sp, 0x30]\n\
- ldr r0, [sp, 0x34]\n\
- adds r2, r4, 0\n\
- muls r2, r0\n\
- str r2, [sp, 0x48]\n\
- ldr r2, [sp, 0x3C]\n\
- cmp r2, r1\n\
- bcs _080B9D46\n\
- mov r8, r1\n\
-_080B9D00:\n\
- ldr r4, [sp, 0x30]\n\
- adds r0, r4, 0\n\
- muls r0, r3\n\
- ldr r1, [sp, 0x2C]\n\
- adds r6, r1, r0\n\
- ldr r0, [r6, 0x70]\n\
- cmp r0, 0\n\
- beq _080B9D3C\n\
- movs r7, 0\n\
- cmp r7, r0\n\
- bcs _080B9D3C\n\
- adds r4, r6, 0\n\
- adds r4, 0x74\n\
- mov r2, r9\n\
- lsls r1, r3, 1\n\
- movs r5, 0x1\n\
-_080B9D20:\n\
- lsls r0, r7, 1\n\
- adds r0, r4, r0\n\
- ldrh r0, [r0]\n\
- cmp r0, 0\n\
- bne _080B9D30\n\
- adds r0, r7, r1\n\
- adds r0, r2, r0\n\
- strb r5, [r0]\n\
-_080B9D30:\n\
- adds r0, r7, 0x1\n\
- lsls r0, 16\n\
- lsrs r7, r0, 16\n\
- ldr r0, [r6, 0x70]\n\
- cmp r7, r0\n\
- bcc _080B9D20\n\
-_080B9D3C:\n\
- adds r0, r3, 0x1\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- cmp r3, r8\n\
- bcc _080B9D00\n\
-_080B9D46:\n\
- movs r7, 0\n\
- movs r3, 0\n\
- ldr r2, [sp, 0x50]\n\
- cmp r2, 0\n\
- beq _080B9E3E\n\
- mov r4, sp\n\
- adds r4, 0x24\n\
- str r4, [sp, 0x44]\n\
- movs r0, 0x25\n\
- add r0, sp\n\
- mov r8, r0\n\
-_080B9D5C:\n\
- ldr r1, [sp, 0x30]\n\
- adds r0, r1, 0\n\
- muls r0, r3\n\
- ldr r2, [sp, 0x2C]\n\
- adds r6, r2, r0\n\
- lsls r1, r3, 1\n\
- mov r4, r9\n\
- adds r0, r4, r1\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x1\n\
- beq _080B9D7C\n\
- mov r2, r10\n\
- adds r0, r2, r1\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x1\n\
- bne _080B9D86\n\
-_080B9D7C:\n\
- ldr r0, [sp, 0x3C]\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- str r0, [sp, 0x3C]\n\
-_080B9D86:\n\
- mov r4, r9\n\
- adds r0, r4, r1\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x1\n\
- bne _080B9DAC\n\
- mov r2, r10\n\
- adds r0, r2, r1\n\
- ldrb r2, [r0]\n\
- cmp r2, 0\n\
- bne _080B9DAC\n\
-_080B9D9A:\n\
- lsls r1, r7, 1\n\
- ldr r4, [sp, 0x44]\n\
- adds r0, r4, r1\n\
- strb r3, [r0]\n\
- add r1, r8\n\
- strb r2, [r1]\n\
- b _080B9E2C\n\
- .align 2, 0\n\
-_080B9DA8: .4byte gLinkPlayers\n\
-_080B9DAC:\n\
- mov r2, r9\n\
- adds r0, r2, r1\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- bne _080B9DC0\n\
- mov r4, r10\n\
- adds r0, r4, r1\n\
- ldrb r2, [r0]\n\
- cmp r2, 0x1\n\
- beq _080B9D9A\n\
-_080B9DC0:\n\
- mov r2, r9\n\
- adds r0, r2, r1\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x1\n\
- bne _080B9E32\n\
- mov r4, r10\n\
- adds r0, r4, r1\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x1\n\
- bne _080B9E32\n\
- lsls r5, r7, 1\n\
- ldr r1, [sp, 0x44]\n\
- adds r0, r1, r5\n\
- strb r3, [r0]\n\
- adds r0, r6, 0\n\
- str r3, [sp, 0x54]\n\
- bl sub_80B9BBC\n\
- adds r4, r0, 0\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- adds r0, r6, 0\n\
- adds r0, 0x38\n\
- bl sub_80B9BBC\n\
- lsls r0, 24\n\
- lsrs r1, r0, 24\n\
- ldr r3, [sp, 0x54]\n\
- cmp r4, 0\n\
- bne _080B9E0A\n\
- cmp r1, 0\n\
- beq _080B9E0E\n\
- mov r2, r8\n\
- adds r1, r2, r5\n\
- movs r0, 0x1\n\
- strb r0, [r1]\n\
- b _080B9E2C\n\
-_080B9E0A:\n\
- cmp r1, 0\n\
- beq _080B9E26\n\
-_080B9E0E:\n\
- str r3, [sp, 0x54]\n\
- bl Random\n\
- mov r4, r8\n\
- adds r2, r4, r5\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0x1\n\
- ands r0, r1\n\
- strb r0, [r2]\n\
- ldr r3, [sp, 0x54]\n\
- b _080B9E2C\n\
-_080B9E26:\n\
- mov r2, r8\n\
- adds r0, r2, r5\n\
- strb r1, [r0]\n\
-_080B9E2C:\n\
- adds r0, r7, 0x1\n\
- lsls r0, 16\n\
- lsrs r7, r0, 16\n\
-_080B9E32:\n\
- adds r0, r3, 0x1\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- ldr r4, [sp, 0x50]\n\
- cmp r0, r4\n\
- bcc _080B9D5C\n\
-_080B9E3E:\n\
- movs r3, 0\n\
- ldr r1, [sp, 0x48]\n\
- lsls r0, r1, 4\n\
- subs r0, r1\n\
- lsls r0, 3\n\
- ldr r2, [sp, 0x2C]\n\
- adds r6, r2, r0\n\
- ldr r1, [sp, 0x4C]\n\
-_080B9E4E:\n\
- lsls r0, r3, 2\n\
- adds r0, r1, r0\n\
- str r6, [r0]\n\
- adds r0, r3, 0x1\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- cmp r3, 0x3\n\
- bls _080B9E4E\n\
- ldr r0, [sp, 0x38]\n\
- bl sub_80B9C4C\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- movs r1, 0x3\n\
- bl __umodsi3\n\
- lsls r0, 24\n\
- lsrs r1, r0, 24\n\
- ldr r4, [sp, 0x3C]\n\
- cmp r4, 0x3\n\
- beq _080B9E9C\n\
- cmp r4, 0x3\n\
- bgt _080B9E82\n\
- cmp r4, 0x2\n\
- beq _080B9E8A\n\
- b _080B9EF0\n\
-_080B9E82:\n\
- ldr r0, [sp, 0x3C]\n\
- cmp r0, 0x4\n\
- beq _080B9EBC\n\
- b _080B9EF0\n\
-_080B9E8A:\n\
- add r2, sp, 0x24\n\
- movs r0, 0x1\n\
- str r0, [sp]\n\
- ldr r0, [sp, 0x2C]\n\
- ldr r1, [sp, 0x30]\n\
- movs r3, 0\n\
- bl sub_80B9BC4\n\
- b _080B9EF0\n\
-_080B9E9C:\n\
- ldr r0, _080B9EB8 @ =gUnknown_083D02B4\n\
- lsls r1, 1\n\
- adds r2, r1, r0\n\
- ldrb r3, [r2]\n\
- adds r0, 0x1\n\
- adds r1, r0\n\
- ldrb r0, [r1]\n\
- add r2, sp, 0x24\n\
- str r0, [sp]\n\
- ldr r0, [sp, 0x2C]\n\
- ldr r1, [sp, 0x30]\n\
- bl sub_80B9BC4\n\
- b _080B9EF0\n\
- .align 2, 0\n\
-_080B9EB8: .4byte gUnknown_083D02B4\n\
-_080B9EBC:\n\
- add r6, sp, 0x24\n\
- ldr r4, _080B9F2C @ =gUnknown_083D02BA\n\
- lsls r5, r1, 2\n\
- adds r0, r5, r4\n\
- ldrb r3, [r0]\n\
- adds r0, r4, 0x1\n\
- adds r0, r5, r0\n\
- ldrb r0, [r0]\n\
- str r0, [sp]\n\
- ldr r0, [sp, 0x2C]\n\
- ldr r1, [sp, 0x30]\n\
- adds r2, r6, 0\n\
- bl sub_80B9BC4\n\
- adds r0, r4, 0x2\n\
- adds r0, r5, r0\n\
- ldrb r3, [r0]\n\
- adds r4, 0x3\n\
- adds r5, r4\n\
- ldrb r0, [r5]\n\
- str r0, [sp]\n\
- ldr r0, [sp, 0x2C]\n\
- ldr r1, [sp, 0x30]\n\
- adds r2, r6, 0\n\
- bl sub_80B9BC4\n\
-_080B9EF0:\n\
- ldr r1, [sp, 0x2C]\n\
- ldr r2, [sp, 0x48]\n\
- adds r6, r1, r2\n\
- ldr r4, _080B9F30 @ =gSaveBlock1\n\
- ldr r1, _080B9F34 @ =0x0000303c\n\
- adds r0, r4, r1\n\
- adds r1, r6, 0\n\
- movs r2, 0x38\n\
- bl memcpy\n\
- ldr r2, _080B9F38 @ =0x00003074\n\
- adds r4, r2\n\
- adds r1, r6, 0\n\
- adds r1, 0x38\n\
- adds r0, r4, 0\n\
- movs r2, 0x38\n\
- bl memcpy\n\
- ldr r0, [sp, 0x40]\n\
- bl SeedRng\n\
- add sp, 0x58\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080B9F2C: .4byte gUnknown_083D02BA\n\
-_080B9F30: .4byte gSaveBlock1\n\
-_080B9F34: .4byte 0x0000303c\n\
-_080B9F38: .4byte 0x00003074\n\
- .syntax divided\n");
}
-#endif
void sub_80B9F3C(u16 *a, u8 b)
{