Tinybones, the Pickpocket and support (#4806)

* Tinybones, the Pickpocket and support

* Remove duplicated text
This commit is contained in:
tool4ever
2024-03-13 06:42:24 +01:00
committed by GitHub
parent f57eb7a3dc
commit 99040ad496
8 changed files with 34 additions and 28 deletions

View File

@@ -677,7 +677,10 @@ public class ComputerUtilMana {
AbilityUtils.applyManaColorConversion(manapool, sa.getGrantorStatic().getParam("ManaConversion")); AbilityUtils.applyManaColorConversion(manapool, sa.getGrantorStatic().getParam("ManaConversion"));
} }
} }
StaticAbilityManaConvert.manaConvert(manapool, ai, sa.getHostCard(), effect ? null : sa); if (sa.hasParam("ManaConversion")) {
AbilityUtils.applyManaColorConversion(manapool, sa.getParam("ManaConversion"));
}
StaticAbilityManaConvert.manaConvert(manapool, ai, sa.getHostCard(), effect && !sa.isCastFromPlayEffect() ? null : sa);
if (ManaPool.payManaCostFromPool(cost, sa, ai, test, manaSpentToPay)) { if (ManaPool.payManaCostFromPool(cost, sa, ai, test, manaSpentToPay)) {
return true; // paid all from floating mana return true; // paid all from floating mana

View File

@@ -432,6 +432,10 @@ public class PlayEffect extends SpellAbilityEffect {
tgtSA.putParam("CastTransformed", "True"); tgtSA.putParam("CastTransformed", "True");
} }
if (sa.hasParam("ManaConversion")) {
tgtSA.putParam("ManaConversion", sa.getParam("ManaConversion"));
}
if (tgtSA.usesTargeting() && !optional) { if (tgtSA.usesTargeting() && !optional) {
tgtSA.getTargetRestrictions().setMandatory(true); tgtSA.getTargetRestrictions().setMandatory(true);
} }

View File

@@ -797,13 +797,6 @@ public class CardView extends GameEntityView {
sb.append(getRemembered()); sb.append(getRemembered());
PlayerView chosenPlayer = getChosenPlayer();
if (chosenPlayer != null) {
sb.append("\r\n[Chosen player: ");
sb.append(chosenPlayer);
sb.append("]\r\n");
}
Direction chosenDirection = getChosenDirection(); Direction chosenDirection = getChosenDirection();
if (chosenDirection != null) { if (chosenDirection != null) {
sb.append("\r\n[Chosen direction: "); sb.append("\r\n[Chosen direction: ");
@@ -837,7 +830,6 @@ public class CardView extends GameEntityView {
sb.append(" each combat."); sb.append(" each combat.");
sb.append("\r\n"); sb.append("\r\n");
} }
} }
Set<String> cantHaveKeyword = this.getCantHaveKeyword(); Set<String> cantHaveKeyword = this.getCantHaveKeyword();

View File

@@ -3,11 +3,9 @@ ManaCost:2 R
Types:Creature Insect Types:Creature Insect
PT:2/2 PT:2/2
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRepeat | TriggerDescription$ At the beginning of your end step, each player may put two +1/+1 counters on a creature they control. Goad each creature that had counters put on it this way. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRepeat | TriggerDescription$ At the beginning of your end step, each player may put two +1/+1 counters on a creature they control. Goad each creature that had counters put on it this way. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.)
SVar:TrigRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoice | SubAbility$ DBPutCounter SVar:DBChoice:DB$ ChooseCard | Defined$ Player | Amount$ 1 | MinAmount$ 0 | Choices$ Creature | ControlledByPlayer$ Chooser | SubAbility$ DBPutCounter
SVar:DBChoice:DB$ ChooseCard | Defined$ RememberedPlayer | Amount$ 1 | MinAmount$ 0 | Choices$ Creature.RememberedPlayerCtrl | ImprintChosen$ True SVar:DBPutCounter:DB$ PutCounterAll | Placer$ Controller | ValidCards$ Creature.ChosenCard | CounterType$ P1P1 | CounterNum$ 2 | RememberPut$ True | SubAbility$ DBGoad
SVar:DBPutCounter:DB$ PutCounterAll | Placer$ Controller | ValidCards$ Creature.IsImprinted | CounterType$ P1P1 | CounterNum$ 2 | RememberPut$ True | SubAbility$ DBClearChosen
SVar:DBClearChosen:DB$ Cleanup | ClearChosenCard$ True | ClearImprinted$ True | SubAbility$ DBGoad
SVar:DBGoad:DB$ Goad | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBGoad:DB$ Goad | Defined$ Remembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
DeckHas:Ability$Counters DeckHas:Ability$Counters
Oracle:At the beginning of your end step, each player may put two +1/+1 counters on a creature they control. Goad each creature that had counters put on it this way. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) Oracle:At the beginning of your end step, each player may put two +1/+1 counters on a creature they control. Goad each creature that had counters put on it this way. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.)

