Exemplo n.º 1
0
        protected DamageFormula GetFormula(XmlNode formulaNode, Lua lua)
        {
            DamageFormula formula = null;

            if (formulaNode != null)
            {
                XmlNode codeNode = formulaNode.SelectSingleNode("custom");

                if (codeNode != null)
                {
                    string      code = String.Format("return function (source, target, modifiers) {0} end", codeNode.InnerText);
                    LuaFunction customFormula;

                    try
                    {
                        customFormula = (LuaFunction)lua.DoString(code).First();
                    }
                    catch (Exception ex)
                    {
                        throw new ImplementationException("Error loading ability custom formula; name = " + Name, ex);
                    }

                    formula = delegate(Combatant source, Combatant target, AbilityModifiers modifiers)
                    {
                        object formulaResult = customFormula.Call(source, target, modifiers).First(); // it's a double

                        return(Convert.ToInt32(formulaResult));
                    };
                }
                else
                {
                    formula = (DamageFormula)Delegate.CreateDelegate(typeof(DamageFormula), this, formulaNode.InnerText);
                }
            }
            else
            {
                switch (Type)
                {
                case AttackType.Magical:
                    formula = MagicalAttack;
                    break;

                case AttackType.Physical:
                    formula = PhysicalAttack;
                    break;

                default:
                    throw new GameDataException("Neither a damage formula nor an attack type defined -- ability '{0}'", Name);
                }
            }

            return(formula);
        }
Exemplo n.º 2
0
    private void CalculateButton(SerializedPropertyX property)
    {
        property.ApplyModifiedProperties();
        property.Update();

        GUILayout.Space(5);
        EditorGUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        if (GUILayout.Button("Calculate Formula", GUILayout.Width(150)))
        {
            DamageFormula d = property.GetValue <DamageFormula>();
            d.OnUse();
        }
        GUILayout.FlexibleSpace();
        EditorGUILayout.EndHorizontal();
    }
Exemplo n.º 3
0
        public override List <Action> GetNextActivity()
        {
            if (Actor == null)
            {
                throw new NullReferenceException("You must call SetActor() before you can call GetNextActivity() on WanderAimlesslyAI.");
            }

            IList <GridNode> path = Actor.Game.BattleMap.Tiles.FindPath <AStarSearchAlgorithm>(
                Actor.Game.BattleMap.Tiles[Actor.Position],
                Actor.Game.BattleMap.Tiles[Actor.Game.PlayerCharacter.Position],
                Actor.Motility, (a, b) =>
                Math.Abs(a.Position.x - b.Position.x) + Math.Abs(a.Position.y - b.Position.y));

            if (path.Count == 1)
            {
                var damageFormula = new DamageFormula(1, 3); // TODO: Read this from the Strike dictionary for the Actor
                var strike        = new Strike(damageFormula);
                return(new StrikeAction(Actor, strike, Actor.Game.PlayerCharacter));
            }

            GridNode targetTile = null;

            foreach (GridNode tile in path)
            {
                if (tile.PathCost > Actor.Speed)
                {
                    break;
                }

                if (Actor.Game.BattleMap.ActorAt(tile.Position) != null || !Actor.CanOccupy(tile.Position))
                {
                    continue;
                }

                targetTile = tile;
            }

            if (targetTile != null)
            {
                return(new StrideAction(Actor, targetTile.Position));
            }

            throw new ArgumentNullException(nameof(targetTile), "MeleeMookAI \"targetTile\" is null.");
        }
Exemplo n.º 4
0
        public void DoCreatureAttack(int creatureId, FDPosition targetPosition)
        {
            FDCreature creature = this.GetCreature(creatureId);

            if (creature == null)
            {
                throw new ArgumentNullException("creature");
            }

            FDCreature target = this.GetCreatureAt(targetPosition);

            if (target == null)
            {
                throw new ArgumentNullException("target");
            }

            FightInformation fighting = DamageFormula.DealWithAttack(creature, target, gameField, true);

            BattleFightPack fightPack = new BattleFightPack(creature, target, fighting);

            gameCallback.OnHandlePack(fightPack);

            // Remove dead creature
            if (target.Data.Hp <= 0)
            {
                this.DisposeCreature(target.CreatureId, true, true);
            }
            if (creature.Data.Hp <= 0)
            {
                this.DisposeCreature(creature.CreatureId, true, true);
            }

            if (creature.Faction == CreatureFaction.Friend)
            {
                // Talk about experience
                MessageId mId  = MessageId.Create(MessageId.MessageTypes.Message, 5, 33);
                TalkPack  talk = new TalkPack(creature, mId);
                gameCallback.OnHandlePack(talk);
            }

            PostCreatureAction(creature);
        }
Exemplo n.º 5
0
        public double ExtraValue(Attr extra)
        {
            switch (extra)
            {
            case Attr.EffectiveHP:
                return(Health * (1140 + Defense * 3.5) * 0.001);

            case Attr.EffectiveHPDefenseBreak:
                return(Health * (1140 + Defense * 3.5 * 0.3) * 0.001);

            case Attr.DamagePerSpeed:
                return(ExtraValue(Attr.AverageDamage) * Speed * 0.01);

            case Attr.AverageDamage:
                return((DamageFormula?.Invoke(this) ?? Attack) * (1 + SkillupDamage * 0.01 + CritDamage * 0.01 * Math.Min(CritRate + ExtraCritRate, 100) * 0.01));

            case Attr.MaxDamage:
                return((DamageFormula?.Invoke(this) ?? Attack) * (1 + SkillupDamage * 0.01 + CritDamage * 0.01));

            default:
                throw new NotImplementedException();
            }
        }