summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/fldeff_softboiled.s318
-rw-r--r--include/asm.inc.h59
-rw-r--r--ld_script.txt2
-rw-r--r--src/fldeff_softboiled.c166
4 files changed, 213 insertions, 332 deletions
diff --git a/asm/fldeff_softboiled.s b/asm/fldeff_softboiled.s
deleted file mode 100644
index dc863129c..000000000
--- a/asm/fldeff_softboiled.s
+++ /dev/null
@@ -1,318 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start SetUpFieldMove_SoftBoiled
-SetUpFieldMove_SoftBoiled: @ 8133CCC
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- ldr r0, _08133D14 @ =gLastFieldPokeMenuOpened
- mov r8, r0
- ldrb r0, [r0]
- movs r6, 0x64
- muls r0, r6
- ldr r4, _08133D18 @ =gPlayerParty
- adds r0, r4
- movs r1, 0x3A
- bl GetMonData
- adds r5, r0, 0
- lsls r5, 16
- lsrs r5, 16
- mov r1, r8
- ldrb r0, [r1]
- muls r0, r6
- adds r0, r4
- movs r1, 0x39
- bl GetMonData
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- adds r0, r5, 0
- movs r1, 0x5
- bl __udivsi3
- lsls r0, 16
- lsrs r0, 16
- cmp r4, r0
- bcs _08133D1C
- movs r0, 0
- b _08133D1E
- .align 2, 0
-_08133D14: .4byte gLastFieldPokeMenuOpened
-_08133D18: .4byte gPlayerParty
-_08133D1C:
- movs r0, 0x1
-_08133D1E:
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end SetUpFieldMove_SoftBoiled
-
- thumb_func_start sub_8133D28
-sub_8133D28: @ 8133D28
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08133D44 @ =0x02001000
- ldr r2, _08133D48 @ =sub_8133D50
- str r2, [r1, 0xC]
- ldr r2, _08133D4C @ =0x0001a272
- adds r1, r2
- movs r2, 0x3
- strh r2, [r1]
- bl sub_808A004
- pop {r0}
- bx r0
- .align 2, 0
-_08133D44: .4byte 0x02001000
-_08133D48: .4byte sub_8133D50
-_08133D4C: .4byte 0x0001a272
- thumb_func_end sub_8133D28
-
- thumb_func_start sub_8133D50
-sub_8133D50: @ 8133D50
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- lsls r0, 24
- lsrs r7, r0, 24
- ldr r0, _08133DA0 @ =gSprites
- mov r9, r0
- ldr r1, _08133DA4 @ =0x02001000
- mov r10, r1
- ldrb r1, [r1, 0x1]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- add r0, r9
- ldrh r0, [r0, 0x2E]
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- mov r2, r10
- ldrb r1, [r2, 0x2]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- mov r2, r9
- adds r1, r0, r2
- ldrh r0, [r1, 0x2E]
- lsls r0, 24
- lsrs r6, r0, 24
- mov r0, r8
- cmp r0, 0x5
- bhi _08133D96
- cmp r6, 0x5
- bls _08133DA8
-_08133D96:
- adds r0, r7, 0
- bl sub_806CD44
- b _08133E4E
- .align 2, 0
-_08133DA0: .4byte gSprites
-_08133DA4: .4byte 0x02001000
-_08133DA8:
- movs r5, 0xD8
- lsls r5, 9
- add r5, r10
- movs r2, 0x2E
- ldrsh r0, [r1, r2]
- movs r1, 0x64
- muls r0, r1
- ldr r2, _08133DE4 @ =gPlayerParty
- adds r0, r2
- str r0, [r5]
- movs r1, 0x39
- bl GetMonData
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, 0
- beq _08133DDA
- cmp r8, r6
- beq _08133DDA
- ldr r0, [r5]
- movs r1, 0x3A
- bl GetMonData
- cmp r0, r4
- bne _08133DE8
-_08133DDA:
- adds r0, r7, 0
- bl sub_8133EB8
- b _08133E4E
- .align 2, 0
-_08133DE4: .4byte gPlayerParty
-_08133DE8:
- movs r0, 0x1
- bl PlaySE
- mov r0, r10
- ldrb r1, [r0, 0x1]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- add r0, r9
- ldrh r0, [r0, 0x2E]
- movs r1, 0
- strb r0, [r5, 0x5]
- ldrb r0, [r5, 0x5]
- movs r2, 0x64
- muls r0, r2
- ldr r2, _08133E5C @ =gPlayerParty
- adds r0, r2
- str r0, [r5]
- strh r1, [r5, 0x6]
- ldr r1, _08133E60 @ =0xffff8000
- str r1, [r5, 0xC]
- ldr r1, _08133E64 @ =sub_8133EF8
- str r1, [r5, 0x10]
- movs r1, 0x3A
- bl GetMonData
- ldr r1, _08133E68 @ =gTasks
- lsls r4, r7, 2
- adds r4, r7
- lsls r4, 3
- adds r4, r1
- strh r0, [r4, 0x1C]
- ldr r0, [r5]
- movs r1, 0x39
- bl GetMonData
- strh r0, [r4, 0x1E]
- movs r1, 0x1C
- ldrsh r0, [r4, r1]
- movs r1, 0x5
- bl __divsi3
- strh r0, [r4, 0x20]
- bl sub_806D5A4
- ldr r0, _08133E6C @ =sub_806FA18
- str r0, [r4]
- ldrh r1, [r4, 0x1E]
- ldr r0, _08133E70 @ =0x0001a282
- add r0, r10
- strh r1, [r0]
-_08133E4E:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08133E5C: .4byte gPlayerParty
-_08133E60: .4byte 0xffff8000
-_08133E64: .4byte sub_8133EF8
-_08133E68: .4byte gTasks
-_08133E6C: .4byte sub_806FA18
-_08133E70: .4byte 0x0001a282
- thumb_func_end sub_8133D50
-
- thumb_func_start sub_8133E74
-sub_8133E74: @ 8133E74
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _08133EAC @ =gUnknown_0202E8F6
- ldrb r0, [r0]
- cmp r0, 0
- bne _08133EA4
- movs r0, 0x3
- movs r1, 0xE
- movs r2, 0x1A
- movs r3, 0x13
- bl MenuZeroFillWindowRect
- movs r0, 0x3
- movs r1, 0
- bl sub_806D538
- ldr r0, _08133EB0 @ =gTasks
- lsls r1, r4, 2
- adds r1, r4
- lsls r1, 3
- adds r1, r0
- ldr r0, _08133EB4 @ =sub_806CB74
- str r0, [r1]
-_08133EA4:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08133EAC: .4byte gUnknown_0202E8F6
-_08133EB0: .4byte gTasks
-_08133EB4: .4byte sub_806CB74
- thumb_func_end sub_8133E74
-
- thumb_func_start sub_8133EB8
-sub_8133EB8: @ 8133EB8
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r1, _08133EE8 @ =gUnknown_0202E8F4
- movs r0, 0
- strb r0, [r1]
- bl sub_806D5A4
- ldr r0, _08133EEC @ =gOtherText_CantUseOnPoke
- movs r1, 0x1
- bl sub_806E834
- ldr r1, _08133EF0 @ =gTasks
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- adds r0, r1
- ldr r1, _08133EF4 @ =sub_8133E74
- str r1, [r0]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08133EE8: .4byte gUnknown_0202E8F4
-_08133EEC: .4byte gOtherText_CantUseOnPoke
-_08133EF0: .4byte gTasks
-_08133EF4: .4byte sub_8133E74
- thumb_func_end sub_8133EB8
-
- thumb_func_start sub_8133EF8
-sub_8133EF8: @ 8133EF8
- push {r4,lr}
- bl sub_806CCE4
- ldr r4, _08133F3C @ =0x0201b000
- ldr r0, _08133F40 @ =0x00000261
- adds r1, r4, r0
- movs r0, 0x2
- strb r0, [r1]
- ldr r0, _08133F44 @ =0xfffe6000
- adds r4, r0
- ldrb r1, [r4, 0x1]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- ldr r1, _08133F48 @ =gSprites
- adds r0, r1
- bl DestroySprite
- movs r0, 0x3
- movs r1, 0xE
- movs r2, 0x1A
- movs r3, 0x13
- bl MenuZeroFillWindowRect
- movs r0, 0
- movs r1, 0
- bl sub_806D538
- ldrb r0, [r4]
- bl SwitchTaskToFollowupFunc
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08133F3C: .4byte 0x0201b000
-_08133F40: .4byte 0x00000261
-_08133F44: .4byte 0xfffe6000
-_08133F48: .4byte gSprites
- thumb_func_end sub_8133EF8
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/include/asm.inc.h b/include/asm.inc.h
index 9ee10aa58..d0fe6e354 100644
--- a/include/asm.inc.h
+++ b/include/asm.inc.h
@@ -1,12 +1,16 @@
-// asm/rom3.o
+// src/rom3.o
void sub_800C35C(void);
-// asm/rom_800D42C.o
+// asm/battle_2.o
void sub_800E7C4(void);
u8 b_first_side(u8, u8, u8);
void sub_80157C4(u8 index);
+
+// asm/battle_3.o
u8 sub_8015A98(u8, u8, u8);
u8 sub_8018324(u8, u8, u8, u8, u16);
+
+// asm/battle_7.o
void sub_8032AA8(u8 index, int i);
// src/pokemon_3.o
@@ -23,8 +27,10 @@ void current_map_music_set__default_for_battle(u16);
void StoreWordInTwoHalfwords(u16 *, u32);
void LoadWordFromTwoHalfwords(u16 *, u32 *);
-// asm/daycare.o
+// src/daycare.o
u8 daycare_count_pokemon(u8 *);
+
+// asm/daycare.o
void sub_8041324(struct BoxPokemon *, void *);
void sub_8041790(int i);
u16 sub_8041870(u16);
@@ -38,7 +44,7 @@ void CreatePokeballSprite(u8 r0, u8 r1, u8 r2, u8 r3, u8 s1, u8 s2, u8 s3, u16 s
// asm/berry_blender.o
void sub_80516C4(u8, u16);
-// asm/field_map_obj.o
+// src/field_map_obj.o
void sub_805AA98();
u8 sub_805AB54(void);
u8 GetFieldObjectIdByLocalIdAndMap(u8, u8, u8);
@@ -49,7 +55,6 @@ u8 SpawnSpecialFieldObject(struct MapObjectTemplate *);
u8 show_sprite(u8, u8, u8);
u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority);
u8 sub_805B410(u8, u8, s16, s16, u8, u8);
-//void sub_805B55C(int i, int i1);
void sub_805B55C(s16 a, s16 b);
void sub_805B710(u16 i, u16 i1);
void sub_805B980(struct MapObject *, u8);
@@ -74,6 +79,8 @@ void sub_805C754(struct MapObject *pObject);
void sub_805C774(struct MapObject *, u8);
void sub_805C78C(u8, u8, u8);
void sub_805C7C4(u8 i);
+
+// asm/field_map_obj.o
u8 FieldObjectDirectionToImageAnimId(u8);
u8 get_go_image_anim_num(u8 unk_19);
u8 sub_805FD98(u8);
@@ -138,8 +145,17 @@ void ResetFieldTasksArgs(void);
void CB2_InitResetRtcScreen(void);
// asm/party_menu.o
+void sub_806CB74(u8 taskId);
+void sub_806CCE4(void);
+void sub_806CD44(u8 taskId);
+void sub_806D538();
+void sub_806D5A4(void);
void GetMonNickname(struct Pokemon *mon, u8 *nickname);
bool8 pokemon_has_move(struct Pokemon *, u16);
+void sub_806FA18(u8 taskId);
+
+// src/party_menu.o
+void sub_806E834();
// asm/rom_8077ABC.o
u8 battle_side_get_owner(u8);
@@ -147,13 +163,15 @@ u8 battle_get_per_side_status(u8);
u8 battle_get_side_with_given_state(u8);
bool8 IsDoubleBattle();
-// asm/weather.o
+// asm/field_screeneffect.o
void SetWeather(u32);
-// asm/rom_8080874.o
+// src/field_fadetransition.o
void pal_fill_black();
void sub_8080990(void);
void sub_80809B0(void);
+
+// asm/field_fadetransition.o
void sub_8080A3C(void);
void sub_8080AC4(void);
void mapldr_default();
@@ -166,6 +184,8 @@ void sub_8080EF0(void);
void sp13F_fall_to_last_warp(void);
void sub_8080F68(void);
void sub_8080F9C(void);
+
+// asm/rom_8080874.o
void sub_8081594(u8);
void sub_80815E0(u8 val);
@@ -174,7 +194,7 @@ u8 sub_8083664(void);
void sub_8083A84(TaskFunc);
s32 sub_8083BF4(u8 id);
-// asm/rom_80859BC.o
+// asm/field_effect.o
u8 CreateTrainerSprite_BirchSpeech(u8, u16, u16, u8, void *);
void LoadTrainerGfx_TrainerCard(u8 gender, int, void *);
u8 CreateBirchSprite(u8, u8, u8);
@@ -188,6 +208,7 @@ void sub_8089944(int i, int i1, int i2, int i3, int i4, int i5, int i6);
// asm/pokemon_menu.o
void sub_8089A70(void);
+void sub_808A004();
void sub_808AB90(void);
// asm/pokemon_storage_system.o
@@ -203,7 +224,7 @@ void sub_809D608(u16);
// asm/pokemon_summary_screen.o
u8 pokemon_ailments_get_primary(u32);
-// asm/script_movement.o
+// src/script_movement.o
bool8 exec_movement(u8, u8, u8, u8 *);
bool8 sub_80A212C(u8, u8, u8);
void sub_80A2178(void);
@@ -212,7 +233,7 @@ void sub_80A2178(void);
void sub_80A2B18(void);
u16 sub_80A2D64(u16, u8 *);
-// asm/map_name_popup.o
+// src/map_name_popup.o
void ShowMapNamePopup(void);
void HideMapNamePopup();
@@ -307,8 +328,10 @@ u16 sub_80EB72C(u16);
// asm/pokenav.o
void sub_80EBA5C(void);
-// asm/mauville_old_man.o
+// src/mauville_old_man.o
void SetMauvilleOldMan(void);
+
+// asm/mauville_old_man.o
void sub_80F7F30(void);
// asm/menu_helpers.o
@@ -329,9 +352,13 @@ void sub_810C994(void);
void sub_810CA6C(s32);
s16 sub_810CAE4(u8, struct Pokeblock *);
-// asm/rom_810CBB4.o
+// asm/fldeff_flash.o
void sub_810CC80(void);
+
+// asm/time_events.o
u8 sub_810D32C(void);
+
+// asm/field_specials.o
void ResetCyclingRoadChallengeData(void);
bool32 sub_810D9B0(u16);
u8 sub_810D9EC(s8 *, s8 *, s16 *, s16 *);
@@ -363,19 +390,25 @@ void sub_8127ED0(u8, u8);
void sub_8127F28(u8, u8, s16);
u8 sub_8128124(u8 id);
-// asm/rom_81258BC.o
+// asm/learn_move.o
void sub_8132670(void);
+
+// asm/decoration_inventory.o
void sub_8133F80(void);
u8 sub_8133FE4(u8);
u8 IsThereStorageSpaceForDecoration(u8);
u8 sub_8134074(u8);
s8 sub_81340A8(u8);
+
+// asm/roamer.o
void sub_81341F8(void);
void sub_813420C(void);
void mapnumbers_history_shift_sav1_0_2_4_out(void);
void sub_8134348(void);
void sub_8134394();
u8 sub_81344CC(void);
+
+// asm/battle_tower.o
void sub_8134AC0(void *);
// src/player_pc.o
diff --git a/ld_script.txt b/ld_script.txt
index 29cf785b3..098e5231a 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -243,7 +243,7 @@ SECTIONS {
asm/fldeff_sweetscent.o(.text);
asm/battle_anim_812C144.o(.text);
asm/learn_move.o(.text);
- asm/fldeff_softboiled.o(.text);
+ src/fldeff_softboiled.o(.text);
asm/decoration_inventory.o(.text);
asm/roamer.o(.text);
asm/battle_tower.o(.text);
diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c
new file mode 100644
index 000000000..712bb8be9
--- /dev/null
+++ b/src/fldeff_softboiled.c
@@ -0,0 +1,166 @@
+#include "global.h"
+#include "asm.h"
+#include "menu.h"
+#include "pokemon.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "strings.h"
+#include "task.h"
+
+struct UnknownStruct1 {
+ u8 filler0[0x259];
+ u8 unk259;
+ u8 filler25A[6];
+ u8 unk260;
+ u8 unk261;
+ u8 unk262;
+ s16 unk264;
+ s16 unk266;
+ u8 filler268[10];
+ u16 unk272;
+ u8 filler274[14];
+ u16 unk282;
+};
+
+struct UnknownStruct2 {
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 filler3[9];
+ void *unkC;
+};
+
+struct UnknownStruct3 {
+ struct Pokemon *unk0;
+ u8 filler4[1];
+ u8 unk5;
+ u16 unk6;
+ u8 filler8[4];
+ s32 unkC;
+ void* unk10;
+ u8 filler14[26];
+ s16 unk2E;
+};
+
+
+#define EWRAM_1000 (*(struct UnknownStruct2 *)(unk_2000000 + 0x1000))
+#define EWRAM_1B000 (*(struct UnknownStruct1 *)(unk_2000000 + 0x1B000))
+#define EWRAM_1C000 (*(struct UnknownStruct3 *)(unk_2000000 + 0x1C000))
+
+// extern
+extern u8 gUnknown_0202E8F6;
+extern u8 gLastFieldPokeMenuOpened;
+
+extern u8 unk_2000000[];
+extern u8 gUnknown_0202E8F4;
+
+// Public
+bool8 SetUpFieldMove_SoftBoiled(void);
+void sub_8133D28(u8 taskid);
+
+// Static
+static void sub_8133D50(u8 taskId);
+static void sub_8133E74(u8 taskId);
+static void sub_8133EB8(u8 taskId);
+static void sub_8133EF8(void);
+
+bool8 SetUpFieldMove_SoftBoiled(void) {
+ u16 maxHp;
+ u16 hp;
+ u16 minHp;
+
+ maxHp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MAX_HP);
+ hp = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HP);
+
+ minHp = (maxHp / 5);
+ if (hp >= minHp)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_8133D28(u8 taskid) {
+ EWRAM_1000.unkC = sub_8133D50;
+ EWRAM_1B000.unk272 = 3;
+ sub_808A004(taskid);
+}
+
+static void sub_8133D50(u8 taskId) {
+ u8 unk1, unk2;
+ u16 hp;
+ struct Pokemon *pokemon;
+ //struct Task *task;
+
+ struct Sprite *sprites = gSprites;
+
+
+ unk1 = sprites[EWRAM_1000.unk1].data0;
+ unk2 = sprites[EWRAM_1000.unk2].data0;
+
+ if (unk1 > 5 || unk2 > 5)
+ {
+ sub_806CD44(taskId);
+ return;
+ }
+
+ EWRAM_1C000.unk0 = &gPlayerParty[sprites[EWRAM_1000.unk2].data0];
+ hp = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP);
+
+ if (hp == 0 || unk1 == unk2 || GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP) == hp)
+ {
+ sub_8133EB8(taskId);
+ return;
+ }
+
+ PlaySE(SE_KAIFUKU);
+
+ EWRAM_1C000.unk5 = gSprites[EWRAM_1000.unk1].data0;
+
+ pokemon = &gPlayerParty[EWRAM_1C000.unk5];
+ EWRAM_1C000.unk0 = pokemon;
+ EWRAM_1C000.unk6 = 0;
+ EWRAM_1C000.unkC = -0x8000;
+ EWRAM_1C000.unk10 = sub_8133EF8;
+
+
+ gTasks[taskId].data[10] = GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP);
+ gTasks[taskId].data[11] = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP);
+ gTasks[taskId].data[12] = gTasks[taskId].data[10] / 5;
+
+ sub_806D5A4();
+ gTasks[taskId].func = sub_806FA18;
+ EWRAM_1B000.unk282 = gTasks[taskId].data[11];
+}
+
+static void sub_8133E74(u8 taskId) {
+ if (gUnknown_0202E8F6)
+ {
+ return;
+ }
+
+ MenuZeroFillWindowRect(3, 14, 26, 19);
+ sub_806D538(3, 0);
+ gTasks[taskId].func = sub_806CB74;
+}
+
+static void sub_8133EB8(u8 taskId) {
+ gUnknown_0202E8F4 = 0;
+ sub_806D5A4();
+ sub_806E834(gOtherText_CantUseOnPoke, 1);
+ gTasks[taskId].func = sub_8133E74;
+}
+
+#define WINDOW_LEFT 3
+#define WINDOW_RIGHT 26
+
+static void sub_8133EF8(void) {
+ sub_806CCE4();
+ EWRAM_1B000.unk261 = 2;
+ DestroySprite(&gSprites[EWRAM_1000.unk1]);
+ MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19);
+ sub_806D538(0, 0);
+ SwitchTaskToFollowupFunc(EWRAM_1000.unk0);
+}