Adds Pledge Side Statuses as Starting Statuses (#5899)

This commit is contained in:
Alex 2024-12-30 09:18:23 +01:00 committed by GitHub
parent e93e88ade5
commit af19b13195
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 164 additions and 130 deletions

View File

@ -5899,8 +5899,7 @@ BattleScript_OverworldStatusStarts::
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
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_SET_TAILWIND, BattleScript_TryTailwindAbilitiesLoop
return
BattleScript_OverworldWeatherStarts::
@ -8333,7 +8332,6 @@ BattleScript_GrassyTerrainLoopIncrement::
addbyte gBattleCommunication, 1
jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_GrassyTerrainLoop
bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE
jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_PERMANENT, BattleScript_GrassyTerrainHealEnd
BattleScript_GrassyTerrainHealEnd:
return

View File

@ -266,7 +266,6 @@
#define STATUS_FIELD_PSYCHIC_TERRAIN (1 << 9)
#define STATUS_FIELD_ION_DELUGE (1 << 10)
#define STATUS_FIELD_FAIRY_LOCK (1 << 11)
#define STATUS_FIELD_TERRAIN_PERMANENT (1 << 12) // Overworld thunderstorm generates electric terrain
#define STATUS_FIELD_TERRAIN_ANY (STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN)
@ -539,15 +538,24 @@
// 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
enum StartingStatus
{
STARTING_STATUS_NONE,
STARTING_STATUS_ELECTRIC_TERRAIN,
STARTING_STATUS_MISTY_TERRAIN,
STARTING_STATUS_GRASSY_TERRAIN,
STARTING_STATUS_PSYCHIC_TERRAIN,
STARTING_STATUS_TRICK_ROOM,
STARTING_STATUS_MAGIC_ROOM,
STARTING_STATUS_WONDER_ROOM,
STARTING_STATUS_TAILWIND_PLAYER,
STARTING_STATUS_TAILWIND_OPPONENT,
STARTING_STATUS_RAINBOW_PLAYER,
STARTING_STATUS_RAINBOW_OPPONENT,
STARTING_STATUS_SEA_OF_FIRE_PLAYER,
STARTING_STATUS_SEA_OF_FIRE_OPPONENT,
STARTING_STATUS_SWAMP_PLAYER,
STARTING_STATUS_SWAMP_OPPONENT,
};
#endif // GUARD_CONSTANTS_BATTLE_H

View File

@ -1010,9 +1010,11 @@
#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
#define B_MSG_SET_TAILWIND 7
#define B_MSG_SET_RAINBOW 8
#define B_MSG_SET_SEA_OF_FIRE 9
#define B_MSG_SET_SWAMP 10
#define B_MSG_STARTING_STATUS_COUNT 11
// gWrappedStringIds

View File

@ -915,15 +915,17 @@ const u16 gMentalHerbCureStringIds[] =
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,
[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] = STRINGID_TAILWINDBLEW,
[B_MSG_SET_RAINBOW] = STRINGID_ARAINBOWAPPEAREDONSIDE,
[B_MSG_SET_SEA_OF_FIRE] = STRINGID_SEAOFFIREENVELOPEDSIDE,
[B_MSG_SET_SWAMP] = STRINGID_SWAMPENVELOPEDSIDE,
};
const u16 gTerrainStringIds[B_MSG_TERRAIN_COUNT] =

View File

@ -16988,7 +16988,7 @@ void BS_SetRemoveTerrain(void)
{
u32 atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE);
gFieldStatuses &= ~(STATUS_FIELD_TERRAIN_ANY | STATUS_FIELD_TERRAIN_PERMANENT);
gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY;
gFieldStatuses |= statusFlag;
gFieldTimers.terrainTimer = (atkHoldEffect == HOLD_EFFECT_TERRAIN_EXTENDER) ? 8 : 5;
gBattlescriptCurrInstr = cmd->nextInstr;

View File

