Generic Starting Battle Status Variable (#4176)

* setup generic starting battle status variable, ABILITYEFFECT_SWITCH_IN_STATUSES

* fix B_ANIM_TAILWIND, assign to starting statuses, and change B_VAR_STARTING_STATUS check for only the variable and not trainers

* Update src/battle_main.c

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>

* Update src/battle_util.c

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>

* Update src/battle_util.c

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>

* style fixes

* General_Room naims play SE

* fix sText_BizarreArenaCreated

---------

Co-authored-by: ghoulslash <pokevoyager0@gmail.com>
Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
This commit is contained in:
ghoulslash 2024-02-14 04:05:37 -05:00 committed by GitHub
parent e73c58ed2e
commit ce99db0086
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 292 additions and 77 deletions

View File

@ -1028,6 +1028,10 @@ gBattleAnims_General::
.4byte General_Rainbow @ B_ANIM_RAINBOW
.4byte General_SeaOfFire @ B_ANIM_SEA_OF_FIRE
.4byte General_Swamp @ B_ANIM_SWAMP
.4byte General_TrickRoom @ B_ANIM_TRICK_ROOM
.4byte General_WonderRoom @ B_ANIM_WONDER_ROOM
.4byte General_MagicRoom @ B_ANIM_MAGIC_ROOM
.4byte General_Tailwind @ B_ANIM_TAILLWIND
.align 2
gBattleAnims_Special::
@ -1316,6 +1320,35 @@ Move_TAILWIND:
delay 1
end
General_Tailwind:
loadspritegfx ANIM_TAG_FLYING_DIRT
playsewithpan SE_M_GUST, SOUND_PAN_ATTACKER
call SetHighSpeedBg
setalpha 12, 8
createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 10, 2304, 96, 0
delay 12
playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER
createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 90, 2048, 96, 0
delay 12
playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER
createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 50, 2560, 96, 0
delay 12
playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER
createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 20, 2304, 96, 0
delay 12
playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER
createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 70, 1984, 96, 0
delay 12
createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 0, 2816, 96, 0
delay 10
createsprite gFlyingSandCrescentSpriteTemplate, ANIM_ATTACKER, 40, 60, 2560, 96, 0
waitforvisualfinish
stopsound
call UnsetHighSpeedBg
blendoff
delay 1
end
Move_ACUPRESSURE:
loadspritegfx ANIM_TAG_ACUPRESSURE
loadspritegfx ANIM_TAG_SPARK_2
@ -3303,6 +3336,8 @@ Move_DEFOG:
Move_TRICK_ROOM::
call InitRoomAnimation
General_TrickRoom:
playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET
fadetobg BG_TRICK_ROOM
waitbgfadein
delay 0x40
@ -3312,7 +3347,6 @@ Move_TRICK_ROOM::
end
InitRoomAnimation:
setalpha 8, 8
playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET
createvisualtask AnimTask_ScaleMonAndRestore, 5, -6, -6, 15, ANIM_TARGET, 1
return
@ -4932,6 +4966,8 @@ PowerSplitLaunch:
Move_WONDER_ROOM::
call InitRoomAnimation
General_WonderRoom:
playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET
fadetobg BG_WONDER_ROOM
waitbgfadein
delay 0x40
@ -5112,6 +5148,8 @@ Move_TELEKINESIS::
Move_MAGIC_ROOM::
call InitRoomAnimation
General_MagicRoom:
playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET
fadetobg BG_MAGIC_ROOM
waitbgfadein
delay 0x40

View File

@ -2534,6 +2534,10 @@ BattleScript_EffectTrickRoom::
waitanimation
printfromtable gRoomsStringIds
waitmessage B_WAIT_TIME_LONG
call BattleScript_TryRoomServiceLoop
goto BattleScript_MoveEnd
BattleScript_TryRoomServiceLoop:
savetarget
setbyte gBattlerTarget, 0
BattleScript_RoomServiceLoop:
@ -2544,7 +2548,7 @@ BattleScript_RoomServiceLoop_NextBattler:
addbyte gBattlerTarget, 0x1
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_RoomServiceLoop
restoretarget
goto BattleScript_MoveEnd
return
BattleScript_EffectWonderRoom::
BattleScript_EffectMagicRoom::
@ -5983,6 +5987,19 @@ BattleScript_SunlightFaded::
call BattleScript_ActivateWeatherAbilities
end2
BattleScript_OverworldStatusStarts::
printfromtable gStartingStatusStringIds
waitmessage B_WAIT_TIME_LONG
playanimation_var BS_ATTACKER, sB_ANIM_ARG1
call BattleScript_OverworldStatusStarts_TryActivations
end3
BattleScript_OverworldStatusStarts_TryActivations:
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SET_TRICK_ROOM, BattleScript_TryRoomServiceLoop
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SET_TAILWIND_PLAYER, BattleScript_TryTailwindAbilitiesLoop
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SET_TAILWIND_OPPONENT, BattleScript_TryTailwindAbilitiesLoop
return
BattleScript_OverworldWeatherStarts::
printfromtable gWeatherStartsStringIds
waitmessage B_WAIT_TIME_LONG

View File

@ -682,9 +682,12 @@ struct BattleStruct
} multiBuffer;
u8 wishPerishSongState;
u8 wishPerishSongBattlerId;
bool8 overworldWeatherDone;
bool8 terrainDone;
u8 isAtkCancelerForCalledMove; // Certain cases in atk canceler should only be checked once, when the original move is called, however others need to be checked the twice.
u8 overworldWeatherDone:1;
u8 startingStatusDone:1;
u8 isAtkCancelerForCalledMove:1; // Certain cases in atk canceler should only be checked once, when the original move is called, however others need to be checked the twice.
u8 terrainDone:1;
u8 startingStatus; // status to apply at battle start. defined in constants/battle.h
u8 startingStatusTimer;
u8 atkCancellerTracker;
struct BattleTvMovePoints tvMovePoints;
struct BattleTv tv;

