taulukko-common-scripts-dnd5ed 1.0.13 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(){"use strict";var hasRequiredStrings,hasRequiredDates,dist={},dates={},strings={};function requireStrings(){if(hasRequiredStrings)return strings;hasRequiredStrings=1,Object.defineProperty(strings,"__esModule",{value:!0}),strings.StringsUtil=void 0;return strings.StringsUtil=class{left(str,n){return n>0?str.slice(0,n):""}trim(str){return str.trim()}right(str,n){return n>0?str.slice(-n):""}repeat(str,n,separator){return n>0?Array.from({length:n},()=>str).join(separator):""}leftPadding(str,n,paddingValue){return n>0?str.padStart(n,paddingValue).slice(-n):""}rightPadding(str,n,paddingValue){return n>0?str.padEnd(n,paddingValue).slice(0,n):""}count(str,find){return str.split(find).length-1}hashNumber(str){let i,chr,hashCode=0;if(0===str.length)return hashCode;for(i=0;i<str.length;i++)chr=str.codePointAt(i),hashCode=(hashCode<<5)-hashCode+chr,hashCode|=0;return hashCode}hashString(str){return this.hashNumber(str).toString(36)}},strings}function requireDates(){if(hasRequiredDates)return dates;hasRequiredDates=1,Object.defineProperty(dates,"__esModule",{value:!0}),dates.DatesUtil=void 0;const strings_1=requireStrings();return dates.DatesUtil=class{stringUtil=new strings_1.StringsUtil;addDays(date,days){const ret=new Date(date);return ret.setDate(date.getDate()+days),ret}parseYYYYMMDDHHMMSS(dateStr){if(14!==dateStr.length)throw new Error("Date format YYYYMMDDHHMMSS incorrect!");const time=this.stringUtil.right(dateStr,6);if(isNaN(Number(time)))throw new Error("Time must be numeric integer");const hour=this.stringUtil.left(time,2);if(isNaN(Number(hour)))throw new Error("Hour must be numeric integer");const minute=this.stringUtil.left(this.stringUtil.right(time,4),2);if(isNaN(Number(minute)))throw new Error("Minute must be numeric integer");const second=this.stringUtil.right(time,2);if(isNaN(Number(second)))throw new Error("Second must be numeric integer");const date=this.parseYYYYMMDD(this.stringUtil.left(dateStr,8));return date.setHours(Number.parseInt(hour,10)),date.setMinutes(Number.parseInt(minute,10)),date.setSeconds(Number.parseInt(second,10)),date}parseYYYYMMDD(dateStr){if(8!==dateStr.length)throw new Error("Date format YYYYMMDD incorrect!");const yearStr=this.stringUtil.left(dateStr,4);if(isNaN(Number(yearStr)))throw new Error("Year must be numeric integer");const monthStr=this.stringUtil.right(this.stringUtil.left(dateStr,6),2);if(isNaN(Number(monthStr)))throw new Error("Month must be numeric integer");const dayStr=this.stringUtil.right(dateStr,2);if(isNaN(Number(dayStr)))throw new Error("Day must be numeric integer");return this.parse(Number.parseInt(yearStr,10),Number.parseInt(monthStr,10),Number.parseInt(dayStr,10))}parse(year,month,day,hour=0,minute=0,second=0){return new Date(year,month-1,day,hour,minute,second)}getYear(date){return date.getFullYear()}getMonth(date){return date.getMonth()+1}getMonthIndex(date){return date.getMonth()}getDay(date){return date.getDate()}getDayOfWeak(date){return date.getDay()+1}getDayOfWeakIndex(date){return date.getDay()}toString(date,size=14){if(size<1)return"";size>14&&(size=14);const fullStr=`${date.getFullYear().toString().padStart(4,"0")}${(date.getMonth()+1).toString().padStart(2,"0")}${date.getDate().toString().padStart(2,"0")}${date.getHours().toString().padStart(2,"0")}${date.getMinutes().toString().padStart(2,"0")}${date.getSeconds().toString().padStart(2,"0")}`;return this.stringUtil.left(fullStr,size)}},dates}var hasRequiredKeyTool,keyTool={};var hasRequiredObjects,objects={};var hasRequiredInjectFactory,injectController$1={},InjectFactory={};function requireInjectFactory(){if(hasRequiredInjectFactory)return InjectFactory;hasRequiredInjectFactory=1,Object.defineProperty(InjectFactory,"__esModule",{value:!0}),InjectFactory.InjectorFactory=void 0;return InjectFactory.InjectorFactory=class{factory;constructor(factory){this.factory=factory}build(){return this.factory()}},InjectFactory}var hasRequiredInjectController$1,hasRequiredInjectController,injectController={};function requireInjectController$1(){if(hasRequiredInjectController$1)return injectController;hasRequiredInjectController$1=1,Object.defineProperty(injectController,"__esModule",{value:!0}),injectController.injectController=void 0;const InjectFactory_1=requireInjectFactory();return injectController.injectController=new class{registrations=new Map;registerByClass(factory){let key;return key=factory instanceof InjectFactory_1.InjectorFactory?factory.build().constructor.name:factory.constructor.name,this.registerByName(key,factory)}registerByName(key,factory){return this.registrations.set(key,factory),this}resolve(key){if(!this.registrations.has(key))throw new Error("key ["+key+"] not registered");const registration=this.registrations.get(key);return registration instanceof InjectFactory_1.InjectorFactory?registration.build():registration}has(key){return"string"!=typeof key&&(key=key.constructor.name),this.registrations.has(key)}clearAll(){return this.registrations.clear(),this}unregister(key){return"string"!=typeof key&&(key=key.constructor.name),this.registrations.delete(key),this}},injectController}var hasRequiredLog$1,log$1={},log={};function requireLog$1(){return hasRequiredLog$1||(hasRequiredLog$1=1,exports$1=log,Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.Level=void 0,(Level=exports$1.Level||(exports$1.Level={})).CRITICAL="CRITICAL",Level.ERROR="ERROR",Level.WARN="WARN",Level.INFO="INFO",Level.DEBUG="DEBUG"),log;var exports$1,Level}var hasRequiredLogGeneric,hasRequiredLog,hasRequiredDist,logGeneric={};function requireLog(){return hasRequiredLog||(hasRequiredLog=1,function(exports$1){Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.BUILD_DATE_KEY=exports$1.LogGenericImpl=exports$1.Level=void 0;var log_1=requireLog$1();Object.defineProperty(exports$1,"Level",{enumerable:!0,get:function(){return log_1.Level}});var log_generic_1=(hasRequiredLogGeneric||(hasRequiredLogGeneric=1,function(exports$1){Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.LogGenericImpl=exports$1.BUILD_DATE_KEY=void 0;const dates_1=requireDates(),inject_controller_1=requireInjectController$1(),log_1=requireLog$1();exports$1.BUILD_DATE_KEY="LogGenericImpl.BuildDate";const levelNumericMap={[log_1.Level.DEBUG]:0,[log_1.Level.INFO]:1,[log_1.Level.WARN]:2,[log_1.Level.ERROR]:3,[log_1.Level.CRITICAL]:4};exports$1.LogGenericImpl=class{#level=log_1.Level.INFO;#critical;#error;#warn;#info;#debug;#options;#buildDate;#dateUtil=new dates_1.DatesUtil;constructor(options={prefix:"",hasDate:!0,hasLevel:!0,format:""}){this.#critical=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.CRITICAL)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.CRITICAL):console.error,this.#error=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.ERROR)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.ERROR):console.error,this.#warn=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.WARN)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.WARN):console.warn,this.#info=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.INFO)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.INFO):console.info,this.#debug=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.DEBUG)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.DEBUG):console.debug,this.#buildDate=inject_controller_1.injectController.has(exports$1.BUILD_DATE_KEY)?inject_controller_1.injectController.resolve(exports$1.BUILD_DATE_KEY):()=>new Date,this.#options=options}level(level=void 0){return null!=level&&(this.#level=level),this.#level}isCompatible(level){const currentLevelValue=levelNumericMap[this.#level];return levelNumericMap[level]>=currentLevelValue}log(logFunction,level,...args){if(!this.isCompatible(level))return;const dateString=this.#dateUtil.toString(this.#buildDate(),14),messageParts=[];this.#options.prefix&&messageParts.push(this.#options.prefix),this.#options.hasLevel&&messageParts.push(`[${level}]`),this.#options.hasDate&&messageParts.push(dateString);const constructedPrefix=messageParts.join(" ");constructedPrefix?logFunction(constructedPrefix,...args):logFunction(...args)}critical(...args){this.log(this.#critical,log_1.Level.CRITICAL,...args)}error(...args){this.log(this.#error,log_1.Level.ERROR,...args)}warn(...args){this.log(this.#warn,log_1.Level.WARN,...args)}info(...args){this.log(this.#info,log_1.Level.INFO,...args)}debug(...args){this.log(this.#debug,log_1.Level.DEBUG,...args)}}}(logGeneric)),logGeneric);Object.defineProperty(exports$1,"LogGenericImpl",{enumerable:!0,get:function(){return log_generic_1.LogGenericImpl}}),Object.defineProperty(exports$1,"BUILD_DATE_KEY",{enumerable:!0,get:function(){return log_generic_1.BUILD_DATE_KEY}})}(log$1)),log$1}var distExports=(hasRequiredDist||(hasRequiredDist=1,function(exports$1){Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.BUILD_DATE_KEY=exports$1.LogGenericImpl=exports$1.Level=exports$1.InjectorFactory=exports$1.injectController=exports$1.StringsUtil=exports$1.ObjectsUtil=exports$1.KeyTool=exports$1.DatesUtil=void 0;var dates_js_1=requireDates();Object.defineProperty(exports$1,"DatesUtil",{enumerable:!0,get:function(){return dates_js_1.DatesUtil}});var key_tool_js_1=function(){if(hasRequiredKeyTool)return keyTool;hasRequiredKeyTool=1,Object.defineProperty(keyTool,"__esModule",{value:!0}),keyTool.KeyTool=void 0;const strings_1=requireStrings();return keyTool.KeyTool=class{stringUtil=new strings_1.StringsUtil;generateUUID(){var d=(new Date).getTime(),d2="undefined"!=typeof performance&&performance.now&&1e3*performance.now()||0;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(c){var r=16*Math.random();return d>0?(r=(d+r)%16|0,d=Math.floor(d/16)):(r=(d2+r)%16|0,d2=Math.floor(d2/16)),("x"===c?r:3&r|8).toString(16)})}build(cluster,proccessID){if(cluster>=1e3||cluster<0)throw new Error("Cluster must be between 0-999");if(proccessID<0)throw new Error("ProccessID must be >= 0");proccessID%=1e6;const random=this.stringUtil.right("0000"+Math.round(9999*Math.random()),4),uuidPart=this.generateUUID();return"10"+this.stringUtil.right("000"+cluster,3)+this.stringUtil.right("000000"+proccessID,6)+random+"--"+uuidPart}},keyTool}();Object.defineProperty(exports$1,"KeyTool",{enumerable:!0,get:function(){return key_tool_js_1.KeyTool}});var objects_js_1=(hasRequiredObjects||(hasRequiredObjects=1,Object.defineProperty(objects,"__esModule",{value:!0}),objects.ObjectsUtil=void 0,objects.ObjectsUtil=class{shallowCopy(data){return JSON.parse(JSON.stringify(data))}partialCopy(from,to,fields){const ret=this.shallowCopy(to);for(const field of fields)ret[field]=from[field];return ret}}),objects);Object.defineProperty(exports$1,"ObjectsUtil",{enumerable:!0,get:function(){return objects_js_1.ObjectsUtil}});var strings_js_1=requireStrings();Object.defineProperty(exports$1,"StringsUtil",{enumerable:!0,get:function(){return strings_js_1.StringsUtil}});var inject_controller_1=(hasRequiredInjectController||(hasRequiredInjectController=1,function(exports$1){Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.injectController=exports$1.InjectorFactory=void 0;var InjectFactory_1=requireInjectFactory();Object.defineProperty(exports$1,"InjectorFactory",{enumerable:!0,get:function(){return InjectFactory_1.InjectorFactory}});var inject_controller_1=requireInjectController$1();Object.defineProperty(exports$1,"injectController",{enumerable:!0,get:function(){return inject_controller_1.injectController}})}(injectController$1)),injectController$1);Object.defineProperty(exports$1,"injectController",{enumerable:!0,get:function(){return inject_controller_1.injectController}}),Object.defineProperty(exports$1,"InjectorFactory",{enumerable:!0,get:function(){return inject_controller_1.InjectorFactory}});var log_1=requireLog();Object.defineProperty(exports$1,"Level",{enumerable:!0,get:function(){return log_1.Level}}),Object.defineProperty(exports$1,"LogGenericImpl",{enumerable:!0,get:function(){return log_1.LogGenericImpl}}),Object.defineProperty(exports$1,"BUILD_DATE_KEY",{enumerable:!0,get:function(){return log_1.BUILD_DATE_KEY}})}(dist)),dist);function showMessage(message){distExports.injectController.resolve("Log").debug(`Message: ${message}!`)}function add(a,b){return distExports.injectController.resolve("Log").debug("The addition is performed."),a+b}class ModuleBase{#ready=!1;isReady(){return this.#ready}async init(){this.initHooks(),await this.waitReady(),this.#ready=!0}async whaitFor(test,timeout=6e4,sleep=100){const logguer=distExports.injectController.resolve("Log");let totalTime=0;return new Promise((resolve,reject)=>{const handle=setInterval(()=>{if(logguer.debug("Total time:",totalTime," for function ",test),test())return clearInterval(handle),void resolve();totalTime>timeout&&(logguer.debug("Timeout for test:",test),clearInterval(handle),reject(new Error("timeout while wait For in common module"))),totalTime+=sleep},sleep)})}}class SubModuleBase extends ModuleBase{}const docRegionUtils=document,REGION_UTILS_REGISTERED_NAMES_MODULE_NAME="common-assets",REGION_UTILS_REGISTERED_NAMES_TOOGLE_VISIBILITY="common-assets-toogle-visibility-regions";class RegionUtils extends SubModuleBase{#requiredHooksLoaded=!1;initHooks(){Hooks.on("onInitCommonModule",()=>{const regionUtils=distExports.injectController.resolve("RegionUtils");distExports.injectController.resolve("Log").info("Loading Region Utils"),regionUtils.registerKeybindings(),regionUtils.#requiredHooksLoaded=!0})}async waitReady(){const logguer=distExports.injectController.resolve("Log");if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyRegionUtils",{}),logguer.debug("Region Utils ready")}sendMessageToChat(senderid,message){const chatData={user:senderid,speaker:"Game Master",content:message,whisper:game.users.filter(u=>u.isGM).map(u=>u._id)};ChatMessage.create(chatData,{})}stop(event){const logguer=distExports.injectController.resolve("Log"),shape=event?.region?.shapes[0];if(logguer.debug("event:",event,",shape:",shape),!shape)return void logguer.error("shape not found");const width=shape.width,height=shape.height,newX=shape.x+Math.round(width/2),newY=shape.y+Math.round(height/2),token=event?.data?.token;token.x=newX,token.y=newY,logguer.debug("Token indo para x:",newX,",y:",newY),token.update({x:token.x,y:token.y})}toggleVisibilityRegions(){const logguer=distExports.injectController.resolve("Log");logguer.debug("toggleVisibilityRegions called");const activeScene=game.scenes.current;activeScene?activeScene.regions.forEach(region=>{distExports.injectController.resolve("Log").debug("region",region),region.update({visibility:!region.visibility})}):logguer.error("No scene active")}registerKeybindings(){game.keybindings.register(REGION_UTILS_REGISTERED_NAMES_MODULE_NAME,REGION_UTILS_REGISTERED_NAMES_TOOGLE_VISIBILITY,{name:"Alternar visão das regiões da cena",hint:"Liga/desliga visibilidade das regiões da cena atual.",editable:[{key:"KeyG",modifiers:["Shift"]}],onDown:async()=>{docRegionUtils.COMMON_MODULE.debug("onDown will be called"),docRegionUtils.COMMON_MODULE.REGION_UTILS.toggleVisibilityRegions()},restricted:!0,reservedModifiers:[],precedence:CONST.KEYBINDING_PRECEDENCE.NORMAL})}}class PlayersTools extends SubModuleBase{#requiredHooksLoaded=!1;initHooks(){Hooks.on("onReadyCommonModule",async()=>{const playersTools=distExports.injectController.resolve("PlayersTools");distExports.injectController.resolve("Log").info("Starting Hability hero processing"),playersTools.initializeFlyMeasure(),playersTools.#requiredHooksLoaded=!0})}async waitReady(){if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyPlayersTools",{})}initializeFlyMeasure(){distExports.injectController.resolve("Log").debug("initlizeFlyMeasure init")}}class Button{constructor(action,label,defaultValue=!1,type="screen",callback){this.action=action,this.label=label,this.defaultValue=defaultValue,this.type=type,this.callback=callback}}class NPC{constructor(name,imageUrl,formatSound="ogg"){this.name=name,this.imageUrl=imageUrl,this.formatSound=formatSound}DEFAULT_STYLE="\n\t\t\t\t\t<style>\n\t\t\t\t\t.select-action { padding: 20px; background: #222; color: #eee; }\n\t\t\t\t\t.select-action button { margin: 5px; padding: 5px 10px; }\n\t\t\t\t\t.brizola-actions-buttons { display: flex; flex-direction: column; gap: 8px; }\n\t\t\t\t";actor;groups=new Set;screens=new Array;async whaitFor(test,timeout=6e4,sleep=100){const logguer=distExports.injectController.resolve("Log");let totalTime=0;return new Promise((resolve,reject)=>{const handle=setInterval(()=>{if(logguer.debug("Total time:",totalTime," for function ",test),test())return clearInterval(handle),void resolve(void 0);totalTime>timeout&&(logguer.debug("Timeout for test:",test),clearInterval(handle),reject(new Error("timeout while wait For in common module"))),totalTime+=sleep},sleep)})}async init(){if(await this.whaitFor(()=>distExports.injectController.resolve("NPCDialog"),3e5),!distExports.injectController.resolve("NPCDialog"))throw new Error("Timeout waiting for hooks");if(await this.whaitFor(()=>distExports.injectController.resolve("DialogUtils"),3e5),!distExports.injectController.resolve("DialogUtils"))throw new Error("Timeout waiting for hooks");const npcDialog=distExports.injectController.resolve("NPCDialog");this.screens.push({name:"npc-dialog",callback:npcDialog.showNPCChooseDialog})}decrementGroup(){const npcDialog=distExports.injectController.resolve("NPCDialog"),newArray=[...npcDialog.activeNPC.groups].slice(0,-1);npcDialog.activeNPC.groups=new Set(newArray)}getAlias(){return this.name.toLocaleLowerCase()}async createDialog(title,content,options,submits){const npcDialog=distExports.injectController.resolve("NPCDialog"),dialogUtils=distExports.injectController.resolve("DialogUtils"),loguer=distExports.injectController.resolve("Log"),alias=npcDialog.activeNPC.getAlias();let innerContent=`\n\t\t<DIV class="${alias}-actions-buttons">\n\t\t\t<SELECT>\n\t\t\t\t<option selected="selected" value="${alias}-random">Aleatório dado o contexto até aqui</option>\n\t\t`;options.forEach(option=>{const backAction=`${alias}-back`,sendAction=`${alias}-send`,cancelction=`${alias}-cancel`;option.action!=backAction&&option.action!=sendAction&&option.action!=cancelction&&(loguer.debug("NPC.createDialog:5 for,button:",option),innerContent+=`\n\t\t\t\t<option value="${option.action}">${option.label} </option>\n\t\t\t`)}),innerContent+="\n\t\t\t</SELECT>\n\t\t</DIV>\n\t\t",loguer.debug("NPC.createDialog:10",options),loguer.debug("NPC.createDialog:15:activeNPC.groups:",npcDialog.activeNPC.groups),submits||(loguer.debug("NPC.createDialog:20"),submits=[dialogUtils.createButton("send","Enviar",!0,"action",async()=>{loguer.debug("NPC.createDialog, before creating send:",npcDialog.activeNPC.groups),loguer.debug("NPC.createDialog [10]: Escolhido a opcao enviar");const queryResult=document.querySelector(`.${alias}-actions-buttons SELECT`)||null,result=queryResult?.value;if(null!=result){if(loguer.debug("NPC.createDialog [20]: depois de selecionar o resultado",result),result===`${alias}-random`){const lastScreen=npcDialog.activeNPC.screens.at(-1);return npcDialog.activeNPC.screens.push({name:result,callback:npcDialog.activeNPC.send,type:lastScreen.type}),loguer.debug("NPC.createDialog, before random send:",npcDialog.activeNPC.groups),npcDialog.activeNPC.send(!1),void loguer.debug("NPC.createDialog, after random send:",npcDialog.activeNPC.groups)}options.forEach(button=>{button.action==result&&(loguer.debug("NPC.Enviado a opcao :"+result),npcDialog.activeNPC.screens.push({name:result,callback:button.callback,type:button.type}),button.callback(),loguer.debug("NPC.createDialog, after 3 creating send:",npcDialog.activeNPC.groups))})}else loguer.error("NPC.createDialog: Erro ao obter a opcao selecionada")}),dialogUtils.createButton("back","Voltar",!0,"action",async()=>{loguer.debug("NPC.screens ao voltar - antes: ",npcDialog.activeNPC.screens);const previousLastScreen=npcDialog.activeNPC.screens.at(-2),lastScreen=npcDialog.activeNPC.screens.pop();loguer.debug("lastScreen:",lastScreen),loguer.debug("screens ao voltar - depois: ",npcDialog.activeNPC.screens),"screen-context"==lastScreen.type&&npcDialog.activeNPC.decrementGroup(),previousLastScreen.callback()}),dialogUtils.createButton("cancel","Cancelar",!0,"action",async()=>{loguer.debug("NPC.Cancelado a tela do ",alias)})],loguer.debug("NPC.createDialog:25. Create submits",submits),loguer.debug("NPC.createDialog:30 - depois de criar submits"));loguer.debug("NPC.createDialog:40 - antes de criar dialogo"),dialogUtils.createDialog(title,npcDialog.activeNPC.DEFAULT_STYLE,innerContent,submits,[(action,label,defaultValue,callback)=>{}],200,void 0,400),loguer.debug("NPC.createDialog:50 - depois de criar dialogo")}async getListLinesFromGroup(groupsUnordered){const npcDialog=distExports.injectController.resolve("NPCDialog"),loguer=distExports.injectController.resolve("Log"),groups=Array.from(groupsUnordered).map(Number).sort((a,b)=>a-b);if(0===groups.length&&0===groupsUnordered.size)return new Array;if(0===groups.length&&groups.push(Number.parseInt(groupsUnordered.get(0),10)),1==groups.length)return groups;let combinations=await npcDialog.activeNPC.getCombinations(groups);return loguer.debug("groups:",groups),loguer.debug("keys:",combinations),combinations}async getCombinations(numbers,separator=";"){const npcDialog=distExports.injectController.resolve("NPCDialog"),loguer=distExports.injectController.resolve("Log"),ret=new Array;if(0==numbers.length||1==numbers.length)return[...numbers];loguer.debug("numbers:",numbers);const generate=(start,path)=>{loguer.debug("generate start:",start,",path",path);let combinationKey=numbers.join(";");if(loguer.debug("combinationKey:",combinationKey),loguer.debug("groupToLines:",npcDialog.activeNPC.groupToLines,"-",typeof combinationKey),npcDialog.activeNPC.groupToLines.has(combinationKey))return loguer.debug("find, return the combination"),ret.push(combinationKey),ret;loguer.debug("combinationKey not found:",combinationKey);for(let i=start;i<numbers.length;i++){const newCombinationGroup=[...path,numbers[i]];loguer.debug("novaCombinacao:",newCombinationGroup),combinationKey=newCombinationGroup.join(";"),ret.push(combinationKey),generate(i+1,newCombinationGroup)}};return generate(0,[]),ret}async speak(lineIndex){const npcDialog=distExports.injectController.resolve("NPCDialog"),loguer=distExports.injectController.resolve("Log"),line=npcDialog.activeNPC.lines[lineIndex];loguer.debug("speak:talk:",line),loguer.debug("disparando o evento pra todo mundo:"),console.log("[NPC Portrait] Enviando para todos..."),await ChatMessage.create({content:"NPC Portrait Event",whisper:Array.from(game.users?.values()||[]).map(u=>u.id),flags:{"forgotten-realms":{type:"npcDialogOnTalk",payload:{imageUrl:this.imageUrl,npcName:this.name,dialogText:line}}}}),loguer.debug(" evento disparado pra todo mundo:");const formatedIndex=lineIndex.toString().padStart(3,"0"),name=npcDialog.activeNPC.name,src=`modules/forgotten-realms/sounds/npcs/${name}/${formatedIndex}/${name}${formatedIndex}.${npcDialog.activeNPC.formatSound}`,ret=await this.playSoundWithNoEffect(src);loguer.debug("Retorno do play:",ret)}async playSoundWithNoEffect(src){distExports.injectController.resolve("NPCDialog");const loguer=distExports.injectController.resolve("Log");try{const response=await fetch(src,{method:"HEAD"});return response.ok?(foundry.audio.AudioHelper.play({src:src,autoplay:!0},!0),!0):(console.warn(`Arquivo não encontrado: ${src} (${response.status})`),!1)}catch(error){return loguer.error("Erro ao reproduzir o som:",src,error),!1}}async send(removeLastGroup=!0){const npcDialog=distExports.injectController.resolve("NPCDialog"),loguer=distExports.injectController.resolve("Log");0===npcDialog.activeNPC.groups.size&&npcDialog.activeNPC.groups.add("999");const list=await npcDialog.activeNPC.getListLinesFromGroup(npcDialog.activeNPC.groups);loguer.debug("NPC.send, before send,list:",list);const lines=new Array;for(const groupNumber of list){const group=groupNumber.toString();if(loguer.debug("group:",group),!npcDialog.activeNPC.groupToLines.has(group)){loguer.warn(`NPC.send, afterSend:Grupo ${group} não encontrado em groupToLines!`);continue}const size=group.split(";").length+1,linesForThisGroupConcat=npcDialog.activeNPC.groupToLines.get(group);loguer.debug("NPC.send, 50,linesForThisGroupConcat:",linesForThisGroupConcat,"-size:",size);const linesForThisGroup=linesForThisGroupConcat.split(";");loguer.debug("NPC.send, 60,linesForThisGroup:",linesForThisGroup),linesForThisGroup.forEach(line=>{for(let i=0;i<size;i++)lines.push(line)})}loguer.debug("NPC.send, afterSend,lines:",lines);let randomIndex=Math.abs(Math.round(Math.random()*lines.length));randomIndex=randomIndex>=lines.length?lines.length-1:randomIndex,loguer.debug("NPC.send, afterSend,randomIndex:",randomIndex);const lineIndex=Number.parseInt(lines[randomIndex],10);loguer.debug("NPC.send, afterSend,lineIndex:",lineIndex),npcDialog.activeNPC.speak(lineIndex),loguer.debug("NPC.send, afterSend,activeScreen:",npcDialog.activeNPC.screens);const activeScreen=npcDialog.activeNPC.screens.at(-2);npcDialog.activeNPC.screens.pop(),activeScreen.callback(),npcDialog.activeNPC.groups.delete("999"),removeLastGroup&&npcDialog.activeNPC.decrementGroup(),loguer.debug("NPC.send, afterSend:",npcDialog.activeNPC.groups)}}class NPCPortraitDialog extends Application{imageUrl;npcName;dialogText;constructor(options={}){super(),this.imageUrl=options.imageUrl||"YOUR_IMAGE_URL_HERE",this.npcName=options.npcName||"NPC",this.dialogText=options.dialogText||"Olá, aventureiro..."}static get defaultOptions(){return foundry.utils.mergeObject(Application.defaultOptions,{id:"npc-portrait-dialog",classes:["npc-portrait-app"],title:"",width:600,height:400,resizable:!1,minimizable:!1,popOut:!0})}get template(){return"modules/common-scripts-dnd5ed/scripts/templates/npc-talk.hbs"}async getData(){return{imageUrl:this.imageUrl,npcName:this.npcName,dialogText:this.dialogText}}activateListeners(html){super.activateListeners(html),html.on("click",".close-button",()=>{this.close()})}static renderTalk(data){new NPCPortraitDialog({imageUrl:data.imageUrl,npcName:data.npcName,dialogText:data.dialogText}).render(!0)}async showToAllPlayers(){if(this.render(!0),game.user?.isGM){const socketPayload={type:"showNPCPortrait",data:{imageUrl:this.imageUrl,npcName:this.npcName,dialogText:this.dialogText}};game.socket.emit("module.seu-modulo",socketPayload)}}}console.log("npcDialog.ts loaded 10");class NPCDialog extends SubModuleBase{npcSelected;activeNPC;npcs=new Map;buttonloaded=!1;#requiredHooksLoaded=!1;initHooks(){Hooks.on("createChatMessage",async message=>{const logguer=distExports.injectController.resolve("Log"),npcDialog=distExports.injectController.resolve("NPCDialog");if(await npcDialog.whaitFor(()=>distExports.injectController.has("DialogUtils"),3e5),distExports.injectController.has("DialogUtils"))try{if(logguer.debug("createChatMessage recebido..."),"npcDialogOnTalk"===message.flags?.["common-assets"]?.type){const data=message.flags["common-assets"].payload;logguer.debug("[NPC Portrait] Evento recebido dos jogadores:",data),NPCPortraitDialog.renderTalk(data)}}catch(e){logguer.error("[NPC Portrait] Erro ao processar evento:",e)}else logguer.error("Givup chat message ",message," because timeout wiaiting for DialogUtils")}),Hooks.on("getSceneControlButtons",async controls=>{const logguer=distExports.injectController.resolve("Log"),npcDialog=distExports.injectController.resolve("NPCDialog");await npcDialog.whaitFor(()=>distExports.injectController.has("DialogUtils"),3e5),distExports.injectController.has("DialogUtils")?(logguer.debug("On getSceneControlButtons 05...",controls,npcDialog),await npcDialog.addNPCButtons(controls),npcDialog.#requiredHooksLoaded=!0,logguer.debug("On getSceneControlButtons...:20")):logguer.error("Givup getSceneControlButtons ",controls," because timeout wiaiting for DialogUtils")})}async waitReady(){if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyNPCDialog",{})}async addNPCButtons(controls){const logguer=distExports.injectController.resolve("Log"),npcDialog=distExports.injectController.resolve("NPCDialog");game.user.isGM?(logguer.debug("Criando botão dos NPCs especiais",controls),controls.tokens.tools.npcButton={name:"npcButton",title:"NPCs Especiais",icon:"fa-solid fa-web-awesome",button:!0,toggle:!1,onClick:()=>{logguer.debug("Botão de NPCs especiais pressionado"),console.log("npcDialog",npcDialog),npcDialog.showNPCChooseDialog(),logguer.debug("Após abrir janela de NPCs especiais")}},logguer.debug("Botão de NPC criado")):logguer.debug("NPC Buttons off")}async showNPCChooseDialog(){const logguer=distExports.injectController.resolve("Log"),npcDialog=distExports.injectController.resolve("NPCDialog"),dialogUtils=distExports.injectController.resolve("DialogUtils");logguer.debug("Botão NPCsespecial pressionado, mostrando diálogo...");logguer.debug("showNPCChooseDialog:10 before creating buttons",npcDialog);let buttons=[];npcDialog.npcs.forEach(npc=>{logguer.debug("showNPCChooseDialog:15 add NPC ",npc.name,npc),buttons.push(dialogUtils.createButton(npc.name.toLocaleLowerCase(),npc.name,!0,"screen",npcDialog.callNPC(npc)))}),buttons.push(dialogUtils.createButton("cancel","Cancel",!1,"screen")),logguer.debug("showNPCChooseDialog:20 after creating buttons"),dialogUtils.createDialog("Escolha um NPC Especial","\n\t\t\t\t\t.select-npc { padding: 20px; background: #222; color: #eee; }\n\t\t\t\t\t.select-npc button { margin: 5px; padding: 5px 10px; }\n\t\t\t\t\t",'\n\t\t\t\t\t<div class="select-npc">\n\t\t\t\t\t<H1>Escolha uma opção:</H1> \n\t\t\t\t\t</div>',buttons,void 0,200,void 0,400),logguer.debug("showNPCChooseDialog:30 after createDialog")}helpSubmit='\n\t\t\tSubmit need be a function:\n\t\t\t(action,label,defaultValue,callback)=>{\n\t\t\t\treturn result => {\n\t\t\t\t\t\tif ( result === "minsc" ) console.log("User picked minsc options.");\n\t\t\t\t\t\telse console.log("User picked option: ", rsult );\n\t\t\t\t\t}\n\t\t\t}\n\t\t\t';async callNPC(npc){const npcDialog=distExports.injectController.resolve("NPCDialog");distExports.injectController.resolve("Log").debug("Selecionado ...",npc),npcDialog.npcSelected=npc,await npcDialog.npcSelected.startScreen()}}class DialogUtils extends SubModuleBase{npctype=NPC;NPC_DIALOG=new NPCDialog;#requiredHooksLoaded=!1;async waitReady(){const logguer=distExports.injectController.resolve("Log");if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyDialogUtils",{}),logguer.debug("Dialog Utils ready")}initHooks(){Hooks.on("onReadyCommonModule",async data=>{const dialogUtils=distExports.injectController.resolve("DialogUtils");distExports.injectController.resolve("Log").debug("Dialog Utils loading on onReadyCommonModule"),dialogUtils.#requiredHooksLoaded=!0})}createButton(action,label,defaultValue=!1,type="screen",callback=void 0){return new Button(action,label,defaultValue,type,callback)}createDialog(title,style="",content="",buttons=new Array,submit=new Array,left=void 0,top=void 0,width="auto",height="auto"){const logguer=distExports.injectController.resolve("Log");if(logguer.debug("Dialog Utils creating dialog width: ",width," height: ",height),!buttons?.length||0===buttons.length)throw new Error("DIALOG_UTILS.createDialog: buttons array must have at least one button");const options={window:{title:title,resizable:!0},content:`<style>${style}</style>\t\n\t\t\t\t\t<div>${content}</div>`,buttons:buttons,submit:submit,position:{width:width,height:height,left:left,top:top}};logguer.debug("Dialog Utils dialog options: ",options);const ret=new foundry.applications.api.DialogV2(options);return ret.render({force:!0}),ret}}class HeroPoints extends SubModuleBase{#requiredHooksLoaded=!1;initHooks(){Hooks.on("onReadyDialogUtils",async()=>{const heroPoints=distExports.injectController.resolve("HeroPoints");distExports.injectController.resolve("Log").info("Starting Hability hero processing"),heroPoints.initializeHabilityHero(),heroPoints.#requiredHooksLoaded=!0})}async waitReady(){if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyHeroPoints",{})}removeAttribute(sheet){const logguer=distExports.injectController.resolve("Log");let htmldivs=document.querySelectorAll("div.ability-score[data-ability='hon']");0!=htmldivs.length?(logguer.debug("Hability hero removed, npc sheet detected"),htmldivs.forEach(div=>div.remove())):logguer.debug("This sheet not contain honrror field or system not enable honrror field")}addEditButtonsToHeroPoints(parent){const logguer=distExports.injectController.resolve("Log");if(!game.user.isGM)return;let elements=parent?.querySelectorAll("div.mod span.operator.increment");if(0==elements.length)return void logguer.error("Hability Hero operator increment not found");let increment=elements.item(0);increment.onclick=e=>{e.preventDefault();const scoreInputs=document.querySelectorAll("form.editable div.ability-score.flipped[data-ability='hon'] input");if(1!=scoreInputs.length)return void logguer.error("Hability hero increment hero points not found input to increment ore found more then one, close others sheets before changing hero points");const scoreInput=scoreInputs.item(0);if(null==scoreInput.value||""==scoreInput.value)return void logguer.error("Hability hero increment hero points not found input value to increment");const newScore=Number.parseInt(scoreInput.value,10)+1;scoreInput.value=newScore.toString(),logguer.debug(`Hability hero increment hero points to ${newScore}`)},elements=parent?.querySelectorAll("div.mod span.operator.reduce"),0!=elements.length?(increment=elements.item(0),increment.onclick=e=>{e.preventDefault();const scoreInputs=document.querySelectorAll("form.editable div.ability-score.flipped[data-ability='hon'] input");if(1!=scoreInputs.length)return void logguer.error("Hability hero increment hero points not found input to increment ore found more then one, close others sheets before changing hero points");const scoreInput=scoreInputs.item(0);if(null==scoreInput.value||""==scoreInput.value)return void logguer.error("Hability hero increment hero points not found input value to increment, close others sheets before changing hero points");const currentScore=Number.parseInt(scoreInput.value,10);if(0==currentScore)return void logguer.error("You haven´t hero points to decrement");const newScore=Math.floor(currentScore/2);scoreInput.value=newScore.toString(),logguer.debug(`Hability hero decrement hero points to ${newScore}`)}):logguer.error("Hability Hero operator reduce not found")}createDialog(element){const logguer=distExports.injectController.resolve("Log"),dialogUtils=distExports.injectController.resolve("DialogUtils");let dialog={};element.onclick=e=>{e.preventDefault(),logguer.debug("clicou na habilidade");const cancelButton=dialogUtils.createButton("cancel","Cancelar",!0,"action",html=>{dialog.close()});logguer.debug("Hero Points dialog closed."),dialog=dialogUtils.createDialog("Sobre Hero Points","",'\n\t\t<div class="hero-points-info-content"> \n\t\t\t<img class="heroic-action-img"\n\t\t\t\tsrc="/modules/common-assets/images/cover/heropoint.webp"\n\t\t\t\talt="Ícone representando uma ação heróica em um RPG de fantasia"\n\t\t\t\t/> \n\n\t\t\t<p>\n\t\t\t\t<strong>Hero Points</strong> são semelhantes a pontos de inspiração, mas não são limitados a 1. \n\t\t\t\tVocê começa com zero pontos e eles são acumulativos, diferente de inspiração, em que se pode ter apenas 1 ponto ativo.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\t<strong>Como obter:</strong> quando chegar na sua vez, se você fizer algo que incremente não somente o seu \n\t\t\t\tbackground como o de algum colega (semelhante ao ponto de inspiração, mas sem precisar se colocar em situação ruim),\n\t\t\t\tvocê ganha 1 ponto. A ação deve melhorar a história tanto do seu personagem quanto a dos demais jogadores.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\t<strong>Exemplo de ação heróica:</strong> você sabe que um meio-orc do grupo tem fobia de aranha. \n\t\t\t\tO mestre descreve uma aranha se aproximando e o jogador dono do personagem não percebe. \n\t\t\t\tVocê decide atacar a aranha antes que seu colega se desespere e note a presença dela. \n\t\t\t\tOu, se você é um bardo e sabe que um dos jogadores teve um amor perdido, \n\t\t\t\tcanta uma música na sua rodada para dar inspiração dizendo que é sobre o amor perdido desse personagem. \n\t\t\t\tÉ importante que tudo faça sentido na história atual, na história do outro jogador e na sua própria. \n\t\t\t\tVocê pode inclusive ajustar a narração, por exemplo, inventando que havia uma aranha que o mestre nem citou \n\t\t\t\te dizer que a matou com uma flecha antes que seu amigo entrasse em pânico.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\tA jogada deve ser rápida e já pensada durante a vez dos outros; você não pode parar para planejar apenas quando sua vez começa. \n\t\t\t\tEla precisa ser ágil para incrementar a narração. Se tudo isso for atendido e o mestre concordar, \n\t\t\t\t1 ponto de heroísmo é acrescentado ao personagem.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\t<strong>Usando uma Ação Heróica (gastando pontos):</strong> o ponto ganho pode ser gasto para realizar uma ação especial envolvendo dois personagens; \n\t\t\t\to alvo pode ser um jogador ou um NPC, aliado ou inimigo.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\t<strong>Como reduzir os pontos:</strong> apenas o Mestre pode reduzir ou aumentar o valor total. Os pontos não são gastos de 1 em 1, quando os pontos são gastos, \n\t\t\t\tdivide-se o total por 2 (arredondando para baixo). \n\t\t\t\tExemplos: se você tem 5 pontos, passa a ter 2; se tem 3, passa a ter 1; se tem 1 ponto, passa a ter 0.\n\t\t\t</p>\n\t\t</div>\n\t\t\t\t\t',[cancelButton],new Array)}}changeHabilityHonrrorToHeroPoints(sheet){const logguer=distExports.injectController.resolve("Log"),forms=document.querySelectorAll("form.sheet"),isEditable=forms.item(0)?.classList.contains("editable")??!1;0!=forms.length?(logguer.debug("Hability hero found : "+forms.length),forms.forEach(form=>{form.querySelectorAll("div.ability-score.flipped[data-ability='hon']").forEach(divElement=>{const heroPoints=distExports.injectController.resolve("HeroPoints"),logguer2=distExports.injectController.resolve("Log"),div=divElement;if(logguer2.debug("found one hability "+div.innerHTML,",isEditable",isEditable),1!=div.querySelectorAll("div.score").length)return void logguer2.error("Hability hero not enable to convert for hero, your cmpaing not use? Code error: 02");let score=div.querySelectorAll("div.score").item(0)?.innerHTML??"0";if(!game.user.isGM){let scoreInput=div.querySelectorAll("input");isEditable&&(score=scoreInput.item(0).value)}logguer2.debug("Hability hero score: ",score),div.innerHTML=`\n\t\t\t\t<label class="common-assets attribute" title="clique para mais informações">hero</label>\n\t\t\t\t<div class="mod">\n\t\t\t\t\t<span class="operator reduce" title"para editar, altere o personagem para o modo editável"></span>\n\t\t\t\t\t<span class="operator increment" title"para editar, altere o personagem para o modo editável"></span>\n\t\t\t\t</div>\n\t\t\t\t<div class="score">${score}</div>\n\t\t\t\t`,heroPoints.addEditButtonsToHeroPoints(div);const label=div.querySelectorAll("label")?.item(0);null!=label?heroPoints.createDialog(label):logguer2.warn("Hability hero not enable to convert for hero, your cmpaing not use? Code error: 01")})})):logguer.error("Hability hero not enable to convert for hero, your cmpaing not use? Code error: 01")}initializeHabilityHero(){Hooks.on("renderDocumentSheetV2",async data=>{const heroPoints=distExports.injectController.resolve("HeroPoints"),logguer=distExports.injectController.resolve("Log"),sheet=data;if(sheet.actor){if(logguer.debug("Hability hero called ",sheet),"character"!=sheet.actor.type)return heroPoints.removeAttribute(sheet),void logguer.debug("Hability hero ignoreted sheet because isnt a player sheet, type:",sheet.actor.type);heroPoints.changeHabilityHonrrorToHeroPoints(sheet)}else logguer.debug("Isnt a actor sheet")})}}class HideUnidentify extends SubModuleBase{#requiredHooksLoaded=!0;async waitReady(){if(!this.#requiredHooksLoaded)throw new Error("This module is created ready, no need to wait for hooks");Hooks.callAll("onReadyHideUnidentify",{})}initHooks(){Hooks.on("renderItemSheet5e",(sheet,options)=>{const logguer=distExports.injectController.resolve("Log"),hideUnidentify=distExports.injectController.resolve("HideUnidentify");logguer.debug("dnd5e.renderItemSheet5e called"),hideUnidentify.removeItemSheetIdentifyInformations(sheet,options)}),Hooks.on("dnd5e.getItemContextOptions",(item,buttons)=>{const logguer=distExports.injectController.resolve("Log"),hideUnidentify=distExports.injectController.resolve("HideUnidentify");logguer.debug("dnd5e.getItemContextOptions called"),hideUnidentify.removeButtonsFromItemContext(item,buttons)})}removeButtonsFromItemContext(item,buttons){const logguer=distExports.injectController.resolve("Log");if(logguer.debug("removeButtonsFromItemContext called"),game.user.isGM)return void logguer.debug("is GM - not removing Identify button from Item Sheet context menu");if(item.system.identified)return void logguer.debug("Item:",item.name," - Item is identified - not removing Identify button from Item Sheet context menu");["DND5E.Identify","DND5E.ContextMenuActionAttune"].forEach(buttonName=>{const index=buttons.findIndex(option=>option.name===buttonName);-1!==index&&(logguer.debug("Item:",item.name," - Removing",buttonName,"button from Item Sheet context menu at index",index),buttons.splice(index,1))})}removeItemSheetIdentifyInformations(sheet,option){const logguer=distExports.injectController.resolve("Log");if(logguer.debug("removeButtonsFromItemContext called"),game.user.isGM)return void logguer.debug("is GM - not removing Identify button from Item Sheet context menu");sheet.item.system.identified||(document.querySelectorAll(".dnd5e.sheet.item .sheet-header .item-subtitle label:has(input:not([disabled]))").forEach(n=>n.remove()),document.querySelectorAll(".toggle-identified").forEach(n=>n.remove()))}}class DummySocket extends SubModuleBase{initHooks(){Hooks.once("onReadyCommonModule",async()=>{this.init()})}async waitReady(){Hooks.callAll("onReadyCommonSocket",{})}async executeForAll(eventName,...data){distExports.injectController.resolve("Log").debug("Socket dummy executeForAll for event:",eventName,",parameters: ",data,"...parameters",...data)}async executeAsGM(eventName,...data){const logguer=distExports.injectController.resolve("Log");if(!game.user||!game.users)throw new Error("Game isnt complete prepareted yet, player and gm isnt filled the information. Wait for game ready event ");logguer.debug("Socket dummy executeAsGM for event:",eventName,",parameters: ",data,"...parameters",...data)}async executeToGM(eventName,...data){distExports.injectController.resolve("Log").debug("Socket dummy executeAsGM for event:",eventName,",parameters: ",data,"...parameters",...data)}async executeIn(eventName,users,...data){}isReadyToSendToGM(){return!1}async register(eventName,callback){}}const COMMON_REGISTERED_NAMES_MODULE_VERSION="common-assets-version",doc$1=document;const commonModule=new class extends ModuleBase{name="common-assets";version="1.0.6";startVersion="";#debug=!0;#hooksRequiredLoaded=!1;async addInitCommonAssetsChanges(){const logguer=distExports.injectController.resolve("Log"),commonModule=distExports.injectController.resolve("CommonModule");logguer.debug("addInitCommonAssetsChanges:20,register commnModule:",commonModule),this.registerSetting(COMMON_REGISTERED_NAMES_MODULE_VERSION)}async init(){await super.init(),await this.loadSubModules()}async loadSubModules(){[new RegionUtils,new PlayersTools,new DialogUtils,new HeroPoints,new HideUnidentify].forEach(async subModule=>{distExports.injectController.registerByClass(subModule),await subModule.init()});const commonSocket=new DummySocket;distExports.injectController.registerByName("Socket",commonSocket)}async waitReady(){if(await this.whaitFor(()=>this.#hooksRequiredLoaded,3e5),!this.#hooksRequiredLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyCommonModule",{})}initHooks(){Hooks.once("init",async()=>{const commonModule=distExports.injectController.resolve("CommonModule");distExports.injectController.resolve("Log").info("Módulo Common Assets inicalizando..."),await commonModule.addInitCommonAssetsChanges()}),Hooks.once("ready",async()=>{const commonModule=distExports.injectController.resolve("CommonModule"),logguer=distExports.injectController.resolve("Log");if(!commonModule.version)return void logguer.error("Módulo Common Assets não está instalado ou não foi iniciado corretamente.");game.user.isGM&&(logguer.debug("GM detected, adding isGM class to body"),document.body.classList.add("isGM")),logguer.debug(`Getting the old version with key:${COMMON_REGISTERED_NAMES_MODULE_VERSION}`);const instalatedVersion=await commonModule.getSettings(COMMON_REGISTERED_NAMES_MODULE_VERSION);await commonModule.addReadyCommonAssetsChanges(),Hooks.once("onReadyCommonSocket",async()=>{const logguer=distExports.injectController.resolve("Log"),commonSocket=distExports.injectController.resolve("Socket");logguer.debug("onReadyCommonSocket 20"),commonSocket.register("showMessage",showMessage),commonSocket.register("add",add),logguer.debug("Socketlib finish the register events");try{if(commonSocket.isReadyToSendToGM())if(logguer.debug("Gm esta pronto pra receber mensagens test1"),commonSocket.executeForAll("showMessage","test1"),logguer.debug("Depois de usar executeForAll test1"),game.user.isGM){logguer.debug("Before executeAsGM add 5+6");let result2=await commonSocket.executeAsGM("add",5,6);logguer.debug(`The result of executeAsGM add 5+6 is: ${result2}`),await commonSocket.executeAsGM("showMessage","test2"),logguer.debug("depois de executeAsGM test2")}else{commonSocket.executeForAll("showMessage","test3"),logguer.debug("Depois de executeForAll");try{logguer.debug("Before executeAsGM test4"),await commonSocket.executeAsGM("showMessage","test4"),logguer.debug("depois de executeAsGM test4")}catch(e){logguer.debug("erro ao tentar executar executeAsGM sendo apenas jogador",e)}}else logguer.debug("A minha implementacao notou que o gm nao foi carregado ainda 1");logguer.debug("Before executeForAll test5"),commonSocket.executeForAll("showMessage","test5"),logguer.debug("depois de executeForAll test5"),logguer.debug("Before executeToGM test6"),commonSocket.executeToGM("showMessage","test6"),logguer.debug("depois de executeToGM test6");let userids=game.users.map(u=>u.id);logguer.debug("Meu userid",game.user.id),userids=userids.filter(id=>(distExports.injectController.resolve("Log").debug("id recebido e meu user id",id,game.user.id),id!=game.user.id)),logguer.debug("Ids dos outros jogadores",userids);let randomNumber=Math.round(1e3*Math.random())+1e3,randomIndex=Math.round(userids.length*Math.random());randomIndex=randomIndex==userids.length?randomIndex-1:randomIndex;const userid=userids.at(randomIndex);logguer.debug(`Sending to player random: ${userid} , I am userid: ${game.user.id} and number random is ${randomNumber}`);let result=await commonSocket.executeIn("add",[userid],randomNumber,1);logguer.debug(`The player random calculated: ${result}`),logguer.debug("Antes do executeIn test7"),commonSocket.executeIn("showMessage",[userid],"teste7:"+game.user.id),logguer.debug("Depois do showMessage test7")}catch(e){logguer.debug("Common socket error",e)}}),this.#hooksRequiredLoaded=!0,instalatedVersion!==commonModule.version?(await commonModule.updateVersions(instalatedVersion,commonModule.version),logguer.info(`Módulo Common Assets atualizado de ${instalatedVersion} para ${commonModule.version} e carregado com sucesso!`)):logguer.info(`Módulo Common Assets v.${commonModule.version} carregado com sucesso!`)})}async addReadyCommonAssetsChanges(){const logguer=distExports.injectController.resolve("Log");logguer.info("Criando botão de ajuda de rolagem");const el=doc$1.getElementById("roll-privacy");if(!el)return void logguer.error("Menu privacy não encontrado");const botao=doc$1.createElement("button");botao.textContent="?",botao.className="ui-control icon fa-solid fa-help common-assets-help",botao.addEventListener("click",event=>{event.preventDefault();const journal=game.journal.getName("Como Rolar Dados");logguer.info("Mensagem exibida ao clicar no botão ?"),journal?journal.sheet.render(!0):logguer.error("Journal não instalado!")}),el.appendChild(botao),logguer.info("Botão de ajuda de rolagem criado")}async registerSetting(key,type=String){const commonModule=distExports.injectController.resolve("CommonModule");await game.settings.register(commonModule.name,key,{type:type})}async setSettings(key,value){const commonModule=distExports.injectController.resolve("CommonModule");await game.settings.set(commonModule.name,key,value)}async getSettings(key){const commonModule=distExports.injectController.resolve("CommonModule");return await game.settings.get(commonModule.name,key)}async updateVersions(instalatedVersion,nextVersionUpdated){instalatedVersion!==nextVersionUpdated&&(this.warnAboutUpdate(instalatedVersion,nextVersionUpdated),instalatedVersion=nextVersionUpdated,await this.setSettings(COMMON_REGISTERED_NAMES_MODULE_VERSION,instalatedVersion))}async warnAboutUpdate(previousVersion,lastVersion){distExports.injectController.resolve("Log").info(`Atualizando da versão : ${previousVersion} para a versão ${lastVersion}`)}debug(debug){return void 0!==debug&&(this.#debug=debug),this.#debug}},doc=document,logguer=new distExports.LogGenericImpl({format:"",prefix:"CA",hasDate:!0,hasLevel:!0});distExports.injectController.registerByName("FoundryDocument",doc),distExports.injectController.registerByName("CommonModule",commonModule),distExports.injectController.registerByName("Log",logguer),commonModule.init(),window.TaulukkoCommon={NPC:NPC,NPCDialog:NPCDialog,DialogUtils:DialogUtils,ModuleBase:ModuleBase,SubModuleBase:SubModuleBase,injectController:distExports.injectController,Logguer:distExports.LogGenericImpl,Level:distExports.Level}}();
|
|
1
|
+
!function(){"use strict";var hasRequiredStrings,hasRequiredDates,dist={},dates={},strings={};function requireStrings(){if(hasRequiredStrings)return strings;hasRequiredStrings=1,Object.defineProperty(strings,"__esModule",{value:!0}),strings.StringsUtil=void 0;return strings.StringsUtil=class{left(str,n){return n>0?str.slice(0,n):""}trim(str){return str.trim()}right(str,n){return n>0?str.slice(-n):""}repeat(str,n,separator){return n>0?Array.from({length:n},()=>str).join(separator):""}leftPadding(str,n,paddingValue){return n>0?str.padStart(n,paddingValue).slice(-n):""}rightPadding(str,n,paddingValue){return n>0?str.padEnd(n,paddingValue).slice(0,n):""}count(str,find){return str.split(find).length-1}hashNumber(str){let i,chr,hashCode=0;if(0===str.length)return hashCode;for(i=0;i<str.length;i++)chr=str.codePointAt(i),hashCode=(hashCode<<5)-hashCode+chr,hashCode|=0;return hashCode}hashString(str){return this.hashNumber(str).toString(36)}},strings}function requireDates(){if(hasRequiredDates)return dates;hasRequiredDates=1,Object.defineProperty(dates,"__esModule",{value:!0}),dates.DatesUtil=void 0;const strings_1=requireStrings();return dates.DatesUtil=class{stringUtil=new strings_1.StringsUtil;addDays(date,days){const ret=new Date(date);return ret.setDate(date.getDate()+days),ret}parseYYYYMMDDHHMMSS(dateStr){if(14!==dateStr.length)throw new Error("Date format YYYYMMDDHHMMSS incorrect!");const time=this.stringUtil.right(dateStr,6);if(isNaN(Number(time)))throw new Error("Time must be numeric integer");const hour=this.stringUtil.left(time,2);if(isNaN(Number(hour)))throw new Error("Hour must be numeric integer");const minute=this.stringUtil.left(this.stringUtil.right(time,4),2);if(isNaN(Number(minute)))throw new Error("Minute must be numeric integer");const second=this.stringUtil.right(time,2);if(isNaN(Number(second)))throw new Error("Second must be numeric integer");const date=this.parseYYYYMMDD(this.stringUtil.left(dateStr,8));return date.setHours(Number.parseInt(hour,10)),date.setMinutes(Number.parseInt(minute,10)),date.setSeconds(Number.parseInt(second,10)),date}parseYYYYMMDD(dateStr){if(8!==dateStr.length)throw new Error("Date format YYYYMMDD incorrect!");const yearStr=this.stringUtil.left(dateStr,4);if(isNaN(Number(yearStr)))throw new Error("Year must be numeric integer");const monthStr=this.stringUtil.right(this.stringUtil.left(dateStr,6),2);if(isNaN(Number(monthStr)))throw new Error("Month must be numeric integer");const dayStr=this.stringUtil.right(dateStr,2);if(isNaN(Number(dayStr)))throw new Error("Day must be numeric integer");return this.parse(Number.parseInt(yearStr,10),Number.parseInt(monthStr,10),Number.parseInt(dayStr,10))}parse(year,month,day,hour=0,minute=0,second=0){return new Date(year,month-1,day,hour,minute,second)}getYear(date){return date.getFullYear()}getMonth(date){return date.getMonth()+1}getMonthIndex(date){return date.getMonth()}getDay(date){return date.getDate()}getDayOfWeak(date){return date.getDay()+1}getDayOfWeakIndex(date){return date.getDay()}toString(date,size=14){if(size<1)return"";size>14&&(size=14);const fullStr=`${date.getFullYear().toString().padStart(4,"0")}${(date.getMonth()+1).toString().padStart(2,"0")}${date.getDate().toString().padStart(2,"0")}${date.getHours().toString().padStart(2,"0")}${date.getMinutes().toString().padStart(2,"0")}${date.getSeconds().toString().padStart(2,"0")}`;return this.stringUtil.left(fullStr,size)}},dates}var hasRequiredKeyTool,keyTool={};var hasRequiredObjects,objects={};var hasRequiredInjectFactory,injectController$1={},InjectFactory={};function requireInjectFactory(){if(hasRequiredInjectFactory)return InjectFactory;hasRequiredInjectFactory=1,Object.defineProperty(InjectFactory,"__esModule",{value:!0}),InjectFactory.InjectorFactory=void 0;return InjectFactory.InjectorFactory=class{factory;constructor(factory){this.factory=factory}build(){return this.factory()}},InjectFactory}var hasRequiredInjectController$1,hasRequiredInjectController,injectController={};function requireInjectController$1(){if(hasRequiredInjectController$1)return injectController;hasRequiredInjectController$1=1,Object.defineProperty(injectController,"__esModule",{value:!0}),injectController.injectController=void 0;const InjectFactory_1=requireInjectFactory();return injectController.injectController=new class{registrations=new Map;registerByClass(factory){let key;return key=factory instanceof InjectFactory_1.InjectorFactory?factory.build().constructor.name:factory.constructor.name,this.registerByName(key,factory)}registerByName(key,factory){return this.registrations.set(key,factory),this}resolve(key){if(!this.registrations.has(key))throw new Error("key ["+key+"] not registered");const registration=this.registrations.get(key);return registration instanceof InjectFactory_1.InjectorFactory?registration.build():registration}has(key){return"string"!=typeof key&&(key=key.constructor.name),this.registrations.has(key)}clearAll(){return this.registrations.clear(),this}unregister(key){return"string"!=typeof key&&(key=key.constructor.name),this.registrations.delete(key),this}},injectController}var hasRequiredLog$1,log$1={},log={};function requireLog$1(){return hasRequiredLog$1||(hasRequiredLog$1=1,exports$1=log,Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.Level=void 0,(Level=exports$1.Level||(exports$1.Level={})).CRITICAL="CRITICAL",Level.ERROR="ERROR",Level.WARN="WARN",Level.INFO="INFO",Level.DEBUG="DEBUG"),log;var exports$1,Level}var hasRequiredLogGeneric,hasRequiredLog,hasRequiredDist,logGeneric={};function requireLog(){return hasRequiredLog||(hasRequiredLog=1,function(exports$1){Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.BUILD_DATE_KEY=exports$1.LogGenericImpl=exports$1.Level=void 0;var log_1=requireLog$1();Object.defineProperty(exports$1,"Level",{enumerable:!0,get:function(){return log_1.Level}});var log_generic_1=(hasRequiredLogGeneric||(hasRequiredLogGeneric=1,function(exports$1){Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.LogGenericImpl=exports$1.BUILD_DATE_KEY=void 0;const dates_1=requireDates(),inject_controller_1=requireInjectController$1(),log_1=requireLog$1();exports$1.BUILD_DATE_KEY="LogGenericImpl.BuildDate";const levelNumericMap={[log_1.Level.DEBUG]:0,[log_1.Level.INFO]:1,[log_1.Level.WARN]:2,[log_1.Level.ERROR]:3,[log_1.Level.CRITICAL]:4};exports$1.LogGenericImpl=class{#level=log_1.Level.INFO;#critical;#error;#warn;#info;#debug;#options;#buildDate;#dateUtil=new dates_1.DatesUtil;constructor(options={prefix:"",hasDate:!0,hasLevel:!0,format:""}){this.#critical=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.CRITICAL)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.CRITICAL):console.error,this.#error=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.ERROR)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.ERROR):console.error,this.#warn=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.WARN)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.WARN):console.warn,this.#info=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.INFO)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.INFO):console.info,this.#debug=inject_controller_1.injectController.has("LogGenericImpl."+log_1.Level.DEBUG)?inject_controller_1.injectController.resolve("LogGenericImpl."+log_1.Level.DEBUG):console.debug,this.#buildDate=inject_controller_1.injectController.has(exports$1.BUILD_DATE_KEY)?inject_controller_1.injectController.resolve(exports$1.BUILD_DATE_KEY):()=>new Date,this.#options=options}level(level=void 0){return null!=level&&(this.#level=level),this.#level}isCompatible(level){const currentLevelValue=levelNumericMap[this.#level];return levelNumericMap[level]>=currentLevelValue}log(logFunction,level,...args){if(!this.isCompatible(level))return;const dateString=this.#dateUtil.toString(this.#buildDate(),14),messageParts=[];this.#options.prefix&&messageParts.push(this.#options.prefix),this.#options.hasLevel&&messageParts.push(`[${level}]`),this.#options.hasDate&&messageParts.push(dateString);const constructedPrefix=messageParts.join(" ");constructedPrefix?logFunction(constructedPrefix,...args):logFunction(...args)}critical(...args){this.log(this.#critical,log_1.Level.CRITICAL,...args)}error(...args){this.log(this.#error,log_1.Level.ERROR,...args)}warn(...args){this.log(this.#warn,log_1.Level.WARN,...args)}info(...args){this.log(this.#info,log_1.Level.INFO,...args)}debug(...args){this.log(this.#debug,log_1.Level.DEBUG,...args)}}}(logGeneric)),logGeneric);Object.defineProperty(exports$1,"LogGenericImpl",{enumerable:!0,get:function(){return log_generic_1.LogGenericImpl}}),Object.defineProperty(exports$1,"BUILD_DATE_KEY",{enumerable:!0,get:function(){return log_generic_1.BUILD_DATE_KEY}})}(log$1)),log$1}var distExports=(hasRequiredDist||(hasRequiredDist=1,function(exports$1){Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.BUILD_DATE_KEY=exports$1.LogGenericImpl=exports$1.Level=exports$1.InjectorFactory=exports$1.injectController=exports$1.StringsUtil=exports$1.ObjectsUtil=exports$1.KeyTool=exports$1.DatesUtil=void 0;var dates_js_1=requireDates();Object.defineProperty(exports$1,"DatesUtil",{enumerable:!0,get:function(){return dates_js_1.DatesUtil}});var key_tool_js_1=function(){if(hasRequiredKeyTool)return keyTool;hasRequiredKeyTool=1,Object.defineProperty(keyTool,"__esModule",{value:!0}),keyTool.KeyTool=void 0;const strings_1=requireStrings();return keyTool.KeyTool=class{stringUtil=new strings_1.StringsUtil;generateUUID(){var d=(new Date).getTime(),d2="undefined"!=typeof performance&&performance.now&&1e3*performance.now()||0;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(c){var r=16*Math.random();return d>0?(r=(d+r)%16|0,d=Math.floor(d/16)):(r=(d2+r)%16|0,d2=Math.floor(d2/16)),("x"===c?r:3&r|8).toString(16)})}build(cluster,proccessID){if(cluster>=1e3||cluster<0)throw new Error("Cluster must be between 0-999");if(proccessID<0)throw new Error("ProccessID must be >= 0");proccessID%=1e6;const random=this.stringUtil.right("0000"+Math.round(9999*Math.random()),4),uuidPart=this.generateUUID();return"10"+this.stringUtil.right("000"+cluster,3)+this.stringUtil.right("000000"+proccessID,6)+random+"--"+uuidPart}},keyTool}();Object.defineProperty(exports$1,"KeyTool",{enumerable:!0,get:function(){return key_tool_js_1.KeyTool}});var objects_js_1=(hasRequiredObjects||(hasRequiredObjects=1,Object.defineProperty(objects,"__esModule",{value:!0}),objects.ObjectsUtil=void 0,objects.ObjectsUtil=class{shallowCopy(data){return JSON.parse(JSON.stringify(data))}partialCopy(from,to,fields){const ret=this.shallowCopy(to);for(const field of fields)ret[field]=from[field];return ret}}),objects);Object.defineProperty(exports$1,"ObjectsUtil",{enumerable:!0,get:function(){return objects_js_1.ObjectsUtil}});var strings_js_1=requireStrings();Object.defineProperty(exports$1,"StringsUtil",{enumerable:!0,get:function(){return strings_js_1.StringsUtil}});var inject_controller_1=(hasRequiredInjectController||(hasRequiredInjectController=1,function(exports$1){Object.defineProperty(exports$1,"__esModule",{value:!0}),exports$1.injectController=exports$1.InjectorFactory=void 0;var InjectFactory_1=requireInjectFactory();Object.defineProperty(exports$1,"InjectorFactory",{enumerable:!0,get:function(){return InjectFactory_1.InjectorFactory}});var inject_controller_1=requireInjectController$1();Object.defineProperty(exports$1,"injectController",{enumerable:!0,get:function(){return inject_controller_1.injectController}})}(injectController$1)),injectController$1);Object.defineProperty(exports$1,"injectController",{enumerable:!0,get:function(){return inject_controller_1.injectController}}),Object.defineProperty(exports$1,"InjectorFactory",{enumerable:!0,get:function(){return inject_controller_1.InjectorFactory}});var log_1=requireLog();Object.defineProperty(exports$1,"Level",{enumerable:!0,get:function(){return log_1.Level}}),Object.defineProperty(exports$1,"LogGenericImpl",{enumerable:!0,get:function(){return log_1.LogGenericImpl}}),Object.defineProperty(exports$1,"BUILD_DATE_KEY",{enumerable:!0,get:function(){return log_1.BUILD_DATE_KEY}})}(dist)),dist);function showMessage(message){distExports.injectController.resolve("Log").debug(`Message: ${message}!`)}function add(a,b){return distExports.injectController.resolve("Log").debug("The addition is performed."),a+b}class ModuleBase{#ready=!1;isReady(){return this.#ready}async init(){this.initHooks(),await this.waitReady(),this.#ready=!0}async whaitFor(test,timeout=6e4,sleep=100){const logguer=distExports.injectController.resolve("Log");let totalTime=0;return new Promise((resolve,reject)=>{const handle=setInterval(()=>{if(test())return clearInterval(handle),void resolve();totalTime>timeout&&(logguer.debug("Timeout for test:",test),clearInterval(handle),reject(new Error("timeout while wait For in common module"))),totalTime+=sleep},sleep)})}}class SubModuleBase extends ModuleBase{}const docRegionUtils=document,REGION_UTILS_REGISTERED_NAMES_MODULE_NAME="common-assets",REGION_UTILS_REGISTERED_NAMES_TOOGLE_VISIBILITY="common-assets-toogle-visibility-regions";class RegionUtils extends SubModuleBase{#requiredHooksLoaded=!1;initHooks(){Hooks.on("onInitCommonModule",()=>{const regionUtils=distExports.injectController.resolve("RegionUtils");distExports.injectController.resolve("Log").info("Loading Region Utils"),regionUtils.registerKeybindings(),regionUtils.#requiredHooksLoaded=!0})}async waitReady(){const logguer=distExports.injectController.resolve("Log");if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyRegionUtils",{}),logguer.debug("Region Utils ready")}sendMessageToChat(senderid,message){const chatData={user:senderid,speaker:"Game Master",content:message,whisper:game.users.filter(u=>u.isGM).map(u=>u._id)};ChatMessage.create(chatData,{})}stop(event){const logguer=distExports.injectController.resolve("Log"),shape=event?.region?.shapes[0];if(logguer.debug("event:",event,",shape:",shape),!shape)return void logguer.error("shape not found");const width=shape.width,height=shape.height,newX=shape.x+Math.round(width/2),newY=shape.y+Math.round(height/2),token=event?.data?.token;token.x=newX,token.y=newY,logguer.debug("Token indo para x:",newX,",y:",newY),token.update({x:token.x,y:token.y})}toggleVisibilityRegions(){const logguer=distExports.injectController.resolve("Log");logguer.debug("toggleVisibilityRegions called");const activeScene=game.scenes.current;activeScene?activeScene.regions.forEach(region=>{distExports.injectController.resolve("Log").debug("region",region),region.update({visibility:!region.visibility})}):logguer.error("No scene active")}registerKeybindings(){game.keybindings.register(REGION_UTILS_REGISTERED_NAMES_MODULE_NAME,REGION_UTILS_REGISTERED_NAMES_TOOGLE_VISIBILITY,{name:"Alternar visão das regiões da cena",hint:"Liga/desliga visibilidade das regiões da cena atual.",editable:[{key:"KeyG",modifiers:["Shift"]}],onDown:async()=>{docRegionUtils.COMMON_MODULE.debug("onDown will be called"),docRegionUtils.COMMON_MODULE.REGION_UTILS.toggleVisibilityRegions()},restricted:!0,reservedModifiers:[],precedence:CONST.KEYBINDING_PRECEDENCE.NORMAL})}}class PlayersTools extends SubModuleBase{#requiredHooksLoaded=!1;initHooks(){Hooks.on("onReadyCommonModule",async()=>{const playersTools=distExports.injectController.resolve("PlayersTools");distExports.injectController.resolve("Log").info("Starting Hability hero processing"),playersTools.initializeFlyMeasure(),playersTools.#requiredHooksLoaded=!0})}async waitReady(){if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyPlayersTools",{})}initializeFlyMeasure(){distExports.injectController.resolve("Log").debug("initlizeFlyMeasure init")}}class Button{constructor(action,label,defaultValue=!1,type="screen",callback){this.action=action,this.label=label,this.defaultValue=defaultValue,this.type=type,this.callback=callback}}class NPC{constructor(name,imageUrl,formatSound="ogg"){this.name=name,this.imageUrl=imageUrl,this.formatSound=formatSound}DEFAULT_STYLE="\n\t\t\t\t\t<style>\n\t\t\t\t\t.select-action { padding: 20px; background: #222; color: #eee; }\n\t\t\t\t\t.select-action button { margin: 5px; padding: 5px 10px; }\n\t\t\t\t\t.brizola-actions-buttons { display: flex; flex-direction: column; gap: 8px; }\n\t\t\t\t";actor;groups=new Set;screens=new Array;async whaitFor(test,timeout=6e4,sleep=100){const logguer=distExports.injectController.resolve("Log");let totalTime=0;return new Promise((resolve,reject)=>{const handle=setInterval(()=>{if(test())return clearInterval(handle),void resolve(void 0);totalTime>timeout&&(logguer.debug("Timeout for test:",test),clearInterval(handle),reject(new Error("timeout while wait For in common module"))),totalTime+=sleep},sleep)})}async init(){if(await this.whaitFor(()=>distExports.injectController.resolve("NPCDialog"),3e5),!distExports.injectController.resolve("NPCDialog"))throw new Error("Timeout waiting for hooks");if(await this.whaitFor(()=>distExports.injectController.resolve("DialogUtils"),3e5),!distExports.injectController.resolve("DialogUtils"))throw new Error("Timeout waiting for hooks");const npcDialog=distExports.injectController.resolve("NPCDialog");this.screens.push({name:"npc-dialog",callback:npcDialog.showNPCChooseDialog})}decrementGroup(){const npcDialog=distExports.injectController.resolve("NPCDialog"),newArray=[...npcDialog.activeNPC.groups].slice(0,-1);npcDialog.activeNPC.groups=new Set(newArray)}getAlias(){return this.name.toLocaleLowerCase()}async createDialog(title,content,options,submits){const npcDialog=distExports.injectController.resolve("NPCDialog"),dialogUtils=distExports.injectController.resolve("DialogUtils"),loguer=distExports.injectController.resolve("Log"),alias=npcDialog.activeNPC.getAlias();let innerContent=`\n\t\t<DIV class="${alias}-actions-buttons">\n\t\t\t<SELECT>\n\t\t\t\t<option selected="selected" value="${alias}-random">Aleatório dado o contexto até aqui</option>\n\t\t`;options.forEach(option=>{const backAction=`${alias}-back`,sendAction=`${alias}-send`,cancelction=`${alias}-cancel`;option.action!=backAction&&option.action!=sendAction&&option.action!=cancelction&&(loguer.debug("NPC.createDialog:5 for,button:",option),innerContent+=`\n\t\t\t\t<option value="${option.action}">${option.label} </option>\n\t\t\t`)}),innerContent+="\n\t\t\t</SELECT>\n\t\t</DIV>\n\t\t",loguer.debug("NPC.createDialog:10",options),loguer.debug("NPC.createDialog:15:activeNPC.groups:",npcDialog.activeNPC.groups),submits||(loguer.debug("NPC.createDialog:20"),submits=[dialogUtils.createButton("send","Enviar",!0,"action",async()=>{loguer.debug("NPC.createDialog, before creating send:",npcDialog.activeNPC.groups),loguer.debug("NPC.createDialog [10]: Escolhido a opcao enviar");const queryResult=document.querySelector(`.${alias}-actions-buttons SELECT`)||null,result=queryResult?.value;if(null!=result){if(loguer.debug("NPC.createDialog [20]: depois de selecionar o resultado",result),result===`${alias}-random`){const lastScreen=npcDialog.activeNPC.screens.at(-1);return npcDialog.activeNPC.screens.push({name:result,callback:npcDialog.activeNPC.send,type:lastScreen.type}),loguer.debug("NPC.createDialog, before random send:",npcDialog.activeNPC.groups),npcDialog.activeNPC.send(!1),void loguer.debug("NPC.createDialog, after random send:",npcDialog.activeNPC.groups)}options.forEach(button=>{button.action==result&&(loguer.debug("NPC.Enviado a opcao :"+result),npcDialog.activeNPC.screens.push({name:result,callback:button.callback,type:button.type}),button.callback(),loguer.debug("NPC.createDialog, after 3 creating send:",npcDialog.activeNPC.groups))})}else loguer.error("NPC.createDialog: Erro ao obter a opcao selecionada")}),dialogUtils.createButton("back","Voltar",!0,"action",async()=>{loguer.debug("NPC.screens ao voltar - antes: ",npcDialog.activeNPC.screens);const previousLastScreen=npcDialog.activeNPC.screens.at(-2),lastScreen=npcDialog.activeNPC.screens.pop();loguer.debug("lastScreen:",lastScreen),loguer.debug("screens ao voltar - depois: ",npcDialog.activeNPC.screens),"screen-context"==lastScreen.type&&npcDialog.activeNPC.decrementGroup(),previousLastScreen.callback()}),dialogUtils.createButton("cancel","Cancelar",!0,"action",async()=>{loguer.debug("NPC.Cancelado a tela do ",alias)})],loguer.debug("NPC.createDialog:25. Create submits",submits),loguer.debug("NPC.createDialog:30 - depois de criar submits"));loguer.debug("NPC.createDialog:40 - antes de criar dialogo"),dialogUtils.createDialog(title,npcDialog.activeNPC.DEFAULT_STYLE,innerContent,submits,[(action,label,defaultValue,callback)=>{}],200,void 0,400),loguer.debug("NPC.createDialog:50 - depois de criar dialogo")}async getListLinesFromGroup(groupsUnordered){const npcDialog=distExports.injectController.resolve("NPCDialog"),loguer=distExports.injectController.resolve("Log"),groups=Array.from(groupsUnordered).map(Number).sort((a,b)=>a-b);if(0===groups.length&&0===groupsUnordered.size)return new Array;if(0===groups.length&&groups.push(Number.parseInt(groupsUnordered.get(0),10)),1==groups.length)return groups;let combinations=await npcDialog.activeNPC.getCombinations(groups);return loguer.debug("groups:",groups),loguer.debug("keys:",combinations),combinations}async getCombinations(numbers,separator=";"){const npcDialog=distExports.injectController.resolve("NPCDialog"),loguer=distExports.injectController.resolve("Log"),ret=new Array;if(0==numbers.length||1==numbers.length)return[...numbers];loguer.debug("numbers:",numbers);const generate=(start,path)=>{loguer.debug("generate start:",start,",path",path);let combinationKey=numbers.join(";");if(loguer.debug("combinationKey:",combinationKey),loguer.debug("groupToLines:",npcDialog.activeNPC.groupToLines,"-",typeof combinationKey),npcDialog.activeNPC.groupToLines.has(combinationKey))return loguer.debug("find, return the combination"),ret.push(combinationKey),ret;loguer.debug("combinationKey not found:",combinationKey);for(let i=start;i<numbers.length;i++){const newCombinationGroup=[...path,numbers[i]];loguer.debug("novaCombinacao:",newCombinationGroup),combinationKey=newCombinationGroup.join(";"),ret.push(combinationKey),generate(i+1,newCombinationGroup)}};return generate(0,[]),ret}async speak(lineIndex){const npcDialog=distExports.injectController.resolve("NPCDialog"),loguer=distExports.injectController.resolve("Log"),line=npcDialog.activeNPC.lines[lineIndex];loguer.debug("speak:talk:",line),loguer.debug("disparando o evento pra todo mundo:"),console.log("[NPC Portrait] Enviando para todos..."),await ChatMessage.create({content:"NPC Portrait Event",whisper:Array.from(game.users?.values()||[]).map(u=>u.id),flags:{"forgotten-realms":{type:"npcDialogOnTalk",payload:{imageUrl:this.imageUrl,npcName:this.name,dialogText:line}}}}),loguer.debug(" evento disparado pra todo mundo:");const formatedIndex=lineIndex.toString().padStart(3,"0"),name=npcDialog.activeNPC.name,src=`modules/forgotten-realms/sounds/npcs/${name}/${formatedIndex}/${name}${formatedIndex}.${npcDialog.activeNPC.formatSound}`,ret=await this.playSoundWithNoEffect(src);loguer.debug("Retorno do play:",ret)}async playSoundWithNoEffect(src){distExports.injectController.resolve("NPCDialog");const loguer=distExports.injectController.resolve("Log");try{const response=await fetch(src,{method:"HEAD"});return response.ok?(foundry.audio.AudioHelper.play({src:src,autoplay:!0},!0),!0):(console.warn(`Arquivo não encontrado: ${src} (${response.status})`),!1)}catch(error){return loguer.error("Erro ao reproduzir o som:",src,error),!1}}async send(removeLastGroup=!0){const npcDialog=distExports.injectController.resolve("NPCDialog"),loguer=distExports.injectController.resolve("Log");0===npcDialog.activeNPC.groups.size&&npcDialog.activeNPC.groups.add("999");const list=await npcDialog.activeNPC.getListLinesFromGroup(npcDialog.activeNPC.groups);loguer.debug("NPC.send, before send,list:",list);const lines=new Array;for(const groupNumber of list){const group=groupNumber.toString();if(loguer.debug("group:",group),!npcDialog.activeNPC.groupToLines.has(group)){loguer.warn(`NPC.send, afterSend:Grupo ${group} não encontrado em groupToLines!`);continue}const size=group.split(";").length+1,linesForThisGroupConcat=npcDialog.activeNPC.groupToLines.get(group);loguer.debug("NPC.send, 50,linesForThisGroupConcat:",linesForThisGroupConcat,"-size:",size);const linesForThisGroup=linesForThisGroupConcat.split(";");loguer.debug("NPC.send, 60,linesForThisGroup:",linesForThisGroup),linesForThisGroup.forEach(line=>{for(let i=0;i<size;i++)lines.push(line)})}loguer.debug("NPC.send, afterSend,lines:",lines);let randomIndex=Math.abs(Math.round(Math.random()*lines.length));randomIndex=randomIndex>=lines.length?lines.length-1:randomIndex,loguer.debug("NPC.send, afterSend,randomIndex:",randomIndex);const lineIndex=Number.parseInt(lines[randomIndex],10);loguer.debug("NPC.send, afterSend,lineIndex:",lineIndex),npcDialog.activeNPC.speak(lineIndex),loguer.debug("NPC.send, afterSend,activeScreen:",npcDialog.activeNPC.screens);const activeScreen=npcDialog.activeNPC.screens.at(-2);npcDialog.activeNPC.screens.pop(),activeScreen.callback(),npcDialog.activeNPC.groups.delete("999"),removeLastGroup&&npcDialog.activeNPC.decrementGroup(),loguer.debug("NPC.send, afterSend:",npcDialog.activeNPC.groups)}}class NPCPortraitDialog extends Application{imageUrl;npcName;dialogText;constructor(options={}){super(),this.imageUrl=options.imageUrl||"YOUR_IMAGE_URL_HERE",this.npcName=options.npcName||"NPC",this.dialogText=options.dialogText||"Olá, aventureiro..."}static get defaultOptions(){return foundry.utils.mergeObject(Application.defaultOptions,{id:"npc-portrait-dialog",classes:["npc-portrait-app"],title:"",width:600,height:400,resizable:!1,minimizable:!1,popOut:!0})}get template(){return"modules/common-scripts-dnd5ed/scripts/templates/npc-talk.hbs"}async getData(){return{imageUrl:this.imageUrl,npcName:this.npcName,dialogText:this.dialogText}}activateListeners(html){super.activateListeners(html),html.on("click",".close-button",()=>{this.close()})}static renderTalk(data){new NPCPortraitDialog({imageUrl:data.imageUrl,npcName:data.npcName,dialogText:data.dialogText}).render(!0)}async showToAllPlayers(){if(this.render(!0),game.user?.isGM){const socketPayload={type:"showNPCPortrait",data:{imageUrl:this.imageUrl,npcName:this.npcName,dialogText:this.dialogText}};game.socket.emit("module.seu-modulo",socketPayload)}}}console.log("npcDialog.ts loaded 10");class NPCDialog extends SubModuleBase{npcSelected;activeNPC;npcs=new Map;buttonloaded=!1;#requiredHooksLoaded=!1;initHooks(){Hooks.on("createChatMessage",async message=>{const logguer=distExports.injectController.resolve("Log"),npcDialog=distExports.injectController.resolve("NPCDialog");if(await npcDialog.whaitFor(()=>distExports.injectController.has("DialogUtils"),3e5),distExports.injectController.has("DialogUtils"))try{if(logguer.debug("createChatMessage recebido..."),"npcDialogOnTalk"===message.flags?.["common-assets"]?.type){const data=message.flags["common-assets"].payload;logguer.debug("[NPC Portrait] Evento recebido dos jogadores:",data),NPCPortraitDialog.renderTalk(data)}}catch(e){logguer.error("[NPC Portrait] Erro ao processar evento:",e)}else logguer.error("Givup chat message ",message," because timeout wiaiting for DialogUtils")}),Hooks.on("getSceneControlButtons",async controls=>{const logguer=distExports.injectController.resolve("Log"),npcDialog=distExports.injectController.resolve("NPCDialog");await npcDialog.whaitFor(()=>distExports.injectController.has("DialogUtils"),3e5),distExports.injectController.has("DialogUtils")?(logguer.debug("On getSceneControlButtons 05...",controls,npcDialog),await npcDialog.addNPCButtons(controls),npcDialog.#requiredHooksLoaded=!0,logguer.debug("On getSceneControlButtons...:20")):logguer.error("Givup getSceneControlButtons ",controls," because timeout wiaiting for DialogUtils")})}async waitReady(){if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyNPCDialog",{})}async addNPCButtons(controls){const logguer=distExports.injectController.resolve("Log"),npcDialog=distExports.injectController.resolve("NPCDialog");game.user.isGM?(logguer.debug("Criando botão dos NPCs especiais",controls),controls.tokens.tools.npcButton={name:"npcButton",title:"NPCs Especiais",icon:"fa-solid fa-web-awesome",button:!0,toggle:!1,onClick:()=>{logguer.debug("Botão de NPCs especiais pressionado"),console.log("npcDialog",npcDialog),npcDialog.showNPCChooseDialog(),logguer.debug("Após abrir janela de NPCs especiais")}},logguer.debug("Botão de NPC criado")):logguer.debug("NPC Buttons off")}async showNPCChooseDialog(){const logguer=distExports.injectController.resolve("Log"),npcDialog=distExports.injectController.resolve("NPCDialog"),dialogUtils=distExports.injectController.resolve("DialogUtils");logguer.debug("Botão NPCsespecial pressionado, mostrando diálogo...");logguer.debug("showNPCChooseDialog:10 before creating buttons",npcDialog);let buttons=[];npcDialog.npcs.forEach(npc=>{logguer.debug("showNPCChooseDialog:15 add NPC ",npc.name,npc),buttons.push(dialogUtils.createButton(npc.name.toLocaleLowerCase(),npc.name,!0,"screen",npcDialog.callNPC(npc)))}),buttons.push(dialogUtils.createButton("cancel","Cancel",!1,"screen")),logguer.debug("showNPCChooseDialog:20 after creating buttons"),dialogUtils.createDialog("Escolha um NPC Especial","\n\t\t\t\t\t.select-npc { padding: 20px; background: #222; color: #eee; }\n\t\t\t\t\t.select-npc button { margin: 5px; padding: 5px 10px; }\n\t\t\t\t\t",'\n\t\t\t\t\t<div class="select-npc">\n\t\t\t\t\t<H1>Escolha uma opção:</H1> \n\t\t\t\t\t</div>',buttons,void 0,200,void 0,400),logguer.debug("showNPCChooseDialog:30 after createDialog")}helpSubmit='\n\t\t\tSubmit need be a function:\n\t\t\t(action,label,defaultValue,callback)=>{\n\t\t\t\treturn result => {\n\t\t\t\t\t\tif ( result === "minsc" ) console.log("User picked minsc options.");\n\t\t\t\t\t\telse console.log("User picked option: ", rsult );\n\t\t\t\t\t}\n\t\t\t}\n\t\t\t';async callNPC(npc){const npcDialog=distExports.injectController.resolve("NPCDialog");distExports.injectController.resolve("Log").debug("Selecionado ...",npc),npcDialog.npcSelected=npc,await npcDialog.npcSelected.startScreen()}}class DialogUtils extends SubModuleBase{npctype=NPC;NPC_DIALOG=new NPCDialog;#requiredHooksLoaded=!1;async waitReady(){const logguer=distExports.injectController.resolve("Log");if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyDialogUtils",{}),logguer.debug("Dialog Utils ready")}initHooks(){Hooks.on("onReadyCommonModule",async data=>{const dialogUtils=distExports.injectController.resolve("DialogUtils");distExports.injectController.resolve("Log").debug("Dialog Utils loading on onReadyCommonModule"),dialogUtils.#requiredHooksLoaded=!0})}createButton(action,label,defaultValue=!1,type="screen",callback=void 0){return new Button(action,label,defaultValue,type,callback)}createDialog(title,style="",content="",buttons=new Array,submit=new Array,left=void 0,top=void 0,width="auto",height="auto"){const logguer=distExports.injectController.resolve("Log");if(logguer.debug("Dialog Utils creating dialog width: ",width," height: ",height),!buttons?.length||0===buttons.length)throw new Error("DIALOG_UTILS.createDialog: buttons array must have at least one button");const options={window:{title:title,resizable:!0},content:`<style>${style}</style>\t\n\t\t\t\t\t<div>${content}</div>`,buttons:buttons,submit:submit,position:{width:width,height:height,left:left,top:top}};logguer.debug("Dialog Utils dialog options: ",options);const ret=new foundry.applications.api.DialogV2(options);return ret.render({force:!0}),ret}}class HeroPoints extends SubModuleBase{#requiredHooksLoaded=!1;initHooks(){Hooks.on("onReadyDialogUtils",async()=>{const heroPoints=distExports.injectController.resolve("HeroPoints");distExports.injectController.resolve("Log").info("Starting Hability hero processing"),heroPoints.initializeHabilityHero(),heroPoints.#requiredHooksLoaded=!0})}async waitReady(){if(await this.whaitFor(()=>this.#requiredHooksLoaded,3e5),!this.#requiredHooksLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyHeroPoints",{})}removeAttribute(sheet){const logguer=distExports.injectController.resolve("Log");let htmldivs=document.querySelectorAll("div.ability-score[data-ability='hon']");0!=htmldivs.length?(logguer.debug("Hability hero removed, npc sheet detected"),htmldivs.forEach(div=>div.remove())):logguer.debug("This sheet not contain honrror field or system not enable honrror field")}addEditButtonsToHeroPoints(parent){const logguer=distExports.injectController.resolve("Log");if(!game.user.isGM)return;let elements=parent?.querySelectorAll("div.mod span.operator.increment");if(0==elements.length)return void logguer.error("Hability Hero operator increment not found");let increment=elements.item(0);increment.onclick=e=>{e.preventDefault();const scoreInputs=document.querySelectorAll("form.editable div.ability-score.flipped[data-ability='hon'] input");if(1!=scoreInputs.length)return void logguer.error("Hability hero increment hero points not found input to increment ore found more then one, close others sheets before changing hero points");const scoreInput=scoreInputs.item(0);if(null==scoreInput.value||""==scoreInput.value)return void logguer.error("Hability hero increment hero points not found input value to increment");const newScore=Number.parseInt(scoreInput.value,10)+1;scoreInput.value=newScore.toString(),logguer.debug(`Hability hero increment hero points to ${newScore}`)},elements=parent?.querySelectorAll("div.mod span.operator.reduce"),0!=elements.length?(increment=elements.item(0),increment.onclick=e=>{e.preventDefault();const scoreInputs=document.querySelectorAll("form.editable div.ability-score.flipped[data-ability='hon'] input");if(1!=scoreInputs.length)return void logguer.error("Hability hero increment hero points not found input to increment ore found more then one, close others sheets before changing hero points");const scoreInput=scoreInputs.item(0);if(null==scoreInput.value||""==scoreInput.value)return void logguer.error("Hability hero increment hero points not found input value to increment, close others sheets before changing hero points");const currentScore=Number.parseInt(scoreInput.value,10);if(0==currentScore)return void logguer.error("You haven´t hero points to decrement");const newScore=Math.floor(currentScore/2);scoreInput.value=newScore.toString(),logguer.debug(`Hability hero decrement hero points to ${newScore}`)}):logguer.error("Hability Hero operator reduce not found")}createDialog(element){const logguer=distExports.injectController.resolve("Log"),dialogUtils=distExports.injectController.resolve("DialogUtils");let dialog={};element.onclick=e=>{e.preventDefault(),logguer.debug("clicou na habilidade");const cancelButton=dialogUtils.createButton("cancel","Cancelar",!0,"action",html=>{dialog.close()});logguer.debug("Hero Points dialog closed."),dialog=dialogUtils.createDialog("Sobre Hero Points","",'\n\t\t<div class="hero-points-info-content"> \n\t\t\t<img class="heroic-action-img"\n\t\t\t\tsrc="/modules/common-assets/images/cover/heropoint.webp"\n\t\t\t\talt="Ícone representando uma ação heróica em um RPG de fantasia"\n\t\t\t\t/> \n\n\t\t\t<p>\n\t\t\t\t<strong>Hero Points</strong> são semelhantes a pontos de inspiração, mas não são limitados a 1. \n\t\t\t\tVocê começa com zero pontos e eles são acumulativos, diferente de inspiração, em que se pode ter apenas 1 ponto ativo.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\t<strong>Como obter:</strong> quando chegar na sua vez, se você fizer algo que incremente não somente o seu \n\t\t\t\tbackground como o de algum colega (semelhante ao ponto de inspiração, mas sem precisar se colocar em situação ruim),\n\t\t\t\tvocê ganha 1 ponto. A ação deve melhorar a história tanto do seu personagem quanto a dos demais jogadores.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\t<strong>Exemplo de ação heróica:</strong> você sabe que um meio-orc do grupo tem fobia de aranha. \n\t\t\t\tO mestre descreve uma aranha se aproximando e o jogador dono do personagem não percebe. \n\t\t\t\tVocê decide atacar a aranha antes que seu colega se desespere e note a presença dela. \n\t\t\t\tOu, se você é um bardo e sabe que um dos jogadores teve um amor perdido, \n\t\t\t\tcanta uma música na sua rodada para dar inspiração dizendo que é sobre o amor perdido desse personagem. \n\t\t\t\tÉ importante que tudo faça sentido na história atual, na história do outro jogador e na sua própria. \n\t\t\t\tVocê pode inclusive ajustar a narração, por exemplo, inventando que havia uma aranha que o mestre nem citou \n\t\t\t\te dizer que a matou com uma flecha antes que seu amigo entrasse em pânico.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\tA jogada deve ser rápida e já pensada durante a vez dos outros; você não pode parar para planejar apenas quando sua vez começa. \n\t\t\t\tEla precisa ser ágil para incrementar a narração. Se tudo isso for atendido e o mestre concordar, \n\t\t\t\t1 ponto de heroísmo é acrescentado ao personagem.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\t<strong>Usando uma Ação Heróica (gastando pontos):</strong> o ponto ganho pode ser gasto para realizar uma ação especial envolvendo dois personagens; \n\t\t\t\to alvo pode ser um jogador ou um NPC, aliado ou inimigo.\n\t\t\t</p>\n\n\t\t\t<p>\n\t\t\t\t<strong>Como reduzir os pontos:</strong> apenas o Mestre pode reduzir ou aumentar o valor total. Os pontos não são gastos de 1 em 1, quando os pontos são gastos, \n\t\t\t\tdivide-se o total por 2 (arredondando para baixo). \n\t\t\t\tExemplos: se você tem 5 pontos, passa a ter 2; se tem 3, passa a ter 1; se tem 1 ponto, passa a ter 0.\n\t\t\t</p>\n\t\t</div>\n\t\t\t\t\t',[cancelButton],new Array)}}changeHabilityHonrrorToHeroPoints(sheet){const logguer=distExports.injectController.resolve("Log"),forms=document.querySelectorAll("form.sheet"),isEditable=forms.item(0)?.classList.contains("editable")??!1;0!=forms.length?(logguer.debug("Hability hero found : "+forms.length),forms.forEach(form=>{form.querySelectorAll("div.ability-score.flipped[data-ability='hon']").forEach(divElement=>{const heroPoints=distExports.injectController.resolve("HeroPoints"),logguer2=distExports.injectController.resolve("Log"),div=divElement;if(logguer2.debug("found one hability "+div.innerHTML,",isEditable",isEditable),1!=div.querySelectorAll("div.score").length)return void logguer2.error("Hability hero not enable to convert for hero, your cmpaing not use? Code error: 02");let score=div.querySelectorAll("div.score").item(0)?.innerHTML??"0";if(!game.user.isGM){let scoreInput=div.querySelectorAll("input");isEditable&&(score=scoreInput.item(0).value)}logguer2.debug("Hability hero score: ",score),div.innerHTML=`\n\t\t\t\t<label class="common-assets attribute" title="clique para mais informações">hero</label>\n\t\t\t\t<div class="mod">\n\t\t\t\t\t<span class="operator reduce" title"para editar, altere o personagem para o modo editável"></span>\n\t\t\t\t\t<span class="operator increment" title"para editar, altere o personagem para o modo editável"></span>\n\t\t\t\t</div>\n\t\t\t\t<div class="score">${score}</div>\n\t\t\t\t`,heroPoints.addEditButtonsToHeroPoints(div);const label=div.querySelectorAll("label")?.item(0);null!=label?heroPoints.createDialog(label):logguer2.warn("Hability hero not enable to convert for hero, your cmpaing not use? Code error: 01")})})):logguer.error("Hability hero not enable to convert for hero, your cmpaing not use? Code error: 01")}initializeHabilityHero(){Hooks.on("renderDocumentSheetV2",async data=>{const heroPoints=distExports.injectController.resolve("HeroPoints"),logguer=distExports.injectController.resolve("Log"),sheet=data;if(sheet.actor){if(logguer.debug("Hability hero called ",sheet),"character"!=sheet.actor.type)return heroPoints.removeAttribute(sheet),void logguer.debug("Hability hero ignoreted sheet because isnt a player sheet, type:",sheet.actor.type);heroPoints.changeHabilityHonrrorToHeroPoints(sheet)}else logguer.debug("Isnt a actor sheet")})}}class HideUnidentify extends SubModuleBase{#requiredHooksLoaded=!0;async waitReady(){if(!this.#requiredHooksLoaded)throw new Error("This module is created ready, no need to wait for hooks");Hooks.callAll("onReadyHideUnidentify",{})}initHooks(){Hooks.on("renderItemSheet5e",(sheet,options)=>{const logguer=distExports.injectController.resolve("Log"),hideUnidentify=distExports.injectController.resolve("HideUnidentify");logguer.debug("dnd5e.renderItemSheet5e called"),hideUnidentify.removeItemSheetIdentifyInformations(sheet,options)}),Hooks.on("dnd5e.getItemContextOptions",(item,buttons)=>{const logguer=distExports.injectController.resolve("Log"),hideUnidentify=distExports.injectController.resolve("HideUnidentify");logguer.debug("dnd5e.getItemContextOptions called"),hideUnidentify.removeButtonsFromItemContext(item,buttons)})}removeButtonsFromItemContext(item,buttons){const logguer=distExports.injectController.resolve("Log");if(logguer.debug("removeButtonsFromItemContext called"),game.user.isGM)return void logguer.debug("is GM - not removing Identify button from Item Sheet context menu");if(item.system.identified)return void logguer.debug("Item:",item.name," - Item is identified - not removing Identify button from Item Sheet context menu");["DND5E.Identify","DND5E.ContextMenuActionAttune"].forEach(buttonName=>{const index=buttons.findIndex(option=>option.name===buttonName);-1!==index&&(logguer.debug("Item:",item.name," - Removing",buttonName,"button from Item Sheet context menu at index",index),buttons.splice(index,1))})}removeItemSheetIdentifyInformations(sheet,option){const logguer=distExports.injectController.resolve("Log");if(logguer.debug("removeButtonsFromItemContext called"),game.user.isGM)return void logguer.debug("is GM - not removing Identify button from Item Sheet context menu");sheet.item.system.identified||(document.querySelectorAll(".dnd5e.sheet.item .sheet-header .item-subtitle label:has(input:not([disabled]))").forEach(n=>n.remove()),document.querySelectorAll(".toggle-identified").forEach(n=>n.remove()))}}class DummySocket extends SubModuleBase{initHooks(){Hooks.once("onReadyCommonModule",async()=>{this.init()})}async waitReady(){Hooks.callAll("onReadyCommonSocket",{})}async executeForAll(eventName,...data){distExports.injectController.resolve("Log").debug("Socket dummy executeForAll for event:",eventName,",parameters: ",data,"...parameters",...data)}async executeAsGM(eventName,...data){const logguer=distExports.injectController.resolve("Log");if(!game.user||!game.users)throw new Error("Game isnt complete prepareted yet, player and gm isnt filled the information. Wait for game ready event ");logguer.debug("Socket dummy executeAsGM for event:",eventName,",parameters: ",data,"...parameters",...data)}async executeToGM(eventName,...data){distExports.injectController.resolve("Log").debug("Socket dummy executeAsGM for event:",eventName,",parameters: ",data,"...parameters",...data)}async executeIn(eventName,users,...data){}isReadyToSendToGM(){return!1}async register(eventName,callback){}}const COMMON_REGISTERED_NAMES_MODULE_VERSION="common-assets-version",doc$1=document;const commonModule=new class extends ModuleBase{name="common-assets";version="1.0.6";startVersion="";#debug=!0;#hooksRequiredLoaded=!1;async addInitCommonAssetsChanges(){const logguer=distExports.injectController.resolve("Log"),commonModule=distExports.injectController.resolve("CommonModule");logguer.debug("addInitCommonAssetsChanges:20,register commnModule:",commonModule),this.registerSetting(COMMON_REGISTERED_NAMES_MODULE_VERSION)}async init(){await super.init(),await this.loadSubModules()}async loadSubModules(){[new RegionUtils,new PlayersTools,new DialogUtils,new HeroPoints,new HideUnidentify].forEach(async subModule=>{distExports.injectController.registerByClass(subModule),await subModule.init()});const commonSocket=new DummySocket;distExports.injectController.registerByName("Socket",commonSocket)}async waitReady(){if(await this.whaitFor(()=>this.#hooksRequiredLoaded,3e5),!this.#hooksRequiredLoaded)throw new Error("Timeout waiting for hooks");Hooks.callAll("onReadyCommonModule",{})}initHooks(){Hooks.once("init",async()=>{const commonModule=distExports.injectController.resolve("CommonModule");distExports.injectController.resolve("Log").info("Módulo Common Assets inicalizando..."),await commonModule.addInitCommonAssetsChanges()}),Hooks.once("ready",async()=>{const commonModule=distExports.injectController.resolve("CommonModule"),logguer=distExports.injectController.resolve("Log");if(!commonModule.version)return void logguer.error("Módulo Common Assets não está instalado ou não foi iniciado corretamente.");game.user.isGM&&(logguer.debug("GM detected, adding isGM class to body"),document.body.classList.add("isGM")),logguer.debug(`Getting the old version with key:${COMMON_REGISTERED_NAMES_MODULE_VERSION}`);const instalatedVersion=await commonModule.getSettings(COMMON_REGISTERED_NAMES_MODULE_VERSION);await commonModule.addReadyCommonAssetsChanges(),Hooks.once("onReadyCommonSocket",async()=>{const logguer=distExports.injectController.resolve("Log"),commonSocket=distExports.injectController.resolve("Socket");logguer.debug("onReadyCommonSocket 20"),commonSocket.register("showMessage",showMessage),commonSocket.register("add",add),logguer.debug("Socketlib finish the register events");try{if(commonSocket.isReadyToSendToGM())if(logguer.debug("Gm esta pronto pra receber mensagens test1"),commonSocket.executeForAll("showMessage","test1"),logguer.debug("Depois de usar executeForAll test1"),game.user.isGM){logguer.debug("Before executeAsGM add 5+6");let result2=await commonSocket.executeAsGM("add",5,6);logguer.debug(`The result of executeAsGM add 5+6 is: ${result2}`),await commonSocket.executeAsGM("showMessage","test2"),logguer.debug("depois de executeAsGM test2")}else{commonSocket.executeForAll("showMessage","test3"),logguer.debug("Depois de executeForAll");try{logguer.debug("Before executeAsGM test4"),await commonSocket.executeAsGM("showMessage","test4"),logguer.debug("depois de executeAsGM test4")}catch(e){logguer.debug("erro ao tentar executar executeAsGM sendo apenas jogador",e)}}else logguer.debug("A minha implementacao notou que o gm nao foi carregado ainda 1");logguer.debug("Before executeForAll test5"),commonSocket.executeForAll("showMessage","test5"),logguer.debug("depois de executeForAll test5"),logguer.debug("Before executeToGM test6"),commonSocket.executeToGM("showMessage","test6"),logguer.debug("depois de executeToGM test6");let userids=game.users.map(u=>u.id);logguer.debug("Meu userid",game.user.id),userids=userids.filter(id=>(distExports.injectController.resolve("Log").debug("id recebido e meu user id",id,game.user.id),id!=game.user.id)),logguer.debug("Ids dos outros jogadores",userids);let randomNumber=Math.round(1e3*Math.random())+1e3,randomIndex=Math.round(userids.length*Math.random());randomIndex=randomIndex==userids.length?randomIndex-1:randomIndex;const userid=userids.at(randomIndex);logguer.debug(`Sending to player random: ${userid} , I am userid: ${game.user.id} and number random is ${randomNumber}`);let result=await commonSocket.executeIn("add",[userid],randomNumber,1);logguer.debug(`The player random calculated: ${result}`),logguer.debug("Antes do executeIn test7"),commonSocket.executeIn("showMessage",[userid],"teste7:"+game.user.id),logguer.debug("Depois do showMessage test7")}catch(e){logguer.debug("Common socket error",e)}}),this.#hooksRequiredLoaded=!0,instalatedVersion!==commonModule.version?(await commonModule.updateVersions(instalatedVersion,commonModule.version),logguer.info(`Módulo Common Assets atualizado de ${instalatedVersion} para ${commonModule.version} e carregado com sucesso!`)):logguer.info(`Módulo Common Assets v.${commonModule.version} carregado com sucesso!`)})}async addReadyCommonAssetsChanges(){const logguer=distExports.injectController.resolve("Log");logguer.info("Criando botão de ajuda de rolagem");const el=doc$1.getElementById("roll-privacy");if(!el)return void logguer.error("Menu privacy não encontrado");const botao=doc$1.createElement("button");botao.textContent="?",botao.className="ui-control icon fa-solid fa-help common-assets-help",botao.addEventListener("click",event=>{event.preventDefault();const journal=game.journal.getName("Como Rolar Dados");logguer.info("Mensagem exibida ao clicar no botão ?"),journal?journal.sheet.render(!0):logguer.error("Journal não instalado!")}),el.appendChild(botao),logguer.info("Botão de ajuda de rolagem criado")}async registerSetting(key,type=String){const commonModule=distExports.injectController.resolve("CommonModule");await game.settings.register(commonModule.name,key,{type:type})}async setSettings(key,value){const commonModule=distExports.injectController.resolve("CommonModule");await game.settings.set(commonModule.name,key,value)}async getSettings(key){const commonModule=distExports.injectController.resolve("CommonModule");return await game.settings.get(commonModule.name,key)}async updateVersions(instalatedVersion,nextVersionUpdated){instalatedVersion!==nextVersionUpdated&&(this.warnAboutUpdate(instalatedVersion,nextVersionUpdated),instalatedVersion=nextVersionUpdated,await this.setSettings(COMMON_REGISTERED_NAMES_MODULE_VERSION,instalatedVersion))}async warnAboutUpdate(previousVersion,lastVersion){distExports.injectController.resolve("Log").info(`Atualizando da versão : ${previousVersion} para a versão ${lastVersion}`)}debug(debug){return void 0!==debug&&(this.#debug=debug),this.#debug}},doc=document,logguer=new distExports.LogGenericImpl({format:"",prefix:"CA",hasDate:!0,hasLevel:!0});distExports.injectController.registerByName("FoundryDocument",doc),distExports.injectController.registerByName("CommonModule",commonModule),distExports.injectController.registerByName("Log",logguer),commonModule.init(),window.TaulukkoCommon={NPC:NPC,NPCDialog:NPCDialog,DialogUtils:DialogUtils,ModuleBase:ModuleBase,SubModuleBase:SubModuleBase,injectController:distExports.injectController,Logguer:distExports.LogGenericImpl,Level:distExports.Level}}();
|