|
|
|
|
@@ -168,39 +168,53 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean hasKeyword(GameState gameState, PhysicalCard physicalCard, Keyword keyword) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.KEYWORD_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(physicalCard, "hasKeyword");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.KEYWORD_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (physicalCard.getBlueprint().hasKeyword(keyword))
|
|
|
|
|
return true;
|
|
|
|
|
if (physicalCard.getBlueprint().hasKeyword(keyword))
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.KEYWORD_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
|
|
|
|
|
&& appliesKeywordModifier(gameState, modifier.getSource(), keyword))
|
|
|
|
|
if (modifier.hasKeyword(gameState, this, physicalCard, keyword))
|
|
|
|
|
return true;
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.KEYWORD_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
|
|
|
|
|
&& appliesKeywordModifier(gameState, modifier.getSource(), keyword))
|
|
|
|
|
if (modifier.hasKeyword(gameState, this, physicalCard, keyword))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getKeywordCount(GameState gameState, PhysicalCard physicalCard, Keyword keyword) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.KEYWORD_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
if (modifier.isKeywordRemoved(gameState, this, physicalCard, keyword))
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(physicalCard, "getKeywordCount");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.KEYWORD_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)
|
|
|
|
|
&& appliesKeywordModifier(gameState, modifier.getSource(), keyword))
|
|
|
|
|
result += modifier.getKeywordCountModifier(gameState, this, physicalCard, keyword);
|
|
|
|
|
int result = physicalCard.getBlueprint().getKeywordCount(keyword);
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.KEYWORD_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
|
|
|
|
|
&& appliesKeywordModifier(gameState, modifier.getSource(), keyword))
|
|
|
|
|
result += modifier.getKeywordCountModifier(gameState, this, physicalCard, keyword);
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean appliesKeywordModifier(GameState gameState, PhysicalCard modifierSource, Keyword keyword) {
|
|
|
|
|
@@ -232,13 +246,20 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getStrength(GameState gameState, PhysicalCard physicalCard) {
|
|
|
|
|
int result = physicalCard.getBlueprint().getStrength();
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.STRENGTH_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
|
|
|
|
|
&& appliesStrengthModifier(gameState, modifier.getSource()))
|
|
|
|
|
result += modifier.getStrengthModifier(gameState, this, physicalCard);
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(physicalCard, "getStrength");
|
|
|
|
|
int result = physicalCard.getBlueprint().getStrength();
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.STRENGTH_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier)
|
|
|
|
|
&& appliesStrengthModifier(gameState, modifier.getSource()))
|
|
|
|
|
result += modifier.getStrengthModifier(gameState, this, physicalCard);
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean appliesStrengthModifier(GameState gameState, PhysicalCard modifierSource) {
|
|
|
|
|
@@ -254,157 +275,262 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getVitality(GameState gameState, PhysicalCard physicalCard) {
|
|
|
|
|
int result = physicalCard.getBlueprint().getVitality() - gameState.getWounds(physicalCard);
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.VITALITY_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getVitalityModifier(gameState, this, physicalCard);
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(physicalCard, "getVitality");
|
|
|
|
|
int result = physicalCard.getBlueprint().getVitality() - gameState.getWounds(physicalCard);
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.VITALITY_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getVitalityModifier(gameState, this, physicalCard);
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getResistance(GameState gameState, PhysicalCard physicalCard) {
|
|
|
|
|
int result = physicalCard.getBlueprint().getResistance() - gameState.getBurdens();
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.RESISTANCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getResistanceModifier(gameState, this, physicalCard);
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(physicalCard, "getResistance");
|
|
|
|
|
int result = physicalCard.getBlueprint().getResistance() - gameState.getBurdens();
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.RESISTANCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getResistanceModifier(gameState, this, physicalCard);
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getMinionSiteNumber(GameState gameState, PhysicalCard physicalCard) {
|
|
|
|
|
int result = physicalCard.getBlueprint().getSiteNumber();
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.SITE_NUMBER_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getMinionSiteNumberModifier(gameState, this, physicalCard);
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(physicalCard, "getMinionSiteNumber");
|
|
|
|
|
int result = physicalCard.getBlueprint().getSiteNumber();
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.SITE_NUMBER_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getMinionSiteNumberModifier(gameState, this, physicalCard);
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getTwilightCost(GameState gameState, PhysicalCard physicalCard, boolean ignoreRoamingPenalty) {
|
|
|
|
|
int result = physicalCard.getBlueprint().getTwilightCost();
|
|
|
|
|
result += physicalCard.getBlueprint().getTwilightCostModifier(gameState, this, physicalCard);
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.TWILIGHT_COST_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getTwilightCostModifier(gameState, this, physicalCard, ignoreRoamingPenalty);
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(physicalCard, "getTwilightCost");
|
|
|
|
|
int result = physicalCard.getBlueprint().getTwilightCost();
|
|
|
|
|
result += physicalCard.getBlueprint().getTwilightCostModifier(gameState, this, physicalCard);
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.TWILIGHT_COST_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getTwilightCostModifier(gameState, this, physicalCard, ignoreRoamingPenalty);
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getPlayOnTwilightCost(GameState gameState, PhysicalCard physicalCard, PhysicalCard target) {
|
|
|
|
|
int result = getTwilightCost(gameState, physicalCard, false);
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.TWILIGHT_COST_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getPlayOnTwilightCostModifier(gameState, this, physicalCard, target);
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(physicalCard, "getPlayOnTwilightCost");
|
|
|
|
|
int result = getTwilightCost(gameState, physicalCard, false);
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.TWILIGHT_COST_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getPlayOnTwilightCostModifier(gameState, this, physicalCard, target);
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getRoamingPenalty(GameState gameState, PhysicalCard physicalCard) {
|
|
|
|
|
int result = 2;
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.TWILIGHT_COST_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getRoamingPenaltyModifier(gameState, this, physicalCard);
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(physicalCard, "getRoamingPenalty");
|
|
|
|
|
int result = 2;
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.TWILIGHT_COST_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, physicalCard, modifier))
|
|
|
|
|
result += modifier.getRoamingPenaltyModifier(gameState, this, physicalCard);
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return Math.max(0, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int getOverwhelmMultiplier(GameState gameState, PhysicalCard card) {
|
|
|
|
|
int overwhelmMultiplier = 2;
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.OVERWHELM_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
overwhelmMultiplier = Math.max(overwhelmMultiplier, modifier.getOverwhelmMultiplier(gameState, this, card));
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "getOverwhelmMultiplier");
|
|
|
|
|
int overwhelmMultiplier = 2;
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.OVERWHELM_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
overwhelmMultiplier = Math.max(overwhelmMultiplier, modifier.getOverwhelmMultiplier(gameState, this, card));
|
|
|
|
|
}
|
|
|
|
|
return overwhelmMultiplier;
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return overwhelmMultiplier;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean canTakeWound(GameState gameState, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier)) {
|
|
|
|
|
Integer woundsTaken = _woundsPerPhaseMap.get(card.getCardId());
|
|
|
|
|
if (woundsTaken == null)
|
|
|
|
|
woundsTaken = 0;
|
|
|
|
|
if (!modifier.canTakeWound(gameState, this, card, woundsTaken))
|
|
|
|
|
return false;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "canTakeWound");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier)) {
|
|
|
|
|
Integer woundsTaken = _woundsPerPhaseMap.get(card.getCardId());
|
|
|
|
|
if (woundsTaken == null)
|
|
|
|
|
woundsTaken = 0;
|
|
|
|
|
if (!modifier.canTakeWound(gameState, this, card, woundsTaken))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean canTakeArcheryWound(GameState gameState, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier)) {
|
|
|
|
|
if (!modifier.canTakeArcheryWound(gameState, this, card))
|
|
|
|
|
return false;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "canTakeArcheryWound");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier)) {
|
|
|
|
|
if (!modifier.canTakeArcheryWound(gameState, this, card))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean canBeExerted(GameState gameState, PhysicalCard source, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.canBeExerted(gameState, this, source, card))
|
|
|
|
|
return false;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "canBeExerted");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.canBeExerted(gameState, this, source, card))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isAllyAllowedToParticipateInArcheryFire(GameState gameState, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (modifier.isAllyParticipateInArcheryFire(gameState, this, card))
|
|
|
|
|
return true;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "isAllyAllowedToParticipateInArcheryFire");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (modifier.isAllyParticipateInArcheryFire(gameState, this, card))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isAllowedToParticipateInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (modifier.isParticipateInSkirmishes(gameState, sidePlayer, this, card))
|
|
|
|
|
return true;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "isAllowedToParticipateInSkirmished");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (modifier.isParticipateInSkirmishes(gameState, sidePlayer, this, card))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isAllyPreventedFromParticipatingInArcheryFire(GameState gameState, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (modifier.isAllyPreventedFromParticipatingInArcheryFire(gameState, this, card))
|
|
|
|
|
return true;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "isAllyPreventedFromParticipatingInArcheryFire");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (modifier.isAllyPreventedFromParticipatingInArcheryFire(gameState, this, card))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isAllyPreventedFromParticipatingInSkirmishes(GameState gameState, Side sidePlayer, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (modifier.isAllyPreventedFromParticipatingInSkirmishes(gameState, sidePlayer, this, card))
|
|
|
|
|
return true;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "isAllyPreventedFromParticipatingInSkirmishes");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.PRESENCE_MODIFIER)) {
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (modifier.isAllyPreventedFromParticipatingInSkirmishes(gameState, sidePlayer, this, card))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean addsToArcheryTotal(GameState gameState, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.ARCHERY_MODIFIER))
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.addsToArcheryTotal(gameState, this, card))
|
|
|
|
|
return false;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "addsToArcheryTotal");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.ARCHERY_MODIFIER))
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.addsToArcheryTotal(gameState, this, card))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -474,28 +600,49 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean canBeAssignedToSkirmish(GameState gameState, Side sidePlayer, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.ASSIGNMENT_MODIFIER))
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.canBeAssignedToSkirmish(gameState, sidePlayer, this, card))
|
|
|
|
|
return false;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "canBeAssignedToSkirmish");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.ASSIGNMENT_MODIFIER))
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.canBeAssignedToSkirmish(gameState, sidePlayer, this, card))
|
|
|
|
|
return false;
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean canBeDiscardedFromPlay(GameState gameState, PhysicalCard card, PhysicalCard source) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.DISCARD_FROM_PLAY_MODIFIER))
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.canBeDiscardedFromPlay(gameState, this, card, source))
|
|
|
|
|
return false;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "canBeDiscardedFromPlay");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.DISCARD_FROM_PLAY_MODIFIER))
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.canBeDiscardedFromPlay(gameState, this, card, source))
|
|
|
|
|
return false;
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean canBeHealed(GameState gameState, PhysicalCard card) {
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER))
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.canBeHealed(gameState, this, card))
|
|
|
|
|
return false;
|
|
|
|
|
boolean starting = LoggingThreadLocal.isStarting();
|
|
|
|
|
try {
|
|
|
|
|
LoggingThreadLocal.log(card, "canBeHealed");
|
|
|
|
|
for (Modifier modifier : getModifiers(ModifierEffect.WOUND_MODIFIER))
|
|
|
|
|
if (affectsCardWithSkipSet(gameState, card, modifier))
|
|
|
|
|
if (!modifier.canBeHealed(gameState, this, card))
|
|
|
|
|
return false;
|
|
|
|
|
} finally {
|
|
|
|
|
if (starting)
|
|
|
|
|
LoggingThreadLocal.stop();
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|