Last active
October 17, 2016 13:51
-
-
Save BaldarSilveraxe/28a1fb84569ee5a91b55ab41b2066872 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /*global _, on, createObj, getObj, log, state, findObjs, filterObjs, sendChat, playerIsGM */ | |
| /*jslint browser: true, multivar: true, bitwise: true, es6: true */ | |
| var Dynamic_Light_Helper = Dynamic_Light_Helper || (function () { | |
| "use strict"; | |
| // SETTINGS <=================================================== | |
| const CON = { | |
| SCRIPT: "Dynamic_Light_Helper", | |
| VERSION: 2.0, | |
| UPDATE: 1476712215, | |
| SCHEMA: 2.0, | |
| PATH_DFLT: { | |
| stroke_width: 3, | |
| stroke: "#FF0000" | |
| }, | |
| IMGSRC_CREATE: "https://s3.amazonaws.com/files.d20.io/images/24139904/KpzIsdelTUcuqcWtt6WNhg/thumb.png?1476399686",//Must be different from default | |
| CNTL_DFLT: { | |
| layer: "objects", | |
| imgsrc: "https://s3.amazonaws.com/files.d20.io/images/24139885/Rn1TpFeWyHufeaIwCxyHHw/thumb.png?1476399646",//Must be different from create | |
| width: 28, | |
| height: 28, | |
| isdrawing: true, | |
| showname: false, | |
| tint_color: "transparent", | |
| make_empty: ["bar1_max", "bar2_max", "bar3_max", "aura1_radius", "aura2_radius", "statusmarkers", "light_radius"] | |
| } | |
| }; | |
| // SETTINGS <=================================================== | |
| // GLOBAL <===================================================== | |
| var defaults, | |
| page_status = {}, | |
| id_index = {}, | |
| chat_template = _.template( | |
| "/w GM <div style=\"padding:1px 3px; border: 1px solid <%=border%>; background: <%=background%>; color: <%=color%>; font-size: 80%;\">" | |
| + "<img src=\"<%=src%>\" style=\"vertical-align: text-bottom; width:20px; height:20px; padding: 0px 5px;\"/><%=text%><br><br>" | |
| + "<a href=\"<%=command%>\" style=\"padding:0px 0px;border: 0px; border-collapse: collapse; color: <%=color%>; font-size: 100%; " | |
| + "background: <%=background%>;\"><span style=\"color: <%=color%>; font-size: 80%;\"><b><%=commandText%></b></span></a></div>" | |
| ), | |
| // GLOBAL <===================================================== | |
| // UTILITY <==================================================== | |
| simple_object = function (obj) { | |
| return JSON.parse(JSON.stringify(obj)); | |
| }, | |
| snap_distance = function (distance, unit) { | |
| return (~~((~~distance) / unit) * unit) + (unit / 2); | |
| }, | |
| create_point = function (props) { | |
| return createObj("graphic", _.defaults(props, defaults)); | |
| }, | |
| add_to_index = function (props) { | |
| _.each(props.path, function (e) { | |
| id_index[e] = { | |
| pageid: props.pageid, | |
| orignpathid: props.orignpathid | |
| }; | |
| }); | |
| }, | |
| create_dynamic_state = function (props) { | |
| if (!_.has(state[CON.SCRIPT].dynamic, props.pageid)) { | |
| state[CON.SCRIPT].dynamic[props.pageid] = {}; | |
| } | |
| state[CON.SCRIPT].dynamic[props.pageid][props.orignpathid] = props; | |
| add_to_index(props); | |
| }, | |
| create_path = function (props) { | |
| createObj("path", _.extend(props, {layer: "gmlayer"})); | |
| createObj("path", _.extend(props, {layer: "walls"})); | |
| }, | |
| remove_old_path = function (controlledby, removeall) { | |
| _.each(findObjs({type: "path", controlledby: controlledby}), function (e) { | |
| if (removeall) { | |
| e.remove(); | |
| } else { | |
| if ("gmlayer" === e.get("layer")) { | |
| e.remove(); | |
| } | |
| } | |
| }); | |
| }, | |
| remove_control = function (dynamic) { | |
| var node; | |
| _.each(dynamic.path, function (e) { | |
| node = getObj("graphic", e); | |
| if (node) { | |
| node.remove(); | |
| } | |
| }); | |
| remove_old_path(dynamic.pageid + "|" + dynamic.orignpathid, true); | |
| delete state[CON.SCRIPT].dynamic[dynamic.pageid][dynamic.orignpathid]; | |
| }, | |
| get_box_bound = function (path) { | |
| var minx = 0, miny = 0, maxx = 0, maxy = 0; | |
| _.each(path, function (e) { | |
| minx = Math.min(minx, e[1]); | |
| miny = Math.min(miny, e[2]); | |
| maxx = Math.max(maxx, e[1]); | |
| maxy = Math.max(maxy, e[2]); | |
| }); | |
| return {x1: minx, y1: miny, x2: maxx, y2: maxy, xc: (maxx / 2), yc: (maxy / 2), w: maxx, h: maxy}; | |
| }, | |
| // UTILITY <==================================================== | |
| // MENU <======================================================= | |
| help_menu = function () { | |
| sendChat(CON.SCRIPT, chat_template({ | |
| border: "#00529B", | |
| background: "#BDE5F8", | |
| color: "#00529B", | |
| src: "https://s3.amazonaws.com/files.d20.io/images/6422881/TSnHqUi-Y3TjRjqM1P_GsQ/thumb.png", | |
| text: "<b>Dynamic Light Helper</b><br><br>Set the page options as follows: \"Grid Type\" set to \"Square\" " | |
| + "and \"check\" \"show labels\" to enter \"edit mode\". <br><br>While on the \"objects\" layer, use the drawing " | |
| + "tools to draw your dyamic lighting lines. <br><br>The script will provide edit controls on the \"objects\" layer " | |
| + "and draw dynamic path lines on the \"walls\" layer along with visible aid lines on the \"gmlayer\" (the orignal paths " | |
| + "will be removed)<br><br>\"Unchecking\" the \"show labels\" exists edit mode (removing the controls and \"gmlayer\" paths.) " | |
| + "<br><br>You can toggle in and out of edit mode as often as you like.<br><br>You can also use the API command of \"!" | |
| + CON.SCRIPT + "\" to quickly toggle this status for any page.", | |
| command: "!" + CON.SCRIPT + " hidehelp", | |
| commandText: "Do not show this again." | |
| })); | |
| }, | |
| // MENU <======================================================= | |
| // POLY PATH <================================================== | |
| poly_path = (function () { | |
| var update = function (dynamic) { | |
| var node_a, node_b, minx, miny; | |
| remove_old_path(dynamic.pageid + "|" + dynamic.orignpathid, true); | |
| _.each(dynamic.path, function (e, i) { | |
| if (i < (dynamic.path.length - 1)) { | |
| node_a = getObj("graphic", e); | |
| node_b = getObj("graphic", dynamic.path[i + 1]); | |
| if (!node_a || !node_b) { | |
| remove_control(dynamic); | |
| return; | |
| } | |
| minx = Math.min(node_a.get("left"), node_b.get("left")); | |
| miny = Math.min(node_a.get("top"), node_b.get("top")); | |
| create_path({ | |
| pageid: node_a.get("pageid"), | |
| left: (node_a.get("left") + node_b.get("left")) / 2, | |
| top: (node_a.get("top") + node_b.get("top")) / 2, | |
| width: Math.abs(node_a.get("left") - node_b.get("left")), | |
| height: Math.abs(node_a.get("top") - node_b.get("top")), | |
| stroke_width: CON.PATH_DFLT.stroke_width, | |
| stroke: CON.PATH_DFLT.stroke, | |
| path: "[" | |
| + "[\"M\", " + (node_a.get("left") - minx) + ", " + (node_a.get("top") - miny) + "], " | |
| + "[\"L\", " + (node_b.get("left") - minx) + ", " + (node_b.get("top") - miny) + "]]", | |
| controlledby: dynamic.pageid + "|" + dynamic.orignpathid | |
| }); | |
| } | |
| }); | |
| }, | |
| unhide = function (dynamic) { | |
| var node, node_path = [], first; | |
| _.each(dynamic.path, function (e, i) { | |
| if ("closed" !== e) { | |
| node = create_point({ | |
| pageid: dynamic.pageid, | |
| imgsrc: CON.IMGSRC_CREATE, | |
| left: snap_distance(e[0], 14), | |
| top: snap_distance(e[1], 14) | |
| }).id; | |
| if (0 === i) { | |
| first = node; | |
| } | |
| node_path.push(node); | |
| } else { | |
| node_path.push(first); | |
| } | |
| }); | |
| create_dynamic_state({type: "poly", pageid: dynamic.pageid, orignpathid: dynamic.orignpathid, path: node_path}); | |
| update(state[CON.SCRIPT].dynamic[dynamic.pageid][dynamic.orignpathid]); | |
| }, | |
| hide = function (dynamic) { | |
| var node, closed = (dynamic.path[0] === dynamic.path[dynamic.path.length - 1]), newpath = []; | |
| _.each(dynamic.path, function (e, i) { | |
| if (!closed || (closed && i < (dynamic.path.length - 1))) { | |
| node = getObj("graphic", e); | |
| if (node) { | |
| delete id_index[node.id]; | |
| newpath.push([node.get("left"), node.get("top")]); | |
| node.remove(); | |
| } | |
| } else { | |
| newpath.push("closed"); | |
| } | |
| }); | |
| state[CON.SCRIPT].dynamic[dynamic.pageid][dynamic.orignpathid].path = newpath; | |
| remove_old_path(dynamic.pageid + "|" + dynamic.orignpathid, false); | |
| }, | |
| create = function (parsed_path) { | |
| var node = []; | |
| _.each(parsed_path.path_data, function (e, i) { | |
| if (!parsed_path.is_closed || (parsed_path.is_closed && i < (parsed_path.path_data.length - 1))) { | |
| node.push(create_point({ | |
| pageid: parsed_path.pageid, | |
| imgsrc: CON.IMGSRC_CREATE, | |
| left: snap_distance(parsed_path.left - (parsed_path.box_bound.w / 2) + e[1], 14), | |
| top: snap_distance(parsed_path.top - (parsed_path.box_bound.h / 2) + e[2], 14) | |
| }).id); | |
| } | |
| }); | |
| if (parsed_path.is_closed) { | |
| node.push(node[0]); | |
| } | |
| create_dynamic_state({type: "poly", pageid: parsed_path.pageid, orignpathid: parsed_path.orignpathid, path: node}); | |
| update(state[CON.SCRIPT].dynamic[parsed_path.pageid][parsed_path.orignpathid]); | |
| }; | |
| return { | |
| create: create, | |
| update: update, | |
| hide: hide, | |
| unhide: unhide | |
| }; | |
| }()), | |
| // POLY PATH <================================================== | |
| // FREE HAND <================================================== | |
| free_path = (function () { | |
| var create = function (parsed_path) { | |
| var snap_path = [], last_point = [], current_point; | |
| _.each(parsed_path.path_data, function (e, i) { | |
| current_point = ["F", snap_distance(e[1], 14), snap_distance(e[2], 14)]; | |
| if (0 === i) { | |
| snap_path.push(current_point); | |
| last_point = current_point; | |
| } else { | |
| if (((last_point[0] !== current_point[0]) || (last_point[1] !== current_point[1])) && (Math.abs(i % 3) === 1)) { | |
| snap_path.push(current_point); | |
| last_point = current_point; | |
| } | |
| } | |
| }); | |
| poly_path.create({ | |
| type: "poly", | |
| is_closed: false, | |
| path_data: snap_path, | |
| box_bound: parsed_path.box_bound, | |
| orignpathid: parsed_path.orignpathid, | |
| pageid: parsed_path.pageid, | |
| left: parsed_path.left, | |
| top: parsed_path.top, | |
| orign_path: parsed_path.orign_path | |
| }); | |
| }; | |
| return { | |
| create: create | |
| }; | |
| }()), | |
| // FREE HAND <================================================== | |
| // BOX PATH <=================================================== | |
| box_path = (function () { | |
| var get_nodes = function (dynamic) { | |
| var node1 = getObj("graphic", dynamic.path[0]), | |
| node2 = getObj("graphic", dynamic.path[1]); | |
| if (!node1 || !node2) { | |
| remove_control(dynamic); | |
| return; | |
| } | |
| return {one: node1, two: node2}; | |
| }, | |
| update = function (dynamic) { | |
| var node = get_nodes(dynamic); | |
| remove_old_path(dynamic.pageid + "|" + dynamic.orignpathid, true); | |
| create_path({ | |
| pageid: node.one.get("pageid"), | |
| left: (node.one.get("left") + node.two.get("left")) / 2, | |
| top: (node.one.get("top") + node.two.get("top")) / 2, | |
| width: Math.abs(node.one.get("left") - node.two.get("left")), | |
| height: Math.abs(node.one.get("top") - node.two.get("top")), | |
| stroke_width: CON.PATH_DFLT.stroke_width, | |
| stroke: CON.PATH_DFLT.stroke, | |
| path: "[" | |
| + "[\"M\", 0, 0], " | |
| + "[\"L\", " + Math.abs(node.one.get("left") - node.two.get("left")) + ", 0], " | |
| + "[\"L\", " + Math.abs(node.one.get("left") - node.two.get("left")) + ", " | |
| + Math.abs(node.one.get("top") - node.two.get("top")) + "], " | |
| + "[\"L\", 0, " + Math.abs(node.one.get("top") - node.two.get("top")) + "], " | |
| + "[\"L\", 0, 0]" | |
| + "]", | |
| controlledby: dynamic.pageid + "|" + dynamic.orignpathid | |
| }); | |
| }, | |
| create_nodes = function (props) { | |
| var node1 = create_point({pageid: props.pageid, imgsrc: CON.IMGSRC_CREATE, left: props.aLeft, top: props.aTop}), | |
| node2 = create_point({pageid: props.pageid, imgsrc: CON.IMGSRC_CREATE, left: props.bLeft, top: props.bTop}); | |
| create_dynamic_state({type: "box", pageid: props.pageid, orignpathid: props.orignpathid, path: [node1.id, node2.id]}); | |
| update(state[CON.SCRIPT].dynamic[props.pageid][props.orignpathid]); | |
| }, | |
| unhide = function (dynamic) { | |
| create_nodes({ | |
| pageid: dynamic.pageid, | |
| aLeft: snap_distance(dynamic.path[0][0], 14), | |
| aTop: snap_distance(dynamic.path[0][1], 14), | |
| bLeft: snap_distance(dynamic.path[1][0], 14), | |
| bTop: snap_distance(dynamic.path[1][1], 14), | |
| orignpathid: dynamic.orignpathid | |
| }); | |
| }, | |
| hide = function (dynamic) { | |
| var node = get_nodes(dynamic); | |
| delete id_index[node.one.id]; | |
| delete id_index[node.two.id]; | |
| state[CON.SCRIPT].dynamic[dynamic.pageid][dynamic.orignpathid].path = [ | |
| [node.one.get("left"), node.one.get("top")], | |
| [node.two.get("left"), node.two.get("top")] | |
| ]; | |
| remove_old_path(dynamic.pageid + "|" + dynamic.orignpathid, false); | |
| node.one.remove(); | |
| node.two.remove(); | |
| }, | |
| create = function (parsed_path) { | |
| create_nodes({ | |
| pageid: parsed_path.pageid, | |
| aLeft: snap_distance(parsed_path.left - (parsed_path.box_bound.w / 2), 14), | |
| aTop: snap_distance(parsed_path.top - (parsed_path.box_bound.h / 2), 14), | |
| bLeft: snap_distance(parsed_path.left + (parsed_path.box_bound.w / 2), 14), | |
| bTop: snap_distance(parsed_path.top + (parsed_path.box_bound.h / 2), 14), | |
| orignpathid: parsed_path.orignpathid | |
| }); | |
| }; | |
| return { | |
| create: create, | |
| update: update, | |
| hide: hide, | |
| unhide: unhide | |
| }; | |
| }()), | |
| // BOX PATH <=================================================== | |
| // CIRCLE <=============================+++===================== | |
| circle_path = (function () { | |
| var get_nodes = function (dynamic) { | |
| var node1 = getObj("graphic", dynamic.path[0]), | |
| node2 = getObj("graphic", dynamic.path[1]); | |
| if (!node1 || !node2) { | |
| remove_control(dynamic); | |
| return; | |
| } | |
| return {one: node1, two: node2}; | |
| }, | |
| update = function (dynamic) { | |
| var node = get_nodes(dynamic), | |
| theta = 0, | |
| xc = node.one.get("left"), | |
| yc = node.two.get("top"), | |
| w = Math.abs(node.one.get("left") - node.two.get("left")) * 2, | |
| h = Math.abs(node.one.get("top") - node.two.get("top")) * 2, | |
| step = 5, | |
| path = "[[\"M\","; | |
| while (theta < 360 + step) { | |
| path = path + ((w / 2) * Math.cos(theta * (Math.PI / 180)) + (w / 2)) + ","; | |
| path = path + ((h / 2) * Math.sin(theta * (Math.PI / 180)) + (h / 2)) + "]"; | |
| theta = theta + step; | |
| if (theta < 360 + step) { | |
| path = path + ",[\"L\","; | |
| } | |
| theta = theta + step; | |
| } | |
| path = path + "]"; | |
| remove_old_path(dynamic.pageid + "|" + dynamic.orignpathid, true); | |
| create_path({ | |
| pageid: node.one.get("pageid"), | |
| left: xc, | |
| top: yc, | |
| width: w, | |
| height: h, | |
| stroke_width: CON.PATH_DFLT.stroke_width, | |
| stroke: CON.PATH_DFLT.stroke, | |
| path: path, | |
| controlledby: dynamic.pageid + "|" + dynamic.orignpathid | |
| }); | |
| }, | |
| create_nodes = function (props) { | |
| var node1 = create_point({pageid: props.pageid, imgsrc: CON.IMGSRC_CREATE, left: props.aLeft, top: props.aTop}), | |
| node2 = create_point({pageid: props.pageid, imgsrc: CON.IMGSRC_CREATE, left: props.bLeft, top: props.bTop}); | |
| create_dynamic_state({type: "circle", pageid: props.pageid, orignpathid: props.orignpathid, path: [node1.id, node2.id]}); | |
| update(state[CON.SCRIPT].dynamic[props.pageid][props.orignpathid]); | |
| }, | |
| unhide = function (dynamic) { | |
| create_nodes({ | |
| pageid: dynamic.pageid, | |
| aLeft: snap_distance(dynamic.path[0][0], 14), | |
| aTop: snap_distance(dynamic.path[0][1], 14), | |
| bLeft: snap_distance(dynamic.path[1][0], 14), | |
| bTop: snap_distance(dynamic.path[1][1], 14), | |
| orignpathid: dynamic.orignpathid | |
| }); | |
| }, | |
| hide = function (dynamic) { | |
| var node = get_nodes(dynamic); | |
| delete id_index[node.one.id]; | |
| delete id_index[node.two.id]; | |
| state[CON.SCRIPT].dynamic[dynamic.pageid][dynamic.orignpathid].path = [ | |
| [node.one.get("left"), node.one.get("top")], | |
| [node.two.get("left"), node.two.get("top")] | |
| ]; | |
| remove_old_path(dynamic.pageid + "|" + dynamic.orignpathid, false); | |
| node.one.remove(); | |
| node.two.remove(); | |
| }, | |
| create = function (parsed_path) { | |
| create_nodes({ | |
| pageid: parsed_path.pageid, | |
| aLeft: snap_distance(parsed_path.left, 14), | |
| aTop: snap_distance(parsed_path.top - (parsed_path.box_bound.h / 2), 14), | |
| bLeft: snap_distance(parsed_path.left + (parsed_path.box_bound.w / 2), 14), | |
| bTop: snap_distance(parsed_path.top, 14), | |
| orignpathid: parsed_path.orignpathid | |
| }); | |
| }; | |
| return { | |
| create: create, | |
| update: update, | |
| hide: hide, | |
| unhide: unhide | |
| }; | |
| }()), | |
| // CIRCLE <=============================+++===================== | |
| // PATH PARSING <=============================================== | |
| parse_point = function (raw_point) { | |
| var point = []; | |
| _.each(raw_point.split(","), function (f, i) { | |
| point.push( | |
| (0 === i) | |
| ? f.replace(/^"(.*)"$/, "$1") | |
| : +f.replace(/^"(.*)"$/, "$1") | |
| ); | |
| }); | |
| return point; | |
| }, | |
| parse_path = function (path) { | |
| var path_data = [], parsed_path = {}; | |
| _.each(path.get("path").slice(2, -2).split("],["), function (e) { | |
| path_data.push(parse_point(e)); | |
| }); | |
| parsed_path = { | |
| type: (path_data[1][0] === "C") | |
| ? "circle" | |
| : (path_data[1][0] === "Q") | |
| ? "freehand" | |
| : ((path_data.length === 5) && (path_data[2][1] === path_data[1][1]) && (path_data[3][2] === path_data[2][2]) | |
| && ((path_data[0][1] + path_data[0][2] + path_data[1][2] + path_data[3][1] + path_data[4][1] + path_data[4][2]) === 0)) | |
| ? "box" | |
| : "poly", | |
| is_closed: ((path_data[0][1] === path_data[path_data.length - 1][1]) && (path_data[0][2] === path_data[path_data.length - 1][2])), | |
| path_data: path_data, | |
| box_bound: get_box_bound(path_data), | |
| orignpathid: path.id, | |
| pageid: path.get("pageid"), | |
| left: path.get("left"), | |
| top: path.get("top"), | |
| orign_path: simple_object(path) | |
| }; | |
| path.remove(); | |
| switch (parsed_path.type) { | |
| case "box": | |
| box_path.create(parsed_path); | |
| return; | |
| case "poly": | |
| poly_path.create(parsed_path); | |
| return; | |
| case "freehand": | |
| free_path.create(parsed_path); | |
| return; | |
| case "circle": | |
| circle_path.create(parsed_path); | |
| return; | |
| } | |
| }, | |
| update_graphic = function (graphic) { | |
| var dynamic_object; | |
| dynamic_object = state[CON.SCRIPT].dynamic[id_index[graphic.id].pageid][id_index[graphic.id].orignpathid]; | |
| switch (dynamic_object.type) { | |
| case "box": | |
| box_path.update(dynamic_object); | |
| return; | |
| case "poly": | |
| poly_path.update(dynamic_object); | |
| return; | |
| case "circle": | |
| circle_path.update(dynamic_object); | |
| return; | |
| } | |
| }, | |
| // PATH PARSING <=============================================== | |
| // EVENT ACTIONS <=========================================+++++ | |
| page_status_change = function (pageid) { | |
| _.each(state[CON.SCRIPT].dynamic[pageid], function (e) { | |
| switch (e.type) { | |
| case "box": | |
| if (page_status[pageid]) { | |
| box_path.unhide(e); | |
| } else { | |
| box_path.hide(e); | |
| } | |
| return; | |
| case "poly": | |
| if (page_status[pageid]) { | |
| poly_path.unhide(e); | |
| } else { | |
| poly_path.hide(e); | |
| } | |
| return; | |
| case "circle": | |
| if (page_status[pageid]) { | |
| circle_path.unhide(e); | |
| } else { | |
| circle_path.hide(e); | |
| } | |
| return; | |
| } | |
| }); | |
| }, | |
| destroy_control = function (graphic) { | |
| var dynamic_object; | |
| dynamic_object = state[CON.SCRIPT].dynamic[id_index[graphic.id].pageid][id_index[graphic.id].orignpathid]; | |
| switch (dynamic_object.type) { | |
| case "box": | |
| remove_control(dynamic_object); | |
| return; | |
| case "poly": | |
| remove_control(dynamic_object); | |
| return; | |
| case "circle": | |
| remove_control(dynamic_object); | |
| return; | |
| } | |
| }, | |
| change_control = function (graphic) { | |
| graphic.set(_.defaults({ | |
| left: snap_distance(graphic.get("left"), 14), | |
| top: snap_distance(graphic.get("top"), 14), | |
| rotation: 0 | |
| }, defaults)); | |
| update_graphic(graphic); | |
| }, | |
| // EVENT ACTIONS <=========================================+++++ | |
| // EVENTS <===================================================== | |
| event_destroy_graphic = function (graphic) { | |
| if (!_.has(id_index, graphic.id) || !_.has(state[CON.SCRIPT].dynamic, id_index[graphic.id].pageid)) { | |
| return; | |
| } | |
| destroy_control(graphic); | |
| }, | |
| event_change_graphic = function (graphic) { | |
| if (CON.IMGSRC_CREATE === graphic.get("imgsrc")) { | |
| graphic.set("imgsrc", CON.CNTL_DFLT.imgsrc); | |
| return; | |
| } | |
| if (!_.has(id_index, graphic.id) || !_.has(state[CON.SCRIPT].dynamic, id_index[graphic.id].pageid)) { | |
| return; | |
| } | |
| change_control(graphic); | |
| }, | |
| event_add_path = function (path) { | |
| if ((page_status[path.get("pageid")] === true) && (path.get("layer") === "objects")) { | |
| parse_path(path); | |
| } | |
| }, | |
| event_change_page_gridlabels = function (page) { | |
| page_status[page.id] = ((page.get("grid_type") === "square") && (page.get("gridlabels") === true)); | |
| page_status_change(page.id); | |
| }, | |
| event_chat_message = function (msg_orig) { | |
| var msg = _.clone(msg_orig), | |
| arg = msg.content.split(" "), | |
| player, | |
| page; | |
| if (msg.type !== "api" || !playerIsGM(msg.playerid) || arg[0] !== ("!" + CON.SCRIPT)) { | |
| return; | |
| } | |
| player = getObj("player", msg.playerid); | |
| if (player) { | |
| page = getObj("page", player.get("lastpage")); | |
| if (page) { | |
| switch (arg[1]) { | |
| case "hidehelp": | |
| state[CON.SCRIPT].options.help = false; | |
| sendChat(CON.SCRIPT, chat_template({ | |
| border: "#00529B", | |
| background: "#BDE5F8", | |
| color: "#00529B", | |
| src: "https://s3.amazonaws.com/files.d20.io/images/6422881/TSnHqUi-Y3TjRjqM1P_GsQ/thumb.png", | |
| text: "<b>Dynamic Light Helper</b><br><br>Help noticed turned off", | |
| command: "!" + CON.SCRIPT + " showhelp", | |
| commandText: "Restore help on startup." | |
| })); | |
| return; | |
| case "showhelp": | |
| state[CON.SCRIPT].options.help = true; | |
| help_menu(); | |
| return; | |
| } | |
| page.set({ | |
| grid_type: "square", | |
| gridlabels: !page.get("gridlabels") | |
| }); | |
| } | |
| event_change_page_gridlabels(page); | |
| } | |
| }, | |
| // EVENTS <===================================================== | |
| // READY <====================================================== | |
| ready_page_status = function () { | |
| _.each(findObjs({type: "page"}), function (page) { | |
| page_status[page.id] = ((page.get("grid_type") === "square") && (page.get("gridlabels") === true)); | |
| }); | |
| }, | |
| ready_defaults = function () { | |
| defaults = _.omit(CON.CNTL_DFLT, "make_empty"); | |
| _.each(CON.CNTL_DFLT.make_empty, function (make_empty) { | |
| defaults[make_empty] = ""; | |
| }); | |
| }, | |
| ready_state = function () { | |
| log("-=> " + CON.SCRIPT + " v" + CON.VERSION + " <=- [" + (new Date(CON.UPDATE * 1000)) + "]"); | |
| state[CON.SCRIPT] = (!_.has(state, CON.SCRIPT) || (state[CON.SCRIPT].version !== CON.SCHEMA)) | |
| ? {version: CON.SCHEMA, dynamic: {}, options: {}} | |
| : state[CON.SCRIPT]; | |
| _.each(_.difference(_.keys(state[CON.SCRIPT].dynamic), _.keys(_.indexBy(simple_object(findObjs({type: "page"})), "_id"))), function (e) { | |
| delete state[CON.SCRIPT].dynamic[e]; | |
| }); | |
| _.each(_.keys(state[CON.SCRIPT].dynamic), function (e) { | |
| _.each(_.keys(state[CON.SCRIPT].dynamic[e]), function (f) { | |
| _.each(state[CON.SCRIPT].dynamic[e][f].path, function (g) { | |
| if (_.isString(g)) { | |
| add_to_index(state[CON.SCRIPT].dynamic[e][f]); | |
| } | |
| }); | |
| }); | |
| }); | |
| if (!_.has(state[CON.SCRIPT].options, "installed")) { | |
| log(" > Updating Schema to v" + CON.SCHEMA + " <"); | |
| state[CON.SCRIPT].options.installed = true; | |
| state[CON.SCRIPT].options.help = true; | |
| } else { | |
| log(" > Refreshing stored values <"); | |
| } | |
| log("-=> '!" + CON.SCRIPT + " showhelp' <=-"); | |
| }, | |
| ready_script = function () { | |
| ready_state(); | |
| ready_defaults(); | |
| ready_page_status(); | |
| on("add:path", event_add_path); | |
| on("change:page:gridlabels", event_change_page_gridlabels); | |
| on("change:graphic", event_change_graphic); | |
| on("destroy:graphic", event_destroy_graphic); | |
| on("chat:message", event_chat_message); | |
| if (state[CON.SCRIPT].options.help) { | |
| help_menu(); | |
| } | |
| }; | |
| // READY <====================================================== | |
| return { | |
| ready_script: ready_script | |
| }; | |
| }()); | |
| on("ready", function () { | |
| "use strict"; | |
| Dynamic_Light_Helper.ready_script(); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment