Add OW_DEFOG_FIELD_MOVE to allow players to clear overworld Fog (#6477)

This commit is contained in:
psf 2025-04-08 10:21:32 -04:00 committed by GitHub
parent 7bf156be0e
commit 69f2f9f151
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 112 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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[];

View File

@ -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

View File

@ -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[] =

74
src/fldeff_defog.c Normal file
View File

@ -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

View File

@ -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
};