import { adjustPolygonPoints } from "../helpers.js"; export class DrawingHandler { static isDrawingVisible(drawing) { const currentElevation = CONFIG.Levels.currentToken?.losHeight const rangeBottom = drawing.document.flags.levels?.rangeBottom ?? -Infinity; if(currentElevation === undefined) return true; const isVisible = rangeBottom <= currentElevation; return isVisible; } static executeStairs(updates, token) { if ("x" in updates || "y" in updates) { let stairs = this.getStairs(); let tokenX = updates.x || token.x; let tokenY = updates.y || token.y; let newUpdates; let tokenElev = updates.elevation || token.elevation; let gridSize = canvas.scene.dimensions.size; let newTokenCenter = { x: tokenX + (gridSize * token.width) / 2, y: tokenY + (gridSize * token.height) / 2, }; let inStair; for (let stair of stairs) { if (stair.poly.contains(newTokenCenter.x, newTokenCenter.y)) { if (token.inStair == stair.drawing.id) { inStair = stair.drawing.id; } else { if (stair.drawingMode == 2) { if (tokenElev <= stair.range[1] && tokenElev >= stair.range[0]) { if (tokenElev == stair.range[1]) { inStair = stair.drawing.id; newUpdates = { elevation: stair.range[0] }; } if (tokenElev == stair.range[0]) { inStair = stair.drawing.id; newUpdates = { elevation: stair.range[1] }; } } } else if (stair.drawingMode == 21) { if (tokenElev <= stair.range[1] && tokenElev >= stair.range[0]) { if (tokenElev == stair.range[1]) { inStair = stair.drawing.id; newUpdates = { elevation: stair.range[0] }; } } } else if (stair.drawingMode == 22) { if (tokenElev <= stair.range[1] && tokenElev >= stair.range[0]) { if (tokenElev == stair.range[0]) { inStair = stair.drawing.id; newUpdates = { elevation: stair.range[1] }; } } } else if (stair.drawingMode == 3) { if (tokenElev <= stair.range[1] && tokenElev >= stair.range[0]) { CONFIG.Levels.handlers.DrawingHandler.renderElevatorDalog( stair.drawing.document.getFlag( CONFIG.Levels.MODULE_ID, "elevatorFloors" ), token ); inStair = stair.drawing.id; } } } } else { inStair = inStair || false; } } token.inStair = inStair; if (!inStair) { $("#levels-elevator") .closest(".app") .find(`a[class="header-button close"]`) .click(); } if (newUpdates) { const s = canvas.dimensions.size; const oldToken = canvas.tokens.get(token.id); const updateX = updates.x || oldToken.x; const updateY = updates.y || oldToken.y; const dist = Math.sqrt( Math.pow(oldToken.x - updateX, 2) + Math.pow(oldToken.y - updateY, 2) ); const speed = s * 10; const duration = (dist * 1000) / speed; setTimeout(function () { token?.update(newUpdates); }, duration); } } } static getStairs() { let stairs = []; for (let drawing of canvas.drawings.placeables) { let { rangeBottom, rangeTop, drawingMode } = this.getFlagsForObject(drawing); let isLocked = drawing.document.getFlag( CONFIG.Levels.MODULE_ID, "stairLocked" ); if ( (drawingMode == 2 || drawingMode == 3 || drawingMode == 21 || drawingMode == 22) && rangeBottom != -Infinity && rangeTop != Infinity && !isLocked ) { let p = new PIXI.Polygon(adjustPolygonPoints(drawing)); stairs.push({ drawing: drawing, poly: p, range: [rangeBottom, rangeTop + 1], drawingMode: drawingMode, }); } } return stairs; } static async renderElevatorDalog(levelsFlag) { let elevatorFloors = []; levelsFlag.split("|").forEach((f) => { elevatorFloors.push(f.split(",")); }); let content = `
`; elevatorFloors.forEach((f) => { content += `
`; }); content += `
`; let dialog = new Dialog({ title: game.i18n.localize("levels.dialog.elevator.title"), content: content, buttons: { close: { label: game.i18n.localize("levels.yesnodialog.no"), callback: () => {}, }, }, default: "close", close: () => {}, }); await dialog._render(true); let renderedFrom = $("body").find(`div[id="levels-elevator"]`); for (let btn of $(renderedFrom).find("button")) { $(btn).on("click", updateElev); } function updateElev(event) { let newElev = parseFloat(event.target.id); if (newElev || newElev == 0) canvas.tokens.controlled[0]?.document?.update({ elevation: newElev }); } } static getFlagsForObject(drawing) { return { rangeBottom: drawing.document.flags?.levels?.rangeBottom ?? -Infinity, rangeTop: drawing.document.flags?.levels?.rangeTop ?? Infinity, drawingMode: drawing.document.flags?.levels?.drawingMode ?? 0, }; } }