diff --git a/public/images/arenas/beach_a.png b/public/images/arenas/beach_a.png new file mode 100644 index 000000000..90e9189a4 Binary files /dev/null and b/public/images/arenas/beach_a.png differ diff --git a/public/images/arenas/beach_b.png b/public/images/arenas/beach_b.png new file mode 100644 index 000000000..e3b7e31ea Binary files /dev/null and b/public/images/arenas/beach_b.png differ diff --git a/public/images/arenas/beach_bg.png b/public/images/arenas/beach_bg.png new file mode 100644 index 000000000..9f687a286 Binary files /dev/null and b/public/images/arenas/beach_bg.png differ diff --git a/public/images/arenas/city_a.png b/public/images/arenas/city_a.png new file mode 100644 index 000000000..4756d7acf Binary files /dev/null and b/public/images/arenas/city_a.png differ diff --git a/public/images/arenas/city_b.png b/public/images/arenas/city_b.png new file mode 100644 index 000000000..38bdadae5 Binary files /dev/null and b/public/images/arenas/city_b.png differ diff --git a/public/images/arenas/city_bg.png b/public/images/arenas/city_bg.png new file mode 100644 index 000000000..97b1071a7 Binary files /dev/null and b/public/images/arenas/city_bg.png differ diff --git a/src/arena.ts b/src/arena.ts index 2b3fc4a0f..b791d82b6 100644 --- a/src/arena.ts +++ b/src/arena.ts @@ -99,12 +99,8 @@ export class Arena { getBiomeKey(): string { switch (this.biomeType) { - case Biome.CITY: - return 'dojo'; case Biome.LAKE: return 'sea'; - case Biome.BEACH: - return 'sea'; case Biome.ABYSS: return 'wasteland'; case Biome.MEADOW: diff --git a/src/battle-phases.ts b/src/battle-phases.ts index 99eb22cef..9f618b5ed 100644 --- a/src/battle-phases.ts +++ b/src/battle-phases.ts @@ -682,25 +682,24 @@ export class CommandPhase extends FieldPhase { } break; case Command.POKEMON: + case Command.RUN: + const isSwitch = command === Command.POKEMON; const trapTag = playerPokemon.findTag(t => t instanceof TrappedTag) as TrappedTag; const trapped = new Utils.BooleanHolder(false); - const batonPass = args[0] as boolean; + const batonPass = isSwitch && args[0] as boolean; if (!batonPass) applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trapped); if (batonPass || (!trapTag && !trapped.value)) { - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, cursor, true, args[0] as boolean)); + if (isSwitch) + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, cursor, true, args[0] as boolean)); + else + this.scene.unshiftPhase(new AttemptRunPhase(this.scene)); success = true; } else if (trapTag) - this.scene.ui.showText(`${this.scene.getPokemonById(trapTag.sourceId).name}'s ${trapTag.getMoveName()}\nprevents switching!`, null, () => { + this.scene.ui.showText(`${this.scene.getPokemonById(trapTag.sourceId).name}'s ${trapTag.getMoveName()}\nprevents ${isSwitch ? 'switching' : 'fleeing'}!`, null, () => { this.scene.ui.showText(null, 0); }, null, true); break; - case Command.RUN: - this.scene.unshiftPhase(new AttemptRunPhase(this.scene)); - success = true; - //this.scene.unshiftPhase(new MoveAnimTestPhase(this.scene)); - //success = true; - break; } if (success) { diff --git a/src/data/move.ts b/src/data/move.ts index fc7749555..4ec4c32dc 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1267,14 +1267,14 @@ export class MovePowerMultiplierAttr extends VariablePowerAttr { } export abstract class ConsecutiveUsePowerMultiplierAttr extends MovePowerMultiplierAttr { - constructor(limit: integer, resetOnFail: boolean, resetOnLimit?: boolean) { + constructor(limit: integer, resetOnFail: boolean, resetOnLimit?: boolean, ...comboMoves: Moves[]) { super((user: Pokemon, target: Pokemon, move: Move): number => { const moveHistory = user.getMoveHistory().reverse().slice(0); let count = 0; let turnMove: TurnMove; - while ((turnMove = moveHistory.shift())?.move === move.id && (!resetOnFail || turnMove.result < MoveResult.NO_EFFECT)) { + while (((turnMove = moveHistory.shift())?.move === move.id || (comboMoves.length && comboMoves.indexOf(turnMove?.move) > -1)) && (!resetOnFail || turnMove.result < MoveResult.NO_EFFECT)) { if (count < (limit - 1)) count++; else if (resetOnLimit) @@ -2409,7 +2409,7 @@ export function initMoves() { new StatusMove(Moves.CHARM, "Charm", Type.FAIRY, 100, 20, 2, "Sharply lowers opponent's Attack.", -1, 0, 2) .attr(StatChangeAttr, BattleStat.ATK, -2), new AttackMove(Moves.ROLLOUT, "Rollout", Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, "Doubles in power each turn for 5 turns.", -1, 0, 2) - .attr(ConsecutiveUseDoublePowerAttr, 5, true, true), // TODO: Defense Curl logic + .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL), new AttackMove(Moves.FALSE_SWIPE, "False Swipe (N)", Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, 57, "Always leaves opponent with at least 1 HP.", -1, 0, 2), new StatusMove(Moves.SWAGGER, "Swagger", Type.NORMAL, 85, 15, -1, "Confuses opponent, but sharply raises its Attack.", -1, 0, 2) .attr(StatChangeAttr, BattleStat.ATK, 2) @@ -2596,7 +2596,7 @@ export function initMoves() { .attr(AddArenaTagAttr, ArenaTagType.MUD_SPORT, 5) .target(MoveTarget.BOTH_SIDES), new AttackMove(Moves.ICE_BALL, "Ice Ball", Type.ICE, MoveCategory.PHYSICAL, 30, 90, 20, -1, "Doubles in power each turn for 5 turns.", -1, 0, 3) - .attr(ConsecutiveUseDoublePowerAttr, 5, true, true), + .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL), new AttackMove(Moves.NEEDLE_ARM, "Needle Arm", Type.GRASS, MoveCategory.PHYSICAL, 60, 100, 15, -1, "May cause flinching.", 30, 0, 3) .attr(FlinchAttr), new SelfStatusMove(Moves.SLACK_OFF, "Slack Off", Type.NORMAL, -1, 5, -1, "User recovers half its max HP.", -1, 0, 3)