summaryrefslogtreecommitdiff
path: root/src/field/field_poison.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/field/field_poison.c')
-rw-r--r--src/field/field_poison.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/field/field_poison.c b/src/field/field_poison.c
new file mode 100644
index 000000000..1244b9c62
--- /dev/null
+++ b/src/field/field_poison.c
@@ -0,0 +1,143 @@
+#include "global.h"
+#include "field_poison.h"
+#include "field_message_box.h"
+#include "fldeff_80C5CD4.h"
+#include "pokemon.h"
+#include "pokemon_summary_screen.h"
+#include "script.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+
+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 ExecuteWhiteOut(void)
+{
+ CreateTask(Task_WhiteOut, 0x50);
+ ScriptContext1_Stop();
+}
+
+s32 DoPoisonFieldEffect(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;
+}