Merge branch 'Card-Forge:master' into enemies
@@ -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 {
|
||||
// Are we picking a type to reduce costs for that type?
|
||||
|
||||
@@ -28,6 +28,7 @@ import forge.game.player.Player;
|
||||
import forge.game.player.PlayerActionConfirmMode;
|
||||
import forge.game.spellability.AbilitySub;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.spellability.SpellAbilityStackInstance;
|
||||
import forge.game.spellability.TargetRestrictions;
|
||||
import forge.game.staticability.StaticAbilityMustTarget;
|
||||
import forge.game.zone.ZoneType;
|
||||
@@ -116,6 +117,8 @@ public class ChangeZoneAi extends SpellAbilityAi {
|
||||
if (aiLogic != null) {
|
||||
if (aiLogic.equals("Always")) {
|
||||
return true;
|
||||
} else if (aiLogic.startsWith("ExileSpell")) {
|
||||
return doExileSpellLogic(aiPlayer, sa);
|
||||
} else if (aiLogic.startsWith("SacAndUpgrade")) { // Birthing Pod, Natural Order, etc.
|
||||
return doSacAndUpgradeLogic(aiPlayer, sa);
|
||||
} 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) {
|
||||
// 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.
|
||||
|
||||
@@ -114,13 +114,14 @@ public class SacrificeAi extends SpellAbilityAi {
|
||||
}
|
||||
|
||||
final String defined = sa.getParamOrDefault("Defined", "You");
|
||||
final String targeted = sa.getParamOrDefault("ValidTgts", "");
|
||||
final String valid = sa.getParamOrDefault("SacValid", "Self");
|
||||
if (valid.equals("Self")) {
|
||||
// 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())) {
|
||||
// is either "Defined$ Player.Opponent" or "Defined$ Opponent" obsolete?
|
||||
|
||||
|
||||
// If Sacrifice hits both players:
|
||||
// Only cast it if Human has the full amount of valid
|
||||
// Only cast it if AI doesn't have the full amount of Valid
|
||||
|
||||
@@ -141,7 +141,7 @@ public class CostPutCounter extends CostPartWithList {
|
||||
public final boolean canPay(final SpellAbility ability, final Player payer, final boolean effect) {
|
||||
final Card source = ability.getHostCard();
|
||||
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.
|
||||
|
||||
@@ -104,6 +104,7 @@ public class Forge implements ApplicationListener {
|
||||
public static boolean isTabletDevice = false;
|
||||
public static String locale = "en-US";
|
||||
public Assets assets;
|
||||
private ForgePreferences forgePreferences;
|
||||
public static boolean hdbuttons = false;
|
||||
public static boolean hdstart = false;
|
||||
public static boolean isPortraitMode = false;
|
||||
@@ -145,6 +146,11 @@ public class Forge implements ApplicationListener {
|
||||
private Forge() {
|
||||
}
|
||||
|
||||
private ForgePreferences getForgePreferences() {
|
||||
if (forgePreferences == null)
|
||||
forgePreferences = new ForgePreferences();
|
||||
return forgePreferences;
|
||||
}
|
||||
public static Localizer getLocalizer() {
|
||||
if (localizer == null)
|
||||
localizer = Localizer.getInstance();
|
||||
@@ -179,33 +185,38 @@ public class Forge implements ApplicationListener {
|
||||
*/
|
||||
Gdx.input.setCatchKey(Keys.BACK, true);
|
||||
destroyThis = true; //Prevent back()
|
||||
ForgePreferences prefs = new ForgePreferences();
|
||||
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;
|
||||
if (FileUtil.doesFileExist(ForgeConstants.MAIN_PREFS_FILE)) {
|
||||
skinName = prefs.getPref(FPref.UI_SKIN);
|
||||
skinName = getForgePreferences().getPref(FPref.UI_SKIN);
|
||||
} else {
|
||||
skinName = "default"; //use default skin if preferences file doesn't exist yet
|
||||
}
|
||||
FSkin.loadLight(skinName, splashScreen);
|
||||
|
||||
textureFiltering = prefs.getPrefBoolean(FPref.UI_LIBGDX_TEXTURE_FILTERING);
|
||||
showFPS = prefs.getPrefBoolean(FPref.UI_SHOW_FPS);
|
||||
autoAIDeckSelection = prefs.getPrefBoolean(FPref.UI_AUTO_AIDECK_SELECTION);
|
||||
altPlayerLayout = prefs.getPrefBoolean(FPref.UI_ALT_PLAYERINFOLAYOUT);
|
||||
altZoneTabs = prefs.getPrefBoolean(FPref.UI_ALT_PLAYERZONETABS);
|
||||
animatedCardTapUntap = prefs.getPrefBoolean(FPref.UI_ANIMATED_CARD_TAPUNTAP);
|
||||
enableUIMask = prefs.getPref(FPref.UI_ENABLE_BORDER_MASKING);
|
||||
if (prefs.getPref(FPref.UI_ENABLE_BORDER_MASKING).equals("true")) //override old settings if not updated
|
||||
textureFiltering = getForgePreferences().getPrefBoolean(FPref.UI_LIBGDX_TEXTURE_FILTERING);
|
||||
showFPS = getForgePreferences().getPrefBoolean(FPref.UI_SHOW_FPS);
|
||||
autoAIDeckSelection = getForgePreferences().getPrefBoolean(FPref.UI_AUTO_AIDECK_SELECTION);
|
||||
altPlayerLayout = getForgePreferences().getPrefBoolean(FPref.UI_ALT_PLAYERINFOLAYOUT);
|
||||
altZoneTabs = getForgePreferences().getPrefBoolean(FPref.UI_ALT_PLAYERZONETABS);
|
||||
animatedCardTapUntap = getForgePreferences().getPrefBoolean(FPref.UI_ANIMATED_CARD_TAPUNTAP);
|
||||
enableUIMask = getForgePreferences().getPref(FPref.UI_ENABLE_BORDER_MASKING);
|
||||
if (getForgePreferences().getPref(FPref.UI_ENABLE_BORDER_MASKING).equals("true")) //override old settings if not updated
|
||||
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";
|
||||
enablePreloadExtendedArt = prefs.getPrefBoolean(FPref.UI_ENABLE_PRELOAD_EXTENDED_ART);
|
||||
locale = prefs.getPref(FPref.UI_LANGUAGE);
|
||||
autoCache = prefs.getPrefBoolean(FPref.UI_AUTO_CACHE_SIZE);
|
||||
disposeTextures = prefs.getPrefBoolean(FPref.UI_ENABLE_DISPOSE_TEXTURES);
|
||||
CJK_Font = prefs.getPref(FPref.UI_CJK_FONT);
|
||||
enablePreloadExtendedArt = getForgePreferences().getPrefBoolean(FPref.UI_ENABLE_PRELOAD_EXTENDED_ART);
|
||||
locale = getForgePreferences().getPref(FPref.UI_LANGUAGE);
|
||||
autoCache = getForgePreferences().getPrefBoolean(FPref.UI_AUTO_CACHE_SIZE);
|
||||
disposeTextures = getForgePreferences().getPrefBoolean(FPref.UI_ENABLE_DISPOSE_TEXTURES);
|
||||
CJK_Font = getForgePreferences().getPref(FPref.UI_CJK_FONT);
|
||||
|
||||
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..)
|
||||
@@ -379,12 +390,6 @@ public class Forge implements ApplicationListener {
|
||||
//adjust height modifier
|
||||
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(() -> {
|
||||
//load skin full
|
||||
FSkin.loadFull(splashScreen);
|
||||
|
||||
@@ -305,7 +305,7 @@ public class DuelScene extends ForgeScene {
|
||||
} else if (this.eventData != null){
|
||||
deck = eventData.nextOpponent.getDeck();
|
||||
} 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);
|
||||
|
||||
|
||||
@@ -109,6 +109,7 @@ public class MapViewScene extends UIScene {
|
||||
TextraButton questButton = ui.findActor("quest");
|
||||
if (questButton != null) {
|
||||
questButton.setDisabled(labels.isEmpty());
|
||||
questButton.setVisible(!labels.isEmpty());
|
||||
}
|
||||
super.enter();
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
|
||||
* Scene to handle settings of the base forge and adventure mode
|
||||
*/
|
||||
public class SettingsScene extends UIScene {
|
||||
static public ForgePreferences Preference;
|
||||
private final Table settingGroup;
|
||||
TextraButton backButton;
|
||||
//TextraButton newPlane;
|
||||
@@ -99,9 +98,6 @@ public class SettingsScene extends UIScene {
|
||||
super(Forge.isLandscapeMode() ? "ui/settings.json" : "ui/settings_portrait.json");
|
||||
|
||||
settingGroup = new Table();
|
||||
if (Preference == null) {
|
||||
Preference = FModel.getPreferences();
|
||||
}
|
||||
//temporary disable custom world until it works correctly on each update
|
||||
/*selectSourcePlane = Controls.newComboBox();
|
||||
newPlaneName = Controls.newTextField("");
|
||||
@@ -131,10 +127,10 @@ public class SettingsScene extends UIScene {
|
||||
mode = "720p";
|
||||
Graphics.setVideoMode(mode);
|
||||
|
||||
//update preference for classic mode if needed
|
||||
if (Preference.getPref(ForgePreferences.FPref.UI_VIDEO_MODE).equals(mode)) {
|
||||
Preference.setPref(ForgePreferences.FPref.UI_VIDEO_MODE, mode);
|
||||
Preference.save();
|
||||
//update
|
||||
if (!FModel.getPreferences().getPref(ForgePreferences.FPref.UI_VIDEO_MODE).equalsIgnoreCase(mode)) {
|
||||
FModel.getPreferences().setPref(ForgePreferences.FPref.UI_VIDEO_MODE, mode);
|
||||
FModel.getPreferences().save();
|
||||
}
|
||||
return null;
|
||||
});
|
||||
@@ -194,10 +190,8 @@ public class SettingsScene extends UIScene {
|
||||
Config.instance().getSettingData().fullScreen = value;
|
||||
Config.instance().saveSettings();
|
||||
//update
|
||||
if (Preference.getPrefBoolean(ForgePreferences.FPref.UI_FULLSCREEN_MODE) != value) {
|
||||
Preference.setPref(ForgePreferences.FPref.UI_LANDSCAPE_MODE, value);
|
||||
Preference.save();
|
||||
}
|
||||
FModel.getPreferences().setPref(ForgePreferences.FPref.UI_FULLSCREEN_MODE, Config.instance().getSettingData().fullScreen);
|
||||
FModel.getPreferences().save();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -237,16 +231,18 @@ public class SettingsScene extends UIScene {
|
||||
addCheckBox(Forge.getLocalizer().getMessage("lblLandscapeMode"), ForgePreferences.FPref.UI_LANDSCAPE_MODE);
|
||||
addCheckBox(Forge.getLocalizer().getMessage("lblAnimatedCardTapUntap"), ForgePreferences.FPref.UI_ANIMATED_CARD_TAPUNTAP);
|
||||
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 -> {
|
||||
String mode = (String) o;
|
||||
if (mode == null)
|
||||
mode = "Crop";
|
||||
item[0] = mode;
|
||||
//update preference for classic mode if needed
|
||||
Preference.setPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING, mode);
|
||||
Preference.save();
|
||||
Forge.enableUIMask = Preference.getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING);
|
||||
//update
|
||||
if (!FModel.getPreferences().getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING).equalsIgnoreCase(mode)) {
|
||||
FModel.getPreferences().setPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING, mode);
|
||||
FModel.getPreferences().save();
|
||||
Forge.enableUIMask = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING);
|
||||
}
|
||||
ImageCache.clearGeneratedCards();
|
||||
ImageCache.disposeTextures();
|
||||
return null;
|
||||
@@ -277,12 +273,12 @@ public class SettingsScene extends UIScene {
|
||||
|
||||
private void addInputField(String name, ForgePreferences.FPref pref) {
|
||||
TextField box = Controls.newTextField("");
|
||||
box.setText(Preference.getPref(pref));
|
||||
box.setText(FModel.getPreferences().getPref(pref));
|
||||
box.addListener(new ChangeListener() {
|
||||
@Override
|
||||
public void changed(ChangeEvent event, Actor actor) {
|
||||
Preference.setPref(pref, ((TextField) actor).getText());
|
||||
Preference.save();
|
||||
FModel.getPreferences().setPref(pref, ((TextField) actor).getText());
|
||||
FModel.getPreferences().save();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -292,12 +288,12 @@ public class SettingsScene extends UIScene {
|
||||
|
||||
private void addCheckBox(String name, ForgePreferences.FPref pref) {
|
||||
CheckBox box = Controls.newCheckBox("");
|
||||
box.setChecked(Preference.getPrefBoolean(pref));
|
||||
box.setChecked(FModel.getPreferences().getPrefBoolean(pref));
|
||||
box.addListener(new ChangeListener() {
|
||||
@Override
|
||||
public void changed(ChangeEvent event, Actor actor) {
|
||||
Preference.setPref(pref, ((CheckBox) actor).isChecked());
|
||||
Preference.save();
|
||||
FModel.getPreferences().setPref(pref, ((CheckBox) actor).isChecked());
|
||||
FModel.getPreferences().save();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -307,12 +303,12 @@ public class SettingsScene extends UIScene {
|
||||
|
||||
private void addSettingSlider(String name, ForgePreferences.FPref pref, int min, int max) {
|
||||
Slider slide = Controls.newSlider(min, max, 1, false);
|
||||
slide.setValue(Preference.getPrefInt(pref));
|
||||
slide.setValue(FModel.getPreferences().getPrefInt(pref));
|
||||
slide.addListener(new ChangeListener() {
|
||||
@Override
|
||||
public void changed(ChangeEvent event, Actor actor) {
|
||||
Preference.setPref(pref, String.valueOf((int) ((Slider) actor).getValue()));
|
||||
Preference.save();
|
||||
FModel.getPreferences().setPref(pref, String.valueOf((int) ((Slider) actor).getValue()));
|
||||
FModel.getPreferences().save();
|
||||
if (ForgePreferences.FPref.UI_VOL_MUSIC.equals(pref))
|
||||
SoundSystem.instance.refreshVolume();
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.badlogic.gdx.graphics.Texture;
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.badlogic.gdx.scenes.scene2d.*;
|
||||
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.utils.ActorGestureListener;
|
||||
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.TypingLabel;
|
||||
import forge.Forge;
|
||||
import forge.adventure.character.CharacterSprite;
|
||||
import forge.adventure.data.AdventureQuestData;
|
||||
import forge.adventure.data.ItemData;
|
||||
import forge.adventure.player.AdventurePlayer;
|
||||
@@ -342,6 +344,7 @@ public class GameHUD extends Stage {
|
||||
}
|
||||
//unequip and reequip abilities
|
||||
updateAbility();
|
||||
restorePlayerCollision();
|
||||
if (openMapActor != null) {
|
||||
String val = "[%80]" + Forge.getLocalizer().getMessageorUseDefault("lblZoom", "Zoom");
|
||||
for (AdventureQuestData adq: Current.player().getQuests()) {
|
||||
@@ -487,12 +490,17 @@ public class GameHUD extends Stage {
|
||||
private void setAudio(MusicPlaylist playlist) {
|
||||
if (playlist.equals(currentAudioPlaylist))
|
||||
return;
|
||||
System.out.println("Playlist: "+playlist);
|
||||
unloadAudio();
|
||||
System.out.println("Playlist: "+playlist);
|
||||
audio = getMusic(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);
|
||||
if (music != null) {
|
||||
currentAudioPlaylist = playlist;
|
||||
@@ -673,8 +681,10 @@ public class GameHUD extends Stage {
|
||||
}
|
||||
public void playerIdle() {
|
||||
if (MapStage.getInstance().isInMap()) {
|
||||
MapStage.getInstance().startPause(1f);
|
||||
MapStage.getInstance().getPlayerSprite().stop();
|
||||
} else {
|
||||
WorldStage.getInstance().startPause(1f);
|
||||
WorldStage.getInstance().getPlayerSprite().stop();
|
||||
}
|
||||
}
|
||||
@@ -771,7 +781,7 @@ public class GameHUD extends Stage {
|
||||
changeBGM(MusicPlaylist.WHITE);
|
||||
break;
|
||||
case "waste":
|
||||
changeBGM(MusicPlaylist.MENUS);
|
||||
changeBGM(MusicPlaylist.COLORLESS);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -783,4 +793,25 @@ public class GameHUD extends Stage {
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1126,6 +1126,7 @@ public class MapStage extends GameStage {
|
||||
if (Controllers.getCurrent() != null && Controllers.getCurrent().canVibrate())
|
||||
Controllers.getCurrent().startVibration(duration, 1);
|
||||
Forge.restrictAdvMenus = true;
|
||||
player.clearCollisionHeight();
|
||||
startPause(0.8f, () -> {
|
||||
Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2");
|
||||
SoundSystem.instance.play(SoundEffectType.ManaBurn, false);
|
||||
|
||||
@@ -117,6 +117,7 @@ public class WorldStage extends GameStage implements SaveFileContent {
|
||||
if (Controllers.getCurrent() != null && Controllers.getCurrent().canVibrate())
|
||||
Controllers.getCurrent().startVibration(duration, 1);
|
||||
Forge.restrictAdvMenus = true;
|
||||
player.clearCollisionHeight();
|
||||
startPause(0.8f, () -> {
|
||||
Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2");
|
||||
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());
|
||||
GridPoint2 pos = background.translateFromWorldToChunk(player.getX(), player.getY());
|
||||
background.loadChunk(pos.x, pos.y);
|
||||
handlePointsOfInterestCollision();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"maxRoadDistance": 1000,
|
||||
"biomesNames": [
|
||||
"world/biomes/base.json",
|
||||
"world/biomes/waste.json",
|
||||
"world/biomes/colorless.json",
|
||||
"world/biomes/white.json",
|
||||
"world/biomes/blue.json",
|
||||
"world/biomes/black.json",
|
||||
|
||||
BIN
forge-gui/res/adventure/common/music/menus/menu1.mp3
Normal file
@@ -23,11 +23,8 @@
|
||||
"height": 0.7,
|
||||
"color": "110903",
|
||||
"spriteNames": [
|
||||
"SwampTree",
|
||||
"SwampTree2",
|
||||
"DarkGras",
|
||||
"Skull",
|
||||
"SwampRock",
|
||||
"DarkWood",
|
||||
"Reed",
|
||||
"Waterlily",
|
||||
@@ -120,22 +117,46 @@
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/swamp_forest.png",
|
||||
"maskPath": "world/masks/ring.png",
|
||||
"structureAtlasPath": "world/structures/black_structures.atlas",
|
||||
"sourcePath": "world/structures/models/black.png",
|
||||
"maskPath": "world/structures/masks/ring.png",
|
||||
"height": 0.5,
|
||||
"width": 0.5,
|
||||
"symmetry": 8,
|
||||
"periodicOutput": false,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"name": "swamp_forest",
|
||||
"color": "007000",
|
||||
"name": "water",
|
||||
"color": "00ffff",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "swamp_water",
|
||||
"color": "005050",
|
||||
"name": "tree",
|
||||
"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
|
||||
}
|
||||
]
|
||||
@@ -144,27 +165,41 @@
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/swamp_ruins.png",
|
||||
"maskPath": "world/masks/circle.png",
|
||||
"structureAtlasPath": "world/structures/black_structures.atlas",
|
||||
"sourcePath": "world/structures/models/black.png",
|
||||
"maskPath": "world/structures/masks/circle.png",
|
||||
"height": 0.20000002,
|
||||
"width": 0.20000002,
|
||||
"symmetry": 1,
|
||||
"periodicOutput": false,
|
||||
"symmetry": 8,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"name": "deep_swamp",
|
||||
"color": "002000",
|
||||
"name": "muck",
|
||||
"color": "00ffff",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "structure",
|
||||
"color": "505050",
|
||||
"name": "dead_tree",
|
||||
"color": "004000",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "swamp_forest2",
|
||||
"color": "007000",
|
||||
"name": "dead_tree2",
|
||||
"color": "008000",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "dead_tree3",
|
||||
"color": "ff00ff",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "rock",
|
||||
"color": "808080",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "rock2",
|
||||
"color": "ff0000",
|
||||
"collision": true
|
||||
}
|
||||
]
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
"height": 0.7,
|
||||
"color": "10a2e0",
|
||||
"spriteNames": [
|
||||
"IslandTree",
|
||||
"Coral",
|
||||
"Shell"
|
||||
],
|
||||
"enemies": [
|
||||
@@ -108,47 +106,93 @@
|
||||
],
|
||||
"structures": [
|
||||
{
|
||||
"N":2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/water.png",
|
||||
"maskPath": "world/masks/circle.png",
|
||||
"height": 0.20000002,
|
||||
"width": 0.20000002,
|
||||
"structureAtlasPath": "world/structures/blue_structures.atlas",
|
||||
"sourcePath": "world/structures/models/blue.png",
|
||||
"maskPath": "world/structures/masks/circle.png",
|
||||
"height": 0.1,
|
||||
"width": 0.1,
|
||||
"symmetry": 8,
|
||||
"periodicOutput": false,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"name": "water",
|
||||
"color": "0070a0",
|
||||
"color": "00ffff",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "island_forest",
|
||||
"color": "00a000",
|
||||
"name": "tree",
|
||||
"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
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/island_forest.png",
|
||||
"maskPath": "world/masks/ring.png",
|
||||
"structureAtlasPath": "world/structures/blue_structures.atlas",
|
||||
"sourcePath": "world/structures/models/beach.png",
|
||||
"maskPath": "world/structures/masks/ring.png",
|
||||
"height": 0.5,
|
||||
"width": 0.5,
|
||||
"symmetry": 8,
|
||||
"periodicOutput": false,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"name": "water",
|
||||
"color": "0070a0",
|
||||
"color": "00ffff",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "island_forest",
|
||||
"color": "00a000",
|
||||
"name": "tree",
|
||||
"color": "00ff00",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "tree2",
|
||||
"color": "008000",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "dune",
|
||||
"color": "ff8000",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "dune2",
|
||||
"color": "402000",
|
||||
"collision": true
|
||||
}
|
||||
]
|
||||
|
||||
@@ -5,15 +5,15 @@
|
||||
"distWeight": 1,
|
||||
"name": "waste",
|
||||
"tilesetAtlas": "world/tilesets/terrain.atlas",
|
||||
"tilesetName": "Waste",
|
||||
"tilesetName": "Colorless",
|
||||
"terrain": [
|
||||
{
|
||||
"spriteName": "Waste_1",
|
||||
"spriteName": "Colorless_1",
|
||||
"max": 0.2,
|
||||
"resolution": 5
|
||||
},
|
||||
{
|
||||
"spriteName": "Waste_2",
|
||||
"spriteName": "Colorless_2",
|
||||
"min": 0.8,
|
||||
"max": 1,
|
||||
"resolution": 5
|
||||
@@ -23,9 +23,7 @@
|
||||
"height": 0.85,
|
||||
"color": "aeaeae",
|
||||
"spriteNames": [
|
||||
"WasteTree",
|
||||
"Stone",
|
||||
"WasteRock"
|
||||
"Stone"
|
||||
],
|
||||
"enemies": [
|
||||
"Adept Black Wizard",
|
||||
@@ -118,44 +116,94 @@
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/waste_structure.png",
|
||||
"maskPath": "world/masks/circle.png",
|
||||
"periodicInput": false,
|
||||
"height": 0.20000002,
|
||||
"width": 0.20000002,
|
||||
"symmetry": 4,
|
||||
"structureAtlasPath": "world/structures/colorless_structures.atlas",
|
||||
"sourcePath": "world/structures/models/colorless.png",
|
||||
"maskPath": "world/structures/masks/circle.png",
|
||||
"height": 0.25,
|
||||
"width": 0.25,
|
||||
"symmetry": 8,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"name": "waste_structure",
|
||||
"color": "444444",
|
||||
"name": "crater",
|
||||
"color": "808080",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "waste_mountain",
|
||||
"color": "9a9a9a",
|
||||
"name": "tree",
|
||||
"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
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/hole.png",
|
||||
"maskPath": "world/masks/ring.png",
|
||||
"structureAtlasPath": "world/structures/colorless_structures.atlas",
|
||||
"sourcePath": "world/structures/models/colorless.png",
|
||||
"maskPath": "world/structures/masks/ring.png",
|
||||
"height": 0.5,
|
||||
"width": 0.5,
|
||||
"periodicOutput": false,
|
||||
"symmetry": 8,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"name": "hole",
|
||||
"color": "111111",
|
||||
"color": "808080",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "waste_mountain",
|
||||
"color": "9a9a9a",
|
||||
"name": "tree",
|
||||
"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
|
||||
}
|
||||
]
|
||||
@@ -23,9 +23,6 @@
|
||||
"height": 0.7,
|
||||
"color": "59a650",
|
||||
"spriteNames": [
|
||||
"WoodTree",
|
||||
"WoodTree2",
|
||||
"Bush",
|
||||
"Stump",
|
||||
"Moss",
|
||||
"Stone",
|
||||
@@ -122,39 +119,66 @@
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/forest.png",
|
||||
"maskPath": "world/masks/circle.png",
|
||||
"height": 0.20000002,
|
||||
"width": 0.20000002,
|
||||
"structureAtlasPath": "world/structures/green_structures.atlas",
|
||||
"sourcePath": "world/structures/models/green.png",
|
||||
"maskPath": "world/structures/masks/circle.png",
|
||||
"height": 0.5,
|
||||
"width": 0.5,
|
||||
"symmetry": 1,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"name": "forest",
|
||||
"color": "007000",
|
||||
"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",
|
||||
"name": "water",
|
||||
"color": "000080",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "forest2",
|
||||
"color": "009000",
|
||||
"name": "tree",
|
||||
"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
|
||||
}
|
||||
]
|
||||
|
||||
@@ -23,8 +23,7 @@
|
||||
"height": 1,
|
||||
"color": "110903",
|
||||
"spriteNames": [
|
||||
"Skull",
|
||||
"PlainsRock"
|
||||
"Skull"
|
||||
],
|
||||
"enemies": [
|
||||
"Ammit",
|
||||
@@ -60,9 +59,9 @@
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/mountain.png",
|
||||
"maskPath": "world/masks/circle.png",
|
||||
"structureAtlasPath": "world/structures/structures.atlas",
|
||||
"sourcePath": "world/structures/models/mountain.png",
|
||||
"maskPath": "world/structures/masks/circle.png",
|
||||
"height": 0.5,
|
||||
"width": 0.5,
|
||||
"symmetry": 8,
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"structureAtlasPath": "world/structures/structures.atlas",
|
||||
"sourcePath": "world/models/fill.png",
|
||||
"maskPath": "world/masks/fill.png",
|
||||
"height": 0.99,
|
||||
|
||||
@@ -45,9 +45,9 @@
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/mountain.png",
|
||||
"maskPath": "world/masks/circle.png",
|
||||
"structureAtlasPath": "world/structures/structures.atlas",
|
||||
"sourcePath": "world/structures/models/mountain.png",
|
||||
"maskPath": "world/structures/masks/circle.png",
|
||||
"height": 0.5,
|
||||
"width": 0.5,
|
||||
"periodicOutput": false,
|
||||
|
||||
@@ -23,9 +23,6 @@
|
||||
"height": 0.7,
|
||||
"color": "b63729",
|
||||
"spriteNames": [
|
||||
"MountainTree",
|
||||
"MountainTree2",
|
||||
"MountainRock",
|
||||
"Gravel"
|
||||
],
|
||||
"enemies": [
|
||||
@@ -127,21 +124,41 @@
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/mountain.png",
|
||||
"maskPath": "world/masks/ring.png",
|
||||
"structureAtlasPath": "world/structures/red_structures.atlas",
|
||||
"sourcePath": "world/structures/models/red.png",
|
||||
"maskPath": "world/structures/masks/ring.png",
|
||||
"height": 0.5,
|
||||
"width": 0.5,
|
||||
"periodicOutput": false,
|
||||
"symmetry": 8,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"name": "mountain",
|
||||
"color": "a07020",
|
||||
"color": "ff0000",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "mountain_forest",
|
||||
"color": "007000",
|
||||
"name": "tree",
|
||||
"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
|
||||
}
|
||||
]
|
||||
@@ -149,15 +166,37 @@
|
||||
{
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/lava.png",
|
||||
"maskPath": "world/masks/circle.png",
|
||||
"structureAtlasPath": "world/structures/red_structures.atlas",
|
||||
"sourcePath": "world/structures/models/volcano.png",
|
||||
"maskPath": "world/structures/masks/circle.png",
|
||||
"height": 0.2,
|
||||
"width": 0.2,
|
||||
"N": 2,
|
||||
"symmetry": 8,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
"height": 0.5,
|
||||
"color": "efe697",
|
||||
"spriteNames": [
|
||||
"PlainsRock",
|
||||
"Skull"
|
||||
],
|
||||
"enemies": [
|
||||
|
||||
@@ -23,9 +23,6 @@
|
||||
"height": 0.7,
|
||||
"color": "efe697",
|
||||
"spriteNames": [
|
||||
"PlainsTree",
|
||||
"Cactus",
|
||||
"PlainsRock",
|
||||
"DarkGras"
|
||||
],
|
||||
"enemies": [
|
||||
@@ -117,33 +114,74 @@
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/plains_forest.png",
|
||||
"maskPath": "world/masks/circle.png",
|
||||
"structureAtlasPath": "world/structures/white_structures.atlas",
|
||||
"sourcePath": "world/structures/models/white.png",
|
||||
"maskPath": "world/structures/masks/circle.png",
|
||||
"height": 0.20000002,
|
||||
"width": 0.20000002,
|
||||
"symmetry": 8,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"name": "plains_forest",
|
||||
"color": "9c4000",
|
||||
"name": "tree",
|
||||
"color": "ff8000",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "tree2",
|
||||
"color": "008000",
|
||||
"collision": true
|
||||
},
|
||||
{
|
||||
"name": "tree3",
|
||||
"color": "00ff00",
|
||||
"collision": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"N": 2,
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"structureAtlasPath": "world/tilesets/structures.atlas",
|
||||
"sourcePath": "world/models/plateau.png",
|
||||
"maskPath": "world/masks/ring.png",
|
||||
"symmetry": 8,
|
||||
"structureAtlasPath": "world/structures/white_structures.atlas",
|
||||
"sourcePath": "world/structures/models/desert.png",
|
||||
"maskPath": "world/structures/masks/ring.png",
|
||||
"height": 0.5,
|
||||
"width": 0.5,
|
||||
"periodicOutput": false,
|
||||
"mappingInfo": [
|
||||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
|
||||
@@ -12542,7 +12542,7 @@
|
||||
"spawnRate": 1,
|
||||
"difficulty": 0.1,
|
||||
"speed": 25,
|
||||
"scale": 0.6,
|
||||
"scale": 1.3,
|
||||
"life": 11,
|
||||
"rewards": [
|
||||
{
|
||||
|
||||
@@ -5,289 +5,382 @@ filter: Nearest,Nearest
|
||||
repeat: none
|
||||
DarkWood
|
||||
xy: 0, 0
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
DarkWood
|
||||
xy: 16, 0
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
DarkWood
|
||||
xy: 32, 0
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
DarkWood
|
||||
xy: 48, 0
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Reed
|
||||
xy: 64, 0
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Reed
|
||||
xy: 80, 0
|
||||
size: 16, 16
|
||||
Reed
|
||||
xy: 64, 16
|
||||
size: 16, 16
|
||||
Reed
|
||||
xy: 80, 16
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
DarkWood
|
||||
xy: 96, 0
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
DarkWood
|
||||
xy: 112, 0
|
||||
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
|
||||
size: 16, 16
|
||||
DarkWood
|
||||
xy: 0, 16
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
DarkWood
|
||||
xy: 16, 16
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
DarkWood
|
||||
xy: 32, 16
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
DarkWood
|
||||
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
|
||||
xy: 0, 32
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
DarkGras
|
||||
xy: 16, 32
|
||||
size: 16, 16
|
||||
DarkGras
|
||||
xy: 0, 48
|
||||
size: 16, 16
|
||||
DarkGras
|
||||
xy: 16, 48
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Stone
|
||||
xy: 32, 32
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Stone
|
||||
xy: 48, 32
|
||||
size: 16, 16
|
||||
Stone
|
||||
xy: 32, 48
|
||||
size: 16, 16
|
||||
Stone
|
||||
xy: 48, 48
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Gravel
|
||||
xy: 64, 32
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Gravel
|
||||
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
|
||||
xy: 64, 48
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Gravel
|
||||
xy: 80, 48
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Flower
|
||||
xy: 0, 64
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Flower
|
||||
xy: 16, 64
|
||||
size: 16, 16
|
||||
Flower
|
||||
xy: 0, 80
|
||||
size: 16, 16
|
||||
Flower
|
||||
xy: 16, 80
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Stone
|
||||
xy: 32, 64
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Stone
|
||||
xy: 48, 64
|
||||
size: 16, 16
|
||||
Stone
|
||||
xy: 32, 80
|
||||
size: 16, 16
|
||||
Stone
|
||||
xy: 48, 80
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Moss
|
||||
xy: 64, 64
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Moss
|
||||
xy: 80, 64
|
||||
size: 16, 16
|
||||
Moss
|
||||
xy: 64, 80
|
||||
size: 16, 16
|
||||
Moss
|
||||
xy: 80, 80
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Wood
|
||||
xy: 96, 64
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Wood
|
||||
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
|
||||
xy: 96, 80
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Wood
|
||||
xy: 112, 80
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WasteTree
|
||||
xy: 0, 96
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WasteTree
|
||||
xy: 16, 96
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WasteTree
|
||||
xy: 32, 96
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WasteRock
|
||||
xy: 48, 96
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WasteRock
|
||||
xy: 64, 96
|
||||
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
|
||||
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
|
||||
size: 16, 16
|
||||
Placeholder
|
||||
xy: 80, 96
|
||||
size: 16,16
|
||||
SwampTree2
|
||||
xy: 96, 96
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
SwampTree2
|
||||
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
|
||||
xy: 0, 128
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
PlainsTree
|
||||
xy: 16, 128
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Cactus
|
||||
xy: 32, 128
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Cactus
|
||||
xy: 48, 128
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Cactus
|
||||
xy: 64, 128
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
PlainsRock
|
||||
xy: 70, 128
|
||||
size: 16, 16
|
||||
xy: 80, 128
|
||||
size: 16, 16
|
||||
PlainsRock
|
||||
xy: 96, 128
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Skull
|
||||
xy: 112, 128
|
||||
size: 16, 16
|
||||
IslandTree
|
||||
xy: 0, 144
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
IslandTree
|
||||
xy: 16, 144
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Coral
|
||||
xy: 32, 144
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Shell
|
||||
xy: 48, 144
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Shell
|
||||
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
|
||||
xy: 0, 160
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WoodTree
|
||||
xy: 16, 160
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WoodTree
|
||||
xy: 32, 160
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WoodTree
|
||||
xy: 48, 160
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WoodTree2
|
||||
xy: 64, 160
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
WoodTree2
|
||||
xy: 80, 160
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Bush
|
||||
xy: 96, 160
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
Stump
|
||||
xy: 112, 160
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
MountainTree
|
||||
xy: 0, 176
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
MountainTree
|
||||
xy: 16, 176
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
MountainTree2
|
||||
xy: 32, 176
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
MountainTree2
|
||||
xy: 48, 176
|
||||
size: 16, 16
|
||||
MountainTree2
|
||||
xy: 96, 176
|
||||
size: 16, 16
|
||||
MountainTree2
|
||||
xy: 112, 176
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
MountainRock
|
||||
xy: 64, 176
|
||||
size: 16, 16
|
||||
size: 16, 16
|
||||
MountainRock
|
||||
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
|
||||
xy: 96, 224
|
||||
size: 32, 32
|
||||
size: 32, 32
|
||||
LargePlainsRock
|
||||
xy: 96, 256
|
||||
size: 32, 32
|
||||
size: 32, 32
|
||||
Placeholder
|
||||
xy: 0, 256
|
||||
size: 16, 16
|
||||
WasteRock
|
||||
xy: 16, 256
|
||||
size: 16, 16
|
||||
LargeSwampRock
|
||||
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
|
||||
@@ -2,7 +2,7 @@
|
||||
"textureAtlas":"world/sprites/map_sprites.atlas",
|
||||
"sprites":[
|
||||
{
|
||||
"name":"DarkWood",
|
||||
"name":"DarkWood",
|
||||
"startArea":0.2,
|
||||
"endArea":0.7,
|
||||
"layer":-1,
|
||||
@@ -22,7 +22,7 @@
|
||||
"layer":-1,
|
||||
"density":0.03
|
||||
},{
|
||||
"name":"Reed",
|
||||
"name":"Reed",
|
||||
"startArea":0.9,
|
||||
"endArea":0.99,
|
||||
"layer":0,
|
||||
@@ -46,7 +46,7 @@
|
||||
"name":"Stone",
|
||||
"startArea":0.2,
|
||||
"endArea":0.7,
|
||||
"layer":-1,
|
||||
"layer":-1,
|
||||
"resolution" :5,
|
||||
"density":0.01
|
||||
},{
|
||||
@@ -79,21 +79,21 @@
|
||||
"name":"WasteTree",
|
||||
"startArea":0.0,
|
||||
"endArea":0.2,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :10,
|
||||
"density":0.7
|
||||
},{
|
||||
"name":"WasteRock",
|
||||
"startArea":0.8,
|
||||
"endArea":1.0,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :10,
|
||||
"density":0.5
|
||||
},{
|
||||
"name":"SwampTree",
|
||||
"startArea":0.8,
|
||||
"endArea":1.0,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :10,
|
||||
"density":0.5
|
||||
},{
|
||||
@@ -106,45 +106,45 @@
|
||||
"name":"SwampRock",
|
||||
"startArea":0.5,
|
||||
"endArea":0.6,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"density":0.1
|
||||
},{
|
||||
"name":"SwampTree2",
|
||||
"startArea":0.0,
|
||||
"endArea":0.2,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :10,
|
||||
"density":0.7
|
||||
},{
|
||||
"name":"PlainsTree",
|
||||
"startArea":0.0,
|
||||
"endArea":0.2,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :10,
|
||||
"density":0.7
|
||||
},{
|
||||
"name":"Cactus",
|
||||
"startArea":0.5,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"endArea":0.7,
|
||||
"density":0.06
|
||||
},{
|
||||
"name":"PlainsRock",
|
||||
"startArea":0.7,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"endArea":0.99,
|
||||
"density":0.06
|
||||
},{
|
||||
"name":"IslandTree",
|
||||
"startArea":0.0,
|
||||
"endArea":0.2,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :10,
|
||||
"density":0.7
|
||||
},{
|
||||
"name":"Coral",
|
||||
"startArea":0.0,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"endArea":0.9,
|
||||
"density":0.01
|
||||
},{
|
||||
@@ -157,65 +157,65 @@
|
||||
"name":"WoodTree",
|
||||
"startArea":0.0,
|
||||
"endArea":0.2,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :10,
|
||||
"density":0.7
|
||||
},{
|
||||
"name":"WoodTree2",
|
||||
"startArea":0.8,
|
||||
"endArea":0.99,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :5,
|
||||
"density":0.7
|
||||
},{
|
||||
"name":"Bush",
|
||||
"startArea":0.0,
|
||||
"endArea":0.2,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :5,
|
||||
"density":0.4
|
||||
},{
|
||||
"name":"Stump",
|
||||
"startArea":0.0,
|
||||
"layer":0,
|
||||
"layer":-1,
|
||||
"endArea":0.9,
|
||||
"density":0.01
|
||||
},{
|
||||
"name":"MountainTree",
|
||||
"startArea":0.0,
|
||||
"endArea":0.2,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :5,
|
||||
"density":0.7
|
||||
},{
|
||||
"name":"MountainTree2",
|
||||
"startArea":0.8,
|
||||
"endArea":0.99,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"resolution" :5,
|
||||
"density":0.7
|
||||
},{
|
||||
"name":"MountainRock",
|
||||
"startArea":0.1,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"endArea":0.9,
|
||||
"density":0.08
|
||||
},{
|
||||
"name":"LargeMountainRock",
|
||||
"startArea":0.0,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"endArea":0.9,
|
||||
"density":0.02
|
||||
},{
|
||||
"name":"LargePlainsRock",
|
||||
"startArea":0.0,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"endArea":0.9,
|
||||
"density":0.01
|
||||
},{
|
||||
"name":"LargeSwampRock",
|
||||
"startArea":0.0,
|
||||
"layer":0,
|
||||
"layer":1,
|
||||
"endArea":0.9,
|
||||
"density":0.01
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
After Width: | Height: | Size: 38 KiB |
@@ -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
|
||||
|
After Width: | Height: | Size: 37 KiB |
@@ -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
|
||||
|
After Width: | Height: | Size: 29 KiB |
@@ -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
|
||||
|
After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 508 B After Width: | Height: | Size: 508 B |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
BIN
forge-gui/res/adventure/common/world/structures/models/beach.png
Normal file
|
After Width: | Height: | Size: 192 B |
BIN
forge-gui/res/adventure/common/world/structures/models/black.png
Normal file
|
After Width: | Height: | Size: 261 B |
BIN
forge-gui/res/adventure/common/world/structures/models/blue.png
Normal file
|
After Width: | Height: | Size: 279 B |
|
After Width: | Height: | Size: 234 B |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 180 B |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 508 B After Width: | Height: | Size: 508 B |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
BIN
forge-gui/res/adventure/common/world/structures/models/green.png
Normal file
|
After Width: | Height: | Size: 318 B |
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB |
BIN
forge-gui/res/adventure/common/world/structures/models/red.png
Normal file
|
After Width: | Height: | Size: 186 B |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 228 B |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |
BIN
forge-gui/res/adventure/common/world/structures/models/white.png
Normal file
|
After Width: | Height: | Size: 132 B |
@@ -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
|
||||
|
After Width: | Height: | Size: 33 KiB |
@@ -57,4 +57,4 @@ waste_mountain
|
||||
size: 48, 64
|
||||
waste_structure
|
||||
xy: 96, 320
|
||||
size: 48, 64
|
||||
size: 48, 64
|
||||
BIN
forge-gui/res/adventure/common/world/structures/structures.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
@@ -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
|
||||
|
After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 41 KiB |
@@ -4,16 +4,16 @@ size: 192,512
|
||||
format: RGBA8888
|
||||
filter: Nearest,Nearest
|
||||
repeat: none
|
||||
Waste
|
||||
Colorless
|
||||
xy: 0, 64
|
||||
size: 48, 64
|
||||
Waste_1
|
||||
Colorless_1
|
||||
xy: 48, 64
|
||||
size: 48, 64
|
||||
Waste_2
|
||||
Colorless_2
|
||||
xy: 96, 64
|
||||
size: 48, 64
|
||||
Waste_3
|
||||
Colorless_3
|
||||
xy: 144, 64
|
||||
size: 48, 64
|
||||
White
|
||||
|
||||
@@ -11,11 +11,8 @@ ALTERNATE
|
||||
Name:Consume
|
||||
ManaCost:2 W B
|
||||
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.
|
||||
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
|
||||
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:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
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.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Gale's Redirection
|
||||
ManaCost:3 U U
|
||||
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: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.
|
||||
@@ -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:Y:SpellTargeted$CardManaCostLKI
|
||||
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.
|
||||
|
||||
@@ -5,7 +5,7 @@ PT:5/5
|
||||
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.
|
||||
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:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:TriggerCount$DamageAmount
|
||||
|
||||
@@ -4,7 +4,7 @@ Types:Creature Angel
|
||||
PT:7/7
|
||||
K:Flying
|
||||
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.
|
||||
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.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:2
|
||||
Types:Artifact Creature Phyrexian Golem
|
||||
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.
|
||||
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
|
||||
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.
|
||||
|
||||
@@ -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}
|
||||
9
forge-gui/res/cardsfolder/upcoming/galadhrim_ambush.txt
Normal 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.
|
||||
@@ -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.)
|
||||