mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 10:18:01 +00:00
fixed game hud
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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."),
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) &&
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -94,6 +94,10 @@ public class MapActor extends Actor {
|
||||
|
||||
}
|
||||
|
||||
public int getId(){
|
||||
return objectId;
|
||||
}
|
||||
|
||||
public boolean collideWith(MapActor other) {
|
||||
return collideWith(other.boundingRect());
|
||||
}
|
||||
|
||||
@@ -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.)
|
||||
}
|
||||
}
|
||||
|
||||
68
forge-gui-mobile/src/forge/adventure/data/EffectData.java
Normal file
68
forge-gui-mobile/src/forge/adventure/data/EffectData.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
129
forge-gui-mobile/src/forge/adventure/util/MapDialog.java
Normal file
129
forge-gui-mobile/src/forge/adventure/util/MapDialog.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
}
|
||||
|
||||
|
||||
@@ -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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]
|
||||
@@ -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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]
|
||||
@@ -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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]
|
||||
@@ -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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]
|
||||
@@ -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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]
|
||||
@@ -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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]
|
||||
@@ -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
|
||||
|
||||
167
forge-gui/res/adventure/Shandalar/maps/map/debug_map.tmx
Normal file
167
forge-gui/res/adventure/Shandalar/maps/map/debug_map.tmx
Normal 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">{
|
||||
"startBattleWithCard": [ "Recycle" ],
|
||||
"opponent": {
|
||||
"startBattleWithCard": [ "Recycle" ],
|
||||
}
|
||||
}</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">[
|
||||
{
|
||||
"effect":[],
|
||||
"name":"ABC",
|
||||
"text":"I am a big gate. Greetings.",
|
||||
"loctext":"",
|
||||
"condition":[],
|
||||
"options":[ { "name":"Okay..." } ]
|
||||
}
|
||||
]</property>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="54" template="../obj/treasure.tx" x="320" y="176">
|
||||
<properties>
|
||||
<property name="reward">[
|
||||
{
|
||||
"type": "life",
|
||||
"count": 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">[
|
||||
{
|
||||
"effect":[],
|
||||
"name":"ABC",
|
||||
"text":"EMRAKUL\nDon't mind me, just chilling.",
|
||||
"loctext":"",
|
||||
"condition":[],
|
||||
"options":[ { "name":"It happens." } ]
|
||||
}
|
||||
]</property>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="79" template="../obj/gate.tx" x="128" y="208" visible="0">
|
||||
<properties>
|
||||
<property name="dialog">[
|
||||
{
|
||||
"effect":[],
|
||||
"name":"ABC",
|
||||
"text":"EMRAKUL\nDon't mind me, just chilling.",
|
||||
"loctext":"",
|
||||
"condition":[],
|
||||
"options":[ { "name":"It happens." } ]
|
||||
}
|
||||
]</property>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="80" template="../obj/enemy.tx" x="96" y="304">
|
||||
<properties>
|
||||
<property name="dialog">[
|
||||
{
|
||||
"effect":[],
|
||||
"name":"ABC",
|
||||
"text":"I am an elf. I do elf things like hugging trees and being pretty.",
|
||||
"loctext":"",
|
||||
"condition":[],
|
||||
"options":[
|
||||
{ "name":"OK" },
|
||||
{
|
||||
"name":"Fight me, elf!",
|
||||
"text": "Gladly.",
|
||||
"options": [ { "name": "I FEAR NOTHING!!?", "effect": [ { "battleWithActorID": -1 } ]} ]
|
||||
},
|
||||
{
|
||||
"name":"I wanna fight Emrakul over there!",
|
||||
"condition": [ { "actorID": 50 } ],
|
||||
"text": "Really? Oh well... your funeral.\nHEY EMMY! THIS DUDE WANTS TO DANCE!",
|
||||
"options": [ { "name": "WAIT IT WAS A JOKE!!!", "effect": [ { "battleWithActorID": 50 } ]} ]
|
||||
},
|
||||
{
|
||||
"name":"I wanna fight Emrakul over there!",
|
||||
"condition": [ { "actorID": 50, "not": true } ],
|
||||
"text": "She left. Crying. You monster.",
|
||||
"options": [ { "name": "Sorry..." } ]
|
||||
},
|
||||
{
|
||||
"name":"That's cool dude.",
|
||||
"condition": [ { "item": "Treasure", "not": true } ],
|
||||
"effect": [ { "addItem": "Treasure" } ],
|
||||
"text": "You get it. Take this.",
|
||||
"options": [ { "name": "Thanks bro." } ]
|
||||
},
|
||||
{
|
||||
"name":"Can you open that hidden wall?",
|
||||
"condition": [ { "actorID": 83 } ],
|
||||
"text": "Since you asked nicely, I shall.",
|
||||
"options": [ { "name": "Thanks bro.", "effect": [ { "deleteMapObject": 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>
|
||||
@@ -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">[
|
||||
{
|
||||
"effect":[],
|
||||
"name":"ABC",
|
||||
"text":"A big gate is blocking the path.",
|
||||
"loctext":"",
|
||||
"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 } ] }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]</property>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="54" template="../../obj/treasure.tx" x="208" y="80">
|
||||
|
||||
@@ -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">[{
|
||||
"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}]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}]</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">[{
|
||||
"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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]</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">[{
|
||||
"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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]</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">[{
|
||||
"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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]</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">[{
|
||||
"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}]}]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
]</property>
|
||||
</properties>
|
||||
</object>
|
||||
<object id="62" template="../../obj/treasure.tx" x="208" y="80">
|
||||
|
||||
9
forge-gui/res/adventure/Shandalar/maps/obj/block.tx
Normal file
9
forge-gui/res/adventure/Shandalar/maps/obj/block.tx
Normal 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>
|
||||
@@ -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">[
|
||||
{
|
||||
"effect":[],
|
||||
"name":"ABC",
|
||||
"text":"I am a big gate. Greetings.",
|
||||
"loctext":"",
|
||||
"condition":[],
|
||||
"options":[ { "name":"Okay..." } ]
|
||||
}
|
||||
]</property>
|
||||
</properties>
|
||||
</object>
|
||||
</template>
|
||||
|
||||
10580
forge-gui/res/adventure/Shandalar/skin/LanaPixelCJK.fnt
Normal file
10580
forge-gui/res/adventure/Shandalar/skin/LanaPixelCJK.fnt
Normal file
File diff suppressed because it is too large
Load Diff
BIN
forge-gui/res/adventure/Shandalar/skin/LanaPixelCJK.png
Normal file
BIN
forge-gui/res/adventure/Shandalar/skin/LanaPixelCJK.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 151 KiB |
102
forge-gui/res/adventure/Shandalar/skin/MiKrollFantasyBig.fnt
Normal file
102
forge-gui/res/adventure/Shandalar/skin/MiKrollFantasyBig.fnt
Normal 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
|
||||
BIN
forge-gui/res/adventure/Shandalar/skin/MiKrollFantasyBig.png
Normal file
BIN
forge-gui/res/adventure/Shandalar/skin/MiKrollFantasyBig.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
@@ -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,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Lathiss.png
|
||||
lathiss.png
|
||||
size: 128,112
|
||||
format: RGBA8888
|
||||
filter: Nearest,Nearest
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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,
|
||||
|
||||
9
forge-gui/res/cardsfolder/upcoming/wiretapping.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/wiretapping.txt
Normal 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.
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user