Heavy armour and warheads
Not Enough Votes
I love to play with warheads but heavy armour feels little soft. One small warhead makes huge damage to heavy armour. I think perhaps even too much. Light armour can be butter, that's fine :)
I like this feedback
It is due to difference in how explosions work in both games, in SE2 its just AOE (damage bypasses armor, only distance is concidered)
In SE 1 it was (as per wiki:) "The explosion is volumetric for these and loses damage as it destroys blocks to get past until it runs out of damage."
Explained it more in here: https://support.keenswh.com/spaceengineers2/pc/topic/54951-warheads-too-powerful
IF possible, like the linked feedback as this one is kind of misleading.
(And by any means i do not mean to offend, its important to consolidate our feedback in one place so the message reaches devs)
It is due to difference in how explosions work in both games, in SE2 its just AOE (damage bypasses armor, only distance is concidered)
In SE 1 it was (as per wiki:) "The explosion is volumetric for these and loses damage as it destroys blocks to get past until it runs out of damage."
Explained it more in here: https://support.keenswh.com/spaceengineers2/pc/topic/54951-warheads-too-powerful
IF possible, like the linked feedback as this one is kind of misleading.
(And by any means i do not mean to offend, its important to consolidate our feedback in one place so the message reaches devs)
Heavy armor should be very resistant to surface explosions like warheads honestly since it's largely a matter of the material and thickness of said material that determines whether the pressure wave from the explosion is enough to cause the armor to buckle or transfer enough of said energy through the armor for micro fracturing. Without shaped charges and the like, armor would act as a reflector of sorts and direct the blast away from it.
In this case, it might be 'simplified' to measure the explosive effect on armor based on a minimum thickness of said material,. distance from the blast and how wide the unsupported surface is. A 2.5 meter thick block of heavy armor would shrug of a non shaped charge explosion out into the range of 10,000 kilograms of TNT. For perspective, that's 10 standard US mk-84 heavy aircraft bombs all hitting at the same time. At that level, you'd start to see some spalling on the back side (damage to the opposite side due to the shockwave passing through the material) and the surface might show some pitting and damage.
Thinner sheets of the same material would obviously take more damage from that blast, as would (oddly enough) a number of 2.5m blocks stacked together into a continuous wall. The reason is that a lot of that energy that passes into that 'wall' would cause it to buckle under the pressure, where a single 2.5m block has less ability to flex.
I'd like it if the damage calculations for explosions would not consider each block independently (like the SE1 model where it just damaged each block and then passed the rest of the damage through)
Also, the behavior of said explosives also depends on the atmospheric pressure. A warhead going boom in space is vastly different than one going boom at sea level in how it affects armor.
I dunno why, but I had Google AI crank out a sample algorithm and pseudocode (I'll call it that until I know it actually would work) for a rough concept. Apologies for the AI 'stuff' but it was just a lot easier this way.
Complete Code Implementation Template for Dynamic Armor Damage vs. Explosions in C#/VRAGE3
csharp
using System; using System.Collections.Generic; public class BlastDamageSystem { public struct BlockMaterialProfile { public bool IsArmor; // Identifies structural armor plating public float BaseYieldStrength; // Initial material strength limit in Megapascals (MPa) public float MaterialDensity; // Dense alloy rating (Heavy Armor >> Light Armor) public float AttenuationFactor; // Internal shockwave scattering coefficient (0.0 to 1.0) public float SizeInMeters; // Physical thickness of the block grid space public float Integrity; // Active block health pool public void Destroy() { /* Triggers block fracture debris meshes */ } public void ApplyVisualDeformation(float shockwaveIntensity) { /* Morphs the block geometry */ } } public interface IGridHitResult { IEnumerable<BlockMaterialProfile> GetBlocksAlongRayPath(Vector3 direction); } public struct Vector3 { public float X, Y, Z; } public void ProcessExplosionVector(Vector3 rayDirection, float distanceToGrid, IGridHitResult hitResult, float baseExplosionForce, float localAtmosphere) { // --------------------------------------------------------------------- // 1. ENVIRONMENTAL ATMOSPHERIC LAW // --------------------------------------------------------------------- float shockwaveMultiplier = Math.Clamp(localAtmosphere, 0.0f, 2.0f); float fragmentDamageMultiplier = 1.0f + (1.0f - Math.Clamp(localAtmosphere, 0.0f, 1.0f)) * 0.75f; // --------------------------------------------------------------------- // 2. VECTOR OVERPRESSURE AND SHRAPNEL INITIALIZATION // --------------------------------------------------------------------- float airShockPressure = (baseExplosionForce * shockwaveMultiplier) / (distanceToGrid * distanceToGrid); float shrapnelPressure = (baseExplosionForce * (1.0f - Math.Clamp(localAtmosphere, 0.0f, 1.0f)) * fragmentDamageMultiplier) / distanceToGrid; float currentVectorPressure = airShockPressure + shrapnelPressure; float cumulativeArmorThickness = 0.0f; // --------------------------------------------------------------------- // 3. CONTIGUOUS MATERIAL CONTINUITY LOOP // --------------------------------------------------------------------- foreach (BlockMaterialProfile targetBlock in hitResult.GetBlocksAlongRayPath(rayDirection)) { if (!targetBlock.IsArmor) { cumulativeArmorThickness = 0.0f; // Reset if the ray hits an air gap or machinery } else { cumulativeArmorThickness += targetBlock.SizeInMeters; // Accumulate thick slab depth } // --------------------------------------------------------------------- // 4. EXPONENTIAL BACKING LAW (MONOLITHIC THICKNESS CALCULATOR) // --------------------------------------------------------------------- float thicknessScalingFactor = 1.0f + (float)Math.Pow(cumulativeArmorThickness, 1.5); float effectiveYieldStrength = targetBlock.BaseYieldStrength * thicknessScalingFactor; // --------------------------------------------------------------------- // 5. MATERIAL DAMAGE REGIME EVALUATION // --------------------------------------------------------------------- if (currentVectorPressure < effectiveYieldStrength) { // REGIME A: SURFACE EROSION / TOTAL DEFLECTION targetBlock.Integrity -= (currentVectorPressure * 0.05f); currentVectorPressure = 0.0f; break; } else if (currentVectorPressure >= effectiveYieldStrength && currentVectorPressure < (effectiveYieldStrength * 3.0f)) { // REGIME B: MECHANICAL DEFORMATION & INTERNAL SPALLING targetBlock.Integrity -= currentVectorPressure; targetBlock.ApplyVisualDeformation(shockwaveMultiplier); // SHOCK ATTENUATION AND MASS DAMPENING currentVectorPressure *= (0.50f / (targetBlock.MaterialDensity * cumulativeArmorThickness)); } else { // REGIME C: PLUGGING / HYDRODYNAMIC PUNCH-THROUGH targetBlock.Destroy(); currentVectorPressure -= effectiveYieldStrength; } if (currentVectorPressure <= 0.01f) { break; } } } }Detailed Mathematical & Physics Logic Breakdown
1. Environmental Atmospheric Law
csharp
2. Vector Pressure Initialization
csharp
3. Contiguous Material Continuity Loop
csharp
if (!targetBlock.IsArmor) { cumulativeArmorThickness = 0.0f; } else { cumulativeArmorThickness += targetBlock.SizeInMeters; }4. Exponential Backing Law
csharp
5. Material Damage Regime Evaluation
Regime A: Surface Erosion / Total Deflection
csharp
if (currentVectorPressure < effectiveYieldStrength) { ... }Regime B: Mechanical Deformation & Internal Spalling
csharp
else if (currentVectorPressure >= effectiveYieldStrength && currentVectorPressure < (effectiveYieldStrength * 3.0f)) { targetBlock.Integrity -= currentVectorPressure; // ... SHOCK ATTENUATION AND MASS DAMPENING currentVectorPressure *= (0.50f / (targetBlock.MaterialDensity * cumulativeArmorThickness)); }Regime C: Plugging / Hydrodynamic Punch-Through
csharp
else { targetBlock.Destroy(); currentVectorPressure -= effectiveYieldStrength; }Heavy armor should be very resistant to surface explosions like warheads honestly since it's largely a matter of the material and thickness of said material that determines whether the pressure wave from the explosion is enough to cause the armor to buckle or transfer enough of said energy through the armor for micro fracturing. Without shaped charges and the like, armor would act as a reflector of sorts and direct the blast away from it.
In this case, it might be 'simplified' to measure the explosive effect on armor based on a minimum thickness of said material,. distance from the blast and how wide the unsupported surface is. A 2.5 meter thick block of heavy armor would shrug of a non shaped charge explosion out into the range of 10,000 kilograms of TNT. For perspective, that's 10 standard US mk-84 heavy aircraft bombs all hitting at the same time. At that level, you'd start to see some spalling on the back side (damage to the opposite side due to the shockwave passing through the material) and the surface might show some pitting and damage.
Thinner sheets of the same material would obviously take more damage from that blast, as would (oddly enough) a number of 2.5m blocks stacked together into a continuous wall. The reason is that a lot of that energy that passes into that 'wall' would cause it to buckle under the pressure, where a single 2.5m block has less ability to flex.
I'd like it if the damage calculations for explosions would not consider each block independently (like the SE1 model where it just damaged each block and then passed the rest of the damage through)
Also, the behavior of said explosives also depends on the atmospheric pressure. A warhead going boom in space is vastly different than one going boom at sea level in how it affects armor.
I dunno why, but I had Google AI crank out a sample algorithm and pseudocode (I'll call it that until I know it actually would work) for a rough concept. Apologies for the AI 'stuff' but it was just a lot easier this way.
Complete Code Implementation Template for Dynamic Armor Damage vs. Explosions in C#/VRAGE3
csharp
using System; using System.Collections.Generic; public class BlastDamageSystem { public struct BlockMaterialProfile { public bool IsArmor; // Identifies structural armor plating public float BaseYieldStrength; // Initial material strength limit in Megapascals (MPa) public float MaterialDensity; // Dense alloy rating (Heavy Armor >> Light Armor) public float AttenuationFactor; // Internal shockwave scattering coefficient (0.0 to 1.0) public float SizeInMeters; // Physical thickness of the block grid space public float Integrity; // Active block health pool public void Destroy() { /* Triggers block fracture debris meshes */ } public void ApplyVisualDeformation(float shockwaveIntensity) { /* Morphs the block geometry */ } } public interface IGridHitResult { IEnumerable<BlockMaterialProfile> GetBlocksAlongRayPath(Vector3 direction); } public struct Vector3 { public float X, Y, Z; } public void ProcessExplosionVector(Vector3 rayDirection, float distanceToGrid, IGridHitResult hitResult, float baseExplosionForce, float localAtmosphere) { // --------------------------------------------------------------------- // 1. ENVIRONMENTAL ATMOSPHERIC LAW // --------------------------------------------------------------------- float shockwaveMultiplier = Math.Clamp(localAtmosphere, 0.0f, 2.0f); float fragmentDamageMultiplier = 1.0f + (1.0f - Math.Clamp(localAtmosphere, 0.0f, 1.0f)) * 0.75f; // --------------------------------------------------------------------- // 2. VECTOR OVERPRESSURE AND SHRAPNEL INITIALIZATION // --------------------------------------------------------------------- float airShockPressure = (baseExplosionForce * shockwaveMultiplier) / (distanceToGrid * distanceToGrid); float shrapnelPressure = (baseExplosionForce * (1.0f - Math.Clamp(localAtmosphere, 0.0f, 1.0f)) * fragmentDamageMultiplier) / distanceToGrid; float currentVectorPressure = airShockPressure + shrapnelPressure; float cumulativeArmorThickness = 0.0f; // --------------------------------------------------------------------- // 3. CONTIGUOUS MATERIAL CONTINUITY LOOP // --------------------------------------------------------------------- foreach (BlockMaterialProfile targetBlock in hitResult.GetBlocksAlongRayPath(rayDirection)) { if (!targetBlock.IsArmor) { cumulativeArmorThickness = 0.0f; // Reset if the ray hits an air gap or machinery } else { cumulativeArmorThickness += targetBlock.SizeInMeters; // Accumulate thick slab depth } // --------------------------------------------------------------------- // 4. EXPONENTIAL BACKING LAW (MONOLITHIC THICKNESS CALCULATOR) // --------------------------------------------------------------------- float thicknessScalingFactor = 1.0f + (float)Math.Pow(cumulativeArmorThickness, 1.5); float effectiveYieldStrength = targetBlock.BaseYieldStrength * thicknessScalingFactor; // --------------------------------------------------------------------- // 5. MATERIAL DAMAGE REGIME EVALUATION // --------------------------------------------------------------------- if (currentVectorPressure < effectiveYieldStrength) { // REGIME A: SURFACE EROSION / TOTAL DEFLECTION targetBlock.Integrity -= (currentVectorPressure * 0.05f); currentVectorPressure = 0.0f; break; } else if (currentVectorPressure >= effectiveYieldStrength && currentVectorPressure < (effectiveYieldStrength * 3.0f)) { // REGIME B: MECHANICAL DEFORMATION & INTERNAL SPALLING targetBlock.Integrity -= currentVectorPressure; targetBlock.ApplyVisualDeformation(shockwaveMultiplier); // SHOCK ATTENUATION AND MASS DAMPENING currentVectorPressure *= (0.50f / (targetBlock.MaterialDensity * cumulativeArmorThickness)); } else { // REGIME C: PLUGGING / HYDRODYNAMIC PUNCH-THROUGH targetBlock.Destroy(); currentVectorPressure -= effectiveYieldStrength; } if (currentVectorPressure <= 0.01f) { break; } } } }Detailed Mathematical & Physics Logic Breakdown
1. Environmental Atmospheric Law
csharp
2. Vector Pressure Initialization
csharp
3. Contiguous Material Continuity Loop
csharp
if (!targetBlock.IsArmor) { cumulativeArmorThickness = 0.0f; } else { cumulativeArmorThickness += targetBlock.SizeInMeters; }4. Exponential Backing Law
csharp
5. Material Damage Regime Evaluation
Regime A: Surface Erosion / Total Deflection
csharp
if (currentVectorPressure < effectiveYieldStrength) { ... }Regime B: Mechanical Deformation & Internal Spalling
csharp
else if (currentVectorPressure >= effectiveYieldStrength && currentVectorPressure < (effectiveYieldStrength * 3.0f)) { targetBlock.Integrity -= currentVectorPressure; // ... SHOCK ATTENUATION AND MASS DAMPENING currentVectorPressure *= (0.50f / (targetBlock.MaterialDensity * cumulativeArmorThickness)); }Regime C: Plugging / Hydrodynamic Punch-Through
csharp
else { targetBlock.Destroy(); currentVectorPressure -= effectiveYieldStrength; }Some of this applies to my feedback of 'armor should have a minimum threshold for damage as some things you do to armor just shouldn't be enough to even scratch it. I should be abl eto shoot my pistol in game at a block of heavy armor all day and never do a point of damage, just coat the surface with splotches of lead and copper jacket.
Some of this applies to my feedback of 'armor should have a minimum threshold for damage as some things you do to armor just shouldn't be enough to even scratch it. I should be abl eto shoot my pistol in game at a block of heavy armor all day and never do a point of damage, just coat the surface with splotches of lead and copper jacket.
Possible solution:
Let’s imagine the explosive charge as a block. Upon detonation, it is surrounded by 26 other blocks in a 3x3x3 structure.
It is connected to 6 adjacent blocks by walls (neighborhood weight 1), to 12 blocks by edges (neighborhood weight 1/sqr 2 ~ 0.707), and to 8 blocks by corners (neighborhood weight 1/sqr 3 ~ 0.577).
According to this scheme, the explosion’s energy could be distributed to neighboring blocks.
A neighboring block absorbs the explosion’s energy and uses a certain portion (1/3 - 1/2 - 2/3 ???) is used to inflict damage on itself (if this energy exceeds the damage threshold—if not, it simply absorbs it), and the remaining energy is distributed to its own neighboring blocks, again in a 3x3x3 structure and according to the same scheme—this should simulate the transmission of a shock wave.
If a “neighboring block” is empty space, it distributes all the energy to the surrounding area.
If a block is destroyed while absorbing energy intended to damage it before the energy is fully consumed, the remaining portion is also distributed to the surrounding blocks.
In this model, a block can be struck by the explosion’s energy repeatedly.
In this model, a block can be damaged by a nearby explosion in open space.
The disadvantage is the computational complexity—the number of affected blocks increases very rapidly, roughly in the order of 27–125–343–729–1331.
I'm not a programmer, so I have no idea how this model could be translated into code.
Possible solution:
Let’s imagine the explosive charge as a block. Upon detonation, it is surrounded by 26 other blocks in a 3x3x3 structure.
It is connected to 6 adjacent blocks by walls (neighborhood weight 1), to 12 blocks by edges (neighborhood weight 1/sqr 2 ~ 0.707), and to 8 blocks by corners (neighborhood weight 1/sqr 3 ~ 0.577).
According to this scheme, the explosion’s energy could be distributed to neighboring blocks.
A neighboring block absorbs the explosion’s energy and uses a certain portion (1/3 - 1/2 - 2/3 ???) is used to inflict damage on itself (if this energy exceeds the damage threshold—if not, it simply absorbs it), and the remaining energy is distributed to its own neighboring blocks, again in a 3x3x3 structure and according to the same scheme—this should simulate the transmission of a shock wave.
If a “neighboring block” is empty space, it distributes all the energy to the surrounding area.
If a block is destroyed while absorbing energy intended to damage it before the energy is fully consumed, the remaining portion is also distributed to the surrounding blocks.
In this model, a block can be struck by the explosion’s energy repeatedly.
In this model, a block can be damaged by a nearby explosion in open space.
The disadvantage is the computational complexity—the number of affected blocks increases very rapidly, roughly in the order of 27–125–343–729–1331.
I'm not a programmer, so I have no idea how this model could be translated into code.
In the case of the suggestion above, to simplify, basically when a 'boom' happens, it determines the atmospheric pressure that the 'boom' happens in (which matters a lot to 'booms') and then shoots out invisible rays (vectors) from the point of 'boom'. When it encounters a material, it determines that material type and then continues through that material until it hits another material (or air/vacuum). This test ignores whether that material is one block or multiple blocks. Then it calculates the damage to the affected block(s) based on the distance from 'boom', material, thickness of said material (combined) and the atmospheric pressure the explosion happened at.
This would provide a fairly realistic explosion damage pattern, and if you threw in an added calculation (probably too resource intensive) for reflecting pressure waves, you could build your own shaped charges and the like, which would be awesome.
In the case of the suggestion above, to simplify, basically when a 'boom' happens, it determines the atmospheric pressure that the 'boom' happens in (which matters a lot to 'booms') and then shoots out invisible rays (vectors) from the point of 'boom'. When it encounters a material, it determines that material type and then continues through that material until it hits another material (or air/vacuum). This test ignores whether that material is one block or multiple blocks. Then it calculates the damage to the affected block(s) based on the distance from 'boom', material, thickness of said material (combined) and the atmospheric pressure the explosion happened at.
This would provide a fairly realistic explosion damage pattern, and if you threw in an added calculation (probably too resource intensive) for reflecting pressure waves, you could build your own shaped charges and the like, which would be awesome.
@Willhelm I commented on this in your other thread regarding minimum threshold, 2.5m armor in SE is not 2.5m "thick". Its a hollow box filled with trusses, with steel plates on the facades. A heavy is only 2x the mass of a light, as it uses twice the plates, so no, it wouldn't take 10 Mk84 bombs... The issue I have both here and in the other thread is this. a 2.5m block is:
Plate
Gap
Gap
Gap
Plate
5 deep of 0.5 blocks is
Plate
Gap
Plate
Plate
Gap
Plate
Plate
Gap
Plate
Where is Plate/Gap/Plate is 0.5m
And this is considered in the build cost, if you break it down and the "plates" per 0.5m2 as per the other thread. I'm not saying I disagree at all with the proposal or what you're suggesting should happen though, I'm just pointing out that armor and it's cost would need an overhaul to achieve what you're after. With the unified grid system I do think it's bonkers that, again as I said before, I need to break up a 5x5 large block into 125 little blocks just so I can paint a pinstripe down it.
1 2.5 Cube = 1070 hitpoints
125 0.5 Cubes (same volume) = 3,648.75 hitpoints
I've seen some other games that solved this issue by having a base set of blocks that you can stretch in the 3 axis's, so a 2.5m cube is a scaled up 0.5m cube, which scales the build cost for surface area, but the surface is the same thickness, so all light armor is X mm thick no matter how big it is. Want it thicker... layer it.
@Willhelm I commented on this in your other thread regarding minimum threshold, 2.5m armor in SE is not 2.5m "thick". Its a hollow box filled with trusses, with steel plates on the facades. A heavy is only 2x the mass of a light, as it uses twice the plates, so no, it wouldn't take 10 Mk84 bombs... The issue I have both here and in the other thread is this. a 2.5m block is:
Plate
Gap
Gap
Gap
Plate
5 deep of 0.5 blocks is
Plate
Gap
Plate
Plate
Gap
Plate
Plate
Gap
Plate
Where is Plate/Gap/Plate is 0.5m
And this is considered in the build cost, if you break it down and the "plates" per 0.5m2 as per the other thread. I'm not saying I disagree at all with the proposal or what you're suggesting should happen though, I'm just pointing out that armor and it's cost would need an overhaul to achieve what you're after. With the unified grid system I do think it's bonkers that, again as I said before, I need to break up a 5x5 large block into 125 little blocks just so I can paint a pinstripe down it.
1 2.5 Cube = 1070 hitpoints
125 0.5 Cubes (same volume) = 3,648.75 hitpoints
I've seen some other games that solved this issue by having a base set of blocks that you can stretch in the 3 axis's, so a 2.5m cube is a scaled up 0.5m cube, which scales the build cost for surface area, but the surface is the same thickness, so all light armor is X mm thick no matter how big it is. Want it thicker... layer it.
Replies have been locked on this page!