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; }
public virtual void setSkillTarget(Unit selectTargetUnit, Vector3 selectTargetPoint) { if (skillTarget == null) { skillTarget = new SkillTarget(selectTargetUnit, selectTargetPoint); } else { skillTarget.selectTargetUnit = selectTargetUnit; skillTarget.selectTargetPoint = selectTargetPoint; } }
public IEnumerator Cast(SkillTarget skillTarget ) { this.skillTarget = skillTarget; return Cast(); }
/// <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); } }
/// <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); } }
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; }
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); }
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(); }