diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2016-10-30 20:30:32 -0500 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2016-10-30 18:30:32 -0700 |
commit | 506cb08c794af5511026281a2b806ac351a59997 (patch) | |
tree | a504d793b25e7d58d5697b4068d6040618d55603 | |
parent | 3e311cb329269df4816583b840dbb7fed145a9ce (diff) |
decompile field_posion.c (#79)
* start decompiling field_poison.c
* finish decompiling
-rw-r--r-- | asm/field_poison.s | 317 | ||||
-rw-r--r-- | data/event_scripts.s | 2 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/field_poison.c | 144 |
4 files changed, 146 insertions, 319 deletions
diff --git a/asm/field_poison.s b/asm/field_poison.s deleted file mode 100644 index c303ac5d1..000000000 --- a/asm/field_poison.s +++ /dev/null @@ -1,317 +0,0 @@ - .include "constants/gba_constants.inc" - .include "constants/species_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start CheckMonIsValid -CheckMonIsValid: @ 80C5684 - push {lr} - movs r1, 0x41 - bl GetMonData - lsls r0, 16 - lsrs r1, r0, 16 - cmp r1, 0 - beq _080C569C - movs r0, 0xCE - lsls r0, 1 - cmp r1, r0 - bne _080C56A0 -_080C569C: - movs r0, 0 - b _080C56A2 -_080C56A0: - movs r0, 0x1 -_080C56A2: - pop {r1} - bx r1 - thumb_func_end CheckMonIsValid - - thumb_func_start CheckMonFainted -CheckMonFainted: @ 80C56A8 - push {r4,r5,lr} - ldr r4, _080C56C8 @ =gPlayerParty - movs r5, 0 -_080C56AE: - adds r0, r4, 0 - bl CheckMonIsValid - cmp r0, 0 - beq _080C56CC - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _080C56CC - movs r0, 0 - b _080C56D6 - .align 2, 0 -_080C56C8: .4byte gPlayerParty -_080C56CC: - adds r5, 0x1 - adds r4, 0x64 - cmp r5, 0x5 - ble _080C56AE - movs r0, 0x1 -_080C56D6: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end CheckMonFainted - - thumb_func_start MonFaintFromPoisonOnField -MonFaintFromPoisonOnField: @ 80C56DC - 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, _080C5720 @ =gPlayerParty - adds r4, r0 - movs r0, 0 - str r0, [sp] - adds r0, r4, 0 - movs r1, 0x7 - bl AdjustFriendship - adds r0, r4, 0 - movs r1, 0x37 - mov r2, sp - bl SetMonData - ldr r5, _080C5724 @ =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 -_080C5720: .4byte gPlayerParty -_080C5724: .4byte gStringVar1 - thumb_func_end MonFaintFromPoisonOnField - - thumb_func_start CheckMonFaintedFromPoison -CheckMonFaintedFromPoison: @ 80C5728 - push {r4,lr} - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x64 - muls r1, r0 - ldr r0, _080C5764 @ =gPlayerParty - adds r4, r1, r0 - adds r0, r4, 0 - bl CheckMonIsValid - cmp r0, 0 - beq _080C5768 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - bne _080C5768 - adds r0, r4, 0 - movs r1, 0x37 - bl GetMonData - bl pokemon_ailments_get_primary - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080C5768 - movs r0, 0x1 - b _080C576A - .align 2, 0 -_080C5764: .4byte gPlayerParty -_080C5768: - movs r0, 0 -_080C576A: - pop {r4} - pop {r1} - bx r1 - thumb_func_end CheckMonFaintedFromPoison - - thumb_func_start Task_WhiteOut -Task_WhiteOut: @ 80C5770 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - ldr r1, _080C5794 @ =gTasks + 0x8 - adds r4, r0, r1 - movs r1, 0 - ldrsh r0, [r4, r1] - cmp r0, 0x1 - beq _080C57CA - cmp r0, 0x1 - bgt _080C5798 - cmp r0, 0 - beq _080C579E - b _080C581A - .align 2, 0 -_080C5794: .4byte gTasks + 0x8 -_080C5798: - cmp r0, 0x2 - beq _080C57DC - b _080C581A -_080C579E: - ldrh r1, [r4, 0x2] - movs r2, 0x2 - ldrsh r0, [r4, r2] - cmp r0, 0x5 - bgt _080C57C4 -_080C57A8: - lsls r0, r1, 24 - lsrs r0, 24 - bl CheckMonFaintedFromPoison - cmp r0, 0 - bne _080C57F4 - 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 _080C57A8 -_080C57C4: - movs r0, 0x2 - strh r0, [r4] - b _080C581A -_080C57CA: - bl IsFieldMessageBoxHidden - lsls r0, 24 - cmp r0, 0 - beq _080C581A - ldrh r0, [r4] - subs r0, 0x1 - strh r0, [r4] - b _080C581A -_080C57DC: - bl CheckMonFainted - adds r1, r0, 0 - cmp r1, 0 - beq _080C580C - ldr r1, _080C57F0 @ =gScriptResult - movs r0, 0x1 - strh r0, [r1] - b _080C5810 - .align 2, 0 -_080C57F0: .4byte gScriptResult -_080C57F4: - ldrb r0, [r4, 0x2] - bl MonFaintFromPoisonOnField - ldr r0, _080C5808 @ =UnknownString_81A1132 - bl ShowFieldMessage - ldrh r0, [r4] - adds r0, 0x1 - strh r0, [r4] - b _080C581A - .align 2, 0 -_080C5808: .4byte UnknownString_81A1132 -_080C580C: - ldr r0, _080C5820 @ =gScriptResult - strh r1, [r0] -_080C5810: - bl EnableBothScriptContexts - adds r0, r5, 0 - bl DestroyTask -_080C581A: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080C5820: .4byte gScriptResult - thumb_func_end Task_WhiteOut - - thumb_func_start DoWhiteOut -DoWhiteOut: @ 80C5824 - push {lr} - ldr r0, _080C5838 @ =Task_WhiteOut - movs r1, 0x50 - bl CreateTask - bl ScriptContext1_Stop - pop {r0} - bx r0 - .align 2, 0 -_080C5838: .4byte Task_WhiteOut - thumb_func_end DoWhiteOut - - thumb_func_start overworld_poison -overworld_poison: @ 80C583C - push {r4-r7,lr} - sub sp, 0x4 - ldr r4, _080C58A8 @ =gPlayerParty - movs r7, 0 - movs r6, 0 - movs r5, 0x5 -_080C5848: - adds r0, r4, 0 - movs r1, 0x5 - bl GetMonData - cmp r0, 0 - beq _080C588C - adds r0, r4, 0 - movs r1, 0x37 - bl GetMonData - bl pokemon_ailments_get_primary - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080C588C - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - str r0, [sp] - cmp r0, 0 - beq _080C587E - subs r0, 0x1 - str r0, [sp] - cmp r0, 0 - bne _080C5880 -_080C587E: - adds r6, 0x1 -_080C5880: - adds r0, r4, 0 - movs r1, 0x39 - mov r2, sp - bl SetMonData - adds r7, 0x1 -_080C588C: - adds r4, 0x64 - subs r5, 0x1 - cmp r5, 0 - bge _080C5848 - cmp r6, 0 - bne _080C589C - cmp r7, 0 - beq _080C58A0 -_080C589C: - bl DoFieldPoisonEffect -_080C58A0: - cmp r6, 0 - beq _080C58AC - movs r0, 0x2 - b _080C58B6 - .align 2, 0 -_080C58A8: .4byte gPlayerParty -_080C58AC: - cmp r7, 0 - bne _080C58B4 - movs r0, 0 - b _080C58B6 -_080C58B4: - movs r0, 0x1 -_080C58B6: - 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/event_scripts.s b/data/event_scripts.s index 79104d56a..4289b6e8c 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -3193,7 +3193,7 @@ RustboroCity_DevonCorp_2F_Text_1A1102:: @ 81A1102 .string "Want to give a nickname to the\n" .string "{STR_VAR_2} you received?$" -UnknownString_81A1132:: @ 81A1132 +fieldPoisonText_PokemonFainted:: @ 81A1132 .string "{STR_VAR_1} fainted...\p$" UnknownString_81A1141: @ 81A1141 diff --git a/ld_script.txt b/ld_script.txt index 6ec547f12..d53500236 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -129,7 +129,7 @@ SECTIONS { asm/tv.o(.text); asm/contest_link_80C2020.o(.text); asm/script_pokemon_util_80C4BF0.o(.text); - asm/field_poison.o(.text); + src/field_poison.o(.text); asm/big_shroomish_barboach.o(.text); asm/fldeff_80C5CD4.o(.text); src/truck_scene.o(.text); diff --git a/src/field_poison.c b/src/field_poison.c new file mode 100644 index 000000000..a51fe5546 --- /dev/null +++ b/src/field_poison.c @@ -0,0 +1,144 @@ +#include "global.h" +#include "field_message_box.h" +#include "pokemon.h" +#include "script.h" +#include "string_util.h" +#include "task.h" + +extern void AdjustFriendship(struct Pokemon *, u8); +extern u8 pokemon_ailments_get_primary(u32); +extern void DoFieldPoisonEffect(void); + +extern struct Pokemon gPlayerParty[6]; +extern u16 gScriptResult; +extern u8 fieldPoisonText_PokemonFainted[]; + +bool32 CheckMonIsValid(struct Pokemon *pkmn) +{ + // UB: Too few arguments for function 'GetMonData' + u16 species2 = GetMonData(pkmn, MON_DATA_SPECIES2); + + if (species2 == 0 || species2 == 0x19C) + return FALSE; + else + return TRUE; +} + +bool32 AllMonsFainted(void) +{ + struct Pokemon *pkmn = &gPlayerParty[0]; + int i; + + for (i = 0; i < 6; i++, pkmn++) + { + // UB: Too few arguments for function 'GetMonData' + if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) != 0) + return FALSE; + } + return TRUE; +} + +void MonFaintFromPoisonOnField(u8 partyMember) +{ + struct Pokemon *pkmn = &gPlayerParty[partyMember]; + u32 val = 0; + + AdjustFriendship(pkmn, 7); + SetMonData(pkmn, MON_DATA_STATUS, (u8*)&val); + GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1); + StringGetEnd10(gStringVar1); +} + +bool32 CheckMonFaintedFromPoison(u8 partyMember) +{ + struct Pokemon *pkmn = &gPlayerParty[partyMember]; + + // UB: Too few arguments for function 'GetMonData' + if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) == 0 + && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) + return TRUE; + else + return FALSE; +} + +//Task data +enum +{ + TD_STATE, + TD_PARTY_MEMBER, +}; + +void Task_WhiteOut(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + switch (taskData[TD_STATE]) + { + case 0: //Check if Pokemon have fainted due to poison + while (taskData[TD_PARTY_MEMBER] < 6) + { + if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER])) + { + MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]); + ShowFieldMessage(fieldPoisonText_PokemonFainted); + taskData[TD_STATE]++; + return; + } + taskData[TD_PARTY_MEMBER]++; + } + taskData[TD_STATE] = 2; + break; + case 1: //Wait for message box to disappear + if (IsFieldMessageBoxHidden()) + taskData[TD_STATE]--; //Check next party member + break; + case 2: //Done checking Pokemon + if (AllMonsFainted()) + gScriptResult = 1; + else + gScriptResult = 0; + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +void DoWhiteOut(void) +{ + CreateTask(Task_WhiteOut, 0x50); + ScriptContext1_Stop(); +} + +u8 overworld_poison(void) +{ + struct Pokemon *pkmn = &gPlayerParty[0]; + u32 numPoisoned = 0; + u32 numFainting = 0; + int i; + + for(i = 0; i < 6; i++) + { + u32 hp; + + // UB: Too few arguments for function 'GetMonData' + if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0 + && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) + { + hp = GetMonData(pkmn, MON_DATA_HP); + if(hp != 0) + hp--; + if(hp == 0) + numFainting++; //Pokemon will now faint due to poison + SetMonData(pkmn, MON_DATA_HP, (u8 *)&hp); + numPoisoned++; + } + pkmn++; + } + if(numFainting != 0 || numPoisoned != 0) + DoFieldPoisonEffect(); + if(numFainting != 0) + return 2; + if(numPoisoned != 0) + return 1; + return 0; +} |