mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 10:48:00 +00:00
Merge pull request #1906 from Northmoc/ticket
UNF: Tickets initial implementation
This commit is contained in:
@@ -66,6 +66,16 @@ public class CountersPutEffect extends SpellAbilityEffect {
|
||||
}
|
||||
|
||||
stringBuilder.append(pronoun ? "they" : who).append(" ");
|
||||
final String typeName = CounterType.getType(sa.getParam("CounterType")).getName().toLowerCase();
|
||||
|
||||
final List<String> playerCounters = Arrays.asList("energy", "experience", "poison", "ticket");
|
||||
if (playerCounters.contains(typeName)) {
|
||||
stringBuilder.append(pronoun ? "get " : "gets ");
|
||||
stringBuilder.append(Lang.nounWithNumeralExceptOne(AbilityUtils.calculateAmount(card,
|
||||
sa.getParamOrDefault("CounterNum", "1"), sa), typeName + " counter"));
|
||||
stringBuilder.append(".");
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
String desc = sa.getDescription();
|
||||
boolean forEach = desc.contains("for each");
|
||||
@@ -105,7 +115,6 @@ public class CountersPutEffect extends SpellAbilityEffect {
|
||||
stringBuilder.append("up to ");
|
||||
}
|
||||
|
||||
final String typeName = CounterType.getType(sa.getParam("CounterType")).getName().toLowerCase();
|
||||
stringBuilder.append(Lang.nounWithNumeralExceptOne(amount, typeName + " counter"));
|
||||
stringBuilder.append(divAsChoose || divRandom ? " among " : " on ");
|
||||
|
||||
|
||||
@@ -385,6 +385,8 @@ public enum CounterEnumType {
|
||||
|
||||
POISON("POISN"),
|
||||
|
||||
TICKET("TICKET"),
|
||||
|
||||
// Keyword Counters
|
||||
/*
|
||||
FLYING("Flying"),
|
||||
|
||||
@@ -79,6 +79,7 @@ public class VField implements IVDoc<CField> {
|
||||
private final FLabel lblPoison = new FLabel.Builder().fontAlign(SwingConstants.CENTER).fontStyle(Font.BOLD).icon(FSkin.getImage(FSkinProp.IMG_ZONE_POISON)).iconInBackground().build();
|
||||
private final FLabel lblEnergy = new FLabel.Builder().fontAlign(SwingConstants.CENTER).fontStyle(Font.BOLD).icon(FSkin.getImage(FSkinProp.IMG_ENERGY)).iconInBackground().build();
|
||||
private final FLabel lblExperience = new FLabel.Builder().fontAlign(SwingConstants.CENTER).fontStyle(Font.BOLD).icon(FSkin.getImage(FSkinProp.IMG_EXPERIENCE)).iconInBackground().build();
|
||||
private final FLabel lblTicket = new FLabel.Builder().fontAlign(SwingConstants.CENTER).fontStyle(Font.BOLD).icon(FSkin.getImage(FSkinProp.IMG_TICKET)).iconInBackground().build();
|
||||
|
||||
private final PhaseIndicator phaseIndicator = new PhaseIndicator();
|
||||
|
||||
@@ -113,6 +114,7 @@ public class VField implements IVDoc<CField> {
|
||||
lblPoison.setFocusable(false);
|
||||
lblEnergy.setFocusable(false);
|
||||
lblExperience.setFocusable(false);
|
||||
lblTicket.setFocusable(false);
|
||||
|
||||
avatarArea.setOpaque(false);
|
||||
avatarArea.setBackground(FSkin.getColor(FSkin.Colors.CLR_HOVER));
|
||||
@@ -215,12 +217,29 @@ public class VField implements IVDoc<CField> {
|
||||
detailsPanel.updateZones();
|
||||
}
|
||||
|
||||
private void addLblExperience() {
|
||||
if (lblExperience.isShowing() || lblEnergy.isShowing()) {
|
||||
return; // energy takes precedence
|
||||
private void addLblTicket() {
|
||||
if (lblTicket.isShowing() || lblExperience.isShowing() || lblEnergy.isShowing() || lblPoison.isShowing()) {
|
||||
return; // experience, energy, poison take precedence
|
||||
}
|
||||
if (lblExperience.isShowing() || lblPoison.isShowing()) {
|
||||
return; // poison takes precedence
|
||||
avatarArea.remove(lblLife);
|
||||
lblLife.setIcon(FSkin.getImage(FSkinProp.ICO_QUEST_LIFE));
|
||||
avatarArea.add(lblLife, "w 50%!, h 20px!, split 2");
|
||||
avatarArea.add(lblTicket, "w 50%!, h 20px!, wrap");
|
||||
}
|
||||
|
||||
private void removeLblTicket() {
|
||||
if (!lblTicket.isShowing()) {
|
||||
return;
|
||||
}
|
||||
avatarArea.remove(lblTicket);
|
||||
avatarArea.remove(lblLife);
|
||||
avatarArea.add(lblLife, "w 100%!, h 20px!, wrap");
|
||||
}
|
||||
|
||||
|
||||
private void addLblExperience() {
|
||||
if (lblExperience.isShowing() || lblEnergy.isShowing() || lblPoison.isShowing()) {
|
||||
return; // energy and poison take precedence
|
||||
}
|
||||
avatarArea.remove(lblLife);
|
||||
lblLife.setIcon(FSkin.getImage(FSkinProp.ICO_QUEST_LIFE));
|
||||
@@ -288,10 +307,12 @@ public class VField implements IVDoc<CField> {
|
||||
final int poison = player.getCounters(CounterEnumType.POISON);
|
||||
final int energy = player.getCounters(CounterEnumType.ENERGY);
|
||||
final int experience = player.getCounters(CounterEnumType.EXPERIENCE);
|
||||
final int ticket = player.getCounters(CounterEnumType.TICKET);
|
||||
|
||||
if (poison > 0) {
|
||||
removeLblEnergy();
|
||||
removeLblExperience();
|
||||
removeLblTicket();
|
||||
addLblPoison();
|
||||
lblPoison.setText(String.valueOf(poison));
|
||||
if (poison < POISON_CRITICAL) {
|
||||
@@ -305,6 +326,7 @@ public class VField implements IVDoc<CField> {
|
||||
|
||||
if (energy > 0) {
|
||||
removeLblExperience();
|
||||
removeLblTicket();
|
||||
if (poison == 0) {
|
||||
addLblEnergy();
|
||||
lblEnergy.setText(String.valueOf(energy));
|
||||
@@ -314,6 +336,7 @@ public class VField implements IVDoc<CField> {
|
||||
}
|
||||
|
||||
if (experience > 0) {
|
||||
removeLblTicket();
|
||||
if (poison == 0 && energy == 0) {
|
||||
addLblExperience();
|
||||
lblExperience.setText(String.valueOf(experience));
|
||||
@@ -322,6 +345,15 @@ public class VField implements IVDoc<CField> {
|
||||
removeLblExperience();
|
||||
}
|
||||
|
||||
if (ticket > 0) {
|
||||
if (poison == 0 && energy == 0 && experience == 0) {
|
||||
addLblTicket();
|
||||
lblTicket.setText(String.valueOf(ticket));
|
||||
}
|
||||
} else {
|
||||
removeLblTicket();
|
||||
}
|
||||
|
||||
final boolean highlighted = isHighlighted();
|
||||
this.avatarArea.setBorder(highlighted ? borderAvatarHighlighted : borderAvatarSimple );
|
||||
this.avatarArea.setOpaque(highlighted);
|
||||
|
||||
@@ -99,6 +99,7 @@ public class CardFaceSymbols {
|
||||
MANA_IMAGES.put("T", FSkin.getImage(FSkinProp.IMG_TAP));
|
||||
MANA_IMAGES.put("Q", FSkin.getImage(FSkinProp.IMG_UNTAP));
|
||||
MANA_IMAGES.put("E", FSkin.getImage(FSkinProp.IMG_ENERGY, 40, 40));
|
||||
MANA_IMAGES.put("TK", FSkin.getImage(FSkinProp.IMG_TICKET, 40, 40));
|
||||
MANA_IMAGES.put("EXPERIENCE", FSkin.getImage(FSkinProp.IMG_EXPERIENCE, 40, 30));
|
||||
MANA_IMAGES.put("CHAOS", FSkin.getImage(FSkinProp.IMG_CHAOS));
|
||||
MANA_IMAGES.put("slash", FSkin.getImage(FSkinProp.IMG_SLASH));
|
||||
|
||||
@@ -1463,6 +1463,7 @@ public class FSkin {
|
||||
addEncodingSymbol("S", FSkinProp.IMG_MANA_SNOW);
|
||||
addEncodingSymbol("T", FSkinProp.IMG_TAP);
|
||||
addEncodingSymbol("E", FSkinProp.IMG_ENERGY);
|
||||
addEncodingSymbol("TK", FSkinProp.IMG_TICKET);
|
||||
addEncodingSymbol("EXPERIENCE", FSkinProp.IMG_EXPERIENCE);
|
||||
addEncodingSymbol("A-", FSkinProp.IMG_ALCHEMY);
|
||||
|
||||
|
||||
@@ -193,6 +193,7 @@ public enum FSkinImage implements FImage {
|
||||
COUNTERS3 (FSkinProp.IMG_COUNTERS3, SourceFile.ICONS),
|
||||
COUNTERS_MULTI (FSkinProp.IMG_COUNTERS_MULTI, SourceFile.ICONS),
|
||||
ENERGY (FSkinProp.IMG_ENERGY, SourceFile.ICONS),
|
||||
TICKET (FSkinProp.IMG_TICKET, SourceFile.ICONS),
|
||||
|
||||
//Dock Icons
|
||||
SHORTCUTS (FSkinProp.ICO_SHORTCUTS, SourceFile.ICONS),
|
||||
|
||||
@@ -72,6 +72,7 @@ public class TextRenderer {
|
||||
Forge.getAssets().symbolLookup().put("S", FSkinImage.MANA_SNOW);
|
||||
Forge.getAssets().symbolLookup().put("T", FSkinImage.TAP);
|
||||
Forge.getAssets().symbolLookup().put("E", FSkinImage.ENERGY);
|
||||
Forge.getAssets().symbolLookup().put("TK", FSkinImage.TICKET);
|
||||
Forge.getAssets().symbolLookup().put("AE", FSkinImage.AETHER_SHARD);
|
||||
Forge.getAssets().symbolLookup().put("PW", FSkinImage.PW_BADGE_COMMON);
|
||||
Forge.getAssets().symbolLookup().put("CR", FSkinImage.QUEST_COINSTACK);
|
||||
|
||||
@@ -79,6 +79,7 @@ public class CardFaceSymbols {
|
||||
Forge.getAssets().manaImages().put("S", FSkinImage.MANA_SNOW);
|
||||
Forge.getAssets().manaImages().put("T", FSkinImage.TAP);
|
||||
Forge.getAssets().manaImages().put("E", FSkinImage.ENERGY);
|
||||
Forge.getAssets().manaImages().put("TK", FSkinImage.TICKET);
|
||||
Forge.getAssets().manaImages().put("slash", FSkinImage.SLASH);
|
||||
Forge.getAssets().manaImages().put("attack", FSkinImage.ATTACK);
|
||||
Forge.getAssets().manaImages().put("defend", FSkinImage.DEFEND);
|
||||
|
||||
@@ -467,6 +467,7 @@ public class VPlayerPanel extends FContainer {
|
||||
private int poisonCounters = player.getCounters(CounterEnumType.POISON);
|
||||
private int energyCounters = player.getCounters(CounterEnumType.ENERGY);
|
||||
private int experienceCounters = player.getCounters(CounterEnumType.EXPERIENCE);
|
||||
private int ticketCounters = player.getCounters(CounterEnumType.TICKET);
|
||||
private String lifeStr = String.valueOf(life);
|
||||
|
||||
private LifeLabel() {
|
||||
@@ -515,7 +516,7 @@ public class VPlayerPanel extends FContainer {
|
||||
adjustHeight = 1;
|
||||
float divider = Gdx.app.getGraphics().getHeight() > 900 ? 1.2f : 2f;
|
||||
if(Forge.altPlayerLayout && !Forge.altZoneTabs && Forge.isLandscapeMode()) {
|
||||
if (poisonCounters == 0 && energyCounters == 0 && experienceCounters == 0) {
|
||||
if (poisonCounters == 0 && energyCounters == 0 && experienceCounters == 0 && ticketCounters ==0) {
|
||||
g.fillRect(Color.DARK_GRAY, 0, 0, INFO2_FONT.getBounds(lifeStr).width+1, INFO2_FONT.getBounds(lifeStr).height+1);
|
||||
g.drawText(lifeStr, INFO2_FONT, getInfoForeColor().getColor(), 0, 0, getWidth(), getHeight(), false, Align.left, false);
|
||||
} else {
|
||||
@@ -544,6 +545,12 @@ public class VPlayerPanel extends FContainer {
|
||||
g.drawText(String.valueOf(experienceCounters), INFO_FONT, getInfoForeColor().getColor(), textStart, (halfHeight*mod)+2, textWidth, halfHeight, false, Align.left, false);
|
||||
mod+=1;
|
||||
}
|
||||
if (ticketCounters > 0) {
|
||||
g.fillRect(Color.DARK_GRAY, 0, (halfHeight*mod)+2, INFO_FONT.getBounds(String.valueOf(ticketCounters)).width+halfHeight+1, INFO_FONT.getBounds(String.valueOf(ticketCounters)).height+1);
|
||||
g.drawImage(FSkinImage.TICKET, 0, (halfHeight*mod)+2, halfHeight, halfHeight);
|
||||
g.drawText(String.valueOf(ticketCounters), INFO_FONT, getInfoForeColor().getColor(), textStart, (halfHeight*mod)+2, textWidth, halfHeight, false, Align.left, false);
|
||||
mod+=1;
|
||||
}
|
||||
adjustHeight = (mod > 2) && (avatar.getHeight() < halfHeight*mod)? mod : 1;
|
||||
}
|
||||
} else {
|
||||
|
||||
7
forge-gui/res/cardsfolder/upcoming/blorbian_buddy.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/blorbian_buddy.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
Name:Blorbian Buddy
|
||||
ManaCost:G
|
||||
Types:Creature Alien Guest
|
||||
PT:1/1
|
||||
K:Trample
|
||||
A:AB$ PutCounter | Cost$ G T | Defined$ You | CounterType$ TICKET | AILogic$ AtOppEOT | SpellDescription$ You get {TK} (a ticket counter).
|
||||
Oracle:Trample\n{G}, {T}: You get {TK} (a ticket counter).
|
||||
6
forge-gui/res/cardsfolder/upcoming/ticket_turbotubes.txt
Normal file
6
forge-gui/res/cardsfolder/upcoming/ticket_turbotubes.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
Name:Ticket Turbotubes
|
||||
ManaCost:3
|
||||
Types:Artifact
|
||||
A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color.
|
||||
A:AB$ PutCounter | Cost$ 3 T | Defined$ You | CounterType$ TICKET | AILogic$ AtOppEOT | SpellDescription$ You get {TK} (a ticket counter).
|
||||
Oracle:{T}: Add one mana of any color.\n{3}, {T}: You get {TK} (a ticket counter).
|
||||
@@ -59,6 +59,7 @@ Chimera:Chimeras
|
||||
Citizen:Citizens
|
||||
Clamfolk:Clamfolk
|
||||
Cleric:Clerics
|
||||
Clown:Clowns
|
||||
Cockatrice:Cockatrices
|
||||
Construct:Constructs
|
||||
Cow:Cows
|
||||
@@ -116,6 +117,7 @@ Gorgon:Gorgons
|
||||
Graveborn:Graveborn
|
||||
Gremlin:Gremlins
|
||||
Griffin:Griffins
|
||||
Guest:Guests
|
||||
Hag:Hags
|
||||
Halfling:Halflings
|
||||
Hamster:Hamsters
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 463 KiB After Width: | Height: | Size: 1.0 MiB |
@@ -89,6 +89,7 @@ public enum FSkinProp {
|
||||
IMG_HDZONE_MANAPOOL (new int[] {2, 6, 128, 128}, PropType.BUTTONS),
|
||||
|
||||
IMG_ZONE_POISON (new int[] {320, 80, 40, 40}, PropType.IMAGE),
|
||||
IMG_TICKET (new int[] {360, 80, 40, 40}, PropType.IMAGE),
|
||||
|
||||
//mana images
|
||||
IMG_MANA_B (new int[] {166, 2, 80, 80}, PropType.MANAICONS),
|
||||
|
||||
Reference in New Issue
Block a user