From 5e8292b529ba4f2505706e3131a997f2b734953d Mon Sep 17 00:00:00 2001 From: Robbie Moyer Date: Wed, 5 Mar 2025 22:32:45 -0500 Subject: [PATCH] Fix an issue with Piloting leaders triggering Ambush on deploy (#790) --- .../game/abilities/keyword/AmbushAbility.ts | 3 ++- .../DeployAndAttachPilotLeaderSystem.ts | 3 ++- .../BobaFettAnyMethodsNecessary.spec.ts | 20 +++++++++---------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/server/game/abilities/keyword/AmbushAbility.ts b/server/game/abilities/keyword/AmbushAbility.ts index 65b3b1df6..13edfe8e5 100644 --- a/server/game/abilities/keyword/AmbushAbility.ts +++ b/server/game/abilities/keyword/AmbushAbility.ts @@ -1,7 +1,7 @@ import TriggeredAbility from '../../core/ability/TriggeredAbility'; import type { TriggeredAbilityContext } from '../../core/ability/TriggeredAbilityContext'; import type { Card } from '../../core/card/Card'; -import { KeywordName } from '../../core/Constants'; +import { KeywordName, WildcardZoneName } from '../../core/Constants'; import type Game from '../../core/Game'; import * as Contract from '../../core/utils/Contract'; import { ConditionalSystem } from '../../gameSystems/ConditionalSystem'; @@ -19,6 +19,7 @@ export class AmbushAbility extends TriggeredAbility { title: 'Ambush', optional: true, when: { onUnitEntersPlay: (event, context) => event.card === context.source }, + zoneFilter: WildcardZoneName.AnyArena, immediateEffect: new ConditionalSystem({ condition: AmbushAbility.unitWouldHaveAmbushTarget, onTrue: new SequentialSystem([ diff --git a/server/game/gameSystems/DeployAndAttachPilotLeaderSystem.ts b/server/game/gameSystems/DeployAndAttachPilotLeaderSystem.ts index 52f6285a1..a88108c34 100644 --- a/server/game/gameSystems/DeployAndAttachPilotLeaderSystem.ts +++ b/server/game/gameSystems/DeployAndAttachPilotLeaderSystem.ts @@ -60,9 +60,10 @@ export class DeployAndAttachPilotLeaderSystem { + const properties = this.generatePropertiesFromContext(context); const entersPlayEvent = new GameEvent(EventName.OnUnitEntersPlay, context, { player: context.player, - card + card: properties.leaderPilotCard }); return [entersPlayEvent]; diff --git a/test/server/cards/04_JTL/leaders/BobaFettAnyMethodsNecessary.spec.ts b/test/server/cards/04_JTL/leaders/BobaFettAnyMethodsNecessary.spec.ts index 0078ad777..4bf962548 100644 --- a/test/server/cards/04_JTL/leaders/BobaFettAnyMethodsNecessary.spec.ts +++ b/test/server/cards/04_JTL/leaders/BobaFettAnyMethodsNecessary.spec.ts @@ -117,7 +117,7 @@ describe('Boba Fett, Any Methods Necessary', function() { phase: 'action', player1: { leader: 'boba-fett#any-methods-necessary', - spaceArena: ['cartel-spacer'], + spaceArena: ['cartel-spacer', 'auzituck-liberator-gunship'], resources: 6 }, player2: { @@ -133,16 +133,16 @@ describe('Boba Fett, Any Methods Necessary', function() { expect(context.player1).toHaveExactPromptButtons(['Cancel', 'Deploy Boba Fett', 'Deploy Boba Fett as a Pilot']); context.player1.clickPrompt('Deploy Boba Fett as a Pilot'); expect(context.player2).not.toBeActivePlayer(); - expect(context.player1).toBeAbleToSelectExactly([context.cartelSpacer]); - context.player1.clickCard(context.cartelSpacer); + expect(context.player1).toBeAbleToSelectExactly([context.cartelSpacer, context.auzituckLiberatorGunship]); + context.player1.clickCard(context.auzituckLiberatorGunship); expect(context.bobaFett.deployed).toBe(true); expect(context.bobaFett).toBeInZone('spaceArena'); - expect(context.cartelSpacer.getPower()).toBe(6); - expect(context.cartelSpacer.getHp()).toBe(7); - expect(context.cartelSpacer).toHaveExactUpgradeNames(['boba-fett#any-methods-necessary']); + expect(context.auzituckLiberatorGunship.getPower()).toBe(7); + expect(context.auzituckLiberatorGunship.getHp()).toBe(8); + expect(context.auzituckLiberatorGunship).toHaveExactUpgradeNames(['boba-fett#any-methods-necessary']); - expect(context.player1).toBeAbleToSelectExactly([context.cartelSpacer, context.wampa, context.moistureFarmer, context.concordDawnInterceptors]); + expect(context.player1).toBeAbleToSelectExactly([context.cartelSpacer, context.auzituckLiberatorGunship, context.wampa, context.moistureFarmer, context.concordDawnInterceptors]); expect(context.player1).toHaveChooseNoTargetButton(); context.player1.setDistributeDamagePromptState(new Map([ [context.wampa, 2], @@ -156,10 +156,10 @@ describe('Boba Fett, Any Methods Necessary', function() { expect(context.cartelSpacer.damage).toBe(1); context.player2.clickCard(context.rivalsFall); - expect(context.player2).toBeAbleToSelectExactly([context.cartelSpacer, context.wampa, context.moistureFarmer, context.concordDawnInterceptors]); - context.player2.clickCard(context.cartelSpacer); + expect(context.player2).toBeAbleToSelectExactly([context.cartelSpacer, context.auzituckLiberatorGunship, context.wampa, context.moistureFarmer, context.concordDawnInterceptors]); + context.player2.clickCard(context.auzituckLiberatorGunship); - expect(context.cartelSpacer).toBeInZone('discard'); + expect(context.auzituckLiberatorGunship).toBeInZone('discard'); expect(context.bobaFett).toBeInZone('base'); expect(context.bobaFett.exhausted).toBe(true); expect(context.bobaFett.deployed).toBe(false);