Skip to content

Commit

Permalink
Added GetFilteredEntities to EntityManager and fixed bugs in MoveToNe…
Browse files Browse the repository at this point in the history
…arestAction
  • Loading branch information
behindcurtain3 committed Apr 27, 2024
1 parent 34f57ce commit 66603cb
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;

namespace Pulsar4X.SDL2UI;
namespace Pulsar4X.DataStructures;

[Flags]
public enum EntityFilter
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Pulsar4X.SDL2UI;
namespace Pulsar4X.DataStructures;

public enum FilterLogic
{
Expand Down
44 changes: 44 additions & 0 deletions Pulsar4X/GameEngine/Engine/Entities/EntityManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@ public class EntityManager
[PublicAPI]
public static readonly EntityManager InvalidManager = new EntityManager();

/// <summary>
/// Used to filter the entities that we should consider valid targets
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public delegate bool FilterEntities(Entity entity);


#region Constructors
Expand Down Expand Up @@ -691,6 +697,44 @@ public bool TryGetGlobalEntityById(int entityId, out Entity entity)
return false;
}

public List<Entity> GetFilteredEntities(EntityFilter entityFilter, int factionId)
{
return GetFilteredEntities(entityFilter, factionId, null, FilterLogic.And);
}

public List<Entity> GetFilteredEntities(EntityFilter entityFilter, int factionId, FilterEntities filter)
{
return GetFilteredEntities(entityFilter, factionId, null, FilterLogic.And, filter);
}

public List<Entity> GetFilteredEntities(EntityFilter entityFilter, int factionId, Type? datablobFilter = null)
{
return GetFilteredEntities(entityFilter, factionId, datablobFilter == null ? null : new List<Type>() { datablobFilter });
}

public List<Entity> GetFilteredEntities(EntityFilter entityFilter, int factionId, List<Type>? datablobFilter = null, FilterLogic filterLogic = FilterLogic.And, FilterEntities? filter = null)
{
return _entities.Values.Where(entity =>
((entityFilter.HasFlag(EntityFilter.Friendly) && entity.FactionOwnerID == factionId) ||
(entityFilter.HasFlag(EntityFilter.Neutral) && entity.FactionOwnerID == Game.NeutralFactionId) ||
(entityFilter.HasFlag(EntityFilter.Hostile) && entity.FactionOwnerID != factionId && entity.FactionOwnerID != Game.NeutralFactionId && EvaluateSensorContact(entity, factionId))) &&
(datablobFilter == null || datablobFilter.Count == 0 || EvaluateDataBlobs(entity, datablobFilter, filterLogic)) &&
(filter == null || filter(entity)))
.ToList();
}

private bool EvaluateDataBlobs(Entity entity, List<Type> dataTypes, FilterLogic logic)
{
var results = dataTypes.Select(type => entity.HasDataBlob(type)).ToList();

return logic == FilterLogic.And ? results.All(x => x) : results.Any(x => x);
}

private bool EvaluateSensorContact(Entity entity, int factionId)
{
return _factionSensorContacts.ContainsKey(factionId) && _factionSensorContacts[factionId].SensorContactExists(entity.Id);
}

private bool AreAllDataBlobDependenciesPresent(Type type, int entityId, HashSet<Type> visitedTypes, int depth)
{
// We don't want to check this on the intial type that is passed in
Expand Down
24 changes: 11 additions & 13 deletions Pulsar4X/GameEngine/Engine/Orders/Actions/MoveToNearestAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using GameEngine.WarpMove;
using Pulsar4X.Orbital;
using Pulsar4X.Datablobs;
using Pulsar4X.DataStructures;
using Pulsar4X.Extensions;

namespace Pulsar4X.Engine.Orders
Expand All @@ -20,19 +21,14 @@ public class MoveToNearestAction : EntityCommand
/// <summary>
/// Entity commanding is a fleet in this action
/// </summary>
private Entity _entityCommanding;
protected Entity _entityCommanding;
internal override Entity EntityCommanding
{
get { return _entityCommanding; }
}

/// <summary>
/// Used to filter the entities that we should consider valid targets
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public delegate bool EntityFilter(Entity entity);
public EntityFilter Filter { get; protected set; }
public EntityManager.FilterEntities Filter { get; protected set; }
public EntityFilter EntityFactionFilter { get; protected set; } = EntityFilter.Friendly | EntityFilter.Neutral | EntityFilter.Hostile;

private List<EntityCommand> _shipCommands = new List<EntityCommand>();

Expand All @@ -54,8 +50,10 @@ private void FindNearestAndSetupWarpCommands()
if(!flagship.TryGetDatablob<PositionDB>(out var flagshipPositionDB)) return;

// Get all entites based on the filter
List<Entity> entities = EntityCommanding.Manager.GetEntitiesAvailableToFaction(RequestingFactionGuid);
var filteredEntities = entities.Where(e => Filter(e)).ToList();
List<Entity> filteredEntities = EntityCommanding.Manager.GetFilteredEntities(
EntityFactionFilter,
RequestingFactionGuid,
Filter);

Entity? closestValidEntity = null;
double closestDistance = double.MaxValue;
Expand Down Expand Up @@ -92,22 +90,22 @@ private void FindNearestAndSetupWarpCommands()
{
if(!ship.HasDataBlob<WarpAbilityDB>()) continue;
if(!ship.TryGetDatablob<PositionDB>(out var shipPositionDB)) continue;
if(shipPositionDB.Parent == closestEntityPositionDB.Parent) continue;
if(shipPositionDB.Parent == closestEntityPositionDB.OwningEntity) continue;

var shipMass = ship.GetDataBlob<MassVolumeDB>().MassTotal;

(Vector3 position, DateTime _) = WarpMath.GetInterceptPosition
(
ship,
closestEntityPositionDB.Parent.GetDataBlob<OrbitDB>(),
closestValidEntity.GetDataBlob<OrbitDB>(),
EntityCommanding.StarSysDateTime
);

Vector3 targetPos = Vector3.Normalise(position) * targetSMA;

// Create the movement order
var cargoLibrary = EntityCommanding.GetFactionOwner.GetDataBlob<FactionInfoDB>().Data.CargoGoods;
(WarpMoveCommand warpCommand, NewtonThrustCommand? thrustCommand) = WarpMoveCommand.CreateCommand(cargoLibrary, RequestingFactionGuid, ship, closestEntityPositionDB.Parent, targetPos, EntityCommanding.StarSysDateTime, new Vector3() , shipMass);
(WarpMoveCommand warpCommand, NewtonThrustCommand? thrustCommand) = WarpMoveCommand.CreateCommand(cargoLibrary, RequestingFactionGuid, ship, closestValidEntity, targetPos, EntityCommanding.StarSysDateTime, new Vector3() , shipMass);
_shipCommands.Add(warpCommand);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,14 @@ private bool GeoSurveyFilter(Entity entity)

public static MoveToNearestGeoSurveyAction CreateCommand(int factionId, Entity commandingEntity)
{
var command = MoveToNearestAction.CreateCommand<MoveToNearestGeoSurveyAction>(factionId, commandingEntity);
var command = new MoveToNearestGeoSurveyAction()
{
_entityCommanding = commandingEntity,
UseActionLanes = true,
RequestingFactionGuid = factionId,
EntityCommandingGuid = commandingEntity.Id,
EntityFactionFilter = DataStructures.EntityFilter.Friendly | DataStructures.EntityFilter.Neutral
};
command.Filter = command.GeoSurveyFilter;
return command;
}
Expand Down

0 comments on commit 66603cb

Please sign in to comment.