Merge branch 'master' of git.cardforge.org:core-developers/forge into start_replacement_run_keys_refactor

This commit is contained in:
Ryan1729
2019-09-27 17:17:26 -06:00
42 changed files with 592 additions and 215 deletions

View File

@@ -3653,6 +3653,8 @@ public class Card extends GameEntity implements Comparable<Card> {
if (updateView) {
updateKeywords();
if (isToken())
game.fireEvent(new GameEventTokenStateUpdate(this));
}
}
@@ -3707,6 +3709,8 @@ public class Card extends GameEntity implements Comparable<Card> {
KeywordsChange change = changedCardKeywords.remove(timestamp);
if (change != null && updateView) {
updateKeywords();
if (isToken())
game.fireEvent(new GameEventTokenStateUpdate(this));
}
return change;
}
@@ -5409,6 +5413,59 @@ public class Card extends GameEntity implements Comparable<Card> {
}
return protectKey;
}
public String getHexproofKey() {
String hexproofKey = "";
boolean hR = false; boolean hG = false; boolean hB = false; boolean hU = false; boolean hW = false;
for (final KeywordInterface inst : getKeywords()) {
String kw = inst.getOriginal();
if (!kw.startsWith("Hexproof")) {
continue;
}
if (kw.equals("Hexproof")) {
hexproofKey += "generic:";
}
if (kw.startsWith("Hexproof:")) {
String[] k = kw.split(":");
if (k[2].toString().equals("red")) {
if (!hR) {
hR = true;
hexproofKey += "R:";
}
} else if (k[2].toString().equals("green")) {
if (!hG) {
hG = true;
hexproofKey += "G:";
}
} else if (k[2].toString().equals("black")) {
if (!hB) {
hB = true;
hexproofKey += "B:";
}
} else if (k[2].toString().equals("blue")) {
if (!hU) {
hU = true;
hexproofKey += "U:";
}
} else if (k[2].toString().equals("white")) {
if (!hW) {
hW = true;
hexproofKey += "W:";
}
} else if (k[2].toString().equals("monocolored")) {
hexproofKey += "monocolored:";
}
}
}
return hexproofKey;
}
public String getKeywordKey() {
List<String> ability = new ArrayList<>();
for (final KeywordInterface inst : getKeywords()) {
ability.add(inst.getOriginal());
}
Collections.sort(ability);
return String.join(",", ability);
}
public Zone getZone() {
return currentZone;
}

View File

