From bcea70e32ce7fea6c6dc20484a41ab67e3e6682c Mon Sep 17 00:00:00 2001 From: tool4ever Date: Thu, 19 May 2022 07:34:13 +0200 Subject: [PATCH] Jabari's Influence: multiplayer fix (#375) * Jabari's Influence: multiplayer fix --- .../src/main/java/forge/game/card/Card.java | 5 +- .../forge/game/card/CardDamageHistory.java | 53 +++++-------------- .../java/forge/game/card/CardProperty.java | 8 ++- .../java/forge/game/combat/CombatUtil.java | 6 ++- .../main/java/forge/game/player/Player.java | 2 +- .../forge/game/player/PlayerProperty.java | 4 ++ .../res/cardsfolder/j/jabaris_influence.txt | 2 +- forge-gui/res/cardsfolder/p/port_razer.txt | 7 +-- 8 files changed, 30 insertions(+), 57 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 35156ffea47..2703f546590 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6218,11 +6218,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { setBecameTargetThisTurn(false); setFoughtThisTurn(false); clearMustBlockCards(); + getDamageHistory().setCreatureAttackedLastTurnOf(turn, getDamageHistory().getCreatureAttacksThisTurn() > 0); getDamageHistory().newTurn(); - getDamageHistory().setCreatureAttackedLastTurnOf(turn, getDamageHistory().getCreatureAttackedThisTurn()); - getDamageHistory().setCreatureAttackedThisTurn(false); - getDamageHistory().setCreatureAttacksThisTurn(0); - getDamageHistory().setHasBeenDealtNonCombatDamageThisTurn(false); clearBlockedByThisTurn(); clearBlockedThisTurn(); resetMayPlayTurn(); diff --git a/forge-game/src/main/java/forge/game/card/CardDamageHistory.java b/forge-game/src/main/java/forge/game/card/CardDamageHistory.java index 46756978d57..ef53f011c6e 100644 --- a/forge-game/src/main/java/forge/game/card/CardDamageHistory.java +++ b/forge-game/src/main/java/forge/game/card/CardDamageHistory.java @@ -16,12 +16,11 @@ import forge.game.player.Player; */ public class CardDamageHistory { - private boolean creatureAttackedThisTurn = false; private boolean creatureAttackedThisCombat = false; private boolean creatureBlockedThisCombat = false; private boolean creatureGotBlockedThisCombat = false; private boolean receivedNonCombatDamageThisTurn = false; - private int attacksThisTurn = 0; + private List attackedThisTurn = Lists.newArrayList(); private final List creatureAttackedLastTurnOf = Lists.newArrayList(); private final List NotAttackedSinceLastUpkeepOf = Lists.newArrayList(); @@ -32,7 +31,7 @@ public class CardDamageHistory { private final Map damagedThisTurn = Maps.newHashMap(); private final Map damagedThisTurnInCombat = Maps.newHashMap(); private final Map damagedThisGame = Maps.newHashMap(); - + public final boolean getHasdealtDamagetoAny() { return !damagedThisGame.isEmpty(); } @@ -47,12 +46,11 @@ public class CardDamageHistory { * @param hasAttacked * a boolean. */ - public final void setCreatureAttackedThisCombat(final boolean hasAttacked) { - this.creatureAttackedThisCombat = hasAttacked; + public final void setCreatureAttackedThisCombat(GameEntity defender) { + this.creatureAttackedThisCombat = defender != null; - if (hasAttacked) { - this.setCreatureAttackedThisTurn(true); - this.attacksThisTurn++; + if (defender != null) { + attackedThisTurn.add(defender); } } /** @@ -65,38 +63,6 @@ public class CardDamageHistory { public final boolean getCreatureAttackedThisCombat() { return this.creatureAttackedThisCombat; } - /** - *

- * Setter for the field creatureAttackedThisTurn. - *

- * - * @param b - * a boolean. - */ - public final void setCreatureAttackedThisTurn(final boolean b) { - this.creatureAttackedThisTurn = b; - } - /** - *

- * Getter for the field creatureAttackedThisTurn. - *

- * - * @return a boolean. - */ - public final boolean getCreatureAttackedThisTurn() { - return this.creatureAttackedThisTurn; - } - /** - *

- * Setter for the field attacksThisTurn. - *

- * - * @param num - * a integer. - */ - public final void setCreatureAttacksThisTurn(final int num) { - this.attacksThisTurn = num; - } /** *

* Getter for the field attacksThisTurn. @@ -105,7 +71,10 @@ public class CardDamageHistory { * @return a int. */ public final int getCreatureAttacksThisTurn() { - return this.attacksThisTurn; + return this.attackedThisTurn.size(); + } + public final boolean hasAttackedThisTurn(GameEntity e) { + return this.attackedThisTurn.contains(e); } /** *

@@ -307,6 +276,8 @@ public class CardDamageHistory { damagedThisCombat.clear(); damagedThisTurnInCombat.clear(); damagedThisTurn.clear(); + attackedThisTurn.clear(); + setHasBeenDealtNonCombatDamageThisTurn(false); } public void endCombat() { diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 1e3df37597c..facbbc6f039 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1188,7 +1188,11 @@ public class CardProperty { } else if (property.startsWith("dealtDamagetoAny")) { return card.getDamageHistory().getHasdealtDamagetoAny(); } else if (property.startsWith("attackedThisTurn")) { - if (!card.getDamageHistory().getCreatureAttackedThisTurn()) { + if (card.getDamageHistory().getCreatureAttacksThisTurn() == 0) { + return false; + } + } else if (property.startsWith("attackedYouThisTurn")) { + if (!card.getDamageHistory().hasAttackedThisTurn(sourceController)) { return false; } } else if (property.startsWith("attackedLastTurn")) { @@ -1210,7 +1214,7 @@ public class CardProperty { return false; } } else if (property.startsWith("notAttackedThisTurn")) { - if (card.getDamageHistory().getCreatureAttackedThisTurn()) { + if (card.getDamageHistory().getCreatureAttacksThisTurn() > 0) { return false; } } else if (property.startsWith("notAttackedLastTurn")) { 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 c6e12c15d04..3367ff2a269 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -383,6 +383,8 @@ public class CombatUtil { * a {@link forge.game.card.Card} object. */ public static void checkDeclaredAttacker(final Game game, final Card c, final Combat combat, boolean triggers) { + GameEntity defender = combat.getDefenderByAttacker(c); + // Run triggers if (triggers) { final Map runParams = AbilityKey.newMap(); @@ -390,7 +392,7 @@ public class CombatUtil { final List otherAttackers = combat.getAttackers(); otherAttackers.remove(c); runParams.put(AbilityKey.OtherAttackers, otherAttackers); - runParams.put(AbilityKey.Attacked, combat.getDefenderByAttacker(c)); + runParams.put(AbilityKey.Attacked, defender); runParams.put(AbilityKey.DefendingPlayer, combat.getDefenderPlayerByAttacker(c)); // only add defenders that were attacked final FCollection defenders = new FCollection<>(); @@ -403,7 +405,7 @@ public class CombatUtil { game.getTriggerHandler().runTrigger(TriggerType.Attacks, runParams, false); } - c.getDamageHistory().setCreatureAttackedThisCombat(true); + c.getDamageHistory().setCreatureAttackedThisCombat(defender); c.getDamageHistory().clearNotAttackedSinceLastUpkeepOf(); c.getController().addCreaturesAttackedThisTurn(CardUtil.getLKICopy(c)); } 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 530ce0f4906..a185fa728a0 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2661,7 +2661,7 @@ public class Player extends GameEntity implements Comparable { for (Card c : list) { if (c.getDamageHistory().getCreatureAttackedThisCombat()) { - c.getDamageHistory().setCreatureAttackedThisCombat(false); + c.getDamageHistory().setCreatureAttackedThisCombat(null); } if (c.getDamageHistory().getCreatureBlockedThisCombat()) { c.getDamageHistory().setCreatureBlockedThisCombat(false); 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 cf20c38a3c3..39662e0b425 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -163,6 +163,10 @@ public class PlayerProperty { if (game.getCombat() == null || !player.equals(game.getCombat().getDefenderPlayerByAttacker(source))) { return false; } + } else if (property.equals("attackedBySourceThisTurn")) { + if (!source.getDamageHistory().hasAttackedThisTurn(player)) { + return false; + } } else if (property.equals("wasDealtDamageThisTurn")) { if (player.getAssignedDamage() == 0) { return false; diff --git a/forge-gui/res/cardsfolder/j/jabaris_influence.txt b/forge-gui/res/cardsfolder/j/jabaris_influence.txt index 76e713069ae..b0b8545d60d 100644 --- a/forge-gui/res/cardsfolder/j/jabaris_influence.txt +++ b/forge-gui/res/cardsfolder/j/jabaris_influence.txt @@ -1,6 +1,6 @@ Name:Jabari's Influence ManaCost:3 W W Types:Instant -A:SP$ GainControl | Cost$ 3 W W | ValidTgts$ Creature.nonBlack+nonArtifact+attackedThisTurn | TgtPrompt$ Select target nonartifact, nonblack creature that attacked you this turn | OpponentTurn$ True | ActivationPhases$ Main2->Cleanup | SubAbility$ DBPutCounter | SpellDescription$ Gain control of target nonartifact, nonblack creature that attacked you this turn and put a -1/-0 counter on it. +A:SP$ GainControl | Cost$ 3 W W | ValidTgts$ Creature.nonBlack+nonArtifact+attackedYouThisTurn | TgtPrompt$ Select target nonartifact, nonblack creature that attacked you this turn | ActivationPhases$ Main2->Cleanup | SubAbility$ DBPutCounter | SpellDescription$ Gain control of target nonartifact, nonblack creature that attacked you this turn and put a -1/-0 counter on it. SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ M1M0 | CounterNum$ 1 Oracle:Cast this spell only after combat.\nGain control of target nonartifact, nonblack creature that attacked you this turn and put a -1/-0 counter on it. diff --git a/forge-gui/res/cardsfolder/p/port_razer.txt b/forge-gui/res/cardsfolder/p/port_razer.txt index 7dd52aa3d5e..3d348fff395 100644 --- a/forge-gui/res/cardsfolder/p/port_razer.txt +++ b/forge-gui/res/cardsfolder/p/port_razer.txt @@ -2,13 +2,8 @@ Name:Port Razer ManaCost:3 R R Types:Creature Orc Pirate PT:4/4 -T:Mode$ TurnBegin | ValidPlayer$ Player | Static$ True | Execute$ AttackReset -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Static$ True | Execute$ AttackReset -SVar:AttackReset:DB$ Cleanup | ClearRemembered$ True -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ RememberPlayer | TriggerZones$ Battlefield | Static$ True -SVar:RememberPlayer:DB$ Pump | RememberObjects$ TriggeredDefendingPlayer T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, untap each creature you control. After this combat phase, there is an additional combat phase. SVar:TrigUntap:DB$ UntapAll | ValidCards$ Creature.YouCtrl | SubAbility$ DBAddCombat SVar:DBAddCombat:DB$ AddPhase | ExtraPhase$ Combat | AfterPhase$ EndCombat -S:Mode$ CantAttack | ValidCard$ Card.Self | Target$ Player.IsRemembered | Description$ CARDNAME can't attack a player it has already attacked this turn. +S:Mode$ CantAttack | ValidCard$ Card.Self | Target$ Player.attackedBySourceThisTurn | Description$ CARDNAME can't attack a player it has already attacked this turn. Oracle:Whenever Port Razer deals combat damage to a player, untap each creature you control. After this combat phase, there is an additional combat phase.\nPort Razer can't attack a player it has already attacked this turn.