View File

@@ -4,9 +4,9 @@ Types:Legendary Creature Orc
PT:2/4 PT:2/4
K:Choose a Background K:Choose a Background
S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | AddType$ Cleric & Rogue & Warrior & Wizard | Description$ CARDNAME is also a Cleric, Rogue, Warrior, and Wizard. S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | AddType$ Cleric & Rogue & Warrior & Wizard | Description$ CARDNAME is also a Cleric, Rogue, Warrior, and Wizard.
T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME attacks, defending player loses X life T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever NICKNAME attacks, defending player loses X life and you create X Treasure tokens, where X is the number of creatures in your party.
SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredDefendingPlayer | LifeAmount$ X | SubAbility$ DBTreasureTokens SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredDefendingPlayer | LifeAmount$ X | SubAbility$ DBTreasureTokens
SVar:DBTreasureTokens:DB$ Token | TokenAmount$ X | TokenScript$ c_a_treasure_sac | TokenOwner$ You | Description$ and you create X Treasure tokens, where X is the number of creatures in your party. SVar:DBTreasureTokens:DB$ Token | TokenAmount$ X | TokenScript$ c_a_treasure_sac | TokenOwner$ You
SVar:X:Count$Party SVar:X:Count$Party
DeckHints:Ability$Party & Type$Cleric|Rogue|Warrior|Wizard DeckHints:Ability$Party & Type$Cleric|Rogue|Warrior|Wizard
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE

View File

@@ -3,12 +3,9 @@ ManaCost:2 W
Types:Creature Human Advisor Types:Creature Human Advisor
PT:1/4 PT:1/4
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. If a player does, creatures that player controls can't attack you or planeswalkers you control until your next turn. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. If a player does, creatures that player controls can't attack you or planeswalkers you control until your next turn.
SVar:TrigChoose:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoice | SubAbility$ DBPutCounter SVar:TrigChoose:DB$ ChooseCard | Defined$ Player | Amount$ 1 | MinAmount$ 0 | Choices$ Creature | ControlledByPlayer$ Chooser | AILogic$ OrzhovAdvokist | SubAbility$ DBPutCounter
SVar:DBChoice:DB$ ChooseCard | Defined$ Player.IsRemembered | Amount$ 1 | MinAmount$ 0 | Choices$ Creature.RememberedPlayerCtrl | RememberChosen$ True | AILogic$ OrzhovAdvokist SVar:DBPutCounter:DB$ PutCounterAll | Placer$ Controller | ValidCards$ Creature.ChosenCard | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBEffect
SVar:DBPutCounter:DB$ PutCounterAll | Placer$ Controller | ValidCards$ Creature.IsRemembered | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBClearChosen SVar:DBEffect:DB$ Effect | RememberObjects$ ChosenCardController | StaticAbilities$ STCantAttack | Duration$ UntilYourNextTurn | SubAbility$ DBClearChosen
SVar:DBClearChosen:DB$ Cleanup | ClearChosenCard$ True | SubAbility$ DBRememberPlayer SVar:DBClearChosen:DB$ Cleanup | ClearChosenCard$ True
SVar:DBRememberPlayer:DB$ Pump | RememberObjects$ RememberedController | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ Player.IsRemembered | StaticAbilities$ STCantAttack | Duration$ UntilYourNextTurn | SubAbility$ DBCleanup
SVar:STCantAttack:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.RememberedPlayerCtrl | Target$ You,Planeswalker.YouCtrl | Description$ Creatures that player controls can't attack you or planeswalkers you control until your next turn. SVar:STCantAttack:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.RememberedPlayerCtrl | Target$ You,Planeswalker.YouCtrl | Description$ Creatures that player controls can't attack you or planeswalkers you control until your next turn.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:At the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. If a player does, creatures that player controls can't attack you or planeswalkers you control until your next turn. Oracle:At the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. If a player does, creatures that player controls can't attack you or planeswalkers you control until your next turn.

