Exemple #1
0
        public static void Update(GameTime gameTime)
        {
            for (var node = _list.First; node != null;)
            {
                var npc  = node.Value;
                var next = node.Next;
                npc.Update(gameTime);
                if (npc.IsDeath)
                {
                    if (npc.IsBodyIniOk &&
                        !npc.IsNodAddBody &&
                        npc.SummonedByMagicSprite == null) //Not summoned npc
                    {
                        npc.BodyIni.PositionInWorld  = npc.PositionInWorld;
                        npc.BodyIni.CurrentDirection = npc.CurrentDirection;
                        ObjManager.AddObj(npc.BodyIni);
                    }
                    ObjManager.AddObj(GoodDrop.GetDropObj(npc));
                    DeleteNpc(node);
                }
                node = next;
            }

            for (var node = DeathInfos.First; node != null;)
            {
                var info = node.Value;
                var next = node.Next;
                info.LeftFrameToKeep--;
                if (info.LeftFrameToKeep <= 0)
                {
                    DeathInfos.Remove(node);
                }
                node = next;
            }
        }
Exemple #2
0
        public override bool HasObstacle(Vector2 tilePosition)
        {
            if (Kind == (int)CharacterKind.Flyer)
            {
                return(false);
            }

            return(NpcManager.IsObstacle(tilePosition) ||
                   ObjManager.IsObstacle(tilePosition) ||
                   MagicManager.IsObstacle(tilePosition) ||
                   Globals.ThePlayer.TilePosition == tilePosition);
        }
Exemple #3
0
 private void UpdatePlaying(GameTime gameTime)
 {
     if (Globals.IsInSuperMagicMode)
     {
         Globals.SuperModeMagicSprite.Update(gameTime);
         if (Globals.SuperModeMagicSprite.IsDestroyed)
         {
             Globals.IsInSuperMagicMode   = false;
             Globals.SuperModeMagicSprite = null;
         }
         return;//Just update super magic
     }
     else if (TimeStoperMagicSprite != null)
     {
         TimeStoperMagicSprite.BelongCharacter.Update(gameTime);
         TimeStoperMagicSprite.Update(gameTime);
         MapBase.Instance.Update(gameTime);
         MagicManager.UpdateMagicSpritesInView();
         NpcManager.UpdateNpcsInView();
         ObjManager.UpdateObjsInView();
         return;
     }
     //Player
     Globals.ThePlayer.Update(gameTime);
     //Magic list
     MagicManager.Update(gameTime);
     MagicManager.UpdateMagicSpritesInView();
     //Npc list
     NpcManager.Update(gameTime);
     NpcManager.UpdateNpcsInView();
     //Obj list
     ObjManager.Update(gameTime);
     ObjManager.UpdateObjsInView();
     //Map
     MapBase.Instance.Update(gameTime);
     //Weather
     WeatherManager.Update(gameTime);
 }
