Merge branch 'Card-Forge:master' into enemies

This commit is contained in:
schnautzr
2023-07-04 13:02:47 -05:00
committed by GitHub
141 changed files with 3794 additions and 545 deletions

View File

@@ -2424,6 +2424,18 @@ public class ComputerUtil {
} }
} }
} }
} else if ("ProtectionFromType".equals(logic)) {
// TODO: protection vs. damage-dealing and milling instants/sorceries in low creature decks and the like?
// Maybe non-creature artifacts in certain cases?
List<String> choices = ImmutableList.of("Creature", "Planeswalker"); // types that make sense to get protected against
CardCollection evalList = new CardCollection();
evalList.addAll(ai.getOpponents().getCardsIn(ZoneType.Battlefield));
chosen = ComputerUtilCard.getMostProminentCardType(evalList, choices);
if (StringUtils.isEmpty(chosen)) {
chosen = "Creature"; // if in doubt, choose Creature, I guess
}
} }
else { else {
// Are we picking a type to reduce costs for that type? // Are we picking a type to reduce costs for that type?

View File

@@ -28,6 +28,7 @@ import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.AbilitySub; import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetRestrictions; import forge.game.spellability.TargetRestrictions;
import forge.game.staticability.StaticAbilityMustTarget; import forge.game.staticability.StaticAbilityMustTarget;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -116,6 +117,8 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (aiLogic != null) { if (aiLogic != null) {
if (aiLogic.equals("Always")) { if (aiLogic.equals("Always")) {
return true; return true;
} else if (aiLogic.startsWith("ExileSpell")) {
return doExileSpellLogic(aiPlayer, sa);
} else if (aiLogic.startsWith("SacAndUpgrade")) { // Birthing Pod, Natural Order, etc. } else if (aiLogic.startsWith("SacAndUpgrade")) { // Birthing Pod, Natural Order, etc.
return doSacAndUpgradeLogic(aiPlayer, sa); return doSacAndUpgradeLogic(aiPlayer, sa);
} else if (aiLogic.startsWith("SacAndRetFromGrave")) { // Recurring Nightmare, etc. } else if (aiLogic.startsWith("SacAndRetFromGrave")) { // Recurring Nightmare, etc.
@@ -2075,6 +2078,36 @@ public class ChangeZoneAi extends SpellAbilityAi {
} }
} }
private boolean doExileSpellLogic(final Player aiPlayer, final SpellAbility sa) {
String aiLogic = sa.getParamOrDefault("AILogic", "");
SpellAbilityStackInstance top = aiPlayer.getGame().getStack().peek();
List<ApiType> dangerousApi = Arrays.asList(ApiType.DealDamage, ApiType.DamageAll, ApiType.Destroy, ApiType.DestroyAll, ApiType.Sacrifice, ApiType.SacrificeAll);
int manaCost = 0;
int minCost = 0;
if (aiLogic.contains(".")) {
minCost = Integer.parseInt(aiLogic.substring(aiLogic.indexOf(".") + 1));
}
if (top != null) {
SpellAbility topSA = top.getSpellAbility(false);
if (topSA != null) {
if (topSA.getPayCosts().hasManaCost()) {
manaCost = topSA.getPayCosts().getTotalMana().getCMC();
}
if ((manaCost >= minCost || dangerousApi.contains(topSA.getApi()))
&& topSA.getActivatingPlayer().isOpponentOf(aiPlayer)
&& sa.canTargetSpellAbility(topSA)) {
sa.resetTargets();
sa.getTargets().add(topSA);
return sa.isTargetNumberValid();
}
}
}
return false;
}
private static CardCollection getSafeTargetsIfUnlessCostPaid(Player ai, SpellAbility sa, Iterable<Card> potentialTgts) { private static CardCollection getSafeTargetsIfUnlessCostPaid(Player ai, SpellAbility sa, Iterable<Card> potentialTgts) {
// Determines if the controller of each potential target can negate the ChangeZone effect // Determines if the controller of each potential target can negate the ChangeZone effect
// by paying the Unless cost. Returns the list of targets that can be saved that way. // by paying the Unless cost. Returns the list of targets that can be saved that way.

View File

@@ -114,13 +114,14 @@ public class SacrificeAi extends SpellAbilityAi {
} }
final String defined = sa.getParamOrDefault("Defined", "You"); final String defined = sa.getParamOrDefault("Defined", "You");
final String targeted = sa.getParamOrDefault("ValidTgts", "");
final String valid = sa.getParamOrDefault("SacValid", "Self"); final String valid = sa.getParamOrDefault("SacValid", "Self");
if (valid.equals("Self")) { if (valid.equals("Self")) {
// Self Sacrifice. // Self Sacrifice.
} else if (defined.equals("Player") } else if (defined.equals("Player") || targeted.equals("Player") || targeted.equals("Opponent")
|| ((defined.equals("Player.Opponent") || defined.equals("Opponent")) && !sa.isTrigger())) { || ((defined.equals("Player.Opponent") || defined.equals("Opponent")) && !sa.isTrigger())) {
// is either "Defined$ Player.Opponent" or "Defined$ Opponent" obsolete? // is either "Defined$ Player.Opponent" or "Defined$ Opponent" obsolete?
// If Sacrifice hits both players: // If Sacrifice hits both players:
// Only cast it if Human has the full amount of valid // Only cast it if Human has the full amount of valid
// Only cast it if AI doesn't have the full amount of Valid // Only cast it if AI doesn't have the full amount of Valid

View File

@@ -141,7 +141,7 @@ public class CostPutCounter extends CostPartWithList {
public final boolean canPay(final SpellAbility ability, final Player payer, final boolean effect) { public final boolean canPay(final SpellAbility ability, final Player payer, final boolean effect) {
final Card source = ability.getHostCard(); final Card source = ability.getHostCard();
if (this.payCostFromSource()) { if (this.payCostFromSource()) {
return source.isInPlay() && source.canReceiveCounters(this.counter); return source.isInPlay() && (getAbilityAmount(ability) == 0 || source.canReceiveCounters(this.counter));
} }
// 3 Cards have Put a -1/-1 Counter on a Creature you control. // 3 Cards have Put a -1/-1 Counter on a Creature you control.

View File

@@ -104,6 +104,7 @@ public class Forge implements ApplicationListener {
public static boolean isTabletDevice = false; public static boolean isTabletDevice = false;
public static String locale = "en-US"; public static String locale = "en-US";
public Assets assets; public Assets assets;
private ForgePreferences forgePreferences;
public static boolean hdbuttons = false; public static boolean hdbuttons = false;
public static boolean hdstart = false; public static boolean hdstart = false;
public static boolean isPortraitMode = false; public static boolean isPortraitMode = false;
@@ -145,6 +146,11 @@ public class Forge implements ApplicationListener {
private Forge() { private Forge() {
} }
private ForgePreferences getForgePreferences() {
if (forgePreferences == null)
forgePreferences = new ForgePreferences();
return forgePreferences;
}
public static Localizer getLocalizer() { public static Localizer getLocalizer() {
if (localizer == null) if (localizer == null)
localizer = Localizer.getInstance(); localizer = Localizer.getInstance();
@@ -179,33 +185,38 @@ public class Forge implements ApplicationListener {
*/ */
Gdx.input.setCatchKey(Keys.BACK, true); Gdx.input.setCatchKey(Keys.BACK, true);
destroyThis = true; //Prevent back() destroyThis = true; //Prevent back()
ForgePreferences prefs = new ForgePreferences();
if (Files.exists(Paths.get(ForgeConstants.DEFAULT_SKINS_DIR+ForgeConstants.ADV_TEXTURE_BG_FILE))) if (Files.exists(Paths.get(ForgeConstants.DEFAULT_SKINS_DIR+ForgeConstants.ADV_TEXTURE_BG_FILE)))
selector = prefs.getPref(FPref.UI_SELECTOR_MODE); selector = getForgePreferences().getPref(FPref.UI_SELECTOR_MODE);
boolean landscapeMode = GuiBase.isAndroid() ? !isPortraitMode : screenWidth > screenHeight;
//update landscape mode preference if it doesn't match what the app loaded as
if (getForgePreferences().getPrefBoolean(FPref.UI_LANDSCAPE_MODE) != landscapeMode) {
getForgePreferences().setPref(FPref.UI_LANDSCAPE_MODE, landscapeMode);
getForgePreferences().save();
}
String skinName; String skinName;
if (FileUtil.doesFileExist(ForgeConstants.MAIN_PREFS_FILE)) { if (FileUtil.doesFileExist(ForgeConstants.MAIN_PREFS_FILE)) {
skinName = prefs.getPref(FPref.UI_SKIN); skinName = getForgePreferences().getPref(FPref.UI_SKIN);
} else { } else {
skinName = "default"; //use default skin if preferences file doesn't exist yet skinName = "default"; //use default skin if preferences file doesn't exist yet
} }
FSkin.loadLight(skinName, splashScreen); FSkin.loadLight(skinName, splashScreen);
textureFiltering = prefs.getPrefBoolean(FPref.UI_LIBGDX_TEXTURE_FILTERING); textureFiltering = getForgePreferences().getPrefBoolean(FPref.UI_LIBGDX_TEXTURE_FILTERING);
showFPS = prefs.getPrefBoolean(FPref.UI_SHOW_FPS); showFPS = getForgePreferences().getPrefBoolean(FPref.UI_SHOW_FPS);
autoAIDeckSelection = prefs.getPrefBoolean(FPref.UI_AUTO_AIDECK_SELECTION); autoAIDeckSelection = getForgePreferences().getPrefBoolean(FPref.UI_AUTO_AIDECK_SELECTION);
altPlayerLayout = prefs.getPrefBoolean(FPref.UI_ALT_PLAYERINFOLAYOUT); altPlayerLayout = getForgePreferences().getPrefBoolean(FPref.UI_ALT_PLAYERINFOLAYOUT);
altZoneTabs = prefs.getPrefBoolean(FPref.UI_ALT_PLAYERZONETABS); altZoneTabs = getForgePreferences().getPrefBoolean(FPref.UI_ALT_PLAYERZONETABS);
animatedCardTapUntap = prefs.getPrefBoolean(FPref.UI_ANIMATED_CARD_TAPUNTAP); animatedCardTapUntap = getForgePreferences().getPrefBoolean(FPref.UI_ANIMATED_CARD_TAPUNTAP);
enableUIMask = prefs.getPref(FPref.UI_ENABLE_BORDER_MASKING); enableUIMask = getForgePreferences().getPref(FPref.UI_ENABLE_BORDER_MASKING);
if (prefs.getPref(FPref.UI_ENABLE_BORDER_MASKING).equals("true")) //override old settings if not updated if (getForgePreferences().getPref(FPref.UI_ENABLE_BORDER_MASKING).equals("true")) //override old settings if not updated
enableUIMask = "Full"; enableUIMask = "Full";
else if (prefs.getPref(FPref.UI_ENABLE_BORDER_MASKING).equals("false")) else if (getForgePreferences().getPref(FPref.UI_ENABLE_BORDER_MASKING).equals("false"))
enableUIMask = "Off"; enableUIMask = "Off";
enablePreloadExtendedArt = prefs.getPrefBoolean(FPref.UI_ENABLE_PRELOAD_EXTENDED_ART); enablePreloadExtendedArt = getForgePreferences().getPrefBoolean(FPref.UI_ENABLE_PRELOAD_EXTENDED_ART);
locale = prefs.getPref(FPref.UI_LANGUAGE); locale = getForgePreferences().getPref(FPref.UI_LANGUAGE);
autoCache = prefs.getPrefBoolean(FPref.UI_AUTO_CACHE_SIZE); autoCache = getForgePreferences().getPrefBoolean(FPref.UI_AUTO_CACHE_SIZE);
disposeTextures = prefs.getPrefBoolean(FPref.UI_ENABLE_DISPOSE_TEXTURES); disposeTextures = getForgePreferences().getPrefBoolean(FPref.UI_ENABLE_DISPOSE_TEXTURES);
CJK_Font = prefs.getPref(FPref.UI_CJK_FONT); CJK_Font = getForgePreferences().getPref(FPref.UI_CJK_FONT);
if (autoCache) { if (autoCache) {
//increase cacheSize for devices with RAM more than 5GB, default is 300. Some phones have more than 10GB RAM (Mi 10, OnePlus 8, S20, etc..) //increase cacheSize for devices with RAM more than 5GB, default is 300. Some phones have more than 10GB RAM (Mi 10, OnePlus 8, S20, etc..)
@@ -379,12 +390,6 @@ public class Forge implements ApplicationListener {
//adjust height modifier //adjust height modifier
adjustHeightModifier(getScreenWidth(), getScreenHeight()); adjustHeightModifier(getScreenWidth(), getScreenHeight());
//update landscape mode preference if it doesn't match what the app loaded as
if (FModel.getPreferences().getPrefBoolean(FPref.UI_LANDSCAPE_MODE) != isLandscapeMode()) {
FModel.getPreferences().setPref(FPref.UI_LANDSCAPE_MODE, isLandscapeMode());
FModel.getPreferences().save();
}
FThreads.invokeInBackgroundThread(() -> FThreads.invokeInEdtLater(() -> { FThreads.invokeInBackgroundThread(() -> FThreads.invokeInEdtLater(() -> {
//load skin full //load skin full
FSkin.loadFull(splashScreen); FSkin.loadFull(splashScreen);

View File

@@ -305,7 +305,7 @@ public class DuelScene extends ForgeScene {
} else if (this.eventData != null){ } else if (this.eventData != null){
deck = eventData.nextOpponent.getDeck(); deck = eventData.nextOpponent.getDeck();
} else { } else {
deck = currentEnemy.copyPlayerDeck ? this.playerDeck : currentEnemy.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().getDifficulty().name.equalsIgnoreCase("Hard")); deck = currentEnemy.copyPlayerDeck ? this.playerDeck : currentEnemy.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().getDifficulty().name.equalsIgnoreCase("Insane") || Current.player().getDifficulty().name.equalsIgnoreCase("Hard"));
} }
RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(playerCount, appliedVariants, deck, null, false, null, null); RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(playerCount, appliedVariants, deck, null, false, null, null);

View File

@@ -109,6 +109,7 @@ public class MapViewScene extends UIScene {
TextraButton questButton = ui.findActor("quest"); TextraButton questButton = ui.findActor("quest");
if (questButton != null) { if (questButton != null) {
questButton.setDisabled(labels.isEmpty()); questButton.setDisabled(labels.isEmpty());
questButton.setVisible(!labels.isEmpty());
} }
super.enter(); super.enter();
} }

View File

@@ -30,7 +30,6 @@ import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
* Scene to handle settings of the base forge and adventure mode * Scene to handle settings of the base forge and adventure mode
*/ */
public class SettingsScene extends UIScene { public class SettingsScene extends UIScene {
static public ForgePreferences Preference;
private final Table settingGroup; private final Table settingGroup;
TextraButton backButton; TextraButton backButton;
//TextraButton newPlane; //TextraButton newPlane;
@@ -99,9 +98,6 @@ public class SettingsScene extends UIScene {
super(Forge.isLandscapeMode() ? "ui/settings.json" : "ui/settings_portrait.json"); super(Forge.isLandscapeMode() ? "ui/settings.json" : "ui/settings_portrait.json");
settingGroup = new Table(); settingGroup = new Table();
if (Preference == null) {
Preference = FModel.getPreferences();
}
//temporary disable custom world until it works correctly on each update //temporary disable custom world until it works correctly on each update
/*selectSourcePlane = Controls.newComboBox(); /*selectSourcePlane = Controls.newComboBox();
newPlaneName = Controls.newTextField(""); newPlaneName = Controls.newTextField("");
@@ -131,10 +127,10 @@ public class SettingsScene extends UIScene {
mode = "720p"; mode = "720p";
Graphics.setVideoMode(mode); Graphics.setVideoMode(mode);
//update preference for classic mode if needed //update
if (Preference.getPref(ForgePreferences.FPref.UI_VIDEO_MODE).equals(mode)) { if (!FModel.getPreferences().getPref(ForgePreferences.FPref.UI_VIDEO_MODE).equalsIgnoreCase(mode)) {
Preference.setPref(ForgePreferences.FPref.UI_VIDEO_MODE, mode); FModel.getPreferences().setPref(ForgePreferences.FPref.UI_VIDEO_MODE, mode);
Preference.save(); FModel.getPreferences().save();
} }
return null; return null;
}); });
@@ -194,10 +190,8 @@ public class SettingsScene extends UIScene {
Config.instance().getSettingData().fullScreen = value; Config.instance().getSettingData().fullScreen = value;
Config.instance().saveSettings(); Config.instance().saveSettings();
//update //update
if (Preference.getPrefBoolean(ForgePreferences.FPref.UI_FULLSCREEN_MODE) != value) { FModel.getPreferences().setPref(ForgePreferences.FPref.UI_FULLSCREEN_MODE, Config.instance().getSettingData().fullScreen);
Preference.setPref(ForgePreferences.FPref.UI_LANDSCAPE_MODE, value); FModel.getPreferences().save();
Preference.save();
}
} }
}); });
} }
@@ -237,16 +231,18 @@ public class SettingsScene extends UIScene {
addCheckBox(Forge.getLocalizer().getMessage("lblLandscapeMode"), ForgePreferences.FPref.UI_LANDSCAPE_MODE); addCheckBox(Forge.getLocalizer().getMessage("lblLandscapeMode"), ForgePreferences.FPref.UI_LANDSCAPE_MODE);
addCheckBox(Forge.getLocalizer().getMessage("lblAnimatedCardTapUntap"), ForgePreferences.FPref.UI_ANIMATED_CARD_TAPUNTAP); addCheckBox(Forge.getLocalizer().getMessage("lblAnimatedCardTapUntap"), ForgePreferences.FPref.UI_ANIMATED_CARD_TAPUNTAP);
if (!GuiBase.isAndroid()) { if (!GuiBase.isAndroid()) {
final String[] item = {Preference.getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING)}; final String[] item = {FModel.getPreferences().getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING)};
SelectBox<String> borderMask = Controls.newComboBox(new String[]{"Off", "Crop", "Full", "Art"}, item[0], o -> { SelectBox<String> borderMask = Controls.newComboBox(new String[]{"Off", "Crop", "Full", "Art"}, item[0], o -> {
String mode = (String) o; String mode = (String) o;
if (mode == null) if (mode == null)
mode = "Crop"; mode = "Crop";
item[0] = mode; item[0] = mode;
//update preference for classic mode if needed //update
Preference.setPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING, mode); if (!FModel.getPreferences().getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING).equalsIgnoreCase(mode)) {
Preference.save(); FModel.getPreferences().setPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING, mode);
Forge.enableUIMask = Preference.getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING); FModel.getPreferences().save();
Forge.enableUIMask = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING);
}
ImageCache.clearGeneratedCards(); ImageCache.clearGeneratedCards();
ImageCache.disposeTextures(); ImageCache.disposeTextures();
return null; return null;
@@ -277,12 +273,12 @@ public class SettingsScene extends UIScene {
private void addInputField(String name, ForgePreferences.FPref pref) { private void addInputField(String name, ForgePreferences.FPref pref) {
TextField box = Controls.newTextField(""); TextField box = Controls.newTextField("");
box.setText(Preference.getPref(pref)); box.setText(FModel.getPreferences().getPref(pref));
box.addListener(new ChangeListener() { box.addListener(new ChangeListener() {
@Override @Override
public void changed(ChangeEvent event, Actor actor) { public void changed(ChangeEvent event, Actor actor) {
Preference.setPref(pref, ((TextField) actor).getText()); FModel.getPreferences().setPref(pref, ((TextField) actor).getText());
Preference.save(); FModel.getPreferences().save();
} }
}); });
@@ -292,12 +288,12 @@ public class SettingsScene extends UIScene {
private void addCheckBox(String name, ForgePreferences.FPref pref) { private void addCheckBox(String name, ForgePreferences.FPref pref) {
CheckBox box = Controls.newCheckBox(""); CheckBox box = Controls.newCheckBox("");
box.setChecked(Preference.getPrefBoolean(pref)); box.setChecked(FModel.getPreferences().getPrefBoolean(pref));
box.addListener(new ChangeListener() { box.addListener(new ChangeListener() {
@Override @Override
public void changed(ChangeEvent event, Actor actor) { public void changed(ChangeEvent event, Actor actor) {
Preference.setPref(pref, ((CheckBox) actor).isChecked()); FModel.getPreferences().setPref(pref, ((CheckBox) actor).isChecked());
Preference.save(); FModel.getPreferences().save();
} }
}); });
@@ -307,12 +303,12 @@ public class SettingsScene extends UIScene {
private void addSettingSlider(String name, ForgePreferences.FPref pref, int min, int max) { private void addSettingSlider(String name, ForgePreferences.FPref pref, int min, int max) {
Slider slide = Controls.newSlider(min, max, 1, false); Slider slide = Controls.newSlider(min, max, 1, false);
slide.setValue(Preference.getPrefInt(pref)); slide.setValue(FModel.getPreferences().getPrefInt(pref));
slide.addListener(new ChangeListener() { slide.addListener(new ChangeListener() {
@Override @Override
public void changed(ChangeEvent event, Actor actor) { public void changed(ChangeEvent event, Actor actor) {
Preference.setPref(pref, String.valueOf((int) ((Slider) actor).getValue())); FModel.getPreferences().setPref(pref, String.valueOf((int) ((Slider) actor).getValue()));
Preference.save(); FModel.getPreferences().save();
if (ForgePreferences.FPref.UI_VOL_MUSIC.equals(pref)) if (ForgePreferences.FPref.UI_VOL_MUSIC.equals(pref))
SoundSystem.instance.refreshVolume(); SoundSystem.instance.refreshVolume();
} }

View File

@@ -10,6 +10,7 @@ import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.*; import com.badlogic.gdx.scenes.scene2d.*;
import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction;
import com.badlogic.gdx.scenes.scene2d.ui.*; import com.badlogic.gdx.scenes.scene2d.ui.*;
import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener; import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
@@ -22,6 +23,7 @@ import com.github.tommyettinger.textra.TextraButton;
import com.github.tommyettinger.textra.TextraLabel; import com.github.tommyettinger.textra.TextraLabel;
import com.github.tommyettinger.textra.TypingLabel; import com.github.tommyettinger.textra.TypingLabel;
import forge.Forge; import forge.Forge;
import forge.adventure.character.CharacterSprite;
import forge.adventure.data.AdventureQuestData; import forge.adventure.data.AdventureQuestData;
import forge.adventure.data.ItemData; import forge.adventure.data.ItemData;
import forge.adventure.player.AdventurePlayer; import forge.adventure.player.AdventurePlayer;
@@ -342,6 +344,7 @@ public class GameHUD extends Stage {
} }
//unequip and reequip abilities //unequip and reequip abilities
updateAbility(); updateAbility();
restorePlayerCollision();
if (openMapActor != null) { if (openMapActor != null) {
String val = "[%80]" + Forge.getLocalizer().getMessageorUseDefault("lblZoom", "Zoom"); String val = "[%80]" + Forge.getLocalizer().getMessageorUseDefault("lblZoom", "Zoom");
for (AdventureQuestData adq: Current.player().getQuests()) { for (AdventureQuestData adq: Current.player().getQuests()) {
@@ -487,12 +490,17 @@ public class GameHUD extends Stage {
private void setAudio(MusicPlaylist playlist) { private void setAudio(MusicPlaylist playlist) {
if (playlist.equals(currentAudioPlaylist)) if (playlist.equals(currentAudioPlaylist))
return; return;
System.out.println("Playlist: "+playlist);
unloadAudio(); unloadAudio();
System.out.println("Playlist: "+playlist);
audio = getMusic(playlist); audio = getMusic(playlist);
} }
private Pair<FileHandle, Music> getMusic(MusicPlaylist playlist) { private Pair<FileHandle, Music> getMusic(MusicPlaylist playlist) {
FileHandle file = Gdx.files.absolute(playlist.getNewRandomFilename()); String filename = playlist.getNewRandomFilename();
if (filename == null)
return null;
FileHandle file = Gdx.files.absolute(filename);
Music music = Forge.getAssets().getMusic(file); Music music = Forge.getAssets().getMusic(file);
if (music != null) { if (music != null) {
currentAudioPlaylist = playlist; currentAudioPlaylist = playlist;
@@ -673,8 +681,10 @@ public class GameHUD extends Stage {
} }
public void playerIdle() { public void playerIdle() {
if (MapStage.getInstance().isInMap()) { if (MapStage.getInstance().isInMap()) {
MapStage.getInstance().startPause(1f);
MapStage.getInstance().getPlayerSprite().stop(); MapStage.getInstance().getPlayerSprite().stop();
} else { } else {
WorldStage.getInstance().startPause(1f);
WorldStage.getInstance().getPlayerSprite().stop(); WorldStage.getInstance().getPlayerSprite().stop();
} }
} }
@@ -771,7 +781,7 @@ public class GameHUD extends Stage {
changeBGM(MusicPlaylist.WHITE); changeBGM(MusicPlaylist.WHITE);
break; break;
case "waste": case "waste":
changeBGM(MusicPlaylist.MENUS); changeBGM(MusicPlaylist.COLORLESS);
break; break;
default: default:
break; break;
@@ -783,4 +793,25 @@ public class GameHUD extends Stage {
SoundSystem.instance.setBackgroundMusic(playlist); SoundSystem.instance.setBackgroundMusic(playlist);
} }
} }
void flicker(CharacterSprite sprite) {
if (sprite.getCollisionHeight() == 0f) {
SequenceAction flicker = new SequenceAction(Actions.fadeOut(0.25f), Actions.fadeIn(0.25f), Actions.fadeOut(0.25f), Actions.fadeIn(0.25f), new Action() {
@Override
public boolean act(float v) {
Timer.schedule(new Timer.Task() {
@Override
public void run() {
sprite.resetCollisionHeight();
}
}, 0.5f);
return true;
}
});
sprite.addAction(flicker);
}
}
void restorePlayerCollision() {
flicker(MapStage.getInstance().getPlayerSprite());
flicker(WorldStage.getInstance().getPlayerSprite());
}
} }

View File

@@ -1126,6 +1126,7 @@ public class MapStage extends GameStage {
if (Controllers.getCurrent() != null && Controllers.getCurrent().canVibrate()) if (Controllers.getCurrent() != null && Controllers.getCurrent().canVibrate())
Controllers.getCurrent().startVibration(duration, 1); Controllers.getCurrent().startVibration(duration, 1);
Forge.restrictAdvMenus = true; Forge.restrictAdvMenus = true;
player.clearCollisionHeight();
startPause(0.8f, () -> { startPause(0.8f, () -> {
Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2"); Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2");
SoundSystem.instance.play(SoundEffectType.ManaBurn, false); SoundSystem.instance.play(SoundEffectType.ManaBurn, false);

View File

@@ -117,6 +117,7 @@ public class WorldStage extends GameStage implements SaveFileContent {
if (Controllers.getCurrent() != null && Controllers.getCurrent().canVibrate()) if (Controllers.getCurrent() != null && Controllers.getCurrent().canVibrate())
Controllers.getCurrent().startVibration(duration, 1); Controllers.getCurrent().startVibration(duration, 1);
Forge.restrictAdvMenus = true; Forge.restrictAdvMenus = true;
player.clearCollisionHeight();
startPause(0.8f, () -> { startPause(0.8f, () -> {
Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2"); Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2");
SoundSystem.instance.play(SoundEffectType.ManaBurn, false); SoundSystem.instance.play(SoundEffectType.ManaBurn, false);
@@ -347,7 +348,6 @@ public class WorldStage extends GameStage implements SaveFileContent {
setBounds(WorldSave.getCurrentSave().getWorld().getWidthInPixels(), WorldSave.getCurrentSave().getWorld().getHeightInPixels()); setBounds(WorldSave.getCurrentSave().getWorld().getWidthInPixels(), WorldSave.getCurrentSave().getWorld().getHeightInPixels());
GridPoint2 pos = background.translateFromWorldToChunk(player.getX(), player.getY()); GridPoint2 pos = background.translateFromWorldToChunk(player.getX(), player.getY());
background.loadChunk(pos.x, pos.y); background.loadChunk(pos.x, pos.y);
handlePointsOfInterestCollision();
} }
@Override @Override

View File

@@ -15,7 +15,7 @@
"maxRoadDistance": 1000, "maxRoadDistance": 1000,
"biomesNames": [ "biomesNames": [
"world/biomes/base.json", "world/biomes/base.json",
"world/biomes/waste.json", "world/biomes/colorless.json",
"world/biomes/white.json", "world/biomes/white.json",
"world/biomes/blue.json", "world/biomes/blue.json",
"world/biomes/black.json", "world/biomes/black.json",

Binary file not shown.

View File

@@ -23,11 +23,8 @@
"height": 0.7, "height": 0.7,
"color": "110903", "color": "110903",
"spriteNames": [ "spriteNames": [
"SwampTree",
"SwampTree2",
"DarkGras", "DarkGras",
"Skull", "Skull",
"SwampRock",
"DarkWood", "DarkWood",
"Reed", "Reed",
"Waterlily", "Waterlily",
@@ -120,22 +117,46 @@
"N": 2, "N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/black_structures.atlas",
"sourcePath": "world/models/swamp_forest.png", "sourcePath": "world/structures/models/black.png",
"maskPath": "world/masks/ring.png", "maskPath": "world/structures/masks/ring.png",
"height": 0.5, "height": 0.5,
"width": 0.5, "width": 0.5,
"symmetry": 8, "symmetry": 8,
"periodicOutput": false,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "swamp_forest", "name": "water",
"color": "007000", "color": "00ffff",
"collision": true "collision": true
}, },
{ {
"name": "swamp_water", "name": "tree",
"color": "005050", "color": "004000",
"collision": true
},
{
"name": "tree2",
"color": "008000",
"collision": true
},
{
"name": "tree3",
"color": "ff00ff",
"collision": true
},
{
"name": "tree4",
"color": "00f000",
"collision": true
},
{
"name": "rock",
"color": "808080",
"collision": true
},
{
"name": "rock2",
"color": "ff0000",
"collision": true "collision": true
} }
] ]
@@ -144,27 +165,41 @@
"N": 2, "N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/black_structures.atlas",
"sourcePath": "world/models/swamp_ruins.png", "sourcePath": "world/structures/models/black.png",
"maskPath": "world/masks/circle.png", "maskPath": "world/structures/masks/circle.png",
"height": 0.20000002, "height": 0.20000002,
"width": 0.20000002, "width": 0.20000002,
"symmetry": 1, "symmetry": 8,
"periodicOutput": false,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "deep_swamp", "name": "muck",
"color": "002000", "color": "00ffff",
"collision": true "collision": true
}, },
{ {
"name": "structure", "name": "dead_tree",
"color": "505050", "color": "004000",
"collision": true "collision": true
}, },
{ {
"name": "swamp_forest2", "name": "dead_tree2",
"color": "007000", "color": "008000",
"collision": true
},
{
"name": "dead_tree3",
"color": "ff00ff",
"collision": true
},
{
"name": "rock",
"color": "808080",
"collision": true
},
{
"name": "rock2",
"color": "ff0000",
"collision": true "collision": true
} }
] ]

View File

@@ -23,8 +23,6 @@
"height": 0.7, "height": 0.7,
"color": "10a2e0", "color": "10a2e0",
"spriteNames": [ "spriteNames": [
"IslandTree",
"Coral",
"Shell" "Shell"
], ],
"enemies": [ "enemies": [
@@ -108,47 +106,93 @@
], ],
"structures": [ "structures": [
{ {
"N":2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/blue_structures.atlas",
"sourcePath": "world/models/water.png", "sourcePath": "world/structures/models/blue.png",
"maskPath": "world/masks/circle.png", "maskPath": "world/structures/masks/circle.png",
"height": 0.20000002, "height": 0.1,
"width": 0.20000002, "width": 0.1,
"symmetry": 8, "symmetry": 8,
"periodicOutput": false, "periodicOutput": false,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "water", "name": "water",
"color": "0070a0", "color": "00ffff",
"collision": true "collision": true
}, },
{ {
"name": "island_forest", "name": "tree",
"color": "00a000", "color": "00ff00",
"collision": true
},
{
"name": "tree2",
"color": "008000",
"collision": true
},
{
"name": "pineapple",
"color": "ffff00",
"collision": true
},
{
"name": "rock",
"color": "ff8000",
"collision": true
},
{
"name": "rock2",
"color": "804000",
"collision": true
},
{
"name": "rock3",
"color": "402000",
"collision": true
},
{
"name": "rock4",
"color": "201000",
"collision": true "collision": true
} }
] ]
}, },
{ {
"N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/blue_structures.atlas",
"sourcePath": "world/models/island_forest.png", "sourcePath": "world/structures/models/beach.png",
"maskPath": "world/masks/ring.png", "maskPath": "world/structures/masks/ring.png",
"height": 0.5, "height": 0.5,
"width": 0.5, "width": 0.5,
"symmetry": 8, "symmetry": 8,
"periodicOutput": false,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "water", "name": "water",
"color": "0070a0", "color": "00ffff",
"collision": true "collision": true
}, },
{ {
"name": "island_forest", "name": "tree",
"color": "00a000", "color": "00ff00",
"collision": true
},
{
"name": "tree2",
"color": "008000",
"collision": true
},
{
"name": "dune",
"color": "ff8000",
"collision": true
},
{
"name": "dune2",
"color": "402000",
"collision": true "collision": true
} }
] ]

View File

@@ -5,15 +5,15 @@
"distWeight": 1, "distWeight": 1,
"name": "waste", "name": "waste",
"tilesetAtlas": "world/tilesets/terrain.atlas", "tilesetAtlas": "world/tilesets/terrain.atlas",
"tilesetName": "Waste", "tilesetName": "Colorless",
"terrain": [ "terrain": [
{ {
"spriteName": "Waste_1", "spriteName": "Colorless_1",
"max": 0.2, "max": 0.2,
"resolution": 5 "resolution": 5
}, },
{ {
"spriteName": "Waste_2", "spriteName": "Colorless_2",
"min": 0.8, "min": 0.8,
"max": 1, "max": 1,
"resolution": 5 "resolution": 5
@@ -23,9 +23,7 @@
"height": 0.85, "height": 0.85,
"color": "aeaeae", "color": "aeaeae",
"spriteNames": [ "spriteNames": [
"WasteTree", "Stone"
"Stone",
"WasteRock"
], ],
"enemies": [ "enemies": [
"Adept Black Wizard", "Adept Black Wizard",
@@ -118,44 +116,94 @@
"N": 2, "N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/colorless_structures.atlas",
"sourcePath": "world/models/waste_structure.png", "sourcePath": "world/structures/models/colorless.png",
"maskPath": "world/masks/circle.png", "maskPath": "world/structures/masks/circle.png",
"periodicInput": false, "height": 0.25,
"height": 0.20000002, "width": 0.25,
"width": 0.20000002, "symmetry": 8,
"symmetry": 4,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "waste_structure", "name": "crater",
"color": "444444", "color": "808080",
"collision": true "collision": true
}, },
{ {
"name": "waste_mountain", "name": "tree",
"color": "9a9a9a", "color": "ff0000",
"collision": true
},
{
"name": "tree2",
"color": "00ff00",
"collision": true
},
{
"name": "tree3",
"color": "0000ff",
"collision": true
},
{
"name": "tree4",
"color": "00ffff",
"collision": true
},
{
"name": "rock",
"color": "ff00ff",
"collision": true
},
{
"name": "mountain",
"color": "000000",
"collision": true "collision": true
} }
] ]
}, },
{ {
"N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/colorless_structures.atlas",
"sourcePath": "world/models/hole.png", "sourcePath": "world/structures/models/colorless.png",
"maskPath": "world/masks/ring.png", "maskPath": "world/structures/masks/ring.png",
"height": 0.5, "height": 0.5,
"width": 0.5, "width": 0.5,
"periodicOutput": false, "symmetry": 8,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "hole", "name": "hole",
"color": "111111", "color": "808080",
"collision": true "collision": true
}, },
{ {
"name": "waste_mountain", "name": "tree",
"color": "9a9a9a", "color": "ff0000",
"collision": true
},
{
"name": "tree2",
"color": "00ff00",
"collision": true
},
{
"name": "tree3",
"color": "0000ff",
"collision": true
},
{
"name": "tree4",
"color": "00ffff",
"collision": true
},
{
"name": "rock",
"color": "ff00ff",
"collision": true
},
{
"name": "mountain",
"color": "000000",
"collision": true "collision": true
} }
] ]

View File

@@ -23,9 +23,6 @@
"height": 0.7, "height": 0.7,
"color": "59a650", "color": "59a650",
"spriteNames": [ "spriteNames": [
"WoodTree",
"WoodTree2",
"Bush",
"Stump", "Stump",
"Moss", "Moss",
"Stone", "Stone",
@@ -122,39 +119,66 @@
"N": 2, "N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/green_structures.atlas",
"sourcePath": "world/models/forest.png", "sourcePath": "world/structures/models/green.png",
"maskPath": "world/masks/circle.png", "maskPath": "world/structures/masks/circle.png",
"height": 0.20000002, "height": 0.5,
"width": 0.20000002, "width": 0.5,
"symmetry": 1, "symmetry": 1,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "forest", "name": "water",
"color": "007000", "color": "000080",
"collision": true
}
]
},
{
"N": 2,
"x": 0.5,
"y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas",
"sourcePath": "world/models/lake.png",
"maskPath": "world/masks/ring.png",
"height": 0.5,
"width": 0.5,
"periodicOutput": false,
"mappingInfo": [
{
"name": "lake",
"color": "0070a0",
"collision": true "collision": true
}, },
{ {
"name": "forest2", "name": "tree",
"color": "009000", "color": "008000",
"collision": true
},
{
"name": "tree2",
"color": "004000",
"collision": true
},
{
"name": "vine",
"color": "8080ff",
"collision": true
},
{
"name": "tree3",
"color": "00c000",
"collision": true
},
{
"name": "tree4",
"color": "00f000",
"collision": true
},
{
"name": "tree5",
"color": "006000",
"collision": true
},
{
"name": "rock",
"color": "808080",
"collision": true
},
{
"name": "mountain",
"color": "ff0000",
"collision": true
},
{
"name": "plant",
"color": "800000",
"collision": true
},
{
"name": "bush",
"color": "ff8080",
"collision": true "collision": true
} }
] ]

View File

@@ -23,8 +23,7 @@
"height": 1, "height": 1,
"color": "110903", "color": "110903",
"spriteNames": [ "spriteNames": [
"Skull", "Skull"
"PlainsRock"
], ],
"enemies": [ "enemies": [
"Ammit", "Ammit",
@@ -60,9 +59,9 @@
"N": 2, "N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/structures.atlas",
"sourcePath": "world/models/mountain.png", "sourcePath": "world/structures/models/mountain.png",
"maskPath": "world/masks/circle.png", "maskPath": "world/structures/masks/circle.png",
"height": 0.5, "height": 0.5,
"width": 0.5, "width": 0.5,
"symmetry": 8, "symmetry": 8,

View File

@@ -31,7 +31,7 @@
"N": 2, "N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/structures.atlas",
"sourcePath": "world/models/fill.png", "sourcePath": "world/models/fill.png",
"maskPath": "world/masks/fill.png", "maskPath": "world/masks/fill.png",
"height": 0.99, "height": 0.99,

View File

@@ -45,9 +45,9 @@
"N": 2, "N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/structures.atlas",
"sourcePath": "world/models/mountain.png", "sourcePath": "world/structures/models/mountain.png",
"maskPath": "world/masks/circle.png", "maskPath": "world/structures/masks/circle.png",
"height": 0.5, "height": 0.5,
"width": 0.5, "width": 0.5,
"periodicOutput": false, "periodicOutput": false,

View File

@@ -23,9 +23,6 @@
"height": 0.7, "height": 0.7,
"color": "b63729", "color": "b63729",
"spriteNames": [ "spriteNames": [
"MountainTree",
"MountainTree2",
"MountainRock",
"Gravel" "Gravel"
], ],
"enemies": [ "enemies": [
@@ -127,21 +124,41 @@
"N": 2, "N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/red_structures.atlas",
"sourcePath": "world/models/mountain.png", "sourcePath": "world/structures/models/red.png",
"maskPath": "world/masks/ring.png", "maskPath": "world/structures/masks/ring.png",
"height": 0.5, "height": 0.5,
"width": 0.5, "width": 0.5,
"periodicOutput": false, "symmetry": 8,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "mountain", "name": "mountain",
"color": "a07020", "color": "ff0000",
"collision": true "collision": true
}, },
{ {
"name": "mountain_forest", "name": "tree",
"color": "007000", "color": "00ff00",
"collision": true
},
{
"name": "tree2",
"color": "00ffff",
"collision": true
},
{
"name": "tree3",
"color": "0000ff",
"collision": true
},
{
"name": "tree4",
"color": "ff00ff",
"collision": true
},
{
"name": "rock",
"color": "ffff00",
"collision": true "collision": true
} }
] ]
@@ -149,15 +166,37 @@
{ {
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/red_structures.atlas",
"sourcePath": "world/models/lava.png", "sourcePath": "world/structures/models/volcano.png",
"maskPath": "world/masks/circle.png", "maskPath": "world/structures/masks/circle.png",
"height": 0.2, "height": 0.2,
"width": 0.2, "width": 0.2,
"N": 2,
"symmetry": 8,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "lava", "name": "lava",
"color": "ff5000", "color": "ffff00",
"collision": true
},
{
"name": "mountain",
"color": "ff0000",
"collision": true
},
{
"name": "dead_tree",
"color": "000000",
"collision": true
},
{
"name": "dead_tree2",
"color": "808080",
"collision": true
},
{
"name": "rock",
"color": "0000ff",
"collision": true "collision": true
} }
] ]

View File

@@ -23,7 +23,6 @@
"height": 0.5, "height": 0.5,
"color": "efe697", "color": "efe697",
"spriteNames": [ "spriteNames": [
"PlainsRock",
"Skull" "Skull"
], ],
"enemies": [ "enemies": [

View File

@@ -23,9 +23,6 @@
"height": 0.7, "height": 0.7,
"color": "efe697", "color": "efe697",
"spriteNames": [ "spriteNames": [
"PlainsTree",
"Cactus",
"PlainsRock",
"DarkGras" "DarkGras"
], ],
"enemies": [ "enemies": [
@@ -117,33 +114,74 @@
"N": 2, "N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "structureAtlasPath": "world/structures/white_structures.atlas",
"sourcePath": "world/models/plains_forest.png", "sourcePath": "world/structures/models/white.png",
"maskPath": "world/masks/circle.png", "maskPath": "world/structures/masks/circle.png",
"height": 0.20000002, "height": 0.20000002,
"width": 0.20000002, "width": 0.20000002,
"symmetry": 8, "symmetry": 8,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "plains_forest", "name": "tree",
"color": "9c4000", "color": "ff8000",
"collision": true
},
{
"name": "tree2",
"color": "008000",
"collision": true
},
{
"name": "tree3",
"color": "00ff00",
"collision": true "collision": true
} }
] ]
}, },
{ {
"N": 2,
"x": 0.5, "x": 0.5,
"y": 0.5, "y": 0.5,
"structureAtlasPath": "world/tilesets/structures.atlas", "symmetry": 8,
"sourcePath": "world/models/plateau.png", "structureAtlasPath": "world/structures/white_structures.atlas",
"maskPath": "world/masks/ring.png", "sourcePath": "world/structures/models/desert.png",
"maskPath": "world/structures/masks/ring.png",
"height": 0.5, "height": 0.5,
"width": 0.5, "width": 0.5,
"periodicOutput": false,
"mappingInfo": [ "mappingInfo": [
{ {
"name": "plateau", "name": "plateau",
"color": "caaa66", "color": "804000",
"collision": true
},
{
"name": "rock",
"color": "402000",
"collision": true
},
{
"name": "mesa",
"color": "201000",
"collision": true
},
{
"name": "plateau",
"color": "804000",
"collision": true
},
{
"name": "cactus",
"color": "00ff00",
"collision": true
},
{
"name": "cactus2",
"color": "008000",
"collision": true
},
{
"name": "cactus3",
"color": "004000",
"collision": true "collision": true
} }
] ]

View File

@@ -12542,7 +12542,7 @@
"spawnRate": 1, "spawnRate": 1,
"difficulty": 0.1, "difficulty": 0.1,
"speed": 25, "speed": 25,
"scale": 0.6, "scale": 1.3,
"life": 11, "life": 11,
"rewards": [ "rewards": [
{ {

View File

@@ -5,289 +5,382 @@ filter: Nearest,Nearest
repeat: none repeat: none
DarkWood DarkWood
xy: 0, 0 xy: 0, 0
size: 16, 16 size: 16, 16
DarkWood DarkWood
xy: 16, 0 xy: 16, 0
size: 16, 16 size: 16, 16
DarkWood DarkWood
xy: 32, 0 xy: 32, 0
size: 16, 16 size: 16, 16
DarkWood DarkWood
xy: 48, 0 xy: 48, 0
size: 16, 16 size: 16, 16
Reed Reed
xy: 64, 0 xy: 64, 0
size: 16, 16 size: 16, 16
Reed Reed
xy: 80, 0 xy: 80, 0
size: 16, 16 size: 16, 16
Reed
xy: 64, 16
size: 16, 16
Reed
xy: 80, 16
size: 16, 16
DarkWood DarkWood
xy: 96, 0 xy: 96, 0
size: 16, 16 size: 16, 16
DarkWood DarkWood
xy: 112, 0 xy: 112, 0
size: 16, 16 size: 16, 16
Waterlily
xy: 96, 16
size: 16, 16
Waterlily
xy: 112, 16
size: 16, 16
Shroom
xy: 96, 32
size: 16, 16
Shroom
xy: 96, 48
size: 16, 16
Shroom2
xy: 112, 32
size: 16, 16
Shroom2
xy: 112, 48
size: 16, 16
DarkWood DarkWood
xy: 0, 16 xy: 0, 16
size: 16, 16 size: 16, 16
DarkWood DarkWood
xy: 16, 16 xy: 16, 16
size: 16, 16 size: 16, 16
DarkWood DarkWood
xy: 32, 16 xy: 32, 16
size: 16, 16 size: 16, 16
DarkWood DarkWood
xy: 48, 16 xy: 48, 16
size: 16, 16 size: 16, 16
Reed
xy: 64, 16
size: 16, 16
Reed
xy: 80, 16
size: 16, 16
Waterlily
xy: 96, 16
size: 16, 16
Waterlily
xy: 112, 16
size: 16, 16
DarkGras DarkGras
xy: 0, 32 xy: 0, 32
size: 16, 16 size: 16, 16
DarkGras DarkGras
xy: 16, 32 xy: 16, 32
size: 16, 16 size: 16, 16
DarkGras
xy: 0, 48
size: 16, 16
DarkGras
xy: 16, 48
size: 16, 16
Stone Stone
xy: 32, 32 xy: 32, 32
size: 16, 16 size: 16, 16
Stone Stone
xy: 48, 32 xy: 48, 32
size: 16, 16 size: 16, 16
Stone
xy: 32, 48
size: 16, 16
Stone
xy: 48, 48
size: 16, 16
Gravel Gravel
xy: 64, 32 xy: 64, 32
size: 16, 16 size: 16, 16
Gravel Gravel
xy: 80, 32 xy: 80, 32
size: 16, 16 size: 16, 16
Shroom
xy: 96, 32
size: 16, 16
Shroom2
xy: 112, 32
size: 16, 16
DarkGras
xy: 0, 48
size: 16, 16
DarkGras
xy: 16, 48
size: 16, 16
Shroom
xy: 96, 48
size: 16, 16
Shroom2
xy: 112, 48
size: 16, 16
Stone
xy: 32, 48
size: 16, 16
Stone
xy: 48, 48
size: 16, 16
Gravel Gravel
xy: 64, 48 xy: 64, 48
size: 16, 16 size: 16, 16
Gravel Gravel
xy: 80, 48 xy: 80, 48
size: 16, 16 size: 16, 16
Flower Flower
xy: 0, 64 xy: 0, 64
size: 16, 16 size: 16, 16
Flower Flower
xy: 16, 64 xy: 16, 64
size: 16, 16 size: 16, 16
Flower
xy: 0, 80
size: 16, 16
Flower
xy: 16, 80
size: 16, 16
Stone Stone
xy: 32, 64 xy: 32, 64
size: 16, 16 size: 16, 16
Stone Stone
xy: 48, 64 xy: 48, 64
size: 16, 16 size: 16, 16
Stone
xy: 32, 80
size: 16, 16
Stone
xy: 48, 80
size: 16, 16
Moss Moss
xy: 64, 64 xy: 64, 64
size: 16, 16 size: 16, 16
Moss Moss
xy: 80, 64 xy: 80, 64
size: 16, 16 size: 16, 16
Moss
xy: 64, 80
size: 16, 16
Moss
xy: 80, 80
size: 16, 16
Wood Wood
xy: 96, 64 xy: 96, 64
size: 16, 16 size: 16, 16
Wood Wood
xy: 112, 64 xy: 112, 64
size: 16, 16 size: 16, 16
Flower
xy: 0, 80
size: 16, 16
Flower
xy: 16, 80
size: 16, 16
Stone
xy: 32, 80
size: 16, 16
Stone
xy: 48, 80
size: 16, 16
Moss
xy: 64, 80
size: 16, 16
Moss
xy: 80, 80
size: 16, 16
Wood Wood
xy: 96, 80 xy: 96, 80
size: 16, 16 size: 16, 16
Wood Wood
xy: 112, 80 xy: 112, 80
size: 16, 16 size: 16, 16
WasteTree WasteTree
xy: 0, 96 xy: 0, 96
size: 16, 16 size: 16, 16
WasteTree WasteTree
xy: 16, 96 xy: 16, 96
size: 16, 16 size: 16, 16
WasteTree WasteTree
xy: 32, 96 xy: 32, 96
size: 16, 16 size: 16, 16
WasteRock WasteRock
xy: 48, 96 xy: 48, 96
size: 16, 16 size: 16, 16
WasteRock WasteRock
xy: 64, 96 xy: 64, 96
size: 16, 16 size: 16, 16
SwampTree Placeholder
xy: 0, 112 xy: 80, 96
size: 16, 16 size: 16,16
SwampTree
xy: 16, 112
size: 16, 16
SwampTree
xy: 32, 112
size: 16, 16
Skull
xy: 48, 112
size: 16, 16
Skull
xy: 112, 144
size: 16, 16
Skull
xy: 112, 128
size: 16, 16
SwampRock
xy: 64, 112
size: 16, 16
SwampRock
xy: 80, 112
size: 16, 16
SwampTree2
xy: 96, 112
size: 16, 16
SwampTree2
xy: 112, 112
size: 16, 16
SwampTree2 SwampTree2
xy: 96, 96 xy: 96, 96
size: 16, 16 size: 16, 16
SwampTree2 SwampTree2
xy: 112, 96 xy: 112, 96
size: 16, 16 size: 16, 16
SwampTree
xy: 0, 112
size: 16, 16
SwampTree
xy: 16, 112
size: 16, 16
SwampTree
xy: 32, 112
size: 16, 16
Skull
xy: 48, 112
size: 16, 16
SwampRock
xy: 64, 112
size: 16, 16
SwampRock
xy: 80, 112
size: 16, 16
SwampTree2
xy: 96, 112
size: 16, 16
SwampTree2
xy: 112, 112
size: 16, 16
PlainsTree PlainsTree
xy: 0, 128 xy: 0, 128
size: 16, 16 size: 16, 16
PlainsTree PlainsTree
xy: 16, 128 xy: 16, 128
size: 16, 16 size: 16, 16
Cactus Cactus
xy: 32, 128 xy: 32, 128
size: 16, 16 size: 16, 16
Cactus Cactus
xy: 48, 128 xy: 48, 128
size: 16, 16 size: 16, 16
Cactus Cactus
xy: 64, 128 xy: 64, 128
size: 16, 16 size: 16, 16
PlainsRock PlainsRock
xy: 70, 128 xy: 80, 128
size: 16, 16 size: 16, 16
PlainsRock PlainsRock
xy: 96, 128 xy: 96, 128
size: 16, 16 size: 16, 16
Skull
xy: 112, 128
size: 16, 16
IslandTree IslandTree
xy: 0, 144 xy: 0, 144
size: 16, 16 size: 16, 16
IslandTree IslandTree
xy: 16, 144 xy: 16, 144
size: 16, 16 size: 16, 16
Coral Coral
xy: 32, 144 xy: 32, 144
size: 16, 16 size: 16, 16
Shell Shell
xy: 48, 144 xy: 48, 144
size: 16, 16 size: 16, 16
Shell Shell
xy: 64, 144 xy: 64, 144
size: 16, 16 size: 16, 16
Placeholder
xy: 80, 144
size: 16, 16
Placeholder
xy: 96, 144
size: 16, 16
Skull
xy: 112, 144
size: 16, 16
WoodTree WoodTree
xy: 0, 160 xy: 0, 160
size: 16, 16 size: 16, 16
WoodTree WoodTree
xy: 16, 160 xy: 16, 160
size: 16, 16 size: 16, 16
WoodTree WoodTree
xy: 32, 160 xy: 32, 160
size: 16, 16 size: 16, 16
WoodTree WoodTree
xy: 48, 160 xy: 48, 160
size: 16, 16 size: 16, 16
WoodTree2 WoodTree2
xy: 64, 160 xy: 64, 160
size: 16, 16 size: 16, 16
WoodTree2 WoodTree2
xy: 80, 160 xy: 80, 160
size: 16, 16 size: 16, 16
Bush Bush
xy: 96, 160 xy: 96, 160
size: 16, 16 size: 16, 16
Stump Stump
xy: 112, 160 xy: 112, 160
size: 16, 16 size: 16, 16
MountainTree MountainTree
xy: 0, 176 xy: 0, 176
size: 16, 16 size: 16, 16
MountainTree MountainTree
xy: 16, 176 xy: 16, 176
size: 16, 16 size: 16, 16
MountainTree2 MountainTree2
xy: 32, 176 xy: 32, 176
size: 16, 16 size: 16, 16
MountainTree2 MountainTree2
xy: 48, 176 xy: 48, 176
size: 16, 16 size: 16, 16
MountainTree2
xy: 96, 176
size: 16, 16
MountainTree2
xy: 112, 176
size: 16, 16
MountainRock MountainRock
xy: 64, 176 xy: 64, 176
size: 16, 16 size: 16, 16
MountainRock MountainRock
xy: 80, 176 xy: 80, 176
size: 16, 16 size: 16, 16
MountainTree2
xy: 96, 176
size: 16, 16
MountainTree2
xy: 112, 176
size: 16, 16
WoodTree
xy: 0, 192
size: 16, 16
AutumnTree
xy: 16, 192
size: 16, 16
WinterTree
xy: 32, 192
size: 16, 16
AutumnTree
xy: 48, 192
size: 16, 16
Coral
xy: 64, 192
size: 16, 16
SnowMountain
xy: 80, 192
size: 16, 16
Coral
xy: 96, 192
size: 16, 16
AutumnTree
xy: 112, 192
size: 16, 16
Placeholder
xy: 0, 208
size: 16, 16
AutumnTree
xy: 16, 208
size: 16, 16
SwampTree
xy: 32, 208
size: 16, 16
Coral
xy: 48, 208
size: 16, 16
WoodTree
xy: 64, 208
size: 16, 16
IslandRock
xy: 80, 208
size: 16, 16
WoodRock
xy: 96, 208
size: 16, 16
Placeholder
xy: 112, 208
size: 16, 16
LargeWoodRock
xy: 0, 224
size: 32, 32
LargeIslandRock
xy: 32, 224
size: 32, 32
LargeWasteRock
xy: 64, 224
size: 32, 32
LargeMountainRock LargeMountainRock
xy: 96, 224 xy: 96, 224
size: 32, 32 size: 32, 32
LargePlainsRock LargePlainsRock
xy: 96, 256 xy: 96, 256
size: 32, 32 size: 32, 32
Placeholder
xy: 0, 256
size: 16, 16
WasteRock
xy: 16, 256
size: 16, 16
LargeSwampRock LargeSwampRock
xy: 32, 256 xy: 32, 256
size: 32, 32 size: 32, 32
PlainsRock
xy: 64, 256
size: 16, 16
PlainsRock
xy: 80, 256
size: 16, 16
LargePlainsRock
xy: 96, 256
size: 32, 32
WoodRock
xy: 0, 272
size: 16, 16
SwampRock
xy: 16, 272
size: 16, 16
WinterTree:
xy: 64, 272
size: 16, 16
WinterTree:
xy: 80, 272
size: 16, 16

View File

@@ -2,7 +2,7 @@
"textureAtlas":"world/sprites/map_sprites.atlas", "textureAtlas":"world/sprites/map_sprites.atlas",
"sprites":[ "sprites":[
{ {
"name":"DarkWood", "name":"DarkWood",
"startArea":0.2, "startArea":0.2,
"endArea":0.7, "endArea":0.7,
"layer":-1, "layer":-1,
@@ -22,7 +22,7 @@
"layer":-1, "layer":-1,
"density":0.03 "density":0.03
},{ },{
"name":"Reed", "name":"Reed",
"startArea":0.9, "startArea":0.9,
"endArea":0.99, "endArea":0.99,
"layer":0, "layer":0,
@@ -46,7 +46,7 @@
"name":"Stone", "name":"Stone",
"startArea":0.2, "startArea":0.2,
"endArea":0.7, "endArea":0.7,
"layer":-1, "layer":-1,
"resolution" :5, "resolution" :5,
"density":0.01 "density":0.01
},{ },{
@@ -79,21 +79,21 @@
"name":"WasteTree", "name":"WasteTree",
"startArea":0.0, "startArea":0.0,
"endArea":0.2, "endArea":0.2,
"layer":0, "layer":1,
"resolution" :10, "resolution" :10,
"density":0.7 "density":0.7
},{ },{
"name":"WasteRock", "name":"WasteRock",
"startArea":0.8, "startArea":0.8,
"endArea":1.0, "endArea":1.0,
"layer":0, "layer":1,
"resolution" :10, "resolution" :10,
"density":0.5 "density":0.5
},{ },{
"name":"SwampTree", "name":"SwampTree",
"startArea":0.8, "startArea":0.8,
"endArea":1.0, "endArea":1.0,
"layer":0, "layer":1,
"resolution" :10, "resolution" :10,
"density":0.5 "density":0.5
},{ },{
@@ -106,45 +106,45 @@
"name":"SwampRock", "name":"SwampRock",
"startArea":0.5, "startArea":0.5,
"endArea":0.6, "endArea":0.6,
"layer":0, "layer":1,
"density":0.1 "density":0.1
},{ },{
"name":"SwampTree2", "name":"SwampTree2",
"startArea":0.0, "startArea":0.0,
"endArea":0.2, "endArea":0.2,
"layer":0, "layer":1,
"resolution" :10, "resolution" :10,
"density":0.7 "density":0.7
},{ },{
"name":"PlainsTree", "name":"PlainsTree",
"startArea":0.0, "startArea":0.0,
"endArea":0.2, "endArea":0.2,
"layer":0, "layer":1,
"resolution" :10, "resolution" :10,
"density":0.7 "density":0.7
},{ },{
"name":"Cactus", "name":"Cactus",
"startArea":0.5, "startArea":0.5,
"layer":0, "layer":1,
"endArea":0.7, "endArea":0.7,
"density":0.06 "density":0.06
},{ },{
"name":"PlainsRock", "name":"PlainsRock",
"startArea":0.7, "startArea":0.7,
"layer":0, "layer":1,
"endArea":0.99, "endArea":0.99,
"density":0.06 "density":0.06
},{ },{
"name":"IslandTree", "name":"IslandTree",
"startArea":0.0, "startArea":0.0,
"endArea":0.2, "endArea":0.2,
"layer":0, "layer":1,
"resolution" :10, "resolution" :10,
"density":0.7 "density":0.7
},{ },{
"name":"Coral", "name":"Coral",
"startArea":0.0, "startArea":0.0,
"layer":0, "layer":1,
"endArea":0.9, "endArea":0.9,
"density":0.01 "density":0.01
},{ },{
@@ -157,65 +157,65 @@
"name":"WoodTree", "name":"WoodTree",
"startArea":0.0, "startArea":0.0,
"endArea":0.2, "endArea":0.2,
"layer":0, "layer":1,
"resolution" :10, "resolution" :10,
"density":0.7 "density":0.7
},{ },{
"name":"WoodTree2", "name":"WoodTree2",
"startArea":0.8, "startArea":0.8,
"endArea":0.99, "endArea":0.99,
"layer":0, "layer":1,
"resolution" :5, "resolution" :5,
"density":0.7 "density":0.7
},{ },{
"name":"Bush", "name":"Bush",
"startArea":0.0, "startArea":0.0,
"endArea":0.2, "endArea":0.2,
"layer":0, "layer":1,
"resolution" :5, "resolution" :5,
"density":0.4 "density":0.4
},{ },{
"name":"Stump", "name":"Stump",
"startArea":0.0, "startArea":0.0,
"layer":0, "layer":-1,
"endArea":0.9, "endArea":0.9,
"density":0.01 "density":0.01
},{ },{
"name":"MountainTree", "name":"MountainTree",
"startArea":0.0, "startArea":0.0,
"endArea":0.2, "endArea":0.2,
"layer":0, "layer":1,
"resolution" :5, "resolution" :5,
"density":0.7 "density":0.7
},{ },{
"name":"MountainTree2", "name":"MountainTree2",
"startArea":0.8, "startArea":0.8,
"endArea":0.99, "endArea":0.99,
"layer":0, "layer":1,
"resolution" :5, "resolution" :5,
"density":0.7 "density":0.7
},{ },{
"name":"MountainRock", "name":"MountainRock",
"startArea":0.1, "startArea":0.1,
"layer":0, "layer":1,
"endArea":0.9, "endArea":0.9,
"density":0.08 "density":0.08
},{ },{
"name":"LargeMountainRock", "name":"LargeMountainRock",
"startArea":0.0, "startArea":0.0,
"layer":0, "layer":1,
"endArea":0.9, "endArea":0.9,
"density":0.02 "density":0.02
},{ },{
"name":"LargePlainsRock", "name":"LargePlainsRock",
"startArea":0.0, "startArea":0.0,
"layer":0, "layer":1,
"endArea":0.9, "endArea":0.9,
"density":0.01 "density":0.01
},{ },{
"name":"LargeSwampRock", "name":"LargeSwampRock",
"startArea":0.0, "startArea":0.0,
"layer":0, "layer":1,
"endArea":0.9, "endArea":0.9,
"density":0.01 "density":0.01
} }

View File

@@ -0,0 +1,38 @@
black_structures.png
size: 192,192
format: RGBA8888
filter: Nearest,Nearest
repeat: none
water
xy: 0, 0
size: 48, 64
muck
xy: 48,0
size:48,64
tree
xy: 96,0
size: 48,64
tree2
xy:144,0
size:48,64
dead_tree
xy: 0,64
size: 48,64
dead_tree2
xy: 48,64
size: 48,64
tree3
xy: 96,64
size: 48,64
tree4
xy:144,64
size:48,64
rock
xy: 0, 128
size: 48, 64
rock2
xy: 48, 128
size: 48,64
dead_tree3
xy:96,128
size:48,64

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -0,0 +1,34 @@
blue_structures.png
size: 192,192
format: RGBA8888
filter: Nearest,Nearest
repeat: none
water
xy: 0, 0
size: 48, 64
tree
xy: 48,0
size:48,64
tree2
xy: 96,0
size: 48,64
rock
xy: 0,64
size: 48,64
rock2
xy: 48,64
size: 48,64
pineapple
xy: 96,64
size: 48,64
rock3
xy: 0, 128
size: 48, 64
rock4
xy: 48, 128
size: 48,64
dune
xy:96,128
size:48,64
dune2
xy:144,128

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -0,0 +1,29 @@
colorless_structures.png
size: 144,192
format: RGBA8888
filter: Nearest,Nearest
repeat: none
hole
xy: 0, 0
size: 48, 64
crater
xy: 48,0
size:48,64
tree
xy: 96,0
size: 48,64
tree2
xy: 0,64
size: 48,64
tree3
xy: 48,64
size: 48,64
tree4
xy: 96,64
size: 48,64
rock
xy: 0, 128
size: 48, 64
mountain
xy: 48, 128
size: 48,64

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -0,0 +1,41 @@
green_structures.png
size: 192,192
format: RGBA8888
filter: Nearest,Nearest
repeat: none
water
xy: 0, 0
size: 48, 64
tree
xy: 48,0
size:48,64
tree2
xy: 96,0
size: 48,64
vine
xy: 144,0
size: 48,64
tree3
xy: 0,64
size: 48,64
tree4
xy: 48,64
size: 48,64
tree5
xy: 96,64
size: 48,64
tree6
xy: 144, 64
size: 48,64
rock
xy: 0, 128
size: 48, 64
mountain
xy: 48, 128
size: 48,64
plant
xy:96,128
size:48,64
bush
xy:144,128
size:48,64

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

Before

Width:  |  Height:  |  Size: 508 B

After

Width:  |  Height:  |  Size: 508 B

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: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 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: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

View File

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

Before

Width:  |  Height:  |  Size: 508 B

After

Width:  |  Height:  |  Size: 508 B

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

View File

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

View File

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

View File

@@ -0,0 +1,32 @@
red_structures.png
size: 144,192
format: RGBA8888
filter: Nearest,Nearest
repeat: none
lava
xy: 0, 0
size: 48, 64
tree
xy: 48,0
size:48,64
tree2
xy: 96,0
size: 48,64
dead_tree
xy: 0,64
size: 48,64
dead_tree2
xy: 48,64
size: 48,64
tree3
xy: 96,64
size: 48,64
rock
xy: 0, 128
size: 48, 64
mountain
xy: 48, 128
size: 48,64
tree4
xy: 96,128
size: 48,64

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -57,4 +57,4 @@ waste_mountain
size: 48, 64 size: 48, 64
waste_structure waste_structure
xy: 96, 320 xy: 96, 320
size: 48, 64 size: 48, 64

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -0,0 +1,32 @@
white_structures.png
size: 144,192
format: RGBA8888
filter: Nearest,Nearest
repeat: none
tree
xy: 0, 0
size: 48, 64
tree2
xy: 48,0
size:48,64
tree3
xy: 96,0
size: 48,64
cactus
xy: 0,64
size: 48,64
cactus2
xy: 48,64
size: 48,64
cactus3
xy: 96,64
size: 48,64
rock
xy: 0, 128
size: 48, 64
mesa
xy: 48, 128
size: 48,64
plateau
xy:96,128
size:48,64

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

View File

@@ -4,16 +4,16 @@ size: 192,512
format: RGBA8888 format: RGBA8888
filter: Nearest,Nearest filter: Nearest,Nearest
repeat: none repeat: none
Waste Colorless
xy: 0, 64 xy: 0, 64
size: 48, 64 size: 48, 64
Waste_1 Colorless_1
xy: 48, 64 xy: 48, 64
size: 48, 64 size: 48, 64
Waste_2 Colorless_2
xy: 96, 64 xy: 96, 64
size: 48, 64 size: 48, 64
Waste_3 Colorless_3
xy: 144, 64 xy: 144, 64
size: 48, 64 size: 48, 64
White White

View File

@@ -11,11 +11,8 @@ ALTERNATE
Name:Consume Name:Consume
ManaCost:2 W B ManaCost:2 W B
Types:Sorcery Types:Sorcery
A:SP$ Pump | Cost$ 2 W B | ValidTgts$ Player | IsCurse$ True | RememberTargets$ True | SubAbility$ DBChooseCard | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. A:SP$ Sacrifice | Cost$ 2 W B | ValidTgts$ Player | SacValid$ Creature.greatestPowerControlledByTargered | Mandatory$ True | SubAbility$ DBGainLife | SacMessage$ the creature with the highest power | RememberSacrificed$ True | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power.
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac
SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SubAbility$ DBGainLife | SacMessage$ the creature with the highest power
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:RememberedLKI$CardPower SVar:X:RememberedLKI$CardPower
SVar:SplitNeedsToPlay:Creature.OppCtrl
Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power.

View File

@@ -1,7 +1,7 @@
Name:Gale's Redirection Name:Gale's Redirection
ManaCost:3 U U ManaCost:3 U U
Types:Instant Types:Instant
A:SP$ ChangeZone | ValidTgts$ Card | TargetType$ Spell | TgtZone$ Stack | Origin$ Stack | Fizzle$ True | Destination$ Exile | TgtPrompt$ Choose target spell to exile | RememberChanged$ True | SubAbility$ DBRoll | SpellDescription$ Exile target spell. A:SP$ ChangeZone | ValidTgts$ Card | TargetType$ Spell | TgtZone$ Stack | Origin$ Stack | Fizzle$ True | Destination$ Exile | AILogic$ ExileSpell.3 | TgtPrompt$ Choose target spell to exile | RememberChanged$ True | SubAbility$ DBRoll | SpellDescription$ Exile target spell.
SVar:DBRoll:DB$ RollDice | Sides$ 20 | Modifier$ Y | ResultSubAbilities$ 1-14:DBMayPlay,Else:DBMayPlayWithoutCost | StackDescription$ SpellDescription | SpellDescription$ Roll a d20 and add that spell's mana value. SVar:DBRoll:DB$ RollDice | Sides$ 20 | Modifier$ Y | ResultSubAbilities$ 1-14:DBMayPlay,Else:DBMayPlayWithoutCost | StackDescription$ SpellDescription | SpellDescription$ Roll a d20 and add that spell's mana value.
SVar:DBMayPlay:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | Duration$ Permanent | ExileOnMoved$ Exile | SubAbility$ DBCleanup | SpellDescription$ 1—14 VERT You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast it. SVar:DBMayPlay:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | Duration$ Permanent | ExileOnMoved$ Exile | SubAbility$ DBCleanup | SpellDescription$ 1—14 VERT You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast it.
SVar:DBMayPlayWithoutCost:DB$ Effect | StaticAbilities$ STPlayWithoutCost | RememberObjects$ Remembered | Duration$ Permanent | ExileOnMoved$ Exile | SubAbility$ DBCleanup | SpellDescription$ 15+ VERT You may cast that card without paying its mana cost for as long as it remains exiled. SVar:DBMayPlayWithoutCost:DB$ Effect | StaticAbilities$ STPlayWithoutCost | RememberObjects$ Remembered | Duration$ Permanent | ExileOnMoved$ Exile | SubAbility$ DBCleanup | SpellDescription$ 15+ VERT You may cast that card without paying its mana cost for as long as it remains exiled.
@@ -9,5 +9,4 @@ SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | Effect
SVar:STPlayWithoutCost:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ You may cast that card without paying its mana cost for as long as it remains exiled. SVar:STPlayWithoutCost:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ You may cast that card without paying its mana cost for as long as it remains exiled.
SVar:Y:SpellTargeted$CardManaCostLKI SVar:Y:SpellTargeted$CardManaCostLKI
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All
Oracle:Exile target spell, then roll a d20 and add that spell's mana value.\n1-14 | You may cast the exiled card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell.\n15+ | You may cast the exiled card without paying its mana cost for as long as it remains exiled. Oracle:Exile target spell, then roll a d20 and add that spell's mana value.\n1-14 | You may cast the exiled card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell.\n15+ | You may cast the exiled card without paying its mana cost for as long as it remains exiled.

View File

@@ -5,7 +5,7 @@ PT:5/5
K:Menace K:Menace
T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigSeek | TriggerDescription$ Whenever CARDNAME is dealt damage, seek that many nonland cards. At the beginning of your next end step, discard those cards. T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigSeek | TriggerDescription$ Whenever CARDNAME is dealt damage, seek that many nonland cards. At the beginning of your next end step, discard those cards.
SVar:TrigSeek:DB$ Seek | Num$ X | Type$ Card.nonLand | RememberFound$ True | SubAbility$ DBDelay SVar:TrigSeek:DB$ Seek | Num$ X | Type$ Card.nonLand | RememberFound$ True | SubAbility$ DBDelay
SVar:DBDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDiscardExiled | SubAbility$ DBCleanup | RememberObjects$ Remembered | TriggerDescription$ At the beginning of the next end step, discard those cards. SVar:DBDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigDiscardExiled | SubAbility$ DBCleanup | RememberObjects$ Remembered | TriggerDescription$ At the beginning of your next end step, discard those cards.
SVar:TrigDiscardExiled:DB$ Discard | Mode$ Defined | DefinedCards$ DelayTriggerRemembered SVar:TrigDiscardExiled:DB$ Discard | Mode$ Defined | DefinedCards$ DelayTriggerRemembered
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:TriggerCount$DamageAmount SVar:X:TriggerCount$DamageAmount

View File

@@ -4,7 +4,7 @@ Types:Creature Angel
PT:7/7 PT:7/7
K:Flying K:Flying
K:ETBReplacement:Other:ChooseCT K:ETBReplacement:Other:ChooseCT
SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Card | AILogic$ MostProminentOppControls | SpellDescription$ As CARDNAME enters the battlefield, choose a card type. SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Card | AILogic$ ProtectionFromType | SpellDescription$ As CARDNAME enters the battlefield, choose a card type.
S:Mode$ Continuous | Affected$ You,Creature.YouCtrl | AddKeyword$ Protection from ChosenType | Description$ You and creatures you control have protection from the chosen card type. S:Mode$ Continuous | Affected$ You,Creature.YouCtrl | AddKeyword$ Protection from ChosenType | Description$ You and creatures you control have protection from the chosen card type.
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE
Oracle:Flying\nAs Serra's Emissary enters the battlefield, choose a card type.\nYou and creatures you control have protection from the chosen card type. Oracle:Flying\nAs Serra's Emissary enters the battlefield, choose a card type.\nYou and creatures you control have protection from the chosen card type.

View File

@@ -3,7 +3,7 @@ ManaCost:2
Types:Artifact Creature Phyrexian Golem Types:Artifact Creature Phyrexian Golem
PT:0/4 PT:0/4
R:Event$ Moved | Layer$ CantHappen | ActiveZones$ Battlefield | Origin$ Graveyard | Destination$ Battlefield | ValidLKI$ Permanent | Prevent$ True | Description$ Permanent cards in graveyards can't enter the battlefield. R:Event$ Moved | Layer$ CantHappen | ActiveZones$ Battlefield | Origin$ Graveyard | Destination$ Battlefield | ValidLKI$ Permanent | Prevent$ True | Description$ Permanent cards in graveyards can't enter the battlefield.
S:Mode$ CantBeCast | Origin$ Graveyard,Exile | Description$ Players can't cast spells from graveyards or exile. S:Mode$ CantBeCast | ValidCard$ Card.nonCreature | Origin$ Graveyard,Exile | Description$ Players can't cast noncreature spells from graveyards or exile.
SVar:NonStackingEffect:True SVar:NonStackingEffect:True
AI:RemoveDeck:Random AI:RemoveDeck:Random
Oracle:Permanent cards in graveyards can't enter the battlefield.\nPlayers can't cast noncreature spells from graveyards or exile. Oracle:Permanent cards in graveyards can't enter the battlefield.\nPlayers can't cast noncreature spells from graveyards or exile.

View File

@@ -0,0 +1,16 @@
Name:Field-Tested Frying Pan
ManaCost:2 W
Types:Artifact Equipment
K:Equip:2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Food token, then create a 1/1 white Halfling creature token and attach CARDNAME to it.
SVar:TrigToken:DB$ Token | TokenScript$ c_a_food_sac | SubAbility$ DBToken
SVar:DBToken:DB$ Token | TokenScript$ w_1_1_halfling | RememberTokens$ True | SubAbility$ DBAttach
SVar:DBAttach:DB$ Attach | Defined$ Remembered | Object$ Self | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddTrigger$ GainLifeTrig | Description$ Equipped creature has "Whenever you gain life, this creature gets +X/+X until end of turn, where X is the amount of life you gained."
SVar:GainLifeTrig:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you gain life, this creature gets +X/+X until end of turn, where X is the amount of life you gained.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +X | NumDef$ +X
SVar:X:TriggerCount$LifeAmount
DeckHas:Ability$Token|LifeGain|Sacrifice & Type$Food|Artifact|Halfling
DeckHints:Ability$LifeGain
Oracle:When Field-Tested Frying Pan enters the battlefield, create a Food token, then create a 1/1 white Halfling creature token and attach Field-Tested Frying Pan to it.\nEquipped creature has "Whenever you gain life, this creature gets +X/+X until end of turn, where X is the amount of life you gained."\nEquip {2}

View File

@@ -0,0 +1,9 @@
Name:Galadhrim Ambush
ManaCost:3 G
Types:Instant
A:SP$ Token | TokenAmount$ X | TokenScript$ g_1_1_elf_warrior | TokenOwner$ You | SubAbility$ DBEffect | SpellDescription$ Create X 1/1 green Elf Warrior creature tokens, where X is the number of attacking creatures.Prevent all combat damage that would be dealt this turn by non-Elf creatures.
SVar:DBEffect:DB$ Effect | ReplacementEffects$ Curse
SVar:Curse:Event$ DamageDone | Prevent$ True | IsCombat$ True | ActiveZones$ Command | ValidSource$ Creature.nonElf | Description$ Prevent all combat damage that would be dealt this turn by non-Elf creatures.
SVar:X:Count$Valid Creature.attacking
DeckHas:Ability$Token & Type$Elf|Warrior
Oracle:Create X 1/1 green Elf Warrior creature tokens, where X is the number of attacking creatures.\nPrevent all combat damage that would be dealt this turn by non-Elf creatures.

View File

@@ -0,0 +1,11 @@
Name:Monstrosity of the Lake
ManaCost:4 U
Types:Legendary Creature Kraken
PT:4/6
T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {5}. If you do, tap all creatures your opponents control, then put a stun counter on each of those creatures. (If a permanent with a stun counter would become untapped, remove one from it instead.)
SVar:TrigTapAll:AB$ TapAll | Cost$ 5 | ValidCards$ Creature.OppCtrl | RememberTapped$ True | SubAbility$ DBStun
SVar:DBStun:DB$ PutCounter | CounterType$ STUN | CounterNum$ 1 | Defined$ Remembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
K:TypeCycling:Island:2
DeckHas:Ability$Counters|Discard
Oracle:When Monstrosity of the Lake enters the battlefield, you may pay {5}. If you do, tap all creatures your opponents control, then put a stun counter on each of those creatures. (If a permanent with a stun counter would become untapped, remove one from it instead.)\nIslandcycling {2} ({2}, Discard this card: Search your library for an Island card, reveal it, put it into your hand, then shuffle.)

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