public void RunAnimation( string keyPath, AnimationCurve curve, // TODO create a new struct Location propLocation = Location.None, float propProbability = 0, float propDelay = 0) { var lockFlag = AnimationKeyPath.ToTileMutexFlag(keyPath); mutex |= lockFlag; animatable.AddAnimationCurve(keyPath, curve); float animFinishTime = 0; foreach (var k in curve.keys) { animFinishTime = Mathf.Max(animFinishTime, k.time); } StartCoroutine(C.WithDelay(() => { mutex ^= lockFlag; }, animFinishTime)); if (propProbability.IsNonZero() && Random.value < propProbability) { var next = TileAtLocation(propLocation); if (next != null) { StartCoroutine(C.WithDelay(() => { next.RunAnimation(keyPath, curve, propLocation, propProbability, propDelay); }, propDelay)); } } }
public Tile TileAtLocation(Location loc, TileMutexFlag mutexFlag = TileMutexFlag.None) { var targetTiles = adjacentFlags; if (mutexFlag != TileMutexFlag.None) { foreach (var kv in adjacent) { if (kv.Value.IsLocked(mutexFlag)) { targetTiles ^= kv.Key; } } } var chosenLocation = loc.ChooseRandom(targetTiles); if (chosenLocation == Location.None) { return(null); } return(adjacent[chosenLocation]); }
public bool IsLocked(TileMutexFlag flag) { return((mutex & flag) != 0); }