From f1003b1852720be756dc8a89b4b354cd2cfc1d1e Mon Sep 17 00:00:00 2001
From: Matheus Clemente <matheus.xb@gmail.com>
Date: Thu, 9 Feb 2023 19:46:06 -0300
Subject: [PATCH] Lots of improvements

Removed deprecated warnings.
Fixed update() calls that should be updateSource().
Fix #108
Fix #112
#113
---
 app/js/Theatre.js                   | 624 +++++++++++++++++++++-------
 app/js/TheatreActor.js              |   8 +-
 app/js/TheatreActorConfig.js        |  60 +--
 app/js/theatre_main.js              |  95 +++--
 app/lang/en.json                    | 420 ++++++++++---------
 app/packs/theatre-inserts-macros.db |   4 +-
 6 files changed, 787 insertions(+), 424 deletions(-)

diff --git a/app/js/Theatre.js b/app/js/Theatre.js
index 23d6dfb..0f70262 100644
--- a/app/js/Theatre.js
+++ b/app/js/Theatre.js
@@ -96,6 +96,20 @@ class Theatre {
 		return Theatre.instance;
 	}
 
+	functions = {
+		addToNavBar: (actor) => Theatre.addToNavBar(actor),
+		removeFromNavBar: (actor) => Theatre.removeFromNavBar(actor),
+		activateStagedByID: (i) => {
+			const ids = Object.keys(Theatre.instance.stage);
+			Theatre.instance.activateInsertById(ids[i]);
+			document.getElementById("chat-message").blur();
+		},
+		removeFromStagedByID: (i) => {
+			const ids = Object.keys(Theatre.instance.stage);
+			Theatre.instance.removeInsertById(ids[i]);
+		},
+	};
+
 	initialize() {
 		// inject HTML
 		this._injectHTML();
@@ -487,10 +501,43 @@ class Theatre {
 			default: false,
 		});
 
+		game.settings.register(Theatre.SETTINGS, "ignoreMessagesToChat", {
+			name: "Theatre.UI.Settings.ignoreMessagesToChat",
+			hint: "Theatre.UI.Settings.ignoreMessagesToChatHint",
+			scope: "world",
+			config: true,
+			type: Boolean,
+			default: false,
+			onChange: (value) => {
+				this.settings.ignoreMessagesToChat = value;
+			},
+		});
+
+		game.settings.register(Theatre.SETTINGS, "quoteType", {
+			name: "Theatre.UI.Settings.quoteType",
+			hint: game.i18n.format("Theatre.UI.Settings.quoteTypeHint", { setting: game.i18n.localize("Theatre.UI.Title.QuoteToggle") }),
+			scope: "world",
+			config: true,
+			type: Number,
+			default: 1,
+			choices: {
+				0: game.i18n.localize("Theatre.UI.Settings.quoteTypeChoices.0"),
+				1: game.i18n.localize("Theatre.UI.Settings.quoteTypeChoices.1"),
+				2: game.i18n.localize("Theatre.UI.Settings.quoteTypeChoices.2"),
+				3: game.i18n.localize("Theatre.UI.Settings.quoteTypeChoices.3"),
+				4: game.i18n.localize("Theatre.UI.Settings.quoteTypeChoices.4"),
+			},
+			onChange: (value) => {
+				this.settings.quoteType = value;
+			},
+		});
+
 		// Load in default settings (theatreStyle is loaded on HTML Injection)
 		this.settings.decayMin = (game.settings.get(Theatre.SETTINGS, "textDecayMin") || 30) * 1000;
 		this.settings.decayRate = (game.settings.get(Theatre.SETTINGS, "textDecayRate") || 1) * 1000;
 		this.settings.motdNewInfo = game.settings.get(Theatre.SETTINGS, "motdNewInfo") || 1;
+		this.settings.ignoreMessagesToChat = game.settings.get(Theatre.SETTINGS, "ignoreMessagesToChat");
+		this.settings.quoteType = game.settings.get(Theatre.SETTINGS, "quoteType");
 	}
 
 	/**
@@ -879,7 +926,7 @@ class Theatre {
 			for (let insert of this.portraitDocks) this.removeInsertById(insert.imgId, true);
 
 			if (type == "gm") ui.notifications.info(game.i18n.localize("Theatre.UI.Notification.ResyncGM"));
-			else ui.notifications.info(game.i18n.localize("Theatre.UI.Notification.ResyncPlayer") + game.users.get(senderId).data.name);
+			else ui.notifications.info(game.i18n.localize("Theatre.UI.Notification.ResyncPlayer") + game.users.get(senderId).name);
 
 			let theatreId, insert, port, actorId, actor, params;
 			let toInject = [];
@@ -974,7 +1021,7 @@ class Theatre {
 								// apply mirror state
 								/*
 								if (Boolean(dat.position.mirror) != insert.mirrored)
-									this._mirrorInsert(port,true); 
+									this._mirrorInsert(port,true);
 								*/
 								if (Theatre.DEBUG) console.log("Mirror ? %s : %s", dat.position.mirror, insert.mirrored);
 								if (Boolean(dat.position.mirror) != insert.mirrored) {
@@ -1697,7 +1744,6 @@ class Theatre {
 			console.log("ERROR, ACTOR %s DOES NOT EXIST!", actorId);
 			return null;
 		}
-		actor = actor.data;
 		//console.log("getting params from actor: ",actor);
 
 		let theatreId = `theatre-${actor._id}`;
@@ -1746,7 +1792,7 @@ class Theatre {
 
 		if (Theatre.DEBUG) console.log("isDefaultDisabled ", actor);
 
-		if (actor.data.flags.theatre && actor.data.flags.theatre.disabledefault) return true;
+		if (actor.flags.theatre && actor.flags.theatre.disabledefault) return true;
 		return false;
 	}
 
@@ -1769,8 +1815,7 @@ class Theatre {
 			console.log("ERROR, ACTOR %s DOES NOT EXIST!", actorId);
 			return false;
 		}
-		actor = actor.data;
-		if ((actor.permission[userId] && actor.permission[userId] >= 3) || (actor.permission["default"] && actor.permission["default"] >= 3)) return true;
+		if ((actor.ownership[userId] && actor.ownership[userId] >= 3) || (actor.ownership["default"] && actor.ownership["default"] >= 3)) return true;
 		return false;
 	}
 
@@ -1791,13 +1836,12 @@ class Theatre {
 			console.log("ERROR, ACTOR %s DOES NOT EXIST!", actorId);
 			return;
 		}
