diff --git a/forbidden-lands.css b/forbidden-lands.css new file mode 100644 index 00000000..6f131f9b --- /dev/null +++ b/forbidden-lands.css @@ -0,0 +1,6 @@ +@charset "UTF-8";@font-face{font-family:RPGAwesome;src:url(./fonts/rpgawesome-webfont.eot?v=0.1.0);src:url(./fonts/rpgawesome-webfont.eot?#iefix&v=0.1.0) format("embedded-opentype"),url(./fonts/rpgawesome-webfont.woff?v=0.1.0) format("woff"),url(./fonts/rpgawesome-webfont.ttf?v=0.1.0) format("truetype"),url(./fonts/rpgawesome-webfont.svg?v=0.1.0#rpg-awesome) format("svg");font-weight:400;font-style:normal}.ra{font-family:RPGAwesome;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal;font-variant:normal;font-weight:400;line-height:1;speak:none;text-transform:none}.ra-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.ra-2x{font-size:2em}.ra-3x{font-size:3em}.ra-4x{font-size:4em}.ra-5x{font-size:5em}.ra-fw{text-align:center;width:1.2857142857em}.ra-ul{list-style-type:none;margin-left:2.1428571429em;padding-left:0}.ra-ul>li{position:relative}.ra-li{left:-2.1428571429em;position:absolute;text-align:center;top:.1428571429em;width:2.1428571429em}.ra-li.ra-lg{left:-1.8571428571em}.ra-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.pull-right{float:right}.pull-left{float:left}.ra.pull-left{margin-right:.3em}.ra.pull-right{margin-left:.3em}.ra-spin{-webkit-animation:ra-spin 2s infinite linear;animation:ra-spin 2s infinite linear}@-webkit-keyframes ra-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes ra-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.ra-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.ra-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ra-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.ra-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scaleX(-1)}.ra-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scaleY(-1)}:root .ra-rotate-90,:root .ra-rotate-180,:root .ra-rotate-270,:root .ra-flip-horizontal,:root .ra-flip-vertical{filter:none}.ra-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.ra-stack-1x,.ra-stack-2x{left:0;position:absolute;text-align:center;width:100%}.ra-stack-1x{line-height:inherit}.ra-stack-2x{font-size:2em}.ra-inverse{color:#fff}.ra-acid:before{content:"\e900"}.ra-zigzag-leaf:before{content:"\eaee"}.ra-archer:before{content:"\e90d"}.ra-archery-target:before{content:"\e90e"}.ra-arena:before{content:"\e90f"}.ra-aries:before{content:"\e910"}.ra-arrow-cluster:before{content:"\e911"}.ra-arrow-flights:before{content:"\e912"}.ra-arson:before{content:"\e913"}.ra-aura:before{content:"\e914"}.ra-aware:before{content:"\e915"}.ra-axe:before{content:"\e917"}.ra-axe-swing:before{content:"\e916"}.ra-ball:before{content:"\e918"}.ra-barbed-arrow:before{content:"\e919"}.ra-barrier:before{content:"\e91a"}.ra-bat-sword:before{content:"\e91b"}.ra-battered-axe:before{content:"\e91c"}.ra-batteries:before{content:"\e91d"}.ra-battery-0:before{content:"\e91e"}.ra-battery-25:before{content:"\e91f"}.ra-battery-50:before{content:"\e920"}.ra-battery-75:before{content:"\e921"}.ra-battery-100:before{content:"\e922"}.ra-battery-black:before{content:"\e923"}.ra-battery-negative:before{content:"\e924"}.ra-battery-positive:before{content:"\e925"}.ra-battery-white:before{content:"\e926"}.ra-batwings:before{content:"\e927"}.ra-beam-wake:before{content:"\e928"}.ra-bear-trap:before{content:"\e929"}.ra-beer:before{content:"\e92a"}.ra-beetle:before{content:"\e92b"}.ra-bell:before{content:"\e92c"}.ra-biohazard:before{content:"\e92d"}.ra-bird-claw:before{content:"\e92e"}.ra-bird-mask:before{content:"\e92f"}.ra-blade-bite:before{content:"\e930"}.ra-blast:before{content:"\e931"}.ra-blaster:before{content:"\e932"}.ra-bleeding-eye:before{content:"\e933"}.ra-bleeding-hearts:before{content:"\e934"}.ra-bolt-shield:before{content:"\e935"}.ra-bomb-explosion:before{content:"\e936"}.ra-bombs:before{content:"\e937"}.ra-bone-bite:before{content:"\e938"}.ra-bone-knife:before{content:"\e939"}.ra-book:before{content:"\e93a"}.ra-boomerang:before{content:"\e93b"}.ra-boot-stomp:before{content:"\e93c"}.ra-bottle-vapors:before{content:"\e93d"}.ra-bottled-bolt:before{content:"\e93e"}.ra-bottom-right:before{content:"\e93f"}.ra-bowie-knife:before{content:"\e940"}.ra-bowling-pin:before{content:"\e941"}.ra-brain-freeze:before{content:"\e942"}.ra-brandy-bottle:before{content:"\e943"}.ra-bridge:before{content:"\e944"}.ra-broadhead-arrow:before{content:"\e945"}.ra-sword:before,.ra-broadsword:before{content:"\e946"}.ra-broken-bone:before{content:"\e947"}.ra-broken-bottle:before{content:"\e948"}.ra-broken-heart:before{content:"\e948"}.ra-broken-shield:before{content:"\e94a"}.ra-broken-skull:before{content:"\e94b"}.ra-bubbling-potion:before{content:"\e94c"}.ra-bullets:before{content:"\e94d"}.ra-burning-book:before{content:"\e94e"}.ra-burning-embers:before{content:"\e94f"}.ra-burning-eye:before{content:"\e950"}.ra-burning-meteor:before{content:"\e951"}.ra-burst-blob:before{content:"\e952"}.ra-butterfly:before{content:"\e953"}.ra-campfire:before{content:"\e954"}.ra-cancel:before{content:"\e955"}.ra-cancer:before{content:"\e956"}.ra-candle:before{content:"\e958"}.ra-candle-fire:before{content:"\e957"}.ra-cannon-shot:before{content:"\e959"}.ra-capitol:before{content:"\e95a"}.ra-capricorn:before{content:"\e95b"}.ra-carrot:before{content:"\e95c"}.ra-castle-emblem:before{content:"\e95d"}.ra-castle-flag:before{content:"\e95e"}.ra-cat:before{content:"\e95f"}.ra-chain:before{content:"\e960"}.ra-cheese:before{content:"\e961"}.ra-chemical-arrow:before{content:"\e962"}.ra-chessboard:before{content:"\e963"}.ra-chicken-leg:before{content:"\e964"}.ra-circle-of-circles:before{content:"\e965"}.ra-circular-saw:before{content:"\e966"}.ra-circular-shield:before{content:"\e967"}.ra-cloak-and-dagger:before{content:"\e968"}.ra-clockwork:before{content:"\e969"}.ra-clover:before{content:"\e96a"}.ra-clovers:before{content:"\e96c"}.ra-clovers-card:before{content:"\e96b"}.ra-cluster-bomb:before{content:"\e96d"}.ra-coffee-mug:before{content:"\e96e"}.ra-cog:before{content:"\e970"}.ra-cog-wheel:before{content:"\e96f"}.ra-cold-heart:before{content:"\e971"}.ra-compass:before{content:"\e972"}.ra-corked-tube:before{content:"\e973"}.ra-crab-claw:before{content:"\e974"}.ra-cracked-helm:before{content:"\e975"}.ra-cracked-shield:before{content:"\e976"}.ra-croc-sword:before{content:"\e977"}.ra-crossbow:before{content:"\e978"}.ra-crossed-axes:before{content:"\e979"}.ra-crossed-bones:before{content:"\e97a"}.ra-crossed-pistols:before{content:"\e97b"}.ra-crossed-sabres:before{content:"\e97c"}.ra-crossed-swords:before{content:"\e97d"}.ra-crown:before{content:"\e97f"}.ra-crown-of-thorns:before{content:"\e97e"}.ra-crowned-heart:before{content:"\e980"}.ra-crush:before{content:"\e981"}.ra-crystal-ball:before{content:"\e982"}.ra-crystal-cluster:before{content:"\e983"}.ra-crystal-wand:before{content:"\e984"}.ra-crystals:before{content:"\e985"}.ra-cubes:before{content:"\e986"}.ra-cut-palm:before{content:"\e987"}.ra-cycle:before{content:"\e988"}.ra-daggers:before{content:"\e989"}.ra-daisy:before{content:"\e98a"}.ra-dead-tree:before{content:"\e98b"}.ra-death-skull:before{content:"\e98c"}.ra-decapitation:before{content:"\e98d"}.ra-defibrillate:before{content:"\e98e"}.ra-demolish:before{content:"\e98f"}.ra-dervish-swords:before{content:"\e990"}.ra-desert-skull:before{content:"\e991"}.ra-diamond:before{content:"\e992"}.ra-diamonds:before{content:"\e994"}.ra-diamonds-card:before{content:"\e993"}.ra-dice-five:before{content:"\e995"}.ra-dice-four:before{content:"\e996"}.ra-dice-one:before{content:"\e997"}.ra-dice-six:before{content:"\e998"}.ra-dice-three:before{content:"\e999"}.ra-dice-two:before{content:"\e99a"}.ra-dinosaur:before{content:"\e99b"}.ra-divert:before{content:"\e99c"}.ra-diving-dagger:before{content:"\e99d"}.ra-double-team:before{content:"\e99e"}.ra-doubled:before{content:"\e99f"}.ra-dragon:before{content:"\e9a2"}.ra-dragon-breath:before{content:"\e9a0"}.ra-dragon-wing:before{content:"\e9a1"}.ra-dragonfly:before{content:"\e9a3"}.ra-drill:before{content:"\e9a4"}.ra-dripping-blade:before{content:"\e9a5"}.ra-dripping-knife:before{content:"\e9a6"}.ra-dripping-sword:before{content:"\e9a7"}.ra-droplet:before{content:"\e9a9"}.ra-droplet-splash:before{content:"\e9a8"}.ra-droplets:before{content:"\e9aa"}.ra-duel:before{content:"\e9ab"}.ra-egg:before{content:"\e9ad"}.ra-egg-pod:before{content:"\e9ac"}.ra-eggplant:before{content:"\e9ae"}.ra-emerald:before{content:"\e9af"}.ra-energise:before{content:"\e9b0"}.ra-explosion:before{content:"\e9b1"}.ra-explosive-materials:before{content:"\e9b2"}.ra-eye-monster:before{content:"\e9b3"}.ra-eye-shield:before{content:"\e9b4"}.ra-eyeball:before{content:"\e9b5"}.ra-fairy:before{content:"\e9b7"}.ra-fairy-wand:before{content:"\e9b6"}.ra-fall-down:before{content:"\e9b8"}.ra-falling:before{content:"\e9b9"}.ra-fast-ship:before{content:"\e9ba"}.ra-feather-wing:before{content:"\e9bb"}.ra-feathered-wing:before{content:"\e9bc"}.ra-fedora:before{content:"\e9bd"}.ra-fire:before{content:"\e9c3"}.ra-fire-bomb:before{content:"\e9be"}.ra-fire-breath:before{content:"\e9bf"}.ra-fire-ring:before{content:"\e9c0"}.ra-fire-shield:before{content:"\e9c1"}.ra-fire-symbol:before{content:"\e9c2"}.ra-fireball-sword:before{content:"\e9c4"}.ra-fish:before{content:"\e9c5"}.ra-fizzing-flask:before{content:"\e9c6"}.ra-flame-symbol:before{content:"\e9c7"}.ra-flaming-arrow:before{content:"\e9c8"}.ra-flaming-claw:before{content:"\e9c9"}.ra-flaming-trident:before{content:"\e9ca"}.ra-flask:before{content:"\e9cb"}.ra-flat-hammer:before{content:"\e9cc"}.ra-flower:before{content:"\e9cd"}.ra-flowers:before{content:"\e9ce"}.ra-fluffy-swirl:before{content:"\e9cf"}.ra-focused-lightning:before{content:"\e9d0"}.ra-food-chain:before{content:"\e9d1"}.ra-footprint:before{content:"\e9d2"}.ra-forging:before{content:"\e9d3"}.ra-forward:before{content:"\e9d4"}.ra-fox:before{content:"\e9d5"}.ra-frost-emblem:before{content:"\e9d6"}.ra-frostfire:before{content:"\e9d7"}.ra-frozen-arrow:before{content:"\e9d8"}.ra-gamepad-cross:before{content:"\e9d9"}.ra-gavel:before{content:"\e9da"}.ra-gear-hammer:before{content:"\e9db"}.ra-gear-heart:before{content:"\e9dc"}.ra-gears:before{content:"\e9dd"}.ra-gecko:before{content:"\e9de"}.ra-gem:before{content:"\e9e0"}.ra-gem-pendant:before{content:"\e9df"}.ra-gemini:before{content:"\e9e1"}.ra-glass-heart:before{content:"\e9e2"}.ra-gloop:before{content:"\e9e3"}.ra-gold-bar:before{content:"\e9e4"}.ra-grappling-hook:before{content:"\e9e5"}.ra-grass:before{content:"\e9e7"}.ra-grass-patch:before{content:"\e9e6"}.ra-grenade:before{content:"\e9e8"}.ra-groundbreaker:before{content:"\e9e9"}.ra-guarded-tower:before{content:"\e9ea"}.ra-guillotine:before{content:"\e9eb"}.ra-halberd:before{content:"\e9ec"}.ra-hammer:before{content:"\e9ee"}.ra-hammer-drop:before{content:"\e9ed"}.ra-hand:before{content:"\e9f1"}.ra-hand-emblem:before{content:"\e9ef"}.ra-hand-saw:before{content:"\e9f0"}.ra-harpoon-trident:before{content:"\e9f2"}.ra-health:before{content:"\e9f5"}.ra-health-decrease:before{content:"\e9f3"}.ra-health-increase:before{content:"\e9f4"}.ra-heart-bottle:before{content:"\e9f6"}.ra-heart-tower:before{content:"\e9f7"}.ra-heartburn:before{content:"\e9f8"}.ra-hearts:before{content:"\e9fa"}.ra-hearts-card:before{content:"\e9f9"}.ra-heat-haze:before{content:"\e9fb"}.ra-heavy-fall:before{content:"\e9fc"}.ra-heavy-shield:before{content:"\e9fd"}.ra-helmet:before{content:"\e9fe"}.ra-help:before{content:"\e9ff"}.ra-hive-emblem:before{content:"\ea00"}.ra-hole-ladder:before{content:"\ea01"}.ra-honeycomb:before{content:"\ea02"}.ra-hood:before{content:"\ea03"}.ra-horn-call:before{content:"\ea04"}.ra-horns:before{content:"\ea05"}.ra-horseshoe:before{content:"\ea06"}.ra-hospital-cross:before{content:"\ea07"}.ra-hot-surface:before{content:"\ea08"}.ra-hourglass:before{content:"\ea09"}.ra-hydra:before{content:"\ea0b"}.ra-hydra-shot:before{content:"\ea0a"}.ra-ice-cube:before{content:"\ea0c"}.ra-implosion:before{content:"\ea0d"}.ra-incense:before{content:"\ea0e"}.ra-insect-jaws:before{content:"\ea0f"}.ra-interdiction:before{content:"\ea10"}.ra-jetpack:before{content:"\ea11"}.ra-jigsaw-piece:before{content:"\ea12"}.ra-kaleidoscope:before{content:"\ea13"}.ra-kettlebell:before{content:"\ea14"}.ra-key:before{content:"\ea16"}.ra-key-basic:before{content:"\ea15"}.ra-kitchen-knives:before{content:"\ea17"}.ra-knife:before{content:"\ea19"}.ra-knife-fork:before{content:"\ea18"}.ra-knight-helmet:before{content:"\ea1a"}.ra-kunai:before{content:"\ea1b"}.ra-lantern-flame:before{content:"\ea1c"}.ra-large-hammer:before{content:"\ea1d"}.ra-laser-blast:before{content:"\ea1e"}.ra-laser-site:before{content:"\ea1f"}.ra-lava:before{content:"\ea20"}.ra-leaf:before{content:"\ea21"}.ra-leo:before{content:"\ea22"}.ra-level-four:before{content:"\ea24"}.ra-level-four-advanced:before{content:"\ea23"}.ra-level-three:before{content:"\ea26"}.ra-level-three-advanced:before{content:"\ea25"}.ra-level-two:before{content:"\ea28"}.ra-level-two-advanced:before{content:"\ea27"}.ra-lever:before{content:"\ea29"}.ra-libra:before{content:"\ea2a"}.ra-light-bulb:before{content:"\ea2b"}.ra-lighthouse:before{content:"\ea2c"}.ra-lightning:before{content:"\ea31"}.ra-lightning-bolt:before{content:"\ea2d"}.ra-lightning-storm:before{content:"\ea2e"}.ra-lightning-sword:before{content:"\ea2f"}.ra-lightning-trio:before{content:"\ea30"}.ra-lion:before{content:"\ea32"}.ra-lit-candelabra:before{content:"\ea33"}.ra-load:before{content:"\ea34"}.ra-locked-fortress:before{content:"\ea35"}.ra-love-howl:before{content:"\ea36"}.ra-maggot:before{content:"\ea37"}.ra-magnet:before{content:"\ea38"}.ra-mass-driver:before{content:"\ea39"}.ra-match:before{content:"\ea3a"}.ra-meat:before{content:"\ea3c"}.ra-meat-hook:before{content:"\ea3b"}.ra-medical-pack:before{content:"\ea3d"}.ra-metal-gate:before{content:"\ea3e"}.ra-microphone:before{content:"\ea3f"}.ra-mine-wagon:before{content:"\ea40"}.ra-mining-diamonds:before{content:"\ea41"}.ra-mirror:before{content:"\ea42"}.ra-monster-skull:before{content:"\ea43"}.ra-mountains:before{content:"\ea44"}.ra-moon-sun:before{content:"\ea45"}.ra-mp5:before{content:"\ea46"}.ra-muscle-fat:before{content:"\ea47"}.ra-muscle-up:before{content:"\ea48"}.ra-musket:before{content:"\ea49"}.ra-nails:before{content:"\ea4a"}.ra-nodular:before{content:"\ea4b"}.ra-noose:before{content:"\ea4c"}.ra-nuclear:before{content:"\ea4d"}.ra-ocarina:before{content:"\ea4e"}.ra-ocean-emblem:before{content:"\ea4f"}.ra-octopus:before{content:"\ea50"}.ra-omega:before{content:"\ea51"}.ra-on-target:before{content:"\ea52"}.ra-ophiuchus:before{content:"\ea53"}.ra-overhead:before{content:"\ea54"}.ra-overmind:before{content:"\ea55"}.ra-palm-tree:before{content:"\ea56"}.ra-pawn:before{content:"\ea57"}.ra-pawprint:before{content:"\ea58"}.ra-perspective-dice-five:before{content:"\ea59"}.ra-perspective-dice-four:before{content:"\ea5a"}.ra-perspective-dice-one:before{content:"\ea5b"}.ra-perspective-dice-random:before{content:"\ea5c"}.ra-perspective-dice-six:before{content:"\ea5e"}.ra-perspective-dice-two:before{content:"\ea5d"}.ra-perspective-dice-three:before{content:"\ea5f"}.ra-pill:before{content:"\ea60"}.ra-pills:before{content:"\ea61"}.ra-pine-tree:before{content:"\ea62"}.ra-ping-pong:before{content:"\ea63"}.ra-pisces:before{content:"\ea64"}.ra-plain-dagger:before{content:"\ea65"}.ra-player:before{content:"\ea6f"}.ra-player-despair:before{content:"\ea66"}.ra-player-dodge:before{content:"\ea67"}.ra-player-king:before{content:"\ea68"}.ra-player-lift:before{content:"\ea69"}.ra-player-pain:before{content:"\ea6a"}.ra-player-pyromaniac:before{content:"\ea6b"}.ra-player-shot:before{content:"\ea6c"}.ra-player-teleport:before{content:"\ea6d"}.ra-player-thunder-struck:before{content:"\ea6e"}.ra-podium:before{content:"\ea70"}.ra-poison-cloud:before{content:"\ea71"}.ra-potion:before{content:"\ea72"}.ra-pyramids:before{content:"\ea73"}.ra-queen-crown:before{content:"\ea74"}.ra-quill-ink:before{content:"\ea75"}.ra-rabbit:before{content:"\ea76"}.ra-radar-dish:before{content:"\ea77"}.ra-radial-balance:before{content:"\ea78"}.ra-radioactive:before{content:"\ea79"}.ra-raven:before{content:"\ea7a"}.ra-reactor:before{content:"\ea7b"}.ra-recycle:before{content:"\ea7c"}.ra-regeneration:before{content:"\ea7d"}.ra-relic-blade:before{content:"\ea7e"}.ra-repair:before{content:"\ea7f"}.ra-reverse:before{content:"\ea80"}.ra-revolver:before{content:"\ea81"}.ra-rifle:before{content:"\ea82"}.ra-ringing-bell:before{content:"\ea83"}.ra-roast-chicken:before{content:"\ea84"}.ra-robot-arm:before{content:"\ea85"}.ra-round-bottom-flask:before{content:"\ea86"}.ra-round-shield:before{content:"\ea87"}.ra-rss:before{content:"\ea88"}.ra-rune-stone:before{content:"\ea89"}.ra-sagittarius:before{content:"\ea8a"}.ra-sapphire:before{content:"\ea8b"}.ra-satellite:before{content:"\ea8c"}.ra-save:before{content:"\ea8d"}.ra-scorpio:before{content:"\ea8e"}.ra-scroll-unfurled:before{content:"\ea8f"}.ra-scythe:before{content:"\ea90"}.ra-sea-serpent:before{content:"\ea91"}.ra-seagull:before{content:"\ea92"}.ra-shark:before{content:"\ea93"}.ra-sheep:before{content:"\ea94"}.ra-sheriff:before{content:"\ea95"}.ra-shield:before{content:"\ea96"}.ra-ship-emblem:before{content:"\ea97"}.ra-shoe-prints:before{content:"\ea98"}.ra-shot-through-the-heart:before{content:"\ea99"}.ra-shotgun-shell:before{content:"\ea9a"}.ra-shovel:before{content:"\ea9b"}.ra-shuriken:before{content:"\ea9c"}.ra-sickle:before{content:"\ea9d"}.ra-sideswipe:before{content:"\ea9e"}.ra-site:before{content:"\ea9f"}.ra-skull:before{content:"\eaa1"}.ra-skull-trophy:before{content:"\eaa0"}.ra-slash-ring:before{content:"\eaa2"}.ra-small-fire:before{content:"\eaa3"}.ra-snail:before{content:"\eaa4"}.ra-snake:before{content:"\eaa5"}.ra-snorkel:before{content:"\eaa6"}.ra-snowflake:before{content:"\eaa7"}.ra-soccer-ball:before{content:"\eaa8"}.ra-spades:before{content:"\eaaa"}.ra-spades-card:before{content:"\eaa9"}.ra-spawn-node:before{content:"\eaab"}.ra-spear-head:before{content:"\eaac"}.ra-speech-bubble:before{content:"\eaad"}.ra-speech-bubbles:before{content:"\eaae"}.ra-spider-face:before{content:"\eaaf"}.ra-spikeball:before{content:"\eab0"}.ra-spiked-mace:before{content:"\eab1"}.ra-spiked-tentacle:before{content:"\eab2"}.ra-spinning-sword:before{content:"\eab3"}.ra-spiral-shell:before{content:"\eab4"}.ra-splash:before{content:"\eab5"}.ra-spray-can:before{content:"\eab6"}.ra-sprout:before{content:"\eab8"}.ra-sprout-emblem:before{content:"\eab7"}.ra-stopwatch:before{content:"\eab9"}.ra-suckered-tentacle:before{content:"\eaba"}.ra-suits:before{content:"\eabb"}.ra-sun:before{content:"\eabd"}.ra-sun-symbol:before{content:"\eabc"}.ra-sunbeams:before{content:"\eabe"}.ra-super-mushroom:before{content:"\eabf"}.ra-supersonic-arrow:before{content:"\eac0"}.ra-surveillance-camera:before{content:"\eac1"}.ra-syringe:before{content:"\eac2"}.ra-target-arrows:before{content:"\eac3"}.ra-target-laser:before{content:"\eac4"}.ra-targeted:before{content:"\eac5"}.ra-taurus:before{content:"\eac6"}.ra-telescope:before{content:"\eac7"}.ra-tentacle:before{content:"\eac8"}.ra-tesla:before{content:"\eac9"}.ra-thorn-arrow:before{content:"\eaca"}.ra-thorny-vine:before{content:"\eacb"}.ra-three-keys:before{content:"\eacc"}.ra-tic-tac-toe:before{content:"\eacd"}.ra-toast:before{content:"\eace"}.ra-tombstone:before{content:"\eacf"}.ra-tooth:before{content:"\ead0"}.ra-torch:before{content:"\ead1"}.ra-tower:before{content:"\ead2"}.ra-trail:before{content:"\ead3"}.ra-trefoil-lily:before{content:"\ead4"}.ra-trident:before{content:"\ead5"}.ra-triforce:before{content:"\ead6"}.ra-trophy:before{content:"\ead7"}.ra-turd:before{content:"\ead8"}.ra-two-dragons:before{content:"\ead9"}.ra-two-hearts:before{content:"\eada"}.ra-uncertainty:before{content:"\eadb"}.ra-underhand:before{content:"\eadc"}.ra-unplugged:before{content:"\eadd"}.ra-vase:before{content:"\eade"}.ra-venomous-snake:before{content:"\eadf"}.ra-vest:before{content:"\eae0"}.ra-vial:before{content:"\eae1"}.ra-vine-whip:before{content:"\eae2"}.ra-virgo:before{content:"\eae3"}.ra-water-drop:before{content:"\eae4"}.ra-wifi:before{content:"\eae5"}.ra-wireless-signal:before{content:"\eae6"}.ra-wolf-head:before{content:"\eae7"}.ra-wolf-howl:before{content:"\eae8"}.ra-wooden-sign:before{content:"\eae9"}.ra-wrench:before{content:"\eaea"}.ra-wyvern:before{content:"\eaeb"}.ra-x-mark:before{content:"\eaec"}.ra-zebra-shield:before{content:"\eaed"}.ra-arcane-mask:before{content:"\e90c"}.ra-aquarius:before{content:"\e90b"}.ra-apple:before{content:"\e90a"}.ra-anvil:before{content:"\e909"}.ra-ankh:before{content:"\e908"}.ra-angel-wings:before{content:"\e907"}.ra-anchor:before{content:"\e906"}.ra-ammo-bag:before{content:"\e905"}.ra-alligator-clip:before{content:"\e904"}.ra-all-for-one:before{content:"\e903"}.ra-alien-fire:before{content:"\e902"}.ra-acorn:before{content:"\e901"}@font-face{font-family:IM Fell DW Pica;src:url(./fonts/imfe-dprm.otf)}@font-face{font-family:IM Fell DW Pica;src:url(./fonts/imfe-dpit.otf);font-style:italic}@font-face{font-family:IM Fell DW Pica SC;src:url(./fonts/imfe-dwpscr.ttf)}@font-face{font-family:IM Fell Three Line Pica;src:url(./fonts/imfe-tlrm.otf)}@font-face{font-family:IM Fell Great Primer;src:url(./fonts/imfe-gprm.otf)}@font-face{font-family:IM Fell Great Primer;src:url(./fonts/imfe-gpit.otf);font-style:italic}@font-face{font-family:Author;size-adjust:110%;src:url(./fonts/author-medium.otf)}@font-face{font-family:Author;font-weight:700;size-adjust:110%;src:url(./fonts/author-semibold.otf)}@font-face{font-family:Author;font-style:italic;size-adjust:110%;src:url(./fonts/author-medium-italic.otf)}@font-face{font-family:Author;font-style:italic;font-weight:700;size-adjust:110%;src:url(./fonts/author-semibold-italic.otf)}@font-face{font-family:skullz;src:url(./fonts/skullz.ttf)}@font-face{font-family:Swordlings;src:url(./fonts/swordlings.ttf)}:root{--color-foreground: #292929f0;--color-background: #fff;--color-highlight: #cbcccb;--color-secondary: #ddd;--color-border: #939598;--color-shadow-primary: #005d67;--color-shadow-highlight: #36b5a7;--color-border-highlight: #36b5a7;--color-border-highlight-alt: #005d67;--color-border-light-tertiary: #ffb994;--color-border-dark-tertiary: #433a3f;--font-editor: "IM Fell Great Primer", serif;--font-special: "IM Fell DW Pica", serif;--font-subheader: "IM Fell DW Pica SC", serif;--font-input: Branding, Author, MavenPro, Ubuntu, sans-serif;--font-primary: Branding, Author, MavenPro, Ubuntu, sans-serif;--font-table: Branding, Author, MavenPro, Ubuntu, sans-serif}.forbidden-lands.window-app .window-content>*{height:100%}.forbidden-lands.sheet label{font-family:var(--font-special);font-size:var(--font-size-16);font-weight:700}.forbidden-lands h2,.forbidden-lands h3{border:0 none;font-family:var(--font-subheader);font-size:var(--font-size-16);font-weight:700;line-height:initial;margin:0;padding:4px;text-align:center;text-transform:uppercase}.forbidden-lands h3{padding:0;margin-bottom:4px}.forbidden-lands option{background:var(--color-background)}.forbidden-lands details summary{list-style:none;cursor:pointer;font-weight:600}.forbidden-lands details summary~*{display:none}.forbidden-lands details summary:hover,.forbidden-lands details summary:focus-visible{text-shadow:0 0 8px var(--color-shadow-primary)}.forbidden-lands .rotated{transform:rotate(90deg);font-size:var(--font-size-16)}.forbidden-lands .pre-wrap{white-space:pre-wrap}.forbidden-lands .flex{display:flex}.forbidden-lands .row{flex-direction:row}.forbidden-lands .column{flex-direction:column}.forbidden-lands .full{width:100%;height:100%}.forbidden-lands .wrap{flex-wrap:wrap}.forbidden-lands .half{flex:0 0 50%}.forbidden-lands .center{text-align:center}.forbidden-lands .margin{margin:5px}.forbidden-lands .grow{flex-grow:1}.forbidden-lands .flex-1{flex:1}.forbidden-lands .gap{gap:.5rem}.forbidden-lands .gap-l{gap:1rem}.forbidden-lands .align-center{align-items:center}.forbidden-lands .align-end{align-items:flex-end}.forbidden-lands .space-around{justify-content:space-around}.forbidden-lands .space-between{justify-content:space-between}.forbidden-lands .justify-end{justify-content:flex-end}.forbidden-lands .padding{padding:5px}.forbidden-lands .tabs .item.active{color:#fff;text-shadow:0 0 10px #fff}.forbidden-lands .tab{height:100%;width:100%}.forbidden-lands .item-control{margin-left:4px}.forbidden-lands button{background:transparent;border:0 none;border-radius:3px;box-shadow:none;color:var(--color-foreground);cursor:pointer;font-family:inherit;font-size:inherit;font-weight:700;height:auto;line-height:inherit;padding:2px 4px;width:auto}.forbidden-lands button:disabled{cursor:default;opacity:.5}.forbidden-lands button:disabled:hover{background:transparent}.forbidden-lands button:focus,.forbidden-lands button:hover{background:var(--color-highlight)}.forbidden-lands input[type=number],.forbidden-lands input[type=text],.forbidden-lands select,.forbidden-lands textarea{background:var(--color-background);border:1px solid var(--color-border);border-radius:3px;box-shadow:inset 0 0 6px var(--color-theme-gray-200);color:var(--color-foreground);font-family:var(--font-input);font-size:var(--font-size-14);height:auto;width:100%}.forbidden-lands input:disabled,.forbidden-lands select:disabled,.forbidden-lands textarea:disabled{border:0 none;box-shadow:none}.forbidden-lands input::placeholder{color:var(--color-foreground);opacity:.5}.forbidden-lands input[type=number]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield;text-align:center}.forbidden-lands input[type=number]::-webkit-outer-spin-button,.forbidden-lands input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.forbidden-lands input[type=number]:focus,.forbidden-lands input[type=text]:focus,.forbidden-lands select:focus,.forbidden-lands textarea:focus{border:1px solid var(--color-border);box-shadow:0 0 10px var(--color-shadow-primary);outline:none}.forbidden-lands .sheet-body{overflow:hidden;flex-grow:1}.forbidden-lands div.bio.border,.forbidden-lands .main-tab div.border,.forbidden-lands .character div.currencies.border,.forbidden-lands .character div.consumables.border,.forbidden-lands .chargen-build,.forbidden-lands .character div.actions.border{border:6px solid transparent;border-image:url(./assets/journal-art/small-border.webp) 100/10px repeat}.forbidden-lands .item-list{display:flex;flex-direction:column;font-family:var(--font-table);font-size:var(--font-size-12);line-height:16px;min-height:0;padding:4px}.forbidden-lands .item-list .header{justify-content:space-between;border-bottom:2px solid var(--color-border);margin-bottom:4px;font-size:var(--font-size-12);font-weight:700;padding:4px;text-transform:uppercase}.forbidden-lands .item-list .items{overflow-y:auto;scrollbar-width:none}.forbidden-lands .item-list .items .item{justify-content:space-between;overflow-y:hidden;border-bottom:1px solid var(--color-border);font-size:var(--font-size-12);padding:2px 4px}.forbidden-lands .item-list .items .item:last-child{border-bottom:0 none}.forbidden-lands .item-list .items .item:nth-child(odd){background:var(--color-theme-gray-200);color:var(--color-theme-gray-800)}.forbidden-lands .item-list .items .item:nth-child(odd) button:focus,.forbidden-lands .item-list .items .item:nth-child(odd) button:hover{background:var(--color-background);color:var(--color-theme-gray-600)}.forbidden-lands .item-list .items .item img{object-fit:contain;vertical-align:middle;filter:drop-shadow(0 0 3px rgba(0,0,0,.6))}.forbidden-lands.sheet .window-content{background:var(--color-theme-background);color:var(--color-theme-text);height:100%}.app{background:#292929f0}.app.window-app{color:var(--color-theme-text);border:2px solid transparent;border-image:url(./assets/journal-art/box-border-large.webp) 110/11 repeat;border-image-outset:3;padding:0 4px 4px;margin:0;background-color:var(--color-theme-background)}.app.window-app .journal-sheet{min-width:500px;min-height:300px}.app.window-app.sheet.journal-sheet{min-height:260px;min-width:560px}.app.window-app.sheet.forbidden-lands.actor ::-webkit-scrollbar{width:6px}.app.window-app.sheet.forbidden-lands.actor ::-webkit-scrollbar-thumb{background:var(--color-theme-gray-200);border:0 none}.app.window-app.sheet.forbidden-lands .bio{padding:4px 8px}.app.window-app.sheet.forbidden-lands .bio .avatar{background:radial-gradient(closest-side,var(--color-highlight) 0%,var(--color-background) 100%);flex:0 0 auto;height:95px;width:95px}.app.window-app.sheet.forbidden-lands .bio .avatar:hover{cursor:pointer}.app.window-app.sheet.forbidden-lands .bio .avatar:hover>img{filter:drop-shadow(0 0 5px #a00404)}.app.window-app.sheet.forbidden-lands .bio .avatar img{place-self:center;border:none;display:block;max-width:100%;max-height:100%;min-width:20px;min-height:20px}.app.sidebar-popout .window-content{width:96%;margin:auto auto 10px;color:#222}.app.sidebar-popout .subdirectory{border-color:#555}.app.sidebar-popout .subdirectory li.folder>.folder-header{background:#0003;color:#222}.app.sidebar-popout li.folder>.folder-header{background:#ffffffe6;color:#222}.app.sidebar-popout li.folder>.folder-header h3{color:#222}.app.sidebar-popout li.folder>.folder-header .create-entity{color:#444}.app.sidebar-popout li.directory-item.entity{background:#00000080;color:#eee}.app.sidebar-popout .folder>.folder-header .create-folder{color:#444}#chat-log .message{background:#fff}#navigation #scene-list .scene.gm{background:#525252;border:1px solid var(--color-border-light-secondary)}.forbidden-lands .sheet-tabs{background-color:var(--color-border-dark);color:var(--color-text-light-1);font-family:var(--font-special);margin:8px 0;padding:0 8px;flex-wrap:nowrap;justify-content:space-evenly}.forbidden-lands .sheet-tabs b:hover{cursor:pointer;text-shadow:0 0 8px #a00404}.forbidden-lands .sheet-tabs .tab-item{position:relative;flex:0;padding:8px 12px;font-weight:400;font-size:var(--font-size-16);line-height:1;color:#fff;text-align:center;white-space:nowrap;text-transform:uppercase}.forbidden-lands .sheet-tabs .tab-item:hover{text-shadow:0 0 6px #fff}.forbidden-lands .sheet-tabs .tab-item.active{filter:drop-shadow(0 0 2px #999);color:#fff}.forbidden-lands .sheet-tabs .tab-item.active:before{position:absolute;font-family:swordlings;text-transform:lowercase;content:"x";font-size:var(--font-size-16);left:-6px;top:.55rem}.forbidden-lands .sheet-tabs .tab-item.active:after{position:absolute;font-family:skullz;text-transform:lowercase;content:"l";font-size:var(--font-size-24);top:.3rem;right:-5px}.forbidden-lands .fas.fa-circle,.forbidden-lands .far.fa-circle,.forbidden-lands .far.fa-times-circle,.forbidden-lands .far.fa-check-circle{font-size:var(--font-size-14);color:var(--color-text)}.forbidden-lands .broken,.broken .fas.fa-circle,.broken .far.fa-circle,.broken .far.fa-times-circle,.condition .far.fa-times-circle,.broken .far.fa-check-circle{color:#a00404}.broken .change-willpower .far.fa-circle{color:#333}.macro-select{display:flex;flex-direction:column;align-items:flex-start;gap:.5rem;margin-bottom:1rem}.macro-select h3{margin-bottom:1rem}.macro-select label{display:grid;grid-template-columns:auto 1fr;gap:1rem}.app.journal-sheet .journal-entry-content .fbl-table-display table:hover,.fbl-table-display table:hover{cursor:pointer;box-shadow:1px 2px 4px #000}.app.journal-sheet .journal-entry-content .fbl-table-display h4,.fbl-table-display h4{font-family:var(--font-table);font-weight:600;font-size:var(--font-size-18);margin:0}.app.journal-sheet .journal-entry-content .fbl-table-display th,.fbl-table-display th{text-transform:uppercase;font-size:var(--font-size-16)}.app.journal-sheet .journal-entry-content .fbl-table-display th:nth-child(2),.fbl-table-display th:nth-child(2){text-align:left;padding-left:8px}.app.journal-sheet .journal-entry-content .fbl-table-display td:first-child,.fbl-table-display td:first-child{text-align:center;width:60px;padding-right:8px}.app.journal-sheet .journal-entry-content .fbl-table-display td:nth-child(2),.fbl-table-display td:nth-child(2){text-align:left;padding-left:8px}.window-app .window-header a.header-button{display:flex;flex-flow:row-reverse;align-items:center;height:26px;white-space:nowrap;line-height:1;overflow:hidden;padding-left:6px;margin:0 0 0 4px}.window-app .window-header a.header-button>i{font-size:var(--font-size-16);margin-left:10px;margin-top:2px;color:var(--color-theme-text)}.fa-suitcase{font-family:RPGAwesome;font-size:var(--font-size-16);transform:translateY(1px)}.fa-suitcase:before{content:"\ea72"}.fa-comments{font-family:RPGAwesome;font-size:var(--font-size-16);transform:translateY(1px)}.fa-comments:before{content:"\ea8f"}.fa-fist-raised{font-family:Swordlings;transform:translate(1.3px,-.6px);font-size:var(--font-size-16)}.fa-fist-raised:before{content:"x"}h3.entity-name>a{color:#111;text-shadow:0px 0px 5px #fff;font-weight:700;text-transform:uppercase;margin:2%}.window-app .window-content{padding:2px 4px}.window-app .window-resizable-handle{background:none;border:none;width:19px;height:19px}.window-app .window-resizable-handle i.fas{transform:translateY(-1.5px) rotate(45deg)}.window-app.image-popout form.flexcol{background:#fff}.window-app.image-popout .form-group.title input{font-family:IM FELL THREE LINE PICA;font-size:var(--font-size-20);text-shadow:0px 3px 4px rgba(0,0,0,.2);text-transform:uppercase;border:none}.window-app.image-popout .form-group.picker{opacity:.2}.window-app.image-popout .form-group input,.window-app.image-popout .form-group button{background:#999}.window-app .window-header{border:none;transition:margin-top .18s ease}.window-app.minimized .window-header{border:none;margin-top:-3px;display:flex;align-items:center;line-height:1.5;padding:unset}.window-app.minimized .window-header .window-title{overflow:hidden;white-space:pre}.window-app#client-settings .settings-list input[type=number]{max-width:3rem;text-align:center}img{border:none}img.profile{padding:5px}.app,#hotbar .macro,#hotbar .macro .macro-key,#hotbar .bar-controls,#controls .scene-control,#controls .control-tool,#navigation #nav-toggle,#navigation #scene-list .scene{background:#292929f0}a.content-link,a.inline-roll,button.inline-roll{border:none;background:transparent;border-bottom:1px dotted grey;padding:0}a.inline-roll{border:none}button.inline-roll{width:auto;border:none;line-height:initial;font-size:inherit;font-family:IM Fell Great Primer,serif}button.inline-roll:hover{text-shadow:0 0 8px var(--color-shadow-primary);box-shadow:none}button.inline-roll>.fa-dice-d20{margin-inline-end:.25em;color:var(--color-text-dark-inactive)}#pause{background:none}#pause>img{width:200px;height:200px;top:-50px;left:calc(50% - 100px);opacity:.75}#pause>figcaption{font-family:IM Fell DW Pica SC;font-size:var(--font-size-24);text-shadow:0px 3px 5px rgb(0,0,0)}#navigation{left:180px}#scenes .directory-item:last-child{border-bottom:none}#scenes .scene h3{-webkit-backdrop-filter:saturate(.5) blur(2px) brightness(.7);backdrop-filter:saturate(.5) blur(2px) brightness(.7);white-space:pre-wrap;line-height:1;display:grid;margin-inline-start:0;padding:.25rem}#scenes .scene h3>a{place-self:center}@supports not (backdrop-filter: blur(0px)){#scenes .scene h3{background:#292929f0}}#chat-log .message{position:relative}#chat-log .message:after{content:"";border:10px solid transparent;border-image:url(./assets/journal-art/small-border.webp) 100/10px repeat;position:absolute;height:calc(100% - 24px);width:calc(100% - 24px);margin:-3px 7px 7px -3px;pointer-events:none}.chat-message{font-size:var(--font-size-12)}.chat-message .message-header{padding:8px 13px;border-bottom:rgba(0,0,0,.2)}.chat-message .message-content{border:none;padding:0 13px 13px}#playlists li.playlist .sound-control.inactive{color:#666}form>select[name=folder]{display:none}form>.lightbox-image{background:#fff}.window-app.image-popout .form-group.picker:hover,.window-app.image-popout .form-group.picker:focus-within{opacity:1}li.directory-item.entity{background:#eee;color:#222;border-radius:6px;margin:0 6px}.sheet .tabs .item{white-space:nowrap}.app.sidebar-popout .folder>.folder-header .create-folder,.app.sidebar-popout li.folder>.folder-header .create-entity{color:#444}#player-config .avatar{border:2px dotted #444;border-image:url(./assets/journal-art/small-border.webp) 100/10px repeat}#player-config .directory-item.context{border-top:1px solid black;border-bottom:1px solid #666;background:#ccc}#player-config .directory-item.context h3.entity-name>a{font-weight:600}#player-config h3.entity-name>a{font-weight:400;font-size:var(--font-size-18)}#player-config h3.entity-name>a:hover{text-shadow:0 0 6px #333}#sidebar-tabs{border-bottom:1px solid #fff;box-shadow:0 0 6px #fff}#sidebar-tabs>.item.active{border:1px solid #fff;box-shadow:0 0 6px inset #fffc}#navigation #scene-list .scene.view,#navigation #scene-list .scene.context,#controls .scene-control.active,#controls .control-tool.active,#controls .scene-control:hover,#controls .control-tool:hover{border:1px solid #fff;border-bottom:1px solid rgba(255,255,255,.8);box-shadow:0 0 10px #fffc}#controls .control-tool.toggle{background:#666;border:1px solid #fff}#controls .control-tool.toggle:hover,#controls .control-tool.toggle.active{background:var(--color-shadow-primary)}#combat li.combatant .roll.roll{background:url(./assets/rolling-dices.png) no-repeat 50% 50%;background-size:contain;filter:invert(1)}#combat li.combatant .roll.roll:hover{background-image:url(./assets/rolling-dices.png) no-repeat 50% 50%;filter:drop-shadow(0 0 5px #fff)}#combat-popout li.combatant .roll.roll{background:url(./assets/rolling-dices.png) no-repeat 50% 50%;background-size:contain;filter:none}#combat-popout li.combatant .roll.roll:hover{background-image:url(./assets/rolling-dices.png) no-repeat 50% 50%;filter:drop-shadow(0 0 5px #111)}::-webkit-scrollbar-thumb{outline:none;border-radius:3px;background:#999!important;border:1px solid #333!important;border-color:#333!important}::-webkit-scrollbar-track{box-shadow:0 0 3px #005d67 inset!important;border-radius:3px}*{scrollbar-width:thin!important;scrollbar-color:#005d67 #ccc!important}a.card-control>i.fa-caret-down,a.card-control>i.fa-caret-up{font-size:var(--font-size-16)}#controls ol.control-tools>li.toggle{background:#a0040466;border-color:var(--color-border-dark-tertiary)}#controls ol.control-tools>li.toggle.active,#controls ol.control-tools>li.toggle:hover{background:#a00404;border-color:var(--color-border-dark-tertiary);box-shadow:0 0 10px var(--color-shadow-primary)}.forbidden-lands.chat-item{background:var(--color-background);border-radius:3px;color:var(--color-foreground);font-family:var(--font-table);font-size:var(--font-size-12);line-height:16px;padding:8px}.chat-message .message-header .message-metadata{font-size:var(--font-size-12)}.forbidden-lands.chat-item .border{padding:8px}.forbidden-lands.chat-item .link-header{text-align:center}.forbidden-lands.chat-item strong{text-transform:uppercase}.forbidden-lands.chat-item h3{font-family:var(--font-subheader);font-size:var(--font-size-14);font-weight:700;margin:0 0 8px;text-align:center}.forbidden-lands.chat-item h4{font-family:var(--font-special);font-size:var(--font-size-14);font-weight:700;margin:0 0 8px;text-align:center}.forbidden-lands.chat-item h3+h4{margin-top:-8px}.forbidden-lands.chat-item img{background:radial-gradient(closest-side,var(--color-highlight) 0%,white 100%);border:0;display:block;margin:0 auto 8px;max-height:64px;width:auto}.forbidden-lands.chat-item p{margin:0 0 4px}.forbidden-lands.chat-item .link-header a{line-height:18px}.forbidden-lands.chat-item h3{font-family:IM Fell DW Pica SC}.forbidden-lands.chat-item h4{font-family:IM Fell DW Pica}.forbidden-lands.item .header{border:10px solid transparent;border-image:url(./assets/journal-art/small-border.webp) 100/10px repeat}.forbidden-lands.item .header .header-stats .bonus{grid-gap:5px}.forbidden-lands.item .header .header-stats .bonus i{vertical-align:unset}.forbidden-lands .border{border:none}.forbidden-lands.chat-item{background:none}.forbidden-lands.chat-item,.forbidden-lands.chat-item .border{padding:0 4px}.message-content .entity-link{border:none}.roll-dialog{display:flex;flex-direction:column;padding:0 2rem;gap:1rem}.roll-dialog h2{text-align:center;font-family:IM FELL DW PICA SC;text-transform:uppercase;border-bottom:none;font-weight:700;font-size:var(--font-size-18)}.roll-dialog h3{border-bottom:2px solid rgba(51,51,51,.4)}.roll-dialog label{display:block;font-weight:700;text-align:left}.roll-dialog .container{display:grid;grid-template-columns:1fr 1fr;gap:2rem;text-align:center}.roll-dialog .container.spell label{text-align:right;text-transform:uppercase}.roll-dialog .dice input{width:70%;margin:.5rem .5rem 0 0}.roll-dialog .dice label{margin-top:1rem}.roll-dialog .options{display:flex;flex-direction:column}.roll-dialog .options .legend,.roll-dialog .options .modifiers{text-align:center;display:grid;grid-template-columns:1fr 3fr 1fr;gap:12px;align-items:center}.roll-dialog .options .legend{font-weight:700;font-family:var(--font-subheader)}.roll-dialog .options .modifiers label{display:inline}.roll-dialog .options .modifiers label:last-of-type{text-align:right}.roll-dialog .options .final-modifier{margin:auto 0 0}.roll-dialog .form-actions{padding:1rem;justify-items:center}.roll-dialog .form-actions button[type=reset]{background:transparent}.roll-dialog .form-actions button{background:#eee;padding:.3em 2em;font-weight:400;border:2px groove #e0e0e0;width:100%;display:flex;justify-content:center;align-items:center}.roll-dialog .form-actions button:hover,.roll-dialog .form-actions button:focus{box-shadow:none;border:2px groove var(--color-highlight);background:var(--color-highlight)}.roll-dialog .form-actions button:active{box-shadow:none;border:2px ridge var(--color-highlight)}.roll-dialog input#artifact{width:100%}.roll-dialog .display-numbers{font-family:var(--font-subheader);font-size:var(--font-size-48);line-height:var(--font-size-48)}.roll-dialog .spell-options{display:grid;grid-template-columns:repeat(2,1fr);margin-right:1.5rem}.roll-dialog .spell-options .modifiers{grid-template-columns:3fr 1fr}.roll-dialog .spell-options .modifiers label{text-align:right}.spell-dialog h2:before{background:url(./assets/journal-art/pentagram-border.webp) no-repeat top center}.attack-dialog h2:before{background:url(./assets/journal-art/attack-border.webp) no-repeat top center}.spell-dialog h2:before,.attack-dialog h2:before{display:block;content:"";height:56px;background-size:100%;width:77%;margin:0 auto}.spell-dialog h2:after,.attack-dialog h2:after{background:url(./assets/journal-art/endstop.webp) center no-repeat;content:"";width:147px;height:40px;display:block;background-size:100%;margin:0 auto}.spell-dialog span[contenteditable=true]:focus-visible,.attack-dialog span[contenteditable=true]:focus-visible{outline-color:#000;outline-offset:4px}.roll-group-btns{display:flex;align-items:center;justify-content:center;padding:0;margin-top:5px}.roll-group-btns a i{font-size:25px}.roll-group-btns input{margin:0 5px!important}.chargen .chargen-roll{width:30px;height:30px;background-image:url(./assets/rolling-dices.png);background-size:30px 30px;background-position:center;background-repeat:no-repeat}.chargen .chargen-roll:hover{background-image:url(./assets/rolling-dices.png);background-size:35px 35px;background-position:center;background-repeat:no-repeat}.chargen-options{background:#363636;display:flex;justify-content:space-around}.chargen-options b{line-height:1;position:relative;font-weight:400;padding:8px 19px;color:#fff;font-family:IM Fell DW Pica;text-transform:uppercase}.chargen-options b:hover{text-shadow:0 0 6px #fff}.chargen-options b:hover:before{position:absolute;font-family:swordlings;text-transform:lowercase;content:"x";font-size:var(--font-size-16);left:-6px;top:.55rem}.chargen-options b:hover:after{position:absolute;font-family:skullz;text-transform:lowercase;content:"l";font-size:var(--font-size-24);top:.3rem;right:-5px}.chargen-title{margin-top:20px;font-size:var(--font-size-18);font-family:IM Fell DW Pica;font-weight:600;text-transform:uppercase;color:#363636}.chargen-description{font-family:IM Fell Great Primer;font-size:var(--font-size-16);text-align:justify;margin:20px 0;line-height:1.35}.chargen-section{align-items:flex-start}.chargen-section button.chargen-roll{margin:10px 10px 10px 5px;min-width:40px;min-height:40px;color:#fff}.chargen-section .chargen-section-content{display:flex;flex-flow:column;flex:1 0 20%}.chargen-build{min-width:33%;display:flex;flex-direction:column;color:#363636;flex-wrap:wrap;padding:15px;margin-top:4px;margin-left:30px;font-family:IM FELL DW Pica;justify-content:space-around;font-size:var(--font-size-16);background:#fff;border-image-outset:3px}.chargen-items{font-weight:700}.chargen-list-caption{text-transform:uppercase;border-bottom:1px solid}.chargen-list ul{padding:0}.chargen-list ul li{list-style:none}.chargen-select-kin,.chargen-select-profession{max-width:110px}.chargen-age-container{white-space:nowrap}.chargen-age-container .chargen-age-input{max-width:60px}.chargen-list li strong{text-transform:capitalize}.chargen-background-table>div{border-bottom:1px solid #363636;padding:10px}.chargen-background-table>div:nth-child(odd){background:#ccc}.chargen-background-table button:hover{background-color:#fff}.tables-config form{display:grid;grid-template-columns:repeat(2,auto);gap:16px}.tables-config fieldset{display:grid;grid-template-columns:1fr;gap:16px}.tables-config fieldset.encounter{grid-template-columns:1fr 1fr;grid-row:span 2}.tables-config button[type=submit]{grid-column:span 2}.tables-config legend{font-weight:600;font-size:var(--font-size-18)}.tables-config label{display:flex;flex-direction:column;gap:8px;max-width:250px;font-weight:600}.sheet-config form{display:flex;flex-direction:column;gap:16px}.sheet-config label{display:flex;flex-direction:row;font-weight:600;gap:8px}.sheet-config label div{display:flex;flex-direction:column}.sheet-config label div .description{font-size:var(--font-size-12);font-weight:400;color:var(--color-text-dark-5);font-style:italic}.sheet-config hr{width:100%}.dice-tooltip .dice-rolls .roll{width:unset;min-width:24px}.chat-message .message-content .dice-roll{font-family:var(--font-table);background:var(--color-theme-gray-200);color:var(--color-theme-gray-800);border-radius:4px;box-shadow:inset 0 0 2px #9996;padding:1rem;margin-bottom:.8rem}.chat-message .message-content .dice-roll:hover{box-shadow:inset 0 0 2px #1119}.chat-message .message-content .dice-roll .dice-formula,.chat-message .message-content .dice-roll .dice-total{background:none;box-shadow:none;border:none;font-family:var(--font-subheader);font-size:var(--font-size-16);font-weight:600}.chat-message .message-content .dice-roll .dice-formula{padding-bottom:1rem;border-bottom:2px solid rgba(17,17,17,.1333333333);margin-bottom:-1px;text-transform:uppercase;word-break:break-word}.chat-message .message-content .dice-roll .dice-total{border-top:2px solid rgba(17,17,17,.1333333333);margin-top:-1px;padding-top:1.3rem;font-size:var(--font-size-20);line-height:normal;display:flex;justify-content:center;align-items:baseline}.chat-message .message-content .dice-roll .dice-total .fa-tint{font-size:.8em;margin:0 .5rem}.chat-message .message-content .dice-roll .tooltip-part{margin-top:1rem}.chat-message .message-content .dice-roll .tooltip-part:first-child{margin-top:2rem}.chat-message .message-content .dice-roll .tooltip-part:last-child{margin-bottom:2rem}.chat-message .message-content .dice-roll .tooltip-part .part-header{border-bottom:2px solid rgba(153,153,153,.1333333333);font-weight:600}.chat-message .message-content .dice-roll .tooltip-part .part-total{background:none;border:none;font-size:var(--font-size-14)}.chat-message .message-content .dice-roll .tooltip-part .sword,.chat-message .message-content .dice-roll .tooltip-part .skullz{flex:none;font-size:1.1em;line-height:1.89em;margin-right:-.2em}.chat-message .message-content .dice-roll .tooltip-part .skullz{font-size:1.7em;margin:0 -.2rem 0 .3rem;line-height:.95em}.chat-message .message-content .dice-roll .tooltip-part .dice-rolls .roll{max-width:2rem;margin:0 .3rem;border-radius:2px;filter:drop-shadow(0 0 2px rgba(17,17,17,.6))}.chat-message .message-content .dice-roll .tooltip-part .dice-rolls .roll.discarded{display:none}.chat-message .message-content .dice-roll .tooltip-part .dice-rolls .roll.discarded.pushed{display:block;opacity:.2}.chat-message .message-content .dice-roll .tooltip-part .max,.chat-message .message-content .dice-roll .tooltip-part .min{filter:none}.dice-infos .dice-info{text-align:center;font-family:var(--font-special);font-size:var(--font-size-16);font-weight:600;color:#444}.dice-infos .dice-info:last-child{padding-bottom:8px}.dice-infos .result{font-size:var(--font-size-18)}.consumable-result{font-size:var(--font-size-48);font-family:IM Fell Great Primer;align-self:flex-start;line-height:7rem}.consumable-icon{width:100px;transform:translate(-15%)}.spell-roll{font-size:var(--font-size-20);font-family:IM Fell Great Primer;align-self:flex-start}.spell-roll.power{text-align:right;flex:0 1 50%;line-height:1.6}.spell-roll.result{font-size:var(--font-size-48);text-align:left;margin-left:2rem;flex:1}.dice-buttons{display:flex;gap:8px}.skullz{font-family:skullz;font-size:1.3em;line-height:1em;height:1em;transform:translateY(.2em);margin:0 .2rem 0 0;display:block;font-weight:400}.sword{font-family:swordlings;font-size:.8em;margin:0 .2rem;display:block;font-weight:600}.special-number{line-height:1.2rem;display:block}.fbl-button{font-weight:600;border:2px solid var(--color-border);box-shadow:0 0 5px transparent;width:max(2em,60%);display:block;margin:0 auto;border-radius:6px;transition:transform 80ms ease-in-out,box-shadow 80ms ease-in-out}.fbl-button:hover,.fbl-button:focus{box-shadow:0 0 5px #a00404;border:2px solid #a00404}.fbl-button:active{transform:scale(.96)}.chat-flavor{font-size:var(--font-size-14);display:block;text-align:center;font-style:italic;font-weight:700}.forbidden-lands .character{display:flex;flex-direction:column;height:100%;width:100%}.forbidden-lands .character .bio label{font-family:var(--font-special);margin-left:8px}.forbidden-lands .character .bio table{width:auto;background:none;border:none;margin:5px 0}.forbidden-lands .character .bio table td{padding:.25em;text-align:right}.forbidden-lands .character .bio table td input{max-width:50px}.forbidden-lands .character .bio table td input.kin,.forbidden-lands .character .bio table td input.profession{text-align:left;max-width:120px}.forbidden-lands .character .bio table td input.name{text-align:left;max-width:225px}.forbidden-lands .character .bio .willpower.skulls{justify-content:flex-start;align-items:flex-end;white-space:nowrap;height:1.75em}.forbidden-lands .character .bio .willpower.skulls .change-willpower>i.skull{font-size:var(--font-size-16)}.forbidden-lands .character .bio .avatar .forbidden-lands .character .bio .avatar img .forbidden-lands .character .roll{background:transparent;border:0 none;cursor:pointer;font-family:inherit;font-weight:700}.forbidden-lands .character .roll:hover{box-shadow:none;text-shadow:0 0 8px var(--color-shadow-primary)}.forbidden-lands .character .push{background:transparent;border:0 none;cursor:pointer;font-family:inherit;font-weight:700}.forbidden-lands .character .push:hover{box-shadow:none;text-shadow:0 0 8px #a00404}.forbidden-lands .monster h2,.forbidden-lands .character h2{padding:8px 4px 4px}.forbidden-lands .roll-consumable{text-transform:uppercase}.forbidden-lands.item{min-height:250px;min-width:380px;height:100%;max-width:600px;max-height:700px}.forbidden-lands.item .header{align-items:center;display:flex;gap:8px;padding:8px;justify-content:space-between;height:fit-content;border:6px solid transparent;border-image:url(./assets/journal-art/small-border.webp) 100/10px repeat}.forbidden-lands.item .header .header-stats{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:4px;margin-left:8px}.forbidden-lands.item .header .header-stats label{grid-column:1;text-align:right;margin-right:8px}.forbidden-lands.item .header .header-stats .bonus{display:grid;grid-template-columns:1fr auto;align-items:center}.forbidden-lands.item .header .header-stats .bonus i{vertical-align:middle}.forbidden-lands.item .header .header-stats .bonus input{width:2em}.forbidden-lands.item .header .header-stats .bonus .skulls{font-size:var(--font-size-12)}.forbidden-lands.item .header .stats{display:grid;grid-template-columns:repeat(4,auto);justify-items:flex-end;gap:8px}.forbidden-lands.item .header .stats label{display:flex;flex-wrap:nowrap;white-space:nowrap;gap:4px;align-items:center}.forbidden-lands.item .header .stats input{justify-self:flex-start}.forbidden-lands.item .header .stats input[type=number]{width:50px}.forbidden-lands.item .header .stats input[name=name]{grid-column:span 3}.forbidden-lands.item .header .stats input[type=checkbox]{margin:0;flex:none;height:unset;width:unset}.forbidden-lands.item .header .stats .icon{width:50px;display:flex;justify-content:center;align-items:center;margin-right:4px}.forbidden-lands.item .multivalue{align-items:center;display:grid;margin:0 0 0 8px;font-family:var(--font-special);gap:2px;grid-template-columns:1fr auto 1fr}.forbidden-lands.item .weight{display:flex;flex-direction:column;gap:.5rem}.forbidden-lands.item .avatar{background:radial-gradient(closest-side,var(--color-highlight) 0%,var(--color-theme-background) 100%);grid-row:1/3;height:95px;width:95px}.forbidden-lands.item .avatar:hover{cursor:pointer}.forbidden-lands.item .avatar:hover>img{filter:drop-shadow(0 0 6px #a00404)}.forbidden-lands.item .avatar img{border:0 none;display:block;max-width:95px;max-height:95px;min-width:20px;min-height:20px;margin:auto}.forbidden-lands.item .sheet-body{overflow-y:auto;min-height:0}.forbidden-lands.item .sheet-body .tab{margin-bottom:8px}.forbidden-lands.item .sheet-body .border{padding:8px;margin-bottom:8px}.forbidden-lands.item .sheet-body .main{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;align-items:end}.forbidden-lands.item .sheet-body .supply label,.forbidden-lands.item .sheet-body .crafting label{margin-top:4px}.forbidden-lands.item .sheet-body .supply label:first-child,.forbidden-lands.item .sheet-body .crafting label:first-child{margin-top:unset}.forbidden-lands.item .item{margin:8px;align-items:baseline;display:grid;gap:8px;grid-template-columns:1fr 1fr 1fr}.forbidden-lands.item .item .requirement,.forbidden-lands.item .item .tools,.forbidden-lands.item .item .effect,.forbidden-lands.item .item .description,.forbidden-lands.item .item .drawback,.forbidden-lands.item .item .appearance,.forbidden-lands.item .item .spell-description,.forbidden-lands.item .item .talent-description,.forbidden-lands.item .item .monster-description,.forbidden-lands.item .item .hireling-description,.forbidden-lands.item .item .building-raw-materials,.forbidden-lands.item .item .building-description{grid-column:1/-1}.forbidden-lands.item .item .raw-materials{grid-column:1/3}.forbidden-lands.item .item div,.forbidden-lands.item .sheet-body .artifact div,.forbidden-lands.item .sheet-body .main div{position:relative}.forbidden-lands.item .tox-toolbar__primary [aria-label="Insert/edit link"],.forbidden-lands.item .tox-toolbar__primary [aria-label=Table],.forbidden-lands.item .tox-toolbar__primary [aria-label="Horizontal line"]{display:none}.forbidden-lands .column-header{border-bottom:2px solid var(--color-border)}.forbidden-lands .roll-modifiers{grid-column:1/-1}.forbidden-lands .roll-modifiers a{font-size:var(--font-size-12)}.forbidden-lands .roll-modifiers .hide-field{margin-left:.5rem}.forbidden-lands .roll-modifiers .hide-field i{font-family:"Font Awesome 5 Free";font-style:normal;cursor:pointer}.forbidden-lands .features{justify-content:flex-start}.forbidden-lands .features .feature{margin:5px 2px 2px;flex-grow:1;font-family:var(--font-input);font-size:var(--font-size-12)}.forbidden-lands .features .feature.active{font-weight:700}.forbidden-lands .features .feature>i{vertical-align:middle}.forbidden-lands .grid-full-line{grid-column:1/-1}.forbidden-lands .monster{display:flex;flex-direction:column;height:100%;width:100%}.forbidden-lands .monster .bio{padding:8px}.forbidden-lands .monster .bio .bio-row{display:flex;flex-direction:column;align-items:flex-end;gap:8px}.forbidden-lands .monster .bio .bio-row label{display:flex;gap:4px}.forbidden-lands .monster .bio .bio-row input[type=number]{width:50px}.forbidden-lands .monster .bio .bio-row input[name=name]{width:235px}.forbidden-lands .monster .bio .bio-row .armor>div{display:flex;gap:4px}.forbidden-lands .monster .bio .bio-row .armor .roll-armor{white-space:nowrap;padding:0;margin:0}.forbidden-lands .monster .bio .bio-row .description{width:300px}.forbidden-lands .monster .attributes{grid-column-end:span 2}.forbidden-lands .monster .conditions{display:none}.forbidden-lands .stronghold{display:flex;flex-direction:column;height:100%;width:100%}.forbidden-lands .stronghold .bio{padding:8px}.forbidden-lands .stronghold .bio input{flex-grow:1;margin:0 8px}.forbidden-lands .stronghold .bio .bio-row{align-items:baseline;display:flex;flex-direction:row;justify-content:space-between;margin:5px 0}.forbidden-lands .stronghold .bio .name{display:flex;flex-direction:row}.forbidden-lands .stronghold .bio .location input{width:15em}.forbidden-lands .stronghold .bio .defense-rating input{width:2em}.forbidden-lands.party{min-height:540px;height:100%;max-height:calc(100vh - 10%)}.forbidden-lands.party .main{padding:1rem;gap:2rem;justify-content:space-between}.forbidden-lands.party .main .random-enc{display:flex;flex-direction:column;align-items:flex-end}.forbidden-lands.party .main .random-enc ul{list-style:none;margin-inline-start:.5rem}.forbidden-lands.party .main .random-enc ul li{padding-inline-end:1rem}.forbidden-lands.party .avatar{padding:.5rem}.forbidden-lands.party .avatar>img{vertical-align:middle}.forbidden-lands.party .border{border:6px solid transparent;border-image:url(./assets/journal-art/small-border.webp) 100/10px repeat}.forbidden-lands.party .party{height:100%;min-height:540px;width:100%}.forbidden-lands.party .tab-hint{font-style:italic;text-align:center}.party-member-list{height:100%;min-height:360px}.party-member-list ol{display:flex;flex-direction:column;gap:.5rem}.party-member:hover{background-color:#d3d3d3}.party-member .party-member-avatar{flex:0 0 48px;width:48px;height:48px;border:0px;cursor:pointer}.party-member .party-member-name{line-height:48px}.party-member .button{flex:0 0 24px;width:24px;height:48px;line-height:48px}.party-member .content-link{padding:0 6px;line-height:44px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;border:0px;background-color:inherit}.party-member .plain-name{margin-right:6px;line-height:44px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;border:0px;background-color:inherit}.travel-actions{margin:0;padding:.5rem;list-style:none;display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}.travel-actions li{min-height:1px}.travel-actions li.action-other{grid-row:2/4;grid-column:3}.travel-actions li.action-sleep{grid-row:2/4;grid-column:2}.travel-action{min-width:196px;min-height:106px;margin-bottom:10px;flex-grow:1}.travel-action ol{padding-left:4px}.travel-action .travel-action-header{text-align:center;font-weight:700;padding:4px;border-bottom:1px solid;display:flex;flex-direction:row;justify-content:center}.travel-action .travel-action-header .content-link{background-color:#fff;border:none}.travel-action .travel-action-help{border:1px solid;border-radius:6px;background-color:#5f9ea0;display:flex;width:20px;margin-left:4px;justify-content:center}.travel-action .travel-action-help:hover{background-color:#0ff}.travel-action button.travel-roll{font-size:var(--font-size-12);display:block;width:99%;border-bottom:1px gray dashed}.forbidden-lands .character .bio-tab{height:100%;overflow-y:auto}.forbidden-lands .character .bio-tab .section{margin-bottom:1rem}.forbidden-lands .combat-tab{display:grid;gap:8px;grid-template-rows:3fr 2fr auto;grid-template-columns:1fr 1fr;height:100%}.forbidden-lands .character .armors{display:flex;flex-direction:column;overflow:hidden;padding-bottom:8px}.forbidden-lands .character .armors h2 button{font-weight:inherit;margin:-2px -4px}.forbidden-lands .character .armors .header{display:flex}.forbidden-lands .character .armors .item.armor{align-items:center;display:flex}.forbidden-lands .character .armors .armor button{margin:-2px -4px;text-align:left}.forbidden-lands .character .armors .armor .name{align-items:center;display:flex;flex-basis:85%}.forbidden-lands .character .armors .armor .name .name{display:block}.forbidden-lands .character .armors .item.armor .name .name,.forbidden-lands .character .armors .armor .bonus{margin-left:4px}.forbidden-lands .character .armors .armor .bonus{flex-basis:15%;text-align:center}.forbidden-lands .character .armors .armor .bonus.broken{color:#a00404}.forbidden-lands .character .critical-injuries{display:flex;flex-direction:column;overflow:hidden;padding-bottom:8px}.forbidden-lands .character .critical-injuries .critical-injury{align-items:center}.forbidden-lands .character .critical-injuries .critical-injury .button{flex-basis:20%;font-size:var(--font-size-12);text-align:right}.forbidden-lands .character .critical-injuries .critical-injury .name{align-items:center;display:flex;flex-basis:55%}.forbidden-lands .character .critical-injuries .critical-injury .name .name{margin-left:4px}.forbidden-lands .character .critical-injuries .critical-injury .healtime{align-items:center;flex-basis:30%;text-align:center}.forbidden-lands .character .weapons{grid-column:1/-1;display:flex;flex-direction:column;overflow:hidden;padding-bottom:8px}.forbidden-lands .character .weapons .header{display:flex}.forbidden-lands .character .weapons .item .weapon{align-items:center;display:flex}.forbidden-lands .character .weapons .weapon .name button{margin:-2px -4px;text-align:left}.forbidden-lands .character .weapons .weapon .name{align-items:center;display:flex;flex:1 0 45%}.forbidden-lands .character .weapons .weapon .name .name{display:block}.forbidden-lands .character .weapons .weapon .name .name span{display:inline-block}.forbidden-lands .character .weapons .item .weapon .name .name,.forbidden-lands .character .weapons .weapon .bonus,.forbidden-lands .character .weapons .weapon .damage,.forbidden-lands .character .weapons .weapon .range{margin-left:4px}.forbidden-lands .character .weapons .weapon .bonus{flex-basis:10%;text-align:center}.forbidden-lands .character .weapons .weapon .bonus.broken{color:#a00404}.forbidden-lands .character .weapons .weapon .damage{flex-basis:10%;text-align:center}.forbidden-lands .character .weapons .weapon .range{flex-basis:15%;text-align:center}.forbidden-lands .character .weapons .weapon .weapon-actions{flex-basis:20%;text-align:center}.forbidden-lands .character .weapons .weapon .weapon-actions button{line-height:12px}.forbidden-lands .character .weapons .item .features{font-style:italic;font-size:var(--font-size-12)}.forbidden-lands .character .combat-tab .actions{grid-column:1/-1;align-items:center;padding:.5rem 4px}.forbidden-lands .character .combat-tab .actions i{margin-left:5px;margin-bottom:2px;font-size:var(--font-size-16)}.forbidden-lands .character .combat-tab .actions h2{text-align:left;margin-right:10px}.forbidden-lands .character .combat-tab .actions div{justify-content:flex-end}.forbidden-lands .gear-tab{display:grid;gap:8px;grid-template-rows:auto 1fr auto;height:100%}.forbidden-lands .gear-tab a.currency-button{margin:0 1px;display:inline-block;font-size:var(--font-size-16);translate:0 2px}.forbidden-lands .gear-tab .currencies .header{font-variant:small-caps;justify-content:space-between;align-items:center;padding:8px}.forbidden-lands .gear-tab .currencies .header b{font-family:var(--font-special);font-size:var(--font-size-16)}.forbidden-lands .gear-tab .currencies .values label{font-family:var(--font-special);font-variant:normal;margin:0 8px 0 16px}.forbidden-lands .gear-tab .currencies .values input{width:3em}.forbidden-lands .gear-tab .consumables{display:grid;grid-template-columns:auto auto auto auto auto}.forbidden-lands .gear-tab .consumables .consumable{display:flex;flex-direction:row;align-items:center;font-family:var(--font-special);padding:8px 0;justify-content:center;font-size:var(--font-size-16)}.forbidden-lands .gear-tab .consumables .consumable i{margin-left:5px;margin-bottom:2px;font-size:var(--font-size-24)}.forbidden-lands .gear-tab .consumables .consumable button{margin-right:6px}.forbidden-lands .gear-tab .consumables .consumable select{width:auto}.forbidden-lands .gear-tab .gears{padding-bottom:8px;position:relative;overflow:hidden;display:flex;flex-direction:column}.forbidden-lands .gear-tab .gears .controls{display:flex;flex-direction:row;justify-content:center;align-items:center;gap:.5rem;background-color:var(--color--background-dark);border-radius:4px;box-shadow:0 2px 3px #0002;margin:0 auto 4px;padding:0 .5rem}.forbidden-lands .gear-tab .gears button i{margin:0}.forbidden-lands .gear-tab .gears .encumbrance{font-family:var(--font-editor);font-size:var(--font-size-16);padding:2px 4px}.forbidden-lands .gear-tab .gears .encumbrance.overencumbered{color:#a00404}.forbidden-lands .gear-tab .gears .encumbrance i{font-size:var(--font-size-12)}.forbidden-lands .gear-tab .gears .items>table{table-layout:fixed;width:100%;border:unset;background-color:unset}.forbidden-lands .gear-tab .gears .items>table thead{background-color:transparent;color:var(--color-text-dark-1);text-shadow:none;border:none;border-bottom:2px solid var(--color-border);margin-bottom:4px;font-size:var(--font-size-12);font-weight:700;padding:4px;text-transform:uppercase}.forbidden-lands .gear-tab .gears .items>table th,.forbidden-lands .gear-tab .gears .items>table td{padding:2px 4px;white-space:nowrap;text-align:center}.forbidden-lands .gear-tab .gears .items>table th:first-child,.forbidden-lands .gear-tab .gears .items>table td:first-child{width:40%;text-align:left}.forbidden-lands .gear-tab .gears .items>table th:last-child,.forbidden-lands .gear-tab .gears .items>table td:last-child{text-align:end}.forbidden-lands .gear-tab .gears .items .profile{overflow:hidden;text-overflow:ellipsis}.forbidden-lands .gear-tab .gears .items .profile .count{background-color:var(--color-highlight);width:22px;height:18px;display:inline-grid;place-content:center;border-radius:10px;color:var(--color-foreground)}.forbidden-lands .gear-tab .gears .items button{margin:0 0 0 2px;padding:0;width:16px;height:16px}.forbidden-lands .gear-tab .gears .items button:first-child{margin-left:0}.forbidden-lands .gear-tab .gears .items button i{margin:0}.forbidden-lands .gear-tab .gears .items input.quantity{width:50%}.forbidden-lands .gear-tab .gears .items .broken{color:#a00404}.forbidden-lands .main-tab{display:grid;gap:8px;grid-template-columns:1fr 1fr;height:100%;overflow-y:auto;font-size:var(--font-size-16)}.forbidden-lands .attributes{align-items:center;display:grid;gap:4px 8px;grid-template-columns:auto 1fr auto;padding:0 8px 8px}.forbidden-lands .attributes h2{grid-column:1/-1}.forbidden-lands .attributes .name{font-family:var(--font-special);text-align:left}.forbidden-lands .attributes .skulls{text-align:left}.forbidden-lands .attributes .value{font-family:var(--font-special);margin-right:5px}.forbidden-lands .attributes .value input{width:2em}.forbidden-lands .attributes .broken{color:#a00404}.forbidden-lands .character .conditions-grid{display:grid;height:100%;grid-template-columns:repeat(2,1fr);gap:40% 20%;place-content:center;padding:5% 10%}.forbidden-lands .conditions-grid a.condition{font-family:var(--font-special);font-size:var(--font-size-16);font-weight:700;display:inline-grid;grid:inherit;gap:4px;place-content:baseline}.forbidden-lands .character .condition i{font-size:var(--font-size-18);justify-self:end}.forbidden-lands .conditions .condition.active{color:#a00404}.forbidden-lands .skills{align-items:baseline;display:grid;flex-basis:calc(50% - 4px);flex-grow:1;gap:4px 8px;grid-template-columns:1fr auto;padding:0 8px 8px}.forbidden-lands .skills h2{grid-column:1/-1}.forbidden-lands .skills .name{font-family:var(--font-special);flex-basis:50%}.forbidden-lands .skills input{width:2em;margin-right:2px}.forbidden-lands .monster .armors .armor{align-items:center;padding:0 5px 5px}.forbidden-lands .monster .armors .armor.total input{flex-basis:50%;margin-right:5px;margin-left:5px;text-align:center}.forbidden-lands .monster .armors .armor b{flex-basis:50%}.forbidden-lands .monster .armors .armor input{flex-basis:25%;margin-right:5px;text-align:center}.forbidden-lands .monster .armors .armor input:last-child{margin-right:0;margin-left:5px}.forbidden-lands .monster .monster-talents{overflow:hidden;padding-bottom:8px}.forbidden-lands .monster .monster-talents .monster-talent{align-items:center}.forbidden-lands .monster .monster-talents .monster-talent .name{align-items:center;display:flex;flex-basis:90%}.forbidden-lands .monster .monster-talents .monster-talent .name b{font-size:var(--font-size-14);font-weight:700;text-transform:uppercase}.forbidden-lands .monster .monster-talents .monster-talent .name .name{display:block;padding-left:4px}.forbidden-lands .monster .monster-talents .monster-talent .button{flex-basis:10%;font-size:var(--font-size-12);text-align:right}.forbidden-lands .monster .monster-attacks{margin-top:8px;overflow:hidden}.forbidden-lands .monster .monster-attacks ol{list-style:none;counter-reset:item;margin:0;padding:0}.forbidden-lands .monster .monster-attacks ol li{counter-increment:item}.forbidden-lands .monster .monster-attacks ol li:before{margin-inline:8px;content:counter(item);font-weight:600;font-size:var(--font-size-12);text-align:center;display:inline-block}.forbidden-lands .monster .monster-attacks .monster-attack{align-items:center}.forbidden-lands .monster .monster-attacks .monster-attack button{margin:-2px -4px}.forbidden-lands .monster .monster-attacks .monster-attack .name{align-items:center;display:flex;flex-basis:90%}.forbidden-lands .monster .monster-attacks .monster-attack .name a{font-size:small;font-weight:700;text-transform:uppercase}.forbidden-lands .monster .monster-attacks .monster-attack .name .name{padding-left:4px;font-size:var(--font-size-14)}.forbidden-lands .monster .monster-attacks .monster-attack .button{flex-basis:10%;font-size:var(--font-size-12);text-align:right}.forbidden-lands .monster .talent-description,.forbidden-lands .monster .monster-attack .name .name{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.forbidden-lands .stronghold .buildings{flex-basis:50%}.forbidden-lands .stronghold .buildings .building{align-items:center;padding-block:4px}.forbidden-lands .stronghold .buildings .building .name{flex-basis:75%}.forbidden-lands .stronghold .buildings .building .quantity{flex-basis:15%;text-align:center}.forbidden-lands .stronghold .buildings .building .button{flex-basis:10%;font-size:var(--font-size-12);text-align:right}.forbidden-lands .stronghold .gears{padding-bottom:8px}.forbidden-lands .stronghold .gears .items .header{margin:0;width:100%}.forbidden-lands .stronghold .gears .items div+.header{margin-top:8px}.forbidden-lands .stronghold .gears .gear{align-items:center}.forbidden-lands .stronghold .gears .name{align-items:center;flex-basis:42%;display:flex}.forbidden-lands .stronghold .gears .header .name,.forbidden-lands .stronghold .gears .name .name,.forbidden-lands .stronghold .gears .bonus,.forbidden-lands .stronghold .gears .quantity,.forbidden-lands .stronghold .gears .weight,.forbidden-lands .stronghold .gears .button{margin-left:4px}.forbidden-lands .stronghold .gears .bonus,.forbidden-lands .stronghold .gears .weight,.forbidden-lands .stronghold .gears .quantity{flex-basis:15%;text-align:center}.forbidden-lands .stronghold .gears input.quantity{flex-basis:8%;margin-right:3%;margin-left:5%}.forbidden-lands .stronghold .gears .bonus.broken{color:#a00404}.forbidden-lands .stronghold .gears .button{flex-basis:10%;font-size:var(--font-size-12);text-align:right}.forbidden-lands .stronghold .hirelings{flex-basis:50%}.forbidden-lands .stronghold .hirelings .hireling{align-items:center;padding-block:4px}.forbidden-lands .stronghold .hirelings .hireling .name{flex-basis:55%}.forbidden-lands .stronghold .hirelings .hireling .quantity{flex-basis:15%;text-align:center}.forbidden-lands .stronghold .hirelings .hireling .salary{flex-basis:20%;text-align:right}.forbidden-lands .stronghold .hirelings .hireling .button{flex-basis:10%;font-size:var(--font-size-12);text-align:right}.forbidden-lands .talent-tab{display:grid;gap:8px;grid-template-columns:1fr 1fr;height:100%}.forbidden-lands .character .talents{display:flex;flex-direction:column;overflow:hidden;padding-bottom:8px}.forbidden-lands .character .talents .talent{align-items:center}.forbidden-lands .character .talents .talent .name{align-items:center;flex-basis:65%;display:flex}.forbidden-lands .character .talents .talent .name .name{margin-left:4px}.forbidden-lands .character .talents .talent .rank{flex-basis:15%;text-align:center}.forbidden-lands .character .talents .talent .button{flex-basis:20%;font-size:var(--font-size-12);text-align:right}.forbidden-lands .character .spells{display:flex;flex-direction:column;overflow:hidden;padding-bottom:8px}.forbidden-lands .character .spells .spell{align-items:center}.forbidden-lands .character .spells .spell .name{align-items:center;flex-basis:65%;display:flex}.forbidden-lands .character .spells .spell .name .roll-spell{font-weight:400}.forbidden-lands .character .spells .spell .rank{flex-basis:15%;text-align:center}.forbidden-lands .character .spells .spell .button{flex-basis:20%;font-size:var(--font-size-12);text-align:right}:root{--color-theme-text: #222020;--color-theme-background: #fff;--color-theme-contrast: var(--color-theme-gray-200);--color-theme-accent: #a00404;--color-theme-gray-200: #dddddd;--color-theme-gray-600: #707070;--color-theme-gray-800: #333333;--color-theme-alt-200: #ffb994;--color-theme-alt-600: #36b5a7;--color-theme-alt-800: #005d67;--color-theme-alt-900: #433a3f;--color-foreground: var(--color-theme-text);--color-background: var(--color-theme-background);--color-text-light-highlight: #f0f0e0;--color-text-light-heading: #c9c7b8;--color-text-light-primary: #b5b3a4;--color-text-dark-primary: var(--color-theme-text);--color-text-dark-secondary: #4b4a44;--color-text-dark-header: #23221d;--color-text-dark-inactive: #7a7971;--color-text-hyperlink: var(--color-theme-accent);--color-text-light-0: #fff;--color-text-light-1: #eee;--color-text-light-2: #ddd;--color-text-light-3: #ccc;--color-text-light-4: #bbb;--color-text-light-5: #aaa;--color-text-light-6: #999;--color-text-light-7: #888;--color-text-dark-1: var(--color-theme-text);--color-text-dark-2: #222;--color-text-dark-3: #444;--color-text-dark-4: #555;--color-text-dark-5: #666;--color-text-dark-6: #777;--color-border-light-1: #ddd;--color-border-light-2: #999;--color-border-dark-1: #111;--color-border-dark-2: #222;--color-border-dark-3: #333;--color-border-dark-4: #444;--color-border-dark-5: #666;--color-shadow-primary: var(--color-theme-alt-800);--color-shadow-highlight: var(--color-theme-alt-600);--color-shadow-dark: var(--color-theme-gray-800);--color-underline-inactive: #7a7971;--color-underline-active: var(--color-theme-accent);--color-underline-header: var(--color-theme-text);--color-border-light-highlight: #f0f0e0;--color-border-light-primary: #b5b3a4;--color-border-light-secondary: #c9c7b8;--color-border-light-tertiary: #7a7971;--color-border-dark: var(--color-theme-gray-800);--color-border-dark-primary: var(--color-theme-text);--color-border-dark-secondary: #23221d;--color-border-dark-tertiary: #4b4a44;--color-border-highlight: var(--color-theme-alt-600);--color-border-highlight-alt: var(--color-theme-alt-600);--color-bg-btn-minor-inactive: #c9c7b8;--color-bg-btn-minor-active: #b5b3a4;--sidebar-width: 300px;--sidebar-header-height: 32px;--sidebar-item-height: 48px;--hotbar-height: 52px;--hotbar-width: 578px;--macro-size: 50px;--players-width: 200px;--form-field-height: 26px;--font-header: "IM Fell DW Pica", serif;--font-header-sc: "IM Fell DW Pica SC", serif;--font-primary: Branding, Author, MavenPro, Ubuntu, sans-serif;--font-alternative: "IM Fell Great Primer", serif;--font-size-11: .6875rem;--font-size-12: .75rem;--font-size-13: .8125rem;--font-size-14: .875rem;--font-size-16: 1rem;--font-size-18: 1.125rem;--font-size-20: 1.25rem;--font-size-24: 1.5rem;--font-size-28: 1.75rem;--line-height-12: .75rem;--line-height-16: 1rem;--line-height-20: 1.25rem;--line-height-30: 1.875rem}html.dark{--color-theme-background: #222020;--color-theme-contrast: var(--color-theme-gray-800);--color-theme-text: #fff}html.dark #sidebar,html.dark #hotbar #hotbar-directory-controls,html.dark #hotbar #action-bar,html.dark #hotbar #hotbar-page-controls,html.dark #players,html.dark #controls ol .scene-control,html.dark #controls ol .control-tool,html.dark #controls ol .scene-control.active,html.dark #controls ol .control-tool.active,html.dark #navigation #nav-toggle,html.dark #navigation #scene-list .scene.view,html.dark .app.window-app{border-image-source:url(./assets/journal-art/box-border-large-dark.webp)}html.dark button{background:var(--color-theme-gray-800);color:var(--color-theme-gray-200)}html.dark input[type=text],html.dark input[type=number],html.dark input[type=password],html.dark input[type=date],html.dark input[type=time],html.dark input[type=search]{color:#111}html.dark .forbidden-lands input{color:var(--color-theme-text)}html.dark form .notes,html.dark form .hint{color:var(--color-theme-gray-200)}html.dark #chat-log .message{background:var(--color-theme-background)}html.dark .chat-message .message-header{color:var(--color-theme-text)}html.dark .journal-page-header h1,html.dark .journal-page-header h2,html.dark .journal-page-header h3{color:var(--color-theme-background);filter:invert(1)}html.dark .journal-sheet .journal-header:after{filter:invert(1)}html.dark .journal-sheet .journal-header .title{color:var(--color-theme-text)}html.dark .prosemirror menu .pm-dropdown{background:var(--color-theme-contrast)}button,form button,.dark button{background:var(--color-theme-gray-200);color:var(--color-theme-gray-800)}.window-app .window-content{background-image:none}.app.fbl.changelog .dialog-content{font-family:var(--font-editor);padding-inline:16px;line-height:165%}.app.fbl.changelog h1,.app.fbl.changelog h2,.app.fbl.changelog h3{font-family:var(--font-subheader);border:none}.app.fbl.changelog h1{text-align:center}.app.fbl.changelog ul{list-style-type:"\2725 "}.app.fbl.changelog code{background:var(--color-border-light-1);padding:.1em .2em;border-radius:.25em;display:block;user-select:all}.app.fbl.changelog details{margin-bottom:8px}.app.fbl.changelog details summary>i{transition:transform .2s ease-in-out}.app.fbl.changelog details[open] summary{margin-bottom:20px}.app.fbl.changelog details[open] summary>i{transform:rotate(90deg)}.app.fbl.changelog summary{display:flex;align-items:center;gap:8px}.app.fbl.changelog summary h2{margin:0}.app.fbl.changelog summary h2 span{font-size:var(--font-size-16)}.app.fbl.changelog summary::marker{content:none}.sheet.journal-entry .journal-entry-content{background:var(--color-background);border:unset;border-radius:unset}.sheet.journal-entry .journal-sidebar{color:var(--color-text-dark-primary)}.sheet.journal-entry .journal-sidebar .header-search input{background-color:#eeed}.sheet.journal-entry .pages-list .directory-item.active{background-color:var(--color-theme-constrast)}.sheet.journal-entry .pages-list .directory-item.active .page-heading{font-weight:600}.app.sheet .editor{min-height:55px;height:100%}.editor:focus .editor-edit,.editor:hover .editor-edit,.journal-entry-page.text:focus .edit-container .editor-edit,.journal-entry-page.text:hover .edit-container .editor-edit{background:#cccd;border:none;box-shadow:0 0 3px #1119;right:10px;width:24px;height:24px;display:grid;place-content:center;z-index:100}.editor:focus .editor-edit i,.editor:hover .editor-edit i,.journal-entry-page.text:focus .edit-container .editor-edit i,.journal-entry-page.text:hover .edit-container .editor-edit i{font-size:var(--font-size-16)}.journal-sheet .journal-header{margin:0 16px 16px}.journal-sheet .journal-header:before{content:"";background-image:url(./assets/journal-art/top_border.webp);background-size:contain;background-repeat:no-repeat;background-position:center;height:100px;display:block;margin-bottom:-16px}.journal-sheet .journal-header:after{content:"";background-image:url(./assets/journal-art/endstop.webp);background-size:contain;background-repeat:no-repeat;background-position:center;height:25px;display:block;margin-top:-6px}.journal-sheet .journal-header .title{border:none;font-family:IM Fell Three Line Pica;text-transform:uppercase;background:transparent;text-overflow:ellipsis}.fbl-book .journal-header{display:none}:where(.journal-entry-page,.editor-content) h1,:where(.journal-entry-page,.editor-content) h2,:where(.journal-entry-page,.editor-content) h3,:where(.journal-entry-page,.editor-content) h4,:where(.journal-entry-page,.editor-content) h5,:where(.journal-entry-page,.editor-content) h6{font-family:IM Fell Three Line Pica;text-transform:uppercase;text-indent:0px;text-align:center;border:unset}.journal-page-header h1,.journal-page-header h2,.journal-page-header h3{min-height:250px;width:min(100%,900px);margin-inline:auto;padding:20px 85px 0;display:flex;align-items:center;justify-content:center;border:1px solid transparent;border-image:url(./assets/journal-art/title-border.webp);border-image-slice:50%;border-image-width:100%;font-size:var(--font-size-32);text-transform:uppercase;text-align:center;line-height:1;text-overflow:ellipsis}:where(.journal-page-content,.editor-content){font-family:var(--font-editor);line-height:1.75;font-size:var(--font-size-16)}:where(.journal-page-content,.editor-content) img{display:block;margin-inline:auto}:where(.journal-page-content,.editor-content)[data-engine=tinymce]{margin-inline:12px}:where(.journal-page-content,.editor-content) ul{list-style-type:"\2725 ";margin-inline-start:.5rem}:where(.journal-page-content,.editor-content) ul li::marker{font-size:var(--font-size-14)}:where(.journal-page-content,.editor-content) table{background:transparent;font-size:var(--font-size-14);border:none}:where(.journal-page-content,.editor-content) table thead{background:transparent;color:var(--color-text-dark-primary);text-shadow:none;border:none;border-bottom:2px solid var(--color-border)}:where(.journal-page-content,.editor-content) table tr{border:none;border-bottom:1px solid var(--color-border);padding:.5rem}:where(.journal-page-content,.editor-content) table tr:nth-child(odd):not(:has(th)){background-color:#cbcccb}:where(.fbl-box){border-style:solid;border-image:url(./assets/journal-art/box-border-top-bottom.webp) 60 0 round;border-image-width:20px 0;font-family:var(--font-primary);line-height:135%;padding:25px 0;margin:1rem}:where(.fbl-box).info-right,:where(.fbl-box).fbl-journal-info-box{width:320px;float:right}:where(.fbl-box).info-left{width:320px;float:left}:where(.fbl-box) h3,:where(.fbl-box) h4{font-family:var(--font-primary);text-transform:unset;font-weight:600;font-size:var(--font-size-18);margin:0}:where(.fbl-box) table th{font-size:var(--font-size-14)}:where(.fbl-box) table td{text-align:center}:where(.fbl-box) .inline-heading{font-family:var(--font-primary)}.fbl-italic{font-style:italic}.fbl-italic.fbl-centered,.italic-intro{line-height:200%;margin:2rem 3rem;font-size:var(--font-size-18);font-weight:600}.fbl-example{margin:10px auto 0;font-family:IM Fell Three Line Pica;text-transform:uppercase;border-top:1px solid black;width:18%;padding-top:4px}.fbl-uppercase{font-style:normal;text-transform:uppercase;font-family:IM Fell DW Pica SC;font-size:var(--font-size-14)}.fbl-inline-heading{font-family:IM Fell Three Line Pica;font-weight:700;margin-top:4px}.fbl-branding-bold{font-size:.9rem;font-family:Branding,Ubuntu,sans-serif;font-weight:700;text-transform:uppercase}.fbl-skull{display:inline;font-family:skullz;line-height:0;text-transform:lowercase;font-style:normal;position:relative;top:5px;font-size:1.75rem}.fbl-swords{display:inline;font-family:Swordlings;font-style:normal;position:relative;left:1px;font-weight:600;line-height:0}.inline-table,.inline-scene{border:none;background:transparent;border-bottom:1px dotted grey;padding:0}.inline-table>i,.inline-scene>i{color:var(--color-text-dark-inactive);margin-right:.25em}.big-first-char{font-size:4.125rem;transform:translateY(-.2rem);font-style:normal;line-height:1;position:relative;margin-bottom:-2rem;float:left;margin-right:.5rem;margin-inline-start:1rem}p:has(span.big-first-char){padding-top:6rem}.big-first-char:before{content:url(./assets/journal-art/ravens/raven1.webp);position:absolute;display:inherit;transform:scale(.25) translate(-170%,-220%)}.big-first-char.r2:before{content:url(./assets/journal-art/ravens/raven2.webp);transform:scale(.22) translate(-200%,-259%)}p:has(span.big-first-char.r2){padding-top:5rem}.big-first-char.r3:before{content:url(./assets/journal-art/ravens/raven3.webp);transform:scale(.16) translate(-282%,-335%)}.big-first-char.r4:before{content:url(./assets/journal-art/ravens/raven4.webp);transform:scale(.2) translate(-234%,-263%)}p:has(span.big-first-char.r4){padding-top:3rem}p:has(span.big-first-char.r4) span.big-first-char.r4{margin-inline-start:1.8rem}.big-first-char.r6:before{content:url(./assets/journal-art/ravens/raven6.webp);transform:scale(.15) translate(-302%,-357%)}.big-first-char.r7:before{content:url(./assets/journal-art/ravens/raven7.webp);transform:scale(.22) translate(-200%,-210%)}p:has(span.big-first-char.r7){padding-top:2rem}.app .journal-sheet-container.adventure-site .journal-entry-page.text>*{margin-inline:auto}.app .journal-sheet-container.adventure-site .journal-entry-page.text h3{margin-top:1rem}.app .journal-sheet-container.adventure-site .journal-entry-page.text ul,.app .journal-sheet-container.adventure-site .journal-entry-page.text ol{margin-inline:0}.app .journal-sheet-container.adventure-site .journal-entry-page.text hr{width:100%}.app .journal-sheet-container.adventure-site .journal-entry-page.text em{font-family:Branding,Ubuntu,sans-serif;font-size:var(--font-size-16);color:#111c}.app .journal-sheet-container.adventure-site .journal-entry-page.text strong{font-family:Branding,Ubuntu,sans-serif;font-weight:600}.app .journal-sheet-container.adventure-site .journal-entry-page.text p+p{text-indent:0}.app .journal-sheet-container.adventure-site .journal-entry-page.text .description{display:flex;flex-direction:column;gap:.5rem}.app .journal-sheet-container.adventure-site .journal-entry-page.text .description strong{margin-right:.5ch}.app .journal-sheet-container.adventure-site .journal-entry-page.text .room{margin-block:1rem;width:100%;border:1px dotted rgba(17,17,17,.4);padding:1rem;border-radius:.5rem;position:relative}.app .journal-sheet-container.adventure-site .journal-entry-page.text .room:hover{background-color:#f0f0f0}.app .journal-sheet-container.adventure-site .journal-entry-page.text .room>.index-tip{font-family:Branding,Ubuntu,sans-serif;position:absolute;top:0;right:0;block-size:2.2rem;aspect-ratio:1/1;border-radius:0 .4rem 0 .5rem;background-color:#1119;color:#f0f0f0;display:grid;place-content:center;pointer-events:none}.app .journal-sheet-container.adventure-site .editable-tools{position:absolute;left:50%;transform:translate(-50%);bottom:10px;width:90%;display:grid;grid-template-columns:repeat(2,auto);place-content:center;gap:4rem}.app .journal-sheet-container.adventure-site .editable-tools>*{display:block;margin:0;min-width:14rem;width:auto;background:#fff;font-weight:600;border:1px solid transparent;border-image:url(/systems/forbidden-lands/assets/journal-art/box-border-large.webp) 28/7 repeat;border-image-outset:6;background-color:#fff;opacity:.5;transition:opacity .3s cubic-bezier(.39,.58,.57,1)}.app .journal-sheet-container.adventure-site .editable-tools:hover>*{opacity:1}.app .journal-sheet-container.adventure-site .editable-tools:hover>*:hover{box-shadow:none;filter:drop-shadow(0 0 2px #111)} +/*! + * RPG Awesome 0.0.2 by Daniela Howe, Ivan Montiel + * License - https://github.com/nagoshiashumari/Rpg-Awesome/blob/master/LICENSE.md + * (Font: SIL OFL 1.1, CSS: MIT License) + */ diff --git a/forbidden-lands.js b/forbidden-lands.js new file mode 100644 index 00000000..63d0926b --- /dev/null +++ b/forbidden-lands.js @@ -0,0 +1,39 @@ +"use strict";(()=>{var __getOwnPropNames=Object.getOwnPropertyNames;var __esm=(fn,res)=>function(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var define_GLOBALPATHS_default,init_define_GLOBALPATHS=__esm({""(){define_GLOBALPATHS_default=["systems/forbidden-lands/templates/components/sheet-config-modal.hbs","systems/forbidden-lands/templates/components/modifiers-component.hbs","systems/forbidden-lands/templates/components/item-chatcard.hbs","systems/forbidden-lands/templates/components/sheet-config.hbs","systems/forbidden-lands/templates/components/tables-config.hbs","systems/forbidden-lands/templates/system/combat/combat.hbs","systems/forbidden-lands/templates/actor/monster/monster-sheet.hbs","systems/forbidden-lands/templates/actor/stronghold/stronghold-sheet.hbs","systems/forbidden-lands/templates/actor/party/party-sheet.hbs","systems/forbidden-lands/templates/actor/_shared-template-tabs/gear-tab.hbs","systems/forbidden-lands/templates/actor/character/character-limited-sheet.hbs","systems/forbidden-lands/templates/actor/character/character-sheet.hbs","systems/forbidden-lands/templates/actor/character/npc-sheet.hbs","systems/forbidden-lands/templates/components/roll-engine/dialog.hbs","systems/forbidden-lands/templates/components/roll-engine/roll.hbs","systems/forbidden-lands/templates/components/roll-engine/tooltip.hbs","systems/forbidden-lands/templates/components/roll-engine/spell-dialog.hbs","systems/forbidden-lands/templates/components/roll-engine/infos.hbs","systems/forbidden-lands/templates/components/character-generator/list-component.hbs","systems/forbidden-lands/templates/components/character-generator/generator-sheet.hbs","systems/forbidden-lands/templates/journal/adventure-sites/adventure-site-sheet.hbs","systems/forbidden-lands/templates/item/talent/talent-sheet.hbs","systems/forbidden-lands/templates/item/armor/armor-sheet.hbs","systems/forbidden-lands/templates/item/armor/main-tab.hbs","systems/forbidden-lands/templates/item/building/building-sheet.hbs","systems/forbidden-lands/templates/item/raw-material/raw-material-sheet.hbs","systems/forbidden-lands/templates/item/hireling/hireling-sheet.hbs","systems/forbidden-lands/templates/item/critical-injury/critical-injury-sheet.hbs","systems/forbidden-lands/templates/item/weapon/weapon-sheet.hbs","systems/forbidden-lands/templates/item/weapon/main-tab.hbs","systems/forbidden-lands/templates/item/_shared-template-tabs/supply-tab.hbs","systems/forbidden-lands/templates/item/_shared-template-tabs/artifact-tab.hbs","systems/forbidden-lands/templates/item/spell/spell-sheet.hbs","systems/forbidden-lands/templates/item/monster-attack/monster-attack-sheet.hbs","systems/forbidden-lands/templates/item/gear/gear-sheet.hbs","systems/forbidden-lands/templates/item/gear/main-tab.hbs","systems/forbidden-lands/templates/actor/monster/sheet-tabs/combat-tab.hbs","systems/forbidden-lands/templates/actor/stronghold/sheet-tabs/hireling-tab.hbs","systems/forbidden-lands/templates/actor/stronghold/sheet-tabs/gear-tab.hbs","systems/forbidden-lands/templates/actor/stronghold/sheet-tabs/building-tab.hbs","systems/forbidden-lands/templates/actor/party/components/action-component.hbs","systems/forbidden-lands/templates/actor/party/components/member-component.hbs","systems/forbidden-lands/templates/actor/party/sheet-tabs/main-tab.hbs","systems/forbidden-lands/templates/actor/party/sheet-tabs/travel-tab.hbs","systems/forbidden-lands/templates/actor/character/sheet-tabs/talent-tab.hbs","systems/forbidden-lands/templates/actor/character/sheet-tabs/combat-tab.hbs","systems/forbidden-lands/templates/actor/character/sheet-tabs/bio-tab.hbs","systems/forbidden-lands/templates/actor/character/sheet-tabs/main-tab.hbs"]}});init_define_GLOBALPATHS();init_define_GLOBALPATHS();init_define_GLOBALPATHS();function localizeString(string){try{let localeString=CONFIG.fbl.i18n[string];return localeString||(localeString=string),game.i18n.localize(localeString)}catch{return string}}var ForbiddenLandsActor=class extends Actor{get actorProperties(){return this.system}get attributes(){return this.actorProperties.attribute}get conditions(){return this.actorProperties.condition}get consumables(){return this.actorProperties.consumable}get canAct(){return this.attributes?Object.entries(this.attributes).every(([key,attribute])=>attribute.value>0||attribute.max<=0||key==="empathy"):!1}get skills(){return this.actorProperties.skill}get willpower(){return this.actorProperties.bio?.willpower}get unlimitedPush(){return this.getFlag("forbidden-lands","unlimitedPush")??!1}getRollData(){return{alias:this.token?.name||this.name,actorId:this.id,actorType:this.type,canAct:this.canAct,sceneId:this.token?.parent.id,tokenId:this.token?.id,unlimitedPush:this.unlimitedPush}}getRollModifierOptions(...rollIdentifiers){if(!rollIdentifiers.length)return[];let itemModifiers=this.items.reduce((array,item)=>{let modifiers=item.getRollModifier(...rollIdentifiers);return modifiers?array.concat(modifiers):array},[]);return rollIdentifiers.includes("dodge")&&(itemModifiers.push({name:localizeString("ROLL.STANDING_DODGE"),value:-2,active:!0}),itemModifiers.push({name:localizeString("ROLL.DODGE_SLASH"),value:2})),itemModifiers}async createEmbeddedDocuments(embeddedName,data,options){let newData=deepClone(data);Array.isArray(newData)||(newData=[newData]);let inlineRoll=/\[\[([d\d+\-*]+)\]\]/i,createRoll=async([_match,group])=>(await new Roll(group).roll()).total;for await(let entity of newData)entity.system&&(entity.system=await Object.entries(entity.system).reduce(async(obj,[key,value])=>{if(typeof value=="string"&&value.match(inlineRoll)){let result=await createRoll(inlineRoll.exec(value));value=value.replace(inlineRoll,result)}return{...await obj,[key]:value}},{}),CONFIG.fbl.carriedItemTypes.includes(entity.type)&&(entity.flags["forbidden-lands"]={...entity.flags["forbidden-lands"],state:"carried"}));return super.createEmbeddedDocuments(embeddedName,newData,options)}static async create(data,options){if(!data.img)switch(data.type){case"party":data.img="systems/forbidden-lands/assets/fbl-sun.webp";break;default:data.img=`systems/forbidden-lands/assets/fbl-${data.type}.webp`;break}return super.create(data,options)}toggleCondition(conditionName){let statusEffect=CONFIG.statusEffects.find(it=>it.id===conditionName),currentEffect=Array.from(this.effects?.values()).find(it=>it.icon===statusEffect.icon);currentEffect?(this.system.condition[conditionName].value&&this.update({[`system.condition.${conditionName}.value`]:!1}),this.deleteEmbeddedDocuments("ActiveEffect",[currentEffect.id])):this.createEmbeddedDocuments("ActiveEffect",[{label:game.i18n.localize(statusEffect.label),icon:statusEffect.icon,changes:statusEffect.changes,id:this.uuid,statuses:statusEffect.statuses,flags:{core:{statusId:statusEffect.id}}}])}rest(){let activeConditions=Object.entries(this.conditions??{}).filter(([_2,value])=>value?.value),isBlocked=(...conditions)=>conditions.some(condition=>activeConditions.map(([key,_2])=>key).includes(condition)),data={attribute:{agility:{value:isBlocked("thirsty")?this.attributes.agility.value:this.attributes.agility.max},strength:{value:isBlocked("thirsty","cold","hungry")?this.attributes.strength.value:this.attributes.strength.max},wits:{value:isBlocked("thirsty","cold","sleepy")?this.attributes.wits.value:this.attributes.wits.max},empathy:{value:isBlocked("thirsty")?this.attributes.empathy.value:this.attributes.empathy.max}}};this.conditions?.sleepy.value&&this.toggleCondition("sleepy"),this.update({data});let sleepyIndex=activeConditions.map(([key,_2])=>key).indexOf("sleepy"),wasSleepy=sleepyIndex>-1;wasSleepy&&activeConditions.splice(sleepyIndex,1);let formatter=new Intl.ListFormat(game.i18n.lang,{style:"long"});ChatMessage.create({content:`

${this.name}

${localizeString("ACTION.REST")}

${wasSleepy?`

${this.name} ${localizeString("CONDITION.IS_NO_LONGER_SLEEPY")}.

`:""}${activeConditions.length?`

${this.name} ${localizeString("CONDITION.SUFFERING_FROM")} ${formatter.format(activeConditions.filter(([key,_2])=>key!=="sleepy").map(([_2,value])=>`${localizeString(value.label)}`))}.

`:""}
`,speaker:{actor:this},whisper:game.user.isGM?[game.user.id]:[]})}};init_define_GLOBALPATHS();var handlers={Actor:handleActorMacro,Item:handleItemMacro},itemHandlers={spell:handleSpellMacro,weapon:handleWeaponMacro,armor:handleWeaponMacro};function handleSpellMacro(actor,item){return{command:`game.actors.get("${actor.id}").sheet.rollSpell("${item._id}")`,img:item.img,name:item.name,type:"script"}}async function handleWeaponMacro(actor,item){let type=item.system.part==="shield"||item.system.category==="melee"?await Dialog.prompt({title:game.i18n.localize("MACRO.CHOOSE_TYPE"),content:` +
+

${game.i18n.localize("MACRO.CHOOSE_TYPE")}

+ + + ${item.system.part==="shield"?``:""} + ${item.system.category==="melee"?``:""} +
+ `,callback:html=>{let form=html.find("form")[0];return new FormData(form).get("type")},rejectClose:!0}):item.type==="armor"?"armor":"gear",command=type==="gear"?`game.actors.get("${actor.id}").sheet.rollGear("${item._id}")`:type==="armor"?`game.actors.get("${actor.id}").sheet.rollSpecificArmor("${item._id}")`:`game.actors.get("${actor.id}").sheet.rollAction("${type}","${item._id}")`,name=type==="gear"?item.name:`${item.name}: ${localizeString(type)}`;return{command,name,img:item.img,type:"script"}}async function handleActorMacro(data){let actor=game.actors.get(data.id),imgs=await actor.getTokenImages();return{command:`game.actors.get("${data.id}").sheet.render(true)`,img:imgs[0],name:actor.name,type:"script"}}async function handleItemMacro(data){let handler=itemHandlers[data.system.type];if(!handler)return{};let actor=game.actors.get(data.actorId),item=data.data;return handler(actor,item)}async function handleHotbarDrop(data,slot){let handler=handlers[data.type];if(!handler)return;let{command,img,name,type}=await handler(data);if(!name||!command)return;let macro=game.macros.contents.find(m=>m.name===name&&m.command===command);macro||(macro=await Macro.create({command,img,name,type})),game.user.assignHotbarMacro(macro,slot)}async function importMacros(){if(game.packs.get("world.forbidden-lands-macros"))return;let pack=await CompendiumCollection.createCompendium({name:"forbidden-lands-macros",label:game.i18n.localize("MACRO.COMPENDIUM_NAME"),type:"Macro",system:"forbidden-lands"}),localizedMacros=(await foundry.utils.fetchJsonWithTimeout("/systems/forbidden-lands/assets/datasets/macros/macros.json")).map(m=>({...m,name:game.i18n.localize(m.name)}));Macro.create(localizedMacros,{pack:pack.collection})}init_define_GLOBALPATHS();init_define_GLOBALPATHS();function semverComp(min,curr,max,opt={}){if(!min&&!max||!curr)throw new Error(`Missing Comparators. min ${min}; curr ${curr}; max ${max}`);return min=min&&coerceNum(min),curr=curr&&coerceNum(curr),max=max&&coerceNum(max),min&&max&&opt.eqMin&&opt.eqMax?min===curr&&curr===max:min&&opt.eqMin?min===curr:max&&opt.eqMax?max===curr:(min?opt.gEqMin?min=min<=curr:min=minparseInt(v2));if(array.some(v2=>Number.isNaN(v2))||array.length!==3)throw new Error(`Invalid SemVer string: ${string}`);return array[0]=array[0]*1e6,array[1]=array[1]*1e3,array.reduce((sum,val)=>sum+val,0)}async function displayMessages(){let{messages}=await fetch("systems/forbidden-lands/assets/messages/messages.jsonc").then(resp=>resp.text()).then(jsonc=>JSON.parse(stripJSON(jsonc)));for(let message of messages)handleDisplay(message)}var stripJSON=data=>data.replace(/[^:]\/\/(.*)/g,""),handleDisplay=msg=>{let{content,title,type}=msg;if(isCurrent(msg)){if(type==="prompt")return displayPrompt(title,content);if(type==="chat")return sendToChat(title,content)}},isCurrent=msg=>{let isDisplayable=!msg.display==="once"||!hasDisplayed(msg.title),correctCoreVersion=foundry.utils.isNewerVersion(msg["max-core-version"]??"100.0.0",game.version)&&foundry.utils.isNewerVersion(game.version,msg["min-core-version"]??"0.0.0"),correctSysVersion=semverComp(msg["min-sys-version"]??"0.0.0",game.system.version,msg["max-sys-version"]??"100.0.0",{gEqMin:!0});return isDisplayable&&correctCoreVersion&&correctSysVersion},hasDisplayed=identifier=>!!game.settings.get("forbidden-lands","messages")?.includes(identifier),displayPrompt=(title,content)=>(content=content.replace("{name}",game.user.name),Dialog.prompt({title,content,label:"Understood!",options:{width:450},callback:()=>setDisplayed(title)})),sendToChat=(title,content)=>(content=content.replace("{name}",game.user.name),setDisplayed(title),ChatMessage.create({title,content:`
${content}
`})),setDisplayed=async identifier=>{let settings=game.settings.get("forbidden-lands","messages");settings.push(identifier),await game.settings.set("forbidden-lands","messages",settings.flat())};init_define_GLOBALPATHS();function registerYZURLabels(){CONFIG.YZUR.Icons.getLabel=(type,result)=>`${result}`}var ForbiddenLandsD6=class extends Die{constructor(termData){termData.faces=6,super(termData)}static DENOMINATION=6;static getResultLabel(result){return`${result}`}};init_define_GLOBALPATHS();init_define_GLOBALPATHS();function safeParseJSON(json){try{return JSON.parse(json)}catch{return null}}init_define_GLOBALPATHS();var YearZeroDie=class _YearZeroDie extends Die{constructor(termData={}){termData.faces=termData.faces||6,super(termData),this.maxPush==null&&(this.maxPush=termData.maxPush??1)}get type(){return this.constructor.TYPE}get pushable(){if(this.pushCount>=this.maxPush)return!1;for(let r of this.results)if(!(!r.active||r.discarded)&&!this.constructor.LOCKED_VALUES.includes(r.result))return!0;return!1}get pushCount(){return this.results.reduce((c,r)=>Math.max(c,r.indexPush||0),0)}get pushed(){return this.pushCount>0}get isYearZeroDie(){return!0}get success(){if(!this._evaluated)return;let s=this.results.reduce((tot,r)=>r.active?r.count!==void 0?tot+r.count:this.constructor.SUCCESS_TABLE?tot+this.constructor.SUCCESS_TABLE[r.result]:tot+(r.result>=6?1:0):tot,0);return this.type==="neg"?-s:s}get failure(){if(this._evaluated)return this.results.reduce((tot,r)=>r.active?tot+(r.result<=1):tot,0)}roll(options={}){let roll=super.roll(options);return roll.indexResult=options.indexResult,roll.indexResult==null&&(roll.indexResult=1+this.results.reduce((c,r)=>{let i=r.indexResult;return i==null&&(i=-1),Math.max(c,i)},-1)),roll.indexPush=options.indexPush??this.pushCount,this.results[this.results.length-1]=roll,roll}count(n){return this.values.filter(v2=>v2===n).length}push(){if(!this.pushable)return this;let indexPush=this.pushCount+1,indexesResult=[];for(let r of this.results)!r.active||r.locked||(this.constructor.LOCKED_VALUES.includes(r.result)?r.hidden=!0:(r.active=!1,r.discarded=!0,r.pushed=!0,r.hidden=!0,indexesResult.push(r.indexResult)));for(let i=0;i=6,isMin=result.result===1&&!noMin.includes(this.type)}else isMax=result.result===this.faces,isMin=result.result===1;return[this.constructor.name.toLowerCase(),"d"+this.faces,hasSuccess?"success":null,hasFailure?"failure":null,result.rerolled?"rerolled":null,result.exploded?"exploded":null,result.discarded?"discarded":null,result.pushed?"pushed":null,!(hasSuccess||hasFailure)&&isMin?"min":null,!(hasSuccess||hasFailure)&&isMax?"max":null]}getTooltipData(){return{formula:this.expression,total:this.success,banes:this.failure,faces:this.faces,number:this.number,type:this.type,isYearZeroDie:this.isYearZeroDie,flavor:this.options.flavor??(CONFIG.YZUR?.Dice?.localizeDieTerms?game.i18n.localize(`YZUR.DIETERMS.${this.constructor.name}`):null),rolls:this.results.map(r=>({result:this.getResultLabel(r),classes:this.getResultCSS(r).filterJoin(" "),row:r.indexPush,col:r.indexResult}))}}};YearZeroDie.TYPE="blank";YearZeroDie.LOCKED_VALUES=[6];YearZeroDie.SERIALIZE_ATTRIBUTES.push("maxPush");YearZeroDie.MODIFIERS=foundry.utils.mergeObject({p:"setpush",np:"nopush"},Die.MODIFIERS);var BaseDie=class extends YearZeroDie{};BaseDie.TYPE="base";BaseDie.DENOMINATION="b";BaseDie.LOCKED_VALUES=[1,6];var SkillDie=class extends YearZeroDie{};SkillDie.TYPE="skill";SkillDie.DENOMINATION="s";var GearDie=class extends YearZeroDie{};GearDie.TYPE="gear";GearDie.DENOMINATION="g";GearDie.LOCKED_VALUES=[1,6];var NegativeDie=class extends SkillDie{};NegativeDie.TYPE="neg";NegativeDie.DENOMINATION="n";var StressDie=class extends YearZeroDie{};StressDie.TYPE="stress";StressDie.DENOMINATION="z";StressDie.LOCKED_VALUES=[1,6];var ArtifactDie=class extends SkillDie{getResultLabel(result){return CONFIG.YZUR.Icons.getLabel(`d${this.constructor.DENOMINATION}`,result.result)}};ArtifactDie.TYPE="arto";ArtifactDie.SUCCESS_TABLE=[null,0,0,0,0,0,1,1,2,2,3,3,4];ArtifactDie.LOCKED_VALUES=[6,7,8,9,10,11,12];var D8ArtifactDie=class extends ArtifactDie{constructor(termData={}){termData.faces=8,super(termData)}};D8ArtifactDie.DENOMINATION="8";var D10ArtifactDie=class extends ArtifactDie{constructor(termData={}){termData.faces=10,super(termData)}};D10ArtifactDie.DENOMINATION="10";var D12ArtifactDie=class extends ArtifactDie{constructor(termData={}){termData.faces=12,super(termData)}};D12ArtifactDie.DENOMINATION="12";var TwilightDie=class extends ArtifactDie{getResultLabel(result){return CONFIG.YZUR.Icons.getLabel("base",result.result)}};TwilightDie.TYPE="base";TwilightDie.SUCCESS_TABLE=[null,0,0,0,0,0,1,1,1,1,2,2,2];TwilightDie.LOCKED_VALUES=[1,6,7,8,9,10,11,12];var D6TwilightDie=class extends TwilightDie{constructor(termData={}){termData.faces=6,super(termData)}};D6TwilightDie.DENOMINATION="6";var D8TwilightDie=class extends TwilightDie{constructor(termData={}){termData.faces=8,super(termData)}};D8TwilightDie.DENOMINATION="8";var D10TwilightDie=class extends TwilightDie{constructor(termData={}){termData.faces=10,super(termData)}};D10TwilightDie.DENOMINATION="10";var D12TwilightDie=class extends TwilightDie{constructor(termData={}){termData.faces=12,super(termData)}};D12TwilightDie.DENOMINATION="12";var AmmoDie=class extends YearZeroDie{constructor(termData={}){termData.faces=6,super(termData)}};AmmoDie.TYPE="ammo";AmmoDie.DENOMINATION="m";AmmoDie.LOCKED_VALUES=[1,6];var LocationDie=class extends YearZeroDie{constructor(termData={}){termData.faces=6,super(termData)}get pushable(){return!1}roll(options){let roll=super.roll(options);return roll.count=0,this.results[this.results.length-1]=roll,roll}};LocationDie.TYPE="loc";LocationDie.DENOMINATION="l";LocationDie.LOCKED_VALUES=[1,2,3,4,5,6];var BladeRunnerDie=class extends ArtifactDie{getResultLabel(result){return CONFIG.YZUR.Icons.getLabel("base",result.result)}};BladeRunnerDie.TYPE="base";BladeRunnerDie.SUCCESS_TABLE=[null,0,0,0,0,0,1,1,1,1,2,2,2];BladeRunnerDie.LOCKED_VALUES=[1];var D6BladeRunnerDie=class extends BladeRunnerDie{constructor(termData={}){termData.faces=6,super(termData)}};D6BladeRunnerDie.DENOMINATION="6";D6BladeRunnerDie.LOCKED_VALUES=[1,6];var D8BladeRunnerDie=class extends BladeRunnerDie{constructor(termData={}){termData.faces=8,super(termData)}};D8BladeRunnerDie.DENOMINATION="8";D8BladeRunnerDie.LOCKED_VALUES=[1,6,7,8];var D10BladeRunnerDie=class extends BladeRunnerDie{constructor(termData={}){termData.faces=10,super(termData)}};D10BladeRunnerDie.DENOMINATION="10";D10BladeRunnerDie.LOCKED_VALUES=[1,10];var D12BladeRunnerDie=class extends BladeRunnerDie{constructor(termData={}){termData.faces=12,super(termData)}};D12BladeRunnerDie.DENOMINATION="12";D12BladeRunnerDie.LOCKED_VALUES=[1,10,11,12];var YZUR={game:"",Chat:{showInfos:!0,diceSorting:["base","skill","neg","gear","arto","loc","ammo"]},Roll:{chatTemplate:"templates/dice/roll.html",tooltipTemplate:"templates/dice/tooltip.html",infosTemplate:"templates/dice/infos.hbs"},Dice:{localizeDieTerms:!0,DIE_TYPES:["base","skill","neg","gear","stress","arto","ammo","loc"],DIE_TERMS:{base:BaseDie,skill:SkillDie,neg:NegativeDie,gear:GearDie,stress:StressDie,artoD8:D8ArtifactDie,artoD10:D10ArtifactDie,artoD12:D12ArtifactDie,a:D12TwilightDie,b:D10TwilightDie,c:D8TwilightDie,d:D6TwilightDie,ammo:AmmoDie,loc:LocationDie,brD12:D12BladeRunnerDie,brD10:D10BladeRunnerDie,brD8:D8BladeRunnerDie,brD6:D6BladeRunnerDie}},Icons:{getLabel:function(type,result){return["d8","d10","d12"].includes(type)&&(type="arto"),String(CONFIG.YZUR.Icons[CONFIG.YZUR.game][type][result])},myz:{base:{1:"\u2623",2:2,3:3,4:4,5:5,6:"\u2622"},skill:{1:1,2:2,3:3,4:4,5:5,6:"\u2622"},neg:{1:1,2:2,3:3,4:4,5:5,6:"\u2796"},gear:{1:"\u{1F4A5}",2:2,3:3,4:4,5:5,6:"\u2622"}},fbl:{base:{1:"\u2620",2:2,3:3,4:4,5:5,6:"\u2694\uFE0F"},skill:{1:1,2:2,3:3,4:4,5:5,6:"\u2694\uFE0F"},neg:{1:1,2:2,3:3,4:4,5:5,6:"\u2796"},gear:{1:"\u{1F4A5}",2:2,3:3,4:4,5:5,6:"\u2694\uFE0F"},arto:{1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12}},alien:{skill:{1:1,2:2,3:3,4:4,5:5,6:"\u{1F4A0}"},stress:{1:"\u{1F631}",2:2,3:3,4:4,5:5,6:"\u{1F4A0}"}},tales:{skill:{1:1,2:2,3:3,4:4,5:5,6:"\u269B\uFE0F"}},cor:{skill:{1:1,2:2,3:3,4:4,5:5,6:"\u{1F41E}"}},vae:{skill:{1:1,2:2,3:3,4:4,5:5,6:"\u{1F98B}"}},t2k:{base:{1:"\u{1F4A5}",2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12},ammo:{1:"\u{1F4A5}",2:2,3:3,4:4,5:5,6:"\u{1F3AF}"},loc:{1:"L",2:"T",3:"T",4:"T",5:"A",6:"H"}},br:{base:{1:"\u{1F984}",2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11,12:12}}}},GameTypeError2=class extends TypeError{constructor(msg){super(`Unknown game: "${msg}". Allowed games are: ${YearZeroRollManager.GAMES.join(", ")}.`),this.name="YZUR | GameType Error"}},DieTermError=class extends TypeError{constructor(msg){super(`Unknown die term: "${msg}". Allowed terms are: ${Object.keys(CONFIG.YZUR.Dice.DIE_TERMS).join(", ")}.`),this.name="YZUR | DieTerm Error"}},YearZeroRoll=class _YearZeroRoll extends Roll{constructor(formula,data={},options={}){options.name==null&&(options.name=data.name),options.game==null&&(options.game=data.game),options.maxPush==null&&(options.maxPush=data.maxPush),super(formula,data,options),this.game||(this.game=CONFIG.YZUR.game??"myz"),options.maxPush!=null&&(this.maxPush=options.maxPush)}get game(){return this.options.game}set game(yzGame){this.options.game=yzGame}get name(){return this.options.name}set name(str){this.options.name=str}set maxPush(n){this.options.maxPush=n;for(let t of this.terms)t instanceof YearZeroDie&&(t.maxPush=n)}get maxPush(){return this.terms.reduce((max,t)=>t instanceof YearZeroDie?Math.max(max,t.maxPush):max,null)}get size(){return this.terms.reduce((s,t)=>t instanceof YearZeroDie?s+t.number:s,0)}get pushCount(){return this.terms.reduce((c,t)=>Math.max(c,t.pushCount||0),0)}get pushed(){return this.pushCount>0}get pushable(){return this.pushCountt.pushable)}get successCount(){return this.terms.reduce((sc,t)=>sc+(t.success??0),0)}get baneCount(){let banableTypes=["base","gear","stress","ammo"],count=0;for(let bt of banableTypes)count+=this.count(bt,1);return count}get attributeTrauma(){return this.count("base",1)}get gearDamage(){return this.count("gear",1)}get stress(){return this.count("stress")}get panic(){return this.count("stress",1)}get mishap(){return!1}get ammoSpent(){let mt=this.getTerms("ammo");return mt.length?mt.reduce((tot,t)=>tot+t.values.reduce((a,b3)=>a+b3,0),0):0}get hitCount(){return this.count("ammo",6)}get jamCount(){let n=this.count("ammo",1);return n>0?n+this.attributeTrauma:0}get jammed(){return this.pushed?this.jamCount>=2:!1}get baseSuccessQty(){return this.successCount-this.hitCount}get hitLocations(){let lt=this.getTerms("loc");return lt.length?lt.reduce((tot,t)=>tot.concat(t.values),[]):[]}get bestHitLocation(){if(this.hitLocations.length)return Math.max(...this.hitLocations)}static create(formula,data={},options={}){return new _YearZeroRoll(formula,data,options)}static forge(dice=[],{title,yzGame=null,maxPush=1}={},options={}){if(yzGame=yzGame??options.game??CONFIG.YZUR?.game,!YearZeroRollManager.GAMES.includes(yzGame))throw new GameTypeError2(yzGame);if(!Array.isArray(dice)&&typeof dice=="object"&&!Object.keys(dice).includes("term")){let _dice=[];for(let[term,n]of Object.entries(dice)){if(n<=0)continue;let deno=CONFIG.YZUR.Dice.DIE_TERMS[term].DENOMINATION;deno=CONFIG.Dice.terms[deno].DENOMINATION,_dice.push({term:deno,number:n})}dice=_dice}Array.isArray(dice)||(dice=[dice]);let out=[];for(let d of dice)out.push(_YearZeroRoll._getTermFormulaFromBlok(d));let formula=out.join(" + ");_YearZeroRoll.validate(formula)||(formula=yzGame==="t2k"?"1d6":"1ds"),options.name==null&&(options.name=title),options.game==null&&(options.game=yzGame),options.maxPush==null&&(options.maxPush=maxPush);let roll=_YearZeroRoll.create(formula,{},options);return CONFIG.debug.dice,roll}static createFromDiceQuantities(dice={},{title,yzGame=null,maxPush=1,push=!1}={}){return _YearZeroRoll.forge(dice,{title,yzGame,maxPush})}static _getTermFormulaFromBlok(termBlok){let{term,number,flavor,maxPush}=termBlok;return _YearZeroRoll.generateTermFormula(number,term,flavor,maxPush)}static generateTermFormula(number,term,flavor="",maxPush=null){let f3=`${number}d${term}`;return typeof maxPush=="number"&&(f3+=`p${maxPush}`),flavor&&(f3+=`[${flavor}]`),f3}getTerms(search){return typeof search=="string"?this.terms.filter(t=>t.type===search):this.terms.filter(t=>{let f3=!0;if(search.type!=null&&(f3=f3&&search.type===t.type),search.number!=null&&(f3=f3&&search.number===t.number),search.faces!=null&&(f3=f3&&search.faces===t.faces),search.options)for(let key in search.options)f3=f3&&search.options[key]===t.options[key];if(search.results)for(let key in search.results)f3=f3&&t.results.some(r=>r[key]===search.results[key]);return f3})}count(type,seed=null,comparison="="){return this.terms.reduce((c,t)=>{if(t.type===type)if(t.results.length)for(let r of t.results)r.active&&(seed!=null?comparison===">"?r.result>seed&&c++:comparison===">="?r.result>=seed&&c++:comparison==="<"?r.result0;qty--)term.number++,this._evaluated&&(term.roll(),value!=null&&(term.results[term.results.length-1].result=value));else{let cls=CONFIG.YZUR.Dice.DIE_TERMS[type];term=new cls({number:qty,faces:range,maxPush:this.maxPush??1,options}),this._evaluated&&(await term.evaluate({async:!0}),value!=null&&term.results.forEach(r=>r.result=value)),this.terms.length>0&&this.terms.push(new OperatorTerm({operator:type==="neg"?"-":"+"})),this.terms.push(term)}return this._formula=this.constructor.getFormula(this.terms),this._evaluated&&(this._total=this._evaluateTotal()),this}removeDice(qty,search,{discard=!1,disable=!1}={}){if(!qty)return this;for(;qty>0;qty--){let term=this.getTerms(search)[0];if(term){if(term.number--,term.number<=0){let type=search.type??search,index=this.terms.findIndex(t=>t.type===type&&t.number===0);this.terms.splice(index,1),this.terms[index-1]?.operator&&this.terms.splice(index-1,1)}else if(this._evaluated){let index=term.results.findIndex(r=>r.active);if(index<0)break;discard||disable?(discard&&(term.results[index].discarded=discard),disable&&(term.results[index].active=!disable)):term.results.splice(index,1)}}else break}return this._formula=this.constructor.getFormula(this.terms),this._evaluated&&(this.terms.length?this._total=this._evaluateTotal():this._total=0),this}async push({async}={}){return this._evaluated||await this.evaluate({async}),this.pushable?(this.terms.forEach(t=>t instanceof YearZeroDie?t.push():t),this._evaluated=!1,await this.evaluate({async}),this):this}async modify(mod=0){if(mod)if(this.game==="t2k"||this.game==="br"){let diceMap=[null,6,8,10,12,1/0],typesMap=["d","d","c","b","a","a"],refactorRange=(range,n)=>diceMap[diceMap.indexOf(range)+n],getTypeFromRange=range=>typesMap[diceMap.indexOf(range)],_terms=this.getTerms("base"),dice=_terms.flatMap(t=>new Array(t.number).fill(t.faces));if(this.game==="br"){let lowest=Math.min(...dice);if(mod>0)dice.push(lowest);else if(mod<0){let i=dice.indexOf(lowest);dice.splice(i,1)}mod=0}else for(;mod!==0;){let i;if(mod>0?(dice.length<2?(i=1,dice.push(diceMap[1])):(i=dice.indexOf(Math.min(...dice)),dice[i]=refactorRange(dice[i],1)),mod--):(i=dice.indexOf(Math.max(...dice)),dice[i]=refactorRange(dice[i],-1),mod++),dice[i]===1/0)dice[i]=refactorRange(dice[i],-1);else if(dice[i]===null)dice.length>1?dice.splice(i,1):dice[i]=refactorRange(dice[i],1);else if(dice[i]===void 0)throw new Error(`YZUR | YearZeroRoll#modify | dice[${i}] is out of bounds (mod: ${mod})`)}this.removeDice(100,"base");let skilled=_terms.length>1&&dice.length>1;for(let index=0;index0&&this.count("neg")>0;)this.removeDice(1,"skill"),this.removeDice(1,"neg")}else{let skill=this.count("skill");mod<0&&(mod=Math.max(-skill+1,mod)),await this.addDice(mod,"skill")}else return this;if(this._evaluated)for(let t of this.terms)t._evaluated||await t.evaluate();return this}async getTooltip(){let parts=this.dice.map(d=>d.getTooltipData()).sort((a,b3)=>{let sorts=CONFIG?.YZUR?.Chat?.diceSorting||YZUR.Chat.diceSorting||[];if(!sorts.length)return 0;let at=sorts.indexOf(a.type),bt=sorts.indexOf(b3.type);return at-bt});if(this.pushed)for(let part of parts){let matrix=[],n=part.number,p2=this.pushCount;for(;p2>=0;p2--)matrix[p2]=new Array(n).fill(void 0);for(let r of part.rolls){let row=r.row||0,col=r.col||0;matrix[row][col]=r}part.rolls=matrix}return renderTemplate(this.constructor.TOOLTIP_TEMPLATE,{parts,pushed:this.pushed,pushCounts:this.pushed?[...Array(this.pushCount+1).keys()].sort((a,b3)=>b3-a):void 0,config:CONFIG.YZUR??{}})}async getRollInfos(template=null){template=template??CONFIG.YZUR?.Roll?.infosTemplate;let context={roll:this};return renderTemplate(template,context)}async render(chatOptions={}){CONFIG.debug.dice,chatOptions=foundry.utils.mergeObject({user:game.user.id,flavor:this.name,template:this.constructor.CHAT_TEMPLATE,blind:!1},chatOptions);let isPrivate=chatOptions.isPrivate;this._evaluated||await this.evaluate({async:!0});let chatData={formula:isPrivate?"???":this._formula,flavor:isPrivate?null:chatOptions.flavor,user:chatOptions.user,tooltip:isPrivate?"":await this.getTooltip(),total:isPrivate?"?":Math.round(this.total*100)/100,success:isPrivate?"?":this.successCount,showInfos:isPrivate?!1:CONFIG.YZUR?.Chat?.showInfos,infos:isPrivate?null:await this.getRollInfos(chatOptions.infosTemplate),pushable:isPrivate?!1:this.pushable,options:chatOptions,isPrivate,roll:this};return renderTemplate(chatOptions.template,chatData)}async toMessage(messageData={},{rollMode=null,create=!0}={}){return messageData=foundry.utils.mergeObject({user:game.user.id,speaker:ChatMessage.getSpeaker(),content:this.total,type:CONST.CHAT_MESSAGE_TYPES.ROLL},messageData),await super.toMessage(messageData,{rollMode,create})}duplicate(){return this.constructor.fromData(this.toJSON())}},YearZeroRollManager=class _YearZeroRollManager{constructor(){throw new SyntaxError(`YZUR | ${this.constructor.name} cannot be instanciated!`)}static register(yzGame,config,options={}){_YearZeroRollManager.registerConfig(config),_YearZeroRollManager._initialize(yzGame),_YearZeroRollManager.registerDice(yzGame,options?.index)}static registerConfig(config){CONFIG.YZUR=foundry.utils.mergeObject(YZUR,config)}static registerDice(yzGame,i){if(!yzGame||typeof yzGame!="string")throw new SyntaxError("YZUR | A game must be specified for the registration.");_YearZeroRollManager.GAMES.includes(yzGame)||_YearZeroRollManager.DIE_TERMS_MAP[yzGame]||(_YearZeroRollManager.DIE_TERMS_MAP[yzGame]=[]);let diceTypes=_YearZeroRollManager.DIE_TERMS_MAP[yzGame];for(let type of diceTypes)_YearZeroRollManager.registerDie(type);_YearZeroRollManager.registerRoll(void 0,i)}static registerRoll(cls=YearZeroRoll,i=0){CONFIG.Dice.rolls[i]=cls,CONFIG.Dice.rolls[i].CHAT_TEMPLATE=CONFIG.YZUR.Roll.chatTemplate,CONFIG.Dice.rolls[i].TOOLTIP_TEMPLATE=CONFIG.YZUR.Roll.tooltipTemplate,CONFIG.YZUR.Roll.index=i,i>0&&_YearZeroRollManager._overrideRollCreate(i)}static registerDie(term){let cls=CONFIG.YZUR.Dice.DIE_TERMS[term];if(!cls)throw new DieTermError(term);let deno=cls.DENOMINATION;if(!deno)throw new SyntaxError(`YZUR | Undefined DENOMINATION for "${cls.name}".`);let reg=CONFIG.Dice.terms[deno];CONFIG.Dice.terms[deno]=cls}static registerCustomDie(term,data){if(!_YearZeroRollManager.GAMES.includes(CONFIG.YZUR.game))throw new GameTypeError2("YZUR | Unregistered game. Please register a game before registering a custom die.");let cls=_YearZeroRollManager.createDieClass(data);CONFIG.YZUR.Dice.DIE_TERMS[term],CONFIG.YZUR.Dice.DIE_TERMS[term]=cls,_YearZeroRollManager.DIE_TERMS_MAP[CONFIG.YZUR.game].push(term),_YearZeroRollManager.registerDie(term)}static _initialize(yzGame){if(!CONFIG.YZUR)throw new ReferenceError("YZUR | CONFIG.YZUR does not exists!");CONFIG.YZUR.game,CONFIG.YZUR.game=yzGame}static _overrideRollCreate(index=1){Roll.prototype.constructor.create=function(formula,data={},options={}){let n=options.yzur??("game"in data||"maxPush"in data||"game"in options||"maxPush"in options||formula.match(/\d*d(:?[bsngzml]|6|8|10|12)/i))?index:0,cls=CONFIG.Dice.rolls[n];return new cls(formula,data,options)}}static createDieClass(data){if(!data||typeof data!="object")throw new SyntaxError("YZUR | To create a Die class, you must pass a DieClassData object!");let{name,denomination:deno,faces,type,lockedValues}=data;if(typeof faces!="number"||faces<=0)throw new DieTermError(`YZUR | Invalid die class faces "${faces}"`);let YearZeroCustomDie=class extends YearZeroDie{constructor(termData={}){termData.faces=faces,super(termData)}};if(!name|typeof name!="string")throw new DieTermError(`YZUR | Invalid die class name "${name}"`);if(Object.defineProperty(YearZeroCustomDie,"name",{value:name}),!deno||typeof deno!="string")throw new DieTermError(`YZUR | Invalid die class denomination "${deno}"`);if(YearZeroCustomDie.DENOMINATION=deno,type!=null){if(typeof type!="string")throw new DieTermError(`YZUR | Invalid die class type "${type}"`);CONFIG.YZUR.Dice.DIE_TYPES.includes(type),CONFIG.YZUR.Icons[CONFIG.YZUR.game][type],YearZeroCustomDie.TYPE=type}if(lockedValues!=null){if(!Array.isArray(lockedValues))throw new DieTermError(`YZUR | Invalid die class locked values "${lockedValues}" (Not an Array)`);for(let[i,v2]of lockedValues.entries())if(typeof v2!="number")throw new DieTermError(`YZUR | Invalid die class locked value "${v2}" at [${i}] (Not a Number)`);YearZeroCustomDie.LOCKED_VALUES=lockedValues}return YearZeroCustomDie}};YearZeroRollManager.DIE_TERMS_MAP={myz:["base","skill","gear","neg"],fbl:["base","skill","gear","neg","artoD8","artoD10","artoD12"],alien:["skill","stress"],tales:["skill"],cor:["skill"],vae:["skill"],t2k:["a","b","c","d","ammo","loc"],br:["brD12","brD10","brD8","brD6"]};YearZeroRollManager.GAMES;Object.defineProperty(YearZeroRollManager,"GAMES",{get:()=>Object.keys(YearZeroRollManager.DIE_TERMS_MAP)});var FBLRollHandler=class _FBLRollHandler extends FormApplication{#resolve=args=>args;#reject=args=>args;#promise=new Promise((resolve,reject)=>{this.#resolve=resolve,this.#reject=reject});constructor({attribute={label:localizeString("DICE.BASE"),value:0},skill={label:localizeString("DICE.SKILL"),value:0},gear={label:localizeString("DICE.GEAR"),value:0,artifactDie:""},spell={}},options={}){super({},options),this.base=attribute,this.skill=skill,this.gear=gear,this.damage=options.damage||gear.damage,this.artifact=gear?.artifactDie,this.gears=options.gears||[],this.modifier=options.modifiers?.reduce((sum,mod)=>mod.active?sum+Number(mod.value):sum,0)||0,this.spell={safecast:0,...spell}}get isAttack(){return!!this.damage}get spellDice(){let sum=this.base.value;return this.spell.psych&&++sum,this.spell.safecast&&(sum-=this.spell.safecast),sum<0&&(sum=0),sum}get powerLevel(){let sum;return sum=this.spellDice,this.spell.ingredient&&++sum,this.spell.safecast&&(sum+=this.spell.safecast),sum}get safecastMax(){return this.spell.psych||this.base.value>1?2:1}get mishapTable(){try{let tableId=game.settings.get("forbidden-lands","mishapTables")[this.options.mishapType];if(!game.tables.some(t=>t.id===tableId))throw new Error("Table not found.");return tableId}catch{return null}}static get defaultOptions(){return mergeObject(super.defaultOptions,{classes:["forbidden-lands"],width:"500",height:"auto",resizable:!0})}get template(){return this.options.template||"systems/forbidden-lands/templates/components/roll-engine/dialog.hbs"}getData(options={}){return{title:this.title,dice:{base:this.base,skill:this.skill,gear:this.gear},artifact:this.artifact,modifier:this.modifier,safecastMax:this.safecastMax,spellDice:this.spellDice,powerLevel:this.powerLevel,spell:this.spell,options}}static getSpeaker({actor,scene,token}){return scene&&token?game.scenes.get(scene)?.tokens.get(token)?.actor:game.actors.get(actor)}activateListeners(html){super.activateListeners(html),html.find("h2 > span[contenteditable]").blur(ev=>{let value=ev.currentTarget.textContent;this.options.title=value,html.parentsUntil("body").find(".window-title").text(value)});let totalModifierInput=html[0].querySelector("input#modifier"),totalGearInput=html[0].querySelector("input#gear"),artifactInput=html[0].querySelector("input#artifact");html.find("#base").focus(),html.find("input").focus(ev=>ev.currentTarget.select()),html.find(".inc-dec-btns").click(ev=>{let type=$(ev.currentTarget).data("type"),operator=$(ev.currentTarget).data("operator"),input=html.find(`#${type}`),value=parseInt(input.val(),10)||0;value+=operator==="plus"?1:-1,input.val(value>0?value:0)}),html.find("input.option").on("change",function(){let artifactRegex=/(\d*d(?:8|10|12))/gi,artifact=this.dataset.value.match(artifactRegex),modifier={value:this.dataset.value.match(/([+-]\d+(?!d)|^\d+$)/i),item:{id:this.dataset.id,name:this.dataset.name,gearBonus:safeParseJSON(this.dataset.gearBonus)}};if(artifact){let artifacts=artifactInput.value.match(artifactRegex)||[];this.checked?artifacts.push(artifact[0]):artifacts.splice(artifacts.indexOf(artifact[0]),1),artifactInput.value=artifacts.join("+")}if(modifier.value){let totalBonusInput=modifier.item.gearBonus?totalGearInput:totalModifierInput,currentValue=Number(totalBonusInput.value);this.checked?currentValue+=Number(modifier.value[0]):currentValue-=Number(modifier.value[0]),totalBonusInput.value=currentValue}}),html.find(".spend-willpower").on("click contextmenu",ev=>{if(foundry.utils.isEmpty(this.spell))return;let type=this.options.skulls?"contextmenu":"click",value=this.base.value;ev.type===type&&this.spell.willpower.value0&&(--this.spell.willpower.value,value++),this.base.value=value,this.render(!0)}),html.find(".spell-option").on("change",ev=>{let el=ev.currentTarget;switch(el.name){case"chance":this.spell.safecast=0;case"psych":case"ingredient":this.spell[el.name]=!!el.checked;break;case"safecast":{this.spell.safecast=Number(el.value);break}}!this.spell.psych&&this.spell.safecast===2&&(this.spell.safecast=1),this.render(!0)}),html.find("#cancel").click(()=>{this.close()})}async _updateObject(event,formData){this._validateForm(event,formData),this.options.type==="spell"?this._handleRollSpell(formData):this._handleYZRoll(formData)}_validateForm(event,formData){let isEmpty=Object.values(formData).every(value=>!value),invalidArtifactField=!this.constructor.isValidArtifact(formData.artifact);if(isEmpty)throw event.target.base.focus(),ui.notifications.warn("WARNING.NO_DICE_INPUT",{localize:!0}),new Error("No dice input");if(invalidArtifactField)throw event.target.artifact.focus(),ui.notifications.error("WARNING.INVALID_ARTIFACT",{localize:!0}),new Error("Invalid artifact string")}async _handleRollSpell({base,power}){this.b={term:"b",number:base,flavor:localizeString(this.base.label)},this.damage=power;let actor=_FBLRollHandler.getSpeaker({actor:this.options.actorId,scene:this.options.sceneId,token:this.options.tokenId}),subtractValue=this.spell.willpower.max+1-this.spell.willpower.value;await _FBLRollHandler.modifyWillpower(actor,subtractValue,"subtract");let result=await this.executeRoll();this.#resolve(result)}async _handleYZRoll({base,skill,gear,artifact,modifier,...modifierItems}){if(Object.values(modifierItems).some(item=>item)){let checkedItems=Object.entries(modifierItems).filter(item=>item[1]).map(item=>item.shift());gear=this._getModifierGear(checkedItems,gear)}this.b=base?[{term:"b",number:base,flavor:localizeString(this.base.label)}]:[],this.g=Array.isArray(gear)?gear:gear?[{term:"g",number:gear,flavor:this.gear.label}]:[],this.a=this.parseArtifacts(artifact,this.gear.label);let diff=skill+modifier;switch(!0){case diff<0:this.n=[{term:"n",number:Math.abs(diff),flavor:localizeString("DICE.NEGATIVE")}];break;default:this.s=diff?[{term:"s",number:diff,flavor:localizeString(this.skill.label)}]:[];break}this.handleRollArrows();let result=await this.executeRoll().catch(err=>{ui.notifications.error("ERROR.ROLL_FAILED",{localize:!0}),this.#reject(err)});this.#resolve(result)}_getModifierGear(modifierItemsArray,gear){let modifierGearArray=modifierItemsArray.filter(string=>string.startsWith("true")).map(string=>{let[_2,flavor,value]=string.split("_");return{term:"g",flavor,number:Number(value)}});this.gear.value&&modifierGearArray.unshift({term:"g",flavor:this.gear.label,number:this.gear.value});let modTotal=modifierGearArray.reduce((acc,{number})=>acc+Number(number),0);return Number(gear)-modTotal>0&&modifierGearArray.push({term:"g",flavor:localizeString("YZUR.DIETYPES.GearDie"),number:Number(gear)-modTotal}),modifierGearArray}#generateTerms(){return[this.b,this.s,this.n,this.g,this.a].filter(term=>!!term).flat()}parseArtifacts(string="",artifactName=""){return string.split(/[+, ]/).filter(term=>!!term&&term!=="0").reduce((array,artifact)=>{let[num,term]=artifact.split(/d/i);num=Number(num)||1;let existTermIndex=array.findIndex(termVal=>termVal[0]===term);return existTermIndex>-1?array[existTermIndex][1]+=num:array.push([term,num]),array},[]).map(([term,num])=>({term,number:num,flavor:artifactName}))}getRollOptions(){let maxPush=this.options.unlimitedPush?1e4:this.options.actorType==="monster"?"0":1;return{name:this.title,title:this.title,maxPush:this.options.maxPush||maxPush,type:this.options.type,actorId:this.options.actorId,actorType:this.options.actorType,alias:this.options.alias,attribute:this.base.name,chance:this.spell.chance,isAttack:this.isAttack,consumable:this.options.consumable,damage:this.damage,tokenId:this.options.tokenId,sceneId:this.options.sceneId,item:this.gear.name||this.gears.map(gear=>gear.name),itemId:this.gear.itemId||this.spell?.item?.id||this.gears.map(gear=>gear.id),willpower:this.options.willpower,mishapTable:this.mishapTable,mishapType:this.options.mishapType}}async handleRollArrows(){let isCharacter=this.options.actorType==="character",isRanged=this.gear.category==="ranged",hasArrows=this.gear.ammo==="arrows";if(!(isCharacter&&isRanged&&hasArrows))return;let actor=this.constructor.getSpeaker({actor:this.options.actorId,scene:this.options.sceneId,token:this.options.tokenId});return setTimeout(()=>actor.sheet.rollConsumable("arrows"),500)}async executeRoll(){let roll=FBLRoll.forge(this.#generateTerms(),{yzGame:this.options.yzGame,maxPush:this.options.maxPush,title:this.title},this.getRollOptions());return!roll.dice.length&&roll.type==="spell"?(roll._evaluated=!0,{roll,message:await roll.toMessage()}):(await roll.roll({async:!0}),{roll,message:await roll.toMessage()})}async close(options){await super.close(options),options||this.#reject(new Error("Roll cancelled"))}async render(force=!1,options={}){return await super.render(force,options),this.#promise}static isValidArtifact(input){let isEmpty=!input||"0",containsArtifactDice=!!input?.match(/(\d*d(?:8|10|12))/i),isDiceFormula=!input?.match(/[^\dd+, ]/i);return isEmpty||isDiceFormula&&containsArtifactDice}static async createRoll(data={},options={}){return new _FBLRollHandler(data,{...options,mishapType:options.type||data.title,title:localizeString(data.title)||"ACTION.GENERIC"}).render(!0)}static async pushRoll(msg){let roll=msg.roll;await roll.push({async:!0});let speaker=this.getSpeaker(msg.speaker);return speaker&&await this.updateActor(roll,speaker),roll.toMessage()}static async updateActor(roll,speaker){roll.options.characterDamage||(roll.options.characterDamage={gear:0,attribute:0}),roll.gearDamage&&await this.applyGearDamage(roll,speaker),roll.attributeTrauma&&await this.applyAttributDamage(roll,speaker),roll.options.characterDamage={gear:roll.gearDamage||0,attribute:roll.attributeTrauma||0}}static async applyAttributDamage({attributeTrauma,options:{attribute,characterDamage}},speaker){let{attribute:appliedDamage}=characterDamage,currentDamage=attributeTrauma-appliedDamage,value=speaker?.attributes[attribute]?.value;value&&(await this.modifyWillpower(speaker,currentDamage),value=Math.max(value-currentDamage,0),value===0&&ui.notifications.notify("NOTIFY.YOU_ARE_BROKEN",{localize:!0}),await speaker.update({[`system.attribute.${attribute}.value`]:value}))}static async applyGearDamage({gearDamageByName},speaker){let gear=speaker?.items.contents.sort((_2,b3)=>b3.state==="equipped"?1:-1),items=Object.keys(gearDamageByName).map(itemName=>gear.find(g2=>g2.name===itemName)).filter(e=>!!e);if(!items.length)return;let updatedItems=items.map(item=>{let value=Math.max(item.bonus-gearDamageByName[item.name],0);return value===0&&ui.notifications.notify("NOTIFY.YOUR_ITEM_BROKE",{localize:!0}),{_id:item.id,"system.bonus.value":value}});await speaker.updateEmbeddedDocuments("Item",updatedItems)}static async modifyWillpower(speaker,value,operation="add"){let willpower=speaker.willpower;if(willpower)return willpower=operation==="add"?Math.min(willpower.value+value,willpower.max):Math.max(willpower.value-value,0),await speaker.update({"data.bio.willpower.value":willpower})}static async decreaseConsumable(messageId){let{data:{speaker},roll:{options:{consumable}}}=game.messages.get(messageId);if(speaker=this.getSpeaker(speaker),!speaker)return;let currentValue=speaker?.consumables[consumable]?.value,newValue=Math.max(currentValue-1,0);return await speaker.update({[`data.consumable.${consumable}.value`]:newValue})}};YearZeroRollManager.registerRoll=(cls=FBLRoll,i=1)=>{CONFIG.Dice.rolls[i]=cls,CONFIG.Dice.rolls[i].CHAT_TEMPLATE=CONFIG.YZUR.ROLL.chatTemplate,CONFIG.Dice.rolls[i].TOOLTIP_TEMPLATE=CONFIG.YZUR.ROLL.tooltipTemplate,CONFIG.YZUR.ROLL.index=i};var FBLRoll=class extends YearZeroRoll{constructor(formula,data={},options={}){super(formula,data,options),this.type=options.type||"yz"}get isOwner(){return game.actors.get(this.options.actorId)?.isOwner||null}get damage(){let modifier=this.type==="spell"?0:-1;return(this.options.damage||0)+Math.max(this.successCount+modifier,0)}get gearDamageByName(){return this.getTerms("gear").reduce((obj,term)=>(obj[term.flavor]=term.failure,obj),{})}get mishapTable(){return this.options.mishapTable||null}get isMishap(){let spellMishap=this.options.mishapType==="spell"&&(this.baneCount>0||this.options.chance),mishap=this.options.mishapType!=="spell"&&this.options.mishapTable&&this.successCount===0;return spellMishap||mishap}get mishapType(){return this.options.mishapType||null}static create(formula,data={},options={}){return new this(formula,data,options)}static forge(dice=[],{title,yzGame=null,maxPush=1}={},options={}){if(yzGame=yzGame??options.game??CONFIG.YZUR?.game,!YearZeroRollManager.GAMES.includes(yzGame))throw new GameTypeError(yzGame);if(!Array.isArray(dice)&&typeof dice=="object"&&!Object.keys(dice).includes("term")){let _dice=[];for(let[term,n]of Object.entries(dice)){if(n<=0)continue;let deno=CONFIG.YZUR.Dice.DIE_TERMS[term].DENOMINATION;deno=CONFIG.Dice.terms[deno].DENOMINATION,_dice.push({term:deno,number:n})}dice=_dice}Array.isArray(dice)||(dice=[dice]);let out=[];for(let d of dice)out.push(YearZeroRoll._getTermFormulaFromBlok(d));let formula=out.join(" + ");if(!YearZeroRoll.validate(formula))throw ui.notifications.error("ERROR.INVALID_FORMULA",{localize:!0}),new Error(`Invalid roll formula: ${formula}`);options.name===void 0&&(options.name=title),options.game===void 0&&(options.game=yzGame),options.maxPush===void 0&&(options.maxPush=maxPush);let roll=this.create(formula,{},options);return CONFIG.debug.dice,roll}getRollInfos(template=null){template=template??CONFIG.YZUR?.ROLL?.infosTemplate;let context={roll:this,attributeLabel:localizeString(this.options.attribute),gears:Object.entries(this.gearDamageByName).map(gear=>({name:localizeString(gear[0]),value:gear[1]}))};return renderTemplate(template,context)}async toMessage(messageData={},{rollMode=null,create=!0}={}){let speaker={alias:this.options.alias,actor:this.options.actorId,token:this.options.tokenId,scene:this.options.sceneId};return messageData=foundry.utils.mergeObject({user:game.user.id,flavor:this.flavor,speaker,content:this.total,type:CONST.CHAT_MESSAGE_TYPES.ROLL},messageData),await super.toMessage(messageData,{rollMode,create})}};init_define_GLOBALPATHS();init_define_GLOBALPATHS();function objectSearch(object,string){if(!validateObject(object)||!validateString(string))return;let result=Object.entries(object).find(entries=>entries[1]===string);return result?result[0]:null}function validateObject(object){return!!object&&typeof object=="object"&&!foundry.utils.isEmpty(object)}function validateString(string){return!!string&&typeof string=="string"}var ForbiddenLandsItem=class extends Item{get ammo(){return this.itemProperties.ammo}get artifactDie(){return this.itemProperties.artifactBonus}get bonus(){return this.itemProperties.bonus?.value}get damage(){return this.itemProperties.damage}get category(){return this.itemProperties.category}get itemProperties(){return this.system}get isBroken(){return this.bonus<=0&&this.itemProperties.bonus.max>0}get parryPenalty(){return this.category==="melee"&&!this.itemProperties.features?.parrying?CONFIG.fbl.actionModifiers.parry:0}get range(){return this.itemProperties.range}get rollModifiers(){return this.itemProperties.rollModifiers}get state(){return this.getFlag("forbidden-lands","state")||""}getRollData(){return{ammo:this.ammo,artifactDie:this.artifactDie,value:this.bonus||0,category:this.category,damage:this.damage||0,isBroken:this.isBroken,itemId:this.id,label:this.name,name:this.name,range:this.range,type:this.type}}getRollModifier(...rollIdentifiers){if(foundry.utils.getType(this.rollModifiers)!=="Object")return;let modifiers=Object.values(this.rollModifiers).reduce((array,mod)=>{let match=rollIdentifiers.includes(objectSearch(CONFIG.fbl.i18n,mod.name)),state=this.getFlag("forbidden-lands","state"),isCarriedOrTalent=state==="equipped"||state==="carried"||!CONFIG.fbl.carriedItemTypes.includes(this.type);if(match&&isCarriedOrTalent){let value;mod.value.match(/\d*d(?:8|10|12)/i)?value=mod.value.replace(/^\+/,""):mod.gearBonus?value=Number(this.bonus):value=Number(mod.value),value&&array.push({name:this.name,value:typeof value=="number"?value.toFixed():value,id:this.id,type:this.type,gearBonus:mod.gearBonus,active:value<0})}return array},[]);return rollIdentifiers.includes("parry")&&rollIdentifiers.includes(this.id)&&(this.parryPenalty&&modifiers.push({name:localizeString("WEAPON.FEATURES.PARRYING"),value:this.parryPenalty,active:!0}),this.itemProperties.features?.shield?modifiers.push({name:localizeString("ROLL.PARRY_NON_SLASH"),value:2}):(modifiers.push({name:localizeString("ROLL.PARRY_STAB"),value:-2}),modifiers.push({name:localizeString("ROLL.PARRY_PUNCH"),value:2}))),modifiers}async sendToChat(){let itemData=this.toObject();itemData.img.includes("/mystery-man")&&(itemData.img=null),CONFIG.fbl.itemTypes.includes(itemData.type)&&(itemData[`is${itemData.type.capitalize()}`]=!0),itemData.showField={};for(let field of["Appearance","Description","Drawback","Effect"])itemData.system[field.toLowerCase()]&&!this.getFlag("forbidden-lands",field)&&(itemData.showField[field.toLowerCase()]=!0);itemData.hasRollModifiers=itemData.system.rollModifiers&&Object.values(itemData.system.rollModifiers).filter(mod=>!mod.gearBonus).length>0;let html=await renderTemplate("systems/forbidden-lands/templates/components/item-chatcard.hbs",itemData),chatData={user:game.userId,rollMode:game.settings.get("core","rollMode"),content:html};["gmroll","blindroll"].includes(chatData.rollMode)?chatData.whisper=ChatMessage.getWhisperRecipients("GM"):chatData.rollMode==="selfroll"&&(chatData.whisper=[game.user]);let message=await ChatMessage.create(chatData);if(itemData.isCriticalInjury){let content=$(message.data.content),limit=content.find("[data-type='limit']").text().trim(),healingTime=content.find("[data-type='healtime']").text().trim();itemData.system.limit=limit,itemData.system.healingTime=healingTime}await message.setFlag("forbidden-lands","itemData",itemData)}static async create(data,options){if(!data.img)switch(data.type){case"building":data.img="icons/svg/castle.svg";break}return super.create(data,options)}};init_define_GLOBALPATHS();var ALL_TABLES={},getTables=async(path,fileName)=>(fileName=fileName.replace("_rooms",""),await fetch(`modules/${path}/manifests/${fileName}.json`).then(res=>res.json()).catch(err=>{throw ui.notifications.error("Error fetching tables."),new Error(`Error fetching tables: ${err}`)})),getNumber=string=>{switch(!0){case/one/i.test(string):return 1;case/two/i.test(string):return 2;case/three/i.test(string):return 3;case/four/i.test(string):return 4;case/five/i.test(string):return 5;default:return 0}},cheapRoll=roll=>{let[dice,sides,modifier]=roll.split(/d|\+/i);dice=parseInt(dice)||1,sides=parseInt(sides)||6,modifier=modifier?parseInt(modifier):0;let result=0;for(let i=0;i<=dice;i++)result+=Math.floor(Math.random()*sides)+1;return result+modifier},inlineRolls=text=>{let regex=/\[\[(.*?)\]\]/g;return text.replace(regex,(_2,match)=>cheapRoll(match))},parseReRolls=result=>{for(let value of Object.values(result))if(typeof value=="string"){let parsedResults=value.split(":");if(parsedResults[0]==="reroll")return parseInt(parsedResults[1])}return 0},parseStrings=result=>Object.entries(result).reduce((obj,[key,value])=>{if(typeof value=="string"){let randomizedString=string=>{let array=string.split("|").map(entry=>entry.split(":")).reduce((arr,[num,entry])=>{for(let i=0;irandomizedString(p1))}else obj[key]=value;return obj},{}),parseRollStrings=results=>{let parsedResults=results.split(":");return parsedResults.length===3?rollOnTable(ALL_TABLES[parsedResults[2]],fns("all_results"),parseInt(parsedResults[1])):[]},fns=type=>{let types={all_results:results=>results.map(result=>parseStrings(result)),some_results:(results,variable="None")=>results.filter(result=>!Object.values(result).some(value=>typeof value=="string"&&value.match(variable))),hybrid:results=>Math.random()<1/results.length?[results[0]]:[results.reduce((obj,cur,i)=>(cur=Object.entries(cur),obj[cur[i][0]]=cur[i][1],obj),{})],inn_name_string:results=>Math.random()>.5?[{the_name_of_the_inn:`The ${results[0].first_word} ${results[1].second_word}`}]:[{the_name_of_the_inn:`The ${results[0].second_word} & ${results[0].second_word}`}]};return types[type]??types.all_results},getRolledData=adventureSite=>{let tablesToRoll=CONFIG.fbl.adventureSites.tables[adventureSite],results={};for(let{name:tableName,type,roll}of tablesToRoll){let rollCount=roll??1,table=ALL_TABLES[tableName],result=rollOnTable(table,fns(type),rollCount);results[tableName]=result,ALL_TABLES[`${tableName}_description`]&&(results[`${tableName}_description`]=ALL_TABLES[`${tableName}_description`])}return results},rollOnTable=(table,fn,count=1,modifier=0)=>{let results=[];for(let i=0;iacc+cur.weight,0)+modifier+1);for(let result of table)if(resultCount+=result.weight,dieRoll<=resultCount){let rerolls=parseReRolls(result);count+=rerolls,rerolls===0&&results.push(result);break}}return fn(results,table)},moldData=(data,type)=>(CONFIG.fbl.adventureSites?.transformers?.[type]??((d,_2)=>d))(data,ALL_TABLES),init=async(path,adventureSite)=>{if(!Object.keys(CONFIG.fbl.adventureSites.types).includes(adventureSite.replace("_rooms","")))return"";ALL_TABLES=await getTables(path,adventureSite);let data=getRolledData(adventureSite);data=moldData(data,adventureSite);let html=await renderTemplate(`modules/${path}/templates/${adventureSite}.hbs`,data);return inlineRolls(html)},utilities={inlineRolls,parseRollStrings,parseStrings,parseReRolls,rollOnTable,getRolledData,getNumber,cheapRoll,fns};init_define_GLOBALPATHS();var ForbiddenLandsJournalEntry=class extends JournalEntry{static async create(data,options){if(!data.type||data.type==="base")return super.create(data,options);data.flags={"forbidden-lands":{type:data.type}};let path=CONFIG.fbl.adventureSites?.types[data.type],content=await CONFIG.fbl.adventureSites?.generate(path,data.type);return data.pages=[{name:"Overview",title:{show:!1},text:{content}}],super.create(data,options)}get type(){let type=this.getFlag("forbidden-lands","type");return type||CONST.BASE_DOCUMENT_TYPE}static async createDialog(data={},{parentFolder=null,pack=null,...options}={}){let documentName=this.metadata.name,types=game.documentTypes[documentName],folders=[];parentFolder||(pack?folders=game.packs.get(pack).folders.contents:folders=game.folders.filter(f3=>f3.type===documentName&&f3.displayed));let label=game.i18n.localize(this.metadata.label),title=game.i18n.format("DOCUMENT.Create",{type:label}),html=await renderTemplate("templates/sidebar/document-create.html",{folders,name:data.name||game.i18n.format("DOCUMENT.New",{type:label}),folder:data.folder,hasFolders:folders.length>=1,type:data.type||CONFIG[documentName]?.defaultType||types[0],types:types.reduce((obj,t)=>{let typeLabel=CONFIG[documentName]?.typeLabels?.[t]??t;return obj[t]=game.i18n.has(typeLabel)?game.i18n.localize(typeLabel):t,obj},{}),hasTypes:types.length>1});return Dialog.prompt({title,content:html,label:title,callback:JQhtml=>{let form=JQhtml[0].querySelector("form"),fd=new FormDataExtended(form);return foundry.utils.mergeObject(data,fd.object,{inplace:!0}),data.folder||(data.folder=void 0),types.length===1&&(data.type=types[0]),data.name?.trim()||(data.name=this.defaultName()),this.create(data,{parent:parentFolder,pack,renderSheet:!0})},rejectClose:!1,options})}};init_define_GLOBALPATHS();var FBL={actionSkillMap:{slash:"melee",stab:"melee",unarmed:"melee",grapple:"melee","break-free":"melee",melee:"melee",ranged:"marksmanship",shoot:"marksmanship",persuade:"manipulation",taunt:"performance",flee:"move",heal:"heal",dodge:"move",parry:"melee",shove:"melee",disarm:"melee",run:"move",retreat:"move","grapple-attack":"melee","travel-forced-march":"endurance","travel-hike-in-darkness":"scouting","travel-navigate":"survival","travel-keep-watch":"scouting","travel-find-good-place":"survival","travel-find-food":"survival","travel-find-prey":"survival","travel-kill-prey":"survival","travel-catch-fish":"survival","travel-make-camp":"survival"},actionModifiers:{parry:-2},adventureSites:{tables:{},transformers:{},types:{},utilities:{},generate:async(_path,_type)=>{}},attributes:["agility","empathy","strength","wits"],carriedStates:["equipped","carried"],carriedItemTypes:["armor","gear","rawMaterial","weapon"],characterSubtype:{pc:"ACTOR.SUBTYPE.PC",npc:"ACTOR.SUBTYPE.NPC"},consumableDice:{1:"1db",2:"1d8",3:"1d10",4:"1d12"},conditions:["cold","hungry","sleepy","thirsty"],dataSetConfig:{en:"dataset","pt-BR":"dataset-pt-br",es:"dataset-es",fr:"dataset-fr",de:"dataset-de"},encumbrance:{tiny:0,none:0,light:.5,regular:1,heavy:2,3:3,4:4,5:5,6:6,7:7,8:8},enrichedActorFields:["note","pride","face","body","clothing","darkSecret"],enrichedItemFields:["description","effect","drawback","appearance","tools","features.others"],i18n:{armor:"ITEM.TypeArmor",gear:"ITEM.TypeGear",weapon:"ITEM.TypeWeapon",rawMaterial:"ITEM.TypeRawmaterial",talent:"ITEM.TypeTalent",spell:"ITEM.TypeSpell",monsterAttack:"ITEM.TypeMonsterattack",criticalInjury:"ITEM.TypeCriticalinjury",building:"ITEM.TypeBuilding",hireling:"ITEM.TypeHireling",agility:"ATTRIBUTE.AGILITY",empathy:"ATTRIBUTE.EMPATHY",strength:"ATTRIBUTE.STRENGTH",wits:"ATTRIBUTE.WITS","animal-handling":"SKILL.ANIMAL_HANDLING",crafting:"SKILL.CRAFTING",endurance:"SKILL.ENDURANCE",healing:"SKILL.HEALING",insight:"SKILL.INSIGHT",lore:"SKILL.LORE",manipulation:"SKILL.MANIPULATION",marksmanship:"SKILL.MARKSMANSHIP",melee:"SKILL.MELEE",might:"SKILL.MIGHT",move:"SKILL.MOVE",performance:"SKILL.PERFORMANCE",scouting:"SKILL.SCOUTING","sleight-of-hand":"SKILL.SLEIGHT_OF_HAND",stealth:"SKILL.STEALTH",survival:"SKILL.SURVIVAL",slash:"ACTION.SLASH",stab:"ACTION.STAB",unarmed:"ACTION.UNARMED_STRIKE",grapple:"ACTION.GRAPPLE","break-free":"ACTION.BREAK_FREE",ranged:"WEAPON.RANGED",shoot:"ACTION.SHOOT",persuade:"ACTION.PERSUADE",taunt:"ACTION.TAUNT",flee:"ACTION.FLEE",heal:"ACTION.HEAL",dodge:"ACTION.DODGE",parry:"ACTION.PARRY",shove:"ACTION.SHOVE",disarm:"ACTION.DISARM",run:"ACTION.RUN",retreat:"ACTION.RETREAT","grapple-attack":"ACTION.GRAPPLE_ATTACK",spells:"MAGIC.SPELLS",activatedTalents:"TALENT.ANY_ACTIVATED","travel-forced-march":"FLPS.TRAVEL_ROLL.FORCED_MARCH","travel-navigate":"FLPS.TRAVEL_ROLL.NAVIGATE","travel-keep-watch":"FLPS.TRAVEL_ROLL.KEEP_WATCH","travel-find-good-place":"FLPS.TRAVEL_ROLL.FIND_GOOD_PLACE","travel-find-food":"FLPS.TRAVEL_ROLL.FIND_FOOD","travel-find-prey":"FLPS.TRAVEL_ROLL.FIND_PREY","travel-hike-in-darkness":"FLPS.TRAVEL_ROLL.HIKE_IN_DARKNESS","travel-kill-prey":"FLPS.TRAVEL_ROLL.KILL_PREY","travel-catch-fish":"FLPS.TRAVEL_ROLL.CATCH_FISH","travel-make-camp":"FLPS.TRAVEL_ROLL.MAKE_CAMP",carryingCapacity:"CARRYING_CAPACITY","dark-forest":"BIOME.DARK_FOREST",forest:"BIOME.FOREST",hills:"BIOME.HILLS",lake:"BIOME.LAKE",marshlands:"BIOME.MARSHLANDS",mountains:"BIOME.MOUNTAINS",plains:"BIOME.PLAINS",quagmire:"BIOME.QUAGMIRE",ruins:"BIOME.RUINS","beneath-the-ice":"BIOME.BENEATH_THE_ICE","ice-cap":"BIOME.ICE_CAP","ice-forest":"BIOME.ICE_FOREST","sea-ice":"BIOME.SEA_ICE",tundra:"BIOME.TUNDRA","crimson-forest":"BIOME.CRIMSON_FOREST",ashlands:"BIOME.ASHLANDS",ocean:"BIOME.OCEAN",firelands:"BIOME.FIRELANDS"},itemTypes:["armor","building","criticalInjury","gear","hireling","monsterAttack","rawMaterial","spell","talent","weapon"],maxInit:10,mishapTables:["travel-make-camp","travel-catch-fish","travel-find-food","travel-find-prey","travel-navigate","spell"],encounterTables:["dark-forest","forest","hills","lake","marshlands","mountains","plains","quagmire","ruins","beneath-the-ice","ice-cap","ice-forest","sea-ice","tundra","ocean","firelands","crimson-forest","ashlands"],otherTables:["travel-find-prey"],prideDice:"1d12",skillAttributeMap:{"animal-handling":"empathy",crafting:"strength",endurance:"strength",healing:"empathy",insight:"wits",lore:"wits",manipulation:"empathy",marksmanship:"agility",melee:"strength",might:"strength",move:"agility",performance:"empathy",scouting:"wits","sleight-of-hand":"agility",stealth:"agility",survival:"wits"},statusEffects:[{id:"sleepy",icon:"icons/svg/sleep.svg",label:"CONDITION.SLEEPY",changes:[{key:"system.condition.sleepy.value",mode:5,value:!0}],statuses:["sleepy"]},{id:"thirsty",icon:"icons/svg/tankard.svg",label:"CONDITION.THIRSTY",changes:[{key:"system.condition.thirsty.value",mode:5,value:!0}],statuses:["thirsty"]},{id:"hungry",icon:"icons/svg/sun.svg",label:"CONDITION.HUNGRY",changes:[{key:"system.condition.hungry.value",mode:5,value:!0}],statuses:["hungry"]},{id:"cold",icon:"icons/svg/frozen.svg",label:"CONDITION.COLD",changes:[{key:"system.condition.cold.value",mode:5,value:!0}],statuses:["cold"]}],weaponFeatures:["blunt","edged","hook","parrying","shield","pointed","slowReload"]},modifyConfig=()=>{let settings=["maxInit"];for(let setting of settings){let value=game.settings.get("forbidden-lands",setting);value&&(FBL[setting]=value)}},config_default=FBL;init_define_GLOBALPATHS();function initializeEditorEnrichers(){CONFIG.TextEditor.enrichers=CONFIG.TextEditor.enrichers.concat([{pattern:/\$big\[(.+?)\]/gim,enricher:async match=>{let doc=document.createElement("span");return doc.className="big-first-char",doc.innerHTML=match[1],doc}},{pattern:/\[(x)\]/gim,enricher:async match=>{let doc=document.createElement("span");return doc.className="fbl-swords",doc.innerHTML=match[1],doc}},{pattern:/\[(l)\]/gim,enricher:async match=>{let doc=document.createElement("span");return doc.className="fbl-skull",doc.innerHTML=match[1],doc}},{pattern:/\$branded\[(.+?)\]/gim,enricher:async match=>{let doc=document.createElement("span");return doc.className="fbl-branding-bold",doc.innerHTML=match[1],doc}},{pattern:/\$capital\[(.+?)\]/gim,enricher:async match=>{let doc=document.createElement("span");return doc.className="fbl-uppercase",doc.innerHTML=match[1],doc}},{pattern:/\$example\[(.+?)\]/gim,enricher:async match=>{let doc=document.createElement("span");return doc.className="fbl-example",doc.innerHTML=match[1],doc}},{pattern:/\$iheading\[(.+?)\]/gim,enricher:async match=>{let doc=document.createElement("span");return doc.className="fbl-uppercase fbl-inline-heading",doc.innerHTML=match[1],doc}},{pattern:/@Draw\[(.+?)\]/gim,enricher:async match=>{let table=game.tables.get(match[1])??game.tables.getName(match[1]),html=table?`${table.name} + `:`${match[1]}`;return $(html)[0]}},{pattern:/@ToggleScene\[(.+?)\]/gim,enricher:async match=>{let scene=game.scenes.get(match[1])??game.scenes.getName(match[1]),html=scene?`${scene.name} + `:`${match[1]}`;return $(html)[0]}},{pattern:fblrRegEx,enricher:fblrEnricher}]),document.querySelector("body").addEventListener("click",async event=>{if(event.target.closest(".fblroll"))return event.preventDefault(),event.stopPropagation(),fblrListener(event)})}var fblrRegEx=/\[\[\/fblr (?:(\d+)db\s?)?(?:(\d+)ds\s?)?(?:(\d+)dg\s?)?(?:1d(6|8|10|12)\s?)?(?:([+|-]\d+)\s?)?(\d)?\]\](?:{([^}]+)})?/gi;function fblrEnricher(match){let span=document.createElement("span");span.classList.add("fas"),span.classList.add("fa-dice-d20");let button=document.createElement("button");return button.type="button",button.classList.add("fblroll"),button.classList.add("roll"),button.classList.add("inline-roll"),button.dataset.fblBase=match[1]||1,button.dataset.fblSkill=match[2]||0,button.dataset.fblGear=match[3]||0,button.dataset.fblArtifact=match[4]||"",button.dataset.fblModifier=match[5]||"",button.dataset.fblDamage=match[6]||"",button.innerHTML=match[7]||localizeString("ACTION.GENERIC"),button.prepend(span),button}function fblrListener(event){let button=event.target,data={attribute:{label:"DICE.BASE",value:button.dataset.fblBase},skill:{label:"DICE.SKILL",value:button.dataset.fblSkill},gear:{label:"DICE.GEAR",value:button.dataset.fblGear,artifactDie:button.dataset.fblArtifact?`1d${button.dataset.fblArtifact}`:"",damage:Number(button.dataset.fblDamage)}},options={};return button.dataset.fblModifier&&(options.modifiers=[{name:localizeString("DICE.MODIFIER"),value:button.dataset.fblModifier,active:!0}]),game.fbl.roll(data,options).catch(error=>{})}init_define_GLOBALPATHS();function registerFonts(){CONFIG.fontDefinitions.Author={editor:!0,fonts:[{urls:["systems/forbidden-lands/fonts/author-semibold.otf"],weight:600},{urls:["systems/forbidden-lands/fonts/author-semibold-italic.otf"],weight:600,style:"italic"},{urls:["systems/forbidden-lands/fonts/author-medium.otf"]},{urls:["systems/forbidden-lands/fonts/author-medium-italic.otf"],style:"italic"}]},CONFIG.fontDefinitions["IM Fell Great Primer"]={editor:!0,fonts:[{urls:["systems/forbidden-lands/fonts/imfe-gprm.otf"]},{urls:["systems/forbidden-lands/fonts/imfe-gpit.otf"],style:"italic"}]}}init_define_GLOBALPATHS();async function FoundryOverrides(){return new Promise(resolve=>resolve())}init_define_GLOBALPATHS();function preloadHandlebarsTemplates(){let templatePaths=define_GLOBALPATHS_default;return loadTemplates(templatePaths)}function registerHandlebarsHelpers(){Handlebars.registerHelper("skulls",function(current,max,block){let acc="";for(let i=0;i=current,acc+=block.fn(this);return acc}),Handlebars.registerHelper("flps_enrich",content=>(content=TextEditor.enrichHTML(content,{documents:!0,async:!1}),new Handlebars.SafeString(content))),Handlebars.registerHelper("flps_capitalize",value=>typeof value=="string"&&value.length>0?value[0].toUpperCase()+value.slice(1):value),Handlebars.registerHelper("flps_strconcat",(...args)=>(args.pop(),args.join(""))),Handlebars.registerHelper("damageType",type=>{switch(type=normalize(type,"blunt"),type){case"blunt":return game.i18n.localize("ATTACK.BLUNT");case"fear":return game.i18n.localize("ATTACK.FEAR");case"slash":return game.i18n.localize("ATTACK.SLASH");case"stab":return game.i18n.localize("ATTACK.STAB");case"other":return game.i18n.localize("ATTACK.OTHER")}}),Handlebars.registerHelper("armorPart",part=>{switch(part=normalize(part,"body"),part){case"body":return game.i18n.localize("ARMOR.BODY");case"head":return game.i18n.localize("ARMOR.HELMET");case"shield":return game.i18n.localize("ARMOR.SHIELD")}}),Handlebars.registerHelper("itemWeight",weight=>{switch(normalize(weight,"regular")){case"none":return game.i18n.localize("WEIGHT.NONE");case"tiny":return game.i18n.localize("WEIGHT.TINY");case"light":return game.i18n.localize("WEIGHT.LIGHT");case"regular":return game.i18n.localize("WEIGHT.REGULAR");case"heavy":return game.i18n.localize("WEIGHT.HEAVY");default:return weight}}),Handlebars.registerHelper("weaponCategory",category=>{switch(category=normalize(category,"melee"),category){case"melee":return game.i18n.localize("WEAPON.MELEE");case"ranged":return game.i18n.localize("WEAPON.RANGED")}}),Handlebars.registerHelper("weaponGrip",grip=>{switch(grip=normalize(grip,"1h"),grip){case"1h":return game.i18n.localize("WEAPON.1H");case"2h":return game.i18n.localize("WEAPON.2H")}}),Handlebars.registerHelper("weaponRange",range=>{switch(range=normalize(range,"arm"),range){case"arm":return game.i18n.localize("RANGE.ARM");case"near":return game.i18n.localize("RANGE.NEAR");case"short":return game.i18n.localize("RANGE.SHORT");case"long":return game.i18n.localize("RANGE.LONG");case"distant":return game.i18n.localize("RANGE.DISTANT")}}),Handlebars.registerHelper("talentType",type=>{switch(type=normalize(type,"general"),type){case"general":return game.i18n.localize("TALENT.GENERAL");case"kin":return game.i18n.localize("TALENT.KIN");case"profession":return game.i18n.localize("TALENT.PROFESSION")}}),Handlebars.registerHelper("isBroken",item=>parseInt(item.system.bonus.max,10)>0&&parseInt(item.system.bonus.value,10)===0?"broken":""),Handlebars.registerHelper("formatRollModifiers",rollModifiers=>{let output=[];return Object.values(rollModifiers).filter(mod=>!mod.gearBonus).forEach(mod=>{let modName=game.i18n.localize(mod.name);output.push(`${modName} ${mod.value}`)}),output.join(", ")}),Handlebars.registerHelper("hasWeaponFeatures",(weaponType,features)=>{let meleeFeatures=["edged","pointed","blunt","parry","hook"],rangedFeatures=["slowReload"];if(features.others!=="")return!0;let weaponFeatures=[];weaponType==="melee"?weaponFeatures=meleeFeatures:weaponType==="ranged"&&(weaponFeatures=rangedFeatures);for(let feature in features)if(weaponFeatures.includes(feature)&&features[feature])return!0;return!1}),Handlebars.registerHelper("formatWeaponFeatures",(weaponType,features)=>{let output=[];return weaponType==="melee"?(features.edged&&output.push(game.i18n.localize("WEAPON.FEATURES.EDGED")),features.pointed&&output.push(game.i18n.localize("WEAPON.FEATURES.POINTED")),features.blunt&&output.push(game.i18n.localize("WEAPON.FEATURES.BLUNT")),features.parrying&&output.push(game.i18n.localize("WEAPON.FEATURES.PARRYING")),features.hook&&output.push(game.i18n.localize("WEAPON.FEATURES.HOOK"))):weaponType==="ranged"?features.slowReload&&output.push(game.i18n.localize("WEAPON.FEATURES.SLOW_RELOAD")):features.others?output.push(features.others):features&&output.push(features),output.join(", ")}),Handlebars.registerHelper("plaintextToHTML",value=>new Handlebars.SafeString(value.replace(/(<([^>]+)>)/gi,"").replace(/(?:\r\n|\r|\n)/g,"
"))),Handlebars.registerHelper("toUpperCase",str=>str.toUpperCase()),Handlebars.registerHelper("eq",(...args)=>(args.pop(),args.every(expression=>args[0]===expression))),Handlebars.registerHelper("or",(...args)=>(args.pop(),args.reduce((x2,y2)=>x2||y2))),Handlebars.registerHelper("and",(...args)=>(args.pop(),args.reduce((x2,y2)=>x2&&y2))),Handlebars.registerHelper("chargenLoc",item=>{let localizedString=CONFIG.fbl.i18n[item];return localizedString||(localizedString=`SKILL.${item.toUpperCase().replace(/[\s-]/g,"_")}`),localizedString}),Handlebars.registerHelper("getType",item=>typeof(Number(item)||item)),Handlebars.registerHelper("randomize",items=>items[Math.floor(Math.random()*items.length)]),Handlebars.registerHelper("fblLocalize",(...args)=>(args.pop(),localizeString(args.join(".")))),Handlebars.registerHelper("ternary",(conditional,string1,string2)=>conditional?string1:string2),Handlebars.registerHelper("count",(array=[])=>Array.isArray(array)?array.length:0)}function normalize(data,defaultValue){return data?data.toLowerCase():defaultValue}var initializeHandlebars=()=>{registerHandlebarsHelpers(),preloadHandlebarsTemplates()};init_define_GLOBALPATHS();init_define_GLOBALPATHS();init_define_GLOBALPATHS();var k=1;var b=Symbol("Fragment"),D=new Set(["area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),x=new Set(["script","style"]),_=/([\@\.a-z0-9_\:\-]*)\s*?=?\s*?(['"]?)([\s\S]*?)\2\s+/gim,o=/(?:<(\/?)([a-zA-Z][a-zA-Z0-9\:-]*)(?:\s([^>]*?))?((?:\s*\/)?)>|(<\!\-\-)([\s\S]*?)(\-\->)|(<\!)([\s\S]*?)(>))/gm;function P(e){let t={},a;if(e)for(_.lastIndex=0,e=" "+(e||"")+" ";a=_.exec(e);)a[0]!==" "&&(t[a[1]]=a[3]);return t}function w(e){let t=typeof e=="string"?e:e.value,a,r,n,i,l,d,g2,h,s,c=[];o.lastIndex=0,r=a={type:0,children:[]};let E2=0;function m(){i=t.substring(E2,o.lastIndex-n[0].length),i&&r.children.push({type:2,value:i,parent:r})}for(;n=o.exec(t);){if(d=n[5]||n[8],g2=n[6]||n[9],h=n[7]||n[10],x.has(r.name)&&n[2]!==r.name){l=o.lastIndex-n[0].length,r.children.length>0&&(r.children[0].value+=n[0]);continue}else if(d==="`;case 4:return``}}async function B(e,t=[]){if(!Array.isArray(t))throw new Error(`Invalid second argument for \`transform\`! Expected \`Transformer[]\` but got \`${typeof t}\``);let r=typeof e=="string"?w(e):e;for(let n of t)r=await n(r);return v(r)}init_define_GLOBALPATHS();function f2(t){var n;if(t===void 0)return{allowElements:[],dropElements:["script"],allowComponents:!1,allowCustomElements:!1,allowComments:!1};{let e=new Set([]);(n=t.allowElements)!=null&&n.includes("script")||e.add("script");for(let o2 of t.dropElements??[])e.add(o2);return{allowComponents:!1,allowCustomElements:!1,allowComments:!1,...t,dropElements:Array.from(e)}}}function E(t){return t.name.includes("-")?"custom-element":/[\_\$A-Z]/.test(t.name[0])||t.name.includes(".")?"component":"element"}function w2(t,n,e){var o2,l,s,r;return((o2=e.allowElements)==null?void 0:o2.length)>0&&e.allowElements.includes(t)?"allow":((l=e.blockElements)==null?void 0:l.length)>0&&e.blockElements.includes(t)?"block":((s=e.dropElements)==null?void 0:s.length)>0&&e.dropElements.find(u2=>u2===t)||n==="component"&&!e.allowComponents||n==="custom-element"&&!e.allowCustomElements||((r=e.allowElements)==null?void 0:r.length)>0?"drop":"allow"}function b2(t,n){var o2,l,s,r,u2,m,d,c;let e=t.attributes;for(let i of Object.keys(t.attributes))(o2=n.allowAttributes)!=null&&o2[i]&&((l=n.allowAttributes)!=null&&l[i].includes(t.name))||(r=(s=n.allowAttributes)==null?void 0:s[i])!=null&&r.includes("*")||((u2=n.dropAttributes)!=null&&u2[i]&&((m=n.dropAttributes)!=null&&m[i].includes(t.name))||(c=(d=n.dropAttributes)==null?void 0:d[i])!=null&&c.includes("*"))&&delete e[i];return e}function g(t,n,e){let o2=E(n),{name:l}=n,s=w2(l,o2,t);return s==="drop"?()=>{e.children=e.children.filter(r=>r!==n)}:s==="block"?()=>{e.children=e.children.map(r=>r===n?r.children:r).flat(1)}:()=>{n.attributes=b2(n,t)}}function N2(t){let n=f2(t);return e=>{let o2=[];z(e,(l,s)=>{switch(l.type){case k:{o2.push(g(n,l,s));return}default:return}});for(let l of o2)l();return e}}var Changelog=class extends FormApplication{SOURCE;#converter;_updateObject(){throw new Error("Method not implemented.")}constructor(object={},options){super(object,options),this.SOURCE="https://api.github.com/repos/fvtt-fria-ligan/forbidden-lands-foundry-vtt/releases?per_page=10",this.#converter=(()=>{let options2={...CONST.SHOWDOWN_OPTIONS,headerLevelStart:2,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,ghCodeBlocks:!0,ghMentions:!0,strikethrough:!0,literalMidWordUnderscores:!0};for(let key in options2)globalThis.showdown.setOption(key,options2[key]);let converter=new globalThis.showdown.Converter;return converter.setFlavor("github"),converter})()}async#sanitizeHtml(html){return B(html,[N2({allowElements:["details","summary","pre","code","h2","h3","h4","h5","h6","p","strong","b","em","u","s","a","ul","ol","li","br","img"],allowAttributes:{a:["href"],img:["src","alt"]}})])}async#generateChangelog(){let data=await(await fetch(this.SOURCE)).json(),localizedDate=new Intl.DateTimeFormat(game.i18n.lang,{year:"numeric",month:"long",day:"numeric"});return(await Promise.allSettled(data.map(async(release,index)=>{let version=release.tag_name,date=localizedDate.format(new Date(release.published_at)),raw=release.body,html=this.#converter.makeHtml(raw),cleanHtml=await this.#sanitizeHtml(html);return`
+

${version} \u2013 ${date}

+ ${cleanHtml} +
`}))).filter(entry=>entry.status==="fulfilled").map(entry=>entry.value).join("
")}async render(){let content=await this.#generateChangelog();return Dialog.prompt({title:"Changelog",content:`

${game.i18n.localize("CONFIG.CHANGELOG")}

${content}`,options:{width:600,resizable:!0,classes:["fbl","changelog"]},render:html=>{html.find(".dialog-content").scrollTop(0)},callback:()=>{}}),this}};init_define_GLOBALPATHS();function registerDiceSoNice(dice3d){dice3d.addSystem({id:"forbidden-lands",name:"Forbidden Lands"},!0),dice3d.addColorset({name:"fl-base",category:"Forbidden Lands",description:"Base Dice",background:"#ffffff",edge:"#ffffff",material:"plastic"}),dice3d.addColorset({name:"fl-gear",category:"Forbidden Lands",description:"Gear Dice",background:"#000000",edge:"#000000",material:"plastic"}),dice3d.addColorset({name:"fl-skill",category:"Forbidden Lands",description:"Skill Dice",background:"#9d1920",edge:"#9d1920",material:"plastic"}),dice3d.addColorset({name:"fl-d8",category:"Forbidden Lands",description:"D8",background:"#4f6d47",edge:"#4f6d47",material:"plastic"}),dice3d.addColorset({name:"fl-d10",category:"Forbidden Lands",description:"D10",background:"#329bd6",edge:"#329bd6",material:"plastic"}),dice3d.addColorset({name:"fl-d12",category:"Forbidden Lands",description:"D12",background:"#f15700",edge:"#f15700",material:"plastic"}),dice3d.addDicePreset({type:"db",labels:["systems/forbidden-lands/assets/dsn/d6/d6-1-black.png","systems/forbidden-lands/assets/dsn/d6/d6-2-black.png","systems/forbidden-lands/assets/dsn/d6/d6-3-black.png","systems/forbidden-lands/assets/dsn/d6/d6-4-black.png","systems/forbidden-lands/assets/dsn/d6/d6-5-black.png","systems/forbidden-lands/assets/dsn/d6/d6-6-black.png"],bumpMaps:["systems/forbidden-lands/assets/dsn/d6/d6-1-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-2-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-3-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-4-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-5-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-6-bump.png"],colorset:"fl-base",system:"forbidden-lands"},"d6"),dice3d.addDicePreset({type:"dg",labels:["systems/forbidden-lands/assets/dsn/d6/d6-1-white.png","systems/forbidden-lands/assets/dsn/d6/d6-2-white.png","systems/forbidden-lands/assets/dsn/d6/d6-3-white.png","systems/forbidden-lands/assets/dsn/d6/d6-4-white.png","systems/forbidden-lands/assets/dsn/d6/d6-5-white.png","systems/forbidden-lands/assets/dsn/d6/d6-6-white.png"],bumpMaps:["systems/forbidden-lands/assets/dsn/d6/d6-1-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-2-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-3-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-4-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-5-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-6-bump.png"],colorset:"fl-gear",system:"forbidden-lands"},"d6"),dice3d.addDicePreset({type:"ds",labels:["systems/forbidden-lands/assets/dsn/d6/d6-1-skill-white.png","systems/forbidden-lands/assets/dsn/d6/d6-2-white.png","systems/forbidden-lands/assets/dsn/d6/d6-3-white.png","systems/forbidden-lands/assets/dsn/d6/d6-4-white.png","systems/forbidden-lands/assets/dsn/d6/d6-5-white.png","systems/forbidden-lands/assets/dsn/d6/d6-6-white.png"],bumpMaps:["systems/forbidden-lands/assets/dsn/d6/d6-1-skill-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-2-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-3-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-4-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-5-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-6-bump.png"],colorset:"fl-skill",system:"forbidden-lands"},"d6"),dice3d.addDicePreset({type:"dn",labels:["systems/forbidden-lands/assets/dsn/d6/d6-1-skill-white.png","systems/forbidden-lands/assets/dsn/d6/d6-2-white.png","systems/forbidden-lands/assets/dsn/d6/d6-3-white.png","systems/forbidden-lands/assets/dsn/d6/d6-4-white.png","systems/forbidden-lands/assets/dsn/d6/d6-5-white.png","systems/forbidden-lands/assets/dsn/d6/d6-6-white.png"],bumpMaps:["systems/forbidden-lands/assets/dsn/d6/d6-1-skill-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-2-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-3-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-4-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-5-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-6-bump.png"],colorset:"fl-skill",system:"forbidden-lands"},"d6"),dice3d.addDicePreset({type:"d6",labels:["systems/forbidden-lands/assets/dsn/d6/d6-1-skill-white.png","systems/forbidden-lands/assets/dsn/d6/d6-2-white.png","systems/forbidden-lands/assets/dsn/d6/d6-3-white.png","systems/forbidden-lands/assets/dsn/d6/d6-4-white.png","systems/forbidden-lands/assets/dsn/d6/d6-5-white.png","systems/forbidden-lands/assets/dsn/d6/d6-6-white.png"],bumpMaps:["systems/forbidden-lands/assets/dsn/d6/d6-1-skill-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-2-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-3-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-4-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-5-bump.png","systems/forbidden-lands/assets/dsn/d6/d6-6-bump.png"],colorset:"fl-skill",system:"forbidden-lands"},"d6"),dice3d.addDicePreset({type:"d8",labels:["systems/forbidden-lands/assets/dsn/d8/d8-1.png","systems/forbidden-lands/assets/dsn/d8/d8-2.png","systems/forbidden-lands/assets/dsn/d8/d8-3.png","systems/forbidden-lands/assets/dsn/d8/d8-4.png","systems/forbidden-lands/assets/dsn/d8/d8-5.png","systems/forbidden-lands/assets/dsn/d8/d8-6.png","systems/forbidden-lands/assets/dsn/d8/d8-7.png","systems/forbidden-lands/assets/dsn/d8/d8-8.png"],bumpMaps:["systems/forbidden-lands/assets/dsn/d8/d8-1-bump.png","systems/forbidden-lands/assets/dsn/d8/d8-2-bump.png","systems/forbidden-lands/assets/dsn/d8/d8-3-bump.png","systems/forbidden-lands/assets/dsn/d8/d8-4-bump.png","systems/forbidden-lands/assets/dsn/d8/d8-5-bump.png","systems/forbidden-lands/assets/dsn/d8/d8-6-bump.png","systems/forbidden-lands/assets/dsn/d8/d8-7-bump.png","systems/forbidden-lands/assets/dsn/d8/d8-8-bump.png"],colorset:"fl-d8",system:"forbidden-lands"},"d8"),dice3d.addDicePreset({type:"d10",labels:["systems/forbidden-lands/assets/dsn/d10/d10-1.png","systems/forbidden-lands/assets/dsn/d10/d10-2.png","systems/forbidden-lands/assets/dsn/d10/d10-3.png","systems/forbidden-lands/assets/dsn/d10/d10-4.png","systems/forbidden-lands/assets/dsn/d10/d10-5.png","systems/forbidden-lands/assets/dsn/d10/d10-6.png","systems/forbidden-lands/assets/dsn/d10/d10-7.png","systems/forbidden-lands/assets/dsn/d10/d10-8.png","systems/forbidden-lands/assets/dsn/d10/d10-9.png","systems/forbidden-lands/assets/dsn/d10/d10-10.png"],bumpMaps:["systems/forbidden-lands/assets/dsn/d10/d10-1-bump.png","systems/forbidden-lands/assets/dsn/d10/d10-2-bump.png","systems/forbidden-lands/assets/dsn/d10/d10-3-bump.png","systems/forbidden-lands/assets/dsn/d10/d10-4-bump.png","systems/forbidden-lands/assets/dsn/d10/d10-5-bump.png","systems/forbidden-lands/assets/dsn/d10/d10-6-bump.png","systems/forbidden-lands/assets/dsn/d10/d10-7-bump.png","systems/forbidden-lands/assets/dsn/d10/d10-8-bump.png","systems/forbidden-lands/assets/dsn/d10/d10-9-bump.png","systems/forbidden-lands/assets/dsn/d10/d10-10-bump.png"],colorset:"fl-d10",system:"forbidden-lands"},"d10"),dice3d.addDicePreset({type:"d12",labels:["systems/forbidden-lands/assets/dsn/d12/d12-1.png","systems/forbidden-lands/assets/dsn/d12/d12-2.png","systems/forbidden-lands/assets/dsn/d12/d12-3.png","systems/forbidden-lands/assets/dsn/d12/d12-4.png","systems/forbidden-lands/assets/dsn/d12/d12-5.png","systems/forbidden-lands/assets/dsn/d12/d12-6.png","systems/forbidden-lands/assets/dsn/d12/d12-7.png","systems/forbidden-lands/assets/dsn/d12/d12-8.png","systems/forbidden-lands/assets/dsn/d12/d12-9.png","systems/forbidden-lands/assets/dsn/d12/d12-10.png","systems/forbidden-lands/assets/dsn/d12/d12-11.png","systems/forbidden-lands/assets/dsn/d12/d12-12.png"],bumpMaps:["systems/forbidden-lands/assets/dsn/d12/d12-1-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-2-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-3-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-4-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-5-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-6-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-7-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-8-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-9-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-10-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-11-bump.png","systems/forbidden-lands/assets/dsn/d12/d12-12-bump.png"],colorset:"fl-d12",system:"forbidden-lands"},"d12")}function registerHooks(){if(game.socket.on("system.forbidden-lands",data=>{data.operation==="pushRoll"&&data.isOwner&&game.messages.get(data.id)?.delete()}),Hooks.once("diceSoNiceReady",dice3d=>{registerDiceSoNice(dice3d)}),Hooks.on("yzeCombatReady",()=>{if(!game.settings.get("forbidden-lands","configuredYZEC"))try{game.settings.set("yze-combat","resetEachRound",!1),game.settings.set("yze-combat","slowAndFastActions",!0),game.settings.set("yze-combat","initAutoDraw",!0),game.settings.set("yze-combat","duplicateCombatantOnCombatStart",!0),game.settings.set("yze-combat","actorSpeedAttribute","system.movement.value"),game.settings.set("forbidden-lands","configuredYZEC",!0)}catch{}}),Hooks.on("renderPause",(_app,html)=>{html.find("img").attr("src","systems/forbidden-lands/assets/fbl-sun.webp")}),Hooks.on("chatMessage",(_html,content,_msg)=>{let commandR=/^\/fblr(?:oll)?/i;if(content.match(commandR)){let diceR=/(\d+d(?:[bsng]|8|10|12))/gi,dice=content.match(diceR),data={attribute:{label:"DICE.BASE",value:0},skill:{label:"DICE.SKILL",value:0},gear:{label:"DICE.GEAR",value:0,artifactDie:""}},options={modifiers:[]};if(dice)for(let term of dice){let[num,deno]=term.split("d"),map={b:"attribute",s:"skill",g:"gear",n:"negative"};map[deno]==="negative"?options.modifiers.push({value:-Number(num),active:!0}):map[deno]?data[map[deno]].value+=Number(num):data.gear.artifactDie+=term}return FBLRollHandler.createRoll(data,options),!1}return!0}),game.settings.get("forbidden-lands","collapseSheetHeaderButtons"))for(let hook of["renderItemSheet","renderActorSheet","renderJournalSheet","renderApplication"])Hooks.on(hook,(_app,html)=>{html.find(".char-gen")?.html(``),html.find(".rest-up")?.html(``),html.find(".custom-roll")?.html(``),html.find(".configure-sheet")?.html(``),html.find(".configure-token")?.html(``),html.find(".item-post")?.html(``),html.find(".share-image")?.html(``),html.find(".close")?.html(``)});Hooks.on("renderItemSheet",app=>{app._element[0].style.height="auto"}),Hooks.on("renderActorSheet",(app,html)=>{app.actor.system.type==="party"&&(app._element[0].style.height="auto"),app.cellId?.match(/#gm-screen.+/)&&html.find("button").each((_i,button)=>{button.disabled=!1})}),Hooks.on("renderJournalSheet",(app,html)=>{app.document.flags["forbidden-lands"]?.isBook&&html.addClass("fbl-book")}),Hooks.on("renderChatMessage",async(app,html)=>{let postedItem=html.find(".chat-item")[0];postedItem&&(postedItem.classList.add("draggable"),postedItem.setAttribute("draggable",!0),postedItem.addEventListener("dragstart",ev=>{ev.dataTransfer.setData("text/plain",JSON.stringify({item:app.getFlag("forbidden-lands","itemData"),type:"itemDrop"}))}));let pushButton=html.find(".fbl-button.push")[0];pushButton&&pushButton.addEventListener("click",async()=>{if(app.roll.pushable){await FBLRollHandler.pushRoll(app);let fireEvent=()=>{app.permission===3?app.delete():game.socket.emit("system.forbidden-lands",{operation:"pushRoll",isOwner:app.roll?.isOwner,id:app.id})};game.modules.get("dice-so-nice")?.active?Hooks.once("diceSoNiceRollComplete",()=>{fireEvent()}):fireEvent()}});let tableButton=html.find(".fbl-button.table")[0];tableButton&&tableButton.addEventListener("click",async()=>{let table;if(tableButton.dataset.action==="prey"){let tables=game.settings.get("forbidden-lands","otherTables");table=game.tables.get(tables["travel-find-prey"])}else table=game.tables.get(tableButton.dataset.id);table?table.draw({displayChat:!0}):ui.notifications?.warn("Could not find mishap table")})}),Hooks.on("gmScreenOpenClose",(app,_config)=>{app.element.find("button").each((_i,button)=>{button.disabled=!1})}),Hooks.on("hotbarDrop",async(_2,data,slot)=>handleHotbarDrop(data,slot)),Hooks.on("renderSidebarTab",(app,html)=>{if(app.tabName!=="settings")return;let section=html.find("#settings-documentation"),button=``;section.prepend(button).on("click",ev=>{ev.preventDefault(),new Changelog().render(!0)})})}init_define_GLOBALPATHS();var migrateWorld=async()=>{let systemVersion,worldSchemaVersion;try{systemVersion=Number(game.system.version.split(".")[0]),worldSchemaVersion=Number(game.settings.get("forbidden-lands","worldSchemaVersion")||0)}catch(error){throw ui.notifications.error("Failed getting version numbers. Backup your files and contact support."),new Error(`Failed getting version numbers: ${error}`)}if(worldSchemaVersionp2.metadata.package==="world"&&["Actor","Item","Scene"].includes(p2.metadata.type)))await migrateCompendium(pack,worldSchemaVersion);migrateSettings(worldSchemaVersion),ui.notifications.info("Upgrade complete!")}game.settings.set("forbidden-lands","worldSchemaVersion",systemVersion)},migrateActorData=(actor,worldSchemaVersion)=>{let update={};if(worldSchemaVersion<3&&actor.type==="character"&&(actor.system.condition.sleepy||(update["system.condition.sleepy"]=actor.system.condition.sleepless)),worldSchemaVersion<7&&actor.type==="character")for(let[key,data]of Object.entries(actor.system.consumable)){let map={0:0,6:1,8:2,10:3,12:4};update[`system.consumable.${key}.value`]=map[data.value]}if(!actor.items)return update;let items=actor.items.reduce((arr,i)=>{let itemData=i instanceof CONFIG.Item.documentClass?i.toObject():i,itemUpdate=migrateItemData(itemData,worldSchemaVersion);return foundry.utils.isEmpty(itemUpdate)||(itemUpdate._id=itemData._id,arr.push(expandObject(itemUpdate))),arr},[]);return items.length>0&&(update.items=items),update},migrateItemData=(item,worldSchemaVersion)=>{let update={};if(worldSchemaVersion<3)if(item.type==="artifact"&&(update.type="weapon"),item.type==="armor")update["system.bonus"]=item.system.rating;else{let baseBonus=0,artifactBonus="";if(item.system.bonus){let parts=item.system.bonus.split("+").map(p2=>p2.trim());for(let part of parts)Number.isNumeric(part)?baseBonus+=+part:artifactBonus.length?artifactBonus=`${artifactBonus} + ${part}`:artifactBonus=part}update["system.bonus"]={value:baseBonus,max:baseBonus},update["system.artifactBonus"]=artifactBonus}if(worldSchemaVersion<4&&item.type==="spell"&&!item.system.spellType&&(update["system.spellType"]="SPELL.SPELL"),worldSchemaVersion<5&&item.type==="weapon"&&typeof item.system.features=="string"){let features=item.system.features.replace(".","").replace(/loading is a slow action/i,"slowReload").replace(/slow reload/i,"slowReload").split(", ");update["system.features"]={edged:!1,pointed:!1,blunt:!1,parrying:!1,hook:!1,slowReload:!1,others:""};let otherFeatures="";for(let feature of features){let lcFeature=feature==="slowReload"?feature:feature.toLowerCase();lcFeature in update["system.features"]?update["system.features"][lcFeature]=!0:otherFeatures+=`${feature}, `}update["system.features"].others=otherFeatures.substr(0,otherFeatures.length-2)}return worldSchemaVersion<7&&(item.type==="monsterTalent"&&(update.type="talent",update["system.type"]="monster"),item.type==="weapon"&&(update["system.ammo"]="other")),update},migrateSceneData=scene=>({tokens:scene.tokens.map(token=>{let t=token.toJSON();if(!t.actorId||t.actorLink)t.actorData={};else if(!game.actors.has(t.actorId))t.actorId=null,t.actorData={};else if(!t.actorLink){let actorData=duplicate(t.actorData);actorData.type=token.actor?.type;let update=migrateActorData(actorData);for(let embeddedName of["items","effects"]){if(!update[embeddedName]?.length)continue;let updates=new Map(update[embeddedName].map(u2=>[u2._id,u2]));for(let embedded of actorData[embeddedName]){let toUpdate=updates.get(embedded._id);toUpdate&&mergeObject(embedded,toUpdate)}delete update[embeddedName]}mergeObject(t.actorData,update)}return t})}),migrateCompendium=async(pack,worldSchemaVersion)=>{let entity=pack.metadata.entity;if(!["Actor","Item","Scene"].includes(entity))return;let wasLocked=pack.locked;await pack.configure({locked:!1}),await pack.migrate();let documents=await pack.getDocuments();for(let doc of documents){let updateData={};try{switch(entity){case"Actor":updateData=migrateActorData(doc.toObject(),worldSchemaVersion);break;case"Item":updateData=migrateItemData(doc.toObject(),worldSchemaVersion);break;case"Scene":updateData=migrateSceneData(doc.data,worldSchemaVersion);break}if(foundry.utils.isEmpty(updateData))continue;await doc.update(updateData)}catch(err){err.message=`Failed migration for entity ${doc.name} in pack ${pack.collection}: ${err.message}`}}await pack.configure({locked:wasLocked})},migrateSettings=async worldSchemaVersion=>{worldSchemaVersion<4&&(game.settings.set("forbidden-lands","showCraftingFields",!0),game.settings.set("forbidden-lands","showCostField",!0),game.settings.set("forbidden-lands","showSupplyField",!0),game.settings.set("forbidden-lands","showEffectField",!0),game.settings.set("forbidden-lands","showDescriptionField",!0),game.settings.set("forbidden-lands","showDrawbackField",!0),game.settings.set("forbidden-lands","showAppearanceField",!0)),worldSchemaVersion<5&&game.settings.set("forbidden-lands","alternativeSkulls",!1)};init_define_GLOBALPATHS();Hooks.on("renderSettingsConfig",(_app,html,_user)=>{let target=html.find('input[name="forbidden-lands.datasetDir"]')[0];if(!target)return;let targetParent=target.previousElementSibling,resetButton=$(``);resetButton.on("click",function(){target.value="",this.blur()});let experimentalButton=$(``);experimentalButton.on("click",function(){target.value="systems/forbidden-lands/assets/datasets/chargen/dataset-experimental.json",this.blur()}),targetParent.after(experimentalButton[0],resetButton[0])});var TableConfigMenu=class extends FormApplication{#resolve=null;#promise=new Promise(resolve=>{this.#resolve=resolve});static get defaultOptions(){return mergeObject(super.defaultOptions,{template:"systems/forbidden-lands/templates/components/tables-config.hbs",classes:["tables-config"],title:"CONFIG.TABLE_CONFIG.TITLE",submitOnClose:!1})}async getData(){let data=await super.getData(),mishapConfig=game.settings.get("forbidden-lands","mishapTables"),encounterConfig=game.settings.get("forbidden-lands","encounterTables"),otherConfig=game.settings.get("forbidden-lands","otherTables"),mishapKeys=CONFIG.fbl.mishapTables,encounterKeys=CONFIG.fbl.encounterTables,otherKeys=CONFIG.fbl.otherTables;return data.mishapTables=mishapKeys.map(key=>({key,name:localizeString(key),id:mishapConfig[key]})),data.encounterTables=encounterKeys.map(key=>({key,name:localizeString(key),id:encounterConfig[key]})),data.otherTables=otherKeys.map(key=>({key,name:localizeString(key),id:otherConfig[key]})),data.tables=(()=>{let selectOptions={},tree=game.tables.directory.folders;for(let folder of tree){let options=folder.contents?.map(table=>``)??null;if(options.length>0)if(selectOptions[folder.name])selectOptions[folder.name]+=options;else{let property=`${options}`;selectOptions[folder.name]=property}}return Object.values(selectOptions).join("")})(),data}_updateObject(_event,formData){let tables=Object.entries(formData).reduce((acc,[key,value])=>{let[tableType,tableKey]=key.split("_");return acc[tableType]||(acc[tableType]={}),acc[tableType][tableKey]=value,acc},{});game.settings.set("forbidden-lands","mishapTables",tables.mishap),game.settings.set("forbidden-lands","encounterTables",tables.encounter),game.settings.set("forbidden-lands","otherTables",tables.other)}async render(force,context={}){return await super.render(force,context),this.#promise}async close(...args){await super.close(...args),this.#resolve()}},SheetConfigMenu=class extends FormApplication{#resolve=null;#promise=new Promise(resolve=>{this.#resolve=resolve});static get defaultOptions(){return mergeObject(super.defaultOptions,{template:"systems/forbidden-lands/templates/components/sheet-config.hbs",classes:["sheet-config"],title:"CONFIG.SHEET_CONFIG.TITLE",submitOnClose:!1})}async getData(){let data=await super.getData(),config={showCraftingFields:"CONFIG.CRAFTINGFIELD",showCostField:"CONFIG.COSTFIELD",showSupplyField:"CONFIG.SUPPLYFIELD",showEffectField:"CONFIG.EFFECTFIELD",showDescriptionField:"CONFIG.DESCRIPTIONFIELD",showDrawbackField:"CONFIG.DRAWBACKFIELD",showAppearanceField:"CONFIG.APPEARANCEFIELD"};return data.config=Object.entries(config).map(([key,label])=>({key,label:localizeString(label),description:localizeString(`${label}_DESC`),checked:game.settings.get("forbidden-lands",key)})),data}_updateObject(_event,formData){for(let[key,value]of Object.entries(formData))game.settings.set("forbidden-lands",key,value)}async render(force,context={}){return await super.render(force,context),this.#promise}async close(...args){await super.close(...args),this.#resolve()}};function registerSettings(){game.settings.register("forbidden-lands","worldSchemaVersion",{name:"World Version",hint:"Used to automatically upgrade worlds data when the system is upgraded.",scope:"world",config:!1,default:0,type:Number}),game.settings.register("forbidden-lands","configuredYZEC",{name:"YZEC Configured",hint:"Used to track if the YZEC has been configured.",scope:"world",config:!1,default:!1,type:Boolean}),game.settings.register("forbidden-lands","messages",{name:"Displayed Messages",hint:"Used to track which messages have been displayed.",scope:"world",config:!1,default:[],type:Array}),game.settings.register("forbidden-lands","showCraftingFields",{name:"CONFIG.CRAFTINGFIELD",hint:"CONFIG.CRAFTINGFIELD_DESC",scope:"client",config:!1,default:!0,type:Boolean}),game.settings.register("forbidden-lands","showCostField",{name:"CONFIG.COSTFIELD",hint:"CONFIG.COSTFIELD_DESC",scope:"client",config:!1,default:!0,type:Boolean}),game.settings.register("forbidden-lands","showSupplyField",{name:"CONFIG.SUPPLYFIELD",hint:"CONFIG.SUPPLYFIELD_DESC",scope:"client",config:!1,default:!0,type:Boolean}),game.settings.register("forbidden-lands","showEffectField",{name:"CONFIG.EFFECTFIELD",hint:"CONFIG.EFFECTFIELD_DESC",scope:"client",config:!1,default:!0,type:Boolean}),game.settings.register("forbidden-lands","showDescriptionField",{name:"CONFIG.DESCRIPTIONFIELD",hint:"CONFIG.DESCRIPTIONFIELD_DESC",scope:"client",config:!1,default:!0,type:Boolean}),game.settings.register("forbidden-lands","showDrawbackField",{name:"CONFIG.DRAWBACKFIELD",hint:"CONFIG.DRAWBACKFIELD_DESC",scope:"client",config:!1,default:!0,type:Boolean}),game.settings.register("forbidden-lands","showAppearanceField",{name:"CONFIG.APPEARANCEFIELD",hint:"CONFIG.APPEARANCEFIELD_DESC",scope:"client",config:!1,default:!0,type:Boolean}),game.settings.register("forbidden-lands","mishapTables",{name:"Mishap Tables",scope:"world",config:!1,default:{}}),game.settings.register("forbidden-lands","encounterTables",{name:"Encounter Tables",scope:"world",config:!1,default:{}}),game.settings.register("forbidden-lands","otherTables",{name:"Other Tables",scope:"world",config:!1,default:{}}),game.settings.registerMenu("forbidden-lands","changelog",{name:"CONFIG.CHANGELOG",hint:"CONFIG.CHANGELOG_DESC",label:"CONFIG.CHANGELOG_LABEL",icon:"fas fa-book",type:Changelog}),game.settings.registerMenu("forbidden-lands","tableConfigMenu",{name:"CONFIG.TABLE_CONFIG_MENU",hint:"CONFIG.TABLE_CONFIG_MENU_DESC",label:"CONFIG.TABLE_CONFIG_MENU_LABEL",icon:"fas fa-th-list",type:TableConfigMenu,restricted:!0}),game.settings.registerMenu("forbidden-lands","sheetConfigMenu",{name:"CONFIG.SHEET_CONFIG_MENU",hint:"CONFIG.SHEET_CONFIG_MENU_DESC",label:"CONFIG.SHEET_CONFIG_MENU_LABEL",icon:"fas fa-scroll",type:SheetConfigMenu}),game.settings.register("forbidden-lands","darkmode",{name:"SETTINGS.DARKMODE",hint:"SETTINGS.DARKMODE_HINT",scope:"client",config:!0,default:!1,requiresReload:!0,type:Boolean}),game.settings.register("forbidden-lands","collapseSheetHeaderButtons",{name:"CONFIG.COLLAPSE_SHEET_HEADER_BUTTONS",hint:"CONFIG.COLLAPSE_SHEET_HEADER_BUTTONS_DESC",scope:"client",config:!0,default:!1,type:Boolean,requiresReload:!0}),game.settings.register("forbidden-lands","alternativeSkulls",{name:"CONFIG.ALTERNATIVESKULLS",hint:"CONFIG.ALTERNATIVESKULLS_DESC",scope:"client",config:!0,default:!1,requiresReload:!0,type:Boolean}),game.settings.register("forbidden-lands","useHealthAndResolve",{name:"CONFIG.HEALTHANDRESOLVE",hint:"CONFIG.HEALTHANDRESOLVE_DESC",scope:"client",config:!0,default:!1,requiresReload:!0,type:Boolean}),game.settings.register("forbidden-lands","maxInit",{name:"CONFIG.MAX_INIT",hint:"CONFIG.MAX_INIT_DESC",scope:"world",config:!0,default:10,onChange:value=>{CONFIG.fbl.maxInit=value},type:Number}),game.settings.register("forbidden-lands","autoDecreaseConsumable",{name:"CONFIG.AUTO_DECREASE_CONSUMABLE",hint:"CONFIG.AUTO_DECREASE_CONSUMABLE_DESC",config:!0,default:2,type:Number}),game.settings.register("forbidden-lands","datasetDir",{name:"FLCG.SETTINGS.DATASET",hint:"FLCG.SETTINGS.DATASET_HINT",scope:"world",config:!0,default:"",filePicker:"json",type:String})}init_define_GLOBALPATHS();init_define_GLOBALPATHS();init_define_GLOBALPATHS();init_define_GLOBALPATHS();var CharacterConverter=class{constructor(dataset){this.character=null,this.dataset=dataset}async convert(character){return this.character=character,{data:this.buildCharacterData(),items:this.buildCharacterItems()}}buildCharacterData(){let kin=this.dataset.kin[this.character.kin],age=this.character.age,agePenalty=age.ageKey,profession=this.dataset.profession[this.character.profession];return{bio:{kin:{value:kin.name},age:{value:age.ageNumber},profession:{value:profession.name},note:{value:this.generateNotes(this.character)}},consumable:{food:{value:profession.consumables.food},water:{value:profession.consumables.water},arrows:{value:profession.consumables.arrows},torches:{value:profession.consumables.torches}},currency:{gold:{value:profession.currency.gold>0?this.rollNumber(1,profession.currency.gold):0},silver:{value:profession.currency.silver>0?this.rollNumber(1,profession.currency.silver):0},copper:{value:profession.currency.copper>0?this.rollNumber(1,profession.currency.copper):0}},attribute:this.generateAttributes(),skill:this.generateSkills()}}buildCharacterItems(){let items=[];return items=items.concat(this.buildTalents()),items=items.concat(this.buildEventGear()),items}buildEventGear(){let gear=[];for(let i=0;ii.name.toLowerCase()===nameLowerCase&&(type===!1||i.type===type));return item||(item=this.createNewItem(itemName,type)),item.toObject()}getItem(itemName,type=!1){let nameLowerCase=itemName.toLowerCase();type=type&&type.toLowerCase();let item=game.items.find(i=>i.name.toLowerCase().includes(nameLowerCase)&&(type===!1||i.type===type));return item||(item=this.createNewItem(itemName,type)),item.toObject()}createNewItem(itemName,type=!1){let ItemClass=CONFIG.Item.documentClass;return new ItemClass({name:itemName,type:type||"gear",data:type==="talent"?{}:{weight:"none"}})}generateAttributes(){let attributes=JSON.parse(JSON.stringify(this.character.childhood.attributes)),agePenalty=this.character.age.ageKey,attrs=["strength","agility","wits","empathy"];for(let i=0;i{let skillValue={value:0};return obj[skill]=skillValue,obj},{});function increaseSkill(skillObj){for(let[skillName,skillValue]of Object.entries(skillObj))skills[skillName].value+=parseInt(skillValue)}increaseSkill(this.character.childhood.skills);for(let event of this.character.formativeEvents)increaseSkill(event.skills);return skills}generateNotes(character){let homeland=character.homeland?`

${game.i18n.localize("FLCG.HOMELAND")} ${character.homeland}.

`:"",childhood=character.childhood,notes=`

${game.i18n.localize("FLCG.CHILDHOOD")}: ${childhood.name}

+

${childhood.description}

+ ${homeland}`;for(let i=0;i${game.i18n.localize("FLCG.EVENT")}: ${event.name}

${event.description}

`}return`
${notes}
`}rollNumber(min,max){return Math.floor(Math.random()*(max+1-min))+min}};var ForbiddenLandsCharacterGenerator=class _ForbiddenLandsCharacterGenerator extends Application{constructor(dataset,existActor,options={}){super(options),this.character=null,this.existActor=existActor,this.dataset=dataset}static get defaultOptions(){return mergeObject(super.defaultOptions,{classes:["forbidden-lands","sheet","actor"],template:"systems/forbidden-lands/templates/components/character-generator/generator-sheet.hbs",title:game.i18n.localize("FLCG.TITLE"),width:700,height:840,resizable:!1})}static async loadDataset(){let dataset=game.settings.get("forbidden-lands","datasetDir")||null;if(dataset&&dataset.substr(-4,4)!=="json")throw _ForbiddenLandsCharacterGenerator.handleBadDataset(game.i18n.localize("FLCG.ERROR_NOT_A_DATAFILE"));let lang=game.i18n.lang,defaultDataset=`systems/forbidden-lands/assets/datasets/chargen/${CONFIG.fbl.dataSetConfig[lang]||"dataset"}.json`;return(await fetch(dataset||defaultDataset).catch(_err=>({}))).json()}async getData(){let data=super.getData();return this.character===null&&(this.character=await this.generateCharacter()),data.character=this.character,data.dataset=this.dataset,data.dataset.childhood=this.dataset.kin[this.character.kin].childhood,data.dataset.paths=this.dataset.profession[this.character.profession].paths,data.dataset.formativeEvents=this.dataset.profession[this.character.profession].formativeEvents,data}activateListeners(html){super.activateListeners(html),html.find(".chargen-randomize-all").click(this.handleRandomizeAll.bind(this)),html.find(".chargen-create-actor").click(this.handleCreateActor.bind(this)),html.find(".chargen-roll-kin").click(this.handleRollKin.bind(this)),html.find(".chargen-roll-age").click(this.handleRollAge.bind(this)),html.find(".chargen-roll-childhood").click(this.handleRollChildhood.bind(this)),html.find(".chargen-roll-profession").click(this.handleRollProfession.bind(this)),html.find(".chargen-roll-path").click(this.handleRollPath.bind(this)),html.find(".chargen-roll-event").click(this.handleRollEvent.bind(this)),html.find(".chargen-select-kin").change(this.handleInputKin.bind(this)),html.find(".chargen-age-input").change(this.handleInputAge.bind(this)),html.find(".chargen-select-childhood").change(this.handleInputChildhood.bind(this)),html.find(".chargen-select-profession").change(this.handleInputProfession.bind(this)),html.find(".chargen-select-path").change(this.handleInputPath.bind(this)),html.find(".chargen-select-event").change(this.handleInputEvent.bind(this))}_getHeaderButtons(){return super._getHeaderButtons()}async handleCreateActor(){if(!this.existActor)return ui.notifications.error("FLCG.ERROR_NO_ACTOR",{localize:!0}),this.close();let updateData=await new CharacterConverter(this.dataset).convert(this.character);return this.existActor.items.contents.length>0&&await this.handleDeleteExistingItems(),await this.existActor.update({data:updateData.data}),await this.existActor.createEmbeddedDocuments("Item",updateData.items),this.close()}async handleDeleteExistingItems(){let toDelete=this.existActor.items.map(item=>item.id);return await this.existActor.deleteEmbeddedDocuments("Item",toDelete)}handleInputKin(event){let kinKey=$(event.currentTarget).val();return this.character=this.setKin(this.character,kinKey),this.render(!0),!1}handleInputAge(event){let mapping=[game.i18n.localize("FLCG.YOUNG"),game.i18n.localize("FLCG.ADULT"),game.i18n.localize("FLCG.OLD")],ageNumber=parseInt($(event.currentTarget).val()),kin=this.dataset.kin[this.character.kin],ageKey=2;for(let i=0;i<3;i++){let range=kin.age[i];if(ageNumber>=range[0]&&ageNumber<=range[1]){ageKey=i;break}}return this.character.age={ageKey,ageNumber,ageString:mapping[ageKey]},this.character=this.rollFormativeEvents(this.character),this.render(!0),!1}handleInputChildhood(event){let childhoodKey=$(event.currentTarget).val(),kin=this.dataset.kin[this.character.kin];return this.character.childhood=kin.childhood[childhoodKey],this.render(!0),!1}handleInputProfession(event){let professionKey=$(event.currentTarget).val();return this.character.profession=professionKey,this.character=this.rollPath(this.character),this.character.formativeEvents=!1,this.character=this.rollFormativeEvents(this.character),this.render(!0),!1}handleInputPath(event){let pathKey=parseInt($(event.currentTarget).val());return this.character.path=pathKey,this.render(!0),!1}handleInputEvent(event){let el=$(event.currentTarget),id=parseInt(el.data("key")),eventKey=el.val(),profession=this.dataset.profession[this.character.profession];return this.character.formativeEvents[id]=profession.formativeEvents[eventKey],this.render(!0),!1}handleRollKin(_event){return this.character=this.setKin(this.character),this.render(!0),!1}handleRollAge(_event){return this.character.age=this.rollAge(this.dataset.kin[this.character.kin].age),this.character=this.rollFormativeEvents(this.character),this.render(!0),!1}handleRollChildhood(_event){let kin=this.dataset.kin[this.character.kin];return this.character.childhood=this.rollOn(kin.childhood),this.render(!0),!1}handleRollProfession(_event){return this.character.profession=this.rollOn(this.dataset.profession).key,this.character=this.rollPath(this.character),this.character.formativeEvents=!1,this.character=this.rollFormativeEvents(this.character),this.render(!0),!1}handleRollPath(_event){return this.character=this.rollPath(this.character),this.render(!0),!1}handleRollEvent(event){let profession=this.dataset.profession[this.character.profession],button=$(event.currentTarget),id=parseInt(button.data("key")),rolled=[],newEvent={};for(let i=0;icharacter.age.ageKey+1?formativeEvents=character.formativeEvents.slice(0,character.age.ageKey+1):formativeEvents=character.formativeEvents;else for(let i=0;ii.sheet.getData())),data.items?.sort((a,b3)=>(a.sort||0)-(b3.sort||0)),data=this.computeItems(data),data.carriedStates=this.#getCarriedStates(),data.gear=this.#filterGear(data.items),data.system.useHealthAndResolve=this.useHealthAndResolve,data.system.condition=this.actor.system.condition,data.statuses=this.actor.statuses,data}get actorData(){return this.actor.data}get actorProperties(){return this.actor.system}get rollData(){return this.actor.getRollData()}get config(){return CONFIG.fbl}async _onDrop(event,data){let dragData=JSON.parse(event.dataTransfer.getData("text/plain"));dragData.type==="itemDrop"?this.actor.createEmbeddedDocuments("Item",[dragData.item]):super._onDrop(event,data)}async _onSortItem(event,itemData){let state=$(event.target).closest("[data-state]")?.data("state");return(state||state==="")&&await this.actor.updateEmbeddedDocuments("Item",[{_id:itemData._id,flags:{"forbidden-lands":{state:state==="none"?"":state}}}]),super._onSortItem(event,itemData)}activateListeners(html){super.activateListeners(html),!(!game.user.isGM&&this.actor.limited)&&(html.find(".item-create").click(ev=>this.#onItemCreate(ev)),html.find(".create-dialog").click(ev=>{this.#onCreateDialog(ev)}),html.find(".change-attribute").on("click contextmenu",ev=>{let attributeName=$(ev.currentTarget).data("attribute"),attribute=this.actorProperties.attribute[attributeName],value=attribute.value;ev.type==="click"&&!this.altInteraction||ev.type==="contextmenu"&&this.altInteraction?value=Math.max(value-1,0):(ev.type==="contextmenu"&&!this.altInteraction||ev.type==="click"&&this.altInteraction)&&(value=Math.min(value+1,attribute.max)),this.actor.update({[`system.attribute.${attributeName}.value`]:value})}),html.find(".change-willpower").on("click contextmenu",ev=>{let attribute=this.actorProperties.bio.willpower,value=attribute.value;ev.type==="click"&&!this.altInteraction||ev.type==="contextmenu"&&this.altInteraction?value=Math.max(value-1,0):(ev.type==="contextmenu"&&!this.altInteraction||ev.type==="click"&&this.altInteraction)&&(value=Math.min(value+1,attribute.max)),this.actor.update({"system.bio.willpower.value":value})}),html.find(".control-gear").click(ev=>{let direction=$(ev.currentTarget).data("direction"),oppositeDirection=direction==="carried"?"":"carried",updates=this.actor.items.filter(item=>CONFIG.fbl.carriedItemTypes.includes(item.type)&&item.state===oppositeDirection).map(item=>({_id:item.id,flags:{"forbidden-lands":{state:direction}}}));this.actor.updateEmbeddedDocuments("Item",updates)}),html.find(".collapse-table").click(ev=>{let state=$(ev.currentTarget).closest("[data-state]").data("state");this.actor.setFlag("forbidden-lands",`${state}-collapsed`,!this.actor.getFlag("forbidden-lands",`${state??"none"}-collapsed`))}),html.find(".header-sort").click(ev=>{let state=$(ev.currentTarget).closest("[data-state]").data("state"),sort=$(ev.currentTarget).data("sort");this.actor.setFlag("forbidden-lands",`${state??"none"}-sort`,sort)}),html.find(".item-edit").click(ev=>{let div=$(ev.currentTarget).parents(".item");this.actor.items.get(div.data("itemId")).sheet.render(!0)}),html.find(".item-delete").click(ev=>{let div=$(ev.currentTarget).parents(".item");this.actor.deleteEmbeddedDocuments("Item",[div.data("itemId")]),div.slideUp(200,()=>this.render(!1))}),html.find(".item-post").click(ev=>{let div=$(ev.currentTarget).parents(".item");this.actor.items.get(div.data("itemId")).sendToChat()}),html.find(".change-item-bonus").on("click contextmenu",ev=>{let itemId=$(ev.currentTarget).data("itemId"),item=this.actor.items.get(itemId),value=item.system.bonus.value;ev.type==="click"&&!this.altInteraction||ev.type==="contextmenu"&&this.altInteraction?value=Math.max(value-1,0):(ev.type==="contextmenu"&&!this.altInteraction||ev.type==="click"&&this.altInteraction)&&(value=Math.min(value+1,item.itemProperties.bonus.max)),item.update({"system.bonus.value":value})}),html.find(".roll-attribute").click(ev=>{let attributeName=$(ev.currentTarget).data("attribute");return this.rollAttribute(attributeName)}),html.find(".roll-skill").click(ev=>{let skillName=$(ev.currentTarget).data("skill");return this.rollSkill(skillName)}),html.find(".roll-weapon").click(ev=>{let itemId=$(ev.currentTarget).data("itemId");return this.rollGear(itemId)}),html.find(".roll-spell").click(ev=>{let itemId=$(ev.currentTarget).data("itemId");return this.rollSpell(itemId)}),html.find(".roll-action").click(ev=>{let rollName=$(ev.currentTarget).data("action"),itemId=$(ev.currentTarget).data("itemId");return this.rollAction(rollName,itemId||null)}),html.find(".quantity").on("blur",ev=>{let itemId=ev.currentTarget.parentElement.parentElement.dataset.itemId??ev.currentTarget.parentElement.dataset.itemId;if(!itemId)throw ui.notifications.notify("ERROR.NO_ID","error",{localize:!0}),new Error("No item id found");this.actor.updateEmbeddedDocuments("Item",[{_id:itemId,"system.quantity":ev.currentTarget.value}])}))}computeEncumbrance(data){let weightCarried=0;for(let item of Object.values(data.items))weightCarried+=this.computeItemEncumbrance(item);if(this.actor.type==="character"){for(let consumable of Object.values(data.system.consumable))consumable.value>0&&(weightCarried+=1);let coinsCarried=parseInt(data.system.currency.gold.value)+parseInt(data.system.currency.silver.value)+parseInt(data.system.currency.copper.value);weightCarried+=Math.floor(coinsCarried/100)*.5}let baseEncumbrance=data.system.attribute.strength.max*2,monsterEncumbranceMultiplier=this.actor.type==="monster"?data.system.isMounted?1:2:1,modifiers=this.actor.getRollModifierOptions("carryingCapacity"),weightAllowed=baseEncumbrance*monsterEncumbranceMultiplier+modifiers.reduce((acc,m)=>acc+parseInt(m?.value||0),0);return data.system.encumbrance={value:weightCarried,max:weightAllowed,over:weightCarried>weightAllowed},data}broken(type){let msg=type==="item"?"WARNING.ITEM_BROKEN":"WARNING.ACTOR_BROKEN";return ui.notifications.warn(msg,{localize:!0}),new Error(locmsg)}getRollOptions(...rollIdentifiers){return{...this.rollData,modifiers:this.actor.getRollModifierOptions(...rollIdentifiers)}}getAttribute(identifier){let attributeName=CONFIG.fbl.skillAttributeMap[identifier]||identifier,attribute=this.actor.attributes[attributeName];return attribute?{name:attributeName,...attribute}:{}}getSkill(identifier){let skillName=CONFIG.fbl.actionSkillMap[identifier]||identifier,skill=this.actor.skills[skillName];if(!skill)return{};let attribute=this.getAttribute(skillName);return{skill:{name:skillName,...skill},attribute:{...attribute}}}getGears(){return this.actor.items.filter(item=>item.type==="gear"&&!item.isBroken)}getGear(itemId){let gear=this.actor.items.get(itemId).getRollData();if(gear.isBroken)throw this.broken("item");let properties=this.getSkill(CONFIG.fbl.actionSkillMap[gear.category]||"melee");return{gear,...properties}}rollAction(actionName,itemId=void 0){if(!this.actor.canAct)throw this.broken();let properties=itemId?this.getGear(itemId):this.getSkill(actionName),data={title:actionName,...properties};itemId&&(data.gear.damage=void 0);let options={...this.getRollOptions(actionName,data.skill?.name,data.attribute?.name,data.gear?.itemId)};return actionName==="unarmed"&&(options.damage=1),FBLRollHandler.createRoll(data,{...options,gears:this.getGears()})}rollArmor(){let rollName=`${localizeString("ITEM.TypeArmor")}: ${localizeString("ARMOR.TOTAL")}`,identifiers=["armor"],artifactDies=[],totalArmor=this.actor.itemTypes.armor.reduce((sum,armor)=>{if(armor.itemProperties.part==="shield"||armor.state!=="equipped")return sum;let rollData=armor.getRollData(),value=armor.itemProperties.bonus.value;return rollData.artifactDie&&artifactDies.push(rollData.artifactDie),identifiers.push(armor.id),sum+value},0),data={title:rollName,gear:{label:localizeString("ITEM.TypeArmor"),name:localizeString("ITEM.TypeArmor"),value:totalArmor,artifactDie:artifactDies.join("+")}},options={maxPush:"0",...this.getRollOptions(...identifiers)};return!!totalArmor||!!artifactDies.length||!!options.modifiers.length?FBLRollHandler.createRoll(data,{...options,gears:this.getGears()}):ui.notifications.warn("WARNING.NO_ARMOR",{localize:!0})}rollSpecificArmor(armorId){let rollData=this.actor.items.get(armorId).getRollData(),rollName=`${localizeString("ITEM.TypeArmor")}: ${rollData.name}`;if(rollData.isBroken)throw this.broken("item");let data={title:rollName,gear:rollData},options={maxPush:"0",...this.getRollOptions("armor",armorId)};return FBLRollHandler.createRoll(data,{...options,gears:this.getGears()})}rollAttribute(attrName){if(!this.actor.canAct)throw this.broken();let data={title:attrName,attribute:this.getAttribute(attrName)},options={...this.getRollOptions(attrName)};return FBLRollHandler.createRoll(data,{...options,gears:this.getGears()})}rollGear(itemId){if(!this.actor.canAct)throw this.broken();let properties=this.getGear(itemId),data={title:properties.gear.name,...properties},options={...this.getRollOptions(data.skill?.name,data.attribute?.name,data.gear.itemId)};return FBLRollHandler.createRoll(data,{...options,gears:this.getGears()})}rollSkill(skillName){if(!this.actor.canAct)throw this.broken();let data={title:skillName,...this.getSkill(skillName)},options={...this.getRollOptions(skillName,data.attribute?.name)};return FBLRollHandler.createRoll(data,{...options,gears:this.getGears()})}rollSpell(spellId){if(!this.actor.canAct)throw this.broken();if(!this.actor.willpower.value&&!this.actorProperties.subtype?.type==="npc")throw ui.notifications.warn("WARNING.NO_WILLPOWER",{localize:!0});let spell=this.actor.items.get(spellId),{value}=duplicate(this.actor.willpower),hasPsych=!!this.actor.items.getName("Psychic Power (Half-Elf)"),data={title:spell.name,attribute:{name:spell.name,value:1},spell:{willpower:{max:--value,value},psych:hasPsych,item:spell}};this.actorProperties.subtype?.type==="npc"&&(data.spell.willpower={max:9,value:9});let options={maxPush:"0",template:"systems/forbidden-lands/templates/components/roll-engine/spell-dialog.hbs",type:"spell",skulls:this.altInteraction,...this.getRollOptions()};return FBLRollHandler.createRoll(data,{...options,gears:this.getGears()})}async _renderInner(data,options){return data.alternativeSkulls=this.altInteraction,super._renderInner(data,options)}computeSkills(data){for(let skill of Object.values(data.system.skill))skill[`has${skill?.attribute?.capitalize()}`]=!1,CONFIG.fbl.attributes.includes(skill.attribute)&&(skill[`has${skill.attribute.capitalize()}`]=!0);return data}computeItems(data){for(let item of Object.values(data.items))item.system.part==="shield"?item.isWeapon=!0:CONFIG.fbl.itemTypes.includes(item.type)&&(item[`is${item.type.capitalize()}`]=!0),item.isEquipped=item.flags?.state==="equipped",item.isCarried=item.flags?.state==="carried";return data}computeItemEncumbrance(data){let type=data.type,weight=Number.isNaN(Number(data?.system.weight))?this.config.encumbrance[data?.system.weight]??1:Number(data?.system.weight)??1;return data.flags?.state?type==="rawMaterial"?1*Number(data.system.quantity):["gear","armor","weapon"].includes(type)?weight:0:0}async#enrichTextEditorFields(data){let fields=CONFIG.fbl.enrichedActorFields;for(let field of fields)data.system.bio?.[field]?.value&&(data.system.bio[field].value=await TextEditor.enrichHTML(data.system.bio[field].value,{async:!0}));return data}#getCarriedStates(){return CONFIG.fbl.carriedStates.map(state=>({name:state,collapsed:this.actor.getFlag("forbidden-lands",`${state}-collapsed`)}))}#getSortKey(state){return this.actor.getFlag("forbidden-lands",`${state??"none"}-sort`)||"name"}#sortGear(a,b3,key){switch(key){case"name":case"type":return a[key]?.toLocaleLowerCase().localeCompare(b3[key]?.toLocaleLowerCase())??0;case"attribute":{let aComp=a.type==="rawMaterial"?a.system.quantity:a.system.bonus.value,bComp=b3.type==="rawMaterial"?b3.system.quantity:b3.system.bonus.value;return Number(bComp)-Number(aComp)}case"weight":{let weightMap=CONFIG.fbl.encumbrance,aWeight=a.type==="rawMaterial"?Number(a.system.quantity):Math.floor(weightMap[a.system.weight]||0);return(b3.type==="rawMaterial"?Number(b3.system.quantity):Math.floor(weightMap[b3.system.weight]||0))-aWeight}}}#filterGear(items){let reduced=(items?.filter(({type})=>CONFIG.fbl.carriedItemTypes.includes(type)).map(item=>({...item,state:item.flags?.state||"none"}))).reduce((acc,item)=>{let{state}=item;return acc[state]||(acc[state]=[]),acc[state].push(item),acc},{});return Object.fromEntries(Object.entries(reduced).map(([key,arr])=>[key,arr.sort((a,b3)=>this.#sortGear(a,b3,this.#getSortKey(key)))]))}#onItemCreate(event){let itemType=$(event.currentTarget).data("type"),label=CONFIG.fbl.i18n[itemType];this.actor.createEmbeddedDocuments("Item",{name:`${game.i18n.localize(label)}`,type:itemType},{renderSheet:!0})}async#onCreateDialog(event){event.preventDefault();let state=$(event.target).closest("[data-state]")?.data("state");Hooks.once("renderDialog",(_2,html)=>html.find("option").filter((_i,el)=>["criticalInjury","building","hireling","monsterAttack","monsterTalent","spell","talent"].includes(el.value)).remove());let item=await Item.createDialog({},{parent:this.actor});item&&item.setFlag("forbidden-lands","state",state==="none"?"":state)}};var ForbiddenLandsCharacterSheet=class extends ForbiddenLandsActorSheet{static get defaultOptions(){let useHealthAndResolve=game.settings.get("forbidden-lands","useHealthAndResolve");return mergeObject(super.defaultOptions,{classes:["forbidden-lands","sheet","actor"],width:660,height:useHealthAndResolve?790:740,resizable:!1,scrollY:[".armors .item-list .items",".critical-injuries .item-list .items",".gears .item-list .items",".spells .item-list .items",".talents .item-list .items",".weapons .item-list .items"],tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"main"}]})}get template(){return!game.user.isGM&&this.actor.limited?"systems/forbidden-lands/templates/actor/character/character-limited-sheet.hbs":this.actorProperties.subtype?.type==="npc"?"systems/forbidden-lands/templates/actor/character/npc-sheet.hbs":"systems/forbidden-lands/templates/actor/character/character-sheet.hbs"}async getData(){let actorData=await super.getData();return actorData=this.computeSkills(actorData),actorData=this.computeEncumbrance(actorData),actorData}activateListeners(html){super.activateListeners(html),html.find(".condition").click(async ev=>{let conditionName=$(ev.currentTarget).data("condition");this.actor.toggleCondition(conditionName),this._render()}),html.find(".roll-armor.specific").click(ev=>{let itemId=$(ev.currentTarget).data("itemId");this.rollSpecificArmor(itemId)}),html.find(".roll-armor.total").click(()=>this.rollArmor()),html.find(".roll-consumable").click(ev=>{let consumable=$(ev.currentTarget).data("consumable");return this.rollConsumable(consumable)}),html.find(".roll-reputation").click(()=>this.rollReputation()),html.find(".roll-pride").click(()=>this.rollPride()),html.find(".currency-button").on("click contextmenu",ev=>{let currency=$(ev.currentTarget).data("currency"),operator=$(ev.currentTarget).data("operator"),modifier=ev.type==="contextmenu"?5:1,coins=[this.actor.actorProperties.currency.gold.value,this.actor.actorProperties.currency.silver.value,this.actor.actorProperties.currency.copper.value],i={gold:0,silver:1,copper:2}[currency];if(operator==="plus")coins[i]+=modifier;else for(coins[i]-=modifier;i>=0;--i)coins[i]<0&&i>0&&(coins[i-1]-=1,coins[i]+=10);coins[0]>=0&&this.actor.update({"system.currency.gold.value":coins[0],"system.currency.silver.value":coins[1],"system.currency.copper.value":coins[2]})})}async rollConsumable(identifier){let consumable=this.actor.consumables[identifier];if(!consumable.value)return ui.notifications.warn("WARNING.NO_CONSUMABLE",{localize:!0});let rollName=localizeString(consumable.label),dice=CONFIG.fbl.consumableDice[consumable.value],options={name:rollName.toLowerCase(),maxPush:"0",consumable:identifier,type:"consumable",...this.getRollOptions()},roll=FBLRoll.create(`${dice}[${rollName}]`,{},options);await roll.roll({async:!0});let message=await roll.toMessage();Number(message.roll.result)<=(game.settings.get("forbidden-lands","autoDecreaseConsumable")||0)&&FBLRollHandler.decreaseConsumable(message.id)}async rollPride(){if(!this.actor.canAct)throw this.broken();let pride=this.actor.actorProperties.bio.pride,rollName=localizeString(pride.label),options={name:rollName,flavor:`${pride.value}`,maxPush:"0",...this.getRollOptions()},roll=FBLRoll.create(`${CONFIG.fbl.prideDice}[${rollName}]`,{},options);return await roll.roll({async:!0}),roll.toMessage()}async rollReputation(){let reputation=this.actor.actorProperties.bio.reputation,rollName=localizeString(reputation.label),options={name:rollName,flavor:`${reputation.value}`,maxPush:"0",...this.getRollOptions()},roll=FBLRoll.create(`${reputation.value}db[${rollName}]`,{},options);return await roll.roll({async:!0}),roll.toMessage()}async _charGen(){return(await new ForbiddenLandsCharacterGenerator(await ForbiddenLandsCharacterGenerator.loadDataset(),this.actor)).render(!0)}_onConfigureSheet(event){event.preventDefault(),new ActorSheetConfig(this.actor,{top:this.position.top+40,left:this.position.left+(this.position.width-400)/2}).render(!0)}_getHeaderButtons(){let buttons=super._getHeaderButtons();return this.actor.isOwner&&(buttons=[{label:game.i18n.localize("SHEET.HEADER.REST"),class:"rest-up",icon:"fas fa-bed",onclick:()=>this.actor.rest()},{label:game.i18n.localize("SHEET.HEADER.ROLL"),class:"custom-roll",icon:"fas fa-dice",onclick:()=>this.rollAction("ACTION.GENERIC")},{label:game.i18n.localize("SHEET.HEADER.CHAR_GEN"),class:"char-gen",icon:"fas fa-leaf",onclick:async()=>{Object.values(this.actor.actorProperties.attribute).flatMap(a=>a.value+a.max).some(v2=>v2>0)?Dialog.confirm({title:game.i18n.localize("FLCG.TITLE"),content:` +

${game.i18n.localize("FLCG.WARNING")}

+

${game.i18n.localize("FLCG.WARNING_DESTRUCTIVE_EDIT")}


+

${game.i18n.localize("FLCG.WARNING_HINT")}

+

${game.i18n.localize("FLCG.WARNING_ARE_YOU_SURE")}

+
`,yes:async()=>await this._charGen(),no:()=>{},defaultYes:!1}):await this._charGen()}}].concat(buttons)),buttons}};init_define_GLOBALPATHS();var ForbiddenLandsMonsterSheet=class extends ForbiddenLandsActorSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,classes:["forbidden-lands","sheet","actor"],template:"systems/forbidden-lands/templates/actor/monster/monster-sheet.hbs",width:700,height:770,resizable:!1,scrollY:[".monster-talents .item-list .items",".monster-attacks .item-list .items",".gears.item-list .items"],tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"main"}]})}async getData(){let actorData=await super.getData();return this.computeSkills(actorData),this.computeItems(actorData),this.computeEncumbrance(actorData),actorData}activateListeners(html){super.activateListeners(html),html.find(".roll-armor").click(ev=>this.rollArmor()&&ev.target.blur()),html.find("#monster-attack-btn").click(()=>this.rollAttack()),html.find(".roll-attack").click(ev=>{let itemId=$(ev.currentTarget).data("itemId");return this.rollSpecificAttack(itemId)}),html.find(".change-mounted").click(()=>{let boolean=this.actor.actorProperties.isMounted;this.actor.update({"data.isMounted":!boolean})})}async rollAttack(){let attacks=this.actor.itemTypes.monsterAttack,roll=await new Roll(`1d${attacks.length}`).roll({async:!0}),attack=attacks[parseInt(roll.result)-1];attack.sendToChat(),this.rollSpecificAttack(attack.id)}async rollSpecificAttack(attackId){if(!this.actor.canAct)throw this.broken();let attack=this.actor.items.get(attackId);if(attack.type!=="monsterAttack")return this.rollGear(attackId);let gear=attack.getRollData(),rollOptions=this.getRollOptions(),options={name:attack.name,maxPush:rollOptions.unlimitedPush?1e4:"0",isAttack:!0,isMonsterAttack:!0,damage:Number(attack.damage||0),gear,...rollOptions},dice=attack.itemProperties.usingStrength?this.actor.attributes.strength.value:attack.itemProperties.dice,roll=FBLRoll.create(`${dice}db[${attack.name}]`,{},options);return await roll.roll({async:!0}),roll.toMessage()}async rollArmor(){let armor=this.actorProperties.armor,rollName=`${localizeString("ITEM.TypeArmor")}: ${this.actor.name}`,options={name:rollName,maxPush:"0",...this.getRollOptions()},roll=FBLRoll.create(`${armor.value}dg[${rollName}]`,{},options);return await roll.roll({async:!0}),roll.toMessage(),!0}_getHeaderButtons(){let buttons=super._getHeaderButtons();return this.actor.isOwner&&(buttons=[{label:game.i18n.localize("SHEET.HEADER.REST"),class:"rest-up",icon:"fas fa-bed",onclick:()=>this.actor.rest()},{label:game.i18n.localize("SHEET.HEADER.ROLL"),class:"custom-roll",icon:"fas fa-dice",onclick:()=>this.rollAction("ACTION.GENERIC")}].concat(buttons)),buttons}};init_define_GLOBALPATHS();var ForbiddenLandsStrongholdSheet=class extends ForbiddenLandsActorSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,classes:["forbidden-lands","sheet","actor"],template:"systems/forbidden-lands/templates/actor/stronghold/stronghold-sheet.hbs",width:650,height:700,resizable:!1,scrollY:[".buildings.item-list .items",".hirelings.item-list .items",".gears.item-listing .items"],tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"building"}]})}async getData(){let actorData=await super.getData();return actorData.system.description=await TextEditor.enrichHTML(actorData.system.description,{async:!0}),this._computeItems(actorData),actorData}_computeItems(data){for(let item of Object.values(data.items))item.isWeapon=item.type==="weapon",item.isArmor=item.type==="armor",item.isGear=item.type==="gear",item.isRawMaterial=item.type==="rawMaterial",item.isBuilding=item.type==="building",item.isHireling=item.type==="hireling",(item.type!=="building"||item.type!=="hireling")&&(item.totalWeight=(CONFIG.fbl.encumbrance[item.system.weight]??item.system.weight??1)*(item.system.quantity??1))}activateListeners(html){super.activateListeners(html),html.find("details").on("click",e=>{let detail=$(e.target).closest("details"),content=detail.find("summary ~ *");detail.attr("open")?(e.preventDefault(),content.slideUp(200),setTimeout(()=>{detail.removeAttr("open")},200)):content.slideDown(200)})}};init_define_GLOBALPATHS();init_define_GLOBALPATHS();init_define_GLOBALPATHS();var noop=()=>{},CharacterPickerDialog=class _CharacterPickerDialog extends Dialog{static async show(title,characters,onSelect,onCancel){onSelect=onSelect||noop,onCancel=onCancel||noop;let characterSelector=await this.buildCharacterSelector(characters);new _CharacterPickerDialog({title,content:this.buildDivHtmlDialog(characterSelector),buttons:{cancel:{icon:'',label:"Cancel",callback:onCancel}},select:onSelect,default:"cancel",close:onCancel}).render(!0)}activateListeners(html){super.activateListeners(html),html.find(".party-member").click(this.handleCharacterSelect.bind(this))}handleCharacterSelect(event){this.data.select($(event.currentTarget).data("entity-id")),this.close()}static async buildCharacterSelector(characters){let html="",actor;for(let i=0;i${html}`}static buildDivHtmlDialog(divContent){return`
${divContent}
`}};init_define_GLOBALPATHS();init_define_GLOBALPATHS();var InfoDialog=class{static show(title,message,onClose){new Dialog({title,content:this.buildDivHtmlDialog(message),buttons:{ok:{icon:'',label:"OK",callback:onClose}},default:"ok",close:onClose}).render(!0)}static buildDivHtmlDialog(divContent){return`
${divContent}
`}};var Helpers=class{static getCharacterDiceRoller(character){if(character=character instanceof Actor?character:game.user.character,!character)return;let charSheetClass=()=>{};for(let chName in CONFIG.Actor.sheetClasses.character)if(chName==="forbidden-lands.ForbiddenLandsCharacterSheet"){charSheetClass=CONFIG.Actor.sheetClasses.character[chName].cls;break}let charSheet;for(let key in character.apps)if(character.apps[key]instanceof charSheetClass){charSheet=character.apps[key];break}return charSheet?charSheet.diceRoller:(InfoDialog.show(game.i18n.localize("FLPS.UI.ATTENTION"),game.i18n.localize("FLPS.UI.ERROR.OPEN_SHEET")),null)}static getOwnedCharacters(characterIds){characterIds=typeof characterIds!="object"&&characterIds!==""?[characterIds]:characterIds;let characters=[];for(let i=0;i1&&CharacterPickerDialog.show(`${localizeString("FLPS.UI.WHO_ROLLS")} ${localizeString(rollName)}`,assignedPartyMembers,entityId=>{rollTravelAction(game.actors.get(entityId),rollName)})}var TravelActionsConfig={hike:{key:"hike",journalEntryName:"Hike",name:"FLPS.TRAVEL.HIKE",buttons:[{name:"FLPS.TRAVEL_ROLL.FORCED_MARCH",class:"travel-forced-march",handler:party=>{handleTravelAction(party.actorProperties.travel.hike,"travel-forced-march")}},{name:"FLPS.TRAVEL_ROLL.HIKE_IN_DARKNESS",class:"travel-hike-in-darkness",handler:party=>{handleTravelAction(party.actorProperties.travel.hike,"travel-hike-in-darkness")}}]},lead:{key:"lead",journalEntryName:"Lead the Way",name:"FLPS.TRAVEL.LEAD",buttons:[{name:"FLPS.TRAVEL_ROLL.NAVIGATE",class:"travel-navigate",handler:party=>{handleTravelAction(party.actorProperties.travel.lead,"travel-navigate")}}]},watch:{key:"watch",journalEntryName:"Keep Watch",name:"FLPS.TRAVEL.WATCH",buttons:[{name:"FLPS.TRAVEL_ROLL.KEEP_WATCH",class:"travel-keep-watch",handler:party=>{handleTravelAction(party.actorProperties.travel.watch,"travel-keep-watch")}}]},camp:{key:"camp",journalEntryName:"Make Camp",name:"FLPS.TRAVEL.CAMP",buttons:[{name:"FLPS.TRAVEL_ROLL.MAKE_CAMP",class:"travel-make-camp",handler:party=>{handleTravelAction(party.actorProperties.travel.camp,"travel-make-camp")}}]},rest:{key:"rest",journalEntryName:"Rest",name:"FLPS.TRAVEL.REST",buttons:[{name:"FLPS.TRAVEL.REST",class:"travel-rest",handler:party=>{handleTravelAction(party.actorProperties.travel.rest,"rest")}}]},sleep:{key:"sleep",journalEntryName:"Sleep",name:"FLPS.TRAVEL.SLEEP",buttons:[{name:"FLPS.TRAVEL.REST",class:"travel-sleep",handler:party=>{handleTravelAction(party.actorProperties.travel.sleep,"rest")}},{name:"FLPS.TRAVEL_ROLL.FIND_GOOD_PLACE",class:"travel-find-good-place",handler:party=>{handleTravelAction(party.actorProperties.travel.sleep,"travel-find-good-place")}}]},other:{key:"other",journalEntryName:"",name:"FLPS.TRAVEL.OTHER",buttons:[]},forage:{key:"forage",journalEntryName:"Forage",name:"FLPS.TRAVEL.FORAGE",buttons:[{name:"FLPS.TRAVEL_ROLL.FIND_FOOD",class:"travel-find-food",handler:party=>{handleTravelAction(party.actorProperties.travel.forage,"travel-find-food")}}]},hunt:{key:"hunt",journalEntryName:"Hunt",name:"FLPS.TRAVEL.HUNT",buttons:[{name:"FLPS.TRAVEL_ROLL.FIND_PREY",class:"travel-find-prey",handler:party=>{handleTravelAction(party.actorProperties.travel.hunt,"travel-find-prey")}},{name:"FLPS.TRAVEL_ROLL.KILL_PREY",class:"travel-kill-prey",handler:party=>{handleTravelAction(party.actorProperties.travel.hunt,"travel-kill-prey")}}]},fish:{key:"fish",journalEntryName:"Fish",name:"FLPS.TRAVEL.FISH",buttons:[{name:"FLPS.TRAVEL_ROLL.CATCH_FISH",class:"travel-catch-fish",handler:party=>{handleTravelAction(party.actorProperties.travel.fish,"travel-catch-fish")}}]}};var ForbiddenLandsPartySheet=class extends ActorSheet{static get defaultOptions(){let dragDrop=[...super.defaultOptions.dragDrop];return dragDrop.push({dragSelector:".party-member",dropSelector:".party-member-list"}),mergeObject(super.defaultOptions,{classes:["forbidden-lands","sheet","actor","party"],template:"systems/forbidden-lands/templates/actor/party/party-sheet.hbs",width:window.innerWidth*.05+650,resizable:!1,tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"main"}],dragDrop})}get actorProperties(){return this.actor.system}async getData(){let data=await super.getData().data;data.partyMembers={},data.travelActions=this.getTravelActions(),data.encounterTables=await this.getEncounterTables(),data.isGm=game.user.isGM;let ownedActorId;for(let i=0;i<(data.system.members||[]).length;i++)ownedActorId=data.system.members[i],data.partyMembers[ownedActorId]=game.actors.get(ownedActorId);return data.system.description=await TextEditor.enrichHTML(data.system.description,{async:!0}),data}activateListeners(html){super.activateListeners(html),html.find(".item-delete").click(this.handleRemoveMember.bind(this)),html.find(".reset").click(event=>{event.preventDefault(),this.resetTravelActions(),this.render(!0)}),html.find(".encounter-table").click(async event=>{event.preventDefault();let target=event.currentTarget;await game.tables.get(target.dataset.id).draw()}),html.find(".configure-tables").click(async event=>{event.preventDefault(),await new TableConfigMenu().render(!0),this.render(!0)});let button;for(let key in TravelActionsConfig)for(let i=0;igame.actors.get(id));return travelActions}async getEncounterTables(){let tableSettings=game.settings.get("forbidden-lands","encounterTables");return Object.fromEntries(Object.entries(tableSettings).filter(t=>!!t[1]).map(t=>[localizeString(t[0]),t[1]]))}async handleRemoveMember(event){event.preventDefault();let div=$(event.currentTarget).parents(".party-member"),entityId=div.data("entity-id"),partyMembers=this.actorProperties.members;partyMembers.splice(partyMembers.indexOf(entityId),1);let updateData={"data.members":partyMembers},travelAction,actionParticipants;for(let travelActionKey in this.actorProperties.travel)travelAction=this.actorProperties.travel[travelActionKey],!(travelAction.indexOf(entityId)<0)&&(typeof travelAction=="object"?(actionParticipants=[...travelAction],actionParticipants.splice(actionParticipants.indexOf(entityId),1),updateData[`data.travel.${travelActionKey}`]=actionParticipants):updateData[`data.travel.${travelActionKey}`]="");await this.actor.update(updateData),div.slideUp(200,()=>this.render(!1))}_onDragStart(event){if(event.currentTarget.dataset.itemId!==void 0){super._onDragStart(event);return}let entityId=event.currentTarget.dataset.entityId;event.dataTransfer.setData("text/plain",JSON.stringify({type:"Actor",action:"assign",uuid:`Actor.${entityId}`}))}async _onDrop(event){super._onDrop(event);let draggedItem=JSON.parse(event.dataTransfer.getData("text/plain"));if(!draggedItem||draggedItem.type!=="Actor")return;let actorId=draggedItem.uuid.split(".")[1],actor=game.actors.get(actorId);if(actor?.type==="character")return draggedItem.action==="assign"?await this.handleTravelActionAssignment(event,actor):await this.handleAddToParty(actor),this.render(!0)}async handleTravelActionAssignment(event,actor){let targetElement=event.toElement?event.toElement:event.target,actionContainer=targetElement.classList.contains("travel-action")?targetElement:targetElement.closest(".travel-action");if(actionContainer!==null)return this.assignPartyMemberToAction(actor,actionContainer.dataset.travelAction)}async assignPartyMemberToAction(partyMember,travelActionKey){let travelAction=this.actorProperties.travel[travelActionKey];if(travelAction.includes(partyMember.id))return;let currentAction=Object.entries(this.actorProperties.travel).find(([_2,array])=>array.includes(partyMember.id)),updateData={[`system.travel.${travelActionKey}`]:[...travelAction,partyMember.id],[`system.travel.${currentAction[0]}`]:currentAction[1].filter(id=>id!==partyMember.id)};return this.actor.update(updateData)}async handleAddToParty(actor){let partyMembers=this.actorProperties.members,initialCount=partyMembers.length;if(partyMembers=[...new Set([...partyMembers,actor.id])],initialCount===partyMembers.length)return;let travelOther=[...this.actorProperties.travel.other,actor.id];return this.actor.update({"system.members":partyMembers,"system.travel.other":travelOther})}async resetTravelActions(){let updates=Object.keys(this.actorProperties.travel).reduce((acc,key)=>(key==="other"?acc[`system.travel.${key}`]=this.actorProperties.members:acc[`system.travel.${key}`]=[],acc),{});return this.actor.update(updates)}};init_define_GLOBALPATHS();init_define_GLOBALPATHS();var ForbiddenLandsItemSheet=class _ForbiddenLandsItemSheet extends ItemSheet{get itemData(){return this.item.data}get itemProperties(){return this.item.system}get config(){return CONFIG.fbl}static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,classes:["forbidden-lands","sheet","item"],width:window.innerWidth*.08+350,resizable:!1})}static async enrichContent(content,isOwner){return TextEditor.enrichHTML(content,{async:!0,secrets:isOwner})}_getHeaderButtons(){let buttons=super._getHeaderButtons();return buttons=[{label:game.i18n.localize("SHEET.HEADER.POST_ITEM"),class:"item-post",icon:"fas fa-comment",onclick:()=>{this.item.sendToChat()}}].concat(buttons),buttons}#computeQuality(data){return data.artifact=!!data.system.artifactBonus,data.lethal=data.system.lethal==="yes",data.ranks=data.system.type==="general"||data.system.type==="profession",data}async#enrichTextEditorFields(data){let fields=CONFIG.fbl.enrichedItemFields;for(let field of fields){let[key,subKey]=field.split(".");subKey&&data.system[key]?.[subKey]?data.system[key][subKey]=await _ForbiddenLandsItemSheet.enrichContent(data.system[key][subKey],game.user.isGM):data.system[key]&&(data.system[field]=await _ForbiddenLandsItemSheet.enrichContent(data.system[field],game.user.isGM))}return data}async getData(){let data=super.getData().data;return data.flags=this.item.flags["forbidden-lands"],data.encumbranceValues=this.config.encumbrance,data.isGM=game.user.isGM,data=this.#computeQuality(data),data=await this.#enrichTextEditorFields(data),data}_onChangeTab(event,tabs,active){return $(`#${this.id} textarea`).each(function(){this.value&&(this.readOnly=!0,this.setAttribute("style",`height:${this.scrollHeight}px;overflow-y:hidden;`))}),super._onChangeTab(event,tabs,active)}activateListeners(html){super.activateListeners(html),html.find(".add-modifier").click(async ev=>{ev.preventDefault();let rollModifiers=(await this.getData()).system.rollModifiers||{},modifierId=Math.max(-1,...Object.getOwnPropertyNames(rollModifiers))+1,update={};update[`data.rollModifiers.${modifierId}`]={name:"ATTRIBUTE.STRENGTH",value:"+1"},await this.item.update(update)}),html.find(".delete-modifier").click(async ev=>{ev.preventDefault();let data=await this.getData(),rollModifiers=duplicate(data.system.rollModifiers||{}),modifierId=$(ev.currentTarget).data("modifier-id");delete rollModifiers[modifierId];for(let key in Object.keys(rollModifiers))rollModifiers[key]||delete rollModifiers[key];await this.item.update({"data.rollModifiers":null}),Object.keys(rollModifiers).length>0&&await this.item.update({"data.rollModifiers":rollModifiers})}),html.find(".change-bonus").on("click contextmenu",ev=>{let bonus=this.itemProperties.bonus,value=bonus.value,altInteraction=game.settings.get("forbidden-lands","alternativeSkulls");ev.type==="click"&&!altInteraction||ev.type==="contextmenu"&&altInteraction?value=Math.max(value-1,0):(ev.type==="contextmenu"&&!altInteraction||ev.type==="click"&&altInteraction)&&(value=Math.min(value+1,bonus.max)),this.object.update({"data.bonus.value":value})}),html.find(".feature").click(async ev=>{let featureName=$(ev.currentTarget).data("feature"),features=this.object.itemProperties.features;CONFIG.fbl.weaponFeatures.includes(featureName)&&this.object.update({[`system.features.${featureName}`]:!features[featureName]}),this._render()}),html.find(".hide-field").click(ev=>{let fieldName=$(ev.currentTarget).data("fieldname"),currentValue=this.object.getFlag("forbidden-lands",fieldName);this.object.setFlag("forbidden-lands",fieldName,!currentValue)})}async getCustomRollModifiers(){let pack=game.packs.get("world.customrollmodifiers");return pack?(await pack.getContent()).map(item=>item.name):[]}async _renderInner(data,options){let showField=field=>{let enabledInSettings=game.settings.get("forbidden-lands",`show${field}Field`),isVisibleToPlayer=game.user.isGM||!this.object.getFlag("forbidden-lands",field);return enabledInSettings&&isVisibleToPlayer};return data={...data,alternativeSkulls:game.settings.get("forbidden-lands","alternativeSkulls"),showCraftingFields:game.settings.get("forbidden-lands","showCraftingFields"),showCostField:game.settings.get("forbidden-lands","showCostField"),showSupplyField:game.settings.get("forbidden-lands","showSupplyField"),showEffectField:showField("Effect"),showDescriptionField:showField("Description"),showDrawbackField:showField("Drawback"),showAppearanceField:showField("Appearance")},data.system.customRollModifiers=await this.getCustomRollModifiers(),super._renderInner(data,options)}};var ForbiddenLandsWeaponSheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/weapon/weapon-sheet.hbs",tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"main"}]})}};init_define_GLOBALPATHS();var ForbiddenLandsArmorSheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/armor/armor-sheet.hbs",tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"main"}]})}};init_define_GLOBALPATHS();var ForbiddenLandsGearSheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/gear/gear-sheet.hbs",tabs:[{navSelector:".sheet-tabs",contentSelector:".sheet-body",initial:"main"}]})}};init_define_GLOBALPATHS();var ForbiddenLandsRawMaterialSheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/raw-material/raw-material-sheet.hbs"})}};init_define_GLOBALPATHS();var ForbiddenLandsSpellSheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/spell/spell-sheet.hbs"})}};init_define_GLOBALPATHS();var ForbiddenLandsTalentSheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/talent/talent-sheet.hbs"})}};init_define_GLOBALPATHS();var ForbiddenLandsCriticalInjurySheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/critical-injury/critical-injury-sheet.hbs",width:400,height:310})}};init_define_GLOBALPATHS();var ForbiddenLandsMonsterAttackSheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/monster-attack/monster-attack-sheet.hbs"})}};init_define_GLOBALPATHS();var ForbiddenLandsBuildingSheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/building/building-sheet.hbs"})}};init_define_GLOBALPATHS();var ForbiddenLandsHirelingSheet=class extends ForbiddenLandsItemSheet{static get defaultOptions(){return mergeObject(super.defaultOptions,{...super.defaultOptions,template:"systems/forbidden-lands/templates/item/hireling/hireling-sheet.hbs"})}};init_define_GLOBALPATHS();var AdventureSitesSheet=class extends JournalSheet{get template(){return"systems/forbidden-lands/templates/journal/adventure-sites/adventure-site-sheet.hbs"}getData(options){let data=super.getData(options);return data.type=this.object.type,data}activateListeners(html){super.activateListeners(html),html.find('[data-action="add-room"]').on("click",async()=>{let type=this.object.type,path=CONFIG.fbl.adventureSites.types[type],room=await CONFIG.fbl.adventureSites?.generate(path,`${type}_rooms`),pageName=$(room).find("h4, strong")?.first().text().replace(/[^\p{L}]+/u," ").trim();await this.object.createEmbeddedDocuments("JournalEntryPage",[{name:pageName,title:{level:2,show:!1},text:{content:room}}])})}};function registerSheets(){Actors.unregisterSheet("core",ActorSheet),Actors.registerSheet("forbidden-lands",ForbiddenLandsCharacterSheet,{types:["character"],makeDefault:!0}),Actors.registerSheet("forbidden-lands",ForbiddenLandsMonsterSheet,{types:["monster"],makeDefault:!0}),Actors.registerSheet("forbidden-lands",ForbiddenLandsStrongholdSheet,{types:["stronghold"],makeDefault:!0}),Actors.registerSheet("forbidden-lands",ForbiddenLandsPartySheet,{types:["party"],makeDefault:!0}),Items.unregisterSheet("core",ItemSheet),Items.registerSheet("forbidden-lands",ForbiddenLandsWeaponSheet,{types:["weapon"],makeDefault:!0}),Items.registerSheet("forbidden-lands",ForbiddenLandsArmorSheet,{types:["armor"],makeDefault:!0}),Items.registerSheet("forbidden-lands",ForbiddenLandsGearSheet,{types:["gear"],makeDefault:!0}),Items.registerSheet("forbidden-lands",ForbiddenLandsRawMaterialSheet,{types:["rawMaterial"],makeDefault:!0}),Items.registerSheet("forbidden-lands",ForbiddenLandsSpellSheet,{types:["spell"],makeDefault:!0}),Items.registerSheet("forbidden-lands",ForbiddenLandsTalentSheet,{types:["talent"],makeDefault:!0}),Items.registerSheet("forbidden-lands",ForbiddenLandsCriticalInjurySheet,{types:["criticalInjury"],makeDefault:!0}),Items.registerSheet("forbidden-lands",ForbiddenLandsMonsterAttackSheet,{types:["monsterAttack"],makeDefault:!0}),Items.registerSheet("forbidden-lands",ForbiddenLandsBuildingSheet,{types:["building"],makeDefault:!0}),Items.registerSheet("forbidden-lands",ForbiddenLandsHirelingSheet,{types:["hireling"],makeDefault:!0}),CONFIG.fbl.adventureSites.sheetClass=AdventureSitesSheet}init_define_GLOBALPATHS();var ForbiddenLandsTokenHUD=class extends TokenHUD{_getStatusEffectChoices(){let actor=this.object.document.actor,data=super._getStatusEffectChoices();if(actor?.type==="character")return data;for(let[key,effect]of Object.entries(data))effect&&CONFIG.fbl.conditions.includes(effect?.id)&&delete data[key];return data}};Hooks.once("init",()=>{FoundryOverrides(),registerSettings(),registerHooks(),game.fbl={config:config_default,roll:FBLRollHandler.createRoll},CONFIG.Actor.documentClass=ForbiddenLandsActor,CONFIG.Item.documentClass=ForbiddenLandsItem,CONFIG.JournalEntry.documentClass=ForbiddenLandsJournalEntry,CONFIG.statusEffects=[...CONFIG.statusEffects.filter(effect=>!["sleep","frozen","curse"].includes(effect.id)),...config_default.statusEffects],CONFIG.fbl=config_default,CONFIG.fbl.adventureSites.utilities=utilities,CONFIG.fbl.adventureSites.generate=(path,adventureSite)=>init(path,adventureSite),YearZeroRollManager.register("fbl",{"ROLL.chatTemplate":"systems/forbidden-lands/templates/components/roll-engine/roll.hbs","ROLL.tooltipTemplate":"systems/forbidden-lands/templates/components/roll-engine/tooltip.hbs","ROLL.infosTemplate":"systems/forbidden-lands/templates/components/roll-engine/infos.hbs"}),CONFIG.Dice.terms[6]=ForbiddenLandsD6,registerYZURLabels(),registerSheets(),initializeHandlebars(),initializeEditorEnrichers(),registerFonts(),modifyConfig(),game.settings.get("forbidden-lands","darkmode")&&$("html").addClass("dark")});Hooks.once("ready",()=>{migrateWorld(),displayMessages(),importMacros(),game.system.documentTypes.Item=game.system.documentTypes.Item.filter(type=>type!=="monsterTalent"),game.settings.get("forbidden-lands","autoDecreaseConsumable")===0&&Hooks.on("getChatLogEntryContext",(_html,options)=>{let isConsumableRoll=li=>!!li.find(".consumable-result").length;options.push({name:localizeString("CONTEXT.REDUCE_CONSUMABLE"),icon:"",condition:isConsumableRoll,callback:li=>FBLRollHandler.decreaseConsumable(li.attr("data-message-id")||"")})})});Hooks.on("canvasReady",canvas=>{canvas.hud.token=new ForbiddenLandsTokenHUD});})();