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 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RW7>k44ofy`glX=O&z_ilS z#WAE}&fB?ngPIK_T*Qy5Uu9oeD^MG{r{K{QGZvvk+auG?Pc75ptZw*YvQoGya$4%m zs`Dnk!EXzr{w>@3X5N{JtzVVIpUf+8cky%3%y8ulV*19iM$OU9!FPj~kdyQr7tIAR z$~UAk-fmnZozS4daDx4!@t<4CMu*rt`WHMG?&E2Q{N^1S!TSDbk9C4diqyl^NsK8v z4QDQ#Kkjlq??nbr{6UwsEUh0H6&VlIacVtePGV}v<@9>Ud_a0P)7F~$x=pJuh<o*+$A1h;_v9Up{AOl5{+rqF*l%XG z1HYNs7Gz~EVmdF&a<$uS)1~lPE2pmhaMf;gf%%l4D_5C*{BH6|*J*$RrI^DpCQ$hP z{|^e*Y1-?er>=Yv8lLAJvgzyQOjgdr;U8WcYPhJnL)->_9ODq5Y literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/defense/barrier-projector.png b/core/assets-raw/sprites/blocks/defense/barrier-projector.png new file mode 100644 index 0000000000000000000000000000000000000000..edac72c03328a4f6a8593ab4efd8fb8d04384a2f GIT binary patch literal 1168 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RW7>k44ofy`glX=O&z~bfU z;uumf=j~kIyxRr>t?@l_NAF6!aFtSUyihG->69;`5^ngQw{&`nt8;+r#LxCUKf}s$ zCV%;DGR=cmoxeW*e=XC2mnBCg?B{!W@Trk&-{ZW}8S9?kp3HbKo}EEL;8DqMPAP$; zk{R}r0)I*){v|qmxLVK9z<4m2f4}_yn!LRge}2CHb|Y!t1*Y&@>)qvr*19=NOjSwg zT61FK8zzPvg%qRx8d*M}3=MiMJR%APZtUVX+nMc<(P)xw`QvNzdiLo)!Pv)}+A3@L_$Q(%I)d2br3<7#i}@*gkhFDXw5#Fz1TV%y6}qkg>s#&b-8YCmubFo#+G&L+ zE5q?Wi>lid*c1%+znG`^M_{|dg?mK~KaF%9wkKrXv8t)6Q`C?4SW@P_Y1uUWt3sUB z>$6=2RfU#ZxXG~P?ELM!Q&YMR?sXJczVylw&gZ5aBFWWF3SMV6U6ElrexYNs6}!_{ zl{?7-nDcWbJaWN!tE6)Du;Kb0t+tTxl*^`lB zm%yf3{3>h=FC0$f*j*^FPuOYmpte3?*SwqFB2%RQMn&nBUioEqw(pt{d)3dL^i$oH zWhH{FO=0iUSr2{M8^bZ>_szWD%w3zDZdCD$Hnsn3_@FX}*NHbkn??UK}p#Fvve;Hh(CnoHiT;#3wx#2y7;-MOcLZxfQEgGL0lWv}xRn_8f zcje-}$sIA;u=G&=_r^BvIkvtR@A1$Es+HFRf zdwNU2>txP@yE52!M|C|tutv>U|?|#L~SotbHtE=ch%UeP1 zu60%`bp1awHgB40n%edt*G?d0n~`!0$7jZ;vp?;1+MsuIzxvlT9rqLpwEr&CjNZ8{ zPNCq;^|pj*;!|XsmK@uv#`4i-f!eEEJ4^3Pd{$xd@BFOFG?}Xbr}rqoZFW=^iU|@n zcG%G6qRF!T&IJ#SYxd1T9P3W*6cpHV&M}7L-OYUY!PC{xWt~$(699g>|49G< literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/turrets/lancer-heat.png b/core/assets-raw/sprites/blocks/turrets/lancer-heat.png index d1494ebefbe9e4ca5c7d8a2c486775509cbde565..e2a5442ebdfa45a7aa45e73e5d9aa4325ce8d4bc 100644 GIT binary patch delta 324 zcmaFO^oD7IVZEBCi(^Q|oVPbO_8xK&XniQ@qRkS{>?&}PhxNi4*Kig_QGpB0x;&iP z2RS#ieyl$DFP@{j>{;aoaY06g4=Yv$ht8d2x+MGY|K9Xx{fqg$8P>1crOZ;v;HUFl!#k!sG0z(gZ@z9^ymsBuN}-y1j)NC%n$|Zw)%dgJ zr<-h(NyEZt(y1JG?b$9`ANT$6{qFCXJ43GuE!@w!FLz&Hn*w)2&gWh&mU&DJ3=5)P zE&gDq6vlk|+{~T9SA-R9IPcB+|LfLD72$&G7cN}QKPM>IzMY>($0EX3X@%?%f&r0p}G4u hvN13)%y`Fjg*$4~nJuS985kHCJYD@<);T3K0RU*pC^XT<+t}`39w;h{Tcae!9StyMELH{#uFOD<+*?qD)EdMps z^IA2$Vos=Gw+V~0_x>tu^MC>Fyo9&BN{^QPcoQ;(^T%>Qx6dUrD`S#+XU?2C^Jb0y ZzMD~-u6MsTVqjok@O1TaS?83{1OTdPje!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);