public void Act() { if (IsCasting) { return; } tmrCast += Game.ElapsedGameTime; if (tmrCast >= tmrCastInterval) { tmrCast = 0; canCast = true; MoveAround = false; tmrCastInterval = Globals.gen.Next(WaitAfterAttack.X, WaitAfterAttack.Y + 1); if (Globals.Mode == HardMode.Hard && charType.Index != 7 && charType.Index != 10) { tmrCast = tmrCastInterval; } } if (canCast) { Rectangle area = new Rectangle(CurRawPos.X - charType.Range * Globals.TileSize, CurRawPos.Y - charType.Range * Globals.TileSize, charType.Range * 2 * Globals.TileSize + charType.Size.X, charType.Range * 2 * Globals.TileSize + charType.Size.Y); List <Character> EnemiesInRange = GamePlay.GetEnemies(area, team); if (MoveAround) { EnemiesInRange.Clear(); } if (EnemiesInRange.Count > 0) { //Có kẻ dịch trong phạm vi BaseSkill SkillCanAct = GetCanActSkill(); if (SkillCanAct != null) { //Có skill xài được --> gọi hàm Cast() của skill if (canCast) { SkillCanAct.Cast(); canCast = false; } else if (Globals.Mode == HardMode.Easy) { MoveAround = true; Move(GetRandomDir()); } } else { //TH2: không có skill xài dc --> tiến đến kẻ địch. (dùng thuật toán A*) //Set target (kẻ địch) gần nhất SetTarget(EnemiesInRange); FindNewPathTimer += Game.ElapsedGameTime; if (FindNewPathTimer >= Globals.AI_FIND_NEW_PATH_INTERVAL) { FindNewPathTimer = 0; if (Globals.Mode == HardMode.Hard || Globals.Mode == HardMode.Normal) { AIPath = PathFinding.Find(CurPos, Target.CurPos, this); } } else { if (AIPath == null || AIPath.Count == 0) { AIPath = null; MoveTo(Target.CurRawPos); } else { while (AIPath.Count > 0 && HitBox.IntersectsWith(new Rectangle(AIPath[0].X * Globals.TileSize, AIPath[0].Y * Globals.TileSize, Globals.TileSize, Globals.TileSize))) { AIPath.RemoveAt(0); } if (AIPath.Count > 1) { MoveTo(new Point(AIPath[0].X * Globals.TileSize, AIPath[0].Y * Globals.TileSize)); } else { AIPath = null; MoveTo(Target.CurRawPos); } } } } } else { //Không có kẻ địch trong phạm vi AIPath = null; Move(GetRandomDir()); } } else { AIPath = null; Move(GetRandomDir()); } }