public void InitializeSkillset() { #region ------------------BasicSkills-------------------- BasicSkill bs; // 이동 bs = new BasicSkill() { Name = "이동", Cooltime = 5, ForceConst = -1, RangeType = "Point", RangeConst = null, Type = SkillType.Basic, UsedTurn = -999, Description = "마스레이드에서 이동 제한을 받지 않고, 원하는 마스로 이동할 수 있습니다." }; bs.SetFunction((user, victim, obj) => { var p = ((Point)obj); user.PosX = p.X; user.PosY = p.Y; return(true); }); SkillList.Add(bs.Name, bs); // 자가회복 bs = new BasicSkill() { Name = "자가회복", Cooltime = 6, ForceConst = 0.2, RangeType = "Ellipse", RangeConst = "3", Type = SkillType.Basic | SkillType.Heal, UsedTurn = -999, Description = "자신의 최대 체력의 20%만큼을 즉시 회복합니다." }; bs.SetFunction((user, victim, obj) => { var inner = SkillList["자가회복"]; double amountOfHeal = user.MaxHp * inner.ForceConst; user.CurrentHp = user.CurrentHp + amountOfHeal >= user.MaxHp ? user.MaxHp : user.CurrentHp + amountOfHeal; return(true); }); SkillList.Add(bs.Name, bs); // 연속공격 bs = new BasicSkill() { Name = "연속공격", Cooltime = 6, ForceConst = 2, RangeType = "Rectangle", RangeConst = "3,3:1,2", Type = SkillType.Basic | SkillType.Offence, UsedTurn = -999, Description = "다음 턴에 사용하는 스킬이 2회 적용됩니다." }; bs.SetFunction((user, victim, obj) => { ISkillBase skill = obj as ISkillBase; BuffBase buff = new BuffBase(user, BuffType.Buff, 1, 1, 1); buff.SetSkillFunction(skill.SkillFunction); user.Buffs.Add(buff); return(true); }); SkillList.Add(bs.Name, bs); // 위력 증가 bs = new BasicSkill() { Name = "위력 증가", Cooltime = 10, ForceConst = 3, RangeType = "Player", RangeConst = "Self", Type = SkillType.Basic | SkillType.Offence, UsedTurn = -999, Description = "시전 턴을 포함하여 3턴 간 위력이 3 증가합니다." }; bs.SetFunction((user, victim, obj) => { var inner = SkillList["위력 증가"]; user.GiveConst += inner.ForceConst; BuffBase buff = new BuffBase(user, BuffType.Buff, 3, 3, inner.ForceConst); buff.SetSkillFunction((IPlayer src, IPlayer dst, object buffObj) => { src.GiveConst = src.GiveConst - inner.ForceConst < 0 ? 0 : src.GiveConst - inner.ForceConst; return(true); }); user.Buffs.Add(buff); return(true); }); SkillList.Add(bs.Name, bs); // 방어력 증가 bs = new BasicSkill() { Name = "방어력 증가", Cooltime = 10, ForceConst = 3, RangeType = "Player", RangeConst = "Self", Type = SkillType.Basic | SkillType.Defence, UsedTurn = -999, Description = "시전 턴을 포함하여 3턴 간 방어력이 3 증가합니다." }; bs.SetFunction((user, victim, obj) => { var inner = SkillList["방어력 증가"]; user.HarmConst += inner.ForceConst; BuffBase buff = new BuffBase(user, BuffType.Buff, 1, 1, inner.ForceConst); buff.SetSkillFunction((IPlayer src, IPlayer dst, object buffObj) => { src.HarmConst = src.HarmConst - inner.ForceConst < 0 ? 0 : src.HarmConst - inner.ForceConst; return(true); }); user.Buffs.Add(buff); return(true); }); SkillList.Add(bs.Name, bs); // 도발 bs = new BasicSkill() { Name = "도발", Cooltime = 4, ForceConst = -1, RangeType = "Player", RangeConst = "Select", Type = SkillType.Basic | SkillType.Defence, UsedTurn = -999, Description = "대상의 어그로를 사용자 자신에게 향하도록 합니다. 다른 사람이 도발을 사용하거나, 자신이 사망하기 전까지 어그로는 자신에게 향하도록 유지됩니다." }; bs.SetFunction((user, victim, obj) => { throw new NotImplementedException(); }); SkillList.Add(bs.Name, bs); // 주의 분산 bs = new BasicSkill() { Name = "주의 분산", Cooltime = 4, ForceConst = -1, RangeType = "Player", RangeConst = "Select", Type = SkillType.Basic | SkillType.Defence, UsedTurn = -999, Description = "자신의 어그로를 대상자에게 즉시 부여합니다. 같은 턴에 여러 사람이 도발을 사용한 경우, 기피를 통해 어그로를 획득한 대상이 1순위 어그로를 획득하게 됩니다." }; bs.SetFunction((user, victim, obj) => { throw new NotImplementedException(); }); SkillList.Add(bs.Name, bs); // 흡혈 bs = new BasicSkill() { Name = "흡혈", Cooltime = -1, ForceConst = 3, RangeType = "Player", RangeConst = "Self", Type = SkillType.Basic | SkillType.Offence, UsedTurn = -999, Description = "DoT로 입힌 피해만큼 체력을 회복합니다." }; bs.SetFunction((user, victim, obj) => { throw new NotImplementedException(); }); SkillList.Add(bs.Name, bs); // 전염 bs = new BasicSkill() { Name = "전염", Cooltime = -1, ForceConst = -1, RangeType = "Player", RangeConst = "Self", Type = SkillType.Basic | SkillType.Offence | SkillType.Heal, UsedTurn = -999, Description = "DoT 및 HoT시전 시, 지정 대상 기준 범위 내의 다수 대상으로 확장합니다. 범위는 '공격범위' 스탯의 영향을 받습니다." }; bs.SetFunction((user, victim, obj) => { throw new NotImplementedException(); }); SkillList.Add(bs.Name, bs); #endregion // ------------------BasicSkills---------------------- #region // 일반 공격 bs = new BasicSkill() { Name = "일반 공격", Cooltime = 0, ForceConst = 80, RangeType = "Point", RangeConst = null, Type = SkillType.Offence, UsedTurn = -999, Description = "단일 대상에게 시전하는 일반 공격입니다." }; bs.SetFunction((user, victim, obj) => { return(true); }); SkillList.Add(bs.Name, bs); // 강공격 bs = new BasicSkill() { Name = "강공격", Cooltime = 4, ForceConst = 200, RangeType = "Point", RangeConst = null, Type = SkillType.Offence, UsedTurn = -999, Description = "단일 대상에게 시전하는 강한 공격입니다." }; bs.SetFunction((user, victim, obj) => { return(true); }); SkillList.Add(bs.Name, bs); // 분산공격 bs = new BasicSkill() { Name = "분산공격", Cooltime = 1, ForceConst = 50, RangeType = "Ellipse", RangeConst = "3", Type = SkillType.Offence, UsedTurn = -999, Description = "범위 내 다수 대상에게 시전하는 공격입니다. 범위는 '공격범위' 스탯의 영향을 받습니다." }; bs.SetFunction((user, victim, obj) => { return(true); }); SkillList.Add(bs.Name, bs); // DoT bs = new BasicSkill() { Name = "DoT", Cooltime = 2, ForceConst = 40, RangeType = "Player", RangeConst = "Select", Type = SkillType.Offence | SkillType.OffenceTick, UsedTurn = -999, Description = "단일 대상에게 시전 직후부터 3턴 간 데미지를 입힙니다." }; bs.SetFunction((user, victim, obj) => { return(true); }); SkillList.Add(bs.Name, bs); // 공격력 증가 bs = new BasicSkill() { Name = "공격력 증가", Cooltime = 6, ForceConst = 3, RangeType = "Player", RangeConst = "Self", Type = SkillType.Offence, UsedTurn = -999, Description = "시전 턴을 포함하여 4턴 간 위력과 받는 피해량이 증가합니다." }; bs.SetFunction((user, victim, obj) => { return(true); }); SkillList.Add(bs.Name, bs); // 접근 bs = new BasicSkill() { Name = "접근", Cooltime = 3, ForceConst = 50, RangeType = "Point", RangeConst = null, Type = SkillType.Offence, UsedTurn = -999, Description = "대상으로부터 10마스 이내의 거리에 있을 경우, 대상에게 바로 접근하며 공격을 가합니다." }; bs.SetFunction((user, victim, obj) => { return(true); }); SkillList.Add(bs.Name, bs); // 후퇴 bs = new BasicSkill() { Name = "후퇴", Cooltime = 3, ForceConst = 50, RangeType = "Point", RangeConst = null, Type = SkillType.Offence, UsedTurn = -999, Description = "대상의 위치와 현재 위치를 기준으로 하여 직선거리로 10마스만큼 뒤로 이동합니다." }; bs.SetFunction((user, victim, obj) => { return(true); }); SkillList.Add(bs.Name, bs); // 단일대상-궁극기 bs = new BasicSkill() { Name = "단일대상-궁극기", Cooltime = 999, ForceConst = 800, RangeType = "Player", RangeConst = "Select", Type = SkillType.Offence | SkillType.Ultimate, UsedTurn = -999, Description = "단일 대상에 대한 가장 강력한 공격을 가합니다. 해당 스킬은 전투 중 1회만 사용 가능하며, 사용 직후 2턴 간 커맨드 입력이 불가능해집니다." }; bs.SetFunction((user, victim, obj) => { return(true); }); SkillList.Add(bs.Name, bs); // 다수대상-궁극기 bs = new BasicSkill() { Name = "다수대상-궁극기", Cooltime = 999, ForceConst = 400, RangeType = "Ellipse", RangeConst = "3", Type = SkillType.Offence | SkillType.Ultimate, UsedTurn = -999, Description = "다수 대상에 대한 가장 강력한 공격을 가합니다. 해당 스킬은 전투 중 1회만 사용 가능하며, 사용 직후 2턴 간 커맨드 입력이 불가능해집니다." }; bs.SetFunction((user, victim, obj) => { return(true); }); SkillList.Add(bs.Name, bs); #endregion // ------------------Attack Skills-------------------- #region ------------------Boss Skills-------------------- #region 승리 #endregion #endregion }
private BossSkillBase GenerateSkill(BossSkillBase skill) { string skillExp = skill.SkillConst; if (skill.Type.HasFlag(SkillType.Offence)) { skill.SkillFunction = (IPlayer boss, IPlayer player, object obj) => { Boss bs = boss as Boss; Player py = player as Player; double damage = ((double)ComputeSkillConst(skillExp, SkillType.Offence)) * py.HarmConst; py.CurrentHp = py.CurrentHp - damage <= 0 ? 0 : py.CurrentHp - damage; return(true); }; } else if (skill.Type.HasFlag(SkillType.MobAdd)) { skill.SkillFunction = (IPlayer boss, IPlayer player, object obj) => { Boss bs = boss as Boss; double MobHp = bs.MobHp; int count = int.Parse(skillExp); Random r = new Random(); var MobSkill = new BasicSkill() { Name = "일반 공격", Cooltime = 0, ForceConst = 300, RangeType = "", RangeConst = "", Type = SkillType.Offence, UsedTurn = -999, Description = "일반 공격" }; MobSkill.SetFunction((user, victim, scobj) => { victim.CurrentHp = victim.CurrentHp - (300 * victim.HarmConst) <= 0 ? 0 : victim.CurrentHp - (300 * victim.HarmConst); return(true); }); for (int i = 0; i < count; i++) { var mob = new Player("Mob" + i, new Stats(), MobHp, MobHp, 1, r.Next(20), r.Next(20)); mob.CommonSkills.Add(MobSkill); MobList.Add(mob); } return(true); }; } else if (skill.Type.HasFlag(SkillType.Defence)) { skill.SkillFunction = (IPlayer boss, IPlayer player, object obj) => { double skillConst = (double)ComputeSkillConst(skillExp, SkillType.Defence); boss.HarmConst = boss.HarmConst - (boss.HarmConst * skillConst) < 0 ? 0 : boss.HarmConst - (boss.HarmConst * skillConst); return(true); }; } else if (skill.Type.HasFlag(SkillType.OffenceTick)) { //var consts = (ValueTuple<double, int>)ComputeSkillConst(skillExp, SkillType.OffenceTick); //double skillConst = consts.Item1; //int duration = consts.Item2; //skill.SkillFunction = (IPlayer boss, IPlayer player, object obj) => //{ // Boss bs = boss as Boss; // Player py = player as Player; // BuffBase buffBase = new BuffBase(boss, duration, duration, skillConst); // buffBase.SkillFunction = (Player source, Player dst) => // { // dst.CurrentHp = dst.CurrentHp - (skillConst * dst.HarmConst) <= 0 ? 0 : dst.CurrentHp - (skillConst * dst.HarmConst); // return true; // }; // py.Buffs.Add(buffBase); // return true; //}; } return(skill); }