예제 #1
0
        private List <RLBaseTile> LineHigh(Vector2Int fromPosition, Vector2Int toPosition, DungeonFloor floor)
        {
            List <RLBaseTile> line     = new List <RLBaseTile>();
            float             deltaX   = toPosition.x - fromPosition.x;
            float             deltaY   = toPosition.y - fromPosition.y;
            float             deltaErr = 0;

            if (deltaY != 0)
            {
                deltaErr = Mathf.Abs(deltaX / deltaY);
            }
            float error = 0;
            int   x     = fromPosition.x;
            int   i     = 0;

            for (int y = fromPosition.y; i < Mathf.Abs(deltaY); y += ((int)Mathf.Sign(deltaY)), i++)
            {
                RLBaseTile tile = floor.GetTileAt(x, y);
                if (tile == null)
                {
                    return(line);
                }
                line.Add(tile);
                error += deltaErr;
                while (error >= .5)
                {
                    x += ((int)Mathf.Sign(deltaX));
                    error--;
                }
            }

            return(line);
        }
예제 #2
0
 private void DoSkillEffect(int index, RLBaseActor user, RLBaseTile targetTile)
 {
     if (index < skillEffects.Length)
     {
         skillEffects[index].DoEffect(user, targetTile, () => { DoSkillEffect(index + 1, user, targetTile); });
     }
 }
예제 #3
0
 public virtual void TryBasicMoveToTile(RLBaseTile tile)
 {
     if (BasicMoveSkill != null && BasicMoveSkill.IsTargetValid(this, tile))
     {
         DoSkill(BasicMoveSkill, tile);
     }
 }
예제 #4
0
 public override List <RLBaseTile> FindPath(RLBaseTile fromTile,
                                            RLBaseTile to,
                                            DungeonFloor floor,
                                            CanMoveDelegate canMove,
                                            PathCostDelegate pathCost)
 {
     return(AStarPathfind(floor, fromTile, to, canMove, pathCost));
 }
예제 #5
0
 public override void SetTile(RLSimpleTile tile)
 {
     this._tile = tile;
     if (OnPositionChanged != null)
     {
         OnPositionChanged();
     }
     UpdateVision();
 }
예제 #6
0
        public List <RLBaseTile> GetOrthogonalNeighborTiles(RLBaseTile tile)
        {
            List <Vector2Int> neighborDirections = new List <Vector2Int>
            {
                Vector2Int.up, Vector2Int.right, Vector2Int.down, Vector2Int.left
            };

            return(GetNeighborTiles(tile, neighborDirections));
        }
예제 #7
0
        private void ShowEffects(string[] effects, RLBaseActor actor, RLBaseTile target, Action onComplete)
        {
            RLVisualEffect.VisualEffectParams effectParams = new RLVisualEffect.VisualEffectParams()
            {
                From            = actor.GetTile(),
                Targets         = new List <RLBaseTile>(new[] { target }),
                ActorController = this
            };

            effectRenderer.ShowEffects(effects, effectParams, onComplete);
        }
예제 #8
0
        private static List <RLBaseTile> ReconstructPath(RLBaseTile finish, IDictionary <RLBaseTile, RLBaseTile> cameFrom)
        {
            List <RLBaseTile> path = new List <RLBaseTile> {
                finish
            };

            while (cameFrom.ContainsKey(finish))
            {
                finish = cameFrom[finish];
                path.Add(finish);
            }
            return(path);
        }
예제 #9
0
        private List <RLBaseTile> GetNeighborTiles(RLBaseTile tile, List <Vector2Int> directions)
        {
            int x = tile.GetDisplayPosition().x;
            int y = tile.GetDisplayPosition().y;

            List <RLBaseTile> neighbors = new List <RLBaseTile>();

            foreach (Vector2Int direction in directions)
            {
                int nX = x + direction.x;
                int nY = y + direction.y;

                if (nX >= 0 && nX < Tiles.GetLength(0) && nY >= 0 && nY < Tiles.GetLength(1))
                {
                    neighbors.Add(Tiles[nX, nY]);
                }
            }

            return(neighbors);
        }
