diff --git a/core/assets/maps/frozenForest.msav b/core/assets/maps/frozenForest.msav index b1dcac3001..8e6ab8fdc9 100644 Binary files a/core/assets/maps/frozenForest.msav and b/core/assets/maps/frozenForest.msav differ diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 45ac6f9dda..8d9a4e0c5f 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -37,8 +37,6 @@ public class Vars{ public static final String donationURL = "https://anuke.itch.io/mindustry/purchase"; /** URL for discord invite. */ public static final String discordURL = "https://discord.gg/mindustry"; - /** URL for Github API for releases */ - public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases"; /** URL for sending crash reports to */ public static final String crashReportURL = "http://mins.us.to/report"; /** maximum distance between mine and core that supports automatic transferring */ diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 986cd7ae75..0adb55d652 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -1192,14 +1192,14 @@ public class Blocks implements ContentList{ cultivator = new Cultivator("cultivator"){{ requirements(Category.production, ItemStack.with(Items.copper, 20, Items.lead, 50, Items.silicon, 20)); outputItem = new ItemStack(Items.sporePod, 1); - craftTime = 160; + craftTime = 140; size = 2; hasLiquids = true; hasPower = true; hasItems = true; consumes.power(0.80f); - consumes.liquid(Liquids.water, 0.15f); + consumes.liquid(Liquids.water, 0.18f); }}; oilExtractor = new Fracker("oil-extractor"){{ diff --git a/core/src/io/anuke/mindustry/content/Items.java b/core/src/io/anuke/mindustry/content/Items.java index 6ee41034c2..09ed696d26 100644 --- a/core/src/io/anuke/mindustry/content/Items.java +++ b/core/src/io/anuke/mindustry/content/Items.java @@ -85,7 +85,7 @@ public class Items implements ContentList{ }}; sporePod = new Item("spore-pod", Color.valueOf("7457ce")){{ - flammability = 1.05f; + flammability = 1.1f; }}; blastCompound = new Item("blast-compound", Color.valueOf("ff795e")){{ diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 593f094f30..ad619bed2b 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -89,6 +89,7 @@ public class UI implements ApplicationListener{ }); Colors.put("accent", Pal.accent); + Colors.put("highlight", Pal.accent.cpy().lerp(Color.WHITE, 0.3f)); Colors.put("stat", Pal.stat); loadCursors(); diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 2fb16900ee..59cda8703f 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -9,7 +9,6 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.ai.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.editor.MapGenerateDialog.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; @@ -485,10 +484,9 @@ public class World implements ApplicationListener{ if(!filters.isEmpty()){ //input for filter queries GenerateInput input = new GenerateInput(); - GenTile gtile = new GenTile(); for(GenerateFilter filter : filters){ - input.begin(filter, width(), height(), (x, y) -> gtile.set(tiles[x][y])); + input.begin(filter, width(), height(), (x, y) -> tiles[x][y]); //actually apply the filter for(int x = 0; x < width(); x++){ diff --git a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java index a78d342366..545cc4004e 100644 --- a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java @@ -48,6 +48,13 @@ public class MapGenerateDialog extends FloatingDialog{ private GenTile[][] buffer1, buffer2; private Consumer> applier; + private CachedTile ctile = new CachedTile(){ + //nothing. + @Override + protected void changed(){ + + } + }; /** @param applied whether or not to use the applied in-game mode. */ public MapGenerateDialog(MapEditor editor, boolean applied){ @@ -84,7 +91,7 @@ public class MapGenerateDialog extends FloatingDialog{ hidden(this::apply); } - onResize(() -> rebuildFilters()); + onResize(this::rebuildFilters); } public void show(Array filters, Consumer> applier){ @@ -109,7 +116,7 @@ public class MapGenerateDialog extends FloatingDialog{ } for(GenerateFilter filter : filters){ - input.begin(filter, editor.width(), editor.height(), (x, y) -> dset(editor.tile(x, y))); + input.begin(filter, editor.width(), editor.height(), editor::tile); //write to buffer for(int x = 0; x < editor.width(); x++){ for(int y = 0; y < editor.height(); y++){ @@ -363,7 +370,7 @@ public class MapGenerateDialog extends FloatingDialog{ } for(GenerateFilter filter : copy){ - input.begin(filter, editor.width(), editor.height(), (x, y) -> buffer1[Mathf.clamp(x / scaling, 0, pixmap.getWidth()-1)][Mathf.clamp(y / scaling, 0, pixmap.getHeight()-1)]); + input.begin(filter, editor.width(), editor.height(), (x, y) -> buffer1[Mathf.clamp(x / scaling, 0, pixmap.getWidth()-1)][Mathf.clamp(y / scaling, 0, pixmap.getHeight()-1)].tile()); //read from buffer1 and write to buffer2 for(int px = 0; px < pixmap.getWidth(); px++){ for(int py = 0; py < pixmap.getHeight(); py++){ @@ -411,7 +418,7 @@ public class MapGenerateDialog extends FloatingDialog{ }); } - public static class GenTile{ + private class GenTile{ public byte team, rotation; public short block, floor, ore; @@ -435,5 +442,14 @@ public class MapGenerateDialog extends FloatingDialog{ set(other.floor(), other.block(), other.overlay(), other.getTeam(), other.rotation()); return this; } + + Tile tile(){ + ctile.setFloor((Floor)content.block(floor)); + ctile.setBlock(content.block(block)); + ctile.setOverlay(content.block(ore)); + ctile.rotation(rotation); + ctile.setTeam(Team.all[team]); + return ctile; + } } } diff --git a/core/src/io/anuke/mindustry/maps/filters/BlendFilter.java b/core/src/io/anuke/mindustry/maps/filters/BlendFilter.java index cbb62f46eb..f1f16e7800 100644 --- a/core/src/io/anuke/mindustry/maps/filters/BlendFilter.java +++ b/core/src/io/anuke/mindustry/maps/filters/BlendFilter.java @@ -1,11 +1,9 @@ package io.anuke.mindustry.maps.filters; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.editor.MapGenerateDialog.*; -import io.anuke.mindustry.maps.filters.FilterOption.BlockOption; -import io.anuke.mindustry.maps.filters.FilterOption.SliderOption; -import io.anuke.mindustry.world.Block; +import io.anuke.arc.math.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.maps.filters.FilterOption.*; +import io.anuke.mindustry.world.*; import static io.anuke.mindustry.maps.filters.FilterOption.*; @@ -34,9 +32,9 @@ public class BlendFilter extends GenerateFilter{ for(int x = -rad; x <= rad; x++){ for(int y = -rad; y <= rad; y++){ if(Mathf.dst2(x, y) > rad*rad) continue; - GenTile tile = in.tile(in.x + x, in.y + y); + Tile tile = in.tile(in.x + x, in.y + y); - if(tile.floor == block.id || tile.block == block.id || tile.ore == block.id){ + if(tile.floor() == block || tile.block() == block || tile.overlay() == block){ found = true; break outer; } diff --git a/core/src/io/anuke/mindustry/maps/filters/DistortFilter.java b/core/src/io/anuke/mindustry/maps/filters/DistortFilter.java index a2aa5f853c..4da9afaefb 100644 --- a/core/src/io/anuke/mindustry/maps/filters/DistortFilter.java +++ b/core/src/io/anuke/mindustry/maps/filters/DistortFilter.java @@ -1,10 +1,8 @@ package io.anuke.mindustry.maps.filters; -import io.anuke.mindustry.editor.MapGenerateDialog.GenTile; -import io.anuke.mindustry.maps.filters.FilterOption.SliderOption; -import io.anuke.mindustry.world.blocks.Floor; - -import static io.anuke.mindustry.Vars.content; +import io.anuke.mindustry.maps.filters.FilterOption.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; public class DistortFilter extends GenerateFilter{ float scl = 40, mag = 5; @@ -19,10 +17,10 @@ public class DistortFilter extends GenerateFilter{ @Override public void apply(){ - GenTile tile = in.tile(in.x + noise(in.x, in.y, scl, mag) - mag / 2f, in.y + noise(in.x, in.y + o, scl, mag) - mag / 2f); + Tile tile = in.tile(in.x + noise(in.x, in.y, scl, mag) - mag / 2f, in.y + noise(in.x, in.y + o, scl, mag) - mag / 2f); - in.floor = content.block(tile.floor); - if(!content.block(tile.block).synthetic() && !in.block.synthetic()) in.block = content.block(tile.block); - if(!((Floor)in.floor).isLiquid) in.ore = content.block(tile.ore); + in.floor = tile.floor(); + if(!tile.block().synthetic() && !in.block.synthetic()) in.block = tile.block(); + if(!((Floor)in.floor).isLiquid) in.ore = tile.overlay(); } } diff --git a/core/src/io/anuke/mindustry/maps/filters/GenerateFilter.java b/core/src/io/anuke/mindustry/maps/filters/GenerateFilter.java index 007f2c1dbb..2ab84d2864 100644 --- a/core/src/io/anuke/mindustry/maps/filters/GenerateFilter.java +++ b/core/src/io/anuke/mindustry/maps/filters/GenerateFilter.java @@ -6,7 +6,6 @@ import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.*; import io.anuke.arc.util.noise.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.editor.MapGenerateDialog.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; @@ -95,12 +94,12 @@ public abstract class GenerateFilter{ pnoise.setSeed((int)(filter.seed + 1)); } - GenTile tile(float x, float y){ + Tile tile(float x, float y){ return buffer.get(Mathf.clamp((int)x, 0, width - 1), Mathf.clamp((int)y, 0, height - 1)); } public interface TileProvider{ - GenTile get(int x, int y); + Tile get(int x, int y); } } } diff --git a/core/src/io/anuke/mindustry/maps/filters/MedianFilter.java b/core/src/io/anuke/mindustry/maps/filters/MedianFilter.java index 0ebba247e3..9cc4606d20 100644 --- a/core/src/io/anuke/mindustry/maps/filters/MedianFilter.java +++ b/core/src/io/anuke/mindustry/maps/filters/MedianFilter.java @@ -1,9 +1,9 @@ package io.anuke.mindustry.maps.filters; -import io.anuke.arc.collection.IntArray; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.editor.MapGenerateDialog.GenTile; -import io.anuke.mindustry.maps.filters.FilterOption.SliderOption; +import io.anuke.arc.collection.*; +import io.anuke.arc.math.*; +import io.anuke.mindustry.maps.filters.FilterOption.*; +import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.content; @@ -29,9 +29,9 @@ public class MedianFilter extends GenerateFilter{ for(int y = -rad; y <= rad; y++){ if(Mathf.dst2(x, y) > rad*rad) continue; - GenTile tile = in.tile(in.x + x, in.y + y); - blocks.add(tile.block); - floors.add(tile.floor); + Tile tile = in.tile(in.x + x, in.y + y); + blocks.add(tile.block().id); + floors.add(tile.floor().id); } } diff --git a/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java b/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java index 9397f9bf03..866dc791f1 100644 --- a/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java +++ b/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java @@ -6,19 +6,17 @@ import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.editor.MapGenerateDialog.*; -import io.anuke.mindustry.maps.filters.FilterOption.*; import io.anuke.mindustry.graphics.*; - -import static io.anuke.mindustry.Vars.content; +import io.anuke.mindustry.maps.filters.FilterOption.*; +import io.anuke.mindustry.world.*; public class MirrorFilter extends GenerateFilter{ private final Vector2 v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2(); - float angle = 45; + int angle = 45; { - options(new SliderOption("angle", () -> angle, f -> angle = f, 0, 360, 45)); + options(new SliderOption("angle", () -> angle, f -> angle = (int)f, 0, 360, 45)); } @Override @@ -33,10 +31,10 @@ public class MirrorFilter extends GenerateFilter{ if(!left(v1, v2, v3)){ mirror(v3, v1.x, v1.y, v2.x, v2.y); - GenTile tile = in.tile(v3.x, v3.y); - in.floor = content.block(tile.floor); - in.block = content.block(tile.block); - in.ore = content.block(tile.ore); + Tile tile = in.tile(v3.x, v3.y); + in.floor = tile.floor(); + in.block = tile.block(); + in.ore = tile.overlay(); } } @@ -45,8 +43,8 @@ public class MirrorFilter extends GenerateFilter{ super.draw(image); Vector2 vsize = Scaling.fit.apply(image.getDrawable().getMinWidth(), image.getDrawable().getMinHeight(), image.getWidth(), image.getHeight()); - float imageWidth = vsize.x; - float imageHeight = vsize.y; + float imageWidth = Math.max(vsize.x, vsize.y); + float imageHeight = Math.max(vsize.y, vsize.x); float size = Math.max(image.getWidth() *2, image.getHeight()*2); Consumer clamper = v -> @@ -65,13 +63,19 @@ public class MirrorFilter extends GenerateFilter{ } void mirror(Vector2 p, float x0, float y0, float x1, float y1){ - float dx = x1 - x0; - float dy = y1 - y0; + //special case: uneven map mirrored at 45 degree angle + if(in.width != in.height && angle % 90 != 0){ + p.x = (p.x - in.width/2f) * -1 + in.width/2f; + p.y = (p.y - in.height/2f) * -1 + in.height/2f; + }else{ + float dx = x1 - x0; + float dy = y1 - y0; - float a = (dx * dx - dy * dy) / (dx * dx + dy*dy); - float b = 2 * dx * dy / (dx*dx + dy*dy); + float a = (dx * dx - dy * dy) / (dx * dx + dy * dy); + float b = 2 * dx * dy / (dx * dx + dy * dy); - p.set((a * (p.x - x0) + b*(p.y - y0) + x0), (b * (p.x - x0) - a*(p.y - y0) + y0)); + p.set((a * (p.x - x0) + b * (p.y - y0) + x0), (b * (p.x - x0) - a * (p.y - y0) + y0)); + } } boolean left(Vector2 a, Vector2 b, Vector2 c){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java index 0d0d653184..9f89cd2406 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -103,8 +103,8 @@ public class ZoneInfoDialog extends FloatingDialog{ cont.addImage("whiteui").color(Pal.accent).height(3).pad(6).growX(); cont.row(); cont.table(desc -> { - desc.left().defaults().left().width(400f); - desc.add(zone.description).wrap().padBottom(8f); + desc.left().defaults().left().width(500f); + desc.add(zone.description).wrap().pad(2).padBottom(8f); desc.row(); desc.table(t -> {