mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
AI vs AI playback now catches spell-cast event
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -14245,6 +14245,7 @@ src/main/java/forge/game/event/GameEventPlayerDamaged.java -text
|
|||||||
src/main/java/forge/game/event/GameEventPlayerPoisoned.java -text
|
src/main/java/forge/game/event/GameEventPlayerPoisoned.java -text
|
||||||
src/main/java/forge/game/event/GameEventPlayerPriority.java -text
|
src/main/java/forge/game/event/GameEventPlayerPriority.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/GameEventSpellAbilityCast.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/GameEventTurnBegan.java -text
|
||||||
|
|||||||
@@ -6,12 +6,15 @@ import java.util.Map.Entry;
|
|||||||
|
|
||||||
import com.google.common.eventbus.Subscribe;
|
import com.google.common.eventbus.Subscribe;
|
||||||
|
|
||||||
|
import forge.card.spellability.SpellAbility;
|
||||||
|
import forge.card.spellability.TargetChoices;
|
||||||
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.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.GameEventSpellAbilityCast;
|
||||||
import forge.game.event.GameEventSpellResolved;
|
import forge.game.event.GameEventSpellResolved;
|
||||||
import forge.game.event.GameEventTurnBegan;
|
import forge.game.event.GameEventTurnBegan;
|
||||||
import forge.game.event.IGameEventVisitor;
|
import forge.game.event.IGameEventVisitor;
|
||||||
@@ -59,6 +62,41 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
|
|||||||
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, messageForLog);
|
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, messageForLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GameLogEntry visit(GameEventSpellAbilityCast event) {
|
||||||
|
SpellAbility sp = event.sa;
|
||||||
|
final List<TargetChoices> chosenTargets = sp.getAllTargetChoices();
|
||||||
|
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(sp.getActivatingPlayer());
|
||||||
|
if (sp.isSpell()) {
|
||||||
|
sb.append(" cast ");
|
||||||
|
}
|
||||||
|
else if (sp.isAbility()) {
|
||||||
|
sb.append(" activated ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sp.getStackDescription().startsWith("Morph ")) {
|
||||||
|
sb.append("Morph");
|
||||||
|
} else {
|
||||||
|
sb.append(sp.getSourceCard());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sp.getTarget() != null) {
|
||||||
|
sb.append(" targeting ");
|
||||||
|
for (TargetChoices ch : chosenTargets) {
|
||||||
|
if (null != ch) {
|
||||||
|
sb.append(ch.getTargetedString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.append(".");
|
||||||
|
|
||||||
|
return new GameLogEntry(GameLogEntryType.STACK_ADD, sb.toString());
|
||||||
|
}
|
||||||
|
|
||||||
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()];
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import forge.game.event.GameEventGameFinished;
|
|||||||
import forge.game.event.GameEventGameStarted;
|
import forge.game.event.GameEventGameStarted;
|
||||||
import forge.game.event.GameEventLandPlayed;
|
import forge.game.event.GameEventLandPlayed;
|
||||||
import forge.game.event.GameEventPlayerPriority;
|
import forge.game.event.GameEventPlayerPriority;
|
||||||
|
import forge.game.event.GameEventSpellAbilityCast;
|
||||||
import forge.game.event.GameEventSpellResolved;
|
import forge.game.event.GameEventSpellResolved;
|
||||||
import forge.game.event.GameEventTurnPhase;
|
import forge.game.event.GameEventTurnPhase;
|
||||||
import forge.game.event.IGameEventVisitor;
|
import forge.game.event.IGameEventVisitor;
|
||||||
@@ -36,7 +37,8 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
|
|||||||
|
|
||||||
private int phasesDelay = 200;
|
private int phasesDelay = 200;
|
||||||
private int combatDelay = 400;
|
private int combatDelay = 400;
|
||||||
private int resolveDelay = 600;
|
private int castDelay = 400;
|
||||||
|
private int resolveDelay = 400;
|
||||||
|
|
||||||
private void pauseForEvent(int delay) {
|
private void pauseForEvent(int delay) {
|
||||||
try {
|
try {
|
||||||
@@ -103,17 +105,21 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void visit(final GameEventSpellResolved event) {
|
public Void visit(final GameEventSpellResolved event) {
|
||||||
FThreads.invokeInEdtNowOrLater(new Runnable() {
|
FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { CMatchUI.SINGLETON_INSTANCE.setCard(event.spell.getSourceCard()); } });
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.setCard(event.spell.getSourceCard());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
pauseForEvent(resolveDelay);
|
pauseForEvent(resolveDelay);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.game.event.IGameEventVisitor.Base#visit(forge.game.event.GameEventSpellAbilityCast)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Void visit(final GameEventSpellAbilityCast event) {
|
||||||
|
FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { CMatchUI.SINGLETON_INSTANCE.setCard(event.sa.getSourceCard()); } });
|
||||||
|
pauseForEvent(castDelay);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.game.event.IGameEventVisitor.Base#visit(forge.game.event.GameEventPlayerPriority)
|
* @see forge.game.event.IGameEventVisitor.Base#visit(forge.game.event.GameEventPlayerPriority)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package forge.game.event;
|
||||||
|
|
||||||
|
import forge.card.spellability.SpellAbility;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class GameEventSpellAbilityCast extends GameEvent {
|
||||||
|
|
||||||
|
public final SpellAbility sa;
|
||||||
|
|
||||||
|
public GameEventSpellAbilityCast(SpellAbility sp) {
|
||||||
|
sa = sp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.game.event.GameEvent#visit(forge.game.event.IGameEventVisitor)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public <T> T visit(IGameEventVisitor<T> visitor) {
|
||||||
|
return visitor.visit(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -31,6 +31,7 @@ public interface IGameEventVisitor<T> {
|
|||||||
T visit(GameEventPlayerPoisoned event);
|
T visit(GameEventPlayerPoisoned event);
|
||||||
T visit(GameEventPlayerPriority event);
|
T visit(GameEventPlayerPriority event);
|
||||||
T visit(GameEventShuffle event);
|
T visit(GameEventShuffle event);
|
||||||
|
T visit(GameEventSpellAbilityCast gameEventSpellAbilityCast);
|
||||||
T visit(GameEventSpellResolved event);
|
T visit(GameEventSpellResolved event);
|
||||||
T visit(GameEventTokenCreated event);
|
T visit(GameEventTokenCreated event);
|
||||||
T visit(GameEventTurnBegan gameEventTurnBegan);
|
T visit(GameEventTurnBegan gameEventTurnBegan);
|
||||||
@@ -66,15 +67,12 @@ public interface IGameEventVisitor<T> {
|
|||||||
public T visit(GameEventPlayerPriority event) { return null; }
|
public T visit(GameEventPlayerPriority event) { return null; }
|
||||||
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(GameEventSpellAbilityCast 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(GameEventTurnBegan event) { return null; }
|
||||||
public T visit(GameEventTurnEnded 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; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ import forge.game.Game;
|
|||||||
import forge.game.ai.ComputerUtil;
|
import forge.game.ai.ComputerUtil;
|
||||||
import forge.game.ai.ComputerUtilCard;
|
import forge.game.ai.ComputerUtilCard;
|
||||||
import forge.game.ai.ComputerUtilCost;
|
import forge.game.ai.ComputerUtilCost;
|
||||||
|
import forge.game.event.GameEventSpellAbilityCast;
|
||||||
import forge.game.event.GameEventSpellResolved;
|
import forge.game.event.GameEventSpellResolved;
|
||||||
import forge.game.player.HumanPlay;
|
import forge.game.player.HumanPlay;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
@@ -306,7 +307,6 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
*/
|
*/
|
||||||
public final void add(final SpellAbility sp) {
|
public final void add(final SpellAbility sp) {
|
||||||
FThreads.assertExecutedByEdt(false);
|
FThreads.assertExecutedByEdt(false);
|
||||||
final ArrayList<TargetChoices> chosenTargets = sp.getAllTargetChoices();
|
|
||||||
|
|
||||||
if (sp.isManaAbility()) { // Mana Abilities go straight through
|
if (sp.isManaAbility()) { // Mana Abilities go straight through
|
||||||
AbilityUtils.resolve(sp, false);
|
AbilityUtils.resolve(sp, false);
|
||||||
@@ -330,34 +330,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//============= GameLog ======================
|
game.fireEvent(new GameEventSpellAbilityCast(sp));
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append(sp.getActivatingPlayer());
|
|
||||||
if (sp.isSpell()) {
|
|
||||||
sb.append(" cast ");
|
|
||||||
}
|
|
||||||
else if (sp.isAbility()) {
|
|
||||||
sb.append(" activated ");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sp.getStackDescription().startsWith("Morph ")) {
|
|
||||||
sb.append("Morph");
|
|
||||||
} else {
|
|
||||||
sb.append(sp.getSourceCard());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sp.getTarget() != null) {
|
|
||||||
sb.append(" targeting ");
|
|
||||||
for (TargetChoices ch : chosenTargets) {
|
|
||||||
if (null != ch) {
|
|
||||||
sb.append(ch.getTargetedString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sb.append(".");
|
|
||||||
|
|
||||||
game.getGameLog().add(GameLogEntryType.STACK_ADD, sb.toString());
|
|
||||||
//============= GameLog ======================
|
|
||||||
|
|
||||||
// if activating player slips through the cracks, assign activating
|
// if activating player slips through the cracks, assign activating
|
||||||
// Player to the controller here
|
// Player to the controller here
|
||||||
@@ -488,6 +461,7 @@ public class MagicStack extends MyObservable implements Iterable<SpellAbilitySta
|
|||||||
|
|
||||||
// Run BecomesTarget triggers
|
// Run BecomesTarget triggers
|
||||||
// Create a new object, since the triggers aren't happening right away
|
// Create a new object, since the triggers aren't happening right away
|
||||||
|
final List<TargetChoices> chosenTargets = sp.getAllTargetChoices();
|
||||||
runParams = new HashMap<String, Object>();
|
runParams = new HashMap<String, Object>();
|
||||||
runParams.put("SourceSA", sp);
|
runParams.put("SourceSA", sp);
|
||||||
if (!chosenTargets.isEmpty()) {
|
if (!chosenTargets.isEmpty()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user