/// <summary> /// 检测技能及其冷却时间 /// </summary> /// <param name="skill">Skill</param> /// <returns>是否可释放</returns> private bool CheckSkill(ref SkillDetail skill) { // 没有该技能 // 处于冷却时间 if (!_skillColdTime.ContainsKey(skill)) { EventCenter.Broadcast(EventManager.EventType.UpdateSystemEvent, "未匹配到该技能"); return(false); } if (skill.skillType == SkillType.None) { EventCenter.Broadcast(EventManager.EventType.UpdateSystemEvent, "未匹配到该技能"); return(false); } if (_skillColdTime[skill] > 0f) { if (Math.Abs(noticeSkillInColdTime) < 0.1) { EventCenter.Broadcast(EventManager.EventType.UpdateSystemEvent, "技能处于冷却中"); noticeSkillInColdTime = DefaultNoticeSkillInColdTime; } return(false); } return(true); }
public Skill getSkillByName(string name) { SkillDetail details = skillData.skills.Find(x => x.name == name); return(new Skill(details.name, details.description, details.targetType, details.alias, details.conditions)); }
public int Deleteskill(int id) { SkillDetail sd = md.SkillDetails.Find(id); md.SkillDetails.Remove(sd); md.SaveChanges(); return(1); }
/// <summary> /// 尝试使用技能 /// </summary> /// <param name="skill"></param> /// <returns></returns> public override bool TryUseSkill(SkillDetail skill) { if (skill.skillType == SkillType.None) { return(false); } Base.Actor actor = this; return(_skillManager.UseSkill(ref skill, ref actor)); }
public SkillPack(SkillDetail dodgeSkill, SkillDetail wpSkill, SkillDetail displacementSkill, IEnumerable <SkillDetail> skillDetails) { _dodgeSkill = dodgeSkill; _wpSkill = wpSkill; _displacementSkill = displacementSkill; this.skillDetails.Clear(); this.skillDetails.AddRange(skillDetails); }
private string CheckRecForUltimate(List <GameObject> list, SkillDetail progress) { string[] rows = currentSkill.Upgrade.Split("|" [0]); string ult = rows [3]; string[] pos; try{ pos = ult.Split("-"[0]); }catch { pos = new string[0]; pos [0] = ult; } List <int> positions = new List <int> (); for (int i = 0; i < pos.Length; i++) { int offset = 0; switch (pos [i]) { case "1": positions.Add(progress.FirstRow.Count); break; case "2": offset = progress.FirstRow.Count; positions.Add(progress.SecondRow.Count + offset); break; case "3": offset = progress.FirstRow.Count + progress.SecondRow.Count; positions.Add(progress.ThirdRow.Count); break; } } string o = ""; for (int i = 0; i < positions.Count; i++) { o = o + positions [i]; if (i < positions.Count - 1) { o = o + "-"; } } return(o); }
/// <summary> /// Delete the detail from the db. The details are found via their ids and deleted from the ComapnyDetails table. They are then delete from the SkillDetail table /// </summary> /// <param name="selectedDetail"></param> /// <returns></returns> public async Task DeleteDetailFromDb(SkillDetail selectedDetail) { try { var tempDetail = _context.CompanyDetails.Where(d => d.SkillDetailId == selectedDetail.SkillDetailId).ToList(); foreach (var detail in tempDetail) { _context.CompanyDetails.RemoveRange(detail); } _context.SkillDetail.Remove(selectedDetail); await _context.SaveChangesAsync(); } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
public void SetDetail(SkillDetail detail) { string msg = ""; msg += $"Damage : <color=#FF0000>{detail.Damage}</color> \n"; string colorHex = (detail.DamageType == DamageType.PAtk) ? "FF0000" : "0000FF"; msg += $"Damage Type : <color=#{colorHex}>{detail.DamageType}</color> \n"; msg += $"Target Type : {detail.TargetTypestr}\n"; msg += $"MoveToTarget : {detail.MoveToTarget} \n"; msg += $"AOE : ({detail.AOE}*{detail.AOE}) \n"; msg += $"Range : {detail.Range} \n"; msg += $"CD : {detail.CD} \n"; msg += $"Description : \n {detail.Description} \n"; Description.text = msg; gameObject.SetActive(true); ani.Play("SkillDescriptionOnEnable", PlayMode.StopAll); }
/// <summary> /// 使用技能 /// </summary> /// <param name="skill">技能类型</param> /// <param name="actor">Actor</param> /// <returns>是否释放成功</returns> public bool UseSkill(ref SkillDetail skill, ref Actor.Base.Actor actor) { if (!CheckSkill(ref skill)) { return(false); } EventCenter.Broadcast(EventManager.EventType.UpdateSystemEvent, actor.actorType + " use skill: " + skill.skillName); UiManager.Instance.skillBarUi.skillBoxes[skill.GetIndex()].EnableMask(); // 释放技能 _skillImp.UseSkill(ref skill); // 计入冷却时间 _needColdDown.Add(skill); // 设定冷却时间 _skillColdTime[skill] = skill.coldDownTime; return(true); }
public void UpdateStats(SkillDetail sd) { Debug.Log(this.Name + " updated"); int upgradecount = 0; for (int i = 0; i < sd.FirstRow.Count; i++) { if (sd.FirstRow [i] > 0) { ApplyStats(this.UpgradeDetails [upgradecount], sd.FirstRow [i]); } upgradecount++; } for (int i = 0; i < sd.SecondRow.Count; i++) { if (sd.SecondRow [i] > 0) { ApplyStats(this.UpgradeDetails [upgradecount], sd.SecondRow [i]); } upgradecount++; } for (int i = 0; i < sd.ThirdRow.Count; i++) { if (sd.ThirdRow [i] > 0) { ApplyStats(this.UpgradeDetails [upgradecount], sd.ThirdRow [i]); } upgradecount++; } if (sd.Ultimate > 0) { ApplyStats(this.UpgradeDetails [upgradecount], sd.Ultimate); } MakeDescription(); }
/// <summary> /// 调用状态机以使用技能 /// </summary> /// <param name="skill">技能细节</param> public void UseSkill(ref SkillDetail skill) { _fsm.ChangeState(skill.skillType, StateTransition.Overwrite); }
public void ApplySkillTreeProgress(List <GameObject> list) { SkillDetail progress = null; foreach (SkillDetail s in currentCharacter.SkillOverview.skills.ToArray()) { if (s.ID == currentSkill.ID) { progress = s; break; } } ApplySkillTreeImage(list [0].transform.GetChild(0), 0, 0, "", -1); for (int i = 0; i < progress.FirstRow.Count; i++) { if (progress.FirstRow [i] < 0) { list [i + 1].transform.GetChild(0).GetComponent <Image> ().sprite = Skill_locked; list [i + 1].transform.GetChild(0).GetComponent <UpgradeManager> ().Lock(); } else if (i != 0) { ApplySkillTreeImage(list [i + 1].transform.GetChild(0), i + 1, progress.FirstRow [i], i + "", 1); } else { ApplySkillTreeImage(list [i + 1].transform.GetChild(0), i + 1, progress.FirstRow [i], 0 + "", 0); } } for (int i = 0; i < progress.SecondRow.Count; i++) { if (progress.SecondRow [i] < 0) { list [i + progress.FirstRow.Count + 1].transform.GetChild(0).GetComponent <Image> ().sprite = Skill_locked; list [i + progress.FirstRow.Count + 1].transform.GetChild(0).GetComponent <UpgradeManager> ().Lock(); } else if (i != 0) { ApplySkillTreeImage(list [i + progress.FirstRow.Count + 1].transform.GetChild(0), i + progress.FirstRow.Count + 1, progress.SecondRow [i], i + progress.FirstRow.Count + "", 11); } else { ApplySkillTreeImage(list [i + progress.FirstRow.Count + 1].transform.GetChild(0), i + progress.FirstRow.Count + 1, progress.SecondRow [i], 0 + "", 10); } } for (int i = 0; i < progress.ThirdRow.Count; i++) { if (progress.ThirdRow [i] < 0) { list [i + progress.FirstRow.Count + progress.SecondRow.Count + 1].transform.GetChild(0).GetComponent <Image> ().sprite = Skill_locked; list [i + progress.FirstRow.Count + progress.SecondRow.Count + 1].transform.GetChild(0).GetComponent <UpgradeManager> ().Lock(); } else if (i != 0) { ApplySkillTreeImage(list [i + progress.FirstRow.Count + progress.SecondRow.Count + 1].transform.GetChild(0), i + progress.FirstRow.Count + progress.SecondRow.Count + 1, progress.ThirdRow [i], i + progress.FirstRow.Count + progress.SecondRow.Count + "", 21); } else { ApplySkillTreeImage(list [i + progress.FirstRow.Count + progress.SecondRow.Count + 1].transform.GetChild(0), i + progress.FirstRow.Count + progress.SecondRow.Count + 1, progress.ThirdRow [i], 0 + "", 20); } } if (progress.Ultimate < 0) { list [list.Count - 1].transform.GetChild(0).GetComponent <Image> ().sprite = Skill_locked; list [list.Count - 1].transform.GetChild(0).GetComponent <UpgradeManager> ().Lock(); } else { ApplySkillTreeImage(list [list.Count - 1].transform.GetChild(0), list.Count - 1, progress.Ultimate, CheckRecForUltimate(list, progress), 30); } }
public int NewSkill(SkillDetail sd) { md.SkillDetails.Add(sd); md.SaveChanges(); return(1); }
public override bool TryUseSkill(SkillDetail skill) { throw new NotImplementedException(); }
public static async Task <TemplateFile> Create(AzureFileController azureFileController, User user, string documentLink, Dictionary <string, List <object> > subsetDetails) { var valuesToFill = new Content( new FieldContent("Initials", user.FirstName.ToCharArray()[0].ToString() + user.LastName.ToCharArray()[0].ToString()), new FieldContent("FirstName", user.FirstName), new FieldContent("LastName", user.LastName), new FieldContent("Email", user.UserInfo?.FirstOrDefault()?.AltEmail ?? user.Email), new TableContent("EducationTable"), new TableContent("CertTable"), new TableContent("WorkTable"), new TableContent("ProjectTable"), new TableContent("SkillTable")); subsetDetails["Edu"].ForEach(obj => { EducationDetail detail = (EducationDetail)obj; valuesToFill .Tables .FirstOrDefault(table => table.Name.Equals("EducationTable")) .AddRow(new FieldContent("SchoolName", detail.SchoolName), new FieldContent("Achievement", detail.Achievement), new FieldContent("Degree", detail.Degree), new FieldContent("EndDate", detail.EndDateTentative ? "Current" : detail.EndDate?.ToShortDateString()), new FieldContent("StartDate", detail.StartDate.ToShortDateString()), new FieldContent("GPA", detail.GPA.ToString())); }); subsetDetails["Cert"].ForEach(obj => { CertDetail detail = (CertDetail)obj; valuesToFill .Tables .FirstOrDefault(table => table.Name.Equals("CertTable")) .AddRow(new FieldContent("Issuer", detail.Issuer), new FieldContent("Name", detail.Name), new FieldContent("DateAchieved", detail.DateAchieved.ToShortDateString())); }); subsetDetails["Work"].ForEach(obj => { WorkDetail detail = (WorkDetail)obj; valuesToFill .Tables .FirstOrDefault(table => table.Name.Equals("WorkTable")) .AddRow(new FieldContent("Company", detail.Company), new FieldContent("Location", detail.Location), new FieldContent("Summary", detail.Summary), new FieldContent("EndDate", detail.EndDateTentative ? "Current" : detail.EndDate?.ToShortDateString()), new FieldContent("StartDate", detail.StartDate.ToShortDateString()), new FieldContent("Title", detail.Title.ToString())); // TODO add bullets }); subsetDetails["Project"].ForEach(obj => { ProjectDetail detail = (ProjectDetail)obj; valuesToFill .Tables .FirstOrDefault(table => table.Name.Equals("ProjectTable")) .AddRow(new FieldContent("Company", detail.Company), new FieldContent("Supervisor", detail.Supervisor), new FieldContent("Summary", detail.Summary), new FieldContent("EndDate", detail.EndDateTentative ? "Current" : detail.EndDate?.ToShortDateString()), new FieldContent("StartDate", detail.StartDate.ToShortDateString()), new FieldContent("Title", detail.Title.ToString())); }); subsetDetails["Skill"].ForEach(obj => { SkillDetail detail = (SkillDetail)obj; valuesToFill .Tables .FirstOrDefault(table => table.Name.Equals("SkillTable")) .AddRow(new FieldContent("Class", detail.Class), new FieldContent("Name", detail.Name), new FieldContent("Level", detail.Level)); }); if (user.UserInfo.Any()) { UserInfo info = user.UserInfo.FirstOrDefault(); if (!string.IsNullOrEmpty(info.NameExt)) { valuesToFill.Fields.Add(new FieldContent("NameExt", info.NameExt)); } if (!string.IsNullOrEmpty(info.Summary)) { valuesToFill.Fields.Add(new FieldContent("Summary", info.Summary)); } if (!string.IsNullOrEmpty(info.PhoneNumber)) { valuesToFill.Fields.Add(new FieldContent("Phone", info.PhoneNumber)); } if (!string.IsNullOrEmpty(info.Website)) { valuesToFill.Fields.Add(new FieldContent("Website", info.Website)); } } string str = await azureFileController.GetFile(FileType.Templates, documentLink); using (var outputDocument = new TemplateProcessor(str).SetRemoveContentControls(true).SetNoticeAboutErrors(false)) { outputDocument.FillContent(valuesToFill); outputDocument.SaveChanges(); } return(new TemplateFile() { LocalFile = str }); }
public int CreateSkills(SkillDetail details) { return(userlogic.NewSkill(details)); }
/// <summary> /// 调用状态机以使用 "闪避" 技能 /// 只允许内部调用, 属于被动技能 /// </summary> /// <param name="skill">技能细节</param> private void UseDodge(ref SkillDetail skill) { _fsmDodge.ChangeState(skill.skillType, StateTransition.Overwrite); }
public async Task CrawlerDetail(HtmlDocument htmlDocument, String crawl, String detailAnchor) { //var listDetail = HttpContext.Session.GetObject<List<String>>(CT.DETAIL); var part = new List <String>(); if (part != null) { if (crawl != null) { foreach (var include in crawl.Split(new Char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { part.Add(include); } } //var url = detailAnchor; //using var httpClient = new HttpClient(); //var html = await httpClient.GetStringAsync(url); //var htmlDocument = new HtmlDocument(); //htmlDocument.LoadHtml(html); var playerProfile = htmlDocument.DocumentNode.Descendants("div") .Where(node => node.GetAttributeValue("class", "") .Equals("playerprofile-itemblock")).FirstOrDefault(); //price var getImagePlayer = Url_image + playerProfile.Descendants("div") .Where(node => node.GetAttributeValue("class", "") .Contains("card-20-face-")) .FirstOrDefault() .Descendants("img") .FirstOrDefault() .Attributes["src"].Value; var getPlayer = unitOfWork.Player.GetFirstOrDefault(x => x.Face.Equals(getImagePlayer)); if (getPlayer.Nation == null) { getPlayer.Nation = htmlDocument.DocumentNode.Descendants("div") .Where(node => node.GetAttributeValue("class", "") .Equals("playerprofile-hbar-ttl")).FirstOrDefault().Descendants("a").FirstOrDefault().InnerText; } if (playerProfile != null) { var priceObject = new TradingMarket(); var priceUpdate = playerProfile.Descendants("div").Where(node => node.GetAttributeValue("class", "") .Contains("priceupdate")) .ToList(); var xboxUpdate = priceUpdate[0].InnerText; var ps4Update = priceUpdate[1].InnerText; priceObject.Player = getPlayer.Id; priceObject.Xtime = xboxUpdate; priceObject.Ps4time = ps4Update; var priceProfile = playerProfile.Descendants("div").Where(node => node.GetAttributeValue("class", "") .Equals("playerprofile-price")) .ToList(); var xboxPrice = priceProfile[0].InnerText; var ps4Price = priceProfile[1].InnerText; priceObject.Xprice = Double.Parse(xboxPrice); priceObject.Ps4price = Double.Parse(ps4Price); unitOfWork.TradingMarket.Add(priceObject); } //skill var playerInfor = htmlDocument.DocumentNode.Descendants("p") .Where(node => node.GetAttributeValue("class", "") .Contains("ppdb-d")).ToList(); var skillPoint = playerInfor[0].InnerText; var weakFoot = playerInfor[1].InnerText; var age = playerInfor[2].InnerText; var height = playerInfor[3].InnerText; var weight = playerInfor[4].InnerText; var workrates = playerInfor[5].InnerText; var footed = playerInfor[6].InnerText; var player = getPlayer.Id; var skillObject = new SkillDetail() { Age = int.Parse(age), Player = player, Footed = footed, Height = height, Weight = weight, Skill = int.Parse(skillPoint), Weakfoot = int.Parse(weakFoot), Workrates = workrates }; unitOfWork.SkillDetail.Add(skillObject); //fight for the badge var badge = playerProfile.Descendants("div") .Where(node => node.GetAttributeValue("align", "") .Equals("center")).FirstOrDefault(); var yes = badge.Descendants("a").FirstOrDefault().InnerText; var no = badge.Descendants("a").Skip(1).Take(1).FirstOrDefault().InnerText; var getStats = htmlDocument.DocumentNode.Descendants("div") .Where(node => node.GetAttributeValue("class", "") .Equals("col-2")).ToList(); //PacDetail var pacPoint = getStats[1].InnerText; var splitPacPoint = pacPoint.Replace("\n", ""); var getPacPointOnly = splitPacPoint.Where(x => char.IsDigit(x)).ToList(); var pacObject = new PacDetail(); // var item = getPacPointOnly[0].ToString(); pacObject.Pac = int.Parse(getPacPointOnly[0].ToString() + getPacPointOnly[1].ToString()); pacObject.Acc = int.Parse(getPacPointOnly[2].ToString() + getPacPointOnly[3].ToString()); pacObject.Speed = int.Parse(getPacPointOnly[4].ToString() + getPacPointOnly[5].ToString()); pacObject.Player = getPlayer.Id; unitOfWork.PacDetail.Add(pacObject); //ShoDetail var showPoint = getStats[2].InnerText; var splitShoPoint = showPoint.Replace("\n", ""); var getShoPointOnly = splitShoPoint.Where(x => char.IsDigit(x)).ToList(); var shoObject = new ShoDetail(); getShoPointOnly.RemoveRange(0, 2); shoObject.Pos = int.Parse(getShoPointOnly[0].ToString() + getShoPointOnly[1].ToString()); shoObject.Fin = int.Parse(getShoPointOnly[2].ToString() + getShoPointOnly[3].ToString()); shoObject.Sp = int.Parse(getShoPointOnly[4].ToString() + getShoPointOnly[5].ToString()); shoObject.Ls = int.Parse(getShoPointOnly[6].ToString() + getShoPointOnly[7].ToString()); shoObject.Volleys = int.Parse(getShoPointOnly[8].ToString() + getShoPointOnly[9].ToString()); shoObject.Pen = int.Parse(getShoPointOnly[10].ToString() + getShoPointOnly[11].ToString()); shoObject.Player = getPlayer.Id; unitOfWork.ShoDetail.Add(shoObject); //PasDetail var pasPoint = getStats[3].InnerText; var splitPasPoint = pasPoint.Replace("\n", ""); var getPasPointOnly = splitPasPoint.Where(x => char.IsDigit(x)).ToList(); var pasDetail = new PasDetail(); getPasPointOnly.RemoveRange(0, 2); pasDetail.Vision = int.Parse(getPasPointOnly[0].ToString() + getPasPointOnly[1].ToString()); pasDetail.Crossing = int.Parse(getPasPointOnly[2].ToString() + getPasPointOnly[3].ToString()); pasDetail.Fk = int.Parse(getPasPointOnly[4].ToString() + getPasPointOnly[5].ToString()); pasDetail.Sp = int.Parse(getPasPointOnly[6].ToString() + getPasPointOnly[7].ToString()); pasDetail.Lp = int.Parse(getPasPointOnly[8].ToString() + getPasPointOnly[9].ToString()); pasDetail.Curve = int.Parse(getPasPointOnly[10].ToString() + getPasPointOnly[11].ToString()); pasDetail.Player = getPlayer.Id; unitOfWork.PasDetail.Add(pasDetail); //PhyDetail var phyPoint = getStats[6].InnerText; var splitPhyPoint = phyPoint.Replace("\n", ""); var getPhyPointOnly = splitPhyPoint.Where(x => char.IsDigit(x)).ToList(); var phyDetail = new PhyDetail(); phyDetail.Jump = int.Parse(getPhyPointOnly[2].ToString() + getPhyPointOnly[3].ToString()); phyDetail.Stamina = int.Parse(getPhyPointOnly[4].ToString() + getPhyPointOnly[5].ToString()); phyDetail.Strength = int.Parse(getPhyPointOnly[6].ToString() + getPhyPointOnly[7].ToString()); phyDetail.Aggression = int.Parse(getPhyPointOnly[8].ToString() + getPhyPointOnly[9].ToString()); phyDetail.Player = getPlayer.Id; unitOfWork.PhyDetail.Add(phyDetail); //DefDetail var defPoint = getStats[5].InnerText; var splitDefPoint = defPoint.Replace("\n", ""); var getDefPointOnly = splitDefPoint.Where(x => char.IsDigit(x)).ToList(); var defDetail = new DefDetail(); getDefPointOnly.RemoveRange(0, 2); defDetail.Interception = int.Parse(getDefPointOnly[0].ToString() + getDefPointOnly[1].ToString()); defDetail.Ha = int.Parse(getDefPointOnly[2].ToString() + getDefPointOnly[3].ToString()); defDetail.Da = int.Parse(getDefPointOnly[4].ToString() + getDefPointOnly[5].ToString()); defDetail.Stand = int.Parse(getDefPointOnly[6].ToString() + getDefPointOnly[7].ToString()); defDetail.Slide = int.Parse(getDefPointOnly[8].ToString() + getDefPointOnly[9].ToString()); defDetail.Player = getPlayer.Id; unitOfWork.DefDetail.Add(defDetail); //DriDetail var driPoint = getStats[4].InnerText; var splitDriPoint = driPoint.Replace("\n", ""); var getDriPointOnly = splitDriPoint.Where(x => char.IsDigit(x)).ToList(); var driDetail = new DriDetail(); getDefPointOnly.RemoveRange(0, 2); driDetail.Agility = int.Parse(getDriPointOnly[0].ToString() + getDriPointOnly[1].ToString()); driDetail.Balance = int.Parse(getDriPointOnly[2].ToString() + getDriPointOnly[3].ToString()); driDetail.React = int.Parse(getDriPointOnly[4].ToString() + getDriPointOnly[5].ToString()); driDetail.Control = int.Parse(getDriPointOnly[6].ToString() + getDriPointOnly[7].ToString()); driDetail.Drib = int.Parse(getDriPointOnly[8].ToString() + getDriPointOnly[9].ToString()); driDetail.Composure = int.Parse(getDriPointOnly[10].ToString() + getDriPointOnly[11].ToString()); driDetail.Player = getPlayer.Id; unitOfWork.DriDetail.Add(driDetail); //Position var position = htmlDocument.DocumentNode.Descendants("div") .Where(node => node.GetAttributeValue("class", "") .Equals("altpos-inner-l1")).ToList(); var positionPoint = htmlDocument.DocumentNode.Descendants("div") .Where(node => node.GetAttributeValue("class", "") .Equals("altpos-inner-l2")).ToList(); var positionObject = new Position(); positionObject.Cb = int.Parse(position[0].InnerText); positionObject.Cdm = int.Parse(position[1].InnerText); positionObject.Cm = int.Parse(position[2].InnerText); positionObject.Cam = int.Parse(position[3].InnerText); positionObject.Cf = int.Parse(position[4].InnerText); positionObject.St = int.Parse(position[5].InnerText); positionObject.Lw = int.Parse(position[6].InnerText); positionObject.Lf = int.Parse(position[7].InnerText); positionObject.Rf = int.Parse(position[8].InnerText); positionObject.Rw = int.Parse(position[9].InnerText); positionObject.Lm = int.Parse(position[10].InnerText); positionObject.Rm = int.Parse(position[11].InnerText); positionObject.Rb = int.Parse(position[12].InnerText); positionObject.Rwb = int.Parse(position[13].InnerText); positionObject.Lb = int.Parse(position[14].InnerText); positionObject.Lwb = int.Parse(position[15].InnerText); positionObject.Player = getPlayer.Id; unitOfWork.Position.Add(positionObject); unitOfWork.Save(); } }
/// <summary> /// 使用技能 /// </summary> /// <param name="skill">技能细节</param> /// <returns>是否攻击成功</returns> public abstract bool TryUseSkill(SkillDetail skill);