Merge pull request #3730 from tool4ever/fixes39

fix script
This commit is contained in:
kevlahnota
2023-09-03 18:10:04 +08:00
committed by GitHub
10 changed files with 36 additions and 30 deletions

View File

@@ -1245,7 +1245,7 @@ public abstract class GameState {
System.err.println("ERROR: Tried to create a non-existent token named " + cardinfo[0] + " when loading game state!"); System.err.println("ERROR: Tried to create a non-existent token named " + cardinfo[0] + " when loading game state!");
continue; continue;
} }
c = Card.fromPaperCard(token, player, player.getGame()); c = CardFactory.getCard(token, player, player.getGame());
} else { } else {
PaperCard pc = StaticData.instance().getCommonCards().getCard(cardinfo[0], setCode, artID); PaperCard pc = StaticData.instance().getCommonCards().getCard(cardinfo[0], setCode, artID);
if (pc == null) { if (pc == null) {

View File

@@ -14,6 +14,8 @@ import com.google.common.collect.Table;
import forge.LobbyPlayer; import forge.LobbyPlayer;
import forge.ai.AIOption; import forge.ai.AIOption;
import forge.ai.LobbyPlayerAi; import forge.ai.LobbyPlayerAi;
import forge.card.CardRarity;
import forge.card.CardRules;
import forge.game.Game; import forge.game.Game;
import forge.game.GameEntity; import forge.game.GameEntity;
import forge.game.GameObject; import forge.game.GameObject;
@@ -38,6 +40,7 @@ import forge.game.staticability.StaticAbility;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.PlayerZoneBattlefield; import forge.game.zone.PlayerZoneBattlefield;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.item.PaperCard;
public class GameCopier { public class GameCopier {
private static final ZoneType[] ZONES = new ZoneType[] { private static final ZoneType[] ZONES = new ZoneType[] {
@@ -118,7 +121,7 @@ public class GameCopier {
((PlayerZoneBattlefield) p.getZone(ZoneType.Battlefield)).setTriggers(false); ((PlayerZoneBattlefield) p.getZone(ZoneType.Battlefield)).setTriggers(false);
} }
copyGameState(newGame); copyGameState(newGame, aiPlayer);
for (Player p : newGame.getPlayers()) { for (Player p : newGame.getPlayers()) {
List<Card> commanders = Lists.newArrayList(); List<Card> commanders = Lists.newArrayList();
@@ -231,7 +234,7 @@ public class GameCopier {
return clone; return clone;
} }
private void copyGameState(Game newGame) { private void copyGameState(Game newGame, Player aiPlayer) {
newGame.setAge(origGame.getAge()); newGame.setAge(origGame.getAge());
// TODO countersAddedThisTurn // TODO countersAddedThisTurn
@@ -254,7 +257,7 @@ public class GameCopier {
for (ZoneType zone : ZONES) { for (ZoneType zone : ZONES) {
for (Card card : origGame.getCardsIn(zone)) { for (Card card : origGame.getCardsIn(zone)) {
addCard(newGame, zone, card); addCard(newGame, zone, card, aiPlayer);
} }
// TODO CardsAddedThisTurn is now messed up // TODO CardsAddedThisTurn is now messed up
} }
@@ -290,15 +293,24 @@ public class GameCopier {
} }
} }
private static PaperCard hidden_info_card = new PaperCard(CardRules.fromScript(Lists.newArrayList("Name:hidden", "Types:Artifact", "Oracle:")), "", CardRarity.Common);
private static final boolean PRUNE_HIDDEN_INFO = false;
private static final boolean USE_FROM_PAPER_CARD = true; private static final boolean USE_FROM_PAPER_CARD = true;
private Card createCardCopy(Game newGame, Player newOwner, Card c) { private Card createCardCopy(Game newGame, Player newOwner, Card c, Player aiPlayer) {
if (c.isToken() && !c.isImmutable()) { if (c.isToken() && !c.isImmutable()) {
Card result = new TokenInfo(c).makeOneToken(newOwner); Card result = new TokenInfo(c).makeOneToken(newOwner);
CardFactory.copyCopiableCharacteristics(c, result, null, null); CardFactory.copyCopiableCharacteristics(c, result, null, null);
return result; return result;
} }
if (USE_FROM_PAPER_CARD && !c.isImmutable() && c.getPaperCard() != null) { if (USE_FROM_PAPER_CARD && !c.isImmutable() && c.getPaperCard() != null) {
Card newCard = Card.fromPaperCard(c.getPaperCard(), newOwner); Card newCard;
if (PRUNE_HIDDEN_INFO && !c.getView().canBeShownTo(aiPlayer.getView())) {
// TODO also check REVEALED_CARDS memory
newCard = new Card(newGame.nextCardId(), hidden_info_card, newGame);
newCard.setOwner(newOwner);
} else {
newCard = Card.fromPaperCard(c.getPaperCard(), newOwner);
}
newCard.setCommander(c.isCommander()); newCard.setCommander(c.isCommander());
return newCard; return newCard;
} }
@@ -327,9 +339,9 @@ public class GameCopier {
return newCard; return newCard;
} }
private void addCard(Game newGame, ZoneType zone, Card c) { private void addCard(Game newGame, ZoneType zone, Card c, Player aiPlayer) {
final Player owner = playerMap.get(c.getOwner()); final Player owner = playerMap.get(c.getOwner());
final Card newCard = createCardCopy(newGame, owner, c); final Card newCard = createCardCopy(newGame, owner, c, aiPlayer);
cardMap.put(c, newCard); cardMap.put(c, newCard);
// TODO ExiledWith // TODO ExiledWith

View File

@@ -50,7 +50,7 @@ public class GameStateEvaluator {
return null; return null;
} }
GameCopier copier = new GameCopier(evalGame); GameCopier copier = new GameCopier(evalGame);
Game gameCopy = copier.makeCopy(); Game gameCopy = copier.makeCopy(null, aiPlayer);
gameCopy.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_DAMAGE, new Runnable() { gameCopy.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_DAMAGE, new Runnable() {
@Override @Override
public void run() { public void run() {

View File

@@ -56,25 +56,20 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
// Get the list of cards that are referenced by effects on the stack // Get the list of cards that are referenced by effects on the stack
SpellAbility siSpellAbility = stackinst.getSpellAbility(); SpellAbility siSpellAbility = stackinst.getSpellAbility();
if (siSpellAbility.getTriggeringObjects() != null) { for (Object c : siSpellAbility.getTriggeringObjects().values()) {
for (Object c : siSpellAbility.getTriggeringObjects().values()) { if (c instanceof Card) {
if (c instanceof Card) { if (!stackSources.contains(c)) {
if (!stackSources.contains(c)) { referencedSources.add((Card) c);
referencedSources.add((Card) c);
}
} }
} }
} }
if (siSpellAbility.getTargetCard() != null) { if (siSpellAbility.getTargetCard() != null) {
referencedSources.add(siSpellAbility.getTargetCard()); referencedSources.add(siSpellAbility.getTargetCard());
} }
// TODO: is this necessary? for (Object c : siSpellAbility.getReplacingObjects().values()) {
if (siSpellAbility.getReplacingObjects() != null) { if (c instanceof Card) {
for (Object c : siSpellAbility.getReplacingObjects().values()) { if (!stackSources.contains(c)) {
if (c instanceof Card) { referencedSources.add((Card) c);
if (!stackSources.contains(c)) {
referencedSources.add((Card) c);
}
} }
} }
} }

View File

@@ -6966,9 +6966,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
public static Card fromPaperCard(IPaperCard pc, Player owner) { public static Card fromPaperCard(IPaperCard pc, Player owner) {
return CardFactory.getCard(pc, owner, owner == null ? null : owner.getGame()); return CardFactory.getCard(pc, owner, owner == null ? null : owner.getGame());
} }
public static Card fromPaperCard(IPaperCard pc, Player owner, Game game) {
return CardFactory.getCard(pc, owner, game);
}
private static final Map<PaperCard, Card> cp2card = Maps.newHashMap(); private static final Map<PaperCard, Card> cp2card = Maps.newHashMap();
public static Card getCardForUi(IPaperCard pc) { public static Card getCardForUi(IPaperCard pc) {

View File

@@ -652,8 +652,6 @@ public class CardFactory {
if (p != null) { if (p != null) {
to.setActivatingPlayer(p, lki); to.setActivatingPlayer(p, lki);
} }
//to.changeText();
} }
/** /**

View File

@@ -17,6 +17,7 @@ import forge.card.MagicColor;
import forge.game.Game; import forge.game.Game;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardFactory;
import forge.game.card.CardFactoryUtil; import forge.game.card.CardFactoryUtil;
import forge.game.card.CardUtil; import forge.game.card.CardUtil;
import forge.game.keyword.KeywordInterface; import forge.game.keyword.KeywordInterface;
@@ -279,7 +280,7 @@ public class TokenInfo {
if (token == null) { if (token == null) {
return null; return null;
} }
final Card result = Card.fromPaperCard(token, owner, game); final Card result = CardFactory.getCard(token, owner, game);
if (sa.hasParam("TokenPower")) { if (sa.hasParam("TokenPower")) {
String str = sa.getParam("TokenPower"); String str = sa.getParam("TokenPower");

View File

@@ -308,6 +308,8 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
// if not already copied use a fresh instance // if not already copied use a fresh instance
SpellAbility original = sp; SpellAbility original = sp;
sp = sp.copy(); sp = sp.copy();
// need to reapply text changes
sp.changeText();
sp.setOriginalAbility(original); sp.setOriginalAbility(original);
original.setXManaCostPaid(null); original.setXManaCostPaid(null);
} }

View File

@@ -21,6 +21,7 @@ import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardCollectionView; import forge.game.card.CardCollectionView;
import forge.game.card.CardFactory;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -158,7 +159,7 @@ public class SimulationTest {
System.out.println("Failed to find token name " + name); System.out.println("Failed to find token name " + name);
return null; return null;
} }
return Card.fromPaperCard(token, p, p.getGame()); return CardFactory.getCard(token, p, p.getGame());
} }
protected List<Card> addTokens(String name, int amount, Player p) { protected List<Card> addTokens(String name, int amount, Player p) {

View File

@@ -3,7 +3,7 @@ ManaCost:2 W
Types:Creature Human Soldier Types:Creature Human Soldier
PT:3/1 PT:3/1
T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigNodamage | TriggerDescription$ Whenever CARDNAME becomes blocked, prevent all combat damage that would be dealt by it this turn. T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigNodamage | TriggerDescription$ Whenever CARDNAME becomes blocked, prevent all combat damage that would be dealt by it this turn.
SVar:TrigNodamage:DB$ Effect | ReplacementEffects$ RPrevent | RememberObjects$ TriggeredCard | ExileOnMoved$ Battlefield SVar:TrigNodamage:DB$ Effect | ReplacementEffects$ RPrevent | RememberObjects$ TriggeredAttackerLKICopy | ExileOnMoved$ Battlefield
SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ValidSource$ Card.IsRemembered | Description$ Prevent all combat damage that would be dealt by it this turn. SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ValidSource$ Card.IsRemembered | Description$ Prevent all combat damage that would be dealt by it this turn.
SVar:MustBeBlocked:True SVar:MustBeBlocked:True
Oracle:Whenever Ignoble Soldier becomes blocked, prevent all combat damage that would be dealt by it this turn. Oracle:Whenever Ignoble Soldier becomes blocked, prevent all combat damage that would be dealt by it this turn.