mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +00:00
Big map update 11
* Added a dummy texture in Graphics. Useful to add raw pixels or solid color boxes to a drawing batch. * Dialogue actions added: Heal (negative too) player, Add gold. * Dialogue conditions added: Check for gold >= X, check for health >= X. * Added "Manasight" effect to equipment and blessings. Allows to see the colors used by enemies. * All existing enemies have their color identities assigned. * Console command to dump all deck colors used by enemies (to update the data for color view) * Console command to force reload of status scenes (for faster design) * Less delay when clicking "Done" in a reward scene. * Adjustments to (landscape) Status and Inventory scenes. * Blessings properly assign map effects (speed, manasight) * Added "Manasight Amulet" (sprite pending) to grant the user manasight. * Added "Scroll" pickup template. It's meant to grant single cards.
This commit is contained in:
@@ -4,9 +4,7 @@ import java.util.ArrayDeque;
|
|||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
|
|
||||||
import com.badlogic.gdx.Gdx;
|
import com.badlogic.gdx.Gdx;
|
||||||
import com.badlogic.gdx.graphics.Color;
|
import com.badlogic.gdx.graphics.*;
|
||||||
import com.badlogic.gdx.graphics.GL20;
|
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||||
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
|
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
|
||||||
@@ -44,6 +42,8 @@ public class Graphics {
|
|||||||
private final ShaderProgram shaderWarp = new ShaderProgram(Gdx.files.internal("shaders").child("grayscale.vert"), Gdx.files.internal("shaders").child("warp.frag"));
|
private final ShaderProgram shaderWarp = new ShaderProgram(Gdx.files.internal("shaders").child("grayscale.vert"), Gdx.files.internal("shaders").child("warp.frag"));
|
||||||
private final ShaderProgram shaderUnderwater = new ShaderProgram(Gdx.files.internal("shaders").child("grayscale.vert"), Gdx.files.internal("shaders").child("underwater.frag"));
|
private final ShaderProgram shaderUnderwater = new ShaderProgram(Gdx.files.internal("shaders").child("grayscale.vert"), Gdx.files.internal("shaders").child("underwater.frag"));
|
||||||
|
|
||||||
|
private Texture dummyTexture = null;
|
||||||
|
|
||||||
public Graphics() {
|
public Graphics() {
|
||||||
ShaderProgram.pedantic = false;
|
ShaderProgram.pedantic = false;
|
||||||
}
|
}
|
||||||
@@ -87,6 +87,7 @@ public class Graphics {
|
|||||||
shaderGrayscale.dispose();
|
shaderGrayscale.dispose();
|
||||||
shaderUnderwater.dispose();
|
shaderUnderwater.dispose();
|
||||||
shaderWarp.dispose();
|
shaderWarp.dispose();
|
||||||
|
if(dummyTexture != null) dummyTexture.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SpriteBatch getBatch() {
|
public SpriteBatch getBatch() {
|
||||||
@@ -1124,4 +1125,14 @@ public class Graphics {
|
|||||||
int brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000;
|
int brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000;
|
||||||
return brightness > 155 ? Color.valueOf("#171717") : Color.valueOf("#fffffd");
|
return brightness > 155 ? Color.valueOf("#171717") : Color.valueOf("#fffffd");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Texture getDummyTexture(){
|
||||||
|
if (dummyTexture == null){
|
||||||
|
Pixmap P = new Pixmap(1, 1, Pixmap.Format.RGBA8888);
|
||||||
|
P.setColor(1f,1f,1f,1f);
|
||||||
|
P.drawPixel(0, 0);
|
||||||
|
dummyTexture = new Texture(P);
|
||||||
|
}
|
||||||
|
return dummyTexture;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package forge.adventure.character;
|
package forge.adventure.character;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.graphics.Color;
|
||||||
|
import com.badlogic.gdx.graphics.g2d.Batch;
|
||||||
import com.badlogic.gdx.math.Rectangle;
|
import com.badlogic.gdx.math.Rectangle;
|
||||||
import com.badlogic.gdx.math.Vector2;
|
import com.badlogic.gdx.math.Vector2;
|
||||||
import com.badlogic.gdx.scenes.scene2d.Actor;
|
import com.badlogic.gdx.scenes.scene2d.Actor;
|
||||||
import com.badlogic.gdx.utils.Array;
|
import com.badlogic.gdx.utils.Array;
|
||||||
|
import forge.Forge;
|
||||||
import forge.adventure.data.EffectData;
|
import forge.adventure.data.EffectData;
|
||||||
import forge.adventure.data.EnemyData;
|
import forge.adventure.data.EnemyData;
|
||||||
import forge.adventure.data.RewardData;
|
import forge.adventure.data.RewardData;
|
||||||
@@ -47,7 +50,6 @@ public class EnemySprite extends CharacterSprite {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Array<Reward> getRewards() {
|
public Array<Reward> getRewards() {
|
||||||
Array<Reward> ret=new Array<Reward>();
|
Array<Reward> ret=new Array<Reward>();
|
||||||
if(data.rewards == null)
|
if(data.rewards == null)
|
||||||
@@ -58,5 +60,57 @@ public class EnemySprite extends CharacterSprite {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void drawColorHints(Batch batch){
|
||||||
|
int size = Math.min(data.colors.length(), 6);
|
||||||
|
int DX = Math.round(getX() - 2);
|
||||||
|
int DY = Math.round(getY());
|
||||||
|
|
||||||
|
for(int i = 0; i < size; i++){
|
||||||
|
char C = data.colors.toUpperCase().charAt(i);
|
||||||
|
switch (C) {
|
||||||
|
default: break;
|
||||||
|
case 'C': {
|
||||||
|
batch.setColor(Color.DARK_GRAY);
|
||||||
|
batch.draw(Forge.getGraphics().getDummyTexture(), DX, DY, 2, 2);
|
||||||
|
DY += 2; break;
|
||||||
|
}
|
||||||
|
case 'B': {
|
||||||
|
batch.setColor(Color.PURPLE);
|
||||||
|
batch.draw(Forge.getGraphics().getDummyTexture(), DX, DY, 2, 2);
|
||||||
|
DY += 2; break;
|
||||||
|
}
|
||||||
|
case 'G': {
|
||||||
|
batch.setColor(Color.GREEN);
|
||||||
|
batch.draw(Forge.getGraphics().getDummyTexture(), DX, DY, 2, 2);
|
||||||
|
DY += 2; break;
|
||||||
|
}
|
||||||
|
case 'R': {
|
||||||
|
batch.setColor(Color.RED);
|
||||||
|
batch.draw(Forge.getGraphics().getDummyTexture(), DX, DY, 2, 2);
|
||||||
|
DY += 2; break;
|
||||||
|
}
|
||||||
|
case 'U': {
|
||||||
|
batch.setColor(Color.BLUE);
|
||||||
|
batch.draw(Forge.getGraphics().getDummyTexture(), DX, DY, 2, 2);
|
||||||
|
DY += 2; break;
|
||||||
|
}
|
||||||
|
case 'W': {
|
||||||
|
batch.setColor(Color.WHITE);
|
||||||
|
batch.draw(Forge.getGraphics().getDummyTexture(), DX, DY, 2, 2);
|
||||||
|
DY += 2; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
batch.setColor(Color.WHITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(Batch batch, float parentAlpha) {
|
||||||
|
super.draw(batch, parentAlpha);
|
||||||
|
if(Current.player().hasColorView() && !data.colors.isEmpty()) {
|
||||||
|
drawColorHints(batch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,9 @@ public class PlayerSprite extends CharacterSprite {
|
|||||||
PlayerSprite.this.updatePlayer();
|
PlayerSprite.this.updatePlayer();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
playerSpeed=Config.instance().getConfigData().playerBaseSpeed;
|
playerSpeed = Config.instance().getConfigData().playerBaseSpeed;
|
||||||
Current.player().onEquipmentChanged(() -> playerSpeedEquipmentModifier=Current.player().equipmentSpeed());
|
Current.player().onBlessing( () -> playerSpeedEquipmentModifier = Current.player().equipmentSpeed() );
|
||||||
|
Current.player().onEquipmentChanged( () -> playerSpeedEquipmentModifier=Current.player().equipmentSpeed() );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePlayer() {
|
private void updatePlayer() {
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ public class DialogData {
|
|||||||
static public class ActionData {
|
static public class ActionData {
|
||||||
public String removeItem; //Remove item name from inventory.
|
public String removeItem; //Remove item name from inventory.
|
||||||
public String addItem; //Add item name to inventory.
|
public String addItem; //Add item name to inventory.
|
||||||
|
public int addLife = 0; //Gives the player X health. Negative to take.
|
||||||
|
public int addGold = 0; //Gives the player X gold. Negative to take.
|
||||||
public int deleteMapObject = 0; //Remove ID from the map. -1 for self.
|
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.
|
public int battleWithActorID = 0; //Start a battle with enemy ID. -1 for self if possible.
|
||||||
public EffectData giveBlessing; //Give a blessing to the player.
|
public EffectData giveBlessing; //Give a blessing to the player.
|
||||||
@@ -27,6 +29,8 @@ public class DialogData {
|
|||||||
public int flag = 0; //Check for a local dungeon flag.
|
public int flag = 0; //Check for a local dungeon flag.
|
||||||
public int actorID = 0; //Check for an actor ID.
|
public int actorID = 0; //Check for an actor ID.
|
||||||
public String hasBlessing = null; //Check for specific blessing, if named.
|
public String hasBlessing = null; //Check for specific blessing, if named.
|
||||||
|
public int hasGold = 0; //Check for player gold. True if gold is equal or higher than X.
|
||||||
|
public int hasLife = 0; //Check for player life. True if life is equal or higher than X.
|
||||||
public String colorIdentity = null;//Check for player's current color identity.
|
public String colorIdentity = null;//Check for player's current color identity.
|
||||||
public boolean not = false; //Reverse the result of a condition ("actorID":"XX" + "not":true => true if XX is not in the map.)
|
public boolean not = false; //Reverse the result of a condition ("actorID":"XX" + "not":true => true if XX is not in the map.)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ public class EffectData implements Serializable {
|
|||||||
String description = "";
|
String description = "";
|
||||||
if(this.name != null && !this.name.isEmpty())
|
if(this.name != null && !this.name.isEmpty())
|
||||||
description += this.name + "\n";
|
description += this.name + "\n";
|
||||||
|
if(this.colorView)
|
||||||
|
description += "Manasight.\n";
|
||||||
if(this.lifeModifier != 0)
|
if(this.lifeModifier != 0)
|
||||||
description += "Life: " + ((this.lifeModifier > 0) ? "+" : "") + this.lifeModifier + "\n";
|
description += "Life: " + ((this.lifeModifier > 0) ? "+" : "") + this.lifeModifier + "\n";
|
||||||
if(this.startBattleWithCard != null && this.startBattleWithCard.length != 0)
|
if(this.startBattleWithCard != null && this.startBattleWithCard.length != 0)
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
package forge.adventure.data;
|
package forge.adventure.data;
|
||||||
|
|
||||||
import forge.adventure.util.CardUtil;
|
import forge.adventure.util.CardUtil;
|
||||||
|
import forge.card.ColorSet;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckProxy;
|
||||||
|
import forge.game.GameType;
|
||||||
|
import forge.model.FModel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Data class that will be used to read Json configuration files
|
* Data class that will be used to read Json configuration files
|
||||||
@@ -19,29 +23,25 @@ public class EnemyData {
|
|||||||
public int life;
|
public int life;
|
||||||
public RewardData[] rewards;
|
public RewardData[] rewards;
|
||||||
public String[] equipment;
|
public String[] equipment;
|
||||||
|
public String colors = "";
|
||||||
|
|
||||||
public EnemyData()
|
public EnemyData() { }
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
public EnemyData(EnemyData enemyData) {
|
public EnemyData(EnemyData enemyData) {
|
||||||
name =enemyData.name;
|
name = enemyData.name;
|
||||||
sprite =enemyData.sprite;
|
sprite = enemyData.sprite;
|
||||||
deck =enemyData.deck;
|
deck = enemyData.deck;
|
||||||
ai =enemyData.ai;
|
ai = enemyData.ai;
|
||||||
spawnRate =enemyData.spawnRate;
|
spawnRate = enemyData.spawnRate;
|
||||||
difficulty =enemyData.difficulty ;
|
difficulty = enemyData.difficulty;
|
||||||
speed =enemyData.speed;
|
speed = enemyData.speed;
|
||||||
life =enemyData.life;
|
life = enemyData.life;
|
||||||
equipment =enemyData.equipment;
|
equipment = enemyData.equipment;
|
||||||
if(enemyData.rewards==null)
|
colors = enemyData.colors;
|
||||||
{
|
if(enemyData.rewards == null) {
|
||||||
rewards=null;
|
rewards=null;
|
||||||
}
|
} else {
|
||||||
else
|
rewards = new RewardData[enemyData.rewards.length];
|
||||||
{
|
for(int i=0; i<rewards.length; i++)
|
||||||
rewards =new RewardData[enemyData.rewards.length];
|
|
||||||
for(int i=0;i<rewards.length;i++)
|
|
||||||
rewards[i]=new RewardData(enemyData.rewards[i]);
|
rewards[i]=new RewardData(enemyData.rewards[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ import com.badlogic.gdx.utils.Json;
|
|||||||
import forge.adventure.util.Config;
|
import forge.adventure.util.Config;
|
||||||
import forge.adventure.util.Paths;
|
import forge.adventure.util.Paths;
|
||||||
import forge.adventure.world.BiomeSprites;
|
import forge.adventure.world.BiomeSprites;
|
||||||
|
import forge.card.ColorSet;
|
||||||
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckProxy;
|
||||||
|
import forge.game.GameType;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -51,9 +55,7 @@ public class WorldData implements Serializable {
|
|||||||
if (allEnemies == null) {
|
if (allEnemies == null) {
|
||||||
Json json = new Json();
|
Json json = new Json();
|
||||||
FileHandle handle = Config.instance().getFile(Paths.ENEMIES);
|
FileHandle handle = Config.instance().getFile(Paths.ENEMIES);
|
||||||
if (handle.exists())
|
if (handle.exists()) {
|
||||||
{
|
|
||||||
|
|
||||||
Array readList = json.fromJson(Array.class, EnemyData.class, handle);
|
Array readList = json.fromJson(Array.class, EnemyData.class, handle);
|
||||||
allEnemies = readList;
|
allEnemies = readList;
|
||||||
}
|
}
|
||||||
@@ -62,8 +64,7 @@ public class WorldData implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static EnemyData getEnemy(String enemy) {
|
public static EnemyData getEnemy(String enemy) {
|
||||||
for(EnemyData data: new Array.ArrayIterator<>(getAllEnemies()))
|
for(EnemyData data: new Array.ArrayIterator<>(getAllEnemies())) {
|
||||||
{
|
|
||||||
if(data.name.equals(enemy))
|
if(data.name.equals(enemy))
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,11 +48,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
|
|||||||
private final Array<String> inventoryItems=new Array<>();
|
private final Array<String> inventoryItems=new Array<>();
|
||||||
private final HashMap<String,String> equippedItems=new HashMap<>();
|
private final HashMap<String,String> equippedItems=new HashMap<>();
|
||||||
|
|
||||||
public AdventurePlayer()
|
public AdventurePlayer() {
|
||||||
{
|
for(int i=0;i<NUMBER_OF_DECKS;i++) {
|
||||||
|
|
||||||
for(int i=0;i<NUMBER_OF_DECKS;i++)
|
|
||||||
{
|
|
||||||
decks[i]=new Deck("Empty Deck");
|
decks[i]=new Deck("Empty Deck");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -303,19 +300,6 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addBlessing(EffectData bless){ blessing = bless; }
|
|
||||||
|
|
||||||
public void clearBlessing() { blessing = null; }
|
|
||||||
|
|
||||||
public @Null EffectData getBlessing(){ return blessing; }
|
|
||||||
|
|
||||||
public boolean hasBlessing(String name){
|
|
||||||
if(blessing == null) return false;
|
|
||||||
if(blessing.name.equals(name)) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String spriteName() {
|
public String spriteName() {
|
||||||
return HeroListData.getHero(heroRace, isFemale);
|
return HeroListData.getHero(heroRace, isFemale);
|
||||||
}
|
}
|
||||||
@@ -329,15 +313,12 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addCard(PaperCard card) {
|
public void addCard(PaperCard card) {
|
||||||
|
|
||||||
cards.add(card);
|
cards.add(card);
|
||||||
newCards.add(card);
|
newCards.add(card);
|
||||||
|
|
||||||
}
|
}
|
||||||
public void addReward(Reward reward) {
|
|
||||||
|
|
||||||
switch (reward.getType())
|
public void addReward(Reward reward) {
|
||||||
{
|
switch (reward.getType()) {
|
||||||
case Card:
|
case Card:
|
||||||
cards.add(reward.getCard());
|
cards.add(reward.getCard());
|
||||||
newCards.add(reward.getCard());
|
newCards.add(reward.getCard());
|
||||||
@@ -352,13 +333,13 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
|
|||||||
addMaxLife(reward.getCount());
|
addMaxLife(reward.getCount());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SignalList onLifeTotalChangeList=new SignalList();
|
SignalList onLifeTotalChangeList=new SignalList();
|
||||||
SignalList onGoldChangeList=new SignalList();
|
SignalList onGoldChangeList=new SignalList();
|
||||||
SignalList onPlayerChangeList=new SignalList();
|
SignalList onPlayerChangeList=new SignalList();
|
||||||
SignalList onEquipmentChange=new SignalList();
|
SignalList onEquipmentChange=new SignalList();
|
||||||
|
SignalList onBlessing=new SignalList();
|
||||||
|
|
||||||
private void addGold(int goldCount) {
|
private void addGold(int goldCount) {
|
||||||
gold+=goldCount;
|
gold+=goldCount;
|
||||||
@@ -388,6 +369,11 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
|
|||||||
o.run();
|
o.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onBlessing(Runnable o) {
|
||||||
|
onBlessing.add(o);
|
||||||
|
o.run();
|
||||||
|
}
|
||||||
|
|
||||||
public int getLife() {
|
public int getLife() {
|
||||||
return life;
|
return life;
|
||||||
}
|
}
|
||||||
@@ -424,6 +410,34 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
|
|||||||
onGoldChangeList.emit();
|
onGoldChangeList.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addBlessing(EffectData bless){
|
||||||
|
blessing = bless;
|
||||||
|
onBlessing.emit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearBlessing() { blessing = null; }
|
||||||
|
|
||||||
|
public @Null EffectData getBlessing(){ return blessing; }
|
||||||
|
|
||||||
|
public boolean hasBlessing(String name){ //Checks for a named blessing.
|
||||||
|
//It is not necessary to name all blessings, only the ones you'd want to check for.
|
||||||
|
if(blessing == null) return false;
|
||||||
|
if(blessing.name.equals(name)) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasColorView() {
|
||||||
|
for(String name:equippedItems.values()) {
|
||||||
|
ItemData data=ItemData.getItem(name);
|
||||||
|
if(data != null && data.effect.colorView) return true;
|
||||||
|
}
|
||||||
|
if(blessing != null) {
|
||||||
|
if(blessing.colorView) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public DifficultyData getDifficulty() {
|
public DifficultyData getDifficulty() {
|
||||||
return difficultyData;
|
return difficultyData;
|
||||||
}
|
}
|
||||||
@@ -482,9 +496,12 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
|
|||||||
float factor=1.0f;
|
float factor=1.0f;
|
||||||
for(String name:equippedItems.values()) {
|
for(String name:equippedItems.values()) {
|
||||||
ItemData data=ItemData.getItem(name);
|
ItemData data=ItemData.getItem(name);
|
||||||
if(data.effect.moveSpeed > 0.0) { //Avoid negative speeds. It would be silly.
|
if(data != null && data.effect.moveSpeed > 0.0) //Avoid negative speeds. It would be silly.
|
||||||
factor*=data.effect.moveSpeed;
|
factor*=data.effect.moveSpeed;
|
||||||
}
|
}
|
||||||
|
if(blessing != null) { //If a blessing gives speed, take it into account.
|
||||||
|
if(blessing.moveSpeed > 0.0)
|
||||||
|
factor *= blessing.moveSpeed;
|
||||||
}
|
}
|
||||||
return factor;
|
return factor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,91 +63,92 @@ public class InventoryScene extends UIScene {
|
|||||||
@Override
|
@Override
|
||||||
public void resLoaded() {
|
public void resLoaded() {
|
||||||
super.resLoaded();
|
super.resLoaded();
|
||||||
equipOverlay = new Texture(Config.instance().getFile(Paths.ITEMS_EQUIP));
|
equipOverlay = new Texture(Config.instance().getFile(Paths.ITEMS_EQUIP));
|
||||||
ui.onButtonPress("return", () -> done());
|
ui.onButtonPress("return", () -> done());
|
||||||
leave = ui.findActor("return");
|
leave = ui.findActor("return");
|
||||||
ui.onButtonPress("delete", () -> confirm.show(stage));
|
ui.onButtonPress("delete", () -> confirm.show(stage));
|
||||||
ui.onButtonPress("equip", () -> equip());
|
ui.onButtonPress("equip", () -> equip());
|
||||||
equipButton = ui.findActor("equip");
|
equipButton = ui.findActor("equip");
|
||||||
deleteButton = ui.findActor("delete");
|
deleteButton = ui.findActor("delete");
|
||||||
itemDescription = ui.findActor("item_description");
|
itemDescription = ui.findActor("item_description");
|
||||||
leave.getLabel().setText(Forge.getLocalizer().getMessage("lblBack"));
|
itemDescription.setAlignment(Align.topLeft);
|
||||||
|
leave.getLabel().setText(Forge.getLocalizer().getMessage("lblBack"));
|
||||||
|
|
||||||
inventoryButtons=new Array<>();
|
inventoryButtons=new Array<>();
|
||||||
equipmentSlots=new HashMap<>();
|
equipmentSlots=new HashMap<>();
|
||||||
|
|
||||||
Array<Actor> children = ui.getChildren();
|
Array<Actor> children = ui.getChildren();
|
||||||
for (int i = 0, n = children.size; i < n; i++)
|
for (int i = 0, n = children.size; i < n; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(children.get(i).getName()!=null&&children.get(i).getName().startsWith("Equipment"))
|
||||||
{
|
{
|
||||||
|
String slotName=children.get(i).getName().split("_")[1];
|
||||||
if(children.get(i).getName()!=null&&children.get(i).getName().startsWith("Equipment"))
|
equipmentSlots.put(slotName, (Button) children.get(i));
|
||||||
{
|
Actor slot=children.get(i);
|
||||||
String slotName=children.get(i).getName().split("_")[1];
|
slot.addListener(new ChangeListener() {
|
||||||
equipmentSlots.put(slotName, (Button) children.get(i));
|
@Override
|
||||||
Actor slot=children.get(i);
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
slot.addListener(new ChangeListener() {
|
Button button=((Button) actor);
|
||||||
@Override
|
if(button.isChecked())
|
||||||
public void changed(ChangeEvent event, Actor actor) {
|
{
|
||||||
Button button=((Button) actor);
|
for(Button otherButton:equipmentSlots.values())
|
||||||
if(button.isChecked())
|
|
||||||
{
|
{
|
||||||
for(Button otherButton:equipmentSlots.values())
|
if(button!=otherButton&&otherButton.isChecked()){
|
||||||
{
|
otherButton.setChecked(false);
|
||||||
if(button!=otherButton&&otherButton.isChecked()){
|
|
||||||
otherButton.setChecked(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String item=Current.player().itemInSlot(slotName);
|
|
||||||
if(item!=null&&item!="")
|
|
||||||
{
|
|
||||||
Button changeButton=null;
|
|
||||||
for(Button invButton:inventoryButtons)
|
|
||||||
{
|
|
||||||
if(itemLocation.get(invButton)!=null&&itemLocation.get(invButton).equals(item))
|
|
||||||
{
|
|
||||||
changeButton=invButton;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(changeButton!=null)
|
|
||||||
changeButton.setChecked(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
setSelected(null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
String item=Current.player().itemInSlot(slotName);
|
||||||
|
if(item!=null&&item!="")
|
||||||
|
{
|
||||||
|
Button changeButton=null;
|
||||||
|
for(Button invButton:inventoryButtons)
|
||||||
|
{
|
||||||
|
if(itemLocation.get(invButton)!=null&&itemLocation.get(invButton).equals(item))
|
||||||
|
{
|
||||||
|
changeButton=invButton;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(changeButton!=null)
|
||||||
|
changeButton.setChecked(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setSelected(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
inventory = new Table(Controls.GetSkin());
|
}
|
||||||
ScrollPane scrollPane = ui.findActor("inventory");
|
inventory = new Table(Controls.GetSkin());
|
||||||
scrollPane.setScrollingDisabled(true,false);
|
ScrollPane scrollPane = ui.findActor("inventory");
|
||||||
scrollPane.setActor(inventory);
|
scrollPane.setScrollingDisabled(true,false);
|
||||||
columns= (int) (scrollPane.getWidth()/createInventorySlot().getWidth());
|
scrollPane.setActor(inventory);
|
||||||
columns-=1;
|
columns= (int) (scrollPane.getWidth()/createInventorySlot().getWidth());
|
||||||
if(columns<=0)columns=1;
|
columns-=1;
|
||||||
scrollPane.setActor(inventory);
|
if(columns<=0)columns=1;
|
||||||
confirm = new Dialog("\n "+Forge.getLocalizer().getMessage("lblDelete"), Controls.GetSkin())
|
scrollPane.setActor(inventory);
|
||||||
|
confirm = new Dialog("\n "+Forge.getLocalizer().getMessage("lblDelete"), Controls.GetSkin())
|
||||||
|
{
|
||||||
|
protected void result(Object object)
|
||||||
{
|
{
|
||||||
protected void result(Object object)
|
if(object!=null&&object.equals(true))
|
||||||
{
|
delete();
|
||||||
if(object!=null&&object.equals(true))
|
confirm.hide();
|
||||||
delete();
|
|
||||||
confirm.hide();
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
confirm.button(Forge.getLocalizer().getMessage("lblYes"), true);
|
confirm.button(Forge.getLocalizer().getMessage("lblYes"), true);
|
||||||
confirm.button(Forge.getLocalizer().getMessage("lblNo"), false);
|
confirm.button(Forge.getLocalizer().getMessage("lblNo"), false);
|
||||||
ui.addActor(confirm);
|
ui.addActor(confirm);
|
||||||
confirm.hide();
|
confirm.hide();
|
||||||
|
|
||||||
itemDescription.setWrap(true);
|
itemDescription.setWrap(true);
|
||||||
//makes confirm dialog hidden immediately when you open inventory first time..
|
//makes confirm dialog hidden immediately when you open inventory first time..
|
||||||
confirm.getColor().a = 0;
|
confirm.getColor().a = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setSelected(Button actor) {
|
private void setSelected(Button actor) {
|
||||||
@@ -198,17 +199,15 @@ public class InventoryScene extends UIScene {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateInventory()
|
private void updateInventory() {
|
||||||
{
|
|
||||||
inventoryButtons.clear();
|
inventoryButtons.clear();
|
||||||
inventory.clear();
|
inventory.clear();
|
||||||
for(int i=0;i<Current.player().getItems().size;i++)
|
for(int i=0;i<Current.player().getItems().size;i++) {
|
||||||
{
|
|
||||||
|
|
||||||
if(i%columns==0)
|
if(i%columns==0)
|
||||||
inventory.row();
|
inventory.row();
|
||||||
Button newActor=createInventorySlot();
|
Button newActor=createInventorySlot();
|
||||||
inventory.add(newActor).align(Align.left|Align.top).space(1);
|
inventory.add(newActor).top().left().space(1);
|
||||||
inventoryButtons.add(newActor);
|
inventoryButtons.add(newActor);
|
||||||
ItemData item=ItemData.getItem(Current.player().getItems().get(i));
|
ItemData item=ItemData.getItem(Current.player().getItems().get(i));
|
||||||
if(item==null)
|
if(item==null)
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ public class PlayerStatisticScene extends UIScene {
|
|||||||
enemiesGroup.row();
|
enemiesGroup.row();
|
||||||
blessingScroll = Controls.newLabel("");
|
blessingScroll = Controls.newLabel("");
|
||||||
blessingScroll.setStyle(new Label.LabelStyle(Controls.getBitmapFont("default"), Color.BLACK));
|
blessingScroll.setStyle(new Label.LabelStyle(Controls.getBitmapFont("default"), Color.BLACK));
|
||||||
|
blessingScroll.setAlignment(Align.topLeft);
|
||||||
ui.onButtonPress("return", new Runnable() {
|
ui.onButtonPress("return", new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public class RewardScene extends UIScene {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (wait) {
|
if (wait) {
|
||||||
flipCountDown = 3.0f;
|
flipCountDown = 1.5f;
|
||||||
doneClicked = true;
|
doneClicked = true;
|
||||||
} else {
|
} else {
|
||||||
Forge.switchToLast();
|
Forge.switchToLast();
|
||||||
|
|||||||
@@ -1,9 +1,18 @@
|
|||||||
package forge.adventure.stage;
|
package forge.adventure.stage;
|
||||||
|
|
||||||
|
|
||||||
|
import com.badlogic.gdx.utils.Array;
|
||||||
import forge.StaticData;
|
import forge.StaticData;
|
||||||
|
import forge.adventure.data.EnemyData;
|
||||||
|
import forge.adventure.data.WorldData;
|
||||||
import forge.adventure.pointofintrest.PointOfInterest;
|
import forge.adventure.pointofintrest.PointOfInterest;
|
||||||
|
import forge.adventure.scene.InventoryScene;
|
||||||
|
import forge.adventure.scene.SceneType;
|
||||||
import forge.adventure.util.Current;
|
import forge.adventure.util.Current;
|
||||||
|
import forge.card.ColorSet;
|
||||||
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckProxy;
|
||||||
|
import forge.game.GameType;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -165,6 +174,28 @@ public class ConsoleCommandInterpreter {
|
|||||||
Current.player().fullHeal();
|
Current.player().fullHeal();
|
||||||
return "Player life back to "+Current.player().getLife();
|
return "Player life back to "+Current.player().getLife();
|
||||||
});
|
});
|
||||||
|
registerCommand(new String[]{"reloadScenes"}, s -> {
|
||||||
|
SceneType.InventoryScene.instance.resLoaded();
|
||||||
|
SceneType.PlayerStatisticScene.instance.resLoaded();
|
||||||
|
|
||||||
|
return "Force reload status scenes. Might be unstable.";
|
||||||
|
});
|
||||||
|
registerCommand(new String[]{"dumpEnemyDeckColors"}, s -> {
|
||||||
|
for(EnemyData E : new Array.ArrayIterator<>(WorldData.getAllEnemies())){
|
||||||
|
Deck D = E.generateDeck();
|
||||||
|
DeckProxy DP = new DeckProxy(D, "Constructed", GameType.Constructed, null);
|
||||||
|
ColorSet colorSet = DP.getColor();
|
||||||
|
System.out.printf("%s: Colors: %s (%s%s%s%s%s%s)\n", D.getName(), DP.getColor(),
|
||||||
|
(colorSet.hasBlack() ? "B" : ""),
|
||||||
|
(colorSet.hasGreen() ? "G" : ""),
|
||||||
|
(colorSet.hasRed() ? "R" : ""),
|
||||||
|
(colorSet.hasBlue() ? "U" : ""),
|
||||||
|
(colorSet.hasWhite() ? "W" : ""),
|
||||||
|
(colorSet.isColorless() ? "C" : "")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return "Enemy deck color list dumped to stdout.";
|
||||||
|
});
|
||||||
registerCommand(new String[]{"heal", "amount"}, s -> {
|
registerCommand(new String[]{"heal", "amount"}, s -> {
|
||||||
if(s.length<1) return "Command needs 1 parameter";
|
if(s.length<1) return "Command needs 1 parameter";
|
||||||
int N = 0;
|
int N = 0;
|
||||||
|
|||||||
@@ -206,8 +206,8 @@ public class MapStage extends GameStage {
|
|||||||
for (MapActor actor : new Array.ArrayIterator<>(actors)) {
|
for (MapActor actor : new Array.ArrayIterator<>(actors)) {
|
||||||
actor.remove();
|
actor.remove();
|
||||||
foregroundSprites.removeActor(actor);
|
foregroundSprites.removeActor(actor);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
actors = new Array<>();
|
actors = new Array<>();
|
||||||
width = Float.parseFloat(map.getProperties().get("width").toString());
|
width = Float.parseFloat(map.getProperties().get("width").toString());
|
||||||
height = Float.parseFloat(map.getProperties().get("height").toString());
|
height = Float.parseFloat(map.getProperties().get("height").toString());
|
||||||
@@ -220,8 +220,8 @@ public class MapStage extends GameStage {
|
|||||||
MapProperties MP = map.getProperties();
|
MapProperties MP = map.getProperties();
|
||||||
|
|
||||||
if( MP.get("dungeonEffect") != null && !MP.get("dungeonEffect").toString().isEmpty()){
|
if( MP.get("dungeonEffect") != null && !MP.get("dungeonEffect").toString().isEmpty()){
|
||||||
JSONStringLoader json = new JSONStringLoader();
|
JSONStringLoader J = new JSONStringLoader();
|
||||||
effect = json.parse(EffectData.class, map.getProperties().get("dungeonEffect").toString(), "");
|
effect = J.parse(EffectData.class, map.getProperties().get("dungeonEffect").toString(), "");
|
||||||
effectDialog(effect);
|
effectDialog(effect);
|
||||||
}
|
}
|
||||||
if (MP.get("preventEscape") != null) preventEscape = (boolean)MP.get("preventEscape");
|
if (MP.get("preventEscape") != null) preventEscape = (boolean)MP.get("preventEscape");
|
||||||
@@ -266,7 +266,6 @@ public class MapStage extends GameStage {
|
|||||||
private void loadObjects(MapLayer layer, String sourceMap) {
|
private void loadObjects(MapLayer layer, String sourceMap) {
|
||||||
player.setMoveModifier(2);
|
player.setMoveModifier(2);
|
||||||
for (MapObject obj : layer.getObjects()) {
|
for (MapObject obj : layer.getObjects()) {
|
||||||
|
|
||||||
MapProperties prop = obj.getProperties();
|
MapProperties prop = obj.getProperties();
|
||||||
Object typeObject = prop.get("type");
|
Object typeObject = prop.get("type");
|
||||||
if (typeObject != null) {
|
if (typeObject != null) {
|
||||||
@@ -297,7 +296,12 @@ public class MapStage extends GameStage {
|
|||||||
case "enemy":
|
case "enemy":
|
||||||
Object E = prop.get("enemy");
|
Object E = prop.get("enemy");
|
||||||
if(E != null && !E.toString().isEmpty()) {
|
if(E != null && !E.toString().isEmpty()) {
|
||||||
EnemySprite mob = new EnemySprite(id, WorldData.getEnemy(E.toString()));
|
EnemyData EN = WorldData.getEnemy(E.toString());
|
||||||
|
if(EN == null){
|
||||||
|
System.err.printf("Enemy \"%s\" not found.", E.toString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
EnemySprite mob = new EnemySprite(id, EN);
|
||||||
Object D = prop.get("dialog"); //Check if the enemy has a dialogue attached to it.
|
Object D = prop.get("dialog"); //Check if the enemy has a dialogue attached to it.
|
||||||
if (D != null && !D.toString().isEmpty()) {
|
if (D != null && !D.toString().isEmpty()) {
|
||||||
mob.dialog = new MapDialog(D.toString(), this, mob.getId());
|
mob.dialog = new MapDialog(D.toString(), this, mob.getId());
|
||||||
@@ -314,6 +318,7 @@ public class MapStage extends GameStage {
|
|||||||
if (D != null && !D.toString().isEmpty()) {
|
if (D != null && !D.toString().isEmpty()) {
|
||||||
mob.effect = JSONStringLoader.parse(EffectData.class, D.toString(), "");
|
mob.effect = JSONStringLoader.parse(EffectData.class, D.toString(), "");
|
||||||
}
|
}
|
||||||
|
//TODO: Additional rewards.
|
||||||
addMapActor(obj, mob);
|
addMapActor(obj, mob);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -321,6 +326,8 @@ public class MapStage extends GameStage {
|
|||||||
TiledMapTileMapObject obj2 = (TiledMapTileMapObject) obj;
|
TiledMapTileMapObject obj2 = (TiledMapTileMapObject) obj;
|
||||||
DummySprite D = new DummySprite(id, obj2.getTextureRegion(), this);
|
DummySprite D = new DummySprite(id, obj2.getTextureRegion(), this);
|
||||||
addMapActor(obj, D);
|
addMapActor(obj, D);
|
||||||
|
//TODO: Ability to toggle their solid state.
|
||||||
|
//TODO: Ability to move them (using a sequence such as "UULU" for up, up, left, up).
|
||||||
break;
|
break;
|
||||||
case "inn":
|
case "inn":
|
||||||
addMapActor(obj, new OnCollide(new Runnable() {
|
addMapActor(obj, new OnCollide(new Runnable() {
|
||||||
@@ -436,7 +443,8 @@ public class MapStage extends GameStage {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean lookForID(int id){
|
public boolean lookForID(int id){ //Search actor by ID.
|
||||||
|
|
||||||
for(MapActor A : new Array.ArrayIterator<>(actors)){
|
for(MapActor A : new Array.ArrayIterator<>(actors)){
|
||||||
if(A.getId() == id)
|
if(A.getId() == id)
|
||||||
return true;
|
return true;
|
||||||
@@ -444,7 +452,7 @@ public class MapStage extends GameStage {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public EnemySprite getEnemyByID(int id) {
|
public EnemySprite getEnemyByID(int id) { //Search actor by ID, enemies only.
|
||||||
for(MapActor A : new Array.ArrayIterator<>(actors)){
|
for(MapActor A : new Array.ArrayIterator<>(actors)){
|
||||||
if(A instanceof EnemySprite && A.getId() == id)
|
if(A instanceof EnemySprite && A.getId() == id)
|
||||||
return ((EnemySprite) A);
|
return ((EnemySprite) A);
|
||||||
@@ -492,7 +500,7 @@ public class MapStage extends GameStage {
|
|||||||
currentMob = mob;
|
currentMob = mob;
|
||||||
if (mob.dialog != null){ //This enemy has something to say. Display a dialog like if it was a DialogActor.
|
if (mob.dialog != null){ //This enemy has something to say. Display a dialog like if it was a DialogActor.
|
||||||
resetPosition();
|
resetPosition();
|
||||||
showDialog();
|
//showDialog();
|
||||||
mob.dialog.activate();
|
mob.dialog.activate();
|
||||||
} else { //Duel the enemy.
|
} else { //Duel the enemy.
|
||||||
beginDuel(mob);
|
beginDuel(mob);
|
||||||
@@ -534,7 +542,7 @@ public class MapStage extends GameStage {
|
|||||||
}
|
}
|
||||||
}, ScreenUtils.getFrameBufferTexture(), true, false));
|
}, ScreenUtils.getFrameBufferTexture(), true, false));
|
||||||
}
|
}
|
||||||
startPause(0.4f, new Runnable() {
|
startPause(0.3f, new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
DuelScene S = ((DuelScene) SceneType.DuelScene.instance);
|
DuelScene S = ((DuelScene) SceneType.DuelScene.instance);
|
||||||
@@ -568,7 +576,6 @@ public class MapStage extends GameStage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void resetPosition() {
|
public void resetPosition() {
|
||||||
|
|
||||||
player.setPosition(oldPosition4);
|
player.setPosition(oldPosition4);
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ public class MapDialog {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.data = JSONStringLoader.parse(Array.class, DialogData.class, S, defaultJSON);
|
this.data = JSONStringLoader.parse(Array.class, DialogData.class, S, defaultJSON);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadDialog(DialogData dialog) { //Displays a dialog with dialogue and possible choices.
|
private void loadDialog(DialogData dialog) { //Displays a dialog with dialogue and possible choices.
|
||||||
@@ -91,6 +90,13 @@ public class MapDialog {
|
|||||||
if (E.addItem != null){ //Gives an item to the player.
|
if (E.addItem != null){ //Gives an item to the player.
|
||||||
Current.player().addItem(E.addItem);
|
Current.player().addItem(E.addItem);
|
||||||
}
|
}
|
||||||
|
if(E.addLife != 0){ //Gives (positive or negative) life to the player. Cannot go over max health.
|
||||||
|
Current.player().heal(E.addLife);
|
||||||
|
}
|
||||||
|
if(E.addGold != 0){ //Gives (positive or negative) gold to the player.
|
||||||
|
if(E.addGold > 0) Current.player().giveGold(E.addGold);
|
||||||
|
else Current.player().takeGold(-E.addGold);
|
||||||
|
}
|
||||||
if (E.deleteMapObject != 0){ //Removes a dummy object from the map.
|
if (E.deleteMapObject != 0){ //Removes a dummy object from the map.
|
||||||
if(E.deleteMapObject < 0) stage.deleteObject(parentID);
|
if(E.deleteMapObject < 0) stage.deleteObject(parentID);
|
||||||
else stage.deleteObject(E.deleteMapObject);
|
else stage.deleteObject(E.deleteMapObject);
|
||||||
@@ -106,6 +112,9 @@ public class MapDialog {
|
|||||||
Current.player().setColorIdentity(E.setColorIdentity);
|
Current.player().setColorIdentity(E.setColorIdentity);
|
||||||
}
|
}
|
||||||
//Create map object.
|
//Create map object.
|
||||||
|
//Toggle dummy object's hitbox. (Like to make a door passable)
|
||||||
|
//Set world flag.
|
||||||
|
//Set dungeon flag.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,6 +132,16 @@ public class MapDialog {
|
|||||||
if(!condition.not) return false;
|
if(!condition.not) return false;
|
||||||
} else if(condition.not) return false;
|
} else if(condition.not) return false;
|
||||||
}
|
}
|
||||||
|
if(condition.hasGold != 0){ //Check for at least X gold.
|
||||||
|
if(player.getGold() < condition.hasGold){
|
||||||
|
if(!condition.not) return false;
|
||||||
|
} else if(condition.not) return false;
|
||||||
|
}
|
||||||
|
if(condition.hasLife != 0){ //Check for at least X life..
|
||||||
|
if(player.getLife() < condition.hasLife + 1){
|
||||||
|
if(!condition.not) return false;
|
||||||
|
} else if(condition.not) return false;
|
||||||
|
}
|
||||||
if(condition.hasBlessing != null && !condition.hasBlessing.isEmpty()){ //Check for a named blessing.
|
if(condition.hasBlessing != null && !condition.hasBlessing.isEmpty()){ //Check for a named blessing.
|
||||||
if(!player.hasBlessing(condition.hasBlessing)){
|
if(!player.hasBlessing(condition.hasBlessing)){
|
||||||
if(!condition.not) return false;
|
if(!condition.not) return false;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<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="86">
|
||||||
<editorsettings>
|
<editorsettings>
|
||||||
<export format="tmx"/>
|
<export format="tmx"/>
|
||||||
</editorsettings>
|
</editorsettings>
|
||||||
@@ -32,8 +32,7 @@
|
|||||||
</data>
|
</data>
|
||||||
</layer>
|
</layer>
|
||||||
<objectgroup id="4" name="Objects">
|
<objectgroup id="4" name="Objects">
|
||||||
<object id="47" template="../obj/gold.tx" x="96" y="224"/>
|
<object id="47" template="../obj/gold.tx" x="32" y="352"/>
|
||||||
<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">
|
<object id="50" template="../obj/enemy.tx" x="112" y="192" width="64" height="64">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="effect">{
|
<property name="effect">{
|
||||||
@@ -77,12 +76,11 @@
|
|||||||
<property name="sprite" value="sprites/3life.atlas"/>
|
<property name="sprite" value="sprites/3life.atlas"/>
|
||||||
</properties>
|
</properties>
|
||||||
</object>
|
</object>
|
||||||
<object id="69" template="../obj/treasure.tx" x="192" y="352"/>
|
<object id="69" template="../obj/treasure.tx" x="48" y="336"/>
|
||||||
<object id="74" template="../obj/treasure.tx" x="224" 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="70" template="../obj/booster.tx" x="32" y="336"/>
|
||||||
<object id="72" template="../obj/booster.tx" x="224" y="320"/>
|
<object id="72" template="../obj/booster.tx" x="224" y="320"/>
|
||||||
<object id="71" template="../obj/gold.tx" x="48" y="352"/>
|
<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">
|
<object id="78" template="../obj/gate.tx" x="144" y="208" visible="0">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="dialog">[
|
<property name="dialog">[
|
||||||
@@ -207,5 +205,68 @@
|
|||||||
</properties>
|
</properties>
|
||||||
</object>
|
</object>
|
||||||
<object id="83" template="../obj/gate.tx" type="dummy" gid="3651" x="64" y="336" width="16" height="16"/>
|
<object id="83" template="../obj/gate.tx" type="dummy" gid="3651" x="64" y="336" width="16" height="16"/>
|
||||||
|
<object id="84" template="../obj/enemy.tx" x="320" y="304">
|
||||||
|
<properties>
|
||||||
|
<property name="dialog">[
|
||||||
|
{
|
||||||
|
"effect":[],
|
||||||
|
"text":"I have some things to offer for that life you have...",
|
||||||
|
"condition":[],
|
||||||
|
"options":[
|
||||||
|
{ "name":"You are suspicious and have two shadows, I'm out." },
|
||||||
|
{
|
||||||
|
"name":"I'll vanquish you, demon!",
|
||||||
|
"text": "Oh look we got a tough guy over here!",
|
||||||
|
"options": [ { "name": "I FEAR NOTHING!!", "effect": [ { "battleWithActorID": -1 } ]} ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "I dig your edge.",
|
||||||
|
"condition": [ { "colorIdentity": "B", "not": true }, { "hasLife": 2 } ],
|
||||||
|
"text": "You can be dark and edgy like me. Maybe for some of your life force...",
|
||||||
|
"options": [ { "name": "I'm doing nothing better with it.", "effect": [ { "setColorIdentity": "B", "addLife": -2 } ]} ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "I dig your edge.",
|
||||||
|
"condition": [ { "colorIdentity": "B", "not": true }, { "hasLife": 2, "not": true } ],
|
||||||
|
"text": "You don't have enough life force...come back with more to offer.",
|
||||||
|
"options": [ { "name": "Aw man..." } ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Any cool demon deals?",
|
||||||
|
"condition": [ { "colorIdentity": "B" }, { "hasGold": 200 } ],
|
||||||
|
"text": "I can offer you this Treasure for the fair price of 200 gold.",
|
||||||
|
"options": [
|
||||||
|
{ "name": "This gem has a lot of edge, just like me. Deal!" , "effect": [ { "addGold": -20000, "addItem": "Treasure" } ] },
|
||||||
|
{ "name": "I'll think about it." }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"Got any fancy demon blessing?",
|
||||||
|
"condition": [ {"colorIdentity": "B"}, { "item": "Treasure" }, { "hasBlessing": "Debug Demon", "not": true } ],
|
||||||
|
"text": "Give me that Treasure of yours...\n(+1 health, Manasight, move speed 120%, Lord of the Pit starts in play)",
|
||||||
|
"options": [
|
||||||
|
{ "name": "That's shady."},
|
||||||
|
{
|
||||||
|
"name": "What can possibly go wrong?",
|
||||||
|
"effect": [
|
||||||
|
{ "removeItem": "Treasure", "giveBlessing": { "name": "Debug Demon" , "lifeModifier": 1, "colorView": true, "moveSpeed": 2, "startBattleWithCard": [ "Lord of the Pit" ] } }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]</property>
|
||||||
|
<property name="enemy" value="Demon"/>
|
||||||
|
<property name="name" value="Debug Demon"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
<object id="85" template="../obj/scroll.tx" x="224" y="288">
|
||||||
|
<properties>
|
||||||
|
<property name="reward">[
|
||||||
|
{ "cardName": "Black Lotus", "type":"card", "count":1 }
|
||||||
|
]</property>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
</objectgroup>
|
</objectgroup>
|
||||||
</map>
|
</map>
|
||||||
|
|||||||
10
forge-gui/res/adventure/Shandalar/maps/obj/scroll.tx
Normal file
10
forge-gui/res/adventure/Shandalar/maps/obj/scroll.tx
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<template>
|
||||||
|
<tileset firstgid="1" source="../tileset/buildings.tsx"/>
|
||||||
|
<object name="Scroll" type="reward" gid="1363" width="16" height="16">
|
||||||
|
<properties>
|
||||||
|
<property name="reward" value="[ { "type": "card", "cardName": "Black Lotus", "amount": 1 } ]"/>
|
||||||
|
<property name="sprite" value="sprites/scroll.atlas"/>
|
||||||
|
</properties>
|
||||||
|
</object>
|
||||||
|
</template>
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 227 KiB |
Binary file not shown.
@@ -1,5 +1,5 @@
|
|||||||
treasure.png
|
treasure.png
|
||||||
size: 64,112
|
size: 64,128
|
||||||
format: RGBA8888
|
format: RGBA8888
|
||||||
filter: Nearest,Nearest
|
filter: Nearest,Nearest
|
||||||
repeat: none
|
repeat: none
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
treasure.png
|
treasure.png
|
||||||
size: 64,112
|
size: 64,128
|
||||||
format: RGBA8888
|
format: RGBA8888
|
||||||
filter: Nearest,Nearest
|
filter: Nearest,Nearest
|
||||||
repeat: none
|
repeat: none
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
treasure.png
|
treasure.png
|
||||||
size: 64,112
|
size: 64,128
|
||||||
format: RGBA8888
|
format: RGBA8888
|
||||||
filter: Nearest,Nearest
|
filter: Nearest,Nearest
|
||||||
repeat: none
|
repeat: none
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
treasure.png
|
treasure.png
|
||||||
size: 64,112
|
size: 64,128
|
||||||
format: RGBA8888
|
format: RGBA8888
|
||||||
filter: Nearest,Nearest
|
filter: Nearest,Nearest
|
||||||
repeat: none
|
repeat: none
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
treasure.png
|
treasure.png
|
||||||
size: 64,112
|
size: 64,128
|
||||||
format: RGBA8888
|
format: RGBA8888
|
||||||
filter: Nearest,Nearest
|
filter: Nearest,Nearest
|
||||||
repeat: none
|
repeat: none
|
||||||
|
|||||||
17
forge-gui/res/adventure/Shandalar/sprites/scroll.atlas
Normal file
17
forge-gui/res/adventure/Shandalar/sprites/scroll.atlas
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
treasure.png
|
||||||
|
size: 64,128
|
||||||
|
format: RGBA8888
|
||||||
|
filter: Nearest,Nearest
|
||||||
|
repeat: none
|
||||||
|
Idle
|
||||||
|
xy: 0, 112
|
||||||
|
size: 16, 16
|
||||||
|
Idle
|
||||||
|
xy: 16, 112
|
||||||
|
size: 16, 16
|
||||||
|
Idle
|
||||||
|
xy: 32, 112
|
||||||
|
size: 16, 16
|
||||||
|
Idle
|
||||||
|
xy: 48, 112
|
||||||
|
size: 16, 16
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 13 KiB |
@@ -3,64 +3,65 @@
|
|||||||
"height": 270,
|
"height": 270,
|
||||||
"yDown": true,
|
"yDown": true,
|
||||||
"elements": [
|
"elements": [
|
||||||
{
|
{
|
||||||
"type": "Image",
|
"type": "Image",
|
||||||
"image": "ui/title_bg.png",
|
"image": "ui/title_bg.png",
|
||||||
"width": 480,
|
"width": 480,
|
||||||
"height": 270
|
"height": 270
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
"type": "Image",
|
"type": "Image",
|
||||||
"image": "ui/equipment.png",
|
"image": "ui/equipment.png",
|
||||||
"x": 8,
|
"x": 8,
|
||||||
"y": 8,
|
"y": 8,
|
||||||
"width": 129,
|
"width": 129,
|
||||||
"height": 243
|
"height": 243
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "ImageButton",
|
"type": "ImageButton",
|
||||||
"name": "Equipment_Neck",
|
"name": "Equipment_Neck",
|
||||||
"style": "item_frame",
|
"style": "item_frame",
|
||||||
"width": 20,
|
"width": 20,
|
||||||
"height": 20,
|
"height": 20,
|
||||||
"x": 62,
|
"x": 62,
|
||||||
"y": 40
|
"y": 40
|
||||||
} ,
|
},
|
||||||
{
|
{
|
||||||
"type": "ImageButton",
|
"type": "ImageButton",
|
||||||
"name": "Equipment_Body",
|
"name": "Equipment_Body",
|
||||||
"style": "item_frame",
|
"style": "item_frame",
|
||||||
"width": 20,
|
"width": 20,
|
||||||
"height": 20,
|
"height": 20,
|
||||||
"x": 62,
|
"x": 62,
|
||||||
"y": 85
|
"y": 85
|
||||||
} ,
|
},
|
||||||
{
|
{
|
||||||
"type": "ImageButton",
|
"type": "ImageButton",
|
||||||
"name": "Equipment_Boots",
|
"name": "Equipment_Boots",
|
||||||
"style": "item_frame",
|
"style": "item_frame",
|
||||||
"width": 20,
|
"width": 20,
|
||||||
"height": 20,
|
"height": 20,
|
||||||
"x": 62,
|
"x": 62,
|
||||||
"y": 220
|
"y": 220
|
||||||
} ,
|
},
|
||||||
{
|
{
|
||||||
"type": "ImageButton",
|
"type": "ImageButton",
|
||||||
"name": "Equipment_Left",
|
"name": "Equipment_Left",
|
||||||
"style": "item_frame",
|
"style": "item_frame",
|
||||||
"width": 20,
|
"width": 20,
|
||||||
"height": 20,
|
"height": 20,
|
||||||
"x": 17,
|
"x": 17,
|
||||||
"y": 130
|
"y": 130
|
||||||
} ,
|
},
|
||||||
{
|
{
|
||||||
"type": "ImageButton",
|
"type": "ImageButton",
|
||||||
"name": "Equipment_Right",
|
"name": "Equipment_Right",
|
||||||
"style": "item_frame",
|
"style": "item_frame",
|
||||||
"width": 20,
|
"width": 20,
|
||||||
"height": 20,
|
"height": 20,
|
||||||
"x": 107,
|
"x": 107,
|
||||||
"y": 130
|
"y": 130
|
||||||
} ,
|
},
|
||||||
{
|
{
|
||||||
"type": "Scroll",
|
"type": "Scroll",
|
||||||
"name": "inventory",
|
"name": "inventory",
|
||||||
@@ -68,22 +69,22 @@
|
|||||||
"y": 110,
|
"y": 110,
|
||||||
"width": 330,
|
"width": 330,
|
||||||
"height": 100
|
"height": 100
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Window",
|
"type": "Window",
|
||||||
"x": 145,
|
"x": 145,
|
||||||
"y": 8,
|
"y": 8,
|
||||||
"width": 330,
|
"width": 330,
|
||||||
"height": 98
|
"height": 98
|
||||||
} ,
|
},
|
||||||
{
|
{
|
||||||
"type": "Label",
|
"type": "Label",
|
||||||
"name": "item_description",
|
"name": "item_description",
|
||||||
"x": 155,
|
"x": 155,
|
||||||
"y": 8,
|
"y": 12,
|
||||||
"width": 310,
|
"width": 310,
|
||||||
"height": 98
|
"height": 94
|
||||||
} ,
|
},
|
||||||
{
|
{
|
||||||
"type": "TextButton",
|
"type": "TextButton",
|
||||||
"name": "return",
|
"name": "return",
|
||||||
@@ -99,17 +100,17 @@
|
|||||||
"text": "Equip",
|
"text": "Equip",
|
||||||
"width": 60,
|
"width": 60,
|
||||||
"height": 30,
|
"height": 30,
|
||||||
"x": 330,
|
"x": 320,
|
||||||
"y": 222
|
"y": 222
|
||||||
} ,
|
},
|
||||||
{
|
{
|
||||||
"type": "TextButton",
|
"type": "TextButton",
|
||||||
"name": "delete",
|
"name": "delete",
|
||||||
"text": "Delete",
|
"text": "Discard",
|
||||||
"width": 60,
|
"width": 60,
|
||||||
"height": 30,
|
"height": 30,
|
||||||
"x": 240,
|
"x": 240,
|
||||||
"y": 222
|
"y": 222
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -43,20 +43,11 @@
|
|||||||
"width": 64,
|
"width": 64,
|
||||||
"height": 64
|
"height": 64
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"type": "Label",
|
|
||||||
"name": "playerName",
|
|
||||||
"x": 400,
|
|
||||||
"y": 20,
|
|
||||||
"width": 80,
|
|
||||||
"height": 24,
|
|
||||||
"font": "black"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "Label",
|
"type": "Label",
|
||||||
"name": "totalWins",
|
"name": "totalWins",
|
||||||
"x": 410,
|
"x": 410,
|
||||||
"y": 99,
|
"y": 102,
|
||||||
"width": 80,
|
"width": 80,
|
||||||
"height": 24,
|
"height": 24,
|
||||||
"font": "black"
|
"font": "black"
|
||||||
@@ -66,7 +57,7 @@
|
|||||||
"name": "wins",
|
"name": "wins",
|
||||||
"text": "Win:",
|
"text": "Win:",
|
||||||
"x": 330,
|
"x": 330,
|
||||||
"y": 99,
|
"y": 102,
|
||||||
"width": 80,
|
"width": 80,
|
||||||
"height": 24,
|
"height": 24,
|
||||||
"font": "black"
|
"font": "black"
|
||||||
@@ -75,7 +66,7 @@
|
|||||||
"type": "Label",
|
"type": "Label",
|
||||||
"name": "totalLoss",
|
"name": "totalLoss",
|
||||||
"x": 410,
|
"x": 410,
|
||||||
"y": 111,
|
"y": 113,
|
||||||
"width": 80,
|
"width": 80,
|
||||||
"height": 24,
|
"height": 24,
|
||||||
"font": "black"
|
"font": "black"
|
||||||
@@ -85,7 +76,7 @@
|
|||||||
"name": "loss",
|
"name": "loss",
|
||||||
"text": "Loss:",
|
"text": "Loss:",
|
||||||
"x": 330,
|
"x": 330,
|
||||||
"y": 111,
|
"y": 113,
|
||||||
"width": 80,
|
"width": 80,
|
||||||
"height": 24,
|
"height": 24,
|
||||||
"font": "black"
|
"font": "black"
|
||||||
@@ -94,7 +85,7 @@
|
|||||||
"type": "Label",
|
"type": "Label",
|
||||||
"name": "lossWinRatio",
|
"name": "lossWinRatio",
|
||||||
"x": 410,
|
"x": 410,
|
||||||
"y": 123,
|
"y": 125,
|
||||||
"width": 80,
|
"width": 80,
|
||||||
"height": 24,
|
"height": 24,
|
||||||
"font": "black"
|
"font": "black"
|
||||||
@@ -104,19 +95,19 @@
|
|||||||
"name": "winloss",
|
"name": "winloss",
|
||||||
"text": "Win Loss Ratio:",
|
"text": "Win Loss Ratio:",
|
||||||
"x": 330,
|
"x": 330,
|
||||||
"y": 123,
|
"y": 125,
|
||||||
"width": 80,
|
"width": 80,
|
||||||
"height": 24,
|
"height": 24,
|
||||||
"font": "black"
|
"font": "black"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Scroll",
|
"type": "Scroll",
|
||||||
"name": "blessingInfo",
|
"name": "blessingInfo",
|
||||||
"style": "nobg",
|
"style": "nobg",
|
||||||
"x": 305,
|
"x": 308,
|
||||||
"y": 135,
|
"y": 143,
|
||||||
"width": 150,
|
"width": 144,
|
||||||
"height": 88
|
"height": 72
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "TextButton",
|
"type": "TextButton",
|
||||||
@@ -125,13 +116,13 @@
|
|||||||
"width": 100,
|
"width": 100,
|
||||||
"height": 30,
|
"height": 30,
|
||||||
"x": 335,
|
"x": 335,
|
||||||
"y": 226
|
"y": 224
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Image",
|
"type": "Image",
|
||||||
"name": "lifeIcon",
|
"name": "lifeIcon",
|
||||||
"image": "ui/life.png",
|
"image": "ui/life.png",
|
||||||
"x": 400,
|
"x": 392,
|
||||||
"y": 40,
|
"y": 40,
|
||||||
"width": 16,
|
"width": 16,
|
||||||
"height": 16
|
"height": 16
|
||||||
@@ -140,18 +131,27 @@
|
|||||||
"type": "Image",
|
"type": "Image",
|
||||||
"name": "goldIcon",
|
"name": "goldIcon",
|
||||||
"image": "ui/money.png",
|
"image": "ui/money.png",
|
||||||
"x": 400,
|
"x": 392,
|
||||||
"y": 60,
|
"y": 60,
|
||||||
"width": 16,
|
"width": 16,
|
||||||
"height": 16
|
"height": 16
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "Label",
|
||||||
|
"name": "playerName",
|
||||||
|
"x": 394,
|
||||||
|
"y": 20,
|
||||||
|
"width": 80,
|
||||||
|
"height": 24,
|
||||||
|
"font": "black"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "Label",
|
"type": "Label",
|
||||||
"name": "lifePoints",
|
"name": "lifePoints",
|
||||||
"font": "black",
|
"font": "black",
|
||||||
"width": 64,
|
"width": 64,
|
||||||
"height": 16,
|
"height": 16,
|
||||||
"x": 420,
|
"x": 410,
|
||||||
"y": 40
|
"y": 40
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -160,7 +160,7 @@
|
|||||||
"font": "black",
|
"font": "black",
|
||||||
"width": 64,
|
"width": 64,
|
||||||
"height": 16,
|
"height": 16,
|
||||||
"x": 420,
|
"x": 410,
|
||||||
"y": 60
|
"y": 60
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -587,6 +587,14 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Manasight Amulet",
|
||||||
|
"equipmentSlot": "Neck",
|
||||||
|
"iconName": "RelicAmulet",
|
||||||
|
"effect": {
|
||||||
|
"colorView": true
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Amulet of Kroog",
|
"name": "Amulet of Kroog",
|
||||||
"equipmentSlot": "Neck",
|
"equipmentSlot": "Neck",
|
||||||
|
|||||||
Reference in New Issue
Block a user