public Command(Player sourcePlayer, Player destinationPlayer, object skillObject, ISkillBase usedSkill) : this() { SourcePlayer = sourcePlayer; DestinationPlayer = destinationPlayer; SkillObject = skillObject; UsedSkill = usedSkill; }
public void DeleteCommonSkill(ISkillBase skill) { if (CommonSkills.Contains(skill)) { CommonSkills.Remove(skill); } }
public void AddCommonSkill(ISkillBase skill) { if (!CommonSkills.Contains(skill)) { CommonSkills.Add(skill); } }
public void SkillClicked(SkillItem sitem) { UserCommand_View view = View as UserCommand_View; if (_SelectedPlayers.Count <= 0) { MessageBox.Show("플레이어를 먼저 선택하세요.", "실패"); sitem.IsSelected = false; return; } int cost = view.CostCounter; int sitemCost; if (sitem.Skill.Type.HasFlag(SkillType.Basic)) { sitemCost = 1; } else if (sitem.Skill.Type.HasFlag(SkillType.Ultimate)) { sitemCost = 3; } else { sitemCost = 2; } if (_SelectedSkills.Contains(sitem.Skill)) { _SelectedSkills.Remove(sitem.Skill); sitem.IsSelected = false; view.CostCounter = cost - sitemCost; } else { if (sitem.Skill.Type.HasFlag(SkillType.Ultimate)) { ISkillBase ultimate = _SelectedSkills.FirstOrDefault(x => x.Type.HasFlag(SkillType.Ultimate)); if (ultimate != null) { MessageBox.Show($"해당 플레이어는 이미 궁극기를 선택했습니다.({ultimate.Name})", "실패"); sitem.IsSelected = false; return; } } if (cost + sitemCost > 10) { MessageBox.Show($"코스트 초과함. ({cost + sitemCost}/10)"); sitem.IsSelected = false; } else { sitem.IsSelected = true; _SelectedSkills.Add(sitem.Skill); view.CostCounter = cost + sitemCost; } } }
public SkillItem(SkillType type, string name, double skillConst, int cooltime, string description, Func <IPlayer, IPlayer, object, bool> skillFunction) : this() { Skill = new BasicSkill() { Type = type, Name = name, ForceConst = skillConst, Cooltime = cooltime, Description = description, SkillFunction = skillFunction }; Lab_Description.Text = Skill.Description; string result = Skill.Cooltime < 0 ? "패시브" : Skill.Cooltime.ToString() + "턴"; result = Skill.Cooltime >= 999 ? "궁극기" : result; Lab_Cooltime.Text = result; Lab_SkillName.Text = Skill.Name; string typeText = ""; if (Skill.Type.HasFlag(SkillType.Defence)) { typeText = SkillType.Defence.ToString(); } if (Skill.Type.HasFlag(SkillType.Offence)) { typeText = SkillType.Offence.ToString(); } if (Skill.Type.HasFlag(SkillType.Heal)) { typeText = SkillType.Heal.ToString(); } if (Skill.Type.HasFlag(SkillType.Basic)) { typeText = SkillType.Basic.ToString(); } Lab_SkillType.Text = typeText; Lab_SkillConst.Text = Skill.ForceConst < 0 ? "무제한" : Skill.ForceConst.ToString(); if (Skill.Type.HasFlag(SkillType.Offence)) { BackColor = Color.FromArgb(234, 153, 153); } if (Skill.Type.HasFlag(SkillType.Defence)) { BackColor = Color.FromArgb(159, 197, 232); } if (Skill.Type.HasFlag(SkillType.Heal)) { BackColor = Color.FromArgb(182, 215, 168); } if (Skill.Type.HasFlag(SkillType.Basic)) { BackColor = Color.FromArgb(255, 229, 153); } if (Skill.Type.HasFlag(SkillType.Ultimate)) { var font = Lab_SkillName.Font; Lab_SkillName.Font = new Font(font, FontStyle.Bold); } }
public ISkillBase GetSkillByName(string name) { ISkillBase result = null; try { result = _SkillList[name]; } catch { } return(result); }
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 }
public void SetUltimate(ISkillBase skill) { UltimateSkill = skill; }
public void AddSkill(ISkillBase skill) { _CommonSkills.Add(skill); }