Пример #1
0
        public static void StartUp(TestContext ctx)
        {
            Definer.Instance().Engine     = Engine;
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Key = "T";
            Engine.AddDamageType(trueDamage);
        }
Пример #2
0
 public void AddDamageType(DamageTypeTemplate damageType)
 {
     if (DamageTypes.ContainsKey(damageType.Key))
     {
         throw new MeException($"Attempted to add a damage type with key {damageType.Key} but it already exists");
     }
     DamageTypes.Add(damageType.Key, damageType);
 }
Пример #3
0
        public void LogDamage(Entity target, Entity source, DamageTypeTemplate typeTemplate, double amount, double resisted)
        {
            ResourceInstance hp    = target.GetResource(Entity.HP_KEY);
            string           hpBar = Utils.Utility.getBar(hp.Value, hp.MaxAmount);
            //string resist = Utils.Utility.DoubleEq(resisted,0.0)?"": $"({resisted} resisted)";
            string msg = $"{target.Name} {hpBar} {(amount < 0 ? "" : "-")}{amount} {typeTemplate.Name} damage";

            Log(msg);
        }
Пример #4
0
        public static void StartUp(TestContext context)
        {
            Engine.AddPlayer(MockPlayer);
            Engine.AddEnemy(MockEnemy);
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Key = "T";
            Engine.AddDamageType(trueDamage);
        }
Пример #5
0
        public DamageTypeTemplate FromJson(JObject json)
        {
            string mitigation = JsonUtils.GetValueOrDefault <string>(json, GcConstants.DamageType.MITIGATION, null);
            string dodge      = JsonUtils.GetValueOrDefault <string>(json, GcConstants.DamageType.DODGE, null);;
            string crit       = JsonUtils.GetValueOrDefault <string>(json, GcConstants.DamageType.CRIT, null);;
            string critmod    = JsonUtils.GetValueOrDefault <string>(json, GcConstants.DamageType.CRIT_MULT, null);;

            DamageTypeTemplate template = new DamageTypeTemplate(_engine, mitigation, dodge, crit, critmod);

            template.LoadBase(json);
            return(template);
        }
Пример #6
0
        public static void StartUp(TestContext ctx)
        {
            Engine = new GameEngine(new DiscordLogHelper(new ConsoleLogger()));
            Definer.Instance().Engine = Engine;
            MockPlayer = new MockEntity(Engine)
            {
                Name = "MOCK_PLAYER", Key = "MOCK_KEY"
            };
            Engine.AddPlayer(MockPlayer);
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Key = "T";
            Engine.AddDamageType(trueDamage);
        }
Пример #7
0
        public void LoadDamageTypesFromfile(string path)
        {
            DamageTypeReader reader         = new DamageTypeReader(Engine);
            JArray           damageTypeJson = FileHandler.FromPath <JArray>(path);

            foreach (JToken damageValue in damageTypeJson)
            {
                if (damageValue.Type != JTokenType.Object)
                {
                    throw new MeException($"Expected a json object \"{path}\"at  \"{damageValue}\".");
                }

                DamageTypeTemplate newSkill = reader.FromJson(damageValue.ToObject <JObject>());
                AddDamageType(newSkill);
            }
        }
Пример #8
0
        public static void StartUp(TestContext ctx)
        {
            Definer.Instance().Engine     = Engine;
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Key = "T";
            Engine.AddDamageType(trueDamage);
            ResourceTemplate mana = new ResourceTemplate();

            mana.Key = "MP";
            ResourceTemplate hp = new ResourceTemplate();

            hp.Key = Entity.HP_KEY;
            Engine.GetPropertyManager().AddResource(hp);
            Engine.GetPropertyManager().AddResource(mana);

            Engine.GetCoreManager().DefaultSkillThreat = GcConstants.Core.DEFAULT_THREAT;
        }
Пример #9
0
        public static void StartUp(TestContext ctx)
        {
            CultureInfo ci = new CultureInfo("en-US");

            Thread.CurrentThread.CurrentCulture = ci;

            Console.WriteLine("START UP");
            Engine = new GameEngine(new DiscordLogHelper(new ConsoleLogger()));
            Definer.Instance().Engine = Engine;
            BasePlayer = new MockEntity(Engine)
            {
                Name = "MOCK_PLAYER", Key = "MOCK_KEY"
            };
            Engine.AddPlayer(BasePlayer);
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Key = "T";
            Engine.AddDamageType(trueDamage);
        }
Пример #10
0
        public static void StartUp(TestContext ctx)
        {
            Definer.Instance().Engine     = Engine;
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Name = "true";
            trueDamage.Key  = "T";
            Engine.AddDamageType(trueDamage);
            ResourceTemplate res = new ResourceTemplate()
            {
                Key = "MP"
            };
            SkillCost nullCost = new SkillCost(res, TreeConverter.Build("0", Engine));

            _testSkill      = new SkillTemplate();
            _testSkill.Type = SkillType.Cast;
            _testSkill.Key  = "TEST_CAST";
            SkillLevelTemplate testLevelTemplate = new SkillLevelTemplate();

            testLevelTemplate.Cooldown      = TreeConverter.Build("3", Engine);
            testLevelTemplate.Duration      = TreeConverter.Build($"{LConstants.SourceKeyword}{LConstants.PROP_OP}INT", Engine);
            testLevelTemplate.Interruptible = TreeConverter.Build("true", Engine);
            testLevelTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            testLevelTemplate.PushBack = TreeConverter.Build("true", Engine);
            testLevelTemplate.Cost     = nullCost;
            _testSkill.ByLevel.Add(testLevelTemplate);

            Engine.GetSkillManager().AddSkill(_testSkill);

            BaseObject bDmg = new BaseObject()
            {
                Description = "", Key = "BASE_DMG", Name = "Base damage"
            };

            Engine.GetPropertyManager().BaseValues.Add("BASE_DMG", bDmg);

            BaseObject intellect = new BaseObject()
            {
                Description = "", Key = "INT", Name = "Intellect"
            };

            Engine.GetPropertyManager().Attributes.Add("INT", intellect);
        }
Пример #11
0
        public override double TakeDamage(double amount, DamageTypeTemplate typeTemplate, Entity source, bool periodic = false)
        {
            if (typeTemplate.GetDodge(source, this))
            {
                if (!periodic)
                {
                    Engine.Log().LogDodge(this, source);
                }
                return(0);
            }
            double actualAmount = typeTemplate.GetMitigatedAmount(amount, source, this);
            double resisted     = amount - actualAmount;

            TakeActualDamage(actualAmount);

            if (!periodic)
            {
                Engine.Log().LogDamage(this, source, typeTemplate, actualAmount, resisted);
            }
            return(actualAmount);
        }
Пример #12
0
        public static void StartUp(TestContext context)
        {
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Key  = "T";
            trueDamage.Name = "true";
            DamageTypeTemplate alwaysCrit = new DamageTypeTemplate(Engine, null, null, "100", "2");

            alwaysCrit.Key  = "AC";
            alwaysCrit.Name = "always_crit";
            DamageTypeTemplate alwaysDodge = new DamageTypeTemplate(Engine, null, "100", null, null);

            alwaysDodge.Key  = "AD";
            alwaysDodge.Name = "always_dodge";
            DamageTypeTemplate physical = new DamageTypeTemplate(Engine, $"{LConstants.NON_NEG_F}({LConstants.ValueKeyword}-{LConstants.TargetKeyword}{LConstants.PROP_OP}DEF)", null, null, null);

            physical.Key  = "P";
            physical.Name = "physical";
            Engine.AddDamageType(trueDamage);
            Engine.AddDamageType(alwaysCrit);
            Engine.AddDamageType(alwaysDodge);
            Engine.AddDamageType(physical);
            Engine.AddPlayer(BaseEntity);
        }
