diff options
author | YamaArashi <YamaArashi@users.noreply.github.com> | 2017-04-17 13:58:13 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-17 13:58:13 -0700 |
commit | e91684cbbf5c76a37497d260040f06c96116bd2c (patch) | |
tree | 0a6137dfd8c3eead029f9465aee9f8b837be82df | |
parent | 6dee81ffd3c5d3613dcac6c36fcfc26d8eeea290 (diff) | |
parent | 4a6035a14c916be794890054556529ae5300a0b4 (diff) |
Merge pull request #246 from marijnvdwerf/decompile/fldeff-softboiled
Decompile fldeff_softboiled
-rw-r--r-- | asm/fldeff_softboiled.s | 318 | ||||
-rw-r--r-- | include/asm.inc.h | 59 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/fldeff_softboiled.c | 166 |
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); +} |