void Update() { if (Input.GetMouseButtonDown(0)) { Vector3 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); Vector2 unitVector = ((Vector2)worldPos - (Vector2)gameObject.transform.position).normalized; if (unitVector.y > m_fReagan) { SkillBox skillBox = m_skillBoxDic [Direction.Up]; skillBox.UseSkill(); } else if (unitVector.x > m_fReagan) { SkillBox skillBox = m_skillBoxDic [Direction.Right]; skillBox.UseSkill(); } else if (unitVector.y < -m_fReagan) { SkillBox skillBox = m_skillBoxDic [Direction.Down]; skillBox.UseSkill(); } else { SkillBox skillBox = m_skillBoxDic [Direction.Left]; skillBox.UseSkill(); } } }
public void UpdateSkillLevel(Skill skillUpgraded) { SkillBox skillBoxUpgraded = findSkillInBoxes(skillUpgraded); if (skillBoxUpgraded) { skillBoxUpgraded.UpdateSkillLevel(); } }
public void SelectSkill(Key key) { char k = (key.ToString()[key.ToString().Length - 1]); if (_mapping.ContainsKey(k)) { SkillBox s = _mapping[k]; if (Callback != null) { Callback(s); } } }
void Start() { for (int i = 0; i < attackSideParent.childCount; i++) { SkillBox tmp = attackSideParent.GetChild(i).GetComponent <SkillBox>(); if (tmp) { attackSkillBoxes.Add(tmp); } } for (int i = 0; i < defenseSideParent.childCount; i++) { SkillBox tmp = defenseSideParent.GetChild(i).GetComponent <SkillBox>(); if (tmp) { defenseSkillBoxes.Add(tmp); } } }
// Update is called once per frame void Update() { healthPercent = health / maxHealth; barMask.localScale = new Vector3(healthPercent * maskOriginScale, maskYScale, 1); if (health <= 0) { if (EnemyDie == true) { return; } if (gameObject.tag == "King") { UIControl.Instance().SetGameOver(false); } //无尽模式刷新计分板 if (gameObject.layer == 9) { UIControl.Instance().EnemyDeadScore(); } SkillBox skillBox = this.GetComponentInParent <SkillBox>(); if (skillBox != null) { skillBox.Relese(); } if (gameObject.tag == "Player") { StartCoroutine(SoldierGoToHell()); } else if (gameObject.tag == "Enemy") { StartCoroutine(EnemyGoToHell()); } EnemyDie = true; } }
public override void OnEnabled() { LandmarkSearchWindow = new PoiLookupWindow(this) { Parent = GameService.Graphics.SpriteScreen, Location = GameService.Graphics.SpriteScreen.Size / new Point(2) }; LandmarkSearch = new SkillBox() { Location = new Point(GameService.Graphics.WindowWidth / 4 * 1 - 30, 0), Icon = GameService.Content.GetTexture("landmark-search-icon"), Parent = GameService.Graphics.SpriteScreen, Menu = new ContextMenuStrip(), Visible = false }; LandmarkSearch.Menu.AddMenuItem("Use small icon").Click += delegate { LandmarkSearch.Visible = false; landmarkSearchIcon.Visible = true; }; landmarkSearchIcon = new CornerIcon() { Icon = GameService.Content.GetTexture("landmark-search"), HoverIcon = GameService.Content.GetTexture("landmark-search-hover"), Menu = new ContextMenuStrip(), BasicTooltipText = "Landmark Search", Priority = 5, }; landmarkSearchIcon.Menu.AddMenuItem("Use large icon").Click += delegate { LandmarkSearch.Visible = true; landmarkSearchIcon.Visible = false; }; landmarkSearchIcon.Click += delegate { LandmarkSearchWindow.ToggleWindow(); }; GameService.Graphics.SpriteScreen.Resized += delegate { LandmarkSearch.Location = new Point(GameService.Graphics.WindowWidth / 4 * 1 - 30, 0); }; LandmarkSearch.LeftMouseButtonReleased += delegate { LandmarkSearchWindow.ToggleWindow(); }; var floorInfo = BHGw2Api.Floor.FloorFromContinentAndId(1, 1); if (floorInfo == null) { GameService.Debug.WriteWarningLine("PoiLookup: Could not load landmark information from API. Aborting."); return; } foreach (var region in floorInfo.Regions) { foreach (var map in region.Maps) { foreach (var upoi in map.Landmarks) { if (upoi.Name?.Length > 0 && !PointsOfInterest.ContainsKey(upoi.Name)) { PointsOfInterest.Add(upoi.Name, upoi); } } } } }
private void AddSkill(SkillBox box, bool isEnable = true) { TextBlock skillButton = new TextBlock() { Text = string.Format("{0}", box.Name), Foreground = null, FontSize = 12, FontFamily = new FontFamily("SimHei") }; if (box.StatusInfo != string.Empty) { ToolTipService.SetToolTip(skillButton, box.StatusInfo); } if (box.IsSwitchInternalSkill) { skillButton.Foreground = new SolidColorBrush(Colors.Purple); } else if (box.IsUnique) { skillButton.Foreground = new SolidColorBrush(Colors.Red); } else if (box.IsSpecial) { skillButton.Foreground = new SolidColorBrush(Colors.Cyan); } else { skillButton.Foreground = new SolidColorBrush(Colors.White); } if (box.Status == SkillStatus.Ok && isEnable) { skillButton.MouseLeftButtonUp += (s, e) => { Callback(box); }; } else { skillButton.Opacity = 0.35; } skillButton.MouseEnter += (s, e) => { skillButton.Foreground = new SolidColorBrush(Colors.Orange); skillinfo.Xaml = box.GenerateToolTip(false).Xaml.Replace("#FF000000", "#FFFFFFFF"); //将黑色的字变成白色的 //skillinfo.Blocks.Add(box.GenerateToolTip().Blocks[0]); }; skillButton.MouseLeave += (s, e) => { if (box.IsSwitchInternalSkill) { skillButton.Foreground = new SolidColorBrush(Colors.Purple); } else if (box.IsUnique) { skillButton.Foreground = new SolidColorBrush(Colors.Red); } else if (box.IsSpecial) { skillButton.Foreground = new SolidColorBrush(Colors.Cyan); } else { skillButton.Foreground = new SolidColorBrush(Colors.White); } skillinfo.Blocks.Clear(); }; SkillContainer.Children.Add(skillButton); }
public AIResult GetAIResult() { AIResult rst = new AIResult(); List <LocationBlock> range = this.GetMoveRange(Field.currentSpirit.X, Field.currentSpirit.Y); //若HP低下,则概率逃跑 if ((double)Field.currentSpirit.Hp / (double)Field.currentSpirit.Role.Attributes["maxhp"] < 0.3 && Tools.ProbabilityTest(0.5)) { int max = 0; //寻找一个点离敌人最远 foreach (var r in range) { int min = int.MaxValue; foreach (Spirit sp in Field.Spirits) { int distance = GetDistance(sp.X, sp.Y, r.X, r.Y); if (sp.Team != Field.currentSpirit.Team && distance < min) { min = distance; } } if (min > max) { max = min; rst.MoveX = r.X; rst.MoveY = r.Y; rst.IsRest = true; } } return(rst); } //AI策略:穷举移动到每一个能移动的点,并且使用技能攻击,选择伤害最大的攻击 double maxAttack = 0; List <SkillBox> useSkills = new List <SkillBox>(); //对AI进行减枝,控制技能数量 foreach (var skill in Field.currentSpirit.Role.GetAvaliableSkills()) { if (!(skill.Status == SkillStatus.Ok)) { continue; } if (useSkills.Count < CommonSettings.AI_MAX_COMPUTE_SKILL) { useSkills.Add(skill); } else { //替换一个攻击最低的技能 double min = double.MaxValue; SkillBox minPowerSkill = null; foreach (var s in useSkills) { if (s.Power < min) { min = s.Power; minPowerSkill = s; } } if (minPowerSkill != null && skill.Power > minPowerSkill.Power) { useSkills.Remove(minPowerSkill); useSkills.Add(skill); } } } //对走位进行剪枝,控制NPC行走 List <LocationBlock> useMoveRange = new List <LocationBlock>(); useMoveRange.Add(new LocationBlock() { X = Field.currentSpirit.X, Y = Field.currentSpirit.Y }); //默认的把不移动加上 if (range.Count > CommonSettings.AI_MAX_COMPUTE_MOVERANGE) { while (useMoveRange.Count < CommonSettings.AI_MAX_COMPUTE_MOVERANGE) { LocationBlock block = range[Tools.GetRandomInt(0, range.Count - 1)]; if (!useMoveRange.Contains(block)) { useMoveRange.Add(block); } } } else { useMoveRange = range; } foreach (var skill in useSkills) //选技能 { if (!(skill.Status == SkillStatus.Ok)) { continue; } //DateTime t1 = DateTime.Now; foreach (var r in useMoveRange) //走位 { int x = r.X; int y = r.Y; List <LocationBlock> castRange = skill.GetSkillCastBlocks(x, y); foreach (var cast in castRange) { double totalHit = 0; List <LocationBlock> hitRange = skill.GetSkillCoverBlocks(cast.X, cast.Y, x, y); foreach (var hit in hitRange) { Spirit target = Field.GetSpirit(hit.X, hit.Y); if (target == null || target == Field.currentSpirit) { continue; } AttackResult attackResult = skill.Attack(Field.currentSpirit, target); rst.totalAttackComputeNum++; if (target.Team != Field.currentSpirit.Team) { totalHit += attackResult.Hp; //攻击到敌人 } else if (target.Team == Field.currentSpirit.Team && RuntimeData.Instance.FriendlyFire) { totalHit -= attackResult.Hp / 2; //攻击到友方 } } if (totalHit > maxAttack) { rst.MoveX = x; rst.MoveY = y; rst.skill = skill; rst.IsRest = false; rst.AttackX = cast.X; rst.AttackY = cast.Y; maxAttack = totalHit; } } } //DateTime t2 = DateTime.Now; //MessageBox.Show((t2 - t1).TotalMilliseconds.ToString()); } if (rst.skill != null) { return(rst);//攻击对手 } //否则靠近自己最近的敌人 int minDistance = int.MaxValue; Spirit targetRole = null; //寻找离自己最近的敌人 foreach (Spirit sp in Field.Spirits) { if (sp.Team == Field.currentSpirit.Team) { continue; } int distance = GetDistance(sp, Field.currentSpirit); if (distance < minDistance) { minDistance = distance; targetRole = sp; } } if (targetRole != null) { int minDis2 = int.MaxValue; int movex = Field.currentSpirit.X, movey = Field.currentSpirit.Y; //寻找离对手最近的一点 foreach (var mr in range) { int distance = GetDistance(mr.X, mr.Y, targetRole.X, targetRole.Y); if (distance <= minDis2) { minDis2 = distance; movex = mr.X; movey = mr.Y; } } rst.skill = null; rst.MoveX = movex; rst.MoveY = movey; rst.IsRest = true; //靠近对手 //如果有增益性技能,则一定概率使用 if (Tools.ProbabilityTest(0.5)) { foreach (var s in Field.currentSpirit.Role.SpecialSkills) { SkillBox sb = new SkillBox() { SpecialSkill = s }; if (sb.Status == SkillStatus.Ok && s.Skill.HitSelf) { rst.skill = sb; rst.AttackX = movex; rst.AttackY = movey; rst.IsRest = false; } } } return(rst); } else { //否则休息 rst.MoveX = Field.currentSpirit.X; rst.MoveY = Field.currentSpirit.Y; rst.IsRest = true; //没有对手,休息 return(rst); } }
public static SkillHotKeysItem Create(SkillBox box, char hotKey, SkillHotKeysPanel parent) { SkillHotKeysItem rst = new SkillHotKeysItem(); ToolTipService.SetToolTip(rst, box.GenerateToolTip()); if (box.Name.Length > 14) { rst.NameText.Text = box.Name.Substring(0, 3) + "..."; } else { rst.NameText.Text = box.Name; } rst.HotKeyText.Text = hotKey.ToString(); if (box.Instance != null && !box.IsUnique) //外功 { switch (box.Instance.Skill.Type) { case CommonSettings.SKILLTYPE_JIAN: rst.TypeImageJian.Visibility = Visibility.Visible; break; case CommonSettings.SKILLTYPE_DAO: rst.TypeImageDao.Visibility = Visibility.Visible; break; case CommonSettings.SKILLTYPE_QUAN: rst.TypeImageQuan.Visibility = Visibility.Visible; break; case CommonSettings.SKILLTYPE_QIMEN: rst.TypeImageQimen.Visibility = Visibility.Visible; break; default: break; } } else if (box.IsUnique) //绝技 { rst.NameText.Foreground = new SolidColorBrush(Colors.Red); switch (box.Type) { case CommonSettings.SKILLTYPE_JIAN: rst.TypeImageJian.Visibility = Visibility.Visible; break; case CommonSettings.SKILLTYPE_DAO: rst.TypeImageDao.Visibility = Visibility.Visible; break; case CommonSettings.SKILLTYPE_QUAN: rst.TypeImageQuan.Visibility = Visibility.Visible; break; case CommonSettings.SKILLTYPE_QIMEN: rst.TypeImageQimen.Visibility = Visibility.Visible; break; case CommonSettings.SKILLTYPE_NEIGONG: rst.TypeImageNeigong.Visibility = Visibility.Visible; break; default: break; } } else if (box.IsSpecial) { rst.NameText.Foreground = new SolidColorBrush(Colors.Cyan); rst.TypeImageSpecial.Visibility = Visibility.Visible; } rst.MouseLeftButtonDown += (ss, ee) => { parent.Callback(box); }; return(rst); }
/// <summary> /// 装备过滤,影响到战斗计算 /// </summary> /// <param name="isAttacker">攻击者/防御者</param> /// <param name="skillType">技能类型</param> /// <param name="attackLow">攻击下限评估</param> /// <param name="attackUp">攻击上限评估</param> /// <param name="criticalHit">致命一击概率</param> /// <param name="defence">防御评估</param> public void EquipFilter(bool isAttacker, SkillBox skill, ref double attackLow, ref double attackUp, ref double criticalHit, ref double criticalPower, ref double defence) { int skillType = skill.Type; foreach (var trigger in this.AllTriggers) { switch (trigger.Name) { case "defence": if (!isAttacker) { defence += double.Parse(trigger.Argvs[0]); criticalHit -= double.Parse(trigger.Argvs[1]) / 100; if (criticalHit < 0) { criticalHit = 0; } } break; case "attack": if (isAttacker) { if (this.Type == (int)ItemType.Weapon) { if (this.HasTalent("拳系装备") && skillType != CommonSettings.SKILLTYPE_QUAN) { break; } if (this.HasTalent("剑系装备") && skillType != CommonSettings.SKILLTYPE_JIAN) { break; } if (this.HasTalent("刀系装备") && skillType != CommonSettings.SKILLTYPE_DAO) { break; } if (this.HasTalent("奇门装备") && skillType != CommonSettings.SKILLTYPE_QIMEN) { break; } } attackLow += double.Parse(trigger.Argvs[0]) / 2; attackUp += double.Parse(trigger.Argvs[0]); criticalHit += double.Parse(trigger.Argvs[1]) / 100; } break; case "powerup_skill": if (isAttacker) { if (skill.Name.Contains(trigger.Argvs[0])) { double rate = (1 + (int.Parse(trigger.Argvs[1])) / 100.0); attackLow *= rate; attackUp *= rate; } } break; case "powerup_quanzhang": if (isAttacker) { if (skill.Type == CommonSettings.SKILLTYPE_QUAN) { double rate = (1 + (int.Parse(trigger.Argvs[0])) / 100.0); attackLow *= rate; attackUp *= rate; } } break; case "powerup_jianfa": if (isAttacker) { if (skill.Type == CommonSettings.SKILLTYPE_JIAN) { double rate = (1 + (int.Parse(trigger.Argvs[0])) / 100.0); attackLow *= rate; attackUp *= rate; } } break; case "powerup_daofa": if (isAttacker) { if (skill.Type == CommonSettings.SKILLTYPE_DAO) { double rate = (1 + (int.Parse(trigger.Argvs[0])) / 100.0); attackLow *= rate; attackUp *= rate; } } break; case "powerup_qimen": if (isAttacker) { if (skill.Type == CommonSettings.SKILLTYPE_QIMEN) { double rate = (1 + (int.Parse(trigger.Argvs[0])) / 100.0); attackLow *= rate; attackUp *= rate; } } break; case "critical": if (isAttacker) { criticalPower += int.Parse(trigger.Argvs[0]) / 100.0; } break; default: break; } } }