diff --git a/core/assets-raw/sprites/units/conquer-cell.png b/core/assets-raw/sprites/units/conquer-cell.png new file mode 100644 index 0000000000..b42c07d4df Binary files /dev/null and b/core/assets-raw/sprites/units/conquer-cell.png differ diff --git a/core/assets-raw/sprites/units/conquer-glow.png b/core/assets-raw/sprites/units/conquer-glow.png new file mode 100644 index 0000000000..294453e5dd Binary files /dev/null and b/core/assets-raw/sprites/units/conquer-glow.png differ diff --git a/core/assets-raw/sprites/units/conquer-test1.png b/core/assets-raw/sprites/units/conquer-test1.png new file mode 100644 index 0000000000..544bfc7456 Binary files /dev/null and b/core/assets-raw/sprites/units/conquer-test1.png differ diff --git a/core/assets-raw/sprites/units/conquer-treads.png b/core/assets-raw/sprites/units/conquer-treads.png new file mode 100644 index 0000000000..e265316c06 Binary files /dev/null and b/core/assets-raw/sprites/units/conquer-treads.png differ diff --git a/core/assets-raw/sprites/units/conquer.aseprite b/core/assets-raw/sprites/units/conquer.aseprite index 4387c51df7..f15725ad95 100644 Binary files a/core/assets-raw/sprites/units/conquer.aseprite and b/core/assets-raw/sprites/units/conquer.aseprite differ diff --git a/core/assets-raw/sprites/units/conquer.png b/core/assets-raw/sprites/units/conquer.png index 08e6169584..4561798974 100644 Binary files a/core/assets-raw/sprites/units/conquer.png and b/core/assets-raw/sprites/units/conquer.png differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 71b7f7ee54..c4469beb0b 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -517,3 +517,4 @@ 63186=red-stone-boulder|block-red-stone-boulder-ui 63185=red-diamond-wall|block-red-diamond-wall-ui 63184=crystal-orbs|block-crystal-orbs-ui +63183=conquer|unit-conquer-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index 673775f2dc..ca952ad4a2 100644 Binary files a/core/assets/logicids.dat and b/core/assets/logicids.dat differ diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 99befc6099..fd0ea4072d 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -11,6 +11,7 @@ import mindustry.entities.*; import mindustry.entities.abilities.*; import mindustry.entities.bullet.*; import mindustry.entities.effect.*; +import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; @@ -72,7 +73,7 @@ public class UnitTypes{ public static @EntityDef({Unitc.class, BuildingTetherc.class, Payloadc.class}) UnitType manifold, assemblyDrone; //tank - public static @EntityDef({Unitc.class, Tankc.class}) UnitType vanquish; + public static @EntityDef({Unitc.class, Tankc.class}) UnitType vanquish, conquer; //endregion @@ -2436,7 +2437,7 @@ public class UnitTypes{ health = 9000; armor = 20f; areaDamage = 12f; - treadRect = new Rect(22f, 16f, 28f, 130f); + treadRects = new Rect[]{new Rect(22, 16, 28, 130)}; weapons.add(new Weapon("vanquish-weapon"){{ layerOffset = 0.0001f; @@ -2499,6 +2500,20 @@ public class UnitTypes{ } }}; + conquer = new TankUnitType("conquer"){{ + hitSize = 44f; + treadPullOffset = 1; + speed = 0.48f; + health = 20000; + armor = 25f; + areaDamage = 22f; + rotateSpeed = 0.9f; + treadRects = new Rect[]{new Rect(27, 152, 56, 73), new Rect(24, 51, 29, 17), new Rect(59, 18, 39, 19)}; + decals.add(new UnitDecal("conquer-glow", 0, 0, 0, -1, Pal.turretHeat.cpy()){{ + blending = Blending.additive; + }}); + }}; + //endregion //region erekir - mech diff --git a/core/src/mindustry/entities/comp/TankComp.java b/core/src/mindustry/entities/comp/TankComp.java index 4c6c0f25da..b28b9ffca6 100644 --- a/core/src/mindustry/entities/comp/TankComp.java +++ b/core/src/mindustry/entities/comp/TankComp.java @@ -32,9 +32,10 @@ abstract class TankComp implements Posc, Flyingc, Hitboxc, Unitc, ElevationMovec //dust if(walked && !headless){ treadEffectTime += Time.delta; - if(treadEffectTime >= 6f){ + if(treadEffectTime >= 6f && type.treadRects.length > 0){ var treadRegion = type.treadRegion; - var treadRect = type.treadRect; + //first rect should always be at the back + var treadRect = type.treadRects[0]; float xOffset = (treadRegion.width/2f - (treadRect.x + treadRect.width/2f)) / 4f; float yOffset = (treadRegion.height/2f - (treadRect.y + treadRect.height/2f)) / 4f; diff --git a/core/src/mindustry/entities/units/UnitDecal.java b/core/src/mindustry/entities/units/UnitDecal.java index 62a12e3c29..bd0b3c72ae 100644 --- a/core/src/mindustry/entities/units/UnitDecal.java +++ b/core/src/mindustry/entities/units/UnitDecal.java @@ -9,6 +9,7 @@ public class UnitDecal{ public float x, y, rotation; public float layer = Layer.flyingUnit + 1f; public float xScale = 1f, yScale = 1f; + public Blending blending = Blending.normal; public Color color = Color.white; public UnitDecal(String region, float x, float y, float rotation, float layer, Color color){ diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index e3ca36dd56..38127c0ae3 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -119,7 +119,7 @@ public class UnitType extends UnlockableContent{ public boolean mechStepParticles = false; public Color mechLegColor = Pal.darkMetal; - public Rect treadRect = new Rect(); + public Rect[] treadRects = {}; public int treadFrames = 18; public int treadPullOffset = 0; @@ -176,7 +176,8 @@ public class UnitType extends UnlockableContent{ public Seq weapons = new Seq<>(); public TextureRegion baseRegion, legRegion, region, shadowRegion, cellRegion, softShadowRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion, outlineRegion, treadRegion; - public TextureRegion[] wreckRegions, segmentRegions, segmentOutlineRegions, treadRegions; + public TextureRegion[] wreckRegions, segmentRegions, segmentOutlineRegions; + public TextureRegion[][] treadRegions; protected float buildTime = -1f; protected @Nullable ItemStack[] totalRequirements, cachedRequirements, firstRequirements; @@ -524,9 +525,11 @@ public class UnitType extends UnlockableContent{ footRegion = Core.atlas.find(name + "-foot"); treadRegion = Core.atlas.find(name + "-treads"); if(treadRegion.found()){ - treadRegions = new TextureRegion[treadFrames]; - for(int i = 0; i < treadFrames; i++){ - treadRegions[i] = Core.atlas.find(name + "-treads" + i); + treadRegions = new TextureRegion[treadRects.length][treadFrames]; + for(int r = 0; r < treadRects.length; r++){ + for(int i = 0; i < treadFrames; i++){ + treadRegions[r][i] = Core.atlas.find(name + "-treads" + r + "-" + i); + } } } legBaseRegion = Core.atlas.find(name + "-leg-base", name + "-leg"); @@ -767,10 +770,12 @@ public class UnitType extends UnlockableContent{ if(decals.size > 0){ float base = unit.rotation - 90; for(var d : decals){ - Draw.z(d.layer); + Draw.blend(d.blending); + Draw.z(d.layer <= 0f ? z : d.layer); Draw.scl(d.xScale, d.yScale); Draw.color(d.color); Draw.rect(d.region, unit.x + Angles.trnsx(base, d.x, d.y), unit.y + Angles.trnsy(base, d.x, d.y), base + d.rotation); + Draw.blend(); } Draw.reset(); Draw.z(z); @@ -995,13 +1000,16 @@ public class UnitType extends UnlockableContent{ if(treadRegion.found()){ int frame = (int)(unit.treadTime()) % treadFrames; - var region = treadRegions[frame]; - float xOffset = treadRegion.width/2f - (treadRect.x + treadRect.width/2f); - float yOffset = treadRegion.height/2f - (treadRect.y + treadRect.height/2f); + for(int i = 0; i < treadRects.length; i ++){ + var region = treadRegions[i][frame]; + var treadRect = treadRects[i]; + float xOffset = treadRegion.width/2f - (treadRect.x + treadRect.width/2f); + float yOffset = treadRegion.height/2f - (treadRect.y + treadRect.height/2f); - for(int i : Mathf.signs){ - Tmp.v1.set(xOffset * i, yOffset).rotate(unit.rotation - 90); - Draw.rect(region, unit.x + Tmp.v1.x / 4f, unit.y + Tmp.v1.y / 4f, treadRect.width / 4f, region.height / 4f, unit.rotation - 90); + for(int side : Mathf.signs){ + Tmp.v1.set(xOffset * side, yOffset).rotate(unit.rotation - 90); + Draw.rect(region, unit.x + Tmp.v1.x / 4f, unit.y + Tmp.v1.y / 4f, treadRect.width / 4f, region.height / 4f, unit.rotation - 90); + } } } } diff --git a/gradle.properties b/gradle.properties index 0039eeffea..5df4495ded 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=a066e32504 +archash=16d2626649 diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 592c311826..77d182c8c4 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -521,22 +521,27 @@ public class Generators{ //generate tank animation if(sample instanceof Tankc){ Pixmap pix = get(type.treadRegion); - //slice is always 1 pixel wide - Pixmap slice = pix.crop((int)type.treadRect.x, (int)type.treadRect.y, 1, (int)type.treadRect.height); - int frames = type.treadFrames; - for(int i = 0; i < frames; i++){ - int pullOffset = type.treadPullOffset; - Pixmap frame = new Pixmap(slice.width, slice.height); - for(int y = 0; y < slice.height; y++){ - int idx = y + i; - if(idx >= slice.height){ - idx -= slice.height; - idx += pullOffset; - } - frame.setRaw(0, y, slice.getRaw(0, idx)); + for(int r = 0; r < type.treadRects.length; r++){ + Rect treadRect = type.treadRects[r]; + //slice is always 1 pixel wide + Pixmap slice = pix.crop((int)treadRect.x, (int)treadRect.y, 1, (int)treadRect.height); + int frames = type.treadFrames; + for(int i = 0; i < frames; i++){ + int pullOffset = type.treadPullOffset; + Pixmap frame = new Pixmap(slice.width, slice.height); + for(int y = 0; y < slice.height; y++){ + int idx = y + i; + if(idx >= slice.height){ + idx -= slice.height; + idx += pullOffset; + idx = Mathf.mod(idx, slice.height); + } + + frame.setRaw(0, y, slice.getRaw(0, idx)); + } + save(frame, type.name + "-treads" + r + "-" + i); } - save(frame, type.name + "-treads" + i); } }