more events instead of direct calls are used for both log and sound system

This commit is contained in:
Maxmtg
2013-05-29 22:18:07 +00:00
parent 77a319deac
commit 2b53b2ae20
11 changed files with 83 additions and 38 deletions

3
.gitattributes vendored
View File

@@ -14232,7 +14232,6 @@ src/main/java/forge/game/event/GameEventCounterRemoved.java -text
src/main/java/forge/game/event/GameEventDrawCard.java -text src/main/java/forge/game/event/GameEventDrawCard.java -text
src/main/java/forge/game/event/GameEventDuelFinished.java -text src/main/java/forge/game/event/GameEventDuelFinished.java -text
src/main/java/forge/game/event/GameEventDuelOutcome.java -text src/main/java/forge/game/event/GameEventDuelOutcome.java -text
src/main/java/forge/game/event/GameEventEndOfTurn.java -text
src/main/java/forge/game/event/GameEventFlipCoin.java -text src/main/java/forge/game/event/GameEventFlipCoin.java -text
src/main/java/forge/game/event/GameEventGameRestarted.java -text src/main/java/forge/game/event/GameEventGameRestarted.java -text
src/main/java/forge/game/event/GameEventLandPlayed.java -text src/main/java/forge/game/event/GameEventLandPlayed.java -text
@@ -14245,6 +14244,8 @@ src/main/java/forge/game/event/GameEventPlayerPoisoned.java -text
src/main/java/forge/game/event/GameEventShuffle.java -text src/main/java/forge/game/event/GameEventShuffle.java -text
src/main/java/forge/game/event/GameEventSpellResolved.java -text src/main/java/forge/game/event/GameEventSpellResolved.java -text
src/main/java/forge/game/event/GameEventTokenCreated.java -text src/main/java/forge/game/event/GameEventTokenCreated.java -text
src/main/java/forge/game/event/GameEventTurnBegan.java -text
src/main/java/forge/game/event/GameEventTurnEnded.java -text
src/main/java/forge/game/event/GameEventTurnPhase.java -text src/main/java/forge/game/event/GameEventTurnPhase.java -text
src/main/java/forge/game/event/IGameEventVisitor.java -text src/main/java/forge/game/event/IGameEventVisitor.java -text
src/main/java/forge/game/event/package-info.java -text src/main/java/forge/game/event/package-info.java -text

View File

