From 8da4e72e77b6d0d36f727364f227586c0e6e7539 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 12 Nov 2021 11:07:15 -0500 Subject: [PATCH] carbide crucible implementation --- .../production/carbide-crucible-bottom.png | Bin 0 -> 307 bytes .../production/carbide-crucible-heat.png | Bin 0 -> 8486 bytes .../production/carbide-crucible-top.png | Bin 0 -> 326 bytes .../blocks/production/carbide-crucible.png | Bin 0 -> 1603 bytes core/src/mindustry/content/Blocks.java | 8 +- core/src/mindustry/content/Fx.java | 11 +++ core/src/mindustry/content/Items.java | 2 +- .../world/blocks/defense/BuildTurret.java | 2 +- .../world/blocks/heat/HeatProducer.java | 2 +- .../blocks/production/GenericCrafter.java | 6 +- .../world/blocks/production/HeatCrafter.java | 42 +++++++--- .../mindustry/world/draw/DrawArcSmelter.java | 2 +- .../mindustry/world/draw/DrawCrucible.java | 72 ++++++++++++++++++ core/src/mindustry/world/draw/DrawHeat.java | 41 ++++++++++ core/src/mindustry/world/draw/DrawMulti.java | 45 +++++++++++ tools/build.gradle | 2 +- 16 files changed, 213 insertions(+), 22 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/production/carbide-crucible-bottom.png create mode 100644 core/assets-raw/sprites/blocks/production/carbide-crucible-heat.png create mode 100644 core/assets-raw/sprites/blocks/production/carbide-crucible-top.png create mode 100644 core/assets-raw/sprites/blocks/production/carbide-crucible.png create mode 100644 core/src/mindustry/world/draw/DrawCrucible.java create mode 100644 core/src/mindustry/world/draw/DrawHeat.java create mode 100644 core/src/mindustry/world/draw/DrawMulti.java diff --git a/core/assets-raw/sprites/blocks/production/carbide-crucible-bottom.png b/core/assets-raw/sprites/blocks/production/carbide-crucible-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9cacb3f84e5f9fefbbff462bfd7413245acb09 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D$|-g>$?hE&XX zd(n`WL6PBrgM)z1kL}-1?08tsHLK)Z@qWRymks-~8Lly`VT@qjz?Q&!K&ru%VTcOI Yg)U(Vm~P6~5A-;Lr>mdKI;Vst0Gt$DasU7T literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/production/carbide-crucible-heat.png b/core/assets-raw/sprites/blocks/production/carbide-crucible-heat.png new file mode 100644 index 0000000000000000000000000000000000000000..59a1fd5c3626ca0d987789173b9a0744f20a878a GIT binary patch literal 8486 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 U2f;6Z{Qv*}07*qoM6N<$f_DS>KL7v# literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/production/carbide-crucible-top.png b/core/assets-raw/sprites/blocks/production/carbide-crucible-top.png new file mode 100644 index 0000000000000000000000000000000000000000..a5bef0741f428f066a28dcfb415b4f6c369f3965 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D%z89ZGaLn`LH zz2V5$tRTP|@aFG(A9GbhH|{NJXJ&lA7TfdR_(lZCI0T5yUClltFng`?{@dGh&lWG0 zEHU|`=FO?uHivir$pEJxjP<qVoH$AI;JHi51B&NM#-pBQIO-lxA%f6;{ zGR?ienq((#YETb6kfh0NaqscPcV8tl+25c1q_6Rm?Mq6PX1f({`Ha79TcUO}{+p=# zCrGY}Ro0bv|CIJz2hIJp2Og(=P5vr_@CJx={wrI?vIsTqdId2M*VEO{Wt~$(695tw Bero^# literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/production/carbide-crucible.png b/core/assets-raw/sprites/blocks/production/carbide-crucible.png new file mode 100644 index 0000000000000000000000000000000000000000..bb09add910abef16461609e127cafa36df3f7ab2 GIT binary patch literal 1603 zcmV-J2E6%+P) zOO6#W3`O7iUi07r2n@hl*j93xC%0lfsIqbgY1;G!`RAQ`C@ z5>x?Af)>#0unK-3mx09q$w)=GglB*kC<}|7)~J9P%OxX~k)ZAYXaFs#AD=$D7c-Sx zOb=8vZZubh3nXB4W8`#HEug>8f}f3DB>|KvDSB zeRwfY326by9uXOomT;wjOdrVXFBdS9fOgEl@sh5FFZ)1ZMc4S$5+o%s)}!wMRT9wU zA)Bkk1mOh<&@StAR3RWLfq`FAM%VgoZ0=!K*BH{bHH!rTO1dMWt!q)_N_qYNoC5#4qzwY;} z7I5!V%V!mQRe(%L+w3GnOM*7o{@zsrv~e=CvhPphgXHx>z$h6+fF;2isJzb`v=_@0 z;EffLAi<&nM!DUPgirw^3EJ;zzi&zKfO+7M+3v*}L1hF;2{&XwjDQ|$pCAfflYqdo z_7tlxRDuSS70_Q(1hl0G-f!(Ya!iN-OTtiqOrEU;nYE9dx9GT# zS`Z{))G-79$P%LC(Ig;cj2jCd6>u~OS@`HIkP=Ei$Q)Hd1$=Zbc)@^$e>MrT;fFp+ zdcn>jVHJE!LQ25V_k&sMep-MfVf42*|EmCxOLz&=BxrwsgGe}=0F+C36P6ORdIut4 zkMOe+P%fUxe+fj2ahY!eOo488W2>K50S+z3JqXBDL}!(zSGTGXG*b!vEdYU!NSINY zUfrq$An>X00hfSFz>;DdX$)G>;q7u#ozqMKW z!RYtQQUoI5Z17vlN?_ruwV>=QI3oPkqT@oIeySK3*$YOm?os$zahdz&m}F@pvi66n zp^N~lc9Mn9Ladm5Bl!LJ7y;>W^vV*nHO-MYqbD>Xp`tQc_B~)#3EJD_yf~w$Ga{j? zG`%|k7ChvXfeZ){U`g;;>|Q`b0s^dBz(_)aS@msTGXabQ6xIv@y#xuA8PDznw3AT= z)aVS(2w=|e8q_u(?*T{&u+F>@0dn9G3EGPgDu8*B@}6u|79-$c2992)q5`7e5ct}Q zp1iC)qy$7H@N6WkC&nkYV970xDt65Kt|l z?31MTeG`#T399v}ZFbt<<*bx|FoOgjfsg@K3F!M{1)vh5xi+W_vycGfXEOvu;7256 za@q(YTcYm_34e z6Gq`jk9Hm?^i9}{Bl|^jMdP9HL$x3TepEn(R2CMSs~4AnAFhTXgJWQ!2LU!_6?~Z| z%OpGlm=2=@^CVQk%D|5-m$FZK4`4df?#W81cv@%X#xfa6p#BGo$W { + color(Pal.redLight); + alpha(e.fslope() * 0.8f); + + rand.setSeed(e.id); + for(int i = 0; i < 5; i++){ + v.trns(rand.random(360f), rand.random(e.finpow() * 14f)).add(e.x, e.y); + Fill.circle(v.x, v.y, rand.random(1.4f, 2.8f)); + } + }).layer(Layer.bullet - 1f), + generatespark = new Effect(18, e -> { randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> { float len = e.fout() * 4f; diff --git a/core/src/mindustry/content/Items.java b/core/src/mindustry/content/Items.java index 160c59cc15..c450e38bb9 100644 --- a/core/src/mindustry/content/Items.java +++ b/core/src/mindustry/content/Items.java @@ -108,7 +108,7 @@ public class Items implements ContentList{ tungsten = new Item("tungsten", Color.valueOf("768a9a")){{ hardness = 5; - cost = 1.2f; + cost = 1.5f; }}; carbide = new Item("carbide", Color.valueOf("89769a")){{ diff --git a/core/src/mindustry/world/blocks/defense/BuildTurret.java b/core/src/mindustry/world/blocks/defense/BuildTurret.java index a38adfa38f..07fbe5249a 100644 --- a/core/src/mindustry/world/blocks/defense/BuildTurret.java +++ b/core/src/mindustry/world/blocks/defense/BuildTurret.java @@ -22,7 +22,7 @@ import static mindustry.Vars.*; public class BuildTurret extends BaseTurret{ public final int timerTarget = timers++, timerTarget2 = timers++; - public int targetInterval = 60; + public int targetInterval = 30; public @Load(value = "@-base", fallback = "block-@size") TextureRegion baseRegion; public float buildSpeed = 1f; diff --git a/core/src/mindustry/world/blocks/heat/HeatProducer.java b/core/src/mindustry/world/blocks/heat/HeatProducer.java index 9c1f39fb38..7e0cdb6188 100644 --- a/core/src/mindustry/world/blocks/heat/HeatProducer.java +++ b/core/src/mindustry/world/blocks/heat/HeatProducer.java @@ -19,7 +19,7 @@ import mindustry.world.meta.*; public class HeatProducer extends Block{ public float heatOutput = 10f; - public float warmupRate = 0.25f; + public float warmupRate = 0.15f; public float consumeTime = 100; public @Load("@-heat") TextureRegion heatRegion; diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index 6df7ff8eca..aea5700c02 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -117,7 +117,7 @@ public class GenericCrafter extends Block{ progress += getProgressIncrease(craftTime); totalProgress += delta(); - warmup = Mathf.approachDelta(warmup, 1f, warmupSpeed); + warmup = Mathf.approachDelta(warmup, warmupTarget(), warmupSpeed); if(Mathf.chanceDelta(updateEffectChance)){ updateEffect.at(x + Mathf.range(size * 4f), y + Mathf.range(size * 4)); @@ -133,6 +133,10 @@ public class GenericCrafter extends Block{ dumpOutputs(); } + public float warmupTarget(){ + return 1f; + } + public void craft(){ consume(); diff --git a/core/src/mindustry/world/blocks/production/HeatCrafter.java b/core/src/mindustry/world/blocks/production/HeatCrafter.java index 85503e032e..f0546d68d8 100644 --- a/core/src/mindustry/world/blocks/production/HeatCrafter.java +++ b/core/src/mindustry/world/blocks/production/HeatCrafter.java @@ -7,14 +7,16 @@ import mindustry.graphics.*; import mindustry.ui.*; import mindustry.world.blocks.heat.*; +import java.util.*; + /** A crafter that requires contact from heater blocks to craft. */ public class HeatCrafter extends GenericCrafter{ /** Base heat requirement for 100% efficiency. */ public float heatRequirement = 10f; /** After heat meets this requirement, excess heat will be scaled by this number. */ - public float overheatScale = 0.25f; + public float overheatScale = 1f; /** Maximum possible efficiency after overheat. */ - public float maxEfficiency = 2f; + public float maxEfficiency = 4f; public HeatCrafter(String name){ super(name); @@ -24,14 +26,14 @@ public class HeatCrafter extends GenericCrafter{ public void setBars(){ super.setBars(); - bars.add("heat", (AttributeCrafterBuild entity) -> + bars.add("heat", (HeatCrafterBuild entity) -> new Bar(() -> - Core.bundle.format("bar.heatpercent", (int)entity.lastHeat), + Core.bundle.format("bar.heatpercent", (int)entity.heat), () -> Pal.lightOrange, - () -> entity.lastHeat / heatRequirement)); + () -> entity.heat / heatRequirement)); //TODO unnecessary? - bars.add("efficiency", (AttributeCrafterBuild entity) -> + bars.add("efficiency", (HeatCrafterBuild entity) -> new Bar(() -> Core.bundle.format("bar.efficiency", (int)(entity.efficiencyScale() * 100)), () -> Pal.ammo, @@ -45,30 +47,46 @@ public class HeatCrafter extends GenericCrafter{ //TODO heat stats } - public class AttributeCrafterBuild extends GenericCrafterBuild{ - public float lastHeat = 0f; + public class HeatCrafterBuild extends GenericCrafterBuild{ + //TODO sideHeat could be smooth + public float[] sideHeat = new float[4]; + public float heat = 0f; @Override public void updateTile(){ - lastHeat = 0f; + Arrays.fill(sideHeat, 0f); + heat = 0f; + for(var edge : getEdges()){ Building build = nearby(edge.x, edge.y); if(build != null && build.team == team && build instanceof HeatBlock heater && (!build.block.rotate || (relativeTo(build) + 2) % 4 == build.rotation)){ //heat is distributed across building size - lastHeat += heater.heat() / build.block.size; + float add = heater.heat() / build.block.size; + + sideHeat[Mathf.mod(relativeTo(build), 4)] += add; + heat += add; } } super.updateTile(); } + public float heatRequirement(){ + return heatRequirement; + } + + @Override + public float warmupTarget(){ + return Mathf.clamp(heat / heatRequirement); + } + @Override public float getProgressIncrease(float base){ return super.getProgressIncrease(base) * efficiencyScale(); } public float efficiencyScale(){ - float over = Math.max(lastHeat - heatRequirement, 0f); - return Math.min(Mathf.clamp(lastHeat / heatRequirement) + over / heatRequirement * overheatScale, maxEfficiency); + float over = Math.max(heat - heatRequirement, 0f); + return Math.min(Mathf.clamp(heat / heatRequirement) + over / heatRequirement * overheatScale, maxEfficiency); } } } diff --git a/core/src/mindustry/world/draw/DrawArcSmelter.java b/core/src/mindustry/world/draw/DrawArcSmelter.java index 51706aafbe..1291d35722 100644 --- a/core/src/mindustry/world/draw/DrawArcSmelter.java +++ b/core/src/mindustry/world/draw/DrawArcSmelter.java @@ -49,8 +49,8 @@ public class DrawArcSmelter extends DrawBlock{ Draw.reset(); } - Draw.rect(top, build.x, build.y); Draw.rect(build.block.region, build.x, build.y); + if(top.found()) Draw.rect(top, build.x, build.y); } @Override diff --git a/core/src/mindustry/world/draw/DrawCrucible.java b/core/src/mindustry/world/draw/DrawCrucible.java new file mode 100644 index 0000000000..83eabcaf4c --- /dev/null +++ b/core/src/mindustry/world/draw/DrawCrucible.java @@ -0,0 +1,72 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.Interp.*; +import arc.util.*; +import mindustry.world.*; +import mindustry.world.blocks.production.GenericCrafter.*; + +//TODO +public class DrawCrucible extends DrawBlock{ + public TextureRegion top, bottom; + public Color flameColor = Color.valueOf("f58349"), midColor = Color.valueOf("f2d585"); + public float flameRad = 1f, circleSpace = 2f, flameRadiusScl = 10f, flameRadiusMag = 0.6f, circleStroke = 1.5f; + + public float alpha = 0.5f; + public int particles = 30; + public float particleLife = 70f, particleRad = 7f, particleSize = 3f, fadeMargin = 0.4f; + public Interp particleInterp = new PowIn(1.5f); + + @Override + public void draw(GenericCrafterBuild build){ + Draw.rect(bottom, build.x, build.y); + + if(build.warmup > 0f && flameColor.a > 0.001f){ + Lines.stroke(circleStroke * build.warmup); + + float si = Mathf.absin(flameRadiusScl, flameRadiusMag); + float a = alpha * build.warmup; + Draw.blend(Blending.additive); + + Draw.color(midColor, a); + Fill.circle(build.x, build.y, flameRad + si); + + Draw.color(flameColor, a); + Lines.circle(build.x, build.y, (flameRad + circleSpace + si) * build.warmup); + + float base = (Time.time / particleLife); + rand.setSeed(build.id); + for(int i = 0; i < particles; i++){ + float fin = (rand.random(1f) + base) % 1f, fout = 1f - fin; + float angle = rand.random(360f); + float len = particleRad * particleInterp.apply(fout); + Draw.alpha(a * (1f - Mathf.curve(fin, 1f - fadeMargin))); + Fill.circle( + build.x + Angles.trnsx(angle, len), + build.y + Angles.trnsy(angle, len), + particleSize * fin * build.warmup + ); + } + + Draw.blend(); + Draw.reset(); + } + + Draw.rect(build.block.region, build.x, build.y); + if(top.found()) Draw.rect(top, build.x, build.y); + } + + @Override + public void load(Block block){ + top = Core.atlas.find(block.name + "-top"); + bottom = Core.atlas.find(block.name + "-bottom"); + } + + @Override + public TextureRegion[] icons(Block block){ + return new TextureRegion[]{bottom, block.region, top}; + } +} diff --git a/core/src/mindustry/world/draw/DrawHeat.java b/core/src/mindustry/world/draw/DrawHeat.java new file mode 100644 index 0000000000..a67c10f4d3 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawHeat.java @@ -0,0 +1,41 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.blocks.production.GenericCrafter.*; +import mindustry.world.blocks.production.HeatCrafter.*; + +public class DrawHeat extends DrawBlock{ + public Color heatColor = new Color(1f, 0.22f, 0.22f, 0.8f); + public float heatPulse = 0.3f, heatPulseScl = 10f; + + public TextureRegion heat; + + @Override + public void draw(GenericCrafterBuild build){ + + Draw.z(Layer.blockAdditive); + if(build instanceof HeatCrafterBuild hc){ + for(int i = 0; i < 4; i++){ + if(hc.sideHeat[i] > 0){ + Draw.blend(Blending.additive); + Draw.color(heatColor, hc.sideHeat[i] / hc.heatRequirement() * (heatColor.a * (1f - heatPulse + Mathf.absin(heatPulseScl, heatPulse)))); + Draw.rect(heat, build.x, build.y, i * 90f); + Draw.blend(); + Draw.color(); + } + } + } + Draw.z(Layer.block); + + } + + @Override + public void load(Block block){ + heat = Core.atlas.find(block.name + "-heat"); + } +} diff --git a/core/src/mindustry/world/draw/DrawMulti.java b/core/src/mindustry/world/draw/DrawMulti.java new file mode 100644 index 0000000000..78262a2dd1 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawMulti.java @@ -0,0 +1,45 @@ +package mindustry.world.draw; + +import arc.graphics.g2d.*; +import mindustry.world.*; +import mindustry.world.blocks.production.GenericCrafter.*; + +/** combined several DrawBlocks into one */ +public class DrawMulti extends DrawBlock{ + public DrawBlock[] drawers = {}; + /** specifies the drawer index that sources the icon (since there can only be one icon source) */ + public int iconIndex = 0; + + public DrawMulti(){ + } + + public DrawMulti(DrawBlock... drawers){ + this.drawers = drawers; + } + + @Override + public void draw(GenericCrafterBuild build){ + for(var draw : drawers){ + draw.draw(build); + } + } + + @Override + public void drawLight(GenericCrafterBuild build){ + for(var draw : drawers){ + draw.drawLight(build); + } + } + + @Override + public void load(Block block){ + for(var draw : drawers){ + draw.load(block); + } + } + + @Override + public TextureRegion[] icons(Block block){ + return drawers.length <= iconIndex ? super.icons(block) : drawers[iconIndex].icons(block); + } +} diff --git a/tools/build.gradle b/tools/build.gradle index 17872781a8..20f2995b6b 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -38,7 +38,7 @@ def transformColors = { List> list -> transformColors([["4a4b53", "6e7080", "989aa4"], ["3a5651", "3a8f64", "92dd7e"], ["bf92f9", "8a73c6", "665c9f"], /*["6e7080", "989aa4", "b0bac0"],*/ ["bc5452", "ea8878", "feb380"], ["de9458", "f8c266", "ffe18f"], ["feb380", "ea8878", "bc5452"], ["d4816b", "eab678", "ffd37f"], ["ffffff", "dcc6c6", "9d7f7f"], ["df7646", "b23a4d", "752249"], ["3c3837", "515151", "646567"], - ["5757c1", "6f80e8", "88a4ff"], ["8f665b", "b28768", "c9a58f"]]) + ["5757c1", "6f80e8", "88a4ff"], ["8f665b", "b28768", "c9a58f"], ["4c5878", "768a9a", "a0b0c8"]]) def antialias = { File file -> if(!doAntialias) return