fix: (WIP) hacky solution using enum, pausing for now

This commit is contained in:
Moos Toet 2025-12-08 15:30:53 +01:00
parent 578d9a33b6
commit 91c7bd875c
7 changed files with 55 additions and 22 deletions

View File

@ -224,9 +224,10 @@
// Var Settings
// To use the following features, change the 0 for a var present in include/constants/vars.h, preferably an unused one.
// Eg: You may rename VAR_UNUSED_0x404E to a descriptive name and use it below.
#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 0 // If this var has a value, assigning a STARTING_STATUS_xx to it before battle causes the battle to start with that status active.
// This var should never remain non-zero long enough for the player to save.
#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_STARTING_STATUS_HAZARDS 0 // Same as above, but for entry hazards. Uses STARTING_HAZARD_xx constants.
#define B_VAR_STARTING_STATUS_TIMER 0 // If this var has a value >= 1, field effects will last that number of turns, otherwise they last until overwritten.
#define B_VAR_WILD_AI_FLAGS 0 // If not 0, you can use this var to add to default wild AI flags. IMPORTANT: NOT usable with flags above (1 << 15)
// This var should never remain non-zero long enough for the player to save.
// For better wild AI handling, edit GetWildAiFlags() in src/battle_ai_main.c

View File

@ -1134,6 +1134,8 @@
#define B_VAR_DIFFICULTY TESTING_VAR_DIFFICULTY
#undef B_VAR_STARTING_STATUS
#define B_VAR_STARTING_STATUS TESTING_VAR_STARTING_STATUS
#undef B_VAR_STARTING_STATUS_HAZARDS
#define B_VAR_STARTING_STATUS_HAZARDS TESTING_VAR_STARTING_STATUS_HAZARDS
#undef B_VAR_STARTING_STATUS_TIMER
#define B_VAR_STARTING_STATUS_TIMER TESTING_VAR_STARTING_STATUS_TIMER

View File

@ -707,6 +707,30 @@ enum StartingStatus
STARTING_STATUS_SHARP_STEEL_OPPONENT = (1 << 30), // Steelsurge Opponent
};
// Constants for B_VAR_STARTING_STATUS_HAZARDS (shifted to fit in u16)
// These map to the same internal bits as STARTING_STATUS_* hazards
enum StartingHazard
{
STARTING_HAZARD_SPIKES_PLAYER_L1 = (1 << 0), // Spikes Player Layer 1
STARTING_HAZARD_SPIKES_PLAYER_L2 = (1 << 1), // Spikes Player Layer 2
STARTING_HAZARD_SPIKES_PLAYER_L3 = (1 << 2), // Spikes Player Layer 3
STARTING_HAZARD_SPIKES_OPPONENT_L1 = (1 << 3), // Spikes Opponent Layer 1
STARTING_HAZARD_SPIKES_OPPONENT_L2 = (1 << 4), // Spikes Opponent Layer 2
STARTING_HAZARD_SPIKES_OPPONENT_L3 = (1 << 5), // Spikes Opponent Layer 3
STARTING_HAZARD_TOXIC_SPIKES_PLAYER_L1 = (1 << 6), // Toxic Spikes Player Layer 1
STARTING_HAZARD_TOXIC_SPIKES_PLAYER_L2 = (1 << 7), // Toxic Spikes Player Layer 2
STARTING_HAZARD_TOXIC_SPIKES_OPPONENT_L1 = (1 << 8), // Toxic Spikes Opponent Layer 1
STARTING_HAZARD_TOXIC_SPIKES_OPPONENT_L2 = (1 << 9), // Toxic Spikes Opponent Layer 2
STARTING_HAZARD_STICKY_WEB_PLAYER = (1 << 10), // Sticky Web Player
STARTING_HAZARD_STICKY_WEB_OPPONENT = (1 << 11), // Sticky Web Opponent
STARTING_HAZARD_STEALTH_ROCK_PLAYER = (1 << 12), // Stealth Rock Player
STARTING_HAZARD_STEALTH_ROCK_OPPONENT = (1 << 13), // Stealth Rock Opponent
STARTING_HAZARD_SHARP_STEEL_PLAYER = (1 << 14), // Steelsurge Player
STARTING_HAZARD_SHARP_STEEL_OPPONENT = (1 << 15), // Steelsurge Opponent
};
#define STARTING_HAZARD_SHIFT 15 // Shift value to convert STARTING_HAZARD_* to internal STARTING_STATUS_* bits
enum SlideMsgStates
{
PRINT_SLIDE_MESSAGE,

View File

@ -328,8 +328,8 @@
#define TESTING_VARS_START 0x9000
#define TESTING_VAR_DIFFICULTY (TESTING_VARS_START + 0x0)
#define TESTING_VAR_STARTING_STATUS (TESTING_VARS_START + 0x1)
#define TESTING_VAR_STARTING_STATUS_TIMER (TESTING_VARS_START + 0x2)
#define TESTING_VAR_UNUSED_3 (TESTING_VARS_START + 0x3)
#define TESTING_VAR_STARTING_STATUS_HAZARDS (TESTING_VARS_START + 0x2)
#define TESTING_VAR_STARTING_STATUS_TIMER (TESTING_VARS_START + 0x3)
#define TESTING_VAR_UNUSED_4 (TESTING_VARS_START + 0x4)
#define TESTING_VAR_UNUSED_5 (TESTING_VARS_START + 0x5)
#define TESTING_VAR_UNUSED_6 (TESTING_VARS_START + 0x6)

View File

@ -3748,6 +3748,8 @@ static void DoBattleIntro(void)
gBattleStruct->startingStatus |= VarGet(B_VAR_STARTING_STATUS);
gBattleStruct->startingStatusTimer = VarGet(B_VAR_STARTING_STATUS_TIMER);
}
if (B_VAR_STARTING_STATUS_HAZARDS != 0)
gBattleStruct->startingStatus |= (u32)VarGet(B_VAR_STARTING_STATUS_HAZARDS) << STARTING_HAZARD_SHIFT;
gBattleMainFunc = TryDoEventsBeforeFirstTurn;
}
break;

