Skip to content

Instantly share code, notes, and snippets.

@shdwjk
Created February 26, 2016 04:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shdwjk/5664dd6d34b412a3df52 to your computer and use it in GitHub Desktop.
Save shdwjk/5664dd6d34b412a3df52 to your computer and use it in GitHub Desktop.
AutoTeleport - The Aaron's Copy
/* ************ TELEPORTING SCRIPT **************************
* The intention of this script is to allow the DM to teleport
* one or all characters to a location based on a token placed
* on the DM layer of the map.
* To activate the script, type "!Teleport " and add the name
* of the teleport location (must not contrain spaces) and then
* the name of the party member to teleport there. They must be
* seperated by commas. If you want all to teleport, type all.
* ie. !Teleport teleport01, all - teleports all players to teleport01
*
* AUTOTELEPORTING: This feature allows you to place a token on
* One square (for example stairs) and it will auto move a token
* to the linked location and back again should you choose.
* Linked locations need to be tokens placed on the GMLayer.
* Naming conventions:
* Two way doors: XXXXXXXX2A, XXXXXXXXX2B
* Three way dooes: XXXXXXXX3A, XXXXXXXXX3B, XXXXXXXXX3C
* (in the case of one way doors, dont create a 3C)
* This system can handle up to 9 way doors (9I max).
****************************************************************/
var Teleporter = Teleporter || {};
Teleporter.AUTOTELEPORTER = true; //Set to true if you want teleports to be linked
Teleporter.Teleport = function (CharName, TargetName) {
"use strict";
var LocX = 0;
var LocY = 0;
//find the target location
var location = findObjs({
_pageid: Campaign().get("playerpageid"),
_type: "graphic",
layer: "gmlayer", //target location MUST be on GM layer
name: TargetName
});
if (location.length === 0) {
return; //exit if invalid target location
}
LocX = location[0].get("left");
LocY = location[0].get("top");
//if all are indicated, it lists all
//finds all tokens with the name
var targets = findObjs({
_pageid: Campaign().get("playerpageid"),
_type: "graphic"
});
//Move characters to target location
_.each(targets, function(obj) {
//Only player tokens
if (CharName === "all") {
if (obj.get("represents") !== "") {
log("Setting all");
obj.set("left", LocX + 1);
obj.set("top", LocY);
}
}
else {
if (obj.get("name").indexOf(CharName) !== -1) {
if (obj.get("represents") !== "") {
obj.set("left", LocX + 1);
obj.set("top", LocY);
}
}
}
});
};
on("chat:message", function(msg) {
"use strict";
var cmdName = "!Teleport ";
if (msg.type === "api" && msg.content.indexOf(cmdName) !== -1 && playerIsGM(msg.playerid)) {
var cleanedMsg = msg.content.replace(cmdName, "");
var commands = cleanedMsg.split(", ");
var targetName = commands[0];
var i = 1;
while ( i < commands.length ) {
Teleporter.Teleport(commands[i], targetName);
i = i + 1;
}
}
});
var findContains = function(obj,layer){
"use strict";
var cx = obj.get('left'),
cy = obj.get('top');
if(obj) {
layer = layer || 'gmlayer';
return _.chain(findObjs({
_pageid: obj.get('pageid'),
_type: "graphic",
layer: layer
}))
.reduce(function(m,o){
var l=o.get('left'),
t=o.get('top'),
w=o.get('width'),
h=o.get('height'),
ol=l-(w/2),
or=l+(w/2),
ot=t-(h/2),
ob=t+(h/2);
if( ol <= cx && cx <= or
&& ot <= cy && cy <= ob
){
m.push(o);
}
return m;
},[])
.value();
}
return [];
};
on("change:graphic", function(obj) {
"use strict";
if (obj.get("name").indexOf("Teleport") !== -1) {
return; //Do not teleport teleport pads!!
}
if (Teleporter.AUTOTELEPORTER === false) {
return; //Exit if auto Teleport is disabled
}
/* To use this system, you need to name two Teleportation locations the same
* with only an A and B distinction. For instance Teleport01A and Teleport01B
* will be linked together. When a token gets on one location, it will be
* Teleported to the other automatically */
//Finds the current teleportation location
var CurrName = "";
var location = findContains(obj,'gmlayer');
if (location.length === 0) {
return;
}
CurrName = location[0].get("name");
var Letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"];
//Number of doors in the cycle (second to last character)
var doorCount = CurrName.substr(CurrName.length - 2, 1);
//Current Letter of the Door
var currDoor = CurrName.substr(CurrName.length - 1, 1);
//Finds the pair location and moves target to that location
var i = 0;
if( CurrName.match(/^R:/) ) {
i = randomInteger(doorCount)-1;
} else {
i = Letters.indexOf(currDoor);
if (i === doorCount - 1) {
i = 0;
}
else {
i = i + 1;
}
}
var NewName = CurrName.substr(0,CurrName.length - 2) + doorCount + Letters[i];
var NewX = 0;
var NewY = 0;
var newLocation = findObjs({
_pageid: Campaign().get("playerpageid"),
_type: "graphic",
layer: "gmlayer", //target location MUST be on GM layer
name: NewName
});
_.each(newLocation, function(Loc){
//Get the new Location
NewX = Loc.get("left");
NewY = Loc.get("top");
});
if (NewX === 0 ) {
return;
}
obj.set("left", NewX);
obj.set("top", NewY);
});
on("chat:message", function(msg) {
"use strict";
if (msg.content.indexOf("!AUTOTELEPORTER") !== -1 && playerIsGM(msg.playerid)) {
if ( Teleporter.AUTOTELEPORTER === true) {
sendChat("System", "/w gm Autoteleporting Disabled.");
Teleporter.AUTOTELEPORTER = false;
}
else {
sendChat("System", "/w gm Autoteleporting Enabled.");
Teleporter.AUTOTELEPORTER = true;
}
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment