Class LineAOE
java.lang.Object
com.github.yellowstonegames.path.technique.LineAOE
- All Implemented Interfaces:
AOE
Line Area of Effect that affects an slightly expanded (DDA) line from a given origin Coord to a given end Coord,
plus an optional radius of cells around the path of the line, while respecting obstacles in its path and possibly
stopping if obstructed. You can specify the RadiusType to Radius.DIAMOND for Manhattan distance, RADIUS.SQUARE for
Chebyshev, or RADIUS.CIRCLE for Euclidean.
You may want the BeamAOE class instead of this. LineAOE travels point-to-point and does not restrict length, while BeamAOE travels a specific length (and may have a radius, like LineAOE) but then stops only after the travel down the length and radius has reached its end. This difference is relevant if a game has effects that have a definite area measured in a rectangle or elongated pillbox shape, such as a "20-foot-wide bolt of lightning, 100 feet long." BeamAOE is more suitable for that effect, while LineAOE may be more suitable for things like focused lasers that pass through small (likely fleshy) obstacles but stop after hitting the aimed-at target.
LineAOE will strike a small area behind the user and in the opposite direction of the target if the radius is greater than 0. This behavior may be altered in a future version.
This will produce floats for its
This class uses
You may want the BeamAOE class instead of this. LineAOE travels point-to-point and does not restrict length, while BeamAOE travels a specific length (and may have a radius, like LineAOE) but then stops only after the travel down the length and radius has reached its end. This difference is relevant if a game has effects that have a definite area measured in a rectangle or elongated pillbox shape, such as a "20-foot-wide bolt of lightning, 100 feet long." BeamAOE is more suitable for that effect, while LineAOE may be more suitable for things like focused lasers that pass through small (likely fleshy) obstacles but stop after hitting the aimed-at target.
LineAOE will strike a small area behind the user and in the opposite direction of the target if the radius is greater than 0. This behavior may be altered in a future version.
This will produce floats for its
findArea() method which are equal to 1.0.
This class uses
BresenhamLine and DijkstraMap to create its area of effect.-
Constructor Summary
ConstructorsConstructorDescriptionLineAOE(com.github.yellowstonegames.grid.Coord origin, com.github.yellowstonegames.grid.Coord end) LineAOE(com.github.yellowstonegames.grid.Coord origin, com.github.yellowstonegames.grid.Coord end, int radius) LineAOE(com.github.yellowstonegames.grid.Coord origin, com.github.yellowstonegames.grid.Coord end, int radius, com.github.yellowstonegames.grid.Radius radiusType) LineAOE(com.github.yellowstonegames.grid.Coord origin, com.github.yellowstonegames.grid.Coord end, int radius, com.github.yellowstonegames.grid.Radius radiusType, int minRange, int maxRange) -
Method Summary
Modifier and TypeMethodDescriptioncom.github.yellowstonegames.grid.CoordFloatOrderedMapfindArea()This is how an AOE interacts with anything that uses it.com.github.yellowstonegames.grid.CoordgetEnd()com.github.yellowstonegames.grid.CoordGet the position from which the AOE originates, which may be related to the location of the AOE's effect, as for lines, cones, and other emitted effects, or may be unrelated except for determining which enemies can be seen or targeted from a given origin point (as for distant effects that radiate from a chosen central point, but have a maxRange at which they can deliver that effect).intcom.github.yellowstonegames.grid.RadiusgetReach()Gets the same values returned by getLimitType(), getMinRange(), getMaxRange(), and getMetric() bundled into one Reach object.com.github.yellowstonegames.grid.CoordObjectOrderedMap<com.github.tommyettinger.ds.ObjectList<com.github.yellowstonegames.grid.Coord>> idealLocations(Collection<com.github.yellowstonegames.grid.Coord> targets, Collection<com.github.yellowstonegames.grid.Coord> requiredExclusions) Returns a OrderedMap of Coord keys and ArrayList of Coord values, where each Coord key is an ideal location to hit as many of the Points in targets as possible without hitting any Points in requiredExclusions, and each value is the collection of targets that will be hit if the associated key is used.com.github.yellowstonegames.grid.CoordObjectOrderedMap<com.github.tommyettinger.ds.ObjectList<com.github.yellowstonegames.grid.Coord>> idealLocations(Collection<com.github.yellowstonegames.grid.Coord> priorityTargets, Collection<com.github.yellowstonegames.grid.Coord> lesserTargets, Collection<com.github.yellowstonegames.grid.Coord> requiredExclusions) A variant of idealLocations that takes two groups of desirable targets, and will rate locations by how many priorityTargets are in the AOE, then by how many lesserTargets are in the AOE, and will only consider locations that do not affect a Coord in requiredExclusions.booleanmayContainTarget(Collection<com.github.yellowstonegames.grid.Coord> targets) Given a Set of Points that the producer of the AOE wants to include in the region of this AOE, this method does a quick approximation to see if there is any possibility that the AOE as currently configured might include one of those Points within itself.voidsetEnd(com.github.yellowstonegames.grid.Coord end) voidsetMap(float[][] map) This must be called before any other methods, and takes a float[][] with 1.0 or higher for walls, and anything lower for passable cells.voidsetOrigin(com.github.yellowstonegames.grid.Coord origin) Set the position from which the AOE originates, which may be related to the location of the AOE's effect, as for lines, cones, and other emitted effects, or may be unrelated except for determining which enemies can be seen or targeted from a given origin point (as for distant effects that radiate from a chosen central point, but have a maxRange at which they can deliver that effect).voidsetRadius(int radius) voidsetRadiusType(com.github.yellowstonegames.grid.Radius radiusType) voidSets the same values as setLimitType(), setMinRange(), setMaxRange(), and setMetric() using one Reach object.voidshift(com.github.yellowstonegames.grid.Coord aim) After an AOE has been constructed, it may need to have the affected area shifted over to a different position without changing any other properties of the AOE.Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface AOE
getLimitType, getMaxRange, getMetric, getMinRange, setLimitType, setMaxRange, setMetric, setMinRange
-
Constructor Details
-
LineAOE
public LineAOE(com.github.yellowstonegames.grid.Coord origin, com.github.yellowstonegames.grid.Coord end) -
LineAOE
public LineAOE(com.github.yellowstonegames.grid.Coord origin, com.github.yellowstonegames.grid.Coord end, int radius) -
LineAOE
public LineAOE(com.github.yellowstonegames.grid.Coord origin, com.github.yellowstonegames.grid.Coord end, int radius, com.github.yellowstonegames.grid.Radius radiusType) -
LineAOE
public LineAOE(com.github.yellowstonegames.grid.Coord origin, com.github.yellowstonegames.grid.Coord end, int radius, com.github.yellowstonegames.grid.Radius radiusType, int minRange, int maxRange)
-
-
Method Details
-
getOrigin
public com.github.yellowstonegames.grid.Coord getOrigin()Description copied from interface:AOEGet the position from which the AOE originates, which may be related to the location of the AOE's effect, as for lines, cones, and other emitted effects, or may be unrelated except for determining which enemies can be seen or targeted from a given origin point (as for distant effects that radiate from a chosen central point, but have a maxRange at which they can deliver that effect). In most cases, this is the position of a character producing the AOE in question. -
setOrigin
public void setOrigin(com.github.yellowstonegames.grid.Coord origin) Description copied from interface:AOESet the position from which the AOE originates, which may be related to the location of the AOE's effect, as for lines, cones, and other emitted effects, or may be unrelated except for determining which enemies can be seen or targeted from a given origin point (as for distant effects that radiate from a chosen central point, but have a maxRange at which they can deliver that effect). In most cases, this is the position of a character producing the AOE in question. -
getReach
-
setReach
-
getEnd
public com.github.yellowstonegames.grid.Coord getEnd() -
setEnd
public void setEnd(com.github.yellowstonegames.grid.Coord end) -
getRadius
public int getRadius() -
setRadius
public void setRadius(int radius) -
getRadiusType
public com.github.yellowstonegames.grid.Radius getRadiusType() -
setRadiusType
public void setRadiusType(com.github.yellowstonegames.grid.Radius radiusType) -
shift
public void shift(com.github.yellowstonegames.grid.Coord aim) Description copied from interface:AOEAfter an AOE has been constructed, it may need to have the affected area shifted over to a different position without changing any other properties of the AOE. Some AOE implementations may have an origin where the AOE starts emanating from, but the origin will not be affected by this method; instead the cell specified by target must be enough on its own to select a different target area without the producer of the AOE needing to move. -
mayContainTarget
Description copied from interface:AOEGiven a Set of Points that the producer of the AOE wants to include in the region of this AOE, this method does a quick approximation to see if there is any possibility that the AOE as currently configured might include one of those Points within itself. It does not do a full, detailed scan, nor does it count how many opponents might be included. It does not check the map to verify that there is any sort of path to a target. It is recommended that the Set of Points consist only of enemies that are within FOV, which cuts down a lot on the amount of checks this needs to make; if the game doesn't restrict the player's FOV, this is still recommended (just with a larger FOV radius) because it prevents checking enemies on the other side of the map and through multiple walls.- Specified by:
mayContainTargetin interfaceAOE- Parameters:
targets- a Collection (usually a Set) of Points that are desirable targets to include in this AOE- Returns:
- true if there could be at least one target within the AOE, false otherwise. Very approximate.
-
idealLocations
public com.github.yellowstonegames.grid.CoordObjectOrderedMap<com.github.tommyettinger.ds.ObjectList<com.github.yellowstonegames.grid.Coord>> idealLocations(Collection<com.github.yellowstonegames.grid.Coord> targets, Collection<com.github.yellowstonegames.grid.Coord> requiredExclusions) Description copied from interface:AOEReturns a OrderedMap of Coord keys and ArrayList of Coord values, where each Coord key is an ideal location to hit as many of the Points in targets as possible without hitting any Points in requiredExclusions, and each value is the collection of targets that will be hit if the associated key is used. The length of any ArrayList in the returned collection's values will be the number of targets likely to be affected by the AOE when shift() is called with the Coord key as an argument; all ArrayLists should have the same length. The second argument may be null, in which case this will initialize it to an empty Set of Coord and disregard it.
With complex maps and varied arrangements of obstacles and desirable targets, calculating the best points to evaluate for AI can be computationally difficult. This method provides a way to calculate with good accuracy the best Points to pass to shift(Coord) before calling findArea(). For "blackened thrash industrial death metal" levels of brutality for the AI, the results of this can be used verbatim, but for more reasonable AI levels, you can intentionally alter the best options to simulate imperfect aim or environmental variance on the AOE.
Beast-like creatures that do not need devious AI should probably not use this method at all and instead use shift(Coord) with the location of some enemy (probably the closest) as its argument.- Specified by:
idealLocationsin interfaceAOE- Parameters:
targets- a Set of Points that are desirable targets to include in this AOErequiredExclusions- a Set of Points that this tries strongly to avoid including in this AOE- Returns:
- a OrderedMap of Coord keys and ArrayList of Coord values where keys are ideal locations and values are the target points that will be hit when that key is used.
-
idealLocations
public com.github.yellowstonegames.grid.CoordObjectOrderedMap<com.github.tommyettinger.ds.ObjectList<com.github.yellowstonegames.grid.Coord>> idealLocations(Collection<com.github.yellowstonegames.grid.Coord> priorityTargets, Collection<com.github.yellowstonegames.grid.Coord> lesserTargets, Collection<com.github.yellowstonegames.grid.Coord> requiredExclusions) Description copied from interface:AOEA variant of idealLocations that takes two groups of desirable targets, and will rate locations by how many priorityTargets are in the AOE, then by how many lesserTargets are in the AOE, and will only consider locations that do not affect a Coord in requiredExclusions. Unlike the variant of idealLocations that only takes one group of targets, this variant can return a collection with ArrayList values where the same Coord appears four times in the same ArrayList; this is done only for priorityTargets that are affected by the target Coord at the associated key, and is done so that the length of each similar-quality ArrayList should be identical (since a priorityTarget is worth four times what a lesserTarget is worth in the calculation this uses).- Specified by:
idealLocationsin interfaceAOE- Parameters:
priorityTargets- A Set of Points that are the most-wanted targets to include in this AOElesserTargets- A Set of Points that are the less-wanted targets to include in this AOE, should not overlap with priorityTargetsrequiredExclusions- a Set of Points that this tries strongly to avoid including in this AOE- Returns:
- a OrderedMap of Coord keys and ArrayList of Coord values where keys are ideal locations and values are the target points that will be hit when that key is used.
-
setMap
public void setMap(float[][] map) Description copied from interface:AOEThis must be called before any other methods, and takes a float[][] with 1.0 or higher for walls, and anything lower for passable cells. This means the map is a resistance map, as used byFOVandBresenhamLine. -
findArea
public com.github.yellowstonegames.grid.CoordFloatOrderedMap findArea()Description copied from interface:AOEThis is how an AOE interacts with anything that uses it. It expects a map to have already been set with setMap, with '#' for walls, '.' for floors and potentially other chars that implementors can use if they are present in the map. The map must be bounded by walls, which DungeonProcessor does automatically and other generators can easily add withDungeonTools.wallWrap(dungeon);.
This returns a CoordFloatOrderedMap; if a cell is 100% affected by the AOE then the value should be 1.0; if it is 50% affected it should be 0.5, if unaffected should be 0.0, etc. The Coord keys should have the same x and y as the x,y map positions they correspond to.
-