예제 #1
0
        public IEnumerator <YieldInstruction> ProcessEndAnim(Character user, Character target, BattleData data)
        {
            //trigger animations of target
            if (data.HitCharAnim != 0)
            {
                StaticCharAnimation charAnim = CharAnimation.GetCharAnim(data.HitCharAnim);
                charAnim.AnimLoc = target.CharLoc;
                charAnim.CharDir = target.CharDir;
                yield return(CoroutineManager.Instance.StartCoroutine(target.StartAnim(charAnim)));
            }


            //play battle FX
            foreach (BattleFX fx in data.IntroFX)
            {
                yield return(CoroutineManager.Instance.StartCoroutine(ProcessBattleFX(user, target, fx)));
            }

            //play sound
            GameManager.Instance.BattleSE(data.HitFX.Sound);
            //the animation
            FiniteEmitter endEmitter = (FiniteEmitter)data.HitFX.Emitter.Clone();

            endEmitter.SetupEmit(target.MapLoc, user.MapLoc, target.CharDir);
            CreateAnim(endEmitter, DrawLayer.NoDraw);
            SetScreenShake(new ScreenMover(data.HitFX.ScreenMovement));
            yield return(new WaitForFrames(GameManager.Instance.ModifyBattleSpeed(data.HitFX.Delay, target.CharLoc)));
        }
예제 #2
0
        public IEnumerator <YieldInstruction> ReleaseExplosion(Loc tile, Character user, DungeonScene.HitboxEffect effect, DungeonScene.HitboxEffect hitEffect)
        {
            foreach (BattleFX fx in IntroFX)
            {
                //play sound
                GameManager.Instance.BattleSE(fx.Sound);
                //the animation
                FiniteEmitter fxEmitter = (FiniteEmitter)fx.Emitter.Clone();
                fxEmitter.SetupEmit(tile * GraphicsManager.TileSize, user.MapLoc, user.CharDir);
                DungeonScene.Instance.CreateAnim(fxEmitter, DrawLayer.NoDraw);
                DungeonScene.Instance.SetScreenShake(new ScreenMover(fx.ScreenMovement));
                yield return(new WaitForFrames(GameManager.Instance.ModifyBattleSpeed(fx.Delay, tile)));
            }

            GameManager.Instance.BattleSE(ExplodeFX.Sound);
            FiniteEmitter emitter = (FiniteEmitter)ExplodeFX.Emitter.Clone();

            emitter.SetupEmit(tile * GraphicsManager.TileSize, user.MapLoc, user.CharDir);
            DungeonScene.Instance.CreateAnim(emitter, DrawLayer.NoDraw);
            DungeonScene.Instance.SetScreenShake(new ScreenMover(ExplodeFX.ScreenMovement));

            yield return(CoroutineManager.Instance.StartCoroutine(DungeonScene.Instance.ReleaseHitboxes(user,
                                                                                                        new CircleSquareHitbox(user, TargetAlignments, HitTiles, TileAlignment.None, tile, TileEmitter, Emitter, Range, Speed, ExplodeFX.Delay, Hitbox.AreaLimit.Full, user.CharDir),
                                                                                                        effect, hitEffect)));
        }
예제 #3
0
 public ExplosionData()
 {
     ExplodeFX   = new BattleFX();
     IntroFX     = new List <BattleFX>();
     Emitter     = new EmptyCircleSquareEmitter();
     TileEmitter = new EmptyFiniteEmitter();
 }
예제 #4
0
        //===================================
        //  VFX
        //===================================



        /// <summary>
        /// Plays a VFX
        /// </summary>
        /// <param name="chara"></param>
        /// <param name="anim"></param>
        public void PlayVFX(FiniteEmitter emitter, int x, int y, Dir8 dir = Dir8.Down, int xTo = -1, int yTo = -1)
        {
            FiniteEmitter endEmitter = (FiniteEmitter)emitter.Clone();
            Loc           endLoc     = (x > -1) ? new Loc(x, y) : Loc.Zero;

            endEmitter.SetupEmit(new Loc(x, y), endLoc, dir);
            GroundScene.Instance.CreateAnim(endEmitter, DrawLayer.NoDraw);
        }
예제 #5
0
 public Hitbox(Character user, Loc mapLoc, FiniteEmitter tileEmitter, int delay)
 {
     User          = user;
     MapLoc        = mapLoc;
     TileEmitter   = (FiniteEmitter)tileEmitter.Clone();
     TilesToEmit   = new StablePriorityQueue <int, Loc>();
     TilesToHit    = new StablePriorityQueue <int, Loc>();
     LagBehindTime = delay;
 }
예제 #6
0
 public StaticHitbox(Character user, Alignment targetAlignments, bool hitTiles, TileAlignment burstTiles, Loc origin, FiniteEmitter tileEmitter, FiniteEmitter emitter, int delay)
     : base(user, origin * GraphicsManager.TileSize, tileEmitter, delay)
 {
     TargetAlignments = targetAlignments;
     HitTiles         = hitTiles;
     BurstTiles       = burstTiles;
     Origin           = origin;
     Emitter          = (FiniteEmitter)emitter.Clone();
     Emitter.SetupEmit(MapLoc, user.MapLoc, user.CharDir);
 }
