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/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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 {

View File

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

View File

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

View File

@@ -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 {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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;
/**

View File

@@ -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 {

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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;
/**

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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()

View File

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

View File

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

View File

@@ -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;
/**

View File

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

View File

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

View File

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

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.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;