Adding logging for detecting cases were too many calls are made.

This commit is contained in:
marcins78@gmail.com
2011-11-14 23:06:13 +00:00
parent 01847b8181
commit 6122fecfb8
4 changed files with 306 additions and 113 deletions

View File

@@ -66,7 +66,7 @@ public class Card2_053 extends AbstractAttachable {
}));
return Collections.singletonList(action);
}
return super.getRequiredAfterTriggers(game, effectResult, self);
return null;
}
@Override

View File

@@ -0,0 +1,34 @@
package com.gempukku.lotro.logic.modifiers;
import com.gempukku.lotro.game.PhysicalCard;
import org.apache.log4j.Logger;
public class LoggingThreadLocal {
private static final Logger LOG = Logger.getLogger(LoggingThreadLocal.class);
private static ThreadLocal<StringBuilder> _logLocal = new ThreadLocal<StringBuilder>();
private static ThreadLocal<Long> _start = new ThreadLocal<Long>();
public static boolean isStarting() {
if (_logLocal.get() == null) {
_logLocal.set(new StringBuilder());
_start.set(System.currentTimeMillis());
return true;
}
return false;
}
public static void log(PhysicalCard card, String desc) {
StringBuilder builder = _logLocal.get();
if (builder != null)
builder.append(card.getBlueprintId()).append(" ").append(desc).append(" - ");
}
public static void stop() {
long start = _start.get();
long time = System.currentTimeMillis() - start;
if (time > 100)
LOG.error("Processing took " + time + "ms: \n" + _logLocal.get().toString());
_start.set(null);
_logLocal.set(null);
}
}

View File

@@ -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;
}

View File

@@ -15,6 +15,18 @@
<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n"/>
</layout>
</appender>
<appender name="M" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="i:/dev/modifiers.log"/>
<param name="MaxFileSize" value="100MB"/>
<param name="MaxBackupIndex" value="20"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n"/>
</layout>
</appender>
<logger name="com.gempukku.lotro.logic.modifiers" additivity="false">
<level value="debug"/>
<appender-ref ref="M"/>
</logger>
<logger name="com.gempukku" additivity="false">
<level value="debug"/>
<appender-ref ref="R"/>