public override void Update(BaseScene scene, FrameTick elapsedTime) { CurrentBurstTime += elapsedTime; while (CurrentBurstTime >= Math.Max(1, BurstTime)) { CurrentBurstTime -= Math.Max(1, BurstTime); for (int ii = 0; ii < ParticlesPerBurst; ii++) { List <int> openDirs = getOpenDirs(); int openIndex = openDirs[MathUtils.Rand.Next(openDirs.Count)]; Coverages[openIndex] = true; double angle = (openIndex + MathUtils.Rand.NextDouble()) * Math.PI / 4; Loc startDelta = new Loc((int)Math.Round(Math.Cos(angle) * Range), (int)Math.Round(Math.Sin(angle) * Range)); if (Anims.Count > 0) { IEmittable chosenAnim = Anims[MathUtils.Rand.Next(Anims.Count)]; scene.Anims[(int)Layer].Add(chosenAnim.CreateStatic(Origin + startDelta, LocHeight, Dir)); } } CurrentBursts++; if (CurrentBursts >= Bursts) { break; } } }
public static IEmittable.Emitter Type2Emitter(Type type) { return(type switch { Type.Add => IEmittable.EmitterFromOpCode(OpCodes.Add), Type.Subtract => IEmittable.EmitterFromOpCode(OpCodes.Sub), Type.Multiply => IEmittable.EmitterFromOpCode(OpCodes.Mul), Type.Divide => IEmittable.EmitterFromOpCode(OpCodes.Div), Type.LogicalAnd => IEmittable.EmitterFromOpCode(OpCodes.And), Type.LogicalOr => IEmittable.EmitterFromOpCode(OpCodes.Or), Type.Greater => IEmittable.EmitterFromOpCode(OpCodes.Cgt), Type.Lower => IEmittable.EmitterFromOpCode(OpCodes.Clt), Type.Eq => IEmittable.EmitterFromOpCode(OpCodes.Ceq), Type.GreaterEq => gen => { gen.Emit(OpCodes.Clt); gen.Emit(OpCodes.Ldc_I4_1); gen.Emit(OpCodes.Sub); }, Type.LowerEq => gen => { gen.Emit(OpCodes.Cgt); gen.Emit(OpCodes.Ldc_I4_1); gen.Emit(OpCodes.Sub); }, Type.Neq => gen => { gen.Emit(OpCodes.Ceq); gen.Emit(OpCodes.Ldc_I4_1); gen.Emit(OpCodes.Sub); }, _ => throw new InvalidEnumArgumentException("Invalid type for binary operation") });
public static IEmittable.Emitter Type2Emitter(Type type) { return(type switch { Type.Negate => IEmittable.EmitterFromOpCode(OpCodes.Neg), Type.Plus => gen => { }, Type.LogicalNot => gen => { gen.Emit(OpCodes.Ldc_I4_1); gen.Emit(OpCodes.Sub); }, _ => throw new InvalidEnumArgumentException("Invalid type for unary operation") });
public MoveToAnim(AnimData anim, IEmittable emittable, DrawLayer layer, int moveTime, Loc startLoc, Loc newEndPos, int startHeight, int endHeight, int lingerStart, int lingerEnd, Dir8 dir) : base(anim, moveTime + lingerStart + lingerEnd) { MovingTime = moveTime; StartLoc = startLoc; EndLoc = newEndPos; StartHeight = startHeight; EndHeight = endHeight; Direction = dir; LingerStart = lingerStart; LingerEnd = lingerEnd; locHeight = StartHeight; mapLoc = StartLoc; ResultAnim = emittable; Layer = layer; }
public override void Update(BaseScene scene, FrameTick elapsedTime) { ActionTime += elapsedTime; int prevRadius = CurrentRadius; CurrentRadius = (int)ActionTime.FractionOf(Speed, GraphicsManager.MAX_FPS); int prevParticles = 0; int currentParticles = TotalParticles; if (Range > 0) { prevParticles = TotalParticles * prevRadius * prevRadius / Range / Range; currentParticles = TotalParticles * CurrentRadius * CurrentRadius / Range / Range; } for (int ii = prevParticles; ii < currentParticles; ii++) { List <int> openDirs = getOpenDirs(); int openIndex = openDirs[MathUtils.Rand.Next(openDirs.Count)]; Coverages[openIndex] = true; double angle = (openIndex + MathUtils.Rand.NextDouble()) * Math.PI / 4; int dist = CurrentRadius; if (dist >= 0 && dist <= Range) { Loc startDelta = new Loc((int)Math.Round(Math.Cos(angle) * dist), (int)Math.Round(Math.Sin(angle) * dist)); if (Anims.Count > 0) { IEmittable chosenAnim = Anims[MathUtils.Rand.Next(Anims.Count)]; scene.Anims[(int)Layer].Add(chosenAnim.CreateStatic(Origin + startDelta, LocHeight, Dir)); } } } }
public override void Update(BaseScene scene, FrameTick elapsedTime) { ActionTime += elapsedTime; int prevRadius = CurrentRadius; CurrentRadius = (int)ActionTime.FractionOf(Speed, GraphicsManager.MAX_FPS); int endRange = Range + RangeDiff; if (CurrentRadius > endRange) { CurrentRadius = endRange; } int totalParticles = (int)Math.Round(ParticlesPerTile * (Math.PI * endRange * endRange) / GraphicsManager.TileSize / GraphicsManager.TileSize); int prevParticles = 0; int currentParticles = totalParticles; if (Range > 0) { prevParticles = totalParticles * prevRadius * prevRadius / endRange / endRange; currentParticles = totalParticles * CurrentRadius * CurrentRadius / endRange / endRange; } for (int ii = prevParticles; ii < currentParticles; ii++) { List <int> openDirs = getOpenDirs(); int openIndex = openDirs[MathUtils.Rand.Next(openDirs.Count)]; Coverages[openIndex] = true; double angle = (openIndex + MathUtils.Rand.NextDouble()) * Math.PI / 4; Loc startDelta = new Loc(); int dist = CurrentRadius; if (AreaLimit == Dungeon.Hitbox.AreaLimit.Cone) { angle = (45 * (int)Dir + 45) * Math.PI / 180 + angle / 4; } else if (AreaLimit == Dungeon.Hitbox.AreaLimit.Sides) { dist -= GraphicsManager.TileSize / 2; int diffDist = MathUtils.Rand.Next(GraphicsManager.TileSize / 2 + 1); startDelta += new Loc((int)Math.Round(Math.Cos(angle) * diffDist), (int)Math.Round(Math.Sin(angle) * diffDist)); if (Dir.IsDiagonal()) { //either +135 or -135 from the direction if (MathUtils.Rand.Next(2) == 0) { angle = (45 * (int)Dir + 90 + 135) * Math.PI / 180; } else { angle = (45 * (int)Dir + 90 - 135) * Math.PI / 180; } } else { //either +90 or -90 from the direction if (MathUtils.Rand.Next(2) == 0) { angle = (45 * (int)Dir + 90 + 90) * Math.PI / 180; } else { angle = (45 * (int)Dir + 90 - 90) * Math.PI / 180; } } } startDelta += new Loc((int)Math.Round(Math.Cos(angle) * dist), (int)Math.Round(Math.Sin(angle) * dist)); if (Anims.Count > 0) { IEmittable chosenAnim = Anims[MathUtils.Rand.Next(Anims.Count)]; scene.Anims[(int)Layer].Add(chosenAnim.CreateStatic(Origin + startDelta, LocHeight, Dir)); } } }
public EmittingAnim(AnimData anim, IEmittable emittable, DrawLayer layer, int cycles, int totalTime) : base(anim, cycles, totalTime) { ResultAnim = emittable; Layer = layer; }
public EmittingAnim(AnimData anim, IEmittable emittable, DrawLayer layer) : base(anim) { ResultAnim = emittable; Layer = layer; }