Jabari's Influence: multiplayer fix (#375)

* Jabari's Influence: multiplayer fix
This commit is contained in:
tool4ever
2022-05-19 07:34:13 +02:00
committed by GitHub
parent bcc15c5857
commit bcea70e32c
8 changed files with 30 additions and 57 deletions

View File

@@ -6218,11 +6218,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
setBecameTargetThisTurn(false); setBecameTargetThisTurn(false);
setFoughtThisTurn(false); setFoughtThisTurn(false);
clearMustBlockCards(); clearMustBlockCards();
getDamageHistory().setCreatureAttackedLastTurnOf(turn, getDamageHistory().getCreatureAttacksThisTurn() > 0);
getDamageHistory().newTurn(); getDamageHistory().newTurn();
getDamageHistory().setCreatureAttackedLastTurnOf(turn, getDamageHistory().getCreatureAttackedThisTurn());
getDamageHistory().setCreatureAttackedThisTurn(false);
getDamageHistory().setCreatureAttacksThisTurn(0);
getDamageHistory().setHasBeenDealtNonCombatDamageThisTurn(false);
clearBlockedByThisTurn(); clearBlockedByThisTurn();
clearBlockedThisTurn(); clearBlockedThisTurn();
resetMayPlayTurn(); resetMayPlayTurn();

View File

