mirror of https://github.com/bra1n/townsquare.git
1 line
361 KiB
Plaintext
1 line
361 KiB
Plaintext
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/assets/icons/washerwoman.png","webpack:///./src/assets/icons/barista.png","webpack:///./src/assets/icons/cerenovus.png","webpack:///./src/assets/icons/amnesiac.png","webpack:///./src/assets/icons/politician.png","webpack:///./src/assets/editions/tb.png","webpack:///./src/components/modals/NightOrderModal.vue?1fe1","webpack:///./src/assets/icons/shabaloth.png","webpack:///./src/assets/icons/lunatic.png","webpack:///./src/assets/icons/oracle.png","webpack:///./src/assets/icons/ravenkeeper.png","webpack:///./src/assets/icons/spiritofivory.png","webpack:///./src/assets/icons/undertaker.png","webpack:///./src/assets/icons/chambermaid.png","webpack:///./src/assets/icons/plus.png","webpack:///./src/assets/icons/recluse.png","webpack:///./src/assets/icons/mutant.png","webpack:///./src/assets/icons/buddhist.png","webpack:///./src/assets/icons/chef.png","webpack:///./src/assets/icons/preacher.png","webpack:///./src/assets/icons/zombuul.png","webpack:///./src/assets/icons/sailor.png","webpack:///./src/assets/icons/widow.png","webpack:///./src/assets/icons/bonecollector.png","webpack:///./src/assets/icons/outsider.png","webpack:///./src/assets/icons/baron.png","webpack:///./src/assets/icons/bureaucrat.png","webpack:///./src/assets/editions/bmr-minion.png","webpack:///./src/assets/icons/leviathan.png","webpack:///./src/assets/icons/artist.png","webpack:///./src/assets/editions/snv.png","webpack:///./src/assets/icons/sage.png","webpack:///./src/assets/icons/scapegoat.png","webpack:///./src/assets/icons/philosopher.png","webpack:///./src/components/TownSquare.vue?b88a","webpack:///./src/assets/icons/butcher.png","webpack:///./src/assets/icons/towncrier.png","webpack:///./src/assets/icons/cultleader.png","webpack:///./src/assets/icons/toymaker.png","webpack:///./src/assets/icons/vortox.png","webpack:///./src/assets/icons/deviant.png","webpack:///./src/assets/icons/imp.png","webpack:///./src/assets/icons/moonchild.png","webpack:///./src/components/Gradients.vue?8fc3","webpack:///./src/assets/icons/snakecharmer.png","webpack:///./src/assets/icons/fortuneteller.png","webpack:///./src/assets/editions/custom.png","webpack:///./src/components/Token.vue?cdb3","webpack:///./src/assets/editions/snv-minion.png","webpack:///./src/assets/icons/fool.png","webpack:///./src/components/modals/EditionModal.vue?63fa","webpack:///./src/assets/icons/apprentice.png","webpack:///./src/assets/icons/librarian.png","webpack:///./src/components/Vote.vue?da97","webpack:///./src/assets/editions/snv-outsider.png","webpack:///./src/assets/icons/soldier.png","webpack:///./src/assets/icons/minstrel.png","webpack:///./src/assets/icons/exorcist.png","webpack:///./src/assets/icons/harlot.png","webpack:///./src/assets/icons/goon.png","webpack:///./src/App.vue?9075","webpack:///./src/components/TownSquare.vue?7ac6","webpack:///./src/components/Player.vue?4364","webpack:///./src/components/Token.vue?e120","webpack:///src/components/Token.vue","webpack:///./src/components/Token.vue?ca97","webpack:///./src/components/Token.vue","webpack:///src/components/Player.vue","webpack:///./src/components/Player.vue?1369","webpack:///./src/components/Player.vue","webpack:///./src/components/modals/ReminderModal.vue?3f88","webpack:///./src/components/modals/Modal.vue?d9bf","webpack:///src/components/modals/Modal.vue","webpack:///./src/components/modals/Modal.vue?a5e5","webpack:///./src/components/modals/Modal.vue","webpack:///src/components/modals/ReminderModal.vue","webpack:///./src/components/modals/ReminderModal.vue?c533","webpack:///./src/components/modals/ReminderModal.vue","webpack:///./src/components/modals/RoleModal.vue?0c92","webpack:///src/components/modals/RoleModal.vue","webpack:///./src/components/modals/RoleModal.vue?15f8","webpack:///./src/components/modals/RoleModal.vue","webpack:///src/components/TownSquare.vue","webpack:///./src/components/TownSquare.vue?335a","webpack:///./src/components/TownSquare.vue","webpack:///./src/components/TownInfo.vue?637a","webpack:///src/components/TownInfo.vue","webpack:///./src/components/TownInfo.vue?6260","webpack:///./src/components/TownInfo.vue","webpack:///./src/components/Menu.vue?ddbc","webpack:///src/components/Menu.vue","webpack:///./src/components/Menu.vue?9842","webpack:///./src/components/Menu.vue","webpack:///./src/components/modals/RolesModal.vue?5d08","webpack:///src/components/modals/RolesModal.vue","webpack:///./src/components/modals/RolesModal.vue?b003","webpack:///./src/components/modals/RolesModal.vue","webpack:///./src/components/modals/EditionModal.vue?5f9d","webpack:///src/components/modals/EditionModal.vue","webpack:///./src/components/modals/EditionModal.vue?d6f4","webpack:///./src/components/modals/EditionModal.vue","webpack:///./src/components/Intro.vue?3978","webpack:///src/components/Intro.vue","webpack:///./src/components/Intro.vue?a380","webpack:///./src/components/Intro.vue","webpack:///./src/components/modals/ReferenceModal.vue?d21c","webpack:///src/components/modals/ReferenceModal.vue","webpack:///./src/components/modals/ReferenceModal.vue?c23b","webpack:///./src/components/modals/ReferenceModal.vue","webpack:///./src/components/Vote.vue?9365","webpack:///src/components/Vote.vue","webpack:///./src/components/Vote.vue?2a1c","webpack:///./src/components/Vote.vue","webpack:///./src/components/Gradients.vue?6017","webpack:///src/components/Gradients.vue","webpack:///./src/components/Gradients.vue?d8ff","webpack:///./src/components/Gradients.vue","webpack:///./src/components/modals/NightOrderModal.vue?f4e6","webpack:///src/components/modals/NightOrderModal.vue","webpack:///./src/components/modals/NightOrderModal.vue?08ef","webpack:///./src/components/modals/NightOrderModal.vue","webpack:///./src/components/modals/FabledModal.vue?bf25","webpack:///src/components/modals/FabledModal.vue","webpack:///./src/components/modals/FabledModal.vue?aeda","webpack:///./src/components/modals/FabledModal.vue","webpack:///./src/components/modals/VoteHistoryModal.vue?2c2e","webpack:///src/components/modals/VoteHistoryModal.vue","webpack:///./src/components/modals/VoteHistoryModal.vue?485a","webpack:///./src/components/modals/VoteHistoryModal.vue","webpack:///./src/components/modals/GameStateModal.vue?542f","webpack:///src/components/modals/GameStateModal.vue","webpack:///./src/components/modals/GameStateModal.vue?7f16","webpack:///./src/components/modals/GameStateModal.vue","webpack:///src/App.vue","webpack:///./src/App.vue?b65f","webpack:///./src/App.vue","webpack:///./src/store/socket.js","webpack:///./src/store/modules/players.js","webpack:///./src/store/modules/session.js","webpack:///./src/store/index.js","webpack:///./src/main.js","webpack:///./src/assets/icons/cannibal.png","webpack:///./src/App.vue?6ee5","webpack:///./src/assets/icons/duchess.png","webpack:///./src/assets/icons/goblin.png","webpack:///./src/assets/icons/x.png","webpack:///./src/assets/editions/tb-minion.png","webpack:///./src/assets/icons sync ^\\.\\/.*\\.png$","webpack:///./src/assets/icons/fiddler.png","webpack:///./src/assets/icons/butler.png","webpack:///./src/assets/icons/doomsayer.png","webpack:///./src/assets/icons/juggler.png","webpack:///./src/assets/icons/balloonist.png","webpack:///./src/assets/icons/innkeeper.png","webpack:///./src/assets/icons/good.png","webpack:///./src/assets/icons/flowergirl.png","webpack:///./src/assets/icons/monk.png","webpack:///./src/assets/icons/nodashii.png","webpack:///./src/assets/icons/saint.png","webpack:///./src/assets/icons/fanggu.png","webpack:///./src/assets/icons/fibbin.png","webpack:///./src/assets/icons/dreamer.png","webpack:///./src/assets/editions/tb-outsider.png","webpack:///./src/components/modals/ReminderModal.vue?476f","webpack:///./src/assets/editions/bmr.png","webpack:///./src/components/Player.vue?6d3c","webpack:///./src/assets/icons/minion.png","webpack:///./src/assets/icons/pithag.png","webpack:///./src/components/modals/ReferenceModal.vue?ad1d","webpack:///./src/assets/icons/bishop.png","webpack:///./src/components/modals/VoteHistoryModal.vue?8ae0","webpack:///./src/components/modals/RoleModal.vue?6ac6","webpack:///./src/components/modals/Modal.vue?3563","webpack:///./src/assets/icons/acrobat.png","webpack:///./src/assets/icons/mathematician.png","webpack:///./src/assets/icons/bountyhunter.png","webpack:///./src/assets/icons/deusexfiasco.png","webpack:///./src/assets/icons/assassin.png","webpack:///./src/assets/editions/luf.png","webpack:///./src/assets/icons/godfather.png","webpack:///./src/assets/icons/thief.png","webpack:///./src/assets/icons/tinker.png","webpack:///./src/assets/icons/hellslibrarian.png","webpack:///./src/assets/editions/tb-demon.png","webpack:///./src/assets/icons/stormcatcher.png","webpack:///./src/assets/icons/pukka.png","webpack:///./src/assets/icons/voudon.png","webpack:///./src/assets/icons/pixie.png","webpack:///./src/assets/icons/revolutionary.png","webpack:///./src/assets/icons/seamstress.png","webpack:///./src/assets/icons/general.png","webpack:///./src/assets/icons/klutz.png","webpack:///./src/components/modals/GameStateModal.vue?392e","webpack:///./src/assets/icons/sentinel.png","webpack:///./src/assets/icons/matron.png","webpack:///./src/assets/icons/mayor.png","webpack:///./src/assets/icons/professor.png","webpack:///./src/assets/icons/investigator.png","webpack:///./src/assets/icons/snitch.png","webpack:///./src/assets/icons/tealady.png","webpack:///./src/assets/icons/empath.png","webpack:///./src/assets/icons/angel.png","webpack:///./src/components/Intro.vue?dc06","webpack:///./src/assets/icons/evil.png","webpack:///./src/assets/icons/lycanthrope.png","webpack:///./src/assets/icons/lilmonsta.png","webpack:///./src/components/TownInfo.vue?113f","webpack:///./src/assets/icons/fisherman.png","webpack:///./src/assets/icons/po.png","webpack:///./src/assets/icons/grandmother.png","webpack:///./src/assets/icons/gossip.png","webpack:///./src/assets/editions/bmr-demon.png","webpack:///./src/assets/icons/devilsadvocate.png","webpack:///./src/assets/editions sync ^\\.\\/.*\\.png$","webpack:///./src/assets/icons/beggar.png","webpack:///./src/assets/icons/slayer.png","webpack:///./src/assets/icons/savant.png","webpack:///./src/assets/icons/drunk.png","webpack:///./src/assets/icons/legion.png","webpack:///./src/assets/icons/gambler.png","webpack:///./src/assets/icons/mephit.png","webpack:///./src/store/persistence.js","webpack:///./src/assets/icons/eviltwin.png","webpack:///./src/assets/icons/djinn.png","webpack:///./src/components/modals/RolesModal.vue?831a","webpack:///./src/assets/editions/bmr-outsider.png","webpack:///./src/assets/editions/bmr-townsfolk.png","webpack:///./src/assets/icons/spy.png","webpack:///./src/assets/editions/snv-townsfolk.png","webpack:///./src/assets/icons/courtier.png","webpack:///./src/assets/icons/gunslinger.png","webpack:///./src/assets/icons/virgin.png","webpack:///./src/assets/icons/judge.png","webpack:///./src/assets/icons/sweetheart.png","webpack:///./src/assets/icons/poisoner.png","webpack:///./src/assets/icons/scarletwoman.png","webpack:///./src/assets/editions/snv-demon.png","webpack:///./src/assets/icons/vigormortis.png","webpack:///./src/assets/icons/witch.png","webpack:///./src/assets/sounds/countdown.mp3","webpack:///./src/components/Menu.vue?2bf9","webpack:///./src/assets/editions/tb-townsfolk.png","webpack:///./src/assets/icons/mastermind.png","webpack:///./src/assets/icons/clockmaker.png","webpack:///./src/assets/icons/barber.png","webpack:///./src/assets/icons/custom.png","webpack:///./src/components/modals/FabledModal.vue?31c5","webpack:///./src/assets/icons/pacifist.png"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","render","_vm","this","_h","$createElement","_c","_self","class","night","grimoire","isNight","style","backgroundImage","background","attrs","on","keyup","match","_e","staticClass","players","session","nomination","ref","_v","_s","version","staticRenderFns","public","isPublic","spectator","isSpectator","vote","_l","player","index","from","Math","max","swap","move","nominate","$event","handleTrigger","closed","isBluffsOpen","stopPropagation","toggleBluffs","openRoleModal","bluffs","fabled","isFabledOpen","toggleFabled","role","removeFabled","nightOrder","first","isNightOrder","firstNightReminder","other","otherNightReminder","selectedPlayer","dead","isDead","isVoteless","you","sessionId","id","playerId","votes","voteLocked","team","toggleStatus","$emit","cancel","swapPlayer","movePlayer","nominatePlayer","highlight","isRolesDistributed","updatePlayer","active","isMenuOpen","changeName","removePlayer","disabled","claimSeat","reminder","removeReminder","image","isImageOptIn","imageAlt","setRole","firstNight","otherNight","reminders","_f","ability","props","type","default","computed","filters","nameToFontSize","methods","component","components","Token","required","indexOf","indexAdjusted","lockedVote","zoom","unit","innerWidth","innerHeight","width","isSwap","prompt","closeMenu","$store","commit","modals","availableReminders","playerIndex","toggleModal","addReminder","close","_t","mapReminder","Modal","state","roles","forEach","some","bluff","map","remindersGlobal","otherTravelers","availableRoles","tab","size","values","townsfolk","Player","RoleModal","ReminderModal","bluffSize","method","params","confirm","to","undefined","edition","logo","teams","traveler","isOfficial","author","alive","outsider","minion","demon","nonTravelers","getters","filter","game","reconnecting","isReconnecting","ping","leaveSession","playerCount","open","toggleMenu","toggleGrimoire","toggleNight","toggleNightOrder","setZoom","round","imageOptIn","setBackground","toggleMuted","isMuted","copySessionUrl","distributeRoles","voteHistory","hostSession","joinSession","addPlayer","randomizeSeatings","clearPlayers","clearRoles","random","url","location","href","split","link","navigator","clipboard","writeText","popup","setTimeout","toggleImageOptIn","pop","dispatch","teamRoles","reduce","a","selected","checked","allowMultiple","directives","rawName","expression","domProps","Array","isArray","_i","$$a","$$el","target","$$c","$$v","$$i","concat","selectedRoles","assignRoles","selectRandomRoles","randomElement","arr","floor","roleSelection","b","hasSelectedSetupRoles","setup","$set","composition","keys","x","available","fill","sort","mounted","watch","isCustom","script","handleURL","handleUpload","openUpload","promptURL","setEdition","editions","scripts","$refs","upload","click","file","files","reader","FileReader","addEventListener","JSON","parse","parseRoles","e","alert","message","readAsText","res","fetch","json","metaIndex","findIndex","meta","customRoles","toLocaleLowerCase","replace","assign","has","_m","reference","playersByRole","join","rolesGrouped","nominator","nominee","voters","ceil","isVoteInProgress","votingSpeed","currentVote","preventDefault","setVotingSpeed","countdown","pause","voteTimer","stop","start","finish","nominatorStyle","transform","transitionDuration","nomineeStyle","lock","rotation","min","find","canVote","reorder","setInterval","clearInterval","diff","speed","gradient","gradients","rolesFirstNight","rolesOtherNight","setFabled","fable","clearVoteHistory","timestamp","getHours","toString","padStart","getMinutes","majority","gamestate","input","select","copy","load","stringify","rolesJSONbyId","GameStateModal","VoteHistoryModal","FabledModal","NightOrderModal","Vote","ReferenceModal","Intro","TownInfo","TownSquare","Menu","EditionModal","RolesModal","Gradients","ctrlKey","metaKey","menu","LiveSession","store","_wss","_socket","_isSpectator","_gamestate","_store","_pingInterval","_pingTimer","_reconnectTimer","_players","_pings","connect","channel","disconnect","WebSocket","_handleMessage","onopen","_onOpen","onclose","err","code","reason","command","readyState","send","_send","_sendDirect","sendGamestate","_ping","_handlePing","clearTimeout","console","log","_updateEdition","_updateFabled","_updateGamestate","_updatePlayer","_updateSeat","_handleVote","_handleLock","_handleBye","substr","_open","isLightweight","roleId","sendEdition","customRolesStripped","missing","playerIdOrCount","latency","now","Date","getTime","parseInt","pings","seat","oldIndex","fromST","payload","subscribe","hash","setVoteInProgress","lockVote","setIsNight","sendFabled","sendPlayer","NEWPLAYER","includes","Map","set","actions","rootState","mutations","namespaced","handleVote","claimedSeat","val","setPlayerId","setSpectator","setReconnecting","setPlayerCount","setPing","isBanishment","voteSync","use","editionJSONbyId","getRolesByEdition","localeCompare","getTravelersNotInEdition","toggle","customRole","Store","gameState","customKeys","strippedProps","strippedRole","prop","modal","mappedRole","plugins","socket","faIcons","fabIcons","add","config","productionTip","h","App","$mount","webpackContext","req","webpackContextResolve","Error","resolve","updatePagetitle","document","title","localStorage","getItem","parseFloat","removeItem","setItem"],"mappings":"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,8B,uBCA3CC,EAAOD,QAAU,IAA0B,4B,uBCA3CC,EAAOD,QAAU,IAA0B,2B,uBCA3CC,EAAOD,QAAU,IAA0B,gC,uBCA3CC,EAAOD,QAAU,IAA0B,kC,uBCA3CC,EAAOD,QAAU,IAA0B,+B,uBCA3CC,EAAOD,QAAU,IAA0B,gC,uBCA3CC,EAAOD,QAAU,IAA0B,yB,uBCA3CC,EAAOD,QAAU,IAA0B,4B,uBCA3CC,EAAOD,QAAU,IAA0B,2B,uBCA3CC,EAAOD,QAAU,IAA0B,6B,uBCA3CC,EAAOD,QAAU,IAA0B,yB,qBCA3CC,EAAOD,QAAU,IAA0B,6B,uBCA3CC,EAAOD,QAAU,IAA0B,4B,uBCA3CC,EAAOD,QAAU,IAA0B,2B,8CCA3CC,EAAOD,QAAU,IAA0B,0B,uBCA3CC,EAAOD,QAAU,IAA0B,kC,qBCA3CC,EAAOD,QAAU,IAA0B,6B,uBCA3CC,EAAOD,QAAU,IAA0B,0B,uBCA3CC,EAAOD,QAAU,IAA0B,+B,uBCA3CC,EAAOD,QAAU,IAA0B,+B,uBCA3CC,EAAOD,QAAU,IAA0B,8B,uBCA3CC,EAAOD,QAAU,IAA0B,2B,uBCA3CC,EAAOD,QAAU,IAA0B,wB,uBCA3CC,EAAOD,QAAU,IAA0B,yB,uBCA3CC,EAAOD,QAAU,IAA0B,8B,qBCA3CC,EAAOD,QAAU,IAA0B,gC,kCCA3C,W,uBCAAC,EAAOD,QAAU,IAA0B,4B,uBCA3CC,EAAOD,QAAU,IAA0B,8B,uBCA3CC,EAAOD,QAAU,IAA0B,+B,8CCA3CC,EAAOD,QAAU,IAA0B,6B,uBCA3CC,EAAOD,QAAU,IAA0B,2B,uBCA3CC,EAAOD,QAAU,IAA0B,4B,uBCA3CC,EAAOD,QAAU,IAA0B,wB,uBCA3CC,EAAOD,QAAU,IAA0B,8B,oCCA3C,W,qBCAAC,EAAOD,QAAU,IAA0B,iC,uBCA3CC,EAAOD,QAAU,IAA0B,kC,uBCA3CC,EAAOD,QAAU,IAA0B,2B,kCCA3C,W,uBCAAC,EAAOD,QAAU,IAA0B,+B,qBCA3CC,EAAOD,QAAU,IAA0B,yB,oCCA3C,W,uBCAAC,EAAOD,QAAU,IAA0B,+B,uBCA3CC,EAAOD,QAAU,IAA0B,8B,oCCA3C,W,gDCAAC,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","file":"js/app.1c759e02.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([\"56d7\",\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","module.exports = __webpack_public_path__ + \"img/washerwoman.a0c66e53.png\";","module.exports = __webpack_public_path__ + \"img/barista.fd2bba67.png\";","module.exports = __webpack_public_path__ + \"img/cerenovus.736554ca.png\";","module.exports = __webpack_public_path__ + \"img/amnesiac.12f018e7.png\";","module.exports = __webpack_public_path__ + \"img/politician.32246fcf.png\";","module.exports = __webpack_public_path__ + \"img/tb.438499cd.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NightOrderModal.vue?vue&type=style&index=0&id=1c012874&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/shabaloth.f461dd08.png\";","module.exports = __webpack_public_path__ + \"img/lunatic.f2982146.png\";","module.exports = __webpack_public_path__ + \"img/oracle.63459162.png\";","module.exports = __webpack_public_path__ + \"img/ravenkeeper.552f1f2f.png\";","module.exports = __webpack_public_path__ + \"img/spiritofivory.1ec5112e.png\";","module.exports = __webpack_public_path__ + \"img/undertaker.1df72155.png\";","module.exports = __webpack_public_path__ + \"img/chambermaid.b6f002ce.png\";","module.exports = __webpack_public_path__ + \"img/plus.c11bf1ed.png\";","module.exports = __webpack_public_path__ + \"img/recluse.a6519a1d.png\";","module.exports = __webpack_public_path__ + \"img/mutant.b28a535c.png\";","module.exports = __webpack_public_path__ + \"img/buddhist.72caa1e8.png\";","module.exports = __webpack_public_path__ + \"img/chef.d4e7f9a6.png\";","module.exports = __webpack_public_path__ + \"img/preacher.f3f608a6.png\";","module.exports = __webpack_public_path__ + \"img/zombuul.ec71a259.png\";","module.exports = __webpack_public_path__ + \"img/sailor.631521c2.png\";","module.exports = __webpack_public_path__ + \"img/widow.ec8d8cb0.png\";","module.exports = __webpack_public_path__ + \"img/bonecollector.846af8c8.png\";","module.exports = __webpack_public_path__ + \"img/outsider.43d9ce43.png\";","module.exports = __webpack_public_path__ + \"img/baron.9ce9bd3b.png\";","module.exports = __webpack_public_path__ + \"img/bureaucrat.88ec372a.png\";","module.exports = __webpack_public_path__ + \"img/bmr-minion.6559191b.png\";","module.exports = __webpack_public_path__ + \"img/leviathan.dfbff6e8.png\";","module.exports = __webpack_public_path__ + \"img/artist.f89690cd.png\";","module.exports = __webpack_public_path__ + \"img/snv.288a42ad.png\";","module.exports = __webpack_public_path__ + \"img/sage.5afc100d.png\";","module.exports = __webpack_public_path__ + \"img/scapegoat.8bd95c23.png\";","module.exports = __webpack_public_path__ + \"img/philosopher.92032c70.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=style&index=0&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/butcher.e0b672b7.png\";","module.exports = __webpack_public_path__ + \"img/towncrier.18a4377b.png\";","module.exports = __webpack_public_path__ + \"img/cultleader.de1fca53.png\";","module.exports = __webpack_public_path__ + \"img/toymaker.07b2e8fa.png\";","module.exports = __webpack_public_path__ + \"img/vortox.6add3a3a.png\";","module.exports = __webpack_public_path__ + \"img/deviant.e8a761ae.png\";","module.exports = __webpack_public_path__ + \"img/imp.cd0fa5b8.png\";","module.exports = __webpack_public_path__ + \"img/moonchild.6c84161e.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gradients.vue?vue&type=style&index=0&id=1e202a64&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/snakecharmer.e512cc1e.png\";","module.exports = __webpack_public_path__ + \"img/fortuneteller.4396927c.png\";","module.exports = __webpack_public_path__ + \"img/custom.5334aaeb.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=style&index=0&id=c7704f0e&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/snv-minion.60768802.png\";","module.exports = __webpack_public_path__ + \"img/fool.a730aab3.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditionModal.vue?vue&type=style&index=0&id=6113891e&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/apprentice.b7055345.png\";","module.exports = __webpack_public_path__ + \"img/librarian.6fd7f267.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Vote.vue?vue&type=style&index=0&id=00f24ea8&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/snv-outsider.5b5cae7f.png\";","module.exports = __webpack_public_path__ + \"img/soldier.451de0df.png\";","module.exports = __webpack_public_path__ + \"img/minstrel.1647382d.png\";","module.exports = __webpack_public_path__ + \"img/exorcist.8c0f5cac.png\";","module.exports = __webpack_public_path__ + \"img/harlot.1a418200.png\";","module.exports = __webpack_public_path__ + \"img/goon.719106f2.png\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:{ night: _vm.grimoire.isNight },style:({\n backgroundImage: _vm.grimoire.background\n ? (\"url('\" + (_vm.grimoire.background) + \"')\")\n : ''\n }),attrs:{\"id\":\"app\",\"tabindex\":\"-1\"},on:{\"keyup\":_vm.keyup}},[(_vm.grimoire.background && _vm.grimoire.background.match(/\\.(mp4|webm)$/i))?_c('video',{attrs:{\"id\":\"background\",\"src\":_vm.grimoire.background,\"autoplay\":\"\",\"loop\":\"\"}}):_vm._e(),_c('div',{staticClass:\"backdrop\"}),_c('transition',{attrs:{\"name\":\"blur\"}},[(!_vm.players.length)?_c('Intro'):_vm._e(),(_vm.players.length && !_vm.session.nomination)?_c('TownInfo'):_vm._e(),(_vm.session.nomination)?_c('Vote'):_vm._e()],1),_c('TownSquare'),_c('Menu',{ref:\"menu\"}),_c('EditionModal'),_c('FabledModal'),_c('RolesModal'),_c('ReferenceModal'),_c('NightOrderModal'),_c('VoteHistoryModal'),_c('GameStateModal'),_c('Gradients'),_c('span',{attrs:{\"id\":\"version\"}},[_vm._v(\"v\"+_vm._s(_vm.version))])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"square\",class:{\n public: _vm.grimoire.isPublic,\n spectator: _vm.session.isSpectator,\n vote: _vm.session.nomination\n },attrs:{\"id\":\"townsquare\"}},[_c('ul',{staticClass:\"circle\",class:['size-' + _vm.players.length]},_vm._l((_vm.players),function(player,index){return _c('Player',{key:index,class:{\n from: Math.max(_vm.swap, _vm.move, _vm.nominate) === index,\n swap: _vm.swap > -1,\n move: _vm.move > -1,\n nominate: _vm.nominate > -1\n },attrs:{\"player\":player},on:{\"trigger\":function($event){return _vm.handleTrigger(index, $event)}}})}),1),(_vm.players.length)?_c('div',{ref:\"bluffs\",staticClass:\"bluffs\",class:{ closed: !_vm.isBluffsOpen }},[_c('h3',[(_vm.session.isSpectator)?_c('span',[_vm._v(\"Other characters\")]):_c('span',[_vm._v(\"Demon bluffs\")]),_c('font-awesome-icon',{attrs:{\"icon\":\"times-circle\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleBluffs($event)}}}),_c('font-awesome-icon',{attrs:{\"icon\":\"plus-circle\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleBluffs($event)}}})],1),_c('ul',_vm._l((_vm.bluffSize),function(index){return _c('li',{key:index,on:{\"click\":function($event){return _vm.openRoleModal(index * -1)}}},[_c('Token',{attrs:{\"role\":_vm.bluffs[index - 1]}})],1)}),0)]):_vm._e(),(_vm.fabled.length)?_c('div',{staticClass:\"fabled\",class:{ closed: !_vm.isFabledOpen }},[_c('h3',[_c('span',[_vm._v(\"Fabled\")]),_c('font-awesome-icon',{attrs:{\"icon\":\"times-circle\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleFabled($event)}}}),_c('font-awesome-icon',{attrs:{\"icon\":\"plus-circle\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleFabled($event)}}})],1),_c('ul',_vm._l((_vm.fabled),function(role,index){return _c('li',{key:index,on:{\"click\":function($event){return _vm.removeFabled(index)}}},[(_vm.nightOrder.get(role).first && _vm.grimoire.isNightOrder)?_c('div',{staticClass:\"night-order first\"},[_c('em',[_vm._v(_vm._s(_vm.nightOrder.get(role).first)+\".\")]),(role.firstNightReminder)?_c('span',[_vm._v(_vm._s(role.firstNightReminder))]):_vm._e()]):_vm._e(),(_vm.nightOrder.get(role).other && _vm.grimoire.isNightOrder)?_c('div',{staticClass:\"night-order other\"},[_c('em',[_vm._v(_vm._s(_vm.nightOrder.get(role).other)+\".\")]),(role.otherNightReminder)?_c('span',[_vm._v(_vm._s(role.otherNightReminder))]):_vm._e()]):_vm._e(),_c('Token',{attrs:{\"role\":role}})],1)}),0)]):_vm._e(),_c('ReminderModal',{attrs:{\"player-index\":_vm.selectedPlayer}}),_c('RoleModal',{attrs:{\"player-index\":_vm.selectedPlayer}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',{style:(_vm.zoom)},[_c('div',{ref:\"player\",staticClass:\"player\",class:[\n {\n dead: _vm.player.isDead,\n 'no-vote': _vm.player.isVoteless,\n you: _vm.session.sessionId && _vm.player.id && _vm.player.id === _vm.session.playerId,\n 'vote-yes': _vm.session.votes[_vm.index],\n 'vote-lock': _vm.voteLocked\n },\n _vm.player.role.team\n ]},[_c('div',{staticClass:\"shroud\",on:{\"click\":function($event){return _vm.toggleStatus()}}}),_c('div',{staticClass:\"life\",on:{\"click\":function($event){return _vm.toggleStatus()}}}),(_vm.nightOrder.get(_vm.player).first && _vm.grimoire.isNightOrder)?_c('div',{staticClass:\"night-order first\"},[_c('em',[_vm._v(_vm._s(_vm.nightOrder.get(_vm.player).first)+\".\")]),(_vm.player.role.firstNightReminder)?_c('span',[_vm._v(_vm._s(_vm.player.role.firstNightReminder))]):_vm._e()]):_vm._e(),(_vm.nightOrder.get(_vm.player).other && _vm.grimoire.isNightOrder)?_c('div',{staticClass:\"night-order other\"},[_c('em',[_vm._v(_vm._s(_vm.nightOrder.get(_vm.player).other)+\".\")]),(_vm.player.role.otherNightReminder)?_c('span',[_vm._v(_vm._s(_vm.player.role.otherNightReminder))]):_vm._e()]):_vm._e(),_c('Token',{attrs:{\"role\":_vm.player.role},on:{\"set-role\":function($event){return _vm.$emit('trigger', ['openRoleModal'])}}}),_c('div',{staticClass:\"overlay\"},[_c('font-awesome-icon',{staticClass:\"vote\",attrs:{\"icon\":\"hand-paper\",\"title\":\"Hand UP\"},on:{\"click\":function($event){return _vm.vote()}}}),_c('font-awesome-icon',{staticClass:\"vote\",attrs:{\"icon\":\"times\",\"title\":\"Hand DOWN\"},on:{\"click\":function($event){return _vm.vote()}}}),_c('font-awesome-icon',{staticClass:\"cancel\",attrs:{\"icon\":\"times-circle\",\"title\":\"Cancel\"},on:{\"click\":function($event){return _vm.cancel()}}}),_c('font-awesome-icon',{staticClass:\"swap\",attrs:{\"icon\":\"exchange-alt\",\"title\":\"Swap seats with this player\"},on:{\"click\":function($event){return _vm.swapPlayer(_vm.player)}}}),_c('font-awesome-icon',{staticClass:\"move\",attrs:{\"icon\":\"redo-alt\",\"title\":\"Move player to this seat\"},on:{\"click\":function($event){return _vm.movePlayer(_vm.player)}}}),_c('font-awesome-icon',{staticClass:\"nominate\",attrs:{\"icon\":\"hand-point-right\",\"title\":\"Nominate this player\"},on:{\"click\":function($event){return _vm.nominatePlayer(_vm.player)}}})],1),(_vm.player.id && _vm.session.sessionId)?_c('font-awesome-icon',{staticClass:\"seat\",class:{ highlight: _vm.session.isRolesDistributed },attrs:{\"icon\":\"chair\"}}):_vm._e(),(_vm.player.isDead && !_vm.player.isVoteless)?_c('font-awesome-icon',{staticClass:\"has-vote\",attrs:{\"icon\":\"vote-yea\",\"title\":\"Ghost vote\"},on:{\"click\":function($event){return _vm.updatePlayer('isVoteless', true)}}}):_vm._e(),_c('div',{staticClass:\"name\",class:{ active: _vm.isMenuOpen },on:{\"click\":function($event){_vm.isMenuOpen = !_vm.isMenuOpen}}},[_vm._v(\" \"+_vm._s(_vm.player.name)+\" \")]),_c('transition',{attrs:{\"name\":\"fold\"}},[(_vm.isMenuOpen)?_c('ul',{staticClass:\"menu\"},[(!_vm.session.isSpectator)?[_c('li',{on:{\"click\":_vm.changeName}},[_c('font-awesome-icon',{attrs:{\"icon\":\"user-edit\"}}),_vm._v(\"Rename \")],1),(!_vm.session.nomination)?_c('li',{on:{\"click\":function($event){return _vm.nominatePlayer()}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"hand-point-right\"}}),_vm._v(\" Nomination \")],1):_vm._e(),_c('li',{on:{\"click\":function($event){return _vm.movePlayer()}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"redo-alt\"}}),_vm._v(\" Move player \")],1),_c('li',{on:{\"click\":function($event){return _vm.swapPlayer()}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"exchange-alt\"}}),_vm._v(\" Swap seats \")],1),_c('li',{on:{\"click\":_vm.removePlayer}},[_c('font-awesome-icon',{attrs:{\"icon\":\"times-circle\"}}),_vm._v(\" Remove \")],1),(_vm.player.id && _vm.session.sessionId)?_c('li',{on:{\"click\":function($event){return _vm.updatePlayer('id', '', true)}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"chair\"}}),_vm._v(\" Empty seat \")],1):_vm._e()]:_vm._e(),(_vm.session.isSpectator)?_c('li',{class:{ disabled: _vm.player.id && _vm.player.id !== _vm.session.playerId },on:{\"click\":_vm.claimSeat}},[_c('font-awesome-icon',{attrs:{\"icon\":\"chair\"}}),(!_vm.player.id)?[_vm._v(\" Claim seat \")]:(_vm.player.id === _vm.session.playerId)?[_vm._v(\" Vacate seat \")]:[_vm._v(\" Seat occupied\")]],2):_vm._e()],2):_vm._e()])],1),(_vm.player.reminders)?_vm._l((_vm.player.reminders),function(reminder){return _c('div',{key:reminder.role + ' ' + reminder.name,staticClass:\"reminder\",class:[reminder.role],on:{\"click\":function($event){return _vm.removeReminder(reminder)}}},[_c('span',{staticClass:\"icon\",style:({\n backgroundImage: (\"url(\" + (reminder.image && _vm.grimoire.isImageOptIn\n ? reminder.image\n : require('../assets/icons/' +\n (reminder.imageAlt || reminder.role) +\n '.png')) + \")\")\n })}),_c('span',{staticClass:\"text\"},[_vm._v(_vm._s(reminder.name))])])}):_vm._e(),_c('div',{staticClass:\"reminder add\",on:{\"click\":function($event){return _vm.$emit('trigger', ['openReminderModal'])}}},[_c('span',{staticClass:\"icon\"})])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"token\",class:[_vm.role.id],on:{\"click\":_vm.setRole}},[(_vm.role.id)?_c('span',{staticClass:\"icon\",style:({\n backgroundImage: (\"url(\" + (_vm.role.image && _vm.grimoire.isImageOptIn\n ? _vm.role.image\n : require('../assets/icons/' + (_vm.role.imageAlt || _vm.role.id) + '.png')) + \")\")\n })}):_vm._e(),(_vm.role.firstNight || _vm.role.firstNightReminder)?_c('span',{staticClass:\"leaf-left\"}):_vm._e(),(_vm.role.otherNight || _vm.role.otherNightReminder)?_c('span',{staticClass:\"leaf-right\"}):_vm._e(),(_vm.role.reminders && _vm.role.reminders.length)?_c('span',{class:['leaf-top' + _vm.role.reminders.length]}):_vm._e(),(_vm.role.setup)?_c('span',{staticClass:\"leaf-orange\"}):_vm._e(),_c('svg',{staticClass:\"name\",attrs:{\"viewBox\":\"0 0 150 150\"}},[_c('path',{attrs:{\"d\":\"M 13 75 C 13 160, 138 160, 138 75\",\"id\":\"curve\",\"fill\":\"transparent\"}}),_c('text',{staticClass:\"label mozilla\",attrs:{\"width\":\"150\",\"x\":\"66.6%\",\"text-anchor\":\"middle\",\"font-size\":_vm._f(\"nameToFontSize\")(_vm.role.name)}},[_c('textPath',{attrs:{\"xlink:href\":\"#curve\"}},[_vm._v(\" \"+_vm._s(_vm.role.name)+\" \")])])]),_c('div',{staticClass:\"edition\",class:[(\"edition-\" + (_vm.role.edition)), _vm.role.team]}),(_vm.role.ability)?_c('div',{staticClass:\"ability\"},[_vm._v(\" \"+_vm._s(_vm.role.ability)+\" \")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"token\" @click=\"setRole\" :class=\"[role.id]\">\n <span\n class=\"icon\"\n v-if=\"role.id\"\n :style=\"{\n backgroundImage: `url(${\n role.image && grimoire.isImageOptIn\n ? role.image\n : require('../assets/icons/' + (role.imageAlt || role.id) + '.png')\n })`\n }\"\n ></span>\n <span\n class=\"leaf-left\"\n v-if=\"role.firstNight || role.firstNightReminder\"\n ></span>\n <span\n class=\"leaf-right\"\n v-if=\"role.otherNight || role.otherNightReminder\"\n ></span>\n <span\n v-if=\"role.reminders && role.reminders.length\"\n :class=\"['leaf-top' + role.reminders.length]\"\n ></span>\n <span class=\"leaf-orange\" v-if=\"role.setup\"></span>\n <svg viewBox=\"0 0 150 150\" class=\"name\">\n <path\n d=\"M 13 75 C 13 160, 138 160, 138 75\"\n id=\"curve\"\n fill=\"transparent\"\n />\n <text\n width=\"150\"\n x=\"66.6%\"\n text-anchor=\"middle\"\n class=\"label mozilla\"\n :font-size=\"role.name | nameToFontSize\"\n >\n <textPath xlink:href=\"#curve\">\n {{ role.name }}\n </textPath>\n </text>\n </svg>\n <div class=\"edition\" :class=\"[`edition-${role.edition}`, role.team]\"></div>\n <div class=\"ability\" v-if=\"role.ability\">\n {{ role.ability }}\n </div>\n </div>\n</template>\n\n<script>\nimport { mapState } from \"vuex\";\n\nexport default {\n name: \"Token\",\n props: {\n role: {\n type: Object,\n default: () => ({})\n }\n },\n computed: {\n ...mapState([\"grimoire\"])\n },\n data() {\n return {};\n },\n filters: {\n nameToFontSize: name => (name && name.length > 10 ? \"90%\" : \"110%\")\n },\n methods: {\n setRole() {\n this.$emit(\"set-role\");\n }\n }\n};\n</script>\n\n<style scoped lang=\"scss\">\n.token {\n border-radius: 50%;\n width: 100%;\n background: url(\"../assets/token.png\") center center;\n background-size: 100%;\n text-align: center;\n border: 3px solid black;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: border-color 250ms;\n\n &:hover .name .label {\n stroke: black;\n fill: white;\n @-moz-document url-prefix() {\n &.mozilla {\n stroke: none;\n filter: drop-shadow(0 1.5px 0 black) drop-shadow(0 -1.5px 0 black)\n drop-shadow(1.5px 0 0 black) drop-shadow(-1.5px 0 0 black)\n drop-shadow(0 2px 2px rgba(0, 0, 0, 0.5));\n }\n }\n }\n\n .icon,\n &:before {\n background-size: 100%;\n background-repeat: no-repeat;\n background-position: center 30%;\n position: absolute;\n width: 100%;\n height: 100%;\n margin-top: 3%;\n }\n\n span {\n position: absolute;\n width: 100%;\n height: 100%;\n background-size: 100%;\n pointer-events: none;\n\n &.leaf-left {\n background-image: url(\"../assets/leaf-left.png\");\n }\n\n &.leaf-orange {\n background-image: url(\"../assets/leaf-orange.png\");\n }\n\n &.leaf-right {\n background-image: url(\"../assets/leaf-right.png\");\n }\n\n &.leaf-top1 {\n background-image: url(\"../assets/leaf-top1.png\");\n }\n\n &.leaf-top2 {\n background-image: url(\"../assets/leaf-top2.png\");\n }\n\n &.leaf-top3 {\n background-image: url(\"../assets/leaf-top3.png\");\n }\n\n &.leaf-top4 {\n background-image: url(\"../assets/leaf-top4.png\");\n }\n\n &.leaf-top5 {\n background-image: url(\"../assets/leaf-top5.png\");\n }\n }\n\n .name {\n width: 100%;\n height: 100%;\n font-size: 24px; // svg fonts are relative to document font size\n .label {\n fill: black;\n stroke: white;\n stroke-width: 2px;\n paint-order: stroke;\n font-family: \"Papyrus\", serif;\n font-weight: bold;\n text-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);\n letter-spacing: 1px;\n\n @-moz-document url-prefix() {\n &.mozilla {\n // Vue doesn't support scoped media queries, so we have to use a second css class\n stroke: none;\n text-shadow: none;\n filter: drop-shadow(0 1.5px 0 white) drop-shadow(0 -1.5px 0 white)\n drop-shadow(1.5px 0 0 white) drop-shadow(-1.5px 0 0 white)\n drop-shadow(0 2px 2px rgba(0, 0, 0, 0.5));\n }\n }\n }\n }\n\n .edition {\n position: absolute;\n right: 0;\n bottom: 5px;\n width: 30px;\n height: 30px;\n background-size: 100%;\n display: none;\n }\n\n .ability {\n display: flex;\n position: absolute;\n padding: 5px 10px;\n left: 120%;\n width: 250px;\n z-index: 25;\n font-size: 80%;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 10px;\n border: 3px solid black;\n filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.5));\n text-align: left;\n justify-items: center;\n align-content: center;\n align-items: center;\n pointer-events: none;\n opacity: 0;\n transition: opacity 200ms ease-in-out;\n\n &:before {\n content: \" \";\n border: 10px solid transparent;\n width: 0;\n height: 0;\n border-right-color: black;\n position: absolute;\n margin-right: 2px;\n right: 100%;\n }\n }\n\n &:hover .ability {\n opacity: 1;\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Token.vue?vue&type=template&id=c7704f0e&scoped=true&\"\nimport script from \"./Token.vue?vue&type=script&lang=js&\"\nexport * from \"./Token.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Token.vue?vue&type=style&index=0&id=c7704f0e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c7704f0e\",\n null\n \n)\n\nexport default component.exports","<template>\n <li :style=\"zoom\">\n <div\n ref=\"player\"\n class=\"player\"\n :class=\"[\n {\n dead: player.isDead,\n 'no-vote': player.isVoteless,\n you: session.sessionId && player.id && player.id === session.playerId,\n 'vote-yes': session.votes[index],\n 'vote-lock': voteLocked\n },\n player.role.team\n ]\"\n >\n <div class=\"shroud\" @click=\"toggleStatus()\"></div>\n <div class=\"life\" @click=\"toggleStatus()\"></div>\n\n <div\n class=\"night-order first\"\n v-if=\"nightOrder.get(player).first && grimoire.isNightOrder\"\n >\n <em>{{ nightOrder.get(player).first }}.</em>\n <span v-if=\"player.role.firstNightReminder\">{{\n player.role.firstNightReminder\n }}</span>\n </div>\n <div\n class=\"night-order other\"\n v-if=\"nightOrder.get(player).other && grimoire.isNightOrder\"\n >\n <em>{{ nightOrder.get(player).other }}.</em>\n <span v-if=\"player.role.otherNightReminder\">{{\n player.role.otherNightReminder\n }}</span>\n </div>\n\n <Token\n :role=\"player.role\"\n @set-role=\"$emit('trigger', ['openRoleModal'])\"\n />\n\n <!-- Overlay icons -->\n <div class=\"overlay\">\n <font-awesome-icon\n icon=\"hand-paper\"\n class=\"vote\"\n title=\"Hand UP\"\n @click=\"vote()\"\n />\n <font-awesome-icon\n icon=\"times\"\n class=\"vote\"\n title=\"Hand DOWN\"\n @click=\"vote()\"\n />\n <font-awesome-icon\n icon=\"times-circle\"\n class=\"cancel\"\n title=\"Cancel\"\n @click=\"cancel()\"\n />\n <font-awesome-icon\n icon=\"exchange-alt\"\n class=\"swap\"\n @click=\"swapPlayer(player)\"\n title=\"Swap seats with this player\"\n />\n <font-awesome-icon\n icon=\"redo-alt\"\n class=\"move\"\n @click=\"movePlayer(player)\"\n title=\"Move player to this seat\"\n />\n <font-awesome-icon\n icon=\"hand-point-right\"\n class=\"nominate\"\n @click=\"nominatePlayer(player)\"\n title=\"Nominate this player\"\n />\n </div>\n\n <!-- Claimed seat icon -->\n <font-awesome-icon\n icon=\"chair\"\n v-if=\"player.id && session.sessionId\"\n class=\"seat\"\n :class=\"{ highlight: session.isRolesDistributed }\"\n />\n\n <!-- Ghost vote icon -->\n <font-awesome-icon\n icon=\"vote-yea\"\n class=\"has-vote\"\n v-if=\"player.isDead && !player.isVoteless\"\n @click=\"updatePlayer('isVoteless', true)\"\n title=\"Ghost vote\"\n />\n\n <div\n class=\"name\"\n @click=\"isMenuOpen = !isMenuOpen\"\n :class=\"{ active: isMenuOpen }\"\n >\n {{ player.name }}\n </div>\n\n <transition name=\"fold\">\n <ul class=\"menu\" v-if=\"isMenuOpen\">\n <template v-if=\"!session.isSpectator\">\n <li @click=\"changeName\">\n <font-awesome-icon icon=\"user-edit\" />Rename\n </li>\n <li v-if=\"!session.nomination\" @click=\"nominatePlayer()\">\n <font-awesome-icon icon=\"hand-point-right\" />\n Nomination\n </li>\n <li @click=\"movePlayer()\">\n <font-awesome-icon icon=\"redo-alt\" />\n Move player\n </li>\n <li @click=\"swapPlayer()\">\n <font-awesome-icon icon=\"exchange-alt\" />\n Swap seats\n </li>\n <li @click=\"removePlayer\">\n <font-awesome-icon icon=\"times-circle\" />\n Remove\n </li>\n <li\n @click=\"updatePlayer('id', '', true)\"\n v-if=\"player.id && session.sessionId\"\n >\n <font-awesome-icon icon=\"chair\" />\n Empty seat\n </li>\n </template>\n <li\n @click=\"claimSeat\"\n v-if=\"session.isSpectator\"\n :class=\"{ disabled: player.id && player.id !== session.playerId }\"\n >\n <font-awesome-icon icon=\"chair\" />\n <template v-if=\"!player.id\">\n Claim seat\n </template>\n <template v-else-if=\"player.id === session.playerId\">\n Vacate seat\n </template>\n <template v-else> Seat occupied</template>\n </li>\n </ul>\n </transition>\n </div>\n\n <template v-if=\"player.reminders\">\n <div\n class=\"reminder\"\n :key=\"reminder.role + ' ' + reminder.name\"\n v-for=\"reminder in player.reminders\"\n :class=\"[reminder.role]\"\n @click=\"removeReminder(reminder)\"\n >\n <span\n class=\"icon\"\n :style=\"{\n backgroundImage: `url(${\n reminder.image && grimoire.isImageOptIn\n ? reminder.image\n : require('../assets/icons/' +\n (reminder.imageAlt || reminder.role) +\n '.png')\n })`\n }\"\n ></span>\n <span class=\"text\">{{ reminder.name }}</span>\n </div>\n </template>\n <div class=\"reminder add\" @click=\"$emit('trigger', ['openReminderModal'])\">\n <span class=\"icon\"></span>\n </div>\n </li>\n</template>\n\n<script>\nimport Token from \"./Token\";\nimport { mapGetters, mapState } from \"vuex\";\n\nexport default {\n components: {\n Token\n },\n props: {\n player: {\n type: Object,\n required: true\n }\n },\n computed: {\n ...mapState(\"players\", [\"players\"]),\n ...mapState([\"grimoire\", \"session\"]),\n ...mapGetters({ nightOrder: \"players/nightOrder\" }),\n index: function() {\n return this.players.indexOf(this.player);\n },\n voteLocked: function() {\n const session = this.session;\n const players = this.players.length;\n if (!session.nomination) return false;\n const indexAdjusted =\n (this.index - 1 + players - session.nomination[1]) % players;\n return indexAdjusted < session.lockedVote - 1;\n },\n zoom: function() {\n const unit = window.innerWidth > window.innerHeight ? \"vh\" : \"vw\";\n if (this.players.length < 7) {\n return { width: 18 + this.grimoire.zoom + unit };\n } else if (this.players.length <= 10) {\n return { width: 16 + this.grimoire.zoom + unit };\n } else if (this.players.length <= 15) {\n return { width: 14 + this.grimoire.zoom + unit };\n } else {\n return { width: 12 + this.grimoire.zoom + unit };\n }\n }\n },\n data() {\n return {\n isMenuOpen: false,\n isSwap: false\n };\n },\n methods: {\n toggleStatus() {\n if (this.grimoire.isPublic) {\n if (!this.player.isDead) {\n this.updatePlayer(\"isDead\", true);\n } else if (this.player.isVoteless) {\n this.updatePlayer(\"isVoteless\", false);\n this.updatePlayer(\"isDead\", false);\n } else {\n this.updatePlayer(\"isVoteless\", true);\n }\n } else {\n this.updatePlayer(\"isDead\", !this.player.isDead);\n if (this.player.isVoteless) {\n this.updatePlayer(\"isVoteless\", false);\n }\n }\n },\n changeName() {\n if (this.session.isSpectator) return;\n const name = prompt(\"Player name\", this.player.name) || this.player.name;\n this.updatePlayer(\"name\", name, true);\n },\n removeReminder(reminder) {\n const reminders = [...this.player.reminders];\n reminders.splice(this.player.reminders.indexOf(reminder), 1);\n this.updatePlayer(\"reminders\", reminders, true);\n },\n updatePlayer(property, value, closeMenu = false) {\n if (this.session.isSpectator && property !== \"reminders\") return;\n this.$store.commit(\"players/update\", {\n player: this.player,\n property,\n value\n });\n if (closeMenu) {\n this.isMenuOpen = false;\n }\n },\n removePlayer() {\n this.isMenuOpen = false;\n this.$emit(\"trigger\", [\"removePlayer\"]);\n },\n swapPlayer(player) {\n this.isMenuOpen = false;\n this.$emit(\"trigger\", [\"swapPlayer\", player]);\n },\n movePlayer(player) {\n this.isMenuOpen = false;\n this.$emit(\"trigger\", [\"movePlayer\", player]);\n },\n nominatePlayer(player) {\n this.isMenuOpen = false;\n this.$emit(\"trigger\", [\"nominatePlayer\", player]);\n },\n cancel() {\n this.$emit(\"trigger\", [\"cancel\"]);\n },\n claimSeat() {\n this.isMenuOpen = false;\n this.$emit(\"trigger\", [\"claimSeat\"]);\n },\n /**\n * Allow the ST to override a locked vote.\n */\n vote() {\n if (this.session.isSpectator) return;\n if (!this.voteLocked) return;\n this.$store.commit(\"session/voteSync\", [\n this.index,\n !this.session.votes[this.index]\n ]);\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"../vars.scss\";\n\n.fold-enter-active,\n.fold-leave-active {\n transition: transform 250ms ease-in-out;\n transform-origin: left center;\n transform: perspective(200px);\n}\n.fold-enter,\n.fold-leave-to {\n transform: perspective(200px) rotateY(90deg);\n}\n\n/***** Player token *****/\n.circle .player {\n margin-bottom: 10px;\n\n &:before {\n content: \" \";\n display: block;\n padding-top: 100%;\n }\n\n .shroud {\n top: 0;\n left: 0;\n position: absolute;\n width: 100%;\n height: 45%;\n cursor: pointer;\n transform: rotateX(0deg);\n transform-origin: top center;\n transition: transform 200ms ease-in-out;\n z-index: 2;\n filter: drop-shadow(0 0 5px rgba(0, 0, 0, 0.8));\n\n &:before {\n content: \" \";\n background: url(\"../assets/shroud.png\") center -10px no-repeat;\n background-size: auto 110%;\n position: absolute;\n margin-left: -50%;\n width: 100%;\n height: 100%;\n left: 50%;\n top: -30%;\n opacity: 0;\n transform: perspective(400px) scale(1.5);\n transform-origin: top center;\n transition: all 200ms;\n pointer-events: none;\n }\n\n #townsquare.spectator & {\n pointer-events: none;\n }\n\n #townsquare:not(.spectator) &:hover:before {\n opacity: 0.5;\n top: -10px;\n transform: scale(1);\n }\n }\n\n &.dead .shroud:before {\n opacity: 1;\n top: 0;\n transform: perspective(400px) scale(1);\n }\n\n #townsquare:not(.spectator) &.dead .shroud:hover:before {\n opacity: 1;\n }\n}\n\n/****** Life token *******/\n.player {\n z-index: 2;\n .life {\n border-radius: 50%;\n width: 100%;\n background: url(\"../assets/life.png\") center center;\n background-size: 100%;\n border: 3px solid black;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n cursor: pointer;\n transition: transform 200ms ease-in-out;\n transform: perspective(400px) rotateY(180deg);\n backface-visibility: hidden;\n position: absolute;\n left: 0;\n top: 0;\n\n &:before {\n content: \" \";\n display: block;\n padding-top: 100%;\n }\n }\n\n &.dead {\n &.no-vote .life:after {\n display: none;\n }\n\n .life {\n background-image: url(\"../assets/death.png\");\n\n &:after {\n content: \" \";\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n background: url(\"../assets/vote.png\") center center no-repeat;\n background-size: 50%;\n height: 100%;\n pointer-events: none;\n }\n }\n }\n\n &.traveler .life {\n filter: grayscale(100%);\n }\n}\n\n#townsquare.public .player {\n .shroud {\n transform: perspective(400px) rotateX(90deg);\n pointer-events: none;\n }\n\n .life {\n transform: perspective(400px) rotateY(0deg);\n }\n\n &.traveler:not(.dead) .token {\n transform: perspective(400px) scale(0.8);\n pointer-events: none;\n transition-delay: 0s;\n }\n\n &.traveler.dead .token {\n transition-delay: 0s;\n }\n}\n\n/***** Role token ******/\n.player .token {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n transition: transform 200ms ease-in-out;\n transform: perspective(400px) rotateY(0deg);\n backface-visibility: hidden;\n}\n\n#townsquare.public .circle .token {\n transform: perspective(400px) rotateY(-180deg);\n}\n\n/****** Player choice icons *******/\n.player .overlay {\n width: 100%;\n position: absolute;\n pointer-events: none;\n top: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n &:after {\n content: \" \";\n display: block;\n padding-top: 100%;\n }\n}\n.player .overlay svg {\n position: absolute;\n filter: drop-shadow(0 0 3px black);\n z-index: 2;\n cursor: pointer;\n &.swap,\n &.move,\n &.nominate,\n &.vote,\n &.cancel {\n width: 50%;\n height: 60%;\n opacity: 0;\n pointer-events: none;\n transition: all 250ms;\n transform: scale(0.2);\n * {\n stroke-width: 10px;\n stroke: white;\n fill: url(#default);\n }\n &:hover *,\n &.fa-hand-paper * {\n fill: url(#demon);\n }\n &.fa-times * {\n fill: url(#townsfolk);\n }\n }\n}\n\n// other player voted yes, but is not locked yet\n#townsquare.vote .player.vote-yes .overlay svg.vote.fa-hand-paper {\n opacity: 0.5;\n transform: scale(1);\n}\n\n// you voted yes | a locked vote yes | a locked vote no\n#townsquare.vote .player.you.vote-yes .overlay svg.vote.fa-hand-paper,\n#townsquare.vote .player.vote-lock.vote-yes .overlay svg.vote.fa-hand-paper,\n#townsquare.vote .player.vote-lock:not(.vote-yes) .overlay svg.vote.fa-times {\n opacity: 1;\n transform: scale(1);\n}\n\n// a locked vote can be clicked on by the ST\n#townsquare.vote:not(.spectator) .player.vote-lock .overlay svg.vote {\n pointer-events: all;\n}\n\nli.from:not(.nominate) .player .overlay svg.cancel {\n opacity: 1;\n transform: scale(1);\n pointer-events: all;\n}\n\nli.swap:not(.from) .player .overlay svg.swap,\nli.nominate .player .overlay svg.nominate,\nli.move:not(.from) .player .overlay svg.move {\n opacity: 1;\n transform: scale(1);\n pointer-events: all;\n}\n\n/****** Vote icon ********/\n.player .has-vote {\n position: absolute;\n right: 2px;\n margin-top: -15%;\n color: #fff;\n filter: drop-shadow(0 0 3px black);\n transition: opacity 250ms;\n z-index: 2;\n\n #townsquare.public & {\n opacity: 0;\n pointer-events: none;\n }\n}\n\n/****** Session seat glow *****/\n@mixin glow($name, $color) {\n @keyframes #{$name}-glow {\n 0% {\n box-shadow: 0 0 rgba($color, 1);\n border-color: $color;\n }\n 50% {\n border-color: black;\n }\n 100% {\n box-shadow: 0 0 20px 16px transparent;\n border-color: $color;\n }\n }\n\n .player.you.#{$name} .token {\n animation: #{$name}-glow 5s ease-in-out infinite;\n }\n}\n\n@include glow(\"townsfolk\", $townsfolk);\n@include glow(\"outsider\", $outsider);\n@include glow(\"demon\", $demon);\n@include glow(\"minion\", $minion);\n@include glow(\"traveler\", $traveler);\n\n.player.you .token {\n animation: townsfolk-glow 5s ease-in-out infinite;\n}\n\n/****** Seat icon ********/\n.player .seat {\n position: absolute;\n left: 2px;\n margin-top: -15%;\n color: #fff;\n filter: drop-shadow(0 0 3px black);\n cursor: default;\n z-index: 2;\n &.highlight {\n animation-iteration-count: 1;\n animation: redToWhite 1s normal forwards;\n }\n}\n\n// highlight animation\n@keyframes redToWhite {\n from {\n color: $demon;\n }\n to {\n color: white;\n }\n}\n\n.player.you .seat {\n color: $townsfolk;\n}\n\n/***** Player name *****/\n.player > .name {\n text-align: center;\n font-size: 120%;\n line-height: 120%;\n cursor: pointer;\n white-space: nowrap;\n width: 100%;\n background: rgba(0, 0, 0, 0.5);\n border: 3px solid black;\n border-radius: 10px;\n top: 5px;\n box-shadow: 0 0 5px black;\n text-overflow: ellipsis;\n overflow: hidden;\n padding: 0 4px;\n\n #townsquare:not(.spectator) &:hover,\n &.active {\n color: red;\n }\n}\n\n.player.dead > .name {\n opacity: 0.5;\n}\n\n/***** Player menu *****/\n.player > .menu {\n position: absolute;\n left: 100%;\n bottom: -5px;\n text-align: left;\n white-space: nowrap;\n background: rgba(0, 0, 0, 0.5);\n padding: 2px 5px;\n border-radius: 10px;\n border: 3px solid #000;\n margin-left: 15px;\n cursor: pointer;\n box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);\n\n &:before {\n content: \" \";\n width: 0;\n height: 0;\n position: absolute;\n border: 10px solid transparent;\n border-right-color: black;\n right: 100%;\n bottom: 5px;\n margin-right: 2px;\n }\n\n li:hover {\n color: red;\n }\n\n li.disabled {\n cursor: default;\n &:hover {\n color: white;\n }\n }\n\n svg {\n margin-right: 2px;\n }\n}\n\n/***** Ability text *****/\n#townsquare.public .circle .ability {\n display: none;\n}\n.circle .player .shroud:hover ~ .token .ability,\n.circle .player .token:hover .ability {\n opacity: 1;\n}\n\n/**** Night reminders ****/\n.player .night-order {\n z-index: 3;\n}\n\n.player.dead .night-order em {\n color: #ddd;\n background: linear-gradient(180deg, rgba(0, 0, 0, 1) 0%, gray 100%);\n}\n\n/***** Reminder token *****/\n.circle .reminder {\n background: url(\"../assets/reminder.png\") center center;\n background-size: 100%;\n width: 50%;\n height: 0;\n padding-bottom: 50%;\n box-sizing: content-box;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 5px 0 0 -25%;\n border-radius: 50%;\n border: 3px solid black;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n transition: all 200ms;\n cursor: pointer;\n\n .text {\n line-height: 90%;\n color: black;\n font-size: 50%;\n font-weight: bold;\n text-align: center;\n margin-top: 50%;\n height: 100%;\n width: 100%;\n position: absolute;\n top: 15%;\n text-shadow: 0 1px 1px #f6dfbd, 0 -1px 1px #f6dfbd, 1px 0 1px #f6dfbd,\n -1px 0 1px #f6dfbd;\n }\n\n .icon,\n &:after {\n content: \" \";\n position: absolute;\n top: 0;\n width: 90%;\n height: 90%;\n background-size: 100%;\n background-position: center 0;\n background-repeat: no-repeat;\n background-image: url(\"../assets/icons/plus.png\");\n transition: opacity 200ms;\n }\n\n &:after {\n background-image: url(\"../assets/icons/x.png\");\n opacity: 0;\n top: 5%;\n }\n\n &.add {\n opacity: 0;\n top: 30px;\n &:after {\n display: none;\n }\n .icon {\n top: 5%;\n }\n }\n\n &.custom {\n .icon {\n display: none;\n }\n .text {\n font-size: 70%;\n word-break: break-word;\n margin-top: 0;\n display: flex;\n align-items: center;\n align-content: center;\n justify-content: center;\n border-radius: 50%;\n top: 0;\n }\n }\n\n &:hover:before {\n opacity: 0;\n }\n &:hover:after {\n opacity: 1;\n }\n}\n.circle li:hover .reminder.add {\n opacity: 1;\n top: 0;\n}\n.circle li:hover .reminder.add:before {\n opacity: 1;\n}\n\n#townsquare.public .reminder {\n opacity: 0;\n pointer-events: none;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Player.vue?vue&type=template&id=50a644e6&\"\nimport script from \"./Player.vue?vue&type=script&lang=js&\"\nexport * from \"./Player.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Player.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.modals.reminder && _vm.availableReminders.length && _vm.players[_vm.playerIndex])?_c('Modal',{on:{\"close\":function($event){return _vm.toggleModal('reminder')}}},[_c('h3',[_vm._v(\"Choose a reminder token:\")]),_c('ul',{staticClass:\"reminders\"},_vm._l((_vm.availableReminders),function(reminder){return _c('li',{key:reminder.role + ' ' + reminder.name,staticClass:\"reminder\",class:[reminder.role],on:{\"click\":function($event){return _vm.addReminder(reminder)}}},[_c('span',{staticClass:\"icon\",style:({\n backgroundImage: (\"url(\" + (reminder.image && _vm.grimoire.isImageOptIn\n ? reminder.image\n : require('../../assets/icons/' +\n (reminder.imageAlt || reminder.role) +\n '.png')) + \")\")\n })}),_c('span',{staticClass:\"text\"},[_vm._v(_vm._s(reminder.name))])])}),0)]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"modal-fade\"}},[_c('div',{staticClass:\"modal-backdrop\",on:{\"click\":_vm.close}},[_c('div',{staticClass:\"modal\",attrs:{\"role\":\"dialog\",\"aria-labelledby\":\"modalTitle\",\"aria-describedby\":\"modalDescription\"},on:{\"click\":function($event){$event.stopPropagation();}}},[_c('font-awesome-icon',{staticClass:\"close\",attrs:{\"icon\":\"times-circle\"},on:{\"click\":_vm.close}}),_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"modal-fade\">\n <div class=\"modal-backdrop\" @click=\"close\">\n <div\n class=\"modal\"\n role=\"dialog\"\n aria-labelledby=\"modalTitle\"\n aria-describedby=\"modalDescription\"\n @click.stop=\"\"\n >\n <font-awesome-icon @click=\"close\" class=\"close\" icon=\"times-circle\" />\n <slot></slot>\n </div>\n </div>\n </transition>\n</template>\n\n<script>\nexport default {\n methods: {\n close() {\n this.$emit(\"close\");\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n.modal-backdrop {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.3);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 100;\n}\n\n.modal {\n background: rgba(0, 0, 0, 0.8);\n padding: 10px 20px;\n border-radius: 10px;\n box-shadow: 2px 2px 20px 1px #000;\n display: flex;\n flex-direction: column;\n max-width: 60%;\n\n .characters &,\n .vote-history &,\n .night-reference & {\n max-height: 80%;\n max-width: 80%;\n overflow-y: auto;\n }\n\n ul {\n list-style-type: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-wrap: wrap;\n align-content: center;\n align-items: center;\n justify-content: center;\n line-height: 100%;\n }\n > .close {\n position: absolute;\n right: 20px;\n top: 20px;\n cursor: pointer;\n z-index: 5;\n &:hover {\n color: red;\n }\n }\n}\n\n.modal-fade-enter,\n.modal-fade-leave-active {\n opacity: 0;\n}\n\n.modal-fade-enter-active,\n.modal-fade-leave-active {\n transition: opacity 0.2s ease;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Modal.vue?vue&type=template&id=58a2373b&\"\nimport script from \"./Modal.vue?vue&type=script&lang=js&\"\nexport * from \"./Modal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Modal.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <Modal\n v-if=\"modals.reminder && availableReminders.length && players[playerIndex]\"\n @close=\"toggleModal('reminder')\"\n >\n <h3>Choose a reminder token:</h3>\n <ul class=\"reminders\">\n <li\n v-for=\"reminder in availableReminders\"\n class=\"reminder\"\n :class=\"[reminder.role]\"\n :key=\"reminder.role + ' ' + reminder.name\"\n @click=\"addReminder(reminder)\"\n >\n <span\n class=\"icon\"\n :style=\"{\n backgroundImage: `url(${\n reminder.image && grimoire.isImageOptIn\n ? reminder.image\n : require('../../assets/icons/' +\n (reminder.imageAlt || reminder.role) +\n '.png')\n })`\n }\"\n ></span>\n <span class=\"text\">{{ reminder.name }}</span>\n </li>\n </ul>\n </Modal>\n</template>\n\n<script>\nimport Modal from \"./Modal\";\nimport { mapMutations, mapState } from \"vuex\";\n\n/**\n * Helper function that maps a reminder name with a role-based object that provides necessary visual data.\n * @param role The role for which the reminder should be generated\n * @return {function(*): {image: string|string[]|string|*, role: *, name: *, imageAlt: string|*}}\n */\nconst mapReminder = ({ id, image, imageAlt }) => name => ({\n role: id,\n image,\n imageAlt,\n name\n});\n\nexport default {\n components: { Modal },\n props: [\"playerIndex\"],\n computed: {\n availableReminders() {\n let reminders = [];\n const { players, bluffs } = this.$store.state.players;\n this.$store.state.roles.forEach(role => {\n // add reminders from player roles\n if (players.some(p => p.role.id === role.id)) {\n reminders = [...reminders, ...role.reminders.map(mapReminder(role))];\n }\n // add reminders from bluff/other roles\n else if (bluffs.some(bluff => bluff.id === role.id)) {\n reminders = [...reminders, ...role.reminders.map(mapReminder(role))];\n }\n // add global reminders\n if (role.remindersGlobal && role.remindersGlobal.length) {\n reminders = [\n ...reminders,\n ...role.remindersGlobal.map(mapReminder(role))\n ];\n }\n });\n // add fabled reminders\n this.$store.state.players.fabled.forEach(role => {\n reminders = [...reminders, ...role.reminders.map(mapReminder(role))];\n });\n\n // add out of script traveler reminders\n this.$store.state.otherTravelers.forEach(role => {\n if (players.some(p => p.role.id === role.id)) {\n reminders = [...reminders, ...role.reminders.map(mapReminder(role))];\n }\n });\n\n reminders.push({ role: \"good\", name: \"Good\" });\n reminders.push({ role: \"evil\", name: \"Evil\" });\n reminders.push({ role: \"custom\", name: \"Custom note\" });\n return reminders;\n },\n ...mapState([\"modals\", \"grimoire\"]),\n ...mapState(\"players\", [\"players\"])\n },\n methods: {\n addReminder(reminder) {\n const player = this.$store.state.players.players[this.playerIndex];\n let value;\n if (reminder.role === \"custom\") {\n const name = prompt(\"Add a custom reminder note\");\n if (!name) return;\n value = [...player.reminders, { role: \"custom\", name }];\n } else {\n value = [...player.reminders, reminder];\n }\n this.$store.commit(\"players/update\", {\n player,\n property: \"reminders\",\n value\n });\n this.$store.commit(\"toggleModal\", \"reminder\");\n },\n ...mapMutations([\"toggleModal\"])\n }\n};\n</script>\n\n<style scoped lang=\"scss\">\nul.reminders .reminder {\n background: url(\"../../assets/reminder.png\") center center;\n background-size: 100%;\n width: 14vh;\n height: 14vh;\n max-width: 100px;\n max-height: 100px;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 1%;\n\n border-radius: 50%;\n border: 3px solid black;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n cursor: pointer;\n line-height: 100%;\n transition: transform 500ms ease;\n\n .icon {\n position: absolute;\n top: 0;\n width: 90%;\n height: 90%;\n background-size: 100%;\n background-position: center center;\n background-repeat: no-repeat;\n }\n\n .text {\n color: black;\n font-size: 65%;\n font-weight: bold;\n text-align: center;\n top: 28%;\n width: 80%;\n line-height: 1;\n }\n\n &:hover {\n transform: scale(1.2);\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReminderModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReminderModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ReminderModal.vue?vue&type=template&id=334686bc&scoped=true&\"\nimport script from \"./ReminderModal.vue?vue&type=script&lang=js&\"\nexport * from \"./ReminderModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ReminderModal.vue?vue&type=style&index=0&id=334686bc&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"334686bc\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.modals.role && _vm.availableRoles.length)?_c('Modal',{on:{\"close\":_vm.close}},[_c('h3',[_vm._v(\" Choose a new character for \"+_vm._s(_vm.playerIndex >= 0 && _vm.players.length ? _vm.players[_vm.playerIndex].name : \"bluffing\")+\" \")]),(_vm.tab === 'editionRoles' || !_vm.otherTravelers.size)?_c('ul',{staticClass:\"tokens\"},_vm._l((_vm.availableRoles),function(role){return _c('li',{key:role.id,class:[role.team],on:{\"click\":function($event){return _vm.setRole(role)}}},[_c('Token',{attrs:{\"role\":role}})],1)}),0):_vm._e(),(_vm.tab === 'otherTravelers' && _vm.otherTravelers.size)?_c('ul',{staticClass:\"tokens\"},_vm._l((_vm.otherTravelers.values()),function(role){return _c('li',{key:role.id,class:[role.team],on:{\"click\":function($event){return _vm.setRole(role)}}},[_c('Token',{attrs:{\"role\":role}})],1)}),0):_vm._e(),(_vm.playerIndex >= 0 && _vm.otherTravelers.size && !_vm.session.isSpectator)?_c('div',{staticClass:\"button-group\"},[_c('span',{staticClass:\"button\",class:{ townsfolk: _vm.tab === 'editionRoles' },on:{\"click\":function($event){_vm.tab = 'editionRoles'}}},[_vm._v(\"Edition Roles\")]),_c('span',{staticClass:\"button\",class:{ townsfolk: _vm.tab === 'otherTravelers' },on:{\"click\":function($event){_vm.tab = 'otherTravelers'}}},[_vm._v(\"Other Travelers\")])]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <Modal v-if=\"modals.role && availableRoles.length\" @close=\"close\">\n <h3>\n Choose a new character for\n {{\n playerIndex >= 0 && players.length\n ? players[playerIndex].name\n : \"bluffing\"\n }}\n </h3>\n <ul class=\"tokens\" v-if=\"tab === 'editionRoles' || !otherTravelers.size\">\n <li\n v-for=\"role in availableRoles\"\n :class=\"[role.team]\"\n :key=\"role.id\"\n @click=\"setRole(role)\"\n >\n <Token :role=\"role\" />\n </li>\n </ul>\n <ul class=\"tokens\" v-if=\"tab === 'otherTravelers' && otherTravelers.size\">\n <li\n v-for=\"role in otherTravelers.values()\"\n :class=\"[role.team]\"\n :key=\"role.id\"\n @click=\"setRole(role)\"\n >\n <Token :role=\"role\" />\n </li>\n </ul>\n <div\n class=\"button-group\"\n v-if=\"playerIndex >= 0 && otherTravelers.size && !session.isSpectator\"\n >\n <span\n class=\"button\"\n :class=\"{ townsfolk: tab === 'editionRoles' }\"\n @click=\"tab = 'editionRoles'\"\n >Edition Roles</span\n >\n <span\n class=\"button\"\n :class=\"{ townsfolk: tab === 'otherTravelers' }\"\n @click=\"tab = 'otherTravelers'\"\n >Other Travelers</span\n >\n </div>\n </Modal>\n</template>\n\n<script>\nimport { mapMutations, mapState } from \"vuex\";\nimport Modal from \"./Modal\";\nimport Token from \"../Token\";\n\nexport default {\n components: { Token, Modal },\n props: [\"playerIndex\"],\n computed: {\n availableRoles() {\n const availableRoles = [];\n const players = this.$store.state.players.players;\n this.$store.state.roles.forEach(role => {\n // don't show bluff roles that are already assigned to players\n if (\n this.playerIndex >= 0 ||\n (this.playerIndex < 0 &&\n !players.some(player => player.role.id === role.id))\n ) {\n availableRoles.push(role);\n }\n });\n availableRoles.push({});\n return availableRoles;\n },\n ...mapState([\"modals\", \"roles\", \"session\"]),\n ...mapState(\"players\", [\"players\"]),\n ...mapState([\"otherTravelers\"])\n },\n data() {\n return {\n tab: \"editionRoles\"\n };\n },\n methods: {\n setRole(role) {\n if (this.playerIndex < 0) {\n // assign to bluff slot (index < 0)\n this.$store.commit(\"players/setBluff\", {\n index: this.playerIndex * -1 - 1,\n role\n });\n } else {\n if (this.session.isSpectator && role.team === \"traveler\") return;\n // assign to player\n const player = this.$store.state.players.players[this.playerIndex];\n this.$store.commit(\"players/update\", {\n player,\n property: \"role\",\n value: role\n });\n }\n this.$store.commit(\"toggleModal\", \"role\");\n },\n close() {\n this.tab = \"editionRoles\";\n this.toggleModal(\"role\");\n },\n ...mapMutations([\"toggleModal\"])\n }\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"../../vars.scss\";\n\nul.tokens li {\n border-radius: 50%;\n width: 6vw;\n margin: 1%;\n transition: transform 500ms ease;\n\n &.townsfolk {\n box-shadow: 0 0 10px $townsfolk, 0 0 10px #004cff;\n }\n &.outsider {\n box-shadow: 0 0 10px $outsider, 0 0 10px $outsider;\n }\n &.minion {\n box-shadow: 0 0 10px $minion, 0 0 10px $minion;\n }\n &.demon {\n box-shadow: 0 0 10px $demon, 0 0 10px $demon;\n }\n &.traveler {\n box-shadow: 0 0 10px $traveler, 0 0 10px $traveler;\n }\n &:hover {\n transform: scale(1.2);\n z-index: 10;\n }\n}\n\n#townsquare.spectator ul.tokens li.traveler {\n display: none;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RoleModal.vue?vue&type=template&id=616d6209&scoped=true&\"\nimport script from \"./RoleModal.vue?vue&type=script&lang=js&\"\nexport * from \"./RoleModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RoleModal.vue?vue&type=style&index=0&id=616d6209&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"616d6209\",\n null\n \n)\n\nexport default component.exports","<template>\n <div\n id=\"townsquare\"\n class=\"square\"\n :class=\"{\n public: grimoire.isPublic,\n spectator: session.isSpectator,\n vote: session.nomination\n }\"\n >\n <ul class=\"circle\" :class=\"['size-' + players.length]\">\n <Player\n v-for=\"(player, index) in players\"\n :key=\"index\"\n :player=\"player\"\n @trigger=\"handleTrigger(index, $event)\"\n :class=\"{\n from: Math.max(swap, move, nominate) === index,\n swap: swap > -1,\n move: move > -1,\n nominate: nominate > -1\n }\"\n ></Player>\n </ul>\n\n <div\n class=\"bluffs\"\n v-if=\"players.length\"\n ref=\"bluffs\"\n :class=\"{ closed: !isBluffsOpen }\"\n >\n <h3>\n <span v-if=\"session.isSpectator\">Other characters</span>\n <span v-else>Demon bluffs</span>\n <font-awesome-icon icon=\"times-circle\" @click.stop=\"toggleBluffs\" />\n <font-awesome-icon icon=\"plus-circle\" @click.stop=\"toggleBluffs\" />\n </h3>\n <ul>\n <li\n v-for=\"index in bluffSize\"\n :key=\"index\"\n @click=\"openRoleModal(index * -1)\"\n >\n <Token :role=\"bluffs[index - 1]\"></Token>\n </li>\n </ul>\n </div>\n\n <div class=\"fabled\" :class=\"{ closed: !isFabledOpen }\" v-if=\"fabled.length\">\n <h3>\n <span>Fabled</span>\n <font-awesome-icon icon=\"times-circle\" @click.stop=\"toggleFabled\" />\n <font-awesome-icon icon=\"plus-circle\" @click.stop=\"toggleFabled\" />\n </h3>\n <ul>\n <li\n v-for=\"(role, index) in fabled\"\n :key=\"index\"\n @click=\"removeFabled(index)\"\n >\n <div\n class=\"night-order first\"\n v-if=\"nightOrder.get(role).first && grimoire.isNightOrder\"\n >\n <em>{{ nightOrder.get(role).first }}.</em>\n <span v-if=\"role.firstNightReminder\">{{\n role.firstNightReminder\n }}</span>\n </div>\n <div\n class=\"night-order other\"\n v-if=\"nightOrder.get(role).other && grimoire.isNightOrder\"\n >\n <em>{{ nightOrder.get(role).other }}.</em>\n <span v-if=\"role.otherNightReminder\">{{\n role.otherNightReminder\n }}</span>\n </div>\n <Token :role=\"role\"></Token>\n </li>\n </ul>\n </div>\n\n <ReminderModal :player-index=\"selectedPlayer\"></ReminderModal>\n <RoleModal :player-index=\"selectedPlayer\"></RoleModal>\n </div>\n</template>\n\n<script>\nimport { mapGetters, mapState } from \"vuex\";\nimport Player from \"./Player\";\nimport Token from \"./Token\";\nimport ReminderModal from \"./modals/ReminderModal\";\nimport RoleModal from \"./modals/RoleModal\";\n\nexport default {\n components: {\n Player,\n Token,\n RoleModal,\n ReminderModal\n },\n computed: {\n ...mapGetters({ nightOrder: \"players/nightOrder\" }),\n ...mapState([\"grimoire\", \"roles\", \"session\"]),\n ...mapState(\"players\", [\"players\", \"bluffs\", \"fabled\"])\n },\n data() {\n return {\n selectedPlayer: 0,\n bluffSize: 3,\n swap: -1,\n move: -1,\n nominate: -1,\n isBluffsOpen: true,\n isFabledOpen: true\n };\n },\n methods: {\n toggleBluffs() {\n this.isBluffsOpen = !this.isBluffsOpen;\n },\n toggleFabled() {\n this.isFabledOpen = !this.isFabledOpen;\n },\n removeFabled(index) {\n if (this.session.isSpectator) return;\n this.$store.commit(\"players/setFabled\", { index });\n },\n handleTrigger(playerIndex, [method, params]) {\n if (typeof this[method] === \"function\") {\n this[method](playerIndex, params);\n }\n },\n claimSeat(playerIndex) {\n if (!this.session.isSpectator) return;\n if (this.session.playerId === this.players[playerIndex].id) {\n this.$store.commit(\"session/claimSeat\", -1);\n } else {\n this.$store.commit(\"session/claimSeat\", playerIndex);\n }\n },\n openReminderModal(playerIndex) {\n this.selectedPlayer = playerIndex;\n this.$store.commit(\"toggleModal\", \"reminder\");\n },\n openRoleModal(playerIndex) {\n const player = this.players[playerIndex];\n if (this.session.isSpectator && player && player.role.team === \"traveler\")\n return;\n this.selectedPlayer = playerIndex;\n this.$store.commit(\"toggleModal\", \"role\");\n },\n removePlayer(playerIndex) {\n if (this.session.isSpectator) return;\n if (\n confirm(\n `Do you really want to remove ${this.players[playerIndex].name}?`\n )\n ) {\n this.$store.commit(\"players/remove\", playerIndex);\n }\n },\n swapPlayer(from, to) {\n if (to === undefined) {\n this.cancel();\n this.swap = from;\n } else {\n this.$store.commit(\"players/swap\", [\n this.swap,\n this.players.indexOf(to)\n ]);\n this.cancel();\n }\n },\n movePlayer(from, to) {\n if (to === undefined) {\n this.cancel();\n this.move = from;\n } else {\n this.$store.commit(\"players/move\", [\n this.move,\n this.players.indexOf(to)\n ]);\n this.cancel();\n }\n },\n nominatePlayer(from, to) {\n if (to === undefined) {\n this.cancel();\n if (from !== this.nominate) {\n this.nominate = from;\n }\n } else {\n const nomination = [this.nominate, this.players.indexOf(to)];\n this.$store.commit(\"session/nomination\", { nomination });\n this.cancel();\n }\n },\n cancel() {\n this.move = -1;\n this.swap = -1;\n this.nominate = -1;\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"../vars.scss\";\n\n#townsquare {\n width: 100%;\n height: 100%;\n padding: 20px;\n display: flex;\n align-items: center;\n align-content: center;\n justify-content: center;\n}\n\n.circle {\n padding: 0;\n width: 100%;\n height: 100%;\n list-style: none;\n margin: 0;\n\n > li {\n position: absolute;\n left: 50%;\n height: 50%;\n transform-origin: 0 100%;\n pointer-events: none;\n\n &:hover {\n z-index: 25 !important;\n }\n\n > .player {\n margin-left: -50%;\n width: 100%;\n pointer-events: all;\n }\n > .reminder {\n margin-left: -25%;\n width: 50%;\n pointer-events: all;\n }\n }\n}\n\n@mixin on-circle($item-count) {\n $angle: (360 / $item-count);\n $rot: 0;\n\n // rotation and tooltip placement\n @for $i from 1 through $item-count {\n &:nth-child(#{$i}) {\n transform: rotate($rot * 1deg);\n @if $i - 1 <= $item-count / 2 {\n // first half of players\n z-index: $item-count - $i + 1;\n // open menu on the left\n .player > .menu {\n left: auto;\n right: 100%;\n margin-right: 15px;\n &:before {\n border-left-color: black;\n border-right-color: transparent;\n right: auto;\n left: 100%;\n }\n }\n .fold-enter-active,\n .fold-leave-active {\n transform-origin: right center;\n }\n .fold-enter,\n .fold-leave-to {\n transform: perspective(200px) rotateY(-90deg);\n }\n // show ability tooltip on the left\n .ability {\n right: 120%;\n left: auto;\n &:before {\n border-right-color: transparent;\n border-left-color: black;\n right: auto;\n left: 100%;\n }\n }\n } @else {\n // second half of players\n z-index: $i - 1;\n }\n\n > * {\n transform: rotate($rot * -1deg);\n }\n\n // animation cascade\n .life,\n .token,\n .shroud,\n .night-order,\n .seat {\n animation-delay: ($i - 1) * 50ms;\n transition-delay: ($i - 1) * 50ms;\n }\n\n // move reminders closer to the sides of the circle\n $q: $item-count / 4;\n $x: $i - 1;\n @if $x < $q or ($x >= $item-count / 2 and $x < $q * 3) {\n .player {\n margin-bottom: -10% + 20% * (1 - ($x % $q / $q));\n }\n } @else {\n .player {\n margin-bottom: -10% + 20% * ($x % $q / $q);\n }\n }\n }\n $rot: $rot + $angle;\n }\n}\n\n@for $i from 1 through 20 {\n .circle.size-#{$i} > li {\n @include on-circle($item-count: $i);\n }\n}\n\n/***** Demon bluffs / Fabled *******/\n#townsquare > .bluffs,\n#townsquare > .fabled {\n position: absolute;\n &.bluffs {\n bottom: 10px;\n }\n &.fabled {\n top: 10px;\n }\n left: 10px;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 10px;\n border: 3px solid black;\n filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.5));\n transform-origin: bottom left;\n transform: scale(1);\n opacity: 1;\n transition: all 200ms ease-in-out;\n z-index: 50;\n\n #townsquare.public &.bluffs {\n opacity: 0;\n transform: scale(0.1);\n }\n > svg {\n position: absolute;\n top: 10px;\n right: 10px;\n cursor: pointer;\n &:hover {\n color: red;\n }\n }\n h3 {\n margin: 5px 1vh 0;\n display: flex;\n align-items: center;\n align-content: center;\n justify-content: center;\n span {\n flex-grow: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n svg {\n cursor: pointer;\n flex-grow: 0;\n &.fa-times-circle {\n margin-left: 1vh;\n }\n &.fa-plus-circle {\n margin-left: 1vh;\n display: none;\n }\n &:hover path {\n fill: url(#demon);\n stroke-width: 30px;\n stroke: white;\n }\n }\n }\n ul {\n display: flex;\n align-items: center;\n justify-content: center;\n li {\n width: 14vh;\n height: 14vh;\n margin: 0 0.5%;\n display: inline-block;\n transition: all 250ms;\n }\n }\n &.closed {\n svg.fa-times-circle {\n display: none;\n }\n svg.fa-plus-circle {\n display: block;\n }\n ul li {\n width: 0;\n height: 0;\n .night-order {\n opacity: 0;\n }\n .token {\n border-width: 0;\n }\n }\n }\n}\n\n.fabled ul li .token:before {\n content: \" \";\n opacity: 0;\n transition: opacity 250ms;\n background-image: url(\"../assets/icons/x.png\");\n z-index: 2;\n}\n\n/**** Night reminders ****/\n.night-order {\n position: absolute;\n width: 100%;\n cursor: pointer;\n opacity: 1;\n transition: opacity 200ms;\n display: flex;\n top: 0;\n align-items: center;\n pointer-events: none;\n\n &:after {\n content: \" \";\n display: block;\n padding-top: 100%;\n }\n\n #townsquare.public & {\n opacity: 0;\n pointer-events: none;\n }\n\n &:hover ~ .token .ability {\n opacity: 0;\n }\n\n span {\n display: flex;\n position: absolute;\n padding: 5px 10px 5px 30px;\n width: 350px;\n z-index: 25;\n font-size: 70%;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 10px;\n border: 3px solid black;\n filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.5));\n text-align: left;\n align-items: center;\n opacity: 0;\n transition: opacity 200ms ease-in-out;\n\n &:before {\n transform: rotate(-90deg);\n transform-origin: center top;\n left: -98px;\n top: 50%;\n font-size: 100%;\n position: absolute;\n font-weight: bold;\n text-align: center;\n width: 200px;\n }\n\n &:after {\n content: \" \";\n border: 10px solid transparent;\n width: 0;\n height: 0;\n position: absolute;\n }\n }\n\n &.first span {\n right: 120%;\n background: linear-gradient(\n to right,\n $townsfolk 0%,\n rgba(0, 0, 0, 0.5) 20%\n );\n &:before {\n content: \"First Night\";\n }\n &:after {\n border-left-color: $townsfolk;\n margin-left: 3px;\n left: 100%;\n }\n }\n\n &.other span {\n left: 120%;\n background: linear-gradient(to right, $demon 0%, rgba(0, 0, 0, 0.5) 20%);\n &:before {\n content: \"Other Nights\";\n }\n &:after {\n right: 100%;\n margin-right: 3px;\n border-right-color: $demon;\n }\n }\n\n em {\n font-style: normal;\n position: absolute;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n border: 3px solid black;\n filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.5));\n font-weight: bold;\n opacity: 1;\n pointer-events: all;\n transition: opacity 200ms;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 3;\n }\n\n &.first em {\n left: -10%;\n background: linear-gradient(180deg, rgba(0, 0, 0, 1) 0%, $townsfolk 100%);\n }\n\n &.other em {\n right: -10%;\n background: linear-gradient(180deg, rgba(0, 0, 0, 1) 0%, $demon 100%);\n }\n\n em:hover + span {\n opacity: 1;\n }\n\n // adjustment for fabled\n .fabled &.first {\n span {\n right: auto;\n left: 40px;\n &:after {\n left: auto;\n right: 100%;\n margin-left: 0;\n margin-right: 3px;\n border-left-color: transparent;\n border-right-color: $townsfolk;\n }\n }\n }\n}\n\n#townsquare:not(.spectator) .fabled ul li:hover .token:before {\n opacity: 1;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TownSquare.vue?vue&type=template&id=cb59463e&\"\nimport script from \"./TownSquare.vue?vue&type=script&lang=js&\"\nexport * from \"./TownSquare.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TownSquare.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:\"info\"},[_c('li',{staticClass:\"edition\",class:['edition-' + _vm.edition.id],style:({\n backgroundImage: (\"url(\" + (_vm.edition.logo && _vm.grimoire.isImageOptIn\n ? _vm.edition.logo\n : require('../assets/editions/' + _vm.edition.id + '.png')) + \")\")\n })}),(_vm.players.length - _vm.teams.traveler < 5)?_c('li',[_vm._v(\" Please add more players! \")]):_vm._e(),_c('li',[(!_vm.edition.isOfficial)?_c('span',{staticClass:\"meta\"},[_vm._v(\" \"+_vm._s(_vm.edition.name)+\" \"+_vm._s(_vm.edition.author ? \"by \" + _vm.edition.author : \"\")+\" \")]):_vm._e(),_c('span',[_vm._v(\" \"+_vm._s(_vm.players.length)+\" \"),_c('font-awesome-icon',{staticClass:\"players\",attrs:{\"icon\":\"users\"}})],1),_c('span',[_vm._v(\" \"+_vm._s(_vm.teams.alive)+\" \"),_c('font-awesome-icon',{staticClass:\"alive\",attrs:{\"icon\":\"heartbeat\"}})],1),_c('span',[_vm._v(\" \"+_vm._s(_vm.teams.votes)+\" \"),_c('font-awesome-icon',{staticClass:\"votes\",attrs:{\"icon\":\"vote-yea\"}})],1)]),(_vm.players.length - _vm.teams.traveler >= 5)?_c('li',[_c('span',[_vm._v(\" \"+_vm._s(_vm.teams.townsfolk)+\" \"),_c('font-awesome-icon',{staticClass:\"townsfolk\",attrs:{\"icon\":\"user-friends\"}})],1),_c('span',[_vm._v(\" \"+_vm._s(_vm.teams.outsider)+\" \"),_c('font-awesome-icon',{staticClass:\"outsider\",attrs:{\"icon\":_vm.teams.outsider > 1 ? 'user-friends' : 'user'}})],1),_c('span',[_vm._v(\" \"+_vm._s(_vm.teams.minion)+\" \"),_c('font-awesome-icon',{staticClass:\"minion\",attrs:{\"icon\":_vm.teams.minion > 1 ? 'user-friends' : 'user'}})],1),_c('span',[_vm._v(\" \"+_vm._s(_vm.teams.demon)+\" \"),_c('font-awesome-icon',{staticClass:\"demon\",attrs:{\"icon\":_vm.teams.demon > 1 ? 'user-friends' : 'user'}})],1),(_vm.teams.traveler)?_c('span',[_vm._v(\" \"+_vm._s(_vm.teams.traveler)+\" \"),_c('font-awesome-icon',{staticClass:\"traveler\",attrs:{\"icon\":_vm.teams.traveler > 1 ? 'user-friends' : 'user'}})],1):_vm._e(),(_vm.grimoire.isNight)?_c('span',[_vm._v(\" Night phase \"),_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'cloud-moon']}})],1):_vm._e()]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <ul class=\"info\">\n <li\n class=\"edition\"\n :class=\"['edition-' + edition.id]\"\n :style=\"{\n backgroundImage: `url(${\n edition.logo && grimoire.isImageOptIn\n ? edition.logo\n : require('../assets/editions/' + edition.id + '.png')\n })`\n }\"\n ></li>\n <li v-if=\"players.length - teams.traveler < 5\">\n Please add more players!\n </li>\n <li>\n <span class=\"meta\" v-if=\"!edition.isOfficial\">\n {{ edition.name }}\n {{ edition.author ? \"by \" + edition.author : \"\" }}\n </span>\n <span>\n {{ players.length }} <font-awesome-icon class=\"players\" icon=\"users\" />\n </span>\n <span>\n {{ teams.alive }}\n <font-awesome-icon class=\"alive\" icon=\"heartbeat\" />\n </span>\n <span>\n {{ teams.votes }} <font-awesome-icon class=\"votes\" icon=\"vote-yea\" />\n </span>\n </li>\n <li v-if=\"players.length - teams.traveler >= 5\">\n <span>\n {{ teams.townsfolk }}\n <font-awesome-icon class=\"townsfolk\" icon=\"user-friends\" />\n </span>\n <span>\n {{ teams.outsider }}\n <font-awesome-icon\n class=\"outsider\"\n :icon=\"teams.outsider > 1 ? 'user-friends' : 'user'\"\n />\n </span>\n <span>\n {{ teams.minion }}\n <font-awesome-icon\n class=\"minion\"\n :icon=\"teams.minion > 1 ? 'user-friends' : 'user'\"\n />\n </span>\n <span>\n {{ teams.demon }}\n <font-awesome-icon\n class=\"demon\"\n :icon=\"teams.demon > 1 ? 'user-friends' : 'user'\"\n />\n </span>\n <span v-if=\"teams.traveler\">\n {{ teams.traveler }}\n <font-awesome-icon\n class=\"traveler\"\n :icon=\"teams.traveler > 1 ? 'user-friends' : 'user'\"\n />\n </span>\n <span v-if=\"grimoire.isNight\">\n Night phase\n <font-awesome-icon :icon=\"['fas', 'cloud-moon']\" />\n </span>\n </li>\n </ul>\n</template>\n\n<script>\nimport gameJSON from \"./../game\";\nimport { mapState } from \"vuex\";\n\nexport default {\n computed: {\n teams: function() {\n const { players } = this.$store.state.players;\n const nonTravelers = this.$store.getters[\"players/nonTravelers\"];\n const alive = players.filter(player => player.isDead !== true).length;\n return {\n ...gameJSON[nonTravelers - 5],\n traveler: players.length - nonTravelers,\n alive,\n votes:\n alive +\n players.filter(\n player => player.isDead === true && player.isVoteless !== true\n ).length\n };\n },\n ...mapState([\"edition\", \"grimoire\"]),\n ...mapState(\"players\", [\"players\"])\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../vars.scss\";\n\n.info {\n position: absolute;\n display: flex;\n width: 20%;\n height: 20%;\n padding: 50px 0 0;\n align-items: center;\n align-content: center;\n justify-content: center;\n flex-wrap: wrap;\n background: url(\"../assets/demon-head.png\") center center no-repeat;\n background-size: auto 100%;\n\n li {\n font-weight: bold;\n width: 100%;\n filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.7));\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n text-shadow: 0 2px 1px black, 0 -2px 1px black, 2px 0 1px black,\n -2px 0 1px black;\n\n span {\n white-space: nowrap;\n }\n\n .meta {\n text-align: center;\n flex-basis: 100%;\n font-family: PiratesBay, sans-serif;\n font-weight: normal;\n }\n\n svg {\n margin-right: 10px;\n }\n\n .players {\n color: #00f700;\n }\n .alive {\n color: #ff4a50;\n }\n .votes {\n color: #fff;\n }\n .townsfolk {\n color: $townsfolk;\n }\n .outsider {\n color: $outsider;\n }\n .minion {\n color: $minion;\n }\n .demon {\n color: $demon;\n }\n .traveler {\n color: $traveler;\n }\n }\n\n li.edition {\n width: 220px;\n height: 200px;\n max-width: 100%;\n max-height: 100%;\n background-position: 0 center;\n background-repeat: no-repeat;\n background-size: 100% auto;\n position: absolute;\n top: -25%;\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TownInfo.vue?vue&type=template&id=e858a1da&scoped=true&\"\nimport script from \"./TownInfo.vue?vue&type=script&lang=js&\"\nexport * from \"./TownInfo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TownInfo.vue?vue&type=style&index=0&id=e858a1da&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e858a1da\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"controls\"}},[(_vm.session.sessionId)?_c('span',{staticClass:\"session\",class:{\n spectator: _vm.session.isSpectator,\n reconnecting: _vm.session.isReconnecting\n },attrs:{\"title\":((_vm.session.playerCount) + \" other players in this session\" + (_vm.session.ping ? ' (' + _vm.session.ping + 'ms latency)' : ''))},on:{\"click\":_vm.leaveSession}},[_c('font-awesome-icon',{attrs:{\"icon\":\"broadcast-tower\"}}),_vm._v(\" \"+_vm._s(_vm.session.playerCount)+\" \")],1):_vm._e(),_c('div',{staticClass:\"menu\",class:{ open: _vm.grimoire.isMenuOpen }},[_c('font-awesome-icon',{attrs:{\"icon\":\"cog\"},on:{\"click\":_vm.toggleMenu}}),_c('ul',[_c('li',{staticClass:\"tabs\",class:_vm.tab},[_c('font-awesome-icon',{attrs:{\"icon\":\"book-open\"},on:{\"click\":function($event){_vm.tab = 'grimoire'}}}),_c('font-awesome-icon',{attrs:{\"icon\":\"broadcast-tower\"},on:{\"click\":function($event){_vm.tab = 'session'}}}),(!_vm.session.isSpectator)?_c('font-awesome-icon',{attrs:{\"icon\":\"users\"},on:{\"click\":function($event){_vm.tab = 'players'}}}):_vm._e(),_c('font-awesome-icon',{attrs:{\"icon\":\"theater-masks\"},on:{\"click\":function($event){_vm.tab = 'characters'}}}),_c('font-awesome-icon',{attrs:{\"icon\":\"question\"},on:{\"click\":function($event){_vm.tab = 'help'}}})],1),(_vm.tab === 'grimoire')?[_c('li',{staticClass:\"headline\"},[_vm._v(\"Grimoire\")]),(_vm.players.length)?_c('li',{on:{\"click\":_vm.toggleGrimoire}},[(!_vm.grimoire.isPublic)?[_vm._v(\"Hide\")]:_vm._e(),(_vm.grimoire.isPublic)?[_vm._v(\"Show\")]:_vm._e(),_c('em',[_vm._v(\"[G]\")])],2):_vm._e(),(!_vm.session.isSpectator)?_c('li',{on:{\"click\":_vm.toggleNight}},[(!_vm.grimoire.isNight)?[_vm._v(\"Switch to Night\")]:_vm._e(),(_vm.grimoire.isNight)?[_vm._v(\"Switch to Day\")]:_vm._e(),_c('em',[_vm._v(\"[S]\")])],2):_vm._e(),(_vm.players.length)?_c('li',{on:{\"click\":_vm.toggleNightOrder}},[_vm._v(\" Night order \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":[\n 'fas',\n _vm.grimoire.isNightOrder ? 'check-square' : 'square'\n ]}})],1)]):_vm._e(),(_vm.players.length)?_c('li',[_vm._v(\" Zoom \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"search-minus\"},on:{\"click\":function($event){return _vm.setZoom(_vm.grimoire.zoom - 1)}}}),_vm._v(\" \"+_vm._s(Math.round(100 + _vm.grimoire.zoom * 10))+\"% \"),_c('font-awesome-icon',{attrs:{\"icon\":\"search-plus\"},on:{\"click\":function($event){return _vm.setZoom(_vm.grimoire.zoom + 1)}}})],1)]):_vm._e(),(!_vm.edition.isOfficial)?_c('li',{on:{\"click\":_vm.imageOptIn}},[_c('small',[_vm._v(\"Show Custom Images\")]),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":[\n 'fas',\n _vm.grimoire.isImageOptIn ? 'check-square' : 'square'\n ]}})],1)]):_vm._e(),_c('li',{on:{\"click\":_vm.setBackground}},[_vm._v(\" Background image \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"image\"}})],1)]),_c('li',{on:{\"click\":_vm.toggleMuted}},[_vm._v(\" Mute Sounds \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":['fas', _vm.grimoire.isMuted ? 'volume-mute' : 'volume-up']}})],1)])]:_vm._e(),(_vm.tab === 'session')?[(_vm.session.sessionId)?_c('li',{staticClass:\"headline\"},[_vm._v(\" \"+_vm._s(_vm.session.isSpectator ? \"Playing\" : \"Hosting\")+\" \")]):_c('li',{staticClass:\"headline\"},[_vm._v(\" Live Session \")]),(!_vm.session.sessionId)?[_c('li',{on:{\"click\":_vm.hostSession}},[_vm._v(\"Host (Storyteller)\"),_c('em',[_vm._v(\"[H]\")])]),_c('li',{on:{\"click\":_vm.joinSession}},[_vm._v(\"Join (Player)\"),_c('em',[_vm._v(\"[J]\")])])]:[(_vm.session.ping)?_c('li',[_vm._v(\" Delay to \"+_vm._s(_vm.session.isSpectator ? \"host\" : \"players\")+\" \"),_c('em',[_vm._v(_vm._s(_vm.session.ping)+\"ms\")])]):_vm._e(),_c('li',{on:{\"click\":_vm.copySessionUrl}},[_vm._v(\" Copy player link \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"copy\"}})],1)]),(!_vm.session.isSpectator)?_c('li',{on:{\"click\":_vm.distributeRoles}},[_vm._v(\" Send Characters \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"theater-masks\"}})],1)]):_vm._e(),(_vm.session.voteHistory.length)?_c('li',{on:{\"click\":function($event){return _vm.toggleModal('voteHistory')}}},[_vm._v(\" Nomination history\"),_c('em',[_vm._v(\"[V]\")])]):_vm._e(),_c('li',{on:{\"click\":_vm.leaveSession}},[_vm._v(\" Leave Session \"),_c('em',[_vm._v(_vm._s(_vm.session.sessionId))])])]]:_vm._e(),(_vm.tab === 'players' && !_vm.session.isSpectator)?[_c('li',{staticClass:\"headline\"},[_vm._v(\"Players\")]),(_vm.players.length < 20)?_c('li',{on:{\"click\":_vm.addPlayer}},[_vm._v(\"Add\"),_c('em',[_vm._v(\"[A]\")])]):_vm._e(),(_vm.players.length > 2)?_c('li',{on:{\"click\":_vm.randomizeSeatings}},[_vm._v(\" Randomize \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"dice\"}})],1)]):_vm._e(),(_vm.players.length)?_c('li',{on:{\"click\":_vm.clearPlayers}},[_vm._v(\" Remove all \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"trash-alt\"}})],1)]):_vm._e()]:_vm._e(),(_vm.tab === 'characters')?[_c('li',{staticClass:\"headline\"},[_vm._v(\"Characters\")]),(!_vm.session.isSpectator)?_c('li',{on:{\"click\":function($event){return _vm.toggleModal('edition')}}},[_vm._v(\" Select Edition \"),_c('em',[_vm._v(\"[E]\")])]):_vm._e(),(!_vm.session.isSpectator && _vm.players.length > 4)?_c('li',{on:{\"click\":function($event){return _vm.toggleModal('roles')}}},[_vm._v(\" Choose & Assign \"),_c('em',[_vm._v(\"[C]\")])]):_vm._e(),(!_vm.session.isSpectator)?_c('li',{on:{\"click\":function($event){return _vm.toggleModal('fabled')}}},[_vm._v(\" Add Fabled \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"dragon\"}})],1)]):_vm._e(),(_vm.players.length)?_c('li',{on:{\"click\":_vm.clearRoles}},[_vm._v(\" Remove all \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"trash-alt\"}})],1)]):_vm._e()]:_vm._e(),(_vm.tab === 'help')?[_c('li',{staticClass:\"headline\"},[_vm._v(\"Help\")]),_c('li',{on:{\"click\":function($event){return _vm.toggleModal('reference')}}},[_vm._v(\" Reference Sheet \"),_c('em',[_vm._v(\"[R]\")])]),_c('li',{on:{\"click\":function($event){return _vm.toggleModal('nightOrder')}}},[_vm._v(\" Night Order Sheet \"),_c('em',[_vm._v(\"[N]\")])]),_c('li',{on:{\"click\":function($event){return _vm.toggleModal('gameState')}}},[_vm._v(\" Game State JSON \"),_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"file-code\"}})],1)]),_c('li',[_c('a',{attrs:{\"href\":\"https://discord.gg/Gd7ybwWbFk\",\"target\":\"_blank\"}},[_vm._v(\" Join Discord \")]),_c('em',[_c('a',{attrs:{\"href\":\"https://discord.gg/Gd7ybwWbFk\",\"target\":\"_blank\"}},[_c('font-awesome-icon',{attrs:{\"icon\":['fab', 'discord']}})],1)])]),_c('li',[_c('a',{attrs:{\"href\":\"https://github.com/bra1n/townsquare\",\"target\":\"_blank\"}},[_vm._v(\" Source code \")]),_c('em',[_c('a',{attrs:{\"href\":\"https://github.com/bra1n/townsquare\",\"target\":\"_blank\"}},[_c('font-awesome-icon',{attrs:{\"icon\":['fab', 'github']}})],1)])])]:_vm._e()],2)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div id=\"controls\">\n <span\n class=\"session\"\n :class=\"{\n spectator: session.isSpectator,\n reconnecting: session.isReconnecting\n }\"\n v-if=\"session.sessionId\"\n @click=\"leaveSession\"\n :title=\"\n `${session.playerCount} other players in this session${\n session.ping ? ' (' + session.ping + 'ms latency)' : ''\n }`\n \"\n >\n <font-awesome-icon icon=\"broadcast-tower\" />\n {{ session.playerCount }}\n </span>\n <div class=\"menu\" :class=\"{ open: grimoire.isMenuOpen }\">\n <font-awesome-icon icon=\"cog\" @click=\"toggleMenu\" />\n <ul>\n <li class=\"tabs\" :class=\"tab\">\n <font-awesome-icon icon=\"book-open\" @click=\"tab = 'grimoire'\" />\n <font-awesome-icon icon=\"broadcast-tower\" @click=\"tab = 'session'\" />\n <font-awesome-icon\n icon=\"users\"\n v-if=\"!session.isSpectator\"\n @click=\"tab = 'players'\"\n />\n <font-awesome-icon icon=\"theater-masks\" @click=\"tab = 'characters'\" />\n <font-awesome-icon icon=\"question\" @click=\"tab = 'help'\" />\n </li>\n\n <template v-if=\"tab === 'grimoire'\">\n <!-- Grimoire -->\n <li class=\"headline\">Grimoire</li>\n <li @click=\"toggleGrimoire\" v-if=\"players.length\">\n <template v-if=\"!grimoire.isPublic\">Hide</template>\n <template v-if=\"grimoire.isPublic\">Show</template>\n <em>[G]</em>\n </li>\n <li @click=\"toggleNight\" v-if=\"!session.isSpectator\">\n <template v-if=\"!grimoire.isNight\">Switch to Night</template>\n <template v-if=\"grimoire.isNight\">Switch to Day</template>\n <em>[S]</em>\n </li>\n <li @click=\"toggleNightOrder\" v-if=\"players.length\">\n Night order\n <em\n ><font-awesome-icon\n :icon=\"[\n 'fas',\n grimoire.isNightOrder ? 'check-square' : 'square'\n ]\"\n /></em>\n </li>\n <li v-if=\"players.length\">\n Zoom\n <em>\n <font-awesome-icon\n @click=\"setZoom(grimoire.zoom - 1)\"\n icon=\"search-minus\"\n />\n {{ Math.round(100 + grimoire.zoom * 10) }}%\n <font-awesome-icon\n @click=\"setZoom(grimoire.zoom + 1)\"\n icon=\"search-plus\"\n />\n </em>\n </li>\n <li v-if=\"!edition.isOfficial\" @click=\"imageOptIn\">\n <small>Show Custom Images</small>\n <em\n ><font-awesome-icon\n :icon=\"[\n 'fas',\n grimoire.isImageOptIn ? 'check-square' : 'square'\n ]\"\n /></em>\n </li>\n <li @click=\"setBackground\">\n Background image\n <em><font-awesome-icon icon=\"image\"/></em>\n </li>\n <li @click=\"toggleMuted\">\n Mute Sounds\n <em\n ><font-awesome-icon\n :icon=\"['fas', grimoire.isMuted ? 'volume-mute' : 'volume-up']\"\n /></em>\n </li>\n </template>\n\n <template v-if=\"tab === 'session'\">\n <!-- Session -->\n <li class=\"headline\" v-if=\"session.sessionId\">\n {{ session.isSpectator ? \"Playing\" : \"Hosting\" }}\n </li>\n <li class=\"headline\" v-else>\n Live Session\n </li>\n <template v-if=\"!session.sessionId\">\n <li @click=\"hostSession\">Host (Storyteller)<em>[H]</em></li>\n <li @click=\"joinSession\">Join (Player)<em>[J]</em></li>\n </template>\n <template v-else>\n <li v-if=\"session.ping\">\n Delay to {{ session.isSpectator ? \"host\" : \"players\" }}\n <em>{{ session.ping }}ms</em>\n </li>\n <li @click=\"copySessionUrl\">\n Copy player link\n <em><font-awesome-icon icon=\"copy\"/></em>\n </li>\n <li v-if=\"!session.isSpectator\" @click=\"distributeRoles\">\n Send Characters\n <em><font-awesome-icon icon=\"theater-masks\"/></em>\n </li>\n <li\n v-if=\"session.voteHistory.length\"\n @click=\"toggleModal('voteHistory')\"\n >\n Nomination history<em>[V]</em>\n </li>\n <li @click=\"leaveSession\">\n Leave Session\n <em>{{ session.sessionId }}</em>\n </li>\n </template>\n </template>\n\n <template v-if=\"tab === 'players' && !session.isSpectator\">\n <!-- Users -->\n <li class=\"headline\">Players</li>\n <li @click=\"addPlayer\" v-if=\"players.length < 20\">Add<em>[A]</em></li>\n <li @click=\"randomizeSeatings\" v-if=\"players.length > 2\">\n Randomize\n <em><font-awesome-icon icon=\"dice\"/></em>\n </li>\n <li @click=\"clearPlayers\" v-if=\"players.length\">\n Remove all\n <em><font-awesome-icon icon=\"trash-alt\"/></em>\n </li>\n </template>\n\n <template v-if=\"tab === 'characters'\">\n <!-- Characters -->\n <li class=\"headline\">Characters</li>\n <li v-if=\"!session.isSpectator\" @click=\"toggleModal('edition')\">\n Select Edition\n <em>[E]</em>\n </li>\n <li\n @click=\"toggleModal('roles')\"\n v-if=\"!session.isSpectator && players.length > 4\"\n >\n Choose & Assign\n <em>[C]</em>\n </li>\n <li v-if=\"!session.isSpectator\" @click=\"toggleModal('fabled')\">\n Add Fabled\n <em><font-awesome-icon icon=\"dragon\"/></em>\n </li>\n <li @click=\"clearRoles\" v-if=\"players.length\">\n Remove all\n <em><font-awesome-icon icon=\"trash-alt\"/></em>\n </li>\n </template>\n\n <template v-if=\"tab === 'help'\">\n <!-- Help -->\n <li class=\"headline\">Help</li>\n <li @click=\"toggleModal('reference')\">\n Reference Sheet\n <em>[R]</em>\n </li>\n <li @click=\"toggleModal('nightOrder')\">\n Night Order Sheet\n <em>[N]</em>\n </li>\n <li @click=\"toggleModal('gameState')\">\n Game State JSON\n <em><font-awesome-icon icon=\"file-code\"/></em>\n </li>\n <li>\n <a href=\"https://discord.gg/Gd7ybwWbFk\" target=\"_blank\">\n Join Discord\n </a>\n <em>\n <a href=\"https://discord.gg/Gd7ybwWbFk\" target=\"_blank\">\n <font-awesome-icon :icon=\"['fab', 'discord']\" />\n </a>\n </em>\n </li>\n <li>\n <a href=\"https://github.com/bra1n/townsquare\" target=\"_blank\">\n Source code\n </a>\n <em>\n <a href=\"https://github.com/bra1n/townsquare\" target=\"_blank\">\n <font-awesome-icon :icon=\"['fab', 'github']\" />\n </a>\n </em>\n </li>\n </template>\n </ul>\n </div>\n </div>\n</template>\n\n<script>\nimport { mapMutations, mapState } from \"vuex\";\n\nexport default {\n computed: {\n ...mapState([\"grimoire\", \"session\", \"edition\"]),\n ...mapState(\"players\", [\"players\"])\n },\n data() {\n return {\n tab: \"grimoire\"\n };\n },\n methods: {\n setBackground() {\n const background = prompt(\"Enter custom background URL\");\n if (background || background === \"\") {\n this.$store.commit(\"setBackground\", background);\n }\n },\n hostSession() {\n if (this.session.sessionId) return;\n const sessionId = prompt(\n \"Enter a channel number / name for your session\",\n Math.round(Math.random() * 10000)\n );\n if (sessionId) {\n this.$store.commit(\"session/clearVoteHistory\");\n this.$store.commit(\"session/setSpectator\", false);\n this.$store.commit(\"session/setSessionId\", sessionId);\n this.copySessionUrl();\n }\n },\n copySessionUrl() {\n const url = window.location.href.split(\"#\")[0];\n const link = url + \"#\" + this.session.sessionId;\n navigator.clipboard.writeText(link);\n },\n distributeRoles() {\n if (this.session.isSpectator) return;\n const popup =\n \"Do you want to distribute assigned characters to all SEATED players?\";\n if (confirm(popup)) {\n this.$store.commit(\"session/distributeRoles\", true);\n setTimeout(\n (() => {\n this.$store.commit(\"session/distributeRoles\", false);\n }).bind(this),\n 2000\n );\n }\n },\n imageOptIn() {\n const popup =\n \"Are you sure you want to allow custom images? A malicious script file author might track your IP address this way.\";\n if (this.grimoire.isImageOptIn || confirm(popup)) {\n this.toggleImageOptIn();\n }\n },\n joinSession() {\n if (this.session.sessionId) return this.leaveSession();\n let sessionId = prompt(\n \"Enter the channel number / name of the session you want to join\"\n );\n if (sessionId.match(/^https?:\\/\\//i)) {\n sessionId = sessionId.split(\"#\").pop();\n }\n if (sessionId) {\n this.$store.commit(\"session/clearVoteHistory\");\n this.$store.commit(\"session/setSpectator\", true);\n this.$store.commit(\"toggleGrimoire\", false);\n this.$store.commit(\"session/setSessionId\", sessionId);\n }\n },\n leaveSession() {\n if (confirm(\"Are you sure you want to leave the active live game?\")) {\n this.$store.commit(\"session/setSpectator\", false);\n this.$store.commit(\"session/setSessionId\", \"\");\n }\n },\n addPlayer() {\n if (this.session.isSpectator) return;\n if (this.players.length >= 20) return;\n const name = prompt(\"Player name\");\n if (name) {\n this.$store.commit(\"players/add\", name);\n }\n },\n randomizeSeatings() {\n if (this.session.isSpectator) return;\n if (confirm(\"Are you sure you want to randomize seatings?\")) {\n this.$store.dispatch(\"players/randomize\");\n }\n },\n clearPlayers() {\n if (this.session.isSpectator) return;\n if (confirm(\"Are you sure you want to remove all players?\")) {\n this.$store.commit(\"players/clear\");\n }\n },\n clearRoles() {\n if (confirm(\"Are you sure you want to remove all player roles?\")) {\n this.$store.dispatch(\"players/clearRoles\");\n }\n },\n ...mapMutations([\n \"toggleGrimoire\",\n \"toggleMenu\",\n \"toggleImageOptIn\",\n \"toggleMuted\",\n \"toggleNight\",\n \"toggleNightOrder\",\n \"setZoom\",\n \"toggleModal\"\n ])\n }\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"../vars.scss\";\n\n// success animation\n@keyframes greenToWhite {\n from {\n color: green;\n }\n to {\n color: white;\n }\n}\n\n// Controls\n#controls {\n position: absolute;\n right: 3px;\n top: 3px;\n text-align: right;\n padding-right: 50px;\n z-index: 200;\n\n svg {\n filter: drop-shadow(0 0 5px rgba(0, 0, 0, 1));\n &.success {\n animation: greenToWhite 1s normal forwards;\n animation-iteration-count: 1;\n }\n }\n\n > span {\n display: inline-block;\n cursor: pointer;\n z-index: 5;\n margin-top: 7px;\n margin-left: 10px;\n }\n\n span.session {\n color: $demon;\n &.spectator {\n color: $townsfolk;\n }\n &.reconnecting {\n animation: blink 1s infinite;\n }\n }\n}\n\n@keyframes blink {\n 50% {\n opacity: 0.5;\n color: gray;\n }\n}\n\n.menu {\n width: 220px;\n transform-origin: 200px 22px;\n transition: transform 500ms cubic-bezier(0.68, -0.55, 0.27, 1.55);\n transform: rotate(-90deg);\n position: absolute;\n right: 0;\n top: 0;\n\n &.open {\n transform: rotate(0deg);\n }\n\n > svg {\n cursor: pointer;\n background: rgba(0, 0, 0, 0.5);\n border: 3px solid black;\n width: 40px;\n height: 50px;\n margin-bottom: -8px;\n border-bottom: 0;\n border-radius: 10px 10px 0 0;\n padding: 5px 5px 15px;\n }\n\n a {\n color: white;\n text-decoration: none;\n &:hover {\n color: red;\n }\n }\n\n ul {\n display: flex;\n list-style-type: none;\n padding: 0;\n margin: 0;\n flex-direction: column;\n overflow: hidden;\n box-shadow: 0 0 10px black;\n border: 3px solid black;\n border-radius: 10px 0 10px 10px;\n\n li {\n padding: 2px 5px;\n color: white;\n text-align: left;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 30px;\n\n &.tabs {\n display: flex;\n padding: 0;\n svg {\n flex-grow: 1;\n flex-shrink: 0;\n height: 35px;\n border-bottom: 3px solid black;\n border-right: 3px solid black;\n padding: 5px 0;\n cursor: pointer;\n transition: color 250ms;\n &:hover {\n color: red;\n }\n &:last-child {\n border-right: 0;\n }\n }\n &.grimoire .fa-book-open,\n &.players .fa-users,\n &.characters .fa-theater-masks,\n &.session .fa-broadcast-tower,\n &.help .fa-question {\n background: linear-gradient(\n to bottom,\n $townsfolk 0%,\n rgba(0, 0, 0, 0.5) 100%\n );\n }\n }\n\n &:not(.headline):not(.tabs):hover {\n cursor: pointer;\n color: red;\n }\n\n em {\n flex-grow: 0;\n font-style: normal;\n margin-left: 10px;\n font-size: 80%;\n }\n }\n\n .headline {\n font-family: PiratesBay, sans-serif;\n letter-spacing: 1px;\n padding: 0 10px;\n text-align: center;\n justify-content: center;\n background: linear-gradient(\n to right,\n $townsfolk 0%,\n rgba(0, 0, 0, 0.5) 20%,\n rgba(0, 0, 0, 0.5) 80%,\n $demon 100%\n );\n }\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Menu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Menu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Menu.vue?vue&type=template&id=1b5fe466&scoped=true&\"\nimport script from \"./Menu.vue?vue&type=script&lang=js&\"\nexport * from \"./Menu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Menu.vue?vue&type=style&index=0&id=1b5fe466&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1b5fe466\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.modals.roles && _vm.nonTravelers >= 5)?_c('Modal',{staticClass:\"roles\",on:{\"close\":function($event){return _vm.toggleModal('roles')}}},[_c('h3',[_vm._v(\"Select the characters for \"+_vm._s(_vm.nonTravelers)+\" players:\")]),_vm._l((_vm.roleSelection),function(teamRoles,team){return _c('ul',{key:team,staticClass:\"tokens\"},[_c('li',{staticClass:\"count\",class:[team]},[_vm._v(\" \"+_vm._s(teamRoles.reduce(function (a, ref) {\n var selected = ref.selected;\n\n return a + selected;\n}, 0))+\" / \"+_vm._s(_vm.game[_vm.nonTravelers - 5][team])+\" \")]),_vm._l((teamRoles),function(role){return _c('li',{key:role.id,class:[role.team, role.selected ? 'selected' : ''],on:{\"click\":function($event){role.selected = role.selected ? 0 : 1}}},[_c('Token',{attrs:{\"role\":role}}),(_vm.allowMultiple)?_c('div',{staticClass:\"buttons\"},[_c('font-awesome-icon',{attrs:{\"icon\":\"minus-circle\"},on:{\"click\":function($event){$event.stopPropagation();role.selected--}}}),_c('span',[_vm._v(_vm._s(role.selected > 1 ? \"x\" + role.selected : \"\"))]),_c('font-awesome-icon',{attrs:{\"icon\":\"plus-circle\"},on:{\"click\":function($event){$event.stopPropagation();role.selected++}}})],1):_vm._e()],1)})],2)}),(_vm.hasSelectedSetupRoles)?_c('div',{staticClass:\"warning\"},[_c('font-awesome-icon',{attrs:{\"icon\":\"exclamation-triangle\"}}),_c('span',[_vm._v(\" Warning: there are characters selected that modify the game setup! The randomizer does not account for these characters. \")])],1):_vm._e(),_c('label',{staticClass:\"multiple\",class:{ checked: _vm.allowMultiple }},[_c('font-awesome-icon',{attrs:{\"icon\":_vm.allowMultiple ? 'check-square' : 'square'}}),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.allowMultiple),expression:\"allowMultiple\"}],attrs:{\"type\":\"checkbox\",\"name\":\"allow-multiple\"},domProps:{\"checked\":Array.isArray(_vm.allowMultiple)?_vm._i(_vm.allowMultiple,null)>-1:(_vm.allowMultiple)},on:{\"change\":function($event){var $$a=_vm.allowMultiple,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.allowMultiple=$$a.concat([$$v]))}else{$$i>-1&&(_vm.allowMultiple=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.allowMultiple=$$c}}}}),_vm._v(\" Allow duplicate characters \")],1),_c('div',{staticClass:\"button-group\"},[_c('div',{staticClass:\"button\",class:{\n disabled: _vm.selectedRoles > _vm.nonTravelers || !_vm.selectedRoles\n },on:{\"click\":_vm.assignRoles}},[_c('font-awesome-icon',{attrs:{\"icon\":\"people-arrows\"}}),_vm._v(\" Assign \"+_vm._s(_vm.selectedRoles)+\" characters randomly \")],1),_c('div',{staticClass:\"button\",on:{\"click\":_vm.selectRandomRoles}},[_c('font-awesome-icon',{attrs:{\"icon\":\"random\"}}),_vm._v(\" Shuffle characters \")],1)])],2):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <Modal\n class=\"roles\"\n v-if=\"modals.roles && nonTravelers >= 5\"\n @close=\"toggleModal('roles')\"\n >\n <h3>Select the characters for {{ nonTravelers }} players:</h3>\n <ul class=\"tokens\" v-for=\"(teamRoles, team) in roleSelection\" :key=\"team\">\n <li class=\"count\" :class=\"[team]\">\n {{ teamRoles.reduce((a, { selected }) => a + selected, 0) }} /\n {{ game[nonTravelers - 5][team] }}\n </li>\n <li\n v-for=\"role in teamRoles\"\n :class=\"[role.team, role.selected ? 'selected' : '']\"\n :key=\"role.id\"\n @click=\"role.selected = role.selected ? 0 : 1\"\n >\n <Token :role=\"role\" />\n <div class=\"buttons\" v-if=\"allowMultiple\">\n <font-awesome-icon\n icon=\"minus-circle\"\n @click.stop=\"role.selected--\"\n />\n <span>{{ role.selected > 1 ? \"x\" + role.selected : \"\" }}</span>\n <font-awesome-icon icon=\"plus-circle\" @click.stop=\"role.selected++\" />\n </div>\n </li>\n </ul>\n <div class=\"warning\" v-if=\"hasSelectedSetupRoles\">\n <font-awesome-icon icon=\"exclamation-triangle\" />\n <span>\n Warning: there are characters selected that modify the game setup! The\n randomizer does not account for these characters.\n </span>\n </div>\n <label class=\"multiple\" :class=\"{ checked: allowMultiple }\">\n <font-awesome-icon :icon=\"allowMultiple ? 'check-square' : 'square'\" />\n <input type=\"checkbox\" name=\"allow-multiple\" v-model=\"allowMultiple\" />\n Allow duplicate characters\n </label>\n <div class=\"button-group\">\n <div\n class=\"button\"\n @click=\"assignRoles\"\n :class=\"{\n disabled: selectedRoles > nonTravelers || !selectedRoles\n }\"\n >\n <font-awesome-icon icon=\"people-arrows\" />\n Assign {{ selectedRoles }} characters randomly\n </div>\n <div class=\"button\" @click=\"selectRandomRoles\">\n <font-awesome-icon icon=\"random\" />\n Shuffle characters\n </div>\n </div>\n </Modal>\n</template>\n\n<script>\nimport Modal from \"./Modal\";\nimport gameJSON from \"./../../game\";\nimport Token from \"./../Token\";\nimport { mapGetters, mapMutations, mapState } from \"vuex\";\n\nconst randomElement = arr => arr[Math.floor(Math.random() * arr.length)];\n\nexport default {\n components: {\n Token,\n Modal\n },\n data: function() {\n return {\n roleSelection: {},\n game: gameJSON,\n allowMultiple: false\n };\n },\n computed: {\n selectedRoles: function() {\n return Object.values(this.roleSelection)\n .map(roles => roles.reduce((a, { selected }) => a + selected, 0))\n .reduce((a, b) => a + b, 0);\n },\n hasSelectedSetupRoles: function() {\n return Object.values(this.roleSelection).some(roles =>\n roles.some(role => role.selected && role.setup)\n );\n },\n ...mapState([\"roles\", \"modals\"]),\n ...mapState(\"players\", [\"players\"]),\n ...mapGetters({ nonTravelers: \"players/nonTravelers\" })\n },\n methods: {\n selectRandomRoles() {\n this.roleSelection = {};\n this.roles.forEach(role => {\n if (!this.roleSelection[role.team]) {\n this.$set(this.roleSelection, role.team, []);\n }\n this.roleSelection[role.team].push(role);\n this.$set(role, \"selected\", 0);\n });\n delete this.roleSelection[\"traveler\"];\n const playerCount = Math.max(5, this.nonTravelers);\n const composition = this.game[playerCount - 5];\n Object.keys(composition).forEach(team => {\n for (let x = 0; x < composition[team]; x++) {\n if (this.roleSelection[team]) {\n const available = this.roleSelection[team].filter(\n role => !role.selected\n );\n if (available.length) {\n randomElement(available).selected = 1;\n }\n }\n }\n });\n },\n assignRoles() {\n if (this.selectedRoles <= this.nonTravelers && this.selectedRoles) {\n // generate list of selected roles and randomize it\n const roles = Object.values(this.roleSelection)\n .map(roles =>\n roles\n // duplicate roles selected more than once and filter unselected\n .reduce((a, r) => [...a, ...Array(r.selected).fill(r)], [])\n )\n // flatten into a single array\n .reduce((a, b) => [...a, ...b], [])\n .map(a => [Math.random(), a])\n .sort((a, b) => a[0] - b[0])\n .map(a => a[1]);\n this.players.forEach(player => {\n if (player.role.team !== \"traveler\" && roles.length) {\n const value = roles.pop();\n this.$store.commit(\"players/update\", {\n player,\n property: \"role\",\n value\n });\n }\n });\n this.$store.commit(\"toggleModal\", \"roles\");\n }\n },\n ...mapMutations([\"toggleModal\"])\n },\n mounted: function() {\n if (!Object.keys(this.roleSelection).length) {\n this.selectRandomRoles();\n }\n },\n watch: {\n roles() {\n this.selectRandomRoles();\n }\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../vars.scss\";\n\nul.tokens {\n padding-left: 5%;\n li {\n border-radius: 50%;\n width: 6vw;\n margin: 1%;\n opacity: 0.5;\n transition: all 250ms;\n &.selected {\n opacity: 1;\n .buttons {\n display: flex;\n }\n }\n &.townsfolk {\n box-shadow: 0 0 10px $townsfolk, 0 0 10px #004cff;\n }\n &.outsider {\n box-shadow: 0 0 10px $outsider, 0 0 10px $outsider;\n }\n &.minion {\n box-shadow: 0 0 10px $minion, 0 0 10px $minion;\n }\n &.demon {\n box-shadow: 0 0 10px $demon, 0 0 10px $demon;\n }\n &.traveler {\n box-shadow: 0 0 10px $traveler, 0 0 10px $traveler;\n }\n &:hover {\n transform: scale(1.2);\n z-index: 10;\n }\n .buttons {\n display: none;\n position: absolute;\n top: 95%;\n text-align: center;\n width: 100%;\n z-index: 30;\n font-weight: bold;\n filter: drop-shadow(0 0 5px rgba(0, 0, 0, 1));\n span {\n flex-grow: 1;\n }\n svg {\n opacity: 0.25;\n cursor: pointer;\n &:hover {\n opacity: 1;\n color: red;\n }\n }\n }\n }\n .count {\n opacity: 1;\n position: absolute;\n left: 0;\n font-weight: bold;\n font-size: 75%;\n width: 5%;\n display: flex;\n align-items: center;\n justify-content: center;\n &:after {\n content: \" \";\n display: block;\n padding-top: 100%;\n }\n &.townsfolk {\n color: $townsfolk;\n }\n &.outsider {\n color: $outsider;\n }\n &.minion {\n color: $minion;\n }\n &.demon {\n color: $demon;\n }\n }\n}\n\n.roles .modal {\n .multiple {\n display: block;\n text-align: center;\n cursor: pointer;\n &.checked,\n &:hover {\n color: red;\n }\n &.checked {\n margin-top: 10px;\n }\n svg {\n margin-right: 5px;\n }\n input {\n display: none;\n }\n }\n\n .warning {\n color: red;\n position: absolute;\n bottom: 20px;\n right: 20px;\n z-index: 10;\n svg {\n font-size: 150%;\n vertical-align: middle;\n }\n span {\n display: none;\n text-align: center;\n position: absolute;\n right: -20px;\n bottom: 30px;\n width: 420px;\n background: rgba(0, 0, 0, 0.75);\n padding: 5px;\n border-radius: 10px;\n border: 2px solid black;\n }\n &:hover span {\n display: block;\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RolesModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RolesModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RolesModal.vue?vue&type=template&id=57f6c851&scoped=true&\"\nimport script from \"./RolesModal.vue?vue&type=script&lang=js&\"\nexport * from \"./RolesModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RolesModal.vue?vue&type=style&index=0&id=57f6c851&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"57f6c851\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.modals.edition)?_c('Modal',{staticClass:\"editions\",on:{\"close\":function($event){return _vm.toggleModal('edition')}}},[(!_vm.isCustom)?_c('div',[_c('h3',[_vm._v(\"Select an edition:\")]),_c('ul',{staticClass:\"editions\"},[_vm._l((_vm.editions),function(edition){return _c('li',{key:edition.id,staticClass:\"edition\",class:['edition-' + edition.id],style:({\n backgroundImage: (\"url(\" + (require('../../assets/editions/' +\n edition.id +\n '.png')) + \")\")\n }),on:{\"click\":function($event){return _vm.setEdition(edition)}}},[_vm._v(\" \"+_vm._s(edition.name)+\" \")])}),_c('li',{staticClass:\"edition edition-custom\",style:({\n backgroundImage: (\"url(\" + (require('../../assets/editions/custom.png')) + \")\")\n }),on:{\"click\":function($event){_vm.isCustom = true}}},[_vm._v(\" Custom Script / Characters \")])],2)]):_c('div',{staticClass:\"custom\"},[_c('h3',[_vm._v(\"Load custom script / characters\")]),_vm._v(\" To play with a custom script, you need to select the characters you want to play with in the official \"),_c('a',{attrs:{\"href\":\"https://bloodontheclocktower.com/script-tool/\",\"target\":\"_blank\"}},[_vm._v(\"Script Tool\")]),_vm._v(\" and then upload the generated \\\"custom-list.json\\\" either directly here or provide a URL to such a hosted JSON file.\"),_c('br'),_c('br'),_vm._v(\" To play with custom characters, please read \"),_c('a',{attrs:{\"href\":\"https://github.com/bra1n/townsquare#custom-characters\",\"target\":\"_blank\"}},[_vm._v(\"the documentation\")]),_vm._v(\" on how to write a custom character definition file. \"),_c('b',[_vm._v(\"Only load custom JSON files from sources that you trust!\")]),_c('h3',[_vm._v(\"Some popular custom scripts:\")]),_c('ul',{staticClass:\"scripts\"},_vm._l((_vm.scripts),function(script,index){return _c('li',{key:index,on:{\"click\":function($event){return _vm.handleURL(script[1])}}},[_vm._v(\" \"+_vm._s(script[0])+\" \")])}),0),_c('input',{ref:\"upload\",attrs:{\"type\":\"file\",\"accept\":\"application/json\"},on:{\"change\":_vm.handleUpload}}),_c('div',{staticClass:\"button-group\"},[_c('div',{staticClass:\"button\",on:{\"click\":_vm.openUpload}},[_c('font-awesome-icon',{attrs:{\"icon\":\"file-upload\"}}),_vm._v(\" Upload JSON \")],1),_c('div',{staticClass:\"button\",on:{\"click\":_vm.promptURL}},[_c('font-awesome-icon',{attrs:{\"icon\":\"link\"}}),_vm._v(\" Enter URL \")],1),_c('div',{staticClass:\"button\",on:{\"click\":function($event){_vm.isCustom = false}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"undo\"}}),_vm._v(\" Back \")],1)])])]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <Modal class=\"editions\" v-if=\"modals.edition\" @close=\"toggleModal('edition')\">\n <div v-if=\"!isCustom\">\n <h3>Select an edition:</h3>\n <ul class=\"editions\">\n <li\n v-for=\"edition in editions\"\n class=\"edition\"\n :class=\"['edition-' + edition.id]\"\n :style=\"{\n backgroundImage: `url(${require('../../assets/editions/' +\n edition.id +\n '.png')})`\n }\"\n :key=\"edition.id\"\n @click=\"setEdition(edition)\"\n >\n {{ edition.name }}\n </li>\n <li\n class=\"edition edition-custom\"\n @click=\"isCustom = true\"\n :style=\"{\n backgroundImage: `url(${require('../../assets/editions/custom.png')})`\n }\"\n >\n Custom Script / Characters\n </li>\n </ul>\n </div>\n <div class=\"custom\" v-else>\n <h3>Load custom script / characters</h3>\n To play with a custom script, you need to select the characters you want\n to play with in the official\n <a href=\"https://bloodontheclocktower.com/script-tool/\" target=\"_blank\"\n >Script Tool</a\n >\n and then upload the generated \"custom-list.json\" either directly here or\n provide a URL to such a hosted JSON file.<br />\n <br />\n To play with custom characters, please read\n <a\n href=\"https://github.com/bra1n/townsquare#custom-characters\"\n target=\"_blank\"\n >the documentation</a\n >\n on how to write a custom character definition file.\n <b>Only load custom JSON files from sources that you trust!</b>\n <h3>Some popular custom scripts:</h3>\n <ul class=\"scripts\">\n <li\n v-for=\"(script, index) in scripts\"\n :key=\"index\"\n @click=\"handleURL(script[1])\"\n >\n {{ script[0] }}\n </li>\n </ul>\n <input\n type=\"file\"\n ref=\"upload\"\n accept=\"application/json\"\n @change=\"handleUpload\"\n />\n <div class=\"button-group\">\n <div class=\"button\" @click=\"openUpload\">\n <font-awesome-icon icon=\"file-upload\" /> Upload JSON\n </div>\n <div class=\"button\" @click=\"promptURL\">\n <font-awesome-icon icon=\"link\" /> Enter URL\n </div>\n <div class=\"button\" @click=\"isCustom = false\">\n <font-awesome-icon icon=\"undo\" /> Back\n </div>\n </div>\n </div>\n </Modal>\n</template>\n\n<script>\nimport editionJSON from \"../../editions\";\nimport { mapMutations, mapState } from \"vuex\";\nimport Modal from \"./Modal\";\n\nexport default {\n components: {\n Modal\n },\n data: function() {\n return {\n editions: editionJSON,\n isCustom: false,\n scripts: [\n [\n \"Deadly Penance Day\",\n \"https://gist.githubusercontent.com/bra1n/0337cc44c6fd2c44f7589256ed5486d2/raw/16be38fa3c01aaf49827303ac80577bdb52c0b25/penanceday.json\"\n ],\n [\n \"Catfishing 11.1\",\n \"https://gist.githubusercontent.com/bra1n/8a5ec41a7bbf945f6b7dfc1cef72b569/raw/a312ab93c2f302e0ef83c8b65a4e8e82760fda3a/catfishing.json\"\n ],\n [\n \"On Thin Ice (Teensyville)\",\n \"https://gist.githubusercontent.com/bra1n/8dacd9f2abc6f428331ea1213ab153f5/raw/0cacbcaf8ed9bddae0cca25a9ada97e9958d868b/on-thin-ice.json\"\n ],\n [\n \"Race To The Bottom (Teensyville)\",\n \"https://gist.githubusercontent.com/bra1n/63e1354cb3dc9d4032bcd0623dc48888/raw/5acb0eedcc0a67a64a99c7e0e6271de0b7b2e1b2/race-to-the-bottom.json\"\n ],\n [\n \"Frankenstein's Mayor by Ted (Teensyville)\",\n \"https://gist.githubusercontent.com/bra1n/32c52b422cc01b934a4291eeb81dbcee/raw/5bf770693bbf7aff5e86601c82ca4af3222f4ba6/Frankensteins_Mayor_by_Ted.json\"\n ],\n [\n \"Vigormortis High School (Teensyville)\",\n \"https://gist.githubusercontent.com/bra1n/1f65bd4a999524719d5dabe98c3c2d27/raw/22bbec6bf56a51a7459e5ae41ed47e41971c5445/VigormortisHighSchool.json\"\n ]\n ]\n };\n },\n computed: mapState([\"modals\"]),\n methods: {\n openUpload() {\n this.$refs.upload.click();\n },\n handleUpload() {\n const file = this.$refs.upload.files[0];\n if (file && file.size) {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n try {\n const roles = JSON.parse(reader.result);\n this.parseRoles(roles);\n } catch (e) {\n alert(\"Error reading custom script: \" + e.message);\n }\n this.$refs.upload.value = \"\";\n });\n reader.readAsText(file);\n }\n },\n promptURL() {\n const url = prompt(\"Enter URL to a custom-script.json file\");\n if (url) {\n this.handleURL(url);\n }\n },\n async handleURL(url) {\n const res = await fetch(url);\n if (res && res.json) {\n try {\n const script = await res.json();\n this.parseRoles(script);\n } catch (e) {\n alert(\"Error loading custom script: \" + e.message);\n }\n }\n },\n parseRoles(roles) {\n if (!roles || !roles.length) return;\n const metaIndex = roles.findIndex(({ id }) => id === \"_meta\");\n let meta = {};\n if (metaIndex > -1) {\n meta = roles.splice(metaIndex, 1).pop();\n }\n const customRoles = roles.map(role => {\n role.id = role.id.toLocaleLowerCase().replace(/[^a-z0-9]/g, \"\");\n return role;\n });\n this.$store.commit(\"setCustomRoles\", customRoles);\n this.$store.commit(\n \"setEdition\",\n Object.assign({}, meta, { id: \"custom\" })\n );\n // check for fabled and set those too, if present\n if (customRoles.some(({ id }) => this.$store.state.fabled.has(id))) {\n const fabled = [];\n customRoles.forEach(({ id }) => {\n if (this.$store.state.fabled.has(id)) {\n fabled.push(this.$store.state.fabled.get(id));\n }\n });\n this.$store.commit(\"players/setFabled\", { fabled });\n }\n this.isCustom = false;\n },\n ...mapMutations([\"toggleModal\", \"setEdition\"])\n }\n};\n</script>\n\n<style scoped lang=\"scss\">\nul.editions .edition {\n font-family: PiratesBay, sans-serif;\n letter-spacing: 1px;\n text-align: center;\n padding-top: 15%;\n background-position: center center;\n background-size: 100% auto;\n background-repeat: no-repeat;\n width: 30%;\n margin: 5px;\n font-size: 120%;\n text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000,\n 1px 1px 0 #000, 0 0 5px rgba(0, 0, 0, 0.75);\n cursor: pointer;\n &:hover {\n color: red;\n }\n}\n\n.custom {\n text-align: center;\n input[type=\"file\"] {\n display: none;\n }\n .scripts {\n list-style-type: disc;\n font-size: 120%;\n cursor: pointer;\n display: block;\n width: 50%;\n text-align: left;\n margin: 10px auto;\n li:hover {\n color: red;\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditionModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditionModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditionModal.vue?vue&type=template&id=6113891e&scoped=true&\"\nimport script from \"./EditionModal.vue?vue&type=script&lang=js&\"\nexport * from \"./EditionModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditionModal.vue?vue&type=style&index=0&id=6113891e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6113891e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"intro\"},[_c('img',{attrs:{\"src\":\"static/apple-icon.png\",\"alt\":\"\"}}),_vm._v(\" Welcome to the (unofficial) \"),_c('b',[_vm._v(\"Virtual Town Square and Grimoire\")]),_vm._v(\" for Blood on the Clocktower! Please add more players through the \"),_c('span',{staticClass:\"button\",on:{\"click\":_vm.toggleMenu}},[_c('font-awesome-icon',{attrs:{\"icon\":\"cog\"}}),_vm._v(\" Menu \")],1),_vm._v(\" on the top right or by pressing \"),_c('b',[_vm._v(\"[A]\")]),_vm._v(\". You can also join a game session by pressing \"),_c('b',[_vm._v(\"[J]\")]),_vm._v(\".\"),_c('br'),_vm._m(0)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"footer\"},[_vm._v(\" This project is free and open source and can be found on \"),_c('a',{attrs:{\"href\":\"https://github.com/bra1n/townsquare\",\"target\":\"_blank\"}},[_vm._v(\"GitHub\")]),_vm._v(\". It is not affiliated with The Pandemonium Institute. \\\"Blood on the Clocktower\\\" is a trademark of Steven Medway and The Pandemonium Institute. \")])}]\n\nexport { render, staticRenderFns }","<template>\n <div class=\"intro\">\n <img src=\"static/apple-icon.png\" alt=\"\" />\n Welcome to the (unofficial)\n <b>Virtual Town Square and Grimoire</b> for Blood on the Clocktower! Please\n add more players through the\n <span class=\"button\" @click=\"toggleMenu\">\n <font-awesome-icon icon=\"cog\" /> Menu\n </span>\n on the top right or by pressing <b>[A]</b>. You can also join a game session\n by pressing <b>[J]</b>.<br />\n <div class=\"footer\">\n This project is free and open source and can be found on\n <a href=\"https://github.com/bra1n/townsquare\" target=\"_blank\">GitHub</a>.\n It is not affiliated with The Pandemonium Institute. \"Blood on the\n Clocktower\" is a trademark of Steven Medway and The Pandemonium Institute.\n </div>\n </div>\n</template>\n\n<script>\nimport { mapMutations } from \"vuex\";\n\nexport default {\n methods: mapMutations([\"toggleMenu\"])\n};\n</script>\n\n<style scoped lang=\"scss\">\n// Intro\n.intro {\n text-align: center;\n width: 50%;\n font-size: 120%;\n position: absolute;\n padding: 10px;\n background: rgba(0, 0, 0, 0.5);\n border: 3px solid black;\n border-radius: 10px;\n z-index: 3;\n a {\n color: white;\n }\n img {\n position: absolute;\n bottom: 100%;\n left: 50%;\n width: 25vh;\n margin-left: -12.5vh;\n margin-bottom: 2vh;\n max-width: 192px;\n border-radius: 50%;\n box-shadow: 0 0 10px black;\n border: 3px solid black;\n }\n .footer {\n font-size: 60%;\n opacity: 0.75;\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Intro.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Intro.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Intro.vue?vue&type=template&id=0ae0fea6&scoped=true&\"\nimport script from \"./Intro.vue?vue&type=script&lang=js&\"\nexport * from \"./Intro.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Intro.vue?vue&type=style&index=0&id=0ae0fea6&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0ae0fea6\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.modals.reference && _vm.roles.size)?_c('Modal',{staticClass:\"characters\",on:{\"close\":function($event){return _vm.toggleModal('reference')}}},[_c('font-awesome-icon',{staticClass:\"toggle\",attrs:{\"icon\":\"cloud-moon\",\"title\":\"Show Night Order\"},on:{\"click\":function($event){return _vm.toggleModal('nightOrder')}}}),_c('h3',[_vm._v(\" Character Reference \"),_c('font-awesome-icon',{attrs:{\"icon\":\"address-card\"}}),_vm._v(\" \"+_vm._s(_vm.edition.name || \"Custom Script\")+\" \")],1),_c('ul',{staticClass:\"legend\"},[_c('li',[_c('span',{staticClass:\"name\"},[_vm._v(\"Name\")]),_c('span',{staticClass:\"icon\"},[_vm._v(\"Icon\")]),_c('span',{staticClass:\"ability\"},[_vm._v(\"Ability\")]),(Object.keys(_vm.playersByRole).length)?_c('span',{staticClass:\"player\"},[_vm._v(\" Player \")]):_vm._e()])]),_vm._l((_vm.rolesGrouped),function(teamRoles,team){return _c('div',{key:team,class:[team]},[_c('h4',[_vm._v(_vm._s(team))]),_c('ul',_vm._l((teamRoles),function(role){return _c('li',{key:role.id,class:[team]},[_c('span',{staticClass:\"name\"},[_vm._v(_vm._s(role.name))]),(role.id)?_c('span',{staticClass:\"icon\",style:({\n backgroundImage: (\"url(\" + (role.image && _vm.grimoire.isImageOptIn\n ? role.image\n : require('../../assets/icons/' +\n (role.imageAlt || role.id) +\n '.png')) + \")\")\n })}):_vm._e(),_c('span',{staticClass:\"ability\"},[_vm._v(_vm._s(role.ability))]),(Object.keys(_vm.playersByRole).length)?_c('span',{staticClass:\"player\"},[_vm._v(_vm._s(_vm.playersByRole[role.id] ? _vm.playersByRole[role.id].join(\", \") : \"\"))]):_vm._e()])}),0)])})],2):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <Modal\n class=\"characters\"\n @close=\"toggleModal('reference')\"\n v-if=\"modals.reference && roles.size\"\n >\n <font-awesome-icon\n @click=\"toggleModal('nightOrder')\"\n icon=\"cloud-moon\"\n class=\"toggle\"\n title=\"Show Night Order\"\n />\n <h3>\n Character Reference\n <font-awesome-icon icon=\"address-card\" />\n {{ edition.name || \"Custom Script\" }}\n </h3>\n <ul class=\"legend\">\n <li>\n <span class=\"name\">Name</span>\n <span class=\"icon\">Icon</span>\n <span class=\"ability\">Ability</span>\n <span class=\"player\" v-if=\"Object.keys(playersByRole).length\">\n Player\n </span>\n </li>\n </ul>\n <div v-for=\"(teamRoles, team) in rolesGrouped\" :key=\"team\" :class=\"[team]\">\n <h4>{{ team }}</h4>\n <ul>\n <li v-for=\"role in teamRoles\" :class=\"[team]\" :key=\"role.id\">\n <span class=\"name\">{{ role.name }}</span>\n <span\n class=\"icon\"\n v-if=\"role.id\"\n :style=\"{\n backgroundImage: `url(${\n role.image && grimoire.isImageOptIn\n ? role.image\n : require('../../assets/icons/' +\n (role.imageAlt || role.id) +\n '.png')\n })`\n }\"\n ></span>\n <span class=\"ability\">{{ role.ability }}</span>\n <span class=\"player\" v-if=\"Object.keys(playersByRole).length\">{{\n playersByRole[role.id] ? playersByRole[role.id].join(\", \") : \"\"\n }}</span>\n </li>\n </ul>\n </div>\n </Modal>\n</template>\n\n<script>\nimport Modal from \"./Modal\";\nimport { mapMutations, mapState } from \"vuex\";\n\nexport default {\n components: {\n Modal\n },\n computed: {\n rolesGrouped: function() {\n const rolesGrouped = {};\n this.roles.forEach(role => {\n if (!rolesGrouped[role.team]) {\n rolesGrouped[role.team] = [];\n }\n rolesGrouped[role.team].push(role);\n });\n delete rolesGrouped[\"traveler\"];\n return rolesGrouped;\n },\n playersByRole: function() {\n const players = {};\n this.players.forEach(({ name, role }) => {\n if (role && role.id && role.team !== \"traveler\") {\n if (!players[role.id]) {\n players[role.id] = [];\n }\n players[role.id].push(name);\n }\n });\n return players;\n },\n ...mapState([\"roles\", \"modals\", \"edition\", \"grimoire\"]),\n ...mapState(\"players\", [\"players\"])\n },\n methods: {\n ...mapMutations([\"toggleModal\"])\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../vars.scss\";\n\n.toggle {\n position: absolute;\n left: 20px;\n top: 20px;\n cursor: pointer;\n &:hover {\n color: red;\n }\n}\n\nh3 {\n margin: 0 40px;\n svg {\n vertical-align: middle;\n }\n}\n\nh4 {\n text-transform: capitalize;\n display: flex;\n align-items: center;\n height: 20px;\n &:before,\n &:after {\n content: \" \";\n width: 100%;\n height: 1px;\n border-radius: 2px;\n }\n &:before {\n margin-right: 15px;\n }\n &:after {\n margin-left: 15px;\n }\n}\n\n.townsfolk {\n .name,\n h4 {\n color: $townsfolk;\n &:before,\n &:after {\n background-color: $townsfolk;\n }\n }\n}\n.outsider {\n .name,\n h4 {\n color: $outsider;\n &:before,\n &:after {\n background-color: $outsider;\n }\n }\n}\n.minion {\n .name,\n h4 {\n color: $minion;\n &:before,\n &:after {\n background-color: $minion;\n }\n }\n}\n.demon {\n .name,\n h4 {\n color: $demon;\n &:before,\n &:after {\n background-color: $demon;\n }\n }\n}\nul {\n li {\n display: flex;\n width: 100%;\n align-items: center;\n align-content: center;\n /*background: linear-gradient(0deg, #ffffff0f, transparent);*/\n border-radius: 10px;\n .icon {\n width: 6vh;\n background-size: cover;\n background-position: 0 -5px;\n flex-grow: 0;\n flex-shrink: 0;\n margin: 0 10px;\n text-align: center;\n border-left: 1px solid #ffffff1f;\n border-right: 1px solid #ffffff1f;\n &:after {\n content: \" \";\n display: block;\n padding-top: 66%;\n }\n }\n .name {\n flex-grow: 0;\n flex-shrink: 0;\n width: 15%;\n font-weight: bold;\n text-align: right;\n font-size: 110%;\n }\n .player {\n flex-grow: 0;\n flex-shrink: 1;\n text-align: right;\n margin: 0 10px;\n color: #888;\n font-size: smaller;\n }\n .ability {\n flex-grow: 1;\n }\n }\n &.legend {\n font-weight: bold;\n height: 20px;\n margin-top: 10px;\n li span {\n background: none;\n height: auto;\n font-family: inherit;\n font-size: inherit;\n color: #fff;\n }\n .icon:after {\n padding-top: 0;\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReferenceModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReferenceModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ReferenceModal.vue?vue&type=template&id=12b2e35a&scoped=true&\"\nimport script from \"./ReferenceModal.vue?vue&type=script&lang=js&\"\nexport * from \"./ReferenceModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ReferenceModal.vue?vue&type=style&index=0&id=12b2e35a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"12b2e35a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"vote\"}},[_c('div',{staticClass:\"arrows\"},[_c('span',{staticClass:\"nominee\",style:(_vm.nomineeStyle)}),_c('span',{staticClass:\"nominator\",style:(_vm.nominatorStyle)})]),_c('div',{staticClass:\"overlay\"},[_c('audio',{attrs:{\"src\":require(\"../assets/sounds/countdown.mp3\"),\"preload\":\"auto\"}}),_c('em',{staticClass:\"blue\"},[_vm._v(_vm._s(_vm.nominator.name))]),_vm._v(\" nominated \"),_c('em',[_vm._v(_vm._s(_vm.nominee.name))]),_vm._v(\"! \"),_c('br'),(_vm.nominee.role.team !== 'traveler')?[_c('em',{staticClass:\"blue\"},[_vm._v(\" \"+_vm._s(_vm.voters.length)+\" vote\"+_vm._s(_vm.voters.length !== 1 ? \"s\" : \"\")+\" \")]),_vm._v(\" in favor \"),_c('em',[_vm._v(\"(majority is \"+_vm._s(Math.ceil(_vm.alive / 2))+\")\")])]:[_c('em',[_vm._v(_vm._s(Math.ceil(_vm.players.length / 2))+\" votes\")]),_vm._v(\" required for a \"),_c('em',[_vm._v(\"majority\")]),_vm._v(\". \")],(_vm.session.isVoteInProgress || _vm.session.lockedVote > 1)?_c('div',[(_vm.voters.length)?_c('em',{staticClass:\"blue\"},[_vm._v(_vm._s(_vm.voters.join(\", \"))+\" \")]):_c('span',[_vm._v(\"nobody\")]),_vm._v(\" had their hand \"),_c('em',[_vm._v(\"UP\")])]):_vm._e(),(!_vm.session.isSpectator)?[(!_vm.session.isVoteInProgress && _vm.session.lockedVote < 1)?_c('div',[_vm._v(\" Time per player: \"),_c('font-awesome-icon',{attrs:{\"icon\":\"minus-circle\"},on:{\"mousedown\":function($event){$event.preventDefault();return _vm.setVotingSpeed(-500)}}}),_vm._v(\" \"+_vm._s(_vm.session.votingSpeed / 1000)+\"s \"),_c('font-awesome-icon',{attrs:{\"icon\":\"plus-circle\"},on:{\"mousedown\":function($event){$event.preventDefault();return _vm.setVotingSpeed(500)}}})],1):_vm._e(),_c('div',{staticClass:\"button-group\"},[(!_vm.session.isVoteInProgress)?_c('div',{staticClass:\"button townsfolk\",on:{\"click\":_vm.countdown}},[_vm._v(\" Countdown \")]):_vm._e(),(!_vm.session.isVoteInProgress)?_c('div',{staticClass:\"button\",on:{\"click\":_vm.start}},[_vm._v(\" \"+_vm._s(_vm.session.lockedVote ? \"Restart\" : \"Start\")+\" \")]):[_c('div',{staticClass:\"button townsfolk\",class:{ disabled: !_vm.session.lockedVote },on:{\"click\":_vm.pause}},[_vm._v(\" \"+_vm._s(_vm.voteTimer ? \"Pause\" : \"Resume\")+\" \")]),_c('div',{staticClass:\"button\",on:{\"click\":_vm.stop}},[_vm._v(\"Reset\")])],_c('div',{staticClass:\"button demon\",on:{\"click\":_vm.finish}},[_vm._v(\"Close\")])],2)]:(_vm.canVote)?[(!_vm.session.isVoteInProgress)?_c('div',[_vm._v(\" \"+_vm._s(_vm.session.votingSpeed / 1000)+\" seconds between votes \")]):_vm._e(),_c('div',{staticClass:\"button-group\"},[_c('div',{staticClass:\"button townsfolk\",class:{ disabled: !_vm.currentVote },on:{\"click\":function($event){return _vm.vote(false)}}},[_vm._v(\" Hand DOWN \")]),_c('div',{staticClass:\"button demon\",class:{ disabled: _vm.currentVote },on:{\"click\":function($event){return _vm.vote(true)}}},[_vm._v(\" Hand UP \")])])]:(!_vm.player)?_c('div',[_vm._v(\" Please claim a seat to vote. \")]):_vm._e()],2),_c('transition',{attrs:{\"name\":\"blur\"}},[(_vm.session.isVoteInProgress && !_vm.session.lockedVote)?_c('div',{staticClass:\"countdown\"},[_c('span',[_vm._v(\"3\")]),_c('span',[_vm._v(\"2\")]),_c('span',[_vm._v(\"1\")]),_c('span',[_vm._v(\"GO\")]),_c('audio',{attrs:{\"autoplay\":!_vm.grimoire.isMuted,\"src\":require(\"../assets/sounds/countdown.mp3\"),\"muted\":_vm.grimoire.isMuted}})]):_vm._e()])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div id=\"vote\">\n <div class=\"arrows\">\n <span class=\"nominee\" :style=\"nomineeStyle\"></span>\n <span class=\"nominator\" :style=\"nominatorStyle\"></span>\n </div>\n <div class=\"overlay\">\n <audio src=\"../assets/sounds/countdown.mp3\" preload=\"auto\"></audio>\n <em class=\"blue\">{{ nominator.name }}</em> nominated\n <em>{{ nominee.name }}</em\n >!\n <br />\n <template v-if=\"nominee.role.team !== 'traveler'\">\n <em class=\"blue\">\n {{ voters.length }} vote{{ voters.length !== 1 ? \"s\" : \"\" }}\n </em>\n in favor\n <em>(majority is {{ Math.ceil(alive / 2) }})</em>\n </template>\n <template v-else>\n <em>{{ Math.ceil(players.length / 2) }} votes</em> required for a\n <em>majority</em>.\n </template>\n\n <div v-if=\"session.isVoteInProgress || session.lockedVote > 1\">\n <em class=\"blue\" v-if=\"voters.length\">{{ voters.join(\", \") }} </em>\n <span v-else>nobody</span>\n had their hand <em>UP</em>\n </div>\n\n <template v-if=\"!session.isSpectator\">\n <div v-if=\"!session.isVoteInProgress && session.lockedVote < 1\">\n Time per player:\n <font-awesome-icon\n @mousedown.prevent=\"setVotingSpeed(-500)\"\n icon=\"minus-circle\"\n />\n {{ session.votingSpeed / 1000 }}s\n <font-awesome-icon\n @mousedown.prevent=\"setVotingSpeed(500)\"\n icon=\"plus-circle\"\n />\n </div>\n <div class=\"button-group\">\n <div\n class=\"button townsfolk\"\n v-if=\"!session.isVoteInProgress\"\n @click=\"countdown\"\n >\n Countdown\n </div>\n <div class=\"button\" v-if=\"!session.isVoteInProgress\" @click=\"start\">\n {{ session.lockedVote ? \"Restart\" : \"Start\" }}\n </div>\n <template v-else>\n <div\n class=\"button townsfolk\"\n :class=\"{ disabled: !session.lockedVote }\"\n @click=\"pause\"\n >\n {{ voteTimer ? \"Pause\" : \"Resume\" }}\n </div>\n <div class=\"button\" @click=\"stop\">Reset</div>\n </template>\n <div class=\"button demon\" @click=\"finish\">Close</div>\n </div>\n </template>\n <template v-else-if=\"canVote\">\n <div v-if=\"!session.isVoteInProgress\">\n {{ session.votingSpeed / 1000 }} seconds between votes\n </div>\n <div class=\"button-group\">\n <div\n class=\"button townsfolk\"\n @click=\"vote(false)\"\n :class=\"{ disabled: !currentVote }\"\n >\n Hand DOWN\n </div>\n <div\n class=\"button demon\"\n @click=\"vote(true)\"\n :class=\"{ disabled: currentVote }\"\n >\n Hand UP\n </div>\n </div>\n </template>\n <div v-else-if=\"!player\">\n Please claim a seat to vote.\n </div>\n </div>\n <transition name=\"blur\">\n <div\n class=\"countdown\"\n v-if=\"session.isVoteInProgress && !session.lockedVote\"\n >\n <span>3</span>\n <span>2</span>\n <span>1</span>\n <span>GO</span>\n <audio\n :autoplay=\"!grimoire.isMuted\"\n src=\"../assets/sounds/countdown.mp3\"\n :muted=\"grimoire.isMuted\"\n ></audio>\n </div>\n </transition>\n </div>\n</template>\n\n<script>\nimport { mapGetters, mapState } from \"vuex\";\n\nexport default {\n computed: {\n ...mapState(\"players\", [\"players\"]),\n ...mapState([\"session\", \"grimoire\"]),\n ...mapGetters({ alive: \"players/alive\" }),\n nominator: function() {\n return this.players[this.session.nomination[0]];\n },\n nominatorStyle: function() {\n const players = this.players.length;\n const nomination = this.session.nomination[0];\n return {\n transform: `rotate(${Math.round((nomination / players) * 360)}deg)`,\n transitionDuration: this.session.votingSpeed - 0.1 + \"s\"\n };\n },\n nominee: function() {\n return this.players[this.session.nomination[1]];\n },\n nomineeStyle: function() {\n const players = this.players.length;\n const nomination = this.session.nomination[1];\n const lock = this.session.lockedVote;\n const rotation = (360 * (nomination + Math.min(lock, players))) / players;\n return {\n transform: `rotate(${Math.round(rotation)}deg)`,\n transitionDuration: this.session.votingSpeed - 100 + \"ms\"\n };\n },\n player: function() {\n return this.players.find(p => p.id === this.session.playerId);\n },\n currentVote: function() {\n const index = this.players.findIndex(p => p.id === this.session.playerId);\n return index >= 0 ? !!this.session.votes[index] : undefined;\n },\n canVote: function() {\n if (!this.player) return false;\n if (this.player.isVoteless && this.nominee.role.team !== \"traveler\")\n return false;\n const session = this.session;\n const players = this.players.length;\n const index = this.players.indexOf(this.player);\n const indexAdjusted =\n (index - 1 + players - session.nomination[1]) % players;\n return indexAdjusted >= session.lockedVote - 1;\n },\n voters: function() {\n const nomination = this.session.nomination[1];\n const voters = Array(this.players.length)\n .fill(\"\")\n .map((x, index) =>\n this.session.votes[index] ? this.players[index].name : \"\"\n );\n const reorder = [\n ...voters.slice(nomination + 1),\n ...voters.slice(0, nomination + 1)\n ];\n return reorder.slice(0, this.session.lockedVote - 1).filter(n => !!n);\n }\n },\n data() {\n return {\n voteTimer: null\n };\n },\n methods: {\n countdown() {\n this.$store.commit(\"session/lockVote\", 0);\n this.$store.commit(\"session/setVoteInProgress\", true);\n this.voteTimer = setInterval(() => {\n this.start();\n }, 4000);\n },\n start() {\n this.$store.commit(\"session/lockVote\", 1);\n this.$store.commit(\"session/setVoteInProgress\", true);\n clearInterval(this.voteTimer);\n this.voteTimer = setInterval(() => {\n this.$store.commit(\"session/lockVote\");\n if (this.session.lockedVote > this.players.length) {\n clearInterval(this.voteTimer);\n this.$store.commit(\"session/setVoteInProgress\", false);\n }\n }, this.session.votingSpeed);\n },\n pause() {\n if (this.voteTimer) {\n clearInterval(this.voteTimer);\n this.voteTimer = null;\n } else {\n this.voteTimer = setInterval(() => {\n this.$store.commit(\"session/lockVote\");\n if (this.session.lockedVote > this.players.length) {\n clearInterval(this.voteTimer);\n this.$store.commit(\"session/setVoteInProgress\", false);\n }\n }, this.session.votingSpeed);\n }\n },\n stop() {\n clearInterval(this.voteTimer);\n this.voteTimer = null;\n this.$store.commit(\"session/setVoteInProgress\", false);\n this.$store.commit(\"session/lockVote\", 0);\n },\n finish() {\n clearInterval(this.voteTimer);\n this.$store.commit(\"session/addHistory\", this.players);\n this.$store.commit(\"session/nomination\");\n },\n vote(vote) {\n if (!this.canVote) return false;\n const index = this.players.findIndex(p => p.id === this.session.playerId);\n if (index >= 0 && !!this.session.votes[index] !== vote) {\n this.$store.commit(\"session/voteSync\", [index, vote]);\n }\n },\n setVotingSpeed(diff) {\n const speed = Math.round(this.session.votingSpeed + diff);\n if (speed > 0) {\n this.$store.commit(\"session/setVotingSpeed\", speed);\n }\n }\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../vars.scss\";\n\n#vote {\n position: absolute;\n width: 20%;\n z-index: 20;\n display: flex;\n align-items: center;\n align-content: center;\n justify-content: center;\n background: url(\"../assets/demon-head.png\") center center no-repeat;\n background-size: auto 75%;\n text-align: center;\n text-shadow: 0 1px 2px #000000, 0 -1px 2px #000000, 1px 0 2px #000000,\n -1px 0 2px #000000;\n\n &:after {\n content: \" \";\n padding-bottom: 100%;\n display: block;\n }\n\n em {\n color: $demon;\n font-style: normal;\n font-weight: bold;\n &.blue {\n color: $townsfolk;\n }\n }\n\n svg {\n cursor: pointer;\n &:hover path {\n fill: url(#demon);\n stroke-width: 30px;\n stroke: white;\n }\n }\n}\n\n@keyframes arrow-cw {\n 0% {\n opacity: 0;\n transform: rotate(-180deg);\n }\n 100% {\n opacity: 1;\n transform: rotate(0deg);\n }\n}\n\n@keyframes arrow-ccw {\n 0% {\n opacity: 0;\n transform: rotate(180deg);\n }\n 100% {\n opacity: 1;\n transform: rotate(0deg);\n }\n}\n\n.arrows {\n position: absolute;\n display: flex;\n height: 150%;\n width: 25%;\n pointer-events: none;\n span {\n position: absolute;\n width: 100%;\n height: 100%;\n transition: transform 2.9s ease-in-out;\n }\n span:before {\n content: \" \";\n width: 100%;\n height: 100%;\n display: block;\n background-size: auto 100%;\n background-repeat: no-repeat;\n background-position: center center;\n position: absolute;\n filter: drop-shadow(0px 0px 3px #000);\n }\n .nominator:before {\n background-image: url(\"../assets/clock-small.png\");\n animation: arrow-ccw 1s ease-out;\n }\n .nominee:before {\n background-image: url(\"../assets/clock-big.png\");\n animation: arrow-cw 1s ease-out;\n }\n}\n\n@keyframes countdown {\n 0% {\n transform: scale(1.5);\n opacity: 0;\n filter: blur(20px);\n }\n 10% {\n opacity: 1;\n }\n 50% {\n transform: scale(1);\n filter: blur(0);\n }\n 90% {\n color: $townsfolk;\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes countdown-go {\n 0% {\n transform: scale(1.5);\n opacity: 0;\n filter: blur(20px);\n }\n 10% {\n opacity: 1;\n }\n 50% {\n transform: scale(1);\n filter: blur(0);\n }\n 90% {\n color: $demon;\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n.countdown {\n display: flex;\n position: absolute;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n audio {\n height: 0;\n width: 0;\n visibility: hidden;\n }\n span {\n position: absolute;\n font-size: 8em;\n font-weight: bold;\n opacity: 0;\n }\n span:nth-child(1) {\n animation: countdown 1100ms normal forwards;\n }\n span:nth-child(2) {\n animation: countdown 1100ms normal forwards 1000ms;\n }\n span:nth-child(3) {\n animation: countdown 1100ms normal forwards 2000ms;\n }\n span:nth-child(4) {\n animation: countdown-go 1100ms normal forwards 3000ms;\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Vote.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Vote.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Vote.vue?vue&type=template&id=00f24ea8&scoped=true&\"\nimport script from \"./Vote.vue?vue&type=script&lang=js&\"\nexport * from \"./Vote.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Vote.vue?vue&type=style&index=0&id=00f24ea8&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"00f24ea8\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"gradients\"}},_vm._l((_vm.gradients),function(gradient,index){return _c('svg',{key:index,attrs:{\"width\":\"0\",\"height\":\"0\"}},[_c('linearGradient',{attrs:{\"id\":gradient[0],\"x1\":\"50%\",\"y1\":\"100%\",\"x2\":\"50%\",\"y2\":\"0%\"}},[_c('stop',{style:({ 'stop-color': gradient[2], 'stop-opacity': 1 }),attrs:{\"offset\":\"0%\"}}),_c('stop',{style:({ 'stop-color': gradient[1], 'stop-opacity': 1 }),attrs:{\"offset\":\"100%\"}})],1)],1)}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <!-- SVG Gradients -->\n <div id=\"gradients\">\n <svg\n width=\"0\"\n height=\"0\"\n v-for=\"(gradient, index) in gradients\"\n :key=\"index\"\n >\n <linearGradient :id=\"gradient[0]\" x1=\"50%\" y1=\"100%\" x2=\"50%\" y2=\"0%\">\n <stop\n offset=\"0%\"\n :style=\"{ 'stop-color': gradient[2], 'stop-opacity': 1 }\"\n ></stop>\n <stop\n offset=\"100%\"\n :style=\"{ 'stop-color': gradient[1], 'stop-opacity': 1 }\"\n ></stop>\n </linearGradient>\n </svg>\n </div>\n</template>\n\n<script>\nexport default {\n data() {\n return {\n gradients: [\n [\"demon\", \"#ce0100\", \"#000\"],\n [\"townsfolk\", \"#1f65ff\", \"#000\"],\n [\"default\", \"#4E4E4E\", \"#000\"]\n ]\n };\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\nsvg {\n position: absolute;\n z-index: -1;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gradients.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gradients.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Gradients.vue?vue&type=template&id=1e202a64&scoped=true&\"\nimport script from \"./Gradients.vue?vue&type=script&lang=js&\"\nexport * from \"./Gradients.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Gradients.vue?vue&type=style&index=0&id=1e202a64&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1e202a64\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.modals.nightOrder && _vm.roles.size)?_c('Modal',{staticClass:\"night-reference\",on:{\"close\":function($event){return _vm.toggleModal('nightOrder')}}},[_c('font-awesome-icon',{staticClass:\"toggle\",attrs:{\"icon\":\"address-card\",\"title\":\"Show Character Reference\"},on:{\"click\":function($event){return _vm.toggleModal('reference')}}}),_c('h3',[_vm._v(\" Night Order \"),_c('font-awesome-icon',{attrs:{\"icon\":\"cloud-moon\"}}),_vm._v(\" \"+_vm._s(_vm.edition.name || \"Custom Script\")+\" \")],1),_c('div',{staticClass:\"night\"},[_c('ul',{staticClass:\"first\"},[_c('li',{staticClass:\"headline\"},[_vm._v(\"First Night\")]),_vm._l((_vm.rolesFirstNight),function(role){return _c('li',{key:role.name,class:[role.team]},[_c('span',{staticClass:\"name\"},[_vm._v(\" \"+_vm._s(role.name)+\" \"),(role.players.length)?[_c('br'),_vm._l((role.players),function(player,index){return _c('small',{key:index,class:{ dead: player.isDead }},[_vm._v(_vm._s(player.name + (role.players.length > index + 1 ? \",\" : \"\")))])})]:_vm._e()],2),(role.id)?_c('span',{staticClass:\"icon\",style:({\n backgroundImage: (\"url(\" + (role.image && _vm.grimoire.isImageOptIn\n ? role.image\n : require('../../assets/icons/' +\n (role.imageAlt || role.id) +\n '.png')) + \")\")\n })}):_vm._e(),(role.firstNightReminder)?_c('span',{staticClass:\"reminder\"},[_vm._v(\" \"+_vm._s(role.firstNightReminder)+\" \")]):_vm._e()])})],2),_c('ul',{staticClass:\"other\"},[_c('li',{staticClass:\"headline\"},[_vm._v(\"Other Nights\")]),_vm._l((_vm.rolesOtherNight),function(role){return _c('li',{key:role.name,class:[role.team]},[(role.id)?_c('span',{staticClass:\"icon\",style:({\n backgroundImage: (\"url(\" + (role.image && _vm.grimoire.isImageOptIn\n ? role.image\n : require('../../assets/icons/' +\n (role.imageAlt || role.id) +\n '.png')) + \")\")\n })}):_vm._e(),_c('span',{staticClass:\"name\"},[_vm._v(\" \"+_vm._s(role.name)+\" \"),(role.players.length)?[_c('br'),_vm._l((role.players),function(player,index){return _c('small',{key:index,class:{ dead: player.isDead }},[_vm._v(_vm._s(player.name + (role.players.length > index + 1 ? \",\" : \"\")))])})]:_vm._e()],2),(role.otherNightReminder)?_c('span',{staticClass:\"reminder\"},[_vm._v(\" \"+_vm._s(role.otherNightReminder)+\" \")]):_vm._e()])})],2)])],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <Modal\n class=\"night-reference\"\n @close=\"toggleModal('nightOrder')\"\n v-if=\"modals.nightOrder && roles.size\"\n >\n <font-awesome-icon\n @click=\"toggleModal('reference')\"\n icon=\"address-card\"\n class=\"toggle\"\n title=\"Show Character Reference\"\n />\n <h3>\n Night Order\n <font-awesome-icon icon=\"cloud-moon\" />\n {{ edition.name || \"Custom Script\" }}\n </h3>\n <div class=\"night\">\n <ul class=\"first\">\n <li class=\"headline\">First Night</li>\n <li\n v-for=\"role in rolesFirstNight\"\n :key=\"role.name\"\n :class=\"[role.team]\"\n >\n <span class=\"name\">\n {{ role.name }}\n <template v-if=\"role.players.length\">\n <br />\n <small\n v-for=\"(player, index) in role.players\"\n :class=\"{ dead: player.isDead }\"\n :key=\"index\"\n >{{\n player.name + (role.players.length > index + 1 ? \",\" : \"\")\n }}</small\n >\n </template>\n </span>\n <span\n class=\"icon\"\n v-if=\"role.id\"\n :style=\"{\n backgroundImage: `url(${\n role.image && grimoire.isImageOptIn\n ? role.image\n : require('../../assets/icons/' +\n (role.imageAlt || role.id) +\n '.png')\n })`\n }\"\n ></span>\n <span class=\"reminder\" v-if=\"role.firstNightReminder\">\n {{ role.firstNightReminder }}\n </span>\n </li>\n </ul>\n <ul class=\"other\">\n <li class=\"headline\">Other Nights</li>\n <li\n v-for=\"role in rolesOtherNight\"\n :key=\"role.name\"\n :class=\"[role.team]\"\n >\n <span\n class=\"icon\"\n v-if=\"role.id\"\n :style=\"{\n backgroundImage: `url(${\n role.image && grimoire.isImageOptIn\n ? role.image\n : require('../../assets/icons/' +\n (role.imageAlt || role.id) +\n '.png')\n })`\n }\"\n ></span>\n <span class=\"name\">\n {{ role.name }}\n <template v-if=\"role.players.length\">\n <br />\n <small\n v-for=\"(player, index) in role.players\"\n :class=\"{ dead: player.isDead }\"\n :key=\"index\"\n >{{\n player.name + (role.players.length > index + 1 ? \",\" : \"\")\n }}</small\n >\n </template>\n </span>\n <span class=\"reminder\" v-if=\"role.otherNightReminder\">\n {{ role.otherNightReminder }}\n </span>\n </li>\n </ul>\n </div>\n </Modal>\n</template>\n\n<script>\nimport Modal from \"./Modal\";\nimport { mapMutations, mapState } from \"vuex\";\n\nexport default {\n components: {\n Modal\n },\n computed: {\n rolesFirstNight: function() {\n const rolesFirstNight = [];\n // add minion / demon infos to night order sheet\n if (this.players.length > 6) {\n rolesFirstNight.push(\n {\n id: \"evil\",\n name: \"Minion info\",\n firstNight: 2,\n team: \"minion\",\n players: this.players.filter(p => p.role.team === \"minion\"),\n firstNightReminder:\n \"• If more than one Minion, they all make eye contact with each other. \" +\n \"• Show the “This is the Demon” card. Point to the Demon.\"\n },\n {\n id: \"evil\",\n name: \"Demon info & bluffs\",\n firstNight: 4,\n team: \"demon\",\n players: this.players.filter(p => p.role.team === \"demon\"),\n firstNightReminder:\n \"• Show the “These are your minions” card. Point to each Minion. \" +\n \"• Show the “These characters are not in play” card. Show 3 character tokens of good \" +\n \"characters not in play.\"\n }\n );\n }\n this.roles.forEach(role => {\n const players = this.players.filter(p => p.role.id === role.id);\n if (role.firstNight && (role.team !== \"traveler\" || players.length)) {\n rolesFirstNight.push(Object.assign({ players }, role));\n }\n });\n this.fabled\n .filter(({ firstNight }) => firstNight)\n .forEach(fabled => {\n rolesFirstNight.push(Object.assign({ players: [] }, fabled));\n });\n rolesFirstNight.sort((a, b) => a.firstNight - b.firstNight);\n return rolesFirstNight;\n },\n rolesOtherNight: function() {\n const rolesOtherNight = [];\n this.roles.forEach(role => {\n const players = this.players.filter(p => p.role.id === role.id);\n if (role.otherNight && (role.team !== \"traveler\" || players.length)) {\n rolesOtherNight.push(Object.assign({ players }, role));\n }\n });\n this.fabled\n .filter(({ otherNight }) => otherNight)\n .forEach(fabled => {\n rolesOtherNight.push(Object.assign({ players: [] }, fabled));\n });\n rolesOtherNight.sort((a, b) => a.otherNight - b.otherNight);\n return rolesOtherNight;\n },\n ...mapState([\"roles\", \"modals\", \"edition\", \"grimoire\"]),\n ...mapState(\"players\", [\"players\", \"fabled\"])\n },\n methods: {\n ...mapMutations([\"toggleModal\"])\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../vars.scss\";\n\n.toggle {\n position: absolute;\n left: 20px;\n top: 20px;\n cursor: pointer;\n &:hover {\n color: red;\n }\n}\n\nh3 {\n margin: 0 40px;\n svg {\n vertical-align: middle;\n }\n}\n\nh4 {\n text-transform: capitalize;\n display: flex;\n align-items: center;\n height: 20px;\n &:before,\n &:after {\n content: \" \";\n width: 100%;\n height: 1px;\n border-radius: 2px;\n }\n &:before {\n margin-right: 15px;\n }\n &:after {\n margin-left: 15px;\n }\n}\n\n.fabled {\n .name {\n background: linear-gradient(90deg, $fabled, transparent 35%);\n .night .other & {\n background: linear-gradient(-90deg, $fabled, transparent 35%);\n }\n }\n}\n.townsfolk {\n .name {\n background: linear-gradient(90deg, $townsfolk, transparent 35%);\n .night .other & {\n background: linear-gradient(-90deg, $townsfolk, transparent 35%);\n }\n }\n}\n.outsider {\n .name {\n background: linear-gradient(90deg, $outsider, transparent 35%);\n .night .other & {\n background: linear-gradient(-90deg, $outsider, transparent 35%);\n }\n }\n}\n.minion {\n .name {\n background: linear-gradient(90deg, $minion, transparent 35%);\n .night .other & {\n background: linear-gradient(-90deg, $minion, transparent 35%);\n }\n }\n}\n.demon {\n .name {\n background: linear-gradient(90deg, $demon, transparent 35%);\n .night .other & {\n background: linear-gradient(-90deg, $demon, transparent 35%);\n }\n }\n}\nul {\n li {\n display: flex;\n width: 100%;\n margin-bottom: 3px;\n .icon {\n width: 6vh;\n background-size: cover;\n background-position: 0 0;\n flex-grow: 0;\n flex-shrink: 0;\n text-align: center;\n margin: 0 2px;\n &:after {\n content: \" \";\n display: block;\n padding-top: 66%;\n }\n }\n .name {\n flex-grow: 0;\n flex-shrink: 0;\n width: 15%;\n text-align: right;\n font-size: 110%;\n padding: 5px;\n border-left: 1px solid rgba(255, 255, 255, 0.4);\n border-right: 1px solid rgba(255, 255, 255, 0.4);\n small {\n color: #888;\n margin-right: 5px;\n &.dead {\n text-decoration: line-through;\n }\n }\n }\n .reminder {\n position: fixed;\n padding: 5px 10px;\n left: 50%;\n bottom: 10%;\n width: 500px;\n z-index: 25;\n background: rgba(0, 0, 0, 0.75);\n border-radius: 10px;\n border: 3px solid black;\n filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.5));\n text-align: left;\n pointer-events: none;\n opacity: 0;\n transition: opacity 200ms ease-in-out;\n margin-left: -250px;\n }\n &:hover .reminder {\n opacity: 1;\n }\n }\n &.legend {\n font-weight: bold;\n height: 20px;\n margin-top: 10px;\n li span {\n background: none;\n height: auto;\n font-family: inherit;\n font-size: inherit;\n }\n .icon:after {\n padding-top: 0;\n }\n }\n}\n\n.night {\n display: flex;\n align-items: flex-start;\n justify-content: center;\n > *:first-child {\n margin-right: 2vh;\n }\n > * {\n flex-grow: 0;\n flex-wrap: nowrap;\n flex-direction: column;\n }\n .headline {\n display: block;\n font-weight: bold;\n border-bottom: 1px solid rgba(255, 255, 255, 0.4);\n padding: 5px 10px;\n border-radius: 0;\n text-align: center;\n }\n .name {\n flex-grow: 1;\n }\n .first {\n .name {\n border-left: 0;\n }\n }\n .other {\n li .name {\n text-align: left;\n border-right: 0;\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NightOrderModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NightOrderModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NightOrderModal.vue?vue&type=template&id=1c012874&scoped=true&\"\nimport script from \"./NightOrderModal.vue?vue&type=script&lang=js&\"\nexport * from \"./NightOrderModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NightOrderModal.vue?vue&type=style&index=0&id=1c012874&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1c012874\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.modals.fabled && _vm.fabled.length)?_c('Modal',{on:{\"close\":function($event){return _vm.toggleModal('fabled')}}},[_c('h3',[_vm._v(\" Choose a fabled character to add to the game \")]),_c('ul',{staticClass:\"tokens\"},_vm._l((_vm.fabled),function(role){return _c('li',{key:role.id,on:{\"click\":function($event){return _vm.setFabled(role)}}},[_c('Token',{attrs:{\"role\":role}})],1)}),0)]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <Modal v-if=\"modals.fabled && fabled.length\" @close=\"toggleModal('fabled')\">\n <h3>\n Choose a fabled character to add to the game\n </h3>\n <ul class=\"tokens\">\n <li v-for=\"role in fabled\" :key=\"role.id\" @click=\"setFabled(role)\">\n <Token :role=\"role\" />\n </li>\n </ul>\n </Modal>\n</template>\n\n<script>\nimport { mapMutations, mapState } from \"vuex\";\nimport Modal from \"./Modal\";\nimport Token from \"../Token\";\n\nexport default {\n components: { Token, Modal },\n computed: {\n ...mapState([\"modals\", \"fabled\", \"grimoire\"]),\n fabled() {\n const fabled = [];\n this.$store.state.fabled.forEach(role => {\n // don't show fabled that are already in play\n if (\n !this.$store.state.players.fabled.some(fable => fable.id === role.id)\n ) {\n fabled.push(role);\n }\n });\n return fabled;\n }\n },\n methods: {\n setFabled(role) {\n this.$store.commit(\"players/setFabled\", {\n fabled: role\n });\n this.$store.commit(\"toggleModal\", \"fabled\");\n },\n ...mapMutations([\"toggleModal\"])\n }\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"../../vars.scss\";\n\nul.tokens li {\n border-radius: 50%;\n width: 8vw;\n margin: 0.5%;\n transition: transform 500ms ease;\n\n &:hover {\n transform: scale(1.2);\n z-index: 10;\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FabledModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FabledModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FabledModal.vue?vue&type=template&id=d6b399a0&scoped=true&\"\nimport script from \"./FabledModal.vue?vue&type=script&lang=js&\"\nexport * from \"./FabledModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FabledModal.vue?vue&type=style&index=0&id=d6b399a0&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d6b399a0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Modal',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.modals.voteHistory && _vm.session.voteHistory),expression:\"modals.voteHistory && session.voteHistory\"}],staticClass:\"vote-history\",on:{\"close\":function($event){return _vm.toggleModal('voteHistory')}}},[_c('font-awesome-icon',{staticClass:\"clear\",attrs:{\"icon\":\"trash-alt\",\"title\":\"Clear history\"},on:{\"click\":_vm.clearVoteHistory}}),_c('h3',[_vm._v(\"Nomination history\")]),_c('table',[_c('thead',[_c('tr',[_c('td',[_vm._v(\"Time\")]),_c('td',[_vm._v(\"Nominator\")]),_c('td',[_vm._v(\"Nominee\")]),_c('td',[_vm._v(\"Type\")]),_c('td',[_vm._v(\"Votes\")]),_c('td',[_vm._v(\"Majority\")]),_c('td',[_c('font-awesome-icon',{attrs:{\"icon\":\"user-friends\"}}),_vm._v(\" Voters \")],1)])]),_c('tbody',_vm._l((_vm.session.voteHistory),function(vote,index){return _c('tr',{key:index},[_c('td',[_vm._v(\" \"+_vm._s(vote.timestamp .getHours() .toString() .padStart(2, \"0\"))+\":\"+_vm._s(vote.timestamp .getMinutes() .toString() .padStart(2, \"0\"))+\" \")]),_c('td',[_vm._v(_vm._s(vote.nominator))]),_c('td',[_vm._v(_vm._s(vote.nominee))]),_c('td',[_vm._v(_vm._s(vote.type))]),_c('td',[_vm._v(\" \"+_vm._s(vote.votes.length)+\" \"),_c('font-awesome-icon',{attrs:{\"icon\":\"hand-paper\"}})],1),_c('td',[_vm._v(\" \"+_vm._s(vote.majority)+\" \"),_c('font-awesome-icon',{attrs:{\"icon\":[\n 'fas',\n vote.votes.length >= vote.majority ? 'check-square' : 'square'\n ]}})],1),_c('td',[_vm._v(\" \"+_vm._s(vote.votes.join(\", \"))+\" \")])])}),0)])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <Modal\n class=\"vote-history\"\n v-show=\"modals.voteHistory && session.voteHistory\"\n @close=\"toggleModal('voteHistory')\"\n >\n <font-awesome-icon\n @click=\"clearVoteHistory\"\n icon=\"trash-alt\"\n class=\"clear\"\n title=\"Clear history\"\n />\n\n <h3>Nomination history</h3>\n <table>\n <thead>\n <tr>\n <td>Time</td>\n <td>Nominator</td>\n <td>Nominee</td>\n <td>Type</td>\n <td>Votes</td>\n <td>Majority</td>\n <td>\n <font-awesome-icon icon=\"user-friends\" />\n Voters\n </td>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(vote, index) in session.voteHistory\" :key=\"index\">\n <td>\n {{\n vote.timestamp\n .getHours()\n .toString()\n .padStart(2, \"0\")\n }}:{{\n vote.timestamp\n .getMinutes()\n .toString()\n .padStart(2, \"0\")\n }}\n </td>\n <td>{{ vote.nominator }}</td>\n <td>{{ vote.nominee }}</td>\n <td>{{ vote.type }}</td>\n <td>\n {{ vote.votes.length }}\n <font-awesome-icon icon=\"hand-paper\" />\n </td>\n <td>\n {{ vote.majority }}\n <font-awesome-icon\n :icon=\"[\n 'fas',\n vote.votes.length >= vote.majority ? 'check-square' : 'square'\n ]\"\n />\n </td>\n <td>\n {{ vote.votes.join(\", \") }}\n </td>\n </tr>\n </tbody>\n </table>\n </Modal>\n</template>\n\n<script>\nimport Modal from \"./Modal\";\nimport { mapMutations, mapState } from \"vuex\";\n\nexport default {\n components: {\n Modal\n },\n computed: {\n ...mapState([\"session\", \"modals\"])\n },\n methods: {\n ...mapMutations([\"toggleModal\"]),\n ...mapMutations(\"session\", [\"clearVoteHistory\"])\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../vars.scss\";\n\n.clear {\n position: absolute;\n left: 20px;\n top: 20px;\n cursor: pointer;\n &:hover {\n color: red;\n }\n}\n\nh3 {\n margin: 0 40px;\n svg {\n vertical-align: middle;\n }\n}\n\ntable {\n border-spacing: 10px 0;\n}\n\nthead td {\n font-weight: bold;\n border-bottom: 1px solid white;\n text-align: center;\n padding: 0 3px;\n}\n\ntbody {\n td:nth-child(2) {\n color: $townsfolk;\n }\n td:nth-child(3) {\n color: $demon;\n }\n td:nth-child(5) {\n text-align: center;\n }\n td:nth-child(6) {\n text-align: center;\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VoteHistoryModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VoteHistoryModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VoteHistoryModal.vue?vue&type=template&id=5f8dc20e&scoped=true&\"\nimport script from \"./VoteHistoryModal.vue?vue&type=script&lang=js&\"\nexport * from \"./VoteHistoryModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VoteHistoryModal.vue?vue&type=style&index=0&id=5f8dc20e&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5f8dc20e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.modals.gameState)?_c('Modal',{staticClass:\"game-state\",on:{\"close\":function($event){return _vm.toggleModal('gameState')}}},[_c('h3',[_vm._v(\"Current Game State\")]),_c('textarea',{domProps:{\"value\":_vm.gamestate},on:{\"input\":function($event){$event.stopPropagation();_vm.input = $event.target.value},\"click\":function($event){return $event.target.select()},\"keyup\":function($event){$event.stopPropagation();}}}),_c('div',{staticClass:\"button-group\"},[_c('div',{staticClass:\"button townsfolk\",on:{\"click\":_vm.copy}},[_c('font-awesome-icon',{attrs:{\"icon\":\"copy\"}}),_vm._v(\" Copy JSON \")],1),(!_vm.session.isSpectator)?_c('div',{staticClass:\"button demon\",on:{\"click\":_vm.load}},[_c('font-awesome-icon',{attrs:{\"icon\":\"cog\"}}),_vm._v(\" Load State \")],1):_vm._e()])]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <Modal\n class=\"game-state\"\n v-if=\"modals.gameState\"\n @close=\"toggleModal('gameState')\"\n >\n <h3>Current Game State</h3>\n <textarea\n :value=\"gamestate\"\n @input.stop=\"input = $event.target.value\"\n @click=\"$event.target.select()\"\n @keyup.stop=\"\"\n ></textarea>\n <div class=\"button-group\">\n <div class=\"button townsfolk\" @click=\"copy\">\n <font-awesome-icon icon=\"copy\" /> Copy JSON\n </div>\n <div class=\"button demon\" @click=\"load\" v-if=\"!session.isSpectator\">\n <font-awesome-icon icon=\"cog\" /> Load State\n </div>\n </div>\n </Modal>\n</template>\n\n<script>\nimport Modal from \"./Modal\";\nimport { mapMutations, mapState } from \"vuex\";\n\nexport default {\n components: {\n Modal\n },\n computed: {\n gamestate: function() {\n return JSON.stringify({\n bluffs: this.players.bluffs.map(({ id }) => id),\n edition: this.edition.isOfficial\n ? { id: this.edition.id }\n : this.edition,\n roles: this.edition.isOfficial ? \"\" : this.$store.getters.customRoles,\n fabled: this.players.fabled.map(({ id }) => id),\n players: this.players.players.map(player => ({\n ...player,\n role: player.role.id || {}\n }))\n });\n },\n ...mapState([\"modals\", \"players\", \"edition\", \"roles\", \"session\"])\n },\n data() {\n return {\n input: \"\"\n };\n },\n methods: {\n copy: function() {\n navigator.clipboard.writeText(this.input || this.gamestate);\n },\n load: function() {\n if (this.session.isSpectator) return;\n try {\n const data = JSON.parse(this.input || this.gamestate);\n const { bluffs, edition, roles, fabled, players } = data;\n if (roles) {\n this.$store.commit(\"setCustomRoles\", roles);\n }\n if (edition) {\n this.$store.commit(\"setEdition\", edition);\n }\n if (bluffs.length) {\n bluffs.forEach((role, index) => {\n this.$store.commit(\"players/setBluff\", {\n index,\n role: this.$store.state.roles.get(role) || {}\n });\n });\n }\n if (fabled) {\n this.$store.commit(\"players/setFabled\", {\n fabled: fabled.map(id => this.$store.state.fabled.get(id))\n });\n }\n if (players) {\n this.$store.commit(\n \"players/set\",\n players.map(player => ({\n ...player,\n role:\n this.$store.state.roles.get(player.role) ||\n this.$store.getters.rolesJSONbyId.get(player.role) ||\n {}\n }))\n );\n }\n this.toggleModal(\"gameState\");\n } catch (e) {\n alert(\"Unable to parse JSON: \" + e);\n }\n },\n ...mapMutations([\"toggleModal\"])\n }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../vars.scss\";\n\nh3 {\n margin: 0 40px;\n}\n\ntextarea {\n background: transparent;\n color: white;\n white-space: pre-wrap;\n word-break: break-all;\n border: 1px solid rgba(255, 255, 255, 0.5);\n width: 60vw;\n height: 30vh;\n max-width: 100%;\n margin: 5px 0;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GameStateModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GameStateModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GameStateModal.vue?vue&type=template&id=935cca7a&scoped=true&\"\nimport script from \"./GameStateModal.vue?vue&type=script&lang=js&\"\nexport * from \"./GameStateModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GameStateModal.vue?vue&type=style&index=0&id=935cca7a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"935cca7a\",\n null\n \n)\n\nexport default component.exports","<template>\n <div\n id=\"app\"\n @keyup=\"keyup\"\n tabindex=\"-1\"\n :class=\"{ night: grimoire.isNight }\"\n :style=\"{\n backgroundImage: grimoire.background\n ? `url('${grimoire.background}')`\n : ''\n }\"\n >\n <video\n id=\"background\"\n v-if=\"grimoire.background && grimoire.background.match(/\\.(mp4|webm)$/i)\"\n :src=\"grimoire.background\"\n autoplay\n loop\n ></video>\n <div class=\"backdrop\"></div>\n <transition name=\"blur\">\n <Intro v-if=\"!players.length\"></Intro>\n <TownInfo v-if=\"players.length && !session.nomination\"></TownInfo>\n <Vote v-if=\"session.nomination\"></Vote>\n </transition>\n <TownSquare></TownSquare>\n <Menu ref=\"menu\"></Menu>\n <EditionModal />\n <FabledModal />\n <RolesModal />\n <ReferenceModal />\n <NightOrderModal />\n <VoteHistoryModal />\n <GameStateModal />\n <Gradients />\n <span id=\"version\">v{{ version }}</span>\n </div>\n</template>\n\n<script>\nimport { mapState } from \"vuex\";\nimport { version } from \"../package.json\";\nimport TownSquare from \"./components/TownSquare\";\nimport TownInfo from \"./components/TownInfo\";\nimport Menu from \"./components/Menu\";\nimport RolesModal from \"./components/modals/RolesModal\";\nimport EditionModal from \"./components/modals/EditionModal\";\nimport Intro from \"./components/Intro\";\nimport ReferenceModal from \"./components/modals/ReferenceModal\";\nimport Vote from \"./components/Vote\";\nimport Gradients from \"./components/Gradients\";\nimport NightOrderModal from \"./components/modals/NightOrderModal\";\nimport FabledModal from \"@/components/modals/FabledModal\";\nimport VoteHistoryModal from \"@/components/modals/VoteHistoryModal\";\nimport GameStateModal from \"@/components/modals/GameStateModal\";\n\nexport default {\n components: {\n GameStateModal,\n VoteHistoryModal,\n FabledModal,\n NightOrderModal,\n Vote,\n ReferenceModal,\n Intro,\n TownInfo,\n TownSquare,\n Menu,\n EditionModal,\n RolesModal,\n Gradients\n },\n computed: {\n ...mapState([\"grimoire\", \"session\"]),\n ...mapState(\"players\", [\"players\"])\n },\n data() {\n return {\n version\n };\n },\n methods: {\n keyup({ key, ctrlKey, metaKey }) {\n if (ctrlKey || metaKey) return;\n switch (key.toLocaleLowerCase()) {\n case \"g\":\n this.$store.commit(\"toggleGrimoire\");\n break;\n case \"a\":\n this.$refs.menu.addPlayer();\n break;\n case \"h\":\n this.$refs.menu.hostSession();\n break;\n case \"j\":\n this.$refs.menu.joinSession();\n break;\n case \"r\":\n this.$store.commit(\"toggleModal\", \"reference\");\n break;\n case \"n\":\n this.$store.commit(\"toggleModal\", \"nightOrder\");\n break;\n case \"e\":\n if (this.session.isSpectator) return;\n this.$store.commit(\"toggleModal\", \"edition\");\n break;\n case \"c\":\n if (this.session.isSpectator) return;\n this.$store.commit(\"toggleModal\", \"roles\");\n break;\n case \"v\":\n if (this.session.voteHistory.length) {\n this.$store.commit(\"toggleModal\", \"voteHistory\");\n }\n break;\n case \"s\":\n if (this.session.isSpectator) return;\n this.$store.commit(\"toggleNight\");\n break;\n case \"escape\":\n this.$store.commit(\"toggleModal\");\n }\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"vars\";\n\n@font-face {\n font-family: \"Papyrus\";\n src: url(\"assets/fonts/papyrus.eot\"); /* IE9*/\n src: url(\"assets/fonts/papyrus.eot?#iefix\") format(\"embedded-opentype\"),\n /* IE6-IE8 */ url(\"assets/fonts/papyrus.woff2\") format(\"woff2\"),\n /* chrome firefox */ url(\"assets/fonts/papyrus.woff\") format(\"woff\"),\n /* chrome firefox */ url(\"assets/fonts/papyrus.ttf\") format(\"truetype\"),\n /* chrome firefox opera Safari, Android, iOS 4.2+*/\n url(\"assets/fonts/papyrus.svg#PapyrusW01\") format(\"svg\"); /* iOS 4.1- */\n}\n\n@font-face {\n font-family: PiratesBay;\n src: url(\"assets/fonts/piratesbay.ttf\");\n font-display: swap;\n}\n\nhtml,\nbody {\n font-size: 1.2em;\n line-height: 1.4;\n background: url(\"assets/background.jpg\") center center;\n background-size: cover;\n color: white;\n height: 100%;\n font-family: \"Roboto Condensed\", sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n@import \"media\";\n\n* {\n box-sizing: border-box;\n position: relative;\n}\n\na {\n color: $townsfolk;\n &:hover {\n color: $demon;\n }\n}\n\nh1,\nh2,\nh3,\nh4,\nh5 {\n margin: 0;\n text-align: center;\n font-family: PiratesBay, sans-serif;\n letter-spacing: 1px;\n font-weight: normal;\n}\n\nul {\n list-style-type: none;\n margin: 0;\n padding: 0;\n}\n\n#app {\n height: 100%;\n background-position: center center;\n background-size: cover;\n display: flex;\n align-items: center;\n align-content: center;\n justify-content: center;\n}\n\n#version {\n position: absolute;\n text-align: right;\n right: 10px;\n bottom: 10px;\n font-size: 60%;\n opacity: 0.5;\n}\n\n.blur-enter-active,\n.blur-leave-active {\n transition: all 250ms;\n filter: blur(0);\n}\n.blur-enter,\n.blur-leave-to {\n opacity: 0;\n filter: blur(20px);\n}\n\n// Buttons\n.button-group {\n display: flex;\n align-items: center;\n justify-content: center;\n align-content: center;\n .button {\n margin: 5px 0;\n border-radius: 0;\n &:first-child {\n border-top-left-radius: 15px;\n border-bottom-left-radius: 15px;\n }\n &:last-child {\n border-top-right-radius: 15px;\n border-bottom-right-radius: 15px;\n }\n }\n}\n.button {\n padding: 0;\n border: solid 0.125em transparent;\n border-radius: 15px;\n box-shadow: inset 0 1px 1px #9c9c9c, 0 0 10px #000;\n background: radial-gradient(\n at 0 -15%,\n rgba(#fff, 0.07) 70%,\n rgba(#fff, 0) 71%\n )\n 0 0/ 80% 90% no-repeat content-box,\n linear-gradient(#4e4e4e, #040404) content-box,\n linear-gradient(#292929, #010101) border-box;\n color: white;\n font-weight: bold;\n text-shadow: 1px 1px rgba(0, 0, 0, 0.5);\n line-height: 170%;\n margin: 5px auto;\n cursor: pointer;\n transition: all 200ms;\n white-space: nowrap;\n &:hover {\n color: red;\n }\n &.disabled {\n color: gray;\n cursor: default;\n opacity: 0.75;\n }\n &:before,\n &:after {\n content: \" \";\n display: inline-block;\n width: 10px;\n height: 10px;\n }\n &.townsfolk {\n background: radial-gradient(\n at 0 -15%,\n rgba(255, 255, 255, 0.07) 70%,\n rgba(255, 255, 255, 0) 71%\n )\n 0 0/80% 90% no-repeat content-box,\n linear-gradient(#0031ad, rgba(5, 0, 0, 0.22)) content-box,\n linear-gradient(#292929, #001142) border-box;\n box-shadow: inset 0 1px 1px #002c9c, 0 0 10px #000;\n &:hover:not(.disabled) {\n color: #008cf7;\n }\n }\n &.demon {\n background: radial-gradient(\n at 0 -15%,\n rgba(255, 255, 255, 0.07) 70%,\n rgba(255, 255, 255, 0) 71%\n )\n 0 0/80% 90% no-repeat content-box,\n linear-gradient(#ad0000, rgba(5, 0, 0, 0.22)) content-box,\n linear-gradient(#292929, #420000) border-box;\n box-shadow: inset 0 1px 1px #9c0000, 0 0 10px #000;\n }\n}\n\n/* video background */\nvideo#background {\n position: absolute;\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n/* Night phase backdrop */\n#app > .backdrop {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n pointer-events: none;\n background: black;\n background: linear-gradient(\n 180deg,\n rgba(0, 0, 0, 1) 0%,\n rgba(1, 22, 46, 1) 50%,\n rgba(0, 39, 70, 1) 100%\n );\n opacity: 0;\n transition: opacity 1s ease-in-out;\n &:after {\n content: \" \";\n display: block;\n width: 100%;\n padding-right: 2000px;\n height: 100%;\n background: url(\"assets/clouds.png\") repeat;\n background-size: 2000px auto;\n animation: move-background 120s linear infinite;\n opacity: 0.3;\n }\n}\n\n@keyframes move-background {\n from {\n transform: translate3d(-2000px, 0px, 0px);\n }\n to {\n transform: translate3d(0px, 0px, 0px);\n }\n}\n\n#app.night > .backdrop {\n opacity: 0.5;\n}\n</style>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=4c1c5831&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","class LiveSession {\n constructor(store) {\n this._wss = \"wss://live.clocktower.online:8080/\";\n //this._wss = \"wss://localhost:8081/\";\n this._socket = null;\n this._isSpectator = true;\n this._gamestate = [];\n this._store = store;\n this._pingInterval = 30 * 1000; // 30 seconds between pings\n this._pingTimer = null;\n this._reconnectTimer = null;\n this._players = {}; // map of players connected to a session\n this._pings = {}; // map of player IDs to ping\n // reconnect to previous session\n if (this._store.state.session.sessionId) {\n this.connect(this._store.state.session.sessionId);\n }\n }\n\n /**\n * Open a new session for the passed channel.\n * @param channel\n * @private\n */\n _open(channel) {\n this.disconnect();\n this._socket = new WebSocket(\n this._wss +\n channel +\n \"/\" +\n (this._isSpectator ? this._store.state.session.playerId : \"host\")\n );\n this._socket.addEventListener(\"message\", this._handleMessage.bind(this));\n this._socket.onopen = this._onOpen.bind(this);\n this._socket.onclose = err => {\n this._socket = null;\n clearInterval(this._pingTimer);\n this._pingTimer = null;\n if (err.code !== 1000) {\n // connection interrupted, reconnect after 3 seconds\n this._store.commit(\"session/setReconnecting\", true);\n this._reconnectTimer = setTimeout(\n () => this.connect(channel),\n 3 * 1000\n );\n } else {\n this._store.commit(\"session/setSessionId\", \"\");\n if (err.reason) alert(err.reason);\n }\n };\n }\n\n /**\n * Send a message through the socket.\n * @param command\n * @param params\n * @private\n */\n _send(command, params) {\n if (this._socket && this._socket.readyState === 1) {\n this._socket.send(JSON.stringify([command, params]));\n }\n }\n\n /**\n * Send a message directly to a single playerId, if provided.\n * Otherwise broadcast it.\n * @param playerId player ID or \"host\", optional\n * @param command\n * @param params\n * @private\n */\n _sendDirect(playerId, command, params) {\n if (playerId) {\n this._send(\"direct\", { [playerId]: [command, params] });\n } else {\n this._send(command, params);\n }\n }\n\n /**\n * Open event handler for socket.\n * @private\n */\n _onOpen() {\n if (this._isSpectator) {\n this._sendDirect(\n \"host\",\n \"getGamestate\",\n this._store.state.session.playerId\n );\n } else {\n this.sendGamestate();\n }\n this._ping();\n }\n\n /**\n * Send a ping message with player ID and ST flag.\n * @private\n */\n _ping() {\n this._handlePing();\n this._send(\"ping\", [\n this._isSpectator\n ? this._store.state.session.playerId\n : Object.keys(this._players).length,\n \"latency\"\n ]);\n clearTimeout(this._pingTimer);\n this._pingTimer = setTimeout(this._ping.bind(this), this._pingInterval);\n }\n\n /**\n * Handle an incoming socket message.\n * @param data\n * @private\n */\n _handleMessage({ data }) {\n let command, params;\n try {\n [command, params] = JSON.parse(data);\n } catch (err) {\n console.log(\"unsupported socket message\", data);\n }\n switch (command) {\n case \"getGamestate\":\n this.sendGamestate(params);\n break;\n case \"edition\":\n this._updateEdition(params);\n break;\n case \"fabled\":\n this._updateFabled(params);\n break;\n case \"gs\":\n this._updateGamestate(params);\n break;\n case \"player\":\n this._updatePlayer(params);\n break;\n case \"claim\":\n this._updateSeat(params);\n break;\n case \"ping\":\n this._handlePing(params);\n break;\n case \"nomination\":\n if (!this._isSpectator) return;\n if (!params) {\n // create vote history record\n this._store.commit(\n \"session/addHistory\",\n this._store.state.players.players\n );\n }\n this._store.commit(\"session/nomination\", { nomination: params });\n break;\n case \"swap\":\n if (!this._isSpectator) return;\n this._store.commit(\"players/swap\", params);\n break;\n case \"move\":\n if (!this._isSpectator) return;\n this._store.commit(\"players/move\", params);\n break;\n case \"isNight\":\n if (!this._isSpectator) return;\n this._store.commit(\"toggleNight\", params);\n break;\n case \"votingSpeed\":\n if (!this._isSpectator) return;\n this._store.commit(\"session/setVotingSpeed\", params);\n break;\n case \"clearVoteHistory\":\n if (!this._isSpectator) return;\n this._store.commit(\"session/clearVoteHistory\");\n break;\n case \"isVoteInProgress\":\n if (!this._isSpectator) return;\n this._store.commit(\"session/setVoteInProgress\", params);\n break;\n case \"vote\":\n this._handleVote(params);\n break;\n case \"lock\":\n this._handleLock(params);\n break;\n case \"bye\":\n this._handleBye(params);\n break;\n }\n }\n\n /**\n * Connect to a new live session, either as host or spectator.\n * Set a unique playerId if there isn't one yet.\n * @param channel\n */\n connect(channel) {\n if (!this._store.state.session.playerId) {\n this._store.commit(\n \"session/setPlayerId\",\n Math.random()\n .toString(36)\n .substr(2)\n );\n }\n this._pings = {};\n this._store.commit(\"session/setPlayerCount\", 0);\n this._store.commit(\"session/setPing\", 0);\n this._isSpectator = this._store.state.session.isSpectator;\n this._open(channel);\n }\n\n /**\n * Close the current session, if any.\n */\n disconnect() {\n this._pings = {};\n this._store.commit(\"session/setPlayerCount\", 0);\n this._store.commit(\"session/setPing\", 0);\n this._store.commit(\"session/setReconnecting\", false);\n clearTimeout(this._reconnectTimer);\n if (this._socket) {\n if (this._isSpectator) {\n this._sendDirect(\"host\", \"bye\", this._store.state.session.playerId);\n }\n this._socket.close(1000);\n this._socket = null;\n }\n }\n\n /**\n * Publish the current gamestate.\n * Optional param to reduce traffic. (send only player data)\n * @param playerId\n * @param isLightweight\n */\n sendGamestate(playerId = \"\", isLightweight = false) {\n if (this._isSpectator) return;\n this._gamestate = this._store.state.players.players.map(player => ({\n name: player.name,\n id: player.id,\n isDead: player.isDead,\n isVoteless: player.isVoteless,\n ...(player.role && player.role.team === \"traveler\"\n ? { roleId: player.role.id }\n : {})\n }));\n if (isLightweight) {\n this._sendDirect(playerId, \"gs\", {\n gamestate: this._gamestate,\n isLightweight\n });\n } else {\n const { session, grimoire } = this._store.state;\n const { fabled } = this._store.state.players;\n this.sendEdition(playerId);\n this._sendDirect(playerId, \"gs\", {\n gamestate: this._gamestate,\n isNight: grimoire.isNight,\n nomination: session.nomination,\n votingSpeed: session.votingSpeed,\n lockedVote: session.lockedVote,\n isVoteInProgress: session.isVoteInProgress,\n fabled: fabled.map(({ id }) => id),\n ...(session.nomination ? { votes: session.votes } : {})\n });\n }\n }\n\n /**\n * Update the gamestate based on incoming data.\n * @param data\n * @private\n */\n _updateGamestate(data) {\n if (!this._isSpectator) return;\n const {\n gamestate,\n isLightweight,\n isNight,\n nomination,\n votingSpeed,\n votes,\n lockedVote,\n isVoteInProgress,\n fabled\n } = data;\n const players = this._store.state.players.players;\n // adjust number of players\n if (players.length < gamestate.length) {\n for (let x = players.length; x < gamestate.length; x++) {\n this._store.commit(\"players/add\", gamestate[x].name);\n }\n } else if (players.length > gamestate.length) {\n for (let x = players.length; x > gamestate.length; x--) {\n this._store.commit(\"players/remove\", x - 1);\n }\n }\n // update status for each player\n gamestate.forEach((state, x) => {\n const player = players[x];\n const { roleId } = state;\n // update relevant properties\n [\"name\", \"id\", \"isDead\", \"isVoteless\"].forEach(property => {\n const value = state[property];\n if (player[property] !== value) {\n this._store.commit(\"players/update\", { player, property, value });\n }\n });\n // roles are special, because of travelers\n if (roleId && player.role.id !== roleId) {\n const role =\n this._store.state.roles.get(roleId) ||\n this._store.getters.rolesJSONbyId.get(roleId);\n if (role) {\n this._store.commit(\"players/update\", {\n player,\n property: \"role\",\n value: role\n });\n }\n } else if (!roleId && player.role.team === \"traveler\") {\n this._store.commit(\"players/update\", {\n player,\n property: \"role\",\n value: {}\n });\n }\n });\n if (!isLightweight) {\n this._store.commit(\"toggleNight\", !!isNight);\n this._store.commit(\"session/nomination\", {\n nomination,\n votes,\n votingSpeed,\n lockedVote,\n isVoteInProgress\n });\n this._store.commit(\"players/setFabled\", {\n fabled: fabled.map(id => this._store.state.fabled.get(id))\n });\n }\n }\n\n /**\n * Publish an edition update. ST only\n * @param playerId\n */\n sendEdition(playerId = \"\") {\n if (this._isSpectator) return;\n const { edition } = this._store.state;\n let roles;\n if (!edition.isOfficial) {\n roles = this._store.getters.customRolesStripped;\n }\n this._sendDirect(playerId, \"edition\", {\n edition: edition.isOfficial ? { id: edition.id } : edition,\n ...(roles ? { roles } : {})\n });\n }\n\n /**\n * Update edition and roles for custom editions.\n * @param edition\n * @param roles\n * @private\n */\n _updateEdition({ edition, roles }) {\n if (!this._isSpectator) return;\n this._store.commit(\"setEdition\", edition);\n if (roles) {\n this._store.commit(\"setCustomRoles\", roles);\n if (this._store.state.roles.size !== roles.length) {\n const missing = [];\n roles.forEach(({ id }) => {\n if (!this._store.state.roles.get(id)) {\n missing.push(id);\n }\n });\n alert(\n `This session contains custom characters that can't be found. ` +\n `Please load them before joining! ` +\n `Missing roles: ${missing.join(\", \")}`\n );\n this.disconnect();\n this._store.commit(\"toggleModal\", \"edition\");\n }\n }\n }\n\n /**\n * Publish a fabled update. ST only\n */\n sendFabled() {\n if (this._isSpectator) return;\n const { fabled } = this._store.state.players;\n this._send(\n \"fabled\",\n fabled.map(({ id }) => id)\n );\n }\n\n /**\n * Update fabled roles.\n * @param fabled\n * @private\n */\n _updateFabled(fabled) {\n if (!this._isSpectator) return;\n this._store.commit(\"players/setFabled\", {\n fabled: fabled.map(id => this._store.state.fabled.get(id))\n });\n }\n\n /**\n * Publish a player update.\n * @param player\n * @param property\n * @param value\n */\n sendPlayer({ player, property, value }) {\n if (this._isSpectator || property === \"reminders\") return;\n const index = this._store.state.players.players.indexOf(player);\n if (property === \"role\") {\n if (value.team && value.team === \"traveler\") {\n // update local gamestate to remember this player as a traveler\n this._gamestate[index].roleId = value.id;\n this._send(\"player\", {\n index,\n property,\n value: value.id\n });\n } else if (this._gamestate[index].roleId) {\n // player was previously a traveler\n delete this._gamestate[index].roleId;\n this._send(\"player\", { index, property, value: \"\" });\n }\n } else {\n this._send(\"player\", { index, property, value });\n }\n }\n\n /**\n * Update a player based on incoming data. Player only.\n * @param index\n * @param property\n * @param value\n * @private\n */\n _updatePlayer({ index, property, value }) {\n if (!this._isSpectator) return;\n const player = this._store.state.players.players[index];\n if (!player) return;\n // special case where a player stops being a traveler\n if (property === \"role\") {\n if (!value && player.role.team === \"traveler\") {\n // reset to an unknown role\n this._store.commit(\"players/update\", {\n player,\n property: \"role\",\n value: {}\n });\n } else {\n // load role, first from session, the global, then fail gracefully\n const role =\n this._store.state.roles.get(value) ||\n this._store.getters.rolesJSONbyId.get(value) ||\n {};\n this._store.commit(\"players/update\", {\n player,\n property: \"role\",\n value: role\n });\n }\n } else {\n // just update the player otherwise\n this._store.commit(\"players/update\", { player, property, value });\n }\n }\n\n /**\n * Handle a ping message by another player / storyteller\n * @param playerIdOrCount\n * @param latency\n * @private\n */\n _handlePing([playerIdOrCount = 0, latency] = []) {\n const now = new Date().getTime();\n if (!this._isSpectator) {\n // remove players that haven't sent a ping in twice the timespan\n for (let player in this._players) {\n if (now - this._players[player] > this._pingInterval * 2) {\n delete this._players[player];\n delete this._pings[player];\n }\n }\n // remove claimed seats from players that are no longer connected\n this._store.state.players.players.forEach(player => {\n if (player.id && !this._players[player.id]) {\n this._store.commit(\"players/update\", {\n player,\n property: \"id\",\n value: \"\"\n });\n }\n });\n // store new player data\n if (playerIdOrCount) {\n this._players[playerIdOrCount] = now;\n const ping = parseInt(latency, 10);\n if (ping && ping > 0 && ping < 30 * 1000) {\n // ping to Players\n this._pings[playerIdOrCount] = ping;\n const pings = Object.values(this._pings);\n this._store.commit(\n \"session/setPing\",\n Math.round(pings.reduce((a, b) => a + b, 0) / pings.length)\n );\n }\n }\n } else if (latency) {\n // ping to ST\n this._store.commit(\"session/setPing\", parseInt(latency, 10));\n }\n // update player count\n if (!this._isSpectator || playerIdOrCount) {\n this._store.commit(\n \"session/setPlayerCount\",\n this._isSpectator ? playerIdOrCount : Object.keys(this._players).length\n );\n }\n }\n\n /**\n * Handle a player leaving the sessions. ST only\n * @param playerId\n * @private\n */\n _handleBye(playerId) {\n if (this._isSpectator) return;\n delete this._players[playerId];\n this._store.commit(\n \"session/setPlayerCount\",\n Object.keys(this._players).length\n );\n }\n\n /**\n * Claim a seat, needs to be confirmed by the Storyteller.\n * Seats already occupied can't be claimed.\n * @param seat either -1 to vacate or the index of the seat claimed\n */\n claimSeat(seat) {\n if (!this._isSpectator) return;\n const players = this._store.state.players.players;\n if (players.length > seat && (seat < 0 || !players[seat].id)) {\n this._send(\"claim\", [seat, this._store.state.session.playerId]);\n }\n }\n\n /**\n * Update a player id associated with that seat.\n * @param index seat index or -1\n * @param value playerId to add / remove\n * @private\n */\n _updateSeat([index, value]) {\n if (this._isSpectator) return;\n const property = \"id\";\n const players = this._store.state.players.players;\n // remove previous seat\n const oldIndex = players.findIndex(({ id }) => id === value);\n if (oldIndex >= 0 && oldIndex !== index) {\n this._store.commit(\"players/update\", {\n player: players[oldIndex],\n property,\n value: \"\"\n });\n }\n // add playerId to new seat\n if (index >= 0) {\n const player = players[index];\n if (!player) return;\n this._store.commit(\"players/update\", { player, property, value });\n }\n // update player session list as if this was a ping\n this._handlePing([true, value, 0]);\n }\n\n /**\n * Distribute player roles to all seated players in a direct message.\n * This will be split server side so that each player only receives their own (sub)message.\n */\n distributeRoles() {\n if (this._isSpectator) return;\n const message = {};\n this._store.state.players.players.forEach((player, index) => {\n if (player.id && player.role) {\n message[player.id] = [\n \"player\",\n { index, property: \"role\", value: player.role.id }\n ];\n }\n });\n if (Object.keys(message).length) {\n this._send(\"direct\", message);\n }\n }\n\n /**\n * A player nomination. ST only\n * This also syncs the voting speed to the players.\n * @param nomination [nominator, nominee]\n */\n nomination({ nomination } = {}) {\n if (this._isSpectator) return;\n const players = this._store.state.players.players;\n if (\n !nomination ||\n (players.length > nomination[0] && players.length > nomination[1])\n ) {\n this.setVotingSpeed(this._store.state.session.votingSpeed);\n this._send(\"nomination\", nomination);\n }\n }\n\n /**\n * Set the isVoteInProgress status. ST only\n */\n setVoteInProgress() {\n if (this._isSpectator) return;\n this._send(\"isVoteInProgress\", this._store.state.session.isVoteInProgress);\n }\n\n /**\n * Send the isNight status. ST only\n */\n setIsNight() {\n if (this._isSpectator) return;\n this._send(\"isNight\", this._store.state.grimoire.isNight);\n }\n\n /**\n * Send the voting speed. ST only\n * @param votingSpeed voting speed in seconds, minimum 1\n */\n setVotingSpeed(votingSpeed) {\n if (this._isSpectator) return;\n if (votingSpeed) {\n this._send(\"votingSpeed\", votingSpeed);\n }\n }\n\n /**\n * Clear the vote history for everyone. ST only\n */\n clearVoteHistory() {\n if (this._isSpectator) return;\n this._send(\"clearVoteHistory\");\n }\n\n /**\n * Send a vote. Player or ST\n * @param index Seat of the player\n * @param sync Flag whether to sync this vote with others or not\n */\n vote([index]) {\n const player = this._store.state.players.players[index];\n if (\n this._store.state.session.playerId === player.id ||\n !this._isSpectator\n ) {\n // send vote only if it is your own vote or you are the storyteller\n this._send(\"vote\", [\n index,\n this._store.state.session.votes[index],\n !this._isSpectator\n ]);\n }\n }\n\n /**\n * Handle an incoming vote, but only if it is from ST or unlocked.\n * @param index\n * @param vote\n * @param fromST\n */\n _handleVote([index, vote, fromST]) {\n const { session, players } = this._store.state;\n const playerCount = players.players.length;\n const indexAdjusted =\n (index - 1 + playerCount - session.nomination[1]) % playerCount;\n if (fromST || indexAdjusted >= session.lockedVote - 1) {\n this._store.commit(\"session/vote\", [index, vote]);\n }\n }\n\n /**\n * Lock a vote. ST only\n */\n lockVote() {\n if (this._isSpectator) return;\n const { lockedVote, votes, nomination } = this._store.state.session;\n const { players } = this._store.state.players;\n const index = (nomination[1] + lockedVote - 1) % players.length;\n this._send(\"lock\", [this._store.state.session.lockedVote, votes[index]]);\n }\n\n /**\n * Update vote lock and the locked vote, if it differs. Player only\n * @param lock\n * @param vote\n * @private\n */\n _handleLock([lock, vote]) {\n if (!this._isSpectator) return;\n this._store.commit(\"session/lockVote\", lock);\n if (lock > 1) {\n const { lockedVote, nomination } = this._store.state.session;\n const { players } = this._store.state.players;\n const index = (nomination[1] + lockedVote - 1) % players.length;\n if (this._store.state.session.votes[index] !== vote) {\n this._store.commit(\"session/vote\", [index, vote]);\n }\n }\n }\n\n /**\n * Swap two player seats. ST only\n * @param payload\n */\n swapPlayer(payload) {\n if (this._isSpectator) return;\n this._send(\"swap\", payload);\n }\n\n /**\n * Move a player to another seat. ST only\n * @param payload\n */\n movePlayer(payload) {\n if (this._isSpectator) return;\n this._send(\"move\", payload);\n }\n}\n\nexport default store => {\n // setup\n const session = new LiveSession(store);\n\n // listen to mutations\n store.subscribe(({ type, payload }) => {\n switch (type) {\n case \"session/setSessionId\":\n if (payload) {\n session.connect(payload);\n } else {\n window.location.hash = \"\";\n session.disconnect();\n }\n break;\n case \"session/claimSeat\":\n session.claimSeat(payload);\n break;\n case \"session/distributeRoles\":\n if (payload) {\n session.distributeRoles();\n }\n break;\n case \"session/nomination\":\n session.nomination(payload);\n break;\n case \"session/setVoteInProgress\":\n session.setVoteInProgress(payload);\n break;\n case \"session/voteSync\":\n session.vote(payload);\n break;\n case \"session/lockVote\":\n session.lockVote();\n break;\n case \"session/setVotingSpeed\":\n session.setVotingSpeed(payload);\n break;\n case \"session/clearVoteHistory\":\n session.clearVoteHistory();\n break;\n case \"toggleNight\":\n session.setIsNight();\n break;\n case \"setEdition\":\n session.sendEdition();\n break;\n case \"players/setFabled\":\n session.sendFabled();\n break;\n case \"players/swap\":\n session.swapPlayer(payload);\n break;\n case \"players/move\":\n session.movePlayer(payload);\n break;\n case \"players/set\":\n case \"players/clear\":\n case \"players/remove\":\n case \"players/add\":\n session.sendGamestate(\"\", true);\n break;\n case \"players/update\":\n session.sendPlayer(payload);\n break;\n }\n });\n\n // check for session Id in hash\n const sessionId = window.location.hash.substr(1);\n if (sessionId) {\n store.commit(\"session/setSpectator\", true);\n store.commit(\"session/setSessionId\", sessionId);\n }\n};\n","const NEWPLAYER = {\n name: \"\",\n id: \"\",\n role: {},\n reminders: [],\n isVoteless: false,\n isDead: false\n};\n\nconst state = () => ({\n players: [],\n fabled: [],\n bluffs: []\n});\n\nconst getters = {\n alive({ players }) {\n return players.filter(player => !player.isDead).length;\n },\n nonTravelers({ players }) {\n const nonTravelers = players.filter(\n player => player.role.team !== \"traveler\"\n );\n return Math.min(nonTravelers.length, 15);\n },\n // calculate a Map of player => night order\n nightOrder({ players, fabled }) {\n const firstNight = [0];\n const otherNight = [0];\n players.forEach(({ role }) => {\n if (role.firstNight && !firstNight.includes(role.firstNight)) {\n firstNight.push(role.firstNight);\n }\n if (role.otherNight && !otherNight.includes(role.otherNight)) {\n otherNight.push(role.otherNight);\n }\n });\n fabled.forEach(role => {\n if (role.firstNight && !firstNight.includes(role.firstNight)) {\n firstNight.push(role.firstNight);\n }\n if (role.otherNight && !otherNight.includes(role.otherNight)) {\n otherNight.push(role.otherNight);\n }\n });\n firstNight.sort((a, b) => a - b);\n otherNight.sort((a, b) => a - b);\n const nightOrder = new Map();\n players.forEach(player => {\n const first = Math.max(firstNight.indexOf(player.role.firstNight), 0);\n const other = Math.max(otherNight.indexOf(player.role.otherNight), 0);\n nightOrder.set(player, { first, other });\n });\n fabled.forEach(role => {\n const first = Math.max(firstNight.indexOf(role.firstNight), 0);\n const other = Math.max(otherNight.indexOf(role.otherNight), 0);\n nightOrder.set(role, { first, other });\n });\n return nightOrder;\n }\n};\n\nconst actions = {\n randomize({ state, commit }) {\n const players = state.players\n .map(a => [Math.random(), a])\n .sort((a, b) => a[0] - b[0])\n .map(a => a[1]);\n commit(\"set\", players);\n },\n clearRoles({ state, commit, rootState }) {\n let players;\n if (rootState.session.isSpectator) {\n players = state.players.map(player => {\n if (player.role.team !== \"traveler\") {\n player.role = {};\n }\n player.reminders = [];\n return player;\n });\n } else {\n players = state.players.map(({ name, id }) => ({\n ...NEWPLAYER,\n name,\n id\n }));\n commit(\"setFabled\", { fabled: [] });\n }\n commit(\"set\", players);\n commit(\"setBluff\");\n }\n};\n\nconst mutations = {\n clear(state) {\n state.players = [];\n state.bluffs = [];\n state.fabled = [];\n },\n set(state, players = []) {\n state.players = players;\n },\n update(state, { player, property, value }) {\n const index = state.players.indexOf(player);\n if (index >= 0) {\n state.players[index][property] = value;\n }\n },\n add(state, name) {\n state.players.push({\n ...NEWPLAYER,\n name\n });\n },\n remove(state, index) {\n state.players.splice(index, 1);\n },\n swap(state, [from, to]) {\n [state.players[from], state.players[to]] = [\n state.players[to],\n state.players[from]\n ];\n // hack: \"modify\" the array so that Vue notices something changed\n state.players.splice(0, 0);\n },\n move(state, [from, to]) {\n state.players.splice(to, 0, state.players.splice(from, 1)[0]);\n },\n setBluff(state, { index, role } = {}) {\n if (index !== undefined) {\n state.bluffs.splice(index, 1, role);\n } else {\n state.bluffs = [];\n }\n },\n setFabled(state, { index, fabled } = {}) {\n if (index !== undefined) {\n state.fabled.splice(index, 1);\n } else if (fabled) {\n if (!Array.isArray(fabled)) {\n state.fabled.push(fabled);\n } else {\n state.fabled = fabled;\n }\n }\n }\n};\n\nexport default {\n namespaced: true,\n state,\n getters,\n actions,\n mutations\n};\n","/**\n * Handle a vote request.\n * If the vote is from a seat that is already locked, ignore it.\n * @param state session state\n * @param index seat of the player in the circle\n * @param vote true or false\n */\nconst handleVote = (state, [index, vote]) => {\n if (!state.nomination) return;\n state.votes = [...state.votes];\n state.votes[index] = vote === undefined ? !state.votes[index] : vote;\n};\n\nconst state = () => ({\n sessionId: \"\",\n isSpectator: false,\n isReconnecting: false,\n playerCount: 0,\n ping: 0,\n playerId: \"\",\n claimedSeat: -1,\n nomination: false,\n votes: [],\n lockedVote: 0,\n votingSpeed: 3000,\n isVoteInProgress: false,\n voteHistory: [],\n isRolesDistributed: false\n});\n\nconst getters = {};\n\nconst actions = {};\n\n// mutations helper functions\nconst set = key => (state, val) => {\n state[key] = val;\n};\n\nconst mutations = {\n setPlayerId: set(\"playerId\"),\n setSpectator: set(\"isSpectator\"),\n setReconnecting: set(\"isReconnecting\"),\n setPlayerCount: set(\"playerCount\"),\n setPing: set(\"ping\"),\n setVotingSpeed: set(\"votingSpeed\"),\n setVoteInProgress: set(\"isVoteInProgress\"),\n claimSeat: set(\"claimedSeat\"),\n distributeRoles: set(\"isRolesDistributed\"),\n setSessionId(state, sessionId) {\n state.sessionId = sessionId\n .toLocaleLowerCase()\n .replace(/[^0-9a-z]/g, \"\")\n .substr(0, 10);\n },\n nomination(\n state,\n { nomination, votes, votingSpeed, lockedVote, isVoteInProgress } = {}\n ) {\n state.nomination = nomination || false;\n state.votes = votes || [];\n state.votingSpeed = votingSpeed || state.votingSpeed;\n state.lockedVote = lockedVote || 0;\n state.isVoteInProgress = isVoteInProgress || false;\n },\n /**\n * Create an entry in the vote history log. Requires current player array because it might change later in the game.\n * Only stores votes that were completed.\n * @param state\n * @param players\n */\n addHistory(state, players) {\n if (!state.nomination || state.lockedVote <= players.length) return;\n const isBanishment = players[state.nomination[1]].role.team === \"traveler\";\n state.voteHistory.push({\n timestamp: new Date(),\n nominator: players[state.nomination[0]].name,\n nominee: players[state.nomination[1]].name,\n type: isBanishment ? \"Banishment\" : \"Execution\",\n majority: Math.ceil(\n players.filter(player => !player.isDead || isBanishment).length / 2\n ),\n votes: players\n .filter((player, index) => state.votes[index])\n .map(({ name }) => name)\n });\n },\n clearVoteHistory(state) {\n state.voteHistory = [];\n },\n /**\n * Store a vote with and without syncing it to the live session.\n * This is necessary in order to prevent infinite voting loops.\n * @param state\n * @param vote\n */\n vote: handleVote,\n voteSync: handleVote,\n lockVote(state, lock) {\n state.lockedVote = lock !== undefined ? lock : state.lockedVote + 1;\n }\n};\n\nexport default {\n namespaced: true,\n state,\n getters,\n actions,\n mutations\n};\n","import Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport persistence from \"./persistence\";\nimport socket from \"./socket\";\nimport players from \"./modules/players\";\nimport session from \"./modules/session\";\nimport editionJSON from \"../editions.json\";\nimport rolesJSON from \"../roles.json\";\nimport fabledJSON from \"../fabled.json\";\n\nVue.use(Vuex);\n\n// global data maps\nconst editionJSONbyId = new Map(\n editionJSON.map(edition => [edition.id, edition])\n);\nconst rolesJSONbyId = new Map(rolesJSON.map(role => [role.id, role]));\nconst fabled = new Map(fabledJSON.map(role => [role.id, role]));\n\n// helper functions\nconst getRolesByEdition = (edition = editionJSON[0]) => {\n return new Map(\n rolesJSON\n .filter(r => r.edition === edition.id || edition.roles.includes(r.id))\n .sort((a, b) => b.team.localeCompare(a.team))\n .map(role => [role.id, role])\n );\n};\n\nconst getTravelersNotInEdition = (edition = editionJSON[0]) => {\n return new Map(\n rolesJSON\n .filter(\n r =>\n r.team === \"traveler\" &&\n r.edition !== edition.id &&\n !edition.roles.includes(r.id)\n )\n .map(role => [role.id, role])\n );\n};\n\nconst set = key => ({ grimoire }, val) => {\n grimoire[key] = val;\n};\n\nconst toggle = key => ({ grimoire }, val) => {\n if (val === true || val === false) {\n grimoire[key] = val;\n } else {\n grimoire[key] = !grimoire[key];\n }\n};\n\n// base definition for custom roles\nconst customRole = {\n id: \"\",\n name: \"\",\n image: \"\",\n ability: \"\",\n edition: \"custom\",\n firstNight: 0,\n firstNightReminder: \"\",\n otherNight: 0,\n otherNightReminder: \"\",\n reminders: [],\n remindersGlobal: [],\n setup: false,\n team: \"townsfolk\",\n isCustom: true\n};\n\nexport default new Vuex.Store({\n modules: {\n players,\n session\n },\n state: {\n grimoire: {\n isNight: false,\n isNightOrder: true,\n isPublic: true,\n isMenuOpen: false,\n isMuted: false,\n isImageOptIn: false,\n zoom: 0,\n background: \"\"\n },\n modals: {\n edition: false,\n fabled: false,\n gameState: false,\n nightOrder: false,\n reference: false,\n reminder: false,\n role: false,\n roles: false,\n voteHistory: false\n },\n edition: editionJSONbyId.get(\"tb\"),\n roles: getRolesByEdition(),\n otherTravelers: getTravelersNotInEdition(),\n fabled\n },\n getters: {\n /**\n * Return all custom roles, with default values and non-essential data stripped.\n * Role object keys will be replaced with a numerical index to conserve bandwidth.\n * @param roles\n * @returns {[]}\n */\n customRolesStripped: ({ roles }) => {\n const customRoles = [];\n const customKeys = Object.keys(customRole);\n const strippedProps = [\n \"firstNightReminder\",\n \"otherNightReminder\",\n \"isCustom\"\n ];\n roles.forEach(role => {\n if (!role.isCustom) {\n customRoles.push({ id: role.id });\n } else {\n const strippedRole = {};\n for (let prop in role) {\n if (strippedProps.includes(prop)) {\n continue;\n }\n const value = role[prop];\n if (customKeys.includes(prop) && value !== customRole[prop]) {\n strippedRole[customKeys.indexOf(prop)] = value;\n }\n }\n customRoles.push(strippedRole);\n }\n });\n return customRoles;\n },\n rolesJSONbyId: () => rolesJSONbyId\n },\n mutations: {\n setZoom: set(\"zoom\"),\n setBackground: set(\"background\"),\n toggleMuted: toggle(\"isMuted\"),\n toggleMenu: toggle(\"isMenuOpen\"),\n toggleNightOrder: toggle(\"isNightOrder\"),\n toggleNight: toggle(\"isNight\"),\n toggleGrimoire: toggle(\"isPublic\"),\n toggleImageOptIn: toggle(\"isImageOptIn\"),\n toggleModal({ modals }, name) {\n if (name) {\n modals[name] = !modals[name];\n }\n for (let modal in modals) {\n if (modal === name) continue;\n modals[modal] = false;\n }\n },\n /**\n * Store custom roles\n * @param state\n * @param roles Array of role IDs or full role definitions\n */\n setCustomRoles(state, roles) {\n state.roles = new Map(\n roles\n // replace numerical role object keys with matching key names\n .map(role => {\n if (role[0]) {\n const customKeys = Object.keys(customRole);\n const mappedRole = {};\n for (let prop in role) {\n if (customKeys[prop]) {\n mappedRole[customKeys[prop]] = role[prop];\n }\n }\n return mappedRole;\n } else {\n return role;\n }\n })\n // map existing roles to base definition or pre-populate custom roles to ensure all properties\n .map(\n role =>\n rolesJSONbyId.get(role.id) ||\n state.roles.get(role.id) ||\n Object.assign({}, customRole, role)\n )\n // default empty icons and placeholders\n .map(role => {\n if (rolesJSONbyId.get(role.id)) return role;\n role.imageAlt = // map team to generic icon\n {\n townsfolk: \"good\",\n outsider: \"outsider\",\n minion: \"minion\",\n demon: \"evil\"\n }[role.team] || \"custom\";\n return role;\n })\n // filter out roles that don't match an existing role and also don't have name/ability/team\n .filter(role => role.name && role.ability && role.team)\n // sort by team\n .sort((a, b) => b.team.localeCompare(a.team))\n // convert to Map\n .map(role => [role.id, role])\n );\n // update extraTravelers map to only show travelers not in this script\n state.otherTravelers = new Map(\n rolesJSON\n .filter(r => r.team === \"traveler\" && !roles.some(i => i.id === r.id))\n .map(role => [role.id, role])\n );\n },\n setEdition(state, edition) {\n if (editionJSONbyId.has(edition.id)) {\n state.edition = editionJSONbyId.get(edition.id);\n state.roles = getRolesByEdition(state.edition);\n state.otherTravelers = getTravelersNotInEdition(state.edition);\n } else {\n state.edition = edition;\n }\n state.modals.edition = false;\n }\n },\n plugins: [persistence, socket]\n});\n","import Vue from \"vue\";\nimport App from \"./App\";\nimport store from \"./store\";\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\nimport { fas } from \"@fortawesome/free-solid-svg-icons\";\nimport { fab } from \"@fortawesome/free-brands-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\n\nconst faIcons = [\n \"AddressCard\",\n \"BookOpen\",\n \"BroadcastTower\",\n \"Chair\",\n \"CheckSquare\",\n \"CloudMoon\",\n \"Cog\",\n \"Copy\",\n \"Dice\",\n \"Dragon\",\n \"ExchangeAlt\",\n \"ExclamationTriangle\",\n \"FileCode\",\n \"FileUpload\",\n \"HandPaper\",\n \"HandPointRight\",\n \"Heartbeat\",\n \"Image\",\n \"Link\",\n \"MinusCircle\",\n \"PeopleArrows\",\n \"PlusCircle\",\n \"Question\",\n \"Random\",\n \"RedoAlt\",\n \"SearchMinus\",\n \"SearchPlus\",\n \"Square\",\n \"TheaterMasks\",\n \"Times\",\n \"TimesCircle\",\n \"TrashAlt\",\n \"Undo\",\n \"User\",\n \"UserEdit\",\n \"UserFriends\",\n \"Users\",\n \"VolumeUp\",\n \"VolumeMute\",\n \"VoteYea\"\n];\nconst fabIcons = [\"Github\", \"Discord\"];\nlibrary.add(\n ...faIcons.map(i => fas[\"fa\" + i]),\n ...fabIcons.map(i => fab[\"fa\" + i])\n);\nVue.component(\"font-awesome-icon\", FontAwesomeIcon);\nVue.config.productionTip = false;\n\nnew Vue({\n render: h => h(App),\n store\n}).$mount(\"#app\");\n","module.exports = __webpack_public_path__ + \"img/cannibal.e2bfb541.png\";","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/duchess.cfec75dc.png\";","module.exports = __webpack_public_path__ + \"img/goblin.7ebbd9ad.png\";","module.exports = __webpack_public_path__ + \"img/x.fbca4d75.png\";","module.exports = __webpack_public_path__ + \"img/tb-minion.b01c557e.png\";","var map = {\n\t\"./acrobat.png\": \"887b\",\n\t\"./amnesiac.png\": \"043b\",\n\t\"./angel.png\": \"bfe2\",\n\t\"./apprentice.png\": \"4bea\",\n\t\"./artist.png\": \"2cd0\",\n\t\"./assassin.png\": \"9187\",\n\t\"./balloonist.png\": \"65db\",\n\t\"./barber.png\": \"fcc6\",\n\t\"./barista.png\": \"027a\",\n\t\"./baron.png\": \"24d3\",\n\t\"./beggar.png\": \"cfcc\",\n\t\"./bishop.png\": \"8030\",\n\t\"./bonecollector.png\": \"23b1\",\n\t\"./bountyhunter.png\": \"899d\",\n\t\"./buddhist.png\": \"1d01\",\n\t\"./bureaucrat.png\": \"25f6\",\n\t\"./butcher.png\": \"37dd\",\n\t\"./butler.png\": \"64fe\",\n\t\"./cannibal.png\": \"5bd9\",\n\t\"./cerenovus.png\": \"0436\",\n\t\"./chambermaid.png\": \"125e\",\n\t\"./chef.png\": \"1e83\",\n\t\"./clockmaker.png\": \"f93f\",\n\t\"./courtier.png\": \"ee02\",\n\t\"./cultleader.png\": \"398f\",\n\t\"./custom.png\": \"fd83\",\n\t\"./deusexfiasco.png\": \"9002\",\n\t\"./deviant.png\": \"3b65\",\n\t\"./devilsadvocate.png\": \"cd8b\",\n\t\"./djinn.png\": \"e222\",\n\t\"./doomsayer.png\": \"659f\",\n\t\"./dreamer.png\": \"71b8\",\n\t\"./drunk.png\": \"d97d\",\n\t\"./duchess.png\": \"5c56\",\n\t\"./empath.png\": \"bb7a\",\n\t\"./evil.png\": \"c24f\",\n\t\"./eviltwin.png\": \"e014\",\n\t\"./exorcist.png\": \"5072\",\n\t\"./fanggu.png\": \"6ac0\",\n\t\"./fibbin.png\": \"6eb1\",\n\t\"./fiddler.png\": \"64be\",\n\t\"./fisherman.png\": \"c5db\",\n\t\"./flowergirl.png\": \"66ae\",\n\t\"./fool.png\": \"4720\",\n\t\"./fortuneteller.png\": \"43e8\",\n\t\"./gambler.png\": \"dce6\",\n\t\"./general.png\": \"ac9c\",\n\t\"./goblin.png\": \"5c8e\",\n\t\"./godfather.png\": \"99d0\",\n\t\"./good.png\": \"667e\",\n\t\"./goon.png\": \"55aa\",\n\t\"./gossip.png\": \"cadc\",\n\t\"./grandmother.png\": \"c9f5\",\n\t\"./gunslinger.png\": \"ee92\",\n\t\"./harlot.png\": \"559e\",\n\t\"./hellslibrarian.png\": \"a367\",\n\t\"./imp.png\": \"3e70\",\n\t\"./innkeeper.png\": \"663c\",\n\t\"./investigator.png\": \"b570\",\n\t\"./judge.png\": \"f09b\",\n\t\"./juggler.png\": \"65ab\",\n\t\"./klutz.png\": \"adfc\",\n\t\"./legion.png\": \"da81\",\n\t\"./leviathan.png\": \"2b04\",\n\t\"./librarian.png\": \"4d73\",\n\t\"./lilmonsta.png\": \"c492\",\n\t\"./lunatic.png\": \"0b61\",\n\t\"./lycanthrope.png\": \"c316\",\n\t\"./mastermind.png\": \"f834\",\n\t\"./mathematician.png\": \"8888\",\n\t\"./matron.png\": \"b1cb\",\n\t\"./mayor.png\": \"b223\",\n\t\"./mephit.png\": \"df5e\",\n\t\"./minion.png\": \"75bc\",\n\t\"./minstrel.png\": \"4efd\",\n\t\"./monk.png\": \"6741\",\n\t\"./moonchild.png\": \"3f65\",\n\t\"./mutant.png\": \"17ad\",\n\t\"./nodashii.png\": \"68a4\",\n\t\"./oracle.png\": \"0c12\",\n\t\"./outsider.png\": \"2490\",\n\t\"./pacifist.png\": \"fff1\",\n\t\"./philosopher.png\": \"3603\",\n\t\"./pithag.png\": \"7f07\",\n\t\"./pixie.png\": \"a7b6\",\n\t\"./plus.png\": \"160b\",\n\t\"./po.png\": \"c73a\",\n\t\"./poisoner.png\": \"f282\",\n\t\"./politician.png\": \"07ab\",\n\t\"./preacher.png\": \"2094\",\n\t\"./professor.png\": \"b30c\",\n\t\"./pukka.png\": \"a6a2\",\n\t\"./ravenkeeper.png\": \"0c59\",\n\t\"./recluse.png\": \"177d\",\n\t\"./revolutionary.png\": \"aa2d\",\n\t\"./sage.png\": \"30b6\",\n\t\"./sailor.png\": \"223c\",\n\t\"./saint.png\": \"6936\",\n\t\"./savant.png\": \"d715\",\n\t\"./scapegoat.png\": \"327a\",\n\t\"./scarletwoman.png\": \"f322\",\n\t\"./seamstress.png\": \"ac7c\",\n\t\"./sentinel.png\": \"af68\",\n\t\"./shabaloth.png\": \"0b29\",\n\t\"./slayer.png\": \"d62b\",\n\t\"./snakecharmer.png\": \"4021\",\n\t\"./snitch.png\": \"b7e8\",\n\t\"./soldier.png\": \"4e76\",\n\t\"./spiritofivory.png\": \"0d06\",\n\t\"./spy.png\": \"ec1e\",\n\t\"./stormcatcher.png\": \"a4c2\",\n\t\"./sweetheart.png\": \"f1e5\",\n\t\"./tealady.png\": \"ba9b\",\n\t\"./thief.png\": \"9ce3\",\n\t\"./tinker.png\": \"9f7e\",\n\t\"./towncrier.png\": \"38a5\",\n\t\"./toymaker.png\": \"39eb\",\n\t\"./undertaker.png\": \"0e20\",\n\t\"./vigormortis.png\": \"f4bd\",\n\t\"./virgin.png\": \"eff4\",\n\t\"./vortox.png\": \"3a43\",\n\t\"./voudon.png\": \"a710\",\n\t\"./washerwoman.png\": \"013f\",\n\t\"./widow.png\": \"22c9\",\n\t\"./witch.png\": \"f558\",\n\t\"./x.png\": \"5cf2\",\n\t\"./zombuul.png\": \"20ca\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"61b0\";","module.exports = __webpack_public_path__ + \"img/fiddler.8c3b1cc0.png\";","module.exports = __webpack_public_path__ + \"img/butler.3763fa3d.png\";","module.exports = __webpack_public_path__ + \"img/doomsayer.34573e9a.png\";","module.exports = __webpack_public_path__ + \"img/juggler.7cc6d089.png\";","module.exports = __webpack_public_path__ + \"img/balloonist.3d6e31f8.png\";","module.exports = __webpack_public_path__ + \"img/innkeeper.8b0b87f1.png\";","module.exports = __webpack_public_path__ + \"img/good.9b3436c8.png\";","module.exports = __webpack_public_path__ + \"img/flowergirl.4ee69cb5.png\";","module.exports = __webpack_public_path__ + \"img/monk.a6f2667a.png\";","module.exports = __webpack_public_path__ + \"img/nodashii.5c943357.png\";","module.exports = __webpack_public_path__ + \"img/saint.f81db252.png\";","module.exports = __webpack_public_path__ + \"img/fanggu.cb4e346c.png\";","module.exports = __webpack_public_path__ + \"img/fibbin.2c83b0c2.png\";","module.exports = __webpack_public_path__ + \"img/dreamer.ab7f2328.png\";","module.exports = __webpack_public_path__ + \"img/tb-outsider.9ae6ef1b.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReminderModal.vue?vue&type=style&index=0&id=334686bc&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/bmr.1d06ca78.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=style&index=0&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/minion.3ded16da.png\";","module.exports = __webpack_public_path__ + \"img/pithag.adc1ce12.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReferenceModal.vue?vue&type=style&index=0&id=12b2e35a&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bishop.dec14fdc.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VoteHistoryModal.vue?vue&type=style&index=0&id=5f8dc20e&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleModal.vue?vue&type=style&index=0&id=616d6209&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=style&index=0&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/acrobat.b8ef8f5b.png\";","module.exports = __webpack_public_path__ + \"img/mathematician.31142ad1.png\";","module.exports = __webpack_public_path__ + \"img/bountyhunter.cc6eb160.png\";","module.exports = __webpack_public_path__ + \"img/deusexfiasco.90479b40.png\";","module.exports = __webpack_public_path__ + \"img/assassin.db54a5ff.png\";","module.exports = __webpack_public_path__ + \"img/luf.8e16a6e6.png\";","module.exports = __webpack_public_path__ + \"img/godfather.2febcd81.png\";","module.exports = __webpack_public_path__ + \"img/thief.60ce8845.png\";","module.exports = __webpack_public_path__ + \"img/tinker.669b5612.png\";","module.exports = __webpack_public_path__ + \"img/hellslibrarian.ed49edab.png\";","module.exports = __webpack_public_path__ + \"img/tb-demon.0ac8cce6.png\";","module.exports = __webpack_public_path__ + \"img/stormcatcher.e0bdc1ee.png\";","module.exports = __webpack_public_path__ + \"img/pukka.cbbc2d26.png\";","module.exports = __webpack_public_path__ + \"img/voudon.2b1f0492.png\";","module.exports = __webpack_public_path__ + \"img/pixie.32ba399c.png\";","module.exports = __webpack_public_path__ + \"img/revolutionary.ae2abbef.png\";","module.exports = __webpack_public_path__ + \"img/seamstress.05f0eb74.png\";","module.exports = __webpack_public_path__ + \"img/general.1d8bb5aa.png\";","module.exports = __webpack_public_path__ + \"img/klutz.c7e784cd.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GameStateModal.vue?vue&type=style&index=0&id=935cca7a&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/sentinel.1fecd38b.png\";","module.exports = __webpack_public_path__ + \"img/matron.ffb17746.png\";","module.exports = __webpack_public_path__ + \"img/mayor.98dda8d8.png\";","module.exports = __webpack_public_path__ + \"img/professor.8a5ccf04.png\";","module.exports = __webpack_public_path__ + \"img/investigator.13194f19.png\";","module.exports = __webpack_public_path__ + \"img/snitch.a80b57f6.png\";","module.exports = __webpack_public_path__ + \"img/tealady.2d47353e.png\";","module.exports = __webpack_public_path__ + \"img/empath.d7a89ed7.png\";","module.exports = __webpack_public_path__ + \"img/angel.016b2c65.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Intro.vue?vue&type=style&index=0&id=0ae0fea6&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/evil.908a2622.png\";","module.exports = __webpack_public_path__ + \"img/lycanthrope.52ed3230.png\";","module.exports = __webpack_public_path__ + \"img/lilmonsta.e4a265ca.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=style&index=0&id=e858a1da&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/fisherman.9077de7e.png\";","module.exports = __webpack_public_path__ + \"img/po.4c484011.png\";","module.exports = __webpack_public_path__ + \"img/grandmother.16001541.png\";","module.exports = __webpack_public_path__ + \"img/gossip.dd8d7312.png\";","module.exports = __webpack_public_path__ + \"img/bmr-demon.75dfa056.png\";","module.exports = __webpack_public_path__ + \"img/devilsadvocate.e455fea0.png\";","var map = {\n\t\"./bmr-demon.png\": \"cae1\",\n\t\"./bmr-minion.png\": \"28bf\",\n\t\"./bmr-outsider.png\": \"e898\",\n\t\"./bmr-townsfolk.png\": \"e988\",\n\t\"./bmr.png\": \"7496\",\n\t\"./custom.png\": \"441d\",\n\t\"./luf.png\": \"92d8\",\n\t\"./snv-demon.png\": \"f347\",\n\t\"./snv-minion.png\": \"451a\",\n\t\"./snv-outsider.png\": \"4dd9\",\n\t\"./snv-townsfolk.png\": \"ed00\",\n\t\"./snv.png\": \"2fd0\",\n\t\"./tb-demon.png\": \"a3b0\",\n\t\"./tb-minion.png\": \"5f4e\",\n\t\"./tb-outsider.png\": \"73a1\",\n\t\"./tb-townsfolk.png\": \"f7a3\",\n\t\"./tb.png\": \"0aaa\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"ce23\";","module.exports = __webpack_public_path__ + \"img/beggar.b7a4fbda.png\";","module.exports = __webpack_public_path__ + \"img/slayer.0859544b.png\";","module.exports = __webpack_public_path__ + \"img/savant.16bfbc30.png\";","module.exports = __webpack_public_path__ + \"img/drunk.4883c5a1.png\";","module.exports = __webpack_public_path__ + \"img/legion.66f4c81f.png\";","module.exports = __webpack_public_path__ + \"img/gambler.000b4b9b.png\";","module.exports = __webpack_public_path__ + \"img/mephit.2ebcee1b.png\";","module.exports = store => {\n const updatePagetitle = isPublic =>\n (document.title = `Blood on the Clocktower ${\n isPublic ? \"Town Square\" : \"Grimoire\"\n }`);\n\n // initialize data\n if (localStorage.getItem(\"background\")) {\n store.commit(\"setBackground\", localStorage.background);\n }\n if (localStorage.getItem(\"muted\")) {\n store.commit(\"toggleMuted\", true);\n }\n if (localStorage.getItem(\"imageOptIn\")) {\n store.commit(\"toggleImageOptIn\", true);\n }\n if (localStorage.getItem(\"zoom\")) {\n store.commit(\"setZoom\", parseFloat(localStorage.getItem(\"zoom\")));\n }\n if (localStorage.getItem(\"isGrimoire\")) {\n store.commit(\"toggleGrimoire\", false);\n updatePagetitle(false);\n }\n if (localStorage.roles !== undefined) {\n store.commit(\"setCustomRoles\", JSON.parse(localStorage.roles));\n store.commit(\"setEdition\", { id: \"custom\" });\n }\n if (localStorage.edition !== undefined) {\n // this will initialize state.roles for official editions\n store.commit(\"setEdition\", JSON.parse(localStorage.edition));\n }\n if (localStorage.bluffs !== undefined) {\n JSON.parse(localStorage.bluffs).forEach((role, index) => {\n store.commit(\"players/setBluff\", {\n index,\n role: store.state.roles.get(role) || {}\n });\n });\n }\n if (localStorage.fabled !== undefined) {\n store.commit(\"players/setFabled\", {\n fabled: JSON.parse(localStorage.fabled).map(id =>\n store.state.fabled.get(id)\n )\n });\n }\n if (localStorage.players) {\n store.commit(\n \"players/set\",\n JSON.parse(localStorage.players).map(player => ({\n ...player,\n role:\n store.state.roles.get(player.role) ||\n store.getters.rolesJSONbyId.get(player.role) ||\n {}\n }))\n );\n }\n /**** Session related data *****/\n if (localStorage.getItem(\"playerId\")) {\n store.commit(\"session/setPlayerId\", localStorage.getItem(\"playerId\"));\n }\n if (localStorage.getItem(\"session\")) {\n const [spectator, sessionId] = JSON.parse(localStorage.getItem(\"session\"));\n store.commit(\"session/setSpectator\", spectator);\n store.commit(\"session/setSessionId\", sessionId);\n }\n\n // listen to mutations\n store.subscribe(({ type, payload }, state) => {\n switch (type) {\n case \"toggleGrimoire\":\n if (!state.grimoire.isPublic) {\n localStorage.setItem(\"isGrimoire\", 1);\n } else {\n localStorage.removeItem(\"isGrimoire\");\n }\n updatePagetitle(state.grimoire.isPublic);\n break;\n case \"setBackground\":\n if (payload) {\n localStorage.setItem(\"background\", payload);\n } else {\n localStorage.removeItem(\"background\");\n }\n break;\n case \"toggleMuted\":\n if (state.grimoire.isMuted) {\n localStorage.setItem(\"muted\", 1);\n } else {\n localStorage.removeItem(\"muted\");\n }\n break;\n case \"toggleImageOptIn\":\n if (state.grimoire.isImageOptIn) {\n localStorage.setItem(\"imageOptIn\", 1);\n } else {\n localStorage.removeItem(\"imageOptIn\");\n }\n break;\n case \"setZoom\":\n if (payload !== 0) {\n localStorage.setItem(\"zoom\", payload);\n } else {\n localStorage.removeItem(\"zoom\");\n }\n break;\n case \"setEdition\":\n localStorage.setItem(\"edition\", JSON.stringify(payload));\n if (state.edition.isOfficial) {\n localStorage.removeItem(\"roles\");\n }\n break;\n case \"setCustomRoles\":\n if (!payload.length) {\n localStorage.removeItem(\"roles\");\n } else {\n localStorage.setItem(\"roles\", JSON.stringify(payload));\n }\n break;\n case \"players/setBluff\":\n localStorage.setItem(\n \"bluffs\",\n JSON.stringify(state.players.bluffs.map(({ id }) => id))\n );\n break;\n case \"players/setFabled\":\n localStorage.setItem(\n \"fabled\",\n JSON.stringify(state.players.fabled.map(({ id }) => id))\n );\n break;\n case \"players/add\":\n case \"players/update\":\n case \"players/remove\":\n case \"players/clear\":\n case \"players/set\":\n case \"players/swap\":\n case \"players/move\":\n if (state.players.players.length) {\n localStorage.setItem(\n \"players\",\n JSON.stringify(\n state.players.players.map(player => ({\n ...player,\n // simplify the stored data\n role: player.role.id || {}\n }))\n )\n );\n } else {\n localStorage.removeItem(\"players\");\n }\n break;\n case \"session/setSessionId\":\n if (payload) {\n localStorage.setItem(\n \"session\",\n JSON.stringify([state.session.isSpectator, payload])\n );\n } else {\n localStorage.removeItem(\"session\");\n }\n break;\n case \"session/setPlayerId\":\n if (payload) {\n localStorage.setItem(\"playerId\", payload);\n } else {\n localStorage.removeItem(\"playerId\");\n }\n break;\n }\n });\n};\n","module.exports = __webpack_public_path__ + \"img/eviltwin.06a5a8b8.png\";","module.exports = __webpack_public_path__ + \"img/djinn.f10cec5c.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RolesModal.vue?vue&type=style&index=0&id=57f6c851&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bmr-outsider.971a3d5d.png\";","module.exports = __webpack_public_path__ + \"img/bmr-townsfolk.9bf859b4.png\";","module.exports = __webpack_public_path__ + \"img/spy.b739966f.png\";","module.exports = __webpack_public_path__ + \"img/snv-townsfolk.83cf9a72.png\";","module.exports = __webpack_public_path__ + \"img/courtier.345180fb.png\";","module.exports = __webpack_public_path__ + \"img/gunslinger.9f84c9f2.png\";","module.exports = __webpack_public_path__ + \"img/virgin.eaf181e8.png\";","module.exports = __webpack_public_path__ + \"img/judge.79ec3877.png\";","module.exports = __webpack_public_path__ + \"img/sweetheart.ec1cef03.png\";","module.exports = __webpack_public_path__ + \"img/poisoner.44c80b94.png\";","module.exports = __webpack_public_path__ + \"img/scarletwoman.d2cdaffd.png\";","module.exports = __webpack_public_path__ + \"img/snv-demon.2fe55248.png\";","module.exports = __webpack_public_path__ + \"img/vigormortis.7716a80d.png\";","module.exports = __webpack_public_path__ + \"img/witch.2f895245.png\";","module.exports = __webpack_public_path__ + \"media/countdown.1462f20c.mp3\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Menu.vue?vue&type=style&index=0&id=1b5fe466&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/tb-townsfolk.550a119b.png\";","module.exports = __webpack_public_path__ + \"img/mastermind.c3ba5fbb.png\";","module.exports = __webpack_public_path__ + \"img/clockmaker.41906ffc.png\";","module.exports = __webpack_public_path__ + \"img/barber.a354ad9e.png\";","module.exports = __webpack_public_path__ + \"img/custom.8ff972bc.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FabledModal.vue?vue&type=style&index=0&id=d6b399a0&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/pacifist.ad2d0310.png\";"],"sourceRoot":""} |