// info: 스킬 쿨다운을 적용하는 것과 별개로, 버프에 대해서 꼼꼼하게 걸러낼 필요가 생길 때 참고하기 위해서 유닛 테스트와 함께 남깁니다. public Skill.Skill Select(IRandom random, Dictionary <int, Buff.Buff> buffs, SkillBuffSheet skillBuffSheet, BuffSheet buffSheet) { var skills = GetSelectableSkills(); if (!(buffs is null) && !(skillBuffSheet is null) && !(buffSheet is null)) { // 기존에 걸려 있는 버프들과 겹치지 않는 스킬만 골라내기. skills = skills.Where(skill => { var skillId = skill.SkillRow.Id; // 버프가 없는 스킬이면 포함한다. if (!skillBuffSheet.TryGetValue(skillId, out var row)) { return(true); } // 이 스킬을 포함해야 하는가? 기본 네. var shouldContain = true; foreach (var buffId in row.BuffIds) { // 기존 버프 중 ID가 같은 것이 있을 경우 아니오. if (buffs.Values.Any(buff => buff.RowData.Id == buffId)) { shouldContain = false; break; } // 버프 정보 얻어오기 실패. if (!buffSheet.TryGetValue(buffId, out var buffRow)) { continue; } // 기존 버프 중 그룹 ID가 같고, ID가 크거나 같은 것이 있을 경우 아니오. if (buffs.Values.Any(buff => buff.RowData.GroupId == buffRow.GroupId && buff.RowData.Id >= buffRow.Id)) { shouldContain = false; break; } } return(shouldContain); }).ToList(); // 기존 버프와 중복하는 것을 걷어내고 나니 사용할 스킬이 없는 경우에는 전체를 다시 고려한다. if (!skills.Any()) { skills = GetSelectableSkills(); } } return(PostSelect(random, skills)); }
public static IList <Buff> GetBuffs( Skill.Skill skill, SkillBuffSheet skillBuffSheet, BuffSheet buffSheet) { var buffs = new List <Buff>(); if (!skillBuffSheet.TryGetValue(skill.SkillRow.Id, out var skillBuffRow)) { return(buffs); } foreach (var buffId in skillBuffRow.BuffIds) { if (!buffSheet.TryGetValue(buffId, out var buffRow)) { continue; } buffs.Add(Get(buffRow)); } return(buffs); }