Add utility AI (#806)

Co-authored-by: Pieter-Jan Briers <pieterjan.briers@gmail.com>
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
This commit is contained in:
metalgearsloth
2020-06-18 22:52:44 +10:00
committed by GitHub
parent 9b8cedf6c6
commit 5391d3c72a
211 changed files with 10335 additions and 527 deletions

View File

@@ -0,0 +1,13 @@
namespace Content.Server.AI.Utility.Curves
{
/// <summary>
/// For stuff that's a simple 0.0f or 1.0f
/// </summary>
public struct BoolCurve : IResponseCurve
{
public float GetResponse(float score)
{
return score > 0.0f ? 1.0f : 0.0f;
}
}
}

View File

@@ -0,0 +1,10 @@
namespace Content.Server.AI.Utility.Curves
{
/// <summary>
/// Using an interface also lets us define preset curves that can be re-used
/// </summary>
public interface IResponseCurve
{
float GetResponse(float score);
}
}

View File

@@ -0,0 +1,11 @@
namespace Content.Server.AI.Utility.Curves
{
public struct InverseBoolCurve : IResponseCurve
{
public float GetResponse(float score)
{
// ReSharper disable once CompareOfFloatsByEqualityOperator
return score == 0.0f ? 1.0f : 0.0f;
}
}
}

View File

@@ -0,0 +1,28 @@
using System;
namespace Content.Server.AI.Utility.Curves
{
public struct LogisticCurve : IResponseCurve
{
private readonly float _slope;
private readonly float _exponent;
// Vertical shift
private readonly float _yOffset;
// Horizontal shift
private readonly float _xOffset;
public LogisticCurve(float slope, float exponent, float yOffset, float xOffset)
{
_slope = slope;
_exponent = exponent;
_yOffset = yOffset;
_xOffset = xOffset;
}
public float GetResponse(float score)
{
return _exponent * (1 / (1 + (float) Math.Pow(Math.Log(1000) * _slope, -1 * score + _xOffset))) + _yOffset;
}
}
}

View File

@@ -0,0 +1,31 @@
using System;
namespace Content.Server.AI.Utility.Curves
{
/// <summary>
/// Also Linear
/// </summary>
public struct QuadraticCurve : IResponseCurve
{
private readonly float _slope;
private readonly float _exponent;
// Vertical shift
private readonly float _yOffset;
// Horizontal shift
private readonly float _xOffset;
public QuadraticCurve(float slope, float exponent, float yOffset, float xOffset)
{
_slope = slope;
_exponent = exponent;
_yOffset = yOffset;
_xOffset = xOffset;
}
public float GetResponse(float score)
{
return _slope * (float) Math.Pow(score - _xOffset, _exponent) + _yOffset;
}
}
}