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:
13
Content.Server/AI/Utility/Curves/BoolCurve.cs
Normal file
13
Content.Server/AI/Utility/Curves/BoolCurve.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
10
Content.Server/AI/Utility/Curves/IResponseCurve.cs
Normal file
10
Content.Server/AI/Utility/Curves/IResponseCurve.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
11
Content.Server/AI/Utility/Curves/InverseBoolCurve.cs
Normal file
11
Content.Server/AI/Utility/Curves/InverseBoolCurve.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
28
Content.Server/AI/Utility/Curves/LogisticCurve.cs
Normal file
28
Content.Server/AI/Utility/Curves/LogisticCurve.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Content.Server/AI/Utility/Curves/QuadraticCurve.cs
Normal file
31
Content.Server/AI/Utility/Curves/QuadraticCurve.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user