From 2d19c7ae97bb4bfdf65b4b5c8c98b94e7f1442cf Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 17 Jan 2022 13:39:15 -0500 Subject: [PATCH] Bulwark shield mechanics mostly done --- .../src/main/resources/revisions/alpha/3.json | 1 + .../main/resources/revisions/arkyid/3.json | 1 + .../src/main/resources/revisions/beta/3.json | 1 + .../src/main/resources/revisions/block/7.json | 1 + .../main/resources/revisions/corvus/7.json | 1 + .../src/main/resources/revisions/flare/7.json | 1 + .../src/main/resources/revisions/gamma/3.json | 1 + .../src/main/resources/revisions/mace/7.json | 1 + .../main/resources/revisions/manifold/1.json | 1 + .../src/main/resources/revisions/mega/5.json | 1 + .../main/resources/revisions/missile/1.json | 1 + .../src/main/resources/revisions/mono/6.json | 1 + .../src/main/resources/revisions/nova/5.json | 1 + .../src/main/resources/revisions/oct/5.json | 1 + .../src/main/resources/revisions/poly/5.json | 1 + .../main/resources/revisions/pulsar/3.json | 1 + .../src/main/resources/revisions/quad/6.json | 1 + .../main/resources/revisions/quasar/3.json | 1 + .../src/main/resources/revisions/risso/7.json | 1 + .../main/resources/revisions/scuttler/1.json | 1 + .../main/resources/revisions/spiroct/6.json | 1 + .../main/resources/revisions/toxopid/3.json | 1 + .../main/resources/revisions/vanquish/1.json | 1 + .../sprites/units/bulwark-armor.png | Bin 1393 -> 0 bytes .../sprites/units/bulwark-shield.png | Bin 0 -> 632 bytes core/assets/shaders/unitarmor.frag | 9 +- core/src/mindustry/content/Blocks.java | 2 +- core/src/mindustry/content/UnitTypes.java | 23 ++- .../mindustry/entities/abilities/Ability.java | 5 + .../entities/abilities/ForceFieldAbility.java | 4 +- .../abilities/ShieldSectorAbility.java | 132 ++++++++++++++++++ .../src/mindustry/entities/comp/UnitComp.java | 22 ++- core/src/mindustry/io/TypeIO.java | 26 ++++ core/src/mindustry/maps/SectorDamage.java | 3 +- core/src/mindustry/type/UnitType.java | 13 +- gradle.properties | 2 +- tests/src/test/java/ApplicationTests.java | 11 +- 37 files changed, 237 insertions(+), 38 deletions(-) create mode 100644 annotations/src/main/resources/revisions/alpha/3.json create mode 100644 annotations/src/main/resources/revisions/arkyid/3.json create mode 100644 annotations/src/main/resources/revisions/beta/3.json create mode 100644 annotations/src/main/resources/revisions/block/7.json create mode 100644 annotations/src/main/resources/revisions/corvus/7.json create mode 100644 annotations/src/main/resources/revisions/flare/7.json create mode 100644 annotations/src/main/resources/revisions/gamma/3.json create mode 100644 annotations/src/main/resources/revisions/mace/7.json create mode 100644 annotations/src/main/resources/revisions/manifold/1.json create mode 100644 annotations/src/main/resources/revisions/mega/5.json create mode 100644 annotations/src/main/resources/revisions/missile/1.json create mode 100644 annotations/src/main/resources/revisions/mono/6.json create mode 100644 annotations/src/main/resources/revisions/nova/5.json create mode 100644 annotations/src/main/resources/revisions/oct/5.json create mode 100644 annotations/src/main/resources/revisions/poly/5.json create mode 100644 annotations/src/main/resources/revisions/pulsar/3.json create mode 100644 annotations/src/main/resources/revisions/quad/6.json create mode 100644 annotations/src/main/resources/revisions/quasar/3.json create mode 100644 annotations/src/main/resources/revisions/risso/7.json create mode 100644 annotations/src/main/resources/revisions/scuttler/1.json create mode 100644 annotations/src/main/resources/revisions/spiroct/6.json create mode 100644 annotations/src/main/resources/revisions/toxopid/3.json create mode 100644 annotations/src/main/resources/revisions/vanquish/1.json delete mode 100644 core/assets-raw/sprites/units/bulwark-armor.png create mode 100644 core/assets-raw/sprites/units/bulwark-shield.png create mode 100644 core/src/mindustry/entities/abilities/ShieldSectorAbility.java diff --git a/annotations/src/main/resources/revisions/alpha/3.json b/annotations/src/main/resources/revisions/alpha/3.json new file mode 100644 index 0000000000..08d96484d6 --- /dev/null +++ b/annotations/src/main/resources/revisions/alpha/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/arkyid/3.json b/annotations/src/main/resources/revisions/arkyid/3.json new file mode 100644 index 0000000000..08d96484d6 --- /dev/null +++ b/annotations/src/main/resources/revisions/arkyid/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/beta/3.json b/annotations/src/main/resources/revisions/beta/3.json new file mode 100644 index 0000000000..08d96484d6 --- /dev/null +++ b/annotations/src/main/resources/revisions/beta/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/block/7.json b/annotations/src/main/resources/revisions/block/7.json new file mode 100644 index 0000000000..b4cd846ead --- /dev/null +++ b/annotations/src/main/resources/revisions/block/7.json @@ -0,0 +1 @@ +{version:7,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/corvus/7.json b/annotations/src/main/resources/revisions/corvus/7.json new file mode 100644 index 0000000000..b4cd846ead --- /dev/null +++ b/annotations/src/main/resources/revisions/corvus/7.json @@ -0,0 +1 @@ +{version:7,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/flare/7.json b/annotations/src/main/resources/revisions/flare/7.json new file mode 100644 index 0000000000..b4cd846ead --- /dev/null +++ b/annotations/src/main/resources/revisions/flare/7.json @@ -0,0 +1 @@ +{version:7,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/gamma/3.json b/annotations/src/main/resources/revisions/gamma/3.json new file mode 100644 index 0000000000..08d96484d6 --- /dev/null +++ b/annotations/src/main/resources/revisions/gamma/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mace/7.json b/annotations/src/main/resources/revisions/mace/7.json new file mode 100644 index 0000000000..e8abc2e3be --- /dev/null +++ b/annotations/src/main/resources/revisions/mace/7.json @@ -0,0 +1 @@ +{version:7,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/manifold/1.json b/annotations/src/main/resources/revisions/manifold/1.json new file mode 100644 index 0000000000..eefe4cfceb --- /dev/null +++ b/annotations/src/main/resources/revisions/manifold/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:building,type:Building},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mega/5.json b/annotations/src/main/resources/revisions/mega/5.json new file mode 100644 index 0000000000..e5d22a0653 --- /dev/null +++ b/annotations/src/main/resources/revisions/mega/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/missile/1.json b/annotations/src/main/resources/revisions/missile/1.json new file mode 100644 index 0000000000..689e36ee9f --- /dev/null +++ b/annotations/src/main/resources/revisions/missile/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:lifetime,type:float},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:time,type:float},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mono/6.json b/annotations/src/main/resources/revisions/mono/6.json new file mode 100644 index 0000000000..5ddc80cf2d --- /dev/null +++ b/annotations/src/main/resources/revisions/mono/6.json @@ -0,0 +1 @@ +{version:6,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/nova/5.json b/annotations/src/main/resources/revisions/nova/5.json new file mode 100644 index 0000000000..63fac31e77 --- /dev/null +++ b/annotations/src/main/resources/revisions/nova/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/oct/5.json b/annotations/src/main/resources/revisions/oct/5.json new file mode 100644 index 0000000000..e5d22a0653 --- /dev/null +++ b/annotations/src/main/resources/revisions/oct/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/poly/5.json b/annotations/src/main/resources/revisions/poly/5.json new file mode 100644 index 0000000000..9a3af67f08 --- /dev/null +++ b/annotations/src/main/resources/revisions/poly/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/pulsar/3.json b/annotations/src/main/resources/revisions/pulsar/3.json new file mode 100644 index 0000000000..c0289fcd5b --- /dev/null +++ b/annotations/src/main/resources/revisions/pulsar/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quad/6.json b/annotations/src/main/resources/revisions/quad/6.json new file mode 100644 index 0000000000..68d261dd6c --- /dev/null +++ b/annotations/src/main/resources/revisions/quad/6.json @@ -0,0 +1 @@ +{version:6,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quasar/3.json b/annotations/src/main/resources/revisions/quasar/3.json new file mode 100644 index 0000000000..c0289fcd5b --- /dev/null +++ b/annotations/src/main/resources/revisions/quasar/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/risso/7.json b/annotations/src/main/resources/revisions/risso/7.json new file mode 100644 index 0000000000..b4cd846ead --- /dev/null +++ b/annotations/src/main/resources/revisions/risso/7.json @@ -0,0 +1 @@ +{version:7,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/scuttler/1.json b/annotations/src/main/resources/revisions/scuttler/1.json new file mode 100644 index 0000000000..f9d944421e --- /dev/null +++ b/annotations/src/main/resources/revisions/scuttler/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/spiroct/6.json b/annotations/src/main/resources/revisions/spiroct/6.json new file mode 100644 index 0000000000..5ddc80cf2d --- /dev/null +++ b/annotations/src/main/resources/revisions/spiroct/6.json @@ -0,0 +1 @@ +{version:6,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/toxopid/3.json b/annotations/src/main/resources/revisions/toxopid/3.json new file mode 100644 index 0000000000..08d96484d6 --- /dev/null +++ b/annotations/src/main/resources/revisions/toxopid/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/vanquish/1.json b/annotations/src/main/resources/revisions/vanquish/1.json new file mode 100644 index 0000000000..f9d944421e --- /dev/null +++ b/annotations/src/main/resources/revisions/vanquish/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:abilities,type:"mindustry.entities.abilities.Ability[]"},{name:ammo,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:vel,type:arc.math.geom.Vec2},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/core/assets-raw/sprites/units/bulwark-armor.png b/core/assets-raw/sprites/units/bulwark-armor.png deleted file mode 100644 index 1057bdee6707874ef1e7b53254fa819e4eae8a86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1393 zcmaKs`#%#30L2x}Vrs)oLYYfU$|FT+ZHB14-+9hEZKPzML^r~^o5#(oOv!s~-tAh$ zblv7-@|^cuh&!*DSCZtqf55%x^Ev1H%Q?TEXLdH0QW6RhA|fJER@X2N2aG>(ArNqo zDOJ$+101^NV2Ku~>{4715jmn|g+VzH@>cRjo)_tW%x~`RBZHNLJk1Ch}s9d9W)zHrBtYPW*xA^m_V^REE#;1_={*}N$de^vGMK8r9 zD(2-#sj96NouO_!;r*bFj|uBV*tR(`nTJ)B?7AA*Rx!0D_*I#ggQo<5tPMd(ui(zx zv0Y5vRx(|8uF;snple6Pa3#W}ef$s2k)A&dp^V8wTOk5d&&RJ1N)`pP=ZC6w84&!(E22WSz z#21E;JVN)Zaf=_N1$*u2Hw#Iwc4-p-=`uKD4o2d^spZNPTxpWMq4j>dtK^fS&HZ9` z)s9Cb`Mrs0a@yotV^Iu7M>Fq7Pw9+I?b1HdYw8}ZegFE)RiE>!xMRiz4w3Y}qC?23 zXvJ3E;`Y`kPxW@-zK1;2g|C3xyI^A4Y1-^kH-O$0oVkPHFML~+H0o|TX8?bc0kmFN zGVAAljvEx>;D)mU(K#*Hix5oziLT)e1c2$<;SJ~GieQPIWNd`HDuMK7C`b!IIWYv9 zM-#!#L|iy!gp)pB-i&oqVoml1m9_{gz}{!dUsX#tFUKlhWY6qowlmRoP3De`^z&*z zJI81B4x|-4n>ODUUON z2sT#eO<}DnG}((~-H_yJh1R77KafSKg-yj7W%>DpL8#QC3EKct6zxmq&5sp8$Ea)=d!1886rW;>r z;!APV$h-KmP>c{!9KyQP0JN@Iwd`hBuwrE6bATSBZYVM6L8nFd4Mj}!f8&3_GHtB& zp(xxfdD4^JaAlbQV{{0HOYs(BtQRzn0viJP67ZgZ|Dujbr$BUzcM3o~dRswj&$5|L zz?S4}!Zs152lteM18#ZD;4Z@(^&bU;b%%ST!*dMK$B8J?+(P9}jV`vwHud?b+TJ$ngLzotX1g^=J;g%ov^5A4=T21dauyiZW>=ekFOf@N)PR(} zN}B;bWMb1}*R$D0ynr9-Gh`0yES!7UAg@iDuBC~LS5m>&$g^+R*CvADGPNZ6UWo#O zKTk;4Jg9Vu~e010XLOE{&+ayXPusv7T5am9N57ifmZh@B;GpH`r(Oy-qX|K(7v>oLprsoo!-VgA+63-H+IN*(*95DcKjoTx6)n3hN6E zX=o#wjXuNBiJk5^l0vgfJv(^QU2R-unD=>N#Ex0U@Uyy{jL?44Dc1vytt`GzTi2|1 u7p*VsF8Kw9*38XMTnjSKKlI-Z_gpB>l#Mtk2WjK|Te32@!BnDsEakt zG3V`_yLpEdc-R80-u{i>x!Y-$T4|%mhK0{#(l>s*K3^wMn-!=L4jTMFcjP@d_4#Mb zH<|wxHf`%Pcm2y)Is3J2nQ7LGi(k_{Zr`|@82+BmcGo{0&DmAuH?H1Y=ze{^=9-0p z&U-Iee_2z@yIMN1QVV)y2M5r?uKWU2;e++3m$)e~mXA-P+}T zX-qUzc9t(wN<43>_2t6zV_zf%t6n^IzE}L5^}=7~L+6&7f0=T=>*ZzPU*WGCt=sP! zP3YMj9Q8G2a#8XDkNwRxTl=OZmtFXBXrI-CEsTF+{ZAWO@8q(5sy9LKUvx!mIFS1* zKURMG13C3`3w|!j6?e{e&Z|-UekxG@!O|lo3VAh+)JrdQSG~{Rz&{Jn!0J_tE?S?&S!6hcW>zp)s5~}PI>#< s>(#SW)7Bmp-1H44cHz;Cg>gW$jv-c7Br{e#?HEYf)78&qol`;+04(nxvj6}9 literal 0 HcmV?d00001 diff --git a/core/assets/shaders/unitarmor.frag b/core/assets/shaders/unitarmor.frag index ae0a445bea..10116ff3ac 100644 --- a/core/assets/shaders/unitarmor.frag +++ b/core/assets/shaders/unitarmor.frag @@ -17,14 +17,7 @@ void main(){ vec4 c = texture2D(u_texture, v_texCoords); c.a *= u_progress; - - if(c.a > 0.01){ - float f = step(abs(sin(coords.y*3.0 + u_time)), 0.9); - c.a *= f; - //c.rgb = mix(c.rgb, u_color.rgb, f * u_color.a); - } - - // c.a *= (1.0-coords.y); + c.a *= step(abs(sin(coords.y*3.0 + u_time)), 0.9); gl_FragColor = c * v_color; } diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 3436c3fad6..bbcfe219bd 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -3066,7 +3066,7 @@ public class Blocks{ ammo( //TODO 1 more ammo type, decide on base type - Items.fissileMatter, new ArtilleryBulletType(2.5f, 100, "shell"){{ + Items.fissileMatter, new ArtilleryBulletType(2.5f, 300, "shell"){{ hitEffect = new MultiEffect(Fx.titanExplosion, Fx.titanSmoke); despawnEffect = Fx.none; knockback = 2f; diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index c4c5bfd7d3..90509a3c16 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -2503,16 +2503,25 @@ public class UnitTypes{ bulwark = new UnitType("bulwark"){{ drag = 0.1f; speed = 0.62f; - hitSize = 23f; - health = 8000; - armor = 6f; + hitSize = 19f; + health = 7300; + armor = 5f; outlineColor = Pal.darkOutline; envDisabled = Env.space; - //TODO shield ability looks bad - //abilities.add(new ArmorPlateAbility()); + //new ForceFieldAbility(60f, 0.3f, 400f, 60f * 6); + abilities.add(new ShieldSectorAbility(){{ + region = "bulwark-shield"; + radius = 34f; + sectorAngle = 85f; + regen = 0.4f; + cooldown = 60f * 8f; + max = 1500f; + y = -20f; + width = 6f; + }}); - rotateSpeed = 2.7f; + rotateSpeed = 2.2f; legCount = 4; legLength = 15f; @@ -2554,7 +2563,7 @@ public class UnitTypes{ homingPower = 0.2f; weaveMag = 4; weaveScale = 4; - lifetime = 60f; + lifetime = 55f; //TODO better shootEffect = Fx.shootBig2; smokeEffect = Fx.shootSmokeTitan; diff --git a/core/src/mindustry/entities/abilities/Ability.java b/core/src/mindustry/entities/abilities/Ability.java index 433563d70b..140a6d6e1a 100644 --- a/core/src/mindustry/entities/abilities/Ability.java +++ b/core/src/mindustry/entities/abilities/Ability.java @@ -3,11 +3,16 @@ package mindustry.entities.abilities; import arc.*; import arc.scene.ui.layout.*; import mindustry.gen.*; +import mindustry.type.*; public abstract class Ability implements Cloneable{ + //the one and only data variable that is synced. + public float data; + public void update(Unit unit){} public void draw(Unit unit){} public void death(Unit unit){} + public void init(UnitType type){} public Ability copy(){ try{ diff --git a/core/src/mindustry/entities/abilities/ForceFieldAbility.java b/core/src/mindustry/entities/abilities/ForceFieldAbility.java index 86858f6456..2a95adb4b2 100644 --- a/core/src/mindustry/entities/abilities/ForceFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ForceFieldAbility.java @@ -1,6 +1,5 @@ package mindustry.entities.abilities; -import arc.*; import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; @@ -8,6 +7,7 @@ import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; import arc.util.*; +import mindustry.*; import mindustry.content.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -84,7 +84,7 @@ public class ForceFieldAbility extends Ability{ Draw.color(unit.team.color, Color.white, Mathf.clamp(alpha)); - if(Core.settings.getBool("animatedshields")){ + if(Vars.renderer.animateShields){ Fill.poly(unit.x, unit.y, 6, realRad); }else{ Lines.stroke(1.5f); diff --git a/core/src/mindustry/entities/abilities/ShieldSectorAbility.java b/core/src/mindustry/entities/abilities/ShieldSectorAbility.java new file mode 100644 index 0000000000..7c269665e4 --- /dev/null +++ b/core/src/mindustry/entities/abilities/ShieldSectorAbility.java @@ -0,0 +1,132 @@ +package mindustry.entities.abilities; + +import arc.func.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.ui.layout.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; + +public class ShieldSectorAbility extends Ability{ + private static Unit paramUnit; + private static ShieldSectorAbility paramField; + private static Vec2 paramPos = new Vec2(); + private static final Cons shieldConsumer = b -> { + if(b.team != paramUnit.team && b.type.absorbable && paramField.data > 0 && + !paramPos.within(b, paramField.radius + paramField.width/2f) && + Tmp.v1.set(b).add(b.vel).within(paramPos, paramField.radius + paramField.width/2f) && + Angles.within(paramPos.angleTo(b), paramUnit.rotation + paramField.angleOffset, paramField.sectorAngle / 2f)){ + + b.absorb(); + Fx.absorb.at(b); + + //break shield + if(paramField.data <= b.damage()){ + paramField.data -= paramField.cooldown * paramField.regen; + + //TODO fx + } + + paramField.data -= b.damage(); + paramField.alpha = 1f; + } + }; + + /** Shield radius. */ + public float radius = 60f; + /** Shield regen speed in damage/tick. */ + public float regen = 0.1f; + /** Maximum shield. */ + public float max = 200f; + /** Cooldown after the shield is broken, in ticks. */ + public float cooldown = 60f * 5; + /** Angle of shield sector. */ + public float sectorAngle = 80f; + /** Offset parameters for shield. */ + public float angleOffset = 0f, x = 0f, y = 0f; + /** If true, only activates when shooting. */ + public boolean whenShooting = true; + /** Width of shield line. */ + public float width = 6f; + + /** Whether to draw the sector line. */ + public boolean drawSector = true; + /** If not null, will be drawn on top. */ + public @Nullable String region; + /** If true, sprite position will be influenced by x/y. */ + public boolean offsetRegion = false; + + /** State. */ + protected float widthScale, alpha; + + @Override + public void update(Unit unit){ + if(data < max){ + data += Time.delta * regen; + } + + boolean active = data > 0 && (unit.isShooting || !whenShooting); + alpha = Math.max(alpha - Time.delta/10f, 0f); + + if(active){ + widthScale = Mathf.lerpDelta(widthScale, 1f, 0.06f); + paramUnit = unit; + paramField = this; + paramPos.set(x, y).rotate(unit.rotation - 90f).add(unit); + + Groups.bullet.intersect(unit.x - radius, unit.y - radius, radius * 2f, radius * 2f, shieldConsumer); + }else{ + widthScale = Mathf.lerpDelta(widthScale, 0f, 0.11f); + } + } + + @Override + public void init(UnitType type){ + data = max; + } + + @Override + public void draw(Unit unit){ + + if(widthScale > 0.001f){ + Draw.z(Layer.shields); + + Draw.color(unit.team.color, Color.white, Mathf.clamp(alpha)); + var pos = paramPos.set(x, y).rotate(unit.rotation - 90f).add(unit); + + if(Vars.renderer.animateShields){ + if(region != null){ + Vec2 rp = offsetRegion ? pos : Tmp.v1.set(unit); + Draw.yscl = widthScale; + Draw.rect(region, rp.x, rp.y, unit.rotation - 90); + Draw.yscl = 1f; + } + + if(drawSector){ + Lines.stroke(width * widthScale); + Lines.swirl(pos.x, pos.y, radius, sectorAngle / 360f, unit.rotation + angleOffset - sectorAngle / 2f); + } + }else{ + //TODO + Lines.stroke(1.5f); + Draw.alpha(0.09f); + Fill.poly(pos.x, pos.y, 6, radius); + Draw.alpha(1f); + Lines.poly(pos.x, pos.y, 6, radius); + } + Draw.reset(); + } + } + + @Override + public void displayBars(Unit unit, Table bars){ + bars.add(new Bar("stat.shieldhealth", Pal.accent, () -> data / max)).row(); + } +} diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index bad2fbe16d..adbf8b349f 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -6,7 +6,6 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; -import arc.struct.*; import arc.util.*; import mindustry.ai.*; import mindustry.ai.types.*; @@ -43,6 +42,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Import WeaponMount[] mounts; private UnitController controller; + Ability[] abilities = {}; UnitType type = UnitTypes.alpha; boolean spawnedByCore; double flag; @@ -50,7 +50,6 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I transient @Nullable Trail trail; transient float shadowAlpha = -1f; - transient Seq abilities = new Seq<>(0); transient float healTime; private transient float resupplyTime = Mathf.random(10f); private transient boolean wasPlayer; @@ -308,8 +307,11 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I if(controller == null) controller(type.createController()); if(mounts().length != type.weapons.size) setupWeapons(type); - if(abilities.size != type.abilities.size){ - abilities = type.abilities.map(Ability::copy); + if(abilities.length != type.abilities.size){ + abilities = new Ability[type.abilities.size]; + for(int i = 0; i < type.abilities.size; i ++){ + abilities[i] = type.abilities.get(i).copy(); + } } } @@ -393,10 +395,8 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } } - if(abilities.size > 0){ - for(Ability a : abilities){ - a.update(self()); - } + for(Ability a : abilities){ + a.update(self()); } if(trail != null){ @@ -546,10 +546,8 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } } - if(abilities.size > 0){ - for(Ability a : abilities){ - a.death(self()); - } + for(Ability a : abilities){ + a.death(self()); } remove(); diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index 82589e9571..d886dce04c 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -11,6 +11,7 @@ import mindustry.annotations.Annotations.*; import mindustry.content.TechTree.*; import mindustry.ctype.*; import mindustry.entities.*; +import mindustry.entities.abilities.*; import mindustry.entities.bullet.*; import mindustry.entities.units.*; import mindustry.game.*; @@ -187,6 +188,31 @@ public class TypeIO{ return noMounts; } + public static Ability[] readAbilities(Reads read, Ability[] abilities){ + byte len = read.b(); + for(int i = 0; i < len; i++){ + float data = read.f(); + if(abilities.length > i){ + abilities[i].data = data; + } + } + return abilities; + } + + public static void writeAbilities(Writes write, Ability[] abilities){ + write.b(abilities.length); + for(var a : abilities){ + write.f(a.data); + } + } + + static final Ability[] noAbilities = {}; + + public static Ability[] readAbilities(Reads read){ + read.skip(read.b()); + return noAbilities; + } + public static void writeUnit(Writes write, Unit unit){ write.b(unit == null || unit.isNull() ? 0 : unit instanceof BlockUnitc ? 1 : 2); diff --git a/core/src/mindustry/maps/SectorDamage.java b/core/src/mindustry/maps/SectorDamage.java index 6c0b95ff53..c5bf8291f4 100644 --- a/core/src/mindustry/maps/SectorDamage.java +++ b/core/src/mindustry/maps/SectorDamage.java @@ -3,6 +3,7 @@ package mindustry.maps; import arc.math.*; import arc.math.geom.*; import arc.struct.*; +import arc.util.*; import mindustry.ai.*; import mindustry.content.*; import mindustry.entities.*; @@ -318,7 +319,7 @@ public class SectorDamage{ if(unit.team == state.rules.defaultTeam){ sumHealth += unit.health*healthMult + unit.shield; sumDps += unit.type.dpsEstimate; - if(unit.abilities.find(a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){ + if(Structs.find(unit.abilities, a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){ sumRps += h.amount / h.reload * 60f; } }else{ diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 59a21e1fb6..57a9604607 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -243,6 +243,7 @@ public class UnitType extends UnlockableContent{ table.table(bars -> { bars.defaults().growX().height(20f).pad(4); + //TODO overlay shields bars.add(new Bar("stat.health", Pal.health, unit::healthf).blink(Color.white)); bars.row(); @@ -456,6 +457,10 @@ public class UnitType extends UnlockableContent{ }).layer(Layer.debris); } + for(Ability ab : abilities){ + ab.init(this); + } + canHeal = weapons.contains(w -> w.bullet.heals()); //add mirrored weapon variants @@ -770,11 +775,9 @@ public class UnitType extends UnlockableContent{ Draw.z(z); } - if(unit.abilities.size > 0){ - for(Ability a : unit.abilities){ - Draw.reset(); - a.draw(unit); - } + for(Ability a : unit.abilities){ + Draw.reset(); + a.draw(unit); } Draw.reset(); diff --git a/gradle.properties b/gradle.properties index 5bea7a893f..4f69364ebc 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=a5df968996 +archash=390397fbb9 diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 479925a433..2cb796e7d3 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -350,14 +350,23 @@ public class ApplicationTests{ } @Test - void load(){ + void saveLoad(){ world.loadMap(testMap); Map map = state.map; + float hp = 30f; + + Unit unit = UnitTypes.dagger.spawn(Team.sharded, 20f, 30f); + unit.health = hp; + SaveIO.save(saveDirectory.child("0.msav")); resetWorld(); SaveIO.load(saveDirectory.child("0.msav")); + Unit spawned = Groups.unit.find(u -> u.type == UnitTypes.dagger); + assertNotNull(spawned, "Saved daggers must persist"); + assertEquals(hp, spawned.health, "Spawned dagger health must save."); + assertEquals(world.width(), map.width); assertEquals(world.height(), map.height); assertTrue(state.teams.playerCores().size > 0);