Ejemplo n.º 1
0
 public FightSkill(int code, int skillLevel, int nextLevel, float range, float freshTime, string name, string info, SkillTarget target, SkillType type)
 {
     Code = code;
     SkillLevel = skillLevel;
     NextLevel = nextLevel;
     Range = range;
     FreshTime = freshTime;
     Name = name;
     Info = info;
     Target = target;
     Type = type;
 }
Ejemplo n.º 2
0
 public virtual void setSkillTarget(Unit selectTargetUnit, Vector3 selectTargetPoint)
 {
     if (skillTarget == null)
     {
         skillTarget = new SkillTarget(selectTargetUnit, selectTargetPoint);
     }
     else
     {
         skillTarget.selectTargetUnit = selectTargetUnit;
         skillTarget.selectTargetPoint = selectTargetPoint;
     }
 }
Ejemplo n.º 3
0
    public IEnumerator Cast(SkillTarget skillTarget )
    {
        this.skillTarget = skillTarget;

        return Cast();
    }
Ejemplo n.º 4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="spell"></param>
        /// <param name="origin"></param>
        /// <param name="target"></param>
        /// <param name="room"></param>
        public void DoSpell(string spellName, Player origin, string targetName = "", Room room = null)
        {
            if (!ValidStatus(origin))
            {
                return;
            }

            var spell = FindSpell(spellName, origin);

            if (spell == null)
            {
                return;
            }

            if (!ManaCheck(spell, origin))
            {
                return;
            }


            if (SpellAffectsCharacter(spell))
            {
                Player target = null;
                target = _spellTargetCharacter.ReturnTarget(spell, targetName, room, origin);

                if (target == null)
                {
                    return;
                }

                ReciteSpellCharacter(origin, target, spell);

                var formula = spell.Damage.Roll(spell.Damage.DiceRoll, spell.Damage.DiceMinSize,
                                                spell.Damage.DiceMaxSize) + (origin.Level + 1) / 2; //+ mod

                try
                {
                    DynValue res = null;
                    if (!string.IsNullOrEmpty(spell.Formula))
                    {
                        UserData.RegisterType <MobScripts>();

                        Script script = new Script();

                        DynValue obj = UserData.Create(_mobScripts);
                        script.Globals.Set("obj", obj);
                        UserData.RegisterProxyType <MyProxy, Room>(r => new MyProxy(room));
                        UserData.RegisterProxyType <ProxyPlayer, Player>(r => new ProxyPlayer(origin));

                        script.Globals["room"]   = room;
                        script.Globals["player"] = origin;
                        script.Globals["mob"]    = target;

                        res = script.DoString(spell.Formula);
                    }
                }
                catch (Exception ex)
                {
                }


                //deduct mana
                origin.Attributes.Attribute[EffectLocation.Mana] -= spell.Cost.Table[Cost.Mana] == 0 ? 5 : spell.Cost.Table[Cost.Mana];
                _updateClientUi.UpdateMana(origin);


                // spell lag
                // add lag property to player
                // lag == spell round
                // stops spell/skill spam
                // applies after spell is cast
                // is it needed?

                // hit / miss messages

                //  _writer.WriteLine(spell.SkillStart.ToPlayer);

                if (SpellSuccess(origin, target, spell))
                {
                    var skillTarget = new SkillTarget
                    {
                        Origin = origin,
                        Target = target,
                        Room   = room,
                        Skill  = spell
                    };

                    _writer.WriteLine(
                        $"<p>Your {spell.Name} {_damage.DamageText(formula).Value} {target.Name} ({formula})</p>",
                        origin.ConnectionId);
                    _writer.WriteLine(
                        $"<p>{origin.Name}'s {spell.Name} {_damage.DamageText(formula).Value} you! ({formula})</p>",
                        target.ConnectionId);

                    // If no effect assume, negative spell and deduct HP
                    if (spell.Effect == null)
                    {
                        skillTarget.Target.Attributes.Attribute[EffectLocation.Hitpoints] -= formula;
                        //update UI
                        _updateClientUi.UpdateHP(skillTarget.Target);
                    }
                    else
                    {
                        new SpellEffect(_writer, skillTarget, formula).Type[skillTarget.Skill.Type].Invoke();
                    }
                }
                else
                {
                    var skill = origin.Skills.FirstOrDefault(x => x.SkillId.Equals(spell.Id));

                    if (skill == null)
                    {
                        return;
                    }

                    if (skill.Proficiency == 95)
                    {
                        return;
                    }

                    var increase = new Dice().Roll(1, 1, 3);

                    skill.Proficiency += increase;

                    origin.Experience            += 100;
                    origin.ExperienceToNextLevel -= 100;

                    _updateClientUi.UpdateExp(origin);

                    _writer.WriteLine(
                        $"<p class='improve'>You learn from your mistakes and gain 100 experience points.</p>",
                        origin.ConnectionId);
                    _writer.WriteLine(
                        $"<p class='improve'>Your {skill.SkillName} skill increases by {increase}%.</p>",
                        origin.ConnectionId);
                }
            }
            else
            {
                _writer.WriteLine(
                    $"<p>You cannot cast this spell upon another.</p>",
                    origin.ConnectionId);
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="spell"></param>
        /// <param name="origin"></param>
        /// <param name="target"></param>
        /// <param name="room"></param>
        public void DoSpell(string spellName, Player origin, string targetName = "", Room room = null)
        {
            if (!ValidStatus(origin))
            {
                return;
            }

            var spell = FindSpell(spellName, origin);

            if (spell == null)
            {
                return;
            }

            if (origin.ConnectionId != "mob" && !ManaCheck(spell, origin))
            {
                return;
            }

            // saves



            if (SpellAffectsCharacter(spell))
            {
                Player target = null;
                target = _spellTargetCharacter.ReturnTarget(spell, targetName, room, origin);

                if (target == null)
                {
                    return;
                }
                var spellSkill = origin.Skills.FirstOrDefault(x => x.SkillId.Equals(spell.Id));
                //saving throw
                if (spell.Type == SkillType.Affect)
                {
                    var savingThrow = target.Attributes.Attribute[EffectLocation.Intelligence] / 2;

                    var rollForSave = _dice.Roll(1, 1, 100);

                    if (rollForSave <= savingThrow)
                    {
                        //save
                        // half spell affect duration


                        if (rollForSave == 1)
                        {
                            // fail
                            spell.Rounds = origin.Level / 2;
                        }

                        if (rollForSave != 1)
                        {
                            spell.Rounds = origin.Level / 4;
                        }
                    }
                }


                ReciteSpellCharacter(origin, target, spell, room);



                //deduct mana
                origin.Attributes.Attribute[EffectLocation.Mana] -= spell.Cost.Table[Cost.Mana] == 0 ? 5 : spell.Cost.Table[Cost.Mana];
                _updateClientUi.UpdateMana(origin);



                if (SpellSuccess(origin, target, spell))
                {
                    //if (spell.Type == SkillType.Damage)
                    //{

                    //    var savingThrow = origin.Attributes.Attribute[EffectLocation.Dexterity] / 2;

                    //    var rollForSave = _dice.Roll(1, 1, 100);

                    //    if (rollForSave <= savingThrow || rollForSave == 100)
                    //    {
                    //        if (rollForSave > 1)
                    //        {
                    //            damage /= 2;

                    //            _writer.WriteLine("You partly evade " + origin.Name + "'s " + spell.Name + " by jumping back.", target.ConnectionId);

                    //            _writer.WriteLine($"{target.Name} partly evades your " + spell.Name + " by jumping back.", origin.ConnectionId);

                    //            foreach (var pc in room.Players)
                    //            {
                    //                if (pc.ConnectionId.Equals(origin.ConnectionId) ||
                    //                    pc.ConnectionId.Equals(target.ConnectionId))
                    //                {
                    //                    continue;
                    //                }

                    //                _writer.WriteLine($"{target.Name} partly evades {origin.Name}'s " + spell.Name + " by jumping back.", pc.ConnectionId);
                    //            }
                    //        }
                    //    }
                    //}


                    var skillTarget = new SkillTarget
                    {
                        Origin = origin,
                        Target = target,
                        Room   = room,
                        Skill  = spell
                    };



                    if (string.IsNullOrEmpty(spell.Formula) && spell.Type == SkillType.Damage)
                    {
                        //do this for cast cure
                        _spellList.CastSpell(spell.Name, "", target, "", origin, room, false);
                    }



                    if (spell.Type != SkillType.Damage)
                    {
                        _spellList.CastSpell(spell.Name, "", target, "", origin, room, false);
                    }
                }
                else
                {
                    var skill = origin.Skills.FirstOrDefault(x => x.SkillId.Equals(spell.Id));

                    if (skill == null)
                    {
                        return;
                    }

                    if (skill.Proficiency == 95)
                    {
                        return;
                    }

                    var increase = new Dice().Roll(1, 1, 3);

                    skill.Proficiency += increase;

                    origin.Experience            += 100;
                    origin.ExperienceToNextLevel -= 100;

                    _updateClientUi.UpdateExp(origin);

                    _writer.WriteLine(
                        $"<p class='improve'>You learn from your mistakes and gain 100 experience points.</p>",
                        origin.ConnectionId);
                    _writer.WriteLine(
                        $"<p class='improve'>Your {skill.SkillName} skill increases by {increase}%.</p>",
                        origin.ConnectionId);
                }
            }
            else if ((spell.ValidTargets & ValidTargets.TargetObjectInventory) != 0 || (spell.ValidTargets & ValidTargets.TargetObjectEquipped) != 0)
            {
                //Item.Item target = null;
                //target = _spellTargetCharacter.ReturnTargetItem(spell, targetName, room, origin);

                //if (target == null)
                //{
                //    return;
                //}
                var spellSkill = origin.Skills.FirstOrDefault(x => x.SkillId.Equals(spell.Id));


                ReciteSpellCharacter(origin, origin, spell, room);

                //deduct mana
                origin.Attributes.Attribute[EffectLocation.Mana] -= spell.Cost.Table[Cost.Mana] == 0 ? 5 : spell.Cost.Table[Cost.Mana];
                _updateClientUi.UpdateMana(origin);


                if (SpellSuccess(origin, null, spell))
                {
                    _spellList.CastSpell(spell.Name, targetName, null, "", origin, room, false);
                }
                else
                {
                    var skill = origin.Skills.FirstOrDefault(x => x.SkillId.Equals(spell.Id));

                    if (skill == null)
                    {
                        return;
                    }

                    if (skill.Proficiency == 95)
                    {
                        return;
                    }


                    var increase = new Dice().Roll(1, 1, 3);

                    skill.Proficiency += increase;

                    origin.Experience            += 100;
                    origin.ExperienceToNextLevel -= 100;

                    _updateClientUi.UpdateExp(origin);

                    _writer.WriteLine(
                        $"<p class='improve'>You learn from your mistakes and gain 100 experience points.</p>",
                        origin.ConnectionId);
                    _writer.WriteLine(
                        $"<p class='improve'>Your {skill.SkillName} skill increases by {increase}%.</p>",
                        origin.ConnectionId);
                }
            }
            else
            {
                //_writer.WriteLine(
                //    $"<p>You cannot cast this spell upon another.</p>",
                //    origin.ConnectionId);
            }
        }
Ejemplo n.º 6
0
 public SkillDataModel(int code, string name, string info, SkillType type, SkillTarget target,
     SkillLevelData[] levels)
 {
     this.code = code;
     this.levels = levels;
     this.name = name;
     this.info = info;
     this.target = target;
     this.type = type;
 }
Ejemplo n.º 7
0
 private static void create(int code, string name, string info, SkillType type, SkillTarget target,
     params SkillLevelData[] levels)
 {
     SkillDataModel model = new SkillDataModel(code, name, info, type, target, levels);
     skillMap.Add(code, model);
 }
Ejemplo n.º 8
0
        public static void SaveSkill(Skill Skill)
        {
            //IFormatter Formatter = new BinaryFormatter();
            //Stream Stream = new FileStream("Skills/" + Skill.Id + ".data", FileMode.Create,
            //    FileAccess.Write, FileShare.ReadWrite);
            //Stream.Seek(0, 0);
            //Formatter.Serialize(Stream, Skill);
            //Stream.Close();

            XmlTextWriter Writer = new XmlTextWriter(
                new FileStream(Directory.GetCurrentDirectory() + "/Skills/" + Skill.Id + ".data",
                               FileMode.Create, FileAccess.Write), Encoding.UTF8)
            {
                IndentChar  = '\t',
                Indentation = 1,
                Formatting  = Formatting.Indented
            };

            Writer.WriteStartDocument(true);
            Writer.WriteStartElement("StrikeOne.Skill");

            Writer.WriteAttributeString("Id", Skill.Id.ToString());
            Writer.WriteAttributeString("Name", Skill.Name);
            Writer.WriteElementString("Description", Skill.Description);

            if (Skill.Image != null)
            {
                MemoryStream ms = new MemoryStream();
                Skill.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                byte[] arr = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(arr, 0, (int)ms.Length);
                ms.Close();
                Writer.WriteElementString("Image", Convert.ToBase64String(arr));
            }

            Action <string, string> GenerateValueElement = delegate(string Name, string Value)
            {
                Writer.WriteStartElement(Name);
                Writer.WriteAttributeString("Value", Value);
                Writer.WriteEndElement();
            };

            GenerateValueElement("Probability", Skill.Probability.ToString());
            GenerateValueElement("Count", Skill.TotalCount.ToString());
            GenerateValueElement("Duration", Skill.Duration.ToString());
            GenerateValueElement("CoolDown", Skill.CoolDown.ToString());
            GenerateValueElement("IsActive", Skill.IsActive.ToString());
            GenerateValueElement("IsDefendable", Skill.IsDefendable?.ToString() ?? "Null");

            Writer.WriteStartElement("TargetSelections");
            foreach (var SkillTarget in Skill.TargetSelections)
            {
                GenerateValueElement("TargetSelection", SkillTarget.ToString());
            }
            Writer.WriteEndElement();

            Writer.WriteStartElement("LaunchScript");
            Writer.WriteCData(Skill.LaunchScript);
            Writer.WriteEndElement();

            Writer.WriteEndElement();
            Writer.WriteEndDocument();
            Writer.Flush();
            Writer.Close();
        }