@ -1554,7 +1554,7 @@ static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId)
{
if (terrainFlag & STATUS_FIELD_GRASSY_TERRAIN)
BattleScriptExecute(BattleScript_GrassyTerrainHeals);
if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.terrainTimer == 0)
if (gFieldTimers.terrainTimer > 0 && --gFieldTimers.terrainTimer == 0)
{
gFieldStatuses &= ~terrainFlag;
TryToRevertMimicryAndFlags();
@ -4049,7 +4049,7 @@ static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer)
{
if ((!(gFieldStatuses & statusFlag) && (!gBattleStruct->isSkyBattle)))
{
gFieldStatuses &= ~(STATUS_FIELD_TERRAIN_ANY | STATUS_FIELD_TERRAIN_PERMANENT);
gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY;
gFieldStatuses |= statusFlag;
gDisableStructs[battler].terrainAbilityDone = FALSE;
@ -4328,6 +4328,43 @@ u32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 mov
return effect;
}
static inline u32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u8 *timer)
{
if (!(gFieldStatuses & flag))
{
gBattleCommunication[MULTISTRING_CHOOSER] = message;
gFieldStatuses |= flag;
gBattleScripting.animArg1 = anim;
if (gBattleStruct->startingStatusTimer)
*timer = gBattleStruct->startingStatusTimer;
else
*timer = 0; // Infinite
return 1;
}
return 0;
}
static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 anim, u8 *timer)
{
if (!(gSideStatuses[side] & flag))
{
gBattlerAttacker = gBattlerTarget = side;
gBattleCommunication[MULTISTRING_CHOOSER] = message;
gSideStatuses[side] |= flag;
gBattleScripting.animArg1 = anim;
if (gBattleStruct->startingStatusTimer)
*timer = gBattleStruct->startingStatusTimer;
else
*timer = 0; // Infinite
return 1;
}
return 0;
}
u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg)
{
u32 effect = 0;
@ -4359,125 +4396,110 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
{
case ABILITYEFFECT_SWITCH_IN_STATUSES: // starting field/side/etc statuses with a variable
{
u8 timerVal = gBattleStruct->startingStatusTimer;
gBattleScripting.battler = battler;
switch (gBattleStruct->startingStatus)
{
case STARTING_STATUS_ELECTRIC_TERRAIN:
if (!(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC;
gFieldStatuses |= STATUS_FIELD_ELECTRIC_TERRAIN;
if (timerVal == 0)
gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT;
else
gFieldTimers.terrainTimer = timerVal;
effect = 2;
}
effect = SetStartingFieldStatus(STATUS_FIELD_ELECTRIC_TERRAIN,
B_MSG_TERRAIN_SET_ELECTRIC,
0,
&gFieldTimers.terrainTimer);
effect = (effect == 1) ? 2 : 0;
break;
case STARTING_STATUS_MISTY_TERRAIN:
if (!(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY;
gFieldStatuses |= STATUS_FIELD_MISTY_TERRAIN;
if (timerVal == 0)
gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT;
else
gFieldTimers.terrainTimer = timerVal;
effect = 2;
}
effect = SetStartingFieldStatus(STATUS_FIELD_MISTY_TERRAIN,
B_MSG_TERRAIN_SET_MISTY,
0,
&gFieldTimers.terrainTimer);
effect = (effect == 1) ? 2 : 0;
break;
case STARTING_STATUS_GRASSY_TERRAIN:
if (!(gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_GRASSY;
gFieldStatuses |= STATUS_FIELD_GRASSY_TERRAIN;
if (timerVal == 0)
gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT;
else
gFieldTimers.terrainTimer = timerVal;
effect = 2;
}
effect = SetStartingFieldStatus(STATUS_FIELD_GRASSY_TERRAIN,
B_MSG_TERRAIN_SET_GRASSY,
0,
&gFieldTimers.terrainTimer);
effect = (effect == 1) ? 2 : 0;
break;
case STARTING_STATUS_PSYCHIC_TERRAIN:
if (!(gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN))
{
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_PSYCHIC;
gFieldStatuses |= STATUS_FIELD_PSYCHIC_TERRAIN;
if (timerVal == 0)
gFieldStatuses |= STATUS_FIELD_TERRAIN_PERMANENT;
else
gFieldTimers.terrainTimer = timerVal;
effect = 2;
}
effect = SetStartingFieldStatus(STATUS_FIELD_PSYCHIC_TERRAIN,
B_MSG_TERRAIN_SET_PSYCHIC,
0,
&gFieldTimers.terrainTimer);
effect = (effect == 1) ? 2 : 0;
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;
}
effect = SetStartingFieldStatus(STATUS_FIELD_TRICK_ROOM,
B_MSG_SET_TRICK_ROOM,
B_ANIM_TRICK_ROOM,
&gFieldTimers.trickRoomTimer);
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;
}
effect = SetStartingFieldStatus(STATUS_FIELD_MAGIC_ROOM,
B_MSG_SET_MAGIC_ROOM,
B_ANIM_MAGIC_ROOM,
&gFieldTimers.magicRoomTimer);
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;
}
effect = SetStartingFieldStatus(STATUS_FIELD_WONDER_ROOM,
B_MSG_SET_WONDER_ROOM,
B_ANIM_WONDER_ROOM,
&gFieldTimers.wonderRoomTimer);
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;
}
effect = SetStartingSideStatus(SIDE_STATUS_TAILWIND,
B_SIDE_PLAYER,
B_MSG_SET_TAILWIND,
B_ANIM_TAILWIND,
&gSideTimers[B_SIDE_PLAYER].tailwindTimer);
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;
}
effect = SetStartingSideStatus(SIDE_STATUS_TAILWIND,
B_SIDE_OPPONENT,
B_MSG_SET_TAILWIND,
B_ANIM_TAILWIND,
&gSideTimers[B_SIDE_OPPONENT].tailwindTimer);
break;
case STARTING_STATUS_RAINBOW_PLAYER:
effect = SetStartingSideStatus(SIDE_STATUS_RAINBOW,
B_SIDE_PLAYER,
B_MSG_SET_RAINBOW,
B_ANIM_RAINBOW,
&gSideTimers[B_SIDE_PLAYER].rainbowTimer);
break;
case STARTING_STATUS_RAINBOW_OPPONENT:
effect = SetStartingSideStatus(SIDE_STATUS_RAINBOW,
B_SIDE_OPPONENT,
B_MSG_SET_RAINBOW,
B_ANIM_RAINBOW,
&gSideTimers[B_SIDE_OPPONENT].rainbowTimer);
break;
case STARTING_STATUS_SEA_OF_FIRE_PLAYER:
effect = SetStartingSideStatus(SIDE_STATUS_SEA_OF_FIRE,
B_SIDE_PLAYER,
B_MSG_SET_SEA_OF_FIRE,
B_ANIM_SEA_OF_FIRE,
&gSideTimers[B_SIDE_PLAYER].seaOfFireTimer);
break;
case STARTING_STATUS_SEA_OF_FIRE_OPPONENT:
effect = SetStartingSideStatus(SIDE_STATUS_SEA_OF_FIRE,
B_SIDE_OPPONENT,
B_MSG_SET_SEA_OF_FIRE,
B_ANIM_SEA_OF_FIRE,
&gSideTimers[B_SIDE_OPPONENT].seaOfFireTimer);
break;
case STARTING_STATUS_SWAMP_PLAYER:
effect = SetStartingSideStatus(SIDE_STATUS_SWAMP,
B_SIDE_PLAYER,
B_MSG_SET_SWAMP,
B_ANIM_SWAMP,
&gSideTimers[B_SIDE_PLAYER].swampTimer);
break;
case STARTING_STATUS_SWAMP_OPPONENT:
effect = SetStartingSideStatus(SIDE_STATUS_SWAMP,
B_SIDE_OPPONENT,
B_MSG_SET_SWAMP,
B_ANIM_SWAMP,
&gSideTimers[B_SIDE_OPPONENT].swampTimer);
break;
}
@ -4493,7 +4515,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& GetCurrentWeather() == WEATHER_RAIN_THUNDERSTORM)
{
// overworld weather started rain, so just do electric terrain anim
gFieldStatuses = (STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT);
gFieldStatuses = STATUS_FIELD_ELECTRIC_TERRAIN;
gFieldTimers.terrainTimer = 0;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_ELECTRIC;
BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain);
effect++;
@ -4502,7 +4525,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& (GetCurrentWeather() == WEATHER_FOG_HORIZONTAL || GetCurrentWeather() == WEATHER_FOG_DIAGONAL)
&& !(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN))
{
gFieldStatuses = (STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_TERRAIN_PERMANENT);
gFieldStatuses = STATUS_FIELD_MISTY_TERRAIN;
gFieldTimers.terrainTimer = 0;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAIN_SET_MISTY;
BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain);
effect++;