View File

@ -54,6 +54,7 @@ extern const u8 BattleScript_DamagingWeatherContinues[];
extern const u8 BattleScript_SandStormHailSnowEnds[];
extern const u8 BattleScript_SunlightContinues[];
extern const u8 BattleScript_SunlightFaded[];
extern const u8 BattleScript_OverworldStatusStarts[];
extern const u8 BattleScript_OverworldWeatherStarts[];
extern const u8 BattleScript_OverworldTerrain[];
extern const u8 BattleScript_SideStatusWoreOff[];

View File

@ -39,6 +39,7 @@
#define ABILITYEFFECT_SWITCH_IN_TERRAIN 16
#define ABILITYEFFECT_SWITCH_IN_WEATHER 17
#define ABILITYEFFECT_OPPORTUNIST 18
#define ABILITYEFFECT_SWITCH_IN_STATUSES 19
// Special cases
#define ABILITYEFFECT_MUD_SPORT 252 // Only used if B_SPORT_TURNS >= GEN_6
#define ABILITYEFFECT_WATER_SPORT 253 // Only used if B_SPORT_TURNS >= GEN_6

View File

@ -180,8 +180,8 @@
// Var Settings
// To use the following features in scripting, replace the 0s with the var ID you're assigning it to.
// Eg: Replace with VAR_UNUSED_0x40F7 so you can use B_VAR_TERRAIN for that feature.
#define B_VAR_TERRAIN 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active.
#define B_VAR_TERRAIN_TIMER 0 // If this var has a value greater or equal than 1 field terrains will last that number of turns, otherwise they will last until they're overwritten.
#define B_VAR_STARTING_STATUS 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active.
#define B_VAR_STARTING_STATUS_TIMER 0 // If this var has a value greater or equal than 1 field terrains will last that number of turns, otherwise they will last until they're overwritten.
#define B_VAR_WILD_AI_FLAGS 0 // If not 0, you can use this var to add to default wild AI flags. NOT usable with flags above (1 << 15)
// Sky Battles

View File

@ -517,4 +517,17 @@
// Constants for Torment
#define PERMANENT_TORMENT 0xF
// Constants for B_VAR_STARTING_STATUS
// Timer value controlled by B_VAR_STARTING_STATUS_TIMER
#define STARTING_STATUS_NONE 0
#define STARTING_STATUS_ELECTRIC_TERRAIN 1
#define STARTING_STATUS_MISTY_TERRAIN 2
#define STARTING_STATUS_GRASSY_TERRAIN 3
#define STARTING_STATUS_PSYCHIC_TERRAIN 4
#define STARTING_STATUS_TRICK_ROOM 5
#define STARTING_STATUS_MAGIC_ROOM 6
#define STARTING_STATUS_WONDER_ROOM 7
#define STARTING_STATUS_TAILWIND_PLAYER 8
#define STARTING_STATUS_TAILWIND_OPPONENT 9
#endif // GUARD_CONSTANTS_BATTLE_H

