Titan recolor + complaining

This commit is contained in:
Anuken
2021-12-05 18:19:43 -05:00
parent 30bfab34ee
commit 7d6428fcf2
13 changed files with 133 additions and 64 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 899 B

After

Width:  |  Height:  |  Size: 918 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 566 B

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 600 B

After

Width:  |  Height:  |  Size: 601 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 629 B

After

Width:  |  Height:  |  Size: 627 B

View File

@@ -474,3 +474,4 @@
63232=wall-ore-tungsten|block-wall-ore-tungsten-ui 63232=wall-ore-tungsten|block-wall-ore-tungsten-ui
63231=regen-projector|block-regen-projector-ui 63231=regen-projector|block-regen-projector-ui
63230=titan|block-titan-ui 63230=titan|block-titan-ui
63229=horde|block-horde-ui

Binary file not shown.

View File

@@ -119,7 +119,7 @@ public class Blocks{
duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, foreshadow, spectre, meltdown, segment, parallax, tsunami, duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, foreshadow, spectre, meltdown, segment, parallax, tsunami,
//turrets - erekir //turrets - erekir
breach, fracture, sublimate, titan, breach, fracture, horde, sublimate, titan,
//units //units
commandCenter, commandCenter,
@@ -128,6 +128,7 @@ public class Blocks{
repairPoint, repairTurret, repairPoint, repairTurret,
//payloads //payloads
//TODO small deconstructor
payloadConveyor, payloadRouter, payloadPropulsionTower, deconstructor, constructor, largeConstructor, payloadLoader, payloadUnloader, payloadConveyor, payloadRouter, payloadPropulsionTower, deconstructor, constructor, largeConstructor, payloadLoader, payloadUnloader,
//logic //logic
@@ -2799,7 +2800,7 @@ public class Blocks{
Items.beryllium, new BasicBulletType(7f, 32){{ Items.beryllium, new BasicBulletType(7f, 32){{
width = 8f; width = 8f;
height = 14f; height = 14f;
shootEffect = Fx.berylSpark; shootEffect = Fx.colorSpark;
smokeEffect = Fx.shootBigSmoke; smokeEffect = Fx.shootBigSmoke;
ammoMultiplier = 1; ammoMultiplier = 1;
pierce = true; pierce = true;
@@ -2853,7 +2854,7 @@ public class Blocks{
velocityInaccuracy = 0.2f; velocityInaccuracy = 0.2f;
width = 6f; width = 6f;
height = 12f; height = 12f;
shootEffect = Fx.berylSpark; shootEffect = Fx.colorSpark;
smokeEffect = Fx.shootBigSmoke; smokeEffect = Fx.shootBigSmoke;
ammoMultiplier = 2; ammoMultiplier = 2;
pierce = true; pierce = true;
@@ -2888,10 +2889,64 @@ public class Blocks{
limitRange(); limitRange();
}}; }};
//TODO implementation, better name
horde = new ItemTurret("horde"){{
requirements(Category.turret, with(Items.tungsten, 35, Items.silicon, 35));
ammo(
Items.scrap, new MissileBulletType(4.2f, 15){{
velocityInaccuracy = 0.2f;
shootEffect = Fx.colorSpark;
smokeEffect = Fx.shootBigSmoke;
ammoMultiplier = 1;
hitColor = backColor = trailColor = Color.valueOf("ea8878");
frontColor = Color.valueOf("feb380");
trailWidth = 2f;
trailLength = 12;
splashDamage = 15f;
splashDamageRadius = 30f;
weaveMag = 5;
weaveScale = 4;
velocityInaccuracy = 0.1f;
ammoMultiplier = 3f;
//TODO different effect?
hitEffect = despawnEffect = Fx.blastExplosion;
}}
);
acceptCoolant = false;
//TODO
consumes.liquid(Liquids.hydrogen, 1.5f / 60f);
shots = 9;
burstSpacing = 2f;
//TODO this works but looks bad
spread = 0f;
shootLength = 6.5f;
xRand = 13f;
recoilAmount = 0f;
draw = new DrawTurret("reinforced-");
outlineColor = Pal.darkOutline;
size = 3;
envEnabled |= Env.space;
reloadTime = 60f * 1.5f;
range = 190;
shootCone = 15f;
inaccuracy = 20f;
health = 300 * size * size;
rotateSpeed = 3f;
//???
//limitRange();
}};
//TODO bad name //TODO bad name
sublimate = new ContinuousTurret("sublimate"){{ sublimate = new ContinuousTurret("sublimate"){{
//TODO requirements //TODO requirements
requirements(Category.turret, with(Items.tungsten, 35, Items.silicon, 35)); requirements(Category.turret, with(Items.tungsten, 50, Items.silicon, 60, Items.oxide, 30, Items.carbide, 40));
draw = new DrawTurret("reinforced-"){{ draw = new DrawTurret("reinforced-"){{
liquidDraw = Liquids.ozone; liquidDraw = Liquids.ozone;
@@ -2942,13 +2997,11 @@ public class Blocks{
}}; }};
titan = new ItemTurret("titan"){{ titan = new ItemTurret("titan"){{
//TODO requirements
requirements(Category.turret, with(Items.carbide, 120, Items.surgeAlloy, 80, Items.silicon, 80, Items.beryllium, 120)); requirements(Category.turret, with(Items.carbide, 120, Items.surgeAlloy, 80, Items.silicon, 80, Items.beryllium, 120));
ammo( ammo(
//TODO ammo types to be defined later //TODO 1 more ammo type, decide on base type
Items.fissileMatter, new ArtilleryBulletType(2.5f, 40, "shell"){{ Items.fissileMatter, new ArtilleryBulletType(2.5f, 40, "shell"){{
//TODO FX; smoke, shockwave, not green bomb
hitEffect = new MultiEffect(Fx.titanExplosion, Fx.titanSmoke); hitEffect = new MultiEffect(Fx.titanExplosion, Fx.titanSmoke);
despawnEffect = Fx.none; despawnEffect = Fx.none;
knockback = 1.5f; knockback = 1.5f;
@@ -2957,8 +3010,8 @@ public class Blocks{
width = 14.2f; width = 14.2f;
splashDamageRadius = 60f; splashDamageRadius = 60f;
splashDamage = 100f; splashDamage = 100f;
backColor = hitColor = trailColor = Pal.berylShot; backColor = hitColor = trailColor = Color.valueOf("5b6b82");
frontColor = Color.valueOf("f0ffde"); frontColor = Color.valueOf("a0b0c8");
ammoMultiplier = 1f; ammoMultiplier = 1f;
status = StatusEffects.blasted; status = StatusEffects.blasted;
@@ -2971,11 +3024,9 @@ public class Blocks{
trailColor = backColor; trailColor = backColor;
despawnShake = 7f; despawnShake = 7f;
//TODO better shoot
shootEffect = Fx.shootTitan; shootEffect = Fx.shootTitan;
smokeEffect = Fx.shootSmokeTitan; smokeEffect = Fx.shootSmokeTitan;
//does the trail need to shrink?
trailInterp = v -> Math.max(Mathf.slope(v), 0.8f); trailInterp = v -> Math.max(Mathf.slope(v), 0.8f);
shrinkX = 0.2f; shrinkX = 0.2f;
shrinkY = 0.1f; shrinkY = 0.1f;
@@ -2992,27 +3043,23 @@ public class Blocks{
acceptCoolant = false; acceptCoolant = false;
draw = new DrawTurret("reinforced-"){{ draw = new DrawTurret("reinforced-"){{
Color heatc = Color.valueOf("f03b0e");
Interp in = Interp.pow2In;
parts.addAll( parts.addAll(
new RegionPart("-barrel"){{ new RegionPart("-barrel"){{
moveY = -5f; moveY = -5f;
heatColor = heatc; heatColor = Color.valueOf("f03b0e");
mirror = false; mirror = false;
interp = in; interp = Interp.pow2In;
}}, }},
new RegionPart("-side"){{ new RegionPart("-side"){{
moveX = 2f;
moveY = -1f; moveY = -1f;
rotMove = -40f; rotMove = -40f;
moveX = 2f;
useReload = false; useReload = false;
under = true; under = true;
heatColor = Pal.berylShot.cpy().mul(1.1f); heatColor = Color.valueOf("768a9a");
useProgressHeat = true; useProgressHeat = true;
interp = Interp.pow2Out; interp = Interp.pow2Out;
}} }});
);
}}; }};
restitution = 0.02f; restitution = 0.02f;

View File

@@ -340,7 +340,7 @@ public class Fx{
}), }),
titanExplosion = new Effect(30f, 160f, e -> { titanExplosion = new Effect(30f, 160f, e -> {
color(Pal.berylShot); color(e.color);
stroke(e.fout() * 3f); stroke(e.fout() * 3f);
float circleRad = 6f + e.finpow() * 60f; float circleRad = 6f + e.finpow() * 60f;
Lines.circle(e.x, e.y, circleRad); Lines.circle(e.x, e.y, circleRad);
@@ -356,7 +356,7 @@ public class Fx{
titanSmoke = new Effect(300f, 300f, b -> { titanSmoke = new Effect(300f, 300f, b -> {
float intensity = 3f; float intensity = 3f;
color(Pal.berylShot, 0.7f); color(b.color, 0.7f);
for(int i = 0; i < 4; i++){ for(int i = 0; i < 4; i++){
rand.setSeed(b.id*2 + i); rand.setSeed(b.id*2 + i);
float lenScl = rand.random(0.5f, 1f); float lenScl = rand.random(0.5f, 1f);
@@ -1372,7 +1372,7 @@ public class Fx{
}), }),
shootTitan = new Effect(10, e -> { shootTitan = new Effect(10, e -> {
color(Pal.lightOrange, Pal.berylShot, e.fin()); color(Pal.lightOrange, e.color, e.fin());
float w = 1.3f + 10 * e.fout(); float w = 1.3f + 10 * e.fout();
Drawf.tri(e.x, e.y, w, 35f * e.fout(), e.rotation); Drawf.tri(e.x, e.y, w, 35f * e.fout(), e.rotation);
Drawf.tri(e.x, e.y, w, 6f * e.fout(), e.rotation + 180f); Drawf.tri(e.x, e.y, w, 6f * e.fout(), e.rotation + 180f);
@@ -1399,7 +1399,7 @@ public class Fx{
for(int i = 0; i < 13; i++){ for(int i = 0; i < 13; i++){
v.trns(e.rotation + rand.range(30f), rand.random(e.finpow() * 40f)); v.trns(e.rotation + rand.range(30f), rand.random(e.finpow() * 40f));
e.scaled(e.lifetime * rand.random(0.3f, 1f), b -> { e.scaled(e.lifetime * rand.random(0.3f, 1f), b -> {
color(Pal.berylShot, Pal.lightishGray, b.fin()); color(e.color, Pal.lightishGray, b.fin());
Fill.circle(e.x + v.x, e.y + v.y, b.fout() * 3.4f + 0.3f); Fill.circle(e.x + v.x, e.y + v.y, b.fout() * 3.4f + 0.3f);
}); });
} }
@@ -1441,8 +1441,8 @@ public class Fx{
} }
}), }),
berylSpark = new Effect(21f, e -> { colorSpark = new Effect(21f, e -> {
color(Color.white, Pal.berylShot, e.fin()); color(Color.white, e.color, e.fin());
stroke(e.fout() * 1.1f + 0.5f); stroke(e.fout() * 1.1f + 0.5f);
randLenVectors(e.id, 5, 27f * e.fin(), e.rotation, 9f, (x, y) -> { randLenVectors(e.id, 5, 27f * e.fin(), e.rotation, 9f, (x, y) -> {

View File

@@ -350,6 +350,8 @@ public class Weapon implements Cloneable{
BulletType ammo = bullet; BulletType ammo = bullet;
float lifeScl = ammo.scaleVelocity ? Mathf.clamp(Mathf.dst(shootX, shootY, aimX, aimY) / ammo.range()) : 1f; float lifeScl = ammo.scaleVelocity ? Mathf.clamp(Mathf.dst(shootX, shootY, aimX, aimY) / ammo.range()) : 1f;
//TODO far too complicated and similar to Turret
sequenceNum = 0; sequenceNum = 0;
if(delay){ if(delay){
Angles.shotgun(shots, spacing, rotation, f -> { Angles.shotgun(shots, spacing, rotation, f -> {
@@ -396,8 +398,8 @@ public class Weapon implements Cloneable{
} }
ejectEffect.at(mountX, mountY, rotation * side); ejectEffect.at(mountX, mountY, rotation * side);
ammo.shootEffect.at(shootX, shootY, rotation, parentize ? unit : null); ammo.shootEffect.at(shootX, shootY, rotation, ammo.hitColor, parentize ? unit : null);
ammo.smokeEffect.at(shootX, shootY, rotation, parentize ? unit : null); ammo.smokeEffect.at(shootX, shootY, rotation, ammo.hitColor, parentize ? unit : null);
unit.apply(shootStatus, shootStatusDuration); unit.apply(shootStatus, shootStatusDuration);
} }

View File

@@ -16,6 +16,7 @@ public class BaseTurret extends Block{
public float range = 80f; public float range = 80f;
public float rotateSpeed = 5; public float rotateSpeed = 5;
public float coolantUsage = 0.2f;
public boolean acceptCoolant = true; public boolean acceptCoolant = true;
/** Effect displayed when coolant is used. */ /** Effect displayed when coolant is used. */
public Effect coolEffect = Fx.fuelburn; public Effect coolEffect = Fx.fuelburn;
@@ -38,7 +39,7 @@ public class BaseTurret extends Block{
public void init(){ public void init(){
if(acceptCoolant && !consumes.has(ConsumeType.liquid)){ if(acceptCoolant && !consumes.has(ConsumeType.liquid)){
hasLiquids = true; hasLiquids = true;
consumes.add(new ConsumeCoolant(0.2f)).update(false).boost(); consumes.add(new ConsumeCoolant(coolantUsage)).update(false).boost();
} }
super.init(); super.init();

View File

@@ -23,7 +23,6 @@ import mindustry.graphics.*;
import mindustry.logic.*; import mindustry.logic.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.blocks.*; import mindustry.world.blocks.*;
import mindustry.world.consumers.*;
import mindustry.world.draw.*; import mindustry.world.draw.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
@@ -42,54 +41,74 @@ public class Turret extends ReloadTurret{
public Effect ammoUseEffect = Fx.none; public Effect ammoUseEffect = Fx.none;
public Sound shootSound = Sounds.shoot; public Sound shootSound = Sounds.shoot;
//general info public Effect chargeEffect = Fx.none;
public int maxAmmo = 30; public Effect chargeBeginEffect = Fx.none;
public int ammoPerShot = 1; public Sound chargeSound = Sounds.none;
//visuals
public float ammoEjectBack = 1f; public float ammoEjectBack = 1f;
public float inaccuracy = 0f;
public float velocityInaccuracy = 0f;
public float shootWarmupSpeed = 0.1f; public float shootWarmupSpeed = 0.1f;
public int shots = 1;
public float spread = 4f;
public float recoilAmount = 1f; public float recoilAmount = 1f;
public float restitution = 0.02f; public float restitution = 0.02f;
public float cooldown = 0.02f; public float cooldown = 0.02f;
public float coolantUsage = 0.2f; public float elevation = -1f;
public float shootCone = 8f;
public float shootShake = 0f; public float shootShake = 0f;
public int maxAmmo = 30;
public int ammoPerShot = 1;
//TODO all the fields below should be deprecated and moved into a ShootPattern class or similar
//TODO ...however, it would be nice to unify the weapon and turret systems into one.
// below
/** Bullet angle randomness in degrees. */
public float inaccuracy = 0f;
/** Fraction of bullet velocity that is random. */
public float velocityInaccuracy = 0f;
/** Number of bullets fired per volley. */
public int shots = 1;
/**
* Spread between bullets in degrees.
* For some dumb reason, this is also used for the "alternation width", and it's too late to change anything.
* */
public float spread = 4f;
/** Maximum angle difference in degrees at which turret will still try to shoot. */
public float shootCone = 8f;
/** Length of turret shoot point. */
public float shootLength = -1; public float shootLength = -1;
/** Random spread of projectile across width. This looks stupid. */
public float xRand = 0f; public float xRand = 0f;
/** Currently used for artillery only. */ /** Currently used for artillery only. */
public float minRange = 0f; public float minRange = 0f;
/** Ticks between shots if shots > 1. */
public float burstSpacing = 0; public float burstSpacing = 0;
/** An inflexible and terrible idea. */
public boolean alternate = false; public boolean alternate = false;
/** If true, this turret will accurately target moving targets with respect to charge time. */ /** If true, this turret will accurately target moving targets with respect to charge time. */
public boolean accurateDelay = false; public boolean accurateDelay = false;
public boolean targetAir = true;
public boolean targetGround = true;
public boolean targetHealing = false;
public boolean playerControllable = true;
public boolean displayAmmoMultiplier = true;
//charging //charging
public float chargeTime = -1f; public float chargeTime = -1f;
public int chargeEffects = 5; public int chargeEffects = 5;
public float chargeMaxDelay = 10f; public float chargeMaxDelay = 10f;
public Effect chargeEffect = Fx.none;
public Effect chargeBeginEffect = Fx.none;
public Sound chargeSound = Sounds.none;
//see above
public boolean targetAir = true;
public boolean targetGround = true;
public boolean targetHealing = false;
public boolean playerControllable = true;
public boolean displayAmmoMultiplier = true;
public Sortf unitSort = UnitSorts.closest; public Sortf unitSort = UnitSorts.closest;
/** @deprecated loaded in {@link #draw} instead, unused */
public @Deprecated @Load(value = "@-base", fallback = "block-@size") TextureRegion baseRegion;
/** @deprecated loaded in {@link #draw} instead, unused */
public @Deprecated @Load("@-heat") TextureRegion heatRegion;
public float elevation = -1f;
public DrawBlock draw = new DrawTurret(); public DrawBlock draw = new DrawTurret();
/** @deprecated loaded in {@link #draw} instead, unused */
@Deprecated
public @Load(value = "@-base", fallback = "block-@size") TextureRegion baseRegion;
/** @deprecated loaded in {@link #draw} instead, unused */
@Deprecated
public @Load("@-heat") TextureRegion heatRegion;
/** @deprecated use bulletOffset; this will always be zero. **/ /** @deprecated use bulletOffset; this will always be zero. **/
@Deprecated @Deprecated
protected Vec2 tr = new Vec2(); protected Vec2 tr = new Vec2();
@@ -128,11 +147,6 @@ public class Turret extends ReloadTurret{
@Override @Override
public void init(){ public void init(){
if(acceptCoolant && !consumes.has(ConsumeType.liquid)){
hasLiquids = true;
consumes.add(new ConsumeCoolant(coolantUsage)).update(false).boost();
}
if(shootLength < 0) shootLength = size * tilesize / 2f; if(shootLength < 0) shootLength = size * tilesize / 2f;
if(elevation < 0) elevation = size / 2f; if(elevation < 0) elevation = size / 2f;
@@ -436,6 +450,7 @@ public class Turret extends ReloadTurret{
} }
protected void shoot(BulletType type){ protected void shoot(BulletType type){
//TODO absolute disaster here, combining shot patterns fails in unpredictable ways and I don't want to touch anything in case it breaks mods
//when charging is enabled, use the charge shoot pattern //when charging is enabled, use the charge shoot pattern
if(chargeTime > 0){ if(chargeTime > 0){
@@ -470,6 +485,7 @@ public class Turret extends ReloadTurret{
int ii = i; int ii = i;
Time.run(burstSpacing * i, () -> { Time.run(burstSpacing * i, () -> {
if(dead || !hasAmmo()) return; if(dead || !hasAmmo()) return;
bulletOffset.trns(rotation, shootLength, Mathf.range(xRand)); bulletOffset.trns(rotation, shootLength, Mathf.range(xRand));
bullet(type, rotation + Mathf.range(inaccuracy + type.inaccuracy) + (ii - (int)(shots / 2f)) * spread); bullet(type, rotation + Mathf.range(inaccuracy + type.inaccuracy) + (ii - (int)(shots / 2f)) * spread);
effects(); effects();
@@ -485,7 +501,7 @@ public class Turret extends ReloadTurret{
if(alternate){ if(alternate){
float i = (shotCounter % shots) - (shots-1)/2f; float i = (shotCounter % shots) - (shots-1)/2f;
bulletOffset.trns(rotation - 90, spread * i + Mathf.range(xRand), shootLength); bulletOffset.trns(rotation - 90, (spread) * i + Mathf.range(xRand), shootLength);
bullet(type, rotation + Mathf.range(inaccuracy + type.inaccuracy)); bullet(type, rotation + Mathf.range(inaccuracy + type.inaccuracy));
}else{ }else{
bulletOffset.trns(rotation, shootLength, Mathf.range(xRand)); bulletOffset.trns(rotation, shootLength, Mathf.range(xRand));
@@ -511,11 +527,13 @@ public class Turret extends ReloadTurret{
} }
protected void effects(){ protected void effects(){
Effect fshootEffect = shootEffect == Fx.none ? peekAmmo().shootEffect : shootEffect; var bullet = peekAmmo();
Effect fsmokeEffect = smokeEffect == Fx.none ? peekAmmo().smokeEffect : smokeEffect; //TODO "shoot" and "smoke" should just be MultiEffects there's no reason to have them separate
Effect fshootEffect = shootEffect == Fx.none ? bullet.shootEffect : shootEffect;
Effect fsmokeEffect = smokeEffect == Fx.none ? bullet.smokeEffect : smokeEffect;
fshootEffect.at(x + bulletOffset.x, y + bulletOffset.y, rotation); fshootEffect.at(x + bulletOffset.x, y + bulletOffset.y, rotation, bullet.hitColor);
fsmokeEffect.at(x + bulletOffset.x, y + bulletOffset.y, rotation); fsmokeEffect.at(x + bulletOffset.x, y + bulletOffset.y, rotation, bullet.hitColor);
shootSound.at(x + bulletOffset.x, y + bulletOffset.y, Mathf.random(0.9f, 1.1f)); shootSound.at(x + bulletOffset.x, y + bulletOffset.y, Mathf.random(0.9f, 1.1f));
if(shootShake > 0){ if(shootShake > 0){