forge.game.ai created - just a small step towards AI isolation

This commit is contained in:
Maxmtg
2013-01-24 23:00:51 +00:00
parent d409d5749c
commit fae995f189
65 changed files with 254 additions and 313 deletions

13
.gitattributes vendored
View File

@@ -13621,6 +13621,12 @@ src/main/java/forge/game/MatchController.java -text
src/main/java/forge/game/MatchStartHelper.java -text src/main/java/forge/game/MatchStartHelper.java -text
src/main/java/forge/game/PlanarDice.java -text src/main/java/forge/game/PlanarDice.java -text
src/main/java/forge/game/PlayerStartConditions.java -text src/main/java/forge/game/PlayerStartConditions.java -text
src/main/java/forge/game/ai/AiController.java svneol=native#text/plain
src/main/java/forge/game/ai/AiInputBlock.java -text
src/main/java/forge/game/ai/AiInputCommon.java svneol=native#text/plain
src/main/java/forge/game/ai/ComputerUtil.java svneol=native#text/plain
src/main/java/forge/game/ai/ComputerUtilAttack.java svneol=native#text/plain
src/main/java/forge/game/ai/ComputerUtilBlock.java svneol=native#text/plain
src/main/java/forge/game/event/BlockerAssignedEvent.java -text src/main/java/forge/game/event/BlockerAssignedEvent.java -text
src/main/java/forge/game/event/CardDamagedEvent.java -text src/main/java/forge/game/event/CardDamagedEvent.java -text
src/main/java/forge/game/event/CardDestroyedEvent.java -text src/main/java/forge/game/event/CardDestroyedEvent.java -text
@@ -13676,13 +13682,6 @@ src/main/java/forge/game/phase/Untap.java -text
src/main/java/forge/game/phase/Upkeep.java svneol=native#text/plain src/main/java/forge/game/phase/Upkeep.java svneol=native#text/plain
src/main/java/forge/game/phase/package-info.java svneol=native#text/plain src/main/java/forge/game/phase/package-info.java svneol=native#text/plain
src/main/java/forge/game/player/AIPlayer.java svneol=native#text/plain src/main/java/forge/game/player/AIPlayer.java svneol=native#text/plain
src/main/java/forge/game/player/Computer.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerAIGeneral.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerAIInput.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerAiInputBlock.java -text
src/main/java/forge/game/player/ComputerUtil.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerUtilAttack.java svneol=native#text/plain
src/main/java/forge/game/player/ComputerUtilBlock.java svneol=native#text/plain
src/main/java/forge/game/player/HumanPlayer.java svneol=native#text/plain src/main/java/forge/game/player/HumanPlayer.java svneol=native#text/plain
src/main/java/forge/game/player/LobbyPlayer.java -text src/main/java/forge/game/player/LobbyPlayer.java -text
src/main/java/forge/game/player/Player.java svneol=native#text/plain src/main/java/forge/game/player/Player.java svneol=native#text/plain

View File

@@ -43,6 +43,7 @@ import forge.card.abilityfactory.ApiType;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost; import forge.card.cost.Cost;
import forge.card.mana.ManaCostBeingPaid; import forge.card.mana.ManaCostBeingPaid;
import forge.card.replacement.ReplaceMoved;
import forge.card.replacement.ReplacementEffect; import forge.card.replacement.ReplacementEffect;
import forge.card.replacement.ReplacementResult; import forge.card.replacement.ReplacementResult;
import forge.card.spellability.AbilityManaPart; import forge.card.spellability.AbilityManaPart;
@@ -57,12 +58,12 @@ import forge.card.trigger.TriggerType;
import forge.card.trigger.ZCTrigger; import forge.card.trigger.ZCTrigger;
import forge.game.GameState; import forge.game.GameState;
import forge.game.GlobalRuleChange; import forge.game.GlobalRuleChange;
import forge.game.ai.ComputerUtil;
import forge.game.event.CounterAddedEvent; import forge.game.event.CounterAddedEvent;
import forge.game.event.CardEquippedEvent; import forge.game.event.CardEquippedEvent;
import forge.game.event.CounterRemovedEvent; import forge.game.event.CounterRemovedEvent;
import forge.game.event.SetTappedEvent; import forge.game.event.SetTappedEvent;
import forge.game.phase.Combat; import forge.game.phase.Combat;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.item.CardDb; import forge.item.CardDb;
@@ -9069,4 +9070,58 @@ public class Card extends GameEntity implements Comparable<Card> {
clearBlockedThisTurn(); clearBlockedThisTurn();
} }
/**
* <p>
* hasETBTrigger.
* </p>
*
* @param card
* a {@link forge.Card} object.
* @return a boolean.
*/
public boolean hasETBTrigger() {
for (final Trigger tr : this.getTriggers()) {
final HashMap<String, String> params = tr.getMapParams();
if (tr.getMode() != TriggerType.ChangesZone) {
continue;
}
if (!params.get("Destination").equals(ZoneType.Battlefield.toString())) {
continue;
}
if (params.containsKey("ValidCard") && !params.get("ValidCard").contains("Self")) {
continue;
}
return true;
}
return false;
}
/**
* <p>
* hasETBTrigger.
* </p>
*
* @return a boolean.
*/
public boolean hasETBReplacement() {
for (final ReplacementEffect re : getReplacementEffects()) {
final HashMap<String, String> params = re.getMapParams();
if (!(re instanceof ReplaceMoved)) {
continue;
}
if (!params.get("Destination").equals(ZoneType.Battlefield.toString())) {
continue;
}
if (params.containsKey("ValidCard") && !params.get("ValidCard").contains("Self")) {
continue;
}
return true;
}
return false;
}
} // end Card class } // end Card class

