Mini bomb changes (#7454)
This commit is contained in:
@@ -182,8 +182,7 @@ public sealed partial class ExplosionSystem : EntitySystem
|
||||
string id,
|
||||
EntityQuery<TransformComponent> xformQuery,
|
||||
EntityQuery<DamageableComponent> damageQuery,
|
||||
EntityQuery<PhysicsComponent> physicsQuery,
|
||||
EntityQuery<MetaDataComponent> metaQuery)
|
||||
EntityQuery<PhysicsComponent> physicsQuery)
|
||||
{
|
||||
var gridBox = new Box2(tile * grid.TileSize, (tile + 1) * grid.TileSize);
|
||||
|
||||
@@ -216,11 +215,23 @@ public sealed partial class ExplosionSystem : EntitySystem
|
||||
|
||||
// process anchored entities
|
||||
var tileBlocked = false;
|
||||
foreach (var entity in grid.GetAnchoredEntities(tile).ToList())
|
||||
var anchoredList = grid.GetAnchoredEntities(tile).ToList();
|
||||
foreach (var entity in anchoredList)
|
||||
{
|
||||
processed.Add(entity);
|
||||
ProcessEntity(entity, epicenter, damage, throwForce, id, damageQuery, physicsQuery);
|
||||
tileBlocked |= IsBlockingTurf(entity, physicsQuery);
|
||||
}
|
||||
|
||||
// Walls and reinforced walls will break into girders. These girders will also be considered turf-blocking for
|
||||
// the purposes of destroying floors. Again, ideally the process of damaging an entity should somehow return
|
||||
// information about the entities that were spawned as a result, but without that information we just have to
|
||||
// re-check for new anchored entities. Compared to entity spawning & deleting, this should still be relatively minor.
|
||||
if (anchoredList.Count > 0)
|
||||
{
|
||||
foreach (var entity in grid.GetAnchoredEntities(tile))
|
||||
{
|
||||
tileBlocked |= IsBlockingTurf(entity, physicsQuery);
|
||||
}
|
||||
}
|
||||
|
||||
// Next, we get the intersecting entities AGAIN, but purely for throwing. This way, glass shards spawned from
|
||||
@@ -261,8 +272,7 @@ public sealed partial class ExplosionSystem : EntitySystem
|
||||
string id,
|
||||
EntityQuery<TransformComponent> xformQuery,
|
||||
EntityQuery<DamageableComponent> damageQuery,
|
||||
EntityQuery<PhysicsComponent> physicsQuery,
|
||||
EntityQuery<MetaDataComponent> metaQuery)
|
||||
EntityQuery<PhysicsComponent> physicsQuery)
|
||||
{
|
||||
var gridBox = new Box2(tile * DefaultTileSize, (DefaultTileSize, DefaultTileSize));
|
||||
var worldBox = spaceMatrix.TransformBox(gridBox);
|
||||
@@ -370,10 +380,15 @@ public sealed partial class ExplosionSystem : EntitySystem
|
||||
public void DamageFloorTile(TileRef tileRef,
|
||||
float effectiveIntensity,
|
||||
int maxTileBreak,
|
||||
bool canCreateVacuum,
|
||||
List<(Vector2i GridIndices, Tile Tile)> damagedTiles,
|
||||
ExplosionPrototype type)
|
||||
{
|
||||
var tileDef = _tileDefinitionManager[tileRef.Tile.TypeId];
|
||||
if (_tileDefinitionManager[tileRef.Tile.TypeId] is not ContentTileDefinition tileDef)
|
||||
return;
|
||||
|
||||
if (tileDef.IsSpace)
|
||||
canCreateVacuum = true; // is already a vacuum.
|
||||
|
||||
int tileBreakages = 0;
|
||||
while (maxTileBreak > tileBreakages && _robustRandom.Prob(type.TileBreakChance(effectiveIntensity)))
|
||||
@@ -381,14 +396,17 @@ public sealed partial class ExplosionSystem : EntitySystem
|
||||
tileBreakages++;
|
||||
effectiveIntensity -= type.TileBreakRerollReduction;
|
||||
|
||||
if (tileDef is not ContentTileDefinition contentTileDef)
|
||||
break;
|
||||
|
||||
// does this have a base-turf that we can break it down to?
|
||||
if (contentTileDef.BaseTurfs.Count == 0)
|
||||
if (tileDef.BaseTurfs.Count == 0)
|
||||
break;
|
||||
|
||||
tileDef = _tileDefinitionManager[contentTileDef.BaseTurfs[^1]];
|
||||
if (_tileDefinitionManager[tileDef.BaseTurfs[^1]] is not ContentTileDefinition newDef)
|
||||
break;
|
||||
|
||||
if (newDef.IsSpace && !canCreateVacuum)
|
||||
break;
|
||||
|
||||
tileDef = newDef;
|
||||
}
|
||||
|
||||
if (tileDef.TileId == tileRef.Tile.TypeId)
|
||||
@@ -493,7 +511,6 @@ sealed class Explosion
|
||||
private readonly EntityQuery<TransformComponent> _xformQuery;
|
||||
private readonly EntityQuery<PhysicsComponent> _physicsQuery;
|
||||
private readonly EntityQuery<DamageableComponent> _damageQuery;
|
||||
private readonly EntityQuery<MetaDataComponent> _metaQuery;
|
||||
|
||||
/// <summary>
|
||||
/// Total area that the explosion covers.
|
||||
@@ -510,6 +527,11 @@ sealed class Explosion
|
||||
/// </summary>
|
||||
private readonly int _maxTileBreak;
|
||||
|
||||
/// <summary>
|
||||
/// Whether this explosion can turn non-vacuum tiles into vacuum-tiles.
|
||||
/// </summary>
|
||||
private readonly bool _canCreateVacuum;
|
||||
|
||||
private readonly IEntityManager _entMan;
|
||||
private readonly ExplosionSystem _system;
|
||||
|
||||
@@ -526,6 +548,7 @@ sealed class Explosion
|
||||
int area,
|
||||
float tileBreakScale,
|
||||
int maxTileBreak,
|
||||
bool canCreateVacuum,
|
||||
IEntityManager entMan,
|
||||
IMapManager mapMan)
|
||||
{
|
||||
@@ -537,12 +560,12 @@ sealed class Explosion
|
||||
|
||||
_tileBreakScale = tileBreakScale;
|
||||
_maxTileBreak = maxTileBreak;
|
||||
_canCreateVacuum = canCreateVacuum;
|
||||
_entMan = entMan;
|
||||
|
||||
_xformQuery = entMan.GetEntityQuery<TransformComponent>();
|
||||
_physicsQuery = entMan.GetEntityQuery<PhysicsComponent>();
|
||||
_damageQuery = entMan.GetEntityQuery<DamageableComponent>();
|
||||
_metaQuery = entMan.GetEntityQuery<MetaDataComponent>();
|
||||
|
||||
if (spaceData != null)
|
||||
{
|
||||
@@ -682,12 +705,11 @@ sealed class Explosion
|
||||
ExplosionType.ID,
|
||||
_xformQuery,
|
||||
_damageQuery,
|
||||
_physicsQuery,
|
||||
_metaQuery);
|
||||
_physicsQuery);
|
||||
|
||||
// If the floor is not blocked by some dense object, damage the floor tiles.
|
||||
if (canDamageFloor)
|
||||
_system.DamageFloorTile(tileRef, _currentIntensity * _tileBreakScale, _maxTileBreak, tileUpdateList, ExplosionType);
|
||||
_system.DamageFloorTile(tileRef, _currentIntensity * _tileBreakScale, _maxTileBreak, _canCreateVacuum, tileUpdateList, ExplosionType);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -703,8 +725,7 @@ sealed class Explosion
|
||||
ExplosionType.ID,
|
||||
_xformQuery,
|
||||
_damageQuery,
|
||||
_physicsQuery,
|
||||
_metaQuery);
|
||||
_physicsQuery);
|
||||
}
|
||||
|
||||
if (!MoveNext())
|
||||
|
||||
Reference in New Issue
Block a user