mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Merge branch 'Card-Forge:master' into master
This commit is contained in:
34
.github/workflows/stale.yml
vendored
Normal file
34
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
|
||||||
|
#
|
||||||
|
# You can adjust the behavior by modifying this file.
|
||||||
|
# For more information, see:
|
||||||
|
# https://github.com/actions/stale
|
||||||
|
name: Mark stale issues and pull requests
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '21 9 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v5
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
stale-issue-message: "This issue has not been updated in a while and has now been marked as stale. Stale messages will be auto closed."
|
||||||
|
stale-pr-message: 'This PR has not been updated in a while nad has been marked on stale. Stale PRs will be auto closed'
|
||||||
|
close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.'
|
||||||
|
stale-issue-label: 'no-issue-activity'
|
||||||
|
stale-pr-label: 'no-pr-activity'
|
||||||
|
exempt-pr-labels: 'awaiting-approval,work-in-progress'
|
||||||
|
days-before-issue-stale: 30
|
||||||
|
days-before-pr-stale: 45
|
||||||
|
days-before-issue-close: 5
|
||||||
|
days-before-pr-close: 10
|
||||||
|
debug-only: true
|
||||||
@@ -604,6 +604,7 @@ public final class CardRulesPredicates {
|
|||||||
};
|
};
|
||||||
|
|
||||||
public static final Predicate<CardRules> IS_PLANESWALKER = CardRulesPredicates.coreType(true, CardType.CoreType.Planeswalker);
|
public static final Predicate<CardRules> IS_PLANESWALKER = CardRulesPredicates.coreType(true, CardType.CoreType.Planeswalker);
|
||||||
|
public static final Predicate<CardRules> IS_BATTLE = CardRulesPredicates.coreType(true, CardType.CoreType.Battle);
|
||||||
public static final Predicate<CardRules> IS_INSTANT = CardRulesPredicates.coreType(true, CardType.CoreType.Instant);
|
public static final Predicate<CardRules> IS_INSTANT = CardRulesPredicates.coreType(true, CardType.CoreType.Instant);
|
||||||
public static final Predicate<CardRules> IS_SORCERY = CardRulesPredicates.coreType(true, CardType.CoreType.Sorcery);
|
public static final Predicate<CardRules> IS_SORCERY = CardRulesPredicates.coreType(true, CardType.CoreType.Sorcery);
|
||||||
public static final Predicate<CardRules> IS_ENCHANTMENT = CardRulesPredicates.coreType(true, CardType.CoreType.Enchantment);
|
public static final Predicate<CardRules> IS_ENCHANTMENT = CardRulesPredicates.coreType(true, CardType.CoreType.Enchantment);
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ public class CardTypeFilter extends StatTypeFilter<PaperCard> {
|
|||||||
addToggleButton(widget, StatTypes.PLANESWALKER);
|
addToggleButton(widget, StatTypes.PLANESWALKER);
|
||||||
addToggleButton(widget, StatTypes.INSTANT);
|
addToggleButton(widget, StatTypes.INSTANT);
|
||||||
addToggleButton(widget, StatTypes.SORCERY);
|
addToggleButton(widget, StatTypes.SORCERY);
|
||||||
|
addToggleButton(widget, StatTypes.BATTLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -143,18 +143,18 @@ public class RewardScene extends UIScene {
|
|||||||
boolean done(boolean skipShowLoot) {
|
boolean done(boolean skipShowLoot) {
|
||||||
GameHUD.getInstance().getTouchpad().setVisible(false);
|
GameHUD.getInstance().getTouchpad().setVisible(false);
|
||||||
if (!skipShowLoot) {
|
if (!skipShowLoot) {
|
||||||
doneButton.setText("[+Exit]");
|
doneButton.setText("[+OK]");
|
||||||
showLootOrDone();
|
showLootOrDone();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (type != null) {
|
if (type != null) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Shop:
|
case Shop:
|
||||||
doneButton.setText("[+Exit]");
|
doneButton.setText("[+OK]");
|
||||||
break;
|
break;
|
||||||
case QuestReward:
|
case QuestReward:
|
||||||
case Loot:
|
case Loot:
|
||||||
doneButton.setText("[+Exit]");
|
doneButton.setText("[+OK]");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -198,7 +198,7 @@ public class RewardScene extends UIScene {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void enter() {
|
public void enter() {
|
||||||
doneButton.setText("[+Exit]");
|
doneButton.setText("[+OK]");
|
||||||
updateDetailButton();
|
updateDetailButton();
|
||||||
super.enter();
|
super.enter();
|
||||||
}
|
}
|
||||||
@@ -333,7 +333,7 @@ public class RewardScene extends UIScene {
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Shop:
|
case Shop:
|
||||||
doneButton.setText("[+Exit]");
|
doneButton.setText("[+OK]");
|
||||||
String shopName = shopActor.getDescription();
|
String shopName = shopActor.getDescription();
|
||||||
if ((shopName != null && !shopName.isEmpty())) {
|
if ((shopName != null && !shopName.isEmpty())) {
|
||||||
shopNameLabel.setVisible(true);
|
shopNameLabel.setVisible(true);
|
||||||
@@ -353,7 +353,7 @@ public class RewardScene extends UIScene {
|
|||||||
shopNameLabel.setVisible(false);
|
shopNameLabel.setVisible(false);
|
||||||
shopNameLabel.setText("");
|
shopNameLabel.setText("");
|
||||||
restockButton.setVisible(false);
|
restockButton.setVisible(false);
|
||||||
doneButton.setText("[+Exit]");
|
doneButton.setText("[+OK]");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (int h = 1; h < targetHeight; h++) {
|
for (int h = 1; h < targetHeight; h++) {
|
||||||
|
|||||||
@@ -863,7 +863,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
|
|||||||
|
|
||||||
public HoldTooltip(ComplexTooltip complexTooltip) {
|
public HoldTooltip(ComplexTooltip complexTooltip) {
|
||||||
tooltip_actor = complexTooltip;
|
tooltip_actor = complexTooltip;
|
||||||
switchButton = Controls.newTextButton("Flip");
|
switchButton = Controls.newTextButton("[+Flip]");
|
||||||
switchButton.addListener(new ClickListener() {
|
switchButton.addListener(new ClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void clicked(InputEvent event, float x, float y) {
|
public void clicked(InputEvent event, float x, float y) {
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ public class FSkin {
|
|||||||
final FileHandle f4 = getDefaultSkinFile(ForgeConstants.SPRITE_AVATARS_FILE);
|
final FileHandle f4 = getDefaultSkinFile(ForgeConstants.SPRITE_AVATARS_FILE);
|
||||||
final FileHandle f5 = getSkinFile(ForgeConstants.SPRITE_AVATARS_FILE);
|
final FileHandle f5 = getSkinFile(ForgeConstants.SPRITE_AVATARS_FILE);
|
||||||
final FileHandle f6 = getDefaultSkinFile(SourceFile.OLD_FOILS.getFilename());
|
final FileHandle f6 = getDefaultSkinFile(SourceFile.OLD_FOILS.getFilename());
|
||||||
final FileHandle f7 = getSkinFile(ForgeConstants.SPRITE_MANAICONS_FILE);
|
final FileHandle f7 = getDefaultSkinFile(ForgeConstants.SPRITE_MANAICONS_FILE);
|
||||||
final FileHandle f8 = getDefaultSkinFile(ForgeConstants.SPRITE_SLEEVES_FILE);
|
final FileHandle f8 = getDefaultSkinFile(ForgeConstants.SPRITE_SLEEVES_FILE);
|
||||||
final FileHandle f9 = getDefaultSkinFile(ForgeConstants.SPRITE_SLEEVES2_FILE);
|
final FileHandle f9 = getDefaultSkinFile(ForgeConstants.SPRITE_SLEEVES2_FILE);
|
||||||
final FileHandle f10 = getDefaultSkinFile(ForgeConstants.SPRITE_BORDER_FILE);
|
final FileHandle f10 = getDefaultSkinFile(ForgeConstants.SPRITE_BORDER_FILE);
|
||||||
|
|||||||
@@ -326,6 +326,7 @@ public enum FSkinImage implements FImage {
|
|||||||
PLANESWALKER (FSkinProp.IMG_PLANESWALKER, SourceFile.MANAICONS),
|
PLANESWALKER (FSkinProp.IMG_PLANESWALKER, SourceFile.MANAICONS),
|
||||||
PACK (FSkinProp.IMG_PACK, SourceFile.ICONS),
|
PACK (FSkinProp.IMG_PACK, SourceFile.ICONS),
|
||||||
SORCERY (FSkinProp.IMG_SORCERY, SourceFile.MANAICONS),
|
SORCERY (FSkinProp.IMG_SORCERY, SourceFile.MANAICONS),
|
||||||
|
BATTLE (FSkinProp.IMG_BATTLE, SourceFile.MANAICONS),
|
||||||
COMMANDER (FSkinProp.IMG_COMMANDER, SourceFile.ICONS),
|
COMMANDER (FSkinProp.IMG_COMMANDER, SourceFile.ICONS),
|
||||||
|
|
||||||
//Buttons
|
//Buttons
|
||||||
@@ -523,7 +524,7 @@ public enum FSkinImage implements FImage {
|
|||||||
public void load(Pixmap preferredIcons) {
|
public void load(Pixmap preferredIcons) {
|
||||||
String filename = sourceFile.getFilename();
|
String filename = sourceFile.getFilename();
|
||||||
boolean is2D = sourceFile == SourceFile.ADVENTURE;
|
boolean is2D = sourceFile == SourceFile.ADVENTURE;
|
||||||
FileHandle preferredFile = FSkin.getSkinFile(filename);
|
FileHandle preferredFile = sourceFile == SourceFile.MANAICONS ? FSkin.getDefaultSkinFile(filename) : FSkin.getSkinFile(filename);
|
||||||
Texture texture = Forge.getAssets().getTexture(preferredFile, is2D, false);
|
Texture texture = Forge.getAssets().getTexture(preferredFile, is2D, false);
|
||||||
if (texture == null) {
|
if (texture == null) {
|
||||||
if (preferredFile.exists()) {
|
if (preferredFile.exists()) {
|
||||||
@@ -638,4 +639,4 @@ public enum FSkinImage implements FImage {
|
|||||||
public void draw(Graphics g, float x, float y, float w, float h) {
|
public void draw(Graphics g, float x, float y, float w, float h) {
|
||||||
g.drawImage(textureRegion, x, y, w, h);
|
g.drawImage(textureRegion, x, y, w, h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ public class CardImageRenderer {
|
|||||||
float ptBoxHeight = 0;
|
float ptBoxHeight = 0;
|
||||||
float textBoxHeight = h - headerHeight - artHeight - typeBoxHeight - outerBorderThickness - artInset;
|
float textBoxHeight = h - headerHeight - artHeight - typeBoxHeight - outerBorderThickness - artInset;
|
||||||
|
|
||||||
if (state.isCreature() || state.isPlaneswalker() || state.getType().hasSubtype("Vehicle")) {
|
if (state.isCreature() || state.isPlaneswalker() || state.getType().hasSubtype("Vehicle") || state.isBattle()) {
|
||||||
ptBoxHeight = 2 * PT_FONT.getCapHeight();
|
ptBoxHeight = 2 * PT_FONT.getCapHeight();
|
||||||
}
|
}
|
||||||
//space for artist
|
//space for artist
|
||||||
@@ -721,6 +721,8 @@ public class CardImageRenderer {
|
|||||||
pieces.add("/");
|
pieces.add("/");
|
||||||
pieces.add(String.valueOf(state.getToughness()));
|
pieces.add(String.valueOf(state.getToughness()));
|
||||||
pieces.add("]");
|
pieces.add("]");
|
||||||
|
} else if (state.isBattle()) {
|
||||||
|
pieces.add(String.valueOf(state.getDefense()));
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -800,7 +802,7 @@ public class CardImageRenderer {
|
|||||||
croppedArea = 0.975f;
|
croppedArea = 0.975f;
|
||||||
minusxy = 0.135f * radius;
|
minusxy = 0.135f * radius;
|
||||||
}
|
}
|
||||||
if (rotatePlane && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane())) {
|
if (rotatePlane && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane() || (card.getCurrentState().isBattle() && !altState) || (card.getAlternateState() != null && card.getAlternateState().isBattle() && altState))) {
|
||||||
if (Forge.enableUIMask.equals("Full")) {
|
if (Forge.enableUIMask.equals("Full")) {
|
||||||
if (image.toString().contains(".fullborder."))
|
if (image.toString().contains(".fullborder."))
|
||||||
g.drawCardRoundRect(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90);
|
g.drawCardRoundRect(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90);
|
||||||
|
|||||||
@@ -533,6 +533,8 @@ public class CardRenderer {
|
|||||||
type += " (" + loyalty + ")";
|
type += " (" + loyalty + ")";
|
||||||
} else if (card.getCurrentState().getType().hasSubtype("Vehicle")) {
|
} else if (card.getCurrentState().getType().hasSubtype("Vehicle")) {
|
||||||
type += String.format(" [%s / %s]", power, toughness);
|
type += String.format(" [%s / %s]", power, toughness);
|
||||||
|
} else if (card.getCurrentState().isBattle()) {
|
||||||
|
type += " (" + card.getCurrentState().getDefense() + ")";
|
||||||
}
|
}
|
||||||
g.drawText(type, typeFont, foreColor, x, y, availableTypeWidth, lineHeight, false, Align.left, true);
|
g.drawText(type, typeFont, foreColor, x, y, availableTypeWidth, lineHeight, false, Align.left, true);
|
||||||
}
|
}
|
||||||
@@ -635,7 +637,7 @@ public class CardRenderer {
|
|||||||
g.drawCardImage(image, crack_overlay, x, y, w, h, card.wasDestroyed(), magnify ? false : card.getDamage() > 0);
|
g.drawCardImage(image, crack_overlay, x, y, w, h, card.wasDestroyed(), magnify ? false : card.getDamage() > 0);
|
||||||
} else {
|
} else {
|
||||||
if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_PLANE_OR_PHENOMENON)
|
if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_PLANE_OR_PHENOMENON)
|
||||||
&& (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane()) && rotate) {
|
&& (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane() || (card.getCurrentState().isBattle() && !showAltState) || (card.getAlternateState() != null && card.getAlternateState().isBattle() && showAltState)) && rotate) {
|
||||||
if (Forge.enableUIMask.equals("Full")) {
|
if (Forge.enableUIMask.equals("Full")) {
|
||||||
if (image.toString().contains(".fullborder."))
|
if (image.toString().contains(".fullborder."))
|
||||||
g.drawCardRoundRect(image, x, y, w, h, x + w / 2, y + h / 2, -90);
|
g.drawCardRoundRect(image, x, y, w, h, x + w / 2, y + h / 2, -90);
|
||||||
|
|||||||
@@ -67,6 +67,8 @@ public class CardZoom extends FOverlay {
|
|||||||
|
|
||||||
public static void show(final List<?> items0, int currentIndex0, ActivateHandler activateHandler0) {
|
public static void show(final List<?> items0, int currentIndex0, ActivateHandler activateHandler0) {
|
||||||
items = items0;
|
items = items0;
|
||||||
|
if (items == null) { return; }
|
||||||
|
if (currentIndex0 < 0 || items.size() <= currentIndex0) { return; }
|
||||||
activateHandler = activateHandler0;
|
activateHandler = activateHandler0;
|
||||||
currentIndex = currentIndex0;
|
currentIndex = currentIndex0;
|
||||||
initialIndex = currentIndex0;
|
initialIndex = currentIndex0;
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public class CardTypeFilter extends StatTypeFilter<PaperCard> {
|
|||||||
addToggleButton(widget, StatTypes.PLANESWALKER);
|
addToggleButton(widget, StatTypes.PLANESWALKER);
|
||||||
addToggleButton(widget, StatTypes.INSTANT);
|
addToggleButton(widget, StatTypes.INSTANT);
|
||||||
addToggleButton(widget, StatTypes.SORCERY);
|
addToggleButton(widget, StatTypes.SORCERY);
|
||||||
|
addToggleButton(widget, StatTypes.BATTLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public class TargetingOverlay {
|
|||||||
}
|
}
|
||||||
if (null != combat) {
|
if (null != combat) {
|
||||||
final GameEntityView defender = combat.getDefender(c);
|
final GameEntityView defender = combat.getDefender(c);
|
||||||
// if c is attacking a planeswalker
|
// if c is attacking a planeswalker or battle
|
||||||
if (defender instanceof CardView) {
|
if (defender instanceof CardView) {
|
||||||
drawArrow(g, endpoints.get(defender.getId()), endpoints.get(c.getId()), ArcConnection.FoesAttacking);
|
drawArrow(g, endpoints.get(defender.getId()), endpoints.get(c.getId()), ArcConnection.FoesAttacking);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,14 +88,6 @@ public class VAssignCombatDamage extends FDialog {
|
|||||||
throw new RuntimeException("Asking to assign damage to object which is not present in defenders list");
|
throw new RuntimeException("Asking to assign damage to object which is not present in defenders list");
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Constructor.
|
|
||||||
*
|
|
||||||
* @param attacker0 {@link forge.game.card.Card}
|
|
||||||
* @param blockers List<{@link forge.game.card.Card}>
|
|
||||||
* @param damage0 int
|
|
||||||
* @param defender GameEntity that's bein attacked
|
|
||||||
* @param overrideOrder override combatant order
|
|
||||||
*/
|
|
||||||
public VAssignCombatDamage(final CardView attacker, final List<CardView> blockers, final int damage0, final GameEntityView defender0, boolean overrideOrder, boolean maySkip, final WaitCallback<Map<CardView, Integer>> waitCallback) {
|
public VAssignCombatDamage(final CardView attacker, final List<CardView> blockers, final int damage0, final GameEntityView defender0, boolean overrideOrder, boolean maySkip, final WaitCallback<Map<CardView, Integer>> waitCallback) {
|
||||||
super(Forge.getLocalizer().getMessage("lbLAssignDamageDealtBy").replace("%s",CardTranslation.getTranslatedName(attacker.getName())) , 3);
|
super(Forge.getLocalizer().getMessage("lbLAssignDamageDealtBy").replace("%s",CardTranslation.getTranslatedName(attacker.getName())) , 3);
|
||||||
|
|
||||||
@@ -420,8 +412,6 @@ public class VAssignCombatDamage extends FDialog {
|
|||||||
return totalDamageToAssign - spent;
|
return totalDamageToAssign - spent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Updates labels and other UI elements.
|
|
||||||
* @param index index of the last assigned damage*/
|
|
||||||
private void updateLabels() {
|
private void updateLabels() {
|
||||||
int damageLeft = totalDamageToAssign;
|
int damageLeft = totalDamageToAssign;
|
||||||
boolean allHaveLethal = true;
|
boolean allHaveLethal = true;
|
||||||
@@ -469,13 +459,19 @@ public class VAssignCombatDamage extends FDialog {
|
|||||||
}
|
}
|
||||||
else if (defender instanceof CardView) { // planeswalker
|
else if (defender instanceof CardView) { // planeswalker
|
||||||
CardView pw = (CardView)defender;
|
CardView pw = (CardView)defender;
|
||||||
lethalDamage = Integer.valueOf(pw.getCurrentState().getLoyalty());
|
if (((CardView) defender).getCurrentState().isPlaneswalker()) {
|
||||||
|
lethalDamage = Integer.parseInt(pw.getCurrentState().getLoyalty());
|
||||||
|
} else {
|
||||||
|
lethalDamage = Integer.parseInt(pw.getCurrentState().getDefense());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lethalDamage = Math.max(0, source.getLethalDamage());
|
lethalDamage = Math.max(0, source.getLethalDamage());
|
||||||
if (source.getCurrentState().getType().isPlaneswalker()) {
|
if (source.getCurrentState().getType().isPlaneswalker()) {
|
||||||
lethalDamage = Integer.valueOf(source.getCurrentState().getLoyalty());
|
lethalDamage = Integer.parseInt(source.getCurrentState().getLoyalty());
|
||||||
|
} else if (source.getCurrentState().getType().isBattle()) {
|
||||||
|
lethalDamage = Integer.parseInt(source.getCurrentState().getDefense());
|
||||||
} else if (attackerHasDeathtouch) {
|
} else if (attackerHasDeathtouch) {
|
||||||
lethalDamage = Math.min(lethalDamage, 1);
|
lethalDamage = Math.min(lethalDamage, 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -176,6 +176,8 @@ public class VReveal extends FDropDown {
|
|||||||
type += " (" + paperCard.getRules().getPower() + " / " + paperCard.getRules().getToughness() + ")";
|
type += " (" + paperCard.getRules().getPower() + " / " + paperCard.getRules().getToughness() + ")";
|
||||||
} else if (paperCard.getRules().getType().isPlaneswalker()) {
|
} else if (paperCard.getRules().getType().isPlaneswalker()) {
|
||||||
type += " (" + paperCard.getRules().getInitialLoyalty() + ")";
|
type += " (" + paperCard.getRules().getInitialLoyalty() + ")";
|
||||||
|
} else if (paperCard.getRules().getType().isBattle()) {
|
||||||
|
type += " (" + paperCard.getRules().getDefense() + ")";
|
||||||
} else if (paperCard.getRules().getType().hasSubtype("Vehicle")) {
|
} else if (paperCard.getRules().getType().hasSubtype("Vehicle")) {
|
||||||
type += String.format(" [%s / %s]", paperCard.getRules().getPower(), paperCard.getRules().getToughness());
|
type += String.format(" [%s / %s]", paperCard.getRules().getPower(), paperCard.getRules().getToughness());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -435,6 +435,9 @@ GreenLeaf2
|
|||||||
SearchPost
|
SearchPost
|
||||||
xy: 384, 63
|
xy: 384, 63
|
||||||
size: 16, 16
|
size: 16, 16
|
||||||
|
Flip
|
||||||
|
xy: 400, 63
|
||||||
|
size: 16, 16
|
||||||
LogBook
|
LogBook
|
||||||
xy: 240, 912
|
xy: 240, 912
|
||||||
size: 16, 16
|
size: 16, 16
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 271 KiB After Width: | Height: | Size: 271 KiB |
@@ -37,10 +37,10 @@
|
|||||||
{
|
{
|
||||||
"type": "TextButton",
|
"type": "TextButton",
|
||||||
"name": "done",
|
"name": "done",
|
||||||
"text": "tr(lblLeave)",
|
"text": "[+OK]",
|
||||||
"width": 48,
|
"width": 48,
|
||||||
"height": 30,
|
"height": 30,
|
||||||
"binding": "Back",
|
"binding": "Use",
|
||||||
"x": 420,
|
"x": 420,
|
||||||
"y": 120
|
"y": 120
|
||||||
} ,
|
} ,
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
{
|
{
|
||||||
"type": "TextButton",
|
"type": "TextButton",
|
||||||
"name": "done",
|
"name": "done",
|
||||||
"text": "tr(lblLeave)",
|
"text": "[+OK]",
|
||||||
"width": 128,
|
"width": 128,
|
||||||
"height": 32,
|
"height": 32,
|
||||||
"x": 140,
|
"x": 140,
|
||||||
|
|||||||
@@ -63,8 +63,8 @@
|
|||||||
"type": "TextButton",
|
"type": "TextButton",
|
||||||
"selectable": true,
|
"selectable": true,
|
||||||
"name": "done",
|
"name": "done",
|
||||||
"text": "[+Exit]",
|
"text": "[+OK]",
|
||||||
"binding": "Back",
|
"binding": "Use",
|
||||||
"x": 400,
|
"x": 400,
|
||||||
"y": 240,
|
"y": 240,
|
||||||
"width": 70,
|
"width": 70,
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
"type": "TextButton",
|
"type": "TextButton",
|
||||||
"selectable": true,
|
"selectable": true,
|
||||||
"name": "done",
|
"name": "done",
|
||||||
"text": "[+Exit]",
|
"text": "[+OK]",
|
||||||
"x": 180,
|
"x": 180,
|
||||||
"y": 150,
|
"y": 150,
|
||||||
"width": 90,
|
"width": 90,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:3 R
|
|||||||
Types:Enchantment Saga
|
Types:Enchantment Saga
|
||||||
K:Saga:3:DBPowerStone,DBEffect,DBDamage
|
K:Saga:3:DBPowerStone,DBEffect,DBDamage
|
||||||
SVar:DBPowerStone:DB$ Token | TokenAmount$ 2 | TokenTapped$ True | TokenScript$ c_a_powerstone | TokenOwner$ You | SpellDescription$ Create two tapped Powerstone tokens.
|
SVar:DBPowerStone:DB$ Token | TokenAmount$ 2 | TokenTapped$ True | TokenScript$ c_a_powerstone | TokenOwner$ You | SpellDescription$ Create two tapped Powerstone tokens.
|
||||||
SVar:DBEffect:DB$ Effect | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Player | StaticAbilities$ MustAttack | SpellDescription$ Choose two target players. Until your next turn, each creature they control attacks the other chosen player each combat if able.
|
SVar:DBEffect:DB$ Effect | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Player | Duration$ UntilYourNextTurn | StaticAbilities$ MustAttack | SpellDescription$ Choose two target players. Until your next turn, each creature they control attacks the other chosen player each combat if able.
|
||||||
SVar:MustAttack:Mode$ MustAttack | EffectZone$ Command | ValidCreature$ Creature.RememberedPlayerCtrl+ActivePlayerCtrl | MustAttack$ Remembered.NonActive | Description$ Until your next turn, each creature the chosen player control attacks the other chosen player each combat if able.
|
SVar:MustAttack:Mode$ MustAttack | EffectZone$ Command | ValidCreature$ Creature.RememberedPlayerCtrl+ActivePlayerCtrl | MustAttack$ Remembered.NonActive | Description$ Until your next turn, each creature the chosen player control attacks the other chosen player each combat if able.
|
||||||
SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select two different targets | NumDmg$ X | TargetMin$ 2 | TargetMax$ 2 | TargetUnique$ True | SpellDescription$ CARDNAME deals X damage to any target and X damage to any other target, where X is the number of artifacts you control.
|
SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select two different targets | NumDmg$ X | TargetMin$ 2 | TargetMax$ 2 | TargetUnique$ True | SpellDescription$ CARDNAME deals X damage to any target and X damage to any other target, where X is the number of artifacts you control.
|
||||||
SVar:X:Count$Valid Artifact.YouCtrl
|
SVar:X:Count$Valid Artifact.YouCtrl
|
||||||
|
|||||||
@@ -597,6 +597,7 @@ ScryfallCode=SLD
|
|||||||
618 R Diffusion Sliver @Trevor Claxton
|
618 R Diffusion Sliver @Trevor Claxton
|
||||||
619 R Galerider Sliver @James Zapata
|
619 R Galerider Sliver @James Zapata
|
||||||
620 R Mesmeric Sliver @Michael Bruinsma
|
620 R Mesmeric Sliver @Michael Bruinsma
|
||||||
|
621 R Psionic Sliver @Wayne England
|
||||||
623 R Scuttling Sliver @Mike Bierek
|
623 R Scuttling Sliver @Mike Bierek
|
||||||
624 R Shadow Sliver @Warren Mahy
|
624 R Shadow Sliver @Warren Mahy
|
||||||
626 R Synapse Sliver @Thomas M. Baxa
|
626 R Synapse Sliver @Thomas M. Baxa
|
||||||
|
|||||||
@@ -824,6 +824,7 @@ lblEnchantments=Enchantments
|
|||||||
lblPlaneswalkers=Planeswalkers
|
lblPlaneswalkers=Planeswalkers
|
||||||
lblInstants=Instants
|
lblInstants=Instants
|
||||||
lblSorceries=Sorceries
|
lblSorceries=Sorceries
|
||||||
|
lblBattles=Battles
|
||||||
lblCCMC0=Cards with mana value 0
|
lblCCMC0=Cards with mana value 0
|
||||||
lblCCMC1=Cards with mana value 1
|
lblCCMC1=Cards with mana value 1
|
||||||
lblCCMC2=Cards with mana value 2
|
lblCCMC2=Cards with mana value 2
|
||||||
@@ -1019,7 +1020,7 @@ lblMinimizeScreenLock=Minimize on Screen Lock
|
|||||||
lblOrderGraveyard=Order Graveyard
|
lblOrderGraveyard=Order Graveyard
|
||||||
lblRestartForge=Restart Forge
|
lblRestartForge=Restart Forge
|
||||||
lblRestartForgeDescription=You must restart Forge for this change to take effect.
|
lblRestartForgeDescription=You must restart Forge for this change to take effect.
|
||||||
lblRotateZoomPlanesPhenomena=Rotate Zoom Image of Planes/Phenomena
|
lblRotateZoomPlanesPhenomena=Rotate Zoom Image of Battle/Planes/Phenomena
|
||||||
lblRotateZoomSplit=Rotate Zoom Image of Split Cards
|
lblRotateZoomSplit=Rotate Zoom Image of Split Cards
|
||||||
lblShowAbilityIconsOverlays=Show Ability Icons
|
lblShowAbilityIconsOverlays=Show Ability Icons
|
||||||
lblShowCardIDOverlays=Show Card ID Overlays
|
lblShowCardIDOverlays=Show Card ID Overlays
|
||||||
@@ -1042,7 +1043,7 @@ nlHotSeatMode=When starting a game with 2 human players, use single prompt to co
|
|||||||
nlLandscapeMode=Use landscape (horizontal) orientation for app instead of portrait (vertical).
|
nlLandscapeMode=Use landscape (horizontal) orientation for app instead of portrait (vertical).
|
||||||
nlMinimizeScreenLock=Minimize Forge when screen is locked (enable if you experience graphic glitches after locking your screen).
|
nlMinimizeScreenLock=Minimize Forge when screen is locked (enable if you experience graphic glitches after locking your screen).
|
||||||
nlOrderGraveyard=Determines when to allow to order cards going to graveyard (never/always/only with relevant cards).
|
nlOrderGraveyard=Determines when to allow to order cards going to graveyard (never/always/only with relevant cards).
|
||||||
nlRotateZoomPlanesPhenomena=Rotates the zoomed image of Plane or Phenomenon cards.
|
nlRotateZoomPlanesPhenomena=Rotates the zoomed image of Battle, Plane or Phenomenon cards.
|
||||||
nlRotateZoomSplit=Rotates the zoomed image of split cards.
|
nlRotateZoomSplit=Rotates the zoomed image of split cards.
|
||||||
nlShowAbilityIconsOverlays=Show ability icons for cards, otherwise they''re hidden.
|
nlShowAbilityIconsOverlays=Show ability icons for cards, otherwise they''re hidden.
|
||||||
nlShowCardIDOverlays=Show id overlays for cards, otherwise they''re hidden.
|
nlShowCardIDOverlays=Show id overlays for cards, otherwise they''re hidden.
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 337 KiB After Width: | Height: | Size: 391 KiB |
@@ -97,7 +97,7 @@ public enum GroupDef {
|
|||||||
if (type.isLand()) { //make Artifact Lands appear in Lands group
|
if (type.isLand()) { //make Artifact Lands appear in Lands group
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
if (type.isArtifact() || type.isEnchantment() || type.isPlaneswalker() || type.isInstant() || type.isSorcery()) {
|
if (type.isArtifact() || type.isEnchantment() || type.isPlaneswalker() || type.isInstant() || type.isSorcery() || type.isBattle()) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,7 +106,7 @@ public enum GroupDef {
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
CARD_TYPE("lblType",
|
CARD_TYPE("lblType",
|
||||||
new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land", "Tribal instant" },
|
new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land", "Tribal instant", "Battle" },
|
||||||
new Function<Integer, ColumnDef>() {
|
new Function<Integer, ColumnDef>() {
|
||||||
@Override
|
@Override
|
||||||
public ColumnDef apply(final Integer groupIndex) {
|
public ColumnDef apply(final Integer groupIndex) {
|
||||||
@@ -142,6 +142,9 @@ public enum GroupDef {
|
|||||||
if (type.isEnchantment()) {
|
if (type.isEnchantment()) {
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
|
if (type.isBattle()) {
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
if (type.isLand()) {
|
if (type.isLand()) {
|
||||||
return 6;
|
return 6;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ public final class SItemManagerUtil {
|
|||||||
PLANESWALKER (FSkinProp.IMG_PLANESWALKER, CardRulesPredicates.Presets.IS_PLANESWALKER, "lblPlaneswalkers"),
|
PLANESWALKER (FSkinProp.IMG_PLANESWALKER, CardRulesPredicates.Presets.IS_PLANESWALKER, "lblPlaneswalkers"),
|
||||||
INSTANT (FSkinProp.IMG_INSTANT, CardRulesPredicates.Presets.IS_INSTANT, "lblInstants"),
|
INSTANT (FSkinProp.IMG_INSTANT, CardRulesPredicates.Presets.IS_INSTANT, "lblInstants"),
|
||||||
SORCERY (FSkinProp.IMG_SORCERY, CardRulesPredicates.Presets.IS_SORCERY, "lblSorceries"),
|
SORCERY (FSkinProp.IMG_SORCERY, CardRulesPredicates.Presets.IS_SORCERY, "lblSorceries"),
|
||||||
|
BATTLE (FSkinProp.IMG_BATTLE, CardRulesPredicates.Presets.IS_BATTLE, "lblBattles"),
|
||||||
|
|
||||||
CMC_0 (FSkinProp.IMG_MANA_0, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 0), "lblCCMC0"),
|
CMC_0 (FSkinProp.IMG_MANA_0, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 0), "lblCCMC0"),
|
||||||
CMC_1 (FSkinProp.IMG_MANA_1, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 1), "lblCCMC1"),
|
CMC_1 (FSkinProp.IMG_MANA_1, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 1), "lblCCMC1"),
|
||||||
|
|||||||
@@ -363,6 +363,7 @@ public enum FSkinProp {
|
|||||||
IMG_PLANESWALKER (new int[] {330, 740, 80, 80}, PropType.MANAICONS),
|
IMG_PLANESWALKER (new int[] {330, 740, 80, 80}, PropType.MANAICONS),
|
||||||
IMG_PACK (new int[] {80, 760, 40, 40}, PropType.IMAGE),
|
IMG_PACK (new int[] {80, 760, 40, 40}, PropType.IMAGE),
|
||||||
IMG_SORCERY (new int[] {412, 740, 80, 80}, PropType.MANAICONS),
|
IMG_SORCERY (new int[] {412, 740, 80, 80}, PropType.MANAICONS),
|
||||||
|
IMG_BATTLE (new int[] {330, 822, 80, 80}, PropType.MANAICONS),
|
||||||
IMG_COMMANDER (new int[] {120, 760, 40, 40}, PropType.IMAGE),
|
IMG_COMMANDER (new int[] {120, 760, 40, 40}, PropType.IMAGE),
|
||||||
IMG_ALCHEMY (new int[] {248, 822, 80, 80}, PropType.MANAICONS),
|
IMG_ALCHEMY (new int[] {248, 822, 80, 80}, PropType.MANAICONS),
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user