-		actor = actor.data;
-		for (let perm in actor.permission) {
+		for (let perm in actor.ownership) {
 			if (perm != "default") {
 				user = game.users.get(perm);
 				if (!user.isGM) return true;
 			} else {
-				if (actor.permission[perm] >= 1) return true;
+				if (actor.ownership[perm] >= 1) return true;
 			}
 		}
 		return false;
@@ -1952,33 +1996,33 @@ class Theatre {
 		// face detect
 		/*
 		faceapi.detectSingleFace(app.view,new faceapi.TinyFaceDetectorOptions()).then((detection)=>{
-			console.log("face detected: ", detection); 
+			console.log("face detected: ", detection);
 			if (detection) {
-				let box = detection.box; 
-				console.log("successful preview face detection: ", box); 
-				let graphics = new PIXI.Graphics(); 
-				graphics.lineStyle (2,0xFFFFFF,1); 
+				let box = detection.box;
+				console.log("successful preview face detection: ", box);
+				let graphics = new PIXI.Graphics();
+				graphics.lineStyle (2,0xFFFFFF,1);
 
 				if (maxSide == portWidth) {
 					graphics.moveTo(box.x/(ratio*2)+70,box.y/(ratio*2));
 					graphics.lineTo(box.x/(ratio*2) + box.width/(ratio*2)+70,box.y/(ratio*2));
-					graphics.lineTo(box.x/(ratio*2) + box.width/(ratio*2)+70,box.y/(ratio*2)+box.height/(ratio*2)); 
-					graphics.lineTo(box.x/(ratio*2)+70,box.y/(ratio*2)+box.height/(ratio*2)); 
-					graphics.lineTo(box.x/(ratio*2)+70,box.y/(ratio*2)); 
+					graphics.lineTo(box.x/(ratio*2) + box.width/(ratio*2)+70,box.y/(ratio*2)+box.height/(ratio*2));
+					graphics.lineTo(box.x/(ratio*2)+70,box.y/(ratio*2)+box.height/(ratio*2));
+					graphics.lineTo(box.x/(ratio*2)+70,box.y/(ratio*2));
 				} else {
 					graphics.moveTo(box.x/(ratio*2),box.y/(ratio*2)+70);
 					graphics.lineTo(box.x/(ratio*2) + box.width/(ratio*2),box.y/(ratio*2)+70);
-					graphics.lineTo(box.x/(ratio*2) + box.width/(ratio*2),box.y/(ratio*2)+box.height/(ratio*2)+70); 
-					graphics.lineTo(box.x/(ratio*2),box.y/(ratio*2)+box.height/(ratio*2)+70); 
-					graphics.lineTo(box.x/(ratio*2),box.y/(ratio*2)+70); 
+					graphics.lineTo(box.x/(ratio*2) + box.width/(ratio*2),box.y/(ratio*2)+box.height/(ratio*2)+70);
+					graphics.lineTo(box.x/(ratio*2),box.y/(ratio*2)+box.height/(ratio*2)+70);
+					graphics.lineTo(box.x/(ratio*2),box.y/(ratio*2)+70);
 				}
-				app.stage.addChild(graphics); 
-				app.render(); 
+				app.stage.addChild(graphics);
+				app.render();
 			} else {
-				console.log("FAILED TO FIND PREVIEW FACE"); 
+				console.log("FAILED TO FIND PREVIEW FACE");
 			}
-			this.theatreToolTip.style.opacity = 1; 
-		}); 
+			this.theatreToolTip.style.opacity = 1;
+		});
 		*/
 	}
 
@@ -2257,7 +2301,10 @@ class Theatre {
 
 		let imgSrcs = [];
 
-		imgSrcs.push({ imgpath: "modules/theatre/app/graphics/typing.png", resname: "modules/theatre/app/graphics/typing.png" });
+		imgSrcs.push({
+			imgpath: "modules/theatre/app/graphics/typing.png",
+			resname: "modules/theatre/app/graphics/typing.png",
+		});
 		imgSrcs.push({ imgpath: imgPath, resname: imgPath });
 		if (Theatre.DEBUG) console.log("Adding %s with src %s", portName, imgPath);
 		// get actor, load all emote images
@@ -2381,7 +2428,7 @@ class Theatre {
 			portraitContainer.scale.x = -1;
 			/*
 			if (reorder)
-				portraitContainer.x = portWidth; 
+				portraitContainer.x = portWidth;
 			*/
 		}
 		// setup label if not setup
@@ -2724,7 +2771,7 @@ class Theatre {
 		let loader = PIXI.Loader.shared;
 		/*
 		if (loader.resources[resName])
-			loader.resources[resName] = null; 
+			loader.resources[resName] = null;
 		*/
 
 		// if we have no resName then just return the cb
@@ -2795,7 +2842,7 @@ class Theatre {
 		let loader = PIXI.Loader.shared;
 		/*
 		if (loader.resources[resName])
-			loader.resources[resName] = null; 
+			loader.resources[resName] = null;
 		*/
 
 		// if we have an emtpy imgSrc array, just return the cb
@@ -3085,8 +3132,8 @@ class Theatre {
 		let actor = game.actors.get(actorId);
 		if (!actor) return;
 
-		let baseInsert = actor.data.img ? actor.data.img : "icons/mystery-man.png";
-		if (actor.data.flags.theatre) baseInsert = actor.data.flags.theatre.baseinsert ? actor.data.flags.theatre.baseinsert : baseInsert;
+		let baseInsert = actor.img ? actor.img : "icons/mystery-man.png";
+		if (actor.flags.theatre) baseInsert = actor.flags.theatre.baseinsert ? actor.flags.theatre.baseinsert : baseInsert;
 		let emotes = Theatre.getActorEmotes(actorId);
 
 		// emote already active
@@ -3670,7 +3717,7 @@ class Theatre {
 		TweenMax.killTweensOf(toRemoveTextBox);
 		/*
 		for (let c of toRemoveTextBox.children)
-			c.parentNode.removeChild(c); 
+			c.parentNode.removeChild(c);
 		*/
 		// fade away text box
 		toRemoveTextBox.style.opacity = 0;
@@ -4278,12 +4325,12 @@ class Theatre {
 
 		/*
 		if (this.reorderTOId)
-			window.clearTimeout(this.reorderTOId); 
+			window.clearTimeout(this.reorderTOId);
 
 		this.reorderTOId = window.setTimeout(()=>{
-			Theatre.reorderInserts(); 
-			this.reorderTOId = null; 
-		},500); 
+			Theatre.reorderInserts();
+			this.reorderTOId = null;
+		},500);
 		*/
 		Theatre.reorderInserts();
 
@@ -4553,7 +4600,7 @@ class Theatre {
 				yoyo: yoyo,
 				yoyoEase: yoyoEase,
 				/*onRepeat: function() {
-					console.log("ANIMATION tween is repeating!",this); 
+					console.log("ANIMATION tween is repeating!",this);
 				}, */
 				onComplete: function (ctx, imgId, tweenId) {
 					if (Theatre.DEBUG) console.log("ANIMATION tween complete!");
@@ -4573,8 +4620,8 @@ class Theatre {
 	 * intitial emotion set when displaying an insert
 	 * which was previously staged, or not active
 	 *
-	 * first : actor.data.flags.theatre.<emote>.settings.<parameter>
-	 * second : actor.data.flags.theatre.settings.<parameter>
+	 * first : actor.flags.theatre.<emote>.settings.<parameter>
+	 * second : actor.flags.theatre.settings.<parameter>
 	 * third : Theatre.instance.userEmotes[<userid>].<parameter>
 	 *
 	 * @params params (Object) : The set of emotion properties.
@@ -4634,7 +4681,7 @@ class Theatre {
 		let navItem = this.getNavItemById(id);
 		if (!navItem) {
 			let actor = game.actors.get(actorId);
-			Theatre.addToNavBar(actor.data);
+			Theatre.addToNavBar(actor);
 			navItem = this.getNavItemById(id);
 		}
 		if (!navItem) return;
@@ -4673,7 +4720,9 @@ class Theatre {
 			if (this.speakingAs != id) {
 				this.speakingAs = id;
 				KHelpers.addClass(navItem, "theatre-control-nav-bar-item-speakingas");
-				TweenMax.to(Theatre.instance.theatreNavBar, 0.4, { scrollTo: { x: navItem.offsetLeft, offsetX: Theatre.instance.theatreNavBar.offsetWidth / 2 } });
+				TweenMax.to(Theatre.instance.theatreNavBar, 0.4, {
+					scrollTo: { x: navItem.offsetLeft, offsetX: Theatre.instance.theatreNavBar.offsetWidth / 2 },
+				});
 
 				// add label pulse
 				insert.label.tint = 0xffffff;
@@ -4732,7 +4781,9 @@ class Theatre {
 
 			this.speakingAs = id;
 			KHelpers.addClass(navItem, "theatre-control-nav-bar-item-speakingas");
-			TweenMax.to(Theatre.instance.theatreNavBar, 0.4, { scrollTo: { x: navItem.offsetLeft, offsetX: Theatre.instance.theatreNavBar.offsetWidth / 2 } });
+			TweenMax.to(Theatre.instance.theatreNavBar, 0.4, {
+				scrollTo: { x: navItem.offsetLeft, offsetX: Theatre.instance.theatreNavBar.offsetWidth / 2 },
+			});
 
 			window.setTimeout(() => {
 				insert = this.getInsertById(id);
@@ -5036,7 +5087,12 @@ class Theatre {
 		let textFlyin = Theatre.FLYIN_ANIMS;
 		let textStanding = Theatre.STANDING_ANIMS;
 		let sideBar = document.getElementById("sidebar");
-		renderTemplate("modules/theatre/app/templates/emote_menu.html", { emotes, textFlyin, textStanding, fonts }).then((template) => {
+		renderTemplate("modules/theatre/app/templates/emote_menu.html", {
+			emotes,
+			textFlyin,
+			textStanding,
+			fonts,
+		}).then((template) => {
 			if (Theatre.DEBUG) console.log("emote window template rendered");
 			Theatre.instance.theatreEmoteMenu.style.top = `${Theatre.instance.theatreControls.offsetTop - 410}px`;
 			Theatre.instance.theatreEmoteMenu.innerHTML = template;
@@ -5527,9 +5583,9 @@ class Theatre {
 		ui.notifications.info(game.i18n.localize("Theatre.NotYet"));
 		/*
 		if (KHelpers.hasClass(ev.currentTarget,"theatre-control-small-btn-down")) {
-			KHelpers.removeClass(ev.currentTarget,"theatre-control-small-btn-down"); 
+			KHelpers.removeClass(ev.currentTarget,"theatre-control-small-btn-down");
 		} else {
-			KHelpers.addClass(ev.currentTarget,"theatre-control-small-btn-down"); 
+			KHelpers.addClass(ev.currentTarget,"theatre-control-small-btn-down");
 			ui.notifications.info(game.i18n.localize("Theatre.NotYet"));
 		}
 		*/
@@ -5825,7 +5881,7 @@ class Theatre {
 				ev.stopPropagation();
 			} else if (ev.altKey) {
 				let actor = game.actors.get(id.replace("theatre-", ""));
-				Theatre.addToNavBar(actor.data);
+				Theatre.addToNavBar(actor);
 			} else if (Theatre.instance.swapTarget) {
 				if (Theatre.instance.swapTarget != id) {
 					//Theatre.instance.swapInsertsById(id,Theatre.instance.swapTarget);
@@ -6620,12 +6676,10 @@ class Theatre {
 	 */
 	static getActorEmotes(actorId, disableDefault) {
 		let actor = game.actors.get(actorId);
-		let data, ae, de, re;
-
-		if (actor) data = actor.data;
+		let ae, de, re;
 
-		if (data && data.flags.theatre) {
-			ae = data.flags.theatre.emotes;
+		if (actor && actor.flags.theatre) {
+			ae = actor.flags.theatre.emotes;
 			if (disableDefault) {
 				re = ae;
 			} else {
@@ -6649,14 +6703,12 @@ class Theatre {
 	 */
 	static getActorRiggingResources(actorId) {
 		let actor = game.actors.get(actorId);
-		let data, ar, dr, rr;
-
-		if (actor) data = actor.data;
+		let ar, dr, rr;
 
 		dr = Theatre.getDefaultRiggingResources();
-		if (data && data.flags.theatre && data.flags.theatre.rigging && data.flags.theatre.rigging.resources) {
-			ar = data.flags.theatre.rigging.resources;
-			rr = dr.concat(ar);
+		if (actor && actor.flags.theatre && actor.flags.theatre.rigging && actor.flags.theatre.rigging.resources) {
+			ar = actor.flags.theatre.rigging.resources;
+			rr = defaultRiggingResources.concat(ar);
 		} else rr = dr;
 
 		return rr;
@@ -6794,12 +6846,30 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "happytears", syntax: "happytears|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "line_a", syntax: "line|0.5;(ease:bounce);x:40%,35%;y:5%,0%;rotation:-20,-20|0.5;(repeat:-1,yoyo:true);scaleX:1,1.2;scaleY:1,1.5" },
-						{ name: "line_b", syntax: "line|0.5;(ease:bounce);x:30%,20%;y:15%,12%;rotation:-65,-65|0.5;(repeat:-1,yoyo:true);scaleX:1,1.2;scaleY:1,1.5" },
-						{ name: "line_c", syntax: "line|0.5;(ease:bounce);x:60%,65%;y:5%,0%;rotation:20,20|0.5;(repeat:-1,yoyo:true);scaleX:1,1.2;scaleY:1,1.5" },
-						{ name: "line_d", syntax: "line|0.5;(ease:bounce);x:70%,80%;y:15%,12%;rotation:65,65|0.5;(repeat:-1,yoyo:true);scaleX:1,1.2;scaleY:1,1.5" },
-						{ name: "tears_a", syntax: "tears|0.5;(repeat:-1,repeatDelay:1.7);x:60%,110%;y:25%,40%;rotation:-30,-30;alpha:0.5,0|0;scaleX:-1,-1" },
-						{ name: "tears_b", syntax: "tears|0.5;(repeat:-1,repeatDelay:0.8);x:40%,-10%;y:25%,40%;rotation:30,30;alpha:0.5,0" },
+						{
+							name: "line_a",
+							syntax: "line|0.5;(ease:bounce);x:40%,35%;y:5%,0%;rotation:-20,-20|0.5;(repeat:-1,yoyo:true);scaleX:1,1.2;scaleY:1,1.5",
+						},
+						{
+							name: "line_b",
+							syntax: "line|0.5;(ease:bounce);x:30%,20%;y:15%,12%;rotation:-65,-65|0.5;(repeat:-1,yoyo:true);scaleX:1,1.2;scaleY:1,1.5",
+						},
+						{
+							name: "line_c",
+							syntax: "line|0.5;(ease:bounce);x:60%,65%;y:5%,0%;rotation:20,20|0.5;(repeat:-1,yoyo:true);scaleX:1,1.2;scaleY:1,1.5",
+						},
+						{
+							name: "line_d",
+							syntax: "line|0.5;(ease:bounce);x:70%,80%;y:15%,12%;rotation:65,65|0.5;(repeat:-1,yoyo:true);scaleX:1,1.2;scaleY:1,1.5",
+						},
+						{
+							name: "tears_a",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:1.7);x:60%,110%;y:25%,40%;rotation:-30,-30;alpha:0.5,0|0;scaleX:-1,-1",
+						},
+						{
+							name: "tears_b",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:0.8);x:40%,-10%;y:25%,40%;rotation:30,30;alpha:0.5,0",
+						},
 					],
 				},
 			},
@@ -6832,18 +6902,54 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "sad", syntax: "sad|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "swirl_a", syntax: "swirl|0.5;(ease:power4);x:110%,75%;y:0%,10%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_b", syntax: "swirl|0.5;(ease:power4);x:110%,65%;y:0%,40%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_c", syntax: "swirl|0.5;(ease:power4);x:110%,90%;y:110%,50%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_d", syntax: "swirl|0.5;(ease:power4);x:110%,85%;y:110%,70%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_e", syntax: "swirl|0.5;(ease:power4);x:-10%,25%;y:0%,15%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_f", syntax: "swirl|0.5;(ease:power4);x:-10%,15%;y:0%,38%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_g", syntax: "swirl|0.5;(ease:power4);x:-10%,20%;y:110%,55%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_h", syntax: "swirl|0.5;(ease:power4);x:-10%,35%;y:110%,67%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_i", syntax: "swirl|0.5;(ease:power4);x:-10%,10%;y:110%,85%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_j", syntax: "swirl|0.5;(ease:power4);x:-10%,45%;y:110%,95%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_k", syntax: "swirl|0.5;(ease:power4);x:110%,95%;y:110%,90%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
-						{ name: "swirl_l", syntax: "swirl|0.5;(ease:power4);x:110%,70%;y:110%,82%;alpha:0,1|1;(repeat:-1);rotation:0,360" },
+						{
+							name: "swirl_a",
+							syntax: "swirl|0.5;(ease:power4);x:110%,75%;y:0%,10%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_b",
+							syntax: "swirl|0.5;(ease:power4);x:110%,65%;y:0%,40%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_c",
+							syntax: "swirl|0.5;(ease:power4);x:110%,90%;y:110%,50%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_d",
+							syntax: "swirl|0.5;(ease:power4);x:110%,85%;y:110%,70%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_e",
+							syntax: "swirl|0.5;(ease:power4);x:-10%,25%;y:0%,15%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_f",
+							syntax: "swirl|0.5;(ease:power4);x:-10%,15%;y:0%,38%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_g",
+							syntax: "swirl|0.5;(ease:power4);x:-10%,20%;y:110%,55%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_h",
+							syntax: "swirl|0.5;(ease:power4);x:-10%,35%;y:110%,67%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_i",
+							syntax: "swirl|0.5;(ease:power4);x:-10%,10%;y:110%,85%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_j",
+							syntax: "swirl|0.5;(ease:power4);x:-10%,45%;y:110%,95%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_k",
+							syntax: "swirl|0.5;(ease:power4);x:110%,95%;y:110%,90%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
+						{
+							name: "swirl_l",
+							syntax: "swirl|0.5;(ease:power4);x:110%,70%;y:110%,82%;alpha:0,1|1;(repeat:-1);rotation:0,360",
+						},
 					],
 				},
 			},
@@ -6855,12 +6961,30 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "cry", syntax: "cry|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "tears_a", syntax: "tears|0.5;(repeat:-1,repeatDelay:0.7);x:60%,110%;y:25%,40%;rotation:-30,-30;alpha:0.5,0|0;scaleX:-1,-1" },
-						{ name: "tears_b", syntax: "tears|0.5;(repeat:-1,repeatDelay:0.3);x:40%,-10%;y:25%,40%;rotation:30,30;alpha:0.5,0" },
-						{ name: "tears_c", syntax: "tears|0.5;(repeat:-1,repeatDelay:0.8);x:60%,90%;y:25%,50%;rotation:-10,-10;alpha:0.5,0|0;scaleX:-1,-1" },
-						{ name: "tears_d", syntax: "tears|0.5;(repeat:-1,repeatDelay:1.0);x:40%,10%;y:25%,50%;rotation:10,10;alpha:0.5,0" },
-						{ name: "tears_e", syntax: "tears|0.5;(repeat:-1,repeatDelay:0.2);x:60%,90%;y:25%,30%;rotation:-50,-50;alpha:0.5,0|0;scaleX:-1,-1" },
-						{ name: "tears_f", syntax: "tears|0.5;(repeat:-1,repeatDelay:1.2);x:40%,10%;y:25%,30%;rotation:50,50;alpha:0.5,0" },
+						{
+							name: "tears_a",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:0.7);x:60%,110%;y:25%,40%;rotation:-30,-30;alpha:0.5,0|0;scaleX:-1,-1",
+						},
+						{
+							name: "tears_b",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:0.3);x:40%,-10%;y:25%,40%;rotation:30,30;alpha:0.5,0",
+						},
+						{
+							name: "tears_c",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:0.8);x:60%,90%;y:25%,50%;rotation:-10,-10;alpha:0.5,0|0;scaleX:-1,-1",
+						},
+						{
+							name: "tears_d",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:1.0);x:40%,10%;y:25%,50%;rotation:10,10;alpha:0.5,0",
+						},
+						{
+							name: "tears_e",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:0.2);x:60%,90%;y:25%,30%;rotation:-50,-50;alpha:0.5,0|0;scaleX:-1,-1",
+						},
+						{
+							name: "tears_f",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:1.2);x:40%,10%;y:25%,30%;rotation:50,50;alpha:0.5,0",
+						},
 					],
 				},
 			},
@@ -6882,7 +7006,10 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "annoyed", syntax: "annoyed|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "ziggy", syntax: "ziggy|0;x:25%,25%;y:20%,20%|0.25;(repeat:-1,yoyo:true);rotation:-2,2" },
+						{
+							name: "ziggy",
+							syntax: "ziggy|0;x:25%,25%;y:20%,20%|0.25;(repeat:-1,yoyo:true);rotation:-2,2",
+						},
 						{
 							name: "ziggy_2",
 							syntax: "ziggy|1;(repeat:-1,delay:1,repeatDelay:2);scaleX:1,2;scaleY:1,2;x:25%,25%;y:20%,20%;alpha:0.5,0|0.25;(repeat:-1,yoyo:true);rotation:0,5",
@@ -6899,7 +7026,10 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "frustrated", syntax: "frustrated|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "veins", syntax: "veins|0.5;x:45%,45%;y:10%,10%;alpha:0,1|1;(repeat:-1,yoyo:true,ease:bounce);scaleX:0.7,1;scaleY:0.7,1" },
+						{
+							name: "veins",
+							syntax: "veins|0.5;x:45%,45%;y:10%,10%;alpha:0,1|1;(repeat:-1,yoyo:true,ease:bounce);scaleX:0.7,1;scaleY:0.7,1",
+						},
 					],
 				},
 			},
@@ -6915,10 +7045,22 @@ class Theatre {
 							name: "veins",
 							syntax: "veins_red|0.5;x:45%,45%;y:10%,10%;alpha:0,1|1;(repeat:-1,yoyo:true,ease:elastic);scaleX:0.5,1;scaleY:0.5,1|0.25;(repeat:-1,yoyo:true);rotation:0,10",
 						},
-						{ name: "puff_a", syntax: "puff|0;x:80%,80%;y:15%,15%;rotation:0,0|1;(repeat:-1,delay:1,yoyo:true,ease:power4);scaleX:0.3,1;scaleY:0.3,1;alpha:0,0.5" },
-						{ name: "puff_b", syntax: "puff|0;x:20%,20%;y:15%,15%;rotation:0,0|1;(repeat:-1,delay:1.5,yoyo:true,ease:power4);scaleX:-0.3,-1;scaleY:0.3,1;alpha:0,0.5" },
-						{ name: "puff_c", syntax: "puff|0;x:70%,70%;y:5%,5%;rotation:330,330|1;(repeat:-1,delay:2,yoyo:true,ease:power4);scaleX:0.3,1;scaleY:0.3,1;alpha:0,0.5" },
-						{ name: "puff_d", syntax: "puff|0;x:30%,30%;y:5%,5%;rotation:30,30|1;(repeat:-1,delay:2.5,yoyo:true,ease:power4);scaleX:-0.3,-1;scaleY:0.3,1;alpha:0,0.5" },
+						{
+							name: "puff_a",
+							syntax: "puff|0;x:80%,80%;y:15%,15%;rotation:0,0|1;(repeat:-1,delay:1,yoyo:true,ease:power4);scaleX:0.3,1;scaleY:0.3,1;alpha:0,0.5",
+						},
+						{
+							name: "puff_b",
+							syntax: "puff|0;x:20%,20%;y:15%,15%;rotation:0,0|1;(repeat:-1,delay:1.5,yoyo:true,ease:power4);scaleX:-0.3,-1;scaleY:0.3,1;alpha:0,0.5",
+						},
+						{
+							name: "puff_c",
+							syntax: "puff|0;x:70%,70%;y:5%,5%;rotation:330,330|1;(repeat:-1,delay:2,yoyo:true,ease:power4);scaleX:0.3,1;scaleY:0.3,1;alpha:0,0.5",
+						},
+						{
+							name: "puff_d",
+							syntax: "puff|0;x:30%,30%;y:5%,5%;rotation:30,30|1;(repeat:-1,delay:2.5,yoyo:true,ease:power4);scaleX:-0.3,-1;scaleY:0.3,1;alpha:0,0.5",
+						},
 					],
 				},
 			},
@@ -6944,8 +7086,14 @@ class Theatre {
 				label: game.i18n.localize("Theatre.Emote.LaughingSquint"),
 				rigging: {
 					animations: [
-						{ name: "laughingsquint", syntax: "laughingsquint|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "loud", syntax: "loud|0.5;x:25%,25%;y:20%,20%;alpha:0,1|0.5;(ease:bounce);scaleX:0.1,1;scaleY:0.1,1|0.125;(repeat:-1,yoyo:true);rotation:-1,1" },
+						{
+							name: "laughingsquint",
+							syntax: "laughingsquint|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1",
+						},
+						{
+							name: "loud",
+							syntax: "loud|0.5;x:25%,25%;y:20%,20%;alpha:0,1|0.5;(ease:bounce);scaleX:0.1,1;scaleY:0.1,1|0.125;(repeat:-1,yoyo:true);rotation:-1,1",
+						},
 					],
 				},
 			},
@@ -6957,12 +7105,30 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "rofl", syntax: "rofl|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "loud_a", syntax: "loud|0.5;(ease:bounce);x:20%,20%;y:20%,20%;scaleX:0.1,1;scaleY:0.1,1|0.125;(repeat:-1,yoyo:true);rotation:-2,2" },
-						{ name: "loud_b", syntax: "loud|0.5;(ease:bounce);x:80%,80%;y:20%,20%;scaleX:-0.1,-1;scaleY:0.1,1|0.125;(repeat:-1,yoyo:true);rotation:-2,2" },
-						{ name: "loud_c", syntax: "loud|0;x:20%,20%;y:20%,20%|0.125;(repeat:-1,yoyo:true);rotation:-2,2|1;(repeat:-1);scaleX:1,1.5;scaleY:1,2;alpha:0.25,0" },
-						{ name: "loud_d", syntax: "loud|0;x:80%,80%;y:20%,20%|0.125;(repeat:-1,yoyo:true);rotation:-2,2|1;(repeat:-1);scaleX:-1,-1.5;scaleY:1,2;alpha:0.25,0" },
-						{ name: "tears_a", syntax: "tears|0.5;(repeat:-1,repeatDelay:1.7);x:60%,110%;y:25%,40%;rotation:-30,-30;alpha:0.5,0|0;scaleX:-1,-1" },
-						{ name: "tears_b", syntax: "tears|0.5;(repeat:-1,repeatDelay:0.8);x:40%,-10%;y:25%,40%;rotation:30,30;alpha:0.5,0" },
+						{
+							name: "loud_a",
+							syntax: "loud|0.5;(ease:bounce);x:20%,20%;y:20%,20%;scaleX:0.1,1;scaleY:0.1,1|0.125;(repeat:-1,yoyo:true);rotation:-2,2",
+						},
+						{
+							name: "loud_b",
+							syntax: "loud|0.5;(ease:bounce);x:80%,80%;y:20%,20%;scaleX:-0.1,-1;scaleY:0.1,1|0.125;(repeat:-1,yoyo:true);rotation:-2,2",
+						},
+						{
+							name: "loud_c",
+							syntax: "loud|0;x:20%,20%;y:20%,20%|0.125;(repeat:-1,yoyo:true);rotation:-2,2|1;(repeat:-1);scaleX:1,1.5;scaleY:1,2;alpha:0.25,0",
+						},
+						{
+							name: "loud_d",
+							syntax: "loud|0;x:80%,80%;y:20%,20%|0.125;(repeat:-1,yoyo:true);rotation:-2,2|1;(repeat:-1);scaleX:-1,-1.5;scaleY:1,2;alpha:0.25,0",
+						},
+						{
+							name: "tears_a",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:1.7);x:60%,110%;y:25%,40%;rotation:-30,-30;alpha:0.5,0|0;scaleX:-1,-1",
+						},
+						{
+							name: "tears_b",
+							syntax: "tears|0.5;(repeat:-1,repeatDelay:0.8);x:40%,-10%;y:25%,40%;rotation:30,30;alpha:0.5,0",
+						},
 					],
 				},
 			},
@@ -6986,7 +7152,10 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "surprised", syntax: "surprised|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "notice", syntax: "notice|0.5;x:25%,25%;y:20%,20%;alpha:0,1|0.5;(ease:bounce);scaleX:0.1,1;scaleY:0.1,1" },
+						{
+							name: "notice",
+							syntax: "notice|0.5;x:25%,25%;y:20%,20%;alpha:0,1|0.5;(ease:bounce);scaleX:0.1,1;scaleY:0.1,1",
+						},
 					],
 				},
 			},
@@ -6998,18 +7167,54 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "awe-struck", syntax: "awe-struck|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "glimmer_a", syntax: "glimmer|0.5;x:10%,10%;y:58%,58%|0.5;(delay:0.2,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_b", syntax: "glimmer|0.5;x:85%,85%;y:20%,20%|0.5;(delay:0.3,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_c", syntax: "glimmer|0.5;x:40%,40%;y:45%,45%|0.5;(delay:0.5,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_d", syntax: "glimmer|0.5;x:35%,35%;y:30%,30%|0.5;(delay:0.6,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_e", syntax: "glimmer|0.5;x:65%,65%;y:35%,35%|0.5;(delay:0.4,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_f", syntax: "glimmer|0.5;x:80%,80%;y:50%,50%|0.5;(delay:0.1,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_g", syntax: "glimmer|0.5;x:16%,16%;y:81%,81%|0.5;(delay:0.8,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_h", syntax: "glimmer|0.5;x:55%,55%;y:64%,64%|0.5;(delay:0.9,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_i", syntax: "glimmer|0.5;x:44%,44%;y:95%,95%|0.5;(delay:0.7,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_j", syntax: "glimmer|0.5;x:67%,67%;y:84%,84%|0.5;(delay:0.35,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_k", syntax: "glimmer|0.5;x:44%,44%;y:70%,70%|0.5;(delay:0,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "glimmer_l", syntax: "glimmer|0.5;x:20%,20%;y:23%,23%|0.5;(delay:0.65,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1" },
+						{
+							name: "glimmer_a",
+							syntax: "glimmer|0.5;x:10%,10%;y:58%,58%|0.5;(delay:0.2,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_b",
+							syntax: "glimmer|0.5;x:85%,85%;y:20%,20%|0.5;(delay:0.3,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_c",
+							syntax: "glimmer|0.5;x:40%,40%;y:45%,45%|0.5;(delay:0.5,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_d",
+							syntax: "glimmer|0.5;x:35%,35%;y:30%,30%|0.5;(delay:0.6,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_e",
+							syntax: "glimmer|0.5;x:65%,65%;y:35%,35%|0.5;(delay:0.4,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_f",
+							syntax: "glimmer|0.5;x:80%,80%;y:50%,50%|0.5;(delay:0.1,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_g",
+							syntax: "glimmer|0.5;x:16%,16%;y:81%,81%|0.5;(delay:0.8,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_h",
+							syntax: "glimmer|0.5;x:55%,55%;y:64%,64%|0.5;(delay:0.9,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_i",
+							syntax: "glimmer|0.5;x:44%,44%;y:95%,95%|0.5;(delay:0.7,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_j",
+							syntax: "glimmer|0.5;x:67%,67%;y:84%,84%|0.5;(delay:0.35,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_k",
+							syntax: "glimmer|0.5;x:44%,44%;y:70%,70%|0.5;(delay:0,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "glimmer_l",
+							syntax: "glimmer|0.5;x:20%,20%;y:23%,23%|0.5;(delay:0.65,repeat:-1,yoyo:true);scaleX:0.0,1;scaleY:0.0,1",
+						},
 					],
 				},
 			},
@@ -7107,7 +7312,10 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "thinking", syntax: "thinking|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "thoughtbubble", syntax: "thoughtbubble|0.5;(ease:power3);x:25%,25%;y:10%,10%;alpha:0,1|0.5;(repeat:-1,yoyo:true);scaleX:0.95,1;scaleY:0.95,1" },
+						{
+							name: "thoughtbubble",
+							syntax: "thoughtbubble|0.5;(ease:power3);x:25%,25%;y:10%,10%;alpha:0,1|0.5;(repeat:-1,yoyo:true);scaleX:0.95,1;scaleY:0.95,1",
+						},
 						{
 							name: "bubbledot_a",
 							syntax: "bubbledot|0.5;(ease:power3);x:28%,28%;y:18%,18%;alpha:0,1|1;(repeat:-1,yoyo:true,repeatDelay:0.3);scaleX:0.5,1;scaleY:0.5,1|5;(repeat:-1);rotation:0,360",
@@ -7163,7 +7371,10 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "meh", syntax: "meh|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "sigh", syntax: "sigh|3;(ease:power2);x:30%,10%;y:25%,45%;alpha:1,0;rotation:225,225;scaleX:1,1.5;scaleY:1,1.5" },
+						{
+							name: "sigh",
+							syntax: "sigh|3;(ease:power2);x:30%,10%;y:25%,45%;alpha:1,0;rotation:225,225;scaleX:1,1.5;scaleY:1,1.5",
+						},
 					],
 				},
 			},
@@ -7185,9 +7396,18 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "wink", syntax: "wink|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "kawaii_a", syntax: "star|4;(ease:expo);x:45%,-10%;y:25%,25%;alpha:1,0|2;(repeat:4);rotation:0,360" },
-						{ name: "kawaii_b", syntax: "star|3;(ease:expo);x:45%,10%;y:25%,12%;alpha:1,0|2;(repeat:4);rotation:0,360" },
-						{ name: "kawaii_c", syntax: "star|3;(ease:expo);x:45%,10%;y:25%,38%;alpha:1,0|2;(repeat:4);rotation:0,360" },
+						{
+							name: "kawaii_a",
+							syntax: "star|4;(ease:expo);x:45%,-10%;y:25%,25%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
+						{
+							name: "kawaii_b",
+							syntax: "star|3;(ease:expo);x:45%,10%;y:25%,12%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
+						{
+							name: "kawaii_c",
+							syntax: "star|3;(ease:expo);x:45%,10%;y:25%,38%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
 					],
 				},
 			},
@@ -7199,7 +7419,10 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "tongue", syntax: "tongue|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "kawaii", syntax: "star|4;(ease:expo,delay:2);x:30%,30%;y:25%,25%;alpha:1,0;scaleX:1.3,0.1;scaleY:1.3,0.1|2;(repeat:4);rotation:0,360" },
+						{
+							name: "kawaii",
+							syntax: "star|4;(ease:expo,delay:2);x:30%,30%;y:25%,25%;alpha:1,0;scaleX:1.3,0.1;scaleY:1.3,0.1|2;(repeat:4);rotation:0,360",
+						},
 					],
 				},
 			},
@@ -7211,14 +7434,38 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "playful", syntax: "playful|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "kawaii_a", syntax: "star|3;(ease:expo);x:40%,-10%;y:25%,-15%;alpha:1,0|2;(repeat:4);rotation:0,360" },
-						{ name: "kawaii_b", syntax: "star|4;(ease:expo);x:40%,-40%;y:25%,30%;alpha:1,0|2;(repeat:4);rotation:0,360" },
-						{ name: "kawaii_c", syntax: "star|3;(ease:expo);x:40%,-10%;y:25%,55%;alpha:1,0|2;(repeat:4);rotation:0,360" },
-						{ name: "kawaii_d", syntax: "star|3;(ease:expo);x:60%,110%;y:25%,-15%;alpha:1,0|2;(repeat:4);rotation:0,360" },
-						{ name: "kawaii_e", syntax: "star|4;(ease:expo);x:60%,140%;y:25%,30%;alpha:1,0|2;(repeat:4);rotation:0,360" },
-						{ name: "kawaii_f", syntax: "star|3;(ease:expo);x:60%,110%;y:25%,55%;alpha:1,0|2;(repeat:4);rotation:0,360" },
-						{ name: "kawaii_g", syntax: "star|4;(ease:expo);x:50%,50%;y:15%,-35%;alpha:1,0|2;(repeat:4);rotation:0,360" },
-						{ name: "kawaii_h", syntax: "star|4;(ease:expo);x:50%,50%;y:35%,85%;alpha:1,0|2;(repeat:4);rotation:0,360" },
+						{
+							name: "kawaii_a",
+							syntax: "star|3;(ease:expo);x:40%,-10%;y:25%,-15%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
+						{
+							name: "kawaii_b",
+							syntax: "star|4;(ease:expo);x:40%,-40%;y:25%,30%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
+						{
+							name: "kawaii_c",
+							syntax: "star|3;(ease:expo);x:40%,-10%;y:25%,55%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
+						{
+							name: "kawaii_d",
+							syntax: "star|3;(ease:expo);x:60%,110%;y:25%,-15%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
+						{
+							name: "kawaii_e",
+							syntax: "star|4;(ease:expo);x:60%,140%;y:25%,30%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
+						{
+							name: "kawaii_f",
+							syntax: "star|3;(ease:expo);x:60%,110%;y:25%,55%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
+						{
+							name: "kawaii_g",
+							syntax: "star|4;(ease:expo);x:50%,50%;y:15%,-35%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
+						{
+							name: "kawaii_h",
+							syntax: "star|4;(ease:expo);x:50%,50%;y:35%,85%;alpha:1,0|2;(repeat:4);rotation:0,360",
+						},
 					],
 				},
 			},
@@ -7232,21 +7479,66 @@ class Theatre {
 					animations: [
 						{ name: "evil", syntax: "evil|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
 						{ name: "shroud", syntax: "darkness|0;x:50%,50%;y:50%,50%" },
-						{ name: "miasma_a", syntax: "miasma|0;x:25%,25%;y:78%,78%|3;(repeat:-1,delay:0.3);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_b", syntax: "miasma|0;x:73%,73%;y:68%,68%|3;(repeat:-1,delay:1.3);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_c", syntax: "miasma|0;x:15%,15%;y:60%,60%|3;(repeat:-1,delay:0.8);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_d", syntax: "miasma|0;x:45%,45%;y:85%,85%|3;(repeat:-1,delay:2.6);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_e", syntax: "miasma|0;x:90%,90%;y:80%,80%|3;(repeat:-1,delay:3.5);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_f", syntax: "miasma|0;x:55%,55%;y:60%,60%|3;(repeat:-1,delay:2.1);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_g", syntax: "miasma|0;x:10%,10%;y:90%,90%|3;(repeat:-1,delay:3.8);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_h", syntax: "miasma|0;x:95%,95%;y:70%,70%|3;(repeat:-1,delay:1.8);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_i", syntax: "miasma|0;x:50%,50%;y:72%,72%|3;(repeat:-1,delay:5.8);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_j", syntax: "miasma|0;x:10%,10%;y:66%,66%|3;(repeat:-1,delay:3.6);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_k", syntax: "miasma|0;x:3%,3%;y:88%,88%|3;(repeat:-1,delay:2.2);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_l", syntax: "miasma|0;x:78%,78%;y:75%,75%|3;(repeat:-1,delay:1.7);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_m", syntax: "miasma|0;x:65%,65%;y:98%,98%|3;(repeat:-1,delay:.7);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_n", syntax: "miasma|0;x:33%,33%;y:78%,78%|3;(repeat:-1,delay:4.4);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
-						{ name: "miasma_o", syntax: "miasma|0;x:80%,80%;y:92%,92%|3;(repeat:-1,delay:5.2);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1" },
+						{
+							name: "miasma_a",
+							syntax: "miasma|0;x:25%,25%;y:78%,78%|3;(repeat:-1,delay:0.3);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_b",
+							syntax: "miasma|0;x:73%,73%;y:68%,68%|3;(repeat:-1,delay:1.3);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_c",
+							syntax: "miasma|0;x:15%,15%;y:60%,60%|3;(repeat:-1,delay:0.8);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_d",
+							syntax: "miasma|0;x:45%,45%;y:85%,85%|3;(repeat:-1,delay:2.6);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_e",
+							syntax: "miasma|0;x:90%,90%;y:80%,80%|3;(repeat:-1,delay:3.5);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_f",
+							syntax: "miasma|0;x:55%,55%;y:60%,60%|3;(repeat:-1,delay:2.1);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_g",
+							syntax: "miasma|0;x:10%,10%;y:90%,90%|3;(repeat:-1,delay:3.8);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_h",
+							syntax: "miasma|0;x:95%,95%;y:70%,70%|3;(repeat:-1,delay:1.8);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_i",
+							syntax: "miasma|0;x:50%,50%;y:72%,72%|3;(repeat:-1,delay:5.8);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_j",
+							syntax: "miasma|0;x:10%,10%;y:66%,66%|3;(repeat:-1,delay:3.6);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_k",
+							syntax: "miasma|0;x:3%,3%;y:88%,88%|3;(repeat:-1,delay:2.2);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_l",
+							syntax: "miasma|0;x:78%,78%;y:75%,75%|3;(repeat:-1,delay:1.7);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_m",
+							syntax: "miasma|0;x:65%,65%;y:98%,98%|3;(repeat:-1,delay:.7);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_n",
+							syntax: "miasma|0;x:33%,33%;y:78%,78%|3;(repeat:-1,delay:4.4);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
+						{
+							name: "miasma_o",
+							syntax: "miasma|0;x:80%,80%;y:92%,92%|3;(repeat:-1,delay:5.2);alpha:1,0;scaleX:0.0,1;scaleY:0.0,1",
+						},
 					],
 				},
 			},
@@ -7259,7 +7551,10 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "innocent", syntax: "innocent|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "halo", syntax: "halo|2;(ease:power2);x:50%,50%;alpha:0,1|2;(ease:sine,repeat:-1,yoyo:true,yoyoEase:sine);y:-3%,-5%" },
+						{
+							name: "halo",
+							syntax: "halo|2;(ease:power2);x:50%,50%;alpha:0,1|2;(ease:sine,repeat:-1,yoyo:true,yoyoEase:sine);y:-3%,-5%",
+						},
 					],
 				},
 			},
@@ -7295,17 +7590,44 @@ class Theatre {
 				rigging: {
 					animations: [
 						{ name: "panic", syntax: "panic|1;(ease:elastic);x:80%,80%;y:0%,25%;alpha:0,1" },
-						{ name: "line_a", syntax: "linesteep|0;x:50%,50%;y:-10%,-10%|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1" },
+						{
+							name: "line_a",
+							syntax: "linesteep|0;x:50%,50%;y:-10%,-10%|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1",
+						},
 
-						{ name: "line_b", syntax: "linesteep|0;x:35%,35%;y:-5%,-5%;rotation:-22.5,-22.5|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1" },
-						{ name: "line_c", syntax: "linesteep|0;x:15%,15%;y:5%,5%;rotation:-45,-45|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1" },
-						{ name: "line_d", syntax: "linesteep|0;x:0%,0%;y:20%,20%;rotation:-67.5,-67.5|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1" },
-						{ name: "line_e", syntax: "linesteep|0;x:-10%,-10%;y:30%,30%;rotation:-90,-90|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1" },
+						{
+							name: "line_b",
+							syntax: "linesteep|0;x:35%,35%;y:-5%,-5%;rotation:-22.5,-22.5|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1",
+						},
+						{
+							name: "line_c",
+							syntax: "linesteep|0;x:15%,15%;y:5%,5%;rotation:-45,-45|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1",
+						},
+						{
+							name: "line_d",
+							syntax: "linesteep|0;x:0%,0%;y:20%,20%;rotation:-67.5,-67.5|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1",
+						},
+						{
+							name: "line_e",
+							syntax: "linesteep|0;x:-10%,-10%;y:30%,30%;rotation:-90,-90|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1",
+						},
 
-						{ name: "line_f", syntax: "linesteep|0;x:65%,65%;y:-5%,-5%;rotation:22.5,22.5|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1" },
-						{ name: "line_g", syntax: "linesteep|0;x:85%,85%;y:5%,5%;rotation:45,45|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1" },
-						{ name: "line_h", syntax: "linesteep|0;x:100%,100%;y:20%,20%;rotation:67.5,67.5|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1" },
-						{ name: "line_i", syntax: "linesteep|0;x:110%,110%;y:30%,30%;rotation:90,90|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1" },
+						{
+							name: "line_f",
+							syntax: "linesteep|0;x:65%,65%;y:-5%,-5%;rotation:22.5,22.5|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1",
+						},
+						{
+							name: "line_g",
+							syntax: "linesteep|0;x:85%,85%;y:5%,5%;rotation:45,45|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1",
+						},
+						{
+							name: "line_h",
+							syntax: "linesteep|0;x:100%,100%;y:20%,20%;rotation:67.5,67.5|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1",
+						},
+						{
+							name: "line_i",
+							syntax: "linesteep|0;x:110%,110%;y:30%,30%;rotation:90,90|1;(repeat:-1,yoyo:true);scaleX:0.5,1;scaleY:0.5,1",
+						},
 					],
 				},
 			},
@@ -7776,8 +8098,8 @@ class Theatre {
 		ev.preventDefault();
 		if (Theatre.DEBUG) console.log("Click Event on Configure Theatre!!!", actorSheet, actorSheet.actor, actorSheet.position);
 
-		if (!actorSheet.actor.data.flags.theatre) {
-			actorSheet.actor.data.flags.theatre = { baseinsert: "", name: "" };
+		if (!actorSheet.actor.flags.theatre) {
+			actorSheet.actor.flags.theatre = { baseinsert: "", name: "" };
 		}
 
 		new TheatreActorConfig(actorSheet.actor, {
@@ -7822,9 +8144,9 @@ class Theatre {
 		if (Theatre.DEBUG) console.log("actor is valid!");
 		// if already on stage, dont add it again
 		// create nav-list-item
-		// set picture as actor.data.img
+		// set picture as actor.img
 		// set attribute "theatre-id" to "theatre" + _id
-		// set attribute "insertImg" to object.data.flags.theatre.baseinsert or img if not specified
+		// set attribute "insertImg" to object.flags.theatre.baseinsert or img if not specified
 		// add click handler to push it into the theatre bar, if it already exists on the bar, remove it
 		// from the bar
 		// add click handler logic to remove it from the stage
diff --git a/app/js/TheatreActor.js b/app/js/TheatreActor.js
index b0b9f3f..1c3c2d5 100644
--- a/app/js/TheatreActor.js
+++ b/app/js/TheatreActor.js
@@ -1,8 +1,8 @@
 class TheatreActor {
-	constructor(actor, navElement) {
-		this.actor = actor;
-		this.navElement = navElement;
-	}
+    constructor(actor, navElement) {
+        this.actor = actor;
+        this.navElement = navElement;
+    }
 }
 
 /*
diff --git a/app/js/TheatreActorConfig.js b/app/js/TheatreActorConfig.js
index 8e4823c..48d76b2 100644
--- a/app/js/TheatreActorConfig.js
+++ b/app/js/TheatreActorConfig.js
@@ -31,7 +31,13 @@
 class TheatreActorConfig extends FormApplication {
 	constructor(object = {}, options = {}) {
 		if (object._theatre_mod_configTab) {
-			options.tabs = [{ navSelector: ".tabs", contentSelector: ".theatre-config-contents", initial: object._theatre_mod_configTab }];
+			options.tabs = [
+				{
+					navSelector: ".tabs",
+					contentSelector: ".theatre-config-contents",
+					initial: object._theatre_mod_configTab,
+				},
+			];
 			if (object._theatre_mod_configTab === "emotes") {
 				options.height = 775;
 			}
@@ -70,7 +76,7 @@ class TheatreActorConfig extends FormApplication {
 			entityName: entityName,
 			isGM: game.user.isGM,
 			object: duplicate(this.object.data),
-			emote: Theatre.getActorEmotes(this.object.data._id),
+			emote: Theatre.getActorEmotes(this.object._id),
 			options: this.options,
 		};
 	}
@@ -214,16 +220,16 @@ class TheatreActorConfig extends FormApplication {
 		let baseInsert = formData["flags.theatre.baseinsert"];
 		let optAlign = formData["flags.theatre.optalign"];
 		let name = formData["flags.theatre.name"];
-		let newBaseInsert = this.object.data.flags.theatre.baseinsert || (this.object.img ? this.object.img : "icons/mystery-man.png");
-		let newName = this.object.data.flags.theatre.name || this.object.data.name;
-		let newAlign = this.object.data.flags.theatre.optalign || "top";
+		let newBaseInsert = this.object.flags.theatre.baseinsert || (this.object.img ? this.object.img : "icons/mystery-man.png");
+		let newName = this.object.flags.theatre.name || this.object.name;
+		let newAlign = this.object.flags.theatre.optalign || "top";
 
 		// update Navbar of the corresponding ID
-		let theatreId = `theatre-${this.object.data._id}`;
+		let theatreId = `theatre-${this.object._id}`;
 		let navItem = Theatre.instance.getNavItemById(theatreId);
 		let cImg = Theatre.instance.getTheatreCoverPortrait();
 
-		if (baseInsert != this.object.data.flags.theatre.baseinsert) {
+		if (baseInsert != this.object.flags.theatre.baseinsert) {
 			if (Theatre.DEBUG) console.log("baseinsert changed!");
 			insertDirty = true;
 			newBaseInsert = baseInsert == "" ? (this.object.img ? this.object.img : "icons/mystery-man.png") : baseInsert;
@@ -232,19 +238,19 @@ class TheatreActorConfig extends FormApplication {
 				cImg.setAttribute("src", newBaseInsert);
 			}
 		}
-		if (optAlign != this.object.data.flags.theatre.optalign) {
+		if (optAlign != this.object.flags.theatre.optalign) {
 			if (Theatre.DEBUG) console.log("optalign changed!");
 			insertDirty = true;
 			newAlign = optAlign == "" ? "top" : optAlign;
 			if (navItem) navItem.setAttribute("optalign", newAlign);
 		}
-		if (name != this.object.data.flags.theatre.name) {
+		if (name != this.object.flags.theatre.name) {
 			if (Theatre.DEBUG) console.log("name changed!");
 			insertDirty = true;
-			newName = name == "" ? this.object.data.name : name;
+			newName = name == "" ? this.object.name : name;
 			if (navItem) {
 				navItem.setAttribute("name", newName);
-				navItem.setAttribute("title", newName + (newName == this.object.data.name ? "" : ` (${this.object.data.name})`));
+				navItem.setAttribute("title", newName + (newName == this.object.name ? "" : ` (${this.object.name})`));
 			}
 		}
 		// Add label information to update if it has data-edit
@@ -281,10 +287,9 @@ class TheatreActorConfig extends FormApplication {
 						let formBaseInsert = formData["flags.theatre.baseinsert"];
 						if (k.endsWith("insert") && !k.endsWith("baseinsert")) {
 							if (formBaseInsert && formBaseInsert != "") resName = formBaseInsert;
-							else if (this.object.data.flags.theatre.baseinsert && this.object.data.flags.theatre.baseinsert != "")
-								resName = this.object.data.flags.theatre.baseinsert;
-							else resName = this.object.data.img ? this.object.data.img : "icons/mystery-man.png";
-						} else resName = this.object.data.img ? this.object.data.img : "icons/mystery-man.png";
+							else if (this.object.flags.theatre.baseinsert && this.object.flags.theatre.baseinsert != "") resName = this.object.flags.theatre.baseinsert;
+							else resName = this.object.img ? this.object.img : "icons/mystery-man.png";
+						} else resName = this.object.img ? this.object.img : "icons/mystery-man.png";
 					}
 
 					// ensure resource exists
@@ -330,11 +335,10 @@ class TheatreActorConfig extends FormApplication {
 							if (Theatre.DEBUG) console.log("RE-RENDERING with NEW texture resource %s ", newSrcImg);
 
 							let resName = "icons/myster-man.png";
-							if (insert.emote && this.object.data.flags.theatre.emotes[insert.emote].insert && this.object.data.flags.theatre.emotes[insert.emote].insert != "")
-								resName = this.object.data.flags.theatre.emotes[insert.emote].insert;
-							else if (this.object.data.flags.theatre.baseinsert && this.object.data.flags.theatre.baseinsert != "")
-								resName = this.object.data.flags.theatre.baseinsert;
-							else if (this.object.data.img && this.object.data.img != "") resName = this.object.data.img;
+							if (insert.emote && this.object.flags.theatre.emotes[insert.emote].insert && this.object.flags.theatre.emotes[insert.emote].insert != "")
+								resName = this.object.flags.theatre.emotes[insert.emote].insert;
+							else if (this.object.flags.theatre.baseinsert && this.object.flags.theatre.baseinsert != "") resName = this.object.flags.theatre.baseinsert;
+							else if (this.object.img && this.object.img != "") resName = this.object.img;
 
 							// bubble up dataum from the update
 							insert.optAlign = newAlign;
@@ -365,10 +369,10 @@ class TheatreActorConfig extends FormApplication {
 			if (insertDirty && insert) {
 				if (Theatre.DEBUG) console.log("Insert is dirty, re-render it!");
 				let resName = "icons/myster-man.png";
-				if (insert.emote && this.object.data.flags.theatre.emotes[insert.emote].insert && this.object.data.flags.theatre.emotes[insert.emote].insert != "")
-					resName = this.object.data.flags.theatre.emotes[insert.emote].insert;
-				else if (this.object.data.flags.theatre.baseinsert && this.object.data.flags.theatre.baseinsert != "") resName = this.object.data.flags.theatre.baseinsert;
-				else if (this.object.data.img && this.object.data.img != "") resName = this.object.data.img;
+				if (insert.emote && this.object.flags.theatre.emotes[insert.emote].insert && this.object.flags.theatre.emotes[insert.emote].insert != "")
+					resName = this.object.flags.theatre.emotes[insert.emote].insert;
+				else if (this.object.flags.theatre.baseinsert && this.object.flags.theatre.baseinsert != "") resName = this.object.flags.theatre.baseinsert;
+				else if (this.object.img && this.object.img != "") resName = this.object.img;
 
 				// bubble up dataum from the update
 				insert.optAlign = newAlign;
@@ -423,9 +427,13 @@ class TheatreActorConfig extends FormApplication {
 		let customIdx = customElems.length > 0 ? customElems[customElems.length - 1].sortidx + 1 : 1;
 
 		let customObjElems = [];
-		for (let k in this.object.data.flags.theatre.emotes) {
+		for (let k in this.object.flags.theatre.emotes) {
 			let eName = k;
-			if (eName && eName.startsWith("custom")) customObjElems.push({ sortidx: Number(eName.match(/\d+/)[0]), elem: this.object.data.flags.theatre.emotes[k] });
+			if (eName && eName.startsWith("custom"))
+				customObjElems.push({
+					sortidx: Number(eName.match(/\d+/)[0]),
+					elem: this.object.flags.theatre.emotes[k],
+				});
 		}
 		// we grab max index, we don't care about possible missing indexes from removed custom emotes
 		// so we'll just leave them as gaps
diff --git a/app/js/theatre_main.js b/app/js/theatre_main.js
index 0fe69f1..cea6aeb 100644
--- a/app/js/theatre_main.js
+++ b/app/js/theatre_main.js
@@ -221,39 +221,39 @@ Hooks.on("deleteCombat", function () {
  */
 Hooks.on("preCreateChatMessage", function (chatMessage) {
 	let chatData = {
-		speaker: {},
+		speaker: {
+			actor: null,
+			scene: null,
+			flags: {},
+		},
 	};
-	if (Theatre.DEBUG) console.log("preCreateChatMessage", chatMessage.data);
+	if (Theatre.DEBUG) console.log("preCreateChatMessage", chatMessage);
 	// If theatre isn't even ready, then just no
 	if (!Theatre.instance) return;
 
 	// make the message OOC if needed
-	if (!chatMessage.data.roll && $(theatre.theatreChatCover).hasClass("theatre-control-chat-cover-ooc")) {
-		const user = game.users.get(chatMessage.data.user.id);
-		chatData.speaker.alias = user.data.name;
-		chatData.speaker.actor = null;
-		chatData.speaker.scene = null;
+	if (!chatMessage.rolls.length && $(theatre.theatreChatCover).hasClass("theatre-control-chat-cover-ooc")) {
+		const user = game.users.get(chatMessage.user.id);
+		chatData.speaker.alias = user.name;
 		chatData.type = CONST.CHAT_MESSAGE_TYPES.OOC;
 
-		chatMessage.data.update(chatData);
+		chatMessage.updateSource(chatData);
 		return;
 	}
 
-	if (!chatMessage.data.roll && Theatre.instance.speakingAs && Theatre.instance.usersTyping[chatMessage.data.user.id]) {
-		let theatreId = Theatre.instance.usersTyping[chatMessage.data.user.id].theatreId;
+	if (!chatMessage.rolls.length && Theatre.instance.speakingAs && Theatre.instance.usersTyping[chatMessage.user.id]) {
+		let theatreId = Theatre.instance.usersTyping[chatMessage.user.id].theatreId;
 		let insert = Theatre.instance.getInsertById(theatreId);
 		let actorId = theatreId.replace("theatre-", "");
 		let actor = game.actors.get(actorId) || null;
 		if (Theatre.DEBUG) console.log("speakingAs %s", theatreId);
 
-		if (insert && chatMessage.data.speaker) {
+		if (insert && chatMessage.speaker) {
 			let label = Theatre.instance._getLabelFromInsert(insert);
 			let name = label.text;
-			let theatreColor = Theatre.instance.getPlayerFlashColor(chatMessage.data.user.id, insert.textColor);
+			let theatreColor = Theatre.instance.getPlayerFlashColor(chatMessage.user.id, insert.textColor);
 			if (Theatre.DEBUG) console.log("name is %s", name);
 			chatData.speaker.alias = name;
-			chatData.speaker.actor = null;
-			chatData.speaker.scene = null;
 			//chatData.flags.theatreColor = theatreColor;
 			chatData.type = CONST.CHAT_MESSAGE_TYPES.IC;
 			// if delay emote is active
@@ -267,10 +267,7 @@ Hooks.on("preCreateChatMessage", function (chatMessage) {
 			let label = Theatre.instance._getLabelFromInsert(insert);
 			let name = label.text;
 			let theatreColor = Theatre.instance.getPlayerFlashColor(chatData.user, insert.textColor);
-			chatData.speaker = {};
 			chatData.speaker.alias = name;
-			chatData.speaker.actor = null;
-			chatData.speaker.scene = null;
 			//chatData.flags.theatreColor = theatreColor;
 			chatData.type = CONST.CHAT_MESSAGE_TYPES.IC;
 			// if delay emote is active
@@ -281,27 +278,29 @@ Hooks.on("preCreateChatMessage", function (chatMessage) {
 				Theatre.instance.delayedSentState = 0;
 			}
 		} else if (Theatre.instance.speakingAs == Theatre.NARRATOR) {
-			chatData.speaker = {};
 			chatData.speaker.alias = game.i18n.localize("Theatre.UI.Chat.Narrator");
-			chatData.speaker.actor = null;
-			chatData.speaker.scene = null;
 			chatData.type = CONST.CHAT_MESSAGE_TYPES.IC;
 		}
+
+		if (!chatData.flags) chatData.flags = {};
+		chatData.flags[Theatre.SETTINGS] = { theatreMessage: true };
 	}
 	// alter message data
-	// append chat emote braces TODO make a setting
-	if (Theatre.DEBUG) console.log("speaker? ", chatMessage.data.speaker);
+	// append chat emote braces
+	if (Theatre.DEBUG) console.log("speaker? ", chatMessage.speaker);
 	if (
 		Theatre.instance.isQuoteAuto &&
-		!chatMessage.data.roll &&
-		chatMessage.data.speaker &&
+		!chatMessage.rolls.length &&
+		chatMessage.speaker &&
 		(chatData.speaker.actor || chatData.speaker.token || chatData.speaker.alias) &&
-		!chatMessage.data.content.match(/\<div.*\>[\s\S]*\<\/div\>/)
+		!chatMessage.content.match(/\<div.*\>[\s\S]*\<\/div\>/)
 	) {
-		chatData.content = game.i18n.localize("Theatre.Text.OpenBracket") + chatMessage.data.content + game.i18n.localize("Theatre.Text.CloseBracket");
+		chatData.content =
+			game.i18n.localize(`Theatre.Text.OpenBracket.${Theatre.instance.settings.quoteType}`) +
+			chatMessage.content +
+			game.i18n.localize(`Theatre.Text.CloseBracket.${Theatre.instance.settings.quoteType}`);
 	}
-
-	chatMessage.data.update(chatData);
+	chatMessage.updateSource(chatData);
 });
 
 /**
@@ -320,11 +319,11 @@ Hooks.on("createChatMessage", function (chatEntity, _, userId) {
 	}
 
 	// slash commands are pass through
-	let chatData = chatEntity.data;
+	let chatData = chatEntity;
 	if (
 		chatData.content.startsWith("<") || //Bandaid fix so that texts that start with html formatting don't utterly break it
 		chatData.content.startsWith("/") ||
-		chatData.roll ||
+		chatData.rolls.length ||
 		chatData.emote ||
 		chatData.type == CONST.CHAT_MESSAGE_TYPES.OOC ||
 		//|| Object.keys(chatData.speaker).length == 0
@@ -474,6 +473,11 @@ Hooks.on("createChatMessage", function (chatEntity, _, userId) {
 	}
 });
 
+Hooks.on("renderChatMessage", function (ChatMessage, html, data) {
+	if (Theatre.instance.settings.ignoreMessagesToChat && ChatMessage.flags?.[Theatre.SETTINGS]?.theatreMessage) html[0].style.display = "none";
+	return true;
+});
+
 Hooks.on("renderChatLog", function (app, html, data) {
 	if (data.cssId === "chat-popout") return;
 	theatre.initialize();
@@ -490,8 +494,7 @@ Hooks.on("getActorDirectoryEntryContext", async (html, options) => {
 	if (!game.user.isGM && game.settings.get("theatre", "gmOnly")) return;
 
 	const getActorData = (target) => {
-		const actor = game.actors.get(target.data("documentId"));
-		return actor.data;
+		return game.actors.get(target.data("documentId"));
 	};
 
 	options.splice(
@@ -516,11 +519,8 @@ Hooks.on("getActorDirectoryEntryContext", async (html, options) => {
 var theatre = null;
 Hooks.once("setup", () => {
 	theatre = new Theatre();
-});
 
-Hooks.once("init", () => {
 	// module keybinds
-
 	game.keybindings.register("theatre", "unfocusTextArea", {
 		name: "Theatre.UI.Keybinds.unfocusTextArea",
 		hint: "",
@@ -551,7 +551,7 @@ Hooks.once("init", () => {
 		onDown: () => {
 			const ownedActors = game.actors.filter((a) => a.permission === 3);
 			const ownedTokens = ownedActors.map((a) => a.getActiveTokens());
-			for (const tokenArray of ownedTokens) tokenArray.forEach((t) => Theatre.addToNavBar(t.actor.data));
+			for (const tokenArray of ownedTokens) tokenArray.forEach((t) => Theatre.addToNavBar(t.actor));
 		},
 		restricted: false,
 	});
@@ -566,9 +566,19 @@ Hooks.once("init", () => {
 			},
 		],
 		onDown: () => {
-			for (const tkn of canvas.tokens.controlled) Theatre.addToNavBar(tkn.actor.data);
+			for (const tkn of canvas.tokens.controlled) Theatre.addToNavBar(tkn.actor);
 		},
-		restricted: false,
+		restricted: true,
+	});
+
+	game.keybindings.register("theatre", `removeSelectedFromStage`, {
+		name: "Theatre.UI.Keybinds.removeSelectedFromStage",
+		hint: "",
+		editable: [],
+		onDown: (context) => {
+			for (const tkn of canvas.tokens.controlled) Theatre.removeFromNavBar(tkn.actor);
+		},
+		restricted: true,
 	});
 
 	game.keybindings.register("theatre", "narratorMode", {
@@ -587,7 +597,7 @@ Hooks.once("init", () => {
 
 			document.getElementById("chat-message").blur();
 		},
-		restricted: false,
+		restricted: true,
 	});
 
 	game.keybindings.register("theatre", "flipPortrait", {
@@ -759,7 +769,7 @@ Hooks.once("init", () => {
 
 	for (let i = 1; i < 11; i++) {
 		game.keybindings.register("theatre", `activateStaged${i}`, {
-			name: `Theatre.UI.Keybinds.activateStaged${i}`,
+			name: game.i18n.format(`Theatre.UI.Keybinds.activateStaged`, { number: i }),
 			hint: "",
 			editable: [
 				{
@@ -775,10 +785,11 @@ Hooks.once("init", () => {
 				document.getElementById("chat-message").blur();
 			},
 			restricted: false,
+			reservedModifiers: ["Shift"],
 		});
 
 		game.keybindings.register("theatre", `removeStaged${i}`, {
-			name: `Theatre.UI.Keybinds.removeStaged${i}`,
+			name: game.i18n.format(`Theatre.UI.Keybinds.removeStaged`, { number: i }),
 			hint: "",
 			editable: [
 				{
@@ -791,7 +802,7 @@ Hooks.once("init", () => {
 				const id = ids[i - 1];
 				if (id) Theatre.instance.removeInsertById(id);
 			},
-			restricted: false,
+			restricted: true,
 		});
 	}
 });
diff --git a/app/lang/en.json b/app/lang/en.json
index fa4b048..7646d4b 100644
--- a/app/lang/en.json
+++ b/app/lang/en.json
@@ -1,203 +1,225 @@
 {
-	"I18N.MAINTAINERS" : ["PakkiSukibe"],
+	"I18N.MAINTAINERS": ["PakkiSukibe"],
 
-	"Header.Override.Token" : "Token",
-	"Header.Override.Sheet" : "Sheet",
-	"Header.Override.Import" : "Import",
-	"Header.Override.Close" : "Close",
+	"Header": {
+		"Override": {
+			"Token": "Token",
+			"Sheet": "Sheet",
+			"Import": "Import",
+			"Close": "Close"
+		}
+	},
 
-	"Theatre.UI.Chat.Narrator" : "Narrator",
-
-	"Theatre.UI.Title.EmoteSelector" : "Emote Selector",
-	"Theatre.UI.Title.SuppressTheatre" : "Suppress Theatre",
-	"Theatre.UI.Title.Narrator" : "Narrator Mode",
-	"Theatre.UI.Title.ResyncGM" : "Resync All Player Theatres",
-	"Theatre.UI.Title.ResyncPlayer" : "Resync Theatre to GM",
-	"Theatre.UI.Title.QuoteToggle" : "Automatic Alias Quotes",
-	"Theatre.UI.Title.DelayEmoteToggle" : "Delay Emote Until Message",
-	"Theatre.UI.Title.CinemaSelector" : "Cinematics",
-	"Theatre.UI.Title.AddToStage" : "Add To Staging Area",
-	"Theatre.UI.Title.ConfigureTheatre" : "Configure Theatre Settings For Actor",
-	"Theatre.UI.Title.ChooseEmoteIcon" : "Choose Emote Icon",
-	"Theatre.UI.Title.ChooseEmoteName" : "Change Custom Emote Name",
-	"Theatre.UI.Title.DeleteCustomEmote" : "Delete Custom Emote",
-	"Theatre.UI.Title.FontType" : "Font Type",
-	"Theatre.UI.Title.FontSize" : "Font Size",
-	"Theatre.UI.Title.FontColor" : "Font Color",
-
-	"Theatre.UI.Notification.CannotMoveOwner" : "You must control the actor you wish to move",
-	"Theatre.UI.Notification.CannotMoveControlled" : "Cannot move to a non-player controlled actor",
-	"Theatre.UI.Notification.CannotSwapOwner" : "You must control one of the actors you wish to swap",
-	"Theatre.UI.Notification.CannotSwapControlled" : "Cannot swap with a non-player controlled actor",
-	"Theatre.UI.Notification.DoNotControl" : "You do not control this actor",
-	"Theatre.UI.Notification.CannotPushFront" : "You cannot push this actor to the front as that actor is not player controlled",
-	"Theatre.UI.Notification.CannotPushBack" : "You cannot push this actor to the back as that actor is not player controlled",
-	"Theatre.UI.Notification.ResyncPlayer" : "Resyncing theatre from a connected player: ",
-	"Theatre.UI.Notification.ResyncGM" : "Resyncing theatre with the GM",
-	"Theatre.UI.Notification.AlreadyStaged" : " is already staged",
-	"Theatre.UI.Notification.ImageLoadFail_P1" : "Image load has failed for '",
-	"Theatre.UI.Notification.ImageLoadFail_P2" : "' with path '",
-	"Theatre.UI.Notification.TooLongDecayMin" : "Text decay minimum is too long, setting it to the maximum value 600s",
-	"Theatre.UI.Notification.TooLongDecayRate" : "Text decay rate is too long, setting it to the maximum value 10s",
-	"Theatre.UI.Notification.InvalidDecayMin" : "Text decay minimum is invalid, setting it to the default of 30s",
-	"Theatre.UI.Notification.InvalidDecayRate" : "Text decay rate is invalid, setting it to the default of 1s",
-	"Theatre.UI.Notification.BadCustomEmote" : "Bad custom emote name (must be defined), not submitting Theatre configuration changes",
-	"Theatre.UI.Notification.BadFilepath" : "Bad File Path exists in the submission, rejecting Theatre configuration changes : ",
-
-	"Theatre.UI.Notification.ErrorFatal" : "Fatal Error, please submit console log (f12 -> console) with bug report",
-
-	"Theatre.UI.Settings.displayMode" : "Theatre Bar Display Mode",
-	"Theatre.UI.Settings.displayModeHint" : "The display mode for the text area under a theatre insert. Text Box style is geared for text-based games as it provides a solid background for the text. Light Box style is geared for voice or voice hybrid games with a visual novel look and feel. Clear style is intended for voice only games where text isn't as important since the text *will be difficult to read*; it is more intended as a mode for puppeting the portrait by movements and emotes alone.",
-	"Theatre.UI.Settings.displayModeTextBox" : "Text Box Style",
-	"Theatre.UI.Settings.displayModeLightBox" : "Light Box Style",
-	"Theatre.UI.Settings.displayModeClearBox" : "Clear Box Style",
-	"Theatre.UI.Settings.gmOnly" : "GM controls only",
-	"Theatre.UI.Settings.gmOnlyHint" : "If enabled, only the GM will be able to control the stage. The Theatre controls will be hidden for the players.",
-	"Theatre.UI.Settings.narrHeight" : "Narrator Bar Position",
-	"Theatre.UI.Settings.narrHeightHint" : "The position of the narrator bar as a percentage of the screen height.",
-	"Theatre.UI.Settings.textDecayMin" : "Minimum Text Decay Time",
-	"Theatre.UI.Settings.textDecayMinHint" : "The minimum amount of time in seconds before a theatre text entry will decay.",
-	"Theatre.UI.Settings.textDecayRate" : "Text Decay Rate",
-	"Theatre.UI.Settings.textDecayRateHint" : "The rate at which text will decay, based on the length of the message in seconds. This is applied *per character*, thus a 100 character message is 100s before decay if the decay rate is 1s, OR the minimum decay time, whichever is greater.",
-	"Theatre.UI.Settings.nameFont": "Actor Name Font",
-	"Theatre.UI.Settings.nameFontHint": "Put in the name of the font you want to use. If the font exists in Theatre, it can be used. Requires actors to re-stage or for the GM to resync.",
-	"Theatre.UI.Settings.nameFontSize": "Actor Name Size (Experimental)",
-	"Theatre.UI.Settings.nameFontSizeHint": "Sets the size of the name font. Note that the sizes may be different depending on your display or font choice. Using huge sizes is not recommended.",
-	"Theatre.UI.Settings.autoHideBottom": "Auto Hide Bottom",
-	"Theatre.UI.Settings.autoHideBottomHint": "Hide bottom UI(player&hotbar) when actor shows on stage.",
-	"Theatre.UI.Settings.suppressMacroHotbar": "Show Player List and Macro Hotbar When Stage is Suppressed",
-	"Theatre.UI.Settings.removeLabelSheetHeader": "Remove label from the header character sheet",
-	"Theatre.UI.Settings.removeLabelSheetHeaderHint": "Remove label from the header character sheet, Useful for little screen and mobile",
-
-	"Theatre.UI.Keybinds.unfocusTextArea": "Unfocus Text Area",
-	"Theatre.UI.Keybinds.addOwnedToStage": "Add Owned Actors to Stage",
-	"Theatre.UI.Keybinds.addSelectedToStage": "Add Selected Tokens to Stage",
-	"Theatre.UI.Keybinds.narratorMode": "Activate Narrator Mode",
-	"Theatre.UI.Keybinds.flipPortrait": "Flip Portrait",
-	"Theatre.UI.Keybinds.nudgePortraitLeft": "Nudge Portrait Left",
-	"Theatre.UI.Keybinds.nudgePortraitRight": "Nudge Portrait Right",
-	"Theatre.UI.Keybinds.nudgePortraitUp": "Nudge Portrait Up",
-	"Theatre.UI.Keybinds.nudgePortraitDown": "Nudge Portrait Down",
-	"Theatre.UI.Keybinds.activateStaged1": "Activate Staged Actor Number 1",
-	"Theatre.UI.Keybinds.activateStaged2": "Activate Staged Actor Number 2",
-	"Theatre.UI.Keybinds.activateStaged3": "Activate Staged Actor Number 3",
-	"Theatre.UI.Keybinds.activateStaged4": "Activate Staged Actor Number 4",
-	"Theatre.UI.Keybinds.activateStaged5": "Activate Staged Actor Number 5",
-	"Theatre.UI.Keybinds.activateStaged6": "Activate Staged Actor Number 6",
-	"Theatre.UI.Keybinds.activateStaged7": "Activate Staged Actor Number 7",
-	"Theatre.UI.Keybinds.activateStaged8": "Activate Staged Actor Number 8",
-	"Theatre.UI.Keybinds.activateStaged9": "Activate Staged Actor Number 9",
-	"Theatre.UI.Keybinds.activateStaged10": "Activate Staged Actor Number 10",
-	"Theatre.UI.Keybinds.removeStaged1": "Remove Staged Actor Number 1",
-	"Theatre.UI.Keybinds.removeStaged2": "Remove Staged Actor Number 2",
-	"Theatre.UI.Keybinds.removeStaged3": "Remove Staged Actor Number 3",
-	"Theatre.UI.Keybinds.removeStaged4": "Remove Staged Actor Number 4",
-	"Theatre.UI.Keybinds.removeStaged5": "Remove Staged Actor Number 5",
-	"Theatre.UI.Keybinds.removeStaged6": "Remove Staged Actor Number 6",
-	"Theatre.UI.Keybinds.removeStaged7": "Remove Staged Actor Number 7",
-	"Theatre.UI.Keybinds.removeStaged8": "Remove Staged Actor Number 8",
-	"Theatre.UI.Keybinds.removeStaged9": "Remove Staged Actor Number 9",
-	"Theatre.UI.Keybinds.removeStaged10": "Remove Staged Actor Number 10",
-	
-	"Theatre.MOTD.Header" : "Theatre Notification",
-	"Theatre.MOTD.OldVersion" : "Theatre is currently out of date, please have the GM update theatre in the setup screen.",
-
-	"Theatre.UI.Config.Stage" : "Stage",
-	"Theatre.UI.Config.AddToStage" : "Add to Stage",
-	"Theatre.UI.Config.RemoveFromStage" : "Remove from Stage",
-	"Theatre.UI.Config.Theatre" : "Theatre",
-	"Theatre.UI.Config.ConfigureTheatre" : "Configure Theatre",
-	"Theatre.UI.Config.Main" : "Main",
-	"Theatre.UI.Config.AddEmote" : "Add Emote",
-	"Theatre.UI.Config.ConfigureEmotes" : "Configure Emotes",
-	"Theatre.UI.Config.ConfigureEmote" : "Configure Emote",
-	"Theatre.UI.Config.ConfigureEmotesHint" : "Set emote images for the default set, or add custom emotes.",
-	"Theatre.UI.Config.InsertName" : "Theatre Insert Name/Label",
-	"Theatre.UI.Config.SetTopAlign" : "Set the Top Alignment",
-	"Theatre.UI.Config.SetTopAlignTop" : "Top of Dialog Box",
-	"Theatre.UI.Config.SetTopAlignBottom" : "Bottom of Dialog Box",
-	"Theatre.UI.Config.SetDefaultInsert" : "Set the Default Theatre Insert",
-	"Theatre.UI.Config.BaseInsert" : "Base Theatre Insert",
-	"Theatre.UI.Config.SaveSettings" : "Save Settings",
-	"Theatre.UI.Config.PathPlaceholder" : "path/image.png",
-	"Theatre.UI.Config.CustomEmotePlaceholder" : "Custom Name",
-	"Theatre.UI.Config.DisableDefaultAnim" : "Disable Default Animations",
-	"Theatre.UI.Config.DisableDefaultAnimHint" : "Disables all default animations for emotes, this includes the bubble and any other animation that comes as stock.",
-
-	"Theatre.Text.OpenBracket" : "\"",
-	"Theatre.Text.CloseBracket" : "\"",
-	"Theatre.Text.FontSizeSmall" : "Small",
-	"Theatre.Text.FontSizeNormal" : "Normal",
-	"Theatre.Text.FontSizeLarge" : "Large",
-
-	"Theatre.Emote.Label" : "Emotes",
-	"Theatre.Emote.Happy" : "Happy",
-	"Theatre.Emote.Smile" : "Smile",
-	"Theatre.Emote.Grin" : "Grin",
-	"Theatre.Emote.HappyTears" : "Happy to Tears",
-	"Theatre.Emote.Sad" : "Sad",
-	"Theatre.Emote.Frown" : "Frown",
-	"Theatre.Emote.Cry" : "Crying",
-	"Theatre.Emote.Serious" : "Serious",
-	"Theatre.Emote.Annoyed" : "Annoyed",
-	"Theatre.Emote.Frustrated" : "Frustrated",
-	"Theatre.Emote.Angry" : "Angry",
-	"Theatre.Emote.Laughing" : "Laughing",
-	"Theatre.Emote.LaughingSquint" : "Laughing Squint",
-	"Theatre.Emote.ROFL" : "Laughing Roll",
-	"Theatre.Emote.Worried" : "Worried",
-	"Theatre.Emote.Meh" : "Meh",
-	"Theatre.Emote.Surprised" : "Surprised",
-	"Theatre.Emote.Wink" : "Wink",
-	"Theatre.Emote.Tongue" : "Tongue",
-	"Theatre.Emote.Blushing" : "Blushing",
-	"Theatre.Emote.Hearts" : "Hearts",
-	"Theatre.Emote.Kiss" : "Blow Kiss",
-	"Theatre.Emote.Sleeping" : "Sleeping",
-	"Theatre.Emote.Thinking" : "Thinking",
-	"Theatre.Emote.Smug" : "Smug",
-	"Theatre.Emote.Playful" : "Playful",
-	"Theatre.Emote.Dissatisfied" : "Dissatisfied",
-	"Theatre.Emote.Panic" : "Panic",
-	"Theatre.Emote.Dizzy" : "Dizzy",
-	"Theatre.Emote.Idea" : "Idea",
-	"Theatre.Emote.Confused" : "Confused",
-	"Theatre.Emote.Speechless" : "Speechless",
-	"Theatre.Emote.Awe-Struck" : "Awe-Struck",
-	"Theatre.Emote.Mischevious" : "Mischevious",
-	"Theatre.Emote.Innocent" : "Innocent",
-	"Theatre.Emote.CareFree" : "Care Free",
-	"Theatre.Emote.Scared" : "Scared",
-	"Theatre.Emote.Pleased" : "Pleased",
-	"Theatre.Emote.Lazy" : "Lazy",
-	"Theatre.Emote.Ambitious" : "Ambitious",
-	"Theatre.Emote.Correct" : "Correct",
-	"Theatre.Emote.Wrong" : "Wrong",
-
-	"Theatre.Flyin.Label" : "Fly-In",
-	"Theatre.Flyin.Typewriter" : "Typewriter",
-	"Theatre.Flyin.Fadein" : "Fade-In",
-	"Theatre.Flyin.Slidein" : "Slide-In",
-	"Theatre.Flyin.Scalein" : "Scale-In",
-	"Theatre.Flyin.Fallin" : "Fall-in",
-	"Theatre.Flyin.Spin" : "Spin",
-	"Theatre.Flyin.SpinScale" : "SpinScale",
-	"Theatre.Flyin.Outlaw" : "Outlaw",
-	"Theatre.Flyin.Vortex" : "Vortex",
-	"Theatre.Flyin.Assemble" : "Assemble",
-
-	"Theatre.Standing.Label" : "Standing",
-	"Theatre.Standing.Spooky" : "Spooky",
-	"Theatre.Standing.Insane" : "Insane",
-	"Theatre.Standing.Excited" : "Excited",
-	"Theatre.Standing.Bubbly" : "Bubbly",
-	"Theatre.Standing.Violent" : "Violent",
-	"Theatre.Standing.Impact" : "Impact",
-	"Theatre.Standing.Quiver" : "Quiver",
-	"Theatre.Standing.Wave" : "Wave",
-	"Theatre.Standing.Fade" : "Fade",
-	"Theatre.Standing.None" : "None",
-
-	"Theatre.Other" : "Other",
-	"Theatre.NotYet" : "Not yet implemented"
+	"Theatre": {
+		"UI": {
+			"Chat": { "Narrator": "Narrator" },
+			"Title": {
+				"EmoteSelector": "Emote Selector",
+				"SuppressTheatre": "Suppress Theatre",
+				"Narrator": "Narrator Mode",
+				"ResyncGM": "Resync All Player Theatres",
+				"ResyncPlayer": "Resync Theatre to GM",
+				"QuoteToggle": "Automatic Alias Quotes",
+				"DelayEmoteToggle": "Delay Emote Until Message",
+				"CinemaSelector": "Cinematics",
+				"AddToStage": "Add To Staging Area",
+				"ConfigureTheatre": "Configure Theatre Settings For Actor",
+				"ChooseEmoteIcon": "Choose Emote Icon",
+				"ChooseEmoteName": "Change Custom Emote Name",
+				"DeleteCustomEmote": "Delete Custom Emote",
+				"FontType": "Font Type",
+				"FontSize": "Font Size",
+				"FontColor": "Font Color"
+			},
+			"Notification": {
+				"CannotMoveOwner": "You must control the actor you wish to move",
+				"CannotMoveControlled": "Cannot move to a non-player controlled actor",
+				"CannotSwapOwner": "You must control one of the actors you wish to swap",
+				"CannotSwapControlled": "Cannot swap with a non-player controlled actor",
+				"DoNotControl": "You do not control this actor",
+				"CannotPushFront": "You cannot push this actor to the front as that actor is not player controlled",
+				"CannotPushBack": "You cannot push this actor to the back as that actor is not player controlled",
+				"ResyncPlayer": "Resyncing theatre from a connected player: ",
+				"ResyncGM": "Resyncing theatre with the GM",
+				"AlreadyStaged": " is already staged",
+				"ImageLoadFail_P1": "Image load has failed for '",
+				"ImageLoadFail_P2": "' with path '",
+				"TooLongDecayMin": "Text decay minimum is too long, setting it to the maximum value 600s",
+				"TooLongDecayRate": "Text decay rate is too long, setting it to the maximum value 10s",
+				"InvalidDecayMin": "Text decay minimum is invalid, setting it to the default of 30s",
+				"InvalidDecayRate": "Text decay rate is invalid, setting it to the default of 1s",
+				"BadCustomEmote": "Bad custom emote name (must be defined), not submitting Theatre configuration changes",
+				"BadFilepath": "Bad File Path exists in the submission, rejecting Theatre configuration changes : ",
+				"ErrorFatal": "Fatal Error, please submit console log (f12 -> console) with bug report"
+			},
+			"Settings": {
+				"displayMode": "Theatre Bar Display Mode",
+				"displayModeHint": "The display mode for the text area under a theatre insert. Text Box style is geared for text-based games as it provides a solid background for the text. Light Box style is geared for voice or voice hybrid games with a visual novel look and feel. Clear style is intended for voice only games where text isn't as important since the text *will be difficult to read*; it is more intended as a mode for puppeting the portrait by movements and emotes alone.",
+				"displayModeTextBox": "Text Box Style",
+				"displayModeLightBox": "Light Box Style",
+				"displayModeClearBox": "Clear Box Style",
+				"gmOnly": "GM controls only",
+				"gmOnlyHint": "If enabled, only the GM will be able to control the stage. The Theatre controls will be hidden for the players.",
+				"narrHeight": "Narrator Bar Position",
+				"narrHeightHint": "The position of the narrator bar as a percentage of the screen height.",
+				"textDecayMin": "Minimum Text Decay Time",
+				"textDecayMinHint": "The minimum amount of time in seconds before a theatre text entry will decay.",
+				"textDecayRate": "Text Decay Rate",
+				"textDecayRateHint": "The rate at which text will decay, based on the length of the message in seconds. This is applied *per character*, thus a 100 character message is 100s before decay if the decay rate is 1s, OR the minimum decay time, whichever is greater.",
+				"nameFont": "Actor Name Font",
+				"nameFontHint": "Put in the name of the font you want to use. If the font exists in Theatre, it can be used. Requires actors to re-stage or for the GM to resync.",
+				"nameFontSize": "Actor Name Size (Experimental)",
+				"nameFontSizeHint": "Sets the size of the name font. Note that the sizes may be different depending on your display or font choice. Using huge sizes is not recommended.",
+				"autoHideBottom": "Auto Hide Bottom",
+				"autoHideBottomHint": "Hide bottom UI(player&hotbar) when actor shows on stage.",
+				"suppressMacroHotbar": "Show Player List and Macro Hotbar When Stage is Suppressed",
+				"removeLabelSheetHeader": "Remove label from the header character sheet",
+				"removeLabelSheetHeaderHint": "Remove label from the header character sheet, Useful for little screen and mobile",
+				"ignoreMessagesToChat": "Ignore Theatre Messages From Chat",
+				"ignoreMessagesToChatHint": "Ignores messages sent during Theatre Mode from chat. Disabling this message will make them appear again.",
+				"quoteType": "Quote Type",
+				"quoteTypeHint": "When using the {setting} option, the chosen pattern of quotes will be used.",
+				"quoteTypeChoices": {
+					"0": "'Single Quote'",
+					"1": "\"Double Quotes\"",
+					"2": "【Fāngtóu Kuòhào】",
+					"3": "「Kagikakko」",
+					"4": "『Nijū Kagiyamakakko』"
+				}
+			},
+			"Keybinds": {
+				"unfocusTextArea": "Unfocus Text Area",
+				"addOwnedToStage": "Add Owned Actors to Stage",
+				"addSelectedToStage": "Add Selected Tokens to Stage",
+				"removeSelectedFromStage": "Remove Selected Tokens from Stage",
+				"narratorMode": "Activate Narrator Mode",
+				"flipPortrait": "Flip Portrait",
+				"nudgePortraitLeft": "Nudge Portrait Left",
+				"nudgePortraitRight": "Nudge Portrait Right",
+				"nudgePortraitUp": "Nudge Portrait Up",
+				"nudgePortraitDown": "Nudge Portrait Down",
+				"activateStaged": "Activate Staged Actor Number {number}",
+				"removeStaged": "Remove Staged Actor Number {number}"
+			},
+			"MOTD": {
+				"Header": "Theatre Notification",
+				"OldVersion": "Theatre is currently out of date, please have the GM update theatre in the setup screen."
+			},
+			"Config": {
+				"Stage": "Stage",
+				"AddToStage": "Add to Stage",
+				"RemoveFromStage": "Remove from Stage",
+				"Theatre": "Theatre",
+				"ConfigureTheatre": "Configure Theatre",
+				"Main": "Main",
+				"AddEmote": "Add Emote",
+				"ConfigureEmotes": "Configure Emotes",
+				"ConfigureEmote": "Configure Emote",
+				"ConfigureEmotesHint": "Set emote images for the default set, or add custom emotes.",
+				"InsertName": "Theatre Insert Name/Label",
+				"SetTopAlign": "Set the Top Alignment",
+				"SetTopAlignTop": "Top of Dialog Box",
+				"SetTopAlignBottom": "Bottom of Dialog Box",
+				"SetDefaultInsert": "Set the Default Theatre Insert",
+				"BaseInsert": "Base Theatre Insert",
+				"SaveSettings": "Save Settings",
+				"PathPlaceholder": "path/image.png",
+				"CustomEmotePlaceholder": "Custom Name",
+				"DisableDefaultAnim": "Disable Default Animations",
+				"DisableDefaultAnimHint": "Disables all default animations for emotes, this includes the bubble and any other animation that comes as stock."
+			}
+		},
+		"Text": {
+			"OpenBracket": {
+				"0": "'",
+				"1": "\"",
+				"2": "【",
+				"3": "「",
+				"4": "『"
+			},
+			"CloseBracket": {
+				"0": "'",
+				"1": "\"",
+				"2": "】",
+				"3": "」",
+				"4": "』"
+			},
+			"FontSizeSmall": "Small",
+			"FontSizeNormal": "Normal",
+			"FontSizeLarge": "Large"
+		},
+		"Emote": {
+			"Label": "Emotes",
+			"Happy": "Happy",
+			"Smile": "Smile",
+			"Grin": "Grin",
+			"HappyTears": "Happy to Tears",
+			"Sad": "Sad",
+			"Frown": "Frown",
+			"Cry": "Crying",
+			"Serious": "Serious",
+			"Annoyed": "Annoyed",
+			"Frustrated": "Frustrated",
+			"Angry": "Angry",
+			"Laughing": "Laughing",
+			"LaughingSquint": "Laughing Squint",
+			"ROFL": "Laughing Roll",
+			"Worried": "Worried",
+			"Meh": "Meh",
+			"Surprised": "Surprised",
+			"Wink": "Wink",
+			"Tongue": "Tongue",
+			"Blushing": "Blushing",
+			"Hearts": "Hearts",
+			"Kiss": "Blow Kiss",
+			"Sleeping": "Sleeping",
+			"Thinking": "Thinking",
+			"Smug": "Smug",
+			"Playful": "Playful",
+			"Dissatisfied": "Dissatisfied",
+			"Panic": "Panic",
+			"Dizzy": "Dizzy",
+			"Idea": "Idea",
+			"Confused": "Confused",
+			"Speechless": "Speechless",
+			"Awe-Struck": "Awe-Struck",
+			"Mischevious": "Mischevious",
+			"Innocent": "Innocent",
+			"CareFree": "Care Free",
+			"Scared": "Scared",
+			"Pleased": "Pleased",
+			"Lazy": "Lazy",
+			"Ambitious": "Ambitious",
+			"Correct": "Correct",
+			"Wrong": "Wrong"
+		},
+		"Flyin": {
+			"Label": "Fly-In",
+			"Typewriter": "Typewriter",
+			"Fadein": "Fade-In",
+			"Slidein": "Slide-In",
+			"Scalein": "Scale-In",
+			"Fallin": "Fall-in",
+			"Spin": "Spin",
+			"SpinScale": "SpinScale",
+			"Outlaw": "Outlaw",
+			"Vortex": "Vortex",
+			"Assemble": "Assemble"
+		},
+		"Standing": {
+			"Label": "Standing",
+			"Spooky": "Spooky",
+			"Insane": "Insane",
+			"Excited": "Excited",
+			"Bubbly": "Bubbly",
+			"Violent": "Violent",
+			"Impact": "Impact",
+			"Quiver": "Quiver",
+			"Wave": "Wave",
+			"Fade": "Fade",
+			"None": "None"
+		},
+		"Other": "Other",
+		"NotYet": "Not yet implemented"
+	}
 }
diff --git a/app/packs/theatre-inserts-macros.db b/app/packs/theatre-inserts-macros.db
index 4850cc4..744890d 100644
--- a/app/packs/theatre-inserts-macros.db
+++ b/app/packs/theatre-inserts-macros.db
@@ -1,2 +1,2 @@
-{"name":"Add Owned Tokens to Stage","type":"script","author":"2eCcEi9HdTwCxqFx","img":"icons/svg/dice-target.svg","scope":"global","command":"const ownedActors = game.actors.filter(a => a.permission === 3);\nconst ownedTokens = ownedActors.map(a => a.getActiveTokens());\n\nfor (const tokenArray of ownedTokens) {\n    tokenArray.forEach(t => Theatre.addToNavBar(t.actor.data));\n}","folder":null,"sort":0,"permission":{"default":0,"2eCcEi9HdTwCxqFx":3},"flags":{"core":{"sourceId":"Macro.bnLRubdIw6rmj4CB"}},"_id":"O4bIjZLeC6KYwdj2"}
-{"name":"Add Selected Tokens to Stage","type":"script","author":"2eCcEi9HdTwCxqFx","img":"icons/svg/dice-target.svg","scope":"global","command":"for (const tkn of canvas.tokens.controlled) {\n    Theatre.addToNavBar(tkn.actor.data);\n}","folder":null,"sort":0,"permission":{"default":0,"2eCcEi9HdTwCxqFx":3},"flags":{"core":{"sourceId":"Macro.ue9fFNkWIxT3Y5hK"}},"_id":"SiNOxyDFzz7V1ptf"}
+{"name":"Add Owned Tokens to Stage","type":"script","author":"2eCcEi9HdTwCxqFx","img":"icons/svg/dice-target.svg","scope":"global","command":"const ownedActors = game.actors.filter(a => a.permission === 3);\nconst ownedTokens = ownedActors.map(a => a.getActiveTokens());\n\nfor (const tokenArray of ownedTokens) {\n    tokenArray.forEach(t => Theatre.addToNavBar(t.actor));\n}","folder":null,"sort":0,"permission":{"default":0,"2eCcEi9HdTwCxqFx":3},"flags":{"core":{"sourceId":"Macro.bnLRubdIw6rmj4CB"}},"_id":"O4bIjZLeC6KYwdj2"}
+{"name":"Add Selected Tokens to Stage","type":"script","author":"2eCcEi9HdTwCxqFx","img":"icons/svg/dice-target.svg","scope":"global","command":"for (const tkn of canvas.tokens.controlled) {\n    Theatre.addToNavBar(tkn.actor);\n}","folder":null,"sort":0,"permission":{"default":0,"2eCcEi9HdTwCxqFx":3},"flags":{"core":{"sourceId":"Macro.ue9fFNkWIxT3Y5hK"}},"_id":"SiNOxyDFzz7V1ptf"}