Пример #13
0
        public static void StartUp(TestContext context)
        {
            DamageTypeTemplate trueDamage = new DamageTypeTemplate(Engine, null, null, null, null);

            trueDamage.Key  = "T";
            trueDamage.Name = "true";
            Engine.AddDamageType(trueDamage);
            ResourceTemplate res = new ResourceTemplate()
            {
                Key = "MP"
            };

            SkillCost nullCost = new SkillCost(res, TreeConverter.Build("0", Engine));
            SkillCost notFree  = new SkillCost(res, TreeConverter.Build("50", Engine));

            _testSkill      = new SkillTemplate();
            _testSkill.Type = SkillType.Cast;
            _testSkill.Key  = "TEST_CAST";
            SkillLevelTemplate testLevelTemplate = new SkillLevelTemplate();

            testLevelTemplate.Cooldown      = TreeConverter.Build("3", Engine);
            testLevelTemplate.Duration      = TreeConverter.Build($"{LConstants.SourceKeyword}{LConstants.PROP_OP}INT", Engine);
            testLevelTemplate.Interruptible = TreeConverter.Build("true", Engine);
            testLevelTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            testLevelTemplate.PushBack = TreeConverter.Build("true", Engine);
            testLevelTemplate.Cost     = nullCost;
            _testSkill.ByLevel.Add(testLevelTemplate);

            _testChannelSkill      = new SkillTemplate();
            _testChannelSkill.Type = SkillType.Channel;
            _testChannelSkill.Key  = "TEST_CHANNEL";
            SkillLevelTemplate testLevelTemplate2 = new SkillLevelTemplate();

            testLevelTemplate2.Cooldown      = TreeConverter.Build("120", Engine);
            testLevelTemplate2.Duration      = TreeConverter.Build("60", Engine);
            testLevelTemplate2.Interval      = TreeConverter.Build("10", Engine);
            testLevelTemplate2.PushBack      = TreeConverter.Build("true", Engine);
            testLevelTemplate2.Interruptible = TreeConverter.Build("true", Engine);
            testLevelTemplate2.Cost          = nullCost;
            MeNode channelFormula = TreeConverter.Build(
                $"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)",
                Engine);

            Engine.GetSanitizer().SetHarmsToPeriodic(channelFormula);

            testLevelTemplate2.Formulas.Add(channelFormula);
            _testChannelSkill.ByLevel.Add(testLevelTemplate2);

            _instantHarm      = new SkillTemplate();
            _instantHarm.Type = SkillType.Cast;
            _instantHarm.Key  = "HURT";
            SkillLevelTemplate hurtLevelTemplate = new SkillLevelTemplate();

            hurtLevelTemplate.Cooldown      = TreeConverter.Build("0", Engine);
            hurtLevelTemplate.Duration      = TreeConverter.Build("0", Engine);
            hurtLevelTemplate.PushBack      = TreeConverter.Build("false", Engine);
            hurtLevelTemplate.Interruptible = TreeConverter.Build("true", Engine);
            hurtLevelTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            hurtLevelTemplate.Cost = nullCost;
            _instantHarm.ByLevel.Add(hurtLevelTemplate);



            _unpushable      = new SkillTemplate();
            _unpushable.Type = SkillType.Cast;
            _unpushable.Key  = "NOPUSH";
            SkillLevelTemplate unpushTemplate = new SkillLevelTemplate();

            unpushTemplate.Cooldown      = TreeConverter.Build("0", Engine);
            unpushTemplate.Duration      = TreeConverter.Build("5", Engine);
            unpushTemplate.Interruptible = TreeConverter.Build("false", Engine);
            unpushTemplate.PushBack      = TreeConverter.Build("false", Engine);
            unpushTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            unpushTemplate.Cost = nullCost;
            _unpushable.ByLevel.Add(unpushTemplate);


            _costly      = new SkillTemplate();
            _costly.Type = SkillType.Cast;
            _costly.Key  = "COSTLY";
            SkillLevelTemplate costlyTemplate = new SkillLevelTemplate();

            costlyTemplate.Cooldown      = TreeConverter.Build("0", Engine);
            costlyTemplate.Duration      = TreeConverter.Build("0", Engine);
            costlyTemplate.Interruptible = TreeConverter.Build("true", Engine);
            costlyTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10)", Engine));
            costlyTemplate.PushBack = TreeConverter.Build("true", Engine);
            costlyTemplate.Cost     = notFree;
            _costly.ByLevel.Add(costlyTemplate);


            _skillUsingStat      = new SkillTemplate();
            _skillUsingStat.Type = SkillType.Cast;
            _skillUsingStat.Key  = "WITH_STAT";
            SkillLevelTemplate withStaTemplate = new SkillLevelTemplate();

            withStaTemplate.Cooldown      = TreeConverter.Build("0", Engine);
            withStaTemplate.Duration      = TreeConverter.Build("0", Engine);
            withStaTemplate.Interruptible = TreeConverter.Build("true", Engine);
            withStaTemplate.Formulas.Add(TreeConverter.Build($"{LConstants.HARM_F}({LConstants.TargetKeyword},{LConstants.SourceKeyword},{trueDamage.Key},10*{LConstants.SourceKeyword}{LConstants.PROP_OP}STR+{LConstants.GET_PROP_F}({LConstants.SourceKeyword},{BASE_VALUE}))", Engine));
            withStaTemplate.PushBack = TreeConverter.Build("true", Engine);
            withStaTemplate.Cost     = nullCost;

            _skillUsingStat.ByLevel.Add(withStaTemplate);
        }
