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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 z 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 L$(;PC%?p|UMwVNk 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. */