@@ -1017,7 +1017,9 @@ public class CardView extends GameEntityView {
foilIndexOverride = index0;
}
public String getKeywordKey() { return get(TrackableProperty.KeywordKey); }
public String getProtectionKey() { return get(TrackableProperty.ProtectionKey); }
public String getHexproofKey() { return get(TrackableProperty.HexproofKey); }
public boolean hasDeathtouch() { return get(TrackableProperty.HasDeathtouch); }
public boolean hasDefender() { return get(TrackableProperty.HasDefender); }
public boolean hasDoubleStrike() { return get(TrackableProperty.HasDoubleStrike); }
@@ -1031,12 +1033,8 @@ public class CardView extends GameEntityView {
public boolean hasMenace() { return get(TrackableProperty.HasMenace); }
public boolean hasReach() { return get(TrackableProperty.HasReach); }
public boolean hasShroud() { return get(TrackableProperty.HasShroud); }
public boolean hasTrample() {
return get(TrackableProperty.HasTrample);
}
public boolean hasVigilance() {
return get(TrackableProperty.HasVigilance);
}
public boolean hasTrample() { return get(TrackableProperty.HasTrample); }
public boolean hasVigilance() { return get(TrackableProperty.HasVigilance); }
public boolean hasHaste() {
return get(TrackableProperty.HasHaste);
@@ -1077,6 +1075,10 @@ public class CardView extends GameEntityView {
updateAbilityText(c, state);
//set protectionKey for Icons
set(TrackableProperty.ProtectionKey, c.getProtectionKey());
//set hexproofKeys for Icons
set(TrackableProperty.HexproofKey, c.getHexproofKey());
//keywordkey
set(TrackableProperty.KeywordKey, c.getKeywordKey());
}
public boolean isBasicLand() {

View File

@@ -0,0 +1,24 @@
package forge.game.event;
import forge.game.card.Card;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class GameEventTokenStateUpdate extends GameEvent {
public final Collection<Card> cards;
public GameEventTokenStateUpdate(Card affected) {
cards = Arrays.asList(affected);
}
public GameEventTokenStateUpdate(List<Card> affected) {
cards = affected;
}
@Override
public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@@ -37,6 +37,7 @@ public interface IGameEventVisitor<T> {
T visit(GameEventPlayerPoisoned event);
T visit(GameEventPlayerPriority event);
T visit(GameEventPlayerStatsChanged event);
T visit(GameEventTokenStateUpdate event);
T visit(GameEventScry event);
T visit(GameEventShuffle event);
T visit(GameEventSpellAbilityCast gameEventSpellAbilityCast);
@@ -83,6 +84,7 @@ public interface IGameEventVisitor<T> {
public T visit(GameEventPlayerPoisoned event) { return null; }
public T visit(GameEventPlayerPriority event) { return null; }
public T visit(GameEventPlayerStatsChanged event) { return null; }
public T visit(GameEventTokenStateUpdate event) { return null; }
public T visit(GameEventScry event) { return null; }
public T visit(GameEventShuffle event) { return null; }
public T visit(GameEventSpellResolved event) { return null; }

View File

@@ -189,6 +189,8 @@ public class PhaseHandler implements java.io.Serializable {
final List<Card> lands = CardLists.filter(playerTurn.getLandsInPlay(), Presets.UNTAPPED);
playerTurn.setNumPowerSurgeLands(lands.size());
}
//update tokens
game.fireEvent(new GameEventTokenStateUpdate(playerTurn.getTokensInPlay()));
game.fireEvent(new GameEventTurnPhase(playerTurn, phase, phaseType));
}

View File

@@ -2348,6 +2348,13 @@ public class Player extends GameEntity implements Comparable<Player> {
return CardLists.filter(getCardsIn(ZoneType.Battlefield), Presets.CREATURES);
}
/**
* use to get a list of tokens in play for a given player.
*/
public CardCollection getTokensInPlay() {
return CardLists.filter(getCardsIn(ZoneType.Battlefield), Presets.TOKEN);
}
/**
* use to get a list of all lands a given player has on the battlefield.
*/

View File

@@ -82,6 +82,7 @@ public enum TrackableProperty {
ChangedColorWords(TrackableTypes.StringMapType),
ChangedTypes(TrackableTypes.StringMapType),
KeywordKey(TrackableTypes.StringType),
HasDeathtouch(TrackableTypes.BooleanType),
HasDefender(TrackableTypes.BooleanType),
HasDoubleStrike(TrackableTypes.BooleanType),
@@ -99,7 +100,8 @@ public enum TrackableProperty {
HasVigilance(TrackableTypes.BooleanType),
//protectionkey
ProtectionKey(TrackableTypes.StringType),
//hexproofkey
HexproofKey(TrackableTypes.StringType),
HasHaste(TrackableTypes.BooleanType),
HasInfect(TrackableTypes.BooleanType),
HasStorm(TrackableTypes.BooleanType),

View File

@@ -30,6 +30,7 @@ public final class CardOverlaysMenu {
menu.add(getMenuItem_CardOverlay("Mana Cost", FPref.UI_OVERLAY_CARD_MANA_COST));
menu.add(getMenuItem_CardOverlay("Power/Toughness", FPref.UI_OVERLAY_CARD_POWER));
menu.add(getMenuItem_CardOverlay("Card Id", FPref.UI_OVERLAY_CARD_ID));
menu.add(getMenuItem_CardOverlay("Ability Icon", FPref.UI_OVERLAY_ABILITY_ICONS));
return menu;
}

View File

@@ -135,7 +135,17 @@ public class CardFaceSymbols {
MANA_IMAGES.put("shroud", FSkin.getImage(FSkinProp.IMG_ABILITY_SHROUD));
MANA_IMAGES.put("trample", FSkin.getImage(FSkinProp.IMG_ABILITY_TRAMPLE));
MANA_IMAGES.put("vigilance", FSkin.getImage(FSkinProp.IMG_ABILITY_VIGILANCE));
//hexproof from
MANA_IMAGES.put("hexproofR", FSkin.getImage(FSkinProp.IMG_ABILITY_HEXPROOF_R));
MANA_IMAGES.put("hexproofG", FSkin.getImage(FSkinProp.IMG_ABILITY_HEXPROOF_G));
MANA_IMAGES.put("hexproofB", FSkin.getImage(FSkinProp.IMG_ABILITY_HEXPROOF_B));
MANA_IMAGES.put("hexproofU", FSkin.getImage(FSkinProp.IMG_ABILITY_HEXPROOF_U));
MANA_IMAGES.put("hexproofW", FSkin.getImage(FSkinProp.IMG_ABILITY_HEXPROOF_W));
MANA_IMAGES.put("hexproofC", FSkin.getImage(FSkinProp.IMG_ABILITY_HEXPROOF_C));
MANA_IMAGES.put("hexproofUB", FSkin.getImage(FSkinProp.IMG_ABILITY_HEXPROOF_UB));
//token icon
MANA_IMAGES.put("token", FSkin.getImage(FSkinProp.IMG_ABILITY_TOKEN));
//protection from
MANA_IMAGES.put("protectAll", FSkin.getImage(FSkinProp.IMG_ABILITY_PROTECT_ALL));
MANA_IMAGES.put("protectB", FSkin.getImage(FSkinProp.IMG_ABILITY_PROTECT_B));
MANA_IMAGES.put("protectBU", FSkin.getImage(FSkinProp.IMG_ABILITY_PROTECT_BU));

View File

@@ -50,6 +50,7 @@ import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -511,7 +512,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
int abiX = cardXOffset + (cardWidth / 2) + (cardWidth / 3);
int abiSpace = (cardWidth / 7);
int abiY = cardWidth < 200 ? cardYOffset + 25 : cardYOffset + 50;
if (ZoneType.Battlefield.equals(card.getZone())){
if (ZoneType.Battlefield.equals(card.getZone()) && showAbilityIcons()){
if (card.getCurrentState().hasFlying()) {
CardFaceSymbols.drawAbilitySymbol("flying", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
@@ -545,10 +546,43 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
abiY += abiSpace;
}
if (card.getCurrentState().hasHexproof()) {
CardFaceSymbols.drawAbilitySymbol("hexproof", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
if (!card.getCurrentState().getHexproofKey().isEmpty()){
String[] splitK = card.getCurrentState().getHexproofKey().split(":");
List<String> listHK = Arrays.asList(splitK);
if (listHK.contains("generic")) {
CardFaceSymbols.drawAbilitySymbol("hexproof", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
if (listHK.contains("R")) {
CardFaceSymbols.drawAbilitySymbol("hexproofR", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
if (listHK.contains("B")) {
CardFaceSymbols.drawAbilitySymbol("hexproofB", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
if (listHK.contains("U")) {
CardFaceSymbols.drawAbilitySymbol("hexproofU", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
if (listHK.contains("G")) {
CardFaceSymbols.drawAbilitySymbol("hexproofG", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
if (listHK.contains("W")) {
CardFaceSymbols.drawAbilitySymbol("hexproofW", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
if (listHK.contains("monocolored")) {
CardFaceSymbols.drawAbilitySymbol("hexproofC", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
} else {
CardFaceSymbols.drawAbilitySymbol("hexproof", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
}
if (card.getCurrentState().hasShroud()) {
else if (card.getCurrentState().hasShroud()) {
CardFaceSymbols.drawAbilitySymbol("shroud", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
@@ -963,6 +997,10 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
return isShowingOverlays() && isPreferenceEnabled(FPref.UI_OVERLAY_CARD_ID);
}
private boolean showAbilityIcons() {
return isShowingOverlays() && isPreferenceEnabled(FPref.UI_OVERLAY_ABILITY_ICONS);
}
public void repaintOverlays() {
repaint();
doLayout();

View File

@@ -25,7 +25,11 @@ import forge.screens.home.NewGameMenu;
import forge.screens.match.MatchController;
import forge.sound.MusicPlaylist;
import forge.sound.SoundSystem;
import forge.toolbox.*;
import forge.toolbox.FContainer;
import forge.toolbox.FDisplayObject;
import forge.toolbox.FGestureAdapter;
import forge.toolbox.FOptionPane;
import forge.toolbox.FOverlay;
import forge.util.Callback;
import forge.util.FileUtil;
import forge.util.Localizer;

View File

@@ -37,7 +37,13 @@ import forge.sound.IAudioClip;
import forge.sound.IAudioMusic;
import forge.toolbox.FOptionPane;
import forge.toolbox.GuiChoose;
import forge.util.*;
import forge.util.Callback;
import forge.util.FileUtil;
import forge.util.ImageFetcher;
import forge.util.LibGDXImageFetcher;
import forge.util.ThreadUtil;
import forge.util.WaitCallback;
import forge.util.WaitRunnable;
public class GuiMobile implements IGuiBase {
private final String assetsDir;

View File

@@ -265,9 +265,19 @@ public enum FSkinImage implements FImage {
IMG_ABILITY_LIFELINK (FSkinProp.IMG_ABILITY_LIFELINK, SourceFile.ABILITIES),
IMG_ABILITY_MENACE (FSkinProp.IMG_ABILITY_MENACE, SourceFile.ABILITIES),
IMG_ABILITY_REACH (FSkinProp.IMG_ABILITY_REACH, SourceFile.ABILITIES),
IMG_ABILITY_SHROUD (FSkinProp.IMG_ABILITY_SHROUD, SourceFile.ABILITIES),
IMG_ABILITY_SHROUD (FSkinProp.IMG_ABILITY_SHROUD, SourceFile.ABILITIES),
IMG_ABILITY_TRAMPLE (FSkinProp.IMG_ABILITY_TRAMPLE, SourceFile.ABILITIES),
IMG_ABILITY_VIGILANCE (FSkinProp.IMG_ABILITY_VIGILANCE, SourceFile.ABILITIES),
//HEXPROOF FROM
IMG_ABILITY_HEXPROOF_R (FSkinProp.IMG_ABILITY_HEXPROOF_R, SourceFile.ABILITIES),
IMG_ABILITY_HEXPROOF_G (FSkinProp.IMG_ABILITY_HEXPROOF_G, SourceFile.ABILITIES),
IMG_ABILITY_HEXPROOF_B (FSkinProp.IMG_ABILITY_HEXPROOF_B, SourceFile.ABILITIES),
IMG_ABILITY_HEXPROOF_U (FSkinProp.IMG_ABILITY_HEXPROOF_U, SourceFile.ABILITIES),
IMG_ABILITY_HEXPROOF_W (FSkinProp.IMG_ABILITY_HEXPROOF_W, SourceFile.ABILITIES),
IMG_ABILITY_HEXPROOF_C (FSkinProp.IMG_ABILITY_HEXPROOF_C, SourceFile.ABILITIES),
IMG_ABILITY_HEXPROOF_UB (FSkinProp.IMG_ABILITY_HEXPROOF_UB, SourceFile.ABILITIES),
//token icon
IMG_ABILITY_TOKEN (FSkinProp.IMG_ABILITY_TOKEN, SourceFile.ABILITIES),
//PROTECT ICONS
IMG_ABILITY_PROTECT_ALL (FSkinProp.IMG_ABILITY_PROTECT_ALL, SourceFile.ABILITIES),
IMG_ABILITY_PROTECT_B (FSkinProp.IMG_ABILITY_PROTECT_B, SourceFile.ABILITIES),

View File

@@ -118,7 +118,17 @@ public class CardFaceSymbols {
MANA_IMAGES.put("shroud", FSkinImage.IMG_ABILITY_SHROUD);
MANA_IMAGES.put("trample", FSkinImage.IMG_ABILITY_TRAMPLE);
MANA_IMAGES.put("vigilance", FSkinImage.IMG_ABILITY_VIGILANCE);
//hexproof from
MANA_IMAGES.put("hexproofR", FSkinImage.IMG_ABILITY_HEXPROOF_R);
MANA_IMAGES.put("hexproofG", FSkinImage.IMG_ABILITY_HEXPROOF_G);
MANA_IMAGES.put("hexproofB", FSkinImage.IMG_ABILITY_HEXPROOF_B);
MANA_IMAGES.put("hexproofU", FSkinImage.IMG_ABILITY_HEXPROOF_U);
MANA_IMAGES.put("hexproofW", FSkinImage.IMG_ABILITY_HEXPROOF_W);
MANA_IMAGES.put("hexproofC", FSkinImage.IMG_ABILITY_HEXPROOF_C);
MANA_IMAGES.put("hexproofUB", FSkinImage.IMG_ABILITY_HEXPROOF_UB);
//token icon
MANA_IMAGES.put("token", FSkinImage.IMG_ABILITY_TOKEN);
//protection from
MANA_IMAGES.put("protectAll", FSkinImage.IMG_ABILITY_PROTECT_ALL);
MANA_IMAGES.put("protectB", FSkinImage.IMG_ABILITY_PROTECT_B);
MANA_IMAGES.put("protectBU", FSkinImage.IMG_ABILITY_PROTECT_BU);

View File

@@ -5,13 +5,19 @@ import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.utils.Align;
import com.google.common.collect.ImmutableList;
import forge.Graphics;
import forge.assets.*;
import forge.assets.FBufferedImage;
import forge.assets.FSkinColor;
import forge.assets.FSkinFont;
import forge.assets.FSkinImage;
import forge.assets.FSkinTexture;
import forge.assets.ImageCache;
import forge.assets.TextRenderer;
import forge.card.CardDetailUtil.DetailColors;
import forge.card.CardRenderer.CardStackPosition;
import forge.card.mana.ManaCost;
import forge.game.GameView;
import forge.game.card.CardView;
import forge.game.card.CardView.CardStateView;
import forge.game.card.CardView;
import forge.game.zone.ZoneType;
import forge.model.FModel;
import forge.properties.ForgeConstants;

View File

@@ -19,7 +19,13 @@ import forge.CachedCardImage;
import forge.FThreads;
import forge.Graphics;
import forge.StaticData;
import forge.assets.*;
import forge.assets.FImageComplex;
import forge.assets.FRotatedImage;
import forge.assets.FSkinColor;
import forge.assets.FSkinFont;
import forge.assets.FSkinImage;
import forge.assets.FTextureRegionImage;
import forge.assets.ImageCache;
import forge.card.CardDetailUtil.DetailColors;
import forge.card.CardZoom.ActivateHandler;
import forge.card.mana.ManaCost;
@@ -42,6 +48,7 @@ import forge.toolbox.FList;
import forge.util.Utils;
import org.apache.commons.lang3.StringUtils;
import forge.util.TextBounds;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -551,7 +558,11 @@ public class CardRenderer {
float abiSpace = cw / 5.7f;
float abiCount = 0;
if (onbattlefield && onTop) {
if (onbattlefield && onTop && showAbilityIcons(card)) {
if (card.isToken()){
CardFaceSymbols.drawSymbol("token", g, abiX, abiY, abiScale, abiScale);
abiY += abiSpace;
}
if (card.getCurrentState().hasFlying()) {
CardFaceSymbols.drawSymbol("flying", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
@@ -609,11 +620,65 @@ public class CardRenderer {
abiCount += 1;
}
if (card.getCurrentState().hasHexproof()) {
CardFaceSymbols.drawSymbol("hexproof", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
g.setAlphaComposite(0.6f); g.fillRect(Color.BLACK, abiX, abiY, abiScale, abiScale ); g.setAlphaComposite(oldAlpha);}
abiY += abiSpace;
abiCount += 1;
if (!card.getCurrentState().getHexproofKey().isEmpty()){
String[] splitK = card.getCurrentState().getHexproofKey().split(":");
List<String> listHK = Arrays.asList(splitK);
if (listHK.contains("generic")) {
CardFaceSymbols.drawSymbol("hexproof", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
g.setAlphaComposite(0.6f); g.fillRect(Color.BLACK, abiX, abiY, abiScale, abiScale ); g.setAlphaComposite(oldAlpha);}
abiY += abiSpace;
abiCount += 1;
}
if (listHK.contains("R")) {
CardFaceSymbols.drawSymbol("hexproofR", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
g.setAlphaComposite(0.6f); g.fillRect(Color.BLACK, abiX, abiY, abiScale, abiScale ); g.setAlphaComposite(oldAlpha);}
abiY += abiSpace;
abiCount += 1;
}
if (listHK.contains("B")) {
CardFaceSymbols.drawSymbol("hexproofB", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
g.setAlphaComposite(0.6f); g.fillRect(Color.BLACK, abiX, abiY, abiScale, abiScale ); g.setAlphaComposite(oldAlpha);}
abiY += abiSpace;
abiCount += 1;
}
if (listHK.contains("U")) {
CardFaceSymbols.drawSymbol("hexproofU", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
g.setAlphaComposite(0.6f); g.fillRect(Color.BLACK, abiX, abiY, abiScale, abiScale ); g.setAlphaComposite(oldAlpha);}
abiY += abiSpace;
abiCount += 1;
}
if (listHK.contains("G")) {
CardFaceSymbols.drawSymbol("hexproofG", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
g.setAlphaComposite(0.6f); g.fillRect(Color.BLACK, abiX, abiY, abiScale, abiScale ); g.setAlphaComposite(oldAlpha);}
abiY += abiSpace;
abiCount += 1;
}
if (listHK.contains("W")) {
CardFaceSymbols.drawSymbol("hexproofW", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
g.setAlphaComposite(0.6f); g.fillRect(Color.BLACK, abiX, abiY, abiScale, abiScale ); g.setAlphaComposite(oldAlpha);}
abiY += abiSpace;
abiCount += 1;
}
if (listHK.contains("monocolored")) {
CardFaceSymbols.drawSymbol("hexproofC", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
g.setAlphaComposite(0.6f); g.fillRect(Color.BLACK, abiX, abiY, abiScale, abiScale ); g.setAlphaComposite(oldAlpha);}
abiY += abiSpace;
abiCount += 1;
}
} else {
CardFaceSymbols.drawSymbol("hexproof", g, abiX, abiY, abiScale, abiScale);
if (unselectable){
g.setAlphaComposite(0.6f); g.fillRect(Color.BLACK, abiX, abiY, abiScale, abiScale ); g.setAlphaComposite(oldAlpha);}
abiY += abiSpace;
abiCount += 1;
}
}
else if (card.getCurrentState().hasShroud()) {
CardFaceSymbols.drawSymbol("shroud", g, abiX, abiY, abiScale, abiScale);
@@ -1003,6 +1068,10 @@ public class CardRenderer {
isPreferenceEnabled(FPref.UI_OVERLAY_CARD_MANA_COST);
}
private static boolean showAbilityIcons(CardView card) {
return isShowingOverlays(card) && isPreferenceEnabled(FPref.UI_OVERLAY_ABILITY_ICONS);
}
private static boolean showCardIdOverlay(CardView card) {
return card.getId() > 0 && isShowingOverlays(card) && isPreferenceEnabled(FPref.UI_OVERLAY_CARD_ID);
}

View File

@@ -10,8 +10,15 @@ import com.google.common.collect.ImmutableList;
import forge.Forge;
import forge.Forge.KeyInputAdapter;
import forge.Graphics;
import forge.assets.*;
import forge.card.*;
import forge.assets.FImage;
import forge.assets.FSkin;
import forge.assets.FSkinFont;
import forge.assets.FSkinImage;
import forge.assets.FTextureRegionImage;
import forge.card.CardDb;
import forge.card.CardEdition;
import forge.card.CardPreferences;
import forge.card.CardRulesPredicates;
import forge.deck.io.DeckPreferences;
import forge.item.PaperCard;
import forge.itemmanager.CardManager;
@@ -30,9 +37,13 @@ import forge.planarconquest.ConquestUtil;
import forge.properties.ForgePreferences.FPref;
import forge.screens.FScreen;
import forge.screens.TabPageScreen;
import forge.toolbox.*;
import forge.toolbox.FContainer;
import forge.toolbox.FEvent;
import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FEvent.FEventType;
import forge.toolbox.FLabel;
import forge.toolbox.FOptionPane;
import forge.toolbox.GuiChoose;
import forge.util.Callback;
import forge.util.ItemPool;
import forge.util.Lang;
@@ -41,7 +52,11 @@ import forge.util.Utils;
import forge.util.storage.IStorage;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
public class FDeckEditor extends TabPageScreen<FDeckEditor> {

View File

@@ -55,7 +55,14 @@ import forge.util.ItemPool;
import forge.util.LayoutHelper;
import forge.util.Localizer;
import java.util.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

View File

@@ -22,7 +22,11 @@ import forge.util.Callback;
import forge.util.TextUtil;
import forge.util.Utils;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.badlogic.gdx.utils.Align;

View File

@@ -11,7 +11,11 @@ import forge.assets.ImageCache;
import forge.card.CardRenderer;
import forge.card.CardRenderer.CardStackPosition;
import forge.card.CardZoom;
import forge.deck.*;
import forge.deck.ArchetypeDeckGenerator;
import forge.deck.CardThemedDeckGenerator;
import forge.deck.CommanderDeckGenerator;
import forge.deck.DeckProxy;
import forge.deck.FDeckViewer;
import forge.item.InventoryItem;
import forge.item.PaperCard;
import forge.itemmanager.ColumnDef;
@@ -33,8 +37,11 @@ import forge.toolbox.FScrollPane;
import forge.util.Localizer;
import forge.util.Utils;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;

View File

@@ -35,7 +35,10 @@ import forge.toolbox.FList;
import com.badlogic.gdx.math.Rectangle;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

View File

@@ -1,9 +1,17 @@
package forge.screens.constructed;
import java.util.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import forge.deck.CardPool;
import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.deck.DeckType;
import forge.deck.FDeckChooser;
import forge.deck.*;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.Gdx;

View File

@@ -4,7 +4,11 @@ import java.util.Collections;
import java.util.List;
import java.util.Set;
import forge.util.*;
import forge.util.Callback;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.NameGenerator;
import forge.util.Utils;
import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.utils.Align;
import com.google.common.collect.ImmutableList;

View File

@@ -1,8 +1,11 @@
package forge.screens.match;
import java.util.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.badlogic.gdx.graphics.Color;

View File

@@ -110,6 +110,9 @@ public class VField extends FContainer {
if (!c.hasCardAttachments() &&
cardName.equals(c.getCurrentState().getName()) &&
card.hasSameCounters(c) &&
card.getCurrentState().getKeywordKey().equals(c.getCurrentState().getKeywordKey()) &&
card.isTapped() == c.isTapped() && // don't stack tapped tokens on untapped tokens
card.isSick() == c.isSick() && //don't stack sick tokens on non sick
card.isToken() == c.isToken()) { //don't stack tokens on top of non-tokens
CardAreaPanel cPanel = CardAreaPanel.get(c);
while (cPanel.getNextPanelInStack() != null) {

View File

@@ -15,8 +15,14 @@ import forge.interfaces.IWinLoseView;
import forge.item.PaperCard;
import forge.menu.FMagnifyView;
import forge.model.FModel;
import forge.toolbox.*;
import forge.toolbox.FButton;
import forge.toolbox.FContainer;
import forge.toolbox.FDisplayObject;
import forge.toolbox.FEvent;
import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FLabel;
import forge.toolbox.FOverlay;
import forge.toolbox.FTextArea;
import forge.util.TextUtil;
import forge.util.Utils;
import forge.util.gui.SGuiChoose;

View File

@@ -2,7 +2,18 @@ package forge.screens.planarconquest;
import java.util.List;
import forge.planarconquest.*;
import forge.planarconquest.ConquestAwardPool;
import forge.planarconquest.ConquestBattle;
import forge.planarconquest.ConquestChaosBattle;
import forge.planarconquest.ConquestData;
import forge.planarconquest.ConquestEvent;
import forge.planarconquest.ConquestLocation;
import forge.planarconquest.ConquestPlane;
import forge.planarconquest.ConquestPlaneData;
import forge.planarconquest.ConquestRegion;
import forge.planarconquest.ConquestReward;
import forge.planarconquest.ConquestUtil;
import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.graphics.Color;

View File

@@ -18,8 +18,13 @@ import forge.itemmanager.filters.HistoricFormatSelect;
import forge.model.CardCollections;
import forge.model.FModel;
import forge.properties.ForgeConstants;
import forge.quest.*;
import forge.quest.QuestController;
import forge.quest.QuestMode;
import forge.quest.QuestUtil;
import forge.quest.QuestWorld;
import forge.quest.StartingPoolPreferences;
import forge.quest.StartingPoolPreferences.PoolType;
import forge.quest.StartingPoolType;
import forge.quest.data.DeckConstructionRules;
import forge.quest.data.GameFormatQuest;
import forge.quest.data.QuestPreferences.QPref;
@@ -27,9 +32,17 @@ import forge.screens.FScreen;
import forge.screens.LoadingOverlay;
import forge.screens.home.NewGameMenu;
import forge.screens.quest.QuestMenu.LaunchReason;
import forge.toolbox.*;
import forge.toolbox.FCheckBox;
import forge.toolbox.FComboBox;
import forge.toolbox.FDisplayObject;
import forge.toolbox.FEvent;
import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FLabel;
import forge.toolbox.FNumericTextField;
import forge.toolbox.FOptionPane;
import forge.toolbox.FRadioButton;
import forge.toolbox.FRadioButton.RadioButtonGroup;
import forge.toolbox.FScrollPane;
import forge.util.FileUtil;
import forge.util.ThreadUtil;
import forge.util.Utils;
@@ -38,8 +51,13 @@ import forge.util.storage.IStorage;
import org.apache.commons.lang3.text.WordUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class NewQuestScreen extends FScreen {

View File

@@ -3,8 +3,12 @@ package forge.screens.quest;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Align;
import forge.Graphics;
import forge.assets.*;
import forge.assets.FImage;
import forge.assets.FSkinColor;
import forge.assets.FSkinColor.Colors;
import forge.assets.FSkinFont;
import forge.assets.FSkinImage;
import forge.assets.ImageCache;
import forge.quest.IQuestEvent;
import forge.screens.settings.SettingsScreen;
import forge.toolbox.FDisplayObject;

View File

@@ -1,7 +1,14 @@
package forge.screens.settings;
import forge.download.*;
import forge.download.GuiDownloadAchievementImages;
import forge.download.GuiDownloadPicturesLQ;
import forge.download.GuiDownloadPrices;
import forge.download.GuiDownloadQuestImages;
import forge.download.GuiDownloadSetPicturesLQ;
import forge.download.GuiDownloadService;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.utils.Align;

View File

@@ -331,6 +331,10 @@ public class SettingsPage extends TabPage<SettingsScreen> {
localizer.getMessage("lblShowCardIDOverlays"),
localizer.getMessage("nlShowCardIDOverlays")),
5);
lstSettings.addItem(new BooleanSetting(FPref.UI_OVERLAY_ABILITY_ICONS,
"Show Ability Icons",
"Show ability icons for cards, otherwise they're hidden."),
5);
//Vibration Options
lstSettings.addItem(new BooleanSetting(FPref.UI_VIBRATE_ON_LIFE_LOSS,

View File

@@ -10,7 +10,8 @@ import forge.Graphics;
import forge.interfaces.IComboBox;
import forge.menu.FDropDownMenu;
import forge.menu.FMenuItem;
import forge.toolbox.FEvent.*;
import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FEvent.FEventType;
public class FComboBox<T> extends FTextField implements IComboBox<T> {
private final List<T> items = new ArrayList<>();

View File

@@ -9,7 +9,12 @@ import forge.util.Callback;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class GuiChoose {

View File

@@ -12,5 +12,5 @@ ALTERNATE
Name:Granted
ManaCost:3 U
Types:Sorcery Adventure
A:SP$ ChangeZone | Cost$ 3 U | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.nonCreature | ChangeNum$ 1 | SpellDescription$ You may choose a noncreature card you own from outside the game, reveal it, and put it into your hand.
A:SP$ ChangeZone | Cost$ 3 U | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.nonCreature+YouOwn | ChangeNum$ 1 | SpellDescription$ You may choose a noncreature card you own from outside the game, reveal it, and put it into your hand.
Oracle:You may choose a noncreature card you own from outside the game, reveal it, and put it into your hand.

View File

@@ -9,6 +9,6 @@ ALTERNATE
Name:Shield's Might
ManaCost:1 G
Types:Sorcery Adventure
Types:Instant Adventure
A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. (Then exile this card. You may cast the creature later from exile.)
Oracle:Target creature gets +2/+2 until end of turn. (Then exile this card. You may cast the creature later from exile.)

View File

@@ -9,5 +9,5 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ HOUR | Counter
T:Mode$ CounterAdded | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ HOUR | CounterAmount$ EQ12 | Execute$ TrigChangeAll | TriggerDescription$ When the twelfth hour counter is put on CARDNAME, shuffle your hand and graveyard into your library, then draw seven cards. Exile CARDNAME.
SVar:TrigChangeAll:DB$ ChangeZoneAll | Origin$ Graveyard,Hand | Destination$ Library | ChangeType$ Card.YouOwn | Shuffle$ True | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 7 | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile
SVar:DBExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile
Oracle:{T}: Add {U}.\n{2}{U}: Put an hour counter on Midnight Clock.\nAt the beginning of each upkeep, put an hour counter on Midnight Clock.\nWhen the twelfth hour counter is put on Midnight Clock, shuffle your hand and graveyard into your library, then draw seven cards. Exile Midnight Clock.

View File

@@ -1080,61 +1080,61 @@ lblSearch=Suche
lblPriority=Priorität
lblTurn=Zug
lblPhase=Phase
lblEmpty=Empty
lbltoResolve=to Resolve.
lblStormCount=Storm Count
lblEmpty=Leer
lbltoResolve=zur Abwicklung.
lblStormCount=Sturmzähler
#PlayerControllerHuman.java
lblYouHaveWonTheCoinToss=%s, you have won the coin toss.
lblYouLostTheLastGame=%s, you lost the last game.
lblWouldYouLiketoPlayorDraw=Would you like to play or draw?
lblWhoWouldYouLiketoStartthisGame=Who would you like to start this game? (Click on the portrait.)
lblPlay=Play
lblDraw=Draw
lblTooFewCardsMainDeck=Too few cards in your main deck (minimum %s), please make modifications to your deck again.
lblTooManyCardsSideboard=Too many cards in your sideboard (maximum %s), please make modifications to your deck again.
lblAssignCombatDamageWerentBlocked=Do you want to assign its combat damage as though it weren't blocked?
lblChosenCards=Chosen Cards
lblAttacker=Attacker
lblTriggeredby=Triggered by
lblChooseWhichCardstoReveal=Choose Which Cards to Reveal
lblChooseCardsActivateOpeningHandandOrder=Choose cards to activate from opening hand and their order
lblActivateFirst=Activate first
lblChooseOptionalCosts=Choose optional Costs
lblOptionalCosts=Optional Costs
lblDoYouWanttoScry=Do you want to scry?
lblChooseCardstoSpliceonto=Choose cards to Splice onto
lblDoNextActioninSequence=Do Next Action in Sequence
lblPleaseDefineanActionSequenceFirst=Please define an action sequence first.
lblRememberActionSequence=Remember Action Sequence
lblYouMustHavePrioritytoUseThisFeature=You must have priority to use this feature.
lblNameTheCard=Name the card
lblWhichPlayerShouldRoll=Which player should roll?
lblChooseResult=Choose result
lblChosenCardNotPermanentorCantExistIndependentlyontheBattleground=The chosen card is not a permanent or can't exist independently on the battlefield.\nIf you'd like to cast a non-permanent spell, or if you'd like to cast a permanent spell and place it on stack, please use the Cast Spell/Play Land button.
lblError=Error
lblWinGame=Win Game
lblSetLifetoWhat=Set life to what?
lblSetLifeforWhichPlayer=Set life for which player
lblChoosePermanentstoTap=Choose permanents to tap
lblChoosePermanentstoUntap=Choose permanents to untap
lblWhichTypeofCounter=Which type of counter?
lblHowManyCounters=How many counters?
lblRemoveCountersFromWhichCard=Remove counters from which card?
lblAddCountersToWhichCard=Add counters to which card?
lblChooseaCard=Choose a card
lblNoPlayerPriorityDeckCantBeTutoredFrom=No player has priority at the moment, so their deck can't be tutored from.
lblNoPlayerPriorityGameStateCannotBeSetup=No player has priority at the moment, so game state cannot be setup.
lblErrorLoadingBattleSetupFile=Error loading battle setup file!
lblSelectCardstoAddtoYourDeck=Select cards to add to your deck
lblAddTheseToMyDeck=Add these to my deck
lblChooseaPile=Choose a pile
lblSelectOrderForSimultaneousAbilities=Select order for simultaneous abilities
lblReorderSimultaneousAbilities=Reorder simultaneous abilities
lblResolveFirst=Resolve first
lblMoveCardstoToporBbottomofLibrary=Move cards to top or bottom of library
lblSelectCardsToBeOutOnTheBottomOfYourLibrary=Select cards to be put on the bottom of your library
lblCardsToPutOnTheBottom=Cards to put on the bottom
lblArrangeCardsToBePutOnTopOfYourLibrary=Arrange cards to be put on top of your library
lblTopOfLibrary=Top of Library
lblSelectCardsToBePutIntoTheGraveyard=Select cards to be put into the graveyard
lblCardsToPutInTheGraveyard=Cards to put in the graveyard
lblYouHaveWonTheCoinToss=%s, du hast den Münzwurf gewonnen.
lblYouLostTheLastGame=%s, du hast das letzte Spiel verloren.
lblWouldYouLiketoPlayorDraw=Willst du lieber zuerst spielen oder ziehen.
lblWhoWouldYouLiketoStartthisGame=Wer soll das Spiel beginnen? (Klicke auf das Portrait.)
lblPlay=Spielen
lblDraw=Ziehen
lblTooFewCardsMainDeck=Zu wenig Karten in deinem Deck (mindestens %s). Bitte passe dein Deck an.
lblTooManyCardsSideboard=Zu viele Karten in deinem Deck (maximal %s). Bitte passe dein Deck an.
lblAssignCombatDamageWerentBlocked=Möchtest du den Kampfschaden deklarieren, als wäre nicht geblockt worden?
lblChosenCards=Wähle Karten
lblAttacker=Angreifer
lblTriggeredby=Ausgelöst durch
lblChooseWhichCardstoReveal=Wähle die vorzuzeigenden Karten
lblChooseCardsActivateOpeningHandandOrder=Wähle die aus der Starthand zu aktivierenden Karten und ihre Reihenfolge
lblActivateFirst=Aktiviere zuerst
lblChooseOptionalCosts=Wähle optionale Kosten
lblOptionalCosts=Optionale Kosten
lblDoYouWanttoScry=Hellsicht anwenden?
lblChooseCardstoSpliceonto=Wähle Karte, an welche gekoppelt werden soll
lblDoNextActioninSequence=Nächste Aktion ausführen
lblPleaseDefineanActionSequenceFirst=Bitte lege erst die Aktionsreigefolge fest.
lblRememberActionSequence=Merke Aktionsreihenfolge
lblYouMustHavePrioritytoUseThisFeature=Um diese Funktion zu nutzen brauchst du die Priorität.
lblNameTheCard=Nenne die Karte
lblWhichPlayerShouldRoll=Welcher Spieler soll würfeln?
lblChooseResult=Wähle Ergebnis
lblChosenCardNotPermanentorCantExistIndependentlyontheBattleground=Die gewählte Karte ist keine bleibende oder kann nicht alleine auf dem Spielfeld existieren.\nWenn du einen Nicht-bleibenden-Karte-Spruch sprechen, oder einen Bleibende-Karte-Spruch auf dem Stapel plazieren möchtest, nutze bitte den "Zauber wirken/Land spielen"-Knopf.
lblError=Fehler
lblWinGame=Gewinne Spiel
lblSetLifetoWhat=Setze Lebenspunkte auf?
lblSetLifeforWhichPlayer=Setze Lebenspunkte für Spieler
lblChoosePermanentstoTap=Wähle Karte zum Tappen
lblChoosePermanentstoUntap=Wähle Karte zum Enttappen
lblWhichTypeofCounter=Welche Art von Marken?
lblHowManyCounters=Wie viele Marken?
lblRemoveCountersFromWhichCard=Entferne Marken von welcher Karte?
lblAddCountersToWhichCard=Lege Marken auf welche Karte?
lblChooseaCard=Wähle eine Karte
lblNoPlayerPriorityDeckCantBeTutoredFrom=Kein Spieler hat Priorität im Moment, daher kein Zugriff auf entsprechendes Deck.
lblNoPlayerPriorityGameStateCannotBeSetup=Kein Spieler hat Priorität im Moment, daher der Spielstand nicht gesetzt werden.
lblErrorLoadingBattleSetupFile=Fehler beim Laden der Spielvorgaben!
lblSelectCardstoAddtoYourDeck=Wähle Karten, um sie deinem Deck hinzuzufügen.
lblAddTheseToMyDeck=Zu meinem Deck hinzufügen
lblChooseaPile=Wähle einen Stapel
lblSelectOrderForSimultaneousAbilities=Wähle Reihenfolge für simultane Fähigkeiten
lblReorderSimultaneousAbilities=Ordne Reihenfolge für simultane Fähigkeiten neu
lblResolveFirst=Zuerst abwickeln
lblMoveCardstoToporBbottomofLibrary=Bewege Karte an Anfang oder Ende der Bibliothek
lblSelectCardsToBeOutOnTheBottomOfYourLibrary=Wähle Karte, welche unter die Bibliothek gelegt werden soll
lblCardsToPutOnTheBottom=Karten, welche unter die Bibliothek gelegt werden sollen
lblArrangeCardsToBePutOnTopOfYourLibrary=Ordne Karten, welche unter die Bibliothek gelegt werden sollen
lblTopOfLibrary=Oben auf Bibliothek
lblSelectCardsToBePutIntoTheGraveyard=Wähle Karten, welche auf den Friedhof gelegt werden sollen
lblCardsToPutInTheGraveyard=Karten, welche auf den Friedhof gelegt werden sollen

View File

@@ -58,15 +58,15 @@ cbSingletons=单张模式
cbRemoveArtifacts=删除神器
cbAnte=赌博模式
cbAnteMatchRarity=赌注稀有度匹配
cbEnableAICheats=允许AI作弊
cbEnableAICheats=允许人工智能作弊
cbManaBurn=法术力灼烧
cbManaLostPrompt=提示法术力池将要清空
cbDevMode=开发人员模式
cbLoadCardsLazily=惰性加载牌脚本
cbLoadCardsLazily=惰性加载牌脚本
cbLoadHistoricFormats=加载史记赛制
cbWorkshopSyntax=作坊语法检查
cbEnforceDeckLegality=套牌一致性
cbSideboardForAI=玩家为AI换备
cbSideboardForAI=玩家为人工智能换备
cbPerformanceMode=性能模式
cbFilteredHands=手牌过滤
cbImageFetcher=自动下载缺失的图片
@@ -101,7 +101,7 @@ cbUseSentry=自动提交错误报告
cbpGameLogEntryType=游戏日志详细程度
cbpCloseAction=关闭动作
cbpDefaultFontSize=默认字体大小
cbpAiProfiles=AI强度
cbpAiProfiles=人工智能强度
cbpDisplayCurrentCardColors=显示牌张颜色详情
cbpAutoYieldMode=自动让过
cbpCounterDisplayType=计数器显示类型
@@ -115,19 +115,19 @@ nlCompactMainMenu=启用节省空间的侧边栏,一次只显示一个菜单
nlUseSentry=启用后,会自动向开发人员提交错误报告。
GamePlay=游戏
nlpMulliganRule=选择调度规则
nlpAiProfiles=选择你的AI对手
nlpAiProfiles=选择你的人工智能对手
nlAnte=确定游戏是否使用赌注
nlAnteMatchRarity=尝试为所有玩家生成同稀有度赌注
nlEnableAICheats=允许AI进行作弊以获得优势(对于已经设置了作弊洗牌的AI)。
nlEnableAICheats=允许人工智能进行作弊以获得优势(对于已经设置了作弊洗牌的人工智能)。
nlManaBurn=使用法术力灼烧M10之前的规则
nlManaLostPrompt=启用后,如果让过优先权会导致法术力池清空,你将收到一个警告提示。
nlEnforceDeckLegality=强制每个与环境相关的套牌合法性(最小单卡数,最大单卡数等)。
nlSideboardForAI=允许用户在构筑赛制中为AI换备牌。
nlSideboardForAI=允许用户在构筑赛制中为人工智能换备牌。
nlPerformanceMode=禁止其他静态能力检查以加速游戏引擎(警告:对手手牌有闪现单卡能使用时可能会跳过)。
nlFilteredHands=生成两个起手并发给你最接近套牌地比例的起手(需要重启)
nlCloneImgSource=启用克隆的时候将使用原画而不是克隆牌的画
nlPromptFreeBlocks=启用后如果你需要支付0来阻挡则不会提示自动支付0。
nlPauseWhileMinimized=启用后Forge将在暂停时最小化主要用于AI VS AI)。
nlPauseWhileMinimized=启用后Forge将在暂停时最小化主要用于人工智能 VS 人工智能)。
nlEscapeEndsTurn=启用后,空格键可以用于结束当前回合的替代按键。
nlDetailedPaymentDesc=启用后,选择目标和支付费用的时候会显示详细的咒语/异能说明。
nlShowStormCount=启用后,提示窗格将会显示当前的风暴计数
@@ -144,10 +144,10 @@ DeckEditorOptions=套牌编辑器选项
nlFilterLandsByColorId=当使用牌张颜色筛选器时,过滤地可以更容易找到产数相关法术力的地
AdvancedSettings=高级设置
nlDevMode=启用在开发期间进行测试的功能菜单
nlWorkshopSyntax=在作坊中启用牌脚本检查。注意:该功能任在测试阶段。
nlWorkshopSyntax=在作坊中启用牌脚本检查。注意:该功能任在测试阶段。
nlGameLogEntryType=更改游戏中日志显示的信息量。排序为最少到最详细。
nlCloseAction=更改单击右上角X按钮时的行为
nlLoadCardsLazily=如果打开该选项Forge将在使用到牌脚本时才加载(警告:实验状态)。
nlLoadCardsLazily=如果打开该选项Forge将在使用到牌脚本时才加载(警告:实验状态)。
nlLoadHistoricFormats=如果打开Forge将加载史记赛制这个能会导致游戏载入时间变长。
GraphicOptions=图形选项
nlDefaultFontSize=UI中字体的默认大小。所有字体元素都相对于此缩放。需要重启
@@ -155,21 +155,21 @@ cbpMulliganRule = 调度规则
nlImageFetcher=允许从在线资源中实时获取缺失的图片
nlDisplayFoil=显示闪卡
nlRandomFoil=随机将牌设置为闪卡
nlScaleLarger=允许牌图片缩放为初始大小
nlScaleLarger=允许牌图片缩放为初始大小
nlRenderBlackCardBorders=为牌周围渲染黑色边框
nlLargeCardViewers=是所有牌看起来更大以便高分辨率图片看起来更舒适,不适合低分辨率设备使用
nlSmallDeckViewer=将套牌查看器设置为800X600而不是按屏幕大小等比缩放
nlRandomArtInPools=限制赛生成的卡池中带有闪卡。
nlUiForTouchScreen=增加一些UI元素以提高触屏体验需要重启
nlCompactPrompt=隐藏标题并在“提示”窗格中使用较小的字体使其更紧凑。
nlHideReminderText=在“牌详情“窗格中隐藏提醒文本
nlHideReminderText=在“牌详情“窗格中隐藏提醒文本
nlOpenPacksIndiv=打开肥包或者补充盒的时候一包一包开。
nlTokensInSeparateRow=生物与衍生物分不同的行显示。
nlStackCreatures=在战场上如同地、神器、结界一般堆叠一样的生物。
nlTimedTargOverlay=启用基于限制目标的覆盖优化以减少CPU使用率仅在旧设备上需要使用需要重启游戏
nlCounterDisplayType=选择指示物的样式。基于文本还是基于图片还是二者混合。
nlCounterDisplayLocation=确定牌张上指示物的位置:靠近底部还是顶部
nlDisplayCurrentCardColors=牌详情窗格中显示当前牌的颜色
nlDisplayCurrentCardColors=在牌详情窗格中显示当前牌的颜色
SoundOptions=声音选项
nlEnableSounds=在游戏中启用声音效果
nlEnableMusic=在游戏中启用背景音乐
@@ -195,7 +195,7 @@ lblDownloadPicsHQ=下载缺省牌的高清图片
lblDownloadSetPics=下载每张牌的图片(每张牌出现一次)
lblDownloadQuestImages=下载冒险之旅里使用的衍生物与图标
lblDownloadAchievementImages=下载成就图片,让你的奖杯更引人注目。
lblDownloadPrices=下载牌商店最新的价格表
lblDownloadPrices=下载牌商店最新的价格表
lblYourVersionOfJavaIsTooOld=你的Java版本太旧无法开始下载内容
lblPleaseUpdateToTheLatestVersionOfJava=请更新到最新版本的JRE
lblYoureRunning=你在运行
@@ -255,7 +255,7 @@ lblCommanderDeck=指挥官套牌
lblPlanarDeck=时空竞逐套牌
lblVanguard=先锋
lblHuman=人类
lblAI=AI
lblAI=人工智能
lblOpen=打开
lblUseSimulation=使用模拟
lblGetaNewRandomName=获取一个新的随机名称
@@ -299,7 +299,7 @@ lblAlphaStrike=先攻
lblEndTurn=结束回合
lblTargetingArcs=瞄准弧
lblOff=关闭
lblCardMouseOver=牌悬停
lblCardMouseOver=悬停
lblAlwaysOn=总是打开
lblAutoYields=自动让过
lblDeckList=套牌列表
@@ -352,8 +352,8 @@ lblPlayAnOpponent=所有对手
lblPlayAll7opponents=全部7个对手
lblBuildorselectadeck=构建或选择一个套牌
lblDraftText1=在轮抓模式中三个补充包在8个玩家中传递
lblDraftText2=从你选的牌中组一套牌。AI也会这样做
lblDraftText3=然后对抗一个或多个AI对手
lblDraftText2=从你选的牌中组一套牌。人工智能也会这样做
lblDraftText3=然后对抗一个或多个人工智能对手
lblNewBoosterDraftGame=新的补充包轮抓
lblDraftDecks=轮抓套牌
#CSubmenuDraft.java
@@ -366,8 +366,8 @@ lblSealedDecks=现开套牌
lblHeaderSealed=游戏模式:现开
lblSealedText1=构建或选择一个套牌
lblSealedText2=在现开模式中您可以从补充包里最多10个构建一套牌
lblSealedText3=从你得到的牌中组一套牌。AI也会这样做
lblSealedText4=然后对抗一个或多个AI对手
lblSealedText3=从你得到的牌中组一套牌。人工智能也会这样做
lblSealedText4=然后对抗一个或多个人工智能对手
btnBuildNewSealedDeck=构建新的现开套牌
#FDeckChooser.java
lblViewDeck=查看套牌
@@ -425,7 +425,7 @@ lblNextChallengeNotYet=没有确定下次胜利后的挑战
btnUnlockSets=解锁系列
btnTravel=时空旅行
btnBazaar=珍宝集市
btnSpellShop=牌商店
btnSpellShop=商店
cbSummonPlant=召唤植物
cbLaunchZeppelin=启动飞艇
#VSubmenuQuest.java
@@ -448,7 +448,7 @@ lblCustomdeck=自定义套牌
lblDefineCustomFormat=定义自定义赛制
lblSelectFormat=选择赛制
lblStartWithAllCards=从所选系列的所有牌开始
lblAllowDuplicateCards=允许重复的
lblAllowDuplicateCards=允许重复的牌
lblStartingPoolDistribution=初始牌池分配
lblChooseDistribution=选择分配
lblPrizedCards=奖励卡
@@ -505,9 +505,9 @@ lblColors=颜色
lblnoSettings=没有可用于此选择的设置
lblDistribution=分配
lblHoverforDescription=将鼠标悬停在每个选项上以获得更详细的说明
lblradBalanced=“均衡”将在每种选定的颜色中提供数量均衡的牌。
lblradRandom=“随机”将随机分配牌和颜色。
lblradSurpriseMe=随机挑选颜色并提供数量均衡的随机牌。
lblradBalanced=“均衡”将在每种选定的颜色中提供数量均衡的牌
lblradRandom=“随机”将随机分配牌和颜色。
lblradSurpriseMe=随机挑选颜色并提供数量均衡的随机牌
lblradBoosters=忽略所有颜色设置,从指定数量的补充包中生成牌池
lblcbxArtifacts=选择后无论选择的颜色如何,神器都包涵在牌池中,这模拟了旧牌池的行为。
#VSubmenuChallenges.java
@@ -531,7 +531,7 @@ lblPastResults=结果
lblQuestDecks=套牌管理
lblQuestDesc1=一开始你可以从有限的牌池中构建套牌。
lblQuestDesc2=随着冒险之旅的进行,你的牌池逐渐增长,可以构建出更强的套牌。
lblQuestDesc3=并且在与AI的决斗和挑战对抗中可以解锁更多牌。
lblQuestDesc3=并且在与人工智能的决斗和挑战对抗中可以解锁更多牌。
lblBuildaNewDeck=构建一个新套牌
#Decktype.java
lblCustomUserDecks=用户自定义套牌
@@ -620,7 +620,7 @@ lblBuildAndSelectaDeck=构建,然后在“冒险套牌”子菜单中选择一
lblCurrentDeck=你现在的套牌是%n
PleaseCreateAQuestBefore=请在%n之前创建套牌。
lblNoQuest=没有探索
lblVisitTheSpellShop=参观牌商店
lblVisitTheSpellShop=参观牌商店
lblVisitTheBazaar=参观珍宝集市
lblUnlockEditions=解锁新的时空
lblUnlocked=你已经成功解锁%n
@@ -662,9 +662,9 @@ lblHard=难
lblExpert=专家
lblWinsforBooster=获得补充包所需的胜利
lblWinsforRankIncrease=排名增加所需的胜利
lblWinsforMediumAI=匹配中等难度AI所需的胜利
lblWinsforHardAI=匹配困难难度AI所需的胜利
lblWinsforExpertAI=匹配专家难度AI所需的胜利
lblWinsforMediumAI=匹配中等难度人工智能所需的胜利
lblWinsforHardAI=匹配困难难度人工智能所需的胜利
lblWinsforExpertAI=匹配专家难度人工智能所需的胜利
lblStartingCommons=初始铁
lblStartingUncommons=初始银
lblStartingRares=初始金
@@ -695,16 +695,16 @@ lblCardSalePercentageCap=出售牌的系数上限
lblCardSalePriceCap=出售牌的价格上限
lblWinstoUncapSalePrice=胜利解锁价格系数
lblPlaysetSize=玩家收藏大小
ttPlaysetSize=在售卖牌时要保留的牌数量
ttPlaysetSize=在售卖牌时要保留的牌数量
lblPlaysetSizeBasicLand=玩家收藏大小:基本地
ttPlaysetSizeBasicLand=在售卖牌时要保留的基本地数量
ttPlaysetSizeBasicLand=在售卖牌时要保留的基本地数量
lblPlaysetSizeAnyNumber=玩家收藏大小:任意数量
ttPlaysetSizeAnyNumber=售卖牌时不保留
ttPlaysetSizeAnyNumber=售卖牌时不保留牌
lblItemLevelRestriction=物品等级限制
lblFoilfilterAlwaysOn=闪卡过滤器始终开启
lblRatingsfilterAlwaysOn=评级过滤器始终开启。
lblSimulateAIvsAIResults=模拟AI VS AI的结果。
ttSimulateAIvsAIResults=如果设置为1则不会播放AI VS AI的轮抓。而是快速确定其对局结果。
lblSimulateAIvsAIResults=模拟人工智能 VS 人工智能的结果。
ttSimulateAIvsAIResults=如果设置为1则不会播放人工智能 VS 人工智能的轮抓。而是快速确定其对局结果。
lblWinsforNewDraft=新轮抓所需的胜利
lblWinsperDraftRotation=每次轮抓胜利轮替
ttWinsperDraftRotation=如果轮抓没有赢这么多场,那么它将被删除或者替换。
@@ -767,7 +767,7 @@ lblRemove4ofcard=移除4张牌
ttRemove4ofcard=最多可以将4张所选牌从当前套牌移除
lblAddBasicLands=添加基本地
ttAddBasicLands=添加基本地到套牌
lblCardCatalog=牌目录
lblCardCatalog=目录
lblJumptoprevioustable=跳转到上一个表格
lblJumptopnexttable=跳转到下一个表格
lblJumptotextfilter=跳转到文本筛选器
@@ -863,7 +863,7 @@ lblUntitled=无标题
lblPrompt=提示
lblGameSetup=游戏设置
#ColumnDef.java
lblAIStatus=AI状态
lblAIStatus=人工智能状态
lblCMC=总法术力费用
ttCMC=总法术力费用
lblCN=编号
@@ -905,7 +905,7 @@ lblBattlefieldTextureFiltering=战场纹理过滤
lblCompactListItems=紧凑的项目列表
lblCompactTabs=紧凑标签
lblCardOverlays=牌张叠加层
lblDisableCardEffect=禁用牌“效果”图
lblDisableCardEffect=禁用牌“效果”图
lblDynamicBackgroundPlanechase=动态时空背景
lblGameplayOptions=游戏选项
lblGeneralSettings=常规设置
@@ -929,14 +929,14 @@ lblVibrateWhenLosingLife=失去生命时震动
lblVibrationOptions=振动选项
nlAutomaticBugReports=在没有提示的情况下自动向开发人员报告错误
nlBattlefieldTextureFiltering=在战场上过滤闪卡特效,使其在大屏幕上不像素化(需要重启,可能会降低性能)。
nlCompactListItems=默认情况下,在所有视图列表中只显示牌和套牌的单行文本。
nlCompactListItems=默认情况下,在所有视图列表中只显示牌和套牌的单行文本。
nlCompactTabs=在标签页屏幕顶部显示较小的标签(例如此屏幕)。
nlDisableCardEffect=禁用“效果”卡的缩放图片。
nlDynamicBackgroundPlanechase=使用当前时空图片作为背景时空图片必须位于cache/pics/planechase文件夹中
nlHotSeatMode=当用两个人类玩家开始游戏的时候,用单个提示控制两个玩家。
nlLandscapeMode=使用横向(水平)而不是纵向(垂直)。
nlMinimizeScreenLock=锁定屏幕时最小化Forge锁屏以后出现图形故障使用
nlOrderGraveyard=确定何时让玩家确定同时进入坟场的牌的顺序(绝不/总是/只对有关牌)。
nlOrderGraveyard=确定何时让玩家确定同时进入坟场的牌的顺序(绝不/总是/只对有关牌)。
nlRotateZoomPlanesPhenomena=旋转缩放时空或异象图片。
nlRotateZoomSplit=旋转缩放连体牌图片。
nlShowCardIDOverlays=显示牌张的ID叠加层否则他们被隐藏。
@@ -946,7 +946,7 @@ nlShowCardOverlays=显示牌张名称,法术力费用,力量/防御和ID叠
nlShowCardPTOverlays=显示力量/防御/忠诚叠加层,否则他们被隐藏。
nlShowMatchBackground=在战场显示背景图片,否则显示背景纹理。
nlTheme=设置显示的组件使用的外观主题。
nlVibrateAfterLongPress=启用长按触发震动,例如长按缩放牌图片。
nlVibrateAfterLongPress=启用长按触发震动,例如长按缩放牌图片。
nlVibrateWhenLosingLife=启用当玩家在游戏中失去生命或收到伤害时震动。
#MatchScreen.java
lblPlayers=玩家列表
@@ -971,7 +971,7 @@ lblChangePreferredArt=改变首选卡图
lblSelectPreferredArt=选择首选的卡图版本
lblTo=
lblAvatar=头像
lblCards=
lblCards=
lblPlanes=时空
lblSchemes=阴谋
lblToMainDeck=到主牌
@@ -982,7 +982,7 @@ lblCommanders=指挥官
lblOathbreakers=破誓者
#Forge.java
lblLoadingFonts=加载字体中
lblLoadingCardTranslations=加载牌翻译中
lblLoadingCardTranslations=加载牌翻译中
lblFinishingStartup=完成启动
#LobbyScreen.java
lblMore=更多
@@ -1053,12 +1053,12 @@ lblOldLandCount=%d张地
lblNewLandCount=添加%d张地
lblNewTotalCount=%d张牌
#FDeckImportDialog.java
lblImportLatestVersionCard=导入牌的最新版本
lblImportLatestVersionCard=导入牌的最新版本
lblUseOnlySetsReleasedBefore=只用之前上市系列的版本:
lblUseOnlyCoreAndExpansionSets=只使用核心系列和拓展系列
lblFollowingCardsCannotBeImported=由于拼写错误系列限制或forge尚未实现以下牌没有被导入:
lblFollowingCardsCannotBeImported=由于拼写错误系列限制或forge尚未实现以下牌没有被导入:
lblImportRemainingCards=导入剩余的卡?
lblNoKnownCardsOnClipboard=在剪切板找不到已知的牌。\n\n将卡组列表复制到剪切板,然后重新打开此对话框。
lblNoKnownCardsOnClipboard=在剪切板找不到已知的牌。\n\n将套牌列表复制到剪切板,然后重新打开此对话框。
#FDeckViewer.java
lblDeckListCopiedClipboard=套牌列表'%s'已经复制到剪切板
#FSideboardDialog.java
@@ -1077,64 +1077,64 @@ lblPaste=粘贴
#ListChooser.java
lblSearch=搜索
#InputBase.java
lblPriority=Priority
lblTurn=Turn
lblPhase=Phase
lblEmpty=Empty
lbltoResolve=to Resolve.
lblStormCount=Storm Count
lblPriority=优先
lblTurn=让过
lblPhase=阶段
lblEmpty=
lbltoResolve=结算。
lblStormCount=风暴计数
#PlayerControllerHuman.java
lblYouHaveWonTheCoinToss=%s, you have won the coin toss.
lblYouLostTheLastGame=%s, you lost the last game.
lblWouldYouLiketoPlayorDraw=Would you like to play or draw?
lblWhoWouldYouLiketoStartthisGame=Who would you like to start this game? (Click on the portrait.)
lblPlay=Play
lblDraw=Draw
lblTooFewCardsMainDeck=Too few cards in your main deck (minimum %s), please make modifications to your deck again.
lblTooManyCardsSideboard=Too many cards in your sideboard (maximum %s), please make modifications to your deck again.
lblAssignCombatDamageWerentBlocked=Do you want to assign its combat damage as though it weren't blocked?
lblChosenCards=Chosen Cards
lblAttacker=Attacker
lblTriggeredby=Triggered by
lblChooseWhichCardstoReveal=Choose Which Cards to Reveal
lblChooseCardsActivateOpeningHandandOrder=Choose cards to activate from opening hand and their order
lblActivateFirst=Activate first
lblChooseOptionalCosts=Choose optional Costs
lblOptionalCosts=Optional Costs
lblDoYouWanttoScry=Do you want to scry?
lblChooseCardstoSpliceonto=Choose cards to Splice onto
lblDoNextActioninSequence=Do Next Action in Sequence
lblPleaseDefineanActionSequenceFirst=Please define an action sequence first.
lblRememberActionSequence=Remember Action Sequence
lblYouMustHavePrioritytoUseThisFeature=You must have priority to use this feature.
lblNameTheCard=Name the card
lblWhichPlayerShouldRoll=Which player should roll?
lblChooseResult=Choose result
lblChosenCardNotPermanentorCantExistIndependentlyontheBattleground=The chosen card is not a permanent or can't exist independently on the battlefield.\nIf you'd like to cast a non-permanent spell, or if you'd like to cast a permanent spell and place it on stack, please use the Cast Spell/Play Land button.
lblError=Error
lblWinGame=Win Game
lblSetLifetoWhat=Set life to what?
lblSetLifeforWhichPlayer=Set life for which player
lblChoosePermanentstoTap=Choose permanents to tap
lblChoosePermanentstoUntap=Choose permanents to untap
lblWhichTypeofCounter=Which type of counter?
lblHowManyCounters=How many counters?
lblRemoveCountersFromWhichCard=Remove counters from which card?
lblAddCountersToWhichCard=Add counters to which card?
lblChooseaCard=Choose a card
lblNoPlayerPriorityDeckCantBeTutoredFrom=No player has priority at the moment, so their deck can't be tutored from.
lblNoPlayerPriorityGameStateCannotBeSetup=No player has priority at the moment, so game state cannot be setup.
lblErrorLoadingBattleSetupFile=Error loading battle setup file!
lblSelectCardstoAddtoYourDeck=Select cards to add to your deck
lblAddTheseToMyDeck=Add these to my deck
lblChooseaPile=Choose a pile
lblSelectOrderForSimultaneousAbilities=Select order for simultaneous abilities
lblReorderSimultaneousAbilities=Reorder simultaneous abilities
lblResolveFirst=Resolve first
lblMoveCardstoToporBbottomofLibrary=Move cards to top or bottom of library
lblSelectCardsToBeOutOnTheBottomOfYourLibrary=Select cards to be put on the bottom of your library
lblCardsToPutOnTheBottom=Cards to put on the bottom
lblArrangeCardsToBePutOnTopOfYourLibrary=Arrange cards to be put on top of your library
lblTopOfLibrary=Top of Library
lblSelectCardsToBePutIntoTheGraveyard=Select cards to be put into the graveyard
lblCardsToPutInTheGraveyard=Cards to put in the graveyard
lblYouHaveWonTheCoinToss=%s,你赢得了这次掷硬币。
lblYouLostTheLastGame=%s,最后一场比赛你输了。
lblWouldYouLiketoPlayorDraw=你想先手还是后手?
lblWhoWouldYouLiketoStartthisGame=你想谁先开始游戏?(单击头像)
lblPlay=先手
lblDraw=后手
lblTooFewCardsMainDeck=主牌中牌张数过少(最少为%s请重新修改套牌。
lblTooManyCardsSideboard=备牌中牌张数过多(最多为%s请重新修改套牌。
lblAssignCombatDamageWerentBlocked=是否要像没有被阻挡一样分配战斗伤害?
lblChosenCards=选择牌
lblAttacker=攻击者
lblTriggeredby=触发者
lblChooseWhichCardstoReveal=选择要展示的牌
lblChooseCardsActivateOpeningHandandOrder=选择要展示的手牌和顺序
lblActivateFirst=先触发
lblChooseOptionalCosts=选择可选费用
lblOptionalCosts=可选费用
lblDoYouWanttoScry=你想占卜吗?
lblChooseCardstoSpliceonto=选择要通联的牌。
lblDoNextActioninSequence=按顺序执行下一步操作
lblPleaseDefineanActionSequenceFirst=请先定义一个动作序列。
lblRememberActionSequence=记住动作序列
lblYouMustHavePrioritytoUseThisFeature=你必须有使用此功能的优先权。
lblNameTheCard=命名牌
lblWhichPlayerShouldRoll=那个玩家掷骰子?
lblChooseResult=选择结果
lblChosenCardNotPermanentorCantExistIndependentlyontheBattleground=选择的牌不是永久物,也不能在战场单独存在。\n如果你想释放费永久物咒语或者你想释放永久物咒语并将之放于堆叠上请按"Cast Spell/Play Land"按钮。
lblError=错误
lblWinGame=赢得这局游戏
lblSetLifetoWhat=设定生命值为多少?
lblSetLifeforWhichPlayer=设定哪个牌手的生命值?
lblChoosePermanentstoTap=选择要横置的永久物
lblChoosePermanentstoUntap=选择要重置的永久物
lblWhichTypeofCounter=那种指示物?
lblHowManyCounters=多少指示物?
lblRemoveCountersFromWhichCard=从哪张牌移除指示物?
lblAddCountersToWhichCard=添加指示物到哪张牌?
lblChooseaCard=选择一张牌
lblNoPlayerPriorityDeckCantBeTutoredFrom=目前没有玩家拥有优先权,因此无法从其套牌导师。
lblNoPlayerPriorityGameStateCannotBeSetup=目前没有玩家拥有优先权,因此无法设置游戏状态。
lblErrorLoadingBattleSetupFile=加载战场设置文件出错!
lblSelectCardstoAddtoYourDeck=选择要添加到套牌的牌张。
lblAddTheseToMyDeck=添加这些到我的套牌
lblChooseaPile=选择一堆
lblSelectOrderForSimultaneousAbilities=选择同时触发的异能的结算顺序
lblReorderSimultaneousAbilities=重新对同时触发异能的结算顺序进行排序
lblResolveFirst=先结算
lblMoveCardstoToporBbottomofLibrary=将牌张移动到牌库顶或底
lblSelectCardsToBeOutOnTheBottomOfYourLibrary=选择要放到牌库底的牌张
lblCardsToPutOnTheBottom=放到底部的牌张
lblArrangeCardsToBePutOnTopOfYourLibrary=为放于牌库顶的牌张排序
lblTopOfLibrary=牌库顶
lblSelectCardsToBePutIntoTheGraveyard=选择要放于坟场的牌张
lblCardsToPutInTheGraveyard=放于坟场的牌张

Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 KiB

After

Width:  |  Height:  |  Size: 190 KiB

View File

@@ -309,7 +309,17 @@ public enum FSkinProp {
IMG_ABILITY_SHROUD (new int[] {330, 330, 80, 80}, PropType.ABILITY),
IMG_ABILITY_TRAMPLE (new int[] {412, 330, 80, 80}, PropType.ABILITY),
IMG_ABILITY_VIGILANCE (new int[] {2, 412, 80, 80}, PropType.ABILITY),
//Hexproof From
IMG_ABILITY_HEXPROOF_R (new int[] {2, 494, 80, 80}, PropType.ABILITY),
IMG_ABILITY_HEXPROOF_G (new int[] {412, 412, 80, 80}, PropType.ABILITY),
IMG_ABILITY_HEXPROOF_B (new int[] {248, 412, 80, 80}, PropType.ABILITY),
IMG_ABILITY_HEXPROOF_U (new int[] {84, 494, 80, 80}, PropType.ABILITY),
IMG_ABILITY_HEXPROOF_W (new int[] {248, 494, 80, 80}, PropType.ABILITY),
IMG_ABILITY_HEXPROOF_C (new int[] {330, 412, 80, 80}, PropType.ABILITY),
IMG_ABILITY_HEXPROOF_UB (new int[] {166, 494, 80, 80}, PropType.ABILITY),
//token icon
IMG_ABILITY_TOKEN (new int[] {330, 494, 80, 80}, PropType.ABILITY),
//Protection From
IMG_ABILITY_PROTECT_ALL (new int[] {248, 84, 80, 80}, PropType.ABILITY),
IMG_ABILITY_PROTECT_B (new int[] {330, 84, 80, 80}, PropType.ABILITY),
IMG_ABILITY_PROTECT_BU (new int[] {412, 84, 80, 80}, PropType.ABILITY),

View File

@@ -357,6 +357,12 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
return processCards(cards, cardsRefreshDetails);
}
@Override
public Void visit(final GameEventTokenStateUpdate event) {
processCards(event.cards, cardsRefreshDetails);
return processCards(event.cards, cardsUpdate);
}
@Override
public Void visit(final GameEventShuffle event) {
//pfps the change to the library has already been performed by a setCards call

View File

@@ -78,6 +78,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
UI_OVERLAY_CARD_POWER ("true"),
UI_OVERLAY_CARD_MANA_COST ("true"),
UI_OVERLAY_CARD_ID ("true"),
UI_OVERLAY_ABILITY_ICONS("true"),
UI_ENABLE_ONLINE_IMAGE_FETCHER ("false"),
UI_IMAGE_CACHE_MAXIMUM("400"),
UI_OVERLAY_FOIL_EFFECT ("true"),