rimworld-animations/1.5/Source/GroupAnimations/GroupAnimationStages/AnimationStage_LoopRandomSe...

62 lines
1.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
namespace Rimworld_Animations
{
public class AnimationStage_LoopRandomSelectChance : AnimationStage
{
public int loops;
public List<AnimationLoopOption> loopOptions;
public override List<AnimationDef> GetAnimations(int actorNumber, int seed)
{
int numberOfActors = loopOptions[0].animationDefs.Count;
List<AnimationDef> animations = new List<AnimationDef>();
for (int i = 0; i < loops; i++)
{
AnimationLoopOption option = getAnimationLoopOptionByWeight(seed + i);
animations.Add(option.animationDefs[actorNumber]);
}
return animations;
}
//select random element from loop options by weight; also calculate the longest anim length
private AnimationLoopOption getAnimationLoopOptionByWeight(int seed)
{
int totalWeight = loopOptions.Sum(x => x.probability);
int randomNumber = ((seed * 59) % totalWeight) + 1;
int cumulativeWeight = 0;
for (int i = 0; i < loopOptions.Count; i++) {
cumulativeWeight += loopOptions[i].probability;
//random number is same for all pawns because they all have the same seed
if (randomNumber <= cumulativeWeight)
{
return loopOptions[i];
}
}
//default
return loopOptions.Last();
}
}
public class AnimationLoopOption
{
public int probability;
public List<AnimationDef> animationDefs;
}
}