mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-12 16:58:57 +00:00
Add Paliano Vanguard
This commit is contained in:
@@ -2113,6 +2113,14 @@ public class CardProperty {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return names.contains(card.getName());
|
return names.contains(card.getName());
|
||||||
|
} else if (property.equals("NotedTypes")) {
|
||||||
|
String types = sourceController.getDraftNotes().get(spellAbility.getHostCard().getName());
|
||||||
|
if (types == null || types.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
List<String> typeList = Lists.newArrayList(types.split(","));
|
||||||
|
|
||||||
|
return Iterables.any(card.getType().getCreatureTypes(), typeList::contains);
|
||||||
} else if (property.startsWith("Triggered")) {
|
} else if (property.startsWith("Triggered")) {
|
||||||
if (spellAbility instanceof SpellAbility) {
|
if (spellAbility instanceof SpellAbility) {
|
||||||
final String key = property.substring(9);
|
final String key = property.substring(9);
|
||||||
|
|||||||
8
forge-gui/res/cardsfolder/p/paliano_vanguard.txt
Normal file
8
forge-gui/res/cardsfolder/p/paliano_vanguard.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Name:Paliano Vanguard
|
||||||
|
ManaCost:1 W
|
||||||
|
Types:Creature Human Soldier
|
||||||
|
PT:2/2
|
||||||
|
Draft:Draft CARDNAME face up.
|
||||||
|
Draft:As you draft a creature card, you may reveal it, note its creature types, then turn CARDNAME face down.
|
||||||
|
S:Mode$ Continuous | Affected$ Creature.Other+NotedTypes+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other creatures you control of a type you noted for cards named Paliano Vanguard get +1/+1.
|
||||||
|
Oracle:Draft Paliano Vanguard face up.\nAs you draft a creature card, you may reveal it, note its creature types, then turn Paliano Vanguard face down.\nOther creatures you control of a type you noted for cards named Paliano Vanguard get +1/+1.
|
||||||
@@ -249,6 +249,7 @@ Hymn of the Wilds
|
|||||||
Incendiary Dissent
|
Incendiary Dissent
|
||||||
Natural Unity
|
Natural Unity
|
||||||
Noble Banneret
|
Noble Banneret
|
||||||
|
Paliano Vanguard
|
||||||
Pyretic Hunter
|
Pyretic Hunter
|
||||||
Sovereign's Realm
|
Sovereign's Realm
|
||||||
Summoner's Bond
|
Summoner's Bond
|
||||||
|
|||||||
@@ -30,9 +30,10 @@ public class LimitedPlayer {
|
|||||||
private static final int CanTradeAfterDraft = 1 << 4;
|
private static final int CanTradeAfterDraft = 1 << 4;
|
||||||
private static final int AnimusRemoveFromPool = 1 << 5;
|
private static final int AnimusRemoveFromPool = 1 << 5;
|
||||||
private static final int NobleBanneretActive = 1 << 6;
|
private static final int NobleBanneretActive = 1 << 6;
|
||||||
|
private static final int PalianoVanguardActive = 1 << 7;
|
||||||
|
|
||||||
private static final int MAXFLAGS = CantDraftThisRound | ReceiveLastCard | CanRemoveAfterDraft | SpyNextCardDrafted
|
private static final int MAXFLAGS = CantDraftThisRound | ReceiveLastCard | CanRemoveAfterDraft | SpyNextCardDrafted
|
||||||
| CanTradeAfterDraft | AnimusRemoveFromPool | NobleBanneretActive;
|
| CanTradeAfterDraft | AnimusRemoveFromPool | NobleBanneretActive | PalianoVanguardActive;
|
||||||
|
|
||||||
private int playerFlags = 0;
|
private int playerFlags = 0;
|
||||||
|
|
||||||
@@ -103,14 +104,15 @@ public class LimitedPlayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
alreadyRevealed |= handleNobleBanneret(bestPick);
|
alreadyRevealed |= handleNobleBanneret(bestPick);
|
||||||
|
alreadyRevealed |= handlePalianoVanguard(bestPick);
|
||||||
|
|
||||||
|
Iterable<String> draftActions = bestPick.getRules().getMainPart().getDraftActions();
|
||||||
if (bestPick.getRules().getMainPart().getDraftActions() == null) {
|
if (draftActions == null || !draftActions.iterator().hasNext()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draft Actions
|
// Draft Actions
|
||||||
Iterable<String> draftActions = bestPick.getRules().getMainPart().getDraftActions();
|
|
||||||
if (Iterables.contains(draftActions, "Reveal CARDNAME as you draft it.")) {
|
if (Iterables.contains(draftActions, "Reveal CARDNAME as you draft it.")) {
|
||||||
if (!alreadyRevealed) {
|
if (!alreadyRevealed) {
|
||||||
revealed.add(bestPick);
|
revealed.add(bestPick);
|
||||||
@@ -165,11 +167,9 @@ public class LimitedPlayer {
|
|||||||
playerFlags |= AnimusRemoveFromPool;
|
playerFlags |= AnimusRemoveFromPool;
|
||||||
} else if (Iterables.contains(draftActions, "As you draft a creature card, you may reveal it, note its name, then turn CARDNAME face down.")) {
|
} else if (Iterables.contains(draftActions, "As you draft a creature card, you may reveal it, note its name, then turn CARDNAME face down.")) {
|
||||||
playerFlags |= NobleBanneretActive;
|
playerFlags |= NobleBanneretActive;
|
||||||
|
} else if (Iterables.contains(draftActions, "As you draft a creature card, you may reveal it, note its creature types, then turn CARDNAME face down.")) {
|
||||||
|
playerFlags |= PalianoVanguardActive;
|
||||||
}
|
}
|
||||||
// As you draft a VALID, you may remove it face up. (It's no longer in your draft pool)
|
|
||||||
// TODO We need a deck section that's not your sideboard but is your cardpool?
|
|
||||||
// Keyword absorption: If creature is absorbed, it gains all the abilities of the creature it absorbed. This includes
|
|
||||||
// flying, first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, reach, and vigilance.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note who passed it to you. (Either player before you in draft passing order except if you receive the last card
|
// Note who passed it to you. (Either player before you in draft passing order except if you receive the last card
|
||||||
@@ -222,13 +222,17 @@ public class LimitedPlayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected boolean removeWithAnimus(PaperCard bestPick) {
|
protected boolean removeWithAnimus(PaperCard bestPick) {
|
||||||
return SGuiChoose.one("Remove this " + bestPick + " from the draft for ANnimus of Predation?", Lists.newArrayList("Yes", "No")).equals("Yes");
|
return SGuiChoose.one("Remove this " + bestPick + " from the draft for Animus of Predation?", Lists.newArrayList("Yes", "No")).equals("Yes");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean revealWithBanneret(PaperCard bestPick) {
|
protected boolean revealWithBanneret(PaperCard bestPick) {
|
||||||
return SGuiChoose.one("Reveal this " + bestPick + " for Noble Banneret?", Lists.newArrayList("Yes", "No")).equals("Yes");
|
return SGuiChoose.one("Reveal this " + bestPick + " for Noble Banneret?", Lists.newArrayList("Yes", "No")).equals("Yes");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected boolean revealWithVanguard(PaperCard bestPick) {
|
||||||
|
return SGuiChoose.one("Reveal this " + bestPick + " for Paliano Vanguard?", Lists.newArrayList("Yes", "No")).equals("Yes");
|
||||||
|
}
|
||||||
|
|
||||||
public String name() {
|
public String name() {
|
||||||
if (this instanceof LimitedPlayerAI) {
|
if (this instanceof LimitedPlayerAI) {
|
||||||
return "Player[" + order + "]";
|
return "Player[" + order + "]";
|
||||||
@@ -353,6 +357,55 @@ public class LimitedPlayer {
|
|||||||
return alreadyRevealed;
|
return alreadyRevealed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean handlePalianoVanguard(PaperCard bestPick) {
|
||||||
|
boolean alreadyRevealed = false;
|
||||||
|
if ((playerFlags & PalianoVanguardActive) != PalianoVanguardActive) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bestPick.getRules().getType().isCreature()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean remaining = false;
|
||||||
|
PaperCard found = null;
|
||||||
|
|
||||||
|
for(PaperCard c : faceUp) {
|
||||||
|
if (c.getName().equals("Paliano Vanguard")) {
|
||||||
|
if (found == null) {
|
||||||
|
found = c;
|
||||||
|
} else {
|
||||||
|
remaining = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found == null) {
|
||||||
|
playerFlags &= ~PalianoVanguardActive;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!revealWithVanguard(bestPick)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// As you draft a creature card, you may reveal it, note its name, then turn CARDNAME face down.
|
||||||
|
List<String> note = noted.computeIfAbsent(found.getName(), k -> Lists.newArrayList());
|
||||||
|
revealed.add(bestPick);
|
||||||
|
note.addAll(bestPick.getRules().getType().getCreatureTypes());
|
||||||
|
addLog(name() + " revealed " + bestPick.getName() + " and noted - " + TextUtil.join(bestPick.getRules().getType().getCreatureTypes(), ",") + " for Paliano Vanguard.");
|
||||||
|
addLog(name() + " has flipped Paliano Vanguard face down.");
|
||||||
|
alreadyRevealed = true;
|
||||||
|
|
||||||
|
faceUp.remove(found);
|
||||||
|
|
||||||
|
if (!remaining) {
|
||||||
|
playerFlags &= ~PalianoVanguardActive;
|
||||||
|
}
|
||||||
|
return alreadyRevealed;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public void addSingleBoosterPack(boolean random) {
|
public void addSingleBoosterPack(boolean random) {
|
||||||
// TODO Lore Seeker
|
// TODO Lore Seeker
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import forge.localinstance.properties.ForgePreferences;
|
|||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class LimitedPlayerAI extends LimitedPlayer {
|
public class LimitedPlayerAI extends LimitedPlayer {
|
||||||
protected DeckColors deckCols;
|
protected DeckColors deckCols;
|
||||||
@@ -91,4 +92,23 @@ public class LimitedPlayerAI extends LimitedPlayer {
|
|||||||
List<String> nobleBanneret = getDraftNotes().getOrDefault("Noble Banneret", null);
|
List<String> nobleBanneret = getDraftNotes().getOrDefault("Noble Banneret", null);
|
||||||
return nobleBanneret == null || !nobleBanneret.contains(bestPick.getName());
|
return nobleBanneret == null || !nobleBanneret.contains(bestPick.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean revealWithVanguard(PaperCard bestPick) {
|
||||||
|
// Just choose the first creature that we haven't noted types of yet.
|
||||||
|
// This is a very simple heuristic, but it's good enough for now.
|
||||||
|
if (!bestPick.getRules().getType().isCreature()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> notedTypes = getDraftNotes().getOrDefault("Paliano Vanguard", null);
|
||||||
|
|
||||||
|
Set<String> types = bestPick.getRules().getType().getCreatureTypes();
|
||||||
|
|
||||||
|
if (notedTypes == null || types.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return types.containsAll(notedTypes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user