diff --git a/core/assets-raw/sprites/blocks/defense/shield-projector-team.png b/core/assets-raw/sprites/blocks/defense/shield-projector-team.png new file mode 100644 index 0000000000..4eba1ac6a8 Binary files /dev/null and b/core/assets-raw/sprites/blocks/defense/shield-projector-team.png differ diff --git a/core/assets-raw/sprites/blocks/defense/shield-projector.png b/core/assets-raw/sprites/blocks/defense/shield-projector.png new file mode 100644 index 0000000000..281848306e Binary files /dev/null and b/core/assets-raw/sprites/blocks/defense/shield-projector.png differ diff --git a/core/assets-raw/sprites/units/emanate-cell.png b/core/assets-raw/sprites/units/emanate-cell.png deleted file mode 100644 index 77e5a9aaf3..0000000000 Binary files a/core/assets-raw/sprites/units/emanate-cell.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/emanate.png b/core/assets-raw/sprites/units/emanate.png deleted file mode 100644 index f297430956..0000000000 Binary files a/core/assets-raw/sprites/units/emanate.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/incite-cell.png b/core/assets-raw/sprites/units/incite-cell.png index 2eecb72f3f..5fecb45a29 100644 Binary files a/core/assets-raw/sprites/units/incite-cell.png and b/core/assets-raw/sprites/units/incite-cell.png differ diff --git a/core/assets-raw/sprites/units/incite.png b/core/assets-raw/sprites/units/incite.png index 0f25f7c0ac..a316eb6ebb 100644 Binary files a/core/assets-raw/sprites/units/incite.png and b/core/assets-raw/sprites/units/incite.png differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 428c2d0282..9a502464fd 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -526,3 +526,4 @@ 63177=yellow-stone-vent|block-yellow-stone-vent-ui 63176=red-stone-vent|block-red-stone-vent-ui 63175=carbon-vent|block-carbon-vent-ui +63174=shield-projector|block-shield-projector-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index d6b1e06210..11dead3947 100644 Binary files a/core/assets/logicids.dat and b/core/assets/logicids.dat differ diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index cb2c156bb5..4a17a56111 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -65,8 +65,6 @@ public class Vars implements Loadable{ public static final String ghApi = "https://api.github.com"; /** URL for discord invite. */ public static final String discordURL = "https://discord.gg/mindustry"; - /** URL for sending crash reports to. Currently offline. */ - public static final String crashReportURL = "http://192.99.169.18/report"; /** URL the links to the wiki's modding guide.*/ public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-modding/"; /** URL to the JSON file containing all the BE servers. Only queried in BE. */ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 6b78f3967d..3b451bd039 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -86,6 +86,8 @@ public class Blocks{ //defense - erekir buildTower, regenProjector, barrierProjector, + //campaign only + shieldProjector, //transport conveyor, titaniumConveyor, plastaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, @@ -1713,8 +1715,9 @@ public class Blocks{ }}); }}; + //TODO implement + if(false) barrierProjector = new DirectionalForceProjector("barrier-projector"){{ - //TODO requirements(Category.effect, with(Items.surgeAlloy, 100, Items.silicon, 125)); size = 3; width = 50f; @@ -1726,6 +1729,16 @@ public class Blocks{ consumes.power(4f); }}; + //TODO 5x5?? + shieldProjector = new BaseShield("shield-projector"){{ + category = Category.effect; + buildVisibility = BuildVisibility.editorOnly; + + size = 3; + + consumes.power(5f); + }}; + //endregion //region distribution @@ -2231,7 +2244,7 @@ public class Blocks{ //TODO rename chemicalCombustionChamber = new ConsumeGenerator("chemical-combustion-chamber"){{ requirements(Category.power, with(Items.graphite, 40, Items.tungsten, 40, Items.oxide, 40f, Items.silicon, 30)); - powerProduction = 8f; + powerProduction = 9f; consumes.liquids(LiquidStack.with(Liquids.ozone, 1f / 60f, Liquids.arkycite, 20f / 60f)); size = 3; drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawPistons(){{ @@ -2255,7 +2268,7 @@ public class Blocks{ pyrolysisGenerator = new ConsumeGenerator("pyrolysis-generator"){{ //TODO requirements requirements(Category.power, with(Items.graphite, 50, Items.carbide, 50, Items.oxide, 60f, Items.silicon, 50)); - powerProduction = 16f; + powerProduction = 18f; drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawPistons(){{ sinMag = 2.75f; diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 89e15a6516..114d186911 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -1553,6 +1553,15 @@ public class Fx{ } }), + circleColorSpark = new Effect(21f, e -> { + color(Color.white, e.color, e.fin()); + stroke(e.fout() * 1.1f + 0.5f); + + randLenVectors(e.id, 9, 27f * e.fin(), 9f, (x, y) -> { + lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 5f + 0.5f); + }); + }), + colorSpark = new Effect(21f, e -> { color(Color.white, e.color, e.fin()); stroke(e.fout() * 1.1f + 0.5f); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 017120a74a..0880c08a26 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -3185,54 +3185,51 @@ public class UnitTypes{ envDisabled = 0; lowAltitude = false; - flying = true; mineWalls = true; - targetAir = false; mineFloor = false; mineHardnessScaling = false; - mineSpeed = 5f; + flying = true; + mineSpeed = 4f; mineTier = 4; - buildSpeed = 1.4f; - drag = 0.06f; - speed = 2.8f; - rotateSpeed = 5f; - accel = 0.11f; + buildSpeed = 1.1f; + drag = 0.08f; + speed = 6.5f; + rotateSpeed = 8f; + accel = 0.09f; itemCapacity = 90; - health = 600f; + health = 500f; armor = 2f; - hitSize = 18f; - buildBeamOffset = 10f; - engineSize = 0; - payloadCapacity = Mathf.sqr(2f) * tilePayload; + hitSize = 11f; + + engineOffset = 15 / 4f; + engineSize = 4; setEnginesMirror( - new UnitEngine(34 / 4f, 31 / 4f, 3f, 45f), - new UnitEngine(35 / 4f, -38 / 4f, 3f, 315f) + new UnitEngine(23 / 4f, 4 / 4f, 2.4f, 315f) ); - weapons.add(new Weapon("incite-weapon"){{ - reload = 30f; - x = 4f; - y = 6.25f; - shootY = 5.75f; - recoil = 2f; - top = false; - layerOffset = -0.01f; + weapons.add(new RepairBeamWeapon(){{ + reload = 25f; + x = 0f; + y = 6.5f; rotate = false; + shootY = 0f; + beamWidth = 0.7f; + repairSpeed = 0.3f; + aimDst = 0f; + shootCone = 15f; + fractionRepair = true; + mirror = false; - bullet = new BasicBulletType(5f, 15){{ - width = 7f; - height = 12f; - shootEffect = Fx.sparkShoot; - smokeEffect = Fx.shootBigSmoke; - pierceCap = 2; - pierce = true; - pierceBuilding = true; - hitColor = backColor = trailColor = Pal.bulletYellowBack; - frontColor = Color.white; - trailWidth = 1.5f; - trailLength = 7; - hitEffect = despawnEffect = Fx.hitBulletColor; + targetUnits = false; + targetBuildings = true; + autoTarget = false; + controllable = true; + laserColor = Pal.accent; + healColor = Pal.accent; + + bullet = new BulletType(){{ + maxRange = 60f; }}; }}); }}; diff --git a/core/src/mindustry/maps/generators/BaseGenerator.java b/core/src/mindustry/maps/generators/BaseGenerator.java index 6bc9f78315..3d2cf1554d 100644 --- a/core/src/mindustry/maps/generators/BaseGenerator.java +++ b/core/src/mindustry/maps/generators/BaseGenerator.java @@ -30,7 +30,10 @@ public class BaseGenerator{ private Seq cores; public static Block getDifficultyWall(int size, float difficulty){ - Seq wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == size && !b.insulated && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); + Seq wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == size + && !b.insulated && b.buildVisibility == BuildVisibility.shown + && !(b instanceof Door) + && !(Structs.contains(b.requirements, i -> state.rules.hiddenBuildItems.contains(i.item)))); wallsSmall.sort(b -> b.buildCost); return wallsSmall.getFrac(difficulty * 0.91f); } diff --git a/core/src/mindustry/world/blocks/defense/BaseShield.java b/core/src/mindustry/world/blocks/defense/BaseShield.java index 3cb7a9e10b..7c9305efbe 100644 --- a/core/src/mindustry/world/blocks/defense/BaseShield.java +++ b/core/src/mindustry/world/blocks/defense/BaseShield.java @@ -5,7 +5,7 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.util.*; -import mindustry.*; +import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -15,7 +15,7 @@ import static mindustry.Vars.*; public class BaseShield extends Block{ //TODO game rule? or field? should vary by base. - //public float radius = 400f; + public float radius = 200f; protected static BaseShieldBuild paramBuild; //protected static Effect paramEffect; @@ -35,20 +35,41 @@ public class BaseShield extends Block{ float overlapDst = (unit.hitSize/2f + paramBuild.radius()) - unit.dst(paramBuild); if(overlapDst > 0){ - if(overlapDst > unit.hitSize){ + if(overlapDst > unit.hitSize * 1.5f){ //instakill units that are stuck inside the shield (TODO or maybe damage them instead?) unit.kill(); }else{ - unit.move(Tmp.v1.set(unit).sub(paramBuild).setLength(overlapDst)); + //stop + unit.vel.setZero(); + //get out + unit.move(Tmp.v1.set(unit).sub(paramBuild).setLength(overlapDst + 0.01f)); + + if(Mathf.chanceDelta(0.12f * Time.delta)){ + Fx.circleColorSpark.at(unit.x, unit.y, paramBuild.team.color); + } } } }; - public BaseShield(String name){ super(name); hasPower = true; + update = solid = true; + } + + @Override + public void init(){ + super.init(); + + clipSize = Math.max(clipSize, radius * 2f + 8f); + } + + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + super.drawPlace(x, y, rotation, valid); + + Drawf.dashCircle(x * tilesize + offset, y * tilesize + offset, radius, player.team().color); } public class BaseShieldBuild extends Building{ @@ -60,17 +81,26 @@ public class BaseShield extends Block{ //TODO smooth radius float radius = radius(); + broken = efficiency() <= 0.0001f; + if(radius > 0 && !broken){ paramBuild = this; //paramEffect = absorbEffect; Groups.bullet.intersect(x - radius, y - radius, radius * 2f, radius * 2f, bulletConsumer); - Units.nearbyEnemies(team,x ,y, radius, unitConsumer); + Units.nearbyEnemies(team, x, y, radius + 10f, unitConsumer); } } public float radius(){ //TODO bad rule? - return Vars.state.rules.enemyCoreBuildRadius; + return radius * efficiency(); + } + + @Override + public void drawSelect(){ + super.drawSelect(); + + Drawf.dashCircle(x, y, radius, team.color); } @Override diff --git a/core/src/mindustry/world/blocks/units/UnitAssembler.java b/core/src/mindustry/world/blocks/units/UnitAssembler.java index 45b9cc969e..6fa832defe 100644 --- a/core/src/mindustry/world/blocks/units/UnitAssembler.java +++ b/core/src/mindustry/world/blocks/units/UnitAssembler.java @@ -446,7 +446,6 @@ public class UnitAssembler extends PayloadBlock{ public boolean checkSolid(Vec2 v, boolean same){ var output = unit(); - //TODO CHECK TO MAKE SURE IT'S NOT THE SAME UNIT float hsize = output.hitSize * 1.4f; return !output.flying && (collisions.overlapsTile(Tmp.r1.setCentered(v.x, v.y, output.hitSize), EntityCollisions::solid) || (!same ? Units.anyEntities(v.x, v.y, hsize) : Units.anyEntities(v.x - hsize/2f, v.y - hsize/2f, hsize, hsize, u -> u.type != output && u.isGrounded()))); diff --git a/gradle.properties b/gradle.properties index 000aab66df..ff0b6edf62 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,4 +24,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 -archash=31e09b436b +archash=3ad7f0345b