LambdaHack-0.2.12: A roguelike game engine in early and active development

Safe HaskellNone

Game.LambdaHack.Common.Vector

Description

Basic operations on 2D vectors represented in an efficient, but not unique, way.

Synopsis

Documentation

data Vector Source

2D vectors in cartesian representation. Coordinates grow to the right and down, so that the (1, 1) vector points to the bottom-right corner of the screen.

Constructors

Vector 

Fields

vx :: !X
 
vy :: !Y
 

isUnit :: Vector -> BoolSource

Tells if a vector has length 1 in the chessboard metric.

isDiagonal :: Vector -> BoolSource

Checks whether a unit vector is a diagonal direction, as opposed to cardinal. If the vector is not unit, it checks that the vector is not horizontal nor vertical.

neg :: Vector -> VectorSource

Reverse an arbirary vector.

chessDistVector :: Vector -> IntSource

The lenght of a vector in the chessboard metric, where diagonal moves cost 1.

euclidDistSqVector :: Vector -> Vector -> IntSource

Squared euclidean distance between two vectors.

moves :: [Vector]Source

Vectors of all unit moves in the chessboard metric, clockwise, starting north-west.

vicinitySource

Arguments

:: X 
-> Y

limit the search to this area

-> Point

position to find neighbours of

-> [Point] 

All (8 at most) closest neighbours of a point within an area.

vicinityCardinalSource

Arguments

:: X 
-> Y

limit the search to this area

-> Point

position to find neighbours of

-> [Point] 

All (4 at most) cardinal direction neighbours of a point within an area.

shift :: Point -> Vector -> PointSource

Translate a point by a vector.

shiftBounded :: X -> Y -> Point -> Vector -> PointSource

Translate a point by a vector, but only if the result fits in an area.

trajectoryToPath :: Point -> [Vector] -> [Point]Source

A list of points that a list of vectors leads to.

displacement :: Point -> Point -> VectorSource

A vector from a point to another. We have

 shift pos1 (displacement pos1 pos2) == pos2

pathToTrajectory :: [Point] -> [Vector]Source

A list of vectors between a list of points.

rotate :: RadianAngle -> Vector -> VectorSource

Rotate a vector by the given angle (expressed in radians) counterclockwise and return a unit vector approximately in the resulting direction.

towards :: Point -> Point -> VectorSource

Given two distinct positions, determine the direction (a unit vector) in which one should move from the first in order to get closer to the second. Ignores obstacles. Of several equally good directions (in the chessboard metric) it picks one of those that visually (in the euclidean metric) maximally align with the vector between the two points.

fillBfsSource

Arguments

:: (Point -> Point -> MoveLegal)

is move from a known tile legal

-> (Point -> Point -> Bool)

is a move from unknown legal

-> Point

starting position

-> Array BfsDistance

initial array, with apartBfs

-> Array BfsDistance

array with calculated distances

findPathBfs :: (Point -> Point -> MoveLegal) -> (Point -> Point -> Bool) -> Point -> Point -> Int -> Array BfsDistance -> Maybe [Point]Source

Find a path, without the source position, with the smallest length. The eps coefficient determines which direction (or the closest directions available) that path should prefer, where 0 means north-west and 1 means north.