Allow Voice to name Portable Snooper

This commit is contained in:
Quintine committed 2026-10-27 22:49:34 +11:00
1 parent 0902289592
commit 1f92affea7
13 files changed
+381 -6

No files matched your search

+4
View File
@@ -47,6 +47,7 @@ export const DEFENSE_KINDS = [
export const VOICE_KINDS = [
'stoneBurner',
'mirrorWeapon',
'portableSnooper',
'poison',
'projectile',
'lasgun',
@@ -138,6 +139,7 @@ function effectiveWeaponKills(
}
/** Compulsion considers the card's default role, never forces an alternate role. */
export function defaultVoiceMatch(card: Card, kind: string) {
if (kind === 'portableSnooper') return isPortableSnooper(card);
if (card.kind === kind) return true;
return (
isPortableSnooper(card) ||
@@ -151,6 +153,7 @@ export function playedVoiceMatch(
slot: 'weapon' | 'defense' | 'leader',
kind: string,
) {
if (kind === 'portableSnooper') return slot === 'defense' && isPortableSnooper(card);
return (
!!card &&
(card.kind === kind ||
@@ -178,6 +181,7 @@ export function battleCardLabel(kind: string) {
hero: 'Cheap Hero',
shield: 'Projectile defense',
snooper: 'Poison defense',
portableSnooper: 'Portable Snooper',
projectile: 'Projectile weapon',
poison: 'Poison weapon',
lasgun: 'Lasgun',
+1 -1
View File
@@ -958,7 +958,7 @@ export type Battle = {
field: PlanField;
value?: string | number | null;
};
voice?: { target: string; kind: Card['kind'] | 'stoneBurner' | 'mirrorWeapon'; must: boolean };
voice?: { target: string; kind: Card['kind'] | 'stoneBurner' | 'mirrorWeapon' | 'portableSnooper'; must: boolean };
};
export type Auction = {
/** New ordinary lots use trusted online timing; old open lots stay unstamped. */
+3 -1
View File
@@ -21,6 +21,8 @@ export function portableSnooperPlanBlock(
if (weapon && defense)
return 'Portable Snooper cannot follow a weapon and Worthless card or another two-card plan.';
if (voice && !voice.must && playedVoiceMatch(card, 'defense', voice.kind))
return 'The Bene Gesserit Voice forbids this poison defense.';
return voice.kind === 'portableSnooper'
? 'The Bene Gesserit Voice forbids Portable Snooper.'
: 'The Bene Gesserit Voice forbids this poison defense.';
return null;
}
+1 -1
View File
@@ -828,7 +828,7 @@ export const RULE_TOPICS: RuleTopic[] = [
steps: [
'Portable Snooper is a poison defense. Any faction holding the canonical card may select it in the normal defense slot. It protects against ordinary poison and Chemistry used as a weapon. It is not a shield; it does not stop projectiles, Lasgun, Artillery Strike or an activated Poison Tooth. Poison Blade still kills through its projectile attack.',
'After both battle plans are publicly revealed, open Portable Snooper in your hand to add it as a late defense. Your original plan must have a leader or Cheap Hero and no actual defense. A lone Worthless card in either slot permits this extra defense; a weapon plus Worthless, two Worthless cards or another two-card plan does not. There must be room within the two battle-card slots.',
'The Bene Gesserit Voice still applies. A prohibition on poison defense forbids Portable Snooper; a poison-weapon prohibition does not. When Voice compels a poison defense and you hold this card, satisfy that requirement in the original plan. You cannot omit it on the promise of adding it later.',
'The Bene Gesserit Voice still applies. A prohibition on poison defense forbids Portable Snooper; a poison-weapon prohibition does not. Voice may name Portable Snooper specifically, leaving an ordinary Snooper distinct. When Voice compels this card or a poison defense and you can comply, satisfy the requirement in the original plan. You cannot omit it on the promise of adding it later.',
'Play the late defense before submitting your own traitor decision, after any current Truthtrance, response or Poison Tooth choice finishes. This application procedure uses the existing decision opportunity, regardless of either hand, and does not add a holder-only public window. Your submitted traitor decision closes your late opportunity; another combatant submitting first does not close it.',
'The original revealed plan remains unchanged. The public table shows Portable Snooper separately as added after reveal, with its own inspector. Prescience and structured Truthtrance claims about the original defense slot still refer to that original slot. Broader freeform promises remain broader than the structured slot model.',
'The played card stays reserved with your battle cards until normal cleanup. A losing player discards it; the general official FAQ permits a winner to retain it. Moritani alliance retention can apply when its ordinary conditions allow. Successful traitors and actual Lasgun–shield explosions keep their existing precedence. Portable adds no spice payment, bounty or automatic traitor call.',