Adventure updates

Adventure items can now spawn cards in command zone via startBattleWithCardInCommandZone - Updated Mana Shard based items to do so.

Added new map objects:  Mana Shard rewards, generic collision zone, intended for use in upcoming map updates.

Fixed mismatched wall tile in green castle.
This commit is contained in:
jjayers99
2023-02-17 23:15:46 -05:00
parent c12998a783
commit d8d18acfef
17 changed files with 125 additions and 20 deletions

View File

@@ -15,7 +15,7 @@ import java.util.Arrays;
public class RewardEdit extends FormPanel { public class RewardEdit extends FormPanel {
RewardData currentData; RewardData currentData;
JComboBox typeField =new JComboBox(new String[] { "card", "gold", "life", "deckCard", "item","mana"}); JComboBox typeField =new JComboBox(new String[] { "card", "gold", "life", "deckCard", "item","shards"});
JSpinner probability = new JSpinner(new SpinnerNumberModel(0f, 0, 1, 0.1f)); JSpinner probability = new JSpinner(new SpinnerNumberModel(0f, 0, 1, 0.1f));
JSpinner count = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1)); JSpinner count = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1));
JSpinner addMaxCount = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1)); JSpinner addMaxCount = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1));

View File

@@ -2891,6 +2891,16 @@ public class Player extends GameEntity implements Comparable<Player> {
com.add(conspire); com.add(conspire);
} }
// Adventure Mode items
Iterable<? extends IPaperCard> adventureItemCards = registeredPlayer.getExtraCardsInCommandZone();
if (adventureItemCards != null) {
for (final IPaperCard cp : adventureItemCards) {
Card c = Card.fromPaperCard(cp, this);
com.add(c);
c.setStartsGameInPlay(true);
}
}
for (final Card c : getCardsIn(ZoneType.Library)) { for (final Card c : getCardsIn(ZoneType.Library)) {
for (KeywordInterface inst : c.getKeywords()) { for (KeywordInterface inst : c.getKeywords()) {
String kw = inst.getOriginal(); String kw = inst.getOriginal();

View File

@@ -29,6 +29,7 @@ public class RegisteredPlayer {
private int manaShards = 0; private int manaShards = 0;
private Iterable<IPaperCard> cardsOnBattlefield = null; private Iterable<IPaperCard> cardsOnBattlefield = null;
private Iterable<IPaperCard> extraCardsOnBattlefield = null; private Iterable<IPaperCard> extraCardsOnBattlefield = null;
private Iterable<IPaperCard> extraCardsInCommandZone = null;
private Iterable<? extends IPaperCard> schemes = null; private Iterable<? extends IPaperCard> schemes = null;
private Iterable<PaperCard> planes = null; private Iterable<PaperCard> planes = null;
private Iterable<PaperCard> conspiracies = null; private Iterable<PaperCard> conspiracies = null;
@@ -56,6 +57,10 @@ public class RegisteredPlayer {
extraCardsOnBattlefield == null ? EmptyList : extraCardsOnBattlefield); extraCardsOnBattlefield == null ? EmptyList : extraCardsOnBattlefield);
} }
public final Iterable<? extends IPaperCard> getExtraCardsInCommandZone() {
return extraCardsInCommandZone == null ? EmptyList : extraCardsInCommandZone;
}
public final void setStartingLife(int startingLife) { public final void setStartingLife(int startingLife) {
this.startingLife = startingLife; this.startingLife = startingLife;
} }
@@ -86,6 +91,13 @@ public class RegisteredPlayer {
this.extraCardsOnBattlefield = Iterables.concat(this.extraCardsOnBattlefield, extraCardsonTable); this.extraCardsOnBattlefield = Iterables.concat(this.extraCardsOnBattlefield, extraCardsonTable);
} }
public final void addExtraCardsInCommandZone(Iterable<IPaperCard> extraCardsInCommandZone) {
if (this.extraCardsInCommandZone == null)
this.extraCardsInCommandZone = extraCardsInCommandZone;
else
this.extraCardsInCommandZone = Iterables.concat(this.extraCardsInCommandZone, extraCardsInCommandZone);
}
public int getStartingHand() { public int getStartingHand() {
return startingHand; return startingHand;
} }

View File

@@ -14,6 +14,7 @@ public class EffectData implements Serializable {
public int lifeModifier = 0; //Amount to add to starting Life. public int lifeModifier = 0; //Amount to add to starting Life.
public int changeStartCards = 0; //Amount to add to starting hand size. public int changeStartCards = 0; //Amount to add to starting hand size.
public String[] startBattleWithCard; //Cards that start in the Battlefield. public String[] startBattleWithCard; //Cards that start in the Battlefield.
public String[] startBattleWithCardInCommandZone; //Cards that start in the Command Zone of the Battlefield.
//Map only effects. //Map only effects.
public boolean colorView = false; //Allows to display enemy colors on the map. public boolean colorView = false; //Allows to display enemy colors on the map.
public float moveSpeed = 1.0f; //Change of movement speed. Map only. public float moveSpeed = 1.0f; //Change of movement speed. Map only.
@@ -52,6 +53,23 @@ public class EffectData implements Serializable {
return startCards; return startCards;
} }
public Array<IPaperCard> startBattleWithCardsInCommandZone(){
Array<IPaperCard> startCardsInCommandZone=new Array<>();
if(startBattleWithCardInCommandZone != null) {
for (String name:startBattleWithCardInCommandZone) {
PaperCard C = FModel.getMagicDb().getCommonCards().getCard(name);
if(C != null)
startCardsInCommandZone.add(C);
else {
PaperToken T = FModel.getMagicDb().getAllTokens().getToken(name);
if (T != null) startCardsInCommandZone.add(T);
else System.err.print("Can not find card \"" + name + "\"\n");
}
}
}
return startCardsInCommandZone;
}
public String cardNames() { public String cardNames() {
StringBuilder ret = new StringBuilder(); StringBuilder ret = new StringBuilder();
Array<IPaperCard> array=startBattleWithCards(); Array<IPaperCard> array=startBattleWithCards();

View File

@@ -20,6 +20,7 @@ import forge.assets.FBufferedImage;
import forge.assets.FSkin; import forge.assets.FSkin;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckProxy; import forge.deck.DeckProxy;
import forge.deck.DeckSection;
import forge.game.GameRules; import forge.game.GameRules;
import forge.game.GameType; import forge.game.GameType;
import forge.game.card.CounterEnumType; import forge.game.card.CounterEnumType;
@@ -167,14 +168,19 @@ public class DuelScene extends ForgeScene {
int changeStartCards = 0; int changeStartCards = 0;
int extraManaShards = 0; int extraManaShards = 0;
Array<IPaperCard> startCards = new Array<>(); Array<IPaperCard> startCards = new Array<>();
Array<IPaperCard> startCardsInCommandZone = new Array<>();
for (EffectData data : effects) { for (EffectData data : effects) {
lifeMod += data.lifeModifier; lifeMod += data.lifeModifier;
changeStartCards += data.changeStartCards; changeStartCards += data.changeStartCards;
startCards.addAll(data.startBattleWithCards()); startCards.addAll(data.startBattleWithCards());
startCardsInCommandZone.addAll(data.startBattleWithCardsInCommandZone());
extraManaShards += data.extraManaShards; extraManaShards += data.extraManaShards;
} }
player.addExtraCardsOnBattlefield(startCards); player.addExtraCardsOnBattlefield(startCards);
player.addExtraCardsInCommandZone(startCardsInCommandZone);
player.setStartingLife(Math.max(1, lifeMod + player.getStartingLife())); player.setStartingLife(Math.max(1, lifeMod + player.getStartingLife()));
player.setStartingHand(player.getStartingHand() + changeStartCards); player.setStartingHand(player.getStartingHand() + changeStartCards);
player.setManaShards((player.getManaShards() + extraManaShards)); player.setManaShards((player.getManaShards() + extraManaShards));

View File

@@ -3,6 +3,7 @@ ManaCost:no cost
Types:Artifact Types:Artifact
S:Mode$ Continuous | Description$ Provided by Cursed Treasure (Equipped Item - Right) S:Mode$ Continuous | Description$ Provided by Cursed Treasure (Equipped Item - Right)
StackDescription$ Create a Treasure token. You lose 2 life. | SpellDescription$ Create a Treasure token. You lose 2 life. StackDescription$ Create a Treasure token. You lose 2 life. | SpellDescription$ Create a Treasure token. You lose 2 life.
A:AB$ Token | Cost$ PayShards<1> Sac<1/CARDNAME> | TokenScript$ c_a_treasure_sac | SubAbility$ DBLoseLife2 | SpellDescription$ Create a Treasure token. A:AB$ Token | Cost$ PayShards<1> T | ActivationZone$ Command | TokenScript$ c_a_treasure_sac | SubAbility$ DBLoseLife2 | SubAbility$ Eject | SpellDescription$ Create a Treasure token.
SVar:DBLoseLife2:DB$ LoseLife | LifeAmount$ 2 | Defined$ You SVar:DBLoseLife2:DB$ LoseLife | LifeAmount$ 2 | Defined$ You
Oracle: Provided by Cursed Treasure. Pay {M}, sacrifice Cursed Treasure: Create a Treasure token. You lose 2 life. Oracle:Pay {M}, exile Cursed Treasure: Create a Treasure token. You lose 2 life.
SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile

View File

@@ -2,5 +2,6 @@ Name:Farmer's Tools
ManaCost:no cost ManaCost:no cost
Types:Artifact Types:Artifact
S:Mode$ Continuous | Description$ Provided by Farmer's Tools (Equipped Item - Left) S:Mode$ Continuous | Description$ Provided by Farmer's Tools (Equipped Item - Left)
A:AB$ ChangeZone | Cost$ PayShards<2> Sac<1/CARDNAME> | ExileOnMoved$ Battlefield | Optional$ True | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | DefinedPlayer$ Player | ChangeNum$ 1 | StackDescription$ Each player may put a land card from their hand onto the battlefield. A:AB$ ChangeZone | Cost$ PayShards<2> T | ActivationZone$ Command | SubAbility$ Eject | ExileOnMoved$ Battlefield | Optional$ True | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | DefinedPlayer$ Player | ChangeNum$ 1 | StackDescription$ Each player may put a land card from their hand onto the battlefield.
Oracle: Provided by Farmer's Tools. Pay {M}{M}, sacrifice Farmer's Tools: Starting with you, each player may place a land card from their hand onto the battlefield. Oracle: Pay {M}{M}, exile Farmer's Tools: Starting with you, each player may place a land card from their hand onto the battlefield.
SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile

View File

@@ -2,9 +2,7 @@ Name:Hill Giant Club
ManaCost:no cost ManaCost:no cost
Types:Artifact Types:Artifact
S:Mode$ Continuous | Description$ Provided by Hill Giant Club (Equipped Item - Right) S:Mode$ Continuous | Description$ Provided by Hill Giant Club (Equipped Item - Right)
A:AB$ Effect | Cost$ PayShards<2> Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ExileOnMoved$ Battlefield | StaticAbilities$ UnblockableLE2 | RememberObjects$ Targeted | StackDescription$ {c:Targeted} can't be blocked by creatures with power 2 or less this turn. | SpellDescription$ Targe creature can't be blocked by creatures with power 2 or less this turn. A:AB$ Effect | Cost$ PayShards<2> T | ActivationZone$ Command | SubAbility$ Eject | ValidTgts$ Creature | TgtPrompt$ Select target creature | ExileOnMoved$ Battlefield | StaticAbilities$ UnblockableLE2 | RememberObjects$ Targeted | StackDescription$ {c:Targeted} can't be blocked by creatures with power 2 or less this turn. | SpellDescription$ Targe creature can't be blocked by creatures with power 2 or less this turn.
SVar:UnblockableLE2:Mode$ CantBlockBy | ValidAttacker$ Card.IsRemembered | ValidBlocker$ Creature.powerLE2 | Description$ {c:Targeted} can't be blocked by creatures with power 2 or less this turn. SVar:UnblockableLE2:Mode$ CantBlockBy | ValidAttacker$ Card.IsRemembered | ValidBlocker$ Creature.powerLE2 | Description$ {c:Targeted} can't be blocked by creatures with power 2 or less this turn.
Oracle: Provided by Hill Giant Club. Pay {M}{M}, sacrifice Hill Giant Club: Target creature can't be blocked by creatures with power 2 or less this turn. Oracle: Pay {M}{M}, exile Hill Giant Club: Target creature can't be blocked by creatures with power 2 or less this turn.
SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile

View File

@@ -2,6 +2,7 @@ Name:Piper's Charm
ManaCost:no cost ManaCost:no cost
Types:Artifact Types:Artifact
S:Mode$ Continuous | Description$ Provided by Piper's Charm (Equipped Item - Neck) S:Mode$ Continuous | Description$ Provided by Piper's Charm (Equipped Item - Neck)
A:AB$ Effect | Cost$ PayShards<3> Sac<1/CARDNAME> | ValidTgts$ Creature | ExileOnMoved$ Battlefield | StaticAbilities$ MustBlock | RememberObjects$ Targeted | StackDescription$ {c:Targeted} blocks this turn if able. | SpellDescription$ Target creature blocks this turn if able. A:AB$ Effect | Cost$ PayShards<3> T | ActivationZone$ Command | SubAbility$ Eject | ValidTgts$ Creature | ExileOnMoved$ Battlefield | StaticAbilities$ MustBlock | RememberObjects$ Targeted | StackDescription$ {c:Targeted} blocks this turn if able. | SpellDescription$ Target creature blocks this turn if able.
SVar:MustBlock:Mode$ MustBlock | ValidCreature$ Card.IsRemembered | Description$ This creature blocks this turn if able. SVar:MustBlock:Mode$ MustBlock | ValidCreature$ Card.IsRemembered | Description$ This creature blocks this turn if able.
Oracle: Provided by Piper's Charm. Pay {M}{M}{M}, sacrifice Piper's Charm: Target creature blocks this turn if able. Oracle: Pay {M}{M}{M}, exile Piper's Charm: Target creature blocks this turn if able.
SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile

View File

@@ -2,5 +2,6 @@ Name:Sleep Wand
ManaCost:no cost ManaCost:no cost
Types:Artifact Types:Artifact
S:Mode$ Continuous | Description$ Provided by Sleep Wand (Equipped Item - Left) S:Mode$ Continuous | Description$ Provided by Sleep Wand (Equipped Item - Left)
A:AB$ PutCounter | Cost$ PayShards<2> Sac<1/CARDNAME> | ValidTgts$ Creature | ExileOnMoved$ Battlefield ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ Stun | CounterNum$ 1 | StackDescription$ Put a stun counter on target creature. (If a permanent with a stun counter would become untapped, remove one from it instead.) A:AB$ PutCounter | Cost$ PayShards<2> T | ActivationZone$ Command | SubAbility$ Eject | ValidTgts$ Creature | ExileOnMoved$ Battlefield ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ Stun | CounterNum$ 1 | StackDescription$ Put a stun counter on target creature. (If a permanent with a stun counter would become untapped, remove one from it instead.)
Oracle: Provided by Sleep Wand. Pay {M}, sacrifice Sleep Wand: Put a stun counter on target creature. Oracle: Pay {M}, exile Sleep Wand: Put a stun counter on target creature.
SVar:Eject:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile

View File

@@ -29,7 +29,7 @@
<property name="spriteLayer" type="bool" value="true"/> <property name="spriteLayer" type="bool" value="true"/>
</properties> </properties>
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="zlib">
eJztmH0OwiAMxTnBNo3uIu4WXsePHUt3FS+kiyOZhNI3RsFkJelfkr5fhm0fdJUxnYaGhoaGhoaGYLSNMU8wzjt877HJw3/46EisvfJvgr+vjbkCcau/XBdw/73OX8vIOeX6rlvhR/vnMPE/tH8qv/KL83N1aetLmh/pD75a57j2mfiR/L6ziuVH5ys1n1Px91NOisfOdzd/7P+WykP5kzkb5TXGnBwPpYvONaqOEF1qj9UeZyY3L19V/LmH9nO6cza3ftfUZCr+GE3l/w/+pXcSKX7pu45PMyX/Gg/h63/2/SPkHST4W0cfuSeE9BHNlPwIi/L//ub2AOr9gfIhpfmpfEv01vCH/Fvom1Fzn7u/DwvOcu7fQr2T829S3p/7thwb6t9c75Z6hbSl/FuJldL/lFix/ifmfhh7vyz91mvP9CSso/xl+d+e+Pwi eJztmH0OgjAMxXcCQKKchFt4HT84lnIVL6REluCyro+xbiZ0yfvLpf2F2fZtfWVMr1KpVCqVSiWorjHmCep8wPeemjz8x08eidUq/y74h9qYK6Bb/eW6gPvvdf5aRs4p13fdCz/aP8eZ/6H9U/mVX5yfq0tbX9L8SH/w1TrH1WbiR+L7ziqWH52v1HxOxT/MMSkeO9/d+LH/WyoO5U+WbJTXmGJyPFRedK5RdYTkpfbY3NPM5Oblq4o/99B+Lu+Sza3fLTWZij8mp/L/B//aO4kUv/Rdx5czJf8WD+Hrf/b9I+QdJPg7Jz9yTwjlR3Km5EdYlP/3N7cHUO8PlA8pzU/FW5NvC3/Iv4W+GTX3ufv7uOIsl/4t1Ds5/ybl/blvy7Gh/s31bqlXKLeUfyuxUvqfEivW/8TcD2Pvl6Xfev/1/VP50+oNNlL7xQ==
</data> </data>
</layer> </layer>
<layer id="5" name="AboveSprites" width="48" height="48"> <layer id="5" name="AboveSprites" width="48" height="48">

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<template>
<object name="collsion" class="collision" width="21.5" height="290.5">
<properties>
<property name="type" value="collision"/>
</properties>
</object>
</template>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<template>
<tileset firstgid="1" source="../tileset/main.tsx"/>
<object name="Shards" class="reward" gid="3139" width="16" height="16">
<properties>
<property name="reward">[
{
&quot;type&quot;: &quot;shards&quot;,
&quot;count&quot;: 2,
&quot;addMaxCount&quot;: 5
}
]</property>
<property name="spawn.Easy" type="bool" value="true"/>
<property name="spawn.Hard" type="bool" value="true"/>
<property name="spawn.Normal" type="bool" value="true"/>
<property name="sprite" value="sprites/manashards.atlas"/>
<property name="type" value="reward"/>
</properties>
</object>
</template>

View File

@@ -3496,6 +3496,18 @@
<object id="1" x="0" y="0" width="15" height="15"/> <object id="1" x="0" y="0" width="15" height="15"/>
</objectgroup> </objectgroup>
</tile> </tile>
<tile id="2343">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="12.9511" width="16" height="3.00638"/>
<object id="2" x="0.0850611" y="0.0217969" width="16" height="1.90058"/>
</objectgroup>
</tile>
<tile id="2344">
<objectgroup draworder="index" id="2">
<object id="3" x="-0.0839979" y="0" width="2.13291" height="16"/>
<object id="4" x="14.1212" y="-0.0425306" width="1.83519" height="16"/>
</objectgroup>
</tile>
<tile id="2345"> <tile id="2345">
<objectgroup draworder="index" id="2"> <objectgroup draworder="index" id="2">
<object id="1" x="2" y="0" width="14" height="15"/> <object id="1" x="2" y="0" width="14" height="15"/>

View File

@@ -0,0 +1,17 @@
treasure.png
size: 64,144
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Idle
xy: 0, 128
size: 16, 16
Idle
xy: 16, 128
size: 16, 16
Idle
xy: 32, 128
size: 16, 16
Idle
xy: 48, 128
size: 16, 16

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -4,7 +4,7 @@
"equipmentSlot": "Neck", "equipmentSlot": "Neck",
"iconName": "PipersCharm", "iconName": "PipersCharm",
"effect": { "effect": {
"startBattleWithCard": [ "startBattleWithCardInCommandZone": [
"Piper's Charm" "Piper's Charm"
] ]
} }
@@ -13,7 +13,7 @@
"equipmentSlot": "Left", "equipmentSlot": "Left",
"iconName": "SleepWand", "iconName": "SleepWand",
"effect": { "effect": {
"startBattleWithCard": [ "startBattleWithCardInCommandZone": [
"Sleep Wand" "Sleep Wand"
] ]
} }
@@ -22,7 +22,7 @@
"equipmentSlot": "Right", "equipmentSlot": "Right",
"iconName": "HillGiantClub", "iconName": "HillGiantClub",
"effect": { "effect": {
"startBattleWithCard": [ "startBattleWithCardInCommandZone": [
"Hill Giant Club" "Hill Giant Club"
] ]
} }
@@ -31,7 +31,7 @@
"equipmentSlot": "Right", "equipmentSlot": "Right",
"iconName": "CursedTreasure", "iconName": "CursedTreasure",
"effect": { "effect": {
"startBattleWithCard": [ "startBattleWithCardInCommandZone": [
"Cursed Treasure" "Cursed Treasure"
] ]
} }
@@ -40,7 +40,7 @@
"equipmentSlot": "Left", "equipmentSlot": "Left",
"iconName": "FarmersTools", "iconName": "FarmersTools",
"effect": { "effect": {
"startBattleWithCard": [ "startBattleWithCardInCommandZone": [
"Farmer's Tools" "Farmer's Tools"
] ]
} }