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 zcmV+v1MB>WP)Px%&PhZ;RCt{2nQLznK@^6c0ZMJtfN3?FR7{#${r^A5OJh=MqR}>?A)p9*{BX{= z%d+Kz&a5?@Cz&iTJ2U&fJC`#9IF92uj^j9v<2a7vIJ-so7mbQYY&Tv7AcP=oKTGQd zh)4(M09{J}D@#QPp=k4YS~WmKxthWw4aY01IzBXpl2Rm%1~w>z}hJzTV~QCPdLo;3pa^ zErFGpkR)tQJp{U_kRiIxkI>ov6devt;<3-MEU5Su8XZn4gQO`MEhZZVO|$Nw5=B&_ zy<_L6IcTg!GqsBg)=KU2Z4frofX+Z3@3(DC3*3um?x4eSQ89tUT z?4G%miRFLq5v+}5+ve1BKpeL*wja_w?(5&{WBwcP3Ah5rR@cPxALcR`LJ$!t&`D~7 zZfy3fjizy5T?PwE@n2EVm%w}Aqt!LBx{H(tCrNui2%!*>CE8tYP|@2atm=6{Rs09w ztzECJt{Hk(ko3SLc_bJ@Scym!w3b!-E|j709PRc|{5!jj?e}ck<1BlDEhb3ix}w|+ z-JxUtlJd=G7Y`YCgIi31a?Dq^!&m5-Z%sU8J`cFZ1VKaEDeDG|(FyOGmc&B~CqfM- z2pZc@*o7l8*f1dmI}>*0P&BgB$KsKl{$nKakp3ET9LI4S$8j9TaU92Sc8y=*yhMb! S{cQ9A0000Px&H%UZ6RCt`_TRUzeF$`slEqwqZrH_yk<`{c~J*Zm*2^Og2= zB2!G@$U?`HV!6Bi3zH>C&yiLHkh>y)NFl)@2tfi!?vMZ?h6Im*N)mu_SptYU5+vW_ z{I7xpu-uoAKkuK~p#AZ{zeG@Q3Rby>z$jV(kwbZ-z%)E^4L^uTfJ=GHvn(QV6%tqi zSmn2j00~0^IOT8W>-IB7Ckd+{C@H@hHxgErsb$wO&R2sV(OUVh@2q)3BrasPIHOFJ zfRXYK&n$UD6cb1=S%3sFCRFSQ$Rvw0d4Tr3ayyKYkj(=cI3=ejudSImv{6?NAX;hy z1I6~o!$Uj>=Lwe+8&}w!rQ!8$tk|WiVK`ipJqtt>Y>G)+q!d)ex!pQ$Fl)-kVF&KV zb6cckO;e)fbunSQejGMH%@d5u59e~QlAw%BTSR)3BLOo%&l z2ovB6W(*1Y<3S|{O+q>o9AOyAI}*6hBOp(p5LChn-5gQP`&S9p6g0!0JwJ2fyuqte6kXoCl!?lGPzcgPYxvDJgQ7lSA6s|@L zx;rd=kI2~EU8ot|Vd;4#3E>vpjP5WImITqw3QA<@JmBGl67xNC)h)6C-5us$EIQvZ zN8KVDjMfp}1|^_MTIv?reBQAQ@|UGKAsfY)B{*-ZxVyt!CV@qDcUU3;Nl-{GsyiI% z?o_}f*N_LSuE>mFxi*7Ji!*X9|NdjTE-$@|gsL+^My^&=ab<$;TOLKo$kmc1cPebY z=TnS~T#1CxSwOuO142eFM}jE`Mg*dekvj^EPuCpnE#c`1AbKPr>;gX>%^m&&#FH)o T;SoCL00000NkvXXu0mjfx!;2v 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; + } + } +}