View File

@@ -59,11 +59,11 @@ import forge.game.GameLossReason;
import forge.game.GameState; import forge.game.GameState;
import forge.game.GlobalRuleChange; import forge.game.GlobalRuleChange;
import forge.game.MatchController; import forge.game.MatchController;
import forge.game.ai.ComputerUtil;
import forge.game.event.CardDestroyedEvent; import forge.game.event.CardDestroyedEvent;
import forge.game.event.CardRegeneratedEvent; import forge.game.event.CardRegeneratedEvent;
import forge.game.event.CardSacrificedEvent; import forge.game.event.CardSacrificedEvent;
import forge.game.event.DuelOutcomeEvent; import forge.game.event.DuelOutcomeEvent;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerType; import forge.game.player.PlayerType;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;

View File

@@ -54,10 +54,10 @@ import forge.control.input.InputPayDiscardCost;
import forge.control.input.InputPayManaCostAbility; import forge.control.input.InputPayManaCostAbility;
import forge.control.input.InputPayReturnCost; import forge.control.input.InputPayReturnCost;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtil;
import forge.game.event.CardDamagedEvent; import forge.game.event.CardDamagedEvent;
import forge.game.event.FlipCoinEvent; import forge.game.event.FlipCoinEvent;
import forge.game.event.LifeLossEvent; import forge.game.event.LifeLossEvent;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;

View File

