From f1003b1852720be756dc8a89b4b354cd2cfc1d1e Mon Sep 17 00:00:00 2001 From: Matheus Clemente 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..settings. - * second : actor.data.flags.theatre.settings. + * first : actor.flags.theatre..settings. + * second : actor.flags.theatre.settings. * third : Theatre.instance.userEmotes[]. * * @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(/\[\s\S]*\<\/div\>/) + !chatMessage.content.match(/\[\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"}