mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 10:48:00 +00:00
Jabari's Influence: multiplayer fix (#375)
* Jabari's Influence: multiplayer fix
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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")) {
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user