예제 #7
0
        public IEnumerator <YieldInstruction> ProcessBattleFX(Loc userLoc, Loc targetLoc, Dir8 userDir, BattleFX fx)
        {
            //play sound
            GameManager.Instance.BattleSE(fx.Sound);
            //the animation
            FiniteEmitter fxEmitter = (FiniteEmitter)fx.Emitter.Clone();

            fxEmitter.SetupEmit(targetLoc * GraphicsManager.TileSize, userLoc * GraphicsManager.TileSize, userDir);
            CreateAnim(fxEmitter, DrawLayer.NoDraw);
            SetScreenShake(new ScreenMover(fx.ScreenMovement));
            yield return(new WaitForFrames(GameManager.Instance.ModifyBattleSpeed(fx.Delay, targetLoc)));
        }
예제 #8
0
 public ArcingHitbox(Character user, Loc startPoint, AnimData anim, FiniteEmitter tileEmitter, AttachPointEmitter emitter, Loc endPoint, int speed, int item, int delay)
     : base(user, startPoint * GraphicsManager.TileSize, tileEmitter, delay)
 {
     StartPoint  = startPoint;
     EndPoint    = endPoint;
     ItemAnim    = item;
     MaxDistance = (int)Math.Sqrt(((EndPoint - StartPoint) * GraphicsManager.TileSize).DistSquared());
     Speed       = (speed > 0) ? speed : Math.Max(1, (int)Math.Ceiling((double)MaxDistance / GraphicsManager.TileSize * GraphicsManager.MAX_FPS));
     Anim        = new AnimData(anim);
     Emitter     = (AttachPointEmitter)emitter.Clone();
     Emitter.SetupEmit(User, MapLoc, User.MapLoc, user.CharDir, LocHeight);
 }
예제 #9
0
        public virtual void Update(FrameTick elapsedTime)
        {
            time += elapsedTime;

            while (TilesToEmit.Count > 0 && time >= TilesToEmit.FrontPriority())
            {
                int priority = TilesToEmit.FrontPriority();
                Loc tile     = TilesToEmit.Dequeue();

                FiniteEmitter tileEmitter = (FiniteEmitter)TileEmitter.Clone();
                tileEmitter.SetupEmit(tile * GraphicsManager.TileSize, User.MapLoc, User.CharDir);
                DungeonScene.Instance.CreateAnim(tileEmitter, DrawLayer.NoDraw);
            }
        }
예제 #10
0
 public ExplosionData(ExplosionData other)
 {
     TargetAlignments = other.TargetAlignments;
     HitTiles         = other.HitTiles;
     Range            = other.Range;
     Speed            = other.Speed;
     ExplodeFX        = new BattleFX(other.ExplodeFX);
     IntroFX          = new List <BattleFX>();
     foreach (BattleFX fx in other.IntroFX)
     {
         IntroFX.Add(new BattleFX(fx));
     }
     Emitter     = (CircleSquareEmitter)other.Emitter.Clone();
     TileEmitter = (FiniteEmitter)other.TileEmitter.Clone();
 }
예제 #11
0
 //the class will be in charge of its own hitbox movement
 //however, the current-action member of its owner may terminate early and remove this hitbox prematurely.
 //the owner class will guarantee that this hitbox will cover all the right places, as well as disposing this hitbox
 public AttachedCircleHitbox(Character user, Alignment targetAlignments, bool hitTiles, bool burstOnWall, Loc startPoint, AnimData anim, int animOffset,
                             FiniteEmitter tileEmitter, AttachPointEmitter emitter, int maxDistance, int dashTime, Dir8 dir, bool wide, int delay)
     : base(user, startPoint * GraphicsManager.TileSize, tileEmitter, delay)
 {
     TargetAlignments = targetAlignments;
     HitTiles         = hitTiles;
     BurstOnWall      = burstOnWall;
     StartPoint       = startPoint;
     MaxDistance      = maxDistance;
     DashTime         = dashTime;
     Dir        = dir;
     Wide       = wide;
     Anim       = new AnimData(anim);
     AnimOffset = animOffset;
     Emitter    = (AttachPointEmitter)emitter.Clone();
     Emitter.SetupEmit(User, MapLoc, MapLoc, user.CharDir, LocHeight);
 }
