Last active
October 21, 2016 00:17
-
-
Save BaldarSilveraxe/4f42ddb265813cced97440d8805dd6e5 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, _, log, createObj, findObjs */ | |
/*jslint white: true, multivar: true, single: true, bitwise: true, browser: true */ | |
var RotatingMadness = RotatingMadness || (function(){ | |
"use strict"; | |
var script = {name: "RotatingMadness", version: 1.0, last_update: 1476924569, schema_version: 1.0}, | |
your_library = [ | |
{imgsrc: "https://s3.amazonaws.com/files.d20.io/images/24366259/sCxV-8v6FO9x9khDM-XPDQ/thumb.png?1476919656", tileName: "mapmaze"}, | |
{imgsrc: "https://s3.amazonaws.com/files.d20.io/images/24366260/OgnC_UlRwWEBaRA1AoFV1w/thumb.png?1476919660", tileName: "spinner"} | |
], | |
tile_settings = [ | |
{tileName: "mapmaze", width: 840, height: 840}, | |
{tileName: "spinner", width: 560, height: 560} | |
], | |
path_data = [ | |
{tileName: "spinner", path: [[208, 70], [210, 78], [210, 482], [209, 482]]}, | |
{tileName: "spinner", path: [[350, 78], [350, 482]]}, | |
{tileName: "mapmaze", path: [[350, 0], [350, 225], [330, 230], [100, 0]]}, | |
{tileName: "mapmaze", path: [[490, 0], [490, 225], [510, 230], [740, 0]]}, | |
{tileName: "mapmaze", path: [[350, 840], [350, 615], [330, 610], [100, 840]]}, | |
{tileName: "mapmaze", path: [[490, 840], [490, 615], [510, 610], [740, 840]]}, | |
{tileName: "mapmaze", path: [[0, 100], [230, 330], [222, 350], [0, 350]]}, | |
{tileName: "mapmaze", path: [[0, 740], [230, 510], [222, 490], [0, 490]]}, | |
{tileName: "mapmaze", path: [[840, 350], [615, 350], [607, 330], [840, 100]]}, | |
{tileName: "mapmaze", path: [[840, 490], [615, 490], [607, 510], [840, 740]]} | |
], | |
tiles = [], | |
path_remove = function (obj) { | |
_.each(findObjs({ type: "path", controlledby: script.name + "|" + obj.id }), function (e) { | |
e.remove(); | |
}); | |
}, | |
pathingRotation = function (angle, point, width, height) { | |
var pointX = point[0], | |
pointY = point[1], | |
originX = (width / 2), | |
originY = (height / 2); | |
angle = angle * Math.PI / 180.0; | |
return [ | |
Math.cos(angle) * (pointX - originX) - Math.sin(angle) * (pointY - originY) + originX, | |
Math.sin(angle) * (pointX - originX) + Math.cos(angle) * (pointY - originY) + originY | |
]; | |
}, | |
pathingString = function (PathArray) { | |
var pathString; | |
_(PathArray.length).times(function(n){ | |
pathString = (n !== 0) ? pathString + ",[\"L\"," + PathArray[n][0] + "," + PathArray[n][1] + "]" | |
: "[[\"M\"," + PathArray[n][0] + "," + PathArray[n][1] + "]"; | |
}); | |
return pathString + "]"; | |
}, | |
placeRotatedFlipPaths = function(givenPathData) { | |
var inputPath, PathArray, maxX, minX, maxY, minY; | |
_.each(givenPathData, function(given) { | |
inputPath = []; | |
_.each(given.path, function(eachPoint) { | |
inputPath.push([ | |
given.fliph ? given.width - eachPoint[0] : eachPoint[0], | |
given.flipv ? given.height - eachPoint[1] : eachPoint[1] | |
]); | |
}); | |
PathArray = []; | |
maxX = 0; | |
minX = false; | |
maxY = 0; | |
minY = false; | |
_(inputPath.length).times(function(n){ | |
PathArray.push([inputPath[n][0], inputPath[n][1]]); | |
PathArray[n] = pathingRotation((given.rotation||0), PathArray[n],given.width,given.height); | |
maxX = ( PathArray[n][0] > maxX ) ? PathArray[n][0] : maxX; | |
minX = ( minX === false || (Number(PathArray[n][0]) < Number(minX)) ) ? PathArray[n][0] : minX; | |
maxY = ( PathArray[n][1] > maxY ) ? PathArray[n][1] : maxY; | |
minY = ( minY === false || (Number(PathArray[n][1]) < Number(minY)) ) ? PathArray[n][1] : minY; | |
}); | |
_(PathArray.length).times(function(n){ | |
PathArray[n][0] = PathArray[n][0] - minX; | |
PathArray[n][1] = PathArray[n][1] - minY; | |
}); | |
createObj("path",{ | |
pageid: given.pageid, | |
layer: "walls", | |
path: pathingString(PathArray), | |
left: (minX + ((maxX - minX)/2)) + (given.left - (given.width/2)||0), | |
top: (minY + ((maxY - minY)/2)) + (given.top - (given.height/2)||0), | |
width: (maxX - minX), | |
height: (maxY - minY), | |
stroke: given.stroke, | |
stroke_width: given.strokewidth, | |
controlledby: given.forID | |
}); | |
}); | |
}, | |
getCleanImgsrc = function (imgsrc) { | |
var parts = imgsrc.match(/(.*\/images\/.*)(thumb|med|original|max)(.*)\?.*$/); | |
if (parts) { | |
return parts[1] + "thumb" + parts[3]; | |
} | |
return; | |
}, | |
handle_tile = function (obj, tileName) { | |
var tile_info = _.findWhere(tile_settings, {tileName: tileName}), | |
pathData = []; | |
if (tile_info) { | |
obj.set({ | |
width: tile_info.width, | |
height: tile_info.height | |
}); | |
path_remove(obj); | |
_.each(_.where(path_data, {tileName: tileName}), function (eachPath) { | |
pathData.push({ | |
left: obj.get("left"), | |
top: obj.get("top"), | |
width: obj.get("width"), | |
height: obj.get("height"), | |
rotation: obj.get("rotation"), | |
fliph: obj.get("fliph"), | |
flipv: obj.get("flipv"), | |
pageid: obj.get("pageid"), | |
path: eachPath.path, | |
stroke: "#FF0000", | |
strokewidth: 1, | |
forID: script.name + "|" + obj.id | |
}); | |
}); | |
if (pathData) { | |
placeRotatedFlipPaths(pathData); | |
} | |
} | |
}, | |
doorSpinner = function(obj,start,end,plusMinus,name) { | |
(function(){ | |
var angle = start, | |
delta = plusMinus, | |
threshold = end, | |
rate = 100, | |
pathData = [], | |
interval = setInterval(function(){ | |
obj.set('rotation', angle); | |
path_remove(obj); | |
handle_tile(obj, name); | |
angle += delta; | |
if(angle >= threshold) { | |
clearInterval(interval); | |
obj.set({rotation: end, light_angle: end}); | |
handle_tile(obj, name); | |
} | |
}, rate); | |
}()); | |
}, | |
on_change_graphic = function (obj) { | |
var cleanUrl = getCleanImgsrc(obj.get("imgsrc")), | |
tile; | |
tile = _.findWhere(tiles, {imgsrc: cleanUrl}); | |
if (tile) { | |
handle_tile(obj, tile.tileName); | |
} | |
}, | |
on_destroy_graphic = function (obj) { | |
path_remove(obj); | |
}, | |
on_chat_message = function (msg) { | |
var message = _.clone(msg), | |
graphic, | |
tile; | |
if (message.type !== "api" ) { | |
return; | |
} | |
graphic = getObj("graphic", "-KUUK1Ax40755hpc_U6j"); | |
tile = _.findWhere(tiles, {imgsrc: getCleanImgsrc(graphic.get("imgsrc"))}); | |
if (tile) { | |
doorSpinner(graphic,graphic.get("rotation"),graphic.get("rotation") + 45,5, tile.tileName); | |
} | |
}, | |
register_event_handlers = function() { | |
on("change:graphic", on_change_graphic); | |
on("destroy:graphic", on_destroy_graphic); | |
on('chat:message', on_chat_message); | |
}, | |
ready_module = function () { | |
log(script.name + " " + (new Date(script.last_update * 1000)) + " version: " + script.version + " Schema version: " + script.schema_version, script); | |
_.each(your_library, function (u) { | |
tiles.push({ | |
imgsrc: getCleanImgsrc(u.imgsrc), | |
tileName: u.tileName | |
}); | |
}); | |
register_event_handlers(); | |
}; | |
return { | |
ready_module: ready_module | |
}; | |
}()); | |
on("ready",function(){ | |
"use strict"; | |
RotatingMadness.ready_module(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment