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 {
// 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.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.

View File

@@ -114,10 +114,11 @@ 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?

View File

@@ -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.

View File

@@ -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);

View File

@@ -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);

View File

@@ -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();
}

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
*/
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();
}

View File

@@ -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());
}
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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",

Binary file not shown.

View 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
}
]

View File

@@ -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
}
]

View File

@@ -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
}
]

View File

@@ -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
}
]

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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
}
]

View File

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

View File

@@ -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
}
]

View File

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

View File

@@ -21,36 +21,12 @@ Reed
Reed
xy: 80, 0
size: 16, 16
Reed
xy: 64, 16
size: 16, 16
Reed
xy: 80, 16
size: 16, 16
DarkWood
xy: 96, 0
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
DarkWood
xy: 0, 16
size: 16, 16
@@ -63,36 +39,60 @@ DarkWood
DarkWood
xy: 48, 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
DarkGras
xy: 16, 32
size: 16, 16
DarkGras
xy: 0, 48
size: 16, 16
DarkGras
xy: 16, 48
size: 16, 16
Stone
xy: 32, 32
size: 16, 16
Stone
xy: 48, 32
size: 16, 16
Stone
xy: 32, 48
size: 16, 16
Stone
xy: 48, 48
size: 16, 16
Gravel
xy: 64, 32
size: 16, 16
Gravel
xy: 80, 32
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
@@ -105,42 +105,42 @@ Flower
Flower
xy: 16, 64
size: 16, 16
Flower
xy: 0, 80
size: 16, 16
Flower
xy: 16, 80
size: 16, 16
Stone
xy: 32, 64
size: 16, 16
Stone
xy: 48, 64
size: 16, 16
Moss
xy: 64, 64
size: 16, 16
Moss
xy: 80, 64
size: 16, 16
Wood
xy: 96, 64
size: 16, 16
Wood
xy: 112, 64
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, 64
size: 16, 16
Moss
xy: 80, 64
size: 16, 16
Moss
xy: 64, 80
size: 16, 16
Moss
xy: 80, 80
size: 16, 16
Wood
xy: 96, 64
size: 16, 16
Wood
xy: 112, 64
size: 16, 16
Wood
xy: 96, 80
size: 16, 16
@@ -162,6 +162,15 @@ WasteRock
WasteRock
xy: 64, 96
size: 16, 16
Placeholder
xy: 80, 96
size: 16,16
SwampTree2
xy: 96, 96
size: 16, 16
SwampTree2
xy: 112, 96
size: 16, 16
SwampTree
xy: 0, 112
size: 16, 16
@@ -174,12 +183,6 @@ SwampTree
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
@@ -192,12 +195,6 @@ SwampTree2
SwampTree2
xy: 112, 112
size: 16, 16
SwampTree2
xy: 96, 96
size: 16, 16
SwampTree2
xy: 112, 96
size: 16, 16
PlainsTree
xy: 0, 128
size: 16, 16
@@ -214,11 +211,14 @@ Cactus
xy: 64, 128
size: 16, 16
PlainsRock
xy: 70, 128
xy: 80, 128
size: 16, 16
PlainsRock
xy: 96, 128
size: 16, 16
Skull
xy: 112, 128
size: 16, 16
IslandTree
xy: 0, 144
size: 16, 16
@@ -234,6 +234,15 @@ Shell
Shell
xy: 64, 144
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
@@ -270,24 +279,108 @@ MountainTree2
MountainTree2
xy: 48, 176
size: 16, 16
MountainTree2
xy: 96, 176
size: 16, 16
MountainTree2
xy: 112, 176
size: 16, 16
MountainRock
xy: 64, 176
size: 16, 16
MountainRock
xy: 80, 176
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
LargePlainsRock
xy: 96, 256
size: 32, 32
Placeholder
xy: 0, 256
size: 16, 16
WasteRock
xy: 16, 256
size: 16, 16
LargeSwampRock
xy: 32, 256
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

@@ -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
}

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

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
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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

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