From 02f40d1e29cda0f33f7a0924fbc64e289b2068d1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 16 Jun 2022 20:02:15 -0400 Subject: [PATCH] WIP shielded wall --- .../blocks/walls/shielded-wall-glow.png | Bin 0 -> 788 bytes .../sprites/blocks/walls/shielded-wall.png | Bin 0 -> 893 bytes core/assets/icons/icons.properties | 1 + core/assets/logicids.dat | Bin 4518 -> 4533 bytes core/src/mindustry/content/Blocks.java | 25 +++- .../world/blocks/defense/ShieldWall.java | 122 ++++++++++++++++++ 6 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/walls/shielded-wall-glow.png create mode 100644 core/assets-raw/sprites/blocks/walls/shielded-wall.png create mode 100644 core/src/mindustry/world/blocks/defense/ShieldWall.java diff --git a/core/assets-raw/sprites/blocks/walls/shielded-wall-glow.png b/core/assets-raw/sprites/blocks/walls/shielded-wall-glow.png new file mode 100644 index 0000000000000000000000000000000000000000..7eac1db5155a8ac978dece0ed1be50ddf67c734b GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEk44ofy`glX=O&z;w>j z#WAE}&fA&U`9h8&ZSxtuaxXVzn$8OGnHBZ-zx{FV)$v(hnTD#1pY4 z)k&KzRzem9C*I!r%ORU>dR&8dia+n%4Rek`9RKmB0Ub$0GPtrSDWm5gFfzFc_v zmSygTr0wgw*O&eLn|n1%tHH@dC3VA;GYs7M))^CwU8e6c-tv0>X3c%~p1xLdx#;~s zT}nr{aq7$oDmi|(EW1`rP~3H{|H93GBC>qGk2ap)sI%gSsFbXqX7dtFDP1*bHs8(f z<_o!oEZ&>!&0MnRb@Xgs#)vnLwY$p$H02i`vzz_wuc#*P4}H%}hd0}}Pu=);?UJm) z_B~B!CGDo^znQmlYUk7X_kwGBQ*J-IQtTkJ-Ef=yC7XAz@4rs|C;fqQ2h*{z>qkDx zKQoeW5)jn9;F;Bwm-B5+@3O-9ST=62kMV&Qryr<(u=uL!#$DZ0*wsC&9XJ*WOjNxU zn;&rTw%VFkl@6hQ*dMHoUB7mnWL4ONF9%dARV17uIz2?TObh+3H)Y`mnYZ5p|5)$t zd;2}-_G6vuMqM?Jr@I#2;kmmo`QM~ZXVb;`CCi(meHx0+gl|6_{$fVHuT6>_|BmA< zj?T9k44ofy`glX=O&z-;d6 z;uumf=V`Qcp0XiNYL9L$gYwe;3Bu1Ls#|PNi`g~JW@y`;dnbK%U_$m0`}szV@lPvM z3V-+niLBi7=lAd5ljH8ch}^h)?s}K$m&^Ab-=661^5u-mn_KPast>RKmEZn(>bDZ5 zV4nvkoQ_XU+PV85_heO%^Ap2ZChS&f@K8Lc#No)~@ooZxQX5NugO^Z4Q6y7`m5|E) z$A8v0v23_Az2E-*{96nDemt<>C7^&SY-ig6jVOkR&XtP~nAjBY+IM&~cvqg@tfN#U zDipyK@pO9+1E({S#nb%fufG|)sdKJY(9qm3WiAvpb!F;x!*k)y3Kye(u7AI#(n&=x zWxK^z+vy&N53`s4mx7zjmhO zmcVd+g{Ukh=A++^A9l9kc+NRpSUUX1+@%k{=B~N1bakRd%p_ZG7m=JU&*&v0AxC%K zwaPQdK6N~i{oV26=q0JX!Hb@j8Yb?klQDBRE8KI6|9R1dNegD!Z?fm9R{r#7S$R9p{x5{1-fB>9~Evi7A~| zC_v>(w8J48UlkGNM@%|A`yagVx?;m5^UQj3%TBQkj%Sn)2ucg=JD0eQRl;M&N*lo@ zhJ;H^9lTFjT8y_Zy{;}6&(JE?!M(%th23|R1yj_$1OlcVHokV@TDz!+*b*IvS^La{ z8cqo-u0F(lNM(za)3Yd^HP&xro~u1v*Kz3F)^+Bqtz+B{Eoj;@>-AQR#6KIfaxy1G z&0cYMYpc|LlX#V#t90H4>UcSctaIbpWvx@&f8xfS*cFm@6JJ)Uay}Hh)APh%fiYu26UN!V%D?A2{tr2GG0 z@-997y*(|fj2+$9g@qKRHoc3Mb3Jk5>Lk^2t(<+&gL`^nI$JJ8I_wo=c5>5mZ_?y& zV_7s|qBU2K|8<$Sx({D+C{(E^zG1SLJuCZ<`N(8F#)pDd&lwmP7(8A5T-G@yGywp) C--8?g literal 0 HcmV?d00001 diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 4408c861c0..2bc10271e3 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -565,3 +565,4 @@ 63119=ship-refabricator|block-ship-refabricator-ui 63118=slag-heater|block-slag-heater-ui 63117=afflict|block-afflict-ui +63116=shielded-wall|block-shielded-wall-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index 3ee34e9448248157e1584d85896949277034238b..85047dce5b2a4bff17dd202535fac34f35fd93e3 100644 GIT binary patch delta 30 mcmZ3cyj7Wr;qykOrF?w6#Tl8YIVq_ry5)&EIg6L^F#`ak8VZpB delta 16 Ycmdn0yiA#i;nPN@rF@&W@%?8405x?6bN~PV diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 934fe6d40e..6ab0b23cee 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -80,7 +80,11 @@ public class Blocks{ //defense copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, + + //walls - erekir berylliumWall, berylliumWallLarge, tungstenWall, tungstenWallLarge, blastDoor, reinforcedSurgeWall, reinforcedSurgeWallLarge, carbideWall, carbideWallLarge, + shieldedWall, + mender, mendProjector, overdriveProjector, overdriveDome, forceProjector, shockMine, scrapWall, scrapWallLarge, scrapWallHuge, scrapWallGigantic, thruster, //ok, these names are getting ridiculous, but at least I don't have humongous walls yet @@ -1669,6 +1673,20 @@ public class Blocks{ size = 2; }}; + shieldedWall = new ShieldWall("shielded-wall"){{ + requirements(Category.defense, ItemStack.with(Items.phaseFabric, 20, Items.surgeAlloy, 12)); + consumePower(3f / 60f); + + outputsPower = false; + hasPower = true; + consumesPower = true; + conductivePower = true; + + health = 260 * wallHealthMultiplier * 4; + armor = 15f; + size = 2; + }}; + mender = new MendProjector("mender"){{ requirements(Category.effect, with(Items.lead, 30, Items.copper, 25)); consumePower(0.3f); @@ -1992,6 +2010,7 @@ public class Blocks{ hasPower = true; consumesPower = true; conductivePower = true; + underBullets = true; baseEfficiency = 1f; consumePower(1f / 60f); @@ -4124,7 +4143,7 @@ public class Blocks{ intervalRandomSpread = 20f; intervalBullets = 2; intervalAngle = 180f; - intervalSpread = 280f; + intervalSpread = 300f; fragBullets = 20; fragVelocityMin = 0.5f; @@ -4140,7 +4159,7 @@ public class Blocks{ under = true; moveX = 2f; moveY = -1f; - moveRot = -5f; + moveRot = -7f; }}, new RegionPart("-blade-glow"){{ progress = PartProgress.recoil; @@ -4151,7 +4170,7 @@ public class Blocks{ under = true; moveX = 2f; moveY = -1f; - moveRot = -5f; + moveRot = -7f; }}); }}; diff --git a/core/src/mindustry/world/blocks/defense/ShieldWall.java b/core/src/mindustry/world/blocks/defense/ShieldWall.java new file mode 100644 index 0000000000..5fc190c099 --- /dev/null +++ b/core/src/mindustry/world/blocks/defense/ShieldWall.java @@ -0,0 +1,122 @@ +package mindustry.world.blocks.defense; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import arc.util.io.*; +import mindustry.annotations.Annotations.*; +import mindustry.graphics.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +public class ShieldWall extends Wall{ + public float shieldHealth = 900f; + public float breakCooldown = 60f * 10f; + public float regenSpeed = 2f; + + public Color glowColor = Color.valueOf("ff7531").a(0.5f); + public float glowMag = 0.6f, glowScl = 8f; + + public @Load("@-glow") TextureRegion glowRegion; + + public ShieldWall(String name){ + super(name); + + update = true; + } + + @Override + public void setStats(){ + super.setStats(); + + stats.add(Stat.shieldHealth, shieldHealth); + } + + public class ShieldWallBuild extends WallBuild{ + public float shield = shieldHealth, shieldRadius = 0f; + public float breakTimer; + + @Override + public void draw(){ + Draw.rect(block.region, x, y); + + if(shieldRadius > 0){ + float radius = shieldRadius * tilesize; + + Draw.z(Layer.shields); + + Draw.color(team.color, Color.white, Mathf.clamp(hit)); + + if(renderer.animateShields){ + Fill.square(x, y, radius); + }else{ + Lines.stroke(1.5f); + Draw.alpha(0.09f + Mathf.clamp(0.08f * hit)); + Fill.square(x, y, radius); + Draw.alpha(1f); + Lines.poly(x, y, 4, radius, 45f); + Draw.reset(); + } + + Draw.reset(); + + Drawf.additive(glowRegion, glowColor, (1f - glowMag + Mathf.absin(glowScl, glowMag)) * shieldRadius, x, y, 0f, Layer.blockAdditive); + } + } + + @Override + public void updateTile(){ + if(breakTimer > 0){ + breakTimer -= Time.delta; + }else{ + //regen when not broken + shield = Mathf.clamp(shield + regenSpeed * edelta(), 0f, shieldHealth); + } + + if(hit > 0){ + hit -= Time.delta / 10f; + hit = Math.max(hit, 0f); + } + + shieldRadius = Mathf.lerpDelta(shieldRadius, broken() ? 0f : 1f, 0.12f); + } + + public boolean broken(){ + return breakTimer > 0 || !canConsume(); + } + + @Override + public void damage(float damage){ + float shieldTaken = broken() ? 0f : Math.min(shield, damage); + + shield -= shieldTaken; + if(shieldTaken > 0){ + hit = 1f; + } + + //shield was destroyed, needs to go down + if(shield <= 0.00001f && shieldTaken > 0){ + breakTimer = breakCooldown; + } + + if(damage - shieldTaken > 0){ + super.damage(damage - shieldTaken); + } + } + + @Override + public void write(Writes write){ + super.write(write); + write.f(shield); + } + + @Override + public void read(Reads read, byte revision){ + super.read(read, revision); + shield = read.f(); + if(shield > 0) shieldRadius = 1f; + } + } +}