game-js/src/Game/World/NavigationGrid/NavigationGrid.js

142 lines
3.3 KiB
JavaScript

import { BC_TERRAIN_MANAGER, BC_TERRAIN_SETTINGS } from "../../GlobalVariables/GlobalVariables";
import { PointInt2D } from "../../Utils/Math.utils";
import { PathFinder } from "../../Utils/PathFinding.utils";
import { TerrainTile } from "../../WorldGenV2/Tiles/TerrainTile";
// import { getWorldChunkAt, worldCoordinatesToChunkLocalCoordinates } from "../../WorldGeneration/WorldGen";
// import { TerrainTile } from "../../WorldGeneration/WorldObjects/TerrainTile/TerrainTile";
export class NavigationGridTile
{
position = new PointInt2D();
movementCost = 0;
isObstacle = false;
/**
* @type {TerrainTile}
*/
optionalTerrainTileRef = null;
/**
*
* @param {PointInt2D} pos
* @param {Number} cost
* @param {Boolean} isObstacle
*/
constructor(pos, cost, isObstacle, ref = null)
{
this.position = pos;
this.movementCost = cost;
this.isObstacle = isObstacle;
this.optionalTerrainTileRef = ref;
}
}
/**
* @param {NavigationGridTile} tile
*/
function NavigationGridTileSettingsChangeFunctor(tile) {
}
export class NavigationGridChunk
{
/**
* @type {Map<String, NavigationGridTile>}
*/
_gridTiles = new Map();
/**
*
* @param {NavigationGridTile} element
* @param {String} id
*/
addToChunk(element, id)
{
this._gridTiles.set(id, element);
}
getFromChunkById(id)
{
return this._gridTiles.get(id);
}
getFromChunk(xWorld, yWorld)
{
let key = Math.floor(xWorld / BC_TERRAIN_SETTINGS.totalSize) * BC_TERRAIN_SETTINGS.totalSize + "_" + Math.floor(yWorld / BC_TERRAIN_SETTINGS.totalSize) * BC_TERRAIN_SETTINGS.totalSize;
return this._gridTiles.get(key);
}
/**
*
* @param {String} id
* @param {NavigationGridTileSettingsChangeFunctor} func
*/
changeNavigationGridTileSettings(id, func)
{
let t = this._gridTiles.get(id);
if(t)
{
func(t);
return true;
}
return false;
}
}
// export class NavigationGrid
// {
// /**
// *
// * @param {Number} xWorld
// * @param {Number} yWorld
// */
// static getNavigationGridTile(xWorld, yWorld)
// {
// let chunk = getWorldChunkAt(xWorld, yWorld);
// if(chunk)
// {
// return chunk.navigationGridChunk.getFromChunk(xWorld, yWorld);
// }
// return undefined;
// }
// }
/**
* @param {Number} xWorld
* @param {Number} yWorld
* @returns
*/
export function getNavigationGridTile(xWorld, yWorld)
{
let chunk = BC_TERRAIN_MANAGER.getChunkAt(new PointInt2D(xWorld, yWorld));
// console.log(chunk);
if(chunk)
{
return chunk.navigationChunk.getFromChunk(xWorld, yWorld);
}
return undefined;
}
function NavigationGridPathFinderCallback(result) {
}
async function _findPathAsync(start, goal)
{
let pf = new PathFinder();
return pf.search(start, goal);
}
/**
* @param {PointInt2D} start
* @param {PointInt2D} goal
*/
export async function findPathOnNavigationGridIfExists(start, goal) {
let r0 = await _findPathAsync(goal, start);
if(!r0.error){
// r0.result.path.reverse();
return r0;
}
let r1 = await _findPathAsync(start, goal);
return r1;
}