diff --git a/ddimport.js b/ddimport.js index 84da1f8..e411637 100644 --- a/ddimport.js +++ b/ddimport.js @@ -1,153 +1,184 @@ Hooks.on("getSceneDirectoryEntryContext", (html, list) => { - console.log(html, list); - list.push({ - name: "DungeonDraft Import", - icon: "", - callback: scene => { - DDImporter.Prompt(game.scenes.get(scene.attr("data-entity-id"))) - } - }) + console.log(html, list); + list.push({ + name: "DungeonDraft Import", + icon: "", + callback: scene => { + DDImporter.Prompt(game.scenes.get(scene.attr("data-entity-id"))) + } + }) }) class DDImporter { -static Prompt(scene) -{ + static Prompt(scene) + { if (canvas.scene._id != scene.data._id) - { - ui.notifications.error("Move to this scene to import"); - return - } + { + ui.notifications.error("Move to this scene to import"); + return + } let html = - `` + `` new Dialog({ - title: "Dungeon Draft Import", - content : html, - buttons : { - confirm : { - label: "Confirm", - callback : (html) => this.DDImport(scene, JSON.parse(html.find('[name="importData').val())) - }, - cancel : { - label: "Cancel" - } + title: "Dungeon Draft Import", + content : html, + buttons : { + confirm : { + label: "Confirm", + callback : (html) => this.DDImport(scene, JSON.parse(html.find('[name="importData').val())) }, - default: "confirm" + cancel : { + label: "Cancel" + } + }, + default: "confirm" }).render(true); -} + } -static async DDImport(scene, file) -{ + static async DDImport(scene, file) + { let level = 0; if (file.world.levels[1]) { - let levelOptions = ""; - for (let level in file.world.levels) - levelOptions = levelOptions.concat(``) - - let html = + let levelOptions = ""; + for (let level in file.world.levels) + levelOptions = levelOptions.concat(``) + + let html = `
Which level do you want to import?
` - - await new Dialog({ - title: "Dungeon Draft Level Selector", - content : html, - buttons : { - confirm : { - label: "Select", - callback : (html) => { - level = JSON.parse(html.find('[name="level-selector').val()) - scene.update({"walls" : this.GetWalls(file, level)}); - scene.update({"lights" : this.GetLights(file, level)}); - return; - } - }, - cancel : { - label: "Cancel", - callback : html => {return} - } - }, - default: "confirm" - }).render(true); + + await new Dialog({ + title: "Dungeon Draft Level Selector", + content : html, + buttons : { + confirm : { + label: "Select", + callback : (html) => { + level = JSON.parse(html.find('[name="level-selector').val()) + scene.update({"walls" : this.GetWalls(file, level)}); + scene.update({"lights" : this.GetLights(file, level)}); + return; + } + }, + cancel : { + label: "Cancel", + callback : html => {return} + } + }, + default: "confirm" + }).render(true); } else { - scene.update({"walls" : this.GetWalls(file, level)}); - scene.update({"lights" : this.GetLights(file, level)}); + scene.update({"walls" : this.GetWalls(file, level)}); + scene.update({"lights" : this.GetLights(file, level)}); } + } - - -} - -static GetWalls(file, level) -{ + static GetWalls(file, level) + { let walls = []; let ddPortalList = []; for (let index in file.world.levels[level].walls) { - if (!isNaN(index)) + if (!isNaN(index)) + { + let ddWalls = file.world.levels[level].walls[index] + let wallSet = [] + let ddPointString = ddWalls.points; + let points = ddPointString.substring(18, ddPointString.length-2).split(", ").map(a => Number(a)) + + let offsetX = canvas.dimensions.paddingX; + let offsetY = canvas.dimensions.paddingY; + let ddScale = canvas.grid.size/256 + + + if (ddWalls.portals) { - let ddWalls = file.world.levels[level].walls[index] - let wallSet = [] - let ddPointString = ddWalls.points; - let points = ddPointString.substring(18, ddPointString.length-2).split(", ").map(a => Number(a)) - let offsetX = canvas.dimensions.paddingX; - let offsetY = canvas.dimensions.paddingY; - let ddScale = canvas.grid.size/256 - - /* if (ddWalls.portals) - { - for(let i = 0; i < points.length-3; i+=2) - { - let point1 = [(points[i]*ddScale)+offsetX, (points[i+1]*ddScale)+offsetY] - let point2 = [(points[i+2]*ddScale)+offsetX, (points[i+3]*ddScale)+offsetY] - - let portal = ddWalls.portals[0]; - let portalPoints = this.findDoorPoints(portal); - if (this.pointIsOnLine([portalPoints[0], portalPoints[1]], point1.concat(point2))) - { - - } - else if (this.pointIsOnLine([portalPoints[2], portalPoints[3]], point1.concat(point2))) - { - - } - - let wall = new Wall({ - c : [(points[i]*ddScale)+offsetX, (points[i+1]*ddScale)+offsetY, (points[i+2]*ddScale)+offsetX, (points[i+3]*ddScale)+offsetY], - }); - wallSet.push(wall.data) - } - - if (wallSet.length % 2 != 0) - wallSet.push(new Wall({ - c: [wallSet[0].c[0], wallSet[0].c[1], wallSet[wallSet.length-1].c[2], wallSet[wallSet.length-1].c[3]] - }).data) - - walls = walls.concat(wallSet); - }*/ - for(let i = 0; i < points.length-3; i+=2) - { - - let wall = new Wall({ - c : [(points[i]*ddScale)+offsetX, (points[i+1]*ddScale)+offsetY, (points[i+2]*ddScale)+offsetX, (points[i+3]*ddScale)+offsetY], - }); - wallSet.push(wall.data) - } - - if (wallSet.length % 2 != 0) - wallSet.push(new Wall({ - c: [wallSet[0].c[0], wallSet[0].c[1], wallSet[wallSet.length-1].c[2], wallSet[wallSet.length-1].c[3]] - }).data) - - walls = walls.concat(wallSet); + for(let i = 0; i < points.length-3; i+=2) + { + for (let portal of ddWalls.portals){ + console.log(portal); + let portalCenterPoint = portal.position.substring(8, portal.position.length-2).split(", ").map(a => Number(a)) + let portalDirection = portal.direction.substring(8, portal.direction.length-2).split(", ").map(a => Number(a)) + let portalPoint1 = [portalCenterPoint[0] + portal.radius*portalDirection[0], portalCenterPoint[1] + portal.radius*portalDirection[1]] + let portalPoint2 = [portalCenterPoint[0] - portal.radius*portalDirection[0], portalCenterPoint[1] - portal.radius*portalDirection[1]] + console.log(portalCenterPoint) + console.log(portalPoint1) + console.log(portalPoint2) + let wall = new Wall({ + c : [point1[0], point1[1], point2[0], point2[1]], + }); + wall.data.door = CONST.WALL_DOOR_TYPES.DOOR + walls.push(wall.data) + let point1 = [(points[i]*ddScale)+offsetX, (points[i+1]*ddScale)+offsetY] + let point2 = [(points[i+2]*ddScale)+offsetX, (points[i+3]*ddScale)+offsetY] + let line = [point1,point2] + if (this.pointIsOnLine(portalCenterPoint,line)) + { + console.log('yes'); + console.log(this.getNearerPoint(point1, [portalPoint1, portalPoint2])); + console.log(this.getNearerPoint(point2, [portalPoint1, portalPoint2])); + topoint1 = this.getNearerPoint(point1, [portalPoint1, portalPoint2]); + topoint2 = this.getNearerPoint(point2, [portalPoint1, portalPoint2]); + let wall = new Wall({ + c : [ + point1[0], + point1[1], + topoint1[0], + topoint1[1], + }); + wallSet.push(wall.data) + let wall = new Wall({ + c : [ + point2[0], + point2[1], + topoint2[0], + topoint2[1], + }); + wallSet.push(wall.data) + } + else{ + let wall = new Wall({ + c : [ + (points[i]*ddScale)+offsetX, + (points[i+1]*ddScale)+offsetY, + (points[i+2]*ddScale)+offsetX, + (points[i+3]*ddScale)+offsetY], + }); + wallSet.push(wall.data) + } + } + } } + else + { + for(let i = 0; i < points.length-3; i+=2) + { + let wall = new Wall({ + c : [ + (points[i]*ddScale)+offsetX, + (points[i+1]*ddScale)+offsetY, + (points[i+2]*ddScale)+offsetX, + (points[i+3]*ddScale)+offsetY], + }); + wallSet.push(wall.data) + } + if (wallSet.length % 2 != 0) + wallSet.push(new Wall({ + c: [wallSet[0].c[0], wallSet[0].c[1], wallSet[wallSet.length-1].c[2], wallSet[wallSet.length-1].c[3]], + }).data) + } + + walls = walls.concat(wallSet); + } } @@ -170,18 +201,28 @@ static GetWalls(file, level) return walls -} + } -static pointIsOnLine(point, line) -{ - slope = (line[1] - line[3])/(line[0] - line[2]) - intercept = line[3] - slope * line[2] + static pointIsOnLine(point, line) + { + var slope = (line[0][1] - line[1][1])/(line[0][0] - line[1][0]) + var intercept = line[1][1] - slope * line[1][0] return (point[1] == (slope * point[0] + intercept)) -} + } -static findDoorPoints(ddPortal) -{ + static pointsDistance(point1, point2){ + return Math.sqrt(((point2[0] - point1[0])**2) + (point2[1] - point1[1])**2); + } + + static getNearerPoint(from, points){ + if (this.pointsDistance(from, points[0]) < this.pointsDistance(from, points[1])) + return points[0] + return points[1] + } + + static findDoorPoints(ddPortal) + { let ddPortalString = ddPortals.position; let offsetX = canvas.dimensions.paddingX; let offsetY = canvas.dimensions.paddingY; @@ -206,15 +247,15 @@ static findDoorPoints(ddPortal) point2[1]+=adjustY; return point1, point2 -} + } -static GetLights(file, level) -{ + static GetLights(file, level) + { let lights = []; for (let index in file.world.levels[level].lights) { - if (!isNaN(index)) - { + if (!isNaN(index)) + { let ddPointString = file.world.levels[level].lights[index].position let ddLight = file.world.levels[level].lights[index] let points = ddPointString.substring(9, ddPointString.length-2).split(", ").map(a => Number(a)) @@ -223,23 +264,23 @@ static GetLights(file, level) let ddScale = canvas.grid.size/256 let light = new AmbientLight({ - t: "l", - x: (points[0]*ddScale)+offsetX, - y: (points[1]*ddScale)+offsetY, - rotation: 0, - dim: ddLight.range*2, - bright: ddLight.range, - angle: 360, - tintColor: "#" + ddLight.color.substring(2), - tintAlpha: 0.05 + t: "l", + x: (points[0]*ddScale)+offsetX, + y: (points[1]*ddScale)+offsetY, + rotation: 0, + dim: ddLight.range*2, + bright: ddLight.range, + angle: 360, + tintColor: "#" + ddLight.color.substring(2), + tintAlpha: 0.05 }) lights.push(light.data); - } + } } return lights; -} + } } Hooks.on("ready", ev => { - canvas.stage.on('mousedown', (ev) => console.log(ev.data.destination.x - 768, ev.data.destination.y -768)); -}) \ No newline at end of file + canvas.stage.on('mousedown', (ev) => console.log(ev.data.destination.x - 768, ev.data.destination.y -768)); +}) diff --git a/module.json b/module.json index f5b9991..a2fa4a5 100644 --- a/module.json +++ b/module.json @@ -2,12 +2,19 @@ "name": "dd-import", "title": "DungeonDraft Importer", "description": "Imports scene elements from Dungeon Draft map files", - "version": 0.3, - "author": "Moo Man", + "version": "0.4.1", + "authors": [ + { + "name": "Moo Man" + }, + { + "name": "m42e" + } + ], "scripts": ["./ddimport.js"], "styles": ["./styles.css"], "packs": [], "minimumCoreVersion": "0.5.1", - "manifest": "https://raw.githubusercontent.com/moo-man/FVTT-DD-Import/master/module.json", - "download": "https://github.com/moo-man/FVTT-DD-Import/archive/master.zip" + "manifest": "https://raw.githubusercontent.com/m42e/FVTT-DD-Import/master/module.json", + "download": "https://github.com/m42e/FVTT-DD-Import/archive/master.zip" }