"Throw Yourself in Next Time"
This commit is contained in:
@@ -7,6 +7,7 @@ import com.gempukku.lotro.filters.Filter;
|
||||
import com.gempukku.lotro.filters.Filters;
|
||||
import com.gempukku.lotro.game.LotroCardBlueprint;
|
||||
import com.gempukku.lotro.game.PhysicalCard;
|
||||
import com.gempukku.lotro.game.PhysicalCardVisitor;
|
||||
import com.gempukku.lotro.game.state.GameState;
|
||||
import com.gempukku.lotro.game.state.LotroGame;
|
||||
import com.gempukku.lotro.logic.effects.PlayCardEffect;
|
||||
@@ -93,8 +94,25 @@ public class PlayConditions {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean canExert(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
|
||||
return (modifiersQuerying.getVitality(gameState, card) > 1);
|
||||
public static boolean canExert(final PhysicalCard source, final GameState gameState, final ModifiersQuerying modifiersQuerying, Filter... filters) {
|
||||
return canExert(source, gameState, modifiersQuerying, 1, filters);
|
||||
}
|
||||
|
||||
public static boolean canExert(final PhysicalCard source, final GameState gameState, final ModifiersQuerying modifiersQuerying, final int times, Filter... filters) {
|
||||
final Filter filter = Filters.and(filters);
|
||||
return gameState.iterateActiveCards(
|
||||
new PhysicalCardVisitor() {
|
||||
@Override
|
||||
public boolean visitPhysicalCard(PhysicalCard physicalCard) {
|
||||
return filter.accepts(gameState, modifiersQuerying, physicalCard)
|
||||
&& (modifiersQuerying.getVitality(gameState, physicalCard) > times)
|
||||
&& modifiersQuerying.canBeExerted(gameState, source, physicalCard);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static boolean canExert(PhysicalCard source, GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
|
||||
return canExert(source, gameState, modifiersQuerying, Filters.sameCard(card));
|
||||
}
|
||||
|
||||
public static boolean winsSkirmish(EffectResult effectResult, PhysicalCard character) {
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.gempukku.lotro.cards.modifiers;
|
||||
|
||||
import com.gempukku.lotro.filters.Filter;
|
||||
import com.gempukku.lotro.game.PhysicalCard;
|
||||
import com.gempukku.lotro.game.state.GameState;
|
||||
import com.gempukku.lotro.logic.modifiers.AbstractModifier;
|
||||
import com.gempukku.lotro.logic.modifiers.ModifierEffect;
|
||||
import com.gempukku.lotro.logic.modifiers.ModifiersLogic;
|
||||
|
||||
public class CantExertWithCardModifier extends AbstractModifier {
|
||||
private Filter _preventExertWithFilter;
|
||||
|
||||
public CantExertWithCardModifier(PhysicalCard source, Filter affectFilter, Filter preventExertWithFilter) {
|
||||
super(source, "Affected by exertion preventing effect", affectFilter, new ModifierEffect[]{ModifierEffect.WOUND_MODIFIER});
|
||||
_preventExertWithFilter = preventExertWithFilter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeExerted(GameState gameState, ModifiersLogic modifiersLogic, PhysicalCard source, PhysicalCard card, boolean result) {
|
||||
if (_preventExertWithFilter.accepts(gameState, modifiersLogic, source))
|
||||
return false;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package com.gempukku.lotro.cards.set2.moria;
|
||||
|
||||
import com.gempukku.lotro.cards.AbstractAttachable;
|
||||
import com.gempukku.lotro.cards.modifiers.CantExertWithCardModifier;
|
||||
import com.gempukku.lotro.common.CardType;
|
||||
import com.gempukku.lotro.common.Culture;
|
||||
import com.gempukku.lotro.common.Race;
|
||||
import com.gempukku.lotro.common.Side;
|
||||
import com.gempukku.lotro.filters.Filter;
|
||||
import com.gempukku.lotro.filters.Filters;
|
||||
import com.gempukku.lotro.game.PhysicalCard;
|
||||
import com.gempukku.lotro.game.state.LotroGame;
|
||||
import com.gempukku.lotro.logic.modifiers.Modifier;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Set: Mines of Moria
|
||||
* Side: Shadow
|
||||
* Culture: Moria
|
||||
* Twilight Cost: 0
|
||||
* Type: Condition
|
||||
* Game Text: To play, spot a [MORIA] Orc. Plays on a Hobbit companion. Bearer may be exerted only by Shadow cards.
|
||||
*/
|
||||
public class Card2_071 extends AbstractAttachable {
|
||||
public Card2_071() {
|
||||
super(Side.SHADOW, CardType.CONDITION, 0, Culture.MORIA, null, "Throw Yourself in Next Time");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkPlayRequirements(String playerId, LotroGame game, PhysicalCard self, Filter additionalAttachmentFilter, int twilightModifier) {
|
||||
return super.checkPlayRequirements(playerId, game, self, additionalAttachmentFilter, twilightModifier)
|
||||
&& Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.culture(Culture.MORIA), Filters.race(Race.ORC));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter getValidTargetFilter(String playerId, LotroGame game, PhysicalCard self) {
|
||||
return Filters.and(Filters.race(Race.HOBBIT), Filters.type(CardType.COMPANION));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends Modifier> getAlwaysOnModifiers(PhysicalCard self) {
|
||||
return Collections.singletonList(new CantExertWithCardModifier(self, Filters.hasAttached(self), Filters.not(Filters.side(Side.SHADOW))));
|
||||
}
|
||||
}
|
||||
@@ -100,6 +100,11 @@ public abstract class AbstractModifier implements Modifier {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeExerted(GameState gameState, ModifiersLogic modifiersLogic, PhysicalCard exertionSource, PhysicalCard card, boolean result) {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllyOnCurrentSite(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean allyOnCurrentSite) {
|
||||
return allyOnCurrentSite;
|
||||
|
||||
@@ -41,6 +41,8 @@ public interface Modifier {
|
||||
|
||||
public boolean canTakeWound(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard, boolean result);
|
||||
|
||||
public boolean canBeExerted(GameState gameState, ModifiersLogic modifiersLogic, PhysicalCard source, PhysicalCard card, boolean result);
|
||||
|
||||
public boolean isAllyOnCurrentSite(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard card, boolean allyOnCurrentSite);
|
||||
|
||||
public int getArcheryTotal(GameState gameState, ModifiersQuerying modifiersQuerying, Side side, int result);
|
||||
|
||||
@@ -3,5 +3,5 @@ package com.gempukku.lotro.logic.modifiers;
|
||||
public enum ModifierEffect {
|
||||
KEYWORD_MODIFIER, STRENGTH_MODIFIER, VITALITY_MODIFIER, TWILIGHT_COST_MODIFIER, OVERWHELM_MODIFIER, WOUND_MODIFIER,
|
||||
PRESENCE_MODIFIER, ARCHERY_MODIFIER, MOVE_LIMIT_MODIFIER, ACTION_MODIFIER, ASSIGNMENT_MODIFIER, DISCARD_FROM_PLAY_MODIFIER,
|
||||
LOOK_OR_REVEAL_MODIFIER, ALL_MODIFIER
|
||||
LOOK_OR_REVEAL_MODIFIER
|
||||
}
|
||||
|
||||
@@ -161,11 +161,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
|
||||
return false;
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean result = physicalCard.getBlueprint().hasKeyword(keyword);
|
||||
|
||||
@@ -173,10 +168,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.hasKeyword(gameState, this, physicalCard, keyword, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.hasKeyword(gameState, this, physicalCard, keyword, result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -187,21 +178,12 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
|
||||
return 0;
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
|
||||
return 0;
|
||||
}
|
||||
|
||||
int result = physicalCard.getBlueprint().getKeywordCount(keyword);
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.KEYWORD_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getKeywordCount(gameState, this, physicalCard, keyword, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getKeywordCount(gameState, this, physicalCard, keyword, result);
|
||||
}
|
||||
return Math.max(0, result);
|
||||
}
|
||||
|
||||
@@ -210,8 +192,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
int result = baseArcheryTotal;
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ARCHERY_MODIFIER))
|
||||
result = modifier.getArcheryTotal(gameState, this, side, result);
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER))
|
||||
result = modifier.getArcheryTotal(gameState, this, side, result);
|
||||
return Math.max(0, result);
|
||||
}
|
||||
|
||||
@@ -220,9 +200,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
int result = baseMoveLimit;
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.MOVE_LIMIT_MODIFIER))
|
||||
result = modifier.getMoveLimit(gameState, this, result);
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER))
|
||||
result = modifier.getMoveLimit(gameState, this, result);
|
||||
|
||||
return Math.max(1, result);
|
||||
}
|
||||
|
||||
@@ -234,11 +211,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
&& appliesStrengthModifier(gameState, modifier.getSource()))
|
||||
result = modifier.getStrength(gameState, this, physicalCard, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
|
||||
&& appliesStrengthModifier(gameState, modifier.getSource()))
|
||||
result = modifier.getStrength(gameState, this, physicalCard, result);
|
||||
}
|
||||
return Math.max(0, result);
|
||||
}
|
||||
|
||||
@@ -250,10 +222,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (affectsCardWithSkipSet(gameState, modifierSource, modifier))
|
||||
result = modifier.appliesStrengthModifier(gameState, this, modifierSource, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, modifierSource, modifier))
|
||||
result = modifier.appliesStrengthModifier(gameState, this, modifierSource, result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -264,10 +232,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getVitality(gameState, this, physicalCard, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getVitality(gameState, this, physicalCard, result);
|
||||
}
|
||||
return Math.max(0, result);
|
||||
}
|
||||
|
||||
@@ -278,10 +242,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getTwilightCost(gameState, this, physicalCard, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getTwilightCost(gameState, this, physicalCard, result);
|
||||
}
|
||||
return Math.max(0, result);
|
||||
}
|
||||
|
||||
@@ -292,10 +252,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getPlayOnTwilightCost(gameState, this, physicalCard, target, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getPlayOnTwilightCost(gameState, this, physicalCard, target, result);
|
||||
}
|
||||
return Math.max(0, result);
|
||||
}
|
||||
|
||||
@@ -306,10 +262,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getRoamingPenalty(gameState, this, physicalCard, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
||||
result = modifier.getRoamingPenalty(gameState, this, physicalCard, result);
|
||||
}
|
||||
return Math.max(0, result);
|
||||
}
|
||||
|
||||
@@ -320,10 +272,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.isOverwhelmedByStrength(gameState, this, card, strength, opposingStrength, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.isOverwhelmedByStrength(gameState, this, card, strength, opposingStrength, result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -334,9 +282,15 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.canTakeWound(gameState, this, card, result);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeExerted(GameState gameState, PhysicalCard source, PhysicalCard card) {
|
||||
boolean result = true;
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.canTakeWound(gameState, this, card, result);
|
||||
result = modifier.canBeExerted(gameState, this, source, card, result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -349,10 +303,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
allyOnCurrentSite = modifier.isAllyOnCurrentSite(gameState, this, card, allyOnCurrentSite);
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
allyOnCurrentSite = modifier.isAllyOnCurrentSite(gameState, this, card, allyOnCurrentSite);
|
||||
}
|
||||
return allyOnCurrentSite;
|
||||
}
|
||||
|
||||
@@ -362,9 +312,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ARCHERY_MODIFIER))
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.addsToArcheryTotal(gameState, this, card, result);
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER))
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.addsToArcheryTotal(gameState, this, card, result);
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -374,8 +321,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
boolean result = true;
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ACTION_MODIFIER))
|
||||
result = modifier.canPlayAction(gameState, this, action, result);
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER))
|
||||
result = modifier.canPlayAction(gameState, this, action, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -384,8 +329,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
boolean result = false;
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ACTION_MODIFIER))
|
||||
result = modifier.shouldSkipPhase(gameState, this, phase, playerId, result);
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER))
|
||||
result = modifier.shouldSkipPhase(gameState, this, phase, playerId, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -393,7 +336,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
public boolean isValidFreePlayerAssignments(GameState gameState, Map<PhysicalCard, List<PhysicalCard>> assignments) {
|
||||
boolean result = true;
|
||||
|
||||
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ASSIGNMENT_MODIFIER)) {
|
||||
result = modifier.isValidFreePlayerAssignments(gameState, this, assignments, result);
|
||||
for (Map.Entry<PhysicalCard, List<PhysicalCard>> assignment : assignments.entrySet()) {
|
||||
@@ -401,13 +343,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
result = modifier.isValidFreePlayerAssignments(gameState, this, assignment.getKey(), assignment.getValue(), result);
|
||||
}
|
||||
}
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER)) {
|
||||
result = modifier.isValidFreePlayerAssignments(gameState, this, assignments, result);
|
||||
for (Map.Entry<PhysicalCard, List<PhysicalCard>> assignment : assignments.entrySet()) {
|
||||
if (affectsCardWithSkipSet(gameState, assignment.getKey(), modifier))
|
||||
result = modifier.isValidFreePlayerAssignments(gameState, this, assignment.getKey(), assignment.getValue(), result);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -417,9 +352,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.DISCARD_FROM_PLAY_MODIFIER))
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.canBeDiscardedFromPlay(gameState, this, card, source, result);
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER))
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.canBeDiscardedFromPlay(gameState, this, card, source, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -429,9 +361,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER))
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.canBeHealed(gameState, this, card, result);
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER))
|
||||
if (affectsCardWithSkipSet(gameState, card, modifier))
|
||||
result = modifier.canBeHealed(gameState, this, card, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -460,9 +389,6 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.DISCARD_FROM_PLAY_MODIFIER))
|
||||
if (!modifier.canLookOrRevealCardsInHand(gameState, this, playerId))
|
||||
return false;
|
||||
for (Modifier modifier : getModifiers(ModifierEffect.ALL_MODIFIER))
|
||||
if (!modifier.canLookOrRevealCardsInHand(gameState, this, playerId))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@ public interface ModifiersQuerying {
|
||||
|
||||
public boolean canTakeWound(GameState gameState, PhysicalCard card);
|
||||
|
||||
public boolean canBeExerted(GameState gameState, PhysicalCard exertionSource, PhysicalCard card);
|
||||
|
||||
public boolean isAllyOnCurrentSite(GameState gameState, PhysicalCard card);
|
||||
|
||||
public boolean addsToArcheryTotal(GameState gameState, PhysicalCard card);
|
||||
|
||||
Reference in New Issue
Block a user