View File

@ -563,6 +563,10 @@
#define B_ANIM_RAINBOW 42
#define B_ANIM_SEA_OF_FIRE 43
#define B_ANIM_SWAMP 44
#define B_ANIM_TRICK_ROOM 45
#define B_ANIM_WONDER_ROOM 46
#define B_ANIM_MAGIC_ROOM 47
#define B_ANIM_TAILWIND 48
// special animations table (gBattleAnims_Special)
#define B_ANIM_LVL_UP 0

View File

@ -703,8 +703,11 @@
#define STRINGID_SHEDITSTAIL 701
#define STRINGID_CLOAKEDINAHARSHLIGHT 702
#define STRINGID_SUPERSWEETAROMAWAFTS 703
#define STRINGID_DIMENSIONSWERETWISTED 704
#define STRINGID_BIZARREARENACREATED 705
#define STRINGID_BIZARREAREACREATED 706
#define BATTLESTRINGS_COUNT 704
#define BATTLESTRINGS_COUNT 707
// This is the string id that gBattleStringsTable starts with.
// String ids before this (e.g. STRINGID_INTROMSG) are not in the table,
@ -967,6 +970,19 @@
#define B_MSG_TERRAIN_END_GRASSY 7
#define B_MSG_TERRAIN_COUNT 8
// gStartingStatusStringIds
#define B_MSG_TERRAIN_SET_MISTY 0
#define B_MSG_TERRAIN_SET_ELECTRIC 1
#define B_MSG_TERRAIN_SET_PSYCHIC 2
#define B_MSG_TERRAIN_SET_GRASSY 3
#define B_MSG_SET_TRICK_ROOM 4
#define B_MSG_SET_MAGIC_ROOM 5
#define B_MSG_SET_WONDER_ROOM 6
#define B_MSG_SET_TAILWIND_PLAYER 7
#define B_MSG_SET_TAILWIND_OPPONENT 8
#define B_MSG_STARTING_STATUS_COUNT 9
// gWrappedStringIds
#define B_MSG_WRAPPED_BIND 0
#define B_MSG_WRAPPED_WRAP 1

View File

@ -88,7 +88,7 @@ struct Trainer
/*0x13*/ u8 trainerName[TRAINER_NAME_LENGTH + 1];
/*0x1E*/ bool8 doubleBattle:1;
bool8 mugshotEnabled:1;
u8 padding:6;
u8 startingStatus:6; // this trainer starts a battle with a given status. see include/constants/battle.h for values
/*0x1F*/ u8 mugshotColor;
/*0x20*/ u8 partySize;
};

View File

