59 lines
1.6 KiB
C#
Raw Permalink Normal View History

2024-08-17 14:12:46 +08:00
using System;
using System.Text.RegularExpressions;
namespace BehaviorTreeSlayer
{
public class MagicRandom : CompositeNode
{
[OutField]
public int[] Power;
TreeNode last;
public override TaskResult Tick(double dt, object args = null)
{
if (childs.Count == 0) return TaskResult.Fail;
childs.Sort((a, b) => a.x < b.x ? -1 : 1);
if (last == null)
{
Index = CheckRandom();
}
if (last != childs[Index])
{
childs[Index].Enter(args);
}
TreeNode curNode = childs[Index];
TaskResult result = curNode.Tick(dt, args);
last = curNode;
curNode.state = result;
if (result == TaskResult.Running)
{
return TaskResult.Running;
}
curNode.Exit(args);
Index = CheckRandom();
return result;
}
int CheckRandom()
{
int sum = 0;
int length = Power.Length <= childs.Count ? Power.Length : childs.Count;
for (int i = 0; i < length; i++)
{
sum += Power[i];
}
double r = new Random().NextDouble() * sum;
int cache = 0;
for (int i = 0; i < length; i++)
{
cache += Power[i];
if (cache > r)
{
return i;
}
}
return length - 1;
}
}
}