All user data for FoundryVTT. Includes worlds, systems, modules, and any asset in the "foundryuserdata" directory. Does NOT include the FoundryVTT installation itself.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

74 lines
2.7 KiB

export class TileHandler{
static isTileVisible(tile){
const currentToken = CONFIG.Levels.currentToken;
CONFIG.Levels.FoWHandler.lazyCreateTileFogMask(tile);
if(!currentToken) return true;
const tokenElevation = currentToken.document.elevation;
const tokenLOS = currentToken.losHeight;
const bgElevation = canvas?.scene?.flags?.levels?.backgroundElevation ?? 0;
//Handle background tiles
if(!tile.document.overhead){
return tokenLOS >= bgElevation
}
if(!tile.document.flags.levels) return true;
const {rangeTop, rangeBottom, showIfAbove, showAboveRange, isBasement, noFogHide} = getFlags(tile.document)
//Not a levels tile, hide if token is under background
if(rangeTop === Infinity && rangeBottom === -Infinity || !tile.document.overhead) return tokenLOS >= bgElevation;
const inRange = tokenLOS < rangeTop && tokenLOS >= rangeBottom;
//If tile is basement and token is out of it's range, it's not visible
if(!inRange && isBasement) return false;
//Non roof tiles under the token that don't have the show if above will be hidden
if( tokenLOS < rangeBottom && !showIfAbove && rangeTop !== Infinity) return false;
//Tiles set as show above will be hidden if the token exceeds the range
if( tokenLOS < rangeBottom && showIfAbove && Math.abs(tokenElevation - rangeBottom) > showAboveRange) return false;
//If it's a roof or show if above is enabled and the bottom of the tile is higher than the bg, and the token is under the bg, hide the tile
if((showIfAbove || rangeTop === Infinity) && rangeBottom > bgElevation && tokenLOS < bgElevation) return false;
return true;
}
static _identifyOccludedTiles(tokens) {
const occluded = new Set();
const controlled = tokens.filter(t => t.controlled);
for ( const token of (controlled.length ? controlled : tokens) ) {
const tiles = canvas.tiles.quadtree.getObjects(token.bounds);
for ( const tile of tiles ) {
if ( occluded.has(tile) ) continue; // Don't bother re-testing a tile
if ( tile.testOcclusion(token, {corners: tile.isRoof}) ) occluded.add(tile);
}
}
return occluded;
}
}
function getFlags(document){
const flags = {}
for( const [k,v] of Object.entries(document.flags.levels)){
flags[k] = v ?? defaultValues[k];
}
return flags;
}
const defaultValues = {
rangeTop: Infinity,
rangeBottom: -Infinity,
showIfAbove: false,
showAboveRange: Infinity,
isBasement: false,
noFogHide: false,
excludeFromChecker: false
}