@@ -16,12 +16,11 @@ import forge.game.player.Player;
*/ */
public class CardDamageHistory { public class CardDamageHistory {
private boolean creatureAttackedThisTurn = false;
private boolean creatureAttackedThisCombat = false; private boolean creatureAttackedThisCombat = false;
private boolean creatureBlockedThisCombat = false; private boolean creatureBlockedThisCombat = false;
private boolean creatureGotBlockedThisCombat = false; private boolean creatureGotBlockedThisCombat = false;
private boolean receivedNonCombatDamageThisTurn = false; private boolean receivedNonCombatDamageThisTurn = false;
private int attacksThisTurn = 0; private List<GameEntity> attackedThisTurn = Lists.newArrayList();
private final List<Player> creatureAttackedLastTurnOf = Lists.newArrayList(); private final List<Player> creatureAttackedLastTurnOf = Lists.newArrayList();
private final List<Player> NotAttackedSinceLastUpkeepOf = Lists.newArrayList(); private final List<Player> NotAttackedSinceLastUpkeepOf = Lists.newArrayList();
@@ -47,12 +46,11 @@ public class CardDamageHistory {
* @param hasAttacked * @param hasAttacked
* a boolean. * a boolean.
*/ */
public final void setCreatureAttackedThisCombat(final boolean hasAttacked) { public final void setCreatureAttackedThisCombat(GameEntity defender) {
this.creatureAttackedThisCombat = hasAttacked; this.creatureAttackedThisCombat = defender != null;
if (hasAttacked) { if (defender != null) {
this.setCreatureAttackedThisTurn(true); attackedThisTurn.add(defender);
this.attacksThisTurn++;
} }
} }
/** /**
@@ -65,38 +63,6 @@ public class CardDamageHistory {
public final boolean getCreatureAttackedThisCombat() { public final boolean getCreatureAttackedThisCombat() {
return this.creatureAttackedThisCombat; return this.creatureAttackedThisCombat;
} }
/**
* <p>
* Setter for the field <code>creatureAttackedThisTurn</code>.
* </p>
*
* @param b
* a boolean.
*/
public final void setCreatureAttackedThisTurn(final boolean b) {
this.creatureAttackedThisTurn = b;
}
/**
* <p>
* Getter for the field <code>creatureAttackedThisTurn</code>.
* </p>
*
* @return a boolean.
*/
public final boolean getCreatureAttackedThisTurn() {
return this.creatureAttackedThisTurn;
}
/**
* <p>
* Setter for the field <code>attacksThisTurn</code>.
* </p>
*
* @param num
* a integer.
*/
public final void setCreatureAttacksThisTurn(final int num) {
this.attacksThisTurn = num;
}
/** /**
* <p> * <p>
* Getter for the field <code>attacksThisTurn</code>. * Getter for the field <code>attacksThisTurn</code>.
@@ -105,7 +71,10 @@ public class CardDamageHistory {
* @return a int. * @return a int.
*/ */
public final int getCreatureAttacksThisTurn() { public final int getCreatureAttacksThisTurn() {
return this.attacksThisTurn; return this.attackedThisTurn.size();
}
public final boolean hasAttackedThisTurn(GameEntity e) {
return this.attackedThisTurn.contains(e);
} }
/** /**
* <p> * <p>
@@ -307,6 +276,8 @@ public class CardDamageHistory {
damagedThisCombat.clear(); damagedThisCombat.clear();
damagedThisTurnInCombat.clear(); damagedThisTurnInCombat.clear();
damagedThisTurn.clear(); damagedThisTurn.clear();
attackedThisTurn.clear();
setHasBeenDealtNonCombatDamageThisTurn(false);
} }
public void endCombat() { public void endCombat() {

View File

@@ -1188,7 +1188,11 @@ public class CardProperty {
} else if (property.startsWith("dealtDamagetoAny")) { } else if (property.startsWith("dealtDamagetoAny")) {
return card.getDamageHistory().getHasdealtDamagetoAny(); return card.getDamageHistory().getHasdealtDamagetoAny();
} else if (property.startsWith("attackedThisTurn")) { } 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; return false;
} }
} else if (property.startsWith("attackedLastTurn")) { } else if (property.startsWith("attackedLastTurn")) {
@@ -1210,7 +1214,7 @@ public class CardProperty {
return false; return false;
} }
} else if (property.startsWith("notAttackedThisTurn")) { } else if (property.startsWith("notAttackedThisTurn")) {
if (card.getDamageHistory().getCreatureAttackedThisTurn()) { if (card.getDamageHistory().getCreatureAttacksThisTurn() > 0) {
return false; return false;
} }
} else if (property.startsWith("notAttackedLastTurn")) { } else if (property.startsWith("notAttackedLastTurn")) {

View File

@@ -383,6 +383,8 @@ public class CombatUtil {
* a {@link forge.game.card.Card} object. * a {@link forge.game.card.Card} object.
*/ */
public static void checkDeclaredAttacker(final Game game, final Card c, final Combat combat, boolean triggers) { public static void checkDeclaredAttacker(final Game game, final Card c, final Combat combat, boolean triggers) {
GameEntity defender = combat.getDefenderByAttacker(c);
// Run triggers // Run triggers
if (triggers) { if (triggers) {
final Map<AbilityKey, Object> runParams = AbilityKey.newMap(); final Map<AbilityKey, Object> runParams = AbilityKey.newMap();
@@ -390,7 +392,7 @@ public class CombatUtil {
final List<Card> otherAttackers = combat.getAttackers(); final List<Card> otherAttackers = combat.getAttackers();
otherAttackers.remove(c); otherAttackers.remove(c);
runParams.put(AbilityKey.OtherAttackers, otherAttackers); runParams.put(AbilityKey.OtherAttackers, otherAttackers);
runParams.put(AbilityKey.Attacked, combat.getDefenderByAttacker(c)); runParams.put(AbilityKey.Attacked, defender);
runParams.put(AbilityKey.DefendingPlayer, combat.getDefenderPlayerByAttacker(c)); runParams.put(AbilityKey.DefendingPlayer, combat.getDefenderPlayerByAttacker(c));
// only add defenders that were attacked // only add defenders that were attacked
final FCollection<GameEntity> defenders = new FCollection<>(); final FCollection<GameEntity> defenders = new FCollection<>();
@@ -403,7 +405,7 @@ public class CombatUtil {
game.getTriggerHandler().runTrigger(TriggerType.Attacks, runParams, false); game.getTriggerHandler().runTrigger(TriggerType.Attacks, runParams, false);
} }
c.getDamageHistory().setCreatureAttackedThisCombat(true); c.getDamageHistory().setCreatureAttackedThisCombat(defender);
c.getDamageHistory().clearNotAttackedSinceLastUpkeepOf(); c.getDamageHistory().clearNotAttackedSinceLastUpkeepOf();
c.getController().addCreaturesAttackedThisTurn(CardUtil.getLKICopy(c)); c.getController().addCreaturesAttackedThisTurn(CardUtil.getLKICopy(c));
} }

View File

@@ -2661,7 +2661,7 @@ public class Player extends GameEntity implements Comparable<Player> {
for (Card c : list) { for (Card c : list) {
if (c.getDamageHistory().getCreatureAttackedThisCombat()) { if (c.getDamageHistory().getCreatureAttackedThisCombat()) {
c.getDamageHistory().setCreatureAttackedThisCombat(false); c.getDamageHistory().setCreatureAttackedThisCombat(null);
} }
if (c.getDamageHistory().getCreatureBlockedThisCombat()) { if (c.getDamageHistory().getCreatureBlockedThisCombat()) {
c.getDamageHistory().setCreatureBlockedThisCombat(false); c.getDamageHistory().setCreatureBlockedThisCombat(false);

View File

@@ -163,6 +163,10 @@ public class PlayerProperty {
if (game.getCombat() == null || !player.equals(game.getCombat().getDefenderPlayerByAttacker(source))) { if (game.getCombat() == null || !player.equals(game.getCombat().getDefenderPlayerByAttacker(source))) {
return false; return false;
} }
} else if (property.equals("attackedBySourceThisTurn")) {
if (!source.getDamageHistory().hasAttackedThisTurn(player)) {
return false;
}
} else if (property.equals("wasDealtDamageThisTurn")) { } else if (property.equals("wasDealtDamageThisTurn")) {
if (player.getAssignedDamage() == 0) { if (player.getAssignedDamage() == 0) {
return false; return false;

View File

@@ -1,6 +1,6 @@
Name:Jabari's Influence Name:Jabari's Influence
ManaCost:3 W W ManaCost:3 W W
Types:Instant 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 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. 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.

View File

@@ -2,13 +2,8 @@ Name:Port Razer
ManaCost:3 R R ManaCost:3 R R
Types:Creature Orc Pirate Types:Creature Orc Pirate
PT:4/4 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. 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:TrigUntap:DB$ UntapAll | ValidCards$ Creature.YouCtrl | SubAbility$ DBAddCombat
SVar:DBAddCombat:DB$ AddPhase | ExtraPhase$ Combat | AfterPhase$ EndCombat 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. 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.