Пример #14
0
 public void AddDamageType(DamageTypeTemplate typeTemplate)
 {
     _damageTypeManager.AddDamageType(typeTemplate);
 }
Пример #15
0
        public static MeNode Build(MeNode parent, TokenNode node, IGameEngine engine)
        {
            MeNode newNode = null;

            switch (node.Token.Type)
            {
            case TokenType.Function:
            {
                newNode = new MeNode(new MeVariable()
                    {
                        Value = Definer.Instance().Functions[node.Token.Value],
                        Type  = VariableType.Function
                    });
                break;
            }

            case TokenType.Operator:
            {
                newNode = new MeNode(new MeVariable()
                    {
                        Value = Definer.Instance().Operators[node.Token.Value],
                        Type  = VariableType.Operator
                    });
                break;
            }

            case TokenType.Variable:
            {
                //first, try a number
                double result  = 0;
                bool   success = double.TryParse(node.Token.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out result);
                if (success)
                {
                    newNode = new MeNode(
                        new MeVariable()
                        {
                            Value = result, Type = VariableType.NumericValue
                        });
                    break;
                }
                //try a boolean
                bool boolResult = false;
                success = bool.TryParse(node.Token.Value, out boolResult);
                if (success)
                {
                    newNode = new MeNode(boolResult);
                    break;
                }

                //try a placeholder
                if (node.Token.Value.StartsWith("$"))
                {
                    newNode = new MeNode(
                        new MeVariable()
                        {
                            Value = node.Token.Value, Type = VariableType.PlaceHolder
                        });
                    break;
                }
                //try an entitiy
                Entity tryEntity = engine.GetEntityByKey(node.Token.Value);
                if (tryEntity != null)
                {
                    newNode = new MeNode(
                        new MeVariable()
                        {
                            Value = tryEntity, Type = VariableType.Entity
                        });
                    break;
                }

                //try a damage typeTemplate
                DamageTypeTemplate tryDamageTypeTemplate = engine.GeDamageType(node.Token.Value);
                if (tryDamageTypeTemplate != null)
                {
                    newNode = new MeNode(
                        new MeVariable()
                        {
                            Value = tryDamageTypeTemplate, Type = VariableType.DamageType
                        });
                    break;
                }

                /*
                 * MeVariable tryVariable = engine.GetVariable(node.Token.Final);
                 * if (tryVariable != null)
                 * {
                 *  newNode = new MeNode(tryVariable);
                 *  break;
                 * } */

                //if nothing else is found, it must be a string
                newNode = new MeNode(
                    new MeVariable()
                    {
                        Value = node.Token.Value, Type = VariableType.String
                    });
                break;
            }
            }

            foreach (TokenNode subNode in node.Parameters)
            {
                newNode.Leaves.Add(Build(newNode, subNode, engine));
            }

            newNode.Parent = parent;
            return(newNode);
        }
