Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions forge-ai/src/main/java/forge/ai/ability/ManaAi.java
Original file line number Diff line number Diff line change
Expand Up @@ -263,11 +263,11 @@ public static boolean canRampPool(Player ai, Card source) {
if (mp.isEmpty()) {
// TODO use color from ability
test = new Mana((byte) ManaAtom.COLORLESS, source, null, ai);
mp.addMana(test, false);
mp.addManaNoEvent(test);
}
boolean lose = mp.willManaBeLostAtEndOfPhase();
if (test != null) {
mp.removeMana(test, false);
mp.removeManaNoEvent(test);
}
return !lose;
}
Expand Down
2 changes: 1 addition & 1 deletion forge-ai/src/main/java/forge/ai/simulation/GameCopier.java
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public Game makeCopy(PhaseType advanceToPhase, Player aiPlayer) {
newPlayer.setCrankCounter(origPlayer.getCrankCounter());
// TODO creatureAttackedThisTurn
for (Mana m : origPlayer.getManaPool()) {
newPlayer.getManaPool().addMana(m, false);
newPlayer.getManaPool().addManaNoEvent(m);
}
playerMap.put(origPlayer, newPlayer);
}
Expand Down
2 changes: 1 addition & 1 deletion forge-game/src/main/java/forge/game/GameSnapshot.java
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ private void copyManaPool(Player fromPlayer, Player toPlayer) {
Game toGame = toPlayer.getGame();
toPlayer.getManaPool().resetPool();
for (Mana m : fromPlayer.getManaPool()) {
toPlayer.getManaPool().addMana(copyMana(m, toGame, toPlayer), false);
toPlayer.getManaPool().addManaNoEvent(copyMana(m, toGame, toPlayer));
}
toPlayer.updateManaForView();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public void resolve(SpellAbility sa) {
}

if (sa.hasParam("DrainMana")) {
sa.getActivatingPlayer().getManaPool().add(drained);
sa.getActivatingPlayer().getManaPool().addMana(drained);
}
if (sa.hasParam("RememberDrainedMana")) {
sa.getHostCard().addRemembered(drained.size());
Expand Down
2 changes: 1 addition & 1 deletion forge-game/src/main/java/forge/game/cost/CostAddMana.java
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public boolean payAsDecided(Player ai, PaymentDecision decision, SpellAbility sa
manaProduced.add(new Mana(attemptedMana, source, null, ai));
}
}
ai.getManaPool().add(manaProduced);
ai.getManaPool().addMana(manaProduced);
return true;
}

Expand Down
12 changes: 7 additions & 5 deletions forge-game/src/main/java/forge/game/event/GameEventManaPool.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package forge.game.event;

import forge.game.mana.Mana;
import java.util.Set;

import forge.card.MagicColor;
import forge.game.player.Player;
import forge.game.player.PlayerView;
import forge.util.Lang;