View File

@@ -0,0 +1,8 @@
Name:Tinybones, the Pickpocket
ManaCost:B
Types:Legendary Creature Skeleton Rogue
PT:1/1
K:Deathtouch
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigCast | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may cast target nonland permanent card from that player's graveyard, and mana of any type can be spent to cast that spell.
SVar:TrigCast:DB$ Play | ValidTgts$ Permanent.nonLand+ControlledBy TriggeredTarget | TgtZone$ Graveyard | ValidSA$ Spell | Optional$ True | ManaConversion$ AnyType->AnyType
Oracle:Deathtouch\nWhenever Tinybones, the Pickpocket deals combat damage to a player, you may cast target nonland permanent card from that player's graveyard, and mana of any type can be spent to cast that spell.

View File

@@ -97,8 +97,6 @@ public class HumanPlaySpellAbility {
final Card c = ability.getHostCard(); final Card c = ability.getHostCard();
final CardPlayOption option = c.mayPlay(ability.getMayPlay()); final CardPlayOption option = c.mayPlay(ability.getMayPlay());
boolean manaColorConversion = false;
// freeze Stack. No abilities should go onto the stack while I'm filling requirements. // freeze Stack. No abilities should go onto the stack while I'm filling requirements.
boolean refreeze = game.getStack().isFrozen(); boolean refreeze = game.getStack().isFrozen();
game.getStack().freezeStack(); game.getStack().freezeStack();
@@ -119,12 +117,13 @@ public class HumanPlaySpellAbility {
ability = GameActionUtil.addExtraKeywordCost(ability); ability = GameActionUtil.addExtraKeywordCost(ability);
final boolean playerManaConversion = human.hasManaConversion()
&& human.getController().confirmStaticApplication(c, null, "Do you want to spend mana as though it were mana of any type to pay the cost?", null);
Cost abCost = ability.getPayCosts(); Cost abCost = ability.getPayCosts();
CostPayment payment = new CostPayment(abCost, ability); CostPayment payment = new CostPayment(abCost, ability);
final boolean playerManaConversion = human.hasManaConversion()
&& human.getController().confirmStaticApplication(c, null, "Do you want to spend mana as though it were mana of any type to pay the cost?", null);
boolean manaColorConversion = false;
if (!ability.isCopied()) { if (!ability.isCopied()) {
if (ability.isSpell()) { // Apply by Option if (ability.isSpell()) { // Apply by Option
if (option != null && option.applyManaConvert(payment)) { if (option != null && option.applyManaConvert(payment)) {
@@ -144,6 +143,11 @@ public class HumanPlaySpellAbility {
if (StaticAbilityManaConvert.manaConvert(payment, human, ability.getHostCard(), ability)) { if (StaticAbilityManaConvert.manaConvert(payment, human, ability.getHostCard(), ability)) {
manaColorConversion = true; manaColorConversion = true;
} }
if (ability.hasParam("ManaConversion")) {
AbilityUtils.applyManaColorConversion(manapool, ability.getParam("ManaConversion"));
manaColorConversion = true;
}
} }
if (playerManaConversion) { if (playerManaConversion) {