Emanate impl / Rotation lock

This commit is contained in:
Anuken
2021-11-17 18:02:19 -05:00
parent 4d13b8df7a
commit 6026beb397
7 changed files with 91 additions and 2 deletions

View File

@@ -1988,7 +1988,7 @@ public class Blocks implements ContentList{
//TODO cost
requirements(Category.effect, with(Items.beryllium, 11000, Items.graphite, 11000, Items.tungsten, 9000, Items.carbide, 10000));
unitType = UnitTypes.evoke;
unitType = UnitTypes.emanate;
health = 22000;
itemCapacity = 16000;
size = 6;

View File

@@ -3,6 +3,7 @@ package mindustry.content;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
import mindustry.ai.types.*;
import mindustry.annotations.Annotations.*;
@@ -2417,6 +2418,7 @@ public class UnitTypes implements ContentList{
isCounted = false;
envDisabled = 0;
outlineColor = Pal.darkOutline;
lowAltitude = false;
flying = true;
targetAir = false;
@@ -2475,6 +2477,7 @@ public class UnitTypes implements ContentList{
isCounted = false;
envDisabled = 0;
outlineColor = Pal.darkOutline;
lowAltitude = false;
flying = true;
targetAir = false;
@@ -2483,7 +2486,7 @@ public class UnitTypes implements ContentList{
buildSpeed = 1.4f;
drag = 0.06f;
speed = 2.6f;
rotateSpeed = 6f;
rotateSpeed = 5f;
accel = 0.11f;
itemCapacity = 70;
health = 600f;
@@ -2526,6 +2529,77 @@ public class UnitTypes implements ContentList{
}});
}};
emanate = new UnitType("emanate"){{
defaultController = BuilderAI::new;
isCounted = false;
envDisabled = 0;
outlineColor = Pal.darkOutline;
lowAltitude = false;
flying = true;
targetAir = false;
mineSpeed = 8f;
mineTier = 3;
buildSpeed = 1.4f;
drag = 0.06f;
speed = 2.6f;
rotateSpeed = 3f;
accel = 0.11f;
itemCapacity = 140;
health = 1500f;
armor = 3f;
hitSize = 36f;
commandLimit = 9;
buildBeamOffset = 72f / 4f;
engineSize = 0;
payloadCapacity = Mathf.sqr(3f) * tilePayload;
float es = 3.8f;
setEnginesMirror(
new UnitEngine(49 / 4f, 51 / 4f, es, 45f),
new UnitEngine(67 / 4f, -30 / 4f, es, 315f),
new UnitEngine(49 / 4f, -62 / 4f, es, 315f)
);
Vec2[] positions = {new Vec2(30f, 50f), new Vec2(60f, -15f)};
int i = 0;
for(var pos : positions){
int fi = i;
weapons.add(new Weapon("incite-weapon"){{
rotate = true;
reload = fi == 0 ? 25f : 35f;
rotateSpeed = 4f;
x = pos.x/4f;
y = pos.y/4f;
shootY = 5.75f;
recoil = 2f;
rotationLimit = 90f;
layerOffset = -0.01f;
bullet = new BasicBulletType(5f, 17){{
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;
}};
}});
i ++;
}
}};
//TODO emanate (+ better names)
//endregion

View File

@@ -85,6 +85,8 @@ public class Weapon implements Cloneable{
public float shotDelay = 0;
/** The half-radius of the cone in which shooting will start. */
public float shootCone = 5f;
/** Cone in which the weapon can rotate relative to its mount. */
public float rotationLimit = 361f;
/** ticks to cool down the heat region */
public float cooldownTime = 20f;
/** random sound pitch range */
@@ -147,6 +149,10 @@ public class Weapon implements Cloneable{
//TODO copy-pasted code
public void drawOutline(Unit unit, WeaponMount mount){
//apply layer offset, roll it back at the end
float z = Draw.z();
Draw.z(z + layerOffset);
float
rotation = unit.rotation - 90,
weaponRotation = rotation + (rotate ? mount.rotation : 0),
@@ -160,6 +166,8 @@ public class Weapon implements Cloneable{
outlineRegion.height * Draw.scl,
weaponRotation);
}
Draw.z(z);
}
public void draw(Unit unit, WeaponMount mount){
@@ -215,6 +223,12 @@ public class Weapon implements Cloneable{
mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - unit.rotation;
mount.rotation = Angles.moveToward(mount.rotation, mount.targetRotation, rotateSpeed * Time.delta);
if(rotationLimit < 360){
float dst = Angles.angleDist(mount.rotation, 0f);
if(dst > rotationLimit/2f){
mount.rotation = Angles.moveToward(mount.rotation, 0, dst - rotationLimit/2f);
}
}
}else if(!rotate){
mount.rotation = 0;
mount.targetRotation = unit.angleTo(mount.aimX, mount.aimY);