Пример #16
0
        public void Init(IGameEngine engine)
        {
            if (_initialized)
            {
                return;
            }
            _initialized = true;


            IOperatorDefiner[] opDefiners =
            {
                new PlusOperator(),
                new MinusOperator(),
                new PropertyOperator(),
                new MultiplyOperator(),
                new PowerOperator(),
                new DivideOperator(),
                new NotOperator(),
                new GreaterOperator(),
                new LesserOperator(),
                new AssignOperator(),
                new NumEqualsOperator()
            };

            foreach (IOperatorDefiner def in opDefiners)
            {
                AddOperator(def.DefineOperator());
            }

            Engine = engine;



            AddFunction(LConstants.MAX_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                double[] parameters = MeVariable.ToDoubleArray(values);
                return(parameters.Max());
            });

            AddFunction(LConstants.FLOOR_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                return(Math.Floor(values[0].ToDouble()));
            }, 1);


            AddFunction(LConstants.MIN_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                double[] parameters = MeVariable.ToDoubleArray(values);
                return(parameters.Min());
            });


            AddFunction(LConstants.ABS_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                return(Math.Abs(values[0].ToDouble()));
            }, 1);

            AddFunction(LConstants.NON_NEG_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                double value = values[0].ToDouble();
                return(value > 0 ? value : 0);
            }, 1);

            AddFunction(LConstants.RANDOM_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                return(new Random().Next((int)values[0].ToDouble(), (int)values[1].ToDouble()));
            }, 2);


            AddFunction(LConstants.HARM_F,
                        (values, func) =>
            {
                //func.CheckParamCount(values.Length);
                MeVariable[] targets = values[0].ToArray();
                Entity source        = values[1].ToEntity();
                DamageTypeTemplate damageTypeTemplate = values[2].ToDamageType();
                double amount = values[3].ToDouble();
                bool periodic = false;

                if (values.Length > func.ParameterCount)
                {
                    periodic = values[4].ToBoolean();
                }
                double totalAmt = 0;
                foreach (MeVariable variable in targets)
                {
                    totalAmt += variable.ToEntity().TakeDamage(amount, damageTypeTemplate, source, periodic);
                }
                return(totalAmt);
            }, 4);

            AddFunction(LConstants.HEAL_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                MeVariable[] targets = values[0].ToArray();
                Entity source        = values[1].ToEntity();
                double amount        = values[2].ToDouble();
                double totalAmt      = 0;
                foreach (MeVariable variable in targets)
                {
                    totalAmt += variable.ToEntity().GetHealed(amount, source);
                }
                return(totalAmt);
            }, 3);

            AddFunction(LConstants.ARRAY_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                return(new MeVariable()
                {
                    Type = VariableType.Array, Value = values
                });
            });

            AddFunction(LConstants.GET_PLAYERS_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                Entity[] players             = Definer.Instance().Engine.GetAllPlayers();
                List <MeVariable> playerList = new List <MeVariable>();
                foreach (Entity entity in players)
                {
                    playerList.Add(entity);
                }
                return(new MeVariable()
                {
                    Value = playerList.ToArray(), Type = VariableType.Array
                });
            }, 0);

            AddFunction(LConstants.GET_ACTIVE_PLAYERS_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                //TODO: Implement retrieving ONLY active players
                Entity[] players             = Definer.Instance().Engine.GetAllPlayers();
                List <MeVariable> playerList = new List <MeVariable>();
                foreach (Entity entity in players)
                {
                    playerList.Add(entity);
                }
                return(new MeVariable()
                {
                    Value = playerList.ToArray(), Type = VariableType.Array
                });
            }, 0);

            AddFunction(LConstants.GET_PROP_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                Entity entity = values[0].ToEntity();
                string prop   = values[1].ToMeString();
                return(new MeVariable()
                {
                    Value = new Property(entity, prop), Type = VariableType.Property
                });

                ;
            }, 2);

            AddFunction(LConstants.IF_F,
                        (values, func) =>
            {
                //IF(CONDITION,THEN,ELSE)
                func.CheckParamCount(values.Length);
                bool condition = values[0].ToBoolean();
                if (condition)
                {
                    return(values[1].Execute());
                }
                else
                {
                    return(values[2].Execute());
                }
            }, 3, new bool[] { true, false, false });
            AddFunction(LConstants.ARR_RANDOM_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                MeVariable[] input = values[0].ToArray();
                int index          = new Random().Next(0, input.Length);
                return(input[index]);
            }, 1);

            AddFunction(LConstants.CHANCE_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                double chance = values[0].ToDouble() * 10;
                return(RPGEngine.Utils.Utility.Chance(chance));
            }, 1);

            AddFunction(LConstants.CAST_F,
                        (values, func) =>
            {
                //CAST(CASTER,TARGET,SKILL)
                func.CheckParamCount(values.Length);
                Entity caster   = values[0].ToEntity();
                Entity target   = values[1].ToEntity();
                string skillKey = values[2].ToMeString();
                caster.Cast(target, skillKey);
                return(null);
            }, 3);
            AddFunction(LConstants.ADD_MOD_F,
                        (values, func) =>
            {
                //MOD_VALUE(stat,Amount)
                func.CheckParamCount(values.Length);
                string stat      = values[0].ToMeString();
                double amount    = values[1].ToDouble();
                StatModifier mod = new StatModifier()
                {
                    Amount = amount, StatKey = stat
                };
                return(new MeVariable {
                    Type = VariableType.StatModifier, Value = mod
                });
            }, 2);
            AddFunction(LConstants.APPLY_F,
                        (values, func) =>
            {
                //APPLYSTATUS(target,Source,status_key,duration,amounts)
                func.CheckParamCount(values.Length);
                MeVariable[] targets  = values[0].ToArray();
                Entity source         = values[1].ToEntity();
                StatusTemplate effect = Definer.Instance().Engine.GetStatusByKey(values[2].ToMeString());
                double duration       = values[3].ToDouble();
                double[] amounts      = MeVariable.ToDoubleArray(values[4].ToArray());
                func.CheckParamCount(values.Length);

                foreach (MeVariable target in targets)
                {
                    target.ToEntity().ApplyStatus(effect, source, duration, amounts);
                }
                return(null);
            }, 5);
            AddFunction(LConstants.GET_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                string key = values[0].ToMeString();
                return(Definer.Instance().Engine.GetVariable(key));;
            }, 1);

            AddFunction(LConstants.SAY_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                Entity entity = values[0].ToEntity();
                string msg    = values[1].ToMeString();
                Engine.Log().LogSay(entity, msg);
                return(null);
            }, 2);

            AddFunction(LConstants.PUSH_BACK_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                MeVariable[] entity = values[0].ToArray();
                long amount         = values[1].ToLong();
                foreach (MeVariable var in entity)
                {
                    var.ToEntity().AddPushback(amount);
                }
                return(null);
            }, 2);
            AddFunction(LConstants.REVIVE_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                MeVariable[] entity = values[0].ToArray();
                foreach (MeVariable var in entity)
                {
                    var.ToEntity().Revive();
                }
                return(null);
            }, 1);
            AddFunction(LConstants.ADD_TO_RESOURCE_F,
                        (values, func) =>
            {
                func.CheckParamCount(values.Length);
                MeVariable[] entity = values[0].ToArray();
                string resourceKey  = values[1].ToString();
                double amount       = values[2].ToDouble();
                foreach (MeVariable var in entity)
                {
                    var.ToEntity().AddToResource(resourceKey, amount);
                }
                return(null);
            }, 3);
        }
Пример #17
0
 public abstract double TakeDamage(double amount, DamageTypeTemplate typeTemplate, Entity source, bool periodic = true);