From c9bd25396040022b6f4e854501b197004c4bbf5b Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 24 Jul 2019 21:25:33 -0400 Subject: [PATCH] Fixed drones being idiots / Added another PvP map --- core/assets/maps/glacier.msav | Bin 7762 -> 7749 bytes core/assets/maps/veins.msav | Bin 0 -> 28924 bytes .../io/anuke/mindustry/ai/BlockIndexer.java | 86 +++++++++--------- .../mindustry/editor/MapGenerateDialog.java | 2 +- .../mindustry/entities/type/BaseUnit.java | 5 +- core/src/io/anuke/mindustry/maps/Map.java | 4 + .../io/anuke/mindustry/maps/MapAttribute.java | 29 ++++++ core/src/io/anuke/mindustry/maps/Maps.java | 2 +- 8 files changed, 78 insertions(+), 50 deletions(-) create mode 100644 core/assets/maps/veins.msav create mode 100644 core/src/io/anuke/mindustry/maps/MapAttribute.java diff --git a/core/assets/maps/glacier.msav b/core/assets/maps/glacier.msav index 0e613a567840391768d115d3ddd046bd0b865026..603bd2aeca06538eedba9416e44435a679ab99b2 100644 GIT binary patch delta 7478 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 AzW@LL delta 7398 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 literal 0 HcmV?d00001 diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index 61500ae687..71a79a262c 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -1,29 +1,26 @@ package io.anuke.mindustry.ai; -import io.anuke.arc.Events; +import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.Predicate; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Geometry; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.game.EventType.TileChangeEvent; -import io.anuke.mindustry.game.EventType.WorldLoadEvent; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.game.Teams.TeamData; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockFlag; +import io.anuke.arc.function.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.Teams.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.*; /** Class used for indexing special target blocks for AI. */ @SuppressWarnings("unchecked") public class BlockIndexer{ - /** Size of one ore quadrant. */ - private final static int oreQuadrantSize = 20; - /** Size of one structure quadrant. */ - private final static int structQuadrantSize = 12; + /** Size of one quadrant. */ + private final static int quadrantSize = 16; /** Set of all ores that are being scanned. */ private final ObjectSet scanOres = ObjectSet.with(Item.getAllOres().toArray(Item.class)); @@ -75,7 +72,7 @@ public class BlockIndexer{ //create bitset for each team type that contains each quadrant structQuadrants = new GridBits[Team.all.length]; for(int i = 0; i < Team.all.length; i++){ - structQuadrants[i] = new GridBits(Mathf.ceil(world.width() / (float)structQuadrantSize), Mathf.ceil(world.height() / (float)structQuadrantSize)); + structQuadrants[i] = new GridBits(Mathf.ceil(world.width() / (float)quadrantSize), Mathf.ceil(world.height() / (float)quadrantSize)); } for(int x = 0; x < world.width(); x++){ @@ -94,7 +91,7 @@ public class BlockIndexer{ for(int x = 0; x < quadWidth(); x++){ for(int y = 0; y < quadHeight(); y++){ - updateQuadrant(world.tile(x * structQuadrantSize, y * structQuadrantSize)); + updateQuadrant(world.tile(x * quadrantSize, y * quadrantSize)); } } @@ -164,13 +161,13 @@ public class BlockIndexer{ TileEntity closest = null; float dst = 0; - for(int rx = Math.max((int)((x - range) / tilesize / structQuadrantSize), 0); rx <= (int)((x + range) / tilesize / structQuadrantSize) && rx < quadWidth(); rx++){ - for(int ry = Math.max((int)((y - range) / tilesize / structQuadrantSize), 0); ry <= (int)((y + range) / tilesize / structQuadrantSize) && ry < quadHeight(); ry++){ + for(int rx = Math.max((int)((x - range) / tilesize / quadrantSize), 0); rx <= (int)((x + range) / tilesize / quadrantSize) && rx < quadWidth(); rx++){ + for(int ry = Math.max((int)((y - range) / tilesize / quadrantSize), 0); ry <= (int)((y + range) / tilesize / quadrantSize) && ry < quadHeight(); ry++){ if(!getQuad(team, rx, ry)) continue; - for(int tx = rx * structQuadrantSize; tx < (rx + 1) * structQuadrantSize && tx < world.width(); tx++){ - for(int ty = ry * structQuadrantSize; ty < (ry + 1) * structQuadrantSize && ty < world.height(); ty++){ + for(int tx = rx * quadrantSize; tx < (rx + 1) * quadrantSize && tx < world.width(); tx++){ + for(int ty = ry * quadrantSize; ty < (ry + 1) * quadrantSize && ty < world.height(); ty++){ Tile other = world.ltile(tx, ty); if(other == null) continue; @@ -196,7 +193,7 @@ public class BlockIndexer{ /** * Returns a set of tiles that have ores of the specified type nearby. * While each tile in the set is not guaranteed to have an ore directly on it, - * each tile will at least have an ore within {@link #oreQuadrantSize} / 2 blocks of it. + * each tile will at least have an ore within {@link #quadrantSize} / 2 blocks of it. * Only specific ore types are scanned. See {@link #scanOres}. */ public ObjectSet getOrePositions(Item item){ @@ -205,12 +202,12 @@ public class BlockIndexer{ /** Find the closest ore block relative to a position. */ public Tile findClosestOre(float xp, float yp, Item item){ - Tile tile = Geometry.findClosest(xp, yp, world.indexer.getOrePositions(item)); + Tile tile = Geometry.findClosest(xp, yp, getOrePositions(item)); if(tile == null) return null; - for(int x = Math.max(0, tile.x - oreQuadrantSize / 2); x < tile.x + oreQuadrantSize / 2 && x < world.width(); x++){ - for(int y = Math.max(0, tile.y - oreQuadrantSize / 2); y < tile.y + oreQuadrantSize / 2 && y < world.height(); y++){ + for(int x = Math.max(0, tile.x - quadrantSize / 2); x < tile.x + quadrantSize / 2 && x < world.width(); x++){ + for(int y = Math.max(0, tile.y - quadrantSize / 2); y < tile.y + quadrantSize / 2 && y < world.height(); y++){ Tile res = world.tile(x, y); if(res.block() == Blocks.air && res.drop() == item){ return res; @@ -222,8 +219,7 @@ public class BlockIndexer{ } private void process(Tile tile){ - if(tile.block().flags.size() > 0 && - tile.getTeam() != Team.none){ + if(tile.block().flags.size() > 0 && tile.getTeam() != Team.none){ ObjectSet[] map = getFlagged(tile.getTeam()); for(BlockFlag flag : tile.block().flags){ @@ -239,16 +235,16 @@ public class BlockIndexer{ if(ores == null) return; - int quadrantX = tile.x / oreQuadrantSize; - int quadrantY = tile.y / oreQuadrantSize; + int quadrantX = tile.x / quadrantSize; + int quadrantY = tile.y / quadrantSize; itemSet.clear(); - Tile rounded = world.tile(Mathf.clamp(quadrantX * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1), - Mathf.clamp(quadrantY * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1)); + Tile rounded = world.tile(Mathf.clamp(quadrantX * quadrantSize + quadrantSize / 2, 0, world.width() - 1), + Mathf.clamp(quadrantY * quadrantSize + quadrantSize / 2, 0, world.height() - 1)); //find all items that this quadrant contains - for(int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++){ - for(int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++){ + for(int x = quadrantX * quadrantSize; x < world.width() && x < (quadrantX + 1) * quadrantSize; x++){ + for(int y = quadrantY * quadrantSize; y < world.height() && y < (quadrantY + 1) * quadrantSize; y++){ Tile result = world.tile(x, y); if(result == null || result.drop() == null || !scanOres.contains(result.drop())) continue; @@ -273,8 +269,8 @@ public class BlockIndexer{ if(structQuadrants == null) return; //this quadrant is now 'dirty', re-scan the whole thing - int quadrantX = tile.x / structQuadrantSize; - int quadrantY = tile.y / structQuadrantSize; + int quadrantX = tile.x / quadrantSize; + int quadrantY = tile.y / quadrantSize; int index = quadrantX + quadrantY * quadWidth(); for(Team team : Team.all){ @@ -289,8 +285,8 @@ public class BlockIndexer{ structQuadrants[data.team.ordinal()].set(quadrantX, quadrantY, false); outer: - for(int x = quadrantX * structQuadrantSize; x < world.width() && x < (quadrantX + 1) * structQuadrantSize; x++){ - for(int y = quadrantY * structQuadrantSize; y < world.height() && y < (quadrantY + 1) * structQuadrantSize; y++){ + for(int x = quadrantX * quadrantSize; x < world.width() && x < (quadrantX + 1) * quadrantSize; x++){ + for(int y = quadrantY * quadrantSize; y < world.height() && y < (quadrantY + 1) * quadrantSize; y++){ Tile result = world.ltile(x, y); //when a targetable block is found, mark this quadrant as occupied and stop searching if(result.entity != null && result.getTeam() == data.team){ @@ -307,11 +303,11 @@ public class BlockIndexer{ } private int quadWidth(){ - return Mathf.ceil(world.width() / (float)structQuadrantSize); + return Mathf.ceil(world.width() / (float)quadrantSize); } private int quadHeight(){ - return Mathf.ceil(world.height() / (float)structQuadrantSize); + return Mathf.ceil(world.height() / (float)quadrantSize); } private void scanOres(){ @@ -324,8 +320,8 @@ public class BlockIndexer{ for(int x = 0; x < world.width(); x++){ for(int y = 0; y < world.height(); y++){ - int qx = (x / oreQuadrantSize); - int qy = (y / oreQuadrantSize); + int qx = (x / quadrantSize); + int qy = (y / quadrantSize); Tile tile = world.tile(x, y); @@ -333,8 +329,8 @@ public class BlockIndexer{ if(tile.drop() != null && scanOres.contains(tile.drop()) && tile.block() == Blocks.air){ ores.get(tile.drop()).add(world.tile( //make sure to clamp quadrant middle position, since it might go off bounds - Mathf.clamp(qx * oreQuadrantSize + oreQuadrantSize / 2, 0, world.width() - 1), - Mathf.clamp(qy * oreQuadrantSize + oreQuadrantSize / 2, 0, world.height() - 1))); + Mathf.clamp(qx * quadrantSize + quadrantSize / 2, 0, world.width() - 1), + Mathf.clamp(qy * quadrantSize + quadrantSize / 2, 0, world.height() - 1))); } } } diff --git a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java index 0005ece403..fbfd217d6b 100644 --- a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java @@ -101,7 +101,7 @@ public class MapGenerateDialog extends FloatingDialog{ }}); visible(() -> generating && !updateEditorOnChange); }}).size(mobile ? 300f : 400f).padRight(10); - t.pane(p -> filterTable = p).width(300f).marginRight(6).update(pane -> { + t.pane(p -> filterTable = p.marginRight(6)).width(300f).update(pane -> { if(Core.scene.getKeyboardFocus() instanceof Dialog && Core.scene.getKeyboardFocus() != this){ return; } diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index 53ff4ede51..a8dd3b5670 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.entities.type; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; +import io.anuke.annotations.Annotations.*; import io.anuke.arc.Core; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; @@ -86,7 +85,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ return type.typeID; } - public Tile getSpawner(){ + public @Nullable Tile getSpawner(){ return world.tile(spawner); } diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index c436b86939..d7213c8ff8 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/io/anuke/mindustry/maps/Map.java @@ -74,6 +74,10 @@ public class Map implements Comparable{ return tags.get("othercore", "true").equals("true"); } + public boolean attribute(MapAttribute attr){ + return tags.getBool(attr.name()); + } + public String author(){ return tag("author"); } diff --git a/core/src/io/anuke/mindustry/maps/MapAttribute.java b/core/src/io/anuke/mindustry/maps/MapAttribute.java new file mode 100644 index 0000000000..3df99af00e --- /dev/null +++ b/core/src/io/anuke/mindustry/maps/MapAttribute.java @@ -0,0 +1,29 @@ +package io.anuke.mindustry.maps; + +import io.anuke.arc.collection.*; +import io.anuke.arc.function.*; + +import static io.anuke.mindustry.Vars.*; + +/** Defines a specific type of attribute for a map, usually whether or not it supports a certain type of mode.*/ +public enum MapAttribute{ + /** Whether a map has a player spawnpoint in it.*/ + spawnpoint(teams -> teams.contains(defaultTeam.ordinal())), + /** Whether a map has a wave team core to attack.*/ + attack(teams -> teams.contains(waveTeam.ordinal())), + /** Whether this map supports PvP.*/ + pvp(teams -> teams.size > 1); + + private final Predicate validator; + + public static final MapAttribute[] all = values(); + + MapAttribute(Predicate set){ + this.validator = set; + } + + //todo also take into account enemy spawnpoints + public boolean validate(IntSet teams){ + return validator.test(teams); + } +} diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index d5c75467ed..08d184b6b9 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -20,7 +20,7 @@ import static io.anuke.mindustry.Vars.*; public class Maps implements Disposable{ /** List of all built-in maps. Filenames only. */ - private static String[] defaultMapNames = {"fortress", "labyrinth", "islands", "tendrils", "caldera", "glacier"}; + private static String[] defaultMapNames = {"fortress", "labyrinth", "islands", "tendrils", "caldera", "glacier", "vein"}; /** All maps stored in an ordered array. */ private Array maps = new Array<>(); /** Serializer for meta. */