@@ -9,8 +9,11 @@ import com.google.common.eventbus.Subscribe;
import forge.game.GameOutcome; import forge.game.GameOutcome;
import forge.game.event.GameEventCardDamaged; import forge.game.event.GameEventCardDamaged;
import forge.game.event.GameEventCardDamaged.DamageType; import forge.game.event.GameEventCardDamaged.DamageType;
import forge.game.event.GameEventLandPlayed;
import forge.game.event.GameEventPlayerDamaged; import forge.game.event.GameEventPlayerDamaged;
import forge.game.event.GameEventPlayerPoisoned; import forge.game.event.GameEventPlayerPoisoned;
import forge.game.event.GameEventSpellResolved;
import forge.game.event.GameEventTurnBegan;
import forge.game.event.IGameEventVisitor; import forge.game.event.IGameEventVisitor;
import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventDuelOutcome;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
@@ -47,6 +50,15 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
} }
/* (non-Javadoc)
* @see forge.game.event.IGameEventVisitor.Base#visit(forge.game.event.GameEventSpellResolved)
*/
@Override
public GameLogEntry visit(GameEventSpellResolved ev) {
String messageForLog = ev.hasFizzled ? ev.spell.getSourceCard().getName() + " ability fizzles." : ev.spell.getStackDescription();
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, messageForLog);
}
private GameLogEntry generateSummary(List<GameOutcome> gamesPlayed) { private GameLogEntry generateSummary(List<GameOutcome> gamesPlayed) {
GameOutcome outcome1 = gamesPlayed.get(0); GameOutcome outcome1 = gamesPlayed.get(0);
int[] wins = new int[outcome1.getNumPlayers()]; int[] wins = new int[outcome1.getNumPlayers()];
@@ -103,6 +115,20 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
return new GameLogEntry(GameLogEntryType.DAMAGE, message); return new GameLogEntry(GameLogEntryType.DAMAGE, message);
} }
/* (non-Javadoc)
* @see forge.game.event.IGameEventVisitor.Base#visit(forge.game.event.GameEventLandPlayed)
*/
@Override
public GameLogEntry visit(GameEventLandPlayed ev) {
String message = String.format("%s played %s", ev.player, ev.land);
return new GameLogEntry(GameLogEntryType.LAND, message);
}
@Override
public GameLogEntry visit(GameEventTurnBegan event) {
String message = String.format( "Turn %d (%s)", event.turnNumber, event.turnOwner);
return new GameLogEntry(GameLogEntryType.TURN, message);
}
@Override @Override
public GameLogEntry visit(GameEventPlayerDamaged ev) { public GameLogEntry visit(GameEventPlayerDamaged ev) {

View File

@@ -5,12 +5,12 @@ import forge.game.player.Player;
public class GameEventLandPlayed extends GameEvent { public class GameEventLandPlayed extends GameEvent {
public final Player Player; public final Player player;
public final Card Land; public final Card land;
public GameEventLandPlayed(Player player, Card land) { public GameEventLandPlayed(Player player, Card land) {
Player = player; this.player = player;
Land = land; this.land = land;
} }

View File

@@ -1,6 +1,5 @@
package forge.game.event; package forge.game.event;
import forge.Card;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
/** /**
@@ -9,18 +8,19 @@ import forge.card.spellability.SpellAbility;
*/ */
public class GameEventSpellResolved extends GameEvent { public class GameEventSpellResolved extends GameEvent {
public final Card Source; public final SpellAbility spell;
public final SpellAbility Spell; public final boolean hasFizzled;
/** /**
* TODO: Write javadoc for Constructor. * TODO: Write javadoc for Constructor.
* @param source * @param source
* @param sa * @param sa
* @param hasFizzled
*/ */
public GameEventSpellResolved(Card source, SpellAbility sa) { public GameEventSpellResolved(SpellAbility sa, boolean hasFizzled) {
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
Source = source; this.spell = sa;
Spell = sa; this.hasFizzled = hasFizzled;
} }

View File

@@ -0,0 +1,20 @@
package forge.game.event;
import forge.game.player.Player;
public class GameEventTurnBegan extends GameEvent {
public final Player turnOwner;
public final int turnNumber;
public GameEventTurnBegan(Player turnOwner, int turnNumber) {
super();
this.turnOwner = turnOwner;
this.turnNumber = turnNumber;
}
@Override
public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@@ -1,10 +1,10 @@
package forge.game.event; package forge.game.event;
public class GameEventEndOfTurn extends GameEvent { public class GameEventTurnEnded extends GameEvent {
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);
} }
} }

View File

@@ -19,7 +19,6 @@ public interface IGameEventVisitor<T> {
T visit(GameEventDrawCard event); T visit(GameEventDrawCard event);
T visit(GameEventDuelFinished event); T visit(GameEventDuelFinished event);
T visit(GameEventDuelOutcome event); T visit(GameEventDuelOutcome event);
T visit(GameEventEndOfTurn event);
T visit(GameEventFlipCoin event); T visit(GameEventFlipCoin event);
T visit(GameEventGameRestarted event); T visit(GameEventGameRestarted event);
T visit(GameEventLandPlayed event); T visit(GameEventLandPlayed event);
@@ -32,6 +31,8 @@ public interface IGameEventVisitor<T> {
T visit(GameEventShuffle event); T visit(GameEventShuffle event);
T visit(GameEventSpellResolved event); T visit(GameEventSpellResolved event);
T visit(GameEventTokenCreated event); T visit(GameEventTokenCreated event);
T visit(GameEventTurnBegan gameEventTurnBegan);
T visit(GameEventTurnEnded event);
T visit(GameEventTurnPhase event); T visit(GameEventTurnPhase event);
@@ -51,7 +52,6 @@ public interface IGameEventVisitor<T> {
public T visit(GameEventDrawCard event) { return null; } public T visit(GameEventDrawCard event) { return null; }
public T visit(GameEventDuelFinished event) { return null; } public T visit(GameEventDuelFinished event) { return null; }
public T visit(GameEventDuelOutcome event) { return null; } public T visit(GameEventDuelOutcome event) { return null; }
public T visit(GameEventEndOfTurn event) { return null; }
public T visit(GameEventFlipCoin event) { return null; } public T visit(GameEventFlipCoin event) { return null; }
public T visit(GameEventGameRestarted event) { return null; } public T visit(GameEventGameRestarted event) { return null; }
public T visit(GameEventLandPlayed event) { return null; } public T visit(GameEventLandPlayed event) { return null; }
@@ -63,8 +63,13 @@ public interface IGameEventVisitor<T> {
public T visit(GameEventShuffle event) { return null; } public T visit(GameEventShuffle event) { return null; }
public T visit(GameEventSpellResolved event) { return null; } public T visit(GameEventSpellResolved event) { return null; }
public T visit(GameEventTokenCreated event) { return null; } public T visit(GameEventTokenCreated event) { return null; }
public T visit(GameEventTurnBegan event) { return null; }
public T visit(GameEventTurnEnded event) { return null; }
public T visit(GameEventTurnPhase event) { return null; } public T visit(GameEventTurnPhase event) { return null; }
public T visit(GameEventPlayerDamaged event) { return null; } public T visit(GameEventPlayerDamaged event) { return null; }
} }
} }

View File

@@ -26,14 +26,14 @@ import org.apache.commons.lang.time.StopWatch;
import forge.Card; import forge.Card;
import forge.CardLists; import forge.CardLists;
import forge.FThreads; import forge.FThreads;
import forge.GameLogEntryType;
import forge.Singletons; import forge.Singletons;
import forge.CardPredicates.Presets; import forge.CardPredicates.Presets;
import forge.card.trigger.TriggerType; import forge.card.trigger.TriggerType;
import forge.game.GameAge; import forge.game.GameAge;
import forge.game.Game; import forge.game.Game;
import forge.game.GameType; import forge.game.GameType;
import forge.game.event.GameEventEndOfTurn; import forge.game.event.GameEventTurnBegan;
import forge.game.event.GameEventTurnEnded;
import forge.game.event.GameEventGameRestarted; import forge.game.event.GameEventGameRestarted;
import forge.game.event.GameEventManaBurn; import forge.game.event.GameEventManaBurn;
import forge.game.event.GameEventTurnPhase; import forge.game.event.GameEventTurnPhase;
@@ -197,7 +197,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
if (this.phase == PhaseType.UNTAP) { if (this.phase == PhaseType.UNTAP) {
this.turn++; this.turn++;
game.getGameLog().add(GameLogEntryType.TURN, "Turn " + this.turn + " (" + this.getPlayerTurn() + ")"); game.fireEvent(new GameEventTurnBegan(playerTurn, turn));
} }
game.fireEvent(new GameEventTurnPhase(this.getPlayerTurn(), this.getPhase(), phaseType)); game.fireEvent(new GameEventTurnPhase(this.getPlayerTurn(), this.getPhase(), phaseType));
@@ -426,7 +426,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
} }
this.planarDiceRolledthisTurn = 0; this.planarDiceRolledthisTurn = 0;
// Play the End Turn sound // Play the End Turn sound
game.fireEvent(new GameEventEndOfTurn()); game.fireEvent(new GameEventTurnEnded());
break; break;
default: // no action default: // no action
} }

