Merge branch 'master' into ThePythonGuy3-patch-1
1
annotations/src/main/resources/revisions/alpha/1.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:1,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/arkyid/1.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:1,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/beta/1.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:1,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/block/5.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:5,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/corvus/5.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:5,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/flare/5.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:5,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/gamma/1.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:1,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/mace/5.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:5,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/mega/3.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:3,fields:[{name:ammo,type:float},{name:armor,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<mindustry.world.blocks.payloads.Payload>},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/mono/4.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:4,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/nova/3.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:3,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/oct/3.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:3,fields:[{name:ammo,type:float},{name:armor,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<mindustry.world.blocks.payloads.Payload>},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/poly/3.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:3,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/pulsar/1.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:1,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/quad/4.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:4,fields:[{name:ammo,type:float},{name:armor,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<mindustry.world.blocks.payloads.Payload>},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/quasar/1.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:1,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/risso/5.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:5,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/spiroct/4.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:4,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
1
annotations/src/main/resources/revisions/toxopid/1.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{version:1,fields:[{name:ammo,type:float},{name:armor,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<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]}
|
||||||
|
Before Width: | Height: | Size: 300 B After Width: | Height: | Size: 300 B |
BIN
core/assets-raw/sprites/blocks/drills/drill-item-3.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
core/assets-raw/sprites/blocks/drills/drill-item-4.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 675 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 819 B After Width: | Height: | Size: 755 B |
|
Before Width: | Height: | Size: 688 B After Width: | Height: | Size: 608 B |
|
Before Width: | Height: | Size: 868 B After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 845 B After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 502 B After Width: | Height: | Size: 623 B |
|
Before Width: | Height: | Size: 371 B After Width: | Height: | Size: 381 B |
|
Before Width: | Height: | Size: 467 B After Width: | Height: | Size: 660 B |
|
Before Width: | Height: | Size: 470 B After Width: | Height: | Size: 661 B |
|
Before Width: | Height: | Size: 266 B After Width: | Height: | Size: 329 B |
|
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 307 B |
|
Before Width: | Height: | Size: 249 B After Width: | Height: | Size: 311 B |
|
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 232 B |
|
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 218 B |
BIN
core/assets-raw/sprites/blocks/walls/thruster-top.png
Normal file
|
After Width: | Height: | Size: 763 B |
|
Before Width: | Height: | Size: 683 B After Width: | Height: | Size: 612 B |
@@ -705,6 +705,7 @@ stat.commandlimit = Command Limit
|
|||||||
stat.abilities = Abilities
|
stat.abilities = Abilities
|
||||||
stat.canboost = Can Boost
|
stat.canboost = Can Boost
|
||||||
stat.flying = Flying
|
stat.flying = Flying
|
||||||
|
stat.ammouse = Ammo Use
|
||||||
|
|
||||||
ability.forcefield = Force Field
|
ability.forcefield = Force Field
|
||||||
ability.repairfield = Repair Field
|
ability.repairfield = Repair Field
|
||||||
@@ -727,7 +728,6 @@ bar.powerlines = Connections: {0}/{1}
|
|||||||
bar.items = Items: {0}
|
bar.items = Items: {0}
|
||||||
bar.capacity = Capacity: {0}
|
bar.capacity = Capacity: {0}
|
||||||
bar.unitcap = {0} {1}/{2}
|
bar.unitcap = {0} {1}/{2}
|
||||||
bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled]
|
|
||||||
bar.liquid = Liquid
|
bar.liquid = Liquid
|
||||||
bar.heat = Heat
|
bar.heat = Heat
|
||||||
bar.power = Power
|
bar.power = Power
|
||||||
@@ -744,6 +744,7 @@ bullet.sapping = [stat]sapping
|
|||||||
bullet.homing = [stat]homing
|
bullet.homing = [stat]homing
|
||||||
bullet.shock = [stat]shock
|
bullet.shock = [stat]shock
|
||||||
bullet.frag = [stat]frag
|
bullet.frag = [stat]frag
|
||||||
|
bullet.buildingdamage = [stat]{0}%[lightgray] building damage
|
||||||
bullet.knockback = [stat]{0}[lightgray] knockback
|
bullet.knockback = [stat]{0}[lightgray] knockback
|
||||||
bullet.pierce = [stat]{0}[lightgray]x pierce
|
bullet.pierce = [stat]{0}[lightgray]x pierce
|
||||||
bullet.infinitepierce = [stat]pierce
|
bullet.infinitepierce = [stat]pierce
|
||||||
@@ -772,6 +773,7 @@ unit.items = items
|
|||||||
unit.thousands = k
|
unit.thousands = k
|
||||||
unit.millions = mil
|
unit.millions = mil
|
||||||
unit.billions = b
|
unit.billions = b
|
||||||
|
unit.pershot = /shot
|
||||||
category.purpose = Purpose
|
category.purpose = Purpose
|
||||||
category.general = General
|
category.general = General
|
||||||
category.power = Power
|
category.power = Power
|
||||||
@@ -841,6 +843,7 @@ setting.bridgeopacity.name = Bridge Opacity
|
|||||||
setting.playerchat.name = Display Player Bubble Chat
|
setting.playerchat.name = Display Player Bubble Chat
|
||||||
setting.showweather.name = Show Weather Graphics
|
setting.showweather.name = Show Weather Graphics
|
||||||
public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility.
|
public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility.
|
||||||
|
public.confirm.really = If you want to play with friends, use [green]Invite Friend[] instead of a [scarlet]Public server[]!\nAre you sure you want to make your game [scarlet]public[]?
|
||||||
public.beta = Note that beta versions of the game cannot make public lobbies.
|
public.beta = Note that beta versions of the game cannot make public lobbies.
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
@@ -963,6 +966,7 @@ rules.explosions = Block/Unit Explosion Damage
|
|||||||
rules.ambientlight = Ambient Light
|
rules.ambientlight = Ambient Light
|
||||||
rules.weather = Weather
|
rules.weather = Weather
|
||||||
rules.weather.frequency = Frequency:
|
rules.weather.frequency = Frequency:
|
||||||
|
rules.weather.always = Always
|
||||||
rules.weather.duration = Duration:
|
rules.weather.duration = Duration:
|
||||||
|
|
||||||
content.item.name = Items
|
content.item.name = Items
|
||||||
@@ -1168,7 +1172,7 @@ block.item-void.name = Item Void
|
|||||||
block.liquid-source.name = Liquid Source
|
block.liquid-source.name = Liquid Source
|
||||||
block.liquid-void.name = Liquid Void
|
block.liquid-void.name = Liquid Void
|
||||||
block.power-void.name = Power Void
|
block.power-void.name = Power Void
|
||||||
block.power-source.name = Power Infinite
|
block.power-source.name = Power Source
|
||||||
block.unloader.name = Unloader
|
block.unloader.name = Unloader
|
||||||
block.vault.name = Vault
|
block.vault.name = Vault
|
||||||
block.wave.name = Wave
|
block.wave.name = Wave
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Baltazár Radics
|
|||||||
Dexapnow
|
Dexapnow
|
||||||
Milinai
|
Milinai
|
||||||
키에르
|
키에르
|
||||||
Luxray5474
|
skybldev
|
||||||
Leone25
|
Leone25
|
||||||
Gureumi
|
Gureumi
|
||||||
VizardAlpha
|
VizardAlpha
|
||||||
|
|||||||
@@ -876,7 +876,7 @@ public class Blocks implements ContentList{
|
|||||||
size = 4;
|
size = 4;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
thruster = new Wall("thruster"){{
|
thruster = new Thruster("thruster"){{
|
||||||
health = 55 * 16 * wallHealthMultiplier;
|
health = 55 * 16 * wallHealthMultiplier;
|
||||||
size = 4;
|
size = 4;
|
||||||
}};
|
}};
|
||||||
@@ -989,9 +989,9 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
itemBridge = new BufferedItemBridge("bridge-conveyor"){{
|
itemBridge = new BufferedItemBridge("bridge-conveyor"){{
|
||||||
requirements(Category.distribution, with(Items.lead, 4, Items.copper, 4));
|
requirements(Category.distribution, with(Items.lead, 6, Items.copper, 6));
|
||||||
range = 4;
|
range = 4;
|
||||||
speed = 70f;
|
speed = 74f;
|
||||||
bufferCapacity = 14;
|
bufferCapacity = 14;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -1265,7 +1265,7 @@ public class Blocks implements ContentList{
|
|||||||
tier = 2;
|
tier = 2;
|
||||||
drillTime = 600;
|
drillTime = 600;
|
||||||
size = 2;
|
size = 2;
|
||||||
drawMineItem = true;
|
|
||||||
consumes.liquid(Liquids.water, 0.05f).boost();
|
consumes.liquid(Liquids.water, 0.05f).boost();
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -1274,7 +1274,7 @@ public class Blocks implements ContentList{
|
|||||||
tier = 3;
|
tier = 3;
|
||||||
drillTime = 400;
|
drillTime = 400;
|
||||||
size = 2;
|
size = 2;
|
||||||
drawMineItem = true;
|
|
||||||
consumes.liquid(Liquids.water, 0.06f).boost();
|
consumes.liquid(Liquids.water, 0.06f).boost();
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -1763,7 +1763,7 @@ public class Blocks implements ContentList{
|
|||||||
despawnEffect = Fx.instBomb;
|
despawnEffect = Fx.instBomb;
|
||||||
trailSpacing = 20f;
|
trailSpacing = 20f;
|
||||||
damage = 1350;
|
damage = 1350;
|
||||||
tileDamageMultiplier = 0.3f;
|
buildingDamageMultiplier = 0.3f;
|
||||||
speed = brange;
|
speed = brange;
|
||||||
hitShake = 6f;
|
hitShake = 6f;
|
||||||
ammoMultiplier = 1f;
|
ammoMultiplier = 1f;
|
||||||
@@ -1992,6 +1992,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
powerSource = new PowerSource("power-source"){{
|
powerSource = new PowerSource("power-source"){{
|
||||||
requirements(Category.power, BuildVisibility.sandboxOnly, with());
|
requirements(Category.power, BuildVisibility.sandboxOnly, with());
|
||||||
|
powerProduction = 10000f / 60f;
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|||||||
@@ -465,6 +465,7 @@ public class Bullets implements ContentList{
|
|||||||
speed = 4f;
|
speed = 4f;
|
||||||
knockback = 1.7f;
|
knockback = 1.7f;
|
||||||
puddleSize = 8f;
|
puddleSize = 8f;
|
||||||
|
orbSize = 4f;
|
||||||
drag = 0.001f;
|
drag = 0.001f;
|
||||||
ammoMultiplier = 0.4f;
|
ammoMultiplier = 0.4f;
|
||||||
statusDuration = 60f * 4f;
|
statusDuration = 60f * 4f;
|
||||||
@@ -476,6 +477,7 @@ public class Bullets implements ContentList{
|
|||||||
speed = 4f;
|
speed = 4f;
|
||||||
knockback = 1.3f;
|
knockback = 1.3f;
|
||||||
puddleSize = 8f;
|
puddleSize = 8f;
|
||||||
|
orbSize = 4f;
|
||||||
drag = 0.001f;
|
drag = 0.001f;
|
||||||
ammoMultiplier = 0.4f;
|
ammoMultiplier = 0.4f;
|
||||||
statusDuration = 60f * 4f;
|
statusDuration = 60f * 4f;
|
||||||
@@ -487,6 +489,7 @@ public class Bullets implements ContentList{
|
|||||||
speed = 4f;
|
speed = 4f;
|
||||||
knockback = 1.3f;
|
knockback = 1.3f;
|
||||||
puddleSize = 8f;
|
puddleSize = 8f;
|
||||||
|
orbSize = 4f;
|
||||||
damage = 4.75f;
|
damage = 4.75f;
|
||||||
drag = 0.001f;
|
drag = 0.001f;
|
||||||
ammoMultiplier = 0.4f;
|
ammoMultiplier = 0.4f;
|
||||||
@@ -498,6 +501,7 @@ public class Bullets implements ContentList{
|
|||||||
speed = 4f;
|
speed = 4f;
|
||||||
knockback = 1.3f;
|
knockback = 1.3f;
|
||||||
puddleSize = 8f;
|
puddleSize = 8f;
|
||||||
|
orbSize = 4f;
|
||||||
drag = 0.001f;
|
drag = 0.001f;
|
||||||
ammoMultiplier = 0.4f;
|
ammoMultiplier = 0.4f;
|
||||||
statusDuration = 60f * 4f;
|
statusDuration = 60f * 4f;
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ public class UnitTypes implements ContentList{
|
|||||||
lightningLength = 6;
|
lightningLength = 6;
|
||||||
lightningColor = Pal.surge;
|
lightningColor = Pal.surge;
|
||||||
//standard bullet damage is far too much for lightning
|
//standard bullet damage is far too much for lightning
|
||||||
lightningDamage = 30;
|
lightningDamage = 20;
|
||||||
}};
|
}};
|
||||||
}},
|
}},
|
||||||
|
|
||||||
@@ -336,7 +336,7 @@ public class UnitTypes implements ContentList{
|
|||||||
|
|
||||||
bullet = new LightningBulletType(){{
|
bullet = new LightningBulletType(){{
|
||||||
lightningColor = hitColor = Pal.heal;
|
lightningColor = hitColor = Pal.heal;
|
||||||
damage = 15f;
|
damage = 12f;
|
||||||
lightningLength = 7;
|
lightningLength = 7;
|
||||||
lightningLengthRand = 7;
|
lightningLengthRand = 7;
|
||||||
shootEffect = Fx.shootHeal;
|
shootEffect = Fx.shootHeal;
|
||||||
@@ -1759,7 +1759,7 @@ public class UnitTypes implements ContentList{
|
|||||||
lifetime = 60f;
|
lifetime = 60f;
|
||||||
shootEffect = Fx.shootSmall;
|
shootEffect = Fx.shootSmall;
|
||||||
smokeEffect = Fx.shootSmallSmoke;
|
smokeEffect = Fx.shootSmallSmoke;
|
||||||
tileDamageMultiplier = 0.01f;
|
buildingDamageMultiplier = 0.01f;
|
||||||
}};
|
}};
|
||||||
}});
|
}});
|
||||||
}};
|
}};
|
||||||
@@ -1801,7 +1801,7 @@ public class UnitTypes implements ContentList{
|
|||||||
lifetime = 60f;
|
lifetime = 60f;
|
||||||
shootEffect = Fx.shootSmall;
|
shootEffect = Fx.shootSmall;
|
||||||
smokeEffect = Fx.shootSmallSmoke;
|
smokeEffect = Fx.shootSmallSmoke;
|
||||||
tileDamageMultiplier = 0.01f;
|
buildingDamageMultiplier = 0.01f;
|
||||||
}};
|
}};
|
||||||
}});
|
}});
|
||||||
}};
|
}};
|
||||||
@@ -1841,7 +1841,7 @@ public class UnitTypes implements ContentList{
|
|||||||
lifetime = 70f;
|
lifetime = 70f;
|
||||||
shootEffect = Fx.shootSmall;
|
shootEffect = Fx.shootSmall;
|
||||||
smokeEffect = Fx.shootSmallSmoke;
|
smokeEffect = Fx.shootSmallSmoke;
|
||||||
tileDamageMultiplier = 0.01f;
|
buildingDamageMultiplier = 0.01f;
|
||||||
homingPower = 0.04f;
|
homingPower = 0.04f;
|
||||||
}};
|
}};
|
||||||
}});
|
}});
|
||||||
|
|||||||
@@ -351,7 +351,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
if(tile != null){
|
if(tile != null){
|
||||||
tile.setBlock(content.block(plan.block), state.rules.waveTeam, plan.rotation);
|
tile.setBlock(content.block(plan.block), state.rules.waveTeam, plan.rotation);
|
||||||
if(plan.config != null && tile.build != null){
|
if(plan.config != null && tile.build != null){
|
||||||
tile.build.configure(plan.config);
|
tile.build.configureAny(plan.config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -258,13 +258,12 @@ public class Logic implements ApplicationListener{
|
|||||||
state.rules.weather.removeAll(w -> w.weather == null);
|
state.rules.weather.removeAll(w -> w.weather == null);
|
||||||
|
|
||||||
for(WeatherEntry entry : state.rules.weather){
|
for(WeatherEntry entry : state.rules.weather){
|
||||||
if(entry.weather == null) continue;
|
|
||||||
//update cooldown
|
//update cooldown
|
||||||
entry.cooldown -= Time.delta;
|
entry.cooldown -= Time.delta;
|
||||||
|
|
||||||
//create new event when not active
|
//create new event when not active
|
||||||
if(entry.cooldown < 0 && !entry.weather.isActive()){
|
if((entry.cooldown < 0 || entry.always) && !entry.weather.isActive()){
|
||||||
float duration = Mathf.random(entry.minDuration, entry.maxDuration);
|
float duration = entry.always ? Float.POSITIVE_INFINITY : Mathf.random(entry.minDuration, entry.maxDuration);
|
||||||
entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency);
|
entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency);
|
||||||
Tmp.v1.setToRandomDirection();
|
Tmp.v1.setToRandomDirection();
|
||||||
Call.createWeather(entry.weather, entry.intensity, duration, Tmp.v1.x, Tmp.v1.y);
|
Call.createWeather(entry.weather, entry.intensity, duration, Tmp.v1.x, Tmp.v1.y);
|
||||||
|
|||||||
@@ -700,6 +700,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
if(core != 0) return core;
|
if(core != 0) return core;
|
||||||
int synth = Boolean.compare(b1.synthetic(), b2.synthetic());
|
int synth = Boolean.compare(b1.synthetic(), b2.synthetic());
|
||||||
if(synth != 0) return synth;
|
if(synth != 0) return synth;
|
||||||
|
int editorVis = Boolean.compare(b1.buildVisibility == BuildVisibility.editorOnly, b2.buildVisibility == BuildVisibility.editorOnly);
|
||||||
|
if(editorVis != 0) return editorVis;
|
||||||
int ore = Boolean.compare(b1 instanceof OverlayFloor, b2 instanceof OverlayFloor);
|
int ore = Boolean.compare(b1 instanceof OverlayFloor, b2 instanceof OverlayFloor);
|
||||||
if(ore != 0) return ore;
|
if(ore != 0) return ore;
|
||||||
return Integer.compare(b1.id, b2.id);
|
return Integer.compare(b1.id, b2.id);
|
||||||
|
|||||||
@@ -126,6 +126,8 @@ public class Damage{
|
|||||||
boolean collide = tile != null && collidedBlocks.add(tile.pos());
|
boolean collide = tile != null && collidedBlocks.add(tile.pos());
|
||||||
|
|
||||||
if(hitter.damage > 0){
|
if(hitter.damage > 0){
|
||||||
|
float health = !collide ? 0 : tile.health;
|
||||||
|
|
||||||
if(collide && tile.team != team && tile.collide(hitter)){
|
if(collide && tile.team != team && tile.collide(hitter)){
|
||||||
tile.collision(hitter);
|
tile.collision(hitter);
|
||||||
hitter.type.hit(hitter, tile.x, tile.y);
|
hitter.type.hit(hitter, tile.x, tile.y);
|
||||||
@@ -133,7 +135,7 @@ public class Damage{
|
|||||||
|
|
||||||
//try to heal the tile
|
//try to heal the tile
|
||||||
if(collide && hitter.type.testCollision(hitter, tile)){
|
if(collide && hitter.type.testCollision(hitter, tile)){
|
||||||
hitter.type.hitTile(hitter, tile, tile.health, false);
|
hitter.type.hitTile(hitter, tile, health, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -389,9 +391,9 @@ public class Damage{
|
|||||||
if(scaledDamage <= 0 || tile == null) continue;
|
if(scaledDamage <= 0 || tile == null) continue;
|
||||||
|
|
||||||
//apply damage to entity if needed
|
//apply damage to entity if needed
|
||||||
if(tile.build != null && tile.team() != team){
|
if(tile.build != null && tile.build.team != team){
|
||||||
int health = (int)tile.build.health();
|
int health = (int)(tile.build.health / (tile.block().size * tile.block().size));
|
||||||
if(tile.build.health() > 0){
|
if(tile.build.health > 0){
|
||||||
tile.build.damage(scaledDamage);
|
tile.build.damage(scaledDamage);
|
||||||
scaledDamage -= health;
|
scaledDamage -= health;
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public abstract class BulletType extends Content{
|
|||||||
/** Multiplied by turret reload speed to get final shoot speed. */
|
/** Multiplied by turret reload speed to get final shoot speed. */
|
||||||
public float reloadMultiplier = 1f;
|
public float reloadMultiplier = 1f;
|
||||||
/** Multiplier of how much base damage is done to tiles. */
|
/** Multiplier of how much base damage is done to tiles. */
|
||||||
public float tileDamageMultiplier = 1f;
|
public float buildingDamageMultiplier = 1f;
|
||||||
/** Recoil from shooter entities. */
|
/** Recoil from shooter entities. */
|
||||||
public float recoil;
|
public float recoil;
|
||||||
/** Whether to kill the shooter when this is shot. For suicide bombers. */
|
/** Whether to kill the shooter when this is shot. For suicide bombers. */
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import static mindustry.Vars.*;
|
|||||||
public class LiquidBulletType extends BulletType{
|
public class LiquidBulletType extends BulletType{
|
||||||
public Liquid liquid;
|
public Liquid liquid;
|
||||||
public float puddleSize = 6f;
|
public float puddleSize = 6f;
|
||||||
|
public float orbSize = 3f;
|
||||||
|
|
||||||
public LiquidBulletType(@Nullable Liquid liquid){
|
public LiquidBulletType(@Nullable Liquid liquid){
|
||||||
super(3.5f, 0);
|
super(3.5f, 0);
|
||||||
@@ -64,7 +65,7 @@ public class LiquidBulletType extends BulletType{
|
|||||||
public void draw(Bullet b){
|
public void draw(Bullet b){
|
||||||
Draw.color(liquid.color, Color.white, b.fout() / 100f);
|
Draw.color(liquid.color, Color.white, b.fout() / 100f);
|
||||||
|
|
||||||
Fill.circle(b.x, b.y, puddleSize / 2);
|
Fill.circle(b.x, b.y, orbSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -6,12 +6,6 @@ import mindustry.content.*;
|
|||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
|
|
||||||
//TODO this class is bad for multiple reasons, remove/replace it.
|
|
||||||
//- effects unreliable
|
|
||||||
//- not really hitscan but works like it
|
|
||||||
//- buggy trails
|
|
||||||
//- looks bad
|
|
||||||
//- generally unreliable
|
|
||||||
public class RailBulletType extends BulletType{
|
public class RailBulletType extends BulletType{
|
||||||
public Effect pierceEffect = Fx.hitBulletSmall, updateEffect = Fx.none;
|
public Effect pierceEffect = Fx.hitBulletSmall, updateEffect = Fx.none;
|
||||||
/** Multiplier of damage decreased per health pierced. */
|
/** Multiplier of damage decreased per health pierced. */
|
||||||
@@ -29,6 +23,7 @@ public class RailBulletType extends BulletType{
|
|||||||
despawnEffect = Fx.none;
|
despawnEffect = Fx.none;
|
||||||
collides = false;
|
collides = false;
|
||||||
lifetime = 1f;
|
lifetime = 1f;
|
||||||
|
speed = 0.01f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -37,7 +32,7 @@ public class RailBulletType extends BulletType{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void handle(Bullet b, Posc pos, float initialHealth){
|
void handle(Bullet b, Posc pos, float initialHealth){
|
||||||
float sub = initialHealth*pierceDamageFactor;
|
float sub = Math.max(initialHealth*pierceDamageFactor, 0);
|
||||||
|
|
||||||
if(b.damage <= 0){
|
if(b.damage <= 0){
|
||||||
b.fdata = Math.min(b.fdata, b.dst(pos));
|
b.fdata = Math.min(b.fdata, b.dst(pos));
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
|
|||||||
@Import Team team;
|
@Import Team team;
|
||||||
|
|
||||||
@SyncLocal Queue<BuildPlan> plans = new Queue<>(1);
|
@SyncLocal Queue<BuildPlan> plans = new Queue<>(1);
|
||||||
@SyncLocal transient boolean updateBuilding = true;
|
@SyncLocal boolean updateBuilding = true;
|
||||||
|
|
||||||
public boolean canBuild(){
|
public boolean canBuild(){
|
||||||
return type.buildSpeed > 0;
|
return type.buildSpeed > 0;
|
||||||
@@ -77,7 +77,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
|
|||||||
|
|
||||||
Tile tile = world.tile(current.x, current.y);
|
Tile tile = world.tile(current.x, current.y);
|
||||||
|
|
||||||
if(!(tile.block() instanceof ConstructBlock)){
|
if(!(tile.build instanceof ConstructBuild cb)){
|
||||||
if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){
|
if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){
|
||||||
boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item));
|
boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item));
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
|
|||||||
plans.removeFirst();
|
plans.removeFirst();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}else if(tile.team() != team && tile.team() != Team.derelict){
|
}else if((tile.team() != team && tile.team() != Team.derelict) || (!current.breaking && cb.cblock != current.block)){
|
||||||
plans.removeFirst();
|
plans.removeFirst();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1165,7 +1165,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
/** Handle a bullet collision.
|
/** Handle a bullet collision.
|
||||||
* @return whether the bullet should be removed. */
|
* @return whether the bullet should be removed. */
|
||||||
public boolean collision(Bullet other){
|
public boolean collision(Bullet other){
|
||||||
damage(other.damage() * other.type().tileDamageMultiplier);
|
damage(other.damage() * other.type().buildingDamageMultiplier);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void moveAt(Vec2 vector, float acceleration){
|
void moveAt(Vec2 vector, float acceleration){
|
||||||
Vec2 t = tmp1.set(vector).scl(floorSpeedMultiplier()); //target vector
|
Vec2 t = tmp1.set(vector); //target vector
|
||||||
tmp2.set(t).sub(vel).limit(acceleration * vector.len() * Time.delta); //delta vector
|
tmp2.set(t).sub(vel).limit(acceleration * vector.len() * Time.delta * floorSpeedMultiplier()); //delta vector
|
||||||
vel.add(tmp2);
|
vel.add(tmp2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -51,11 +51,7 @@ abstract class HealthComp implements Entityc, Posc{
|
|||||||
|
|
||||||
/** Damage and pierce armor. */
|
/** Damage and pierce armor. */
|
||||||
void damagePierce(float amount, boolean withEffect){
|
void damagePierce(float amount, boolean withEffect){
|
||||||
if(this instanceof Shieldc){
|
damage(amount, withEffect);
|
||||||
damage(amount + ((Shieldc)this).armor(), withEffect);
|
|
||||||
}else{
|
|
||||||
damage(amount, withEffect);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Damage and pierce armor. */
|
/** Damage and pierce armor. */
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ abstract class ShieldComp implements Healthc, Posc{
|
|||||||
|
|
||||||
/** Absorbs health damage. */
|
/** Absorbs health damage. */
|
||||||
float shield;
|
float shield;
|
||||||
/** Absorbs percentage of damage. */
|
/** Substracts an amount from damage. */
|
||||||
float armor;
|
float armor;
|
||||||
/** Shield opacity. */
|
/** Shield opacity. */
|
||||||
transient float shieldAlpha = 0f;
|
transient float shieldAlpha = 0f;
|
||||||
@@ -26,8 +26,22 @@ abstract class ShieldComp implements Healthc, Posc{
|
|||||||
amount = Math.max(amount - armor, minArmorDamage * amount);
|
amount = Math.max(amount - armor, minArmorDamage * amount);
|
||||||
amount /= healthMultiplier;
|
amount /= healthMultiplier;
|
||||||
|
|
||||||
hitTime = 1f;
|
rawDamage(amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Replace
|
||||||
|
@Override
|
||||||
|
public void damagePierce(float amount, boolean withEffect){
|
||||||
|
float pre = hitTime;
|
||||||
|
|
||||||
|
rawDamage(amount);
|
||||||
|
|
||||||
|
if(!withEffect){
|
||||||
|
hitTime = pre;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void rawDamage(float amount){
|
||||||
boolean hadShields = shield > 0.0001f;
|
boolean hadShields = shield > 0.0001f;
|
||||||
|
|
||||||
if(hadShields){
|
if(hadShields){
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{
|
|||||||
|
|
||||||
//flip weapon shoot side for alternating weapons at half reload
|
//flip weapon shoot side for alternating weapons at half reload
|
||||||
if(weapon.otherSide != -1 && weapon.alternate && mount.side == weapon.flipSprite &&
|
if(weapon.otherSide != -1 && weapon.alternate && mount.side == weapon.flipSprite &&
|
||||||
mount.reload + Time.delta > weapon.reload/2f && mount.reload <= weapon.reload/2f){
|
mount.reload + Time.delta * reloadMultiplier > weapon.reload/2f && mount.reload <= weapon.reload/2f){
|
||||||
mounts[weapon.otherSide].side = !mounts[weapon.otherSide].side;
|
mounts[weapon.otherSide].side = !mounts[weapon.otherSide].side;
|
||||||
mount.side = !mount.side;
|
mount.side = !mount.side;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,6 +154,7 @@ public class DesktopInput extends InputHandler{
|
|||||||
}
|
}
|
||||||
drawRequest(lineRequests.get(i));
|
drawRequest(lineRequests.get(i));
|
||||||
}
|
}
|
||||||
|
lineRequests.each(this::drawOverRequest);
|
||||||
}else if(isPlacing()){
|
}else if(isPlacing()){
|
||||||
if(block.rotate){
|
if(block.rotate){
|
||||||
drawArrow(block, cursorX, cursorY, rotation);
|
drawArrow(block, cursorX, cursorY, rotation);
|
||||||
@@ -603,7 +604,6 @@ public class DesktopInput extends InputHandler{
|
|||||||
|
|
||||||
protected void updateMovement(Unit unit){
|
protected void updateMovement(Unit unit){
|
||||||
boolean omni = unit.type.omniMovement;
|
boolean omni = unit.type.omniMovement;
|
||||||
boolean ground = unit.isGrounded();
|
|
||||||
|
|
||||||
float speed = unit.realSpeed();
|
float speed = unit.realSpeed();
|
||||||
float xa = Core.input.axis(Binding.move_x);
|
float xa = Core.input.axis(Binding.move_x);
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
/** Maximum line length. */
|
/** Maximum line length. */
|
||||||
final static int maxLength = 100;
|
final static int maxLength = 100;
|
||||||
final static Rect r1 = new Rect(), r2 = new Rect();
|
final static Rect r1 = new Rect(), r2 = new Rect();
|
||||||
final static Seq<Point2> tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>();
|
|
||||||
|
|
||||||
public final OverlayFragment frag = new OverlayFragment();
|
public final OverlayFragment frag = new OverlayFragment();
|
||||||
|
|
||||||
@@ -1144,7 +1143,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
diagonal = !diagonal;
|
diagonal = !diagonal;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(block instanceof PowerNode){
|
if(block != null && block.swapDiagonalPlacement){
|
||||||
diagonal = !diagonal;
|
diagonal = !diagonal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1161,39 +1160,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
points = Placement.normalizeLine(startX, startY, endX, endY);
|
points = Placement.normalizeLine(startX, startY, endX, endY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(block instanceof PowerNode node){
|
if(block != null){
|
||||||
var base = tmpPoints2;
|
block.changePlacementPath(points, rotation);
|
||||||
var result = tmpPoints.clear();
|
|
||||||
|
|
||||||
base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(block, player.team(), p.x, p.y, rotation, false));
|
|
||||||
boolean addedLast = false;
|
|
||||||
|
|
||||||
outer:
|
|
||||||
for(int i = 0; i < base.size;){
|
|
||||||
var point = base.get(i);
|
|
||||||
result.add(point);
|
|
||||||
if(i == base.size - 1) addedLast = true;
|
|
||||||
|
|
||||||
//find the furthest node that overlaps this one
|
|
||||||
for(int j = base.size - 1; j > i; j--){
|
|
||||||
var other = base.get(j);
|
|
||||||
boolean over = node.overlaps(world.tile(point.x, point.y), world.tile(other.x, other.y));
|
|
||||||
|
|
||||||
if(over){
|
|
||||||
//add node to list and start searching for node that overlaps the next one
|
|
||||||
i = j;
|
|
||||||
continue outer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//if it got here, that means nothing was found. try to proceed to the next node anyway
|
|
||||||
i ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!addedLast) result.add(base.peek());
|
|
||||||
|
|
||||||
points.clear();
|
|
||||||
points.addAll(result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float angle = Angles.angle(startX, startY, endX, endY);
|
float angle = Angles.angle(startX, startY, endX, endY);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mindustry.input;
|
package mindustry.input;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
|
import arc.func.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
@@ -11,6 +12,7 @@ import mindustry.world.blocks.distribution.*;
|
|||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class Placement{
|
public class Placement{
|
||||||
|
private final static Seq<Point2> tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>();
|
||||||
private static final NormalizeResult result = new NormalizeResult();
|
private static final NormalizeResult result = new NormalizeResult();
|
||||||
private static final NormalizeDrawResult drawResult = new NormalizeDrawResult();
|
private static final NormalizeDrawResult drawResult = new NormalizeDrawResult();
|
||||||
private static Bresenham2 bres = new Bresenham2();
|
private static Bresenham2 bres = new Bresenham2();
|
||||||
@@ -68,6 +70,42 @@ public class Placement{
|
|||||||
return points;
|
return points;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Calculates optimal node placement for nodes with spacing. Used for bridges and power nodes. */
|
||||||
|
public static void calculateNodes(Seq<Point2> points, Block block, int rotation, Boolf2<Point2, Point2> overlapper){
|
||||||
|
var base = tmpPoints2;
|
||||||
|
var result = tmpPoints.clear();
|
||||||
|
|
||||||
|
base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(block, player.team(), p.x, p.y, rotation, false));
|
||||||
|
boolean addedLast = false;
|
||||||
|
|
||||||
|
outer:
|
||||||
|
for(int i = 0; i < base.size;){
|
||||||
|
var point = base.get(i);
|
||||||
|
result.add(point);
|
||||||
|
if(i == base.size - 1) addedLast = true;
|
||||||
|
|
||||||
|
//find the furthest node that overlaps this one
|
||||||
|
for(int j = base.size - 1; j > i; j--){
|
||||||
|
var other = base.get(j);
|
||||||
|
boolean over = overlapper.get(point, other);
|
||||||
|
|
||||||
|
if(over){
|
||||||
|
//add node to list and start searching for node that overlaps the next one
|
||||||
|
i = j;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if it got here, that means nothing was found. try to proceed to the next node anyway
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!addedLast) result.add(base.peek());
|
||||||
|
|
||||||
|
points.clear();
|
||||||
|
points.addAll(result);
|
||||||
|
}
|
||||||
|
|
||||||
private static float tileHeuristic(Tile tile, Tile other){
|
private static float tileHeuristic(Tile tile, Tile other){
|
||||||
Block block = control.input.block;
|
Block block = control.input.block;
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ public class StatusEffect extends MappableContent{
|
|||||||
if(damage > 0){
|
if(damage > 0){
|
||||||
unit.damageContinuousPierce(damage);
|
unit.damageContinuousPierce(damage);
|
||||||
}else if(damage < 0){ //heal unit
|
}else if(damage < 0){ //heal unit
|
||||||
unit.heal(damage * Time.delta);
|
unit.heal(-1f * damage * Time.delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(effect != Fx.none && Mathf.chanceDelta(effectChance)){
|
if(effect != Fx.none && Mathf.chanceDelta(effectChance)){
|
||||||
|
|||||||
@@ -61,12 +61,17 @@ public class Weather extends UnlockableContent{
|
|||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public WeatherState instance(){
|
||||||
|
return Groups.weather.find(w -> w.weather() == this);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isActive(){
|
public boolean isActive(){
|
||||||
return Groups.weather.find(w -> w.weather() == this) != null;
|
return instance() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void remove(){
|
public void remove(){
|
||||||
Entityc e = Groups.weather.find(w -> w.weather() == this);
|
var e = instance();
|
||||||
if(e != null) e.remove();
|
if(e != null) e.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,6 +264,8 @@ public class Weather extends UnlockableContent{
|
|||||||
public float cooldown;
|
public float cooldown;
|
||||||
/** Intensity of the weather produced. */
|
/** Intensity of the weather produced. */
|
||||||
public float intensity = 1f;
|
public float intensity = 1f;
|
||||||
|
/** If true, this weather is always active. */
|
||||||
|
public boolean always = false;
|
||||||
|
|
||||||
/** Creates a weather entry with some approximate weather values. */
|
/** Creates a weather entry with some approximate weather values. */
|
||||||
public WeatherEntry(Weather weather){
|
public WeatherEntry(Weather weather){
|
||||||
|
|||||||
@@ -284,19 +284,23 @@ public class CustomRulesDialog extends BaseDialog{
|
|||||||
f.defaults().padRight(4).left();
|
f.defaults().padRight(4).left();
|
||||||
|
|
||||||
f.add("@rules.weather.duration");
|
f.add("@rules.weather.duration");
|
||||||
field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes);
|
field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes).disabled(v -> entry.always);
|
||||||
f.add("@waves.to");
|
f.add("@waves.to");
|
||||||
field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes);
|
field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes).disabled(v -> entry.always);
|
||||||
f.add("@unit.minutes");
|
f.add("@unit.minutes");
|
||||||
|
|
||||||
f.row();
|
f.row();
|
||||||
|
|
||||||
f.add("@rules.weather.frequency");
|
f.add("@rules.weather.frequency");
|
||||||
field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes);
|
field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes).disabled(v -> entry.always);
|
||||||
f.add("@waves.to");
|
f.add("@waves.to");
|
||||||
field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes);
|
field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes).disabled(v -> entry.always);
|
||||||
f.add("@unit.minutes");
|
f.add("@unit.minutes");
|
||||||
|
|
||||||
|
f.row();
|
||||||
|
|
||||||
|
f.check("@rules.weather.always", val -> entry.always = val).checked(cc -> entry.always).padBottom(4);
|
||||||
|
|
||||||
//intensity can't currently be customized
|
//intensity can't currently be customized
|
||||||
|
|
||||||
}).grow().left().pad(6).top();
|
}).grow().left().pad(6).top();
|
||||||
@@ -314,8 +318,8 @@ public class CustomRulesDialog extends BaseDialog{
|
|||||||
dialog.addCloseButton();
|
dialog.addCloseButton();
|
||||||
|
|
||||||
dialog.buttons.button("@add", Icon.add, () -> {
|
dialog.buttons.button("@add", Icon.add, () -> {
|
||||||
BaseDialog addd = new BaseDialog("@add");
|
BaseDialog add = new BaseDialog("@add");
|
||||||
addd.cont.pane(t -> {
|
add.cont.pane(t -> {
|
||||||
t.background(Tex.button);
|
t.background(Tex.button);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(Weather weather : content.<Weather>getBy(ContentType.weather)){
|
for(Weather weather : content.<Weather>getBy(ContentType.weather)){
|
||||||
@@ -324,13 +328,13 @@ public class CustomRulesDialog extends BaseDialog{
|
|||||||
rules.weather.add(new WeatherEntry(weather));
|
rules.weather.add(new WeatherEntry(weather));
|
||||||
rebuild[0].run();
|
rebuild[0].run();
|
||||||
|
|
||||||
addd.hide();
|
add.hide();
|
||||||
}).size(140f, 50f);
|
}).size(140f, 50f);
|
||||||
if(++i % 2 == 0) t.row();
|
if(++i % 2 == 0) t.row();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
addd.addCloseButton();
|
add.addCloseButton();
|
||||||
addd.show();
|
add.show();
|
||||||
}).width(170f);
|
}).width(170f);
|
||||||
|
|
||||||
//reset cooldown to random number
|
//reset cooldown to random number
|
||||||
|
|||||||
@@ -67,10 +67,15 @@ public class HostDialog extends BaseDialog{
|
|||||||
player.admin(true);
|
player.admin(true);
|
||||||
|
|
||||||
if(steam){
|
if(steam){
|
||||||
Core.app.post(() -> Core.settings.getBoolOnce("steampublic2", () -> {
|
Core.app.post(() -> Core.settings.getBoolOnce("steampublic3", () -> {
|
||||||
ui.showCustomConfirm("@setting.publichost.name", "@public.confirm", "@yes", "@no", () -> {
|
ui.showCustomConfirm("@setting.publichost.name", "@public.confirm", "@yes", "@no", () -> {
|
||||||
Core.settings.put("publichost", true);
|
ui.showCustomConfirm("@setting.publichost.name", "@public.confirm.really", "@no", "@yes", () -> {
|
||||||
platform.updateLobby();
|
Core.settings.put("publichost", true);
|
||||||
|
platform.updateLobby();
|
||||||
|
}, () -> {
|
||||||
|
Core.settings.put("publichost", false);
|
||||||
|
platform.updateLobby();
|
||||||
|
});
|
||||||
}, () -> {
|
}, () -> {
|
||||||
Core.settings.put("publichost", false);
|
Core.settings.put("publichost", false);
|
||||||
platform.updateLobby();
|
platform.updateLobby();
|
||||||
|
|||||||
@@ -399,6 +399,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
void setup(){
|
void setup(){
|
||||||
zoom = planets.zoom = 1f;
|
zoom = planets.zoom = 1f;
|
||||||
selectAlpha = 1f;
|
selectAlpha = 1f;
|
||||||
|
ui.minimapfrag.hide();
|
||||||
|
|
||||||
clearChildren();
|
clearChildren();
|
||||||
|
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ import static mindustry.Vars.net;
|
|||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class SettingsMenuDialog extends SettingsDialog{
|
public class SettingsMenuDialog extends SettingsDialog{
|
||||||
private SettingsTable graphics;
|
public SettingsTable graphics;
|
||||||
private SettingsTable game;
|
public SettingsTable game;
|
||||||
private SettingsTable sound;
|
public SettingsTable sound;
|
||||||
|
|
||||||
private Table prefs;
|
private Table prefs;
|
||||||
private Table menu;
|
private Table menu;
|
||||||
|
|||||||
@@ -110,6 +110,10 @@ public class MinimapFragment extends Fragment{
|
|||||||
return shown;
|
return shown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void hide(){
|
||||||
|
shown = false;
|
||||||
|
}
|
||||||
|
|
||||||
public void toggle(){
|
public void toggle(){
|
||||||
float size = baseSize * zoom * world.width();
|
float size = baseSize * zoom * world.width();
|
||||||
float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width;
|
float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width;
|
||||||
|
|||||||
@@ -143,6 +143,8 @@ public class Block extends UnlockableContent{
|
|||||||
public boolean sync;
|
public boolean sync;
|
||||||
/** Whether this block uses conveyor-type placement mode. */
|
/** Whether this block uses conveyor-type placement mode. */
|
||||||
public boolean conveyorPlacement;
|
public boolean conveyorPlacement;
|
||||||
|
/** Whether to swap the diagonal placement modes. */
|
||||||
|
public boolean swapDiagonalPlacement;
|
||||||
/**
|
/**
|
||||||
* The color of this block when displayed on the minimap or map preview.
|
* The color of this block when displayed on the minimap or map preview.
|
||||||
* Do not set manually! This is overridden when loading for most blocks.
|
* Do not set manually! This is overridden when loading for most blocks.
|
||||||
@@ -386,6 +388,11 @@ public class Block extends UnlockableContent{
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Mutates the given list of points used during line placement. */
|
||||||
|
public void changePlacementPath(Seq<Point2> points, int rotation){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public Object nextConfig(){
|
public Object nextConfig(){
|
||||||
if(saveConfig && lastConfig != null){
|
if(saveConfig && lastConfig != null){
|
||||||
return lastConfig;
|
return lastConfig;
|
||||||
|
|||||||
@@ -50,6 +50,14 @@ public class Accelerator extends Block{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class AcceleratorBuild extends Building{
|
public class AcceleratorBuild extends Building{
|
||||||
|
public float heat, statusLerp;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateTile(){
|
||||||
|
super.updateTile();
|
||||||
|
heat = Mathf.lerpDelta(heat, consValid() ? 1f : 0f, 0.05f);
|
||||||
|
statusLerp = Mathf.lerpDelta(statusLerp, power.status, 0.05f);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void draw(){
|
||||||
@@ -57,7 +65,7 @@ public class Accelerator extends Block{
|
|||||||
|
|
||||||
for(int l = 0; l < 4; l++){
|
for(int l = 0; l < 4; l++){
|
||||||
float length = 7f + l * 5f;
|
float length = 7f + l * 5f;
|
||||||
Draw.color(team.color, Pal.darkMetal, Mathf.absin(Time.time + l*50f, 10f, 1f));
|
Draw.color(Tmp.c1.set(Pal.darkMetal).lerp(team.color, statusLerp), Pal.darkMetal, Mathf.absin(Time.time + l*50f, 10f, 1f));
|
||||||
|
|
||||||
for(int i = 0; i < 4; i++){
|
for(int i = 0; i < 4; i++){
|
||||||
float rot = i*90f + 45f;
|
float rot = i*90f + 45f;
|
||||||
@@ -65,22 +73,25 @@ public class Accelerator extends Block{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(heat < 0.0001f) return;
|
||||||
|
|
||||||
float rad = size * tilesize / 2f * 0.74f;
|
float rad = size * tilesize / 2f * 0.74f;
|
||||||
float scl = 2f;
|
float scl = 2f;
|
||||||
|
|
||||||
Draw.z(Layer.bullet - 0.0001f);
|
Draw.z(Layer.bullet - 0.0001f);
|
||||||
Lines.stroke(1.75f, Pal.accent);
|
Lines.stroke(1.75f * heat, Pal.accent);
|
||||||
Lines.square(x, y, rad * 1.22f, 45f);
|
Lines.square(x, y, rad * 1.22f, 45f);
|
||||||
|
|
||||||
Lines.stroke(3f, Pal.accent);
|
Lines.stroke(3f * heat, Pal.accent);
|
||||||
Lines.square(x, y, rad, Time.time / scl);
|
Lines.square(x, y, rad, Time.time / scl);
|
||||||
Lines.square(x, y, rad, -Time.time / scl);
|
Lines.square(x, y, rad, -Time.time / scl);
|
||||||
|
|
||||||
Draw.color(team.color);
|
Draw.color(team.color);
|
||||||
|
Draw.alpha(Mathf.clamp(heat * 3f));
|
||||||
|
|
||||||
for(int i = 0; i < 4; i++){
|
for(int i = 0; i < 4; i++){
|
||||||
float rot = i*90f + 45f + (-Time.time /3f)%360f;
|
float rot = i*90f + 45f + (-Time.time /3f)%360f;
|
||||||
float length = 26f;
|
float length = 26f * heat;
|
||||||
Draw.rect(arrowRegion, x + Angles.trnsx(rot, length), y + Angles.trnsy(rot, length), rot + 180f);
|
Draw.rect(arrowRegion, x + Angles.trnsx(rot, length), y + Angles.trnsy(rot, length), rot + 180f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
37
core/src/mindustry/world/blocks/defense/Thruster.java
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
package mindustry.world.blocks.defense;
|
||||||
|
|
||||||
|
import arc.graphics.g2d.*;
|
||||||
|
import arc.util.*;
|
||||||
|
import mindustry.annotations.Annotations.*;
|
||||||
|
import mindustry.entities.units.*;
|
||||||
|
|
||||||
|
public class Thruster extends Wall{
|
||||||
|
public @Load("@-top") TextureRegion topRegion;
|
||||||
|
|
||||||
|
public Thruster(String name){
|
||||||
|
super(name);
|
||||||
|
rotate = true;
|
||||||
|
quickRotate = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){
|
||||||
|
Draw.rect(region, req.drawx(), req.drawy());
|
||||||
|
Draw.rect(topRegion, req.drawx(), req.drawy(), req.rotation * 90);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextureRegion[] icons(){
|
||||||
|
return new TextureRegion[]{region, topRegion};
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ThrusterBuild extends WallBuild{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(){
|
||||||
|
super.draw();
|
||||||
|
|
||||||
|
Draw.rect(topRegion, x, y, rotdeg());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -62,7 +62,7 @@ public class PointDefenseTurret extends ReloadTurret{
|
|||||||
|
|
||||||
//retarget
|
//retarget
|
||||||
if(timer(timerTarget, retargetTime)){
|
if(timer(timerTarget, retargetTime)){
|
||||||
target = Groups.bullet.intersect(x - range, y - range, range*2, range*2).min(b -> b.team == team || !b.type().hittable ? Float.MAX_VALUE : b.dst2(this));
|
target = Groups.bullet.intersect(x - range, y - range, range*2, range*2).min(b -> b.team != team && b.type().hittable, b -> b.dst2(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
//pooled bullets
|
//pooled bullets
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ public class TractorBeamTurret extends BaseTurret{
|
|||||||
}
|
}
|
||||||
|
|
||||||
any = true;
|
any = true;
|
||||||
target.impulseNet(Tmp.v1.set(this).sub(target).limit((force + (1f - target.dst(this) / range) * scaledForce) * efficiency() * timeScale));
|
target.impulseNet(Tmp.v1.set(this).sub(target).limit((force + (1f - target.dst(this) / range) * scaledForce) * edelta() * timeScale));
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
strength = Mathf.lerpDelta(strength, 0, 0.1f);
|
strength = Mathf.lerpDelta(strength, 0, 0.1f);
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ public class Turret extends ReloadTurret{
|
|||||||
stats.add(Stat.reload, 60f / reloadTime * (alternate ? 1 : shots), StatUnit.none);
|
stats.add(Stat.reload, 60f / reloadTime * (alternate ? 1 : shots), StatUnit.none);
|
||||||
stats.add(Stat.targetsAir, targetAir);
|
stats.add(Stat.targetsAir, targetAir);
|
||||||
stats.add(Stat.targetsGround, targetGround);
|
stats.add(Stat.targetsGround, targetGround);
|
||||||
|
if(ammoPerShot != 1) stats.add(Stat.ammoUse, ammoPerShot, StatUnit.perShot);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import mindustry.annotations.Annotations.*;
|
|||||||
import mindustry.entities.units.*;
|
import mindustry.entities.units.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
|
import mindustry.input.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.meta.*;
|
import mindustry.world.meta.*;
|
||||||
@@ -152,6 +153,11 @@ public class ItemBridge extends Block{
|
|||||||
lastPlan = plan;
|
lastPlan = plan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void changePlacementPath(Seq<Point2> points, int rotation){
|
||||||
|
Placement.calculateNodes(points, this, rotation, (point, other) -> Math.max(Math.abs(point.x - other.x), Math.abs(point.y - other.y)) <= range);
|
||||||
|
}
|
||||||
|
|
||||||
public class ItemBridgeBuild extends Building{
|
public class ItemBridgeBuild extends Building{
|
||||||
public int link = -1;
|
public int link = -1;
|
||||||
public IntSet incoming = new IntSet();
|
public IntSet incoming = new IntSet();
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public class StackConveyor extends Block implements Autotiler{
|
|||||||
|
|
||||||
public float speed = 0f;
|
public float speed = 0f;
|
||||||
public boolean splitOut = true;
|
public boolean splitOut = true;
|
||||||
/** (minimum) amount of loading docks needed to fill a line */
|
/** (minimum) amount of loading docks needed to fill a line. */
|
||||||
public float recharge = 2f;
|
public float recharge = 2f;
|
||||||
public Effect loadEffect = Fx.plasticburn;
|
public Effect loadEffect = Fx.plasticburn;
|
||||||
public Effect unloadEffect = Fx.plasticburn;
|
public Effect unloadEffect = Fx.plasticburn;
|
||||||
@@ -46,7 +46,6 @@ public class StackConveyor extends Block implements Autotiler{
|
|||||||
|
|
||||||
ambientSound = Sounds.conveyor;
|
ambientSound = Sounds.conveyor;
|
||||||
ambientSoundVolume = 0.004f;
|
ambientSoundVolume = 0.004f;
|
||||||
unloadable = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -269,6 +268,11 @@ public class StackConveyor extends Block implements Autotiler{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void itemTaken(Item item){
|
||||||
|
if(items.empty()) poofOut();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean acceptItem(Building source, Item item){
|
public boolean acceptItem(Building source, Item item){
|
||||||
if(this == source) return true; // player threw items
|
if(this == source) return true; // player threw items
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ public class BlockForge extends PayloadAcceptor{
|
|||||||
consumes.add(new ConsumeItemDynamic((BlockForgeBuild e) -> e.recipe != null ? e.recipe.requirements : ItemStack.empty));
|
consumes.add(new ConsumeItemDynamic((BlockForgeBuild e) -> e.recipe != null ? e.recipe.requirements : ItemStack.empty));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextureRegion[] icons(){
|
||||||
|
return new TextureRegion[]{region, outRegion};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBars(){
|
public void setBars(){
|
||||||
super.setBars();
|
super.setBars();
|
||||||
|
|||||||
@@ -31,6 +31,11 @@ public class BlockLoader extends PayloadAcceptor{
|
|||||||
rotate = true;
|
rotate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextureRegion[] icons(){
|
||||||
|
return new TextureRegion[]{region, inRegion, outRegion, topRegion};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean outputsItems(){
|
public boolean outputsItems(){
|
||||||
return false;
|
return false;
|
||||||
@@ -72,7 +77,7 @@ public class BlockLoader extends PayloadAcceptor{
|
|||||||
//draw input
|
//draw input
|
||||||
for(int i = 0; i < 4; i++){
|
for(int i = 0; i < 4; i++){
|
||||||
if(blends(i) && i != rotation){
|
if(blends(i) && i != rotation){
|
||||||
Draw.rect(inRegion, x, y, i * 90);
|
Draw.rect(inRegion, x, y, (i * 90) - 180);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -194,6 +194,7 @@ public class LogicBlock extends Block{
|
|||||||
public LExecutor executor = new LExecutor();
|
public LExecutor executor = new LExecutor();
|
||||||
public float accumulator = 0;
|
public float accumulator = 0;
|
||||||
public Seq<LogicLink> links = new Seq<>();
|
public Seq<LogicLink> links = new Seq<>();
|
||||||
|
public boolean checkedDuplicates = false;
|
||||||
|
|
||||||
public void readCompressed(byte[] data, boolean relative){
|
public void readCompressed(byte[] data, boolean relative){
|
||||||
DataInputStream stream = new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(data)));
|
DataInputStream stream = new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(data)));
|
||||||
@@ -362,6 +363,21 @@ public class LogicBlock extends Block{
|
|||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
executor.team = team;
|
executor.team = team;
|
||||||
|
|
||||||
|
if(!checkedDuplicates){
|
||||||
|
checkedDuplicates = true;
|
||||||
|
var removal = new IntSet();
|
||||||
|
var removeLinks = new Seq<LogicLink>();
|
||||||
|
for(var link : links){
|
||||||
|
var build = world.build(link.x, link.y);
|
||||||
|
if(build != null){
|
||||||
|
if(!removal.add(build.id)){
|
||||||
|
removeLinks.add(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
links.removeAll(removeLinks);
|
||||||
|
}
|
||||||
|
|
||||||
//check for previously invalid links to add after configuration
|
//check for previously invalid links to add after configuration
|
||||||
boolean changed = false;
|
boolean changed = false;
|
||||||
|
|
||||||
@@ -371,7 +387,7 @@ public class LogicBlock extends Block{
|
|||||||
if(!l.active) continue;
|
if(!l.active) continue;
|
||||||
|
|
||||||
boolean valid = validLink(world.build(l.x, l.y));
|
boolean valid = validLink(world.build(l.x, l.y));
|
||||||
if(valid != l.valid ){
|
if(valid != l.valid){
|
||||||
changed = true;
|
changed = true;
|
||||||
l.valid = valid;
|
l.valid = valid;
|
||||||
if(valid){
|
if(valid){
|
||||||
|
|||||||
@@ -92,11 +92,6 @@ public class ItemLiquidGenerator extends PowerGenerator{
|
|||||||
return generateTime > 0;
|
return generateTime > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public float ambientVolume(){
|
|
||||||
return Mathf.clamp(productionEfficiency);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
//Note: Do not use this delta when calculating the amount of power or the power efficiency, but use it for resource consumption if necessary.
|
//Note: Do not use this delta when calculating the amount of power or the power efficiency, but use it for resource consumption if necessary.
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mindustry.world.blocks.power;
|
package mindustry.world.blocks.power;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
|
import arc.math.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import arc.util.io.*;
|
import arc.util.io.*;
|
||||||
@@ -50,6 +51,11 @@ public class PowerGenerator extends PowerDistributor{
|
|||||||
/** The efficiency of the producer. An efficiency of 1.0 means 100% */
|
/** The efficiency of the producer. An efficiency of 1.0 means 100% */
|
||||||
public float productionEfficiency = 0.0f;
|
public float productionEfficiency = 0.0f;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float ambientVolume(){
|
||||||
|
return Mathf.clamp(productionEfficiency);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getPowerProduction(){
|
public float getPowerProduction(){
|
||||||
return powerProduction * productionEfficiency;
|
return powerProduction * productionEfficiency;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import mindustry.entities.units.*;
|
|||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
|
import mindustry.input.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.meta.*;
|
import mindustry.world.meta.*;
|
||||||
@@ -25,7 +26,8 @@ public class PowerNode extends PowerBlock{
|
|||||||
protected static boolean returnValue = false;
|
protected static boolean returnValue = false;
|
||||||
protected static BuildPlan otherReq;
|
protected static BuildPlan otherReq;
|
||||||
|
|
||||||
protected final ObjectSet<PowerGraph> graphs = new ObjectSet<>();
|
protected final static ObjectSet<PowerGraph> graphs = new ObjectSet<>();
|
||||||
|
protected final static Seq<Point2> tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>();
|
||||||
|
|
||||||
public @Load("laser") TextureRegion laser;
|
public @Load("laser") TextureRegion laser;
|
||||||
public @Load("laser-end") TextureRegion laserEnd;
|
public @Load("laser-end") TextureRegion laserEnd;
|
||||||
@@ -40,6 +42,7 @@ public class PowerNode extends PowerBlock{
|
|||||||
consumesPower = false;
|
consumesPower = false;
|
||||||
outputsPower = false;
|
outputsPower = false;
|
||||||
canOverdrive = false;
|
canOverdrive = false;
|
||||||
|
swapDiagonalPlacement = true;
|
||||||
|
|
||||||
config(Integer.class, (entity, value) -> {
|
config(Integer.class, (entity, value) -> {
|
||||||
PowerModule power = entity.power;
|
PowerModule power = entity.power;
|
||||||
@@ -149,17 +152,20 @@ public class PowerNode extends PowerBlock{
|
|||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setupColor(float satisfaction){
|
@Override
|
||||||
float fract = 1f - satisfaction;
|
public void changePlacementPath(Seq<Point2> points, int rotation){
|
||||||
|
Placement.calculateNodes(points, this, rotation, (point, other) -> overlaps(world.tile(point.x, point.y), world.tile(other.x, other.y)));
|
||||||
|
}
|
||||||
|
|
||||||
Draw.color(laserColor1, laserColor2, fract * 0.86f + Mathf.absin(3f, 0.1f));
|
protected void setupColor(float satisfaction){
|
||||||
|
Draw.color(laserColor1, laserColor2, (1f - satisfaction) * 0.86f + Mathf.absin(3f, 0.1f));
|
||||||
Draw.alpha(renderer == null ? 0.5f : renderer.laserOpacity);
|
Draw.alpha(renderer == null ? 0.5f : renderer.laserOpacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void drawLaser(Team team, float x1, float y1, float x2, float y2, int size1, int size2){
|
protected void drawLaser(Team team, float x1, float y1, float x2, float y2, int size1, int size2){
|
||||||
float angle1 = Angles.angle(x1, y1, x2, y2);
|
float angle1 = Angles.angle(x1, y1, x2, y2),
|
||||||
float vx = Mathf.cosDeg(angle1), vy = Mathf.sinDeg(angle1);
|
vx = Mathf.cosDeg(angle1), vy = Mathf.sinDeg(angle1),
|
||||||
float len1 = size1 * tilesize / 2f - 1.5f, len2 = size2 * tilesize / 2f - 1.5f;
|
len1 = size1 * tilesize / 2f - 1.5f, len2 = size2 * tilesize / 2f - 1.5f;
|
||||||
|
|
||||||
Drawf.laser(team, laser, laserEnd, x1 + vx*len1, y1 + vy*len1, x2 - vx*len2, y2 - vy*len2, 0.25f);
|
Drawf.laser(team, laser, laserEnd, x1 + vx*len1, y1 + vy*len1, x2 - vx*len2, y2 - vy*len2, 0.25f);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class Drill extends Block{
|
|||||||
protected int returnCount;
|
protected int returnCount;
|
||||||
|
|
||||||
/** Whether to draw the item this drill is mining. */
|
/** Whether to draw the item this drill is mining. */
|
||||||
public boolean drawMineItem = false;
|
public boolean drawMineItem = true;
|
||||||
/** Effect played when an item is produced. This is colored. */
|
/** Effect played when an item is produced. This is colored. */
|
||||||
public Effect drillEffect = Fx.mine;
|
public Effect drillEffect = Fx.mine;
|
||||||
/** Speed the drill bit rotates at. */
|
/** Speed the drill bit rotates at. */
|
||||||
@@ -57,6 +57,7 @@ public class Drill extends Block{
|
|||||||
public @Load("@-rim") TextureRegion rimRegion;
|
public @Load("@-rim") TextureRegion rimRegion;
|
||||||
public @Load("@-rotator") TextureRegion rotatorRegion;
|
public @Load("@-rotator") TextureRegion rotatorRegion;
|
||||||
public @Load("@-top") TextureRegion topRegion;
|
public @Load("@-top") TextureRegion topRegion;
|
||||||
|
public @Load(value = "@-item", fallback = "drill-item-@size") TextureRegion itemRegion;
|
||||||
|
|
||||||
public Drill(String name){
|
public Drill(String name){
|
||||||
super(name);
|
super(name);
|
||||||
@@ -76,11 +77,11 @@ public class Drill extends Block{
|
|||||||
Tile tile = req.tile();
|
Tile tile = req.tile();
|
||||||
if(tile == null) return;
|
if(tile == null) return;
|
||||||
|
|
||||||
countOre(req.tile());
|
countOre(tile);
|
||||||
if(returnItem == null) return;
|
if(returnItem == null || !drawMineItem) return;
|
||||||
|
|
||||||
Draw.color(returnItem.color);
|
Draw.color(returnItem.color);
|
||||||
Draw.rect("drill-top", req.drawx(), req.drawy());
|
Draw.rect(itemRegion, req.drawx(), req.drawy());
|
||||||
Draw.color();
|
Draw.color();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,6 +125,12 @@ public class Drill extends Block{
|
|||||||
Draw.rect(returnItem.icon(Cicon.small), dx, dy - 1);
|
Draw.rect(returnItem.icon(Cicon.small), dx, dy - 1);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
Draw.rect(returnItem.icon(Cicon.small), dx, dy);
|
Draw.rect(returnItem.icon(Cicon.small), dx, dy);
|
||||||
|
|
||||||
|
if(drawMineItem){
|
||||||
|
Draw.color(returnItem.color);
|
||||||
|
Draw.rect(itemRegion, tile.worldx() + offset, tile.worldy() + offset);
|
||||||
|
Draw.color();
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
Tile to = tile.getLinkedTilesAs(this, tempTiles).find(t -> t.drop() != null && t.drop().hardness > tier);
|
Tile to = tile.getLinkedTilesAs(this, tempTiles).find(t -> t.drop() != null && t.drop().hardness > tier);
|
||||||
Item item = to == null ? null : to.drop();
|
Item item = to == null ? null : to.drop();
|
||||||
@@ -304,7 +311,7 @@ public class Drill extends Block{
|
|||||||
|
|
||||||
if(dominantItem != null && drawMineItem){
|
if(dominantItem != null && drawMineItem){
|
||||||
Draw.color(dominantItem.color);
|
Draw.color(dominantItem.color);
|
||||||
Draw.rect("drill-top", x, y);
|
Draw.rect(itemRegion, x, y);
|
||||||
Draw.color();
|
Draw.color();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public class SolidPump extends Pump{
|
|||||||
stats.remove(Stat.output);
|
stats.remove(Stat.output);
|
||||||
stats.add(Stat.output, result, 60f * pumpAmount, true);
|
stats.add(Stat.output, result, 60f * pumpAmount, true);
|
||||||
if(attribute != null){
|
if(attribute != null){
|
||||||
stats.add(baseEfficiency > 0.0001f ? Stat.affinities : Stat.tiles, attribute);
|
stats.add(baseEfficiency > 0.0001f ? Stat.affinities : Stat.tiles, attribute, floating, 1f, baseEfficiency <= 0.001f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import mindustry.world.blocks.power.*;
|
|||||||
|
|
||||||
public class PowerSource extends PowerNode{
|
public class PowerSource extends PowerNode{
|
||||||
|
|
||||||
|
public float powerProduction = 10000f;
|
||||||
|
|
||||||
public PowerSource(String name){
|
public PowerSource(String name){
|
||||||
super(name);
|
super(name);
|
||||||
maxNodes = 100;
|
maxNodes = 100;
|
||||||
@@ -14,7 +16,7 @@ public class PowerSource extends PowerNode{
|
|||||||
public class PowerSourceBuild extends PowerNodeBuild{
|
public class PowerSourceBuild extends PowerNodeBuild{
|
||||||
@Override
|
@Override
|
||||||
public float getPowerProduction(){
|
public float getPowerProduction(){
|
||||||
return enabled ? 10000f : 0f;
|
return enabled ? powerProduction : 0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -386,6 +386,13 @@ public class CoreBlock extends StorageBlock{
|
|||||||
}else{
|
}else{
|
||||||
super.handleItem(source, item);
|
super.handleItem(source, item);
|
||||||
}
|
}
|
||||||
|
}else if(incinerate()){
|
||||||
|
if(items.get(item) >= storageCapacity){
|
||||||
|
//create item incineration effect at random intervals
|
||||||
|
if(!noEffect){
|
||||||
|
incinerateEffect(this, source);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public class Reconstructor extends UnitBlock{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TextureRegion[] icons(){
|
public TextureRegion[] icons(){
|
||||||
return new TextureRegion[]{region, outRegion, topRegion};
|
return new TextureRegion[]{region, inRegion, outRegion, topRegion};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -129,7 +129,7 @@ public class Reconstructor extends UnitBlock{
|
|||||||
//draw input
|
//draw input
|
||||||
for(int i = 0; i < 4; i++){
|
for(int i = 0; i < 4; i++){
|
||||||
if(blends(i) && i != rotation){
|
if(blends(i) && i != rotation){
|
||||||
Draw.rect(inRegion, x, y, i * 90);
|
Draw.rect(inRegion, x, y, (i * 90) - 180);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ public enum Stat{
|
|||||||
targetsGround(StatCat.function),
|
targetsGround(StatCat.function),
|
||||||
damage(StatCat.function),
|
damage(StatCat.function),
|
||||||
ammo(StatCat.function),
|
ammo(StatCat.function),
|
||||||
|
ammoUse(StatCat.function),
|
||||||
shieldHealth(StatCat.function),
|
shieldHealth(StatCat.function),
|
||||||
cooldownTime(StatCat.function),
|
cooldownTime(StatCat.function),
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public enum StatUnit{
|
|||||||
minutes,
|
minutes,
|
||||||
perSecond,
|
perSecond,
|
||||||
perMinute,
|
perMinute,
|
||||||
|
perShot,
|
||||||
timesSpeed(false),
|
timesSpeed(false),
|
||||||
percent(false),
|
percent(false),
|
||||||
shieldHealth,
|
shieldHealth,
|
||||||
|
|||||||
@@ -55,22 +55,22 @@ public class Stats{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void add(Stat stat, Attribute attr){
|
public void add(Stat stat, Attribute attr){
|
||||||
add(stat, attr, false, 1f);
|
add(stat, attr, false, 1f, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(Stat stat, Attribute attr, float scale){
|
public void add(Stat stat, Attribute attr, float scale){
|
||||||
add(stat, attr, false, scale);
|
add(stat, attr, false, scale, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(Stat stat, Attribute attr, boolean floating){
|
public void add(Stat stat, Attribute attr, boolean floating){
|
||||||
add(stat, attr, floating, 1f);
|
add(stat, attr, floating, 1f, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(Stat stat, Attribute attr, boolean floating, float scale){
|
public void add(Stat stat, Attribute attr, boolean floating, float scale, boolean startZero){
|
||||||
for(var block : Vars.content.blocks()
|
for(var block : Vars.content.blocks()
|
||||||
.select(block -> block instanceof Floor f && f.attributes.get(attr) != 0 && !(f.isLiquid && !floating))
|
.select(block -> block instanceof Floor f && f.attributes.get(attr) != 0 && !(f.isLiquid && !floating))
|
||||||
.<Floor>as().with(s -> s.sort(f -> f.attributes.get(attr)))){
|
.<Floor>as().with(s -> s.sort(f -> f.attributes.get(attr)))){
|
||||||
add(stat, new FloorEfficiencyValue(block, block.attributes.get(attr) * scale));
|
add(stat, new FloorEfficiencyValue(block, block.attributes.get(attr) * scale, startZero));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,10 @@ public class AmmoListValue<T extends UnlockableContent> implements StatValue{
|
|||||||
bt.add(Core.bundle.format("bullet.damage", type.damage));
|
bt.add(Core.bundle.format("bullet.damage", type.damage));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(type.buildingDamageMultiplier != 1){
|
||||||
|
sep(bt, Core.bundle.format("bullet.buildingdamage", type.buildingDamageMultiplier * 100));
|
||||||
|
}
|
||||||
|
|
||||||
if(type.splashDamage > 0){
|
if(type.splashDamage > 0){
|
||||||
sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1)));
|
sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,16 +10,18 @@ import mindustry.world.meta.*;
|
|||||||
public class FloorEfficiencyValue implements StatValue{
|
public class FloorEfficiencyValue implements StatValue{
|
||||||
private final Floor floor;
|
private final Floor floor;
|
||||||
private final float multiplier;
|
private final float multiplier;
|
||||||
|
private final boolean startZero;
|
||||||
|
|
||||||
public FloorEfficiencyValue(Floor floor, float multiplier){
|
public FloorEfficiencyValue(Floor floor, float multiplier, boolean startZero){
|
||||||
this.floor = floor;
|
this.floor = floor;
|
||||||
this.multiplier = multiplier;
|
this.multiplier = multiplier;
|
||||||
|
this.startZero = startZero;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void display(Table table){
|
public void display(Table table){
|
||||||
table.stack(new Image(floor.icon(Cicon.medium)).setScaling(Scaling.fit), new Table(t -> {
|
table.stack(new Image(floor.icon(Cicon.medium)).setScaling(Scaling.fit), new Table(t -> {
|
||||||
t.top().right().add((multiplier < 0 ? "[scarlet]" : "[accent]+") + (int)((multiplier) * 100) + "%").style(Styles.outlineLabel);
|
t.top().right().add((multiplier < 0 ? "[scarlet]" : startZero ? "[accent]" : "[accent]+") + (int)((multiplier) * 100) + "%").style(Styles.outlineLabel);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
org.gradle.daemon=true
|
org.gradle.daemon=true
|
||||||
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
||||||
archash=2eb670fd55b9210b804ae729293b358d5368f9f3
|
archash=b91cf2f8d2073bb03f6c07e8f8282c4039b10138
|
||||||
|
|||||||
@@ -10,8 +10,5 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"address": "mindustry.pl:6660"
|
"address": "mindustry.pl:6660"
|
||||||
},
|
|
||||||
{
|
|
||||||
"address": "be.wayzer.cf"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -54,5 +54,9 @@
|
|||||||
{
|
{
|
||||||
"name": "ALEX",
|
"name": "ALEX",
|
||||||
"address": ["alexmindustry.ddns.net:6568", "alexmindustry.ddns.net:6569"]
|
"address": ["alexmindustry.ddns.net:6568", "alexmindustry.ddns.net:6569"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Minty [subzero]",
|
||||||
|
"address": ["minty-server.ddns.net"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||