From 273c74b2753a0235049e513b4a6856e801fa2f53 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 15 Jun 2019 23:26:43 -0400 Subject: [PATCH] Many things --- core/assets/bundles/bundle.properties | 1 + core/assets/maps/craters.msav | Bin 11650 -> 2493 bytes .../io/anuke/mindustry/content/TechTree.java | 24 ++++++- .../src/io/anuke/mindustry/content/Zones.java | 1 + core/src/io/anuke/mindustry/core/Logic.java | 33 ++++++--- .../mindustry/entities/EntityCollisions.java | 54 ++++----------- .../io/anuke/mindustry/game/EventType.java | 2 + core/src/io/anuke/mindustry/game/Teams.java | 9 +++ .../mindustry/ui/dialogs/TechTreeDialog.java | 65 ++++++++++-------- .../mindustry/world/blocks/BuildBlock.java | 2 +- tools/src/io/anuke/mindustry/Generators.java | 2 +- 11 files changed, 112 insertions(+), 81 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index e7a79215f7..e35de501f8 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -352,6 +352,7 @@ zone.desolateRift.name = Desolate Rift zone.nuclearComplex.name = Nuclear Production Complex zone.overgrowth.name = Overgrowth zone.tarFields.name = Tar Fields +zone.saltFlats.name = Salt Flats settings.language = Language settings.reset = Reset to Defaults diff --git a/core/assets/maps/craters.msav b/core/assets/maps/craters.msav index b3e555a7d21a2a561d08b7ecb4c7227f7835f4a2..01738f45b218ac6f043341178b1f86b24d892d57 100644 GIT binary patch literal 2493 zcmb=J^EM*7UwXT!-R{*_Uu~LnE%J8eWre*9eDke0nk@dB+P$SP`iHK*=>;a;E>=@# z&n+uwYCc!W=lQ<$Z=>(!>RD`#0xTz;<32@5zf`nzF4~qAW51Q3n`6%VIg0z8^cJht00X+!@mUjCLW$*8@+-qpJ zk8$mcg!a7w6XtaB+*)#CdZ)vwSWBzhRUgIqKX0BgFQMIZ`6CT(&h(Fuj?|Z2sWDv4 zEjC|9K2?)5l>PSCjy02%&b^({p(B>&@xkQW$&D`!f7WQ#|1r_~|9JDQt!S z-`qJ*Rnm@feM@oh*wDR2rFCylp_o!Rf3xmttGCO&Ck5vFr8Tu)IM20lf!sqI%jUdk zYE4y{LI(@f+$$0{c@^#zYWs|?|ZwRr$ z-+%2na}9%xu8lgyT3bT9=7sq0uVTAe9A(?T`uW#am5ZzHt(mudfpp-kb*Y?FOM~s$ zEE5a;l>NKIm6hI|{_@E5tL@Uu6&b%WD%I7U!e*$Hag}JtEZTNh%uvv?LjKz{&vg#v zu43A2FITP!zU){&^MlLhH%Xfg&uO=<=+nKXc_UHL_0WVWublQdXP--ksVzBG&}3Ad zc_-+N>`h-~nI-p2vSkmg=;#$&D}ADP`bBR^zvWABm2DF_s?&TiYFVPb_>`)NXD->U zZfKMf`=k_{cWzosu*zh9Uz>m%vsGF9Qx?Um&fK`HAYQHZ-Py_}^EuA$AC#KzO`fhC z{?h#D0!_KY`${%UpERS$rg_~H^Cb%ueWimYKehTYWyzZZabD@hdt?)I7rk&lR%m*P zb=QPam1{?Rlw#*t?PBh`H~oaj#(k4kIhn1|o;RIq)t{gbb3zZT(8`b7wkW1*SLytZ z667=Xa`)^s@eQFuLs_M(C-hkq5JL*>Jt6c5kS$A)n zlB9s`%`mAuJrTz)1lScaPpYmsKgn_O1F;8zIx82;oE82uYw>{vM;eaQ9=-AIL7>)4 z$t?Yut&*Y7;{@AZ%`-bx9lT}1x2pl`51z=i$-Oi?ccRFt)qyss zoO|wWp+d{=i6NY6n$EkYbgho-6k2^*QeE(9uhEX8n$qGkOXa?$skm3C8?11+`qGH) z0S~`;)Mv3RcHgGITDoJE)0qNsnX6YhHd~8ISgpBOs_>~*`P*ie+?QKerpqkkYx>2( z<#lBq|4pv^7dt2N%WOY==V;=TV_PB;Pqa^6)PIv9Jf73aJR~-h@ym3&bM$AqND`+`Ne=>}(l)FSep2+mt-;UBi` zaFoC_{a%|0osEAaKQ8z;VH5M0^jWEE_MOsc<_bRDaB%KvmK>AcOu{CIA5VDT%BJ2E zuH~P%t>~`7p{WAe@1HLzxTmJQtKgp89p~#0x69s73_Es`sqDjrhX+@_ zj+A!WuzDL8fAcM+HP@=L7p%2ivo7b-<_)WDxaQuPyusad;wp{90-i?w9FFG}v@aA- z+;c)ackkMY*vYp!=T=F7d_DDH*DZJ$;5A(y&rX+`__JexGZWJ41Q#I|5Mz`w1aE^#P|pMr}jFn_}%6b+Zi`G z!+p^_muR8CH@?iCwLN}vM)amFrcQVH%?#d4Pm`A_*|YF|IM4lQF1gKDI>OC+Byuj? zHG8p3?smoRNf&cpel^RfIlm@3rDT03lS}-xUDI6JkFm#R-3r)cyP3~GM_oFtD&bz; z{Tn~Bir;Lzy#C<#KW%k?dCT(iHvFEm@!P74d-ohXmeKs~6Wi|DzwR2m*zhv8b>G&+ zBO7)am$BXUz5B2&cJIE#sngH@mb+MfR*u(v&Eo4@w&f~4owGIhaLv_`7c4cukqH~km(ic`;dh_SVg8xa4;%8lpFUFYo=l%+)EBjdeEnf3<;m?(O z3Z~3Iu{!+cMx7^5+Zo~;J~2nmJoTM1uH}<$i?bJ U{`LQ#@7WW|o9h{0?kryi0Nw!Mg#Z8m literal 11650 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 diff --git a/core/src/io/anuke/mindustry/content/TechTree.java b/core/src/io/anuke/mindustry/content/TechTree.java index caf1ebeb4b..2c3ee5d1b9 100644 --- a/core/src/io/anuke/mindustry/content/TechTree.java +++ b/core/src/io/anuke/mindustry/content/TechTree.java @@ -246,8 +246,28 @@ public class TechTree implements ContentList{ }); }); - node(spiritFactory, () -> { - node(phantomFactory); + node(draugFactory, () -> { + node(spiritFactory, () -> { + node(phantomFactory); + }); + + node(daggerFactory, () -> { + node(crawlerFactory, () -> { + node(titanFactory, () -> { + node(fortressFactory, () -> { + + }); + }); + }); + + node(wraithFactory, () -> { + node(spiritFactory, () -> { + node(revenantFactory, () -> { + + }); + }); + }); + }); }); node(dartPad, () -> { diff --git a/core/src/io/anuke/mindustry/content/Zones.java b/core/src/io/anuke/mindustry/content/Zones.java index abad869d04..95adae396a 100644 --- a/core/src/io/anuke/mindustry/content/Zones.java +++ b/core/src/io/anuke/mindustry/content/Zones.java @@ -84,6 +84,7 @@ public class Zones implements ContentList{ launchPeriod = 5; loadout = Loadouts.basicFoundation; zoneRequirements = ZoneRequirement.with(desertWastes, 60); + blockRequirements = new Block[]{Blocks.daggerFactory, Blocks.draugFactory}; resources = new Item[]{Items.copper, Items.scrap, Items.lead, Items.coal, Items.sand}; }}; diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 1904b713b5..3d5901dc97 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -6,17 +6,21 @@ import io.anuke.arc.ApplicationListener; import io.anuke.arc.Events; import io.anuke.arc.collection.ObjectSet.ObjectSetIterator; import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.content.Items; +import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.Teams.TeamData; +import io.anuke.mindustry.gen.BrokenBlock; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.BuildBlock; +import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import static io.anuke.mindustry.Vars.*; @@ -39,13 +43,25 @@ public class Logic implements ApplicationListener{ p.respawns = state.rules.respawns; } }); - } - @Override - public void init(){ - collisions.setCollider(tilesize, (x, y) -> { - Tile tile = world.tile(x, y); - return tile != null && tile.solid(); + Events.on(BlockDestroyEvent.class, event -> { + //blocks that get broken are appended to the team's broken block queue + Tile tile = event.tile; + Block block = tile.block(); + if(block instanceof BuildBlock){ + BuildEntity entity = tile.entity(); + + //update block to reflect the fact that something was being constructed + if(entity.cblock != null && entity.cblock.synthetic()){ + block = entity.cblock; + }else{ + //otherwise this was a deconstruction that was interrupted, don't want to rebuild that + return; + } + } + + TeamData data = state.teams.get(tile.getTeam()); + data.brokenBlocks.addFirst(BrokenBlock.get(tile.x, tile.y, block.id, tile.rotation())); }); } @@ -197,7 +213,6 @@ public class Logic implements ApplicationListener{ } collisions.collideGroups(bulletGroup, playerGroup); - collisions.collideGroups(playerGroup, playerGroup); } world.pathfinder.update(); diff --git a/core/src/io/anuke/mindustry/entities/EntityCollisions.java b/core/src/io/anuke/mindustry/entities/EntityCollisions.java index 3d98f80d35..808f8e4fc8 100644 --- a/core/src/io/anuke/mindustry/entities/EntityCollisions.java +++ b/core/src/io/anuke/mindustry/entities/EntityCollisions.java @@ -1,11 +1,14 @@ package io.anuke.mindustry.entities; import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.IntSet; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.*; import io.anuke.mindustry.entities.traits.Entity; import io.anuke.mindustry.entities.traits.SolidTrait; +import io.anuke.mindustry.world.Tile; + +import static io.anuke.mindustry.Vars.tilesize; +import static io.anuke.mindustry.Vars.world; public class EntityCollisions{ //range for tile collision scanning @@ -14,29 +17,15 @@ public class EntityCollisions{ private static final float seg = 1f; //tile collisions - private float tilesize; private Rectangle tmp = new Rectangle(); - private TileCollider collider; - private TileHitboxProvider hitboxProvider; private Vector2 vector = new Vector2(); private Vector2 l1 = new Vector2(); private Rectangle r1 = new Rectangle(); private Rectangle r2 = new Rectangle(); //entity collisions - private IntSet collided = new IntSet(); private Array arrOut = new Array<>(); - public void setCollider(float tilesize, TileCollider collider, TileHitboxProvider hitbox){ - this.tilesize = tilesize; - this.collider = collider; - this.hitboxProvider = hitbox; - } - - public void setCollider(float tilesize, TileCollider collider){ - setCollider(tilesize, collider, (x, y, out) -> out.setSize(tilesize).setCenter(x * tilesize, y * tilesize)); - } - public void move(SolidTrait entity, float deltax, float deltay){ boolean movedx = false; @@ -67,8 +56,6 @@ public class EntityCollisions{ } public void moveDelta(SolidTrait entity, float deltax, float deltay, boolean x){ - if(collider == null) - throw new IllegalArgumentException("No tile collider specified! Call setCollider() first."); Rectangle rect = r1; entity.hitboxTile(rect); @@ -81,9 +68,8 @@ public class EntityCollisions{ for(int dx = -r; dx <= r; dx++){ for(int dy = -r; dy <= r; dy++){ int wx = dx + tilex, wy = dy + tiley; - if(collider.solid(wx, wy) && entity.collidesGrid(wx, wy)){ - - hitboxProvider.getHitbox(wx, wy, tmp); + if(solid(wx, wy) && entity.collidesGrid(wx, wy)){ + tmp.setSize(tilesize).setCenter(wx * tilesize, wy * tilesize); if(tmp.overlaps(rect)){ Vector2 v = Geometry.overlap(rect, tmp, x); @@ -99,9 +85,6 @@ public class EntityCollisions{ } public boolean overlapsTile(Rectangle rect){ - if(collider == null) - throw new IllegalArgumentException("No tile collider specified! Call setCollider() first."); - rect.getCenter(vector); int r = 1; @@ -112,8 +95,8 @@ public class EntityCollisions{ for(int dx = -r; dx <= r; dx++){ for(int dy = -r; dy <= r; dy++){ int wx = dx + tilex, wy = dy + tiley; - if(collider.solid(wx, wy)){ - hitboxProvider.getHitbox(wx, wy, r2); + if(solid(wx, wy)){ + r2.setSize(tilesize).setCenter(wx * tilesize, wy * tilesize); if(r2.overlaps(rect)){ return true; @@ -126,7 +109,6 @@ public class EntityCollisions{ @SuppressWarnings("unchecked") public void updatePhysics(EntityGroup group){ - collided.clear(); QuadTree tree = group.tree(); tree.clear(); @@ -140,6 +122,11 @@ public class EntityCollisions{ } } + private static boolean solid(int x, int y){ + Tile tile = world.tile(x, y); + return tile != null && tile.solid(); + } + private void checkCollide(Entity entity, Entity other){ SolidTrait a = (SolidTrait)entity; @@ -221,10 +208,9 @@ public class EntityCollisions{ @SuppressWarnings("unchecked") public void collideGroups(EntityGroup groupa, EntityGroup groupb){ - collided.clear(); for(Entity entity : groupa.all()){ - if(!(entity instanceof SolidTrait) || collided.contains(entity.getID())) + if(!(entity instanceof SolidTrait)) continue; SolidTrait solid = (SolidTrait)entity; @@ -241,20 +227,10 @@ public class EntityCollisions{ for(SolidTrait sc : arrOut){ sc.hitbox(r1); - if(r2.overlaps(r1) && !collided.contains(sc.getID())){ + if(r2.overlaps(r1)){ checkCollide(entity, sc); } } - - collided.add(entity.getID()); } } - - public interface TileCollider{ - boolean solid(int x, int y); - } - - public interface TileHitboxProvider{ - void getHitbox(int x, int y, Rectangle out); - } } diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index 872f74a1c1..de0a286c66 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -129,6 +129,8 @@ public class EventType{ } } + /** Called right before a block is destroyed. + * The tile entity of the tile in this event cannot be null when this happens.*/ public static class BlockDestroyEvent{ public final Tile tile; diff --git a/core/src/io/anuke/mindustry/game/Teams.java b/core/src/io/anuke/mindustry/game/Teams.java index bf328255ca..077729ddd0 100644 --- a/core/src/io/anuke/mindustry/game/Teams.java +++ b/core/src/io/anuke/mindustry/game/Teams.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.game; +import io.anuke.annotations.Annotations.Struct; import io.anuke.arc.collection.*; import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Tile; @@ -43,6 +44,7 @@ public class Teams{ public class TeamData{ public final ObjectSet cores = new ObjectSet<>(); + public final LongQueue brokenBlocks = new LongQueue(); public final EnumSet enemies; public final Team team; @@ -51,4 +53,11 @@ public class Teams{ this.enemies = enemies; } } + + /** Represents a block made by this team that was destroyed somewhere on the map. + * This does not include deconstructed blocks.*/ + @Struct + public class BrokenBlockStruct{ + public short x, y, rotation, block; + } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java index 601de99218..1521eb7128 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java @@ -246,44 +246,51 @@ public class TechTreeDialog extends FloatingDialog{ } }); - infoTable.background("content-background"); infoTable.update(() -> infoTable.setPosition(button.getX() + button.getWidth(), button.getY() + button.getHeight(), Align.topLeft)); - infoTable.margin(0).left().defaults().left(); + infoTable.left(); - infoTable.addImageButton("icon-info", "node", 14 * 2, () -> ui.content.show(node.block)).growY().width(50f); + infoTable.table("content-background", b -> { + b.margin(0).left().defaults().left(); - infoTable.add().grow(); + b.addImageButton("icon-info", "node", 14 * 2, () -> ui.content.show(node.block)).growY().width(50f); + b.add().grow(); + b.table(desc -> { + desc.left().defaults().left(); + desc.add(node.block.localizedName); + desc.row(); + if(locked(node)){ + desc.table(t -> { + t.left(); + for(ItemStack req : node.requirements){ + t.table(list -> { + list.left(); + list.addImage(req.item.getContentIcon()).size(8 * 3).padRight(3); + list.add(req.item.localizedName()).color(Color.LIGHT_GRAY); + list.label(() -> " " + Math.min(data.getItem(req.item), req.amount) + " / " + req.amount) + .update(l -> l.setColor(data.has(req.item, req.amount) ? Color.LIGHT_GRAY : Color.SCARLET)); + }).fillX().left(); + t.row(); + } + }); + }else{ + desc.add("$completed"); + } + }).pad(9); - infoTable.table(desc -> { - desc.left().defaults().left(); - desc.add(node.block.localizedName); - desc.row(); - if(locked(node)){ - desc.table(t -> { - t.left(); - for(ItemStack req : node.requirements){ - t.table(list -> { - list.left(); - list.addImage(req.item.getContentIcon()).size(8 * 3).padRight(3); - list.add(req.item.localizedName()).color(Color.LIGHT_GRAY); - list.label(() -> " " + Math.min(data.getItem(req.item), req.amount) + " / " + req.amount) - .update(l -> l.setColor(data.has(req.item, req.amount) ? Color.LIGHT_GRAY : Color.SCARLET)); - }).fillX().left(); - t.row(); - } - }); - }else{ - desc.add("$completed"); + if(mobile && locked(node)){ + b.row(); + b.addImageTextButton("$research", "icon-check", "node", 16 * 2, () -> unlock(node)) + .disabled(i -> !data.hasItems(node.requirements)).growX().height(44f).colspan(3); } - }).pad(9); + }); - if(mobile && locked(node)){ - infoTable.row(); - infoTable.addImageTextButton("$research", "icon-check", "node", 16 * 2, () -> unlock(node)) - .disabled(b -> !data.hasItems(node.requirements)).growX().height(44f).colspan(3); + infoTable.row(); + if(node.block.description != null){ + infoTable.table("dialogDim", t -> t.margin(3f).left().labelWrap(node.block.description).color(Color.LIGHT_GRAY).growX()).fillX(); } + addChild(infoTable); infoTable.pack(); infoTable.act(Core.graphics.getDeltaTime()); diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index f1fb275894..a896f8583b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -170,7 +170,7 @@ public class BuildBlock extends Block{ * The recipe of the block that is being constructed. * If there is no recipe for this block, as is the case with rocks, 'previous' is used. */ - public Block cblock; + public @Nullable Block cblock; public float progress = 0; public float buildCost; diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/Generators.java index 443f81a883..423e4eacbd 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/Generators.java @@ -70,7 +70,7 @@ public class Generators{ ImagePacker.generate("block-icons", () -> { Image colors = new Image(content.blocks().size, 1); - Color outlineColor = Color.valueOf("4d4e58"); + Color outlineColor = Color.valueOf("404049"); for(Block block : content.blocks()){ TextureRegion[] regions = block.getGeneratedIcons();