View File

@@ -1762,9 +1762,6 @@ public class Player extends GameEntity implements Comparable<Player> {
// etc...) // etc...)
game.getAction().checkStateEffects(); game.getAction().checkStateEffects();
// add to log
game.getGameLog().add(GameLogEntryType.LAND, this + " played " + land);
// play a sound // play a sound
game.fireEvent(new GameEventLandPlayed(this, land)); game.fireEvent(new GameEventLandPlayed(this, land));

View File

@@ -601,8 +601,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
curResolvingCard = source; curResolvingCard = source;
boolean thisHasFizzled = this.hasFizzled(sa, source, false); boolean thisHasFizzled = this.hasFizzled(sa, source, false);
String messageForLog = thisHasFizzled ? source.getName() + " ability fizzles." : sa.getStackDescription();
game.getGameLog().add(GameLogEntryType.STACK_RESOLVE, messageForLog);
if (thisHasFizzled) { // Fizzle if (thisHasFizzled) { // Fizzle
// TODO: Spell fizzles, what's the best way to alert player? // TODO: Spell fizzles, what's the best way to alert player?
Log.debug(source.getName() + " ability fizzles."); Log.debug(source.getName() + " ability fizzles.");
@@ -617,7 +616,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
} }
sa.getSourceCard().setXManaCostPaid(0); sa.getSourceCard().setXManaCostPaid(0);
game.fireEvent(new GameEventSpellResolved(source, sa)); game.fireEvent(new GameEventSpellResolved(sa, thisHasFizzled));
if (source.hasStartOfKeyword("Haunt") && !source.isCreature() if (source.hasStartOfKeyword("Haunt") && !source.isCreature()
&& game.getZoneOf(source).is(ZoneType.Graveyard)) { && game.getZoneOf(source).is(ZoneType.Graveyard)) {

View File

@@ -14,7 +14,7 @@ import forge.game.event.GameEventCounterAdded;
import forge.game.event.GameEventCounterRemoved; import forge.game.event.GameEventCounterRemoved;
import forge.game.event.GameEventDrawCard; import forge.game.event.GameEventDrawCard;
import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventDuelOutcome;
import forge.game.event.GameEventEndOfTurn; import forge.game.event.GameEventTurnEnded;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
import forge.game.event.GameEventFlipCoin; import forge.game.event.GameEventFlipCoin;
import forge.game.event.GameEventLandPlayed; import forge.game.event.GameEventLandPlayed;
@@ -43,7 +43,7 @@ public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> {
public SoundEffectType visit(GameEventCounterAdded event) { return event.Amount > 0 ? SoundEffectType.AddCounter : null; } public SoundEffectType visit(GameEventCounterAdded event) { return event.Amount > 0 ? SoundEffectType.AddCounter : null; }
public SoundEffectType visit(GameEventCounterRemoved event) { return event.Amount > 0 ? SoundEffectType.RemoveCounter : null; } public SoundEffectType visit(GameEventCounterRemoved event) { return event.Amount > 0 ? SoundEffectType.RemoveCounter : null; }
public SoundEffectType visit(GameEventDrawCard event) { return SoundEffectType.Draw; } public SoundEffectType visit(GameEventDrawCard event) { return SoundEffectType.Draw; }
public SoundEffectType visit(GameEventEndOfTurn event) { return SoundEffectType.EndOfTurn; } public SoundEffectType visit(GameEventTurnEnded event) { return SoundEffectType.EndOfTurn; }
public SoundEffectType visit(GameEventFlipCoin event) { return SoundEffectType.FlipCoin; } public SoundEffectType visit(GameEventFlipCoin event) { return SoundEffectType.FlipCoin; }
public SoundEffectType visit(GameEventLifeLoss event) { return SoundEffectType.LifeLoss; } public SoundEffectType visit(GameEventLifeLoss event) { return SoundEffectType.LifeLoss; }
public SoundEffectType visit(GameEventPlayerPoisoned event) { return SoundEffectType.Poison; } public SoundEffectType visit(GameEventPlayerPoisoned event) { return SoundEffectType.Poison; }
@@ -63,14 +63,12 @@ public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> {
* ability resolves on the stack. * ability resolves on the stack.
*/ */
public SoundEffectType visit(GameEventSpellResolved evt) { public SoundEffectType visit(GameEventSpellResolved evt) {
Card source = evt.Source; if (evt.spell == null ) {
SpellAbility sa = evt.Spell;
if (sa == null || source == null) {
return null; return null;
} }
if (sa.isSpell()) { Card source = evt.spell.getSourceCard();
if (!evt.spell.isSpell()) {
// if there's a specific effect for this particular card, play it and // if there's a specific effect for this particular card, play it and
// we're done. // we're done.
if (hasSpecificCardEffect(source)) { if (hasSpecificCardEffect(source)) {
@@ -115,18 +113,17 @@ public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> {
* @return the sound effect type * @return the sound effect type
*/ */
public SoundEffectType visit(GameEventLandPlayed event) { public SoundEffectType visit(GameEventLandPlayed event) {
Card land = event.Land; if (event.land == null) {
if (land == null) {
return null; return null;
} }
// if there's a specific effect for this particular card, play it and // if there's a specific effect for this particular card, play it and
// we're done. // we're done.
if (hasSpecificCardEffect(land)) { if (hasSpecificCardEffect(event.land)) {
return SoundEffectType.ScriptedEffect; return SoundEffectType.ScriptedEffect;
} }
for (SpellAbility sa : land.getManaAbility()) { for (SpellAbility sa : event.land.getManaAbility()) {
String manaColors = sa.getManaPartRecursive().getOrigProduced(); String manaColors = sa.getManaPartRecursive().getOrigProduced();
if (manaColors.contains("B")) return SoundEffectType.BlackLand; if (manaColors.contains("B")) return SoundEffectType.BlackLand;
@@ -168,9 +165,9 @@ public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> {
Card c = null; Card c = null;
if (evt instanceof GameEventSpellResolved) { if (evt instanceof GameEventSpellResolved) {
c = ((GameEventSpellResolved) evt).Source; c = ((GameEventSpellResolved) evt).spell.getSourceCard();
} else if (evt instanceof GameEventLandPlayed) { } else if (evt instanceof GameEventLandPlayed) {
c = ((GameEventLandPlayed) evt).Land; c = ((GameEventLandPlayed) evt).land;
} }
return c != null ? c.getSVar("SoundEffect") : ""; return c != null ? c.getSVar("SoundEffect") : "";