summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/battle_2.s375
-rw-r--r--ld_script.txt1
-rw-r--r--src/battle_2.c211
3 files changed, 212 insertions, 375 deletions
diff --git a/asm/battle_2.s b/asm/battle_2.s
index 004d1eadf..eba0c2c9b 100644
--- a/asm/battle_2.s
+++ b/asm/battle_2.s
@@ -6,381 +6,6 @@
.text
- thumb_func_start sub_800E7C4
-sub_800E7C4: @ 800E7C4
- push {lr}
- ldr r0, _0800E7E4 @ =gBattleTypeFlags
- ldrh r1, [r0]
- movs r0, 0x40
- ands r0, r1
- cmp r0, 0
- beq _0800E7F0
- bl sub_800B858
- ldr r0, _0800E7E8 @ =sub_800F104
- bl SetMainCallback2
- ldr r1, _0800E7EC @ =gUnknown_02024D1E
- movs r0, 0
- strb r0, [r1]
- b _0800E7F4
- .align 2, 0
-_0800E7E4: .4byte gBattleTypeFlags
-_0800E7E8: .4byte sub_800F104
-_0800E7EC: .4byte gUnknown_02024D1E
-_0800E7F0:
- bl sub_800E7F8
-_0800E7F4:
- pop {r0}
- bx r0
- thumb_func_end sub_800E7C4
-
- thumb_func_start sub_800E7F8
-sub_800E7F8: @ 800E7F8
- push {r4,r5,lr}
- sub sp, 0x4
- movs r0, 0
- bl SetHBlankCallback
- movs r0, 0
- bl SetVBlankCallback
- movs r4, 0
- str r4, [sp]
- movs r1, 0xC0
- lsls r1, 19
- ldr r2, _0800E90C @ =0x05006000
- mov r0, sp
- bl CpuSet
- ldr r0, _0800E910 @ =REG_MOSAIC
- strh r4, [r0]
- subs r0, 0xC
- movs r2, 0xF0
- strh r2, [r0]
- adds r0, 0x4
- ldr r3, _0800E914 @ =0x00005051
- adds r1, r3, 0
- strh r1, [r0]
- adds r0, 0x4
- strh r4, [r0]
- adds r0, 0x2
- strh r4, [r0]
- ldr r0, _0800E918 @ =gUnknown_030042C4
- strh r2, [r0]
- ldr r0, _0800E91C @ =gUnknown_03004240
- strh r1, [r0]
- bl dp12_8087EA4
- ldr r0, _0800E920 @ =gUnknown_03004DE0
- movs r3, 0xF0
- movs r5, 0xF0
- lsls r5, 3
- adds r2, r0, r5
- movs r1, 0x4F
-_0800E84A:
- strh r3, [r0]
- strh r3, [r2]
- adds r2, 0x2
- adds r0, 0x2
- subs r1, 0x1
- cmp r1, 0
- bge _0800E84A
- movs r1, 0x50
- ldr r4, _0800E924 @ =gUnknown_081F9674
- ldr r0, _0800E920 @ =gUnknown_03004DE0
- ldr r3, _0800E928 @ =0x0000ff10
- movs r5, 0x82
- lsls r5, 4
- adds r2, r0, r5
- adds r0, 0xA0
-_0800E868:
- strh r3, [r0]
- strh r3, [r2]
- adds r2, 0x2
- adds r0, 0x2
- adds r1, 0x1
- cmp r1, 0x9F
- ble _0800E868
- ldr r0, [r4]
- ldr r1, [r4, 0x4]
- ldr r2, [r4, 0x8]
- bl sub_80895F8
- ldr r4, _0800E92C @ =gWindowConfig_81E6C58
- adds r0, r4, 0
- bl SetUpWindowConfig
- bl ResetPaletteFade
- ldr r0, _0800E930 @ =gUnknown_030042A4
- movs r1, 0
- strh r1, [r0]
- ldr r0, _0800E934 @ =gUnknown_030042A0
- strh r1, [r0]
- ldr r0, _0800E938 @ =gUnknown_030042C0
- strh r1, [r0]
- ldr r0, _0800E93C @ =gUnknown_030041B4
- strh r1, [r0]
- ldr r0, _0800E940 @ =gUnknown_03004288
- strh r1, [r0]
- ldr r0, _0800E944 @ =gUnknown_03004280
- strh r1, [r0]
- ldr r0, _0800E948 @ =gUnknown_030041B0
- strh r1, [r0]
- ldr r0, _0800E94C @ =gUnknown_030041B8
- strh r1, [r0]
- bl GetBattleTerrain
- ldr r1, _0800E950 @ =gBattleTerrain
- strb r0, [r1]
- ldr r0, _0800E954 @ =gUnknown_03004210
- adds r1, r4, 0
- bl InitWindowFromConfig
- ldr r0, _0800E958 @ =gUnknown_030041D0
- ldr r1, _0800E95C @ =gWindowConfig_81E71D0
- bl InitWindowFromConfig
- ldr r0, _0800E960 @ =gUnknown_03004250
- ldr r1, _0800E964 @ =gWindowConfig_81E71EC
- bl InitWindowFromConfig
- bl sub_800D6D4
- bl sub_800DAB8
- bl ResetSpriteData
- bl ResetTasks
- bl sub_800E23C
- bl FreeAllSpritePalettes
- ldr r1, _0800E968 @ =gReservedSpritePaletteCount
- movs r0, 0x4
- strb r0, [r1]
- ldr r0, _0800E96C @ =sub_800FCFC
- bl SetVBlankCallback
- bl setup_poochyena_battle
- ldr r0, _0800E970 @ =gBattleTypeFlags
- ldrh r1, [r0]
- movs r0, 0x40
- ands r0, r1
- cmp r0, 0
- beq _0800E978
- ldr r0, _0800E974 @ =sub_800F298
- bl SetMainCallback2
- b _0800E97E
- .align 2, 0
-_0800E90C: .4byte 0x05006000
-_0800E910: .4byte REG_MOSAIC
-_0800E914: .4byte 0x00005051
-_0800E918: .4byte gUnknown_030042C4
-_0800E91C: .4byte gUnknown_03004240
-_0800E920: .4byte gUnknown_03004DE0
-_0800E924: .4byte gUnknown_081F9674
-_0800E928: .4byte 0x0000ff10
-_0800E92C: .4byte gWindowConfig_81E6C58
-_0800E930: .4byte gUnknown_030042A4
-_0800E934: .4byte gUnknown_030042A0
-_0800E938: .4byte gUnknown_030042C0
-_0800E93C: .4byte gUnknown_030041B4
-_0800E940: .4byte gUnknown_03004288
-_0800E944: .4byte gUnknown_03004280
-_0800E948: .4byte gUnknown_030041B0
-_0800E94C: .4byte gUnknown_030041B8
-_0800E950: .4byte gBattleTerrain
-_0800E954: .4byte gUnknown_03004210
-_0800E958: .4byte gUnknown_030041D0
-_0800E95C: .4byte gWindowConfig_81E71D0
-_0800E960: .4byte gUnknown_03004250
-_0800E964: .4byte gWindowConfig_81E71EC
-_0800E968: .4byte gReservedSpritePaletteCount
-_0800E96C: .4byte sub_800FCFC
-_0800E970: .4byte gBattleTypeFlags
-_0800E974: .4byte sub_800F298
-_0800E978:
- ldr r0, _0800E9CC @ =sub_800EC9C
- bl SetMainCallback2
-_0800E97E:
- ldr r0, _0800E9D0 @ =gBattleTypeFlags
- ldrh r1, [r0]
- movs r0, 0x2
- ands r0, r1
- cmp r0, 0
- bne _0800E998
- ldr r0, _0800E9D4 @ =gEnemyParty
- ldr r1, _0800E9D8 @ =gTrainerBattleOpponent
- ldrh r1, [r1]
- bl sub_800F8E8
- bl SetWildMonHeldItem
-_0800E998:
- ldr r0, _0800E9DC @ =gMain
- ldr r1, _0800E9E0 @ =0x0000043d
- adds r0, r1
- ldrb r1, [r0]
- movs r2, 0x2
- orrs r1, r2
- strb r1, [r0]
- ldr r4, _0800E9E4 @ =gPlayerParty
- movs r3, 0xFA
- lsls r3, 1
- adds r5, r4, r3
-_0800E9AE:
- adds r0, r4, 0
- movs r1, 0x3
- bl AdjustFriendship
- adds r4, 0x64
- cmp r4, r5
- ble _0800E9AE
- movs r1, 0
- ldr r0, _0800E9E8 @ =gUnknown_02024D1E
- strb r1, [r0]
- add sp, 0x4
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0800E9CC: .4byte sub_800EC9C
-_0800E9D0: .4byte gBattleTypeFlags
-_0800E9D4: .4byte gEnemyParty
-_0800E9D8: .4byte gTrainerBattleOpponent
-_0800E9DC: .4byte gMain
-_0800E9E0: .4byte 0x0000043d
-_0800E9E4: .4byte gPlayerParty
-_0800E9E8: .4byte gUnknown_02024D1E
- thumb_func_end sub_800E7F8
-
- thumb_func_start sub_800E9EC
-sub_800E9EC: @ 800E9EC
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- movs r6, 0
- mov r9, r6
- movs r0, 0xCE
- lsls r0, 1
- mov r10, r0
- mov r8, r6
-_0800EA02:
- movs r0, 0x64
- mov r4, r9
- muls r4, r0
- ldr r0, _0800EAA4 @ =gPlayerParty
- adds r4, r0
- adds r0, r4, 0
- movs r1, 0x41
- bl GetMonData
- lsls r0, 16
- lsrs r5, r0, 16
- adds r0, r4, 0
- movs r1, 0x39
- bl GetMonData
- lsls r0, 16
- lsrs r7, r0, 16
- adds r0, r4, 0
- movs r1, 0x37
- bl GetMonData
- adds r1, r0, 0
- cmp r5, 0
- beq _0800EA7E
- cmp r5, r10
- beq _0800EA4A
- cmp r7, 0
- beq _0800EA4A
- cmp r1, 0
- bne _0800EA4A
- movs r0, 0x1
- mov r2, r8
- lsls r0, r2
- orrs r6, r0
- lsls r0, r6, 16
- lsrs r6, r0, 16
-_0800EA4A:
- cmp r5, 0
- beq _0800EA7E
- cmp r7, 0
- beq _0800EA66
- cmp r5, r10
- beq _0800EA5A
- cmp r1, 0
- beq _0800EA66
-_0800EA5A:
- movs r0, 0x2
- mov r1, r8
- lsls r0, r1
- orrs r6, r0
- lsls r0, r6, 16
- lsrs r6, r0, 16
-_0800EA66:
- cmp r5, 0
- beq _0800EA7E
- cmp r5, r10
- beq _0800EA7E
- cmp r7, 0
- bne _0800EA7E
- movs r0, 0x3
- mov r2, r8
- lsls r0, r2
- orrs r6, r0
- lsls r0, r6, 16
- lsrs r6, r0, 16
-_0800EA7E:
- movs r0, 0x2
- add r8, r0
- movs r1, 0x1
- add r9, r1
- mov r2, r9
- cmp r2, 0x5
- ble _0800EA02
- ldr r1, _0800EAA8 @ =0x02000000
- strb r6, [r1, 0x2]
- lsrs r0, r6, 8
- strb r0, [r1, 0x3]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0800EAA4: .4byte gPlayerParty
-_0800EAA8: .4byte 0x02000000
- thumb_func_end sub_800E9EC
-
- thumb_func_start sub_800EAAC
-sub_800EAAC: @ 800EAAC
- push {r4-r6,lr}
- ldr r4, _0800EAF4 @ =0x02000004
- movs r2, 0
- ldr r6, _0800EAF8 @ =gSaveBlock1
- ldr r0, _0800EAFC @ =0x00003160
- adds r3, r6, r0
-_0800EAB8:
- adds r0, r4, r2
- adds r1, r2, r3
- ldrb r1, [r1]
- strb r1, [r0]
- adds r2, 0x1
- cmp r2, 0x6
- ble _0800EAB8
- movs r2, 0
- adds r3, r4, 0
- adds r3, 0x8
- ldr r5, _0800EB00 @ =gSaveBlock1 + 0x3676
-_0800EACE:
- adds r0, r3, r2
- adds r1, r2, r5
- ldrb r1, [r1]
- strb r1, [r0]
- adds r2, 0x1
- cmp r2, 0x11
- ble _0800EACE
- ldr r1, _0800EB04 @ =0x00003688
- adds r0, r6, r1
- ldrb r0, [r0]
- strb r0, [r4, 0x7]
- adds r1, 0x1
- adds r0, r6, r1
- ldrb r0, [r0]
- strb r0, [r4, 0x1A]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_0800EAF4: .4byte 0x02000004
-_0800EAF8: .4byte gSaveBlock1
-_0800EAFC: .4byte 0x00003160
-_0800EB00: .4byte gSaveBlock1 + 0x3676
-_0800EB04: .4byte 0x00003688
- thumb_func_end sub_800EAAC
-
thumb_func_start sub_800EB08
sub_800EB08: @ 800EB08
push {r4-r7,lr}
diff --git a/ld_script.txt b/ld_script.txt
index f8da86fba..d43c8886b 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -51,6 +51,7 @@ SECTIONS {
asm/battle_1.o(.text);
src/rom_800D42C.o(.text);
asm/battle_1.o(.text_800DC24);
+ src/battle_2.o(.text);
asm/battle_2.o(.text);
asm/battle_3.o(.text);
asm/battle_4.o(.text);
diff --git a/src/battle_2.c b/src/battle_2.c
new file mode 100644
index 000000000..81317c477
--- /dev/null
+++ b/src/battle_2.c
@@ -0,0 +1,211 @@
+#include "global.h"
+#include "battle.h"
+#include "main.h"
+#include "text.h"
+#include "palette.h"
+#include "sprite.h"
+#include "task.h"
+#include "pokemon.h"
+#include "species.h"
+
+struct UnknownStruct5
+{
+ u32 unk0;
+ u32 unk4;
+ u32 unk8;
+};
+
+struct UnknownStruct6
+{
+ u16 unk0[0xA0];
+ u8 fillerA0[0x640];
+ u16 unk780[0xA0];
+};
+
+struct UnknownStruct7
+{
+ u8 filler0[2];
+ u8 unk2;
+ u8 unk3;
+};
+
+struct UnknownStruct8
+{
+ u8 unk0[7];
+ u8 unk7;
+ u8 unk8[18];
+ u8 unk1A;
+};
+
+extern const struct UnknownStruct5 gUnknown_081F9674;
+
+extern u8 ewram[];
+#define ewram0 (*(struct UnknownStruct7 *)(ewram + 0x0))
+#define ewram4 (*(struct UnknownStruct8 *)(ewram + 0x4))
+extern u8 gUnknown_02024D1E;
+extern u16 gUnknown_030041B0;
+extern u16 gUnknown_030041B4;
+extern u16 gUnknown_030041B8;
+extern struct Window gUnknown_030041D0;
+extern struct Window gUnknown_03004210;
+extern struct Window gUnknown_03004250;
+extern u16 gUnknown_03004240;
+extern u16 gUnknown_03004280;
+extern u16 gUnknown_03004288;
+extern u16 gUnknown_030042A0;
+extern u16 gUnknown_030042A4;
+extern u16 gUnknown_030042C0;
+extern u16 gUnknown_030042C4;
+extern struct UnknownStruct6 gUnknown_03004DE0;
+//extern u16 gUnknown_03004DE0[][0xA0];
+extern u16 gBattleTypeFlags;
+extern u8 gBattleTerrain;
+extern u8 gReservedSpritePaletteCount;
+extern u16 gTrainerBattleOpponent;
+
+extern void sub_800B858(void);
+extern void dp12_8087EA4(void);
+extern void sub_80895F8();
+extern u8 GetBattleTerrain();
+extern void sub_800D6D4();
+extern void sub_800DAB8();
+extern void sub_800E23C();
+extern void setup_poochyena_battle();
+extern void SetWildMonHeldItem(void);
+extern void AdjustFriendship(struct Pokemon *, u8);
+
+
+void sub_800E7F8(void);
+void sub_800EC9C(void);
+void sub_800F104(void);
+void sub_800F298(void);
+void sub_800F8E8();
+void sub_800FCFC(void);
+
+void sub_800E7C4(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_40)
+ {
+ sub_800B858();
+ SetMainCallback2(sub_800F104);
+ gUnknown_02024D1E = 0;
+ }
+ else
+ {
+ sub_800E7F8();
+ }
+}
+
+void sub_800E7F8(void)
+{
+ s32 i;
+
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+
+ CpuFill32(0, (void *)VRAM, VRAM_SIZE);
+
+ REG_MOSAIC = 0;
+ REG_WIN0H = 0xF0;
+ REG_WIN0V = 0x5051;
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ gUnknown_030042C4 = 0xF0;
+ gUnknown_03004240 = 0x5051;
+ dp12_8087EA4();
+
+ for (i = 0; i < 80; i++)
+ {
+ gUnknown_03004DE0.unk0[i] = 0xF0;
+ gUnknown_03004DE0.unk780[i] = 0xF0;
+ }
+ for (i = 80; i < 160; i++)
+ {
+ asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
+ gUnknown_03004DE0.unk0[i] = 0xFF10;
+ gUnknown_03004DE0.unk780[i] = 0xFF10;
+ }
+ sub_80895F8(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8);
+ SetUpWindowConfig(&gWindowConfig_81E6C58);
+ ResetPaletteFade();
+ gUnknown_030042A4 = 0;
+ gUnknown_030042A0 = 0;
+ gUnknown_030042C0 = 0;
+ gUnknown_030041B4 = 0;
+ gUnknown_03004288 = 0;
+ gUnknown_03004280 = 0;
+ gUnknown_030041B0 = 0;
+ gUnknown_030041B8 = 0;
+ gBattleTerrain = GetBattleTerrain();
+ InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
+ InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0);
+ InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC);
+ sub_800D6D4();
+ sub_800DAB8();
+ ResetSpriteData();
+ ResetTasks();
+ sub_800E23C();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+ SetVBlankCallback(sub_800FCFC);
+ setup_poochyena_battle();
+ if (gBattleTypeFlags & BATTLE_TYPE_40)
+ SetMainCallback2(sub_800F298);
+ else
+ SetMainCallback2(sub_800EC9C);
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ {
+ sub_800F8E8(gEnemyParty, gTrainerBattleOpponent);
+ SetWildMonHeldItem();
+ }
+ gMain.inBattle = TRUE;
+ for (i = 0; i < 6; i++)
+ AdjustFriendship(&gPlayerParty[i], 3);
+ gUnknown_02024D1E = 0;
+}
+
+void sub_800E9EC(void)
+{
+ u16 r6 = 0;
+ u16 species;
+ u16 hp;
+ u32 status;
+ s32 i;
+
+ for (i = 0; i < 6; i++)
+ {
+ species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp != 0 && status == 0)
+ r6 |= 1 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (hp != 0 && (species == SPECIES_EGG || status != 0))
+ r6 |= 2 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp == 0)
+ r6 |= 3 << i * 2;
+ }
+ ewram0.unk2 = r6;
+ ewram0.unk3 = r6 >> 8;
+}
+
+void sub_800EAAC(void)
+{
+ s32 i;
+ struct UnknownStruct8 *_ewram4 = &ewram4;
+
+ for (i = 0; i < 7; i++)
+ _ewram4->unk0[i] = gSaveBlock1.enigmaBerry.berry.name[i];
+ for (i = 0; i < 18; i++)
+ _ewram4->unk8[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
+ _ewram4->unk7 = gSaveBlock1.enigmaBerry.holdEffect;
+ _ewram4->unk1A = gSaveBlock1.enigmaBerry.holdEffectParam;
+}