mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 11:24:46 +00:00
59 lines
1.6 KiB
C#
59 lines
1.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|