diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index c1578443353..806ba8a6b40 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -3478,8 +3478,8 @@ public class AbilityUtils { } if (value.equals("OpponentsAttackedThisTurn")) { - final List opps = player.getAttackedPlayersMyTurn(); - return doXMath(opps == null ? 0 : opps.size(), m, source, ctb); + final Iterable opps = player.getAttackedPlayersMyTurn(); + return doXMath(opps == null ? 0 : Iterables.size(opps), m, source, ctb); } if (value.equals("OpponentsAttackedThisCombat")) { diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 9dad2411453..a9daa7aedaa 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -407,10 +407,7 @@ public class CombatUtil { c.getDamageHistory().setCreatureAttackedThisCombat(defender); c.getDamageHistory().clearNotAttackedSinceLastUpkeepOf(); - c.getController().addCreaturesAttackedThisTurn(CardUtil.getLKICopy(c)); - if (defender instanceof Player) { - c.getController().addAttackedPlayersMyTurn(combat.getDefenderPlayerByAttacker(c)); - } + c.getController().addCreaturesAttackedThisTurn(CardUtil.getLKICopy(c), defender); } /** diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 78827701494..0dc1738b021 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -24,6 +24,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Deque; import java.util.EnumSet; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -202,9 +203,8 @@ public class Player extends GameEntity implements Comparable { private Table changedKeywords = TreeBasedTable.create(); private ManaPool manaPool = new ManaPool(this); - private List creatureAttackedThisTurn = new ArrayList<>(); - private List attackedPlayersThisTurn = new ArrayList<>(); - private List attackedPlayersLastTurn = new ArrayList<>(); + private Map> attackedThisTurn = new HashMap<>(); + private List attackedPlayersLastTurn = new ArrayList<>(); private List attackedPlayersThisCombat = new ArrayList<>(); private boolean activateLoyaltyAbilityThisTurn = false; @@ -1826,37 +1826,37 @@ public class Player extends GameEntity implements Comparable { } public final List getCreaturesAttackedThisTurn() { - return creatureAttackedThisTurn; + List result = Lists.newArrayList(Iterables.concat(attackedThisTurn.values())); + return result; } - public final void addCreaturesAttackedThisTurn(final Card c) { - creatureAttackedThisTurn.add(c); + public final List getCreaturesAttackedThisTurn(final GameEntity e) { + return attackedThisTurn.getOrDefault(e, Lists.newArrayList()); } - public final void clearCreaturesAttackedThisTurn() { - creatureAttackedThisTurn.clear(); - } - - public final void addAttackedPlayersMyTurn(final Player p) { - if (!attackedPlayersThisTurn.contains(p)) { - attackedPlayersThisCombat.add(p); - attackedPlayersThisTurn.add(p); + public final void addCreaturesAttackedThisTurn(final Card c, final GameEntity e) { + final List creatures = attackedThisTurn.getOrDefault(e, Lists.newArrayList()); + creatures.add(c); + attackedThisTurn.putIfAbsent(e, creatures); + if (e instanceof Player && !attackedPlayersThisCombat.contains(e)) { + attackedPlayersThisCombat.add((Player) e); } } - public final List getAttackedPlayersMyTurn() { - return attackedPlayersThisTurn; + + public final Iterable getAttackedPlayersMyTurn() { + return Iterables.filter(attackedThisTurn.keySet(), Player.class); } public final List getAttackedPlayersMyLastTurn() { return attackedPlayersLastTurn; } - public final void clearAttackedPlayersMyTurn() { - attackedPlayersThisTurn.clear(); + public final void clearAttackedMyTurn() { + attackedThisTurn.clear(); } - public final void setAttackedPlayersMyLastTurn(List players) { + public final void setAttackedPlayersMyLastTurn(Iterable players) { attackedPlayersLastTurn.clear(); - attackedPlayersLastTurn.addAll(players); + Iterables.addAll(attackedPlayersLastTurn, players); } public final List getAttackedPlayersMyCombat() { - return attackedPlayersThisTurn; + return attackedPlayersThisCombat; } public final void clearAttackedPlayersMyCombat() { attackedPlayersThisCombat.clear(); @@ -2390,7 +2390,6 @@ public class Player extends GameEntity implements Comparable { resetNumForetoldThisTurn(); resetNumTokenCreatedThisTurn(); setNumCardsInHandStartedThisTurnWith(getCardsIn(ZoneType.Hand).size()); - clearCreaturesAttackedThisTurn(); setActivateLoyaltyAbilityThisTurn(false); setTappedLandForManaThisTurn(false); setLandsPlayedLastTurn(getLandsPlayedThisTurn()); @@ -2417,8 +2416,8 @@ public class Player extends GameEntity implements Comparable { // set last turn nr if (game.getPhaseHandler().isPlayerTurn(this)) { - setAttackedPlayersMyLastTurn(attackedPlayersThisTurn); - clearAttackedPlayersMyTurn(); + setAttackedPlayersMyLastTurn(getAttackedPlayersMyTurn()); + clearAttackedMyTurn(); this.lastTurnNr = game.getPhaseHandler().getTurn(); } } diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index 9d14fe11f54..e997cd039df 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -381,6 +381,14 @@ public class PlayerProperty { if (player.getCreaturesAttackedThisTurn().isEmpty()) { return false; } + } else if (property.startsWith("wasAttackedThisTurnBy")) { + String restriction = property.split(" ")[1]; + for (Card c : sourceController.getCreaturesAttackedThisTurn(player)) { + if (c.isValid(restriction, sourceController, source, spellAbility)) { + return true; + } + } + return false; } else if (property.equals("attackedYouTheirLastTurn")) { if (!player.getAttackedPlayersMyLastTurn().contains(sourceController)) { return false; diff --git a/forge-gui/res/cardsfolder/upcoming/ramses_assassin_lord.txt b/forge-gui/res/cardsfolder/upcoming/ramses_assassin_lord.txt new file mode 100644 index 00000000000..c897c13946c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ramses_assassin_lord.txt @@ -0,0 +1,9 @@ +Name:Ramses, Assassin Lord +ManaCost:2 B U +Types:Legendary Creature Human Assassin +PT:4/4 +K:Deathtouch +S:Mode$ Continuous | Affected$ Assassin.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Assassin's you control get +1/+1. +T:Mode$ LosesGame | ValidPlayer$ Player.Other+wasAttackedThisTurnBy Assassin.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigWinGame | TriggerDescription$ Whenever a player loses the game, if they were attacked this turn by an Assassin you controlled, you win the game. +SVar:TrigWinGame:DB$ WinsGame | Defined$ You +Oracle:Other Assassin's you control get +1/+1.\nWhenever a player loses the game, if they were attacked this turn by an Assassin you controlled, you win the game.