diff --git a/.gitattributes b/.gitattributes index bc4333303e2..ec67f143ba0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14239,6 +14239,7 @@ src/main/java/forge/game/ai/ComputerUtilCombat.java -text src/main/java/forge/game/ai/ComputerUtilCost.java -text src/main/java/forge/game/ai/ComputerUtilMana.java -text src/main/java/forge/game/event/GameEvent.java -text +src/main/java/forge/game/event/GameEventAnteCardsSelected.java -text src/main/java/forge/game/event/GameEventBlockerAssigned.java -text src/main/java/forge/game/event/GameEventCardDamaged.java -text src/main/java/forge/game/event/GameEventCardDestroyed.java -text @@ -14247,7 +14248,6 @@ src/main/java/forge/game/event/GameEventCardEquipped.java -text src/main/java/forge/game/event/GameEventCardRegenerated.java -text src/main/java/forge/game/event/GameEventCardSacrificed.java -text src/main/java/forge/game/event/GameEventCardTapped.java -text -src/main/java/forge/game/event/GameEventCardsAnted.java -text src/main/java/forge/game/event/GameEventCounterAdded.java -text src/main/java/forge/game/event/GameEventCounterRemoved.java -text src/main/java/forge/game/event/GameEventDrawCard.java -text diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 368ad0bd817..4743c55297a 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -1154,7 +1154,7 @@ public class Card extends GameEntity implements Comparable { } // play the Add Counter sound - getGame().getEvents().post(new GameEventCounterAdded(addAmount)); + getGame().fireEvent(new GameEventCounterAdded(addAmount)); this.updateObservers(); } @@ -1235,7 +1235,7 @@ public class Card extends GameEntity implements Comparable { } // Play the Subtract Counter sound - getGame().getEvents().post(new GameEventCounterRemoved(delta)); + getGame().fireEvent(new GameEventCounterRemoved(delta)); this.updateObservers(); } @@ -3184,7 +3184,7 @@ public class Card extends GameEntity implements Comparable { c.addEquippedBy(this); // Play the Equip sound - getGame().getEvents().post(new GameEventCardEquipped()); + getGame().fireEvent(new GameEventCardEquipped()); // run trigger final HashMap runParams = new HashMap(); runParams.put("AttachSource", this); @@ -4078,7 +4078,7 @@ public class Card extends GameEntity implements Comparable { this.setTapped(true); // Play the Tap sound - getGame().getEvents().post(new GameEventCardTapped(true)); + getGame().fireEvent(new GameEventCardTapped(this, true)); } /** @@ -4094,7 +4094,7 @@ public class Card extends GameEntity implements Comparable { getGame().getTriggerHandler().runTrigger(TriggerType.Untaps, runParams, false); // Play the Untap sound - getGame().getEvents().post(new GameEventCardTapped(false)); + getGame().fireEvent(new GameEventCardTapped(this, false)); } for (final Command var : this.untapCommandList) { @@ -7406,7 +7406,7 @@ public class Card extends GameEntity implements Comparable { } // Play the Damage sound - game.getEvents().post(new GameEventCardDamaged()); + game.fireEvent(new GameEventCardDamaged()); } getGame().getGameLog().add(GameEventType.DAMAGE, String.format("Dealing %d damage to %s. %s", damageToAdd, this.getName(), additionalLog)); diff --git a/src/main/java/forge/card/ability/effects/FlipCoinEffect.java b/src/main/java/forge/card/ability/effects/FlipCoinEffect.java index ff611aec0a5..fcf4f2441e5 100644 --- a/src/main/java/forge/card/ability/effects/FlipCoinEffect.java +++ b/src/main/java/forge/card/ability/effects/FlipCoinEffect.java @@ -131,7 +131,7 @@ public class FlipCoinEffect extends SpellAbilityEffect { public static boolean flipCoinNoCall(final Card source, final Player flipper) { final boolean resultIsHeads = MyRandom.getRandom().nextBoolean(); - flipper.getGame().getEvents().post(new GameEventFlipCoin()); + flipper.getGame().fireEvent(new GameEventFlipCoin()); final StringBuilder result = new StringBuilder(); result.append(flipper.getName()); result.append("'s flip comes up"); diff --git a/src/main/java/forge/card/ability/effects/TokenEffect.java b/src/main/java/forge/card/ability/effects/TokenEffect.java index 31ac17f9022..a3d3012b171 100644 --- a/src/main/java/forge/card/ability/effects/TokenEffect.java +++ b/src/main/java/forge/card/ability/effects/TokenEffect.java @@ -209,7 +209,7 @@ public class TokenEffect extends SpellAbilityEffect { for(Card tok : tokens) { controller.getGame().getAction().moveToPlay(tok); } - controller.getGame().getEvents().post(new GameEventTokenCreated()); + controller.getGame().fireEvent(new GameEventTokenCreated()); // Grant rule changes if (this.tokenHiddenKeywords != null) { diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 1539134b3c4..c2f2dec1e67 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -43,7 +43,7 @@ import forge.control.KeyboardShortcuts.Shortcut; import forge.control.input.InputQueue; import forge.game.GameState; import forge.game.ai.AiProfileUtil; -import forge.game.event.GameEventCardsAnted; +import forge.game.event.GameEventAnteCardsSelected; import forge.game.event.GameEventDuelFinished; import forge.game.event.GameEvent; import forge.game.event.GameEventTurnPhase; @@ -377,7 +377,7 @@ public enum FControl { inputQueue = new InputQueue(); this.game = game0; - game.getEvents().register(Singletons.getControl().getSoundSystem()); + game.subscribeToEvents(Singletons.getControl().getSoundSystem()); LobbyPlayer humanLobbyPlayer = getLobby().getGuiPlayer(); // The UI controls should use these game data as models @@ -401,7 +401,7 @@ public enum FControl { // some observers were set in CMatchUI.initMatch // Listen to DuelOutcome event to show ViewWinLose - game.getEvents().register(this); + game.subscribeToEvents(this); VAntes.SINGLETON_INSTANCE.setModel(game.getRegisteredPlayers()); @@ -425,11 +425,11 @@ public enum FControl { new ViewWinLose(game.getMatch()); SOverlayUtils.showOverlay(); } }); - } else if ( ev instanceof GameEventCardsAnted ) { + } else if ( ev instanceof GameEventAnteCardsSelected ) { // Require EDT here? final String nl = System.getProperty("line.separator"); final StringBuilder msg = new StringBuilder(); - for (final Pair kv : ((GameEventCardsAnted) ev).cards) { + for (final Pair kv : ((GameEventAnteCardsSelected) ev).cards) { msg.append(kv.getKey().getName()).append(" ante: ").append(kv.getValue()).append(nl); } GuiDialog.message(msg.toString(), "Ante"); diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 7db5413d1d4..3d00d5eb4e5 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -1110,7 +1110,7 @@ public class GameAction { if (c.getCounters(CounterType.LOYALTY) <= 0) { moveToGraveyard(c); // Play the Destroy sound - game.getEvents().post(new GameEventCardDestroyed()); + game.fireEvent(new GameEventCardDestroyed()); recheck = true; } @@ -1164,7 +1164,7 @@ public class GameAction { } recheck = true; // Play the Destroy sound - game.getEvents().post(new GameEventCardDestroyed()); + game.fireEvent(new GameEventCardDestroyed()); } } @@ -1179,7 +1179,7 @@ public class GameAction { this.sacrificeDestroy(c); // Play the Sacrifice sound - game.getEvents().post(new GameEventCardSacrificed()); + game.fireEvent(new GameEventCardSacrificed()); // Run triggers final HashMap runParams = new HashMap(); @@ -1211,7 +1211,7 @@ public class GameAction { game.getCombat().removeFromCombat(c); // Play the Regen sound - game.getEvents().post(new GameEventCardRegenerated()); + game.fireEvent(new GameEventCardRegenerated()); return false; } @@ -1263,7 +1263,7 @@ public class GameAction { card.setDamage(0); // Play the Destroy sound - game.getEvents().post(new GameEventCardDestroyed()); + game.fireEvent(new GameEventCardDestroyed()); } }; @@ -1280,7 +1280,7 @@ public class GameAction { } // Play the Destroy sound - game.getEvents().post(new GameEventCardDestroyed()); + game.fireEvent(new GameEventCardDestroyed()); // Run triggers final HashMap runParams = new HashMap(); runParams.put("Card", c); diff --git a/src/main/java/forge/game/GameActionUtil.java b/src/main/java/forge/game/GameActionUtil.java index 56a346bb7d3..5643325e270 100644 --- a/src/main/java/forge/game/GameActionUtil.java +++ b/src/main/java/forge/game/GameActionUtil.java @@ -24,7 +24,6 @@ import java.util.Map; import org.apache.commons.lang.StringUtils; - import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -37,6 +36,7 @@ import forge.CardUtil; import forge.Command; import forge.Constant; import forge.CounterType; + import forge.card.MagicColor; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityFactory.AbilityRecordType; @@ -55,12 +55,12 @@ import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityRestriction; import forge.game.ai.AiController; import forge.game.player.HumanPlay; +import forge.game.event.GameEventLifeLoss; import forge.game.player.Player; import forge.game.player.PlayerControllerAi; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; import forge.gui.GuiDialog; -import forge.sound.SoundEffectType; import forge.util.TextUtil; @@ -439,7 +439,7 @@ public final class GameActionUtil { c.getDamageHistory().registerCombatDamage(player); // Play the Life Loss sound - player.getGame().getEvents().post(SoundEffectType.LifeLoss); + player.getGame().fireEvent(new GameEventLifeLoss()); } // executeCombatDamageToPlayerEffects /** diff --git a/src/main/java/forge/game/GameState.java b/src/main/java/forge/game/GameState.java index c142ec5c4c1..9cecfb3d7ad 100644 --- a/src/main/java/forge/game/GameState.java +++ b/src/main/java/forge/game/GameState.java @@ -38,6 +38,7 @@ import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityStackInstance; import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerType; +import forge.game.event.GameEvent; import forge.game.phase.Cleanup; import forge.game.phase.Combat; import forge.game.phase.EndOfCombat; @@ -521,10 +522,14 @@ public class GameState { } /** - * @return the events + * Fire only the events after they became real for gamestate and won't get replaced.
+ * The events are sent to UI, log and sound system. Network listeners are under development. */ - public EventBus getEvents() { - return events; + public void fireEvent(GameEvent event) { + events.post(event); + } + public void subscribeToEvents(Object subscriber) { + events.register(subscriber); } /** diff --git a/src/main/java/forge/game/MatchState.java b/src/main/java/forge/game/MatchState.java index 20cfc6543ab..31cbdd7a6d9 100644 --- a/src/main/java/forge/game/MatchState.java +++ b/src/main/java/forge/game/MatchState.java @@ -9,7 +9,7 @@ import com.google.common.collect.Lists; import forge.Card; import forge.Singletons; -import forge.game.event.GameEventCardsAnted; +import forge.game.event.GameEventAnteCardsSelected; import forge.game.event.GameEventDuelFinished; import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventFlipCoin; @@ -88,10 +88,10 @@ public class MatchState { gamesPlayed.add(result); // The log shall listen to events and generate text internally - game.getEvents().post(new GameEventDuelOutcome(result, gamesPlayedRo)); + game.fireEvent(new GameEventDuelOutcome(result, gamesPlayedRo)); // will pull UI - game.getEvents().post(new GameEventDuelFinished()); + game.fireEvent(new GameEventDuelFinished()); } @@ -110,7 +110,7 @@ public class MatchState { if (useAnte) { // Deciding which cards go to ante List> list = GameNew.chooseCardsForAnte(currentGame); GameNew.moveCardsToAnte(list); - currentGame.getEvents().post(new GameEventCardsAnted(list)); + currentGame.fireEvent(new GameEventAnteCardsSelected(list)); } // This code was run from EDT. @@ -229,7 +229,7 @@ public class MatchState { boolean isFirstGame = lastGameOutcome == null; if (isFirstGame) { - game.getEvents().post(new GameEventFlipCoin()); // Play the Flip Coin sound + game.fireEvent(new GameEventFlipCoin()); // Play the Flip Coin sound goesFirst = Aggregates.random(game.getPlayers()); } else { for(Player p : game.getPlayers()) { diff --git a/src/main/java/forge/game/event/GameEventCardsAnted.java b/src/main/java/forge/game/event/GameEventAnteCardsSelected.java similarity index 69% rename from src/main/java/forge/game/event/GameEventCardsAnted.java rename to src/main/java/forge/game/event/GameEventAnteCardsSelected.java index 265854e4a62..100478c1cb7 100644 --- a/src/main/java/forge/game/event/GameEventCardsAnted.java +++ b/src/main/java/forge/game/event/GameEventAnteCardsSelected.java @@ -5,9 +5,9 @@ import org.apache.commons.lang3.tuple.Pair; import forge.Card; import forge.game.player.Player; -public class GameEventCardsAnted extends GameEvent { +public class GameEventAnteCardsSelected extends GameEvent { public final Iterable> cards; - public GameEventCardsAnted(Iterable> cardz) { + public GameEventAnteCardsSelected(Iterable> cardz) { cards = cardz; } diff --git a/src/main/java/forge/game/event/GameEventCardTapped.java b/src/main/java/forge/game/event/GameEventCardTapped.java index 03b750d5a39..e4ae91cbdfe 100644 --- a/src/main/java/forge/game/event/GameEventCardTapped.java +++ b/src/main/java/forge/game/event/GameEventCardTapped.java @@ -1,10 +1,14 @@ package forge.game.event; -public class GameEventCardTapped extends GameEvent { - public final boolean Tapped; +import forge.Card; - public GameEventCardTapped(boolean tapped) { - Tapped = tapped; +public class GameEventCardTapped extends GameEvent { + public final boolean tapped; + public final Card card; + + public GameEventCardTapped(final Card card, final boolean tapped) { + this.tapped = tapped; + this.card = card; } diff --git a/src/main/java/forge/game/phase/Combat.java b/src/main/java/forge/game/phase/Combat.java index f73b6744b45..b82beb71612 100644 --- a/src/main/java/forge/game/phase/Combat.java +++ b/src/main/java/forge/game/phase/Combat.java @@ -374,7 +374,7 @@ public class Combat { } else { this.blockerMap.get(blocker).add(attacker); } - attacker.getGame().getEvents().post(new GameEventBlockerAssigned()); + attacker.getGame().fireEvent(new GameEventBlockerAssigned()); } public final void removeBlockAssignment(final Card attacker, final Card blocker) { diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index f592737d653..6e37523e45f 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -200,7 +200,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { game.getGameLog().add(GameEventType.TURN, "Turn " + this.turn + " (" + this.getPlayerTurn() + ")"); } - game.getEvents().post(new GameEventTurnPhase(this.getPlayerTurn(), this.getPhase(), phaseType)); + game.fireEvent(new GameEventTurnPhase(this.getPlayerTurn(), this.getPhase(), phaseType)); } @@ -393,7 +393,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { p.loseLife(burn); // Play the Mana Burn sound - game.getEvents().post(new GameEventManaBurn()); + game.fireEvent(new GameEventManaBurn()); } p.updateObservers(); } @@ -426,7 +426,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { } this.planarDiceRolledthisTurn = 0; // Play the End Turn sound - game.getEvents().post(new GameEventEndOfTurn()); + game.fireEvent(new GameEventEndOfTurn()); break; default: // no action } @@ -716,7 +716,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { // If ever the karn's ultimate resolved if( game.getAge() == GameAge.RestartedByKarn) { phase = null; - game.getEvents().post(new GameEventGameRestarted(playerTurn)); + game.fireEvent(new GameEventGameRestarted(playerTurn)); return; } diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index ea74828297e..da50513dc52 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -509,7 +509,7 @@ public class Player extends GameEntity implements Comparable { if (toLose > 0) { this.subtractLife(toLose); lifeLost = toLose; - game.getEvents().post(new GameEventLifeLoss()); + game.fireEvent(new GameEventLifeLoss()); this.updateObservers(); } else if (toLose == 0) { // Rule 118.4 @@ -656,7 +656,7 @@ public class Player extends GameEntity implements Comparable { source.getController().gainLife(damageToDo, source); } source.getDamageHistory().registerDamage(this); - this.getGame().getEvents().post(new GameEventLifeLoss()); + this.getGame().fireEvent(new GameEventLifeLoss()); if (isCombat) { final ArrayList types = source.getType(); @@ -1020,7 +1020,7 @@ public class Player extends GameEntity implements Comparable { if (!this.hasKeyword("You can't get poison counters")) { this.poisonCounters += num; - game.getEvents().post(new GameEventPoisonCounter(this, source, num)); + game.fireEvent(new GameEventPoisonCounter(this, source, num)); game.getGameLog().add(GameEventType.DAMAGE_POISON, this + " receives a poison counter from " + source); this.updateObservers(); @@ -1267,7 +1267,7 @@ public class Player extends GameEntity implements Comparable { } // Play the Draw sound - game.getEvents().post(new GameEventDrawCard()); + game.fireEvent(new GameEventDrawCard()); return drawn; } @@ -1605,13 +1605,13 @@ public class Player extends GameEntity implements Comparable { if (discardToTopOfLibrary) { game.getAction().moveToLibrary(c, 0); // Play the Discard sound - game.getEvents().post(new GameEventCardDiscarded()); + game.fireEvent(new GameEventCardDiscarded()); this.numDiscardedThisTurn++; } else { game.getAction().moveToGraveyard(c); // Play the Discard sound - game.getEvents().post(new GameEventCardDiscarded()); + game.fireEvent(new GameEventCardDiscarded()); this.numDiscardedThisTurn++; } @@ -1738,7 +1738,7 @@ public class Player extends GameEntity implements Comparable { game.getTriggerHandler().runTrigger(TriggerType.Shuffled, runParams, false); // Play the shuffle sound - game.getEvents().post(new GameEventShuffle()); + game.fireEvent(new GameEventShuffle()); } // shuffle // ////////////////////////////// @@ -1771,7 +1771,7 @@ public class Player extends GameEntity implements Comparable { game.getGameLog().add(GameEventType.LAND, this + " played " + land); // play a sound - game.getEvents().post(new GameEventLandPlayed(this, land)); + game.fireEvent(new GameEventLandPlayed(this, land)); // Run triggers final HashMap runParams = new HashMap(); @@ -2719,13 +2719,13 @@ public class Player extends GameEntity implements Comparable { public final void releaseControl() { controller = controllerCreator; - game.getEvents().post(new GameEventPlayerControl(this, getLobbyPlayer(), null)); + game.fireEvent(new GameEventPlayerControl(this, getLobbyPlayer(), null)); } public final void obeyNewMaster(PlayerController pc) { LobbyPlayer oldController = getLobbyPlayer(); controller = pc; - game.getEvents().post(new GameEventPlayerControl(this, oldController, pc.getLobbyPlayer())); + game.fireEvent(new GameEventPlayerControl(this, oldController, pc.getLobbyPlayer())); } @@ -3126,7 +3126,7 @@ public class Player extends GameEntity implements Comparable { * TODO: Write javadoc for this method. */ public void onMulliganned() { - game.getEvents().post(new GameEventMulligan(this)); // quest listener may interfere here + game.fireEvent(new GameEventMulligan(this)); // quest listener may interfere here final int newHand = getCardsIn(ZoneType.Hand).size(); game.getGameLog().add(GameEventType.MULLIGAN, this + " has mulliganed down to " + newHand + " cards."); stats.notifyHasMulliganed(); diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 5a3ebe2141f..9246597dad1 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -617,7 +617,7 @@ public class MagicStack extends MyObservable implements Iterable