Exemple #4
0
        /// <summary>
        /// Use magic.
        /// </summary>
        /// <param name="user">The magic user.</param>
        /// <param name="magic">Magic to use.</param>
        /// <param name="origin">Magic initial pixel postion in world.</param>
        /// <param name="destination">Magic destination pixel postiont in world.</param>
        /// <param name="target">Magic target</param>
        /// <param name="recursiveCounter"></param>
        public static void UseMagic(Character user, Magic magic, Vector2 origin, Vector2 destination, Character target = null, int recursiveCounter = 0)
        {
            if (user == null || magic == null)
            {
                return;
            }

            if (magic.SecondMagicFile != null)
            {
                AddUseMagicItem(new UseMagicInfoItem(magic.SecondMagicDelay, user, magic.SecondMagicFile, origin, destination, target));
            }

            if (magic.BodyRadius > 0 && target != null && recursiveCounter == 0)
            {
                foreach (var body in ObjManager.GetBodyInRaidus(target.TilePosition, magic.BodyRadius, true))
                {
                    UseMagic(user, magic, body.PositionInWorld, destination, target, recursiveCounter + 1);
                }
                return;
            }

            _maigicSpriteIndex = 0;

            if (magic.FlyingSound != null)
            {
                magic.FlyingSound.Play();
            }

            if (magic.BeginAtMouse > 0)
            {
                var dir = origin - destination;
                if (dir != Vector2.Zero)
                {
                    dir.Normalize();
                }
                origin = destination + dir;
            }
            else if (magic.BeginAtUser > 0)
            {
                destination = origin;
            }
            else if (magic.BeginAtUserAddDirectionOffset > 0)
            {
                var dir = destination - origin;
                if (dir != Vector2.Zero)
                {
                    dir.Normalize();
                }
                destination = origin + dir;
            }
            else if (magic.BeginAtUserAddUserDirectionOffset > 0)
            {
                var dir = Utils.GetDirection8(user.CurrentDirection);
                destination = origin + dir;
            }

            if (magic.MeteorMove > 0)
            {
                origin = destination;
            }

            switch (magic.MoveKind)
            {
            case 1:
                AddFixedPositionMagicSprite(user, magic, destination, true);
                break;

            case 2:
                AddMagicSprite(GetMoveMagicSprite(user, magic, origin, destination, false, GetSpeedRatio(destination - origin)));
                break;

            case 3:
                AddLineMoveMagicSprite(user, magic, origin, destination, false);
                break;

            case 4:
                AddCircleMoveMagicSprite(user, magic, origin, false);
                break;

            case 5:
                AddHeartMoveMagicSprite(user, magic, origin, false);
                break;

            case 6:
                AddSpiralMoveMagicSprite(user, magic, origin, destination, false);
                break;

            case 7:
                AddSectorMoveMagicSprite(user, magic, origin, destination, false);
                break;

            case 8:
                AddRandomSectorMoveMagicSprite(user, magic, origin, destination, false);
                break;

            case 9:
                AddFixedWallMagicSprite(user, magic, origin, destination, true);
                break;

            case 10:
                AddWallMoveMagicSprite(user, magic, origin, destination, false);
                break;

            case 11:
            {
                switch (magic.Region)
                {
                case 1:
                    AddSquareFixedPositionMagicSprite(user, magic, destination, true);
                    break;

                case 2:
                    AddCrossFixedPositionMagicSprite(user, magic, origin, true);
                    break;

                case 3:
                    AddRegtangleFixedPositionMagicSprite(user, magic, origin, destination, true);
                    break;

                case 4:
                    AddIsoscelesTriangleMagicSprite(user, magic, origin, destination, true);
                    break;

                case 5:
                    AddVTypeFixedPOsitionMagicSprite(user, magic, origin, destination, true);
                    break;

                case 6:
                    AddRegionFileMagicSprite(user, magic, origin, destination, true);
                    break;
                }
                break;
            }

            case 13:
            case 23:
                AddFollowCharacterMagicSprite(user, magic, origin, true, target);
                break;

            case 15:
                AddSuperModeMagic(user, magic, origin, true);
                break;

            case 16:
                AddFollowEnemyMagicSprite(user, magic, origin, destination, false);
                break;

            case 17:
                AddThrowMagicSprite(user, magic, origin, destination, true);
                break;

            case 18:
                //Empty
                break;

            case 19:
            {
                var info = new Kind19MagicInfo(magic.KeepMilliseconds, magic, user);
                _kind19Magics.AddLast(info);
            }
            break;

            case 20:
            {
                //Can't use transport magic when in transport
                if (!user.IsInTransport)
                {
                    user.IsInTransport = true;
                    AddFixedPositionMagicSprite(user, magic, destination, true);
                }
            }
            break;

            case 21:
            {
                var player = user as Player;
                if (player != null &&
                    target != null &&
                    !target.IsDeathInvoked &&     // Can't control dead people
                    target.Level <= magic.MaxLevel
                    )
                {
                    player.ControledCharacter = target;
                    AddFixedPositionMagicSprite(user, magic, user.PositionInWorld, true);
                }
            }
            break;

            case 22:
            {
                AddFixedPositionMagicSprite(user, magic, destination, true);
            }
            break;
            }

            //Magic side effect
            if (magic.SideEffectProbability > 0 &&
                Globals.TheRandom.Next(0, 100) < magic.SideEffectProbability)
            {
                var amount = ((GetEffectAmount(magic, user) + GetEffectAmount2(magic, user)) * magic.SideEffectPercent) / 100;
                switch ((Magic.SideEffectDamageType)magic.SideEffectType)
                {
                case Magic.SideEffectDamageType.Life:
                    user.DecreaseLifeAddHurt(amount);
                    break;

                case Magic.SideEffectDamageType.Mana:
                    user.AddMana(-amount);
                    break;

                case Magic.SideEffectDamageType.Thew:
                    user.AddThew(-amount);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            if (magic.DieAfterUse > 0)
            {
                user.Death();
            }
        }
Exemple #5
0
 public override bool HasObstacle(Vector2 tilePosition)
 {
     return(NpcManager.IsObstacle(tilePosition) ||
            ObjManager.IsObstacle(tilePosition) ||
            MagicManager.IsObstacle(tilePosition));
 }