|
|
- 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 = `<div id="levels-elevator">`;
-
- elevatorFloors.forEach((f) => {
- content += `<div class="button">
- <button id="${f[0]}" class="elevator-level">${f[1]}</button>
- </div>`;
- });
- content += `<hr></div>`;
-
- 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,
- };
- }
- }
|