fixed game hud

This commit is contained in:
Grimm
2022-04-15 13:16:37 +02:00
50 changed files with 12017 additions and 808 deletions

View File

@@ -2054,7 +2054,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|| keyword.equals("Split second") || keyword.equals("Sunburst")
|| keyword.equals("Suspend") // for the ones without amount
|| keyword.equals("Foretell") // for the ones without cost
|| keyword.equals("Hideaway") || keyword.equals("Ascend") || keyword.equals("Totem armor")
|| keyword.equals("Ascend") || keyword.equals("Totem armor")
|| keyword.equals("Battle cry") || keyword.equals("Devoid") || keyword.equals("Riot")
|| keyword.equals("Daybound") || keyword.equals("Nightbound")
|| keyword.equals("Friends forever")) {
@@ -2084,7 +2084,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|| keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") || keyword.startsWith("Bushido")
|| keyword.startsWith("Crew") || keyword.startsWith("Tribute") || keyword.startsWith("Absorb")
|| keyword.startsWith("Graft") || keyword.startsWith("Fading") || keyword.startsWith("Vanishing")
|| keyword.startsWith("Afterlife")
|| keyword.startsWith("Afterlife") || keyword.startsWith("Hideaway")
|| keyword.startsWith("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage")
|| keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) {
final String[] k = keyword.split(":");
@@ -2144,17 +2144,19 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
sbLong.append(keyword);
sbLong.append(" (").append(Keyword.getInstance("Offering:" + offeringType).getReminderText()).append(")");
} else if (keyword.startsWith("Equip") || keyword.startsWith("Fortify") || keyword.startsWith("Outlast")
|| keyword.startsWith("Unearth") || keyword.startsWith("Scavenge") || keyword.startsWith("Spectacle")
|| keyword.startsWith("Evoke") || keyword.startsWith("Bestow") || keyword.startsWith("Dash")
|| keyword.startsWith("Surge") || keyword.startsWith("Transmute") || keyword.startsWith("Suspend")
|| keyword.equals("Undaunted") || keyword.startsWith("Monstrosity") || keyword.startsWith("Embalm")
|| keyword.startsWith("Level up") || keyword.equals("Prowess") || keyword.startsWith("Eternalize")
|| keyword.startsWith("Reinforce") || keyword.startsWith("Champion") || keyword.startsWith("Prowl")
|| keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Adapt")
|| keyword.startsWith("Unearth") || keyword.startsWith("Scavenge")
|| keyword.startsWith("Spectacle") || keyword.startsWith("Evoke")
|| keyword.startsWith("Bestow") || keyword.startsWith("Dash") || keyword.startsWith("Surge")
|| keyword.startsWith("Transmute") || keyword.startsWith("Suspend")
|| keyword.equals("Undaunted") || keyword.startsWith("Monstrosity")
|| keyword.startsWith("Embalm") || keyword.startsWith("Level up") || keyword.equals("Prowess")
|| keyword.startsWith("Eternalize") || keyword.startsWith("Reinforce")
|| keyword.startsWith("Champion") || keyword.startsWith("Prowl") || keyword.startsWith("Adapt")
|| keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Saga")
|| keyword.startsWith("Transfigure") || keyword.startsWith("Aura swap")
|| keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling")
|| keyword.startsWith("Encore") || keyword.startsWith("Mutate") || keyword.startsWith("Dungeon")
|| keyword.startsWith("Class") || keyword.startsWith("Saga") || keyword.startsWith("Blitz")) {
|| keyword.startsWith("Class") || keyword.startsWith("Blitz")) {
// keyword parsing takes care of adding a proper description
} else if (keyword.equals("Unblockable")) {
sbLong.append(getName()).append(" can't be blocked.\r\n");

View File

@@ -1334,10 +1334,8 @@ public class CardFactoryUtil {
List<Trigger> triggers = Lists.newArrayList();
StringBuilder sb = new StringBuilder();
sb.append("Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self");
sb.append("| TriggerDescription$ Hideaway ").append(n).append(" (When CARDNAME enters the battlefield, ");
sb.append("look at the top ").append(Lang.getNumeral(Integer.valueOf(n))).append(" cards of your library, exile one face down");
sb.append(", then put the rest on the bottom of your library.)");
sb.append("Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Secondary$ True | ");
sb.append("TriggerDescription$ Hideaway ").append(n).append(" (").append(inst.getReminderText()).append(")");
final Trigger hideawayTrigger = TriggerHandler.parseTrigger(sb.toString(), card, intrinsic);
String hideawayDig = "DB$ Dig | Defined$ You | DigNum$ " + n + " | DestinationZone$ Exile | ExileFaceDown$ True | RememberChanged$ True";

View File

@@ -95,7 +95,7 @@ public enum Keyword {
HASTE("Haste", SimpleKeyword.class, true, "This creature can attack and {T} as soon as it comes under your control."),
HAUNT("Haunt", SimpleKeyword.class, false, "When this is put into a graveyard, exile it haunting target creature."),
HEXPROOF("Hexproof", Hexproof.class, false, "This can't be the target of %s spells or abilities your opponents control."),
HIDEAWAY("Hideaway", KeywordWithAmount.class, false, "When this permanent enters the battlefield, look at the top %d cards of your library, exile one face down, then put the rest on the bottom of your library."),
HIDEAWAY("Hideaway", KeywordWithAmount.class, false, "When this permanent enters the battlefield, look at the top {%d:card} of your library, exile one face down, then put the rest on the bottom of your library."),
HORSEMANSHIP("Horsemanship", SimpleKeyword.class, true, "This creature can't be blocked except by creatures with horsemanship."),
IMPROVISE("Improvise", SimpleKeyword.class, true, "Your artifacts can help cast this spell. Each artifact you tap after you're done activating mana abilities pays for {1}."),
INDESTRUCTIBLE("Indestructible", SimpleKeyword.class, true, "Effects that say \"destroy\" don't destroy this."),

View File

@@ -53,7 +53,7 @@ public abstract class KeywordInstance<T extends KeywordInstance<?>> implements K
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, Lang.nounWithNumeral(m.group(1), m.group(2)));
m.appendReplacement(sb, Lang.nounWithNumeralExceptOne(m.group(1), m.group(2)));
}
m.appendTail(sb);
return sb.toString();

View File

@@ -281,6 +281,9 @@ public class PhaseHandler implements java.io.Serializable {
break;
case DRAW:
for (Player p : game.getPlayers()) {
p.resetNumDrawnThisDrawStep();
}
playerTurn.drawCard();
for (Player p : game.getPlayers()) {
if (p.isOpponentOf(playerTurn) &&

View File

@@ -1406,9 +1406,12 @@ public class Player extends GameEntity implements Comparable<Player> {
return CardCollection.combine(getCardsIn(Player.ALL_ZONES), getCardsIn(ZoneType.Stack), inboundTokens);
}
public final void resetNumDrawnThisDrawStep() {
numDrawnThisDrawStep = 0;
}
public final void resetNumDrawnThisTurn() {
numDrawnThisTurn = 0;
numDrawnThisDrawStep = 0;
view.updateNumDrawnThisTurn(this);
}

View File

@@ -87,10 +87,16 @@ public class TriggerDrawn extends Trigger {
}
}
if (hasParam("NotFirstCardInDrawStep")) {
if (hasParam("FirstCardInDrawStep")) {
final Player p = ((Player)runParams.get(AbilityKey.Player));
if (p.numDrawnThisDrawStep() == 1 && game.getPhaseHandler().is(PhaseType.DRAW, p)) {
return false;
if (getParam("FirstCardInDrawStep").equals("True")) {
if (!game.getPhaseHandler().is(PhaseType.DRAW, p) || p.numDrawnThisDrawStep() > 1) {
return false;
}
} else {
if (p.numDrawnThisDrawStep() == 1 && game.getPhaseHandler().is(PhaseType.DRAW, p)) {
return false;
}
}
}

View File

@@ -1,116 +1,36 @@
package forge.adventure.character;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Json;
import forge.adventure.data.DialogData;
import forge.adventure.stage.MapStage;
import forge.adventure.util.Config;
import forge.adventure.util.Controls;
import forge.adventure.util.Current;
import forge.adventure.util.MapDialog;
/**
* Map actor that will open the Shop on collision
* Map actor that will show a text message with optional choices
*/
public class DialogActor extends MapActor{
public class DialogActor extends MapActor {
private final MapStage stage;
private final String dialogPath;
private final TextureRegion textureRegion;
private final MapDialog dialog;
public DialogActor(MapStage stage, int id, String dialog, TextureRegion textureRegion)
{
public DialogActor(MapStage stage, int id, String S, TextureRegion textureRegion) {
super(id);
this.stage = stage;
this.dialogPath = dialog;
dialog = new MapDialog(S, stage, id);
this.textureRegion = textureRegion;
}
@Override
public void onPlayerCollide()
{
Json json = new Json();
FileHandle handle = Config.instance().getFile(dialogPath);
if (handle.exists()) {
Array<DialogData> data = json.fromJson(Array.class, DialogData.class, handle);
stage.resetPosition();
stage.showDialog();
for(DialogData dialog:data)
{
if(isConditionOk(dialog.condition))
{
loadDialog(dialog);
}
}
}
}
private void loadDialog(DialogData dialog) {
setEffects(dialog.effect);
stage.getDialog().getContentTable().clear();
stage.getDialog().getButtonTable().clear();
stage.getDialog().text((dialog.text));
if(dialog.options!=null)
{
for(DialogData option:dialog.options)
{
if( isConditionOk(option.condition) )
{
stage.getDialog().getButtonTable().add(Controls.newTextButton(option.name,() -> {
loadDialog(option);
}));
}
}
stage.showDialog();
}
else
{
stage.hideDialog();
}
}
void setEffects(DialogData.EffectData[] data)
{
if(data==null)
return ;
for(DialogData.EffectData effectData:data)
{
Current.player().removeItem(effectData.removeItem);
if(effectData.deleteMapObject<0)
stage.deleteObject(getObjectId());
else if(effectData.deleteMapObject>0)
stage.deleteObject(effectData.deleteMapObject);
}
}
boolean isConditionOk(DialogData.ConditionData[] data)
{
if(data==null)
return true;
for(DialogData.ConditionData condition:data)
{
if(condition.item!=null && !condition.item.equals(""))
{
if(!Current.player().hasItem(condition.item))
{
return false;
}
}
}
return true;
public void onPlayerCollide() {
stage.resetPosition();
stage.showDialog();
dialog.activate();
}
@Override
public void draw(Batch batch, float alpha) {
batch.draw(textureRegion,getX(),getY(),getWidth(),getHeight());
super.draw(batch,alpha);
batch.draw(textureRegion, getX(), getY(), getWidth(), getHeight());
super.draw(batch, alpha);
}
}

View File

@@ -0,0 +1,29 @@
package forge.adventure.character;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import forge.adventure.stage.MapStage;
/**
* DummySprite
* Solid map entity. Cannot move or be interacted with, but can be removed from events.
*/
public class DummySprite extends MapActor {
private final TextureRegion textureRegion;
private final MapStage stage;
public DummySprite(int id, TextureRegion textureRegion, MapStage stage) {
super(id);
this.textureRegion = textureRegion;
this.stage = stage;
}
@Override
public void onPlayerCollide() { stage.resetPosition(); }
@Override
public void draw(Batch batch, float alpha) {
batch.draw(textureRegion, getX(), getY(), getWidth(), getHeight());
super.draw(batch, alpha);
}
}

View File

@@ -7,6 +7,7 @@ import com.badlogic.gdx.utils.Array;
import forge.adventure.data.EnemyData;
import forge.adventure.data.RewardData;
import forge.adventure.util.Current;
import forge.adventure.util.MapDialog;
import forge.adventure.util.Reward;
/**
@@ -16,6 +17,7 @@ import forge.adventure.util.Reward;
public class EnemySprite extends CharacterSprite {
EnemyData data;
private int id;
public MapDialog dialog;
public EnemySprite(EnemyData enemyData) {
super(enemyData.sprite);
@@ -48,11 +50,10 @@ public class EnemySprite extends CharacterSprite {
public Array<Reward> getRewards() {
Array<Reward> ret=new Array<Reward>();
if(data.rewards==null)
if(data.rewards == null)
return ret;
for(RewardData rdata:data.rewards)
{
ret.addAll(rdata.generate(false,Current.latestDeck()!=null? Current.latestDeck().getMain().toFlatList():null,data.equipment));
for(RewardData rdata:data.rewards) {
ret.addAll(rdata.generate(false,(Current.latestDeck()!=null? Current.latestDeck().getMain().toFlatList():null)));
}
return ret;
}

View File

@@ -94,6 +94,10 @@ public class MapActor extends Actor {
}
public int getId(){
return objectId;
}
public boolean collideWith(MapActor other) {
return collideWith(other.boundingRect());
}

View File

@@ -1,18 +1,28 @@
package forge.adventure.data;
/**
* Dialog Data JSON loader class.
* Carries all text, branches and effects of dialogs.
*/
public class DialogData {
public EffectData[] effect;
public ConditionData[] condition;
public String name;
public String text;
public DialogData[] options;
public EffectData[] effect; //List of effects to cause when the dialog shows.
public ConditionData[] condition; //List of conditions for the action to show.
public String name; //Text to display when action is listed as a button.
public String text; //The text body.
public String loctext; //References a localized string.
public DialogData[] options; //
static public class EffectData {
public String removeItem;
public int deleteMapObject;
public String removeItem; //Remove item name from inventory.
public String addItem; //Add item name to inventory.
public int deleteMapObject = 0; //Remove ID from the map. -1 for self.
public int battleWithActorID = 0; //Start a battle with enemy ID. -1 for self if possible.
}
static public class ConditionData {
public String item;
public int flag = 0; //Check for a local dungeon flag.
public int actorID = 0; //Check for an actor ID.
public boolean not = false; //Reverse the result of a condition ("actorID":"XX" + "not":true => true if XX is not in the map.)
}
}

View File

@@ -0,0 +1,68 @@
package forge.adventure.data;
import com.badlogic.gdx.utils.Array;
import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.item.PaperToken;
import forge.model.FModel;
public class EffectData {
//Duel effects.
public int lifeModifier = 0; //Amount to add to starting Life.
public int changeStartCards = 0; //Amount to add to starting hand size.
public String[] startBattleWithCard; //Cards that start in the Battlefield.
//Map only effects.
public float moveSpeed = 1.0f; //Change of movement speed. Map only.
//Opponent field.
public EffectData opponent; //Effects to be applied to the opponent's side.
public Array<IPaperCard> startBattleWithCards() {
Array<IPaperCard> startCards=new Array<>();
if(startBattleWithCard != null) {
for (String name:startBattleWithCard) {
PaperCard C = FModel.getMagicDb().getCommonCards().getCard(name);
if(C != null)
startCards.add(C);
else {
PaperToken T = FModel.getMagicDb().getAllTokens().getToken(name);
if (T != null) startCards.add(T);
else System.err.print("Can not find card \"" + name + "\"\n");
}
}
}
return startCards;
}
public String cardNames() {
String ret = "";
Array<IPaperCard> array=startBattleWithCards();
for(int i =0;i<array.size;i++) {
ret+=array.get(i).toString();
if(i!=array.size-1) ret+=" , ";
}
return ret;
}
public String getDescription() {
String description = "";
if(this.lifeModifier != 0)
description += "Life: " + ((this.lifeModifier > 0) ? "+" : "") + this.lifeModifier + "\n";
if(this.startBattleWithCard != null && this.startBattleWithCard.length != 0)
description+="Cards on battlefield: \n" + this.cardNames() + "\n";
if(this.moveSpeed!=0 && this.moveSpeed != 1)
description+="Movement speed: " + ((this.lifeModifier > 0) ? "+" : "") + Math.round((this.moveSpeed-1.f)*100) + "%\n";
if(this.changeStartCards != 0)
description+="Starting hand: " + this.changeStartCards + "\n";
if(this.opponent != null) {
String oppEffect=this.opponent.getDescription();
if(oppEffect != "") {
description += "Gives Opponent:\n";
description += oppEffect;
}
}
return description;
}
}

View File

@@ -7,8 +7,6 @@ import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Json;
import forge.adventure.util.Config;
import forge.adventure.util.Paths;
import forge.item.IPaperCard;
import forge.model.FModel;
import static forge.adventure.util.Paths.ITEMS_ATLAS;
@@ -20,16 +18,10 @@ import static forge.adventure.util.Paths.ITEMS_ATLAS;
public class ItemData {
public String name;
public String equipmentSlot;
public int lifeModifier=0;
public int changeStartCards=0;
public String[] startBattleWithCard;
public EffectData effect;
public String iconName;
public float moveSpeed=1.0f;
public boolean questItem=false;
public int cost=1000;
//not an item on it owns but effects will be applied to the opponent
public ItemData opponent;
public Sprite sprite()
{
@@ -64,56 +56,12 @@ public class ItemData {
return null;
}
public Array<IPaperCard> startBattleWithCards() {
Array<IPaperCard> startCards=new Array<>();
if(startBattleWithCard!=null)
{
for (String name:startBattleWithCard)
{
if(FModel.getMagicDb().getCommonCards().contains(name))
startCards.add(FModel.getMagicDb().getCommonCards().getCard(name));
else if (FModel.getMagicDb().getAllTokens().containsRule(name))
startCards.add(FModel.getMagicDb().getAllTokens().getToken(name));
else
{
System.err.print("Can not find card "+name+"\n");
}
}
}
return startCards;
}
public String cardNames() {
String ret="";
Array<IPaperCard> array=startBattleWithCards();
for(int i =0;i<array.size;i++)
{
ret+=array.get(i).toString();
if(i!=array.size-1)
ret+=" , ";
}
return ret;
}
public String getDescription() {
String description = "";
if(this.equipmentSlot != null && !this.equipmentSlot.equals(""))
if(this.equipmentSlot != null && !this.equipmentSlot.isEmpty())
description += "Slot: " + this.equipmentSlot + "\n";
if(this.lifeModifier != 0)
description += "Life: " + ((this.lifeModifier > 0) ? "+" : "") + this.lifeModifier + "\n";
if(this.startBattleWithCard != null && this.startBattleWithCard.length != 0)
description+="Cards on battlefield: \n" + this.cardNames() + "\n";
if(this.moveSpeed!=0 && this.moveSpeed != 1)
description+="Movement speed: " + ((this.lifeModifier > 0) ? "+" : "") + Math.round((this.moveSpeed-1.f)*100) + "%\n";
if(this.changeStartCards != 0)
description+="Starting hand: " + this.changeStartCards + "\n";
if(this.opponent != null) {
String oppEffect=this.opponent.getDescription();
if(oppEffect != "") {
description += "Gives Opponent:\n";
description += oppEffect;
}
}
if(effect != null)
description += effect.getDescription();
return description;
}
}

View File

@@ -69,9 +69,9 @@ public class RewardData {
private static Iterable<PaperCard> allEnemyCards;
public Array<Reward> generate(boolean isForEnemy)
{
return generate(isForEnemy,null,null);
return generate(isForEnemy, null);
}
public Array<Reward> generate(boolean isForEnemy,Iterable<PaperCard> cards,String[] enemyItems)
public Array<Reward> generate(boolean isForEnemy,Iterable<PaperCard> cards)
{
if(allCards==null)
{
@@ -127,17 +127,6 @@ public class RewardData {
}
}
break;
case "enemyItems":
if(enemyItems==null)return ret;
for(int i=0;i<count+addedCount;i++)
{
ret.add(new Reward(ItemData.getItem(enemyItems[WorldSave.getCurrentSave().getWorld().getRandom().nextInt(enemyItems.length)])));
}
for(PaperCard card: CardUtil.generateCards(cards,this, count+addedCount))
{
ret.add(new Reward(card));
}
break;
case "deckCard":
if(cards==null)return ret;
for(PaperCard card: CardUtil.generateCards(cards,this, count+addedCount))

View File

@@ -418,12 +418,10 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
public float equipmentSpeed() {
float factor=1.0f;
for(String name:equippedItems.values())
{
for(String name:equippedItems.values()) {
ItemData data=ItemData.getItem(name);
if(data.moveSpeed!=0.0)
{
factor*=data.moveSpeed;
if(data.effect.moveSpeed > 0.0) { //Avoid negative speeds. It would be silly.
factor*=data.effect.moveSpeed;
}
}
return factor;

View File

@@ -6,6 +6,7 @@ import forge.Forge;
import forge.LobbyPlayer;
import forge.adventure.character.EnemySprite;
import forge.adventure.character.PlayerSprite;
import forge.adventure.data.EffectData;
import forge.adventure.data.ItemData;
import forge.adventure.player.AdventurePlayer;
import forge.adventure.util.Config;
@@ -40,6 +41,7 @@ public class DuelScene extends ForgeScene {
EnemySprite enemy;
PlayerSprite player;
RegisteredPlayer humanPlayer;
private EffectData dungeonEffect;
public DuelScene() {
@@ -57,6 +59,7 @@ public class DuelScene extends ForgeScene {
@Override
public void run() {
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
dungeonEffect = null;
Scene last = Forge.switchToLast();
if (last instanceof HudScene) {
@@ -68,17 +71,14 @@ public class DuelScene extends ForgeScene {
}
void addItemEffects(RegisteredPlayer player,Array<ItemData> items)
{
if(items==null)
return;
void addEffects(RegisteredPlayer player,Array<EffectData> effects) {
if( effects == null ) return;
//Apply various effects.
int lifeMod=0;
int changeStartCards=0;
Array<IPaperCard> startCards=new Array<>();
for(ItemData data:items)
{
for(EffectData data:effects) {
lifeMod+=data.lifeModifier;
changeStartCards+= data.changeStartCards;
startCards.addAll(data.startBattleWithCards());
@@ -88,6 +88,10 @@ public class DuelScene extends ForgeScene {
player.setStartingHand(player.getStartingHand()+changeStartCards);
}
public void setDungeonEffect(EffectData E) {
dungeonEffect = E;
}
@Override
public void enter() {
@@ -97,7 +101,7 @@ public class DuelScene extends ForgeScene {
List<RegisteredPlayer> players = new ArrayList<>();
Deck playerDeck=(Deck)AdventurePlayer.current().getSelectedDeck().copyTo("PlayerDeckCopy");
int missingCards= Config.instance().getConfigData().minDeckSize-playerDeck.getMain().countAll();
if(missingCards>0)
if( missingCards > 0 ) //Replace unknown cards for a Wastes.
playerDeck.getMain().add("Wastes",missingCards);
humanPlayer = RegisteredPlayer.forVariants(2, appliedVariants,playerDeck, null, false, null, null);
LobbyPlayer playerObject = GamePlayerUtil.getGuiPlayer();
@@ -117,29 +121,36 @@ public class DuelScene extends ForgeScene {
Array<ItemData> playerItems=new Array<>();
Array<ItemData> oppItems=new Array<>();
Array<EffectData> playerEffects = new Array<>();
Array<EffectData> oppEffects = new Array<>();
for(String playerItem:Current.player().getEquippedItems())
{
//Collect and add items effects first.
for(String playerItem:Current.player().getEquippedItems()) {
ItemData item=ItemData.getItem(playerItem);
playerItems.add(item);
if(item.opponent !=null)
oppItems.add(item.opponent);
playerEffects.add(item.effect);
if(item.effect.opponent != null) oppEffects.add(item.effect.opponent);
}
if(enemy.getData().equipment!=null)
{
for(String oppItem:enemy.getData().equipment)
{
if(enemy.getData().equipment!=null) {
for(String oppItem:enemy.getData().equipment) {
ItemData item=ItemData.getItem(oppItem);
oppItems.add(item);
if(item.opponent !=null)
playerItems.add(item.opponent);
oppEffects.add(item.effect);
if(item.effect.opponent !=null) playerEffects.add(item.effect.opponent);
}
}
addItemEffects(humanPlayer,playerItems);
addItemEffects(aiPlayer,oppItems);
//Collect and add player blessings.
//Collect and add enemy effects (same as blessings but for individual enemies).
//Collect and add dungeon-wide effects.
if(dungeonEffect != null) {
oppEffects.add(dungeonEffect);
if (dungeonEffect.opponent != null)
playerEffects.add(dungeonEffect.opponent);
}
addEffects(humanPlayer,playerEffects);
addEffects(aiPlayer,oppEffects);
players.add(humanPlayer);
players.add(aiPlayer);
@@ -163,10 +174,10 @@ public class DuelScene extends ForgeScene {
}
});
hostedMatch.startMatch(rules, appliedVariants, players, guiMap);
MatchController.instance.setGameView(hostedMatch.getGameView());
for (final Player p : hostedMatch.getGame().getPlayers()) {
if (p.getController() instanceof PlayerControllerHuman) {
final PlayerControllerHuman humanController = (PlayerControllerHuman) p.getController();

View File

@@ -12,12 +12,16 @@ import com.badlogic.gdx.utils.viewport.ScalingViewport;
import forge.Forge;
import forge.adventure.character.MapActor;
import forge.adventure.character.PlayerSprite;
import forge.adventure.data.PointOfInterestData;
import forge.adventure.pointofintrest.PointOfInterest;
import forge.adventure.scene.Scene;
import forge.adventure.scene.SceneType;
import forge.adventure.scene.TileMapScene;
import forge.adventure.util.Current;
import forge.adventure.world.WorldSave;
import forge.gui.GuiBase;
import forge.util.MyRandom;
import forge.localinstance.properties.ForgePreferences;
import forge.model.FModel;
@@ -194,6 +198,13 @@ public abstract class GameStage extends Stage {
setDebugAll(true);
player.setBoundDebug(true);
}
if (keycode == Input.Keys.F2) {
TileMapScene S = ((TileMapScene)SceneType.TileMapScene.instance);
PointOfInterestData P = PointOfInterestData.getPointOfInterest("DEBUGZONE");
PointOfInterest PoI = new PointOfInterest(P,new Vector2(0,0), MyRandom.getRandom());
S.load(PoI);
Forge.switchScene(S);
}
if (keycode == Input.Keys.F11) {
debugCollision(false);
for (Actor actor : foregroundSprites.getChildren()) {

View File

@@ -16,20 +16,17 @@ import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.SerializationException;
import forge.Forge;
import forge.adventure.character.*;
import forge.adventure.data.RewardData;
import forge.adventure.data.ShopData;
import forge.adventure.data.WorldData;
import forge.adventure.data.*;
import forge.adventure.pointofintrest.PointOfInterestChanges;
import forge.adventure.scene.DuelScene;
import forge.adventure.scene.RewardScene;
import forge.adventure.scene.SceneType;
import forge.adventure.util.Config;
import forge.adventure.util.Controls;
import forge.adventure.util.Current;
import forge.adventure.util.Reward;
import forge.adventure.util.*;
import forge.adventure.world.WorldSave;
import forge.screens.TransitionScreen;
import forge.sound.SoundEffectType;
@@ -67,14 +64,18 @@ public class MapStage extends GameStage {
private Stage dialogStage;
private boolean dialogOnlyInput;
private EffectData effect;
public boolean getDialogOnlyInput() {
return dialogOnlyInput;
}
public Dialog getDialog() {
return dialog;
}
public void clearIsInMap() {
isInMap = false;
effect = null;
GameHUD.getInstance().showHideMap(true);
}
public void draw (Batch batch) {
@@ -83,9 +84,7 @@ public class MapStage extends GameStage {
//update camera after all layers got drawn
if (!getRoot().isVisible()) return;
getRoot().draw(batch, 1);
}
public MapLayer getSpriteLayer() {
@@ -181,6 +180,17 @@ public class MapStage extends GameStage {
}
private void effectDialog(EffectData E){
dialog.getContentTable().clear();
dialog.getButtonTable().clear();
String text = "Strange magical energies flow within this place...\nAll opponents get:\n";
text += E.getDescription();
dialog.text(text);
dialog.getButtonTable().add(Controls.newTextButton("OK", this::hideDialog));
dialog.setKeepWithinStage(true);
showDialog();
}
public void loadMap(TiledMap map, String sourceMap) {
isLoadingMatch = false;
isInMap = true;
@@ -199,6 +209,18 @@ public class MapStage extends GameStage {
setBounds(width * tileWidth, height * tileHeight);
collision = new ArrayList[(int) width][(int) height];
//Load dungeon effects.
if( map.getProperties().get("dungeonEffect") != null && !map.getProperties().get("dungeonEffect").toString().isEmpty()){
Json json = new Json();
try { effect = json.fromJson(EffectData.class, map.getProperties().get("dungeonEffect").toString()); }
catch(SerializationException E) {
//JSON parsing could fail. Since this an user written part, assume failure is possible (it happens).
System.err.printf("[%s] while loading JSON file for dialog actor. JSON:\n%s\nUsing a default dialog.", E.getMessage(), map.getProperties().get("dungeonEffect").toString());
effect = json.fromJson(EffectData.class, "");
}
effectDialog(effect);
}
GetPlayer().stop();
for (MapLayer layer : map.getLayers()) {
@@ -254,12 +276,22 @@ public class MapStage extends GameStage {
addMapActor(obj, entry);
break;
case "reward":
RewardSprite R = new RewardSprite(id, prop.get("reward").toString(), prop.get("sprite").toString());
addMapActor(obj, R);
if (prop.get("reward") != null) {
RewardSprite R = new RewardSprite(id, prop.get("reward").toString(), prop.get("sprite").toString());
addMapActor(obj, R);
}
break;
case "enemy":
EnemySprite mob = new EnemySprite(id, WorldData.getEnemy(prop.get("enemy").toString()));
addMapActor(obj, mob);
if(prop.get("dialog") != null && !prop.get("dialog").toString().isEmpty()) {
mob.dialog = new MapDialog(prop.get("dialog").toString(), this, mob.getId());
}
break;
case "dummy": //Does nothing. Mostly obstacles to be removed by ID by switches or such.
TiledMapTileMapObject obj2 = (TiledMapTileMapObject) obj;
DummySprite D = new DummySprite(id, obj2.getTextureRegion(), this);
addMapActor(obj, D);
break;
case "inn":
addMapActor(obj, new OnCollide(new Runnable() {
@@ -278,13 +310,11 @@ public class MapStage extends GameStage {
}));
break;
case "dialog":
if(obj instanceof TiledMapTileMapObject)
{
if(obj instanceof TiledMapTileMapObject) {
TiledMapTileMapObject tiledObj = (TiledMapTileMapObject) obj;
DialogActor dialog = new DialogActor(this, id, prop.get("dialog").toString(),tiledObj.getTextureRegion());
DialogActor dialog = new DialogActor(this, id, prop.get("dialog").toString(), tiledObj.getTextureRegion());
addMapActor(obj, dialog);
}
break;
case "shop":
String shopList = prop.get("shopList").toString();
@@ -304,7 +334,7 @@ public class MapStage extends GameStage {
continue;
ShopData data = shops.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(shops.size));
Array<Reward> ret = new Array<Reward>();
Array<Reward> ret = new Array<>();
for (RewardData rdata : new Array.ArrayIterator<>(data.rewards)) {
ret.addAll(rdata.generate(false));
}
@@ -328,6 +358,7 @@ public class MapStage extends GameStage {
public boolean exit() {
isLoadingMatch = false;
effect = null; //Reset dungeon effects.
clearIsInMap();
Forge.switchScene(SceneType.GameScene.instance);
return true;
@@ -374,7 +405,22 @@ public class MapStage extends GameStage {
}
}
return false;
}
public boolean lookForID(int id){
for(MapActor A : new Array.ArrayIterator<>(actors)){
if(A.getId() == id)
return true;
}
return false;
}
public EnemySprite getEnemyByID(int id) {
for(MapActor A : new Array.ArrayIterator<>(actors)){
if(A instanceof EnemySprite && A.getId() == id)
return ((EnemySprite) A);
}
return null;
}
protected void getReward() {
@@ -398,41 +444,14 @@ public class MapStage extends GameStage {
if (actor instanceof EnemySprite) {
EnemySprite mob = (EnemySprite) actor;
currentMob = mob;
if (mob.getData().deck == null || mob.getData().deck.isEmpty()) {
currentMob.setAnimation(CharacterSprite.AnimationTypes.Death);
Gdx.input.vibrate(50);
startPause(0.3f, new Runnable() {
@Override
public void run() {
MapStage.this.getReward();
}
});
break;
} else {
player.setAnimation(CharacterSprite.AnimationTypes.Attack);
mob.setAnimation(CharacterSprite.AnimationTypes.Attack);
Gdx.input.vibrate(50);
Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2");
SoundSystem.instance.play(SoundEffectType.ManaBurn, false);
if (!isLoadingMatch) {
isLoadingMatch = true;
Forge.setTransitionScreen(new TransitionScreen(new Runnable() {
@Override
public void run() {
Forge.clearTransitionScreen();
}
}, ScreenUtils.getFrameBufferTexture(), true, false));
}
startPause(0.5f, new Runnable() {
@Override
public void run() {
((DuelScene) SceneType.DuelScene.instance).setEnemy(mob);
((DuelScene) SceneType.DuelScene.instance).setPlayer(player);
Forge.switchScene(SceneType.DuelScene.instance);
}
});
break;
if (mob.dialog != null){ //This enemy has something to say. Display a dialog like if it was a DialogActor.
resetPosition();
showDialog();
mob.dialog.activate();
} else { //Duel the enemy.
beginDuel(mob);
}
break;
} else if (actor instanceof RewardSprite) {
Gdx.input.vibrate(50);
startPause(0.1f, new Runnable() {
@@ -452,6 +471,34 @@ public class MapStage extends GameStage {
}
}
public void beginDuel(EnemySprite mob){
if(mob == null) return;
currentMob = mob;
player.setAnimation(CharacterSprite.AnimationTypes.Attack);
mob.setAnimation(CharacterSprite.AnimationTypes.Attack);
Gdx.input.vibrate(50);
Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2");
SoundSystem.instance.play(SoundEffectType.ManaBurn, false);
if (!isLoadingMatch) {
isLoadingMatch = true;
Forge.setTransitionScreen(new TransitionScreen(new Runnable() {
@Override
public void run() {
Forge.clearTransitionScreen();
}
}, ScreenUtils.getFrameBufferTexture(), true, false));
}
startPause(0.4f, new Runnable() {
@Override
public void run() {
DuelScene S = ((DuelScene) SceneType.DuelScene.instance);
S.setEnemy(mob);
S.setPlayer(player);
if(isInMap && effect != null) S.setDungeonEffect(effect);
Forge.switchScene(SceneType.DuelScene.instance);
}
});
}
public void setPointOfInterest(PointOfInterestChanges change) {
changes = change;
@@ -461,8 +508,6 @@ public class MapStage extends GameStage {
return isInMap;
}
public void showDialog() {
dialog.show(dialogStage);
dialogOnlyInput=true;

View File

@@ -0,0 +1,129 @@
package forge.adventure.util;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.SerializationException;
import forge.Forge;
import forge.adventure.data.DialogData;
import forge.adventure.stage.MapStage;
/**
* MapDialog
* Implements a dialogue/event tree for dialogs.
*/
public class MapDialog {
private final MapStage stage;
private Array<DialogData> data;
private final int parentID;
static private final String defaultJSON = "[\n" +
" {\n" +
" \"effect\":[],\n" +
" \"name\":\"Error\",\n" +
" \"text\":\"This is a fallback dialog.\\nPlease check Forge logs for errors.\",\n" +
" \"condition\":[],\n" +
" \"options\":[\n" +
" { \"name\":\"OK\" }\n" +
" ]\n" +
" }\n" +
"]";
public MapDialog(String S, MapStage ST, int parentID) {
this.stage = ST;
this.parentID = parentID;
Json json = new Json();
if (S.isEmpty()){
System.err.print("Dialog error. Dialog property is empty.\n");
this.data = json.fromJson(Array.class, DialogData.class, defaultJSON);
return;
}
try { data = json.fromJson(Array.class, DialogData.class, S); }
catch(SerializationException E){
//JSON parsing could fail. Since this an user written part, assume failure is possible (it happens).
System.err.printf("[%s] while loading JSON file for dialog actor. JSON:\n%s\nUsing a default dialog.", E.getMessage(), S);
this.data = json.fromJson(Array.class, DialogData.class, defaultJSON);
}
}
private void loadDialog(DialogData dialog) {
setEffects(dialog.effect);
stage.getDialog().getContentTable().clear();
stage.getDialog().getButtonTable().clear();
String text;
if(dialog.loctext != null && !dialog.loctext.isEmpty()){ //Check for localized string, otherwise print text.
text = Forge.getLocalizer().getMessage(dialog.loctext);
} else {
text = dialog.text;
}
int charCount = 0;
stage.getDialog().text(text);
if(dialog.options != null) {
for(DialogData option:dialog.options) {
if( isConditionOk(option.condition) ) {
charCount += option.name.length();
if(charCount > 35){ //Gross hack.
stage.getDialog().getButtonTable().row();
charCount = 0;
}
stage.getDialog().getButtonTable().add(Controls.newTextButton(option.name,() -> loadDialog(option)));
}
}
stage.showDialog();
}
else {
stage.hideDialog();
}
}
public void activate() {
for(DialogData dialog:data) {
if(isConditionOk(dialog.condition)) {
loadDialog(dialog);
}
}
}
void setEffects(DialogData.EffectData[] data) {
if(data==null) return;
for(DialogData.EffectData E:data) {
if (E.removeItem != null){
Current.player().removeItem(E.removeItem);
}
if (E.addItem != null){
Current.player().addItem(E.addItem);
}
if (E.deleteMapObject != 0){
if(E.deleteMapObject < 0) stage.deleteObject(parentID);
else stage.deleteObject(E.deleteMapObject);
}
if (E.battleWithActorID != 0){
if(E.battleWithActorID < 0) stage.beginDuel(stage.getEnemyByID(parentID));
else stage.beginDuel(stage.getEnemyByID(E.battleWithActorID));
}
}
}
boolean isConditionOk(DialogData.ConditionData[] data) {
if(data==null) return true;
for(DialogData.ConditionData condition:data) {
if(condition.item != null && !condition.item.isEmpty()) { //Check for item.
if(!Current.player().hasItem(condition.item)) {
if(!condition.not) return false; //Only return on a false.
} else if(condition.not) return false;
}
if(condition.actorID != 0) { //Check for actor ID.
if(!stage.lookForID(condition.actorID)){
if(!condition.not) return false; //Same as above.
} else if(condition.not) return false;
}
}
return true;
}
}

View File

@@ -250,13 +250,13 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
else
drawable.setMinSize(Scene.getIntendedWidth() * 0.95f, Scene.getIntendedWidth()* RewardScene.CARD_WIDTH_TO_HEIGHT * 0.95f);
toolTipImage = new Image(drawable);
tooltip = new Tooltip<Image>(toolTipImage);
tooltip = new Tooltip<>(toolTipImage);
holdTooltip = new HoldTooltip(new Image(drawable));
tooltip.setInstant(true);
if (GuiBase.isAndroid())
addListener(holdTooltip);
else
addListener(tooltip);
if (frontSideUp()) {
if (GuiBase.isAndroid()) addListener(holdTooltip);
else addListener(tooltip);
}
generatedTooltip = result; //Dispose of this later.
}

View File

@@ -1,19 +0,0 @@
[{
"effect":[],
"name":"",
"text":"A big black gate is blocking the path",
"condition":[],
"options":[
{
"name":"go away"
},
{
"name":"unlock with black key",
"condition":[{"item":"Black Key"}],
"text":"The gate is unlocked",
"options":[{"name":"continue","effect":[{"removeItem":"Black Key","deleteMapObject":-1}]}]
}
]
}
]

View File

@@ -1,19 +0,0 @@
[{
"effect":[],
"name":"",
"text":"A big blue gate is blocking the path",
"condition":[],
"options":[
{
"name":"go away"
},
{
"name":"unlock with blue key",
"condition":[{"item":"Blue Key"}],
"text":"The gate is unlocked",
"options":[{"name":"continue","effect":[{"removeItem":"Blue Key","deleteMapObject":-1}]}]
}
]
}
]

View File

@@ -1,19 +0,0 @@
[{
"effect":[],
"name":"",
"text":"A big gate is blocking the path",
"condition":[],
"options":[
{
"name":"go away"
},
{
"name":"unlock with strange key",
"condition":[{"item":"Strange Key"}],
"text":"The gate is unlocked",
"options":[{"name":"continue","effect":[{"removeItem":"Strange Key","deleteMapObject":-1}]}]
}
]
}
]

View File

@@ -1,19 +0,0 @@
[{
"effect":[],
"name":"",
"text":"A big green gate is blocking the path",
"condition":[],
"options":[
{
"name":"go away"
},
{
"name":"unlock with green key",
"condition":[{"item":"Green Key"}],
"text":"The gate is unlocked",
"options":[{"name":"continue","effect":[{"removeItem":"Green Key","deleteMapObject":-1}]}]
}
]
}
]

View File

@@ -1,19 +0,0 @@
[{
"effect":[],
"name":"",
"text":"A big red gate is blocking the path",
"condition":[],
"options":[
{
"name":"go away"
},
{
"name":"unlock with red key",
"condition":[{"item":"Red Key"}],
"text":"The gate is unlocked",
"options":[{"name":"continue","effect":[{"removeItem":"Red Key","deleteMapObject":-1}]}]
}
]
}
]

View File

@@ -1,19 +0,0 @@
[{
"effect":[],
"name":"",
"text":"A big white gate is blocking the path",
"condition":[],
"options":[
{
"name":"go away"
},
{
"name":"unlock with white key",
"condition":[{"item":"White Key"}],
"text":"The gate is unlocked",
"options":[{"name":"continue","effect":[{"removeItem":"White Key","deleteMapObject":-1}]}]
}
]
}
]

View File

@@ -3,13 +3,13 @@
"height": 4300,
"width": 2
},
"activeFile": "map/barbariancamp_2.tmx",
"activeFile": "tileset/main.tsx",
"automapping.whileDrawing": false,
"expandedProjectPaths": [
"map/main_story",
"tileset",
"obj",
"map"
"map",
"map/main_story"
],
"file.lastUsedOpenFilter": "All Files (*)",
"fileStates": {
@@ -46,11 +46,11 @@
}
},
"map/barbariancamp_2.tmx": {
"scale": 4,
"scale": 1.5,
"selectedLayer": 4,
"viewCenter": {
"x": 366.875,
"y": 101.5
"x": 217.66666666666666,
"y": 180
}
},
"map/barbariancamp_3.tmx": {
@@ -1421,6 +1421,14 @@
"y": 319.33333333333326
}
},
"map/debug_map.tmx": {
"scale": 8,
"selectedLayer": 3,
"viewCenter": {
"x": 132.8125,
"y": 159.375
}
},
"map/djinnpalace_1.tmx": {
"scale": 4,
"selectedLayer": 5,
@@ -2054,11 +2062,11 @@
}
},
"map/main_story/black_castle.tmx": {
"scale": 3.7663541666666664,
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
"x": 218.380949746937,
"y": 134.34742926680866
"x": 233.25,
"y": 311
}
},
"map/main_story/blue_castle.tmx": {
@@ -2070,11 +2078,11 @@
}
},
"map/main_story/colorless_castle.tmx": {
"scale": 2,
"selectedLayer": 1,
"scale": 3,
"selectedLayer": 4,
"viewCenter": {
"x": 260.25,
"y": 311.5
"x": 179.5,
"y": 358
}
},
"map/main_story/crypt.tmx": {
@@ -2087,26 +2095,26 @@
},
"map/main_story/final_castle.tmx": {
"scale": 2,
"selectedLayer": 4,
"selectedLayer": 2,
"viewCenter": {
"x": 222.25,
"y": 141.5
"x": 266.25,
"y": 554
}
},
"map/main_story/green_castle.tmx": {
"scale": 3,
"selectedLayer": 4,
"viewCenter": {
"x": 214.5,
"y": 151
"x": 218.5,
"y": 308
}
},
"map/main_story/red_castle.tmx": {
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
"x": 249.75,
"y": 195
"x": 272.25,
"y": 328
}
},
"map/main_story/unbenannt.tmx": {
@@ -2121,8 +2129,8 @@
"scale": 2,
"selectedLayer": 4,
"viewCenter": {
"x": 238.75,
"y": 217
"x": 228.75,
"y": 304.5
}
},
"map/maze_1.tmx": {
@@ -2695,18 +2703,18 @@
"scale": 2,
"selectedLayer": 5,
"viewCenter": {
"x": 480,
"x": 479.75,
"y": 272
}
},
"tileset/buildings.tsx": {
"scaleInDock": 2,
"scaleInDock": 0.75,
"scaleInEditor": 2
},
"tileset/main.tsx": {
"dynamicWrapping": false,
"scaleInDock": 2,
"scaleInEditor": 8
"scaleInDock": 1.5,
"scaleInEditor": 0.75
}
},
"map.height": 60,
@@ -2716,95 +2724,25 @@
"map.tileWidth": 16,
"map.width": 90,
"openFiles": [
"map/main_story/final_castle.tmx",
"tileset/main.tsx",
"map/debug_map.tmx",
"tileset/buildings.tsx",
"map/portal_1G2.tmx",
"map/island_town.tmx",
"map/mountain_town.tmx",
"map/forest_town.tmx",
"map/waste_town.tmx",
"map/swamp_town.tmx",
"map/plains_town.tmx",
"map/main_story/colorless_castle.tmx",
"map/main_story/blue_castle.tmx",
"map/aerie_1.tmx",
"map/cave_13.tmx",
"map/cave_14.tmx",
"map/cave_15.tmx",
"map/cave_16.tmx",
"map/cave_16B.tmx",
"map/cave_23B10.tmx",
"map/cave_23B2.tmx",
"map/cave_23B4.tmx",
"map/cave_23C5.tmx",
"map/cave_3.tmx",
"map/cave_25.tmx",
"map/cave_25B.tmx",
"map/cave_25C.tmx",
"map/cave_9.tmx",
"map/cave_8.tmx",
"map/cave_7.tmx",
"map/cave_4.tmx",
"map/crypt.tmx",
"map/crypt_2.tmx",
"map/crypt_3.tmx",
"map/crypt_4.tmx",
"map/crypt_5.tmx",
"map/djinnpalace_1.tmx",
"map/djinnpalace_2.tmx",
"map/djinnpalace_3.tmx",
"map/djinnpalace_3B.tmx",
"map/elftown.tmx",
"map/evilgrove_1.tmx",
"map/evilgrove_2.tmx",
"map/evilgrove_3.tmx",
"map/factory_1.tmx",
"map/factory_2.tmx",
"map/factory_3.tmx",
"map/factory_4.tmx",
"map/evilgrove_4.tmx",
"map/evilgrove_5.tmx",
"map/magetower_5.tmx",
"map/magetower_6.tmx",
"map/magetower_7.tmx",
"map/vampirecastle_4.tmx",
"map/portal_2.tmx",
"map/portal_2C.tmx",
"map/portal_2C2.tmx",
"map/portal_2D.tmx",
"map/portal_2E.tmx",
"map/portal_2F.tmx",
"map/portal_2G.tmx",
"map/cave_23I2.tmx",
"map/cave_23G4.tmx",
"map/cave_23E6.tmx",
"map/cave_23C8.tmx",
"map/cave_23B1.tmx",
"map/cave_2.tmx",
"map/cave_16BL2U.tmx",
"map/cave_16BL1.tmx",
"map/cave_1.tmx",
"map/catlair_3.tmx",
"map/catlair_2.tmx",
"map/catlair_1.tmx",
"map/barbariancamp_2.tmx"
"tileset/main.tsx"
],
"project": "main.tiled-project",
"property.type": "string",
"recentFiles": [
"map/main_story/final_castle.tmx",
"tileset/main.tsx",
"map/debug_map.tmx",
"tileset/buildings.tsx",
"map/portal_1G2.tmx",
"map/island_town.tmx",
"map/mountain_town.tmx",
"map/forest_town.tmx",
"map/waste_town.tmx",
"map/swamp_town.tmx",
"map/plains_town.tmx",
"tileset/main.tsx",
"map/main_story/white_castle.tmx",
"map/main_story/final_castle.tmx",
"map/main_story/black_castle.tmx",
"map/main_story/red_castle.tmx",
"map/main_story/green_castle.tmx",
"map/main_story/blue_castle.tmx",
"map/main_story/colorless_castle.tmx",
"map/main_story/blue_castle.tmx"
"map/barbariancamp_2.tmx",
"map/portal_1G2.tmx"
],
"resizeMap.removeObjects": true,
"textEdit.monospace": true

View File

@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.8" tiledversion="1.8.4" orientation="orthogonal" renderorder="right-down" width="30" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="6" nextobjectid="84">
<editorsettings>
<export format="tmx"/>
</editorsettings>
<properties>
<property name="dungeonEffect">{
&quot;startBattleWithCard&quot;: [ &quot;Recycle&quot; ],
&quot;opponent&quot;: {
&quot;startBattleWithCard&quot;: [ &quot;Recycle&quot; ],
}
}</property>
</properties>
<tileset firstgid="1" source="../tileset/main.tsx"/>
<tileset firstgid="6321" source="../tileset/buildings.tsx"/>
<layer id="1" name="Background" width="30" height="30">
<data encoding="base64" compression="zlib">
eJztzaENADAIADBuIFnC/5dxCnoegaiobmVEASzp9/MCANw1XzWdLQ==
</data>
</layer>
<layer id="2" name="Ground" width="30" height="30">
<data encoding="base64" compression="zlib">
eJyTEGBgkBjFGFgaiLdhwVI0tlcSRAthYvFRe6mKa/kZGKqAuJofYl8llF/DT1t70f1Na3/S015pKI2eZ0Bi26H2bsUiT2nekoTS6ACbGDZAbliQam+jJANDkyR17IWFGQyg85HBXKCd86hkLyVg1N5RewfaXuQyiZ72UhOQY+9IiV9S7FUiID9qL3EY1pZCxvjsRVdLzTYXPnupZQchu5HtpbWdyHEPspfSdh0A9Qp8zA==
</data>
</layer>
<layer id="3" name="Foreground" width="30" height="30">
<properties>
<property name="spriteLayer" type="bool" value="true"/>
</properties>
<data encoding="base64" compression="zlib">
eJxjYBg4oCAAweh8ZDFyzECmiVFDin2EzMBnJjY1pNpNrF8Gyr+Ewp3S+EW3Axt/FFAXkJpudgDV7RRA0ITkcakbCDCQaYuc/DEKRsEoGAWjYBSMglFAKQAAIRMR9g==
</data>
</layer>
<objectgroup id="4" name="Objects">
<object id="47" template="../obj/gold.tx" x="96" y="224"/>
<object id="49" template="../obj/gold.tx" x="176" y="224"/>
<object id="50" template="../obj/enemy.tx" x="112" y="192" width="64" height="64">
<properties>
<property name="enemy" value="Emrakul"/>
</properties>
</object>
<object id="51" template="../obj/entry_up.tx" x="209" y="480">
<properties>
<property name="teleport" value=""/>
</properties>
</object>
<object id="52" template="../obj/gate.tx" x="208" y="384">
<properties>
<property name="dialog">[
{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;ABC&quot;,
&quot;text&quot;:&quot;I am a big gate. Greetings.&quot;,
&quot;loctext&quot;:&quot;&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[ { &quot;name&quot;:&quot;Okay...&quot; } ]
}
]</property>
</properties>
</object>
<object id="54" template="../obj/treasure.tx" x="320" y="176">
<properties>
<property name="reward">[
{
&quot;type&quot;: &quot;life&quot;,
&quot;count&quot;: 3
}
]
</property>
<property name="sprite" value="sprites/3life.atlas"/>
</properties>
</object>
<object id="69" template="../obj/treasure.tx" x="192" y="352"/>
<object id="74" template="../obj/treasure.tx" x="224" y="352"/>
<object id="70" template="../obj/booster.tx" x="32" y="336"/>
<object id="72" template="../obj/booster.tx" x="224" y="320"/>
<object id="71" template="../obj/gold.tx" x="48" y="352"/>
<object id="73" template="../obj/gold.tx" x="224" y="288"/>
<object id="78" template="../obj/gate.tx" x="144" y="208" visible="0">
<properties>
<property name="dialog">[
{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;ABC&quot;,
&quot;text&quot;:&quot;EMRAKUL\nDon't mind me, just chilling.&quot;,
&quot;loctext&quot;:&quot;&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[ { &quot;name&quot;:&quot;It happens.&quot; } ]
}
]</property>
</properties>
</object>
<object id="79" template="../obj/gate.tx" x="128" y="208" visible="0">
<properties>
<property name="dialog">[
{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;ABC&quot;,
&quot;text&quot;:&quot;EMRAKUL\nDon't mind me, just chilling.&quot;,
&quot;loctext&quot;:&quot;&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[ { &quot;name&quot;:&quot;It happens.&quot; } ]
}
]</property>
</properties>
</object>
<object id="80" template="../obj/enemy.tx" x="96" y="304">
<properties>
<property name="dialog">[
{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;ABC&quot;,
&quot;text&quot;:&quot;I am an elf. I do elf things like hugging trees and being pretty.&quot;,
&quot;loctext&quot;:&quot;&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[
{ &quot;name&quot;:&quot;OK&quot; },
{
&quot;name&quot;:&quot;Fight me, elf!&quot;,
&quot;text&quot;: &quot;Gladly.&quot;,
&quot;options&quot;: [ { &quot;name&quot;: &quot;I FEAR NOTHING!!?&quot;, &quot;effect&quot;: [ { &quot;battleWithActorID&quot;: -1 } ]} ]
},
{
&quot;name&quot;:&quot;I wanna fight Emrakul over there!&quot;,
&quot;condition&quot;: [ { &quot;actorID&quot;: 50 } ],
&quot;text&quot;: &quot;Really? Oh well... your funeral.\nHEY EMMY! THIS DUDE WANTS TO DANCE!&quot;,
&quot;options&quot;: [ { &quot;name&quot;: &quot;WAIT IT WAS A JOKE!!!&quot;, &quot;effect&quot;: [ { &quot;battleWithActorID&quot;: 50 } ]} ]
},
{
&quot;name&quot;:&quot;I wanna fight Emrakul over there!&quot;,
&quot;condition&quot;: [ { &quot;actorID&quot;: 50, &quot;not&quot;: true } ],
&quot;text&quot;: &quot;She left. Crying. You monster.&quot;,
&quot;options&quot;: [ { &quot;name&quot;: &quot;Sorry...&quot; } ]
},
{
&quot;name&quot;:&quot;That's cool dude.&quot;,
&quot;condition&quot;: [ { &quot;item&quot;: &quot;Treasure&quot;, &quot;not&quot;: true } ],
&quot;effect&quot;: [ { &quot;addItem&quot;: &quot;Treasure&quot; } ],
&quot;text&quot;: &quot;You get it. Take this.&quot;,
&quot;options&quot;: [ { &quot;name&quot;: &quot;Thanks bro.&quot; } ]
},
{
&quot;name&quot;:&quot;Can you open that hidden wall?&quot;,
&quot;condition&quot;: [ { &quot;actorID&quot;: 83 } ],
&quot;text&quot;: &quot;Since you asked nicely, I shall.&quot;,
&quot;options&quot;: [ { &quot;name&quot;: &quot;Thanks bro.&quot;, &quot;effect&quot;: [ { &quot;deleteMapObject&quot;: 83 } ]} ]
}
]
}
]</property>
<property name="enemy" value="Elf"/>
<property name="permanent" type="bool" value="true"/>
</properties>
</object>
<object id="81" template="../obj/enemy.tx" x="288" y="224">
<properties>
<property name="enemy" value="Goblin"/>
</properties>
</object>
<object id="82" template="../obj/enemy.tx" gid="2147491275" x="272" y="224">
<properties>
<property name="enemy" value="Goblin"/>
</properties>
</object>
<object id="83" template="../obj/gate.tx" type="dummy" gid="3651" x="64" y="336" width="16" height="16"/>
</objectgroup>
</map>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.8" tiledversion="1.8.4" orientation="orthogonal" renderorder="right-down" width="30" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="6" nextobjectid="65">
<map version="1.8" tiledversion="1.8.4" orientation="orthogonal" renderorder="right-down" width="30" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="6" nextobjectid="69">
<editorsettings>
<export target="wastetown..tmx" format="tmx"/>
</editorsettings>
@@ -43,7 +43,26 @@
</object>
<object id="52" template="../../obj/gate.tx" x="208" y="448">
<properties>
<property name="dialog" value="dialogs/colorless_door.json"/>
<property name="dialog">[
{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;ABC&quot;,
&quot;text&quot;:&quot;A big gate is blocking the path.&quot;,
&quot;loctext&quot;:&quot;&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[
{ &quot;name&quot;:&quot;go away&quot; },
{
&quot;name&quot;:&quot;unlock with strange key&quot;,
&quot;condition&quot;:[ { &quot;item&quot;:&quot;Strange Key&quot;} ],
&quot;text&quot;:&quot;The gate is unlocked&quot;,
&quot;options&quot;:[
{&quot;name&quot;:&quot;continue&quot;,&quot;effect&quot;: [ { &quot;removeItem&quot;:&quot;Strange Key&quot;,&quot;deleteMapObject&quot;:-1 } ] }
]
}
]
}
]</property>
</properties>
</object>
<object id="54" template="../../obj/treasure.tx" x="208" y="80">

View File

@@ -4,7 +4,7 @@
<export target="wastetown..tmx" format="tmx"/>
</editorsettings>
<tileset firstgid="1" source="../../tileset/main.tsx"/>
<tileset firstgid="4425" source="../../tileset/buildings.tsx"/>
<tileset firstgid="6321" source="../../tileset/buildings.tsx"/>
<layer id="1" name="Background" width="30" height="114">
<data encoding="base64" compression="zlib">
eJztw8EJAAAMA6H7dn/IvF1EwV1NVVVVVVVVVVVVVVVV1R62fUyd
@@ -68,27 +68,117 @@
</object>
<object id="56" template="../../obj/gate.tx" x="208" y="1680">
<properties>
<property name="dialog" value="dialogs/red_door.json"/>
<property name="dialog">[{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;&quot;,
&quot;text&quot;:&quot;A big red gate is blocking the path&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[
{ &quot;name&quot;:&quot;go away&quot; },
{
&quot;name&quot;:&quot;unlock with red key&quot;,
&quot;condition&quot;:[ { &quot;item&quot;: &quot;Red Key&quot; } ],
&quot;text&quot;:&quot;The gate is unlocked&quot;,
&quot;options&quot;:[
{
&quot;name&quot;:&quot;continue&quot;,&quot;effect&quot;:[{&quot;removeItem&quot;:&quot;Red Key&quot;,&quot;deleteMapObject&quot;:-1}]
}
]
}
]
}]</property>
</properties>
</object>
<object id="57" template="../../obj/gate.tx" x="208" y="1440">
<properties>
<property name="dialog" value="dialogs/blue_door.json"/>
<property name="dialog">[{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;&quot;,
&quot;text&quot;:&quot;A big blue gate is blocking the path&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[
{
&quot;name&quot;:&quot;go away&quot;
},
{
&quot;name&quot;:&quot;unlock with blue key&quot;,
&quot;condition&quot;:[{&quot;item&quot;:&quot;Blue Key&quot;}],
&quot;text&quot;:&quot;The gate is unlocked&quot;,
&quot;options&quot;:[{&quot;name&quot;:&quot;continue&quot;,&quot;effect&quot;:[{&quot;removeItem&quot;:&quot;Blue Key&quot;,&quot;deleteMapObject&quot;:-1}]}]
}
]
}
]</property>
</properties>
</object>
<object id="58" template="../../obj/gate.tx" x="208" y="1216">
<properties>
<property name="dialog" value="dialogs/green_door.json"/>
<property name="dialog">[{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;&quot;,
&quot;text&quot;:&quot;A big green gate is blocking the path&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[
{
&quot;name&quot;:&quot;go away&quot;
},
{
&quot;name&quot;:&quot;unlock with green key&quot;,
&quot;condition&quot;:[{&quot;item&quot;:&quot;Green Key&quot;}],
&quot;text&quot;:&quot;The gate is unlocked&quot;,
&quot;options&quot;:[{&quot;name&quot;:&quot;continue&quot;,&quot;effect&quot;:[{&quot;removeItem&quot;:&quot;Green Key&quot;,&quot;deleteMapObject&quot;:-1}]}]
}
]
}
]</property>
</properties>
</object>
<object id="59" template="../../obj/gate.tx" x="208" y="992">
<properties>
<property name="dialog" value="dialogs/white_door.json"/>
<property name="dialog">[{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;&quot;,
&quot;text&quot;:&quot;A big white gate is blocking the path&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[
{
&quot;name&quot;:&quot;go away&quot;
},
{
&quot;name&quot;:&quot;unlock with white key&quot;,
&quot;condition&quot;:[{&quot;item&quot;:&quot;White Key&quot;}],
&quot;text&quot;:&quot;The gate is unlocked&quot;,
&quot;options&quot;:[{&quot;name&quot;:&quot;continue&quot;,&quot;effect&quot;:[{&quot;removeItem&quot;:&quot;White Key&quot;,&quot;deleteMapObject&quot;:-1}]}]
}
]
}
]</property>
</properties>
</object>
<object id="60" template="../../obj/gate.tx" x="208" y="768">
<properties>
<property name="dialog" value="dialogs/black_door.json"/>
<property name="dialog">[{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;&quot;,
&quot;text&quot;:&quot;A big black gate is blocking the path&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[
{
&quot;name&quot;:&quot;go away&quot;
},
{
&quot;name&quot;:&quot;unlock with black key&quot;,
&quot;condition&quot;:[{&quot;item&quot;:&quot;Black Key&quot;}],
&quot;text&quot;:&quot;The gate is unlocked&quot;,
&quot;options&quot;:[{&quot;name&quot;:&quot;continue&quot;,&quot;effect&quot;:[{&quot;removeItem&quot;:&quot;Black Key&quot;,&quot;deleteMapObject&quot;:-1}]}]
}
]
}
]</property>
</properties>
</object>
<object id="62" template="../../obj/treasure.tx" x="208" y="80">

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<template>
<tileset firstgid="1" source="../tileset/buildings.tsx"/>
<object name="Dummy" type="dummy" gid="1307" width="16" height="16">
<properties>
<property name="sprite" value=""/>
</properties>
</object>
</template>

View File

@@ -3,7 +3,16 @@
<tileset firstgid="1" source="../tileset/main.tsx"/>
<object name="Gate" type="dialog" gid="4125" width="16" height="16">
<properties>
<property name="dialog" value=""/>
<property name="dialog">[
{
&quot;effect&quot;:[],
&quot;name&quot;:&quot;ABC&quot;,
&quot;text&quot;:&quot;I am a big gate. Greetings.&quot;,
&quot;loctext&quot;:&quot;&quot;,
&quot;condition&quot;:[],
&quot;options&quot;:[ { &quot;name&quot;:&quot;Okay...&quot; } ]
}
]</property>
</properties>
</object>
</template>

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

View File

@@ -0,0 +1,102 @@
info face="MiKrollFantasyBig" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0
common lineHeight=28 base=21 scaleW=506 scaleH=39 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0
page id=0 file="MiKrollFantasyBig.png"
chars count=97
char id=0 x=2 y=2 width=9 height=22 xoffset=0 yoffset=-1 xadvance=12 page=0 chnl=0
char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=10 page=0 chnl=0
char id=33 x=289 y=2 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0
char id=34 x=332 y=26 width=6 height=4 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0
char id=35 x=124 y=26 width=10 height=10 xoffset=-1 yoffset=11 xadvance=12 page=0 chnl=0
char id=36 x=129 y=2 width=8 height=12 xoffset=-1 yoffset=11 xadvance=10 page=0 chnl=0
char id=37 x=278 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=38 x=136 y=26 width=10 height=10 xoffset=-1 yoffset=11 xadvance=12 page=0 chnl=0
char id=39 x=344 y=26 width=2 height=4 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0
char id=40 x=37 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0
char id=41 x=43 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0
char id=42 x=288 y=26 width=6 height=6 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0
char id=43 x=296 y=26 width=6 height=6 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0
char id=44 x=340 y=26 width=2 height=4 xoffset=-1 yoffset=19 xadvance=4 page=0 chnl=0
char id=45 x=366 y=26 width=4 height=2 xoffset=-1 yoffset=15 xadvance=6 page=0 chnl=0
char id=46 x=362 y=26 width=2 height=2 xoffset=-1 yoffset=19 xadvance=4 page=0 chnl=0
char id=47 x=77 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0
char id=48 x=303 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=49 x=395 y=2 width=6 height=12 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0
char id=50 x=385 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=51 x=375 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=52 x=363 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0
char id=53 x=353 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=54 x=343 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=55 x=333 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=56 x=323 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=57 x=313 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=58 x=221 y=2 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0
char id=59 x=33 y=2 width=2 height=14 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0
char id=60 x=112 y=26 width=10 height=10 xoffset=-1 yoffset=11 xadvance=12 page=0 chnl=0
char id=61 x=304 y=26 width=6 height=6 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0
char id=62 x=98 y=26 width=12 height=10 xoffset=-1 yoffset=11 xadvance=14 page=0 chnl=0
char id=63 x=267 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=64 x=85 y=2 width=14 height=14 xoffset=-1 yoffset=7 xadvance=16 page=0 chnl=0
char id=65 x=109 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=66 x=119 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=67 x=143 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=68 x=153 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=69 x=163 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=70 x=173 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=71 x=183 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=72 x=193 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=73 x=203 y=2 width=6 height=12 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0
char id=74 x=211 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=75 x=225 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=76 x=235 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=77 x=245 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0
char id=78 x=257 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=79 x=277 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0
char id=80 x=293 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=81 x=21 y=2 width=10 height=14 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0
char id=82 x=403 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=83 x=423 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=84 x=433 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0
char id=85 x=445 y=2 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=86 x=455 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0
char id=87 x=473 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0
char id=88 x=485 y=2 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0
char id=89 x=10 y=26 width=10 height=12 xoffset=-1 yoffset=9 xadvance=12 page=0 chnl=0
char id=90 x=22 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=91 x=49 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0
char id=92 x=101 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0
char id=93 x=55 y=2 width=4 height=14 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0
char id=94 x=324 y=26 width=6 height=4 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0
char id=95 x=352 y=26 width=8 height=2 xoffset=-1 yoffset=19 xadvance=10 page=0 chnl=0
char id=96 x=348 y=26 width=2 height=4 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0
char id=97 x=250 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=98 x=32 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=99 x=270 y=26 width=6 height=8 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0
char id=100 x=56 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=101 x=148 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=102 x=90 y=26 width=6 height=12 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0
char id=103 x=80 y=26 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=104 x=70 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=105 x=66 y=26 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0
char id=106 x=13 y=2 width=6 height=16 xoffset=-1 yoffset=9 xadvance=8 page=0 chnl=0
char id=107 x=46 y=26 width=8 height=12 xoffset=-1 yoffset=9 xadvance=10 page=0 chnl=0
char id=108 x=42 y=26 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0
char id=109 x=158 y=26 width=10 height=8 xoffset=-1 yoffset=13 xadvance=12 page=0 chnl=0
char id=110 x=170 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=111 x=180 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=112 x=0 y=26 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=113 x=497 y=2 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=114 x=190 y=26 width=6 height=8 xoffset=-1 yoffset=13 xadvance=8 page=0 chnl=0
char id=115 x=198 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=116 x=467 y=2 width=4 height=12 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=0
char id=117 x=208 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=118 x=218 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=119 x=228 y=26 width=10 height=8 xoffset=-1 yoffset=13 xadvance=12 page=0 chnl=0
char id=120 x=240 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=121 x=413 y=2 width=8 height=12 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=122 x=260 y=26 width=8 height=8 xoffset=-1 yoffset=13 xadvance=10 page=0 chnl=0
char id=123 x=61 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0
char id=124 x=139 y=2 width=2 height=12 xoffset=-1 yoffset=9 xadvance=4 page=0 chnl=0
char id=125 x=69 y=2 width=6 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0
char id=126 x=312 y=26 width=10 height=6 xoffset=-1 yoffset=13 xadvance=12 page=0 chnl=0
char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=21 xadvance=10 page=0 chnl=0
kernings count=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,4 +1,18 @@
{
"com.badlogic.gdx.graphics.g2d.BitmapFont": {
"big": {
"file": "LanaPixelCJK.fnt"
},
"black": {
"file": "LanaPixelCJK.fnt"
},
"blackbig": {
"file": "LanaPixelCJK.fnt"
},
"default": {
"file": "LanaPixelCJK.fnt"
}
},
"com.badlogic.gdx.graphics.Color": {
"RGBA_0_0_0_255": {
"r": 0,

View File

@@ -1,4 +1,4 @@
Lathiss.png
lathiss.png
size: 128,112
format: RGBA8888
filter: Nearest,Nearest
@@ -41,4 +41,4 @@ Death
size: 32, 32
Death
xy: 96, 80
size: 32, 32
size: 32, 32

View File

@@ -1,489 +1,692 @@
[
{
"name": "Sol Ring",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Sol Ring"],
"iconName" :"SolRing"
},
{
"name": "Mox Emerald",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Mox Emerald"],
"iconName" :"MoxEmerald"
},
{
"name": "Black Lotus",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Black Lotus"],
"iconName" :"BlackLotus"
},
[
{
"name": "Sol Ring",
"equipmentSlot": "Left",
"iconName": "SolRing",
"effect": {
"startBattleWithCard": [
"Sol Ring"
]
}
},
{
"name": "Mox Emerald",
"equipmentSlot": "Neck",
"iconName": "MoxEmerald",
"effect": {
"startBattleWithCard": [
"Mox Emerald"
]
}
},
{
"name": "Black Lotus",
"equipmentSlot": "Right",
"iconName": "BlackLotus",
"effect": {
"startBattleWithCard": [
"Black Lotus"
]
}
},
{
"name": "Mox Jet",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Mox Jet"],
"iconName" :"MoxJet"
"iconName": "MoxJet",
"effect": {
"startBattleWithCard": [
"Mox Jet"
]
}
},
{
"name": "Mox Pearl",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Mox Pearl"],
"iconName" :"MoxPearl"
"iconName": "MoxPearl",
"effect": {
"startBattleWithCard": [
"Mox Pearl"
]
}
},
{
"name": "Mox Ruby",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Mox Ruby"],
"iconName" :"MoxRuby"
"iconName": "MoxRuby",
"effect": {
"startBattleWithCard": [
"Mox Ruby"
]
}
},
{
"name": "Mox Sapphire",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Mox Sapphire"],
"iconName" :"MoxSapphire"
"iconName": "MoxSapphire",
"effect": {
"startBattleWithCard": [
"Mox Sapphire"
]
}
},
{
"name": "Battle Standard",
"equipmentSlot": "Left",
"iconName": "BattleStandard",
"effect": {
"lifeModifier": -1,
"startBattleWithCard": [
"r_1_1_goblin"
]
}
},
{
"name": "Life Amulet",
"equipmentSlot": "Neck",
"iconName": "LifeAmulet",
"effect": {
"lifeModifier": 2
}
},
{
"name": "Red Key",
"iconName": "RedKey",
"questItem": true
},
{
"name": "White Key",
"iconName": "WhiteKey",
"questItem": true
},
{
"name": "Blue Key",
"iconName": "BlueKey",
"questItem": true
},
{
"name": "Green Key",
"iconName": "GreenKey",
"questItem": true
},
{
"name": "Black Key",
"iconName": "BlackKey",
"questItem": true
},
{
"name": "Strange Key",
"iconName": "StrangeKey",
"questItem": true
},
{
"name": "Battle Standard",
"equipmentSlot": "Left",
"lifeModifier": -1,
"startBattleWithCard" : ["r_1_1_goblin"],
"iconName" :"BattleStandard"
} ,
{
"name": "Life Amulet",
"equipmentSlot": "Neck",
"lifeModifier": 2,
"iconName" :"LifeAmulet"
} ,
{
"name": "Red Key",
"questItem": true,
"iconName" :"RedKey"
} ,
{
"name": "White Key",
"questItem": true,
"iconName" :"WhiteKey"
},
{
"name": "Blue Key",
"questItem": true,
"iconName" :"BlueKey"
},
{
"name": "Green Key",
"questItem": true,
"iconName" :"GreenKey"
},
{
"name": "Black Key",
"questItem": true,
"iconName" :"BlackKey"
},
{
"name": "Strange Key",
"questItem": true,
"iconName" :"StrangeKey"
}
,
{
"name": "Steel Sword",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Greatsword"],
"iconName" :"SteelSword"
}
,
"iconName": "SteelSword",
"effect": {
"startBattleWithCard": [
"Greatsword"
]
}
},
{
"name": "Axt",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Bonesplitter"],
"iconName" :"SteelAxt"
}
,
"iconName": "SteelAxt",
"effect": {
"startBattleWithCard": [
"Bonesplitter"
]
}
},
{
"name": "Steel Boots",
"equipmentSlot": "Boots",
"lifeModifier": 1,
"moveSpeed" : 1.2,
"iconName" :"SteelBoots" ,
"cost" :500
}
,
"iconName": "SteelBoots",
"cost": 500,
"effect": {
"lifeModifier": 1,
"moveSpeed": 1.2
}
},
{
"name": "Steel Shield",
"equipmentSlot": "Right",
"startBattleWithCard" : ["w_0_3_wall_defender"],
"iconName" :"SteelShield",
"cost" :500
}
,
"iconName": "SteelShield",
"cost": 500,
"effect": {
"startBattleWithCard": [
"w_0_3_wall_defender"
]
}
},
{
"name": "Steel Armor",
"equipmentSlot": "Body",
"lifeModifier": 3,
"iconName" :"SteelArmor" ,
"cost" :500
}
,
"cost": 500,
"iconName": "SteelArmor",
"effect": {
"lifeModifier": 3
}
},
{
"name": "Leather Boots",
"equipmentSlot": "Boots",
"moveSpeed" : 1.15,
"iconName" :"LeatherBoots"
}
,
"iconName": "LeatherBoots",
"effect": {
"moveSpeed": 1.15
}
},
{
"name": "Jungle Shield",
"equipmentSlot": "Right",
"startBattleWithCard" : ["g_0_1_plant"],
"iconName" :"JungleShield"
}
,
"iconName": "JungleShield",
"effect": {
"startBattleWithCard": [
"g_0_1_plant"
]
}
},
{
"name": "Dagger",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Spare Dagger"],
"iconName" :"Dagger"
}
,
"iconName": "Dagger",
"effect": {
"startBattleWithCard": [
"Spare Dagger"
]
}
},
{
"name": "Cheat",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Blightsteel Colossus","Lightning Greaves"],
"iconName" :"Goose"
}
,
"iconName": "Goose",
"effect": {
"startBattleWithCard": [
"Blightsteel Colossus",
"Lightning Greaves"
]
}
},
{
"name": "Aladdin's Ring",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Aladdin's Ring"],
"iconName" :"AladdinsRing"
}
,
"iconName": "AladdinsRing",
"effect": {
"startBattleWithCard": [
"Aladdin's Ring"
]
}
},
{
"name": "Spell Book",
"iconName": "SpellBook",
"equipmentSlot": "Left",
"changeStartCards" : 1,
"iconName" :"SpellBook"
"effect": {
"changeStartCards": 1
}
},
{
"name": "Cursed Ring",
"equipmentSlot": "Right",
"startBattleWithCard" : ["c_0_1_a_goblin_construct_noblock_ping","c_0_1_a_goblin_construct_noblock_ping","c_0_1_a_goblin_construct_noblock_ping"],
"iconName" :"CursedRing"
"iconName": "CursedRing",
"effect": {
"startBattleWithCard": [
"c_0_1_a_goblin_construct_noblock_ping",
"c_0_1_a_goblin_construct_noblock_ping",
"c_0_1_a_goblin_construct_noblock_ping"
]
}
},
{
"name": "Mithril Boots",
"equipmentSlot": "Boots",
"lifeModifier": 2,
"moveSpeed" : 1.3,
"iconName" :"MithrilBoots" ,
"cost" :1500
}
,
"iconName": "MithrilBoots",
"cost": 1500,
"effect": {
"lifeModifier": 2,
"moveSpeed": 1.3
}
},
{
"name": "Mithril Shield",
"equipmentSlot": "Right",
"startBattleWithCard" : ["c_0_4_a_wall_defender"],
"iconName" :"MithrilShield" ,
"cost" :1500
}
,
"iconName": "MithrilShield",
"cost": 1500,
"effect": {
"startBattleWithCard": [
"c_0_4_a_wall_defender"
]
}
},
{
"name": "Mithril Armor",
"equipmentSlot": "Body",
"lifeModifier": 5,
"iconName" :"MithrilArmor" ,
"cost" :1500
"iconName": "MithrilArmor",
"cost": 1500,
"effect": {
"lifeModifier": 5
}
},
{
"name": "Death Ring",
"equipmentSlot": "Right",
"opponent":{
"startBattleWithCard" : ["c_0_1_a_goblin_construct_noblock_ping","c_0_1_a_goblin_construct_noblock_ping","c_0_1_a_goblin_construct_noblock_ping"]},
"iconName" :"DeathRing"
"iconName": "DeathRing",
"effect": {
"opponent": {
"startBattleWithCard": [
"c_0_1_a_goblin_construct_noblock_ping",
"c_0_1_a_goblin_construct_noblock_ping",
"c_0_1_a_goblin_construct_noblock_ping"
]
}
}
},
{
"name": "Flame Sword",
"equipmentSlot": "Left",
"opponent":{
"lifeModifier" : -5
},
"iconName" :"FlameSword"
}
,
"iconName": "FlameSword",
"effect": {
"opponent": {
"lifeModifier": -5
}
}
},
{
"name": "Mirror Shield",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Mirror Shield"],
"iconName" :"MirrorShield"
}
,
"iconName": "MirrorShield",
"effect": {
"startBattleWithCard": [
"Mirror Shield"
]
}
},
{
"name": "Dungeon Map",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Dungeon Map"],
"iconName" :"DungeonMap"
}
,
"iconName": "DungeonMap",
"effect": {
"startBattleWithCard": [
"Dungeon Map"
]
}
},
{
"name": "Aladdin's Lamp",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Aladdin's Lamp"],
"iconName" :"AladdinsLamp"
}
,
"iconName": "AladdinsLamp",
"effect": {
"startBattleWithCard": [
"Aladdin's Lamp"
]
}
},
{
"name": "Heart-Piercer",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Heart-Piercer Bow"],
"iconName" :"CompositeBow"
}
,
"iconName": "CompositeBow",
"effect": {
"startBattleWithCard": [
"Heart-Piercer Bow"
]
}
},
{
"name": "Wood Bow",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Fyndhorn Bow"],
"iconName" :"WoodBow"
"iconName": "WoodBow",
"effect": {
"startBattleWithCard": [ "Fyndhorn Bow" ]
}
},
{
"name": "Sandals",
"equipmentSlot": "Boots",
"moveSpeed" : 1.1,
"iconName" :"Sandals"
"iconName": "Sandals",
"effect": {
"moveSpeed": 1.1
}
},
{
"name": "Gold Boots",
"equipmentSlot": "Boots",
"lifeModifier": 2,
"moveSpeed" : 1.3,
"iconName" :"GoldBoots"
}
,
"iconName": "GoldBoots",
"effect": {
"lifeModifier": 2,
"moveSpeed": 1.3
}
},
{
"name": "Gold Shield",
"equipmentSlot": "Right",
"lifeModifier": 3,
"iconName" :"GoldShield"
}
,
"iconName": "GoldShield",
"effect": {
"lifeModifier": 3
}
},
{
"name": "Gold Armor",
"equipmentSlot": "Body",
"lifeModifier": 4,
"iconName" :"GoldArmor"
"iconName": "GoldArmor",
"effect": {
"lifeModifier": 4
}
},
{
"name": "Dark Boots",
"equipmentSlot": "Boots",
"startBattleWithCard" : ["Clattering Augur"],
"lifeModifier": -2,
"moveSpeed" : 1.3,
"iconName" :"DarkBoots"
}
,
"iconName": "DarkBoots",
"effect": {
"startBattleWithCard": [
"Clattering Augur"
],
"lifeModifier": -2,
"moveSpeed": 1.3
}
},
{
"name": "Dark Shield",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Barrier of Bones"],
"lifeModifier": -3,
"iconName" :"DarkShield"
}
,
"iconName": "DarkShield",
"effect": {
"startBattleWithCard": [
"Barrier of Bones"
],
"lifeModifier": -3
}
},
{
"name": "Dark Armor",
"equipmentSlot": "Body",
"startBattleWithCard" : ["Skeletal Snake"],
"lifeModifier": -4,
"iconName" :"DarkArmor"
"iconName": "DarkArmor",
"effect": {
"startBattleWithCard": [
"Skeletal Snake"
],
"lifeModifier": -4
}
},
{
"name": "Blood Vial",
"equipmentSlot": "Right",
"startBattleWithCard" : ["c_a_blood_draw"],
"iconName" :"Blood"
"iconName": "Blood",
"effect": {
"startBattleWithCard": [
"c_a_blood_draw"
]
}
},
{
"name": "Charm",
"equipmentSlot": "Right",
"startBattleWithCard" : ["c_a_clue_draw"],
"iconName" :"Clue"
"iconName": "Clue",
"effect": {
"startBattleWithCard": [
"c_a_clue_draw"
]
}
},
{
"name": "Snack",
"equipmentSlot": "Right",
"startBattleWithCard" : ["c_a_food_sac"],
"iconName" :"Cheese"
"iconName": "Cheese",
"effect": {
"startBattleWithCard": [
"c_a_food_sac"
]
}
},
{
"name": "Change",
"equipmentSlot": "Right",
"startBattleWithCard" : ["c_a_gold_draw"],
"iconName" :"Gold"
"iconName": "Gold",
"effect": {
"startBattleWithCard": [
"c_a_gold_draw"
]
}
},
{
"name": "Treasure",
"equipmentSlot": "Right",
"startBattleWithCard" : ["c_a_treasure_sac"],
"iconName" :"Treasure"
"iconName": "Treasure",
"effect": {
"startBattleWithCard": [
"c_a_treasure_sac"
]
}
},
{
"name": "Magic Shard",
"equipmentSlot": "Right",
"startBattleWithCard" : ["c_e_shard_draw"],
"iconName" :"Shard"
}
,
"iconName": "Shard",
"effect": {
"startBattleWithCard": [
"c_e_shard_draw"
]
}
},
{
"name": "Mad Staff",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Power Struggle"],
"iconName" :"MadStaff"
}
,
"iconName": "MadStaff",
"effect": {
"startBattleWithCard": [
"Power Struggle"
]
}
},
{
"name": "Dark Amulet",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Necropolis of Azar"],
"iconName" :"DarkAmulet"
}
,
"iconName": "DarkAmulet",
"effect": {
"startBattleWithCard": [
"Necropolis of Azar"
]
}
},
{
"name": "Pandora's Box",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Pandora's Box"],
"iconName" :"PandorasBox"
}
,
"iconName": "PandorasBox",
"effect": {
"startBattleWithCard": [
"Pandora's Box"
]
}
},
{
"name": "Disrupting Scepter",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Disrupting Scepter"],
"iconName" :"DisruptingScepter"
}
,
"iconName": "DisruptingScepter",
"effect": {
"startBattleWithCard": [
"Disrupting Scepter"
]
}
},
{
"name": "Entrancing Lyre",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Entrancing Lyre"],
"iconName" :"EntrancingLyre"
}
,
"iconName": "EntrancingLyre",
"effect": {
"startBattleWithCard": [
"Entrancing Lyre"
]
}
},
{
"name": "Heavy Arbalest",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Heavy Arbalest"],
"iconName" :"HeavyArbalest"
}
,
"iconName": "HeavyArbalest",
"effect": {
"startBattleWithCard": [
"Heavy Arbalest"
]
}
},
{
"name": "Ring of Three Wishes",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Ring of Three Wishes"],
"iconName" :"RingofThreeWishes"
}
,
"iconName": "RingofThreeWishes",
"effect": {
"startBattleWithCard": [
"Ring of Three Wishes"
]
}
},
{
"name": "The Blackstaff of Waterdeep",
"equipmentSlot": "Left",
"startBattleWithCard" : ["The Blackstaff of Waterdeep"],
"iconName" :"TheBlackstaffofWaterdeep"
}
,
"iconName": "TheBlackstaffofWaterdeep",
"effect": {
"startBattleWithCard": [
"The Blackstaff of Waterdeep"
]
}
},
{
"name": "Unerring Sling",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Unerring Sling"],
"iconName" :"UnerringSling"
}
,
"iconName": "UnerringSling",
"effect": {
"startBattleWithCard": [
"Unerring Sling"
]
}
},
{
"name": "Jeweled Amulet",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Jeweled Amulet"],
"iconName" :"JeweledAmulet"
}
,
"iconName": "JeweledAmulet",
"effect": {
"startBattleWithCard": [
"Jeweled Amulet"
]
}
},
{
"name": "Traveler's Amulet",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Traveler's Amulet"],
"iconName" :"TravelersAmulet"
}
,
"iconName": "TravelersAmulet",
"effect": {
"startBattleWithCard": [
"Traveler's Amulet"
]
}
},
{
"name": "Relic Amulet",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Relic Amulet"],
"iconName" :"RelicAmulet"
}
,
"iconName": "RelicAmulet",
"effect": {
"startBattleWithCard": [
"Relic Amulet"
]
}
},
{
"name": "Amulet of Kroog",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Amulet of Kroog"],
"iconName" :"AmuletofKroog"
}
,
"iconName": "AmuletofKroog",
"effect": {
"startBattleWithCard": [
"Amulet of Kroog"
]
}
},
{
"name": "Amulet of Vigor",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Amulet of Vigor"],
"iconName" :"AmuletofVigor"
}
,
"iconName": "AmuletofVigor",
"effect": {
"startBattleWithCard": [
"Amulet of Vigor"
]
}
},
{
"name": "Veilstone Amulet",
"equipmentSlot": "Neck",
"startBattleWithCard" : ["Veilstone Amulet"],
"iconName" :"VeilstoneAmulet"
}
,
"iconName": "VeilstoneAmulet",
"effect": {
"startBattleWithCard": [
"Veilstone Amulet"
]
}
},
{
"name": "Jandor's Ring",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Jandor's Ring"],
"iconName" :"JandorsRing"
"iconName": "JandorsRing",
"effect": {
"startBattleWithCard": [
"Jandor's Ring"
]
}
},
{
"name": "Jinxed Ring",
"equipmentSlot": "Right",
"opponent":{
"startBattleWithCard" : ["Jinxed Ring"]},
"iconName" :"JinxedRing"
}
,
"iconName": "JinxedRing",
"effect": {
"opponent": {
"startBattleWithCard": [
"Jinxed Ring"
]
}
}
},
{
"name": "Nine-Ringed Bo",
"equipmentSlot": "Left",
"startBattleWithCard" : ["Nine-Ringed Bo"],
"iconName" :"Nine-RingedBo"
}
,
"iconName": "Nine-RingedBo",
"effect": {
"startBattleWithCard": [
"Nine-Ringed Bo"
]
}
},
{
"name": "Ring of Immortals",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Ring of Immortals"],
"iconName" :"RingofImmortals"
}
,
"iconName": "RingofImmortals",
"effect": {
"startBattleWithCard": [
"Ring of Immortals"
]
}
},
{
"name": "Prism Ring",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Prism Ring"],
"iconName" :"PrismRing"
}
,
"iconName": "PrismRing",
"effect": {
"startBattleWithCard": [
"Prism Ring"
]
}
},
{
"name": "Ring of Renewal",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Ring of Renewal"],
"iconName" :"RingofRenewal"
}
,
"iconName": "RingofRenewal",
"effect": {
"startBattleWithCard": [
"Ring of Renewal"
]
}
},
{
"name": "Kite Shield",
"equipmentSlot": "Right",
"startBattleWithCard" : ["Kite Shield"],
"iconName" :"KiteShield"
"iconName": "KiteShield",
"effect": {
"startBattleWithCard": [
"Kite Shield"
]
}
}
]

View File

@@ -1685,6 +1685,14 @@
"sprite": "CatLair",
"map": "maps/map/catlair_3.tmx"
},
{
"name": "DEBUGZONE",
"count": 0,
"radiusFactor": 5.0,
"spriteAtlas": "maps/tileset/buildings.atlas",
"sprite": "WurmPond",
"map": "maps/map/debug_map.tmx"
},
{
"name": "WurmPond",
"count": 2,

View File

@@ -0,0 +1,9 @@
Name:Wiretapping
ManaCost:4 U
Types:Enchantment
K:Hideaway:5
T:Mode$ Drawn | ValidCard$ Card.YouOwn | FirstCardInDrawStep$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you draw your first card during each of your draw steps, draw a card. Then if you have nine or more cards in hand, you may play the exiled card without paying its mana cost.
SVar:TrigDraw:DB$ Draw | SubAbility$ DBPlay
SVar:DBPlay:DB$ Play | ConditionPresent$ Card.IsRemembered | ConditionZone$ Exile | ConditionCheckSVar$ X | ConditionSVarCompare$ GE9 | Defined$ Remembered | Amount$ All | Controller$ You | WithoutManaCost$ True | Optional$ True
SVar:X:Count$InYourHand
Oracle:Hideaway 5 (When this enchantment enters the battlefield, look at the top five cards of your library, exile one face down, then put the rest on the bottom in a random order.)\nWhenever you draw your first card during each of your draw steps, draw a card. Then if you have nine or more cards in hand, you may play the exiled card without paying its mana cost.

View File

@@ -3,8 +3,8 @@ ManaCost:2 G U R
Types:Legendary Creature Snake Leviathan
PT:3/5
K:Flying
T:Mode$ Drawn | ValidCard$ Card.OppOwn | NotFirstCardInDrawStep$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card except the first one they draw in each of their draw steps, create a 1/1 green Snake creature token.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_1_1_snake | TokenOwner$ You
T:Mode$ Drawn | ValidCard$ Card.OppOwn | FirstCardInDrawStep$ False | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card except the first one they draw in each of their draw steps, create a 1/1 green Snake creature token.
SVar:TrigToken:DB$ Token | TokenScript$ g_1_1_snake
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you and that player each draw that many cards.
SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | Defined$ TriggeredTarget | NumCards$ X

View File

@@ -1851,7 +1851,7 @@ lblChooseASpecificCard=Wähle einen {0} Kartenname.
lblPlayerPickedChosen={0} wählt {1}
#ChooseColorEffect.java
lblChooseAColor=Wähle eine Farbe
lblChooseNColors=Wähle {0} Farbe(n)
lblChooseNColors=Wähle {0} Farbe(n) (Klicken dann CTRL/CMD + klicken)
lblAtLastChooseNumColors=Wähle {0} oder mehr Farbe(n)
lblChooseSpecifiedRangeColors=Wähle {0} bis {1} Farbe(n)
#ChooseDirectionEffect.java

View File

@@ -1852,7 +1852,7 @@ lblChooseASpecificCard=Choose a {0} card name.
lblPlayerPickedChosen={0} picked {1}
#ChooseColorEffect.java
lblChooseAColor=Choose a color
lblChooseNColors=Choose {0} color
lblChooseNColors=Choose {0} colors (click, then CTRL/CMD + click)
lblAtLastChooseNumColors=Choose {0} or more color
lblChooseSpecifiedRangeColors=Choose {0} to {1} color
#ChooseDirectionEffect.java

View File

@@ -1850,7 +1850,7 @@ lblChooseASpecificCard=Elige un nombre de carta {0}.
lblPlayerPickedChosen={0} escogió {1}
#ChooseColorEffect.java
lblChooseAColor=Elige un color
lblChooseNColors=Elige {0} colores
lblChooseNColors=Elige {0} colores (Clic entonces CTRL/CMD + clic)
lblAtLastChooseNumColors=Elige {0} o más colores
lblChooseSpecifiedRangeColors=Elige entre {0} y {1} colores
#ChooseDirectionEffect.java

View File

@@ -1849,7 +1849,7 @@ lblChooseASpecificCard=Scegli il nome di una carta {0}.
lblPlayerPickedChosen={0} ha scelto {1}
#ChooseColorEffect.java
lblChooseAColor=Scegli un colore
lblChooseNColors=Scegli {0} colori
lblChooseNColors=Scegli {0} colori (cliccare, quindi CTRL/CMD + clic)
lblAtLastChooseNumColors=Scegli {0} o più colori
lblChooseSpecifiedRangeColors=Scegli da {0} a {1} colori
#ChooseDirectionEffect.java

View File

@@ -1849,7 +1849,7 @@ lblChooseASpecificCard={0}カード名 1つを選ぶ
lblPlayerPickedChosen={0}が {1}を選択した
#ChooseColorEffect.java
lblChooseAColor=色 1色を選ぶ
lblChooseNColors=色 {0}色を選ぶ
lblChooseNColors=色 {0}色を選ぶ クリックしてからCtrl / CMD +クリック)
lblAtLastChooseNumColors=色 {0}色以上を選ぶ
lblChooseSpecifiedRangeColors=色 {0}{1}色を選ぶ
#ChooseDirectionEffect.java

View File

@@ -1911,7 +1911,7 @@ lblChooseASpecificCard=Escolha o nome da carta {0}.
lblPlayerPickedChosen={0} escolheu {1}
#ChooseColorEffect.java
lblChooseAColor=Escolha uma cor
lblChooseNColors=Escolha {0} cor
lblChooseNColors=Escolha {0} cores (clique então CTRL/CMD + clique)
lblAtLastChooseNumColors=Escolha {0} ou mais cores
lblChooseSpecifiedRangeColors=Escolha {0} a {1} cor
#ChooseDirectionEffect.java

View File

@@ -1853,7 +1853,7 @@ lblChooseASpecificCard=选择一个{0}牌名
lblPlayerPickedChosen={0}选取了{1}
#ChooseColorEffect.java
lblChooseAColor=选择一个颜色
lblChooseNColors=选择{0}个颜色
lblChooseNColors=选择{0}个颜色 点击然后ctrl / cmd +点击)
lblAtLastChooseNumColors=选择{0}或更多颜色
lblChooseSpecifiedRangeColors=选择{0}到{1}种颜色
#ChooseDirectionEffect.java
@@ -2862,4 +2862,4 @@ lblEdit=编辑
lblWinProper=
lblLossProper=失利
lblWinLossRatio=赢得损失比率
lblHeal=愈合
lblHeal=愈合