Exemplo n.º 1
0
 public FightInformation(AttackInformation attack1, AttackInformation attack2, AttackInformation back1, AttackInformation back2)
 {
     this.Attack1 = attack1;
     this.Attack2 = attack2;
     this.Back1   = back1;
     this.Back2   = back2;
 }
Exemplo n.º 2
0
        private static AttackInformation MagicFrom(MagicDefinition magic, FDCreature subject, FDCreature target, GameField field)
        {
            bool isHit = FDRandom.BoolFromRate(magic.HittingRate);

            int changedHp = 0;

            if (isHit)
            {
                OccupationDefinition occupation = DefinitionStore.Instance.GetOccupationDefinition(target.Definition.Occupation);
                double hitRate = 1.0f;

                if (occupation != null)
                {
                    hitRate = (100 - occupation.MagicDefendRate) / 100.0f;
                }

                switch (magic.Type)
                {
                case MagicType.Attack:
                    changedHp = -FDRandom.IntFromSpan(magic.Span) + magic.ApInvoledRate * subject.Data.CalculatedAp / 100;
                    changedHp = (int)(changedHp * hitRate);
                    changedHp = Math.Min(0, changedHp);
                    break;

                case MagicType.Recover:
                    changedHp = FDRandom.IntFromSpan(magic.Span);
                    changedHp = Math.Max(0, changedHp);
                    break;

                case MagicType.Offensive:
                    TakeOffensiveEffect(magic, target);
                    break;

                case MagicType.Defensive:
                    TakeDefensiveEffect(magic, target);
                    break;

                default:
                    break;
                }
            }

            AttackInformation info = new AttackInformation(target.Data.Hp, target.Data.Hp + changedHp, false);

            target.Data.UpdateHp(changedHp);

            return(info);
        }
Exemplo n.º 3
0
        private static AttackInformation AttackFrom(FDCreature subject, FDCreature target, GameField field)
        {
            bool isHit      = FDRandom.BoolFromRate(subject.Data.CalculatedHit - target.Data.CalculatedEv);
            bool isCritical = FDRandom.BoolFromRate(commonCriticalAttackRate);

            int reduceHp = 0;

            if (isHit)
            {
                FDPosition      pos        = subject.Position;
                ShapeDefinition shape      = field.GetShapeAt(pos.X, pos.Y);
                int             adjustedAp = subject.Data.CalculatedAp * (100 + shape.AdjustedAp) / 100;

                FDPosition      targetPos   = target.Position;
                ShapeDefinition targetShape = field.GetShapeAt(targetPos.X, targetPos.Y);
                int             adjustedDp  = target.Data.CalculatedDp * (100 + shape.AdjustedDp) / 100;

                int attackMax = adjustedAp - adjustedDp;
                int attackMin = (int)(attackMax * 0.9f);
                reduceHp = FDRandom.IntFromSpan(attackMin, attackMax);
                reduceHp = (reduceHp < 0) ? 0 : reduceHp;

                if (isCritical)
                {
                    reduceHp *= 2;
                }

                // Poisoned
                AttackItemDefinition attackItem = subject.Data.GetAttackItem();
                if (attackItem != null)
                {
                    bool isPoisoned = FDRandom.BoolFromRate(attackItem.GetPoisonRate());
                    if (isPoisoned)
                    {
                        target.Data.SetEffect(CreatureData.CreatureEffects.Poisoned);
                    }
                }
            }

            AttackInformation info = new AttackInformation(target.Data.Hp, target.Data.Hp - reduceHp, isCritical);

            target.Data.UpdateHp(-reduceHp);

            return(info);
        }
Exemplo n.º 4
0
        public static MagicalInformation DealWithMagic(int magicId, FDCreature subject, List <FDCreature> targetList, GameField field)
        {
            MagicalInformation result = new MagicalInformation();

            MagicDefinition magic = DefinitionStore.Instance.GetMagicDefinition(magicId);

            if (magic == null)
            {
                return(null);
            }

            if (subject == null || targetList == null)
            {
                throw new ArgumentNullException("subject or targetList");
            }

            int totalExp = 0;

            foreach (FDCreature target in targetList)
            {
                AttackInformation magicInfo = MagicFrom(magic, subject, target, field);
                result.AddInformation(magicInfo);

                if (magic.Type == MagicType.Attack || magic.Type == MagicType.Recover)
                {
                    totalExp += CalculateAttackExp(subject, target, magicInfo);
                }
                else
                {
                    totalExp += CalculateMagicExp(subject, target, magic);
                }
            }

            if (totalExp > 0)
            {
                // Gain Experience
            }

            return(result);
        }
Exemplo n.º 5
0
 public void AddInformation(AttackInformation info)
 {
     this.Informations.Add(info);
 }
Exemplo n.º 6
0
 private static int CalculateAttackExp(FDCreature subject, FDCreature target, AttackInformation info)
 {
     return(0);
 }
Exemplo n.º 7
0
        public static FightInformation DealWithAttack(FDCreature subject, FDCreature target, GameField field, bool canFightBack)
        {
            AttackInformation attack1 = AttackFrom(subject, target, field);
            AttackInformation attack2 = null;
            AttackInformation back1   = null;
            AttackInformation back2   = null;

            int exp1     = CalculateAttackExp(subject, target, attack1);
            int backExp1 = 0;

            if (target.Data.Hp > 0)
            {
                bool isDoubleHit = FDRandom.BoolFromRate(commonDoubleAttackRate);

                if (isDoubleHit)
                {
                    attack2 = AttackFrom(subject, target, field);
                    exp1   += CalculateAttackExp(subject, target, attack2);
                }

                if (exp1 > 0)
                {
                    // Gain Experience
                }
            }
            else
            {
                // Gain Experience
            }

            // Fight back
            if (canFightBack && target.Data.Hp > 0)
            {
                back1    = AttackFrom(target, subject, field);
                backExp1 = CalculateAttackExp(target, subject, back1);

                bool isDoubleHit = FDRandom.BoolFromRate(commonDoubleAttackRate);
                if (subject.Data.Hp > 0 && isDoubleHit)
                {
                    back2     = AttackFrom(target, subject, field);
                    backExp1 += CalculateAttackExp(target, subject, back1);

                    if (subject.Data.Hp > 0)
                    {
                        // Gain Experience
                    }
                    else
                    {
                        // Gain Experience
                    }
                }
                else
                {
                    // Gain Experience
                }
            }
            else
            {
                // Gain Experience
            }

            FightInformation fighting = new FightInformation(attack1, attack2, back1, back2);

            return(fighting);
        }