From 3af562e624c562c3c37384cda9e91028ab074943 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 11 Jan 2025 17:35:38 -0500 Subject: [PATCH] WIP scathe phase ammo / Shield ability fixes --- .../weapons/scathe-missile-phase-cell.png | Bin 0 -> 236 bytes .../units/weapons/scathe-missile-phase.png | Bin 0 -> 1157 bytes core/assets/icons/icons.properties | 1 + core/src/mindustry/content/Blocks.java | 102 ++++++++++++++++-- .../mindustry/entities/abilities/Ability.java | 1 + .../entities/abilities/ForceFieldAbility.java | 5 + .../entities/abilities/ShieldArcAbility.java | 3 +- core/src/mindustry/type/UnitType.java | 3 + gradle.properties | 2 +- 9 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 core/assets-raw/sprites/units/weapons/scathe-missile-phase-cell.png create mode 100644 core/assets-raw/sprites/units/weapons/scathe-missile-phase.png diff --git a/core/assets-raw/sprites/units/weapons/scathe-missile-phase-cell.png b/core/assets-raw/sprites/units/weapons/scathe-missile-phase-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..7854083dfd74dba7e77b2fd1d17ee5880abd5ac5 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^RzMuj!3HFEHeERgq!^2X+?^QKos)S9=r(bs;R}>g{VzTcy9C4e->|M!o^wXunx*Dd`ao4; z_KUL}qbG*yU*@ivbDqD};r;TPx(KS@MERCt{2o4sxmK@i6m#0wxnLGLt&cz{Se0Z1UAr9%o-A&=lk2viV>juxUs zf+s-A16a7R`xHUq5kfWA-g;-}d$E-JS9Wf1W`4JOJ9BeRN|Po{+GXA9>Fm?V*X#WI zyMx!={C9IyLV|k1c5#A1f_lJ)JD?yz(XgS$xsaep*f7IVNKh2)?Fgg0s5?EKEtl)j z_hFcI^WAMmOGxZ*QR)KP0_p`D4$1-P0UHV`0f>eT1Jwi`343GG%Z&jIsY0MCk}gHa zs}a?ayTP*b$VwbW{raMOgFAY{c^c( z1}`b%y>qI2dhrM_qHqYwqn1FUsw0;h9m|{2=S}Qz1f*n4O_G>cYh4Nn_ooy9?pbO6<=nI6j2<4%uX{JSr2Y<%=HwM^g60N#w=Jdq zC|J>E)VmSw=}(+qB(D~JfB(a_i;eYqm0^B*IX^pX9_PSPV<;aSnLr_c^=i=^*8-s+ z!L}7v4O%+Zz;YompAxBBDVW3cYLRApk5YnMczHECPJs=>Y;*r%7w-J*bmK#!=8S$k zo^K^$YUb9f#U|lDe0h%@2#g(u8OsMJ)?DP$%?(fiq?FRL=PyRzIk4rJ(nd{rEEHst zJf=N)`iiVR$^hT)uQs2tWt&5OzStWbSd zzaH#!%x{gw(n-xXw=y!nWXhLz86Xr8k1sEpHUP5RjPjY~0%0<5Mi4+Nskdgfbqs7; zA(Pjx%c)#yK%AwmdG@TS>kpG9_pGCr~P3v$P3oo97{x*#@UQoW4I-tx;Z9=jC>L70c)y^$^f)4Z8_&zi+dE5 zTJxCWJV427zI-fpaVXeU%<9dEa+)XosIj@Ii7}-YET~#AQDc*5&j?e^F&0eJSgyyEd>vJvs>*g|s`Zuw_u*_F4*g9<2!r%G(|$Rligk92Jze zy_(dGVQz5TpuFvsGIhYI;G{u$+sozp?j@HtC~tcpmw(wRgR=(ZZEw<~Ns}f`nq<>I XS!&v@n^|J+00000NkvXXu0mjf6Sg3; literal 0 HcmV?d00001 diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 0767ed44da..7c59cb0a5d 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -592,3 +592,4 @@ 63090=remove-ore|block-remove-ore-ui 63089=small-heat-redirector|block-small-heat-redirector-ui 63088=large-cliff-crusher|block-large-cliff-crusher-ui +63087=scathe-missile-phase|unit-scathe-missile-phase-ui diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 9718e0cd25..3d7c6ff13e 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4112,7 +4112,7 @@ public class Blocks{ hitEffect = despawnEffect = Fx.hitSquaresColor; buildingDamageMultiplier = 0.2f; }}, - Items.oxide, new BasicBulletType(8f, 90){{ + Items.oxide, new BasicBulletType(8f, 95){{ knockback = 3f; width = 25f; hitSize = 7f; @@ -4127,8 +4127,8 @@ public class Blocks{ hitEffect = despawnEffect = Fx.hitSquaresColor; buildingDamageMultiplier = 0.2f; }}, - Items.silicon, new BasicBulletType(8f, 33){{ - knockback = 2f; + Items.silicon, new BasicBulletType(8f, 34){{ + knockback = 3f; width = 25f; hitSize = 7f; height = 20f; @@ -4478,10 +4478,10 @@ public class Blocks{ }}, Items.silicon, new BasicBulletType(){{ damage = 35; - homingPower = 0.03f; + homingPower = 0.045f; reloadMultiplier = 0.9f; - speed = 8.5f; + speed = 9f; width = height = 16; shrinkY = 0.3f; backSprite = "large-bomb-back"; @@ -4750,7 +4750,7 @@ public class Blocks{ requirements(Category.turret, with(Items.silicon, 450, Items.graphite, 400, Items.tungsten, 500, Items.oxide, 100, Items.carbide, 200)); ammo( - Items.carbide, new BasicBulletType(0f, 1){{ + Items.carbide, new BulletType(){{ shootEffect = Fx.shootBig; smokeEffect = Fx.shootSmokeMissile; ammoMultiplier = 1f; @@ -4833,6 +4833,96 @@ public class Blocks{ interval = 7f; }}); }}; + }}, + + //TODO - needs balancing + Items.phaseFabric, new BulletType(){{ + shootEffect = Fx.shootBig; + smokeEffect = Fx.shootSmokeMissile; + ammoMultiplier = 1f; + reloadMultiplier = 0.8f; + + spawnUnit = new MissileUnitType("scathe-missile-phase"){{ + speed = 4.4f; + maxRange = 6f; + lifetime = 60f * 5.7f; + outlineColor = Pal.darkOutline; + engineColor = trailColor = Color.valueOf("ffd37f"); + engineLayer = Layer.effect; + engineSize = 3.1f; + engineOffset = 10f; + rotateSpeed = 0.2f; + trailLength = 18; + missileAccelTime = 50f; + lowAltitude = true; + loopSound = Sounds.missileTrail; + loopSoundVolume = 0.6f; + deathSound = Sounds.largeExplosion; + targetAir = false; + targetUnderBlocks = false; + + fogRadius = 6f; + + health = 250; + + weapons.add(new Weapon(){{ + shootCone = 360f; + mirror = false; + reload = 1f; + deathExplosionEffect = Fx.massiveExplosion; + shootOnDeath = true; + shake = 10f; + bullet = new ExplosionBulletType(1500f, 50f){{ + hitColor = engineColor; + shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosion, Fx.scatheLight, new WaveEffect(){{ + lifetime = 10f; + strokeFrom = 4f; + sizeTo = 130f; + }}); + + collidesAir = false; + buildingDamageMultiplier = 0.2f; + + ammoMultiplier = 1f; + fragLifeMin = 0.1f; + fragBullets = 7; + fragBullet = new ArtilleryBulletType(3.4f, 32){{ + buildingDamageMultiplier = 0.2f; + drag = 0.02f; + hitEffect = Fx.massiveExplosion; + despawnEffect = Fx.scatheSlash; + knockback = 0.8f; + lifetime = 23f; + width = height = 18f; + collidesTiles = false; + splashDamageRadius = 40f; + splashDamage = 160f; + backColor = trailColor = hitColor = engineColor; + frontColor = Color.white; + smokeEffect = Fx.shootBigSmoke2; + despawnShake = 7f; + lightRadius = 30f; + lightColor = engineColor; + lightOpacity = 0.5f; + + trailLength = 20; + trailWidth = 3.5f; + trailEffect = Fx.none; + }}; + }}; + }}); + + abilities.add(new MoveEffectAbility(){{ + effect = Fx.missileTrailSmoke; + rotation = 180f; + y = -9f; + color = Color.grays(0.6f).lerp(Pal.redLight, 0.5f).a(0.4f); + interval = 7f; + }}); + + abilities.add(new ForceFieldAbility(30f, 0f, 160f, 999999999f)); + + }}; }} ); diff --git a/core/src/mindustry/entities/abilities/Ability.java b/core/src/mindustry/entities/abilities/Ability.java index 42a31d6312..d64a77ffea 100644 --- a/core/src/mindustry/entities/abilities/Ability.java +++ b/core/src/mindustry/entities/abilities/Ability.java @@ -15,6 +15,7 @@ public abstract class Ability implements Cloneable{ public void update(Unit unit){} public void draw(Unit unit){} public void death(Unit unit){} + public void created(Unit unit){} public void init(UnitType type){} public void displayBars(Unit unit, Table bars){} public void addStats(Table t){ diff --git a/core/src/mindustry/entities/abilities/ForceFieldAbility.java b/core/src/mindustry/entities/abilities/ForceFieldAbility.java index 504bf20681..82b5297d88 100644 --- a/core/src/mindustry/entities/abilities/ForceFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ForceFieldAbility.java @@ -131,6 +131,11 @@ public class ForceFieldAbility extends Ability{ bars.add(new Bar("stat.shieldhealth", Pal.accent, () -> unit.shield / max)).row(); } + @Override + public void created(Unit unit){ + unit.shield = max; + } + public void checkRadius(Unit unit){ //timer2 is used to store radius scale as an effect realRad = radiusScale * radius; diff --git a/core/src/mindustry/entities/abilities/ShieldArcAbility.java b/core/src/mindustry/entities/abilities/ShieldArcAbility.java index 0af8f3377c..a4d60c3eec 100644 --- a/core/src/mindustry/entities/abilities/ShieldArcAbility.java +++ b/core/src/mindustry/entities/abilities/ShieldArcAbility.java @@ -11,7 +11,6 @@ import mindustry.*; import mindustry.content.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.type.*; import mindustry.ui.*; public class ShieldArcAbility extends Ability{ @@ -102,7 +101,7 @@ public class ShieldArcAbility extends Ability{ } @Override - public void init(UnitType type){ + public void created(Unit unit){ data = max; } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index c12e1309e2..5ddbbe7763 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -465,6 +465,9 @@ public class UnitType extends UnlockableContent implements Senseable{ if(unit.controller() instanceof CommandAI command && defaultCommand != null){ command.command = defaultCommand; } + for(var ability : unit.abilities){ + ability.created(unit); + } unit.ammo = ammoCapacity; //fill up on ammo upon creation unit.elevation = flying ? 1f : 0; unit.heal(); diff --git a/gradle.properties b/gradle.properties index 32b6a7e754..68c4b0c8f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=124ba82104 +archash=d631900a9e