コード例 #1
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);
        }
コード例 #2
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);
        }
コード例 #3
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);
        }