mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-07-11 00:07:46 +07:00
Bugfixes
This commit is contained in:
Binary file not shown.
@ -37,8 +37,6 @@ public class Vars{
|
|||||||
public static final String donationURL = "https://anuke.itch.io/mindustry/purchase";
|
public static final String donationURL = "https://anuke.itch.io/mindustry/purchase";
|
||||||
/** URL for discord invite. */
|
/** URL for discord invite. */
|
||||||
public static final String discordURL = "https://discord.gg/mindustry";
|
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 */
|
/** URL for sending crash reports to */
|
||||||
public static final String crashReportURL = "http://mins.us.to/report";
|
public static final String crashReportURL = "http://mins.us.to/report";
|
||||||
/** maximum distance between mine and core that supports automatic transferring */
|
/** maximum distance between mine and core that supports automatic transferring */
|
||||||
|
@ -1192,14 +1192,14 @@ public class Blocks implements ContentList{
|
|||||||
cultivator = new Cultivator("cultivator"){{
|
cultivator = new Cultivator("cultivator"){{
|
||||||
requirements(Category.production, ItemStack.with(Items.copper, 20, Items.lead, 50, Items.silicon, 20));
|
requirements(Category.production, ItemStack.with(Items.copper, 20, Items.lead, 50, Items.silicon, 20));
|
||||||
outputItem = new ItemStack(Items.sporePod, 1);
|
outputItem = new ItemStack(Items.sporePod, 1);
|
||||||
craftTime = 160;
|
craftTime = 140;
|
||||||
size = 2;
|
size = 2;
|
||||||
hasLiquids = true;
|
hasLiquids = true;
|
||||||
hasPower = true;
|
hasPower = true;
|
||||||
hasItems = true;
|
hasItems = true;
|
||||||
|
|
||||||
consumes.power(0.80f);
|
consumes.power(0.80f);
|
||||||
consumes.liquid(Liquids.water, 0.15f);
|
consumes.liquid(Liquids.water, 0.18f);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
oilExtractor = new Fracker("oil-extractor"){{
|
oilExtractor = new Fracker("oil-extractor"){{
|
||||||
|
@ -85,7 +85,7 @@ public class Items implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
sporePod = new Item("spore-pod", Color.valueOf("7457ce")){{
|
sporePod = new Item("spore-pod", Color.valueOf("7457ce")){{
|
||||||
flammability = 1.05f;
|
flammability = 1.1f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
blastCompound = new Item("blast-compound", Color.valueOf("ff795e")){{
|
blastCompound = new Item("blast-compound", Color.valueOf("ff795e")){{
|
||||||
|
@ -89,6 +89,7 @@ public class UI implements ApplicationListener{
|
|||||||
});
|
});
|
||||||
|
|
||||||
Colors.put("accent", Pal.accent);
|
Colors.put("accent", Pal.accent);
|
||||||
|
Colors.put("highlight", Pal.accent.cpy().lerp(Color.WHITE, 0.3f));
|
||||||
Colors.put("stat", Pal.stat);
|
Colors.put("stat", Pal.stat);
|
||||||
|
|
||||||
loadCursors();
|
loadCursors();
|
||||||
|
@ -9,7 +9,6 @@ import io.anuke.arc.util.*;
|
|||||||
import io.anuke.mindustry.ai.*;
|
import io.anuke.mindustry.ai.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.*;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.editor.MapGenerateDialog.*;
|
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
@ -485,10 +484,9 @@ public class World implements ApplicationListener{
|
|||||||
if(!filters.isEmpty()){
|
if(!filters.isEmpty()){
|
||||||
//input for filter queries
|
//input for filter queries
|
||||||
GenerateInput input = new GenerateInput();
|
GenerateInput input = new GenerateInput();
|
||||||
GenTile gtile = new GenTile();
|
|
||||||
|
|
||||||
for(GenerateFilter filter : filters){
|
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
|
//actually apply the filter
|
||||||
for(int x = 0; x < width(); x++){
|
for(int x = 0; x < width(); x++){
|
||||||
|
@ -48,6 +48,13 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
|
|
||||||
private GenTile[][] buffer1, buffer2;
|
private GenTile[][] buffer1, buffer2;
|
||||||
private Consumer<Array<GenerateFilter>> applier;
|
private Consumer<Array<GenerateFilter>> applier;
|
||||||
|
private CachedTile ctile = new CachedTile(){
|
||||||
|
//nothing.
|
||||||
|
@Override
|
||||||
|
protected void changed(){
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/** @param applied whether or not to use the applied in-game mode. */
|
/** @param applied whether or not to use the applied in-game mode. */
|
||||||
public MapGenerateDialog(MapEditor editor, boolean applied){
|
public MapGenerateDialog(MapEditor editor, boolean applied){
|
||||||
@ -84,7 +91,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
hidden(this::apply);
|
hidden(this::apply);
|
||||||
}
|
}
|
||||||
|
|
||||||
onResize(() -> rebuildFilters());
|
onResize(this::rebuildFilters);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void show(Array<GenerateFilter> filters, Consumer<Array<GenerateFilter>> applier){
|
public void show(Array<GenerateFilter> filters, Consumer<Array<GenerateFilter>> applier){
|
||||||
@ -109,7 +116,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(GenerateFilter filter : filters){
|
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
|
//write to buffer
|
||||||
for(int x = 0; x < editor.width(); x++){
|
for(int x = 0; x < editor.width(); x++){
|
||||||
for(int y = 0; y < editor.height(); y++){
|
for(int y = 0; y < editor.height(); y++){
|
||||||
@ -363,7 +370,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(GenerateFilter filter : copy){
|
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
|
//read from buffer1 and write to buffer2
|
||||||
for(int px = 0; px < pixmap.getWidth(); px++){
|
for(int px = 0; px < pixmap.getWidth(); px++){
|
||||||
for(int py = 0; py < pixmap.getHeight(); py++){
|
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 byte team, rotation;
|
||||||
public short block, floor, ore;
|
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());
|
set(other.floor(), other.block(), other.overlay(), other.getTeam(), other.rotation());
|
||||||
return this;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
package io.anuke.mindustry.maps.filters;
|
package io.anuke.mindustry.maps.filters;
|
||||||
|
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.mindustry.content.Blocks;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.editor.MapGenerateDialog.*;
|
import io.anuke.mindustry.maps.filters.FilterOption.*;
|
||||||
import io.anuke.mindustry.maps.filters.FilterOption.BlockOption;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.maps.filters.FilterOption.SliderOption;
|
|
||||||
import io.anuke.mindustry.world.Block;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.maps.filters.FilterOption.*;
|
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 x = -rad; x <= rad; x++){
|
||||||
for(int y = -rad; y <= rad; y++){
|
for(int y = -rad; y <= rad; y++){
|
||||||
if(Mathf.dst2(x, y) > rad*rad) continue;
|
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;
|
found = true;
|
||||||
break outer;
|
break outer;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package io.anuke.mindustry.maps.filters;
|
package io.anuke.mindustry.maps.filters;
|
||||||
|
|
||||||
import io.anuke.mindustry.editor.MapGenerateDialog.GenTile;
|
import io.anuke.mindustry.maps.filters.FilterOption.*;
|
||||||
import io.anuke.mindustry.maps.filters.FilterOption.SliderOption;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.blocks.Floor;
|
import io.anuke.mindustry.world.blocks.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.content;
|
|
||||||
|
|
||||||
public class DistortFilter extends GenerateFilter{
|
public class DistortFilter extends GenerateFilter{
|
||||||
float scl = 40, mag = 5;
|
float scl = 40, mag = 5;
|
||||||
@ -19,10 +17,10 @@ public class DistortFilter extends GenerateFilter{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void apply(){
|
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);
|
in.floor = tile.floor();
|
||||||
if(!content.block(tile.block).synthetic() && !in.block.synthetic()) in.block = content.block(tile.block);
|
if(!tile.block().synthetic() && !in.block.synthetic()) in.block = tile.block();
|
||||||
if(!((Floor)in.floor).isLiquid) in.ore = content.block(tile.ore);
|
if(!((Floor)in.floor).isLiquid) in.ore = tile.overlay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ import io.anuke.arc.scene.ui.*;
|
|||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.noise.*;
|
import io.anuke.arc.util.noise.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.editor.MapGenerateDialog.*;
|
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.blocks.*;
|
import io.anuke.mindustry.world.blocks.*;
|
||||||
|
|
||||||
@ -95,12 +94,12 @@ public abstract class GenerateFilter{
|
|||||||
pnoise.setSeed((int)(filter.seed + 1));
|
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));
|
return buffer.get(Mathf.clamp((int)x, 0, width - 1), Mathf.clamp((int)y, 0, height - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface TileProvider{
|
public interface TileProvider{
|
||||||
GenTile get(int x, int y);
|
Tile get(int x, int y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package io.anuke.mindustry.maps.filters;
|
package io.anuke.mindustry.maps.filters;
|
||||||
|
|
||||||
import io.anuke.arc.collection.IntArray;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.mindustry.editor.MapGenerateDialog.GenTile;
|
import io.anuke.mindustry.maps.filters.FilterOption.*;
|
||||||
import io.anuke.mindustry.maps.filters.FilterOption.SliderOption;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.content;
|
import static io.anuke.mindustry.Vars.content;
|
||||||
|
|
||||||
@ -29,9 +29,9 @@ public class MedianFilter extends GenerateFilter{
|
|||||||
for(int y = -rad; y <= rad; y++){
|
for(int y = -rad; y <= rad; y++){
|
||||||
if(Mathf.dst2(x, y) > rad*rad) continue;
|
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);
|
||||||
blocks.add(tile.block);
|
blocks.add(tile.block().id);
|
||||||
floors.add(tile.floor);
|
floors.add(tile.floor().id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,19 +6,17 @@ import io.anuke.arc.math.geom.*;
|
|||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.editor.MapGenerateDialog.*;
|
|
||||||
import io.anuke.mindustry.maps.filters.FilterOption.*;
|
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
|
import io.anuke.mindustry.maps.filters.FilterOption.*;
|
||||||
import static io.anuke.mindustry.Vars.content;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
public class MirrorFilter extends GenerateFilter{
|
public class MirrorFilter extends GenerateFilter{
|
||||||
private final Vector2 v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2();
|
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
|
@Override
|
||||||
@ -33,10 +31,10 @@ public class MirrorFilter extends GenerateFilter{
|
|||||||
|
|
||||||
if(!left(v1, v2, v3)){
|
if(!left(v1, v2, v3)){
|
||||||
mirror(v3, v1.x, v1.y, v2.x, v2.y);
|
mirror(v3, v1.x, v1.y, v2.x, v2.y);
|
||||||
GenTile tile = in.tile(v3.x, v3.y);
|
Tile tile = in.tile(v3.x, v3.y);
|
||||||
in.floor = content.block(tile.floor);
|
in.floor = tile.floor();
|
||||||
in.block = content.block(tile.block);
|
in.block = tile.block();
|
||||||
in.ore = content.block(tile.ore);
|
in.ore = tile.overlay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,8 +43,8 @@ public class MirrorFilter extends GenerateFilter{
|
|||||||
super.draw(image);
|
super.draw(image);
|
||||||
|
|
||||||
Vector2 vsize = Scaling.fit.apply(image.getDrawable().getMinWidth(), image.getDrawable().getMinHeight(), image.getWidth(), image.getHeight());
|
Vector2 vsize = Scaling.fit.apply(image.getDrawable().getMinWidth(), image.getDrawable().getMinHeight(), image.getWidth(), image.getHeight());
|
||||||
float imageWidth = vsize.x;
|
float imageWidth = Math.max(vsize.x, vsize.y);
|
||||||
float imageHeight = vsize.y;
|
float imageHeight = Math.max(vsize.y, vsize.x);
|
||||||
|
|
||||||
float size = Math.max(image.getWidth() *2, image.getHeight()*2);
|
float size = Math.max(image.getWidth() *2, image.getHeight()*2);
|
||||||
Consumer<Vector2> clamper = v ->
|
Consumer<Vector2> clamper = v ->
|
||||||
@ -65,13 +63,19 @@ public class MirrorFilter extends GenerateFilter{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void mirror(Vector2 p, float x0, float y0, float x1, float y1){
|
void mirror(Vector2 p, float x0, float y0, float x1, float y1){
|
||||||
float dx = x1 - x0;
|
//special case: uneven map mirrored at 45 degree angle
|
||||||
float dy = y1 - y0;
|
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 a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
|
||||||
float b = 2 * dx * 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){
|
boolean left(Vector2 a, Vector2 b, Vector2 c){
|
||||||
|
@ -103,8 +103,8 @@ public class ZoneInfoDialog extends FloatingDialog{
|
|||||||
cont.addImage("whiteui").color(Pal.accent).height(3).pad(6).growX();
|
cont.addImage("whiteui").color(Pal.accent).height(3).pad(6).growX();
|
||||||
cont.row();
|
cont.row();
|
||||||
cont.table(desc -> {
|
cont.table(desc -> {
|
||||||
desc.left().defaults().left().width(400f);
|
desc.left().defaults().left().width(500f);
|
||||||
desc.add(zone.description).wrap().padBottom(8f);
|
desc.add(zone.description).wrap().pad(2).padBottom(8f);
|
||||||
desc.row();
|
desc.row();
|
||||||
|
|
||||||
desc.table(t -> {
|
desc.table(t -> {
|
||||||
|
Reference in New Issue
Block a user