diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 2205519c532..44f0ef7c8d9 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -59,6 +59,10 @@ export enum ChallengeType { * @see {@linkcode Challenge.applyTypeEffectiveness} */ TYPE_EFFECTIVENESS, + /** + * Challenge that enables Trick Room in a run + */ + TRICK_ROOM, /** * Modifies what level the AI pokemon are. UNIMPLEMENTED. */ @@ -340,6 +344,15 @@ export abstract class Challenge { return false; } + /** + * An apply function for TRICK_ROOM challenges. Derived classes should alter this. + * @param enabled {@link Utils.BooleanHolder} Whether the challenge is enabled. + * @returns {@link boolean} Whether this function did anything. + */ + applyTrickRoom(enabled: Utils.BooleanHolder): boolean { + return false; + } + /** * An apply function for AI_LEVEL challenges. Derived classes should alter this. * @param level {@link Utils.IntegerHolder} The generated level. @@ -707,6 +720,35 @@ export class InverseBattleChallenge extends Challenge { } } +/** + * Challenge that enables Trick Room in a run + */ +export class TrickRoomChallenge extends Challenge { + constructor() { + super(Challenges.TRICK_ROOM, 1); + } + + static loadChallenge(source: TrickRoomChallenge | any): TrickRoomChallenge { + const newChallenge = new TrickRoomChallenge(); + newChallenge.value = source.value; + newChallenge.severity = source.severity; + return newChallenge; + } + + override getDifficulty(): number { + return 0; + } + + applyTrickRoom(enabled: Utils.BooleanHolder): boolean { + if (!enabled.value) { + enabled.value = true; + } else { + enabled.value = false; + } + return true; + } +} + /** * Lowers the amount of starter points available. */ @@ -834,6 +876,14 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType * @returns True if any challenge was successfully applied. */ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.TYPE_EFFECTIVENESS, effectiveness: Utils.NumberHolder): boolean; +/** + * Apply all challenges that modify Trick Room. + * @param gameMode {@linkcode GameMode} The current gameMode + * @param challengeType {@linkcode ChallengeType} ChallengeType.TRICK_ROOM + * @param enabled {@linkcode Utils.BooleanHolder} Whether Trick Room is enabled. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.TRICK_ROOM, enabled: Utils.BooleanHolder): boolean; /** * Apply all challenges that modify what level AI are. * @param gameMode {@link GameMode} The current gameMode @@ -918,6 +968,9 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType case ChallengeType.TYPE_EFFECTIVENESS: ret ||= c.applyTypeEffectiveness(args[0]); break; + case ChallengeType.TRICK_ROOM: + ret ||= c.applyTrickRoom(args[0]); + break; case ChallengeType.AI_LEVEL: ret ||= c.applyLevelChange(args[0], args[1], args[2], args[3]); break; @@ -961,6 +1014,8 @@ export function copyChallenge(source: Challenge | any): Challenge { return FreshStartChallenge.loadChallenge(source); case Challenges.INVERSE_BATTLE: return InverseBattleChallenge.loadChallenge(source); + case Challenges.TRICK_ROOM: + return TrickRoomChallenge.loadChallenge(source); } throw new Error("Unknown challenge copied"); } @@ -973,5 +1028,6 @@ export function initChallenges() { new SingleTypeChallenge(), new FreshStartChallenge(), new InverseBattleChallenge(), + new TrickRoomChallenge(), ); } diff --git a/src/enums/challenges.ts b/src/enums/challenges.ts index c4dc7460dfe..38f5d61670e 100644 --- a/src/enums/challenges.ts +++ b/src/enums/challenges.ts @@ -5,4 +5,5 @@ export enum Challenges { LOWER_STARTER_POINTS, FRESH_START, INVERSE_BATTLE, + TRICK_ROOM, } diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index 5c1af4228c6..d32f948bac3 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -19,6 +19,7 @@ import { TurnEndPhase } from "./turn-end-phase"; import { WeatherEffectPhase } from "./weather-effect-phase"; import { BattlerIndex } from "#app/battle"; import { TrickRoomTag } from "#app/data/arena-tag"; +import { applyChallenges, ChallengeType } from "#app/data/challenge"; export class TurnStartPhase extends FieldPhase { constructor(scene: BattleScene) { @@ -52,6 +53,7 @@ export class TurnStartPhase extends FieldPhase { // Next, a check for Trick Room is applied. If Trick Room is present, the order is reversed. const speedReversed = new Utils.BooleanHolder(false); this.scene.arena.applyTags(TrickRoomTag, speedReversed); + applyChallenges(this.scene.gameMode, ChallengeType.TRICK_ROOM, speedReversed); if (speedReversed.value) { orderedTargets = orderedTargets.reverse(); diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 119b7bc9c4a..7a62b807928 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -489,9 +489,11 @@ export default class RunInfoUiHandler extends UiHandler { rules.push(i18next.t("challenges:freshStart.name")); break; case Challenges.INVERSE_BATTLE: - // rules.push(i18next.t("challenges:inverseBattle.shortName")); break; + case Challenges.TRICK_ROOM: + rules.push(i18next.t("challenges:trickRoom.shortName")); + break; } } }