From 8e4fdc92ec9de5f204e04706c13ee84f5ac7a2dd Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 3 Dec 2021 20:45:19 -0500 Subject: [PATCH] WIP terrible-looking regen projector --- .../blocks/defense/regen-projector-bottom.png | Bin 0 -> 515 bytes .../blocks/defense/regen-projector-glow.png | Bin 0 -> 8370 bytes .../defense/regen-projector-side-glow.png | Bin 0 -> 7155 bytes .../blocks/defense/regen-projector-top1.png | Bin 0 -> 760 bytes .../blocks/defense/regen-projector-top2.png | Bin 0 -> 756 bytes .../blocks/defense/regen-projector.png | Bin 0 -> 1445 bytes .../sprites/blocks/environment/tungsten1.png | Bin 399 -> 310 bytes .../sprites/blocks/environment/tungsten2.png | Bin 327 -> 275 bytes .../sprites/blocks/environment/tungsten3.png | Bin 331 -> 296 bytes .../blocks/environment/wall-tungsten1.png | Bin 0 -> 399 bytes .../blocks/environment/wall-tungsten2.png | Bin 0 -> 327 bytes .../blocks/environment/wall-tungsten3.png | Bin 0 -> 331 bytes core/assets/icons/icons.properties | 2 + core/assets/logicids.dat | Bin 3657 -> 3674 bytes core/src/mindustry/content/Blocks.java | 61 +++-- core/src/mindustry/content/Fx.java | 6 + .../maps/planet/ErekirPlanetGenerator.java | 4 + .../world/blocks/defense/MendProjector.java | 5 +- .../world/blocks/defense/RegenProjector.java | 215 ++++++++++++++++++ .../world/blocks/defense/turrets/Turret.java | 2 +- .../world/blocks/power/PowerGenerator.java | 10 +- .../blocks/production/GenericCrafter.java | 12 +- .../world/blocks/production/Pump.java | 2 +- core/src/mindustry/world/draw/DrawBlock.java | 15 ++ .../mindustry/world/draw/DrawGlowRegion.java | 7 +- .../mindustry/world/draw/DrawSideRegion.java | 45 ++++ tools/build.gradle | 2 +- 27 files changed, 342 insertions(+), 46 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-bottom.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-glow.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-side-glow.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-top1.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector-top2.png create mode 100644 core/assets-raw/sprites/blocks/defense/regen-projector.png create mode 100644 core/assets-raw/sprites/blocks/environment/wall-tungsten1.png create mode 100644 core/assets-raw/sprites/blocks/environment/wall-tungsten2.png create mode 100644 core/assets-raw/sprites/blocks/environment/wall-tungsten3.png create mode 100644 core/src/mindustry/world/blocks/defense/RegenProjector.java create mode 100644 core/src/mindustry/world/draw/DrawSideRegion.java diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector-bottom.png b/core/assets-raw/sprites/blocks/defense/regen-projector-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..71e64780bf1d2287a16fae43c6e3a180973d4f98 GIT binary patch literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D%z_j(WU^nx@w%_v=q<=eYkm_QoS5Xh^@2b=G@bOxlHgS(?IVD8IksXYHT951(6S-w$`uxcuZ< z@U)*{U9-n>VFqIYTLVdq%50^KnfXU&7b}*VKW9_^vazbV%HYt}GW!LB zJq5k1`ZZXU_guTy{-s8m%b4K|g8}ma9tJq$v%jEhWt11wylImfmM>L#kg3U80p#xE zZ6(PKaK%8!oVXn1FmD>ur!68AmM?9v(Ph2zMgOexF^=fwmW$W+Sf4R@D)l1c^I?x{ zxwHkh&hjr_v$IO0Xu-9!{K{)A|K?x4d6xg?^*c5(=NsqU{WGER?ENo-`}fGSDB1vH OmBG{1&t;ucLK6UatIFj7 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/defense/regen-projector-glow.png b/core/assets-raw/sprites/blocks/defense/regen-projector-glow.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa39ca852ac23bda8745046eabe09b0a70d5790 GIT binary patch literal 8370 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 Vc;6bhZU6uP00>D%PDHLkV1lyjd42!@ delta 360 zcmV-u0hj)^0*?cbFn<9_Nklj424B5L&aNUgmlzY%s@p=#|Ug8wsMLb ziDUF@`!07;=is1E^5e+>{}$`E$93DIb${17dAfewZ|eJ-0dQ4o5KRF3aegNcA-Eu_ z0n+3p5SLm2DiG1Uw;EuX2C_0lG=Z3oz@l#IC?r5LfJfaqgnyP?1?a~)Qi75oym8ew zq~|EXlm=S?ccuqOi|PTG4sgbDbfZ;r5ppL)|z+t^igU~wW_5sa^EH~m5(gd(>d!#Jc5_w1RwfjDxO-JvX5Idko|jHYlLk_V9B7$_u4X)|f0PWRg002ovPDHLkV1isfWNQEb delta 288 zcmV+*0pI?U0>=W7Fn<97NklM$ z3p9ZS9_rAyL0jG*5>kj({aBmQ!^iXWmgD1LUwj`5keiQ!*lLrf%S|;WvcX!lv&=&X z(;PD+JrgB6U_~xr(3-p&$hTXLd(E}E1b@KFH8a!wdUlyFE#w5i z%C$Fgt&lAx3&#(8w!IX&Tsy7{Z7MZ$shHAPA3)1GQBi6q9AU1FiNGl!vipgYtSdM` z4I(e=sQApYwd+t{9)}L&xJ5Ih))LS0Y-nPVc?K;)Q=66oUS%0!-l z^ZgQLhS6qzPP@0#o&Y*JI)02@rs)27&h*{+bWE)kF5<{*M1%@7@~nux_s3zJW<-pv z?Sf0~FivXcrIe57hzq6z7C8VwjWdU60qu4nN5s`P4^*pY_jwY*y92lDVR}$wfHs@V5LP8vFRB=#8nD56~INeX$-Y($d2lc|HliDz+2898ati<0000X6b(z#CM8B)1U=MlVxyp>WB z5M)w1Qc4vcphn*vADxI!oN!>>_Oxz$8gbXfN-WJkA9vF|E&;8Gy&|APXu3Tjng^`4 zwu-opB=_K^Ell&0VvH0*AR?j|<6#f4^*~J5G%s-Exd=}WRDVk#k?~+inX%xYSc_gt zcTWC!zg*7{%79jDp7)Z&0&3_XhXrVLMw+hmZ@@jk;Iy~MB~s~(`57W9uSHynP%o22 z^pZ;=)E+3w5OQ`;i#K$2a7kWU*Bn#*3r3O?=`U%B01b#`|EvU>b(g)=?Su@ZNu@o* q1hhnG#x<-2IUTqhsB511Z+rn}SAD)Zg+AH<0000Px$Nl8ROR9J=Gmc0>!Fbsu7EG zPx9l*0RI;2w#Rkbqji7RI(fQ&+;8gpn*nfDYYL?^YGk{0kIfRy61?a~)Qi75oym8ewq~|EXlm=S?ccuqO zi|PTG4sgbDbfZ;r5ppL)|z`aa^ z&^qS!0nLakH{ul11h8&Px$0ZBwbR9J=WmN6Q_APj}0pNBHH@Ca_sPM*QZ+07$(3%r$1^b0hB1|I6rw?SLp z9}-fCR{dC;(!C$hm>wX@7a2-6%hBRvx(J77gF zVbGfLDa~cX`A&FipjODU8pyX>j(g3uxdgz z=sQApYwd+t{9)}L&Md9;1N=T!gz002ovPDHLkV1m1RiG~0G literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/environment/wall-tungsten3.png b/core/assets-raw/sprites/blocks/environment/wall-tungsten3.png new file mode 100644 index 0000000000000000000000000000000000000000..da8b2321171f496a3e5f91443865d830d922d282 GIT binary patch literal 331 zcmV-R0kr;!P)Px$1xZ9fR9J=WRk;nrFbrgZ3>9sW5z@I%4^&Gak?~+inX%xYSc_gtcTWC!zg*7{%79jD zp7)Z&0&3_XhXrVLMw+hmZ@@jk;Iy~MB~s~(`57W9uSHynP%o22^pZ;=)E+3w5OQ`; zi#K$2a7kWU*Bn#*3r3O?=`U%B01b#`|EvU>b(g)=?Su@ZNu@o*1hhnG#x<-2Ik+6C dYo7RTd;w-xeZD${KH2~P002ovPDHLkV1iEEhN1uf literal 0 HcmV?d00001 diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 58f2e2dcf2..149661ff3c 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -471,3 +471,5 @@ 63235=arkyic-stone|block-arkyic-stone-ui 63234=yellow-stone-boulder|block-yellow-stone-boulder-ui 63233=pyrolysis-generator|block-pyrolysis-generator-ui +63232=wall-ore-tungsten|block-wall-ore-tungsten-ui +63231=regen-projector|block-regen-projector-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index cf2427f6568a37111b4045cf2938ebac4d22cb4c..4a6e6d215c0376c3fa27169429a7caa17610a569 100644 GIT binary patch delta 30 mcmX>pb4!Ma;lxI!!`!_5MXBkjdAbEf`B|ySn-6k#FaZFm^a~9D delta 16 Ycmca5b5e$h;rK?T!`z#%aknr505^UHKmY&$ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 30370bf2b5..2326634dc3 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -56,7 +56,7 @@ public class Blocks{ oreTungsten, //wall ores - wallOreBeryl, graphiticWall, + wallOreBeryl, graphiticWall, wallOreTungsten, //crafting siliconSmelter, siliconCrucible, kiln, graphitePress, plastaniumCompressor, multiPress, phaseWeaver, surgeSmelter, pyratiteMixer, blastMixer, cryofluidMixer, @@ -72,10 +72,15 @@ public class Blocks{ //defense copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, - phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mender, mendProjector, overdriveProjector, overdriveDome, forceProjector, shockMine, - buildTower, + phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, + 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 + //defense - erekir + buildTower, + //TODO name + regenProjector, + //transport conveyor, titaniumConveyor, plastaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, overflowGate, underflowGate, massDriver, @@ -689,6 +694,8 @@ public class Blocks{ variants = 3; }}; + wallOreTungsten = new WallOreBlock(Items.tungsten); + //endregion //region crafting @@ -1011,7 +1018,7 @@ public class Blocks{ }} ); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; outputLiquids = LiquidStack.with(Liquids.ozone, 2f * craftTime / 60, Liquids.hydrogen, 3f * craftTime / 60); liquidOutputDirections = new int[]{1, 3}; }}; @@ -1052,9 +1059,8 @@ public class Blocks{ rotateDraw = false; - //TODO vent? - iconOverride = new String[]{"-bottom", "", "-top1"}; drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidRegion(), new DrawBlock(), new DrawHeatOutput()); + drawer.iconOverride = new String[]{"-bottom", "", "-top1"}; craftTime = 60f * 3f; liquidCapacity = 30f; @@ -1065,7 +1071,7 @@ public class Blocks{ requirements(Category.crafting, with(Items.tungsten, 30, Items.graphite, 30)); drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(Liquids.slag, 9f), new DrawHeatOutput(true)); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; size = 2; craftTime = 60f * 1f; heatOutput = 2f; @@ -1101,7 +1107,7 @@ public class Blocks{ itemCapacity = 20; hasPower = hasItems = true; drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawCrucible(), new DrawBlock(), new DrawHeatInput()); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; ambientSound = Sounds.smelter; ambientSoundVolume = 0.07f; @@ -1134,7 +1140,7 @@ public class Blocks{ } drawer = new DrawMulti(drawers.and(new DrawBlock())); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; craftTime = 60f * 2f; @@ -1172,7 +1178,7 @@ public class Blocks{ new DrawHeatRegion("-vents"){{ color.a = 1f; }}); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; consumes.item(Items.silicon, 3); //TODO must consume from 2 pumps, 1, or 1.5? @@ -1199,7 +1205,7 @@ public class Blocks{ particleSizeInterp = Interp.one; }}, new DrawBlock(), new DrawHeatInput(), new DrawHeatRegion("-heat-top")); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; size = 3; @@ -1240,7 +1246,7 @@ public class Blocks{ }}, new DrawBlock(), new DrawHeatInput(), new DrawHeatRegion("-vents"){{ color = new Color(1f, 0.4f, 0.3f, 1f); }}); - iconOverride = new String[]{"-bottom", "-weave", ""}; + drawer.iconOverride = new String[]{"-bottom", "-weave", ""}; consumes.items(with(Items.thorium, 2, Items.sand, 6)); consumes.liquid(Liquids.ozone, 2f / 60f); @@ -1479,10 +1485,29 @@ public class Blocks{ consumes.power(3f); range = 120f; size = 3; - health = 80; buildSpeed = 1.5f; }}; + //TODO green looks bad switch to orange + regenProjector = new RegenProjector("regen-projector"){{ + requirements(Category.effect, with(Items.silicon, 60, Items.tungsten, 60, Items.oxide, 40)); + size = 3; + consumes.power(1f); + rangeWidth = 4; + rangeLength = 20; + + consumes.liquid(Liquids.hydrogen, 1f / 60f); + + healPercent = 4f / 60f; + + drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(Liquids.hydrogen, 9f / 4f), new DrawSideRegion(true), new DrawGlowRegion(){{ + //color = Color.valueOf("1eff21"); + }}, new DrawGlowRegion(true){{ + suffix = "-side-glow"; + alpha = 1f; + }}); + }}; + //endregion //region distribution @@ -1892,7 +1917,7 @@ public class Blocks{ consumes.liquid(Liquids.water, 0.1f); hasLiquids = true; size = 2; - iconOverride = new String[]{"", "-turbine0", "-turbine1"}; + drawer.iconOverride = new String[]{"", "-turbine0", "-turbine1"}; ambientSound = Sounds.smelter; ambientSoundVolume = 0.06f; @@ -1994,7 +2019,7 @@ public class Blocks{ glowScale = 5f; color = Color.valueOf("c967b099"); }}); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; generateEffect = Fx.none; liquidCapacity = 20f * 5; @@ -2028,7 +2053,7 @@ public class Blocks{ liquidOutput = new LiquidStack(Liquids.water, 5f / 60f); - iconOverride = new String[]{"-bottom", ""}; + drawer.iconOverride = new String[]{"-bottom", ""}; generateEffect = Fx.none; ambientSound = Sounds.smelter; @@ -2785,13 +2810,13 @@ public class Blocks{ trailLength = 10; hitEffect = despawnEffect = Fx.hitBulletColor; }}, - Items.tungsten, new BasicBulletType(6.6f, 46){{ + Items.tungsten, new BasicBulletType(6.6f, 47){{ width = 9f; height = 14f; shootEffect = Fx.tungstenSpark; smokeEffect = Fx.shootBigSmoke; ammoMultiplier = 1; - reloadMultiplier = 1.4f; + reloadMultiplier = 0.7f; pierce = true; pierceBuilding = true; hitColor = backColor = trailColor = Pal.tungstenShot; diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index bb59c62839..37cadd68d8 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -1353,6 +1353,12 @@ public class Fx{ }); }), + regenParticle = new Effect(100f, e -> { + color(Pal.accent); + + Fill.square(e.x, e.y, e.fslope() * 1.5f + 0.14f, 45f); + }), + surgeCruciSmoke = new Effect(160f, e -> { color(Pal.slagOrange); alpha(0.6f); diff --git a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java index 9e31b0f80f..22f1c0cee2 100644 --- a/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/ErekirPlanetGenerator.java @@ -189,6 +189,10 @@ public class ErekirPlanetGenerator extends PlanetGenerator{ }else if(block != Blocks.carbonWall && noise(x + 782, y, 4, 0.8f, 37f, 1f) > 0.68f){ ore = Blocks.wallOreBeryl; } + //TODO generate tungsten, or not? + //else if(block == Blocks.yellowStoneWall && noise(x, y + 942, 4, 0.7f, 38f, 1f) > 0.71f){ + // ore = Blocks.wallOreTungsten; + //} } }else if(!nearWall(x, y)){ diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index 911375fcb1..a42d6cecb9 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -66,10 +66,7 @@ public class MendProjector extends Block{ } public class MendBuild extends Building implements Ranged{ - float heat; - float charge = Mathf.random(reload); - float phaseHeat; - float smoothEfficiency; + public float heat, charge = Mathf.random(reload), phaseHeat, smoothEfficiency; @Override public float range(){ diff --git a/core/src/mindustry/world/blocks/defense/RegenProjector.java b/core/src/mindustry/world/blocks/defense/RegenProjector.java new file mode 100644 index 0000000000..28064eb393 --- /dev/null +++ b/core/src/mindustry/world/blocks/defense/RegenProjector.java @@ -0,0 +1,215 @@ +package mindustry.world.blocks.defense; + +import arc.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.struct.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.draw.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +public class RegenProjector extends Block{ + private static final IntSet taken = new IntSet(); + //map ID to mend amount + private static final IntFloatMap mendMap = new IntFloatMap(); + private static long lastUpdateFrame = -1; + + //cached points per-block for drawing convenience + protected @Nullable Vec2[] drawPoints; + + public int rangeLength = 14, rangeWidth = 5; + //per frame + public float healPercent = 12f / 60f; + + public DrawBlock drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawSideRegion(true)); + + public float effectChance = 0.011f; + public Effect effect = Fx.regenParticle; + + public float beamSpacing = 60f * 7f, beamWidening = 5f, beamLenScl = 1.2f, beamStroke = 2f; + public Interp beamInterp = Interp.pow2Out; + public int beams = 6; + + public RegenProjector(String name){ + super(name); + solid = true; + update = true; + rotate = true; + group = BlockGroup.projectors; + hasPower = true; + hasItems = true; + emitLight = true; + envEnabled |= Env.space; + rotateDraw = false; + } + + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + super.drawPlace(x, y, rotation, valid); + + drawBounds(x * tilesize + offset, y * tilesize + offset, rotation); + } + + public void drawBounds(float x, float y, int rotation){ + if(drawPoints == null){ + drawPoints = new Vec2[]{ + new Vec2(1f, -rangeWidth), + new Vec2(1f + rangeLength, -rangeWidth), + new Vec2(1f + rangeLength, rangeWidth), + new Vec2(1f + 0f, rangeWidth), + }; + for(var v : drawPoints){ + v.scl(tilesize); + } + } + + for(int i = 0; i < 4; i++){ + Tmp.v1.set(drawPoints[i]).rotate(rotation * 90).add(x, y); + Tmp.v2.set(drawPoints[(i + 1) % 4]).rotate(rotation * 90).add(x, y); + + Drawf.dashLine(Pal.accent, Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y); + } + } + + @Override + public void drawRequestRegion(BuildPlan plan, Eachable list){ + drawer.drawPlan(this, plan, list); + } + + @Override + public boolean outputsItems(){ + return false; + } + + @Override + public TextureRegion[] icons(){ + return drawer.finalIcons(this); + } + + @Override + public void load(){ + super.load(); + drawer.load(this); + } + + public class RegenProjectorBuild extends Building{ + public Seq targets = new Seq<>(); + public int lastChange = -2; + public float warmup, totalTime; + + public void updateTargets(){ + targets.clear(); + taken.clear(); + float rot = rotation * 90; + + for(int cy = -rangeWidth; cy <= rangeWidth; cy++){ + for(int cx = 1; cx <= rangeLength + 1; cx++){ + + //TODO handle offset + float wx = x/tilesize + Angles.trnsx(rot, cx, cy), wy = y/tilesize + Angles.trnsy(rot, cx, cy); + + Building build = world.build((int)wx, (int)wy); + + if(build != null && build.team == team && taken.add(build.id)){ + targets.add(build); + } + } + } + } + + @Override + public void updateTile(){ + if(lastChange != world.tileChanges){ + lastChange = world.tileChanges; + updateTargets(); + } + + warmup = Mathf.approachDelta(warmup, consValid() ? 1f : 0f, 1f / 70f); + totalTime += warmup * Time.delta; + + if(consValid()){ + //use Math.max to prevent stacking + for(Building build : targets){ + if(!build.damaged()) continue; + + int pos = build.pos(); + //TODO periodic effect + float value = mendMap.get(pos); + mendMap.put(pos, Math.min(Math.max(value, healPercent * edelta() * build.block.health / 100f), build.block.health - build.health)); + + if(Mathf.chanceDelta(effectChance)){ + effect.at(build.x + Mathf.range(build.block.size * tilesize/2f - 1f), build.y + Mathf.range(build.block.size * tilesize/2f - 1f)); + } + } + } + + if(lastUpdateFrame != Core.graphics.getFrameId()){ + lastUpdateFrame = Core.graphics.getFrameId(); + + for(var entry : mendMap.entries()){ + var build = world.build(entry.key); + if(build != null){ + build.heal(entry.value); + } + } + mendMap.clear(); + } + } + + @Override + public void drawSelect(){ + super.drawSelect(); + drawBounds(x, y, rotation); + } + + @Override + public float warmup(){ + return warmup; + } + + @Override + public float totalProgress(){ + return totalTime; + } + + @Override + public void draw(){ + drawer.drawBase(this); + + for(int i = 0; i < beams; i++){ + float life = beamInterp.apply((totalTime / beamSpacing + i / (float)beams) % 1f); + float len = life * rangeLength*beamLenScl * tilesize + size * tilesize/2f; + float width = Math.min(life * rangeWidth * 2f * tilesize * beamWidening, rangeWidth * 2f * tilesize); + float stroke = (0.5f + beamStroke * life) * warmup; + Draw.z(Layer.effect); + + Lines.stroke(stroke, Pal.accent); + Draw.alpha(1f - Mathf.curve(life, 0.5f)); + Lines.lineAngleCenter( + x + Angles.trnsx(rotdeg(), len), + y + Angles.trnsy(rotdeg(), len), + rotdeg() + 90f, + width + ); + + Draw.reset(); + } + + } + + @Override + public void drawLight(){ + super.drawLight(); + drawer.drawLights(this); + } + } +} diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 3e152ccd6d..0db60ba4ef 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -148,7 +148,7 @@ public class Turret extends ReloadTurret{ @Override public TextureRegion[] icons(){ - return draw.icons(this); + return draw.finalIcons(this); } @Override diff --git a/core/src/mindustry/world/blocks/power/PowerGenerator.java b/core/src/mindustry/world/blocks/power/PowerGenerator.java index 0926d0edc7..41127d3742 100644 --- a/core/src/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/mindustry/world/blocks/power/PowerGenerator.java @@ -18,7 +18,6 @@ public class PowerGenerator extends PowerDistributor{ public float powerProduction; public Stat generationType = Stat.basePowerGeneration; public DrawBlock drawer = new DrawBlock(); - public @Nullable String[] iconOverride; public PowerGenerator(String name){ super(name); @@ -29,14 +28,7 @@ public class PowerGenerator extends PowerDistributor{ @Override public TextureRegion[] icons(){ - if(iconOverride != null){ - var out = new TextureRegion[iconOverride.length]; - for(int i = 0; i < out.length; i++){ - out[i] = Core.atlas.find(name + iconOverride[i]); - } - return out; - } - return drawer.icons(this); + return drawer.finalIcons(this); } @Override diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index a04f04cd98..91599aa142 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.production; -import arc.*; import arc.graphics.g2d.*; import arc.math.*; import arc.struct.*; @@ -40,8 +39,6 @@ public class GenericCrafter extends Block{ public boolean legacyReadWarmup = false; public DrawBlock drawer = new DrawBlock(); - /** If set, the icon is overridden to be these strings, in order. Each string is a suffix. */ - public @Nullable String[] iconOverride = null; public GenericCrafter(String name){ super(name); @@ -129,14 +126,7 @@ public class GenericCrafter extends Block{ @Override public TextureRegion[] icons(){ - if(iconOverride != null){ - var out = new TextureRegion[iconOverride.length]; - for(int i = 0; i < out.length; i++){ - out[i] = Core.atlas.find(name + iconOverride[i]); - } - return out; - } - return drawer.icons(this); + return drawer.finalIcons(this); } @Override diff --git a/core/src/mindustry/world/blocks/production/Pump.java b/core/src/mindustry/world/blocks/production/Pump.java index 6477714679..fd3a6224cf 100644 --- a/core/src/mindustry/world/blocks/production/Pump.java +++ b/core/src/mindustry/world/blocks/production/Pump.java @@ -73,7 +73,7 @@ public class Pump extends LiquidBlock{ @Override public TextureRegion[] icons(){ - return draw.icons(this); + return draw.finalIcons(this); } @Override diff --git a/core/src/mindustry/world/draw/DrawBlock.java b/core/src/mindustry/world/draw/DrawBlock.java index c500c3a309..987e05c4a5 100644 --- a/core/src/mindustry/world/draw/DrawBlock.java +++ b/core/src/mindustry/world/draw/DrawBlock.java @@ -1,5 +1,6 @@ package mindustry.world.draw; +import arc.*; import arc.graphics.g2d.*; import arc.math.*; import arc.struct.*; @@ -15,6 +16,9 @@ import mindustry.world.blocks.production.GenericCrafter.*; public class DrawBlock{ protected static final Rand rand = new Rand(); + /** If set, the icon is overridden to be these strings, in order. Each string is a suffix. */ + public @Nullable String[] iconOverride = null; + /** @deprecated no longer called! not specific to generic crafters! */ @Deprecated public void draw(GenericCrafterBuild build){} @@ -52,6 +56,17 @@ public class DrawBlock{ return new TextureRegion[]{block.region}; } + public final TextureRegion[] finalIcons(Block block){ + if(iconOverride != null){ + var out = new TextureRegion[iconOverride.length]; + for(int i = 0; i < out.length; i++){ + out[i] = Core.atlas.find(block.name + iconOverride[i]); + } + return out; + } + return icons(block); + } + public GenericCrafter expectCrafter(Block block){ if(!(block instanceof GenericCrafter crafter)) throw new ClassCastException("This drawer requires the block to be a GenericCrafter. Use a different drawer."); return crafter; diff --git a/core/src/mindustry/world/draw/DrawGlowRegion.java b/core/src/mindustry/world/draw/DrawGlowRegion.java index dd60d48cab..3bcf71cf02 100644 --- a/core/src/mindustry/world/draw/DrawGlowRegion.java +++ b/core/src/mindustry/world/draw/DrawGlowRegion.java @@ -17,6 +17,7 @@ public class DrawGlowRegion extends DrawBlock{ public float alpha = 0.9f, glowScale = 10f, glowIntensity = 0.5f; public float rotateSpeed = 0f; public float layer = Layer.blockAdditive; + public boolean rotate = false; public Color color = Color.red.cpy(); public TextureRegion region; @@ -27,6 +28,10 @@ public class DrawGlowRegion extends DrawBlock{ this.layer = layer; } + public DrawGlowRegion(boolean rotate){ + this.rotate = rotate; + } + @Override public void drawBase(Building build){ if(build.warmup() <= 0.001f) return; @@ -36,7 +41,7 @@ public class DrawGlowRegion extends DrawBlock{ Draw.blend(blending); Draw.color(color); Draw.alpha((Mathf.absin(build.totalProgress(), glowScale, alpha) * glowIntensity + 1f - glowIntensity) * build.warmup() * alpha); - Draw.rect(region, build.x, build.y, build.totalProgress() * rotateSpeed); + Draw.rect(region, build.x, build.y, build.totalProgress() * rotateSpeed + (rotate ? build.rotdeg() : 0f)); Draw.reset(); Draw.blend(); Draw.z(z); diff --git a/core/src/mindustry/world/draw/DrawSideRegion.java b/core/src/mindustry/world/draw/DrawSideRegion.java new file mode 100644 index 0000000000..c3ba1fc2f9 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawSideRegion.java @@ -0,0 +1,45 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.g2d.*; +import arc.util.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.world.*; + +public class DrawSideRegion extends DrawBlock{ + public boolean drawRegion = false; + public TextureRegion top1, top2; + + public DrawSideRegion(){ + } + + public DrawSideRegion(boolean drawRegion){ + this.drawRegion = drawRegion; + } + + @Override + public void drawBase(Building build){ + if(drawRegion) Draw.rect(build.block.region, build.x, build.y); + + Draw.rect(build.rotation > 1 ? top2 : top1, build.x, build.y, build.rotdeg()); + } + + @Override + public void drawPlan(Block block, BuildPlan plan, Eachable list){ + if(drawRegion) Draw.rect(block.region, plan.drawx(), plan.drawy()); + Draw.rect(plan.rotation > 1 ? top2 : top1, plan.drawx(), plan.drawy(), plan.rotation * 90); + } + + @Override + public void load(Block block){ + top1 = Core.atlas.find(block.name + "-top1"); + top2 = Core.atlas.find(block.name + "-top2"); + } + + @Override + public TextureRegion[] icons(Block block){ + return new TextureRegion[]{block.region, top1}; + } + +} diff --git a/tools/build.gradle b/tools/build.gradle index 623a471f97..b9713feb8f 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -48,7 +48,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"], ["d57c65", "e3ae6f", "f7e97e"], ["ffffff", "dcc6c6", "9d7f7f"], ["df7646", "b23a4d", "752249"], ["3c3837", "515151", "646567"], - ["5757c1", "6f80e8", "88a4ff"], ["8f665b", "b28768", "c9a58f"], ["4c5878", "768a9a", "a0b0c8"]]) + ["5757c1", "6f80e8", "88a4ff"], ["8f665b", "b28768", "c9a58f"], ["4c5878", "768a9a", "a0b0c8"], ["62ae7f", "62ae7f", "84f491"]]) def antialias = { File file -> if(!doAntialias) return