View File

@ -422,6 +422,10 @@ void Overworld_ResetBattleFlagsAndVars(void)
VarSet(B_VAR_STARTING_STATUS, 0);
#endif
#if B_VAR_STARTING_STATUS_HAZARDS != 0
VarSet(B_VAR_STARTING_STATUS_HAZARDS, 0);
#endif
#if B_VAR_STARTING_STATUS_TIMER != 0
VarSet(B_VAR_STARTING_STATUS_TIMER, 0);
#endif

View File

@ -2,17 +2,17 @@
#include "event_data.h"
#include "test/battle.h"
#if B_VAR_STARTING_STATUS != 0
#if B_VAR_STARTING_STATUS_HAZARDS != 0
SINGLE_BATTLE_TEST("B_VAR_STARTING_STATUS can start Spikes on the opposing side", s16 damage)
SINGLE_BATTLE_TEST("B_VAR_STARTING_STATUS_HAZARDS can start Spikes on the opposing side", s16 damage)
{
u16 startingStatus;
u32 startingHazard;
u32 divisor;
PARAMETRIZE { startingStatus = STARTING_STATUS_SPIKES_OPPONENT_L1; divisor = 8; }
PARAMETRIZE { startingStatus = STARTING_STATUS_SPIKES_OPPONENT_L3; divisor = 4; }
PARAMETRIZE { startingHazard = STARTING_HAZARD_SPIKES_OPPONENT_L1; divisor = 8; }
PARAMETRIZE { startingHazard = STARTING_HAZARD_SPIKES_OPPONENT_L3; divisor = 4; }
VarSet(B_VAR_STARTING_STATUS, startingStatus);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, startingHazard);
VarSet(B_VAR_STARTING_STATUS_TIMER, 0);
GIVEN {
@ -27,13 +27,13 @@ SINGLE_BATTLE_TEST("B_VAR_STARTING_STATUS can start Spikes on the opposing side"
HP_BAR(opponent, damage: maxHP / divisor);
MESSAGE("The opposing Wynaut was hurt by the spikes!");
} FINALLY {
VarSet(B_VAR_STARTING_STATUS, 0);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, 0);
}
}
SINGLE_BATTLE_TEST("Starting Toxic Spikes poison the opposing switch-in")
{
VarSet(B_VAR_STARTING_STATUS, STARTING_STATUS_TOXIC_SPIKES_OPPONENT_L1);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, STARTING_HAZARD_TOXIC_SPIKES_OPPONENT_L1);
VarSet(B_VAR_STARTING_STATUS_TIMER, 0);
GIVEN {
@ -48,13 +48,13 @@ SINGLE_BATTLE_TEST("Starting Toxic Spikes poison the opposing switch-in")
STATUS_ICON(opponent, poison: TRUE);
NOT STATUS_ICON(opponent, badPoison: TRUE);
} THEN {
VarSet(B_VAR_STARTING_STATUS, 0);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, 0);
}
}
SINGLE_BATTLE_TEST("Starting Toxic Spikes badly poison the opposing switch-in")
{
VarSet(B_VAR_STARTING_STATUS, STARTING_STATUS_TOXIC_SPIKES_OPPONENT_L2);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, STARTING_HAZARD_TOXIC_SPIKES_OPPONENT_L2);
VarSet(B_VAR_STARTING_STATUS_TIMER, 0);
GIVEN {
@ -68,13 +68,13 @@ SINGLE_BATTLE_TEST("Starting Toxic Spikes badly poison the opposing switch-in")
MESSAGE("The opposing Wynaut was badly poisoned!");
STATUS_ICON(opponent, badPoison: TRUE);
} THEN {
VarSet(B_VAR_STARTING_STATUS, 0);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, 0);
}
}
SINGLE_BATTLE_TEST("Starting Sticky Web lowers Speed on entry")
{
VarSet(B_VAR_STARTING_STATUS, STARTING_STATUS_STICKY_WEB_OPPONENT);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, STARTING_HAZARD_STICKY_WEB_OPPONENT);
VarSet(B_VAR_STARTING_STATUS_TIMER, 0);
GIVEN {
@ -88,13 +88,13 @@ SINGLE_BATTLE_TEST("Starting Sticky Web lowers Speed on entry")
MESSAGE("The opposing Wynaut was caught in a sticky web!");
MESSAGE("The opposing Wynaut's Speed fell!");
} THEN {
VarSet(B_VAR_STARTING_STATUS, 0);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, 0);
}
}
SINGLE_BATTLE_TEST("Starting Stealth Rock damages the opposing switch-in")
{
VarSet(B_VAR_STARTING_STATUS, STARTING_STATUS_STEALTH_ROCK_OPPONENT);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, STARTING_HAZARD_STEALTH_ROCK_OPPONENT);
VarSet(B_VAR_STARTING_STATUS_TIMER, 0);
GIVEN {
@ -109,13 +109,13 @@ SINGLE_BATTLE_TEST("Starting Stealth Rock damages the opposing switch-in")
HP_BAR(opponent, damage: maxHP / 2);
MESSAGE("Pointed stones dug into the opposing Charizard!");
} THEN {
VarSet(B_VAR_STARTING_STATUS, 0);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, 0);
}
}
SINGLE_BATTLE_TEST("Starting sharp steel damages the opposing switch-in")
{
VarSet(B_VAR_STARTING_STATUS, STARTING_STATUS_SHARP_STEEL_OPPONENT);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, STARTING_HAZARD_SHARP_STEEL_OPPONENT);
VarSet(B_VAR_STARTING_STATUS_TIMER, 0);
GIVEN {
@ -130,8 +130,8 @@ SINGLE_BATTLE_TEST("Starting sharp steel damages the opposing switch-in")
HP_BAR(opponent, damage: maxHP / 4);
MESSAGE("The sharp steel bit into the opposing Sylveon!");
} THEN {
VarSet(B_VAR_STARTING_STATUS, 0);
VarSet(B_VAR_STARTING_STATUS_HAZARDS, 0);
}
}
#endif // B_VAR_STARTING_STATUS
#endif // B_VAR_STARTING_STATUS_HAZARDS