From 6c10a400edbc6c5f2caf4d065a82b9b2fab1f3bb Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 7 Dec 2021 20:37:46 -0500 Subject: [PATCH] Directional force projector prototype --- .../blocks/defense/barrier-projector-team.png | Bin 0 -> 751 bytes .../blocks/defense/barrier-projector.png | Bin 0 -> 1168 bytes .../sprites/blocks/turrets/lancer-heat.png | Bin 363 -> 364 bytes core/assets/icons/icons.properties | 1 + core/assets/logicids.dat | Bin 3709 -> 3728 bytes core/assets/shaders/shield.frag | 40 ++++--- core/src/mindustry/ai/types/MissileAI.java | 1 + core/src/mindustry/content/Blocks.java | 14 ++- .../defense/DirectionalForceProjector.java | 109 +++++++++++++++++- .../world/blocks/defense/ForceProjector.java | 3 +- 10 files changed, 148 insertions(+), 20 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/defense/barrier-projector-team.png create mode 100644 core/assets-raw/sprites/blocks/defense/barrier-projector.png diff --git a/core/assets-raw/sprites/blocks/defense/barrier-projector-team.png b/core/assets-raw/sprites/blocks/defense/barrier-projector-team.png new file mode 100644 index 0000000000000000000000000000000000000000..4eba1ac6a8e008441adb804b5753f5fc6f1fc018 GIT binary patch literal 751 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 VTC&%R?=k=Y002ovPDHLkV1lY@je!6F diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 61b222cbed..a41bca283a 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -476,3 +476,4 @@ 63230=titan|block-titan-ui 63229=horde|block-horde-ui 63228=small-deconstructor|block-small-deconstructor-ui +63227=barrier-projector|block-barrier-projector-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index 55fa2bf2f05eb6a6033c25d22713c98dcf860c3a..9f8fb3668a311d8a4ac69a66f5798546bf412bef 100644 GIT binary patch delta 31 ncmew>GeMS#;mk&+@7#QXNr^>8nW;s(1x5K;shhuWcQOG0xz!8W delta 16 XcmbOr`&WjE;q*qP@7$Ytcv_eMG&BX8 diff --git a/core/assets/shaders/shield.frag b/core/assets/shaders/shield.frag index d4fdd10998..ae0d8fab72 100644 --- a/core/assets/shaders/shield.frag +++ b/core/assets/shaders/shield.frag @@ -18,24 +18,32 @@ void main(){ T += vec2(sin(coords.y / 3.0 + u_time / 20.0), sin(coords.x / 3.0 + u_time / 20.0)) / u_texsize; - vec4 color = texture2D(u_texture, T); - vec2 v = u_invsize; + vec4 color = texture2D(u_texture, T); + vec2 v = u_invsize; - vec4 maxed = max(max(max(texture2D(u_texture, T + vec2(0, step) * v), texture2D(u_texture, T + vec2(0, -step) * v)), texture2D(u_texture, T + vec2(step, 0) * v)), texture2D(u_texture, T + vec2(-step, 0) * v)); + vec4 maxed = max(max(max(max(max(max(max( + texture2D(u_texture, T + vec2(0, step) * v), + texture2D(u_texture, T + vec2(0, -step) * v)), + texture2D(u_texture, T + vec2(step, 0) * v)), + texture2D(u_texture, T + vec2(-step, 0) * v)), - if(texture2D(u_texture, T).a < 0.9 && maxed.a > 0.9){ + texture2D(u_texture, T + vec2(-step, -step) * v)), + texture2D(u_texture, T + vec2(-step, step) * v)), + texture2D(u_texture, T + vec2(step, -step) * v)), + texture2D(u_texture, T + vec2(step, step) * v)); - gl_FragColor = vec4(maxed.rgb, maxed.a * 100.0); - }else{ + if(texture2D(u_texture, T).a < 0.9 && maxed.a > 0.9){ + gl_FragColor = vec4(maxed.rgb, maxed.a * 100.0); + }else{ - if(color.a > 0.0){ - if(mod(coords.x / u_dp + coords.y / u_dp + sin(coords.x / u_dp / 5.0) * 3.0 + sin(coords.y / u_dp / 5.0) * 3.0 + u_time / 4.0, 10.0) < 2.0){ - color *= 1.65; - } - - color.a = ALPHA; - } - - gl_FragColor = color; - } + if(color.a > 0.0){ + if(mod(coords.x / u_dp + coords.y / u_dp + sin(coords.x / u_dp / 5.0) * 3.0 + sin(coords.y / u_dp / 5.0) * 3.0 + u_time / 4.0, 10.0) < 2.0){ + color *= 1.65; + } + + color.a = ALPHA; + } + + gl_FragColor = color; + } } diff --git a/core/src/mindustry/ai/types/MissileAI.java b/core/src/mindustry/ai/types/MissileAI.java index 9c58922beb..89630dc36d 100644 --- a/core/src/mindustry/ai/types/MissileAI.java +++ b/core/src/mindustry/ai/types/MissileAI.java @@ -3,6 +3,7 @@ package mindustry.ai.types; import mindustry.entities.units.*; public class MissileAI extends AIController{ + //TODO store 'main' target and use that as a fallback //TODO UNPREDICTABLE TARGETING @Override diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index e8eccd5c46..409235fd28 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -79,7 +79,7 @@ public class Blocks{ //defense - erekir buildTower, //TODO name - regenProjector, + regenProjector, barrierProjector, //transport conveyor, titaniumConveyor, plastaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, @@ -1509,6 +1509,18 @@ public class Blocks{ }}); }}; + barrierProjector = new DirectionalForceProjector("barrier-projector"){{ + //TODO + requirements(Category.effect, with(Items.surgeAlloy, 100, Items.silicon, 125)); + size = 3; + radius = 50f; + shieldHealth = 2000f; + cooldownNormal = 3f; + cooldownBrokenBase = 0.35f; + + consumes.power(4f); + }}; + //endregion //region distribution diff --git a/core/src/mindustry/world/blocks/defense/DirectionalForceProjector.java b/core/src/mindustry/world/blocks/defense/DirectionalForceProjector.java index 3626b68ec6..4525c9102c 100644 --- a/core/src/mindustry/world/blocks/defense/DirectionalForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/DirectionalForceProjector.java @@ -1,18 +1,125 @@ package mindustry.world.blocks.defense; +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.graphics.*; + +import static mindustry.Vars.*; + public class DirectionalForceProjector extends ForceProjector{ + protected static final Vec2 intersectOut = new Vec2(), p1 = new Vec2(), p2 = new Vec2(); + protected static final Cons dirShieldConsumer = b -> { + if(b.team != paramEntity.team && b.type.absorbable){ + //just in case + float deltaAdd = 1.1f; + + if(Intersector.intersectSegments(b.x, b.y, b.x + b.vel.x * (Time.delta + deltaAdd), b.y + b.vel.y * (Time.delta + deltaAdd), p1.x, p1.y, p2.x, p2.y, intersectOut)){ + b.set(intersectOut); + b.absorb(); + paramEffect.at(b); + paramEntity.hit = 1f; + paramEntity.buildup += b.damage(); + } + } + }; + + //TODO proper length? + public float length = 40f; + public float padSize = 40f; public DirectionalForceProjector(String name){ super(name); + radius = 30f; consumeCoolant = false; + rotate = true; + rotateDraw = false; + } + + @Override + public void init(){ + super.init(); + if(length < 0){ + length = size * tilesize/2f; + } + } + + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + drawPotentialLinks(x, y); + + //TODO } public class DirectionalForceProjectorBuild extends ForceBuild{ @Override public void deflectBullets(){ - //TODO + float realRadius = realRadius(); + + if(realRadius > 0 && !broken){ + paramEntity = this; + paramEffect = absorbEffect; + + //top + p1.set(length, realRadius).rotate(rotdeg()); + //bot + p2.set(length, -realRadius).rotate(rotdeg()); + + //"check" radius is grown to catch bullets moving at high velocity + Tmp.r1.set(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y).normalize().grow(padSize); + + p1.add(x, y); + p2.add(x, y); + + Groups.bullet.intersect(x + Tmp.r1.x, y + Tmp.r1.y, Tmp.r1.width, Tmp.r1.height, dirShieldConsumer); + } + } + + @Override + public void drawShield(){ + if(!broken && realRadius() > 0){ + float realRadius = realRadius(), rot = rotdeg(); + + p1.set(length, realRadius).rotate(rot).add(this); + p2.set(length, -realRadius).rotate(rot).add(this); + float size = 3f; + Tmp.r1.set(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y).normalize().grow(size); + + Draw.z(Layer.shields); + + Draw.color(team.color, Color.white, Mathf.clamp(hit)); + + if(renderer.animateShields){ + Fill.rect(Tmp.r1); + + Tmp.v1.set(length - size/2f - size * 2, (realRadius + size/2f)).rotate(rot).add(this); + Tmp.v2.set(length - size/2f - size * 2, -(realRadius + size/2f)).rotate(rot).add(this); + + Fill.tri(x, y, Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y); + + for(int i : Mathf.signs){ + Tmp.v1.set(length - size/2f, (realRadius + size/2f) * i).rotate(rot).add(this); + Tmp.v3.set(length + size/2f, (realRadius + size/2f) * i).rotate(rot).add(this); + Tmp.v2.set(length, (realRadius + size) * i).rotate(rot).add(this); + Fill.tri(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y, Tmp.v3.x, Tmp.v3.y); + } + }else{ + Lines.stroke(1.5f); + Draw.alpha(0.09f + Mathf.clamp(0.08f * hit)); + Fill.rect(Tmp.r1); + Draw.alpha(1f); + Lines.rect(Tmp.r1); + Draw.reset(); + } + + Draw.reset(); + } } } } diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index bd50bf7b0d..488d366cc3 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.defense; -import arc.*; import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; @@ -229,7 +228,7 @@ public class ForceProjector extends Block{ Draw.color(team.color, Color.white, Mathf.clamp(hit)); - if(Core.settings.getBool("animatedshields")){ + if(renderer.animateShields){ Fill.poly(x, y, 6, radius); }else{ Lines.stroke(1.5f);