mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +00:00
forge.game.ai created - just a small step towards AI isolation
This commit is contained in:
13
.gitattributes
vendored
13
.gitattributes
vendored
@@ -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/PlanarDice.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/CardDamagedEvent.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/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/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/LobbyPlayer.java -text
|
||||
src/main/java/forge/game/player/Player.java svneol=native#text/plain
|
||||
|
||||
@@ -43,6 +43,7 @@ import forge.card.abilityfactory.ApiType;
|
||||
import forge.card.cardfactory.CardFactoryUtil;
|
||||
import forge.card.cost.Cost;
|
||||
import forge.card.mana.ManaCostBeingPaid;
|
||||
import forge.card.replacement.ReplaceMoved;
|
||||
import forge.card.replacement.ReplacementEffect;
|
||||
import forge.card.replacement.ReplacementResult;
|
||||
import forge.card.spellability.AbilityManaPart;
|
||||
@@ -57,12 +58,12 @@ import forge.card.trigger.TriggerType;
|
||||
import forge.card.trigger.ZCTrigger;
|
||||
import forge.game.GameState;
|
||||
import forge.game.GlobalRuleChange;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.event.CounterAddedEvent;
|
||||
import forge.game.event.CardEquippedEvent;
|
||||
import forge.game.event.CounterRemovedEvent;
|
||||
import forge.game.event.SetTappedEvent;
|
||||
import forge.game.phase.Combat;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.item.CardDb;
|
||||
@@ -9069,4 +9070,58 @@ public class Card extends GameEntity implements Comparable<Card> {
|
||||
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
|
||||
|
||||
@@ -59,11 +59,11 @@ import forge.game.GameLossReason;
|
||||
import forge.game.GameState;
|
||||
import forge.game.GlobalRuleChange;
|
||||
import forge.game.MatchController;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.event.CardDestroyedEvent;
|
||||
import forge.game.event.CardRegeneratedEvent;
|
||||
import forge.game.event.CardSacrificedEvent;
|
||||
import forge.game.event.DuelOutcomeEvent;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerType;
|
||||
import forge.game.zone.PlayerZone;
|
||||
|
||||
@@ -54,10 +54,10 @@ import forge.control.input.InputPayDiscardCost;
|
||||
import forge.control.input.InputPayManaCostAbility;
|
||||
import forge.control.input.InputPayReturnCost;
|
||||
import forge.game.GameState;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.event.CardDamagedEvent;
|
||||
import forge.game.event.FlipCoinEvent;
|
||||
import forge.game.event.LifeLossEvent;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiChoose;
|
||||
|
||||
@@ -43,8 +43,8 @@ import forge.card.spellability.SpellAbilityCondition;
|
||||
import forge.card.spellability.SpellAbilityRestriction;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.GameState;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package forge.card.abilityfactory;
|
||||
|
||||
import forge.card.spellability.AbilitySub;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
|
||||
public abstract class SpellAiLogic {
|
||||
|
||||
@@ -24,10 +24,10 @@ import forge.card.cost.Cost;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.card.staticability.StaticAbility;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -31,11 +31,11 @@ import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.SpellPermanent;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.GlobalRuleChange;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtilBlock;
|
||||
import forge.game.phase.Combat;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.ComputerUtilBlock;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiChoose;
|
||||
|
||||
@@ -3,7 +3,7 @@ package forge.card.abilityfactory.ai;
|
||||
import forge.card.abilityfactory.SpellAiLogic;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
|
||||
public class ChooseCardNameAi extends SpellAiLogic {
|
||||
|
||||
@@ -10,7 +10,7 @@ import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.card.spellability.TargetSelection;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
|
||||
@@ -17,8 +17,8 @@ import forge.card.cost.Cost;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -15,9 +15,9 @@ import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.AbilitySub;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -16,7 +16,7 @@ import forge.card.cost.Cost;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -16,9 +16,9 @@ import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.card.spellability.TargetSelection;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -19,7 +19,7 @@ import forge.card.cost.CostSacrifice;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -13,7 +13,7 @@ import forge.card.cost.Cost;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -11,8 +11,8 @@ import forge.card.cost.Cost;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -35,8 +35,8 @@ import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.AbilitySub;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -11,9 +11,9 @@ import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.AbilitySub;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@ import forge.card.cost.Cost;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
|
||||
@@ -9,8 +9,8 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.abilityfactory.SpellAiLogic;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@ import forge.card.cost.Cost;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -11,8 +11,8 @@ import forge.Singletons;
|
||||
import forge.card.abilityfactory.SpellAiLogic;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.GameState;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ import forge.Singletons;
|
||||
import forge.card.abilityfactory.SpellAiLogic;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.GameState;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
|
||||
/**
|
||||
|
||||
@@ -10,8 +10,8 @@ import forge.card.cost.Cost;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
|
||||
public class PoisonAi extends SpellAiLogic {
|
||||
|
||||
@@ -16,9 +16,9 @@ import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.SpellAbilityRestriction;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
|
||||
@@ -13,9 +13,9 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.cardfactory.CardFactoryUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import forge.card.abilityfactory.SpellAiLogic;
|
||||
import forge.card.cardfactory.CardFactoryUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import forge.card.cardfactory.CardFactoryUtil;
|
||||
import forge.card.cost.Cost;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -4,8 +4,8 @@ import forge.Card;
|
||||
import forge.Singletons;
|
||||
import forge.card.abilityfactory.SpellAiLogic;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
|
||||
public class StoreSVarAi extends SpellAiLogic {
|
||||
|
||||
@@ -14,10 +14,10 @@ import forge.card.abilityfactory.SpellAiLogic;
|
||||
import forge.card.cardfactory.CardFactoryUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
|
||||
@@ -10,9 +10,9 @@ import forge.card.cost.Cost;
|
||||
import forge.card.cost.CostUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -11,8 +11,8 @@ import forge.card.cardfactory.CardFactoryUtil;
|
||||
import forge.card.cost.Cost;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.cardfactory.CardFactoryUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiChoose;
|
||||
|
||||
@@ -23,7 +23,7 @@ import forge.card.spellability.Spell;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.SpellAbilityRestriction;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiChoose;
|
||||
|
||||
@@ -9,7 +9,7 @@ import forge.Singletons;
|
||||
import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.abilityfactory.SpellEffect;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiChoose;
|
||||
|
||||
@@ -33,7 +33,7 @@ import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.SpellPermanent;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.error.ErrorViewer;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.item.CardDb;
|
||||
|
||||
@@ -17,7 +17,7 @@ import forge.card.spellability.AbilityActivated;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.control.input.Input;
|
||||
import forge.control.input.InputSelectManyCards;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.PlayerZone;
|
||||
import forge.game.zone.Zone;
|
||||
|
||||
@@ -48,7 +48,7 @@ import forge.card.spellability.Target;
|
||||
import forge.control.input.Input;
|
||||
import forge.control.input.InputPayManaCost;
|
||||
import forge.control.input.InputPayManaCostAbility;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.player.PlayerUtil;
|
||||
import forge.game.zone.PlayerZone;
|
||||
|
||||
@@ -70,10 +70,10 @@ import forge.card.trigger.TriggerType;
|
||||
import forge.control.input.Input;
|
||||
import forge.control.input.InputPayManaCostUtil;
|
||||
import forge.game.GameState;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.event.TokenCreatedEvent;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.PlayerZone;
|
||||
import forge.game.zone.Zone;
|
||||
|
||||
@@ -31,7 +31,7 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.Zone;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
@@ -34,7 +34,7 @@ import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.SpellAbilityStackInstance;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiChoose;
|
||||
|
||||
@@ -27,7 +27,7 @@ import forge.control.input.Input;
|
||||
import forge.control.input.InputPayManaCost2;
|
||||
import forge.control.input.InputPayManaX;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
|
||||
/**
|
||||
|
||||
@@ -30,7 +30,7 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.match.CMatchUI;
|
||||
|
||||
@@ -28,7 +28,7 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.Zone;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
@@ -30,7 +30,7 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.match.CMatchUI;
|
||||
|
||||
@@ -29,7 +29,7 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.Zone;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
@@ -28,7 +28,7 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.Zone;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
@@ -27,7 +27,7 @@ import forge.CounterType;
|
||||
import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.mana.ManaCostBeingPaid;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiChoose;
|
||||
|
||||
@@ -28,7 +28,7 @@ import forge.Singletons;
|
||||
import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiChoose;
|
||||
|
||||
@@ -42,9 +42,8 @@ import forge.card.trigger.Trigger;
|
||||
import forge.card.trigger.TriggerType;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GlobalRuleChange;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerAIGeneral;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.view.ButtonUtil;
|
||||
@@ -299,7 +298,7 @@ public class SpellPermanent extends Spell {
|
||||
}
|
||||
// save cards with flash for surprise blocking
|
||||
if (card.hasKeyword("Flash")
|
||||
&& !ComputerAIGeneral.hasETBTrigger(card)
|
||||
&& !card.hasETBTrigger()
|
||||
&& (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai)
|
||||
|| Singletons.getModel().getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY))) {
|
||||
return false;
|
||||
@@ -381,8 +380,8 @@ public class SpellPermanent extends Spell {
|
||||
}
|
||||
|
||||
if (card.isCreature() && (card.getNetDefense() <= 0) && !card.hasStartOfKeyword("etbCounter")
|
||||
&& mana.countX() == 0 && !ComputerAIGeneral.hasETBTrigger(card)
|
||||
&& !ComputerAIGeneral.hasETBReplacement(card)) {
|
||||
&& mana.countX() == 0 && !card.hasETBTrigger()
|
||||
&& !card.hasETBReplacement()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,9 +36,9 @@ import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.GameState;
|
||||
import forge.game.GlobalRuleChange;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.phase.PhaseType;
|
||||
//import forge.util.TextUtil;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ import forge.card.spellability.SpellAbilityRestriction;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
|
||||
// Wrapper ability that checks the requirements again just before
|
||||
|
||||
@@ -33,7 +33,7 @@ import forge.card.abilityfactory.AbilityFactory;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.GameState;
|
||||
import forge.game.GameType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.Zone;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
@@ -15,24 +15,18 @@
|
||||
* 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;
|
||||
package forge.game.ai;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import com.esotericsoftware.minlog.Log;
|
||||
|
||||
import forge.Card;
|
||||
|
||||
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.SpellPermanent;
|
||||
import forge.card.trigger.Trigger;
|
||||
import forge.card.trigger.TriggerType;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
/**
|
||||
@@ -43,7 +37,7 @@ import forge.game.zone.ZoneType;
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class ComputerAIGeneral implements Computer {
|
||||
public class AiController {
|
||||
|
||||
private final Player player;
|
||||
private final GameState game;
|
||||
@@ -52,66 +46,11 @@ public class ComputerAIGeneral implements Computer {
|
||||
* Constructor for ComputerAI_General.
|
||||
* </p>
|
||||
*/
|
||||
public ComputerAIGeneral(final Player computerPlayer, final GameState game0) {
|
||||
public AiController(final Player computerPlayer, final GameState game0) {
|
||||
player = computerPlayer;
|
||||
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>
|
||||
* getAvailableSpellAbilities.
|
||||
@@ -120,77 +59,21 @@ public class ComputerAIGeneral implements Computer {
|
||||
* @return a {@link forge.CardList} object.
|
||||
*/
|
||||
private List<Card> getAvailableCards() {
|
||||
|
||||
final Player opp = player.getOpponent();
|
||||
List<Card> all = new ArrayList<Card>(player.getCardsIn(ZoneType.Hand));
|
||||
all.addAll(player.getCardsIn(ZoneType.Battlefield));
|
||||
all.addAll(player.getCardsIn(ZoneType.Exile));
|
||||
//all.addAll(player.getCardsIn(ZoneType.Battlefield));
|
||||
//all.addAll(player.getCardsIn(ZoneType.Exile));
|
||||
all.addAll(player.getCardsIn(ZoneType.Graveyard));
|
||||
all.addAll(player.getCardsIn(ZoneType.Command));
|
||||
if (!player.getCardsIn(ZoneType.Library).isEmpty()) {
|
||||
all.add(player.getCardsIn(ZoneType.Library).get(0));
|
||||
}
|
||||
all.addAll(opp.getCardsIn(ZoneType.Exile));
|
||||
all.addAll(opp.getCardsIn(ZoneType.Battlefield));
|
||||
for(Player p : game.getPlayers()) {
|
||||
all.addAll(p.getCardsIn(ZoneType.Exile));
|
||||
all.addAll(p.getCardsIn(ZoneType.Battlefield));
|
||||
}
|
||||
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>
|
||||
* getPossibleETBCounters.
|
||||
@@ -271,40 +154,13 @@ public class ComputerAIGeneral implements Computer {
|
||||
* declare_attackers.
|
||||
* </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>
|
||||
* stack_not_empty.
|
||||
* </p>
|
||||
*/
|
||||
@Override
|
||||
|
||||
public final List<SpellAbility> getSpellAbilitiesToPlay() {
|
||||
// if top of stack is owned by me
|
||||
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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameState getGame()
|
||||
{
|
||||
return game;
|
||||
}
|
||||
|
||||
public Player getPlayer()
|
||||
{
|
||||
return player;
|
||||
@@ -1,4 +1,4 @@
|
||||
package forge.game.player;
|
||||
package forge.game.ai;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -6,12 +6,13 @@ import forge.Card;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.player.Player;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public class ComputerAiInputBlock extends Input {
|
||||
public class AiInputBlock extends Input {
|
||||
|
||||
private final GameState game;
|
||||
/**
|
||||
@@ -19,7 +20,7 @@ public class ComputerAiInputBlock extends Input {
|
||||
* @param game
|
||||
* @param player
|
||||
*/
|
||||
public ComputerAiInputBlock(GameState game, Player player) {
|
||||
public AiInputBlock(GameState game, Player player) {
|
||||
super();
|
||||
this.game = game;
|
||||
this.player = player;
|
||||
@@ -15,17 +15,19 @@
|
||||
* 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;
|
||||
package forge.game.ai;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.esotericsoftware.minlog.Log;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.Card;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.game.GameState;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -35,11 +37,13 @@ import forge.game.phase.PhaseType;
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class ComputerAIInput extends Input {
|
||||
public class AiInputCommon extends Input {
|
||||
/** Constant <code>serialVersionUID=-3091338639571662216L</code>. */
|
||||
private static final long serialVersionUID = -3091338639571662216L;
|
||||
|
||||
private final Computer computer;
|
||||
private final AiController computer;
|
||||
private final Player player;
|
||||
private final GameState game;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -49,15 +53,17 @@ public class ComputerAIInput extends Input {
|
||||
* @param iComputer
|
||||
* a {@link forge.game.player.Computer} object.
|
||||
*/
|
||||
public ComputerAIInput(final Computer iComputer) {
|
||||
public AiInputCommon(final AiController iComputer) {
|
||||
this.computer = iComputer;
|
||||
player = computer.getPlayer();
|
||||
this.game = computer.getGame();
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public final void showMessage() {
|
||||
// should not think when the game is over
|
||||
if (Singletons.getModel().getGame().isGameOver()) {
|
||||
if (game.isGameOver()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -68,7 +74,7 @@ public class ComputerAIInput extends Input {
|
||||
* send the \"Stack Report\" and the
|
||||
* \"Detailed Error Trace\" to the Forge forum.");
|
||||
*/
|
||||
GameState game = Singletons.getModel().getGame();
|
||||
|
||||
final PhaseType phase = game.getPhaseHandler().getPhase();
|
||||
|
||||
if (game.getStack().size() > 0) {
|
||||
@@ -76,14 +82,13 @@ public class ComputerAIInput extends Input {
|
||||
} else {
|
||||
switch(phase) {
|
||||
case COMBAT_DECLARE_ATTACKERS:
|
||||
this.computer.declareAttackers();
|
||||
|
||||
declareAttackers();
|
||||
break;
|
||||
|
||||
case MAIN1:
|
||||
case MAIN2:
|
||||
Log.debug("Computer " + phase.toString());
|
||||
this.computer.playLands();
|
||||
playLands();
|
||||
// fall through is intended
|
||||
default:
|
||||
playSpellAbilities(game);
|
||||
@@ -93,29 +98,61 @@ public class ComputerAIInput extends Input {
|
||||
game.getPhaseHandler().passPriority();
|
||||
} // getMessage();
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this method.
|
||||
*/
|
||||
private 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();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this method.
|
||||
*/
|
||||
private void playLands() {
|
||||
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)
|
||||
{
|
||||
Player ai = computer.getPlayer();
|
||||
List<SpellAbility> toPlay = computer.getSpellAbilitiesToPlay();
|
||||
if ( toPlay != null ) {
|
||||
for(SpellAbility sa : toPlay) {
|
||||
//System.out.print(sa);
|
||||
if (ComputerUtil.canBePlayedAndPayedByAI(ai, sa))
|
||||
ComputerUtil.handlePlayingSpellAbility(ai, sa, game);
|
||||
if (ComputerUtil.canBePlayedAndPayedByAI(player, sa))
|
||||
ComputerUtil.handlePlayingSpellAbility(player, sa, game);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Getter for the field <code>computer</code>.
|
||||
* </p>
|
||||
*
|
||||
* @return a {@link forge.game.player.Computer} object.
|
||||
*/
|
||||
public final Computer getComputer() {
|
||||
return this.computer;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.control.input.Input#isClassUpdated()
|
||||
@@ -15,7 +15,7 @@
|
||||
* 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;
|
||||
package forge.game.ai;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@@ -64,6 +64,7 @@ import forge.game.phase.Combat;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiChoose;
|
||||
import forge.util.Aggregates;
|
||||
@@ -2089,7 +2090,7 @@ public class ComputerUtil {
|
||||
if (card.getSVar("PlayMain1").equals("TRUE")) {
|
||||
return true;
|
||||
}
|
||||
if ((card.isCreature() && (ComputerAIGeneral.hasACardGivingHaste(ai)
|
||||
if ((card.isCreature() && (ComputerUtil.hasACardGivingHaste(ai)
|
||||
|| card.hasKeyword("Haste"))) || card.hasKeyword("Exalted")) {
|
||||
return true;
|
||||
}
|
||||
@@ -2265,4 +2266,41 @@ public class ComputerUtil {
|
||||
|
||||
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
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
* 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;
|
||||
package forge.game.ai;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -35,6 +35,7 @@ import forge.card.trigger.TriggerType;
|
||||
import forge.game.GameState;
|
||||
import forge.game.phase.Combat;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* 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;
|
||||
package forge.game.ai;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -32,6 +32,7 @@ import forge.GameEntity;
|
||||
import forge.card.cardfactory.CardFactoryUtil;
|
||||
import forge.game.phase.Combat;
|
||||
import forge.game.phase.CombatUtil;
|
||||
import forge.game.player.Player;
|
||||
|
||||
|
||||
/**
|
||||
@@ -57,8 +57,8 @@ import forge.card.trigger.TriggerHandler;
|
||||
import forge.card.trigger.TriggerType;
|
||||
import forge.game.GameState;
|
||||
import forge.game.GlobalRuleChange;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.ComputerUtilBlock;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtilBlock;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.PlayerZone;
|
||||
import forge.game.zone.ZoneType;
|
||||
|
||||
@@ -45,7 +45,7 @@ import forge.card.spellability.SpellAbility;
|
||||
import forge.control.input.Input;
|
||||
import forge.control.input.InputSelectManyCards;
|
||||
import forge.game.GameState;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.PlayerZone;
|
||||
import forge.game.zone.Zone;
|
||||
|
||||
@@ -28,6 +28,10 @@ import forge.CardPredicates;
|
||||
import forge.card.cardfactory.CardFactoryUtil;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
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.util.Aggregates;
|
||||
import forge.util.MyRandom;
|
||||
@@ -42,6 +46,7 @@ import forge.util.MyRandom;
|
||||
*/
|
||||
public class AIPlayer extends Player {
|
||||
|
||||
private final AiController brains;
|
||||
/**
|
||||
* <p>
|
||||
* Constructor for AIPlayer.
|
||||
@@ -53,8 +58,9 @@ public class AIPlayer extends Player {
|
||||
*/
|
||||
public AIPlayer(final LobbyPlayer player, final GameState game) {
|
||||
super(player, game, new PlayerController());
|
||||
getController().setDefaultInput(new ComputerAIInput(new ComputerAIGeneral(this, game)));
|
||||
getController().setBlockInput(new ComputerAiInputBlock(game, this));
|
||||
brains = new AiController(this, game);
|
||||
getController().setDefaultInput(new AiInputCommon(brains));
|
||||
getController().setBlockInput(new AiInputBlock(game, this));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
@@ -52,9 +52,9 @@ import forge.card.trigger.TriggerType;
|
||||
import forge.control.input.Input;
|
||||
import forge.control.input.InputPayManaCostAbility;
|
||||
import forge.game.GameState;
|
||||
import forge.game.ai.ComputerUtil;
|
||||
import forge.game.event.SpellResolvedEvent;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
import forge.gui.GuiChoose;
|
||||
import forge.gui.framework.EDocID;
|
||||
|
||||
Reference in New Issue
Block a user