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 loopOptions; public override List GetAnimations(int actorNumber, int seed) { int numberOfActors = loopOptions[0].animationDefs.Count; List animations = new List(); 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 animationDefs; } }