diff options
author | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2019-07-03 01:34:39 +0800 |
---|---|---|
committer | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2019-07-07 01:46:05 +0800 |
commit | d97925df0edcac9212ba827b31ff75c7968703f3 (patch) | |
tree | bcea1cbd328ae08e736a94a640dce6f90104633a | |
parent | 40a808351a5b76b0a536c5fac6c9479284468af8 (diff) |
finished field_poison
-rw-r--r-- | asm/battle_setup.s | 2 | ||||
-rw-r--r-- | asm/field_control_avatar.s | 16 | ||||
-rw-r--r-- | asm/field_poison.s | 316 | ||||
-rw-r--r-- | data/map_event_scripts.inc | 2 | ||||
-rw-r--r-- | include/field_poison.h | 10 | ||||
-rw-r--r-- | include/overworld.h | 1 | ||||
-rw-r--r-- | include/safari_zone.h | 1 | ||||
-rw-r--r-- | include/strings.h | 1 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/field_poison.c | 117 |
10 files changed, 132 insertions, 336 deletions
diff --git a/asm/battle_setup.s b/asm/battle_setup.s index d3365694f..825367d05 100644 --- a/asm/battle_setup.s +++ b/asm/battle_setup.s @@ -46,7 +46,7 @@ _0807F65E: ldr r0, _0807F68C @ =sub_800FD9C bl SetMainCallback2 bl sub_806D7E8 - bl overworld_poison_timer_set + bl DoPoisonFieldEffect_timer_set adds r0, r5, 0 bl DestroyTask _0807F686: diff --git a/asm/field_control_avatar.s b/asm/field_control_avatar.s index b2f9e70bf..226f65fd7 100644 --- a/asm/field_control_avatar.s +++ b/asm/field_control_avatar.s @@ -1817,7 +1817,7 @@ _0806D6E0: .4byte gUnknown_203ADFA _0806D6E4: .4byte gPlayerAvatar _0806D6E8: .4byte gUnknown_81A8CED _0806D6EC: - bl overworld_poison_step + bl DoPoisonFieldEffect_step lsls r0, 24 lsrs r0, 24 cmp r0, 0x1 @@ -1901,8 +1901,8 @@ _0806D780: .4byte 0x00004021 _0806D784: .4byte gPlayerParty thumb_func_end AdjustFriendship_step - thumb_func_start overworld_poison_timer_set -overworld_poison_timer_set: @ 806D788 + thumb_func_start DoPoisonFieldEffect_timer_set +DoPoisonFieldEffect_timer_set: @ 806D788 push {lr} ldr r0, _0806D798 @ =0x00004022 movs r1, 0 @@ -1911,10 +1911,10 @@ overworld_poison_timer_set: @ 806D788 bx r0 .align 2, 0 _0806D798: .4byte 0x00004022 - thumb_func_end overworld_poison_timer_set + thumb_func_end DoPoisonFieldEffect_timer_set - thumb_func_start overworld_poison_step -overworld_poison_step: @ 806D79C + thumb_func_start DoPoisonFieldEffect_step +DoPoisonFieldEffect_step: @ 806D79C push {r4,lr} ldr r0, _0806D7D8 @ =gMapHeader ldrb r0, [r0, 0x17] @@ -1933,7 +1933,7 @@ overworld_poison_step: @ 806D79C lsls r0, 16 cmp r0, 0 bne _0806D7E0 - bl overworld_poison + bl DoPoisonFieldEffect cmp r0, 0x1 beq _0806D7E0 cmp r0, 0x1 @@ -1951,7 +1951,7 @@ _0806D7E2: pop {r4} pop {r1} bx r1 - thumb_func_end overworld_poison_step + thumb_func_end DoPoisonFieldEffect_step thumb_func_start sub_806D7E8 sub_806D7E8: @ 806D7E8 diff --git a/asm/field_poison.s b/asm/field_poison.s deleted file mode 100644 index 811f375c6..000000000 --- a/asm/field_poison.s +++ /dev/null @@ -1,316 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start CheckMonIsValid -CheckMonIsValid: @ 80A0460 - push {lr} - movs r1, 0x41 - bl GetMonData - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - beq _080A0478 - movs r0, 0xCE - lsls r0, 1 - cmp r1, r0 - bne _080A047C -_080A0478: - movs r0, 0 - b _080A047E -_080A047C: - movs r0, 0x1 -_080A047E: - pop {r1} - bx r1 - thumb_func_end CheckMonIsValid - - thumb_func_start AllMonsFainted -AllMonsFainted: @ 80A0484 - push {r4,r5,lr} - ldr r4, _080A04A4 @ =gPlayerParty - movs r5, 0 -_080A048A: - adds r0, r4, 0 - bl CheckMonIsValid - cmp r0, 0 - beq _080A04A8 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _080A04A8 - movs r0, 0 - b _080A04B2 - .align 2, 0 -_080A04A4: .4byte gPlayerParty -_080A04A8: - adds r5, 0x1 - adds r4, 0x64 - cmp r5, 0x5 - ble _080A048A - movs r0, 0x1 -_080A04B2: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end AllMonsFainted - - thumb_func_start MonFaintFromPoisonOnField -MonFaintFromPoisonOnField: @ 80A04B8 - push {r4,r5,lr} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x64 - adds r4, r0, 0 - muls r4, r1 - ldr r0, _080A04FC @ =gPlayerParty - adds r4, r0 - movs r0, 0 - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x8 - bl AdjustFriendship - adds r0, r4, 0 - movs r1, 0x37 - mov r2, sp - bl SetMonData - ldr r5, _080A0500 @ =gStringVar1 - adds r0, r4, 0 - movs r1, 0x2 - adds r2, r5, 0 - bl GetMonData - adds r0, r5, 0 - bl StringGetEnd10 - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080A04FC: .4byte gPlayerParty -_080A0500: .4byte gStringVar1 - thumb_func_end MonFaintFromPoisonOnField - - thumb_func_start CheckMonFaintedFromPoison -CheckMonFaintedFromPoison: @ 80A0504 - push {r4,lr} - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x64 - muls r1, r0 - ldr r0, _080A0540 @ =gPlayerParty - adds r4, r1, r0 - adds r0, r4, 0 - bl CheckMonIsValid - cmp r0, 0 - beq _080A0544 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - bne _080A0544 - adds r0, r4, 0 - movs r1, 0x37 - bl GetMonData - bl pokemon_ailments_get_primary - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080A0544 - movs r0, 0x1 - b _080A0546 - .align 2, 0 -_080A0540: .4byte gPlayerParty -_080A0544: - movs r0, 0 -_080A0546: - pop {r4} - pop {r1} - bx r1 - thumb_func_end CheckMonFaintedFromPoison - - thumb_func_start Task_WhiteOut -Task_WhiteOut: @ 80A054C - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - ldr r1, _080A0570 @ =gTasks+0x8 - adds r4, r0, r1 - movs r1, 0 - ldrsh r0, [r4, r1] - cmp r0, 0x1 - beq _080A05A6 - cmp r0, 0x1 - bgt _080A0574 - cmp r0, 0 - beq _080A057A - b _080A05F6 - .align 2, 0 -_080A0570: .4byte gTasks+0x8 -_080A0574: - cmp r0, 0x2 - beq _080A05B8 - b _080A05F6 -_080A057A: - ldrh r1, [r4, 0x2] - movs r2, 0x2 - ldrsh r0, [r4, r2] - cmp r0, 0x5 - bgt _080A05A0 -_080A0584: - lsls r0, r1, 24 - lsrs r0, 24 - bl CheckMonFaintedFromPoison - cmp r0, 0 - bne _080A05D0 - ldrh r0, [r4, 0x2] - adds r0, 0x1 - strh r0, [r4, 0x2] - adds r1, r0, 0 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x5 - ble _080A0584 -_080A05A0: - movs r0, 0x2 - strh r0, [r4] - b _080A05F6 -_080A05A6: - bl IsFieldMessageBoxHidden - lsls r0, 24 - cmp r0, 0 - beq _080A05F6 - ldrh r0, [r4] - subs r0, 0x1 - strh r0, [r4] - b _080A05F6 -_080A05B8: - bl AllMonsFainted - adds r1, r0, 0 - cmp r1, 0 - beq _080A05E8 - ldr r1, _080A05CC @ =gSpecialVar_Result - movs r0, 0x1 - strh r0, [r1] - b _080A05EC - .align 2, 0 -_080A05CC: .4byte gSpecialVar_Result -_080A05D0: - ldrb r0, [r4, 0x2] - bl MonFaintFromPoisonOnField - ldr r0, _080A05E4 @ =gUnknown_81A5476 - bl ShowFieldMessage - ldrh r0, [r4] - adds r0, 0x1 - strh r0, [r4] - b _080A05F6 - .align 2, 0 -_080A05E4: .4byte gUnknown_81A5476 -_080A05E8: - ldr r0, _080A05FC @ =gSpecialVar_Result - strh r1, [r0] -_080A05EC: - bl EnableBothScriptContexts - adds r0, r5, 0 - bl DestroyTask -_080A05F6: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080A05FC: .4byte gSpecialVar_Result - thumb_func_end Task_WhiteOut - - thumb_func_start ExecuteWhiteOut -ExecuteWhiteOut: @ 80A0600 - push {lr} - ldr r0, _080A0614 @ =Task_WhiteOut - movs r1, 0x50 - bl CreateTask - bl ScriptContext1_Stop - pop {r0} - bx r0 - .align 2, 0 -_080A0614: .4byte Task_WhiteOut - thumb_func_end ExecuteWhiteOut - - thumb_func_start overworld_poison -overworld_poison: @ 80A0618 - push {r4-r7,lr} - sub sp, 0x4 - ldr r4, _080A0684 @ =gPlayerParty - movs r7, 0 - movs r6, 0 - movs r5, 0x5 -_080A0624: - adds r0, r4, 0 - movs r1, 0x5 - bl GetMonData - cmp r0, 0 - beq _080A0668 - adds r0, r4, 0 - movs r1, 0x37 - bl GetMonData - bl pokemon_ailments_get_primary - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080A0668 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - str r0, [sp] - cmp r0, 0 - beq _080A065A - subs r0, 0x1 - str r0, [sp] - cmp r0, 0 - bne _080A065C -_080A065A: - adds r6, 0x1 -_080A065C: - adds r0, r4, 0 - movs r1, 0x39 - mov r2, sp - bl SetMonData - adds r7, 0x1 -_080A0668: - adds r4, 0x64 - subs r5, 0x1 - cmp r5, 0 - bge _080A0624 - cmp r6, 0 - bne _080A0678 - cmp r7, 0 - beq _080A067C -_080A0678: - bl FldEffPoison_Start -_080A067C: - cmp r6, 0 - beq _080A0688 - movs r0, 0x2 - b _080A0692 - .align 2, 0 -_080A0684: .4byte gPlayerParty -_080A0688: - cmp r7, 0 - bne _080A0690 - movs r0, 0 - b _080A0692 -_080A0690: - movs r0, 0x1 -_080A0692: - add sp, 0x4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end overworld_poison - - .align 2, 0 @ Don't pad with nop. diff --git a/data/map_event_scripts.inc b/data/map_event_scripts.inc index 3cf5c1ced..899ed20e6 100644 --- a/data/map_event_scripts.inc +++ b/data/map_event_scripts.inc @@ -1065,7 +1065,7 @@ Text_1A5446:: @ 81A5446 .string "Want to give a nickname to the\n" .string "{STR_VAR_2} you received?$" -gUnknown_81A5476:: @ 81A5476 +gText_PkmnFainted3:: @ 81A5476 .string "{STR_VAR_1} fainted…\p" .string "$" diff --git a/include/field_poison.h b/include/field_poison.h index fcfb71cf5..4887fa27a 100644 --- a/include/field_poison.h +++ b/include/field_poison.h @@ -3,19 +3,13 @@ #include "global.h" -// Exported type declarations - -// Exported RAM declarations - -// Exported ROM declarations - enum { FLDPSN_NONE, FLDPSN_PSN, FLDPSN_FNT }; -void sub_80F972C(void); -unsigned int overworld_poison(void); +void ExecuteWhiteOut(void); +s32 DoPoisonFieldEffect(void); #endif //GUARD_FIELD_POISON_H diff --git a/include/overworld.h b/include/overworld.h index 71625415a..60fa566f7 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -2,7 +2,6 @@ #define GUARD_ROM4_H #include "global.h" - #include "main.h" struct UnkPlayerStruct diff --git a/include/safari_zone.h b/include/safari_zone.h index c65ab7b7b..feaa93ed0 100644 --- a/include/safari_zone.h +++ b/include/safari_zone.h @@ -4,6 +4,7 @@ #include "global.h" extern u8 gNumSafariBalls; +extern u16 gSafariZoneStepCounter; bool32 GetSafariZoneFlag(void); void SetSafariZoneFlag(void); diff --git a/include/strings.h b/include/strings.h index 1aa858e82..55c178b0d 100644 --- a/include/strings.h +++ b/include/strings.h @@ -91,6 +91,7 @@ extern const u8 gText_PkmnFainted3[]; extern const u8 gText_Coins[]; extern const u8 gText_EggNickname[]; extern const u8 gText_Pokemon[]; +extern const u8 gText_PkmnFainted3[]; extern const u8 gOtherText_Use[]; extern const u8 gOtherText_Give[]; diff --git a/ld_script.txt b/ld_script.txt index 3d83fb4e6..1efef6267 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -146,7 +146,7 @@ SECTIONS { asm/naming_screen.o(.text); src/money.o(.text); asm/script_pokemon_util_80A0058.o(.text); - asm/field_poison.o(.text); + src/field_poison.o(.text); asm/pokemon_size_record.o(.text); asm/pc_screen_effect.o(.text); src/fldeff_poison.o(.text); diff --git a/src/field_poison.c b/src/field_poison.c new file mode 100644 index 000000000..eaffdb89f --- /dev/null +++ b/src/field_poison.c @@ -0,0 +1,117 @@ +#include "global.h" +#include "strings.h" +#include "task.h" +#include "field_message_box.h" +#include "script.h" +#include "string_util.h" +#include "event_data.h" +#include "fldeff.h" +#include "party_menu.h" +#include "field_poison.h" +#include "constants/species.h" +#include "constants/battle.h" + +static bool32 IsMonValidSpecies(struct Pokemon *pokemon) +{ + u16 species = GetMonData(pokemon, MON_DATA_SPECIES2); + if (species == SPECIES_NONE || species == SPECIES_EGG) + return FALSE; + return TRUE; +} + +static bool32 AllMonsFainted(void) +{ + int i; + + struct Pokemon *pokemon = gPlayerParty; + for (i = 0; i < PARTY_SIZE; i++, pokemon++) + if (IsMonValidSpecies(pokemon) && GetMonData(pokemon, MON_DATA_HP)) + return FALSE; + return TRUE; +} + +static void FaintFromFieldPoison(u8 partyIdx) +{ + struct Pokemon *pokemon = gPlayerParty + partyIdx; + u32 status = STATUS1_NONE; + AdjustFriendship(pokemon, 8); + SetMonData(pokemon, MON_DATA_STATUS, &status); + GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); + StringGetEnd10(gStringVar1); +} + +static bool32 MonFaintedFromPoison(u8 partyIdx) +{ + struct Pokemon *pokemon = gPlayerParty + partyIdx; + if (IsMonValidSpecies(pokemon) && !GetMonData(pokemon, MON_DATA_HP) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) + return TRUE; + return FALSE; +} + +static void Task_WhiteOut(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + switch (data[0]) + { + case 0: + for (; data[1] < PARTY_SIZE; data[1]++) + { + if (MonFaintedFromPoison(data[1])) + { + FaintFromFieldPoison(data[1]); + ShowFieldMessage(gText_PkmnFainted3); + data[0]++; + return; + } + } + data[0] = 2; + break; + case 1: + if (IsFieldMessageBoxHidden()) + data[0]--; + break; + case 2: + if (AllMonsFainted()) + gSpecialVar_Result = 1; + else + gSpecialVar_Result = 0; + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +void ExecuteWhiteOut(void) +{ + CreateTask(Task_WhiteOut, 80); + ScriptContext1_Stop(); +} + +s32 DoPoisonFieldEffect(void) +{ + int i; + u32 hp; + + struct Pokemon *pokemon = gPlayerParty; + u32 numPoisoned = 0; + u32 numFainted = 0; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) + { + hp = GetMonData(pokemon, MON_DATA_HP); + if (!hp || !--hp) + numFainted++; + SetMonData(pokemon, MON_DATA_HP, &hp); + numPoisoned++; + } + pokemon++; + } + if (numFainted || numPoisoned) + FldEffPoison_Start(); + if (numFainted) + return FLDPSN_FNT; + if (numPoisoned) + return FLDPSN_PSN; + return FLDPSN_NONE; +} |