@ -3701,6 +3701,24 @@ static void DoBattleIntro(void)
gBattleStruct->overworldWeatherDone = FALSE;
SetAiLogicDataForTurn(AI_DATA); // get assumed abilities, hold effects, etc of all battlers
Ai_InitPartyStruct(); // Save mons party counts, and first 2/4 mons on the battlefield.
// Try to set a status to start the battle with
gBattleStruct->startingStatus = 0;
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && gTrainers[gTrainerBattleOpponent_B].startingStatus)
{
gBattleStruct->startingStatus = gTrainers[gTrainerBattleOpponent_B].startingStatus;
gBattleStruct->startingStatusTimer = 0; // infinite
}
else if (gTrainers[gTrainerBattleOpponent_A].startingStatus)
{
gBattleStruct->startingStatus = gTrainers[gTrainerBattleOpponent_A].startingStatus;
gBattleStruct->startingStatusTimer = 0; // infinite
}
else if (B_VAR_STARTING_STATUS != 0)
{
gBattleStruct->startingStatus = VarGet(B_VAR_STARTING_STATUS);
gBattleStruct->startingStatusTimer = VarGet(B_VAR_STARTING_STATUS_TIMER);
}
gBattleMainFunc = TryDoEventsBeforeFirstTurn;
}
break;
@ -3766,6 +3784,14 @@ static void TryDoEventsBeforeFirstTurn(void)
return;
}
if (!gBattleStruct->startingStatusDone
&& gBattleStruct->startingStatus
&& AbilityBattleEffects(ABILITYEFFECT_SWITCH_IN_STATUSES, 0, 0, ABILITYEFFECT_SWITCH_IN_STATUSES, 0) != 0)
{
gBattleStruct->startingStatusDone = TRUE;
return;
}
// Totem boosts
for (i = 0; i < gBattlersCount; i++)
{

View File

@ -559,6 +559,7 @@ static const u8 sText_PkmnSwitchedStatChanges[] = _("{B_ATK_NAME_WITH_PREFIX} sw
static const u8 sText_PkmnSurroundedWithVeilOfWater[] = _("{B_ATK_NAME_WITH_PREFIX} surrounded itself\nwith a veil of water!");
static const u8 sText_PkmnLevitatedOnElectromagnetism[] = _("{B_ATK_NAME_WITH_PREFIX} levitated on\nelectromagnetism!");
static const u8 sText_PkmnTwistedDimensions[] = _("{B_ATK_NAME_WITH_PREFIX} twisted\nthe dimensions!");
static const u8 sText_DimensionsWereTwisted[] = _("The dimensions were\ntwisted!");
static const u8 sText_PointedStonesFloat[] =_("Pointed stones float in the air\naround {B_DEF_TEAM2} team!");
static const u8 sText_CloakedInMysticalMoonlight[] =_("It became cloaked in mystical\nmoonlight!");
static const u8 sText_TrappedBySwirlingMagma[] =_("{B_DEF_NAME_WITH_PREFIX} became\ntrapped by swirling magma!");
@ -567,9 +568,11 @@ static const u8 sText_ProtectedTeam[] =_("{B_CURRENT_MOVE} protected\n{B_ATK_TEA
static const u8 sText_SharedItsGuard[] =_("{B_ATK_NAME_WITH_PREFIX} shared its\nguard with the target!");
static const u8 sText_SharedItsPower[] =_("{B_ATK_NAME_WITH_PREFIX} shared its\npower with the target!");
static const u8 sText_SwapsDefAndSpDefOfAllPkmn[] =_("It created a bizarre area in which the\nDefense and Sp. Def stats are swapped!");
static const u8 sText_BizzareAreaCreated[] =_("A bizarre area was created in which the\nDefense and Sp. Def stats are swapped!");
static const u8 sText_BecameNimble[] =_("{B_ATK_NAME_WITH_PREFIX} became nimble!");
static const u8 sText_HurledIntoTheAir[] =_("{B_DEF_NAME_WITH_PREFIX} was hurled\ninto the air!");
static const u8 sText_HeldItemsLoseEffects[] =_("It created a bizarre area in which\nPokémon's held items lose their effects!");
static const u8 sText_BizarreArenaCreated[] =_("A bizarre area was created!\nHold items lost their effects!");
static const u8 sText_FellStraightDown[] =_("{B_DEF_NAME_WITH_PREFIX} fell\nstraight down!");
static const u8 sText_TargetChangedType[] =_("{B_DEF_NAME_WITH_PREFIX} transformed\ninto the {B_BUFF1} type!");
static const u8 sText_PkmnAcquiredSimple[] =_("{B_DEF_NAME_WITH_PREFIX} acquired\nSimple!");
@ -1384,6 +1387,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
[STRINGID_PKMNSURROUNDEDWITHVEILOFWATER - BATTLESTRINGS_TABLE_START] = sText_PkmnSurroundedWithVeilOfWater,
[STRINGID_PKMNLEVITATEDONELECTROMAGNETISM - BATTLESTRINGS_TABLE_START] = sText_PkmnLevitatedOnElectromagnetism,
[STRINGID_PKMNTWISTEDDIMENSIONS - BATTLESTRINGS_TABLE_START] = sText_PkmnTwistedDimensions,
[STRINGID_DIMENSIONSWERETWISTED - BATTLESTRINGS_TABLE_START] = sText_DimensionsWereTwisted,
[STRINGID_POINTEDSTONESFLOAT - BATTLESTRINGS_TABLE_START] = sText_PointedStonesFloat,
[STRINGID_CLOAKEDINMYSTICALMOONLIGHT - BATTLESTRINGS_TABLE_START] = sText_CloakedInMysticalMoonlight,
[STRINGID_TRAPPEDBYSWIRLINGMAGMA - BATTLESTRINGS_TABLE_START] = sText_TrappedBySwirlingMagma,
@ -1392,9 +1396,11 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
[STRINGID_SHAREDITSGUARD - BATTLESTRINGS_TABLE_START] = sText_SharedItsGuard,
[STRINGID_SHAREDITSPOWER - BATTLESTRINGS_TABLE_START] = sText_SharedItsPower,
[STRINGID_SWAPSDEFANDSPDEFOFALLPOKEMON - BATTLESTRINGS_TABLE_START] = sText_SwapsDefAndSpDefOfAllPkmn,
[STRINGID_BIZARREAREACREATED - BATTLESTRINGS_TABLE_START] = sText_BizzareAreaCreated,
[STRINGID_BECAMENIMBLE - BATTLESTRINGS_TABLE_START] = sText_BecameNimble,
[STRINGID_HURLEDINTOTHEAIR - BATTLESTRINGS_TABLE_START] = sText_HurledIntoTheAir,
[STRINGID_HELDITEMSLOSEEFFECTS - BATTLESTRINGS_TABLE_START] = sText_HeldItemsLoseEffects,
[STRINGID_BIZARREARENACREATED - BATTLESTRINGS_TABLE_START] = sText_BizarreArenaCreated,
[STRINGID_FELLSTRAIGHTDOWN - BATTLESTRINGS_TABLE_START] = sText_FellStraightDown,
[STRINGID_TARGETCHANGEDTYPE - BATTLESTRINGS_TABLE_START] = sText_TargetChangedType,
[STRINGID_PKMNACQUIREDSIMPLE - BATTLESTRINGS_TABLE_START] = sText_PkmnAcquiredSimple,
@ -1563,6 +1569,19 @@ const u16 gMentalHerbCureStringIds[] =
[B_MSG_MENTALHERBCURE_DISABLE] = STRINGID_PKMNMOVEDISABLEDNOMORE,
};
const u16 gStartingStatusStringIds[B_MSG_STARTING_STATUS_COUNT] =
{
[B_MSG_TERRAIN_SET_MISTY] = STRINGID_TERRAINBECOMESMISTY,
[B_MSG_TERRAIN_SET_ELECTRIC] = STRINGID_TERRAINBECOMESELECTRIC,
[B_MSG_TERRAIN_SET_PSYCHIC] = STRINGID_TERRAINBECOMESPSYCHIC,
[B_MSG_TERRAIN_SET_GRASSY] = STRINGID_TERRAINBECOMESGRASSY,
[B_MSG_SET_TRICK_ROOM] = STRINGID_DIMENSIONSWERETWISTED,
[B_MSG_SET_MAGIC_ROOM] = STRINGID_BIZARREARENACREATED,
[B_MSG_SET_WONDER_ROOM] = STRINGID_BIZARREAREACREATED,
[B_MSG_SET_TAILWIND_PLAYER] = STRINGID_TAILWINDBLEW,
[B_MSG_SET_TAILWIND_OPPONENT] = STRINGID_TAILWINDBLEW,
};
const u16 gTerrainStringIds[B_MSG_TERRAIN_COUNT] =
{
[B_MSG_TERRAIN_SET_MISTY] = STRINGID_TERRAINBECOMESMISTY,

View File

@ -1907,7 +1907,7 @@ u8 DoFieldEndTurnEffects(void)
gBattlerAttacker = gSideTimers[side].tailwindBattlerId;
if (gSideStatuses[side] & SIDE_STATUS_TAILWIND)
{
if (--gSideTimers[side].tailwindTimer == 0)
if (gSideTimers[side].tailwindTimer > 0 && --gSideTimers[side].tailwindTimer == 0)
{
gSideStatuses[side] &= ~SIDE_STATUS_TAILWIND;
BattleScriptExecute(BattleScript_TailwindEnds);
@ -2088,7 +2088,7 @@ u8 DoFieldEndTurnEffects(void)
}
break;
case ENDTURN_TRICK_ROOM:
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && --gFieldTimers.trickRoomTimer == 0)
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 0 && --gFieldTimers.trickRoomTimer == 0)
{
gFieldStatuses &= ~STATUS_FIELD_TRICK_ROOM;
BattleScriptExecute(BattleScript_TrickRoomEnds);
@ -2097,7 +2097,7 @@ u8 DoFieldEndTurnEffects(void)
gBattleStruct->turnCountersTracker++;
break;
case ENDTURN_WONDER_ROOM:
if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && --gFieldTimers.wonderRoomTimer == 0)
if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer > 0 && --gFieldTimers.wonderRoomTimer == 0)
{
gFieldStatuses &= ~STATUS_FIELD_WONDER_ROOM;
BattleScriptExecute(BattleScript_WonderRoomEnds);
@ -2106,7 +2106,7 @@ u8 DoFieldEndTurnEffects(void)
gBattleStruct->turnCountersTracker++;
break;
case ENDTURN_MAGIC_ROOM:
if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && --gFieldTimers.magicRoomTimer == 0)
if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer > 0 && --gFieldTimers.magicRoomTimer == 0)
{
gFieldStatuses &= ~STATUS_FIELD_MAGIC_ROOM;
BattleScriptExecute(BattleScript_MagicRoomEnds);
@ -4000,78 +4000,155 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
switch (caseID)
{
case ABILITYEFFECT_SWITCH_IN_TERRAIN:
case ABILITYEFFECT_SWITCH_IN_STATUSES: // starting field/side/etc statuses with a variable
{
u8 varTerrainTimer = VarGet(B_VAR_TERRAIN_TIMER);
u8 timerVal = gBattleStruct->startingStatusTimer;
gBattleScripting.battler = battler;
if (VarGet(B_VAR_TERRAIN) & STATUS_FIELD_TERRAIN_ANY)
switch (gBattleStruct->startingStatus)
{
u16 terrainFlags = VarGet(B_VAR_TERRAIN) & STATUS_FIELD_TERRAIN_ANY; // only works for status flag (1 << 15)
if (varTerrainTimer == 0)
case STARTING_STATUS_ELECTRIC_TERRAIN:
if (!(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))
{
gFieldStatuses = terrainFlags | STATUS_FIELD_TERRAIN_PERMANENT; // terrain is permanent
}
else
{
gFieldStatuses |= terrainFlags;
gFieldTimers.terrainTimer = varTerrainTimer;
}
switch (VarGet(B_VAR_TERRAIN) & STATUS_FIELD_TERRAIN_ANY)
{
case STATUS_FIELD_ELECTRIC_TERRAIN:
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC;
break;
case STATUS_FIELD_MISTY_TERRAIN:
gFieldStatuses |= STATUS_FIELD_ELECTRIC_TERRAIN;
if (timerVal == 0)
gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT;
else
gFieldTimers.terrainTimer = timerVal;
effect = 2;
}
break;
case STARTING_STATUS_MISTY_TERRAIN:
if (!(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY;
break;
case STATUS_FIELD_GRASSY_TERRAIN:
gFieldStatuses |= STATUS_FIELD_MISTY_TERRAIN;
if (timerVal == 0)
gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT;
else
gFieldTimers.terrainTimer = timerVal;
effect = 2;
}
break;
case STARTING_STATUS_GRASSY_TERRAIN:
if (!(gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY;
break;
case STATUS_FIELD_PSYCHIC_TERRAIN:
gFieldStatuses |= STATUS_FIELD_GRASSY_TERRAIN;
if (timerVal == 0)
gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT;
else
gFieldTimers.terrainTimer = timerVal;
effect = 2;
}
break;
case STARTING_STATUS_PSYCHIC_TERRAIN:
if (!(gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC;
break;
gFieldStatuses |= STATUS_FIELD_PSYCHIC_TERRAIN;
if (timerVal == 0)
gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT;
else
gFieldTimers.terrainTimer = timerVal;
effect = 2;
}
BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain);
effect++;
break;
case STARTING_STATUS_TRICK_ROOM:
if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_TRICK_ROOM;
gFieldStatuses |= STATUS_FIELD_TRICK_ROOM;
gBattleScripting.animArg1 = B_ANIM_TRICK_ROOM;
if (timerVal == 0)
gFieldTimers.trickRoomTimer = 0; // infinite
else
gFieldTimers.trickRoomTimer = 5;
effect = 1;
}
break;
case STARTING_STATUS_MAGIC_ROOM:
if (!(gFieldStatuses & STATUS_FIELD_MAGIC_ROOM))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MAGIC_ROOM;
gFieldStatuses |= STATUS_FIELD_MAGIC_ROOM;
gBattleScripting.animArg1 = B_ANIM_MAGIC_ROOM;
if (timerVal == 0)
gFieldTimers.magicRoomTimer = 0; // infinite
else
gFieldTimers.magicRoomTimer = 5;
effect = 1;
}
break;
case STARTING_STATUS_WONDER_ROOM:
if (!(gFieldStatuses & STATUS_FIELD_WONDER_ROOM))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_WONDER_ROOM;
gFieldStatuses |= STATUS_FIELD_WONDER_ROOM;
gBattleScripting.animArg1 = B_ANIM_WONDER_ROOM;
if (timerVal == 0)
gFieldTimers.wonderRoomTimer = 0; // infinite
else
gFieldTimers.wonderRoomTimer = 5;
effect = 1;
}
break;
case STARTING_STATUS_TAILWIND_PLAYER:
if (!(gSideStatuses[B_SIDE_PLAYER] & SIDE_STATUS_TAILWIND))
{
gBattlerAttacker = B_POSITION_PLAYER_LEFT;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_TAILWIND_PLAYER;
gSideStatuses[B_SIDE_PLAYER] |= SIDE_STATUS_TAILWIND;
gBattleScripting.animArg1 = B_ANIM_TAILWIND;
if (timerVal == 0)
gSideTimers[B_SIDE_PLAYER].tailwindTimer = 0; // infinite
else
gSideTimers[B_SIDE_PLAYER].tailwindTimer = 5;
effect = 1;
}
break;
case STARTING_STATUS_TAILWIND_OPPONENT:
if (!(gSideStatuses[B_SIDE_OPPONENT] & SIDE_STATUS_TAILWIND))
{
gBattlerAttacker = B_POSITION_OPPONENT_LEFT;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_TAILWIND_OPPONENT;
gSideStatuses[B_SIDE_OPPONENT] |= SIDE_STATUS_TAILWIND;
gBattleScripting.animArg1 = B_ANIM_TAILWIND;
if (timerVal == 0)
gSideTimers[B_SIDE_OPPONENT].tailwindTimer = 0; // infinite
else
gSideTimers[B_SIDE_OPPONENT].tailwindTimer = 5;
effect = 1;
}
break;
}
else if (B_THUNDERSTORM_TERRAIN == TRUE
&& GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM
&& !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))
{
// overworld weather started rain, so just do electric terrain anim
if (varTerrainTimer == 0)
{
gFieldStatuses = (STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT);
}
else
{
gFieldStatuses |= STATUS_FIELD_ELECTRIC_TERRAIN;
gFieldTimers.terrainTimer = varTerrainTimer;
}
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC;
if (effect == 1)
BattleScriptPushCursorAndCallback(BattleScript_OverworldStatusStarts);
else if (effect == 2)
BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain);
effect++;
}
else if (B_FOG_TERRAIN == TRUE
&& (GetCurrentWeather() == WEATHER_FOG_HORIZONTAL || GetCurrentWeather() == WEATHER_FOG_DIAGONAL)
&& !(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN))
{
if (varTerrainTimer == 0)
{
gFieldStatuses = (STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT);
}
else
{
gFieldStatuses |= STATUS_FIELD_ELECTRIC_TERRAIN;
gFieldTimers.terrainTimer = varTerrainTimer;
}
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY;
BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain);
effect++;
}
}
break;
case ABILITYEFFECT_SWITCH_IN_TERRAIN: // terrain starting from overworld weather
if (B_THUNDERSTORM_TERRAIN == TRUE
&& !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)
&& GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM)
{
// overworld weather started rain, so just do electric terrain anim
gFieldStatuses = (STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC;
BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain);
effect++;
}
else if (B_FOG_TERRAIN == TRUE
&& (GetCurrentWeather() == WEATHER_FOG_HORIZONTAL || GetCurrentWeather() == WEATHER_FOG_DIAGONAL)
&& !(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN))
{
gFieldStatuses = (STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT);
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY;
BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain);
effect++;
}
break;
case ABILITYEFFECT_SWITCH_IN_WEATHER:

View File

@ -401,12 +401,12 @@ void Overworld_ResetStateAfterDigEscRope(void)
#if B_RESET_FLAGS_VARS_AFTER_WHITEOUT == TRUE
void Overworld_ResetBattleFlagsAndVars(void)
{
#if B_VAR_TERRAIN != 0
VarSet(B_VAR_TERRAIN, 0);
#if B_VAR_STARTING_STATUS != 0
VarSet(B_VAR_STARTING_STATUS, 0);
#endif
#if B_VAR_TERRAIN_TIMER != 0
VarSet(B_VAR_TERRAIN_TIMER, 0);
#if B_VAR_STARTING_STATUS_TIMER != 0
VarSet(B_VAR_STARTING_STATUS_TIMER, 0);
#endif
#if B_VAR_WILD_AI_FLAGS != 0