summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiegoisawesome <Diegoisawesome@users.noreply.github.com>2017-12-01 11:32:01 -0600
committerGitHub <noreply@github.com>2017-12-01 11:32:01 -0600
commit0250aefb73a995a6812a657193abeb96eb34d489 (patch)
tree90c7868689507a6c189e1fc01c4d553f5776d843
parent54da96309186b98263b4434911e1c5b8d4b4e3ec (diff)
parent921011592cbe9018f558b7977525e49252274947 (diff)
Merge pull request #118 from PikalaxALT/field_poison
Decompile field poison
-rw-r--r--asm/field_poison.s323
-rw-r--r--asm/fldeff_80F9BCC.s16
-rw-r--r--include/battle.h1
-rw-r--r--include/battle_frontier_2.h1
-rw-r--r--include/field_poison.h19
-rw-r--r--include/fldeff_80F9BCC.h1
-rw-r--r--include/party_menu.h10
-rw-r--r--include/pokenav.h6
-rw-r--r--include/strings.h1
-rw-r--r--ld_script.txt2
-rw-r--r--src/field_poison.c148
11 files changed, 196 insertions, 332 deletions
diff --git a/asm/field_poison.s b/asm/field_poison.s
deleted file mode 100644
index 83262a1a5..000000000
--- a/asm/field_poison.s
+++ /dev/null
@@ -1,323 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_80F9568
-sub_80F9568: @ 80F9568
- push {lr}
- movs r1, 0x41
- bl GetMonData
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0
- beq _080F9580
- movs r0, 0xCE
- lsls r0, 1
- cmp r1, r0
- bne _080F9584
-_080F9580:
- movs r0, 0
- b _080F9586
-_080F9584:
- movs r0, 0x1
-_080F9586:
- pop {r1}
- bx r1
- thumb_func_end sub_80F9568
-
- thumb_func_start sub_80F958C
-sub_80F958C: @ 80F958C
- push {r4,r5,lr}
- ldr r4, =gPlayerParty
- movs r5, 0
-_080F9592:
- adds r0, r4, 0
- bl sub_80F9568
- cmp r0, 0
- beq _080F95B0
- adds r0, r4, 0
- movs r1, 0x39
- bl GetMonData
- cmp r0, 0
- beq _080F95B0
- movs r0, 0
- b _080F95BA
- .pool
-_080F95B0:
- adds r5, 0x1
- adds r4, 0x64
- cmp r5, 0x5
- ble _080F9592
- movs r0, 0x1
-_080F95BA:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_80F958C
-
- thumb_func_start sub_80F95C0
-sub_80F95C0: @ 80F95C0
- 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, =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, =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
- .pool
- thumb_func_end sub_80F95C0
-
- thumb_func_start sub_80F960C
-sub_80F960C: @ 80F960C
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x64
- muls r1, r0
- ldr r0, =gPlayerParty
- adds r4, r1, r0
- adds r0, r4, 0
- bl sub_80F9568
- cmp r0, 0
- beq _080F964C
- adds r0, r4, 0
- movs r1, 0x39
- bl GetMonData
- cmp r0, 0
- bne _080F964C
- adds r0, r4, 0
- movs r1, 0x37
- bl GetMonData
- bl pokemon_ailments_get_primary
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080F964C
- movs r0, 0x1
- b _080F964E
- .pool
-_080F964C:
- movs r0, 0
-_080F964E:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_80F960C
-
- thumb_func_start sub_80F9654
-sub_80F9654: @ 80F9654
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r0, r6, 2
- adds r0, r6
- lsls r0, 3
- ldr r1, =gTasks + 0x8
- adds r4, r0, r1
- movs r0, 0
- ldrsh r5, [r4, r0]
- cmp r5, 0x1
- beq _080F96AE
- cmp r5, 0x1
- bgt _080F967C
- cmp r5, 0
- beq _080F9682
- b _080F9722
- .pool
-_080F967C:
- cmp r5, 0x2
- beq _080F96C0
- b _080F9722
-_080F9682:
- ldrh r1, [r4, 0x2]
- movs r2, 0x2
- ldrsh r0, [r4, r2]
- cmp r0, 0x5
- bgt _080F96A8
-_080F968C:
- lsls r0, r1, 24
- lsrs r0, 24
- bl sub_80F960C
- cmp r0, 0
- bne _080F96FC
- 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 _080F968C
-_080F96A8:
- movs r0, 0x2
- strh r0, [r4]
- b _080F9722
-_080F96AE:
- bl IsFieldMessageBoxHidden
- lsls r0, 24
- cmp r0, 0
- beq _080F9722
- ldrh r0, [r4]
- subs r0, 0x1
- strh r0, [r4]
- b _080F9722
-_080F96C0:
- bl sub_80F958C
- adds r1, r0, 0
- cmp r1, 0
- beq _080F9714
- bl InBattlePyramid
- adds r4, r0, 0
- bl InBattlePike
- orrs r4, r0
- lsls r4, 24
- cmp r4, 0
- bne _080F96E6
- bl sub_81D5C18
- lsls r0, 24
- cmp r0, 0
- beq _080F96F0
-_080F96E6:
- ldr r0, =gSpecialVar_Result
- strh r5, [r0]
- b _080F9718
- .pool
-_080F96F0:
- ldr r1, =gSpecialVar_Result
- movs r0, 0x1
- strh r0, [r1]
- b _080F9718
- .pool
-_080F96FC:
- ldrb r0, [r4, 0x2]
- bl sub_80F95C0
- ldr r0, =gText_PkmnFainted3
- bl ShowFieldMessage
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _080F9722
- .pool
-_080F9714:
- ldr r0, =gSpecialVar_Result
- strh r1, [r0]
-_080F9718:
- bl EnableBothScriptContexts
- adds r0, r6, 0
- bl DestroyTask
-_080F9722:
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_80F9654
-
- thumb_func_start sub_80F972C
-sub_80F972C: @ 80F972C
- push {lr}
- ldr r0, =sub_80F9654
- movs r1, 0x50
- bl CreateTask
- bl ScriptContext1_Stop
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_80F972C
-
- thumb_func_start overworld_poison
-overworld_poison: @ 80F9744
- push {r4-r7,lr}
- sub sp, 0x4
- ldr r4, =gPlayerParty
- movs r7, 0
- movs r6, 0
- movs r5, 0x5
-_080F9750:
- adds r0, r4, 0
- movs r1, 0x5
- bl GetMonData
- cmp r0, 0
- beq _080F9794
- adds r0, r4, 0
- movs r1, 0x37
- bl GetMonData
- bl pokemon_ailments_get_primary
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080F9794
- adds r0, r4, 0
- movs r1, 0x39
- bl GetMonData
- str r0, [sp]
- cmp r0, 0
- beq _080F9786
- subs r0, 0x1
- str r0, [sp]
- cmp r0, 0
- bne _080F9788
-_080F9786:
- adds r6, 0x1
-_080F9788:
- adds r0, r4, 0
- movs r1, 0x39
- mov r2, sp
- bl SetMonData
- adds r7, 0x1
-_080F9794:
- adds r4, 0x64
- subs r5, 0x1
- cmp r5, 0
- bge _080F9750
- cmp r6, 0
- bne _080F97A4
- cmp r7, 0
- beq _080F97A8
-_080F97A4:
- bl overworld_posion_effect
-_080F97A8:
- cmp r6, 0
- beq _080F97B4
- movs r0, 0x2
- b _080F97BE
- .pool
-_080F97B4:
- cmp r7, 0
- bne _080F97BC
- movs r0, 0
- b _080F97BE
-_080F97BC:
- movs r0, 0x1
-_080F97BE:
- 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/asm/fldeff_80F9BCC.s b/asm/fldeff_80F9BCC.s
index efdc114a2..369bef809 100644
--- a/asm/fldeff_80F9BCC.s
+++ b/asm/fldeff_80F9BCC.s
@@ -2200,8 +2200,8 @@ _080FAE2A:
.pool
thumb_func_end sub_80FADE4
- thumb_func_start task50_overworld_posion_effect
-task50_overworld_posion_effect: @ 80FAE38
+ thumb_func_start task50_overworld_poison_effect
+task50_overworld_poison_effect: @ 80FAE38
push {lr}
lsls r0, 24
lsrs r2, r0, 24
@@ -2260,25 +2260,25 @@ _080FAE92:
_080FAEA2:
pop {r0}
bx r0
- thumb_func_end task50_overworld_posion_effect
+ thumb_func_end task50_overworld_poison_effect
- thumb_func_start overworld_posion_effect
-overworld_posion_effect: @ 80FAEA8
+ thumb_func_start overworld_poison_effect
+overworld_poison_effect: @ 80FAEA8
push {lr}
movs r0, 0x4F
bl PlaySE
- ldr r0, =task50_overworld_posion_effect
+ ldr r0, =task50_overworld_poison_effect
movs r1, 0x50
bl CreateTask
pop {r0}
bx r0
.pool
- thumb_func_end overworld_posion_effect
+ thumb_func_end overworld_poison_effect
thumb_func_start c3_80A0DD8_is_running
c3_80A0DD8_is_running: @ 80FAEC0
push {lr}
- ldr r0, =task50_overworld_posion_effect
+ ldr r0, =task50_overworld_poison_effect
bl FuncIsActiveTask
lsls r0, 24
lsrs r0, 24
diff --git a/include/battle.h b/include/battle.h
index c172cb0f6..3f39db374 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -88,6 +88,7 @@
#define BATTLE_OUTCOME_BIT_x80 0x80
+#define STATUS_NONE 0x0
#define STATUS_SLEEP 0x7
#define STATUS_POISON 0x8
#define STATUS_BURN 0x10
diff --git a/include/battle_frontier_2.h b/include/battle_frontier_2.h
index 4f37248cc..801c3f3ec 100644
--- a/include/battle_frontier_2.h
+++ b/include/battle_frontier_2.h
@@ -5,5 +5,6 @@ void sub_81A8934(u8);
void sub_81A895C(void);
u16 sub_81A89A0(u8);
void sub_81A8AF8(void);
+bool8 InBattlePike(void);
#endif // GUARD_BATTLE_FRONTIER_2_H
diff --git a/include/field_poison.h b/include/field_poison.h
new file mode 100644
index 000000000..d1a4c823b
--- /dev/null
+++ b/include/field_poison.h
@@ -0,0 +1,19 @@
+#ifndef GUARD_FIELD_POISON_H
+#define GUARD_FIELD_POISON_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);
+
+#endif //GUARD_FIELD_POISON_H
diff --git a/include/fldeff_80F9BCC.h b/include/fldeff_80F9BCC.h
index ecce04943..d57665c68 100644
--- a/include/fldeff_80F9BCC.h
+++ b/include/fldeff_80F9BCC.h
@@ -9,5 +9,6 @@
void sub_80FA5E4(s16 id, s16 x, s16 y);
void sub_80FA794(s16 x, s16 y);
+void overworld_poison_effect(void);
#endif //GUARD_FLDEFF_80F9BCC_H
diff --git a/include/party_menu.h b/include/party_menu.h
index 7a7d59cd0..c787bafb1 100644
--- a/include/party_menu.h
+++ b/include/party_menu.h
@@ -1,8 +1,18 @@
#ifndef GUARD_PARTY_MENU_H
#define GUARD_PARTY_MENU_H
+enum {
+ AILMENT_NONE,
+ AILMENT_PSN,
+ AILMENT_PRZ,
+ AILMENT_SLP,
+ AILMENT_FRZ,
+ AILMENT_BRN
+};
+
bool8 pokemon_has_move(struct Pokemon *, u16);
void sub_81B58A8(void);
void DoWallyTutorialBagMenu(void);
+u8 pokemon_ailments_get_primary(u32 status);
#endif // GUARD_PARTY_MENU_H
diff --git a/include/pokenav.h b/include/pokenav.h
new file mode 100644
index 000000000..06676610a
--- /dev/null
+++ b/include/pokenav.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_POKENAV_H
+#define GUARD_POKENAV_H
+
+bool8 sub_81D5C18(void);
+
+#endif //GUARD_POKENAV_H
diff --git a/include/strings.h b/include/strings.h
index a32ba4c83..a2745d382 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -82,6 +82,7 @@ extern const u8 gText_NoRegistry[];
extern const u8 gText_OkayToDeleteFromRegistry[];
extern const u8 gText_RegisteredDataDeleted[];
extern const u8 gUnknown_085EA79D[];
+extern const u8 gText_PkmnFainted3[];
extern const u8 gText_Coins[];
#endif //GUARD_STRINGS_H
diff --git a/ld_script.txt b/ld_script.txt
index cf7b38ec1..e71b63e6c 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -151,7 +151,7 @@ SECTIONS {
src/tv.o(.text);
asm/contest_link_80F57C4.o(.text);
asm/script_pokemon_util_80F87D8.o(.text);
- asm/field_poison.o(.text);
+ src/field_poison.o(.text);
src/pokemon_size_record.o(.text);
asm/fldeff_80F9BCC.o(.text);
src/field_special_scene.o(.text);
diff --git a/src/field_poison.c b/src/field_poison.c
new file mode 100644
index 000000000..d953ab29c
--- /dev/null
+++ b/src/field_poison.c
@@ -0,0 +1,148 @@
+#include "global.h"
+#include "string_util.h"
+#include "party_menu.h"
+#include "species.h"
+#include "task.h"
+#include "field_message_box.h"
+#include "strings.h"
+#include "rom_818CFC8.h"
+#include "battle_frontier_2.h"
+#include "pokenav.h"
+#include "event_data.h"
+#include "script.h"
+#include "battle.h"
+#include "fldeff_80F9BCC.h"
+#include "field_poison.h"
+
+static bool32 sub_80F9568(struct Pokemon *pokemon)
+{
+ u16 species = GetMonData(pokemon, MON_DATA_SPECIES2);
+ if (species == SPECIES_NONE || species == SPECIES_EGG)
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool32 sub_80F958C(void)
+{
+ int i;
+ struct Pokemon *pokemon;
+
+ for (pokemon = gPlayerParty, i = 0; i < PARTY_SIZE; i++, pokemon++)
+ {
+ if (sub_80F9568(pokemon) && GetMonData(pokemon, MON_DATA_HP) != 0)
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void sub_80F95C0(u8 partyIdx)
+{
+ struct Pokemon *pokemon = gPlayerParty + partyIdx;
+ unsigned int status = STATUS_NONE;
+ AdjustFriendship(pokemon, 0x07);
+ SetMonData(pokemon, MON_DATA_STATUS, &status);
+ GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);
+ StringGetEnd10(gStringVar1);
+}
+
+static bool32 sub_80F960C(u8 partyIdx)
+{
+ struct Pokemon *pokemon = gPlayerParty + partyIdx;
+ if (sub_80F9568(pokemon) && GetMonData(pokemon, MON_DATA_HP) == 0 && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_80F9654(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ switch (data[0])
+ {
+ case 0:
+ for (; data[1] < PARTY_SIZE; data[1]++)
+ {
+ if (sub_80F960C(data[1]))
+ {
+ sub_80F95C0(data[1]);
+ ShowFieldMessage(gText_PkmnFainted3);
+ data[0]++;
+ return;
+ }
+ }
+ data[0] = 2;
+ break;
+ case 1:
+ if (IsFieldMessageBoxHidden())
+ {
+ data[0]--;
+ }
+ break;
+ case 2:
+ if (sub_80F958C())
+ {
+ if (InBattlePyramid() | InBattlePike() || sub_81D5C18())
+ {
+ gSpecialVar_Result = 2;
+ }
+ else
+ {
+ gSpecialVar_Result = 1;
+ }
+ }
+ else
+ {
+ gSpecialVar_Result = 0;
+ }
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+void sub_80F972C(void)
+{
+ CreateTask(sub_80F9654, 80);
+ ScriptContext1_Stop();
+}
+
+unsigned int overworld_poison(void)
+{
+ int i;
+ unsigned int hp;
+ struct Pokemon *pokemon = gPlayerParty;
+ unsigned int numPoisoned = 0;
+ unsigned int numFainted = 0;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(pokemon, MON_DATA_SANITY_BIT2) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
+ {
+ hp = GetMonData(pokemon, MON_DATA_HP);
+ if (hp == 0 || --hp == 0)
+ {
+ numFainted++;
+ }
+ SetMonData(pokemon, MON_DATA_HP, &hp);
+ numPoisoned++;
+ }
+ pokemon++;
+ }
+ if (numFainted != 0 || numPoisoned != 0)
+ {
+ overworld_poison_effect();
+ }
+ if (numFainted != 0)
+ {
+ return FLDPSN_FNT;
+ }
+ if (numPoisoned != 0)
+ {
+ return FLDPSN_PSN;
+ }
+ return FLDPSN_NONE;
+}