Merge conflicts

This commit is contained in:
Benjamin Perry
2023-04-13 20:08:05 -04:00
226 changed files with 6351 additions and 3612 deletions

View File

@@ -169,7 +169,6 @@ public class QuestStageEdit extends FormPanel {
switch(objectiveType.getSelectedItem().toString()){
case "Arena":
arenaLabel.setVisible(true);
nyi.setVisible(true);
poiPane.setVisible(true);
anyPOI.setVisible(true);
here.setVisible(true);

View File

@@ -23,6 +23,8 @@ public class ImmediateTriggerEffect extends SpellAbilityEffect {
protected String getStackDescription(SpellAbility sa) {
if (sa.hasParam("TriggerDescription")) {
return sa.getParam("TriggerDescription");
} else if (sa.hasParam("SpellDescription")) {
return sa.getParam("SpellDescription");
}
return "";

View File

@@ -256,9 +256,10 @@ public class PlayEffect extends SpellAbilityEffect {
if (sa.hasParam("ShowCardToActivator")) {
game.getAction().revealTo(tgtCard, controller);
}
String prompt = sa.hasParam("CastTransformed") ? "lblDoYouWantPlayCardTransformed" : "lblDoYouWantPlayCard";
if (singleOption && sa.getTargetCard() == null)
sa.setPlayEffectCard(tgtCard);// show card to play rather than showing the source card
if (singleOption && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", CardTranslation.getTranslatedName(tgtCard.getName())), null)) {
if (singleOption && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage(prompt, CardTranslation.getTranslatedName(tgtCard.getName())), null)) {
if (wasFaceDown) {
tgtCard.turnFaceDownNoUpdate();
tgtCard.updateStateForView();

View File

@@ -26,6 +26,7 @@ public class CardDamageHistory {
private boolean creatureGotBlockedThisCombat = false;
private List<GameEntity> attackedThisTurn = Lists.newArrayList();
private boolean attackedBattleThisTurn = false;
private final List<Player> creatureAttackedLastTurnOf = Lists.newArrayList();
private final List<Player> NotAttackedSinceLastUpkeepOf = Lists.newArrayList();
@@ -59,6 +60,12 @@ public class CardDamageHistory {
if (defender != null) {
attackedThisTurn.add(defender);
if (defender instanceof Card) {
final Card def = (Card) defender;
if (def.isBattle()) {
attackedBattleThisTurn = true;
}
}
}
}
/**
@@ -84,6 +91,9 @@ public class CardDamageHistory {
public final boolean hasAttackedThisTurn(GameEntity e) {
return this.attackedThisTurn.contains(e);
}
public final boolean hasAttackedBattleThisTurn() {
return this.attackedBattleThisTurn;
}
/**
* <p>
* Setter for the field <code>creatureAttackedLastTurn</code>.
@@ -272,6 +282,7 @@ public class CardDamageHistory {
public void newTurn() {
attackedThisTurn.clear();
attackedBattleThisTurn = false;
damagedThisCombat.clear();
damageDoneThisTurn.clear();

View File

@@ -218,6 +218,14 @@ public class CardProperty {
|| !sourceController.getOpponents().contains(card.getProtectingPlayer())) {
return false;
}
} else if (property.startsWith("ProtectedBy")) {
if (card.getProtectingPlayer() == null) {
return false;
}
final List<Player> lp = AbilityUtils.getDefinedPlayers(source, property.substring(12), spellAbility);
if (!lp.contains(card.getProtectingPlayer())) {
return false;
}
} else if (property.startsWith("DefendingPlayer")) {
Player p = property.endsWith("Ctrl") ? controller : card.getOwner();
if (!game.getPhaseHandler().inCombat()) {
@@ -1242,6 +1250,10 @@ public class CardProperty {
if (card.getDamageHistory().getCreatureAttacksThisTurn() == 0) {
return false;
}
} else if (property.startsWith("attackedBattleThisTurn")) {
if (!card.getDamageHistory().hasAttackedBattleThisTurn()) {
return false;
}
} else if (property.startsWith("attackedYouThisTurn")) {
if (!card.getDamageHistory().hasAttackedThisTurn(sourceController)) {
return false;

View File

@@ -61,6 +61,24 @@ public class Mana {
return false;
}
if (!sourceCard.equals(m2.sourceCard)) {
if (addsKeywords(null) != m2.addsKeywords(null)) {
return false;
}
if (addsCounters(null) != m2.addsCounters(null)) {
return false;
}
if (mp.isCannotCounterPaidWith() != mp2.isCannotCounterPaidWith()) {
return false;
}
if (mp.getTriggersWhenSpent() != mp2.getTriggersWhenSpent()) {
return false;
}
if (mp.isPersistentMana() != mp2.isPersistentMana()) {
return false;
}
}
return mp == mp2 || (mp.getManaRestrictions().equals(mp2.getManaRestrictions()) && mp.getExtraManaRestriction().equals(mp2.getExtraManaRestriction()));
}

View File

@@ -226,6 +226,10 @@ public class AbilityManaPart implements java.io.Serializable {
return source.isValid(cannotCounterSpell, sourceCard.getController(), sourceCard, null);
}
public boolean isCannotCounterPaidWith() {
return null != cannotCounterSpell;
}
public void addNoCounterEffect(SpellAbility saBeingPaid) {
final Game game = sourceCard.getGame();
final Card eff = new Card(game.nextCardId(), game);

View File

@@ -44,17 +44,29 @@ public class DialogActor extends CharacterSprite {
}
};
dialog.addQuestAcceptedListener(listen);
ChangeListener finished = new ChangeListener() {
@Override
public void changed(ChangeEvent changeEvent, Actor actor) {
removeFromMap();
}
};
dialog.addDialogCompleteListener(finished);
}
public void acceptQuest(){
Current.player().addQuest(questData);
}
public void removeFromMap() { dialog = null; }
@Override
public void onPlayerCollide() {
stage.resetPosition();
stage.showDialog();
dialog.activate();
if (dialog != null) {
stage.resetPosition();
stage.showDialog();
dialog.activate();
}
}
@Override

View File

@@ -25,7 +25,6 @@ import forge.util.MyRandom;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
/**
@@ -55,7 +54,7 @@ public class EnemySprite extends CharacterSprite {
public float threatRange = 0.0f;
public float fleeRange = 0.0f;
public boolean ignoreDungeonEffect = false;
public UUID questStageID;
public String questStageID;
public EnemySprite(EnemyData enemyData) {
this(0,enemyData);

View File

@@ -175,6 +175,8 @@ public class AdventureQuestData implements Serializable {
public void initializeStage(AdventureQuestStage stage){
if (stage == null || stage.objective == null) return;
stage.initialize();
switch (stage.objective){
case Clear:
stage.setTargetPOI(poiTokens);
@@ -311,7 +313,7 @@ public class AdventureQuestData implements Serializable {
EnemyData toUse = generateTargetEnemyData(stage);
toUse.lifetime = stage.count1;
EnemySprite toReturn = new EnemySprite(toUse);
toReturn.questStageID = stage.questStageID;
toReturn.questStageID = stage.stageID.toString();
return toReturn;
}
return null;
@@ -394,6 +396,34 @@ public class AdventureQuestData implements Serializable {
}
}
public void updateArenaComplete(boolean winner){
for (AdventureQuestStage stage: stages) {
if(failed)
break;
stage.updateArenaComplete(winner);
failed = failed || stage.getStatus() == AdventureQuestController.QuestStatus.Failed;
}
if (!failed)
updateStatus();
}
public void updateStatus(){
for (AdventureQuestStage stage: stages) {
switch (stage.getStatus()) {
case Complete:
continue;
case Failed:
failed = true;
break;
case None:
case Inactive:
case Active:
return;
}
}
completed = true;
}
public DialogData getPrologue() {
if (!prologueDisplayed) {
prologueDisplayed = true;

View File

@@ -11,6 +11,9 @@ import java.util.*;
import java.util.stream.Collectors;
public class AdventureQuestStage implements Serializable {
private static final long serialVersionUID = 12042023L;
public int id;
private AdventureQuestController.QuestStatus status = AdventureQuestController.QuestStatus.Inactive;
public String name = "";
@@ -45,7 +48,13 @@ public class AdventureQuestStage implements Serializable {
public String POIToken; //If defined, ignore tags input and use the target POI from a different stage's objective instead.
private transient boolean inTargetLocation = false;
public UUID questStageID = UUID.randomUUID();
public UUID stageID;
public void initialize(){
if (stageID == null){
stageID = UUID.randomUUID();
}
}
public void checkPrerequisites() {
//Todo - implement
@@ -287,7 +296,20 @@ public class AdventureQuestStage implements Serializable {
return status;
}
public AdventureQuestStage(){}
public void updateArenaComplete(boolean winner){
if (this.objective == AdventureQuestController.ObjectiveTypes.Arena)
{
if (inTargetLocation){
if (winner){
status = AdventureQuestController.QuestStatus.Complete;
}
}
}
}
public AdventureQuestStage(){
}
public AdventureQuestStage(AdventureQuestStage other){
this.status = other.status;
this.prologueDisplayed = other.prologueDisplayed;
@@ -320,6 +342,7 @@ public class AdventureQuestStage implements Serializable {
this.POITags = other.POITags;
this.targetEnemyData = other.targetEnemyData;
this.deliveryItem = other.deliveryItem;
this.questStageID = other.questStageID;
// if (this.stageID == null)
// this.stageID = other.stageID;
}
}

View File

@@ -27,7 +27,7 @@ import java.util.*;
* Class that represents the player (not the player sprite)
*/
public class AdventurePlayer implements Serializable, SaveFileContent {
public static final int NUMBER_OF_DECKS=10;
public static final int NUMBER_OF_DECKS = 10;
// Player profile data.
private String name;
private int heroRace;
@@ -44,53 +44,57 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
// Game data.
private float worldPosX;
private float worldPosY;
private int gold = 0;
private int maxLife= 20;
private int life = 20;
private int gold = 0;
private int maxLife = 20;
private int life = 20;
private int shards = 0;
private EffectData blessing; //Blessing to apply for next battle.
private final PlayerStatistic statistic = new PlayerStatistic();
private final PlayerStatistic statistic = new PlayerStatistic();
private final Map<String, Byte> questFlags = new HashMap<>();
private final Array<String> inventoryItems=new Array<>();
private final HashMap<String,String> equippedItems=new HashMap<>();
private List<AdventureQuestData> quests= new ArrayList<>();
private final Array<String> inventoryItems = new Array<>();
private final HashMap<String, String> equippedItems = new HashMap<>();
private final List<AdventureQuestData> quests = new ArrayList<>();
// Fantasy/Chaos mode settings.
private boolean fantasyMode = false;
private boolean fantasyMode = false;
private boolean announceFantasy = false;
private boolean usingCustomDeck = false;
private boolean announceCustom = false;
// Signals
final SignalList onLifeTotalChangeList = new SignalList();
final SignalList onShardsChangeList = new SignalList();
final SignalList onGoldChangeList = new SignalList();
final SignalList onPlayerChangeList = new SignalList();
final SignalList onEquipmentChange = new SignalList();
final SignalList onBlessing = new SignalList();
final SignalList onShardsChangeList = new SignalList();
final SignalList onGoldChangeList = new SignalList();
final SignalList onPlayerChangeList = new SignalList();
final SignalList onEquipmentChange = new SignalList();
final SignalList onBlessing = new SignalList();
public AdventurePlayer() { clear(); }
public AdventurePlayer() {
clear();
}
public PlayerStatistic getStatistic(){ return statistic; }
public PlayerStatistic getStatistic() {
return statistic;
}
private void clearDecks() {
for(int i=0; i < NUMBER_OF_DECKS; i++) decks[i] = new Deck(Forge.getLocalizer().getMessage("lblEmptyDeck"));
deck = decks[0];
for (int i = 0; i < NUMBER_OF_DECKS; i++) decks[i] = new Deck("Empty Deck");
deck = decks[0];
selectedDeckIndex = 0;
}
private void clear() {
//Ensure sensitive gameplay data is properly reset between games.
//Reset all properties HERE.
fantasyMode = false;
announceFantasy = false;
usingCustomDeck = false;
blessing = null;
gold = 0;
maxLife = 20;
life = 20;
shards = 0;
fantasyMode = false;
announceFantasy = false;
usingCustomDeck = false;
blessing = null;
gold = 0;
maxLife = 20;
life = 20;
shards = 0;
clearDecks();
inventoryItems.clear();
equippedItems.clear();
@@ -106,33 +110,33 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
return WorldSave.getCurrentSave().getPlayer();
}
private final CardPool cards=new CardPool();
private final ItemPool<InventoryItem> newCards=new ItemPool<>(InventoryItem.class);
private final CardPool cards = new CardPool();
private final ItemPool<InventoryItem> newCards = new ItemPool<>(InventoryItem.class);
public void create(String n, Deck startingDeck, boolean male, int race, int avatar, boolean isFantasy, boolean isUsingCustomDeck, DifficultyData difficultyData) {
public void create(String n, Deck startingDeck, boolean male, int race, int avatar, boolean isFantasy, boolean isUsingCustomDeck, DifficultyData difficultyData) {
clear();
announceFantasy = fantasyMode = isFantasy; //Set Chaos mode first.
announceCustom = usingCustomDeck = isUsingCustomDeck;
deck = startingDeck;
deck = startingDeck;
decks[0] = deck;
cards.addAllFlat(deck.getAllCardsInASinglePool().toFlatList());
this.difficultyData.startingLife = difficultyData.startingLife;
this.difficultyData.staringMoney = difficultyData.staringMoney;
this.difficultyData.startingLife = difficultyData.startingLife;
this.difficultyData.staringMoney = difficultyData.staringMoney;
this.difficultyData.startingDifficulty = difficultyData.startingDifficulty;
this.difficultyData.name = difficultyData.name;
this.difficultyData.spawnRank = difficultyData.spawnRank;
this.difficultyData.enemyLifeFactor = difficultyData.enemyLifeFactor;
this.difficultyData.sellFactor = difficultyData.sellFactor;
this.difficultyData.shardSellRatio = difficultyData.shardSellRatio;
this.difficultyData.name = difficultyData.name;
this.difficultyData.spawnRank = difficultyData.spawnRank;
this.difficultyData.enemyLifeFactor = difficultyData.enemyLifeFactor;
this.difficultyData.sellFactor = difficultyData.sellFactor;
this.difficultyData.shardSellRatio = difficultyData.shardSellRatio;
gold = difficultyData.staringMoney;
name = n;
heroRace = race;
gold = difficultyData.staringMoney;
name = n;
heroRace = race;
avatarIndex = avatar;
isFemale = !male;
isFemale = !male;
setColorIdentity(DeckProxy.getColorIdentity(deck));
@@ -146,12 +150,13 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
public void setSelectedDeckSlot(int slot) {
if(slot>=0&&slot<NUMBER_OF_DECKS) {
if (slot >= 0 && slot < NUMBER_OF_DECKS) {
selectedDeckIndex = slot;
deck = decks[selectedDeckIndex];
setColorIdentity(DeckProxy.getColorIdentity(deck));
}
}
public void updateDifficulty(DifficultyData diff) {
maxLife = diff.startingLife;
this.difficultyData.startingShards = diff.startingShards;
@@ -167,28 +172,71 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
//Getters
public int getSelectedDeckIndex() { return selectedDeckIndex; }
public Deck getSelectedDeck() { return deck; }
public Array<String> getItems() { return inventoryItems; }
public Deck getDeck(int index) { return decks[index]; }
public CardPool getCards() { return cards; }
public String getName() { return name; }
public float getWorldPosX() { return worldPosX; }
public float getWorldPosY() { return worldPosY; }
public int getGold() { return gold; }
public int getLife() { return life; }
public int getMaxLife() { return maxLife; }
public int getShards() { return shards; }
public @Null EffectData getBlessing() { return blessing; }
public int getSelectedDeckIndex() {
return selectedDeckIndex;
}
public Collection<String> getEquippedItems() { return equippedItems.values(); }
public ItemPool<InventoryItem> getNewCards() { return newCards; }
public Deck getSelectedDeck() {
return deck;
}
public ColorSet getColorIdentity(){
public Array<String> getItems() {
return inventoryItems;
}
public Deck getDeck(int index) {
return decks[index];
}
public CardPool getCards() {
return cards;
}
public String getName() {
return name;
}
public float getWorldPosX() {
return worldPosX;
}
public float getWorldPosY() {
return worldPosY;
}
public int getGold() {
return gold;
}
public int getLife() {
return life;
}
public int getMaxLife() {
return maxLife;
}
public int getShards() {
return shards;
}
public @Null EffectData getBlessing() {
return blessing;
}
public Collection<String> getEquippedItems() {
return equippedItems.values();
}
public ItemPool<InventoryItem> getNewCards() {
return newCards;
}
public ColorSet getColorIdentity() {
return colorIdentity;
}
public String getColorIdentityLong(){
public String getColorIdentityLong() {
return colorIdentity.toString();
}
@@ -197,62 +245,61 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
public void setWorldPosX(float worldPosX) {
this.worldPosX = worldPosX;
}
public void setWorldPosY(float worldPosY) {
this.worldPosY = worldPosY;
}
public void setColorIdentity(String C){
colorIdentity= ColorSet.fromNames(C.toCharArray());
public void setColorIdentity(String C) {
colorIdentity = ColorSet.fromNames(C.toCharArray());
}
public void setColorIdentity(ColorSet set){
public void setColorIdentity(ColorSet set) {
this.colorIdentity = set;
}
@Override
public void load(SaveFileData data) {
clear(); //Reset player data.
this.statistic.load(data.readSubData("statistic"));
this.difficultyData.startingLife=data.readInt("startingLife");
this.difficultyData.staringMoney=data.readInt("staringMoney");
this.difficultyData.startingDifficulty=data.readBool("startingDifficulty");
this.difficultyData.name=data.readString("difficultyName");
this.difficultyData.enemyLifeFactor=data.readFloat("enemyLifeFactor");
this.difficultyData.sellFactor=data.readFloat("sellFactor");
if(this.difficultyData.sellFactor==0)
this.difficultyData.sellFactor=0.2f;
this.difficultyData.startingLife = data.readInt("startingLife");
this.difficultyData.staringMoney = data.readInt("staringMoney");
this.difficultyData.startingDifficulty = data.readBool("startingDifficulty");
this.difficultyData.name = data.readString("difficultyName");
this.difficultyData.enemyLifeFactor = data.readFloat("enemyLifeFactor");
this.difficultyData.sellFactor = data.readFloat("sellFactor");
if (this.difficultyData.sellFactor == 0)
this.difficultyData.sellFactor = 0.2f;
this.difficultyData.shardSellRatio=data.readFloat("sellFactor");
if(this.difficultyData.shardSellRatio==0)
this.difficultyData.shardSellRatio=0.8f;
this.difficultyData.shardSellRatio = data.readFloat("sellFactor");
if (this.difficultyData.shardSellRatio == 0)
this.difficultyData.shardSellRatio = 0.8f;
name = data.readString("name");
heroRace = data.readInt("heroRace");
name = data.readString("name");
heroRace = data.readInt("heroRace");
avatarIndex = data.readInt("avatarIndex");
isFemale = data.readBool("isFemale");
if(data.containsKey("colorIdentity"))
isFemale = data.readBool("isFemale");
if (data.containsKey("colorIdentity"))
setColorIdentity(data.readString("colorIdentity"));
else
colorIdentity = ColorSet.ALL_COLORS;
gold = data.readInt("gold");
maxLife = data.readInt("maxLife");
life = data.readInt("life");
shards = data.containsKey("shards")?data.readInt("shards"):0;
worldPosX = data.readFloat("worldPosX");
worldPosY = data.readFloat("worldPosY");
gold = data.readInt("gold");
maxLife = data.readInt("maxLife");
life = data.readInt("life");
shards = data.containsKey("shards") ? data.readInt("shards") : 0;
worldPosX = data.readFloat("worldPosX");
worldPosY = data.readFloat("worldPosY");
if(data.containsKey("blessing")) blessing = (EffectData)data.readObject("blessing");
if (data.containsKey("blessing")) blessing = (EffectData) data.readObject("blessing");
if(data.containsKey("inventory")) {
String[] inv=(String[])data.readObject("inventory");
if (data.containsKey("inventory")) {
String[] inv = (String[]) data.readObject("inventory");
//Prevent items with wrong names from getting through. Hell breaks loose if it causes null pointers.
//This only needs to be done on load.
for(String i : inv){
if(ItemData.getItem(i) != null) inventoryItems.add(i);
for (String i : inv) {
if (ItemData.getItem(i) != null) inventoryItems.add(i);
else {
System.err.printf("Cannot find item name %s\n", i);
//Allow official© permission for the player to get a refund. We will allow it this time.
@@ -261,15 +308,15 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
}
}
if(data.containsKey("equippedSlots") && data.containsKey("equippedItems")) {
String[] slots=(String[])data.readObject("equippedSlots");
String[] items=(String[])data.readObject("equippedItems");
if (data.containsKey("equippedSlots") && data.containsKey("equippedItems")) {
String[] slots = (String[]) data.readObject("equippedSlots");
String[] items = (String[]) data.readObject("equippedItems");
assert(slots.length==items.length);
assert (slots.length == items.length);
//Like above, prevent items with wrong names. If it triggered in inventory it'll trigger here as well.
for(int i=0;i<slots.length;i++) {
if(ItemData.getItem(items[i]) != null)
equippedItems.put(slots[i],items[i]);
for (int i = 0; i < slots.length; i++) {
if (ItemData.getItem(items[i]) != null)
equippedItems.put(slots[i], items[i]);
else {
System.err.printf("Cannot find equip name %s\n", items[i]);
}
@@ -277,19 +324,19 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
deck = new Deck(data.readString("deckName"));
deck.getMain().addAll(CardPool.fromCardList(Lists.newArrayList((String[])data.readObject("deckCards"))));
if(data.containsKey("sideBoardCards"))
deck.getOrCreate(DeckSection.Sideboard).addAll(CardPool.fromCardList(Lists.newArrayList((String[])data.readObject("sideBoardCards"))));
deck.getMain().addAll(CardPool.fromCardList(Lists.newArrayList((String[]) data.readObject("deckCards"))));
if (data.containsKey("sideBoardCards"))
deck.getOrCreate(DeckSection.Sideboard).addAll(CardPool.fromCardList(Lists.newArrayList((String[]) data.readObject("sideBoardCards"))));
if(data.containsKey("questFlagsKey") && data.containsKey("questFlagsValue")){
if (data.containsKey("questFlagsKey") && data.containsKey("questFlagsValue")) {
String[] keys = (String[]) data.readObject("questFlagsKey");
Byte[] values = (Byte[]) data.readObject("questFlagsValue");
assert( keys.length == values.length );
for( int i = 0; i < keys.length; i++){
assert (keys.length == values.length);
for (int i = 0; i < keys.length; i++) {
questFlags.put(keys[i], values[i]);
}
}
if(data.containsKey("quests")){
if (data.containsKey("quests")) {
quests.clear();
Object[] q = (Object[]) data.readObject("quests");
if (q != null) {
@@ -298,24 +345,24 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
}
for(int i=0;i<NUMBER_OF_DECKS;i++) {
if(!data.containsKey("deck_name_" + i)) {
if(i==0) decks[i] = deck;
else decks[i] = new Deck(Forge.getLocalizer().getMessage("lblEmptyDeck"));
for (int i = 0; i < NUMBER_OF_DECKS; i++) {
if (!data.containsKey("deck_name_" + i)) {
if (i == 0) decks[i] = deck;
else decks[i] = new Deck("Empty Deck");
continue;
}
decks[i] = new Deck(data.readString("deck_name_"+i));
decks[i].getMain().addAll(CardPool.fromCardList(Lists.newArrayList((String[])data.readObject("deck_"+i))));
if(data.containsKey("sideBoardCards_"+i))
decks[i].getOrCreate(DeckSection.Sideboard).addAll(CardPool.fromCardList(Lists.newArrayList((String[])data.readObject("sideBoardCards_"+i))));
decks[i] = new Deck(data.readString("deck_name_" + i));
decks[i].getMain().addAll(CardPool.fromCardList(Lists.newArrayList((String[]) data.readObject("deck_" + i))));
if (data.containsKey("sideBoardCards_" + i))
decks[i].getOrCreate(DeckSection.Sideboard).addAll(CardPool.fromCardList(Lists.newArrayList((String[]) data.readObject("sideBoardCards_" + i))));
}
setSelectedDeckSlot(data.readInt("selectedDeckIndex"));
cards.addAll(CardPool.fromCardList(Lists.newArrayList((String[])data.readObject("cards"))));
cards.addAll(CardPool.fromCardList(Lists.newArrayList((String[]) data.readObject("cards"))));
fantasyMode = data.containsKey("fantasyMode") ? data.readBool("fantasyMode") : false;
announceFantasy = data.containsKey("announceFantasy") ? data.readBool("announceFantasy") : false;
usingCustomDeck = data.containsKey("usingCustomDeck") ? data.readBool("usingCustomDeck") : false;
announceCustom = data.containsKey("announceCustom") ? data.readBool("announceCustom") : false;
fantasyMode = data.containsKey("fantasyMode") && data.readBool("fantasyMode");
announceFantasy = data.containsKey("announceFantasy") && data.readBool("announceFantasy");
usingCustomDeck = data.containsKey("usingCustomDeck") && data.readBool("usingCustomDeck");
announceCustom = data.containsKey("announceCustom") && data.readBool("announceCustom");
onLifeTotalChangeList.emit();
onShardsChangeList.emit();
@@ -325,53 +372,53 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
@Override
public SaveFileData save() {
SaveFileData data= new SaveFileData();
SaveFileData data = new SaveFileData();
data.store("statistic",this.statistic.save());
data.store("startingLife",this.difficultyData.startingLife);
data.store("staringMoney",this.difficultyData.staringMoney);
data.store("startingDifficulty",this.difficultyData.startingDifficulty);
data.store("difficultyName",this.difficultyData.name);
data.store("enemyLifeFactor",this.difficultyData.enemyLifeFactor);
data.store("sellFactor",this.difficultyData.sellFactor);
data.store("statistic", this.statistic.save());
data.store("startingLife", this.difficultyData.startingLife);
data.store("staringMoney", this.difficultyData.staringMoney);
data.store("startingDifficulty", this.difficultyData.startingDifficulty);
data.store("difficultyName", this.difficultyData.name);
data.store("enemyLifeFactor", this.difficultyData.enemyLifeFactor);
data.store("sellFactor", this.difficultyData.sellFactor);
data.store("shardSellRatio", this.difficultyData.shardSellRatio);
data.store("name",name);
data.store("heroRace",heroRace);
data.store("avatarIndex",avatarIndex);
data.store("isFemale",isFemale);
data.store("name", name);
data.store("heroRace", heroRace);
data.store("avatarIndex", avatarIndex);
data.store("isFemale", isFemale);
data.store("colorIdentity", colorIdentity.getColor());
data.store("fantasyMode",fantasyMode);
data.store("announceFantasy",announceFantasy);
data.store("fantasyMode", fantasyMode);
data.store("announceFantasy", announceFantasy);
data.store("usingCustomDeck", usingCustomDeck);
data.store("announceCustom", announceCustom);
data.store("worldPosX",worldPosX);
data.store("worldPosY",worldPosY);
data.store("gold",gold);
data.store("life",life);
data.store("maxLife",maxLife);
data.store("shards",shards);
data.store("deckName",deck.getName());
data.store("worldPosX", worldPosX);
data.store("worldPosY", worldPosY);
data.store("gold", gold);
data.store("life", life);
data.store("maxLife", maxLife);
data.store("shards", shards);
data.store("deckName", deck.getName());
data.storeObject("inventory",inventoryItems.toArray(String.class));
data.storeObject("inventory", inventoryItems.toArray(String.class));
ArrayList<String> slots=new ArrayList<>();
ArrayList<String> items=new ArrayList<>();
for (Map.Entry<String,String> entry : equippedItems.entrySet()) {
ArrayList<String> slots = new ArrayList<>();
ArrayList<String> items = new ArrayList<>();
for (Map.Entry<String, String> entry : equippedItems.entrySet()) {
slots.add(entry.getKey());
items.add(entry.getValue());
}
data.storeObject("equippedSlots",slots.toArray(new String[0]));
data.storeObject("equippedItems",items.toArray(new String[0]));
data.storeObject("equippedSlots", slots.toArray(new String[0]));
data.storeObject("equippedItems", items.toArray(new String[0]));
data.storeObject("blessing", blessing);
//Save quest flags.
ArrayList<String> questFlagsKey = new ArrayList<>();
ArrayList<Byte> questFlagsValue = new ArrayList<>();
for(Map.Entry<String, Byte> entry : questFlags.entrySet()){
ArrayList<Byte> questFlagsValue = new ArrayList<>();
for (Map.Entry<String, Byte> entry : questFlags.entrySet()) {
questFlagsKey.add(entry.getKey());
questFlagsValue.add(entry.getValue());
}
@@ -379,17 +426,17 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
data.storeObject("questFlagsValue", questFlagsValue.toArray(new Byte[0]));
data.storeObject("quests", quests.toArray());
data.storeObject("deckCards",deck.getMain().toCardList("\n").split("\n"));
if(deck.get(DeckSection.Sideboard)!=null)
data.storeObject("sideBoardCards",deck.get(DeckSection.Sideboard).toCardList("\n").split("\n"));
for(int i=0;i<NUMBER_OF_DECKS;i++) {
data.store("deck_name_"+i,decks[i].getName());
data.storeObject("deck_"+i,decks[i].getMain().toCardList("\n").split("\n"));
if(decks[i].get(DeckSection.Sideboard)!=null)
data.storeObject("sideBoardCards_"+i,decks[i].get(DeckSection.Sideboard).toCardList("\n").split("\n"));
data.storeObject("deckCards", deck.getMain().toCardList("\n").split("\n"));
if (deck.get(DeckSection.Sideboard) != null)
data.storeObject("sideBoardCards", deck.get(DeckSection.Sideboard).toCardList("\n").split("\n"));
for (int i = 0; i < NUMBER_OF_DECKS; i++) {
data.store("deck_name_" + i, decks[i].getName());
data.storeObject("deck_" + i, decks[i].getMain().toCardList("\n").split("\n"));
if (decks[i].get(DeckSection.Sideboard) != null)
data.storeObject("sideBoardCards_" + i, decks[i].get(DeckSection.Sideboard).toCardList("\n").split("\n"));
}
data.store("selectedDeckIndex",selectedDeckIndex);
data.storeObject("cards",cards.toCardList("\n").split("\n"));
data.store("selectedDeckIndex", selectedDeckIndex);
data.storeObject("cards", cards.toCardList("\n").split("\n"));
return data;
}
@@ -421,7 +468,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
addGold(reward.getCount());
break;
case Item:
if(reward.getItem()!=null)
if (reward.getItem() != null)
inventoryItems.add(reward.getItem().name);
break;
case Life:
@@ -434,29 +481,31 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
private void addGold(int goldCount) {
gold+=goldCount;
gold += goldCount;
onGoldChangeList.emit();
}
public void onShardsChange(Runnable o) {
public void onShardsChange(Runnable o) {
onShardsChangeList.add(o);
o.run();
}
public void onLifeChange(Runnable o) {
public void onLifeChange(Runnable o) {
onLifeTotalChangeList.add(o);
o.run();
}
public void onPlayerChanged(Runnable o) {
public void onPlayerChanged(Runnable o) {
onPlayerChangeList.add(o);
o.run();
}
public void onEquipmentChanged(Runnable o) {
public void onEquipmentChanged(Runnable o) {
onEquipmentChange.add(o);
o.run();
}
public void onGoldChange(Runnable o) {
public void onGoldChange(Runnable o) {
onGoldChangeList.add(o);
o.run();
}
@@ -490,46 +539,55 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
public int falseLifeCost() {
int ret = 200 + (int)(50 * getStatistic().winLossRatio());
return ret < 0?250:ret;
int ret = 200 + (int) (50 * getStatistic().winLossRatio());
return ret < 0 ? 250 : ret;
}
public void heal(int amount) {
life = Math.min(life + amount, maxLife);
onLifeTotalChangeList.emit();
}
public void heal(float percent) {
life = Math.min(life + (int)(maxLife*percent), maxLife);
life = Math.min(life + (int) (maxLife * percent), maxLife);
onLifeTotalChangeList.emit();
}
public boolean defeated() {
gold= (int) (gold-(gold*difficultyData.goldLoss));
int newLife=(int)(life-(maxLife*difficultyData.lifeLoss));
life=Math.max(1,newLife);
gold = (int) (gold - (gold * difficultyData.goldLoss));
int newLife = (int) (life - (maxLife * difficultyData.lifeLoss));
life = Math.max(1, newLife);
onLifeTotalChangeList.emit();
onGoldChangeList.emit();
return newLife < 1;
//If true, the player would have had 0 or less, and thus is actually "defeated" if the caller cares about it
}
public void win() {
Current.player().addShards(1);
}
public void addMaxLife(int count) {
maxLife += count;
life += count;
life += count;
onLifeTotalChangeList.emit();
}
public void giveGold(int price) {
takeGold(-price);
}
public void takeGold(int price) {
gold -= price;
onGoldChangeList.emit();
//play sfx
SoundSystem.instance.play(SoundEffectType.CoinsDrop, false);
}
public void addShards(int number) {
takeShards(-number);
}
public void takeShards(int number) {
shards -= number;
onShardsChangeList.emit();
@@ -542,7 +600,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
onShardsChangeList.emit();
}
public void addBlessing(EffectData bless){
public void addBlessing(EffectData bless) {
blessing = bless;
onBlessing.emit();
}
@@ -552,53 +610,76 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
onBlessing.emit();
}
public boolean hasBlessing(String name){ //Checks for a named 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;
if (blessing == null) return false;
return blessing.name.equals(name);
}
public boolean isFantasyMode(){
public boolean isFantasyMode() {
return fantasyMode;
}
public boolean isUsingCustomDeck(){
public boolean isUsingCustomDeck() {
return usingCustomDeck;
}
public boolean hasAnnounceFantasy(){
public boolean hasAnnounceFantasy() {
return announceFantasy;
}
public void clearAnnounceFantasy(){
public void clearAnnounceFantasy() {
announceFantasy = false;
}
public boolean hasAnnounceCustom(){
public boolean hasAnnounceCustom() {
return announceCustom;
}
public void clearAnnounceCustom(){
public void clearAnnounceCustom() {
announceCustom = false;
}
public boolean hasColorView() {
for(String name:equippedItems.values()) {
ItemData data=ItemData.getItem(name);
if(data != null && data.effect.colorView) return true;
for (String name : equippedItems.values()) {
ItemData data = ItemData.getItem(name);
if (data != null && data.effect != null && data.effect.colorView) return true;
}
if(blessing != null) {
if(blessing.colorView) return true;
if (blessing != null) {
return blessing.colorView;
}
return false;
}
public ItemData getEquippedAbility1() {
for (String name : equippedItems.values()) {
ItemData data = ItemData.getItem(name);
if (data != null && "Ability1".equalsIgnoreCase(data.equipmentSlot)) {
return data;
}
}
return null;
}
public ItemData getEquippedAbility2() {
for (String name : equippedItems.values()) {
ItemData data = ItemData.getItem(name);
if (data != null && "Ability2".equalsIgnoreCase(data.equipmentSlot)) {
return data;
}
}
return null;
}
public int bonusDeckCards() {
int result = 0;
for(String name:equippedItems.values()) {
ItemData data=ItemData.getItem(name);
if(data != null && data.effect.cardRewardBonus > 0) result += data.effect.cardRewardBonus;
for (String name : equippedItems.values()) {
ItemData data = ItemData.getItem(name);
if (data != null && data.effect != null && data.effect.cardRewardBonus > 0)
result += data.effect.cardRewardBonus;
}
if(blessing != null) {
if(blessing.cardRewardBonus > 0) result += blessing.cardRewardBonus;
if (blessing != null) {
if (blessing.cardRewardBonus > 0) result += blessing.cardRewardBonus;
}
return Math.min(result, 3);
}
@@ -607,50 +688,52 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
return difficultyData;
}
public void renameDeck( String text) {
deck = (Deck)deck.copyTo(text);
decks[selectedDeckIndex]=deck;
public void renameDeck(String text) {
deck = (Deck) deck.copyTo(text);
decks[selectedDeckIndex] = deck;
}
public int cardSellPrice(PaperCard card) {
return (int)(CardUtil.getCardPrice(card)*difficultyData.sellFactor);
return (int) (CardUtil.getCardPrice(card) * difficultyData.sellFactor);
}
public void sellCard(PaperCard card, Integer result) {
float price = CardUtil.getCardPrice(card) * result;
price *= difficultyData.sellFactor;
cards.remove(card, result);
addGold((int)price);
addGold((int) price);
}
public void removeItem(String name) {
if(name == null || name.equals("")) return;
inventoryItems.removeValue(name,false);
if(equippedItems.values().contains(name) && !inventoryItems.contains(name,false)) {
if (name == null || name.equals("")) return;
inventoryItems.removeValue(name, false);
if (equippedItems.values().contains(name) && !inventoryItems.contains(name, false)) {
equippedItems.values().remove(name);
}
}
public void equip(ItemData item) {
if(equippedItems.get(item.equipmentSlot) != null && equippedItems.get(item.equipmentSlot).equals(item.name)) {
if (equippedItems.get(item.equipmentSlot) != null && equippedItems.get(item.equipmentSlot).equals(item.name)) {
equippedItems.remove(item.equipmentSlot);
} else {
equippedItems.put(item.equipmentSlot,item.name);
equippedItems.put(item.equipmentSlot, item.name);
}
onEquipmentChange.emit();
}
public String itemInSlot(String key) { return equippedItems.get(key); }
public String itemInSlot(String key) {
return equippedItems.get(key);
}
public float equipmentSpeed() {
float factor=1.0f;
for(String name:equippedItems.values()) {
ItemData data=ItemData.getItem(name);
if(data != null && data.effect.moveSpeed > 0.0) //Avoid negative speeds. It would be silly.
factor*=data.effect.moveSpeed;
float factor = 1.0f;
for (String name : equippedItems.values()) {
ItemData data = ItemData.getItem(name);
if (data != null && data.effect != null && data.effect.moveSpeed > 0.0) //Avoid negative speeds. It would be silly.
factor *= data.effect.moveSpeed;
}
if(blessing != null) { //If a blessing gives speed, take it into account.
if(blessing.moveSpeed > 0.0)
if (blessing != null) { //If a blessing gives speed, take it into account.
if (blessing.moveSpeed > 0.0)
factor *= blessing.moveSpeed;
}
return factor;
@@ -658,19 +741,20 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
public float goldModifier(boolean sale) {
float factor = 1.0f;
for(String name:equippedItems.values()) {
ItemData data=ItemData.getItem(name);
if(data != null && data.effect.goldModifier > 0.0) //Avoid negative modifiers.
for (String name : equippedItems.values()) {
ItemData data = ItemData.getItem(name);
if (data != null && data.effect != null && data.effect.goldModifier > 0.0) //Avoid negative modifiers.
factor *= data.effect.goldModifier;
}
if(blessing != null) { //If a blessing gives speed, take it into account.
if(blessing.goldModifier > 0.0)
if (blessing != null) { //If a blessing gives speed, take it into account.
if (blessing.goldModifier > 0.0)
factor *= blessing.goldModifier;
}
if(sale) return Math.max(1.0f + (1.0f - factor), 2.5f);
if (sale) return Math.max(1.0f + (1.0f - factor), 2.5f);
return Math.max(factor, 0.25f);
}
public float goldModifier(){
public float goldModifier() {
return goldModifier(false);
}
@@ -679,8 +763,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
public boolean addItem(String name) {
ItemData item=ItemData.getItem(name);
if(item==null)
ItemData item = ItemData.getItem(name);
if (item == null)
return false;
inventoryItems.add(name);
return true;
@@ -688,45 +772,48 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
// Quest functions.
public void setQuestFlag(String key, int value){
public void setQuestFlag(String key, int value) {
questFlags.put(key, (byte) value);
}
public void advanceQuestFlag(String key){
if(questFlags.get(key) != null){
public void advanceQuestFlag(String key) {
if (questFlags.get(key) != null) {
questFlags.put(key, (byte) (questFlags.get(key) + 1));
} else {
questFlags.put(key, (byte) 1);
}
}
public boolean checkQuestFlag(String key){
public boolean checkQuestFlag(String key) {
return questFlags.get(key) != null;
}
public int getQuestFlag(String key){
public int getQuestFlag(String key) {
return (int) questFlags.getOrDefault(key, (byte) 0);
}
public void resetQuestFlags(){
public void resetQuestFlags() {
questFlags.clear();
}
public void addQuest(String questID){
public void addQuest(String questID) {
int id = Integer.parseInt(questID);
addQuest(id);
}
public void addQuest(int questID){
public void addQuest(int questID) {
AdventureQuestData toAdd = AdventureQuestController.instance().generateQuest(questID);
if (toAdd != null){
if (toAdd != null) {
addQuest(toAdd);
}
}
public void addQuest(AdventureQuestData q){
public void addQuest(AdventureQuestData q) {
//TODO: add a config flag for this
boolean autoTrack = true;
for (AdventureQuestData existing : quests){
if (autoTrack && existing.isTracked)
{
for (AdventureQuestData existing : quests) {
if (autoTrack && existing.isTracked) {
autoTrack = false;
break;
}
@@ -739,23 +826,21 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
return quests;
}
public int getEnemyDeckNumber(String enemyName, int maxDecks){
int deckNumber = 0;
if (statistic.getWinLossRecord().get(enemyName)!=null)
{
int playerWins = statistic.getWinLossRecord().get(enemyName).getKey();
int enemyWins = statistic.getWinLossRecord().get(enemyName).getValue();
if (playerWins > enemyWins){
int deckNumberAfterAlgorithmOutput = (int)((playerWins-enemyWins) * (difficultyData.enemyLifeFactor / 3));
if (deckNumberAfterAlgorithmOutput < maxDecks){
deckNumber = deckNumberAfterAlgorithmOutput;
}
else {
deckNumber = maxDecks-1;
public int getEnemyDeckNumber(String enemyName, int maxDecks) {
int deckNumber = 0;
if (statistic.getWinLossRecord().get(enemyName) != null) {
int playerWins = statistic.getWinLossRecord().get(enemyName).getKey();
int enemyWins = statistic.getWinLossRecord().get(enemyName).getValue();
if (playerWins > enemyWins) {
int deckNumberAfterAlgorithmOutput = (int) ((playerWins - enemyWins) * (difficultyData.enemyLifeFactor / 3));
if (deckNumberAfterAlgorithmOutput < maxDecks) {
deckNumber = deckNumberAfterAlgorithmOutput;
} else {
deckNumber = maxDecks - 1;
}
}
}
}
return deckNumber;
return deckNumber;
}
public void removeQuest(AdventureQuestData quest) {

View File

@@ -17,6 +17,7 @@ import forge.adventure.data.EnemyData;
import forge.adventure.data.WorldData;
import forge.adventure.stage.GameHUD;
import forge.adventure.stage.IAfterMatch;
import forge.adventure.stage.MapStage;
import forge.adventure.stage.WorldStage;
import forge.adventure.util.*;
import forge.gui.FThreads;
@@ -116,6 +117,8 @@ public class ArenaScene extends UIScene implements IAfterMatch {
doneButton.layout();
startButton.setDisabled(true);
arenaStarted = false;
AdventureQuestController.instance().updateArenaComplete(false);
AdventureQuestController.instance().showQuestDialogs(MapStage.getInstance());
}
private void startDialog() {
@@ -193,6 +196,8 @@ public class ArenaScene extends UIScene implements IAfterMatch {
startButton.setDisabled(true);
doneButton.setText("[%80]" + Forge.getLocalizer().getMessage("lblDone"));
doneButton.layout();
AdventureQuestController.instance().updateArenaComplete(true);
AdventureQuestController.instance().showQuestDialogs(MapStage.getInstance());
}
if (!Forge.isLandscapeMode())
drawArena();//update

View File

@@ -39,11 +39,11 @@ public class InventoryScene extends UIScene {
public InventoryScene() {
super(Forge.isLandscapeMode() ? "ui/inventory.json" : "ui/inventory_portrait.json");
equipOverlay = Forge.getAssets().getTexture(Config.instance().getFile(Paths.ITEMS_EQUIP));
ui.onButtonPress("return", () -> done());
ui.onButtonPress("return", this::done);
leave = ui.findActor("return");
ui.onButtonPress("delete", () -> showConfirm());
ui.onButtonPress("equip", () -> equip());
ui.onButtonPress("use", () -> use());
ui.onButtonPress("delete", this::showConfirm);
ui.onButtonPress("equip", this::equip);
ui.onButtonPress("use", this::use);
equipButton = ui.findActor("equip");
useButton = ui.findActor("use");
useButton.setDisabled(true);
@@ -299,7 +299,6 @@ public class InventoryScene extends UIScene {
}
public Button createInventorySlot() {
ImageButton button = new ImageButton(Controls.getSkin(), "item_frame");
return button;
return new ImageButton(Controls.getSkin(), "item_frame");
}
}

View File

@@ -1,6 +1,5 @@
package forge.adventure.scene;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
@@ -32,7 +31,7 @@ public class MapViewScene extends UIScene {
super(Forge.isLandscapeMode() ? "ui/map.json" : "ui/map_portrait.json");
ui.onButtonPress("done", () -> done());
ui.onButtonPress("done", this::done);
scroll = ui.findActor("map");
Group table=new Group();
@@ -78,13 +77,4 @@ public class MapViewScene extends UIScene {
super.enter();
}
@Override
public boolean keyPressed(int keycode) {
if (keycode == Input.Keys.ESCAPE || keycode == Input.Keys.BACK || keycode == Input.Keys.BUTTON_B) {
done();
}
return true;
}
}

View File

@@ -22,12 +22,12 @@ import com.github.tommyettinger.textra.TextraButton;
import com.github.tommyettinger.textra.TextraLabel;
import com.github.tommyettinger.textra.TypingLabel;
import forge.Forge;
import forge.adventure.data.ItemData;
import forge.adventure.player.AdventurePlayer;
import forge.adventure.scene.*;
import forge.adventure.util.*;
import forge.adventure.world.WorldSave;
import forge.deck.Deck;
import forge.gui.FThreads;
import forge.gui.GuiBase;
import forge.localinstance.properties.ForgePreferences;
import forge.model.FModel;
@@ -51,16 +51,15 @@ public class GameHUD extends Stage {
private final Touchpad touchpad;
private final Console console;
float TOUCHPAD_SCALE = 70f, referenceX;
boolean isHiding = false, isShowing = false;
float opacity = 1f;
private boolean debugMap, updatelife;
private final Dialog dialog;
private boolean dialogOnlyInput;
private final Array<TextraButton> dialogButtonMap = new Array<>();
private final Array<TextraButton> abilityButtonMap = new Array<>();
private final Array<String> questKeys = new Array<>();
private String lifepointsTextColor = "";
private TextraButton selectedKey;
private final ScrollPane scrollPane;
private GameHUD(GameStage gameStage) {
@@ -80,7 +79,7 @@ public class GameHUD extends Stage {
avatarborder = ui.findActor("avatarborder");
deckActor = ui.findActor("deck");
openMapActor = ui.findActor("openmap");
ui.onButtonPress("openmap", () -> GameHUD.this.openMap());
ui.onButtonPress("openmap", this::openMap);
menuActor = ui.findActor("menu");
referenceX = menuActor.getX();
logbookActor = ui.findActor("logbook");
@@ -113,11 +112,11 @@ public class GameHUD extends Stage {
ui.addActor(touchpad);
avatar = ui.findActor("avatar");
ui.onButtonPress("menu", () -> menu());
ui.onButtonPress("inventory", () -> openInventory());
ui.onButtonPress("logbook", () -> logbook());
ui.onButtonPress("deck", () -> openDeck());
ui.onButtonPress("exittoworldmap", () -> exitToWorldMap());
ui.onButtonPress("menu", this::menu);
ui.onButtonPress("inventory", this::openInventory);
ui.onButtonPress("logbook", this::logbook);
ui.onButtonPress("deck", this::openDeck);
ui.onButtonPress("exittoworldmap", this::exitToWorldMap);
lifePoints = ui.findActor("lifePoints");
shards = ui.findActor("shards");
money = ui.findActor("money");
@@ -131,6 +130,7 @@ public class GameHUD extends Stage {
addActor(scrollPane);
AdventurePlayer.current().onLifeChange(() -> lifePoints.setText("[%95][+Life]" + lifepointsTextColor + " " + AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife()));
AdventurePlayer.current().onShardsChange(() -> shards.setText("[%95][+Shards] " + AdventurePlayer.current().getShards()));
AdventurePlayer.current().onEquipmentChanged(this::updateAbility);
WorldSave.getCurrentSave().getPlayer().onGoldChange(() -> money.setText("[%95][+Gold] " + String.valueOf(AdventurePlayer.current().getGold())));
addActor(ui);
@@ -144,7 +144,7 @@ public class GameHUD extends Stage {
avatarborder.addListener(new ConsoleToggleListener());
gamehud.addListener(new ConsoleToggleListener());
}
WorldSave.getCurrentSave().onLoad(() -> GameHUD.this.enter());
WorldSave.getCurrentSave().onLoad(this::enter);
eventTouchDown = new InputEvent();
eventTouchDown.setPointer(-1);
eventTouchDown.setType(InputEvent.Type.touchDown);
@@ -158,6 +158,8 @@ public class GameHUD extends Stage {
}
private void logbook() {
if (console.isVisible())
console.toggle();
Forge.switchScene(QuestLogScene.instance(Forge.getCurrentScene()));
}
@@ -230,7 +232,6 @@ public class GameHUD extends Stage {
touchpad.setBounds(touch.x - TOUCHPAD_SCALE / 2, touch.y - TOUCHPAD_SCALE / 2, TOUCHPAD_SCALE, TOUCHPAD_SCALE);
touchpad.setVisible(true);
touchpad.setResetOnTouchUp(true);
hideButtons();
return super.touchDown(screenX, screenY, pointer, button);
}
}
@@ -333,6 +334,41 @@ public class GameHUD extends Stage {
}
}
void updateAbility() {
for (TextraButton button : abilityButtonMap) {
button.remove();
}
abilityButtonMap.clear();
setAbilityButton(AdventurePlayer.current().getEquippedAbility1());
setAbilityButton(AdventurePlayer.current().getEquippedAbility2());
float x = Forge.isLandscapeMode() ? 426f : 216f;
float y = 10f;
float w = 45f;
float h = 35f;
for (TextraButton button : abilityButtonMap) {
button.getColor().a = opacity;
button.setSize(w, h);
button.setPosition(x, y);
y += h + 10f;
addActor(button);
}
}
void setAbilityButton(ItemData data) {
if (data != null) {
TextraButton button = Controls.newTextButton("[%120][+" + data.iconName + "][+Shards]" + data.shardsNeeded, () -> {
boolean isInPoi = MapStage.getInstance().isInMap();
if (!(isInPoi && data.usableInPoi || !isInPoi && data.usableOnWorldMap))
return;
if (data.shardsNeeded > Current.player().getShards())
return;
Current.player().addShards(-data.shardsNeeded);
ConsoleCommandInterpreter.getInstance().command(data.commandOnUse);
});
abilityButtonMap.add(button);
}
}
private Pair<FileHandle, Music> audio = null;
public void playAudio() {
@@ -368,12 +404,12 @@ public class GameHUD extends Stage {
public void act(float delta) {
super.act(delta);
if (fade < targetfade) {
fade += (delta/2);
fade += (delta / 2);
if (fade > targetfade)
fade = targetfade;
fadeAudio(fade);
} else if (fade > targetfade) {
fade -= (delta/2);
fade -= (delta / 2);
if (fade < targetfade)
fade = targetfade;
fadeAudio(fade);
@@ -436,15 +472,21 @@ public class GameHUD extends Stage {
}
private void openDeck() {
if (console.isVisible())
console.toggle();
Forge.switchScene(DeckSelectScene.instance());
}
private void openInventory() {
if (console.isVisible())
console.toggle();
WorldSave.getCurrentSave().header.createPreview();
Forge.switchScene(InventoryScene.instance());
}
private void exitToWorldMap() {
if (console.isVisible())
console.toggle();
if (!GameScene.instance().isNotInWorldMap()) //prevent showing this dialog to WorldMap
return;
dialog.getButtonTable().clear();
@@ -471,6 +513,8 @@ public class GameHUD extends Stage {
}
private void menu() {
if (console.isVisible())
console.toggle();
gameStage.openMenu();
}
@@ -479,6 +523,11 @@ public class GameHUD extends Stage {
actor.setVisible(visible);
}
private void setDisabled(Actor actor, boolean enable) {
if (actor != null && actor instanceof Button)
((Button) actor).setDisabled(enable);
}
private void setAlpha(Actor actor, boolean visible) {
if (actor != null) {
if (visible)
@@ -498,7 +547,7 @@ public class GameHUD extends Stage {
setVisibility(shards, visible);
setVisibility(money, visible);
setVisibility(blank, visible);
setVisibility(exitToWorldMapActor, GameScene.instance().isNotInWorldMap());
setDisabled(exitToWorldMapActor, !GameScene.instance().isNotInWorldMap());
setAlpha(avatarborder, visible);
setAlpha(avatar, visible);
setAlpha(deckActor, visible);
@@ -506,6 +555,9 @@ public class GameHUD extends Stage {
setAlpha(logbookActor, visible);
setAlpha(inventoryActor, visible);
setAlpha(exitToWorldMapActor, visible);
for (TextraButton button : abilityButtonMap) {
setAlpha(button, visible);
}
opacity = visible ? 1f : 0.4f;
}
@@ -528,11 +580,6 @@ public class GameHUD extends Stage {
if (keycode == Input.Keys.BACK) {
if (console.isVisible()) {
console.toggle();
} else {
if (menuActor.isVisible())
hideButtons();
else
showButtons();
}
}
if (console.isVisible())
@@ -571,38 +618,6 @@ public class GameHUD extends Stage {
}, 0.10f);
}
private void hideButtons() {
if (isShowing)
return;
if (isHiding)
return;
isHiding = true;
deckActor.addAction(Actions.sequence(Actions.fadeOut(0.10f), Actions.hide(), Actions.moveTo(deckActor.getX() + deckActor.getWidth(), deckActor.getY())));
inventoryActor.addAction(Actions.sequence(Actions.fadeOut(0.15f), Actions.hide(), Actions.moveTo(inventoryActor.getX() + inventoryActor.getWidth(), inventoryActor.getY())));
logbookActor.addAction(Actions.sequence(Actions.fadeOut(0.20f), Actions.hide(), Actions.moveTo(logbookActor.getX() + logbookActor.getWidth(), logbookActor.getY())));
menuActor.addAction(Actions.sequence(Actions.fadeOut(0.25f), Actions.hide(), Actions.moveTo(menuActor.getX() + menuActor.getWidth(), menuActor.getY())));
if (GameScene.instance().isNotInWorldMap())
exitToWorldMapActor.addAction(Actions.sequence(Actions.fadeOut(0.2f), Actions.hide(), Actions.moveTo(exitToWorldMapActor.getX() + exitToWorldMapActor.getWidth(), exitToWorldMapActor.getY())));
FThreads.delayInEDT(300, () -> isHiding = false);
}
private void showButtons() {
if (console.isVisible())
return;
if (isHiding)
return;
if (isShowing)
return;
isShowing = true;
menuActor.addAction(Actions.sequence(Actions.delay(0.1f), Actions.parallel(Actions.show(), Actions.alpha(opacity, 0.1f), Actions.moveTo(referenceX, menuActor.getY(), 0.25f))));
logbookActor.addAction(Actions.sequence(Actions.delay(0.15f), Actions.parallel(Actions.show(), Actions.alpha(opacity, 0.1f), Actions.moveTo(referenceX, logbookActor.getY(), 0.25f))));
inventoryActor.addAction(Actions.sequence(Actions.delay(0.2f), Actions.parallel(Actions.show(), Actions.alpha(opacity, 0.1f), Actions.moveTo(referenceX, inventoryActor.getY(), 0.25f))));
deckActor.addAction(Actions.sequence(Actions.delay(0.25f), Actions.parallel(Actions.show(), Actions.alpha(opacity, 0.1f), Actions.moveTo(referenceX, deckActor.getY(), 0.25f))));
if (GameScene.instance().isNotInWorldMap())
exitToWorldMapActor.addAction(Actions.sequence(Actions.delay(0.25f), Actions.parallel(Actions.show(), Actions.alpha(opacity, 0.1f), Actions.moveTo(referenceX, exitToWorldMapActor.getY(), 0.25f))));
FThreads.delayInEDT(300, () -> isShowing = false);
}
public void setDebug(boolean b) {
debugMap = b;
}
@@ -626,13 +641,12 @@ public class GameHUD extends Stage {
public boolean act(float v) {
if (exitDungeon) {
MapStage.getInstance().exitDungeon();
exitToWorldMapActor.setVisible(false);
setDisabled(exitToWorldMapActor, true);
}
return true;
}
}));
dialogOnlyInput = false;
selectedKey = null;
}
private void selectNextDialogButton() {
@@ -677,18 +691,9 @@ public class GameHUD extends Stage {
@Override
public boolean longPress(Actor actor, float x, float y) {
hideButtons();
console.toggle();
return super.longPress(actor, x, y);
}
@Override
public void tap(InputEvent event, float x, float y, int count, int button) {
super.tap(event, x, y, count, button);
//show menu buttons if double tapping the avatar, for android devices without visible navigation buttons
if (count > 1)
showButtons();
}
}
public void updateMusic() {

View File

@@ -361,7 +361,7 @@ public class WorldStage extends GameStage implements SaveFileContent {
List<String> names = (List<String>) data.readObject("names");
List<Float> x = (List<Float>) data.readObject("x");
List<Float> y = (List<Float>) data.readObject("y");
List<UUID> questStageIDs = (List<UUID>) data.readObject("questStageIDs");
List<String> questStageIDs = (List<String>) data.readObject("questStageIDs");
for (int i = 0; i < timeouts.size(); i++) {
EnemySprite sprite = new EnemySprite(WorldData.getEnemy(names.get(i)));
sprite.setX(x.get(i));
@@ -393,7 +393,7 @@ public class WorldStage extends GameStage implements SaveFileContent {
List<String> names = new ArrayList<>();
List<Float> x = new ArrayList<>();
List<Float> y = new ArrayList<>();
List<UUID> questStageIDs = new ArrayList<>();
List<String> questStageIDs = new ArrayList<>();
for (Pair<Float, EnemySprite> enemy : enemies) {
timeouts.add(enemy.getKey());
names.add(enemy.getValue().getData().name);

View File

@@ -17,7 +17,6 @@ import forge.util.Aggregates;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.*;
import java.util.List;
public class AdventureQuestController implements Serializable {
@@ -84,9 +83,9 @@ public class AdventureQuestController implements Serializable {
questStage.epilogueDisplayed = true;
dialogQueue.add(questStage.epilogue);
}
// if (questStage.getStatus() != QuestStatus.Complete){
// break;
// }
if (questStage.getStatus() != QuestStatus.Complete){
break;
}
}
if (quest.failed){
@@ -263,6 +262,12 @@ public class AdventureQuestController implements Serializable {
}
}
public void updateArenaComplete(boolean winner){
for(AdventureQuestData currentQuest: Current.player().getQuests()) {
currentQuest.updateArenaComplete(winner);
}
}
public AdventureQuestData generateQuest(int id){
AdventureQuestData generated = null;
for (AdventureQuestData template: allQuests) {
@@ -287,7 +292,7 @@ public class AdventureQuestController implements Serializable {
public void rematchQuestSprite(EnemySprite sprite){
for (AdventureQuestData q : Current.player().getQuests()){
for (AdventureQuestStage s : q.stages){
if (sprite.questStageID != null && sprite.questStageID.equals(s.questStageID)){
if (sprite.questStageID != null && sprite.questStageID.equals(s.stageID.toString())){
s.setTargetSprite(sprite);
}
}

View File

@@ -0,0 +1,27 @@
[metadata]
Name=bat
[Avatar]
[Main]
4 Basilica Screecher|GTC|1
4 Blight Keeper|J22|1
4 Blighted Bat|AKH|1
4 Bloodhunter Bat|JMP|1
4 Dirge Bat|IKO|1
4 Duskhunter Bat|MM2|1
4 Murder|M13|1
4 Sinister Strength|PLS|1
6 Swamp|J22|1
8 Swamp|J22|2
10 Swamp|J22|3
4 Unholy Strength|30A|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -0,0 +1,34 @@
[metadata]
Name=darkenchanter
[Avatar]
[Main]
4 Bayou|OLGC|1
4 Cartouche of Ambition|AKR|1
4 Doomwake Giant|C15|1
4 Eidolon of Blossoms|JOU|1
1 Forest|ELD|1
2 Forest|ELD|3
1 Forest|ELD|4
4 Gnarled Scarhide|JOU|1
4 Grim Guardian|JOU|1
4 Necroblossom Snarl|STX|1
4 Oubliette|2XM|1
4 Overgrown Tomb|SLD|1
1 Swamp|ELD|2
2 Swamp|ELD|4
4 Trial of Ambition|MB1|1
4 Verdant Catacombs|SLU|1
3 Verduran Enchantress|SLD|1
4 Wild Growth|AFC|1
2 Yavimaya Enchantress|TD0|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -0,0 +1,12 @@
{
"name":"Dross Gladiator",
"template":
{
"count":60,
"colors":["Black"],
"tribe":"Phyrexian",
"tribeCards":1.0,
"tribeSynergyCards":0.40,
"rares":0.25
}
}

View File

@@ -0,0 +1,12 @@
{
"name":"Dross Grimnarch",
"template":
{
"count":60,
"colors":["Black, Blue"],
"tribe":"Phyrexian",
"tribeCards":1.0,
"tribeSynergyCards":0.40,
"rares":0.4
}
}

View File

@@ -0,0 +1,32 @@
[metadata]
Name=sandgolem
[Avatar]
[Main]
4 Char-Rumbler|TSR|1
4 Choking Sands|VMA|1
4 Mountain|KLD|1
3 Mountain|KLD|2
5 Mountain|KLD|3
5 Plains|KLD|1
5 Plains|KLD|2
2 Plains|KLD|3
3 Sand Golem|MIR|1
4 Sand Strangler|AKR|1
4 Sandblast|HOU|1
1 Sandstone Oracle|IMA|1
2 Sandstone Warrior|TPR|1
2 Shock|DDN|1
4 Tectonic Giant|AFC|1
4 Thunder Spirit|PRM|1
4 Viashino Sandstalker|VIS|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -0,0 +1,27 @@
[metadata]
Name=sandwurm
[Avatar]
[Main]
4 Beneath the Sands|MB1|1
4 Dirtcowl Wurm|TMP|1
7 Forest|IKO|1
8 Forest|IKO|2
9 Forest|IKO|3
4 Greater Sandwurm|IKO|1
4 Rampant Growth|NCC|1
4 Roar of the Wurm|DDS|1
4 Sandwurm Convergence|CLB|1
4 Spined Wurm|S00|1
4 Symbiotic Wurm|VMA|1
4 Teething Wurmlet|BRO|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -0,0 +1,40 @@
[metadata]
Name=swamptroll
[Avatar]
[Main]
4 Charnel Troll|GRN|1
4 Clackbridge Troll|ELD|1
4 Eat to Extinction|THB|1
2 Feasting Troll King|ELD|1
1 Forest|ELD|1
1 Forest|ELD|2
3 Forest|ELD|4
4 Gluttonous Troll|ELD|1
2 Grismold, the Dreadsower|C19|1
1 Gyome, Master Chef|C21|1
4 Haunted Mire|DMU|1
2 Hunted Troll|RAV|1
3 Infernal Grasp|MID|1
4 Jungle Hollow|KTK|1
1 Nature's Claim|IMA|1
2 Old-Growth Troll|KHM|1
3 Swamp|ELD|1
1 Swamp|ELD|2
2 Swamp|ELD|3
1 Swamp|ELD|4
4 Tainted Wood|C15|1
2 Taste of Death|ELD|1
2 Thrun, Breaker of Silence|ONE|1
1 Thrun, the Last Troll|MBS|1
2 Varolz, the Scar-Striped|DGM|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -0,0 +1,31 @@
[metadata]
Name=witch
[Avatar]
[Main]
2 Accursed Witch|SOI|1
2 Cast Down|DOM|1
4 Cuombajj Witches|CMR|1
4 Curse of Leeches|MID|1
4 Cursebound Witch|YMID|1
1 Cut Down|DMU|1
4 Kindly Stranger|SOI|1
4 Sedgemoor Witch|STX|1
20 Swamp|ELD|2
1 Tempting Witch|JMP|1
2 The Cauldron of Eternity|ELD|1
2 The Hourglass Coven|HBG|1
2 Veinwitch Coven|C21|1
2 Witch of the Moors|JMP|1
4 Witch's Cottage|ELD|1
2 Witch's Vengeance|ELD|1
[Sideboard]
[Planes]
[Schemes]
[Conspiracy]
[Dungeon]

View File

@@ -71,7 +71,6 @@
<properties>
<property name="enemy" value="Golem"/>
<property name="threatRange" type="int" value="30"/>
<property name="waypoints" value="90,91,96,91"/>
</properties>
</object>
<object id="72" template="../obj/gold.tx" x="330.667" y="179.333"/>

View File

@@ -1,81 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="36" height="24" tilewidth="16" tileheight="16" infinite="0" nextlayerid="8" nextobjectid="86">
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="58" height="46" tilewidth="16" tileheight="16" infinite="0" nextlayerid="9" nextobjectid="174">
<editorsettings>
<export target="wastetown..tmx" format="tmx"/>
</editorsettings>
<tileset firstgid="1" source="../tileset/main.tsx"/>
<tileset firstgid="10113" source="../tileset/buildings.tsx"/>
<layer id="6" name="Collision" width="36" height="24">
<tileset firstgid="11905" source="../tileset/FarmFood.tsx"/>
<layer id="8" name="Tilelaag 5" width="58" height="46">
<data encoding="base64" compression="zlib">
eJzNVkEOgDAI4+rH/P+TjJ4Wso4iDVuTxaTRUcpkmJndl314n+OacYrl4Tkfe8b9icG8i7iqF6yeyJsVx9YOfYvyX3mDkPGbyQ/FUKOyp1JPVLNuPQp06jkx90ot1WDO106tUZ/qhqInKnFa3VT3RjU++5916WFidZ4h1pusnyptSAvLd+lBc6NaU6UGu3sTM+tV92fmy6gvZWf32T4ZrSMemJc8zA==
eJztlkEOAyEIRWfbTU/TM/T+R2pYmBgrI+CnVfAlTdpMR3mi4HXF5/34dwT+kGN0z+IY2bN2zOAZlTaPUV0zeLZex3NvMuxZ4s4vmvfI09v19fz+IJDGX557u67g+Yuc9jxHc0qfa2L39ORyeDenxMGaI6/eM/Js5+n1B662zMaK2sujM8k5jVxRvRIxjqT2oByRrghPq6smXitIz5m105zbNv+WOaRw+dSeScvebmP39ORcJf+z7F2Up/adgtVTy12P0o7h4YmsnWW83nfpu7O9VDMuom56xWyB4kDd6Q+H1VjxzKFB1+NVsdyFdl0TjWf9ezdPAnnnXZ2IThwZHIkMjkQGR8Lqt9u6WGPNsg+ILJ4F7l7hNdcKvTBLfnf0rO+1GfkAgp943Q==
</data>
</layer>
<layer id="1" name="Background" width="36" height="24">
<layer id="1" name="Background" width="58" height="46">
<data encoding="base64" compression="zlib">
eJxbwM7AsGAUw/F/NuqZtRgJD7RbRvHQxQyDwA3IeOEgcMMoHsWjeBQTiys5B8besgGyFxdmIlH9MVZUeiDxJQbsbqMUk2sOtrildziB3ICM6WXvQix209MNgyE9UgMDAG2aMkY=
eJzt2FEKgkAQgOEhyPBiHknwtZMk3aUDdCFjIUGiomR3Znbnf/jxTedzxxfHXmQkIiIiouYbnlnPoeVs3Tr0MaxRnK9e6zm0rNYzUOxuR/sZNLqc7GfQ6OxghlpLO+KpVp1L59953ZTD6NXJ3uKs2SlBnHMQZ5S9xYkTJ06cfp3Th2fX6vz3GbU6D072Nv1bS/dfr5bdRec8c1n33ieXSd68r1wz7q3E2f3iLNX8xaTxfZZyWe+u1XmWcD4Asxqt6Q==
</data>
</layer>
<layer id="2" name="Ground" width="36" height="24">
<layer id="2" name="Ground" width="58" height="46">
<data encoding="base64" compression="zlib">
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
</data>
</layer>
<layer id="3" name="Clutter" width="36" height="24">
<layer id="3" name="Clutter" width="58" height="46">
<properties>
<property name="spriteLayer" type="bool" value="true"/>
</properties>
<data encoding="base64" compression="zlib">
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
</data>
</layer>
<layer id="7" name="Tilelaag 5" width="36" height="24">
<layer id="7" name="ClutterBis" width="58" height="46">
<properties>
<property name="spriteLayer" type="bool" value="true"/>
</properties>
<data encoding="base64" compression="zlib">
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
</data>
</layer>
<objectgroup id="4" name="Objects">
<object id="38" template="../obj/entry_up.tx" x="256" y="377.5">
<object id="38" template="../obj/entry_up.tx" x="431.488" y="720.508">
<properties>
<property name="teleport" value=""/>
</properties>
</object>
<object id="49" template="../obj/gold.tx" x="107.705" y="136.536"/>
<object id="53" template="../obj/enemy.tx" x="271.708" y="215.489" width="16" height="17.6724">
<properties>
<property name="effect">{ &quot;startBattleWithCardInCommandZone&quot;: [ &quot;Grolnok's Boss Effect&quot;]
}</property>
<property name="enemy" value="Grolnok"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="85,83,84,65"/>
</properties>
</object>
<object id="55" template="../obj/manashards.tx" x="17.6527" y="84.3978"/>
<object id="56" template="../obj/enemy.tx" x="390.5" y="99.9971" width="16" height="17.6724">
<object id="49" template="../obj/gold.tx" x="283.705" y="488.536"/>
<object id="55" template="../obj/manashards.tx" x="193.653" y="436.398"/>
<object id="56" template="../obj/enemy.tx" x="588.474" y="442.344" width="16" height="17.6724">
<properties>
<property name="enemy" value="Frog"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="82,71"/>
<property name="waypoints" value="82,71,137"/>
</properties>
</object>
<object id="57" template="../obj/enemy.tx" x="453.333" y="44.4971" width="16" height="17.6724">
<object id="57" template="../obj/enemy.tx" x="685.774" y="309.541" width="16" height="17.6724">
<properties>
<property name="enemy" value="Insect"/>
<property name="enemy" value="Raven"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="71,64,72,63,68,66,65,67"/>
</properties>
</object>
<object id="58" template="../obj/enemy.tx" x="6.667" y="107.83" width="16" height="17.6724">
<object id="58" template="../obj/enemy.tx" x="322.167" y="477.33" width="16" height="17.6724">
<properties>
<property name="enemy" value="Insect"/>
<property name="spriteLayer" type="bool" value="true"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="71,64,72,63,68,66,65,67"/>
<property name="waypoints" value="71,64,72,63,66,65,67"/>
</properties>
</object>
<object id="59" template="../obj/booster.tx" x="31" y="15.3333">
<object id="59" template="../obj/booster.tx" x="34" y="61.833">
<properties>
<property name="reward">[
{
@@ -100,8 +91,8 @@
</property>
</properties>
</object>
<object id="60" template="../obj/manashards.tx" x="484.667" y="18"/>
<object id="61" template="../obj/treasure.tx" x="467.333" y="138.667">
<object id="60" template="../obj/manashards.tx" x="799.563" y="393.051"/>
<object id="61" template="../obj/treasure.tx" x="606.111" y="211.151">
<properties>
<property name="reward">[{
&quot;type&quot;: &quot;randomCard&quot;,
@@ -117,46 +108,348 @@
<property name="spawn.Hard" type="bool" value="false"/>
</properties>
</object>
<object id="63" template="../obj/waypoint.tx" x="318.667" y="41.6667"/>
<object id="64" template="../obj/waypoint.tx" x="493.667" y="258"/>
<object id="65" template="../obj/waypoint.tx" x="313.5" y="187.333"/>
<object id="66" template="../obj/waypoint.tx" x="80" y="162.333"/>
<object id="67" template="../obj/waypoint.tx" x="398.167" y="385.333"/>
<object id="68" template="../obj/waypoint.tx" x="123" y="38"/>
<object id="69" template="../obj/waypoint.tx" x="40" y="72"/>
<object id="70" template="../obj/waypoint.tx" x="554" y="103"/>
<object id="71" template="../obj/waypoint.tx" x="413" y="148"/>
<object id="72" template="../obj/waypoint.tx" x="473" y="330"/>
<object id="73" template="../obj/enemy.tx" x="32" y="285.164" width="16" height="17.6724">
<object id="63" template="../obj/waypoint.tx" x="494.667" y="393.667"/>
<object id="64" template="../obj/waypoint.tx" x="669.667" y="610"/>
<object id="65" template="../obj/waypoint.tx" x="489.5" y="539.333"/>
<object id="66" template="../obj/waypoint.tx" x="256" y="514.333"/>
<object id="67" template="../obj/waypoint.tx" x="574.167" y="737.333"/>
<object id="68" template="../obj/waypoint.tx" x="299" y="390"/>
<object id="69" template="../obj/waypoint.tx" x="216" y="424"/>
<object id="70" template="../obj/waypoint.tx" x="875.117" y="271.323"/>
<object id="71" template="../obj/waypoint.tx" x="598" y="507"/>
<object id="72" template="../obj/waypoint.tx" x="649" y="682"/>
<object id="73" template="../obj/enemy.tx" x="565.5" y="493.664" width="16" height="17.6724">
<properties>
<property name="enemy" value="Insect"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="71,64,72,63,68,66,65,67"/>
<property name="waypoints" value="66,68,63,72,64,71"/>
</properties>
</object>
<object id="74" template="../obj/enemy.tx" x="123.5" y="146.164" width="16" height="17.6724">
<object id="74" template="../obj/enemy.tx" x="303.5" y="497.664" width="16" height="17.6724">
<properties>
<property name="enemy" value="Frog"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="75,66"/>
<property name="waypoints" value="75,83,66"/>
</properties>
</object>
<object id="75" template="../obj/waypoint.tx" x="175" y="129"/>
<object id="76" template="../obj/collision.tx" x="-16" y="-2.5415" width="16" height="388.083"/>
<object id="77" template="../obj/collision.tx" x="577.5" y="-25.5415" width="16" height="410.083"/>
<object id="78" template="../obj/collision.tx" x="71.75" y="-15.5" width="524.5" height="16"/>
<object id="79" template="../obj/collision.tx" x="70.25" y="384.5" width="524.5" height="16"/>
<object id="80" template="../obj/enemy.tx" x="496.5" y="236.164" width="16" height="17.6724">
<object id="75" template="../obj/waypoint.tx" x="351" y="481"/>
<object id="76" template="../obj/collision.tx" x="-15.1423" y="0.580737" width="16" height="733.444"/>
<object id="77" template="../obj/collision.tx" x="930.049" y="-1.31779" width="16" height="736.453"/>
<object id="78" template="../obj/collision.tx" x="-4.76435" y="-17.3014" width="932.462" height="16"/>
<object id="79" template="../obj/collision.tx" x="-12.1117" y="736.5" width="961.301" height="16"/>
<object id="80" template="../obj/enemy.tx" x="672.5" y="588.164" width="16" height="17.6724">
<properties>
<property name="enemy" value="Frog"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="64,72,81"/>
</properties>
</object>
<object id="81" template="../obj/waypoint.tx" x="456.5" y="211"/>
<object id="82" template="../obj/waypoint.tx" x="455" y="82"/>
<object id="83" template="../obj/waypoint.tx" x="214.5" y="236.5"/>
<object id="84" template="../obj/waypoint.tx" x="247" y="166.5"/>
<object id="85" template="../obj/waypoint.tx" x="298.5" y="265"/>
<object id="81" template="../obj/waypoint.tx" x="632.5" y="563"/>
<object id="82" template="../obj/waypoint.tx" x="637" y="454.5"/>
<object id="83" template="../obj/waypoint.tx" x="371.509" y="582.873"/>
<object id="84" template="../obj/waypoint.tx" x="423" y="518.5"/>
<object id="85" template="../obj/waypoint.tx" x="474.5" y="617"/>
<object id="86" template="../obj/booster.tx" x="3.6353" y="736.721">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="88" template="../obj/collision.tx" x="139.03" y="643.332" width="113.725" height="91.9653"/>
<object id="89" template="../obj/collision.tx" x="0.814872" y="460.453" width="77.8525" height="158.787"/>
<object id="90" template="../obj/enemy.tx" x="522.046" y="411.39" width="16" height="17.6724">
<properties>
<property name="enemy" value="Raven"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="91" template="../obj/booster.tx" x="822.664" y="409.21">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="92" template="../obj/booster.tx" x="640.944" y="143.099">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="93" template="../obj/waypoint.tx" x="615.968" y="105.659"/>
<object id="94" template="../obj/waypoint.tx" x="527.834" y="163.235"/>
<object id="95" template="../obj/waypoint.tx" x="551.893" y="264.912"/>
<object id="96" template="../obj/waypoint.tx" x="623.756" y="189.913"/>
<object id="97" template="../obj/enemy.tx" x="437.589" y="580.997" width="16" height="17.6724">
<properties>
<property name="enemy" value="Frog"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="85,65,84,83"/>
</properties>
</object>
<object id="98" template="../obj/treasure.tx" x="453.907" y="261.283">
<properties>
<property name="reward">[{
&quot;type&quot;: &quot;randomCard&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;rare&quot;, &quot;mythic rare&quot; ],
&quot;colors&quot;: [ &quot;colorID&quot; ]
},{
&quot;type&quot;: &quot;randomCard&quot;,
&quot;count&quot;: 4,
&quot;rarity&quot;: [ &quot;uncommon&quot; ],
&quot;addMaxCount&quot;: 2
}]</property>
<property name="spawn.Hard" type="bool" value="false"/>
</properties>
</object>
<object id="101" template="../obj/enemy.tx" x="116" y="124.164" width="16" height="17.6724">
<properties>
<property name="effect">{ &quot;startBattleWithCard&quot;: [ &quot;Asceticism&quot;,&quot;Grismold, the Dreadsower&quot;]
}</property>
<property name="enemy" value="Swamp Troll"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="102" template="../obj/enemy.tx" x="374" y="49.6638" width="16" height="17.6724">
<properties>
<property name="enemy" value="Flying Witch"/>
<property name="threatRange" type="int" value="30"/>
<property name="waypoints" value="166,144,69,144,166"/>
</properties>
</object>
<object id="104" template="../obj/waypoint.tx" x="373.5" y="91.5"/>
<object id="107" template="../obj/waypoint.tx" x="349" y="332"/>
<object id="108" template="../obj/waypoint.tx" x="299.5" y="130.5"/>
<object id="109" template="../obj/waypoint.tx" x="406" y="221.5"/>
<object id="111" template="../obj/waypoint.tx" x="326.5" y="271"/>
<object id="124" template="../obj/enemy.tx" x="578.5" y="113.664" width="16" height="17.6724">
<properties>
<property name="enemy" value="Witch"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="93,127,96,128,96,127,93,129"/>
</properties>
</object>
<object id="125" template="../obj/enemy.tx" x="774" y="96.164" width="16" height="17.6724">
<properties>
<property name="enemy" value="Witch"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="134,135"/>
</properties>
</object>
<object id="126" template="../obj/enemy.tx" x="603.5" y="40.1638" width="16" height="17.6724">
<properties>
<property name="enemy" value="Witch"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="130,132,133"/>
</properties>
</object>
<object id="127" template="../obj/waypoint.tx" x="657" y="130"/>
<object id="128" template="../obj/waypoint.tx" x="565" y="191"/>
<object id="129" template="../obj/waypoint.tx" x="553.5" y="107.5"/>
<object id="130" template="../obj/waypoint.tx" x="531" y="40"/>
<object id="131" template="../obj/waypoint.tx" x="418.5" y="99.5"/>
<object id="132" template="../obj/waypoint.tx" x="642.5" y="45.5"/>
<object id="133" template="../obj/waypoint.tx" x="730" y="36.5"/>
<object id="134" template="../obj/waypoint.tx" x="791" y="71.5"/>
<object id="135" template="../obj/waypoint.tx" x="760" y="153.5"/>
<object id="136" template="../obj/waypoint.tx" x="734.5" y="232"/>
<object id="137" template="../obj/waypoint.tx" x="550" y="442.5"/>
<object id="139" template="../obj/waypoint.tx" x="-1" y="319.5"/>
<object id="140" template="../obj/waypoint.tx" x="51.5" y="322.5"/>
<object id="141" template="../obj/waypoint.tx" x="49" y="396"/>
<object id="142" template="../obj/waypoint.tx" x="112" y="401.5"/>
<object id="143" template="../obj/waypoint.tx" x="113" y="622"/>
<object id="144" template="../obj/waypoint.tx" x="113" y="485"/>
<object id="145" template="../obj/manashards.tx" x="32" y="76"/>
<object id="146" template="../obj/manashards.tx" x="720" y="126"/>
<object id="147" template="../obj/gold.tx" x="306.5" y="288.5"/>
<object id="148" template="../obj/enemy.tx" x="51.5" y="709.164" width="16" height="17.6724">
<properties>
<property name="enemy" value="Lich"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="150" template="../obj/gold.tx" x="905.5" y="227.5"/>
<object id="151" template="../obj/gold.tx" x="790.5" y="375.5"/>
<object id="152" template="../obj/gold.tx" x="708" y="196"/>
<object id="153" template="../obj/gold.tx" x="807" y="375.5"/>
<object id="154" template="../obj/booster.tx" x="496.5" y="269">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="155" template="../obj/enemy.tx" x="473" y="300.664" width="16" height="17.6724">
<properties>
<property name="effect">{ &quot;startBattleWithCard&quot;: [ &quot;Enchantress's Presence&quot;]
}</property>
<property name="enemy" value="Dark Enchanter"/>
<property name="reward">[
{
&quot;type&quot;: &quot;item&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;: 1,
&quot;itemName&quot;: &quot;Rusty Old Key&quot;
}
]
</property>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="156" template="../obj/collision.tx" x="427.769" y="190" width="71.462" height="45"/>
<object id="158" template="../obj/enemy.tx" x="787.5" y="431.164" width="16" height="17.6724">
<properties>
<property name="enemy" value="Gorgon"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="159" template="../obj/door_up.tx" x="680.493" y="222.665" width="23.9816" height="16.6705" rotation="359.74">
<properties>
<property name="direction" value="up"/>
<property name="teleport" value="maps/map/grolnok_f1.tmx"/>
</properties>
</object>
<object id="160" template="../obj/enemy.tx" x="48.5" y="356.164" width="16" height="17.6724">
<properties>
<property name="enemy" value="Vampire"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="141,142,141,140,139,140"/>
</properties>
</object>
<object id="161" template="../obj/enemy.tx" x="283.5" y="155.664" width="16" height="17.6724">
<properties>
<property name="enemy" value="Bat"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="164,166,107,109,95"/>
</properties>
</object>
<object id="162" template="../obj/enemy.tx" x="137" y="250.164" width="16" height="17.6724">
<properties>
<property name="enemy" value="Bat"/>
<property name="threatRange" type="int" value="60"/>
<property name="waypoints" value="166,107,165,164"/>
</properties>
</object>
<object id="163" template="../obj/waypoint.tx" x="230" y="242"/>
<object id="164" template="../obj/waypoint.tx" x="230" y="152.5"/>
<object id="165" template="../obj/waypoint.tx" x="381.5" y="179"/>
<object id="166" template="../obj/waypoint.tx" x="194.5" y="317"/>
<object id="167" template="../obj/enemy.tx" x="871.5" y="299.164" width="16" height="17.6724">
<properties>
<property name="enemy" value="Spider"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="169" template="../obj/enemy.tx" x="859" y="676.664" width="16" height="17.6724">
<properties>
<property name="enemy" value="Dark Knight"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="170,171"/>
</properties>
</object>
<object id="170" template="../obj/waypoint.tx" x="912.5" y="675"/>
<object id="171" template="../obj/waypoint.tx" x="755" y="671"/>
<object id="172" template="../obj/booster.tx" x="457" y="577.5">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;DMR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="173" template="../obj/collision.tx" x="500.638" y="705.017" width="335.725" height="31.4653"/>
</objectgroup>
</map>

View File

@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="30" height="30" tilewidth="16" tileheight="16" infinite="0" nextlayerid="19" nextobjectid="189">
<editorsettings>
<export format="tmx"/>
</editorsettings>
<tileset firstgid="1" source="../tileset/main.tsx"/>
<tileset firstgid="10113" source="../tileset/buildings.tsx"/>
<layer id="17" name="Collision" width="30" height="30">
<data encoding="base64" compression="zlib">
eJxjYEAAN04EJgeQqg/ZPhM+0jCyXmIxue6kBIzaS397QeljIOwdSuFMrv7B4F96AmrZ+4ECe4dSuqK2G0gBHxgGLpznkVH3UcNeUgHMLkrqeWrYC8PzOFHl0QGx4cooysDABMW46n1sZuOzFxdG9xc57SZCbZhpBNoy6PqJBejpDpd+XHLk+pdYe4nRTwogNZ9h8y817QXFm6YEgg2Tp4e92Nj42snk2kusemqUQfjSKDY+tco9XOUZsX0QagJq2gsAMiw9tA==
</data>
</layer>
<layer id="13" name="background" width="30" height="30">
<data encoding="base64" compression="zlib">
eJzF10sOgjAQBuBGF9U1j7jRHcdQ48ZbqAuPpRGNh3DrisTbeAN1AhOGUfuihUn+iND2K5WEKkSzBon/2FYR+UnXXijXtJ9P17SvTYVYQxu3bRsXt4/qw92MhJhJIe6a8NJd11Um7W2TeZm4pvZTlPHpor1V+KFc7vNQdyrr8y71y/0XdMHaOXoubiab/bp093E/rm4dfPmmc7Ot9Vjv4nXVPC+W+xtwIa+43h/RY8yVfedtho5untTHh6R8fvB9Qe8dzp+q9vCJ70fX+4VxzlVyhQvnwFul3y6Ohb+dqXublKEuBF1wMHi/aPt0qcPTpYtrDDmy52yZursw7iNqjk9DC58jarVxC4VL93a+3PlnnRYsqv9AfF1d3dB93wGw61A=
</data>
</layer>
<layer id="18" name="Tilelaag 4" width="30" height="30">
<properties>
<property name="spriteLayer" type="bool" value="true"/>
</properties>
<data encoding="base64" compression="zlib">
eJzdlsFKw0AQhkdL2fbiRVtzU7AWvPcqHvQg+AxaxKM+hs/gRan0QawW8UEU9FrfQHcZhozTTTLdDlH84YMJu803u9mSDNYABr/ESgdgtSYandx77+vzjTQ04fPHid6i+5X1ofHetJEtB3DctGHb6b3vfv6TW44ZINN/4D3042ctpC5vcE5cPvfB10eR+aneokyZk3h0OGbhnRV4X/3YVQPgE5BLX7+xPsPvPpp6L++/zEtrJi+t1dIr0Xo5KftMyDMjvbHnSmtexBvOKP1PYgxbufe0ZF5govQumpf1+fMtqfKmJHhDRu2cOryxkF++r7h3vxt/P1uF3/egW/4NMjb0hlR981DumPcrYf9Hom+tV2a3h1ywHkJ90keqkup97iHSq02qN8Vl6d3L5uvrTTvvbcF53sl+1tr1L7tenuAkLL1y//oZIq+tvZb5K95vDh8hYA==
</data>
</layer>
<objectgroup id="12" name="Kopie van Objects" opacity="0.9" offsetx="3.15789" offsety="7.89474">
<object id="140" template="../obj/treasure.tx" x="308.807" y="387.623">
<properties>
<property name="reward">[{
&quot;type&quot;: &quot;randomCard&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;rare&quot;, &quot;mythic rare&quot; ],
&quot;colors&quot;: [ &quot;colorID&quot; ]
},{
&quot;type&quot;: &quot;randomCard&quot;,
&quot;count&quot;: 4,
&quot;rarity&quot;: [ &quot;uncommon&quot; ],
&quot;addMaxCount&quot;: 2
}]</property>
<property name="spawn.Hard" type="bool" value="false"/>
</properties>
</object>
<object id="166" template="../obj/manashards.tx" x="328.662" y="387.554"/>
<object id="167" template="../obj/booster.tx" x="302.266" y="347.927">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;HBG&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;HBG&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;HBG&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="168" template="../obj/gate.tx" gid="3221229597" x="287.624" y="361.405" width="13.6923" height="20.7576" rotation="90.4687" visible="1">
<properties>
<property name="dialog">[{
&quot;text&quot;:&quot;This door is locked&quot;,
&quot;options&quot;:[
{ &quot;name&quot;:&quot;go away&quot; },
{
&quot;name&quot;:&quot;unlock with Grolnoks Key&quot;,
&quot;condition&quot;:[{&quot;item&quot;:&quot;Grolnoks Key&quot;}],
&quot;text&quot;:&quot;The gate is unlocked&quot;,
&quot;options&quot;:[{&quot;name&quot;:&quot;continue&quot;, &quot;action&quot;:[ {&quot;deleteMapObject&quot;:-1},{&quot;removeItem&quot;:&quot;Grolnoks Key&quot;}]} ]
}
]
}]</property>
</properties>
</object>
<object id="170" template="../obj/door_down.tx" x="115.686" y="405.017" width="20.0022" height="20.8327" rotation="0.284412">
<properties>
<property name="direction" value="left"/>
<property name="teleport" value="maps/map/grolnok.tmx"/>
</properties>
</object>
<object id="177" template="../obj/booster.tx" x="326.782" y="347.092">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;AFR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;AFR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;AFR&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="181" template="../obj/enemy.tx" x="221.421" y="353.28" width="16" height="17.6724">
<properties>
<property name="enemy" value="Wild Rat"/>
<property name="threatRange" type="int" value="20"/>
</properties>
</object>
<object id="182" template="../obj/enemy.tx" x="247.038" y="149.581" width="16" height="17.6724">
<properties>
<property name="effect">{ &quot;startBattleWithCardInCommandZone&quot;: [ &quot;Grolnok's Boss Effect&quot;]
}</property>
<property name="enemy" value="Grolnok"/>
<property name="reward">[
{
&quot;type&quot;: &quot;item&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;: 1,
&quot;itemName&quot;: &quot;Grolnoks Key&quot;
}
]
</property>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="183" template="../obj/gate.tx" gid="3221229597" x="221.022" y="337.886" width="15.7579" height="22.3749" rotation="359.183">
<properties>
<property name="dialog">[{
&quot;text&quot;:&quot;This door is locked&quot;,
&quot;options&quot;:[
{ &quot;name&quot;:&quot;go away&quot; },
{
&quot;name&quot;:&quot;unlock with Rusty Old Key&quot;,
&quot;condition&quot;:[{&quot;item&quot;:&quot;Rusty Old Key&quot;}],
&quot;text&quot;:&quot;The gate is unlocked&quot;,
&quot;options&quot;:[{&quot;name&quot;:&quot;continue&quot;, &quot;action&quot;:[ {&quot;deleteMapObject&quot;:-1},{&quot;removeItem&quot;:&quot;Rusty Old Key&quot;}]} ]
}
]
}]</property>
</properties>
</object>
</objectgroup>
</map>

View File

@@ -47,7 +47,7 @@
<object id="62" template="../obj/gold.tx" x="144.5" y="64.25"/>
<object id="65" template="../obj/enemy.tx" x="128.25" y="192.75">
<properties>
<property name="enemy" value="Magma Elemental"/>
<property name="enemy" value="Magma Fire Elemental"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="70,74,71,69"/>
</properties>
@@ -79,7 +79,7 @@
</object>
<object id="67" template="../obj/enemy.tx" x="251.75" y="65.75">
<properties>
<property name="enemy" value="Magma Elemental"/>
<property name="enemy" value="Magma Fire Elemental"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="75,70,69,71,72"/>
</properties>

View File

@@ -178,16 +178,6 @@
&quot;rounds&quot;:3,
&quot;entryFee&quot;:100,
&quot;rewards&quot;: [[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;green&quot;]
}
],[
{
&quot;type&quot;: &quot;gold&quot;,
&quot;probability&quot;: 1,
@@ -199,6 +189,16 @@
&quot;count&quot;: 1,
&quot;itemNames&quot;: [&quot;Dungeon Map&quot;,&quot;Mad Staff&quot;,&quot;Gold Boots&quot;,&quot;Disrupting Scepter&quot;]
}
],[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Rare&quot;,&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;green&quot;]
}
]
]
}</property>

View File

@@ -154,16 +154,6 @@
&quot;rounds&quot;:3,
&quot;entryFee&quot;:100,
&quot;rewards&quot;: [[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;blue&quot;]
}
],[
{
&quot;type&quot;: &quot;gold&quot;,
&quot;probability&quot;: 1,
@@ -175,6 +165,16 @@
&quot;count&quot;: 1,
&quot;itemNames&quot;: [&quot;Mithril Armor&quot;,&quot;Mithril Shield&quot;,&quot;Mithril Boots&quot;,&quot;Dagger&quot;]
}
],[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Rare&quot;,&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;blue&quot;]
}
]
]
}</property>

View File

@@ -160,16 +160,6 @@
&quot;rounds&quot;:3,
&quot;entryFee&quot;:100,
&quot;rewards&quot;: [[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;red&quot;]
}
],[
{
&quot;type&quot;: &quot;gold&quot;,
&quot;probability&quot;: 1,
@@ -181,6 +171,16 @@
&quot;count&quot;: 1,
&quot;itemNames&quot;: [&quot;Aladdin's Ring&quot;,&quot;Axt&quot;,&quot;Ring of Immortals&quot;,&quot;Jandor's Ring&quot;]
}
],[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Rare&quot;,&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;red&quot;]
}
]
]
}</property>

View File

@@ -153,16 +153,6 @@
&quot;rounds&quot;:3,
&quot;entryFee&quot;:100,
&quot;rewards&quot;: [[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;white&quot;]
}
],[
{
&quot;type&quot;: &quot;gold&quot;,
&quot;probability&quot;: 1,
@@ -175,6 +165,17 @@
&quot;count&quot;: 1,
&quot;itemNames&quot;: [&quot;Gold Armor&quot;,&quot;Gold Shield&quot;,&quot;Gold Boots&quot;,&quot;Bronze Sword&quot;]
}
],
[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Rare&quot;,&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;white&quot;]
}
]
]
}</property>

View File

@@ -82,16 +82,6 @@
&quot;rounds&quot;:3,
&quot;entryFee&quot;:100,
&quot;rewards&quot;: [[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;black&quot;]
}
],[
{
&quot;type&quot;: &quot;gold&quot;,
&quot;probability&quot;: 1,
@@ -103,6 +93,17 @@
&quot;count&quot;: 1,
&quot;itemNames&quot;: [&quot;Death Ring&quot;,&quot;Dark Armor&quot;,&quot;Dark Shield&quot;,&quot;Dark Boots&quot;]
}
],
[
{
&quot;type&quot;: &quot;card&quot;,
&quot;probability&quot;: 1,
&quot;count&quot;:2,
&quot;rarity&quot;: [
&quot;Rare&quot;,&quot;Mythic Rare&quot;
],
&quot;colors&quot;: [&quot;black&quot;]
}
]
]
}</property>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="50" height="27" tilewidth="16" tileheight="16" infinite="0" nextlayerid="9" nextobjectid="65">
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="50" height="27" tilewidth="16" tileheight="16" infinite="0" nextlayerid="9" nextobjectid="87">
<editorsettings>
<export target="wastetown..tmx" format="tmx"/>
</editorsettings>
@@ -12,12 +12,12 @@
</layer>
<layer id="7" name="Background" width="50" height="27">
<data encoding="base64" compression="zlib">
eJzV1jsOwjAMBmAvCMFZWDghG2PPwmm6lqOgDFEt41cSp0kjWUKomP+r08d6AViN+lx9NXJZBsmxjY39t0odKf9ZHSlzzn/meWQHnoXX4bmucP+SanFIfWoNUY7NYdH60H6e3O/bXrUGarEcpf1K78dRlhZH/j3OK513zVFrAejjkAweR8tcAH3GuUv2lJY959cs0Y7aKj3/kqPlGo9wcDOwHAtz/EiHZMAObZ/N4tAsX9hLm9UsDmrB3z/u/HGco8YS7ZDqydzzIi0jHXR+1DKj42U8g6hj1n2VHB7LLNe5Zen1P0c7evU+0hHxXj7KoT3nZ3do2XtZoh3WuxNXS7An0pDX0bNJ6weoMmc/
eJzN1jEOwjAMBdAsCMFZWDhhN8aehdN0DUdBFaoaIvv7x7ghljyURolfnZQup5QWI59nLv8ZlqF2jBotjpGDceT0yZHD42hxMecKzZdBehzS3BGG0qHNyzgyYUGO+h5T9+OyJ/u8rTGWg50TOVBYFmk/S/dZh3Y+cvquV3vuyNFikdaPdmgGxuG15Oq6rFsyaP1FtW/1I0u0g0nkYJ+/5mhZPynXvzikHliOWRjvPR8RDs1QOtA++/X9G+VAllfaE/VqFEdtKX+/XeVxkgNZtHWjHVrehXeexzKio+5fbenpYGIdPymO0lM6eu+rFscEvjPL3jBrRjlaTNu41YHus3O3GqOz3lue8PQqOq2z66m/lwP9z0euc4QD1X6UJdphfTtJOQd7Ig1b9O7NGm9yDuQI
</data>
</layer>
<layer id="2" name="Ground" width="50" height="27">
<data encoding="base64" compression="zlib">
eJztl81OwkAQxxcxoa0fT+CNCF58CS9+xMRz1fAoHA34CL6BHwffiKMRvGMxJM6knex00i3tMqQk+k/+AdrtMr/OzmxrjL/eO9vjddR07P8cf5dDjtdSExxx25jbtv3+tGtNx7eRgwvjXoCTLP6FiDtp+7FocxTNi4pZ3A+h21osWhz8N+WAS8Y/C4z5Cux5H5ZNcPB1LxlQFH8vMuYT4j+DY90oz/LTEAep6P6jpoG97zwXnOUxtOOrcvDYNThiR+0Sw3GUv++SpQ8+idLxdzDHd418aNW5KwekUZgyfAQ2Xl7bUuusqXU4liv+V95vkhYHSoNjDv9777mH8bohNdmvilhwnQ+yY9fZ/AMxrhcV96u6LJr9ap7FTcZaHbbSc9NOfpxk6Wc8vr1Xu+9KHe2kn1Mxf1H+kMen96I0OPbg2n3wAfjQMY/kQFH+iKen1Ht99QzXvoBfwW+OecawXm4c52Ru6jKgNDjOIcYL8CX4KnCPw5yctqy55qKu6mrT9UHCvRI5ynrQhLmuNskhnxdHgX33kO9NE+PPofn+4Yq9TK49okrf4NLmWPWcVSTKD1eVviGlxcEZ6FkD9+hZSd1zJYy/at/g0uJYMoZxmHc3Kr+WlHj0KZRcV7/dmzZ4
eJzdl0tOwzAQhl2K1CQ8TsAO0bLhEmx4CIl1AfUoLFHLEbgBjwW3QrTsS4oqMaNk5MnIaRJnkiB+aURJbOf/PH4a46/3gX+00V7X+i8cqLY5yrTbxjhrgmETj5a64Bj3jbnp299P2zbo+V/k4ELfK4g49b8SvuO+H4s2h6td1Jj5fgjzQ4tFi4P/Tzngkv4XgTFfgX3vw9IEBx/3kgFF/oeRMZ/g/xSeHUZZlp+OOEiu/kfNA9vvPBec5TG05atwkHcNjnHO3EUhw1GU7XfJMoI4jpLyt9DGd0UOjXzk5YA0DROGj8D65XNbqs6YqsOxLviu7G+SFgdKg2MJ373z3MP4vCF1uV65WHCcT9JnV2n7E1FuGLnXq6osmuvVMvVNgXP1vpe8mw+y5STLKOXxXXubPrcfbCV/56J9V/6Qp87a28b9Q3KgKH/EM1Rae5vUDMbLdc43ZG6qMqDavA9iTk567ndLMa+qqi0O3CuRw/eOUaQmOeR5cRrYu0ede5OU9v0cVXTW5crbI3bAyy7EHsR+CV/aHEXnLJcoP1zP4OUF4hXiraQvLQ7OQGcN3KMXweZ6pJjxn0Gdc4gLiMuS9bU41oxhFmbjMNpclxR7zhc5rn4B6FMAyQ==
</data>
</layer>
<layer id="3" name="Clutter" width="50" height="27">
@@ -25,36 +25,121 @@
<property name="spriteLayer" type="bool" value="true"/>
</properties>
<data encoding="base64" compression="zlib">
eJxjYBgFo2AUjIJRMFJAOe9Au4A4UI7MRnJzKZBdPYT8AMPo4uggj4v27iEXgNwbqMXAEKSF6qdyJPmhAnKBfsjTQhVDj6PB6J8yaJrPJZBOhkLc4Evr2PL2YPQDCJQQWQ7B8g5I/RpO2rqJEtDCiEqjA1jeWQv0wzogVhGkn9toAbyB6fAg0A8bgX5ZP4jjhRCA+cMfSCcIDbRryAOgci0O6PZ4IH49iOvC4Qbuo+HhDv4wD7QLiAMLCbhzsPkDV7vEngW3nsHkB3x1uQcBvYPFH9jaVVewhH8p1K+DsS1SihQPZUjss+z0cwMAagwq4A==
eJxjYBgY0MKHiQfafmrj4eAHeviFFPtIdRM9/UIv82npl4FMv7Qym16AFnbSwsxyXtLsphYg1bxyZDaSm0uB7Goi/YBuNzX8Q4o55UgYXRwd5HGRZj+lfiHVH4FaDAxBWqh+KkeSJ9d+evoDBHKBfsjTQhVDjyNS/EMvf5RB03wugXRCTtzQO3/gS+vY8ja9/YBsHj5QQmQ5BMs7IPVrOImzl57+gKtlRKXRASzvrAX6YR0QqwhSx16i3EaD+twbmA4PAv2wEeiX9TjiZSj5wx9IJwjRx15q9x9A5Voc0O3xQPwaT/kwmPxBbl6ldfuUFH/cx6KeVLMHGyAlTgerHxYyI9hDwf3I7ZKz7Ai2PQtuPX+YccvRG6DX5QZAP+RxQNgeBPQOFn9ga1chxwUMlEL9SqgtMhCgFCkeypDY2PxBKwAAKZqgGA==
</data>
</layer>
<objectgroup id="4" name="Objects">
<object id="38" template="../obj/entry_up.tx" x="368.667" y="432.333">
<object id="38" template="../obj/entry_up.tx" x="385.956" y="430.172">
<properties>
<property name="teleport" value=""/>
</properties>
</object>
<object id="54" template="../obj/enemy.tx" x="262.332" y="206.667">
<object id="54" template="../obj/enemy.tx" x="290.426" y="219.634">
<properties>
<property name="enemy" value="Crab"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="85,86"/>
</properties>
</object>
<object id="57" template="../obj/enemy.tx" x="388.5" y="381">
<object id="57" template="../obj/enemy.tx" x="369.05" y="240.529">
<properties>
<property name="enemy" value="Water Elemental"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="60" template="../obj/treasure.tx" x="485.073" y="231.023"/>
<object id="61" template="../obj/gold.tx" x="327.927" y="214.977"/>
<object id="61" template="../obj/gold.tx" x="401.404" y="198.409"/>
<object id="62" template="../obj/enemy.tx" x="375.677" y="184.811">
<properties>
<property name="enemy" value="Bird"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="63" template="../obj/enemy.tx" x="485.76" y="250.144">
<properties>
<property name="enemy" value="Bird"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="65" template="../obj/manashards.tx" x="493.373" y="283.747"/>
<object id="66" template="../obj/booster.tx" x="422.778" y="200.185">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;EXO&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;EXO&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;EXO&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="67" template="../obj/booster.tx" x="259.255" y="226.118">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;STH&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;STH&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;STH&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="68" template="../obj/gold.tx" x="442.948" y="205.948"/>
<object id="69" template="../obj/enemy.tx" x="456.635" y="326.249">
<properties>
<property name="enemy" value="Jellyfish"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="84,72,73,74,77,83"/>
</properties>
</object>
<object id="71" template="../obj/enemy.tx" x="447.27" y="399.006">
<properties>
<property name="enemy" value="Pirate"/>
<property name="threatRange" type="int" value="20"/>
</properties>
</object>
<object id="72" template="../obj/waypoint.tx" x="320" y="320"/>
<object id="73" template="../obj/waypoint.tx" x="189.38" y="314.723"/>
<object id="74" template="../obj/waypoint.tx" x="182.896" y="57.5531"/>
<object id="75" template="../obj/waypoint.tx" x="517.145" y="40.2644"/>
<object id="76" template="../obj/waypoint.tx" x="267.179" y="35.9422"/>
<object id="77" template="../obj/waypoint.tx" x="703.719" y="161.285"/>
<object id="78" template="../obj/waypoint.tx" x="605.03" y="85.6473"/>
<object id="79" template="../obj/waypoint.tx" x="663.379" y="115.903"/>
<object id="80" template="../obj/waypoint.tx" x="664.099" y="246.288"/>
<object id="81" template="../obj/waypoint.tx" x="664.82" y="315.443"/>
<object id="82" template="../obj/waypoint.tx" x="620.878" y="350.021"/>
<object id="83" template="../obj/waypoint.tx" x="490.492" y="366.589"/>
<object id="84" template="../obj/waypoint.tx" x="420.616" y="331.291"/>
<object id="85" template="../obj/waypoint.tx" x="284.468" y="248.45"/>
<object id="86" template="../obj/waypoint.tx" x="324.808" y="188.659"/>
</objectgroup>
</map>

View File

@@ -1,23 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.5" tiledversion="1.7.2" orientation="orthogonal" renderorder="right-down" width="50" height="50" tilewidth="16" tileheight="16" infinite="0" nextlayerid="7" nextobjectid="59">
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="50" height="50" tilewidth="16" tileheight="16" infinite="0" nextlayerid="8" nextobjectid="152">
<editorsettings>
<export target="wastetown..tmx" format="tmx"/>
</editorsettings>
<tileset firstgid="1" source="../tileset/main.tsx"/>
<tileset firstgid="3477" source="../tileset/buildings.tsx"/>
<layer id="6" name="Collision" width="50" height="50">
<data encoding="base64" compression="zlib">
eJzt2MEJgDAQAMEUECtQGzOVqtibOdACFCOr7MB9E5bkdaVLacltZq0T5kbnnzPVhvG468v6bAeJHSx2sNjBYgeLHSx2sNjBYgeLHSx2sNhxzbkvC1uD+3yP+0r3/JlvdcT+dchtGoL/isUOFjtY7GCxg8UOFjtY7GCxg8UOlugYfjI7HCk/rg==
</data>
</layer>
<tileset firstgid="10113" source="../tileset/buildings.tsx"/>
<layer id="1" name="Background" width="50" height="50">
<data encoding="base64" compression="zlib">
eJzt1yEOACAMADEsH0fuzVgEIQiSAamoGmI3R9RSYqINZvPV+wy37qXjTEvWDXTo0KFDhw4d/3Zk7KJjr+OF/wcAAAAAAAB36k/HeTg=
eJzt17sJgDAYRWErMYuJO9lbZhLnCo5hJajERzSY688pvkqFe9IEvasqHzGsxJ6fvV+C6i468rSUOgM66KCDDjrooMNuR4ktdNzr+MP/xxf6eqsV2JSidfHN6h0pm5Vbjs7/SiewPUdHENi+73j6rVrLG39sGZvyG2ix2TI57XvEwhkvHZZagsCOXCy1AAAAAAD0zHEheMc=
</data>
</layer>
<layer id="2" name="Ground" width="50" height="50">
<data encoding="base64" compression="zlib">
eJzVWllOw0AM7WdzuBSUizbQ3oqW5gjEUi0sy+PxFkKflB/IeLzNG9vp9Xg4nAb5eV+fDEYm702R97X+70p0+V6fj6N9L74en8/1b/eEHed1/UJk3Ya+PNDlRvTx+nHa0IaIPmDPpaMD7MHjhevAD5INsGZen4cx1hhjaxy8QD9B7s0NeyQbIr6VZFWA62PNnez5w729a1pyIjYgOO+ALdYcA0wO+zWbp8HHGxwtTrPoRn2ovX9+nr9Fec9y/qO2aOeF54FmC5efvbu8tmj7Ud7CdVpOU/ne3I3YonG09D68Y80Jepdl7zELtuJV6qdMbiFfVHFlFFE/cb5YEv5GWZV+sPhV4pXT8BsX6e7XgDneqhu8+s9P/Xp5xutMypFonydXpRogYg+vma35Qc9Ypv5txdfji2zNDBgTNgBa8fXoktUB9UAdtB7OI8erS5UOU9E9hPpEdMG4ZuupqntuqzsTgBz/yqBc8KrgfBaV8Rh8PXs1OCdGZWR73SqgPZn11r5Hq232rkcB6IseN45K3LB3z9ZhFFvU7L0aid7bVfmJvtFmXF4sHT23OGtS/52RezbWm3xf6e739g98VpWZvfGaV6tNJqOtVl1a8x1vfcTl9Go1fF/jvcnpV48OGifQu8rih14dFqmB6exJs8Hab1bWnN5ZSm9/b5yrIOmVqY/4/G+vOTwg48/oHICuzfR6FFFu5bzqXU9rlYqaOdLL8zhYZ73S+qp73KsDYGS2e/ioNRPKzgIinBj9niJ9F8vMRGg/95eQ5kARn9BZaaavzSA7y5Fietm5D4sgM9v7b5BiWvlte88+W/vOawH9/lN1N0d8gtwX5b1oXdKT6fUt7O35vQHfr6r/nUlcIzKtvzfgqOzlK34D9gMJRs0E
eJzVWllOw0AM7Rc0hwugXIZjNbS9FYX2CMSiFpbl8XgLgSfND2Q83vLGdnre73ZPg7xelpXByOQ9K/Lel/+diS6fy3rb28/i+3Edl799JOw4LPtvRNZl6MsDXS5EH68fpxVtiOgD9pw6OsAZPF64D/wg2QB75mVdjbHGGFvj4AX6CXJvbtgj2RDxrSSrAlwfa+5k3z8827unJSdiA4LzDthizTHA5LBfs3kafLzB0eI0i27Uh9rzh/v7d1Oes7z/UVu094XngWYLl5+9u7y2aOdR3sJ9Wk5T+d7cjdiicbT0PDxjzQl6l2XvMQvW4lXqp0xuIV9UcWUUUT9xvrgl/I2yKv1g8avEK0/DT1yku18D5nirbvDqP9/16+UZrzMpR6J9nlyVaoCIPbxmtuYHfccy9W8rvh5fZGtmwJiwAdCKr0eXrA6oB+qg9XAeOV5dqnSYiu4h1CeiC8Y1W09V3XNr3ZkA5Pj/DMoFa+L1YT3ZnM+iMq6Dr2evBufEqIxsr1sFtCez39r3aLXN1vUoAH3R48ZRiRv27tk6jGKNmr1XIx0fv1dlfqJvtBmXF5RTJD3XeNek/jsj92CsN/m50t3v7R/4rCoze+M1r1abTEZbrbq05jve+ojL6dVq+LzGe5PTrx4dNE6gd5XFD706LFID09mTZoO136ysOb2zlN753jhXQdIrUx/x+d9Wc3hAxp/ROQDdm+n1KKLcynnVu5/WKhU1c6SX53Gwznql/VX3uFcHwMhs9/BRayaUnQVEODH6PUX6LpaZidB+7jchzYEiPqGz0kxfm0F2liPF9LRxHxZBZrb31yDFtPLb9pZ9tvad1wL6/afqbo74BLkvynvRuqQn0+tbONvzewN+XlX/O5O4RmRaf2/AUdnLV/wG7Av74c5G
</data>
</layer>
<layer id="3" name="Clutter" width="50" height="50">
@@ -25,33 +20,272 @@
<property name="spriteLayer" type="bool" value="true"/>
</properties>
<data encoding="base64" compression="zlib">
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
</data>
</layer>
<objectgroup id="4" name="Objects">
<object id="50" template="../obj/enemy.tx" x="455.333" y="335.167">
<object id="50" template="../obj/enemy.tx" x="468.333" y="324.667">
<properties>
<property name="enemy" value="Griffin"/>
<property name="enemy" value="Sand Golem"/>
</properties>
</object>
<object id="51" template="../obj/treasure.tx" x="431.833" y="431.833"/>
<object id="52" template="../obj/gold.tx" x="418.667" y="426.834"/>
<object id="53" template="../obj/enemy.tx" x="345.75" y="383.917">
<object id="51" template="../obj/treasure.tx" x="459" y="479"/>
<object id="53" template="../obj/enemy.tx" x="310.583" y="440.917">
<properties>
<property name="enemy" value="Griffin"/>
<property name="threatRange" type="int" value="20"/>
<property name="waypoints" value="110,82,75,71"/>
</properties>
</object>
<object id="54" template="../obj/enemy.tx" x="390.584" y="427.916">
<object id="54" template="../obj/enemy.tx" x="407.751" y="441.583">
<properties>
<property name="enemy" value="Griffin"/>
<property name="threatRange" type="int" value="40"/>
</properties>
</object>
<object id="56" template="../obj/entry_down.tx" x="385" y="16.6667"/>
<object id="57" template="../obj/gold.tx" x="418.667" y="437.333"/>
<object id="58" template="../obj/enemy.tx" x="404.333" y="427.917">
<object id="56" template="../obj/entry_down.tx" x="384.016" y="18.6342"/>
<object id="58" template="../obj/enemy.tx" x="322" y="306.917">
<properties>
<property name="enemy" value="Griffin"/>
<property name="threatRange" type="int" value="40"/>
</properties>
</object>
<object id="59" template="../obj/enemy.tx" x="145.802" y="183.221">
<properties>
<property name="enemy" value="Sandwurm"/>
<property name="threatRange" type="int" value="20"/>
<property name="waypoints" value="112,108,109,110,111"/>
</properties>
</object>
<object id="60" template="../obj/enemy.tx" x="561.495" y="298.815">
<properties>
<property name="enemy" value="Scorpion"/>
<property name="threatRange" type="int" value="20"/>
<property name="waypoints" value="69,66,68"/>
</properties>
</object>
<object id="61" template="../obj/enemy.tx" x="639.495" y="255.815">
<properties>
<property name="enemy" value="Vulture"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="62" template="../obj/enemy.tx" x="54.8411" y="429.189">
<properties>
<property name="enemy" value="Scorpion"/>
<property name="threatRange" type="int" value="20"/>
<property name="waypoints" value="80,81,82,83,84"/>
</properties>
</object>
<object id="64" template="../obj/enemy.tx" x="689" y="560.5">
<properties>
<property name="enemy" value="Vulture"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="66" template="../obj/waypoint.tx" x="626.5" y="390"/>
<object id="67" template="../obj/waypoint.tx" x="781" y="203.5"/>
<object id="68" template="../obj/waypoint.tx" x="769" y="339"/>
<object id="69" template="../obj/waypoint.tx" x="612" y="322.5"/>
<object id="71" template="../obj/waypoint.tx" x="712.5" y="174"/>
<object id="72" template="../obj/waypoint.tx" x="647.5" y="161"/>
<object id="73" template="../obj/waypoint.tx" x="605.5" y="231.5"/>
<object id="74" template="../obj/enemy.tx" x="677" y="502">
<properties>
<property name="enemy" value="Scorpion"/>
<property name="threatRange" type="int" value="20"/>
<property name="waypoints" value="75,76,75,78,77,78"/>
</properties>
</object>
<object id="75" template="../obj/waypoint.tx" x="752" y="512"/>
<object id="76" template="../obj/waypoint.tx" x="752.5" y="579"/>
<object id="77" template="../obj/waypoint.tx" x="597" y="563"/>
<object id="78" template="../obj/waypoint.tx" x="599.5" y="504.5"/>
<object id="79" template="../obj/enemy.tx" x="371.5" y="630">
<properties>
<property name="enemy" value="Sandwurm"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="79,75,76,77"/>
</properties>
</object>
<object id="80" template="../obj/waypoint.tx" x="20" y="431.5"/>
<object id="81" template="../obj/waypoint.tx" x="167" y="436.5"/>
<object id="82" template="../obj/waypoint.tx" x="160" y="614"/>
<object id="83" template="../obj/waypoint.tx" x="1.5" y="602"/>
<object id="84" template="../obj/waypoint.tx" x="24" y="505"/>
<object id="85" template="../obj/enemy.tx" x="79" y="544">
<properties>
<property name="enemy" value="Griffin"/>
<property name="threatRange" type="int" value="60"/>
</properties>
</object>
<object id="86" template="../obj/enemy.tx" x="118" y="751.5">
<properties>
<property name="enemy" value="Sand Wurm"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="79,75,76,77"/>
</properties>
</object>
<object id="87" template="../obj/enemy.tx" x="579.5" y="699.5">
<properties>
<property name="enemy" value="Sandwurm"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="79,75,76,77"/>
</properties>
</object>
<object id="88" template="../obj/waypoint.tx" x="211" y="749.5"/>
<object id="89" template="../obj/waypoint.tx" x="217.5" y="583.5"/>
<object id="90" template="../obj/waypoint.tx" x="261" y="410.5"/>
<object id="91" template="../obj/waypoint.tx" x="330.5" y="543.5"/>
<object id="92" template="../obj/waypoint.tx" x="340" y="716.5"/>
<object id="93" template="../obj/waypoint.tx" x="505.5" y="602"/>
<object id="94" template="../obj/waypoint.tx" x="488" y="703"/>
<object id="95" template="../obj/waypoint.tx" x="568" y="757.5"/>
<object id="96" template="../obj/waypoint.tx" x="668.5" y="656.5"/>
<object id="97" template="../obj/waypoint.tx" x="744.5" y="671.5"/>
<object id="98" template="../obj/waypoint.tx" x="739.5" y="733.5"/>
<object id="99" template="../obj/manashards.tx" x="530" y="482.5"/>
<object id="100" template="../obj/manashards.tx" x="709.5" y="788"/>
<object id="101" template="../obj/booster.tx" x="445.5" y="781">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;PCY&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;PCY&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;PCY&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="103" template="../obj/gold.tx" x="75" y="571.5"/>
<object id="104" template="../obj/booster.tx" x="428.5" y="404.167">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;NEM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;NEM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;NEM&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="105" template="../obj/booster.tx" x="482.5" y="431">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;TMP&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
},
{
&quot;editions&quot;: [ &quot;TMP&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
},
{
&quot;editions&quot;: [ &quot;TMP&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
}
]
</property>
</properties>
</object>
<object id="106" template="../obj/enemy.tx" x="378.5" y="377">
<properties>
<property name="enemy" value="Sand Golem"/>
</properties>
</object>
<object id="108" template="../obj/waypoint.tx" x="38" y="247.5"/>
<object id="109" template="../obj/waypoint.tx" x="3.5" y="157.5"/>
<object id="110" template="../obj/waypoint.tx" x="123.5" y="105.5"/>
<object id="111" template="../obj/waypoint.tx" x="211.5" y="106.5"/>
<object id="112" template="../obj/waypoint.tx" x="200.5" y="232"/>
<object id="113" template="../obj/enemy.tx" x="571" y="127">
<properties>
<property name="enemy" value="Sandwurm"/>
<property name="threatRange" type="int" value="20"/>
<property name="waypoints" value="118,115,72,71,67"/>
</properties>
</object>
<object id="114" template="../obj/waypoint.tx" x="509.5" y="244"/>
<object id="115" template="../obj/waypoint.tx" x="514" y="104.5"/>
<object id="116" template="../obj/waypoint.tx" x="345" y="237"/>
<object id="117" template="../obj/waypoint.tx" x="352.5" y="84"/>
<object id="118" template="../obj/waypoint.tx" x="472" y="85.5"/>
<object id="119" template="../obj/enemy.tx" x="190" y="675">
<properties>
<property name="enemy" value="Sandwurm"/>
<property name="threatRange" type="int" value="40"/>
</properties>
</object>
<object id="120" template="../obj/enemy.tx" x="443" y="732">
<properties>
<property name="enemy" value="Sand Wurm"/>
<property name="threatRange" type="int" value="40"/>
</properties>
</object>
<object id="121" template="../obj/enemy.tx" x="561" y="427">
<properties>
<property name="enemy" value="Griffin"/>
<property name="threatRange" type="int" value="40"/>
</properties>
</object>
<object id="122" template="../obj/collision.tx" x="-2.6505" y="-18" width="803.301" height="16"/>
<object id="123" template="../obj/collision.tx" x="-2.6505" y="801" width="801.301" height="16"/>
<object id="124" template="../obj/collision.tx" x="800.35" y="-17" width="24.301" height="832"/>
<object id="125" template="../obj/collision.tx" x="-26.1505" y="-24" width="24.301" height="832"/>
<object id="126" template="../obj/collision.tx" x="299.85" y="286" width="8.301" height="171"/>
<object id="128" template="../obj/collision.tx" x="309.849" y="443.75" width="22.301" height="13.5"/>
<object id="129" template="../obj/collision.tx" x="330.349" y="446.75" width="22.301" height="13.5"/>
<object id="132" template="../obj/collision.tx" x="383.349" y="510.25" width="22.301" height="44.5"/>
<object id="133" template="../obj/collision.tx" x="392.849" y="544.75" width="47.301" height="23"/>
<object id="134" template="../obj/collision.tx" x="428.849" y="529.75" width="48.301" height="13.5"/>
<object id="135" template="../obj/collision.tx" x="468.349" y="496.75" width="69.301" height="31"/>
<object id="137" template="../obj/collision.tx" x="563.35" y="385.25" width="22.301" height="110.5"/>
<object id="139" template="../obj/collision.tx" x="399.849" y="482.75" width="84.801" height="5.5"/>
<object id="140" template="../obj/collision.tx" x="482.849" y="446.25" width="17.801" height="13.5"/>
<object id="141" template="../obj/collision.tx" x="346.349" y="364.75" width="6.301" height="59.5"/>
<object id="142" template="../obj/collision.tx" x="347.349" y="416.75" width="22.301" height="13.5"/>
<object id="143" template="../obj/collision.tx" x="360.349" y="426.75" width="7.801" height="13.5"/>
<object id="144" template="../obj/collision.tx" x="366.349" y="433.75" width="15.801" height="11"/>
<object id="145" template="../obj/collision.tx" x="377.849" y="441.75" width="4.801" height="26.5"/>
<object id="146" template="../obj/collision.tx" x="384.849" y="468.75" width="14.801" height="13.5"/>
<object id="147" template="../obj/collision.tx" x="376.35" y="319.75" width="6.301" height="43.5"/>
<object id="148" template="../obj/collision.tx" x="297.849" y="279.75" width="70.301" height="4"/>
<object id="149" template="../obj/collision.tx" x="395.849" y="313.75" width="70.301" height="7"/>
<object id="150" template="../obj/collision.tx" x="493.35" y="314.75" width="41.801" height="4"/>
<object id="151" template="../obj/collision.tx" x="399.599" y="378.25" width="84.801" height="5.5"/>
</objectgroup>
</map>

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="31" height="17" tilewidth="16" tileheight="16" infinite="0" nextlayerid="10" nextobjectid="90">
<editorsettings>
<export target="wastetown..tmx" format="tmx"/>
</editorsettings>
<tileset firstgid="1" source="../tileset/main.tsx"/>
<tileset firstgid="10113" source="../tileset/buildings.tsx"/>
<tileset firstgid="11905" source="../tileset/DrossPitTiles.tsx"/>
<layer id="6" name="Collision" width="31" height="17">
<data encoding="base64" compression="zlib">
eJzVlM0NgCAMRrkYT3YZo67nEuJc6ia6gHAgYG1JIWBik+8g1L7+Bd0opQWqYRJubfYOtL5g596XZM9t/L7kfHLYEzOfEbyvJC98ZmNQ96EG47N0Sp3gtZrvHmR9wTvGGVXfAW+OzWcjfGM15FqP8h0i+WOTssO+4v5iNp4DJ2kPuHnj/lJzSFFobt8pP66eC55xJLxUdsn3l/rH7WjNdy2MH9uL2uxSffwD+wZNG6DH
</data>
</layer>
<layer id="1" name="Background" width="31" height="17">
<data encoding="base64" compression="zlib">
eJzr1mNgaBkg3D0E7N7BA6FBAJkeCH8PpN0DFd9N3APnXmqE96jdI89uctL5QNs9UGXLqN30t5taGACvMGLt
</data>
</layer>
<layer id="3" name="Clutter" width="31" height="17">
<properties>
<property name="spriteLayer" type="bool" value="true"/>
</properties>
<data encoding="base64" compression="zlib">
eJxjYGBg6NYbGAwCU4H0FBx4Mo3t7oHS2EDXCLF7r97A2X2MjnaD0tN0GoU5chrGlmYJAUrsRg7PaVjcQS+7sZk5kHY3QXEfAXXk4GYk85FxI5K/sbnxvB7ldhOTx7DZfWMA7aZGmA8FuwmlC1raPRAYAAIpNm8=
</data>
</layer>
<layer id="2" name="Walls" width="31" height="17">
<properties>
<property name="spriteLayer" type="bool" value="true"/>
</properties>
<data encoding="base64" compression="zlib">
eJxjYBgFo2Dwgvl6DAztWPACPdrb3Q+0ow2IZyLhDiCeSEW7D+Lw3yws9oDcMwNN3SEK3HIKqHcCDozNbnQ1pymw+zJauOILX2zxcIUG8Y8tfLHFAy3AChzhsZIOdo+CUUAOAAA9nDWk
</data>
</layer>
<layer id="8" name="Archway" width="31" height="17">
<data encoding="base64" compression="zlib">
eJxjYBgFo2AUjIJRMApGwSggHgAACDwAAQ==
</data>
</layer>
<objectgroup id="4" name="Objects">
<object id="38" template="../obj/entry_left.tx" x="0.706867" y="162.682"/>
<object id="48" template="../obj/treasure.tx" x="432.239" y="155.641"/>
<object id="50" template="../obj/enemy.tx" x="96.485" y="173.992">
<properties>
<property name="enemy" value="Dross Gladiator"/>
<property name="threatRange" value="45"/>
<property name="waypoints" value="82,81,80,83,84,88,70,79,87,83"/>
</properties>
</object>
<object id="54" template="../obj/enemy.tx" x="399.841" y="149.68">
<properties>
<property name="enemy" value="Dross Grimnarch"/>
<property name="threatRange" value="50"/>
<property name="waypoints" value=""/>
</properties>
</object>
<object id="75" template="../obj/booster.tx" x="449.75" y="143.25">
<properties>
<property name="reward">[
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 10,
&quot;rarity&quot;: [ &quot;Common&quot; ]
&quot;colors&quot;: [ &quot;black&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 3,
&quot;rarity&quot;: [ &quot;Uncommon&quot; ]
&quot;colors&quot;: [ &quot;black&quot; ]
},
{
&quot;editions&quot;: [ &quot;ONE&quot; ],
&quot;type&quot;: &quot;card&quot;,
&quot;count&quot;: 1,
&quot;rarity&quot;: [ &quot;Rare&quot;, &quot;Mythic Rare&quot; ]
&quot;colors&quot;: [ &quot;black&quot; ]
}
]
</property>
</properties>
</object>
<object id="76" template="../obj/treasure.tx" x="432" y="143"/>
<object id="85" template="../obj/enemy.tx" x="216.75" y="165.25">
<properties>
<property name="enemy" value="Dross Gladiator"/>
<property name="threatRange" value="50"/>
<property name="waypoints" value="66,78,65,77"/>
</properties>
</object>
<object id="86" template="../obj/enemy.tx" x="276" y="105.25">
<properties>
<property name="enemy" value="Dross Gladiator"/>
<property name="threatRange" value="50"/>
<property name="waypoints" value="65,78,66,77"/>
</properties>
</object>
<object id="89" template="../obj/enemy.tx" x="47.75" y="87.5">
<properties>
<property name="enemy" value="Dross Gladiator"/>
<property name="threatRange" value="45"/>
<property name="waypoints" value="88,87,79,70,88,84,83,82,81,80,83,84"/>
</properties>
</object>
</objectgroup>
<objectgroup id="7" name="Waypoints">
<object id="65" template="../obj/waypoint.tx" x="295" y="107"/>
<object id="66" template="../obj/waypoint.tx" x="218" y="185"/>
<object id="70" template="../obj/waypoint.tx" x="44" y="61"/>
<object id="77" template="../obj/waypoint.tx" x="218" y="107"/>
<object id="78" template="../obj/waypoint.tx" x="295" y="185"/>
<object id="79" template="../obj/waypoint.tx" x="84" y="61"/>
<object id="80" template="../obj/waypoint.tx" x="80" y="236"/>
<object id="81" template="../obj/waypoint.tx" x="114" y="236"/>
<object id="82" template="../obj/waypoint.tx" x="114" y="175"/>
<object id="83" template="../obj/waypoint.tx" x="80" y="175"/>
<object id="84" template="../obj/waypoint.tx" x="54.75" y="162"/>
<object id="87" template="../obj/waypoint.tx" x="84" y="118"/>
<object id="88" template="../obj/waypoint.tx" x="44" y="118"/>
</objectgroup>
</map>

View File

@@ -8,7 +8,7 @@
<tileset firstgid="11905" source="../tileset/Copperhost_Tiles.tsx"/>
<layer id="6" name="Collision" width="29" height="34">
<data encoding="base64" compression="zlib">
eJztllsKxSAMRN1A3Uwfd6W3XVfbDRU/hBBMjDoVCg7ky9bD5IXODQX9p/7M2Tt3GWP1OKZVKObJvGzk3h87u0FMLuob5SvXM28wLT0Theop6iN43gvjIHmqYZb0bIqDYs6Z3LUy+ZzQmdDOWphSPUPNtLMWppRb7c436nkKeUQxpZppUVtPy+xZZGUuXo7UHdr3S4FPS96ixu77/u6L6rn7osbuq2f23H0oWZkpb1vmX/7ORbx3c95Rb87BbGc+/yCvUQ==
eJztlksOgzAMRLPpsrkMlJ60cC7gQlUWkSw3dhw8gCplJK8CeRr/lBC6kj7P65lDDGEzxivimFahmCvzMpF73+xsBzG5qG+Ur1rPnMG09EwWqqeoj+R5boyF5OkIs6VnSxwUc6jkzsvkc0JnQjvzMKV6ppppZx6mlFvtzjPquQp5RDGlmmlxtJ6W2bPIyhyjHKU7tO/HBp+WvGX13ff/uy/ryt2Xdcfumx+/0XefjemVlVnyNlX+5e9cxHu35h315uxMP/MLiOKyFQ==
</data>
</layer>
<layer id="1" name="Background" width="29" height="34">

View File

@@ -42,7 +42,7 @@
</object>
<object id="118" template="../obj/enemy.tx" x="277.693" y="226.745">
<properties>
<property name="enemy" value="Magma Elemental"/>
<property name="enemy" value="Magma Fire Elemental"/>
<property name="spawn.Easy" type="bool" value="false"/>
<property name="spawn.Normal" type="bool" value="true"/>
<property name="threatRange" type="int" value="40"/>
@@ -73,7 +73,7 @@
</object>
<object id="150" template="../obj/enemy.tx" x="213.842" y="94.272">
<properties>
<property name="enemy" value="Magma Elemental"/>
<property name="enemy" value="Magma Fire Elemental"/>
<property name="spawn.Hard" type="bool" value="true"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="174,173"/>
@@ -95,7 +95,7 @@
</object>
<object id="169" template="../obj/enemy.tx" x="360.842" y="71.6053">
<properties>
<property name="enemy" value="Magma Elemental"/>
<property name="enemy" value="Magma Fire Elemental"/>
<property name="spawn.Hard" type="bool" value="true"/>
<property name="threatRange" type="int" value="40"/>
<property name="waypoints" value="175,176,177,176"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.9" tiledversion="1.9.2" name="DrossPitTiles" tilewidth="16" tileheight="16" tilecount="99" columns="9">
<image source="DrossPitTiles.png" width="144" height="176"/>
</tileset>

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.9" tiledversion="1.9.2" name="FarmFood" tilewidth="16" tileheight="16" tilecount="1024" columns="32">
<image source="FarmFood.png" width="512" height="512"/>
</tileset>

View File

@@ -12,3 +12,6 @@ GitLabSmall
CopperhostForest
xy: 64,0
size: 32, 32
DrossOutpost
xy: 96,0
size: 32, 32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 744 KiB

After

Width:  |  Height:  |  Size: 747 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -8,40 +8,40 @@ Avatar
size: 16, 16
Idle
xy: 00, 11
size: 32, 20
size: 32, 21
Idle
xy: 32, 11
size: 32, 20
size: 32, 21
Idle
xy: 64, 11
size: 32, 20
size: 32, 21
Idle
xy: 96, 11
size: 32, 20
size: 32, 21
Walk
xy: 0, 40
size: 32, 20
size: 32, 24
Walk
xy: 32, 40
size: 32, 22
size: 32, 24
Walk
xy: 64, 40
size: 32, 22
size: 32, 24
Walk
xy: 96, 40
size: 32, 22
size: 32, 24
Walk
xy: 128, 40
size: 32, 22
size: 32, 24
Walk
xy: 160, 40
size: 32, 22
size: 32, 24
Walk
xy: 192, 40
size: 32, 22
size: 32, 24
Walk
xy: 224, 40
size: 32, 22
size: 32, 24
Attack
xy: 0, 64
size: 32, 32

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,98 @@
frogboss.png
size: 1152,512
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 33, 273
size: 39, 28
Idle
xy: 18,14
size: 65, 50
Idle
xy: 114,14
size: 65, 50
Idle
xy: 210,14
size: 65, 50
Idle
xy: 306,14
size: 65, 50
Idle
xy: 402,14
size: 65, 50
Walk
xy: 18, 68
size: 70, 60
Walk
xy: 114, 68
size: 70, 60
Walk
xy: 210, 68
size: 70, 60
Walk
xy: 306, 68
size: 70, 60
Walk
xy: 402, 68
size: 70, 60
Walk
xy: 498, 68
size: 70, 60
Walk
xy: 594, 68
size: 70, 60
Walk
xy: 690, 68
size: 70, 60
Walk
xy: 786, 68
size: 70, 60
Walk
xy: 882, 68
size: 70, 60
Walk
xy: 978, 68
size: 70, 60
Walk
xy: 1074, 68
size: 70, 60
Attack
xy: 18, 200
size: 78, 57
Attack
xy: 114, 200
size: 78, 57
Attack
xy: 210, 200
size: 78, 57
Attack
xy: 306, 200
size: 78, 57
Death
xy: 18,462
size: 70, 50
Death
xy: 114,462
size: 70, 50
Death
xy: 210,462
size: 70, 50
Death
xy: 306,462
size: 70, 50
Death
xy: 402,462
size: 70, 50
Death
xy: 498,462
size: 70, 50
Death
xy: 594,462
size: 70, 50
Death
xy: 690,462
size: 70, 50
Death
xy: 786,462
size: 70, 50

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,20 @@
oozeboss.png
size: 64,16
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 1,1
size: 15, 14
Idle
xy: 0, 0
size: 16, 16
Idle
xy: 16, 0
size: 16, 16
Idle
xy: 32, 0
size: 16, 16
Idle
xy: 48, 0
size: 16, 16

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -43,29 +43,29 @@ Walk
xy: 1168, 140
size: 80, 50
Attack
xy: 48, 230
size: 80, 50
xy: 40, 208
size: 130, 80
Attack
xy: 208, 230
size: 80, 50
xy: 200, 208
size: 130, 80
Attack
xy: 368, 230
size: 80, 50
xy: 360, 208
size: 130, 80
Attack
xy: 528, 230
size: 80, 50
xy: 520, 208
size: 130, 80
Attack
xy: 688, 230
size: 80, 50
xy: 680, 208
size: 130, 80
Attack
xy: 848, 230
size: 80, 50
xy: 840, 208
size: 130, 80
Attack
xy: 1008, 230
size: 80, 50
xy: 1000, 208
size: 130, 80
Death
xy: 48, 430
size: 16, 50
size: 100, 50
Death
xy: 208, 430
size: 100,50

View File

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -7,50 +7,50 @@ Avatar
xy: 20, 10
size: 12, 13
Idle
xy: 0, 7
size: 32, 25
xy: 0, 5
size: 32, 27
Idle
xy: 32, 7
size: 32, 25
xy: 32, 5
size: 32, 27
Idle
xy: 64, 7
size: 32, 25
xy: 64, 5
size: 32, 27
Idle
xy: 96, 7
size: 32, 25
xy: 96, 5
size: 32, 27
Idle
xy: 128, 7
size: 32, 25
xy: 128, 5
size: 32, 27
Idle
xy: 160, 7
size: 32, 25
xy: 160, 5
size: 32, 27
Idle
xy: 192, 7
size: 32, 25
xy: 192, 5
size: 32, 27
Walk
xy: 0, 41
size: 32, 25
xy: 0, 37
size: 32, 27
Walk
xy: 32,41
size: 32, 25
xy: 32,37
size: 32, 27
Walk
xy: 64, 41
size: 32, 25
xy: 64, 37
size: 32, 27
Walk
xy: 96, 41
size: 32, 25
xy: 96, 37
size: 32, 27
Walk
xy: 128, 41
size: 32, 25
xy: 128, 37
size: 32, 27
Walk
xy: 160, 41
size: 32, 25
xy: 160, 37
size: 32, 27
Walk
xy: 192, 41
size: 32, 25
xy: 192, 37
size: 32, 27
Walk
xy: 224, 41
size: 32, 25
xy: 224, 37
size: 32, 27
Attack
xy: 0, 96
size: 32, 32
@@ -84,6 +84,3 @@ Death
Death
xy: 64, 128
size: 32, 32
Death
xy: 96, 128
size: 32, 32

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -0,0 +1,56 @@
crab.png
size: 128,128
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 41, 111
size: 15, 16
Idle
xy: 5,16
size: 20, 16
Idle
xy: 37,16
size: 20, 16
Idle
xy: 69,16
size: 20, 16
Idle
xy: 101,16
size: 20, 16
Walk
xy: 5,48
size: 21, 16
Walk
xy: 37,48
size: 21, 16
Walk
xy: 69,48
size: 21, 16
Walk
xy: 101,48
size: 21, 16
Attack
xy: 6,112
size: 20, 16
Attack
xy: 38,112
size: 20, 16
Attack
xy: 70,112
size: 20, 16
Attack
xy: 102,112
size: 20, 16
Death
xy: 5, 80
size: 21, 16
Death
xy: 37, 80
size: 21, 16
Death
xy: 69, 80
size: 21, 16
Death
xy: 102, 80
size: 21, 16

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -31,29 +31,29 @@ Idle
xy: 230, 17
size: 20, 15
Walk
xy: 6, 108
size: 25, 20
xy: 5, 112
size: 25, 16
Walk
xy: 38, 108
size: 25, 20
xy: 37, 112
size: 25, 16
Walk
xy: 70, 108
size: 25, 20
xy: 69, 112
size: 25, 16
Walk
xy: 102,108
size: 25, 20
xy: 101,112
size: 25, 16
Walk
xy: 134, 108
size: 25, 20
xy: 133, 112
size: 25, 16
Walk
xy: 166,108
size: 25, 20
xy: 165,112
size: 25, 16
Walk
xy: 198, 108
size: 25, 20
xy: 197, 112
size: 25, 16
Walk
xy: 230,108
size: 25, 20
xy: 229,112
size: 25, 16
Attack
xy: 0, 172
size: 32, 20
@@ -66,9 +66,9 @@ Attack
Death
xy: 0, 204
size: 32, 20
Attack
Death
xy: 32, 204
size: 32, 20
Attack
Death
xy: 64, 204
size: 32, 20

View File

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -8,7 +8,7 @@ Avatar
size: 14, 12
Idle
xy: 7,8
size: 20, 20
size: 22, 20
Idle
xy: 39,8
size: 22, 20

View File

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -0,0 +1,68 @@
drossgladiator.png
size: 64,96
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 0, 0
size: 16, 16
Idle
xy: 0, 16
size: 16, 16
Idle
xy: 16, 16
size: 16, 16
Idle
xy: 32, 16
size: 16, 16
Idle
xy: 48, 16
size: 16, 16
Walk
xy: 0, 32
size: 16, 16
Walk
xy: 16, 32
size: 16, 16
Walk
xy: 32, 32
size: 16, 16
Walk
xy: 48, 32
size: 16, 16
Attack
xy: 0, 48
size: 16, 16
Attack
xy: 16, 48
size: 16, 16
Attack
xy: 32, 48
size: 16, 16
Attack
xy: 48, 48
size: 16, 16
Hit
xy: 0, 64
size: 16, 16
Hit
xy: 16, 64
size: 16, 16
Hit
xy: 32, 64
size: 16, 16
Hit
xy: 48, 64
size: 16, 16
Death
xy: 0, 80
size: 16, 16
Death
xy: 16, 80
size: 16, 16
Death
xy: 32, 80
size: 16, 16
Death
xy: 48, 80
size: 16, 16

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,68 @@
drossgrimnarch.png
size: 64,96
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 0, 0
size: 16, 16
Idle
xy: 0, 16
size: 16, 16
Idle
xy: 16, 16
size: 16, 16
Idle
xy: 32, 16
size: 16, 16
Idle
xy: 48, 16
size: 16, 16
Walk
xy: 0, 32
size: 16, 16
Walk
xy: 16, 32
size: 16, 16
Walk
xy: 32, 32
size: 16, 16
Walk
xy: 48, 32
size: 16, 16
Attack
xy: 0, 48
size: 16, 16
Attack
xy: 16, 48
size: 16, 16
Attack
xy: 32, 48
size: 16, 16
Attack
xy: 48, 48
size: 16, 16
Hit
xy: 0, 64
size: 16, 16
Hit
xy: 16, 64
size: 16, 16
Hit
xy: 32, 64
size: 16, 16
Hit
xy: 48, 64
size: 16, 16
Death
xy: 0, 80
size: 16, 16
Death
xy: 16, 80
size: 16, 16
Death
xy: 32, 80
size: 16, 16
Death
xy: 48, 80
size: 16, 16

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,53 @@
bat.png
size: 80,72
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 66, 1
size: 12, 9
Idle
xy: 0, 0
size: 16, 16
Idle
xy: 16, 0
size: 16, 16
Idle
xy: 32, 0
size: 16, 16
Idle
xy: 48, 0
size: 16, 16
Idle
xy: 64, 0
size: 16, 16
Walk
xy: 0, 24
size: 16, 16
Walk
xy: 16, 24
size: 16, 16
Walk
xy: 32, 24
size: 16, 16
Walk
xy: 48, 24
size: 16, 16
Walk
xy: 64, 24
size: 16, 16
Death
xy: 0, 50
size: 16, 20
Death
xy: 16, 50
size: 16, 20
Death
xy: 32, 50
size: 16, 20
Death
xy: 48, 50
size: 16, 20
Death
xy: 62, 50
size: 16, 20

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,56 +0,0 @@
crab.png
size: 128,128
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 41, 111
size: 15, 16
Idle
xy: 5,22
size: 22, 10
Idle
xy: 37, 22
size: 22, 10
Idle
xy: 69, 22
size: 22, 10
Idle
xy: 101, 22
size: 22, 10
Walk
xy: 6, 54
size: 22, 10
Walk
xy: 37, 54
size: 22, 10
Walk
xy: 69, 54
size: 22, 10
Walk
xy: 101, 54
size: 22, 10
Attack
xy: 0, 96
size: 32, 32
Attack
xy: 32, 96
size: 32, 32
Attack
xy: 64, 96
size: 32, 32
Attack
xy: 96, 96
size: 32, 32
Death
xy: 0, 64
size: 32, 32
Death
xy: 32, 64
size: 32, 32
Death
xy: 64, 64
size: 32, 32
Death
xy: 96, 64
size: 32, 32

View File

@@ -0,0 +1,86 @@
witch.png
size: 320,192
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 72,38
size: 16, 16
Idle
xy: 4, 7
size: 25, 25
Idle
xy: 36, 7
size: 25, 25
Idle
xy: 68, 7
size: 25, 25
Idle
xy: 100, 7
size: 25, 25
Walk
xy: 0, 160
size: 32, 32
Walk
xy: 32, 160
size: 32, 32
Walk
xy: 64, 160
size: 32, 32
Walk
xy: 96, 160
size: 32, 32
Attack
xy: 0, 68
size: 32, 28
Attack
xy: 32, 68
size: 32, 28
Attack
xy: 64, 68
size: 32, 28
Attack
xy: 96, 68
size: 32, 28
Attack
xy: 128, 68
size: 32, 28
Attack
xy: 160, 68
size: 32, 28
Attack
xy: 192, 68
size: 32, 28
Attack
xy: 224, 68
size: 32, 28
Death
xy: 4, 132
size: 25, 28
Death
xy: 36, 132
size: 25, 28
Death
xy: 68, 132
size: 25, 28
Death
xy: 100, 132
size: 25, 28
Death
xy: 132, 132
size: 25, 28
Death
xy: 164, 132
size: 25, 28
Death
xy: 196, 132
size: 25, 28
Death
xy: 228, 132
size: 25, 28
Death
xy: 260, 132
size: 25, 28
Death
xy: 292, 132
size: 25, 28

View File

@@ -1,44 +0,0 @@
frogboss.png
size: 86,600
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 23, 150
size: 45, 45
Idle
xy: 0, 0
size: 86, 50
Idle
xy: 0, 50
size: 86, 50
Idle
xy: 0, 100
size: 86, 50
Idle
xy: 0, 150
size: 86, 50
Idle
xy: 0, 200
size: 86, 50
Idle
xy: 0, 250
size: 86, 50
Walk
xy: 0, 300
size: 86, 50
Walk
xy: 0, 350
size: 86, 50
Walk
xy: 0, 400
size: 86, 50
Walk
xy: 0, 450
size: 86, 50
Walk
xy: 0, 500
size: 86, 50
Walk
xy: 0, 550
size: 86, 50

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -7,29 +7,50 @@ Avatar
xy: 278, 214
size: 22, 19
Idle
xy: 10,27
size: 38,37
xy: 10,0
size: 38,64
Idle
xy: 74,27
size: 38,37
xy: 74,0
size: 38,64
Idle
xy: 138,27
size: 38,37
xy: 138,0
size: 38,64
Idle
xy: 202,27
size: 38,37
xy: 202,0
size: 38,64
Idle
xy: 10,256
size: 38,64
Idle
xy: 74,256
size: 38,64
Idle
xy: 138,256
size: 38,64
Idle
xy: 202,256
size: 38,64
Idle
xy: 266,256
size: 38,64
Idle
xy: 330,256
size: 38,64
Idle
xy: 202,256
size: 38,64
Walk
xy: 0, 64
size: 64, 64
xy: 0, 89
size: 64, 39
Walk
xy: 64, 64
size: 64, 64
xy: 64, 89
size: 64, 39
Walk
xy: 128, 64
size: 64, 64
xy: 128, 89
size: 64, 39
Walk
xy: 192, 64
size: 64, 64
xy: 192, 89
size: 64, 39
Attack
xy: 0, 320
size: 64, 64

View File

@@ -14,10 +14,10 @@ Idle
size: 47, 35
Idle
xy: 138, 28
size: 46, 36
size: 47, 36
Idle
xy: 202, 28
size: 46, 36
size: 47, 36
Walk
xy: 8, 156
size: 46, 36
@@ -43,7 +43,7 @@ Walk
xy: 456, 156
size: 46, 36
Attack
xy: 0, 192
xy: 8, 192
size: 64, 64
Attack
xy: 64, 192

View File

@@ -1,20 +0,0 @@
oozeboss.png
size: 246,91
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 83,57
size: 34, 25
Idle
xy: 0, 0
size: 64, 40
Idle
xy: 64, 0
size: 64, 40
Idle
xy: 128, 0
size: 64, 40
Idle
xy: 192,0
size: 50, 40

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1,20 @@
sandelemental.png
size: 64,16
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 3, 0
size: 10, 10
Idle
xy: 0, 0
size: 16, 16
Idle
xy: 16, 00
size: 16, 16
Idle
xy: 32, 00
size: 16, 16
Idle
xy: 48, 00
size: 16, 16

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -0,0 +1,83 @@
sandwurm.png
size: 256,256
format: RGBA8888
filter: Nearest,Nearest
repeat: none
Avatar
xy: 103, 77
size: 16, 16
Idle
xy: 0, 12
size: 32, 20
Idle
xy: 32, 12
size: 32, 20
Idle
xy: 64, 12
size: 32, 20
Idle
xy: 96, 12
size: 32, 20
Idle
xy: 128, 12
size: 32, 20
Idle
xy: 160, 12
size: 32, 20
Idle
xy: 192, 12
size: 32, 20
Idle
xy: 224, 12
size: 32, 20
Walk
xy: 0, 39
size: 32, 25
Walk
xy: 32, 39
size: 32, 25
Walk
xy: 64, 39
size: 32, 25
Walk
xy: 96, 39
size: 32, 25
Walk
xy: 128, 39
size: 32, 25
Walk
xy: 160, 39
size: 32, 25
Walk
xy: 192, 39
size: 32, 25
Walk
xy: 224, 39
size: 32, 25
Attack
xy: 0, 70
size: 32, 26
Attack
xy: 32, 70
size: 32, 26
Attack
xy: 64, 70
size: 32, 26
Attack
xy: 96, 70
size: 32, 26
Death
xy: 0, 105
size: 32, 23
Death
xy: 32, 105
size: 32, 23
Death
xy: 64, 105
size: 32, 23
Death
xy: 96, 105
size: 32, 23
Death
xy: 128, 105
size: 32, 23

Some files were not shown because too many files have changed in this diff Show More