예제 #12
0
        public override IEnumerator <YieldInstruction> Apply(GameEventOwner owner, Character ownerChar, BattleContext context)
        {
            if (context.ContextStates.Contains <Redirected>())
            {
                yield break;
            }

            if (context.ActionType == BattleActionType.Trap || context.ActionType == BattleActionType.Item)
            {
                yield break;
            }

            //must be a status move
            if (context.Data.Category != BattleData.SkillCategory.Status)
            {
                yield break;
            }

            //attacker must be target
            if (context.User != context.Target)
            {
                yield break;
            }


            GameManager.Instance.BattleSE(Sound);
            if (!ownerChar.Unidentifiable)
            {
                FiniteEmitter endEmitter = (FiniteEmitter)Emitter.Clone();
                endEmitter.SetupEmit(ownerChar.MapLoc, ownerChar.MapLoc, ownerChar.CharDir);
                DungeonScene.Instance.CreateAnim(endEmitter, DrawLayer.NoDraw);
            }

            CharAnimAction SpinAnim = new CharAnimAction(ownerChar.CharLoc, (context.Target.CharLoc - ownerChar.CharLoc).ApproximateDir8(), 05);//Attack

            SpinAnim.MajorAnim = true;

            yield return(CoroutineManager.Instance.StartCoroutine(ownerChar.StartAnim(SpinAnim)));

            yield return(new WaitWhile(ownerChar.OccupiedwithAction));

            DungeonScene.Instance.LogMsg(String.Format(new StringKey("MSG_SNATCH").ToLocal(), ownerChar.GetDisplayName(false)));
            context.Target = ownerChar;
            context.ContextStates.Set(new Redirected());
        }
예제 #13
0
 public BeamSweepHitbox(Character user, Alignment targetAlignments, bool tileAlignments, bool burstOnWall, Loc startPoint, BeamAnimData anim, FiniteEmitter tileEmitter,
                        int speed, int delay, Dir8 dir, int maxDistance, bool wide, int linger)
     : base(user, startPoint * GraphicsManager.TileSize, tileEmitter, delay)
 {
     TargetAlignments = targetAlignments;
     HitTiles         = tileAlignments;
     BurstOnWall      = burstOnWall;
     StartPoint       = startPoint;
     EndPoint         = MapLoc;
     Dir         = dir;
     MaxDistance = maxDistance;
     Speed       = (speed > 0) ? speed : Math.Max(1, MaxDistance * GraphicsManager.MAX_FPS);
     Wide        = wide;
     Linger      = linger;
     Anim        = new BeamAnimData(anim);
 }
예제 #14
0
 public CircleSweepHitbox(Character user, Alignment targetAlignments, bool hitTiles, bool burstOnWall, Loc startPoint, AnimData anim, FiniteEmitter tileEmitter,
                          AttachPointEmitter emitter, int speed, int delay, Dir8 dir, int maxDistance, bool boomerang, int item)
     : base(user, startPoint * GraphicsManager.TileSize + dir.GetLoc() * GraphicsManager.TileSize / 2, tileEmitter, delay)
 {
     TargetAlignments = targetAlignments;
     HitTiles         = hitTiles;
     BurstOnWall      = burstOnWall;
     StartPoint       = startPoint;
     Dir = dir;
     DistanceTraveled = GraphicsManager.TileSize / 2;
     MaxDistance      = maxDistance;
     Boomerang        = boomerang;
     Speed            = (speed > 0) ? speed : Math.Max(1, (int)Math.Ceiling((double)(MaxDistance - 0.5 + (Boomerang ? MaxDistance : 0)) * GraphicsManager.MAX_FPS));
     ItemAnim         = item;
     reverse          = 1;
     Anim             = new AnimData(anim);
     Emitter          = (AttachPointEmitter)emitter.Clone();
     Emitter.SetupEmit(User, MapLoc, User.MapLoc, user.CharDir, LocHeight);
 }
예제 #15
0
 public CircleSquareHitbox(Character user, Alignment targetAlignments, bool hitTiles, TileAlignment burstTiles, Loc origin, FiniteEmitter tileEmitter,
                           CircleSquareEmitter emitter, int maxRadius, int speed, int delay, AreaLimit hitArea, Dir8 dir)
     : base(user, origin * GraphicsManager.TileSize, tileEmitter, delay)
 {
     TargetAlignments = targetAlignments;
     HitTiles         = hitTiles;
     BurstTiles       = burstTiles;
     Origin           = origin;
     MaxRadius        = maxRadius;
     Speed            = (speed > 0) ? speed : Math.Max(1, (int)Math.Ceiling(MaxRadius * 1.4142136 * GraphicsManager.MAX_FPS));
     HitArea          = hitArea;
     Dir     = dir;
     Emitter = (CircleSquareEmitter)emitter.Clone();
     Emitter.SetupEmit(MapLoc, user.CharDir, HitArea, MaxRadius * GraphicsManager.TileSize + GraphicsManager.TileSize / 2, Speed * GraphicsManager.TileSize);
 }
예제 #16
0
 public SnatchEvent()
 {
     Emitter = new EmptyFiniteEmitter();
 }
예제 #17
0
 public SelfHitbox(Character user, FiniteEmitter tileEmitter, int delay)
     : base(user, user.CharLoc * GraphicsManager.TileSize, tileEmitter, delay)
 {
 }
예제 #18
0
 public SnatchEvent(FiniteEmitter emitter, string sound)
     : this()
 {
     Emitter = emitter;
     Sound   = sound;
 }
예제 #19
0
 protected SnatchEvent(SnatchEvent other)
     : this()
 {
     Emitter = (FiniteEmitter)other.Emitter.Clone();
     Sound   = other.Sound;
 }