Survey Controller & Drone Feedback

Implemented task and control module for surveying resources
Implemented behavior for resource scanner
Resources aren't shown until they have been surveyed
Entities can now display messages, used to provide drone state feedback
Orbital entities now provide correct velocity, improving drone docking precision
This commit is contained in:
hyperion51 2020-05-29 23:06:35 +01:00
commit d78ad49762
30 changed files with 1136 additions and 66 deletions

View file

@ -2,6 +2,8 @@
using System.Linq;
using MessagePack;
using Newtonsoft.Json;
using Unity.Mathematics;
using static Unity.Mathematics.math;
[InspectableField, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
public class ResourceScannerData : BehaviorData
@ -12,21 +14,44 @@ public class ResourceScannerData : BehaviorData
[InspectableField, JsonProperty("minDensity"), Key(2)]
public PerformanceStat MinimumDensity = new PerformanceStat();
[InspectableField, JsonProperty("scanDuration"), Key(3)]
public PerformanceStat ScanDuration = new PerformanceStat();
public override IBehavior CreateInstance(GameContext context, Entity entity, Gear item)
{
return new ResourceScanner(context, this, entity, item);
}
}
public class ResourceScanner : IBehavior
public class ResourceScanner : IBehavior, IAlwaysUpdatedBehavior
{
public int Asteroid = -1;
private ResourceScannerData _data;
private float _scanTime;
private Guid _scanTarget;
private Entity Entity { get; }
private Gear Item { get; }
private GameContext Context { get; }
public BehaviorData Data => _data;
public float Range { get; private set; }
public float MinimumDensity { get; private set; }
public float ScanDuration { get; private set; }
public Guid ScanTarget
{
get => _scanTarget;
set
{
if (value != _scanTarget)
{
_scanTarget = value;
_scanTime = 0;
}
}
}
public ResourceScanner(GameContext context, ResourceScannerData data, Entity entity, Gear item)
{
@ -38,7 +63,45 @@ public class ResourceScanner : IBehavior
public bool Update(float delta)
{
// TODO: Implement resource scanners!
return true;
var planetData = Context.Cache.Get<PlanetData>(ScanTarget);
if (planetData != null)
{
if (planetData.Belt)
{
if(Asteroid > -1 &&
Asteroid < planetData.Asteroids.Length &&
length(Entity.Position - Context.GetAsteroidTransform(ScanTarget, Asteroid).xy) < Range)
{
_scanTime += delta;
if (_scanTime > ScanDuration)
{
Context.Cache.Get<Corporation>(Entity.Corporation).PlanetSurveyFloor[ScanTarget] = MinimumDensity;
_scanTime = 0;
}
return true;
}
}
else
{
if(length(Entity.Position - Context.GetOrbitPosition(planetData.Orbit)) < Range)
{
_scanTime += delta;
if (_scanTime > ScanDuration)
{
Context.Cache.Get<Corporation>(Entity.Corporation).PlanetSurveyFloor[ScanTarget] = MinimumDensity;
_scanTime = 0;
}
return true;
}
}
}
return false;
}
public void AlwaysUpdate(float delta)
{
Range = Context.Evaluate(_data.Range, Item, Entity);
MinimumDensity = Context.Evaluate(_data.MinimumDensity, Item, Entity);
ScanDuration = Context.Evaluate(_data.ScanDuration, Item, Entity);
}
}