summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCameron Hall <camthesaxman@users.noreply.github.com>2016-10-30 20:30:32 -0500
committerYamaArashi <YamaArashi@users.noreply.github.com>2016-10-30 18:30:32 -0700
commit506cb08c794af5511026281a2b806ac351a59997 (patch)
treea504d793b25e7d58d5697b4068d6040618d55603
parent3e311cb329269df4816583b840dbb7fed145a9ce (diff)
decompile field_posion.c (#79)
* start decompiling field_poison.c * finish decompiling
-rw-r--r--asm/field_poison.s317
-rw-r--r--data/event_scripts.s2
-rw-r--r--ld_script.txt2
-rw-r--r--src/field_poison.c144
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;
+}