diff --git a/core/assets-raw/sprites/units/krepost-foot__.png b/core/assets-raw/sprites/units/krepost-foot__.png deleted file mode 100644 index f035f791d4..0000000000 Binary files a/core/assets-raw/sprites/units/krepost-foot__.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/krepost-joint-base.png b/core/assets-raw/sprites/units/krepost-joint-base.png new file mode 100644 index 0000000000..3e6bf26d16 Binary files /dev/null and b/core/assets-raw/sprites/units/krepost-joint-base.png differ diff --git a/core/assets-raw/sprites/units/krepost-leg-base.png b/core/assets-raw/sprites/units/krepost-leg-base.png index 9915e77d4b..841e11dab3 100644 Binary files a/core/assets-raw/sprites/units/krepost-leg-base.png and b/core/assets-raw/sprites/units/krepost-leg-base.png differ diff --git a/core/assets-raw/sprites/units/krepost-leg.png b/core/assets-raw/sprites/units/krepost-leg.png index fc8fba6a7f..ff3330fe9a 100644 Binary files a/core/assets-raw/sprites/units/krepost-leg.png and b/core/assets-raw/sprites/units/krepost-leg.png differ diff --git a/core/assets-raw/sprites/units/krepost.png b/core/assets-raw/sprites/units/krepost.png index bb37e06850..256e519e67 100644 Binary files a/core/assets-raw/sprites/units/krepost.png and b/core/assets-raw/sprites/units/krepost.png differ diff --git a/core/assets-raw/sprites/units/conquer-weapon.png b/core/assets-raw/sprites/units/weapons/conquer-weapon.png similarity index 100% rename from core/assets-raw/sprites/units/conquer-weapon.png rename to core/assets-raw/sprites/units/weapons/conquer-weapon.png diff --git a/core/assets-raw/sprites/units/weapons/krepost-weapon-heat.png b/core/assets-raw/sprites/units/weapons/krepost-weapon-heat.png new file mode 100644 index 0000000000..d1e9610ddf Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/krepost-weapon-heat.png differ diff --git a/core/assets-raw/sprites/units/weapons/krepost-weapon.png b/core/assets-raw/sprites/units/weapons/krepost-weapon.png new file mode 100644 index 0000000000..5280af8607 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/krepost-weapon.png differ diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 492e48260d..44dd400346 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -1463,6 +1463,17 @@ public class Fx{ }); }), + shootSmokeTris = new Effect(30f, e -> { + color(Color.white, e.color, e.fin()); + + rand.setSeed(e.id); + for(int i = 0; i < 10; i++){ + float rot = e.rotation + rand.range(22f); + v.trns(rot, rand.random(e.finpow() * 24f)); + Fill.poly(e.x + v.x, e.y + v.y, 4, e.fout() * 3.8f + 0.2f, rand.random(360f)); + } + }), + shootSmokeTitan = new Effect(70f, e -> { rand.setSeed(e.id); for(int i = 0; i < 13; i++){ diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 72db812aaf..d9c6c431b3 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -2556,7 +2556,7 @@ public class UnitTypes{ bulwark = new UnitType("bulwark"){{ drag = 0.1f; speed = 0.62f; - hitSize = 19f; + hitSize = 23f; health = 7300; armor = 5f; outlineColor = Pal.darkOutline; @@ -2625,7 +2625,7 @@ public class UnitTypes{ hitSound = Sounds.none; width = height = 10f; - lightColor = trailColor = backColor = Color.valueOf("8ca9e8"); + lightColor = trailColor = backColor = Pal.techBlue; lightRadius = 40f; lightOpacity = 0.7f; @@ -2653,24 +2653,25 @@ public class UnitTypes{ krepost = new UnitType("krepost"){{ drag = 0.1f; speed = 1f; - hitSize = 19f; - health = 7300; - armor = 5f; + hitSize = 44f; + health = 18000; + armor = 8f; outlineColor = Pal.darkOutline; envDisabled = Env.space; - rotateSpeed = 1.8f; + rotateSpeed = 1.6f; lockLegBase = true; - legStraightness = 1f; - baseLegStraightness = 0.6f; + legContinuousMove = true; + legStraightness = 0.6f; + baseLegStraightness = 0.5f; legCount = 8; legLength = 30f; - legTrns = 2f; + legTrns = 2.1f; legMoveSpace = 1.05f; rippleScale = 1.2f; landShake = 0.5f; legGroupSize = 2; - legExtension = -5f; + legExtension = -6f; legBaseOffset = 19f; legStraightLength = 0.9f; maxStretch = 1.2f; @@ -2684,6 +2685,65 @@ public class UnitTypes{ hovering = true; visualElevation = 0.4f; groundLayer = Layer.legUnit; + + weapons.add(new Weapon("krepost-weapon"){{ + mirror = true; + rotationLimit = 30f; + rotateSpeed = 0.4f; + rotate = true; + + x = 43/4f; + y = -20f / 4f; + shootY = 39 / 4f; + shootX = -5f / 4f; + recoil = 3f; + reload = 30f; + shake = 3f; + cooldownTime = 20f; + + shots = 3; + shotDelay = 3f; + inaccuracy = 2f; + velocityRnd = 0.1f; + heatColor = Color.red; + + bullet = new BasicBulletType(9f, 75){{ + pierceCap = 2; + pierceBuilding = true; + + lifetime = 30f; + shootEffect = Fx.shootBigColor; + smokeEffect = Fx.shootSmokeTris; + frontColor = Color.white; + hitSound = Sounds.none; + width = 12f; + height = 20f; + + lightColor = trailColor = hitColor = backColor = Pal.techBlue; + lightRadius = 40f; + lightOpacity = 0.7f; + + trailWidth = 2.2f; + trailLength = 8; + trailChance = -1f; + + despawnEffect = Fx.none; + + //TODO diff effect + hitEffect = despawnEffect = new ExplosionEffect(){{ + lifetime = 30f; + waveStroke = 2f; + waveColor = sparkColor = trailColor; + waveRad = 5f; + smokeSize = 0f; + smokeSizeBase = 0f; + sparks = 5; + sparkRad = 20f; + sparkLen = 6f; + sparkStroke = 2f; + }}; + }}; + }}); }}; //endregion diff --git a/core/src/mindustry/entities/comp/LegsComp.java b/core/src/mindustry/entities/comp/LegsComp.java index a5512a19fb..89d88e8710 100644 --- a/core/src/mindustry/entities/comp/LegsComp.java +++ b/core/src/mindustry/entities/comp/LegsComp.java @@ -62,18 +62,18 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ } public void resetLegs(float legLength){ - float rot = baseRotation; int count = type.legCount; this.legs = new Leg[count]; - float spacing = 360f / count; - for(int i = 0; i < legs.length; i++){ Leg l = new Leg(); - l.joint.trns(i * spacing + rot, legLength/2f + type.legBaseOffset).add(x, y); - l.base.trns(i * spacing + rot, legLength + type.legBaseOffset).add(x, y); + float dstRot = legAngle(i) + (type.lockLegBase ? rotation - baseRotation : baseRotation); + Vec2 baseOffset = legOffset(Tmp.v5, i).add(x, y); + + l.joint.trns(dstRot, legLength/2f).add(baseOffset); + l.base.trns(dstRot, legLength).add(baseOffset); legs[i] = l; } @@ -100,13 +100,14 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ float moveSpeed = type.legSpeed; int div = Math.max(legs.length / type.legGroupSize, 2); moveSpace = legLength / 1.6f / (div / 2f) * type.legMoveSpace; - totalLength += Mathf.dst(deltaX(), deltaY()); + //TODO should move legs even when still, based on speed. also, to prevent "slipping", make sure legs move when they are too far from their destination + totalLength += type.legContinuousMove ? type.speed : Mathf.dst(deltaX(), deltaY()); float trns = moveSpace * 0.85f * type.legTrns; //rotation + offset vector - Vec2 moveOffset = Tmp.v4.trns(rot, trns); boolean moving = moving(); + Vec2 moveOffset = !moving ? Tmp.v4.setZero() : Tmp.v4.trns(Angles.angle(deltaX(), deltaY()), trns); lastDeepFloor = null; int deeps = 0; @@ -116,6 +117,7 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ Vec2 baseOffset = legOffset(Tmp.v5, i).add(x, y); Leg l = legs[i]; + //TODO is limiting twice necessary? l.joint.sub(baseOffset).limit(type.maxStretch * legLength/2f).add(baseOffset); l.base.sub(baseOffset).limit(type.maxStretch * legLength).add(baseOffset); @@ -141,7 +143,7 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ if(l.group != group){ //create effect when transitioning to a group it can't move in - if(!move && i % div == l.group){ + if(!move && (moving || !type.legContinuousMove) && i % div == l.group){ if(floor.isLiquid){ floor.walkEffect.at(l.base.x, l.base.y, type.rippleScale, floor.mapColor); floor.walkSound.at(x, y, 1f, floor.walkSoundVolume); @@ -179,6 +181,10 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ } l.joint.lerpDelta(jointDest, moveSpeed / 4f); + + //limit again after updating + l.joint.sub(baseOffset).limit(type.maxStretch * legLength/2f).add(baseOffset); + l.base.sub(baseOffset).limit(type.maxStretch * legLength).add(baseOffset); } //when at least 1 leg is touching land, it can't drown diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index b9de129252..6589f8d6e9 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -57,6 +57,10 @@ public class OverlayRenderer{ } } + if(pos.isEmpty()){ + return; + } + //if this is laggy, it could be shoved in another thread. var result = Voronoi.generate(pos.toArray(Vec2.class), 0, world.unitWidth(), 0, world.unitHeight()); for(var edge : result){ diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index 0d72059161..0915b08c4b 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -127,6 +127,7 @@ public class Pal{ redLight = Color.valueOf("feb380"), slagOrange = Color.valueOf("ffa166"), + techBlue = Color.valueOf("8ca9e8"), vent = Color.valueOf("6b4e4e"); } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 7c738f3b8e..fde9584440 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -113,7 +113,7 @@ public class UnitType extends UnlockableContent{ public float legSplashDamage = 0f, legSplashRange = 5; public float legStraightLength = 1f; /** If true, legs are locked to the base of the unit instead of being on an implicit rotating "mount". */ - public boolean lockLegBase = false; + public boolean lockLegBase = false, legContinuousMove; public float baseLegStraightness, legStraightness; /** TODO neither of these appear to do much */ public boolean flipBackLegs = true, flipLegSide = false; @@ -1043,7 +1043,6 @@ public class UnitType extends UnlockableContent{ for(int j = legs.length - 1; j >= 0; j--){ int i = (j % 2 == 0 ? j/2 : legs.length - 1 - j/2); Leg leg = legs[i]; - float angle = unit.legAngle(i); boolean flip = i >= legs.length/2f; int flips = Mathf.sign(flip); @@ -1074,8 +1073,13 @@ public class UnitType extends UnlockableContent{ if(jointRegion.found()){ Draw.rect(jointRegion, leg.joint.x, leg.joint.y); } + } - if(baseJointRegion.found()){ + //base joints are drawn after everything else + if(baseJointRegion.found()){ + for(int j = legs.length - 1; j >= 0; j--){ + //TODO does the index / draw order really matter? + Vec2 position = unit.legOffset(legOffset, (j % 2 == 0 ? j/2 : legs.length - 1 - j/2)).add(unit); Draw.rect(baseJointRegion, position.x, position.y, rotation); } } diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index aa3d63e446..655482523a 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -414,8 +414,8 @@ public class Weapon implements Cloneable{ } protected @Nullable Bullet bullet(Unit unit, float shootX, float shootY, float angle, float lifescl){ - float xr = Mathf.range(xRand); float + xr = Mathf.range(xRand), x = shootX + Angles.trnsx(angle, 0, xr), y = shootY + Angles.trnsy(angle, 0, xr); diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 13af141ecc..b9ff82feb0 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -11,6 +11,7 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; +import mindustry.content.*; import mindustry.core.*; import mindustry.entities.*; import mindustry.entities.units.*; @@ -484,7 +485,7 @@ public class PlacementFragment extends Fragment{ } //if the tile has a drop, display the drop - if(hoverTile.drop() != null || hoverTile.wallDrop() != null || hoverTile.floor().liquidDrop != null){ + if((hoverTile.drop() != null && hoverTile.block() == Blocks.air) || hoverTile.wallDrop() != null || hoverTile.floor().liquidDrop != null){ return hoverTile; } } diff --git a/gradle.properties b/gradle.properties index 5df4495ded..be0907b8dd 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=16d2626649 +archash=ed731441e1