Checking conditions for modifiers once only, not for every card.

This commit is contained in:
marcins78@gmail.com
2011-11-30 22:33:29 +00:00
parent 1915def0ce
commit 2103235c14
18 changed files with 55 additions and 103 deletions

View File

@@ -12,7 +12,6 @@ import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
public class ArcheryTotalModifier extends AbstractModifier {
private Side _side;
private Condition _condition;
private Evaluator _evaluator;
public ArcheryTotalModifier(PhysicalCard source, Side side, int modifier) {
@@ -24,9 +23,8 @@ public class ArcheryTotalModifier extends AbstractModifier {
}
public ArcheryTotalModifier(PhysicalCard source, Side side, Condition condition, Evaluator evaluator) {
super(source, null, null, ModifierEffect.ARCHERY_MODIFIER);
super(source, null, null, condition, ModifierEffect.ARCHERY_MODIFIER);
_side = side;
_condition = condition;
_evaluator = evaluator;
}
@@ -38,9 +36,6 @@ public class ArcheryTotalModifier extends AbstractModifier {
@Override
public int getArcheryTotalModifier(GameState gameState, ModifiersQuerying modifiersQuerying, Side side) {
if (side == _side && ((_condition == null) || (_condition.isFullfilled(gameState, modifiersQuerying))))
return _evaluator.evaluateExpression(gameState, modifiersQuerying, null);
else
return 0;
return _evaluator.evaluateExpression(gameState, modifiersQuerying, null);
}
}

View File

@@ -11,12 +11,10 @@ import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class CantDiscardCardsFromHandOrTopOfDeckModifier extends AbstractModifier {
private Filterable[] _discardSourceAffected;
private Condition _condition;
private String _playerId;
public CantDiscardCardsFromHandOrTopOfDeckModifier(PhysicalCard source, Condition condition, String playerId, Filterable... discardSourceAffected) {
super(source, null, null, ModifierEffect.DISCARD_NOT_FROM_PLAY);
_condition = condition;
super(source, null, null, condition, ModifierEffect.DISCARD_NOT_FROM_PLAY);
_playerId = playerId;
_discardSourceAffected = discardSourceAffected;
}
@@ -24,18 +22,16 @@ public class CantDiscardCardsFromHandOrTopOfDeckModifier extends AbstractModifie
@Override
public boolean canDiscardCardsFromHand(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId, PhysicalCard source) {
if (playerId.equals(_playerId))
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
if (source == null || Filters.and(_discardSourceAffected).accepts(gameState, modifiersQuerying, source))
return false;
if (source == null || Filters.and(_discardSourceAffected).accepts(gameState, modifiersQuerying, source))
return false;
return true;
}
@Override
public boolean canDiscardCardsFromTopOfDeck(GameState gameState, ModifiersQuerying modifiersQuerying, String playerId, PhysicalCard source) {
if (playerId.equals(_playerId))
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
if (source == null || Filters.and(_discardSourceAffected).accepts(gameState, modifiersQuerying, source))
return false;
if (source == null || Filters.and(_discardSourceAffected).accepts(gameState, modifiersQuerying, source))
return false;
return true;
}
}

View File

@@ -11,7 +11,6 @@ import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Action;
public class CantPlayCardsModifier extends AbstractModifier {
private Condition _condition;
private Filterable[] _filters;
public CantPlayCardsModifier(PhysicalCard source, Filterable... filters) {
@@ -19,8 +18,7 @@ public class CantPlayCardsModifier extends AbstractModifier {
}
public CantPlayCardsModifier(PhysicalCard source, Condition condition, Filterable... filters) {
super(source, null, null, null, ModifierEffect.ACTION_MODIFIER);
_condition = condition;
super(source, null, null, condition, ModifierEffect.ACTION_MODIFIER);
_filters = filters;
}
@@ -29,9 +27,8 @@ public class CantPlayCardsModifier extends AbstractModifier {
final PhysicalCard actionSource = action.getActionSource().getPhysicalCard();
if (actionSource != null)
if (action.getType() == Action.Type.PLAY_CARD)
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
if (Filters.and(_filters).accepts(gameState, modifiersQuerying, actionSource))
return false;
if (Filters.and(_filters).accepts(gameState, modifiersQuerying, actionSource))
return false;
return true;
}
}

View File

@@ -10,19 +10,16 @@ import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class CantRemoveBurdensModifier extends AbstractModifier {
private Condition _condition;
private Filterable[] _sourceFilters;
public CantRemoveBurdensModifier(PhysicalCard source, Condition condition, Filterable... sourceFilters) {
super(source, "Can't remove burdens", null, condition, ModifierEffect.BURDEN_MODIFIER);
_condition = condition;
_sourceFilters = sourceFilters;
}
@Override
public boolean canRemoveBurden(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard source) {
if ((_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
&& Filters.and(_sourceFilters).accepts(gameState, modifiersQuerying, source))
if (Filters.and(_sourceFilters).accepts(gameState, modifiersQuerying, source))
return false;
return true;
}

View File

@@ -10,19 +10,16 @@ import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class CantRemoveThreatsModifier extends AbstractModifier {
private Condition _condition;
private Filterable[] _sourceFilters;
public CantRemoveThreatsModifier(PhysicalCard source, Condition condition, Filterable... sourceFilters) {
super(source, "Can't remove threats", null, condition, ModifierEffect.BURDEN_MODIFIER);
_condition = condition;
_sourceFilters = sourceFilters;
}
@Override
public boolean canRemoveThreat(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard source) {
if ((_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
&& Filters.and(_sourceFilters).accepts(gameState, modifiersQuerying, source))
if (Filters.and(_sourceFilters).accepts(gameState, modifiersQuerying, source))
return false;
return true;
}

View File

@@ -10,21 +10,17 @@ import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class FreePeoplePlayerMayNotAssignCharacterModifier extends AbstractModifier {
private Condition _condition;
public FreePeoplePlayerMayNotAssignCharacterModifier(PhysicalCard source, Filterable affectFilter) {
this(source, null, affectFilter);
}
public FreePeoplePlayerMayNotAssignCharacterModifier(PhysicalCard source, Condition condition, Filterable affectFilter) {
super(source, "Free people player may not assign character to skirmish", affectFilter, null, ModifierEffect.ASSIGNMENT_MODIFIER);
_condition = condition;
super(source, "Free people player may not assign character to skirmish", affectFilter, condition, ModifierEffect.ASSIGNMENT_MODIFIER);
}
@Override
public boolean canBeAssignedToSkirmish(GameState gameState, Side sidePlayer, ModifiersQuerying modifiersQuerying, PhysicalCard card) {
if (sidePlayer == Side.FREE_PEOPLE
&& (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying)))
if (sidePlayer == Side.FREE_PEOPLE)
return false;
return true;
}

View File

@@ -9,19 +9,15 @@ import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class HasInitiativeModifier extends AbstractModifier {
private Condition _condition;
private Side _side;
public HasInitiativeModifier(PhysicalCard source, Condition condition, Side side) {
super(source, side + " has initiative", null, ModifierEffect.INITIATIVE_MODIFIER);
_condition = condition;
super(source, side + " has initiative", null, condition, ModifierEffect.INITIATIVE_MODIFIER);
_side = side;
}
@Override
public Side hasInitiative(GameState gameState, ModifiersQuerying modifiersQuerying) {
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
return _side;
return null;
return _side;
}
}

View File

@@ -10,7 +10,6 @@ import com.gempukku.lotro.logic.modifiers.evaluator.ConstantEvaluator;
import com.gempukku.lotro.logic.modifiers.evaluator.Evaluator;
public class InitiativeHandSizeModifier extends AbstractModifier {
private Condition _condition;
private Evaluator _evaluator;
public InitiativeHandSizeModifier(PhysicalCard source, int modifier) {
@@ -22,16 +21,12 @@ public class InitiativeHandSizeModifier extends AbstractModifier {
}
public InitiativeHandSizeModifier(PhysicalCard source, Condition condition, Evaluator evaluator) {
super(source, null, null, ModifierEffect.INITIATIVE_MODIFIER);
_condition = condition;
super(source, null, null, condition, ModifierEffect.INITIATIVE_MODIFIER);
_evaluator = evaluator;
}
@Override
public int getInitiativeHandSizeModifier(GameState gameState, ModifiersQuerying modifiersQuerying) {
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
return _evaluator.evaluateExpression(gameState, modifiersQuerying, null);
else
return 0;
return _evaluator.evaluateExpression(gameState, modifiersQuerying, null);
}
}

View File

@@ -8,7 +8,6 @@ import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class MoveLimitModifier extends AbstractModifier {
private Condition _condition;
private int _moveLimitModifier;
public MoveLimitModifier(PhysicalCard source, int moveLimitModifier) {
@@ -16,15 +15,12 @@ public class MoveLimitModifier extends AbstractModifier {
}
public MoveLimitModifier(PhysicalCard source, Condition condition, int moveLimitModifier) {
super(source, "Move limit " + ((moveLimitModifier < 0) ? moveLimitModifier : ("+" + moveLimitModifier)), null, ModifierEffect.MOVE_LIMIT_MODIFIER);
_condition = condition;
super(source, "Move limit " + ((moveLimitModifier < 0) ? moveLimitModifier : ("+" + moveLimitModifier)), null, condition, ModifierEffect.MOVE_LIMIT_MODIFIER);
_moveLimitModifier = moveLimitModifier;
}
@Override
public int getMoveLimitModifier(GameState gameState, ModifiersQuerying modifiersQuerying) {
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
return _moveLimitModifier;
return 0;
return _moveLimitModifier;
}
}

View File

@@ -10,8 +10,6 @@ import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Action;
public class PlayerCantPlayPhaseEventsOrSpecialAbilitiesModifier extends AbstractModifier {
private Condition _condition;
private String _playerId;
private Phase _phase;
@@ -20,17 +18,15 @@ public class PlayerCantPlayPhaseEventsOrSpecialAbilitiesModifier extends Abstrac
}
public PlayerCantPlayPhaseEventsOrSpecialAbilitiesModifier(PhysicalCard source, Condition condition, String playerId, Phase phase) {
super(source, null, null, ModifierEffect.ACTION_MODIFIER);
_condition = condition;
super(source, null, null, condition, ModifierEffect.ACTION_MODIFIER);
_playerId = playerId;
_phase = phase;
}
@Override
public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action) {
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
if (performingPlayer.equals(_playerId) && action.getActionTimeword() == _phase)
return false;
if (performingPlayer.equals(_playerId) && action.getActionTimeword() == _phase)
return false;
return true;
}
}

View File

@@ -10,8 +10,6 @@ import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Action;
public class PlayerCantUsePhaseSpecialAbilitiesModifier extends AbstractModifier {
private Condition _condition;
private String _playerId;
private Phase _phase;
@@ -20,17 +18,15 @@ public class PlayerCantUsePhaseSpecialAbilitiesModifier extends AbstractModifier
}
public PlayerCantUsePhaseSpecialAbilitiesModifier(PhysicalCard source, Condition condition, String playerId, Phase phase) {
super(source, null, null, ModifierEffect.ACTION_MODIFIER);
_condition = condition;
super(source, null, null, condition, ModifierEffect.ACTION_MODIFIER);
_playerId = playerId;
_phase = phase;
}
@Override
public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action) {
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
if (performingPlayer.equals(_playerId) && action.getActionTimeword() == _phase && action.getType() == Action.Type.SPECIAL_ABILITY)
return false;
if (performingPlayer.equals(_playerId) && action.getActionTimeword() == _phase && action.getType() == Action.Type.SPECIAL_ABILITY)
return false;
return true;
}
}

View File

@@ -10,7 +10,6 @@ import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Action;
public class PlayersCantPlayPhaseEventsOrSpecialAbilitiesModifier extends AbstractModifier {
private Condition _condition;
private Phase _phase;
public PlayersCantPlayPhaseEventsOrSpecialAbilitiesModifier(PhysicalCard source, Phase phase) {
@@ -18,16 +17,14 @@ public class PlayersCantPlayPhaseEventsOrSpecialAbilitiesModifier extends Abstra
}
public PlayersCantPlayPhaseEventsOrSpecialAbilitiesModifier(PhysicalCard source, Condition condition, Phase phase) {
super(source, null, null, ModifierEffect.ACTION_MODIFIER);
_condition = condition;
super(source, null, null, condition, ModifierEffect.ACTION_MODIFIER);
_phase = phase;
}
@Override
public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action) {
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
if (action.getActionTimeword() == _phase)
return false;
if (action.getActionTimeword() == _phase)
return false;
return true;
}
}

View File

@@ -10,8 +10,6 @@ import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
import com.gempukku.lotro.logic.timing.Action;
public class PlayersCantUsePhaseSpecialAbilitiesModifier extends AbstractModifier {
private Condition _condition;
private Phase _phase;
public PlayersCantUsePhaseSpecialAbilitiesModifier(PhysicalCard source, Phase phase) {
@@ -19,16 +17,14 @@ public class PlayersCantUsePhaseSpecialAbilitiesModifier extends AbstractModifie
}
public PlayersCantUsePhaseSpecialAbilitiesModifier(PhysicalCard source, Condition condition, Phase phase) {
super(source, null, null, ModifierEffect.ACTION_MODIFIER);
_condition = condition;
super(source, null, null, condition, ModifierEffect.ACTION_MODIFIER);
_phase = phase;
}
@Override
public boolean canPlayAction(GameState gameState, ModifiersQuerying modifiersQuerying, String performingPlayer, Action action) {
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
if (action.getActionTimeword() == _phase && action.getType() == Action.Type.SPECIAL_ABILITY)
return false;
if (action.getActionTimeword() == _phase && action.getType() == Action.Type.SPECIAL_ABILITY)
return false;
return true;
}
}

View File

@@ -9,7 +9,6 @@ import com.gempukku.lotro.logic.modifiers.ModifierEffect;
import com.gempukku.lotro.logic.modifiers.ModifiersQuerying;
public class ShouldSkipPhaseModifier extends AbstractModifier {
private Condition _condition;
private Phase _phase;
private String _playerId;
@@ -22,15 +21,14 @@ public class ShouldSkipPhaseModifier extends AbstractModifier {
}
public ShouldSkipPhaseModifier(PhysicalCard source, String playerId, Condition condition, Phase phase) {
super(source, "Skip " + phase.toString() + " phase", null, ModifierEffect.ACTION_MODIFIER);
super(source, "Skip " + phase.toString() + " phase", null, condition, ModifierEffect.ACTION_MODIFIER);
_playerId = playerId;
_condition = condition;
_phase = phase;
}
@Override
public boolean shouldSkipPhase(GameState gameState, ModifiersQuerying modifiersQuerying, Phase phase, String playerId) {
if (phase == _phase && (_playerId == null || _playerId.equals(playerId)) && (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying)))
if (phase == _phase && (_playerId == null || _playerId.equals(playerId)))
return true;
return false;
}

View File

@@ -5,7 +5,6 @@ import com.gempukku.lotro.game.state.GameState;
import com.gempukku.lotro.logic.modifiers.*;
public class SpecialFlagModifier extends AbstractModifier {
private Condition _condition;
private ModifierFlag _modifierFlag;
public SpecialFlagModifier(PhysicalCard source, ModifierFlag modifierFlag) {
@@ -13,15 +12,12 @@ public class SpecialFlagModifier extends AbstractModifier {
}
public SpecialFlagModifier(PhysicalCard source, Condition condition, ModifierFlag modifierFlag) {
super(source, "Special flag set", null, ModifierEffect.SPECIAL_FLAG_MODIFIER);
_condition = condition;
super(source, "Special flag set", null, condition, ModifierEffect.SPECIAL_FLAG_MODIFIER);
_modifierFlag = modifierFlag;
}
@Override
public boolean hasFlagActive(GameState gameState, ModifiersQuerying modifiersQuerying, ModifierFlag modifierFlag) {
if (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying))
return modifierFlag == _modifierFlag;
return false;
return modifierFlag == _modifierFlag;
}
}

View File

@@ -31,6 +31,11 @@ public abstract class AbstractModifier implements Modifier {
_effect = effect;
}
@Override
public Condition getCondition() {
return _condition;
}
@Override
public PhysicalCard getSource() {
return _physicalCard;
@@ -48,7 +53,7 @@ public abstract class AbstractModifier implements Modifier {
@Override
public boolean affectsCard(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard) {
return (_condition == null || _condition.isFullfilled(gameState, modifiersQuerying)) && (_affectFilter != null && _affectFilter.accepts(gameState, modifiersQuerying, physicalCard));
return (_affectFilter != null && _affectFilter.accepts(gameState, modifiersQuerying, physicalCard));
}
@Override

View File

@@ -21,6 +21,8 @@ public interface Modifier {
public ModifierEffect getModifierEffect();
public Condition getCondition();
public boolean affectsCard(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard);
public boolean hasRemovedText(GameState gameState, ModifiersQuerying modifiersQuerying, PhysicalCard physicalCard);

View File

@@ -83,16 +83,15 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
if (modifiers == null)
return Collections.emptyList();
else {
if (modifierEffect != ModifierEffect.TEXT_MODIFIER) {
LinkedList<Modifier> liveModifiers = new LinkedList<Modifier>();
for (Modifier modifier : modifiers) {
if (modifier.getSource() == null || !hasTextRemoved(gameState, modifier.getSource()))
LinkedList<Modifier> liveModifiers = new LinkedList<Modifier>();
for (Modifier modifier : modifiers) {
Condition condition = modifier.getCondition();
if (condition == null || condition.isFullfilled(gameState, this))
if (modifierEffect == ModifierEffect.TEXT_MODIFIER || modifier.getSource() == null || !hasTextRemoved(gameState, modifier.getSource()))
liveModifiers.add(modifier);
}
}
return liveModifiers;
} else
return modifiers;
return liveModifiers;
}
}
@@ -156,8 +155,10 @@ public class ModifiersLogic implements ModifiersEnvironment, ModifiersQuerying {
Set<Modifier> result = new HashSet<Modifier>();
for (List<Modifier> modifiers : _modifiers.values()) {
for (Modifier modifier : modifiers) {
if (affectsCardWithSkipSet(gameState, card, modifier))
result.add(modifier);
Condition condition = modifier.getCondition();
if (condition == null || condition.isFullfilled(gameState, this))
if (affectsCardWithSkipSet(gameState, card, modifier))
result.add(modifier);
}
}
return result;