예제 #10
0
        public bool IsTargetValid(RLBaseActor skillUser, RLBaseTile targetTile)
        {
            if (!IsTargetInRange(skillUser, targetTile))
            {
                return(false);
            }
            switch (Target)
            {
            case TargetType.None:
                return(false);

            case TargetType.Any:
                return(true);

            case TargetType.EmptyTile:
                return(!targetTile.GetTileType().BlocksMovement&& targetTile.GetActor() == null);

            case TargetType.Self:
                return(true);

            case TargetType.AnyCreature:
                return(targetTile.GetActor() != null);

            case TargetType.Enemy:
                return(targetTile.GetActor() != null && skillUser.IsEnemyOf(targetTile.GetActor()));

            case TargetType.Ally:
                return(targetTile.GetActor() != null && skillUser.IsAllyOf(targetTile.GetActor()));

            case TargetType.Custom:
                return(IsCustomTargetValid(skillUser, targetTile));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
예제 #11
0
 public override void DoEffect(RLBaseActor actor, RLBaseTile target, Action onComplete)
 {
     actor.ShowEffects(vfx, target, onComplete);
 }
예제 #12
0
 public void DoSkill(RLBaseActor user, RLBaseTile targetTile)
 {
     DoSkillEffect(0, user, targetTile);
 }
예제 #13
0
 public virtual bool IsTargetInRange(RLBaseActor skillUser, RLBaseTile targetTile)
 {
     return(range <= 0 || Vector3.Distance(skillUser.GetTile().GetDisplayPosition(), targetTile.GetDisplayPosition()) <= range);
 }
예제 #14
0
 /**
  * If the skill needs custom targeting logic not covered by one of the enumerated cases in TargetType,
  * override this method to return true for valid targets.
  */
 protected virtual bool IsCustomTargetValid(RLBaseActor skillUser, RLBaseTile targetTile)
 {
     return(false);
 }
예제 #15
0
 protected bool CanSeeThrough(RLBaseTile tile)
 {
     return(!tile.GetTileType().BlocksVision);
 }
예제 #16
0
        private static List <RLBaseTile> AStarPathfind(DungeonFloor level, RLBaseTile start, RLBaseTile finish, CanMoveDelegate canMove, PathCostDelegate pathCost)
        {
            // A* Pathfinding
            Debug.Log("Connecting " + start.GetDisplayPosition() + " to " + finish.GetDisplayPosition() + " in " + level);
            List <RLBaseTile> closedSet = new List <RLBaseTile>();
            List <RLBaseTile> openSet   = new List <RLBaseTile>();

            openSet.Add(start);

            Dictionary <RLBaseTile, RLBaseTile> cameFrom = new Dictionary <RLBaseTile, RLBaseTile>();
            Dictionary <RLBaseTile, float>      gScore   = new Dictionary <RLBaseTile, float>();

            gScore[start] = 0;

            Dictionary <RLBaseTile, float> fScore = new Dictionary <RLBaseTile, float>();

            fScore[start] = Mathf.Abs(start.GetDisplayPosition().x - finish.GetDisplayPosition().x) + Mathf.Abs(start.GetDisplayPosition().y - finish.GetDisplayPosition().y);
            int length = 0;

            while (openSet.Count > 0)
            {
                length++;
                openSet.Sort((first, second) =>
                {
                    float firstScore;
                    float secondScore;
                    if (!fScore.TryGetValue(first, out firstScore))
                    {
                        firstScore = float.PositiveInfinity;
                    }
                    if (!fScore.TryGetValue(second, out secondScore))
                    {
                        secondScore = float.PositiveInfinity;
                    }
                    if (firstScore < secondScore)
                    {
                        return(-1);
                    }
                    else if (firstScore > secondScore)
                    {
                        return(1);
                    }
                    return(0);
                });
                RLBaseTile current = openSet[0];
                if (current == finish)
                {
                    // write and return path
                    List <RLBaseTile> hallTiles = ReconstructPath(current, cameFrom);
                    Debug.Log("Successful path from " + start.GetDisplayPosition() + " to " + finish.GetDisplayPosition());
                    return(hallTiles);
                }
                openSet.Remove(current);
                closedSet.Add(current);

                List <RLBaseTile> neighbors = level.GetOrthogonalNeighborTiles(current);
                neighbors.RemoveAll((tile) => closedSet.Contains(tile) || !canMove(current, tile));
                foreach (RLBaseTile neighbor in neighbors)
                {
                    if (!openSet.Contains(neighbor))
                    {
                        openSet.Add(neighbor);
                    }
                    float neighborGscore;
                    if (!gScore.TryGetValue(neighbor, out neighborGscore))
                    {
                        neighborGscore = float.PositiveInfinity;
                    }
                    // currently using 1 as dist_between
                    float tentativeGScore = gScore[current] + pathCost(current, neighbor);
                    if (tentativeGScore >= neighborGscore)
                    {
                        continue;
                    }
                    cameFrom[neighbor] = current;
                    gScore[neighbor]   = tentativeGScore;
                    fScore[neighbor]   = gScore[neighbor] + Mathf.Abs(neighbor.GetDisplayPosition().x - finish.GetDisplayPosition().x) + Mathf.Abs(neighbor.GetDisplayPosition().y - finish.GetDisplayPosition().y);
                }
            }
            Debug.Log("Connection failed.");
            return(new List <RLBaseTile>());
        }
예제 #17
0
 private void DisplayTile(RLBaseTile tile)
 {
     environmentTilemap.SetTile(tile.GetDisplayPosition(), tileset[tile.GetDisplayType()]);
     memoryFogTilemap.SetTile(tile.GetDisplayPosition(), tile.IsCurrentlyVisibleToPlayer() ? null : tileset.memoryFogTile);
     fogOfWarTilemap.SetTile(tile.GetDisplayPosition(), tile.HasEverBeenSeenByPlayer() ? null : tileset.fogOfWarTile);
 }
예제 #18
0
 public void BindTile(RLBaseTile tile)
 {
     tile.TileDisplayRefresh = DisplayTile;
 }
예제 #19
0
 public abstract void DoEffect(RLBaseActor actor, RLBaseTile target, Action onComplete);
예제 #20
0
 public void DoSkill(RLSkill skill, RLBaseTile target)
 {
     skill.DoSkill(this, target);
 }
예제 #21
0
 public override void DoEffect(RLBaseActor user, RLBaseTile target, Action onComplete)
 {
     target.SetActor(user);
     onComplete();
 }
예제 #22
0
 public abstract List <RLBaseTile> FindPath(RLBaseTile fromTile, RLBaseTile to, DungeonFloor floor, CanMoveDelegate canMove, PathCostDelegate pathCost);