Example #1
0
        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;
                }
            }
        }
Example #2
0
 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")
     });
Example #3
0
 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")
     });
Example #4
0
        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;
        }
Example #5
0
        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));
                    }
                }
            }
        }
Example #6
0
        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));
                }
            }
        }
Example #7
0
 public EmittingAnim(AnimData anim, IEmittable emittable, DrawLayer layer, int cycles, int totalTime) : base(anim, cycles, totalTime)
 {
     ResultAnim = emittable; Layer = layer;
 }
Example #8
0
 public EmittingAnim(AnimData anim, IEmittable emittable, DrawLayer layer) : base(anim)
 {
     ResultAnim = emittable; Layer = layer;
 }