@@ -43,8 +43,8 @@ import forge.card.spellability.SpellAbilityCondition;
import forge.card.spellability.SpellAbilityRestriction; import forge.card.spellability.SpellAbilityRestriction;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -3,7 +3,7 @@ package forge.card.abilityfactory;
import forge.card.spellability.AbilitySub; import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
public abstract class SpellAiLogic { public abstract class SpellAiLogic {

View File

@@ -24,10 +24,10 @@ import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.card.staticability.StaticAbility; import forge.card.staticability.StaticAbility;
import forge.game.ai.ComputerUtil;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -31,11 +31,11 @@ import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellPermanent; import forge.card.spellability.SpellPermanent;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.GlobalRuleChange; import forge.game.GlobalRuleChange;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilBlock;
import forge.game.phase.Combat; import forge.game.phase.Combat;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.ComputerUtilBlock;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;

View File

@@ -3,7 +3,7 @@ package forge.card.abilityfactory.ai;
import forge.card.abilityfactory.SpellAiLogic; import forge.card.abilityfactory.SpellAiLogic;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
public class ChooseCardNameAi extends SpellAiLogic { public class ChooseCardNameAi extends SpellAiLogic {

View File

@@ -10,7 +10,7 @@ import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.card.spellability.TargetSelection; import forge.card.spellability.TargetSelection;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -17,8 +17,8 @@ import forge.card.cost.Cost;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -15,9 +15,9 @@ import forge.card.cost.CostUtil;
import forge.card.spellability.AbilitySub; import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -16,7 +16,7 @@ import forge.card.cost.Cost;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -16,9 +16,9 @@ import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.card.spellability.TargetSelection; import forge.card.spellability.TargetSelection;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -19,7 +19,7 @@ import forge.card.cost.CostSacrifice;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -13,7 +13,7 @@ import forge.card.cost.Cost;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -11,8 +11,8 @@ import forge.card.cost.Cost;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -35,8 +35,8 @@ import forge.card.cost.CostUtil;
import forge.card.spellability.AbilitySub; import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -11,9 +11,9 @@ import forge.card.cost.CostUtil;
import forge.card.spellability.AbilitySub; import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -11,8 +11,8 @@ import forge.card.cost.Cost;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -9,8 +9,8 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.abilityfactory.SpellAiLogic; import forge.card.abilityfactory.SpellAiLogic;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -11,8 +11,8 @@ import forge.card.cost.Cost;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -11,8 +11,8 @@ import forge.Singletons;
import forge.card.abilityfactory.SpellAiLogic; import forge.card.abilityfactory.SpellAiLogic;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -4,8 +4,8 @@ import forge.Singletons;
import forge.card.abilityfactory.SpellAiLogic; import forge.card.abilityfactory.SpellAiLogic;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
/** /**

View File

@@ -10,8 +10,8 @@ import forge.card.cost.Cost;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
public class PoisonAi extends SpellAiLogic { public class PoisonAi extends SpellAiLogic {

View File

@@ -16,9 +16,9 @@ import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityRestriction; import forge.card.spellability.SpellAbilityRestriction;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -13,9 +13,9 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -8,7 +8,7 @@ import forge.card.abilityfactory.SpellAiLogic;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -10,7 +10,7 @@ import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost; import forge.card.cost.Cost;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -4,8 +4,8 @@ import forge.Card;
import forge.Singletons; import forge.Singletons;
import forge.card.abilityfactory.SpellAiLogic; import forge.card.abilityfactory.SpellAiLogic;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.ai.ComputerUtil;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
public class StoreSVarAi extends SpellAiLogic { public class StoreSVarAi extends SpellAiLogic {

View File

@@ -14,10 +14,10 @@ import forge.card.abilityfactory.SpellAiLogic;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -10,9 +10,9 @@ import forge.card.cost.Cost;
import forge.card.cost.CostUtil; import forge.card.cost.CostUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -11,8 +11,8 @@ import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost; import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -14,7 +14,7 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;

View File

@@ -23,7 +23,7 @@ import forge.card.spellability.Spell;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityRestriction; import forge.card.spellability.SpellAbilityRestriction;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;

View File

@@ -9,7 +9,7 @@ import forge.Singletons;
import forge.card.abilityfactory.AbilityFactory; import forge.card.abilityfactory.AbilityFactory;
import forge.card.abilityfactory.SpellEffect; import forge.card.abilityfactory.SpellEffect;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;

View File

@@ -33,7 +33,7 @@ import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellPermanent; import forge.card.spellability.SpellPermanent;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.error.ErrorViewer; import forge.error.ErrorViewer;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.GuiUtils; import forge.gui.GuiUtils;
import forge.item.CardDb; import forge.item.CardDb;

View File

@@ -17,7 +17,7 @@ import forge.card.spellability.AbilityActivated;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.control.input.Input; import forge.control.input.Input;
import forge.control.input.InputSelectManyCards; import forge.control.input.InputSelectManyCards;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;
import forge.game.zone.Zone; import forge.game.zone.Zone;

View File

@@ -48,7 +48,7 @@ import forge.card.spellability.Target;
import forge.control.input.Input; import forge.control.input.Input;
import forge.control.input.InputPayManaCost; import forge.control.input.InputPayManaCost;
import forge.control.input.InputPayManaCostAbility; import forge.control.input.InputPayManaCostAbility;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerUtil; import forge.game.player.PlayerUtil;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;

View File

@@ -70,10 +70,10 @@ import forge.card.trigger.TriggerType;
import forge.control.input.Input; import forge.control.input.Input;
import forge.control.input.InputPayManaCostUtil; import forge.control.input.InputPayManaCostUtil;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtil;
import forge.game.event.TokenCreatedEvent; import forge.game.event.TokenCreatedEvent;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;
import forge.game.zone.Zone; import forge.game.zone.Zone;

View File

@@ -31,7 +31,7 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -34,7 +34,7 @@ import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityStackInstance; import forge.card.spellability.SpellAbilityStackInstance;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;

View File

@@ -27,7 +27,7 @@ import forge.control.input.Input;
import forge.control.input.InputPayManaCost2; import forge.control.input.InputPayManaCost2;
import forge.control.input.InputPayManaX; import forge.control.input.InputPayManaX;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
/** /**

View File

@@ -30,7 +30,7 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.match.CMatchUI; import forge.gui.match.CMatchUI;

View File

@@ -28,7 +28,7 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -30,7 +30,7 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.match.CMatchUI; import forge.gui.match.CMatchUI;

View File

@@ -29,7 +29,7 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -28,7 +28,7 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -27,7 +27,7 @@ import forge.CounterType;
import forge.card.abilityfactory.AbilityFactory; import forge.card.abilityfactory.AbilityFactory;
import forge.card.mana.ManaCostBeingPaid; import forge.card.mana.ManaCostBeingPaid;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;

View File

@@ -28,7 +28,7 @@ import forge.Singletons;
import forge.card.abilityfactory.AbilityFactory; import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;

View File

@@ -42,9 +42,8 @@ import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerType; import forge.card.trigger.TriggerType;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GlobalRuleChange; import forge.game.GlobalRuleChange;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerAIGeneral;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.view.ButtonUtil; import forge.view.ButtonUtil;
@@ -299,7 +298,7 @@ public class SpellPermanent extends Spell {
} }
// save cards with flash for surprise blocking // save cards with flash for surprise blocking
if (card.hasKeyword("Flash") if (card.hasKeyword("Flash")
&& !ComputerAIGeneral.hasETBTrigger(card) && !card.hasETBTrigger()
&& (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai) && (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai)
|| Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))) { || Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))) {
return false; return false;
@@ -381,8 +380,8 @@ public class SpellPermanent extends Spell {
} }
if (card.isCreature() && (card.getNetDefense() <= 0) && !card.hasStartOfKeyword("etbCounter") if (card.isCreature() && (card.getNetDefense() <= 0) && !card.hasStartOfKeyword("etbCounter")
&& mana.countX() == 0 && !ComputerAIGeneral.hasETBTrigger(card) && mana.countX() == 0 && !card.hasETBTrigger()
&& !ComputerAIGeneral.hasETBReplacement(card)) { && !card.hasETBReplacement()) {
return false; return false;
} }

View File

@@ -36,9 +36,9 @@ import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.game.GameState; import forge.game.GameState;
import forge.game.GlobalRuleChange; import forge.game.GlobalRuleChange;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
//import forge.util.TextUtil; //import forge.util.TextUtil;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -20,7 +20,7 @@ import forge.card.spellability.SpellAbilityRestriction;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
// Wrapper ability that checks the requirements again just before // Wrapper ability that checks the requirements again just before

View File

@@ -33,7 +33,7 @@ import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.GameState; import forge.game.GameState;
import forge.game.GameType; import forge.game.GameType;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -15,24 +15,18 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.game.player; package forge.game.ai;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import com.esotericsoftware.minlog.Log;
import forge.Card; import forge.Card;
import forge.card.abilityfactory.ApiType; import forge.card.abilityfactory.ApiType;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.replacement.ReplaceMoved;
import forge.card.replacement.ReplacementEffect;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellPermanent; import forge.card.spellability.SpellPermanent;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerType;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
/** /**
@@ -43,7 +37,7 @@ import forge.game.zone.ZoneType;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class ComputerAIGeneral implements Computer { public class AiController {
private final Player player; private final Player player;
private final GameState game; private final GameState game;
@@ -52,66 +46,11 @@ public class ComputerAIGeneral implements Computer {
* Constructor for ComputerAI_General. * Constructor for ComputerAI_General.
* </p> * </p>
*/ */
public ComputerAIGeneral(final Player computerPlayer, final GameState game0) { public AiController(final Player computerPlayer, final GameState game0) {
player = computerPlayer; player = computerPlayer;
game = game0; game = game0;
} }
/**
* <p>
* main.
* </p>
*/
@Override
public final void playLands()
{
List<Card> landsWannaPlay = ComputerUtil.getLandsToPlay(player);
while(landsWannaPlay != null && !landsWannaPlay.isEmpty() && player.canPlayLand()) {
Card land = ComputerUtil.chooseBestLandToPlay(landsWannaPlay, player);
landsWannaPlay.remove(land);
player.playLand(land);
}
}
/**
* <p>
* hasACardGivingHaste.
* </p>
*
* @return a boolean.
*/
public static boolean hasACardGivingHaste(final Player ai) {
final List<Card> all = new ArrayList<Card>(ai.getCardsIn(ZoneType.Battlefield));
all.addAll(CardFactoryUtil.getExternalZoneActivationCards(ai));
all.addAll(ai.getCardsIn(ZoneType.Hand));
for (final Card c : all) {
for (final SpellAbility sa : c.getSpellAbility()) {
if (sa.getApi() == null) {
continue;
}
/// ????
// if ( sa.isAbility() || sa.isSpell() && sa.getApi() != ApiType.Pump ) continue
if (sa.hasParam("AB") && !sa.getParam("AB").equals("Pump")) {
continue;
}
if (sa.hasParam("SP") && !sa.getParam("SP").equals("Pump")) {
continue;
}
if (sa.hasParam("KW") && sa.getParam("KW").contains("Haste")) {
return true;
}
}
}
return false;
} // hasACardGivingHaste
/** /**
* <p> * <p>
* getAvailableSpellAbilities. * getAvailableSpellAbilities.
@@ -120,77 +59,21 @@ public class ComputerAIGeneral implements Computer {
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
private List<Card> getAvailableCards() { private List<Card> getAvailableCards() {
final Player opp = player.getOpponent();
List<Card> all = new ArrayList<Card>(player.getCardsIn(ZoneType.Hand)); List<Card> all = new ArrayList<Card>(player.getCardsIn(ZoneType.Hand));
all.addAll(player.getCardsIn(ZoneType.Battlefield)); //all.addAll(player.getCardsIn(ZoneType.Battlefield));
all.addAll(player.getCardsIn(ZoneType.Exile)); //all.addAll(player.getCardsIn(ZoneType.Exile));
all.addAll(player.getCardsIn(ZoneType.Graveyard)); all.addAll(player.getCardsIn(ZoneType.Graveyard));
all.addAll(player.getCardsIn(ZoneType.Command)); all.addAll(player.getCardsIn(ZoneType.Command));
if (!player.getCardsIn(ZoneType.Library).isEmpty()) { if (!player.getCardsIn(ZoneType.Library).isEmpty()) {
all.add(player.getCardsIn(ZoneType.Library).get(0)); all.add(player.getCardsIn(ZoneType.Library).get(0));
} }
all.addAll(opp.getCardsIn(ZoneType.Exile)); for(Player p : game.getPlayers()) {
all.addAll(opp.getCardsIn(ZoneType.Battlefield)); all.addAll(p.getCardsIn(ZoneType.Exile));
all.addAll(p.getCardsIn(ZoneType.Battlefield));
}
return all; return all;
} }
/**
* <p>
* hasETBTrigger.
* </p>
*
* @param card
* a {@link forge.Card} object.
* @return a boolean.
*/
public static boolean hasETBTrigger(final Card card) {
for (final Trigger tr : card.getTriggers()) {
final HashMap<String, String> params = tr.getMapParams();
if (tr.getMode() != TriggerType.ChangesZone) {
continue;
}
if (!params.get("Destination").equals(ZoneType.Battlefield.toString())) {
continue;
}
if (params.containsKey("ValidCard") && !params.get("ValidCard").contains("Self")) {
continue;
}
return true;
}
return false;
}
/**
* <p>
* hasETBTrigger.
* </p>
*
* @param card
* a {@link forge.Card} object.
* @return a boolean.
*/
public static boolean hasETBReplacement(final Card card) {
for (final ReplacementEffect re : card.getReplacementEffects()) {
final HashMap<String, String> params = re.getMapParams();
if (!(re instanceof ReplaceMoved)) {
continue;
}
if (!params.get("Destination").equals(ZoneType.Battlefield.toString())) {
continue;
}
if (params.containsKey("ValidCard") && !params.get("ValidCard").contains("Self")) {
continue;
}
return true;
}
return false;
}
/** /**
* <p> * <p>
* getPossibleETBCounters. * getPossibleETBCounters.
@@ -271,40 +154,13 @@ public class ComputerAIGeneral implements Computer {
* declare_attackers. * declare_attackers.
* </p> * </p>
*/ */
@Override
public final void declareAttackers() {
// 12/2/10(sol) the decision making here has moved to getAttackers()
game.setCombat(ComputerUtil.getAttackers(player));
final List<Card> att = game.getCombat().getAttackers();
if (!att.isEmpty()) {
game.getPhaseHandler().setCombat(true);
}
for (final Card element : att) {
// tapping of attackers happens after Propaganda is paid for
final StringBuilder sb = new StringBuilder();
sb.append("Computer just assigned ").append(element.getName()).append(" as an attacker.");
Log.debug(sb.toString());
}
player.getZone(ZoneType.Battlefield).updateObservers();
game.getPhaseHandler().setPlayersPriorityPermission(false);
// ai is about to attack, cancel all phase skipping
for (Player p : game.getPlayers()) {
p.getController().autoPassCancel();
}
}
/** /**
* <p> * <p>
* stack_not_empty. * stack_not_empty.
* </p> * </p>
*/ */
@Override
public final List<SpellAbility> getSpellAbilitiesToPlay() { public final List<SpellAbility> getSpellAbilitiesToPlay() {
// if top of stack is owned by me // if top of stack is owned by me
if (!game.getStack().isEmpty() && game.getStack().peekInstance().getActivatingPlayer().equals(player)) { if (!game.getStack().isEmpty() && game.getStack().peekInstance().getActivatingPlayer().equals(player)) {
@@ -326,7 +182,11 @@ public class ComputerAIGeneral implements Computer {
return ComputerUtil.playSpellAbilities(player, getSpellAbilities(cards), game); return ComputerUtil.playSpellAbilities(player, getSpellAbilities(cards), game);
} }
@Override public GameState getGame()
{
return game;
}
public Player getPlayer() public Player getPlayer()
{ {
return player; return player;

View File

@@ -1,4 +1,4 @@
package forge.game.player; package forge.game.ai;
import java.util.List; import java.util.List;
@@ -6,12 +6,13 @@ import forge.Card;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.player.Player;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
* *
*/ */
public class ComputerAiInputBlock extends Input { public class AiInputBlock extends Input {
private final GameState game; private final GameState game;
/** /**
@@ -19,7 +20,7 @@ public class ComputerAiInputBlock extends Input {
* @param game * @param game
* @param player * @param player
*/ */
public ComputerAiInputBlock(GameState game, Player player) { public AiInputBlock(GameState game, Player player) {
super(); super();
this.game = game; this.game = game;
this.player = player; this.player = player;

View File

@@ -15,17 +15,19 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.game.player; package forge.game.ai;
import java.util.List; import java.util.List;
import com.esotericsoftware.minlog.Log; import com.esotericsoftware.minlog.Log;
import forge.Singletons; import forge.Card;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.game.GameState; import forge.game.GameState;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
/** /**
* <p> * <p>
@@ -35,11 +37,13 @@ import forge.game.phase.PhaseType;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class ComputerAIInput extends Input { public class AiInputCommon extends Input {
/** Constant <code>serialVersionUID=-3091338639571662216L</code>. */ /** Constant <code>serialVersionUID=-3091338639571662216L</code>. */
private static final long serialVersionUID = -3091338639571662216L; private static final long serialVersionUID = -3091338639571662216L;
private final Computer computer; private final AiController computer;
private final Player player;
private final GameState game;
/** /**
* <p> * <p>
@@ -49,15 +53,17 @@ public class ComputerAIInput extends Input {
* @param iComputer * @param iComputer
* a {@link forge.game.player.Computer} object. * a {@link forge.game.player.Computer} object.
*/ */
public ComputerAIInput(final Computer iComputer) { public AiInputCommon(final AiController iComputer) {
this.computer = iComputer; this.computer = iComputer;
player = computer.getPlayer();
this.game = computer.getGame();
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void showMessage() { public final void showMessage() {
// should not think when the game is over // should not think when the game is over
if (Singletons.getModel().getGame().isGameOver()) { if (game.isGameOver()) {
return; return;
} }
@@ -68,7 +74,7 @@ public class ComputerAIInput extends Input {
* send the \"Stack Report\" and the * send the \"Stack Report\" and the
* \"Detailed Error Trace\" to the Forge forum."); * \"Detailed Error Trace\" to the Forge forum.");
*/ */
GameState game = Singletons.getModel().getGame();
final PhaseType phase = game.getPhaseHandler().getPhase(); final PhaseType phase = game.getPhaseHandler().getPhase();
if (game.getStack().size() > 0) { if (game.getStack().size() > 0) {
@@ -76,14 +82,13 @@ public class ComputerAIInput extends Input {
} else { } else {
switch(phase) { switch(phase) {
case COMBAT_DECLARE_ATTACKERS: case COMBAT_DECLARE_ATTACKERS:
this.computer.declareAttackers(); declareAttackers();
break; break;
case MAIN1: case MAIN1:
case MAIN2: case MAIN2:
Log.debug("Computer " + phase.toString()); Log.debug("Computer " + phase.toString());
this.computer.playLands(); playLands();
// fall through is intended // fall through is intended
default: default:
playSpellAbilities(game); playSpellAbilities(game);
@@ -93,30 +98,62 @@ public class ComputerAIInput extends Input {
game.getPhaseHandler().passPriority(); game.getPhaseHandler().passPriority();
} // getMessage(); } // getMessage();
protected void playSpellAbilities(final GameState game) /**
{ * TODO: Write javadoc for this method.
Player ai = computer.getPlayer(); */
List<SpellAbility> toPlay = computer.getSpellAbilitiesToPlay(); private void declareAttackers() {
if ( toPlay != null ) { // 12/2/10(sol) the decision making here has moved to getAttackers()
for(SpellAbility sa : toPlay) { game.setCombat(ComputerUtil.getAttackers(player));
//System.out.print(sa);
if (ComputerUtil.canBePlayedAndPayedByAI(ai, sa)) final List<Card> att = game.getCombat().getAttackers();
ComputerUtil.handlePlayingSpellAbility(ai, sa, game); if (!att.isEmpty()) {
} game.getPhaseHandler().setCombat(true);
}
for (final Card element : att) {
// tapping of attackers happens after Propaganda is paid for
final StringBuilder sb = new StringBuilder();
sb.append("Computer just assigned ").append(element.getName()).append(" as an attacker.");
Log.debug(sb.toString());
}
player.getZone(ZoneType.Battlefield).updateObservers();
game.getPhaseHandler().setPlayersPriorityPermission(false);
// ai is about to attack, cancel all phase skipping
for (Player p : game.getPlayers()) {
p.getController().autoPassCancel();
} }
} }
/** /**
* <p> * TODO: Write javadoc for this method.
* Getter for the field <code>computer</code>.
* </p>
*
* @return a {@link forge.game.player.Computer} object.
*/ */
public final Computer getComputer() { private void playLands() {
return this.computer; final Player player = computer.getPlayer();
List<Card> landsWannaPlay = ComputerUtil.getLandsToPlay(player);
while(landsWannaPlay != null && !landsWannaPlay.isEmpty() && player.canPlayLand()) {
Card land = ComputerUtil.chooseBestLandToPlay(landsWannaPlay, player);
landsWannaPlay.remove(land);
player.playLand(land);
}
} }
protected void playSpellAbilities(final GameState game)
{
List<SpellAbility> toPlay = computer.getSpellAbilitiesToPlay();
if ( toPlay != null ) {
for(SpellAbility sa : toPlay) {
//System.out.print(sa);
if (ComputerUtil.canBePlayedAndPayedByAI(player, sa))
ComputerUtil.handlePlayingSpellAbility(player, sa, game);
}
}
}
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.control.input.Input#isClassUpdated() * @see forge.control.input.Input#isClassUpdated()
*/ */

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.game.player; package forge.game.ai;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -64,6 +64,7 @@ import forge.game.phase.Combat;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
import forge.util.Aggregates; import forge.util.Aggregates;
@@ -2089,7 +2090,7 @@ public class ComputerUtil {
if (card.getSVar("PlayMain1").equals("TRUE")) { if (card.getSVar("PlayMain1").equals("TRUE")) {
return true; return true;
} }
if ((card.isCreature() && (ComputerAIGeneral.hasACardGivingHaste(ai) if ((card.isCreature() && (ComputerUtil.hasACardGivingHaste(ai)
|| card.hasKeyword("Haste"))) || card.hasKeyword("Exalted")) { || card.hasKeyword("Haste"))) || card.hasKeyword("Exalted")) {
return true; return true;
} }
@@ -2265,4 +2266,41 @@ public class ComputerUtil {
return r.nextFloat() <= Math.pow(.95, activations); return r.nextFloat() <= Math.pow(.95, activations);
} }
/**
* <p>
* hasACardGivingHaste.
* </p>
*
* @return a boolean.
*/
public static boolean hasACardGivingHaste(final Player ai) {
final List<Card> all = new ArrayList<Card>(ai.getCardsIn(ZoneType.Battlefield));
all.addAll(CardFactoryUtil.getExternalZoneActivationCards(ai));
all.addAll(ai.getCardsIn(ZoneType.Hand));
for (final Card c : all) {
for (final SpellAbility sa : c.getSpellAbility()) {
if (sa.getApi() == null) {
continue;
}
/// ????
// if ( sa.isAbility() || sa.isSpell() && sa.getApi() != ApiType.Pump ) continue
if (sa.hasParam("AB") && !sa.getParam("AB").equals("Pump")) {
continue;
}
if (sa.hasParam("SP") && !sa.getParam("SP").equals("Pump")) {
continue;
}
if (sa.hasParam("KW") && sa.getParam("KW").contains("Haste")) {
return true;
}
}
}
return false;
} // hasACardGivingHaste
} }

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.game.player; package forge.game.ai;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -35,6 +35,7 @@ import forge.card.trigger.TriggerType;
import forge.game.GameState; import forge.game.GameState;
import forge.game.phase.Combat; import forge.game.phase.Combat;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.MyRandom; import forge.util.MyRandom;

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.game.player; package forge.game.ai;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -32,6 +32,7 @@ import forge.GameEntity;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.game.phase.Combat; import forge.game.phase.Combat;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
import forge.game.player.Player;
/** /**

View File

@@ -57,8 +57,8 @@ import forge.card.trigger.TriggerHandler;
import forge.card.trigger.TriggerType; import forge.card.trigger.TriggerType;
import forge.game.GameState; import forge.game.GameState;
import forge.game.GlobalRuleChange; import forge.game.GlobalRuleChange;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.ComputerUtilBlock; import forge.game.ai.ComputerUtilBlock;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -45,7 +45,7 @@ import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.control.input.InputSelectManyCards; import forge.control.input.InputSelectManyCards;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.ComputerUtil; import forge.game.ai.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;
import forge.game.zone.Zone; import forge.game.zone.Zone;

View File

@@ -28,6 +28,10 @@ import forge.CardPredicates;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.AiController;
import forge.game.ai.AiInputBlock;
import forge.game.ai.AiInputCommon;
import forge.game.ai.ComputerUtil;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.Aggregates; import forge.util.Aggregates;
import forge.util.MyRandom; import forge.util.MyRandom;
@@ -42,6 +46,7 @@ import forge.util.MyRandom;
*/ */
public class AIPlayer extends Player { public class AIPlayer extends Player {
private final AiController brains;
/** /**
* <p> * <p>
* Constructor for AIPlayer. * Constructor for AIPlayer.
@@ -53,8 +58,9 @@ public class AIPlayer extends Player {
*/ */
public AIPlayer(final LobbyPlayer player, final GameState game) { public AIPlayer(final LobbyPlayer player, final GameState game) {
super(player, game, new PlayerController()); super(player, game, new PlayerController());
getController().setDefaultInput(new ComputerAIInput(new ComputerAIGeneral(this, game))); brains = new AiController(this, game);
getController().setBlockInput(new ComputerAiInputBlock(game, this)); getController().setDefaultInput(new AiInputCommon(brains));
getController().setBlockInput(new AiInputBlock(game, this));
} }

View File

@@ -1,56 +0,0 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.game.player;
import java.util.List;
import forge.card.spellability.SpellAbility;
/**
* <p>
* Computer interface.
* </p>
*
* @author Forge
* @version $Id$
*/
public interface Computer {
/**
* <p>
* declare_attackers.
* </p>
*/
void declareAttackers();
/**
* <p>
* stack_not_empty.
* </p>
*/
List<SpellAbility> getSpellAbilitiesToPlay();
/**
* TODO: Write javadoc for this method.
*/
void playLands();
public Player getPlayer();
}

View File

@@ -52,9 +52,9 @@ import forge.card.trigger.TriggerType;
import forge.control.input.Input; import forge.control.input.Input;
import forge.control.input.InputPayManaCostAbility; import forge.control.input.InputPayManaCostAbility;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtil;
import forge.game.event.SpellResolvedEvent; import forge.game.event.SpellResolvedEvent;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.ComputerUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;