From 97cbc3d3457141f434a1e0e599698b9a1e35f7c3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 1 Mar 2022 10:24:20 -0500 Subject: [PATCH] Misc fog improvements --- .../sprites/blocks/defense/radar-base.png | Bin 0 -> 494 bytes .../sprites/blocks/defense/radar-glow.png | Bin 0 -> 619 bytes .../sprites/blocks/defense/radar.png | Bin 0 -> 194 bytes core/assets/icons/icons.properties | 1 + core/assets/logicids.dat | Bin 4251 -> 4258 bytes core/src/mindustry/content/Blocks.java | 12 +- core/src/mindustry/content/UnitTypes.java | 9 ++ .../mindustry/entities/comp/BuildingComp.java | 5 + .../src/mindustry/entities/comp/MechComp.java | 2 +- .../src/mindustry/entities/comp/TankComp.java | 2 +- core/src/mindustry/game/FogControl.java | 42 +++++-- core/src/mindustry/game/Rules.java | 2 + .../src/mindustry/graphics/BlockRenderer.java | 5 +- core/src/mindustry/graphics/FogRenderer.java | 25 ++--- .../mindustry/graphics/MinimapRenderer.java | 26 +++-- core/src/mindustry/io/TypeIO.java | 4 +- core/src/mindustry/type/UnitType.java | 1 + .../ui/dialogs/SettingsMenuDialog.java | 2 +- .../ui/fragments/PlacementFragment.java | 8 +- .../mindustry/world/blocks/defense/Radar.java | 106 ++++++++++++++++++ .../world/blocks/storage/CoreBlock.java | 2 +- .../mindustry/world/meta/BuildVisibility.java | 3 +- gradle.properties | 2 +- 23 files changed, 214 insertions(+), 45 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/defense/radar-base.png create mode 100644 core/assets-raw/sprites/blocks/defense/radar-glow.png create mode 100644 core/assets-raw/sprites/blocks/defense/radar.png create mode 100644 core/src/mindustry/world/blocks/defense/Radar.java diff --git a/core/assets-raw/sprites/blocks/defense/radar-base.png b/core/assets-raw/sprites/blocks/defense/radar-base.png new file mode 100644 index 0000000000000000000000000000000000000000..e26ef488f0289a8f879b3b46f2823307b3242e9c GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U|iwp z;usRq`gXdZ-w^`=*W=oH4vj|`C#5aj;t|8>b*scfQAj8tP+wOx;GkE@mMI0SDz_Ho zPGVLFENEFe%V6G_8CNX1ts3pIygWx+y-}cb?q6psj0liroL7 zU-K-vvw90dx_I}=v#K2I3o+A>3XYQIw3-6S+|x)k>kqOd+RtKeEMsA zW8MU{dvT zaSVxQeLFSQKiE;AZNBF6Z4C>9M7@G~4b|LcR~-ERUsR>ab;p4&R%vg}t+szH9v|Iz zd$Xg$tJYZ+YB%4UeD~&z_4^u`6-y?0{VU&ioA2)3hFiU?0ZUGw`BVPoJ?n#arVIFT zvP>I%u6rx6FN@-y`+v*6nWE)P6F#$DVEVR2j?wo(qvQus2?p^4Tj$wL$z#v(zQ3ei z^DcJ+&lAm#4wKS-+&1iSjQXh+lN}yQSg^`zY}z?*`ZCyp5QmTs}YD=_<>-j!$wQ!hE){<}uX-o75T> zOkMK8E4{YSjzR8pValnaCt3omgA*c!Pwi5A+i|Qy=(bP#Sb3k z>wM{%`~Jl8qjUb4p5(Z4goB+$>hhwM!A4vB7nCdfUHT?RIH*Elu7o1XEq&qJAKx;4 z=m`)oW@=TRQfcfo@u<=rr4ko$i^=~&{FHXAE7_LvJ?fktlYGPXPli*@D;XP?e`ihY zKfdM2on^T@f>M0nZsfhZd1}tnDY+FqGMooiz7tP-CfP7k^xZt+DBgwhnc{yG3Ve0V z^t;(M@!38mi^uaEU5t3IPyWEx(R87V`JLR+vc;e ed1?LRJJra0dFzR*YZ(|A7(8A5T-G@yGywqDZ5P)7 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/defense/radar.png b/core/assets-raw/sprites/blocks/defense/radar.png new file mode 100644 index 0000000000000000000000000000000000000000..b4880bf7b1856886ff2f1b757a8a9564b9dcbab1 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>V5sqQ zaSVxQO-_(tU7R4&(-i2yctShl$NcaMALa`gOK5JCnQ5Qt#2lIS@amWUMYdu0pPoOu zE;q^O+ku2Dxkobj{Wybk)vpUiu%6sHN5(yYBOuFiWnY5Q$q=cAgW{}HteUhsC&ai1 tm`V#VUD4{$V7j8w<$h2DY#9TCU9(fe<^^+e85kHCJYD@<);T3K0RS!AL9PG* literal 0 HcmV?d00001 diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index ac28a9737e..6b96a2fa11 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -551,3 +551,4 @@ 63152=tank-reconstructor|block-tank-reconstructor-ui 63151=mech-reconstructor|block-mech-reconstructor-ui 63150=ship-reconstructor|block-ship-reconstructor-ui +63149=radar|block-radar-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index 1f91b12fa95e14f0f624ba2a98cb1bd852e82c7f..03df1cb60bf8d142070fc0f7af57d11bd789451d 100644 GIT binary patch delta 22 ecmbQOxJZ$S;mJm(ZM>|kMTseio44^kWdZWJ^FC$*05dlRKL7v# diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 26743172d0..b99d92c5ca 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -85,6 +85,7 @@ public class Blocks{ scrapWall, scrapWallLarge, scrapWallHuge, scrapWallGigantic, thruster, //ok, these names are getting ridiculous, but at least I don't have humongous walls yet //defense - erekir + radar, buildTower, regenProjector, barrierProjector, //campaign only @@ -1693,6 +1694,14 @@ public class Blocks{ tendrils = 4; }}; + radar = new Radar("radar"){{ + requirements(Category.effect, BuildVisibility.fogOnly, with(Items.silicon, 30, Items.graphite, 30)); + outlineColor = Color.valueOf("4a4b53"); + fogRadius = 27; + + consumePower(0.2f); + }}; + buildTower = new BuildTurret("build-tower"){{ requirements(Category.effect, with(Items.silicon, 80, Items.carbide, 30, Items.oxide, 40, Items.thorium, 30)); outlineColor = Pal.darkOutline; @@ -3247,7 +3256,6 @@ public class Blocks{ coolantMultiplier = 6f; - unitFilter = u -> !u.spawnedByCore; shootShake = 1f; ammoPerShot = 5; draw = new DrawTurret("reinforced-"); @@ -3488,8 +3496,6 @@ public class Blocks{ }}); }}; - unitFilter = u -> !u.spawnedByCore; - shoot = new ShootAlternate(){{ spread = 4.7f; shots = 4; diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index d55e23e0ea..e662bd9658 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -3396,6 +3396,9 @@ public class UnitTypes{ hitSize = 9f; engineSize = 0; + fogRadius = 0f; + targetable = false; + setEnginesMirror( new UnitEngine(21 / 4f, 19 / 4f, 2.2f, 45f), new UnitEngine(23 / 4f, -22 / 4f, 2.2f, 315f) @@ -3452,6 +3455,9 @@ public class UnitTypes{ armor = 2f; hitSize = 11f; + fogRadius = 0f; + targetable = false; + engineOffset = 7.2f; engineSize = 3.1f; @@ -3522,6 +3528,9 @@ public class UnitTypes{ hitSize = 12f; buildBeamOffset = 8f; + fogRadius = 0f; + targetable = false; + engineOffset = 7.5f; engineSize = 3.4f; diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index d2289d7788..6cfd4d29ad 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -446,6 +446,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return nearby(Geometry.d4(rotation + 3).x * trns, Geometry.d4(rotation + 3).y * trns); } + /** Any class that overrides this method and changes the value must call Vars.fogControl.forceUpdate(team). */ + public float fogRadius(){ + return block.fogRadius; + } + public int pos(){ return tile.pos(); } diff --git a/core/src/mindustry/entities/comp/MechComp.java b/core/src/mindustry/entities/comp/MechComp.java index ff4970e108..41f217dd63 100644 --- a/core/src/mindustry/entities/comp/MechComp.java +++ b/core/src/mindustry/entities/comp/MechComp.java @@ -37,7 +37,7 @@ abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, Elevati float lastExtend = walkExtension; - if(extendScl < lastExtend && base % 2f > 1f && !isFlying()){ + if(!headless && extendScl < lastExtend && base % 2f > 1f && !isFlying() && !inFogTo(player.team())){ int side = -Mathf.sign(extend); float width = hitSize / 2f * side, length = type.mechStride * 1.35f; diff --git a/core/src/mindustry/entities/comp/TankComp.java b/core/src/mindustry/entities/comp/TankComp.java index 5c8b10502a..4967835481 100644 --- a/core/src/mindustry/entities/comp/TankComp.java +++ b/core/src/mindustry/entities/comp/TankComp.java @@ -30,7 +30,7 @@ abstract class TankComp implements Posc, Flyingc, Hitboxc, Unitc, ElevationMovec @Override public void update(){ //dust - if(walked && !headless){ + if(walked && !headless && !inFogTo(player.team())){ treadEffectTime += Time.delta; if(treadEffectTime >= 6f && type.treadRects.length > 0){ var treadRegion = type.treadRegion; diff --git a/core/src/mindustry/game/FogControl.java b/core/src/mindustry/game/FogControl.java index 78215a2a8d..ca9526cbe8 100644 --- a/core/src/mindustry/game/FogControl.java +++ b/core/src/mindustry/game/FogControl.java @@ -1,6 +1,7 @@ package mindustry.game; import arc.*; +import arc.math.*; import arc.struct.Bits; import arc.struct.*; import arc.util.*; @@ -19,7 +20,7 @@ import static mindustry.Vars.*; public final class FogControl implements CustomChunk{ private static volatile int ww, wh; - private static final int staticUpdateInterval = 1000 / 25; //25 FPS + private static final int dynamicUpdateInterval = 1000 / 25; //25 FPS private static final Object notifyStatic = new Object(), notifyDynamic = new Object(); /** indexed by team */ @@ -48,11 +49,11 @@ public final class FogControl implements CustomChunk{ wh = world.height(); //all old buildings have static light scheduled around them - if(state.rules.fog){ + if(state.rules.fog && state.rules.staticFog){ synchronized(staticEvents){ for(var build : Groups.build){ if(build.block.flags.contains(BlockFlag.hasFogRadius)){ - staticEvents.add(FogEvent.get(build.tile.x, build.tile.y, build.block.fogRadius, build.team.id)); + staticEvents.add(FogEvent.get(build.tile.x, build.tile.y, Mathf.round(build.fogRadius()), build.team.id)); } } } @@ -66,9 +67,11 @@ public final class FogControl implements CustomChunk{ data.dynamicUpdated = true; } - synchronized(staticEvents){ - //TODO event per team? - pushEvent(FogEvent.get(event.tile.x, event.tile.y, event.tile.block().fogRadius, event.tile.build.team.id)); + if(state.rules.staticFog){ + synchronized(staticEvents){ + //TODO event per team? + pushEvent(FogEvent.get(event.tile.x, event.tile.y, Mathf.round(event.tile.build.fogRadius()), event.tile.build.team.id)); + } } } }); @@ -83,7 +86,7 @@ public final class FogControl implements CustomChunk{ } }); - SaveVersion.addCustomChunk("fogdata", this); + SaveVersion.addCustomChunk("static-fog-data", this); } public @Nullable Bits getDiscovered(Team team){ @@ -124,12 +127,26 @@ public final class FogControl implements CustomChunk{ } void pushEvent(long event){ + if(!state.rules.staticFog) return; + staticEvents.add(event); if(!headless && FogEvent.team(event) == Vars.player.team().id){ renderer.fog.handleEvent(event); } } + public void forceUpdate(Team team, Building build){ + if(state.rules.fog && fog[team.id] != null){ + fog[team.id].dynamicUpdated = true; + + if(state.rules.staticFog){ + synchronized(staticEvents){ + pushEvent(FogEvent.get(build.tile.x, build.tile.y, Mathf.round(build.fogRadius()), build.team.id)); + } + } + } + } + public void update(){ if(fog == null){ fog = new FogData[256]; @@ -168,6 +185,7 @@ public final class FogControl implements CustomChunk{ //TODO slow? for(var unit : team.units){ int tx = unit.tileX(), ty = unit.tileY(), pos = tx + ty * ww; + if(unit.type.fogRadius <= 0f) continue; long event = FogEvent.get(tx, ty, (int)unit.type.fogRadius, team.team.id); //always update the dynamic events, but only *flush* the results when necessary? @@ -182,13 +200,13 @@ public final class FogControl implements CustomChunk{ } //if it's time for an update, flush *everything* onto the update queue - if(data.dynamicUpdated && Time.timeSinceMillis(data.lastDynamicMs) > staticUpdateInterval){ + if(data.dynamicUpdated && Time.timeSinceMillis(data.lastDynamicMs) > dynamicUpdateInterval){ data.dynamicUpdated = false; data.lastDynamicMs = Time.millis(); //add building updates for(var build : indexer.getFlagged(team.team, BlockFlag.hasFogRadius)){ - dynamicEventQueue.add(FogEvent.get(build.tile.x, build.tile.y, build.block.fogRadius, build.team.id)); + dynamicEventQueue.add(FogEvent.get(build.tile.x, build.tile.y, Mathf.round(build.fogRadius()), build.team.id)); } //add unit updates @@ -219,7 +237,7 @@ public final class FogControl implements CustomChunk{ } //wake up, it's time to draw some circles - if(staticEvents.size > 0 && staticFogThread != null){ + if(state.rules.staticFog && staticEvents.size > 0 && staticFogThread != null){ synchronized(notifyStatic){ notifyStatic.notify(); } @@ -310,6 +328,8 @@ public final class FogControl implements CustomChunk{ long event = dynamicEvents.items[i]; int x = FogEvent.x(event), y = FogEvent.y(event), rad = FogEvent.radius(event), team = FogEvent.team(event); + if(rad <= 0) continue; + var data = fog[team]; if(data != null){ @@ -412,7 +432,7 @@ public final class FogControl implements CustomChunk{ @Override public boolean shouldWrite(){ - return state.rules.fog && fog != null; + return state.rules.fog && state.rules.staticFog && fog != null; } static void circle(Bits arr, int x, int y, int radius){ diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index 49d57dc483..f405ebf4c8 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -115,6 +115,8 @@ public class Rules{ public ObjectSet hiddenBuildItems = new ObjectSet<>(); /** HIGHLY UNSTABLE/EXPERIMENTAL. DO NOT USE THIS. */ public boolean fog = false; + /** If fog = true, this is whether static (black) fog is enabled. */ + public boolean staticFog = true; /** Color for static, undiscovered fog of war areas. */ public Color staticColor = new Color(0f, 0f, 0f, 1f); /** Color for discovered but un-monitored fog of war areas. */ diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index dfdb93b4d8..9ebfd3ef83 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -412,7 +412,10 @@ public class BlockRenderer{ if(build != null){ if(visible){ - if(!build.wasVisible) updateShadow(build); + if(!build.wasVisible){ + updateShadow(build); + renderer.minimap.update(tile); + } build.wasVisible = true; } diff --git a/core/src/mindustry/graphics/FogRenderer.java b/core/src/mindustry/graphics/FogRenderer.java index 1e6be1c94d..fc7695432a 100644 --- a/core/src/mindustry/graphics/FogRenderer.java +++ b/core/src/mindustry/graphics/FogRenderer.java @@ -51,7 +51,7 @@ public final class FogRenderer{ dynamicFog.resize(world.width(), world.height()); - if(player.team() != lastTeam){ + if(state.rules.staticFog && player.team() != lastTeam){ copyFromCpu(); lastTeam = player.team(); clearStatic = false; @@ -59,8 +59,6 @@ public final class FogRenderer{ //draw dynamic fog every frame { - - Core.camera.bounds(Tmp.r1); Draw.proj(0, 0, staticFog.getWidth() * tilesize, staticFog.getHeight() * tilesize); dynamicFog.begin(Color.black); ScissorStack.push(rect.set(1, 1, staticFog.getWidth() - 2, staticFog.getHeight() - 2)); @@ -68,11 +66,11 @@ public final class FogRenderer{ Team team = player.team(); for(var build : indexer.getFlagged(team, BlockFlag.hasFogRadius)){ - poly(Tmp.r1, build.x, build.y, build.block.fogRadius * tilesize); + poly(build.x, build.y, build.fogRadius() * tilesize); } for(var unit : team.data().units){ - poly(Tmp.r1, unit.x, unit.y, unit.type.fogRadius * tilesize); + poly(unit.x, unit.y, unit.type.fogRadius * tilesize); } dynamicFog.end(); @@ -81,7 +79,7 @@ public final class FogRenderer{ } //grab static events - if(clearStatic || events.size > 0){ + if(state.rules.staticFog && (clearStatic || events.size > 0)){ //set projection to whole map Draw.proj(0, 0, staticFog.getWidth(), staticFog.getHeight()); @@ -107,22 +105,23 @@ public final class FogRenderer{ Draw.proj(Core.camera); } - staticFog.getTexture().setFilter(TextureFilter.linear); + if(state.rules.staticFog){ + staticFog.getTexture().setFilter(TextureFilter.linear); + } dynamicFog.getTexture().setFilter(TextureFilter.linear); Draw.shader(Shaders.fog); Draw.color(state.rules.dynamicColor); Draw.fbo(dynamicFog.getTexture(), world.width(), world.height(), tilesize); - Draw.color(state.rules.staticColor); - Draw.fbo(staticFog.getTexture(), world.width(), world.height(), tilesize); + if(state.rules.staticFog){ + Draw.color(state.rules.staticColor); + Draw.fbo(staticFog.getTexture(), world.width(), world.height(), tilesize); + } Draw.shader(); } - void poly(Rect check, float x, float y, float rad){ - //todo clipping messes up the minimap - //if(check.overlaps(x - rad, y - rad, rad * 2f, rad * 2f)){ + void poly(float x, float y, float rad){ Fill.poly(x, y, 20, rad); - //} } void renderEvent(long e){ diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index 0f067c89c9..c388e91ac6 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -150,7 +150,6 @@ public class MinimapRenderer{ Texture staticTex = renderer.fog.getStaticTexture(), dynamicTex = renderer.fog.getDynamicTexture(); //crisp pixels - staticTex.setFilter(TextureFilter.nearest); dynamicTex.setFilter(TextureFilter.nearest); Tmp.tr1.set(dynamicTex); @@ -159,10 +158,14 @@ public class MinimapRenderer{ Draw.color(state.rules.dynamicColor); Draw.rect(Tmp.tr1, x + w/2f, y + h/2f, w, h); - Tmp.tr1.texture = staticTex; - //must be black to fit with borders - Draw.color(0f, 0f, 0f, state.rules.staticColor.a); - Draw.rect(Tmp.tr1, x + w/2f, y + h/2f, w, h); + if(state.rules.staticFog){ + staticTex.setFilter(TextureFilter.nearest); + + Tmp.tr1.texture = staticTex; + //must be black to fit with borders + Draw.color(0f, 0f, 0f, state.rules.staticColor.a); + Draw.rect(Tmp.tr1, x + w/2f, y + h/2f, w, h); + } Draw.color(); Draw.shader(); @@ -252,13 +255,20 @@ public class MinimapRenderer{ Units.nearby((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize, units::add); } + private Block realBlock(Tile tile){ + //TODO dynamically update on visibility change; right now it's just entirely hidden + return tile.build == null ? tile.block() : state.rules.fog && tile.build.team != player.team() ? Blocks.air : tile.block(); + } + private int colorFor(Tile tile){ if(tile == null) return 0; - int bc = tile.block().minimapColor(tile); - Color color = Tmp.c1.set(bc == 0 ? MapIO.colorFor(tile.block(), tile.floor(), tile.overlay(), tile.team()) : bc); + Block real = realBlock(tile); + int bc = real.minimapColor(tile); + + Color color = Tmp.c1.set(bc == 0 ? MapIO.colorFor(real, tile.floor(), tile.overlay(), tile.team()) : bc); color.mul(1f - Mathf.clamp(world.getDarkness(tile.x, tile.y) / 4f)); - if(tile.block() == Blocks.air && tile.y < world.height() - 1 && world.tile(tile.x, tile.y + 1).block().solid){ + if(real == Blocks.air && tile.y < world.height() - 1 && realBlock(world.tile(tile.x, tile.y + 1)).solid){ color.mul(0.7f); }else if(tile.floor().isLiquid && (tile.y >= world.height() - 1 || !world.tile(tile.x, tile.y + 1).floor().isLiquid)){ color.mul(0.84f, 0.84f, 0.9f, 1f); diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index b5a84d176c..1861059514 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -312,8 +312,8 @@ public class TypeIO{ /** @return the maximum acceptable amount of plans to send over the network */ public static int getMaxPlans(Queue plans){ - //limit to 10 to prevent buffer overflows - int used = Math.min(plans.size, 10); + //limit to prevent buffer overflows + int used = Math.min(plans.size, 15); int totalLength = 0; //prevent buffer overflow by checking config length diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 88ac864f6d..60f1318a0e 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -169,6 +169,7 @@ public class UnitType extends UnlockableContent{ public float hitSize = 6f; public float itemOffsetY = 3f; public float lightRadius = -1f, lightOpacity = 0.6f; + /** Fog view radius in tiles. <0 for automatic radius. */ public float fogRadius = -1f; public Color lightColor = Pal.powerLight; public boolean drawCell = true, drawItems = true, drawShields = true, drawBody = true; diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 4fb8b9d786..23e409fddb 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -624,7 +624,7 @@ public class SettingsMenuDialog extends BaseDialog{ button(bundle.get("settings.reset", "Reset to Defaults"), () -> { for(Setting setting : list){ if(setting.name == null || setting.title == null) continue; - settings.put(setting.name, settings.getDefault(setting.name)); + settings.remove(setting.name); } rebuild(); }).margin(14).width(240f).pad(6); diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 87b8890aee..70d4db7dda 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -119,6 +119,12 @@ public class PlacementFragment extends Fragment{ if(Core.input.keyTap(Binding.pick) && player.isBuilder() && !Core.scene.hasDialog()){ //mouse eyedropper select var build = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); + + //can't middle click buildings in fog + if(build != null && build.inFogTo(player.team())){ + build = null; + } + Block tryRecipe = build == null ? null : build instanceof ConstructBuild c ? c.current : build.block; Object tryConfig = build == null || !build.block.copyConfig ? null : build.config(); @@ -577,7 +583,7 @@ public class PlacementFragment extends Fragment{ Tile hoverTile = world.tileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); if(hoverTile != null){ //if the tile has a building, display it - if(hoverTile.build != null && hoverTile.build.displayable()){ + if(hoverTile.build != null && hoverTile.build.displayable() && !hoverTile.build.inFogTo(player.team())){ return nextFlowBuild = hoverTile.build; } diff --git a/core/src/mindustry/world/blocks/defense/Radar.java b/core/src/mindustry/world/blocks/defense/Radar.java new file mode 100644 index 0000000000..ed92b8a057 --- /dev/null +++ b/core/src/mindustry/world/blocks/defense/Radar.java @@ -0,0 +1,106 @@ +package mindustry.world.blocks.defense; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.struct.*; +import arc.util.io.*; +import mindustry.*; +import mindustry.annotations.Annotations.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +public class Radar extends Block{ + public float discoveryTime = 60f * 7f; + public float rotateSpeed = 2f; + + public @Load("@-base") TextureRegion baseRegion; + public @Load("@-glow") TextureRegion glowRegion; + + public Color glowColor = Pal.turretHeat; + public float glowScl = 5f, glowMag = 0.6f; + + public Radar(String name){ + super(name); + + update = solid = true; + flags = EnumSet.of(BlockFlag.hasFogRadius); + outlineIcon = true; + fogRadius = 10; + } + + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{baseRegion, region}; + } + + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + super.drawPlace(x, y, rotation, valid); + + Drawf.dashCircle(x * tilesize + offset, y * tilesize + offset, fogRadius * tilesize, Pal.accent); + } + + public class RadarBuild extends Building{ + public float progress; + public float lastRadius = 0f; + public float smoothEfficiency = 1f; + public float totalProgress; + + @Override + public float fogRadius(){ + return fogRadius * progress * smoothEfficiency; + } + + @Override + public void updateTile(){ + smoothEfficiency = Mathf.lerpDelta(smoothEfficiency, efficiency, 0.05f); + + if(Math.abs(fogRadius() - lastRadius) >= 0.5f){ + Vars.fogControl.forceUpdate(team, this); + lastRadius = fogRadius(); + } + + progress += edelta() / discoveryTime; + progress = Mathf.clamp(progress); + + totalProgress += efficiency * edelta(); + } + + @Override + public void drawSelect(){ + Drawf.dashCircle(x, y, fogRadius() * tilesize, Pal.accent); + } + + @Override + public void draw(){ + Draw.rect(baseRegion, x, y); + Draw.rect(region, x, y, rotateSpeed * totalProgress); + + Drawf.additive(glowRegion, glowColor, glowColor.a * (1f - glowMag + Mathf.absin(glowScl, glowMag)), x, y, rotateSpeed * totalProgress, Layer.blockAdditive); + } + + @Override + public float progress(){ + return progress; + } + + @Override + public void write(Writes write){ + super.write(write); + + write.f(progress); + } + + @Override + public void read(Reads read, byte revision){ + super.read(read, revision); + + progress = read.f(); + } + } +} diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 36f3bd04d1..ee0fc7c0b4 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -104,7 +104,7 @@ public class CoreBlock extends StorageBlock{ public void init(){ //assign to update clipSize internally lightRadius = 30f + 20f * size; - fogRadius = Math.max(fogRadius, (int)(lightRadius / 8f * 2f)); + fogRadius = Math.max(fogRadius, (int)(lightRadius / 8f * 3f)); emitLight = true; super.init(); diff --git a/core/src/mindustry/world/meta/BuildVisibility.java b/core/src/mindustry/world/meta/BuildVisibility.java index 1bbd3fa0a7..156d6b85c1 100644 --- a/core/src/mindustry/world/meta/BuildVisibility.java +++ b/core/src/mindustry/world/meta/BuildVisibility.java @@ -13,7 +13,8 @@ public enum BuildVisibility{ campaignOnly(() -> Vars.state == null || Vars.state.isCampaign()), lightingOnly(() -> Vars.state == null || Vars.state.rules.lighting || Vars.state.isCampaign()), berylliumOnly(() -> !Vars.state.rules.hiddenBuildItems.contains(Items.beryllium)), - ammoOnly(() -> Vars.state == null || Vars.state.rules.unitAmmo); + ammoOnly(() -> Vars.state == null || Vars.state.rules.unitAmmo), + fogOnly(() -> Vars.state == null || Vars.state.rules.fog); private final Boolp visible; diff --git a/gradle.properties b/gradle.properties index 41114cee18..6573813d43 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,4 +24,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 -archash=5f559f794f +archash=162d5f8fa4