public record GameEventManaPool(PlayerView player, EventValueChangeType mode, byte manaColor) implements GameEvent {
public record GameEventManaPool(PlayerView player, EventValueChangeType mode, Set<MagicColor.Color> colors) implements GameEvent {

public GameEventManaPool(Player player, EventValueChangeType mode, Mana mana) {
this(PlayerView.get(player), mode, mana != null ? mana.getColor() : (byte) 0);
public GameEventManaPool(Player player, EventValueChangeType mode, Set<MagicColor.Color> colors) {
this(PlayerView.get(player), mode, colors);
}

@Override
Expand All @@ -26,7 +28,7 @@ public String toString() {
switch (mode) {
case Added:
case Removed:
sb.append(" - ").append(manaColor);
sb.append(" - ").append(colors);
break;
default:
break;
Expand Down
52 changes: 30 additions & 22 deletions forge-game/src/main/java/forge/game/mana/ManaPool.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Lists;

import forge.card.MagicColor;
import forge.card.mana.ManaAtom;
import forge.card.mana.ManaCostShard;
import forge.game.Game;
Expand Down Expand Up @@ -58,21 +60,21 @@ public final int getAmountOfColor(final byte color) {
return ofColor == null ? 0 : ofColor.size();
}

public void addMana(final Mana mana) {
addMana(mana, true);
}
public void addMana(final Mana mana, boolean updateView) {
public void addManaNoEvent(final Mana mana) {
floatingMana.put(mana.getColor(), mana);
if (updateView) {
owner.updateManaForView();
owner.getGame().fireEvent(new GameEventManaPool(owner, EventValueChangeType.Added, mana));
}
}

public final void add(final Iterable<Mana> manaList) {
public final void addMana(final Mana... manaList) {
addMana(Arrays.asList(manaList));
}
public final void addMana(final Iterable<Mana> manaList) {
Set<MagicColor.Color> colors = EnumSet.noneOf(MagicColor.Color.class);
for (final Mana m : manaList) {
addMana(m);
floatingMana.put(m.getColor(), m);
colors.add(MagicColor.Color.fromByte(m.getColor()));
}
owner.updateManaForView();
owner.getGame().fireEvent(new GameEventManaPool(owner, EventValueChangeType.Added, colors));
}

/**
Expand Down Expand Up @@ -182,16 +184,24 @@ private void convertManaColor(final byte originalColor, final byte toColor) {
owner.updateManaForView();
}

public boolean removeMana(final Mana mana) {
return removeMana(mana, true);
public boolean removeManaNoEvent(final Mana mana) {
return floatingMana.remove(mana.getColor(), mana);
}
public boolean removeMana(final Mana mana, boolean updateView) {
boolean result = floatingMana.remove(mana.getColor(), mana);
if (result && updateView) {
owner.updateManaForView();
owner.getGame().fireEvent(new GameEventManaPool(owner, EventValueChangeType.Removed, mana));

public boolean removeMana(Mana... manaList) {
return removeMana(Arrays.asList(manaList));
}

public boolean removeMana(final Iterable<Mana> manaList) {
Set<MagicColor.Color> colors = EnumSet.noneOf(MagicColor.Color.class);
for (Mana m : manaList) {
if (floatingMana.remove(m.getColor(), m)) {
colors.add(MagicColor.Color.fromByte(m.getColor()));
}
}
return result;
owner.updateManaForView();
owner.getGame().fireEvent(new GameEventManaPool(owner, EventValueChangeType.Removed, colors));
return !colors.isEmpty();
}

public final void payManaFromAbility(final SpellAbility saPaidFor, ManaCostBeingPaid manaCost, final SpellAbility saPayment) {
Expand Down Expand Up @@ -289,14 +299,12 @@ public boolean accountFor(final AbilityManaPart ma) {
return false;
}

for (Mana m : removeFloating) {
removeMana(m);
}
removeMana(removeFloating);
return true;
}

public void refundMana(List<Mana> manaSpent) {
add(manaSpent);
addMana(manaSpent);
manaSpent.clear();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ManaRefundService {

Expand All @@ -22,10 +24,9 @@ public void refundManaPaid() {
PlayerCollection payers = new PlayerCollection(sa.getActivatingPlayer());

// move non-undoable paying mana back to floating
for (Mana mana : sa.getPayingMana()) {
Player pl = mana.getPlayer();
pl.getManaPool().addMana(mana);
payers.add(pl);
for (Map.Entry<Player, List<Mana>> e : sa.getPayingMana().stream().collect(Collectors.groupingBy(Mana::getPlayer)).entrySet()) {
e.getKey().getManaPool().addMana(e.getValue());
payers.add(e.getKey());
}

sa.getPayingMana().clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public final String produceMana(final String produced, final Player player, Spel
}
}

manaPool.add(this.lastManaProduced);
manaPool.addMana(this.lastManaProduced);

final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(source);
runParams.put(AbilityKey.Player, player);
Expand Down
Loading