List<TrapEntity> getTrap(SpecialAttackRangeType rangetype)
 {
     var ret = new List<TrapEntity>();
     switch (rangetype)
     {
         case SpecialAttackRangeType.AROUND:
             //ret = getAroundCharacters().Contains(PredationTarget);
             ret = Owner.getAroundTraps();
             break;
         case SpecialAttackRangeType.FLOOR:
             ret = GameController.DungeonInformation.Traps;
             break;
         case SpecialAttackRangeType.LINE:
             //ret = isSameLine(CurrentPosition, PredationTarget.CurrentPosition);
             ret = GameController.DungeonInformation.getAllTrapOnLines(Owner.CurrentPosition);
             break;
         case SpecialAttackRangeType.ROOM:
             //ret = isSameRoom(PredationTarget);
             if (Owner.InRoom == null) return getTrap(SpecialAttackRangeType.AROUND);
             ret = GameController.DungeonInformation.getAllTrapsInRoom(Owner.InRoom);
             break; ;
     }
     ret.RemoveAll(trap => !trap.IsDetected);
     return ret;
 }
    List<ItemEntity> getItem(SpecialAttackRangeType rangetype)
    {
        var ret = new List<ItemEntity>();
        switch (rangetype)
        {
            case SpecialAttackRangeType.AROUND:
                //ret = getAroundCharacters().Contains(PredationTarget);
                ret = Owner.getAroundItems();
                break;
            case SpecialAttackRangeType.FLOOR:
                ret = GameController.DungeonInformation.Items;
                break;
            case SpecialAttackRangeType.LINE:
                //ret = isSameLine(CurrentPosition, PredationTarget.CurrentPosition);
                ret = GameController.DungeonInformation.getAllItemOnLines(Owner.CurrentPosition);
                break;
            case SpecialAttackRangeType.ROOM:
                //ret = isSameRoom(PredationTarget);
                if (Owner.InRoom == null) return getItem(SpecialAttackRangeType.AROUND);
                ret = GameController.DungeonInformation.getAllItemsInRoom(Owner.InRoom);
                break;
        }

        return ret;
    }
 List<MyCharacterController> getTarget(SpecialAttackRangeType rangetype, MyCharacterController target)
 {
     var ret = new List<MyCharacterController>();
     if (target == null) return ret;
     switch (rangetype)
     {
         case SpecialAttackRangeType.AROUND:
             //ret = getAroundCharacters().Contains(PredationTarget);
             ret = Owner.getAroundCharacters().FindAll(c => c.Equals(target));
             break;
         case SpecialAttackRangeType.FLOOR:
             ret.Add(target);
             break;
         case SpecialAttackRangeType.LINE:
             //ret = isSameLine(CurrentPosition, PredationTarget.CurrentPosition);
             if (MyCharacterController.isSameLine(Owner.CurrentPosition, target.CurrentPosition))
             {
                 var dir = MyCharacterController.getDirection(Owner.CurrentPosition, target.CurrentPosition);
                 var dirdelta = MyCharacterController.getDirectionDelta(dir);
                 var wallhit = Physics2D.Raycast(Owner.CurrentPosition, dirdelta, 1000, TagList.getLayerMask(TagList.Wall));
                 if (!wallhit)
                 {
                     ret.Add(target);
                     break;
                 }
                 Vector2 wallpos = wallhit.collider.gameObject.GetComponent<TileEntity>().Position;
                 float sub = (wallpos - Owner.CurrentPosition).sqrMagnitude - (target.CurrentPosition - Owner.CurrentPosition).sqrMagnitude;
                 if (sub >= 1)
                 {
                     ret.Add(target);
                 }
             }
             break;
         case SpecialAttackRangeType.ROOM:
             //ret = isSameRoom(PredationTarget);
             if (Owner.InRoom == null) return getTarget(SpecialAttackRangeType.AROUND, target);
             if (Owner.isSameRoom(target)) ret.Add(target);
             break;
     }
     return ret;
 }
 List<MyCharacterController> getEnemy(SpecialAttackRangeType rangetype)
 {
     var ret = new List<MyCharacterController>();
     switch (rangetype)
     {
         case SpecialAttackRangeType.AROUND:
             ret = Owner.getAroundCharacters().FindAll(c => c is EnemyController);
             break;
         case SpecialAttackRangeType.FLOOR:
             ret = GameController.DungeonInformation.Enemys;
             break;
         case SpecialAttackRangeType.LINE:
             //ret = isSameLine(CurrentPosition, PredationTarget.CurrentPosition);
             ret = GameController.DungeonInformation.getAllCharacterOnLines(Owner.CurrentPosition).FindAll(c => c is EnemyController);
             break;
         case SpecialAttackRangeType.ROOM:
             //ret = isSameRoom(PredationTarget);
             if (Owner.InRoom == null) return getEnemy(SpecialAttackRangeType.AROUND);
             ret = GameController.DungeonInformation.getAllCharactersInRoom(Owner.InRoom).FindAll(c => c is EnemyController);
             break; ;
     }
     return ret;
 }