diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 0425252232..9b4cb5c7c0 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -80,6 +80,7 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_TracksBug @ FLDEFF_TRACKS_BUG .4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT .4byte gFieldEffectScript_CaveDust @ FLDEFF_CAVE_DUST + .4byte gFieldEffectScript_Defog @ FLDEFF_DEFOG gFieldEffectScript_ExclamationMarkIcon1:: field_eff_callnative FldEff_ExclamationMarkIcon @@ -379,3 +380,7 @@ gFieldEffectScript_TracksSlither:: gFieldEffectScript_CaveDust:: field_eff_loadfadedpal_callnative gSpritePalette_CaveDust FldEff_CaveDust field_eff_end + +gFieldEffectScript_Defog:: + field_eff_callnative FldEff_Defog + field_eff_end diff --git a/data/scripts/field_move_scripts.inc b/data/scripts/field_move_scripts.inc index 30393b771d..a8f8144f23 100644 --- a/data/scripts/field_move_scripts.inc +++ b/data/scripts/field_move_scripts.inc @@ -418,3 +418,20 @@ EventScript_FailSweetScent:: Text_FailSweetScent: .string "Looks like there's nothing here…$" + +EventScript_UseDefog:: + lockall + bufferpartymonnick STR_VAR_1, VAR_RESULT + buffermovename STR_VAR_2, MOVE_DEFOG + msgbox Text_MonUsedFieldMove, MSGBOX_DEFAULT + closemessage + isfollowerfieldmoveuser VAR_0x8004 + setfieldeffectargument 3, VAR_0x8004 @ skip pose if so + setflag FLAG_SAFE_FOLLOWER_MOVEMENT + call_if_eq VAR_0x8004, TRUE, EventScript_FollowerFieldMove + waitmovement 0 + setfieldeffectargument 0, VAR_RESULT + dofieldeffect FLDEFF_DEFOG + waitstate + releaseall + end diff --git a/include/config/overworld.h b/include/config/overworld.h index 35a90407b9..820c4a5d9b 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -10,6 +10,7 @@ #define OW_DOUBLE_APPROACH_WITH_ONE_MON FALSE // If enabled, you can be spotted by two trainers at the same time even if you only have one eligible Pokémon in your party. #define OW_HIDE_REPEAT_MAP_POPUP FALSE // If enabled, map popups will not appear if entering a map with the same Map Section Id as the last. #define OW_FRLG_WHITEOUT FALSE // If enabled, shows an additional whiteout message and post whiteout event script with healing NPC. +#define OW_DEFOG_FIELD_MOVE FALSE // If enabled, Defog can be used as a Field Move as seen in DPPt. // Item Obtain Description Box #define OW_ITEM_DESCRIPTIONS_OFF 0 // never show descriptions diff --git a/include/constants/field_effects.h b/include/constants/field_effects.h index 48406195f0..6c64572c21 100644 --- a/include/constants/field_effects.h +++ b/include/constants/field_effects.h @@ -76,6 +76,7 @@ #define FLDEFF_TRACKS_SPOT 71 #define FLDEFF_TRACKS_BUG 72 #define FLDEFF_CAVE_DUST 73 +#define FLDEFF_DEFOG 74 #define FLDEFFOBJ_SHADOW_S 0 #define FLDEFFOBJ_SHADOW_M 1 diff --git a/include/event_scripts.h b/include/event_scripts.h index 772a7a955d..b10a4d602b 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -407,6 +407,7 @@ extern const u8 EventScript_UseCut[]; extern const u8 EventScript_UseRockSmash[]; extern const u8 EventScript_UseDig[]; extern const u8 EventScript_UseCutGrass[]; +extern const u8 EventScript_UseDefog[]; //player pc extern const u8 LittlerootTown_BrendansHouse_2F_EventScript_TurnOffPlayerPC[]; diff --git a/include/fldeff.h b/include/fldeff.h index f676720ede..822c6ffbec 100644 --- a/include/fldeff.h +++ b/include/fldeff.h @@ -51,4 +51,8 @@ u8 CreateFieldMoveTask(void); bool8 SetUpFieldMove_RockSmash(void); bool8 FldEff_UseRockSmash(void); +// defog +bool8 SetUpFieldMove_Defog(void); +bool8 FldEff_Defog(void); + #endif // GUARD_FLDEFF_H diff --git a/src/data/party_menu.h b/src/data/party_menu.h index ec7026fcb5..30f65f7f9e 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -799,6 +799,9 @@ static const u16 sFieldMoves[FIELD_MOVES_COUNT + 1] = [FIELD_MOVE_MILK_DRINK] = MOVE_MILK_DRINK, [FIELD_MOVE_SOFT_BOILED] = MOVE_SOFT_BOILED, [FIELD_MOVE_SWEET_SCENT] = MOVE_SWEET_SCENT, +#if OW_DEFOG_FIELD_MOVE == TRUE + [FIELD_MOVE_DEFOG] = MOVE_DEFOG, +#endif // NOTE: This value is used as the terminal value for the table. There's no reason to do this, as the size of the table is known. // Whichever move shares this value (MOVE_SWORDS_DANCE by default) if present will be treated as the end of the array rather than a field move. [FIELD_MOVES_COUNT] = FIELD_MOVES_COUNT @@ -824,6 +827,9 @@ struct [FIELD_MOVE_MILK_DRINK] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, [FIELD_MOVE_SOFT_BOILED] = {SetUpFieldMove_SoftBoiled, PARTY_MSG_NOT_ENOUGH_HP}, [FIELD_MOVE_SWEET_SCENT] = {SetUpFieldMove_SweetScent, PARTY_MSG_CANT_USE_HERE}, +#if OW_DEFOG_FIELD_MOVE == TRUE + [FIELD_MOVE_DEFOG] = {SetUpFieldMove_Defog, PARTY_MSG_CANT_USE_HERE}, +#endif }; static const u8 *const sUnionRoomTradeMessages[] = diff --git a/src/fldeff_defog.c b/src/fldeff_defog.c new file mode 100644 index 0000000000..bccf0d65f7 --- /dev/null +++ b/src/fldeff_defog.c @@ -0,0 +1,74 @@ +#include "global.h" +#include "event_data.h" +#include "event_scripts.h" +#include "field_effect.h" +#include "field_weather.h" +#include "fldeff.h" +#include "palette.h" +#include "party_menu.h" +#include "script.h" +#include "sound.h" +#include "task.h" +#include "util.h" +#include "constants/battle_anim.h" +#include "constants/field_effects.h" +#include "constants/songs.h" +#include "constants/weather.h" + +static void FieldCallback_Defog(void); +static void FieldMove_Defog(void); +static void EndDefogTask(u8 taskId); + +bool8 SetUpFieldMove_Defog(void) +{ + if (gWeather.currWeather != WEATHER_FOG_HORIZONTAL && gWeather.currWeather != WEATHER_FOG_DIAGONAL) + return FALSE; + + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_Defog; + return TRUE; +} + +static void FieldCallback_Defog(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + ScriptContext_SetupScript(EventScript_UseDefog); +} + +bool8 FldEff_Defog(void) +{ + u8 taskId = CreateFieldMoveTask(); + + gTasks[taskId].data[8] = (uintptr_t)FieldMove_Defog>> 16; + gTasks[taskId].data[9] = (uintptr_t)FieldMove_Defog; + return FALSE; +} + +#define tFrameCount data[0] + +static void FieldMove_Defog(void) +{ + PlaySE12WithPanning(SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER); + SetWeatherScreenFadeOut(); + FieldEffectActiveListRemove(FLDEFF_DEFOG); + SetWeather(WEATHER_NONE); + u32 taskId = CreateTask(EndDefogTask, 0); + gTasks[taskId].tFrameCount = 0; +}; + +static void EndDefogTask(u8 taskId) +{ + if (gPaletteFade.active) + return; + + gTasks[taskId].tFrameCount++; + + if (gTasks[taskId].tFrameCount != 120) + return; + + gWeatherPtr->currWeather = WEATHER_NONE; + DestroyTask(taskId); + ScriptContext_Enable(); +} + +#undef tFrameCount diff --git a/src/party_menu.c b/src/party_menu.c index 9a74a466e1..8a3da4c1f2 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -144,6 +144,9 @@ enum { FIELD_MOVE_MILK_DRINK, FIELD_MOVE_SOFT_BOILED, FIELD_MOVE_SWEET_SCENT, +#if OW_DEFOG_FIELD_MOVE == TRUE + FIELD_MOVE_DEFOG, +#endif FIELD_MOVES_COUNT };