From 0478bbbd9a50beaea5194f8115e70d52937f2ac7 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Wed, 27 Nov 2024 19:14:10 -0800 Subject: [PATCH] Initial Commit --- .gitignore | 49 + .prettierignore | 13 + .prettierrc.json | 15 + LICENSE | 331 +- README.md | 10 + assets/audio/grunt1.ogg | Bin 0 -> 11397 bytes assets/audio/grunt2.ogg | Bin 0 -> 14316 bytes assets/audio/grunt3.ogg | Bin 0 -> 14666 bytes assets/audio/grunt4.ogg | Bin 0 -> 19678 bytes assets/audio/grunt5.ogg | Bin 0 -> 14219 bytes assets/audio/shield-bash.ogg | Bin 0 -> 24931 bytes assets/audio/swoosh1.ogg | Bin 0 -> 12207 bytes assets/audio/swoosh2.ogg | Bin 0 -> 6918 bytes assets/icons/abbot-meeple.svg | 1 + assets/icons/abdominal-armor.svg | 1 + assets/icons/acrobatic.svg | 1 + assets/icons/acrobatics.svg | 4 + assets/icons/acting.svg | 1 + assets/icons/ages.svg | 1 + assets/icons/agriculture.svg | 1 + assets/icons/agrik.png | Bin 0 -> 53928 bytes assets/icons/alchemy.svg | 1 + assets/icons/anatomy.svg | 1 + assets/icons/anchor.svg | 1 + assets/icons/anemia.svg | 43 + assets/icons/animalcraft.svg | 1 + assets/icons/anvil-impact.svg | 1 + assets/icons/anvil.svg | 1 + assets/icons/apron.svg | 4 + assets/icons/aquarius.svg | 672 + assets/icons/aries.svg | 402 + assets/icons/arm-bandage.svg | 1 + assets/icons/arm-sling.svg | 1 + assets/icons/armor-vest.svg | 1 + assets/icons/armor.svg | 1 + assets/icons/arrow.svg | 1 + assets/icons/arrowed.svg | 1 + assets/icons/astrology.svg | 1 + assets/icons/atlas.svg | 1 + assets/icons/aura.svg | 1 + assets/icons/awareness.svg | 1 + assets/icons/axe.svg | 1 + assets/icons/back-pain.svg | 1 + assets/icons/backstab.svg | 1 + assets/icons/backup.svg | 1 + assets/icons/badger.svg | 6 + assets/icons/baldr.svg | 1463 ++ assets/icons/bandage-roll.svg | 1 + assets/icons/barbute.svg | 1 + assets/icons/basket.svg | 18 + assets/icons/bass.svg | 14 + assets/icons/battle-axe.svg | 1 + assets/icons/beams-aura.svg | 1 + assets/icons/bear.svg | 7 + assets/icons/bell-shield.svg | 1 + assets/icons/biceps.svg | 1 + assets/icons/bison.svg | 19 + assets/icons/black-knight-helm.svg | 1 + assets/icons/blacksmith.svg | 1 + assets/icons/blowgun.svg | 28 + assets/icons/boar.svg | 14 + assets/icons/boat-fishing.svg | 1 + assets/icons/bobcat.svg | 1 + assets/icons/body-balance.svg | 1 + assets/icons/body-height.svg | 1 + assets/icons/body-swapping.svg | 1 + assets/icons/body.svg | 13 + assets/icons/bolas.svg | 1 + assets/icons/bone-knife.svg | 1 + assets/icons/book-cover.svg | 1 + assets/icons/book-sparkles.svg | 84 + assets/icons/book.svg | 1 + assets/icons/boomerang.svg | 4 + assets/icons/boots.svg | 1 + assets/icons/bottle-vapors.svg | 1 + assets/icons/bowman.svg | 1 + assets/icons/bracer.svg | 1 + assets/icons/brain-dump.svg | 1 + assets/icons/brandy-bottle.svg | 1 + assets/icons/breastplate.svg | 1 + assets/icons/brewing.svg | 1 + assets/icons/brick-pile.svg | 1 + assets/icons/brick-wall.svg | 1 + assets/icons/bright-explosion.svg | 1 + assets/icons/broad-dagger.svg | 1 + assets/icons/bubbling-flask.svg | 1 + assets/icons/buffalo-head.svg | 1 + assets/icons/bull.svg | 1 + assets/icons/bullseye.svg | 1 + assets/icons/burning-dot.svg | 1 + assets/icons/burning-meteor.svg | 1 + assets/icons/caduceus.svg | 1 + assets/icons/camp-cooking-pot.svg | 1 + assets/icons/campfire.svg | 1 + assets/icons/cancer.svg | 667 + assets/icons/candle-flame.svg | 1 + assets/icons/candle-holder.svg | 1 + assets/icons/candle.svg | 1 + assets/icons/cap.svg | 1 + assets/icons/capricorn.svg | 464 + assets/icons/carrying-sack.svg | 15 + assets/icons/cartwheel.svg | 1 + assets/icons/cash.svg | 1 + assets/icons/category.svg | 21 + assets/icons/catfish.svg | 10 + assets/icons/cauldron.svg | 1 + assets/icons/cavalry.svg | 1 + assets/icons/caveman.svg | 1 + assets/icons/celebration-fire.svg | 1 + assets/icons/centaur.svg | 1 + assets/icons/ceramics.svg | 4 + assets/icons/ceremonial-mask.svg | 1 + assets/icons/chain-mail.svg | 1 + assets/icons/chalk-outline-murder.svg | 1 + assets/icons/character.svg | 1 + assets/icons/charm.svg | 23 + assets/icons/chemical-drop.svg | 1 + assets/icons/chest-armor.svg | 1 + assets/icons/chest.svg | 1 + assets/icons/chicken.svg | 7 + assets/icons/circle.svg | 1 + assets/icons/claw.svg | 5 + assets/icons/climbing.svg | 1 + assets/icons/cloak-dagger.svg | 62 + assets/icons/cloak.svg | 4 + assets/icons/closed-barbute.svg | 1 + assets/icons/club.svg | 1 + assets/icons/cobweb.svg | 1 + assets/icons/coiling-curl.svg | 1 + assets/icons/coins.svg | 1 + assets/icons/coma.svg | 1 + assets/icons/concentration-orb.svg | 1 + assets/icons/confrontation.svg | 1 + assets/icons/conqueror.svg | 1 + assets/icons/contortionist.svg | 1 + assets/icons/convict.svg | 1 + assets/icons/convince.svg | 1 + assets/icons/cook.svg | 1 + assets/icons/cookery.svg | 1 + assets/icons/cooking-pot.svg | 1 + assets/icons/corner-explosion.svg | 1 + assets/icons/cow.svg | 7 + assets/icons/creativity.svg | 26 + assets/icons/crested-helmet.svg | 1 + assets/icons/cross-mark.svg | 1 + assets/icons/crossbow.svg | 1 + assets/icons/crossed-axes.svg | 1 + assets/icons/crossed-swords.svg | 1 + assets/icons/crow.svg | 3 + assets/icons/crowbar.svg | 15 + assets/icons/crystal-wand.svg | 1 + assets/icons/cultist.svg | 1 + assets/icons/curling-vines.svg | 1 + assets/icons/curly-mask.svg | 1 + assets/icons/daemon-skull.svg | 1 + assets/icons/dagger.svg | 1 + assets/icons/damage.svg | 1 + assets/icons/dance.svg | 1 + assets/icons/dart.svg | 2 + assets/icons/deadly-strike.svg | 1 + assets/icons/deer-track.svg | 1 + assets/icons/deer.svg | 1 + assets/icons/default-action.svg | 15 + assets/icons/despair.svg | 1 + assets/icons/dice-d20.svg | 1 + assets/icons/dice-d6.svg | 1 + assets/icons/dig-dug.svg | 1 + assets/icons/disease.svg | 2 + assets/icons/distraction.svg | 1 + assets/icons/divination.svg | 1 + assets/icons/dodge.svg | 1 + assets/icons/dodging.svg | 1 + assets/icons/donkey.svg | 4 + assets/icons/dorsal-scales.svg | 1 + assets/icons/double-face-mask.svg | 1 + assets/icons/double-ringed-orb.svg | 1 + assets/icons/dove.svg | 6 + assets/icons/drama-masks.svg | 1 + assets/icons/drawing.svg | 1 + assets/icons/dread.svg | 1 + assets/icons/dress.svg | 1 + assets/icons/drum.svg | 30 + assets/icons/duality.svg | 1 + assets/icons/duck.svg | 16 + assets/icons/dulcimer.svg | 30 + assets/icons/eagle.svg | 1 + assets/icons/egyptian-walk.svg | 1 + assets/icons/elbow-pad.svg | 1 + assets/icons/embalming.svg | 1 + assets/icons/embrassed-energy.svg | 1 + assets/icons/emerald.svg | 1 + assets/icons/empathy.svg | 22 + assets/icons/energy-arrow.svg | 1 + assets/icons/engineering.svg | 1 + assets/icons/enrage.svg | 1 + assets/icons/entangled-typhoon.svg | 1 + assets/icons/event.svg | 30 + assets/icons/explosion-rays.svg | 1 + assets/icons/face-to-face.svg | 1 + assets/icons/falcon.svg | 1 + assets/icons/falling.svg | 1 + assets/icons/fangs.svg | 1 + assets/icons/farmer.svg | 1 + assets/icons/fat.svg | 1 + assets/icons/feather.svg | 1 + assets/icons/fire-dash.svg | 1 + assets/icons/fire-silhouette.svg | 1 + assets/icons/fire.svg | 54 + assets/icons/fireball.svg | 1 + assets/icons/fish-scales.svg | 1 + assets/icons/fishing.svg | 1 + assets/icons/flail.svg | 1 + assets/icons/flanged-mace.svg | 1 + assets/icons/flat-paw-print.svg | 1 + assets/icons/flax.svg | 1 + assets/icons/flute.svg | 1 + assets/icons/footprint.svg | 1 + assets/icons/foraging.svg | 1 + assets/icons/fox.svg | 1 + assets/icons/freyja.svg | 664 + assets/icons/freyr.svg | 1273 ++ assets/icons/frozen-body.svg | 1 + assets/icons/full-wood-bucket.svg | 1 + assets/icons/galleon.svg | 1 + assets/icons/gauntlet.svg | 1 + assets/icons/gear.svg | 12 + assets/icons/gem-chain.svg | 1 + assets/icons/gem-pendant.svg | 1 + assets/icons/gemini.svg | 402 + assets/icons/gems.svg | 1 + assets/icons/ghost-ally.svg | 1 + assets/icons/giant.svg | 1 + assets/icons/glaive.svg | 1 + assets/icons/glassworking.svg | 1 + assets/icons/gloves.svg | 1 + assets/icons/goat.svg | 23 + assets/icons/goose.svg | 6 + assets/icons/grab-hold.svg | 4 + assets/icons/grab-take.svg | 5 + assets/icons/grainflail.svg | 4 + assets/icons/grappling-hook.svg | 27 + assets/icons/greaves.svg | 1 + assets/icons/guards.svg | 1 + assets/icons/halea.png | Bin 0 -> 34524 bytes assets/icons/half-body-crawling.svg | 1 + assets/icons/hammer.svg | 1 + assets/icons/hamster.svg | 11 + assets/icons/hand-sparkles.svg | 30 + assets/icons/hand.svg | 12 + assets/icons/hands.svg | 7 + assets/icons/harp.svg | 1 + assets/icons/hat.svg | 1 + assets/icons/hawk.svg | 2 + assets/icons/head-gear.svg | 12 + assets/icons/headbutt.svg | 13 + assets/icons/headshot.svg | 1 + assets/icons/heart-inside.svg | 1 + assets/icons/heart-organ.svg | 1 + assets/icons/heavy-helm.svg | 1 + assets/icons/hedgehog.svg | 13 + assets/icons/hel.svg | 1316 ++ assets/icons/helm.svg | 43 + assets/icons/heraldry.svg | 1 + assets/icons/herblore.svg | 1 + assets/icons/hidework.svg | 1 + assets/icons/high-kick.svg | 1 + assets/icons/high-punch.svg | 1 + assets/icons/hood.svg | 1 + assets/icons/hooded-assassin.svg | 1 + assets/icons/hooded-figure.svg | 1 + assets/icons/hoof.svg | 1 + assets/icons/horn.svg | 18 + assets/icons/horns.svg | 1 + assets/icons/horse-riding.svg | 1 + assets/icons/horse.svg | 9 + assets/icons/human-pyramid.svg | 1 + assets/icons/hunting.svg | 1 + assets/icons/icicles-aura.svg | 1 + assets/icons/ilvir.png | Bin 0 -> 11499 bytes assets/icons/imprisoned.svg | 1 + assets/icons/initiative.svg | 1 + assets/icons/injury.svg | 1 + assets/icons/ink.svg | 1 + assets/icons/inner-self.svg | 1 + assets/icons/internal-injury.svg | 1 + assets/icons/invisible.svg | 1 + assets/icons/jaguar.svg | 20 + assets/icons/jewel.svg | 5 + assets/icons/jeweled-chalice.svg | 1 + assets/icons/juggler.svg | 1 + assets/icons/jump-across.svg | 1 + assets/icons/jump.svg | 1 + assets/icons/jumping-rope.svg | 1 + assets/icons/key.svg | 1 + assets/icons/king.svg | 1 + assets/icons/knapsack.svg | 1 + assets/icons/knee-bandage.svg | 1 + assets/icons/knee-pad.svg | 1 + assets/icons/kneeling.svg | 1 + assets/icons/knockout.svg | 1 + assets/icons/knuckledusters.svg | 1 + assets/icons/lamellar.svg | 1 + assets/icons/lance.svg | 1 + assets/icons/lantern-flame.svg | 1 + assets/icons/lantern.svg | 1 + assets/icons/larani.png | Bin 0 -> 14375 bytes assets/icons/law.svg | 1 + assets/icons/leather-armor.svg | 1 + assets/icons/leather-boot.svg | 1 + assets/icons/leather-vest.svg | 1 + assets/icons/leg-armor.svg | 1 + assets/icons/leggings.svg | 1 + assets/icons/leo.svg | 639 + assets/icons/leopard.svg | 35 + assets/icons/libra.svg | 379 + assets/icons/light-helm.svg | 1 + assets/icons/lion.svg | 27 + assets/icons/lock.svg | 1 + assets/icons/locked-chest.svg | 1 + assets/icons/lockpicks.svg | 1 + assets/icons/loincloth.svg | 6 + assets/icons/loki.svg | 518 + assets/icons/longbow.svg | 1 + assets/icons/lore.svg | 1 + assets/icons/love.svg | 1 + assets/icons/lovers.svg | 1 + assets/icons/lute.svg | 21 + assets/icons/lynx.svg | 18 + assets/icons/lyre.svg | 1 + assets/icons/mace.svg | 1 + assets/icons/magic-portal.svg | 1 + assets/icons/magic-shield.svg | 1 + assets/icons/magic-wand.svg | 12 + assets/icons/magnifying-glass.svg | 1 + assets/icons/mail-shirt.svg | 1 + assets/icons/mailed-fist.svg | 1 + assets/icons/manacles.svg | 1 + assets/icons/mantle.svg | 8 + assets/icons/masonry.svg | 1 + assets/icons/master-of-arms.svg | 1 + assets/icons/mathematics.svg | 5 + assets/icons/medallist.svg | 1 + assets/icons/meditation.svg | 1 + assets/icons/meeple.svg | 1 + assets/icons/mental.svg | 1 + assets/icons/metal-bar.svg | 1 + assets/icons/metal-skirt.svg | 1 + assets/icons/mighty-force.svg | 1 + assets/icons/miner.svg | 1 + assets/icons/mining.svg | 1 + assets/icons/minions.svg | 1 + assets/icons/mirror.svg | 18 + assets/icons/miscgear.svg | 1 + assets/icons/mischevous.svg | 5 + assets/icons/morality.svg | 97 + assets/icons/morgath.png | Bin 0 -> 10625 bytes assets/icons/mounted-knight.svg | 1 + assets/icons/muscle-fat.svg | 1 + assets/icons/muscle-up.svg | 1 + assets/icons/muscle.svg | 1 + assets/icons/muscular-torso.svg | 1 + assets/icons/musical-notes.svg | 1 + assets/icons/musician-singing.svg | 1 + assets/icons/nails.svg | 39 + assets/icons/naveh.png | Bin 0 -> 12456 bytes assets/icons/needle.svg | 2 + assets/icons/net.svg | 1 + assets/icons/ninja-heroic-stance.svg | 1 + assets/icons/nunchaku.svg | 1 + assets/icons/odin.svg | 1625 ++ assets/icons/old-lantern.svg | 1 + assets/icons/oppression.svg | 1 + assets/icons/oratory.svg | 1 + assets/icons/otter.svg | 1 + assets/icons/overexertion.svg | 37 + assets/icons/owl.svg | 1 + assets/icons/ox.svg | 1 + assets/icons/padlock-open.svg | 1 + assets/icons/pan-flute.svg | 1 + assets/icons/parrot.svg | 21 + assets/icons/pauldrons.svg | 1 + assets/icons/pegasus.svg | 1 + assets/icons/pentacle.svg | 1 + assets/icons/peoni.png | Bin 0 -> 22760 bytes assets/icons/people-group.svg | 24 + assets/icons/perfume-bottle.svg | 1 + assets/icons/perfume.svg | 1 + assets/icons/person.svg | 1 + assets/icons/pickaxe.svg | 71 + assets/icons/pierced-body.svg | 1 + assets/icons/piety.svg | 7 + assets/icons/pigeon.svg | 7 + assets/icons/pikeman.svg | 1 + assets/icons/piloting.svg | 1 + assets/icons/pisces.svg | 461 + assets/icons/pitchfork.svg | 68 + assets/icons/piton.svg | 18 + assets/icons/poison-bottle.svg | 1 + assets/icons/polearm.svg | 1 + assets/icons/potion-ball.svg | 1 + assets/icons/potion.svg | 4 + assets/icons/prayer.svg | 1 + assets/icons/prisoner.svg | 1 + assets/icons/psionics.svg | 1 + assets/icons/psychic-waves.svg | 1 + assets/icons/public-speaker.svg | 1 + assets/icons/pull.svg | 1 + assets/icons/punch-blast.svg | 1 + assets/icons/punch.svg | 1 + assets/icons/push.svg | 1 + assets/icons/pvarism.svg | 22 + assets/icons/quill-ink.svg | 1 + assets/icons/quill.svg | 18 + assets/icons/quiver.svg | 1 + assets/icons/rabbit.svg | 5 + assets/icons/reasoning.svg | 28 + assets/icons/rhetoric.svg | 1 + assets/icons/ribcage.svg | 12 + assets/icons/robber.svg | 1 + assets/icons/robe.svg | 1 + assets/icons/rogue.svg | 1 + assets/icons/rope.svg | 18 + assets/icons/round-bottom-flask.svg | 1 + assets/icons/round-shield.svg | 1 + assets/icons/run.svg | 1 + assets/icons/runecraft.svg | 1 + assets/icons/running-ninja.svg | 1 + assets/icons/sack.svg | 56 + assets/icons/sagittarius.svg | 403 + assets/icons/sai.svg | 1 + assets/icons/sandals.svg | 25 + assets/icons/sarajin.png | Bin 0 -> 12891 bytes assets/icons/saveknor.png | Bin 0 -> 11107 bytes assets/icons/scale-mail.svg | 1 + assets/icons/scales.svg | 1 + assets/icons/scorpio.svg | 642 + assets/icons/screaming.svg | 1 + assets/icons/scroll-unfurled.svg | 1 + assets/icons/scroll.svg | 8 + assets/icons/scythe.svg | 1 + assets/icons/seabass.svg | 1 + assets/icons/sensuousness.svg | 1 + assets/icons/sewing-needle.svg | 1 + assets/icons/shark.svg | 4 + assets/icons/shattered-glass.svg | 1 + assets/icons/sheep.svg | 19 + assets/icons/shield-bash.svg | 1 + assets/icons/shield-reflect.svg | 1 + assets/icons/shield.svg | 1 + assets/icons/ship.svg | 1 + assets/icons/shirt.svg | 1 + assets/icons/shock.svg | 1 + assets/icons/shoe.svg | 1 + assets/icons/shoulder-scales.svg | 1 + assets/icons/shouting.svg | 1 + assets/icons/shrug.svg | 1 + assets/icons/shuriken.svg | 73 + assets/icons/sick.svg | 12 + assets/icons/sickle.svg | 1 + assets/icons/siem.png | Bin 0 -> 11845 bytes assets/icons/sing.svg | 1 + assets/icons/skeleton.svg | 1 + assets/icons/ski.svg | 1 + assets/icons/skier.svg | 1 + assets/icons/skills.svg | 1 + assets/icons/skirt.svg | 6 + assets/icons/slavery-whip.svg | 1 + assets/icons/sleeping-bag.svg | 1 + assets/icons/sleepy.svg | 1 + assets/icons/sling.svg | 6 + assets/icons/slingshot.svg | 4 + assets/icons/sly.svg | 1 + assets/icons/small-fire.svg | 1 + assets/icons/smart.svg | 1 + assets/icons/smitten.svg | 1 + assets/icons/snake.svg | 1 + assets/icons/sparkle.svg | 12 + assets/icons/sparkles.svg | 18 + assets/icons/speaking.svg | 1 + assets/icons/spear.svg | 1 + assets/icons/spell-book.svg | 1 + assets/icons/spider-web.svg | 1 + assets/icons/spiked-mace.svg | 1 + assets/icons/spiked-wall.svg | 1 + assets/icons/spiral-bottle.svg | 1 + assets/icons/spirit.svg | 58 + assets/icons/sprint.svg | 1 + assets/icons/staff.svg | 1 + assets/icons/staffsling.webp | Bin 0 -> 4174 bytes assets/icons/stag.svg | 1 + assets/icons/standing-potion.svg | 1 + assets/icons/star.svg | 4 + assets/icons/stealth.svg | 1 + assets/icons/steeltoe-boots.svg | 1 + assets/icons/stiletto.svg | 1 + assets/icons/stone-axe.svg | 1 + assets/icons/stone-bust.svg | 1 + assets/icons/stone-spear.svg | 1 + assets/icons/stones.svg | 1 + assets/icons/strike.svg | 1 + assets/icons/striking-arrows.svg | 1 + assets/icons/striking-balls.svg | 1 + assets/icons/striking-splinter.svg | 1 + assets/icons/string.svg | 42 + assets/icons/strong-man.svg | 1 + assets/icons/strong.svg | 1 + assets/icons/sun-priest.svg | 1 + assets/icons/surgical-instruments.svg | 30 + assets/icons/surprised.svg | 1 + assets/icons/surrender.svg | 4 + assets/icons/surrounded-shield.svg | 1 + assets/icons/surtr.svg | 308 + assets/icons/survival.svg | 1 + assets/icons/suspicious.svg | 1 + assets/icons/swimming.svg | 1 + assets/icons/sword-smithing.svg | 1 + assets/icons/sword.svg | 1 + assets/icons/swordman.svg | 1 + assets/icons/swordwoman.svg | 1 + assets/icons/tarot-card.svg | 9 + assets/icons/tarotry.svg | 1 + assets/icons/taurus.svg | 799 + assets/icons/teacher.svg | 1 + assets/icons/team-downgrade.svg | 1 + assets/icons/team-upgrade.svg | 1 + assets/icons/telepathy.svg | 1 + assets/icons/teleport.svg | 1 + assets/icons/terror.svg | 1 + assets/icons/textilecraft.svg | 1 + assets/icons/third-eye.svg | 1 + assets/icons/thor.svg | 809 + assets/icons/three-friends.svg | 1 + assets/icons/throne-king.svg | 1 + assets/icons/throw.svg | 1 + assets/icons/tied-scroll.svg | 1 + assets/icons/tightrope.svg | 1 + assets/icons/timber.svg | 5 + assets/icons/tired.svg | 103 + assets/icons/torch.svg | 1 + assets/icons/tornado.svg | 1 + assets/icons/tracking.svg | 1 + assets/icons/treasure-map.svg | 1 + assets/icons/tree-branch.svg | 1 + assets/icons/tree.svg | 182 + assets/icons/tribunal-jury.svg | 1 + assets/icons/trident.svg | 1 + assets/icons/trip.svg | 6 + assets/icons/trousers.svg | 1 + assets/icons/trout.svg | 3 + assets/icons/tuna.svg | 5 + assets/icons/tunic.svg | 1 + assets/icons/turkey.svg | 6 + assets/icons/two-shadows.svg | 1 + assets/icons/tyr.svg | 351 + assets/icons/uncertainty.svg | 1 + assets/icons/unicorn.svg | 1 + assets/icons/uprising.svg | 1 + assets/icons/user-gear.svg | 27 + assets/icons/vampire-cape.svg | 1 + assets/icons/venus-of-willendorf.svg | 1 + assets/icons/vest.svg | 1 + assets/icons/virgo.svg | 583 + assets/icons/visored-helm.svg | 1 + assets/icons/vortex.svg | 1 + assets/icons/walk.svg | 1 + assets/icons/warhammer.svg | 1 + assets/icons/water-mill.svg | 1 + assets/icons/water.svg | 1 + assets/icons/wave-crest.svg | 1 + assets/icons/waves.svg | 1 + assets/icons/weakness.svg | 15 + assets/icons/weather.svg | 1 + assets/icons/weight-lifting-up.svg | 1 + assets/icons/weight.svg | 5 + assets/icons/whale.svg | 3 + assets/icons/whip.svg | 1 + assets/icons/whirlwind.svg | 1 + assets/icons/will.svg | 31 + assets/icons/wind.svg | 1 + assets/icons/wisdom.svg | 1 + assets/icons/wizard-staff.svg | 1 + assets/icons/wolf-head.svg | 24 + assets/icons/wolf.svg | 1 + assets/icons/wood-pen.svg | 18 + assets/icons/woodcraft.svg | 1 + assets/icons/ymir.svg | 1241 ++ assets/silhouette/character-bioimage.webp | Bin 0 -> 1738 bytes assets/silhouette/character-headshot.webp | Bin 0 -> 568 bytes assets/silhouette/character-token.svg | 15 + assets/silhouette/creature-bioimage.webp | Bin 0 -> 2656 bytes assets/silhouette/creature-headshot.webp | Bin 0 -> 1448 bytes assets/silhouette/creature-token.svg | 252 + .../legendary/folk-basic-bioimage.webp | Bin 0 -> 31530 bytes .../legendary/folk-basic-headshot.webp | Bin 0 -> 2810 bytes .../silhouette/legendary/folk-basic-token.svg | 4 + biome.json | 279 + css/sohl.css | 1565 ++ css/sohl.css.map | 1 + eslint.config.js | 66 + fonts/Harn-Lakise-Normal.otf | Bin 0 -> 45740 bytes fonts/Harn-Runic-Normal.otf | Bin 0 -> 15440 bytes fonts/Lankorian-Blackhand.otf | Bin 0 -> 112040 bytes lang/en.json | 1 + module/golden.js | 89 + module/island.js | 89 + module/legendary.js | 8189 +++++++++ module/sohl-common.js | 14550 ++++++++++++++++ module/sohl.js | 747 + package-lock.json | 1341 ++ package.json | 28 + packs/.gitignore | 8 + packs/generate/legendary/build-pack.sh | 16 + packs/generate/legendary/build.sh | 5 + .../legendary/leg-characteristics/clean.py | 27 + .../leg-characteristics/data/afflictions.yaml | 820 + .../data/anatomies/humanoid.yaml | 1056 ++ .../data/combatmaneuvers.yaml | 9 + .../data/combattechsm.yaml | 240 + .../leg-characteristics/data/folders.yaml | 100 + .../leg-characteristics/data/skills.yaml | 1276 ++ .../leg-characteristics/data/traits.yaml | 9250 ++++++++++ .../generate-leg-characteristics.py | 316 + .../generate-legendary-humanoid-body.py | 302 + .../leg-characteristics/pack.properties | 1 + .../unique/Humanoid_M10pzGVlLgO1zsnh.json | 1824 ++ .../unique/Humanoid_M10pzGVlLgO1zsnh.yaml | 1361 ++ .../leg-characters/data/folders.yaml | 12 + .../leg-characters/generate-leg-characters.py | 45 + .../legendary/leg-characters/pack.properties | 1 + .../unique/Basic_Folk_KooPYQcYORLZqrLY.json | 7508 ++++++++ .../unique/Fridja_Crm4ZEGtfbNyACCI.json | 7906 +++++++++ .../legendary/leg-creatures/data/folders.yaml | 28 + .../leg-creatures/generate-leg-creatures.py | 45 + .../legendary/leg-creatures/pack.properties | 1 + .../unique/Grod_2SK6g2KHjS1ufBvw.json | 7863 +++++++++ .../legendary/leg-mysteries/data/domains.yaml | 1935 ++ .../legendary/leg-mysteries/data/folders.yaml | 64 + .../leg-mysteries/data/mysteries.yaml | 1071 ++ .../leg-mysteries/data/mysticalabilities.yaml | 3584 ++++ .../leg-mysteries/generate-leg-mysteries.py | 171 + .../legendary/leg-mysteries/pack.properties | 1 + .../leg-possessions/data/armorgear.yaml | 10300 +++++++++++ .../leg-possessions/data/concoctiongear.yaml | 1095 ++ .../leg-possessions/data/containergear.yaml | 351 + .../leg-possessions/data/folders.yaml | 40 + .../leg-possessions/data/miscgear.yaml | 832 + .../leg-possessions/data/projectilegear.yaml | 330 + .../leg-possessions/data/weapongear.yaml | 2454 +++ .../data/weapons-strike-modes.yaml | 9898 +++++++++++ .../generate-leg-possessions.py | 872 + .../legendary/leg-possessions/pack.properties | 1 + packs/generate/requirements.txt | 7 + scss/components/_bodyloc.scss | 156 + scss/components/_effects.scss | 164 + scss/components/_facade.scss | 11 + scss/components/_forms.scss | 366 + scss/components/_items.scss | 240 + scss/components/_profile.scss | 237 + scss/components/_resource.scss | 34 + scss/components/_tabs.scss | 43 + scss/components/_top.scss | 293 + scss/global/_chat.scss | 153 + scss/global/_editor.scss | 5 + scss/global/_flex.scss | 9 + scss/global/_grid.scss | 84 + scss/global/_hotbar.scss | 4 + scss/global/_nav.scss | 11 + scss/global/_tooltip.scss | 37 + scss/global/_window.scss | 12 + scss/sohl.scss | 29 + scss/utils/_colors.scss | 2 + scss/utils/_mixins.scss | 16 + scss/utils/_typography.scss | 7 + scss/utils/_variables.scss | 3 + system.json | 106 + template.json | 40 + templates/actor/actor-sheet.html | 1390 ++ templates/chat/attack-card.html | 162 + templates/chat/attack-result-card.html | 244 + templates/chat/damage-card.html | 95 + templates/chat/fate-roll-card.html | 81 + templates/chat/injury-card.html | 157 + templates/chat/item-desc-card.html | 26 + templates/chat/missile-damage-card.html | 49 + templates/chat/opposed-request-card.html | 34 + templates/chat/opposed-result-card.html | 101 + templates/chat/shock-card.html | 85 + templates/chat/skillvalue-result-card.html | 21 + templates/chat/standard-test-card.html | 103 + templates/chat/timer-expired-card.html | 20 + templates/chat/treatment-result-card.html | 48 + templates/chat/weapon-break-card.html | 25 + templates/dialog/active-effect-start.html | 103 + templates/dialog/attack-dialog.html | 112 + templates/dialog/container-size.html | 6 + templates/dialog/create-item.html | 47 + templates/dialog/damage-dialog.html | 120 + templates/dialog/embedded-item-dialog.html | 21 + templates/dialog/injury-dialog.html | 121 + templates/dialog/keyvalue-dialog.html | 10 + templates/dialog/macro-config.html | 94 + templates/dialog/missile-damage-dialog.html | 21 + templates/dialog/opposed-response-dialog.html | 47 + templates/dialog/query-injuries-dialog.html | 10 + .../query-tactical-advantage-dialog.html | 14 + templates/dialog/query-weapon-dialog.html | 12 + templates/dialog/shock-test-dialog.html | 45 + templates/dialog/standard-test-dialog.html | 37 + templates/dialog/strike-mode-dialog.html | 104 + templates/dialog/time-dialog.html | 42 + templates/dialog/welcome.html | 13 + templates/effect/active-effect-config.html | 153 + templates/item/affiliation-sheet.html | 53 + templates/item/affliction-sheet.html | 58 + templates/item/anatomy-sheet.html | 52 + templates/item/armorgear-sheet.html | 116 + templates/item/bodylocation-sheet.html | 121 + templates/item/bodypart-sheet.html | 89 + templates/item/bodyzone-sheet.html | 130 + .../item/combattechniquestrikemode-sheet.html | 70 + templates/item/concoctiongear-sheet.html | 52 + templates/item/containergear-sheet.html | 58 + templates/item/domain-sheet.html | 77 + templates/item/event-sheet.html | 66 + templates/item/injury-sheet.html | 73 + templates/item/meleestrikemode-sheet.html | 63 + templates/item/miscgear-sheet.html | 50 + templates/item/missilestrikemode-sheet.html | 71 + templates/item/mystery-sheet.html | 144 + templates/item/mysticalability-sheet.html | 119 + templates/item/mysticaldevice-sheet.html | 75 + templates/item/parts/item-actions-list.hbs | 65 + templates/item/parts/item-active-effects.hbs | 68 + templates/item/parts/item-description.hbs | 0 templates/item/parts/item-gear-list.hbs | 58 + templates/item/parts/item-gear.hbs | 5 + templates/item/parts/item-header.hbs | 27 + templates/item/parts/item-masterylevel.hbs | 20 + .../item/parts/item-nesteditems-list.hbs | 38 + templates/item/parts/item-refnote.hbs | 44 + templates/item/parts/item-strikemode.hbs | 20 + templates/item/philosophy-sheet.html | 47 + templates/item/projectilegear-sheet.html | 60 + templates/item/skill-sheet.html | 100 + templates/item/stereotype-sheet.html | 69 + templates/item/trait-sheet.html | 148 + templates/item/weapongear-sheet.html | 63 + ui/parchment.jpg | Bin 0 -> 112260 bytes 748 files changed, 127627 insertions(+), 164 deletions(-) create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 README.md create mode 100644 assets/audio/grunt1.ogg create mode 100644 assets/audio/grunt2.ogg create mode 100644 assets/audio/grunt3.ogg create mode 100644 assets/audio/grunt4.ogg create mode 100644 assets/audio/grunt5.ogg create mode 100644 assets/audio/shield-bash.ogg create mode 100644 assets/audio/swoosh1.ogg create mode 100644 assets/audio/swoosh2.ogg create mode 100644 assets/icons/abbot-meeple.svg create mode 100644 assets/icons/abdominal-armor.svg create mode 100644 assets/icons/acrobatic.svg create mode 100644 assets/icons/acrobatics.svg create mode 100644 assets/icons/acting.svg create mode 100644 assets/icons/ages.svg create mode 100644 assets/icons/agriculture.svg create mode 100644 assets/icons/agrik.png create mode 100644 assets/icons/alchemy.svg create mode 100644 assets/icons/anatomy.svg create mode 100644 assets/icons/anchor.svg create mode 100644 assets/icons/anemia.svg create mode 100644 assets/icons/animalcraft.svg create mode 100644 assets/icons/anvil-impact.svg create mode 100644 assets/icons/anvil.svg create mode 100644 assets/icons/apron.svg create mode 100644 assets/icons/aquarius.svg create mode 100644 assets/icons/aries.svg create mode 100644 assets/icons/arm-bandage.svg create mode 100644 assets/icons/arm-sling.svg create mode 100644 assets/icons/armor-vest.svg create mode 100644 assets/icons/armor.svg create mode 100644 assets/icons/arrow.svg create mode 100644 assets/icons/arrowed.svg create mode 100644 assets/icons/astrology.svg create mode 100644 assets/icons/atlas.svg create mode 100644 assets/icons/aura.svg create mode 100644 assets/icons/awareness.svg create mode 100644 assets/icons/axe.svg create mode 100644 assets/icons/back-pain.svg create mode 100644 assets/icons/backstab.svg create mode 100644 assets/icons/backup.svg create mode 100644 assets/icons/badger.svg create mode 100644 assets/icons/baldr.svg create mode 100644 assets/icons/bandage-roll.svg create mode 100644 assets/icons/barbute.svg create mode 100644 assets/icons/basket.svg create mode 100644 assets/icons/bass.svg create mode 100644 assets/icons/battle-axe.svg create mode 100644 assets/icons/beams-aura.svg create mode 100644 assets/icons/bear.svg create mode 100644 assets/icons/bell-shield.svg create mode 100644 assets/icons/biceps.svg create mode 100644 assets/icons/bison.svg create mode 100644 assets/icons/black-knight-helm.svg create mode 100644 assets/icons/blacksmith.svg create mode 100644 assets/icons/blowgun.svg create mode 100644 assets/icons/boar.svg create mode 100644 assets/icons/boat-fishing.svg create mode 100644 assets/icons/bobcat.svg create mode 100644 assets/icons/body-balance.svg create mode 100644 assets/icons/body-height.svg create mode 100644 assets/icons/body-swapping.svg create mode 100644 assets/icons/body.svg create mode 100644 assets/icons/bolas.svg create mode 100644 assets/icons/bone-knife.svg create mode 100644 assets/icons/book-cover.svg create mode 100644 assets/icons/book-sparkles.svg create mode 100644 assets/icons/book.svg create mode 100644 assets/icons/boomerang.svg create mode 100644 assets/icons/boots.svg create mode 100644 assets/icons/bottle-vapors.svg create mode 100644 assets/icons/bowman.svg create mode 100644 assets/icons/bracer.svg create mode 100644 assets/icons/brain-dump.svg create mode 100644 assets/icons/brandy-bottle.svg create mode 100644 assets/icons/breastplate.svg create mode 100644 assets/icons/brewing.svg create mode 100644 assets/icons/brick-pile.svg create mode 100644 assets/icons/brick-wall.svg create mode 100644 assets/icons/bright-explosion.svg create mode 100644 assets/icons/broad-dagger.svg create mode 100644 assets/icons/bubbling-flask.svg create mode 100644 assets/icons/buffalo-head.svg create mode 100644 assets/icons/bull.svg create mode 100644 assets/icons/bullseye.svg create mode 100644 assets/icons/burning-dot.svg create mode 100644 assets/icons/burning-meteor.svg create mode 100644 assets/icons/caduceus.svg create mode 100644 assets/icons/camp-cooking-pot.svg create mode 100644 assets/icons/campfire.svg create mode 100644 assets/icons/cancer.svg create mode 100644 assets/icons/candle-flame.svg create mode 100644 assets/icons/candle-holder.svg create mode 100644 assets/icons/candle.svg create mode 100644 assets/icons/cap.svg create mode 100644 assets/icons/capricorn.svg create mode 100644 assets/icons/carrying-sack.svg create mode 100644 assets/icons/cartwheel.svg create mode 100644 assets/icons/cash.svg create mode 100644 assets/icons/category.svg create mode 100644 assets/icons/catfish.svg create mode 100644 assets/icons/cauldron.svg create mode 100644 assets/icons/cavalry.svg create mode 100644 assets/icons/caveman.svg create mode 100644 assets/icons/celebration-fire.svg create mode 100644 assets/icons/centaur.svg create mode 100644 assets/icons/ceramics.svg create mode 100644 assets/icons/ceremonial-mask.svg create mode 100644 assets/icons/chain-mail.svg create mode 100644 assets/icons/chalk-outline-murder.svg create mode 100644 assets/icons/character.svg create mode 100644 assets/icons/charm.svg create mode 100644 assets/icons/chemical-drop.svg create mode 100644 assets/icons/chest-armor.svg create mode 100644 assets/icons/chest.svg create mode 100644 assets/icons/chicken.svg create mode 100644 assets/icons/circle.svg create mode 100644 assets/icons/claw.svg create mode 100644 assets/icons/climbing.svg create mode 100644 assets/icons/cloak-dagger.svg create mode 100644 assets/icons/cloak.svg create mode 100644 assets/icons/closed-barbute.svg create mode 100644 assets/icons/club.svg create mode 100644 assets/icons/cobweb.svg create mode 100644 assets/icons/coiling-curl.svg create mode 100644 assets/icons/coins.svg create mode 100644 assets/icons/coma.svg create mode 100644 assets/icons/concentration-orb.svg create mode 100644 assets/icons/confrontation.svg create mode 100644 assets/icons/conqueror.svg create mode 100644 assets/icons/contortionist.svg create mode 100644 assets/icons/convict.svg create mode 100644 assets/icons/convince.svg create mode 100644 assets/icons/cook.svg create mode 100644 assets/icons/cookery.svg create mode 100644 assets/icons/cooking-pot.svg create mode 100644 assets/icons/corner-explosion.svg create mode 100644 assets/icons/cow.svg create mode 100644 assets/icons/creativity.svg create mode 100644 assets/icons/crested-helmet.svg create mode 100644 assets/icons/cross-mark.svg create mode 100644 assets/icons/crossbow.svg create mode 100644 assets/icons/crossed-axes.svg create mode 100644 assets/icons/crossed-swords.svg create mode 100644 assets/icons/crow.svg create mode 100644 assets/icons/crowbar.svg create mode 100644 assets/icons/crystal-wand.svg create mode 100644 assets/icons/cultist.svg create mode 100644 assets/icons/curling-vines.svg create mode 100644 assets/icons/curly-mask.svg create mode 100644 assets/icons/daemon-skull.svg create mode 100644 assets/icons/dagger.svg create mode 100644 assets/icons/damage.svg create mode 100644 assets/icons/dance.svg create mode 100644 assets/icons/dart.svg create mode 100644 assets/icons/deadly-strike.svg create mode 100644 assets/icons/deer-track.svg create mode 100644 assets/icons/deer.svg create mode 100644 assets/icons/default-action.svg create mode 100644 assets/icons/despair.svg create mode 100644 assets/icons/dice-d20.svg create mode 100644 assets/icons/dice-d6.svg create mode 100644 assets/icons/dig-dug.svg create mode 100644 assets/icons/disease.svg create mode 100644 assets/icons/distraction.svg create mode 100644 assets/icons/divination.svg create mode 100644 assets/icons/dodge.svg create mode 100644 assets/icons/dodging.svg create mode 100644 assets/icons/donkey.svg create mode 100644 assets/icons/dorsal-scales.svg create mode 100644 assets/icons/double-face-mask.svg create mode 100644 assets/icons/double-ringed-orb.svg create mode 100644 assets/icons/dove.svg create mode 100644 assets/icons/drama-masks.svg create mode 100644 assets/icons/drawing.svg create mode 100644 assets/icons/dread.svg create mode 100644 assets/icons/dress.svg create mode 100644 assets/icons/drum.svg create mode 100644 assets/icons/duality.svg create mode 100644 assets/icons/duck.svg create mode 100644 assets/icons/dulcimer.svg create mode 100644 assets/icons/eagle.svg create mode 100644 assets/icons/egyptian-walk.svg create mode 100644 assets/icons/elbow-pad.svg create mode 100644 assets/icons/embalming.svg create mode 100644 assets/icons/embrassed-energy.svg create mode 100644 assets/icons/emerald.svg create mode 100644 assets/icons/empathy.svg create mode 100644 assets/icons/energy-arrow.svg create mode 100644 assets/icons/engineering.svg create mode 100644 assets/icons/enrage.svg create mode 100644 assets/icons/entangled-typhoon.svg create mode 100644 assets/icons/event.svg create mode 100644 assets/icons/explosion-rays.svg create mode 100644 assets/icons/face-to-face.svg create mode 100644 assets/icons/falcon.svg create mode 100644 assets/icons/falling.svg create mode 100644 assets/icons/fangs.svg create mode 100644 assets/icons/farmer.svg create mode 100644 assets/icons/fat.svg create mode 100644 assets/icons/feather.svg create mode 100644 assets/icons/fire-dash.svg create mode 100644 assets/icons/fire-silhouette.svg create mode 100644 assets/icons/fire.svg create mode 100644 assets/icons/fireball.svg create mode 100644 assets/icons/fish-scales.svg create mode 100644 assets/icons/fishing.svg create mode 100644 assets/icons/flail.svg create mode 100644 assets/icons/flanged-mace.svg create mode 100644 assets/icons/flat-paw-print.svg create mode 100644 assets/icons/flax.svg create mode 100644 assets/icons/flute.svg create mode 100644 assets/icons/footprint.svg create mode 100644 assets/icons/foraging.svg create mode 100644 assets/icons/fox.svg create mode 100644 assets/icons/freyja.svg create mode 100644 assets/icons/freyr.svg create mode 100644 assets/icons/frozen-body.svg create mode 100644 assets/icons/full-wood-bucket.svg create mode 100644 assets/icons/galleon.svg create mode 100644 assets/icons/gauntlet.svg create mode 100644 assets/icons/gear.svg create mode 100644 assets/icons/gem-chain.svg create mode 100644 assets/icons/gem-pendant.svg create mode 100644 assets/icons/gemini.svg create mode 100644 assets/icons/gems.svg create mode 100644 assets/icons/ghost-ally.svg create mode 100644 assets/icons/giant.svg create mode 100644 assets/icons/glaive.svg create mode 100644 assets/icons/glassworking.svg create mode 100644 assets/icons/gloves.svg create mode 100644 assets/icons/goat.svg create mode 100644 assets/icons/goose.svg create mode 100644 assets/icons/grab-hold.svg create mode 100644 assets/icons/grab-take.svg create mode 100644 assets/icons/grainflail.svg create mode 100644 assets/icons/grappling-hook.svg create mode 100644 assets/icons/greaves.svg create mode 100644 assets/icons/guards.svg create mode 100644 assets/icons/halea.png create mode 100644 assets/icons/half-body-crawling.svg create mode 100644 assets/icons/hammer.svg create mode 100644 assets/icons/hamster.svg create mode 100644 assets/icons/hand-sparkles.svg create mode 100644 assets/icons/hand.svg create mode 100644 assets/icons/hands.svg create mode 100644 assets/icons/harp.svg create mode 100644 assets/icons/hat.svg create mode 100644 assets/icons/hawk.svg create mode 100644 assets/icons/head-gear.svg create mode 100644 assets/icons/headbutt.svg create mode 100644 assets/icons/headshot.svg create mode 100644 assets/icons/heart-inside.svg create mode 100644 assets/icons/heart-organ.svg create mode 100644 assets/icons/heavy-helm.svg create mode 100644 assets/icons/hedgehog.svg create mode 100644 assets/icons/hel.svg create mode 100644 assets/icons/helm.svg create mode 100644 assets/icons/heraldry.svg create mode 100644 assets/icons/herblore.svg create mode 100644 assets/icons/hidework.svg create mode 100644 assets/icons/high-kick.svg create mode 100644 assets/icons/high-punch.svg create mode 100644 assets/icons/hood.svg create mode 100644 assets/icons/hooded-assassin.svg create mode 100644 assets/icons/hooded-figure.svg create mode 100644 assets/icons/hoof.svg create mode 100644 assets/icons/horn.svg create mode 100644 assets/icons/horns.svg create mode 100644 assets/icons/horse-riding.svg create mode 100644 assets/icons/horse.svg create mode 100644 assets/icons/human-pyramid.svg create mode 100644 assets/icons/hunting.svg create mode 100644 assets/icons/icicles-aura.svg create mode 100644 assets/icons/ilvir.png create mode 100644 assets/icons/imprisoned.svg create mode 100644 assets/icons/initiative.svg create mode 100644 assets/icons/injury.svg create mode 100644 assets/icons/ink.svg create mode 100644 assets/icons/inner-self.svg create mode 100644 assets/icons/internal-injury.svg create mode 100644 assets/icons/invisible.svg create mode 100644 assets/icons/jaguar.svg create mode 100644 assets/icons/jewel.svg create mode 100644 assets/icons/jeweled-chalice.svg create mode 100644 assets/icons/juggler.svg create mode 100644 assets/icons/jump-across.svg create mode 100644 assets/icons/jump.svg create mode 100644 assets/icons/jumping-rope.svg create mode 100644 assets/icons/key.svg create mode 100644 assets/icons/king.svg create mode 100644 assets/icons/knapsack.svg create mode 100644 assets/icons/knee-bandage.svg create mode 100644 assets/icons/knee-pad.svg create mode 100644 assets/icons/kneeling.svg create mode 100644 assets/icons/knockout.svg create mode 100644 assets/icons/knuckledusters.svg create mode 100644 assets/icons/lamellar.svg create mode 100644 assets/icons/lance.svg create mode 100644 assets/icons/lantern-flame.svg create mode 100644 assets/icons/lantern.svg create mode 100644 assets/icons/larani.png create mode 100644 assets/icons/law.svg create mode 100644 assets/icons/leather-armor.svg create mode 100644 assets/icons/leather-boot.svg create mode 100644 assets/icons/leather-vest.svg create mode 100644 assets/icons/leg-armor.svg create mode 100644 assets/icons/leggings.svg create mode 100644 assets/icons/leo.svg create mode 100644 assets/icons/leopard.svg create mode 100644 assets/icons/libra.svg create mode 100644 assets/icons/light-helm.svg create mode 100644 assets/icons/lion.svg create mode 100644 assets/icons/lock.svg create mode 100644 assets/icons/locked-chest.svg create mode 100644 assets/icons/lockpicks.svg create mode 100644 assets/icons/loincloth.svg create mode 100644 assets/icons/loki.svg create mode 100644 assets/icons/longbow.svg create mode 100644 assets/icons/lore.svg create mode 100644 assets/icons/love.svg create mode 100644 assets/icons/lovers.svg create mode 100644 assets/icons/lute.svg create mode 100644 assets/icons/lynx.svg create mode 100644 assets/icons/lyre.svg create mode 100644 assets/icons/mace.svg create mode 100644 assets/icons/magic-portal.svg create mode 100644 assets/icons/magic-shield.svg create mode 100644 assets/icons/magic-wand.svg create mode 100644 assets/icons/magnifying-glass.svg create mode 100644 assets/icons/mail-shirt.svg create mode 100644 assets/icons/mailed-fist.svg create mode 100644 assets/icons/manacles.svg create mode 100644 assets/icons/mantle.svg create mode 100644 assets/icons/masonry.svg create mode 100644 assets/icons/master-of-arms.svg create mode 100644 assets/icons/mathematics.svg create mode 100644 assets/icons/medallist.svg create mode 100644 assets/icons/meditation.svg create mode 100644 assets/icons/meeple.svg create mode 100644 assets/icons/mental.svg create mode 100644 assets/icons/metal-bar.svg create mode 100644 assets/icons/metal-skirt.svg create mode 100644 assets/icons/mighty-force.svg create mode 100644 assets/icons/miner.svg create mode 100644 assets/icons/mining.svg create mode 100644 assets/icons/minions.svg create mode 100644 assets/icons/mirror.svg create mode 100644 assets/icons/miscgear.svg create mode 100644 assets/icons/mischevous.svg create mode 100644 assets/icons/morality.svg create mode 100644 assets/icons/morgath.png create mode 100644 assets/icons/mounted-knight.svg create mode 100644 assets/icons/muscle-fat.svg create mode 100644 assets/icons/muscle-up.svg create mode 100644 assets/icons/muscle.svg create mode 100644 assets/icons/muscular-torso.svg create mode 100644 assets/icons/musical-notes.svg create mode 100644 assets/icons/musician-singing.svg create mode 100644 assets/icons/nails.svg create mode 100644 assets/icons/naveh.png create mode 100644 assets/icons/needle.svg create mode 100644 assets/icons/net.svg create mode 100644 assets/icons/ninja-heroic-stance.svg create mode 100644 assets/icons/nunchaku.svg create mode 100644 assets/icons/odin.svg create mode 100644 assets/icons/old-lantern.svg create mode 100644 assets/icons/oppression.svg create mode 100644 assets/icons/oratory.svg create mode 100644 assets/icons/otter.svg create mode 100644 assets/icons/overexertion.svg create mode 100644 assets/icons/owl.svg create mode 100644 assets/icons/ox.svg create mode 100644 assets/icons/padlock-open.svg create mode 100644 assets/icons/pan-flute.svg create mode 100644 assets/icons/parrot.svg create mode 100644 assets/icons/pauldrons.svg create mode 100644 assets/icons/pegasus.svg create mode 100644 assets/icons/pentacle.svg create mode 100644 assets/icons/peoni.png create mode 100644 assets/icons/people-group.svg create mode 100644 assets/icons/perfume-bottle.svg create mode 100644 assets/icons/perfume.svg create mode 100644 assets/icons/person.svg create mode 100644 assets/icons/pickaxe.svg create mode 100644 assets/icons/pierced-body.svg create mode 100644 assets/icons/piety.svg create mode 100644 assets/icons/pigeon.svg create mode 100644 assets/icons/pikeman.svg create mode 100644 assets/icons/piloting.svg create mode 100644 assets/icons/pisces.svg create mode 100644 assets/icons/pitchfork.svg create mode 100644 assets/icons/piton.svg create mode 100644 assets/icons/poison-bottle.svg create mode 100644 assets/icons/polearm.svg create mode 100644 assets/icons/potion-ball.svg create mode 100644 assets/icons/potion.svg create mode 100644 assets/icons/prayer.svg create mode 100644 assets/icons/prisoner.svg create mode 100644 assets/icons/psionics.svg create mode 100644 assets/icons/psychic-waves.svg create mode 100644 assets/icons/public-speaker.svg create mode 100644 assets/icons/pull.svg create mode 100644 assets/icons/punch-blast.svg create mode 100644 assets/icons/punch.svg create mode 100644 assets/icons/push.svg create mode 100644 assets/icons/pvarism.svg create mode 100644 assets/icons/quill-ink.svg create mode 100644 assets/icons/quill.svg create mode 100644 assets/icons/quiver.svg create mode 100644 assets/icons/rabbit.svg create mode 100644 assets/icons/reasoning.svg create mode 100644 assets/icons/rhetoric.svg create mode 100644 assets/icons/ribcage.svg create mode 100644 assets/icons/robber.svg create mode 100644 assets/icons/robe.svg create mode 100644 assets/icons/rogue.svg create mode 100644 assets/icons/rope.svg create mode 100644 assets/icons/round-bottom-flask.svg create mode 100644 assets/icons/round-shield.svg create mode 100644 assets/icons/run.svg create mode 100644 assets/icons/runecraft.svg create mode 100644 assets/icons/running-ninja.svg create mode 100644 assets/icons/sack.svg create mode 100644 assets/icons/sagittarius.svg create mode 100644 assets/icons/sai.svg create mode 100644 assets/icons/sandals.svg create mode 100644 assets/icons/sarajin.png create mode 100644 assets/icons/saveknor.png create mode 100644 assets/icons/scale-mail.svg create mode 100644 assets/icons/scales.svg create mode 100644 assets/icons/scorpio.svg create mode 100644 assets/icons/screaming.svg create mode 100644 assets/icons/scroll-unfurled.svg create mode 100644 assets/icons/scroll.svg create mode 100644 assets/icons/scythe.svg create mode 100644 assets/icons/seabass.svg create mode 100644 assets/icons/sensuousness.svg create mode 100644 assets/icons/sewing-needle.svg create mode 100644 assets/icons/shark.svg create mode 100644 assets/icons/shattered-glass.svg create mode 100644 assets/icons/sheep.svg create mode 100644 assets/icons/shield-bash.svg create mode 100644 assets/icons/shield-reflect.svg create mode 100644 assets/icons/shield.svg create mode 100644 assets/icons/ship.svg create mode 100644 assets/icons/shirt.svg create mode 100644 assets/icons/shock.svg create mode 100644 assets/icons/shoe.svg create mode 100644 assets/icons/shoulder-scales.svg create mode 100644 assets/icons/shouting.svg create mode 100644 assets/icons/shrug.svg create mode 100644 assets/icons/shuriken.svg create mode 100644 assets/icons/sick.svg create mode 100644 assets/icons/sickle.svg create mode 100644 assets/icons/siem.png create mode 100644 assets/icons/sing.svg create mode 100644 assets/icons/skeleton.svg create mode 100644 assets/icons/ski.svg create mode 100644 assets/icons/skier.svg create mode 100644 assets/icons/skills.svg create mode 100644 assets/icons/skirt.svg create mode 100644 assets/icons/slavery-whip.svg create mode 100644 assets/icons/sleeping-bag.svg create mode 100644 assets/icons/sleepy.svg create mode 100644 assets/icons/sling.svg create mode 100644 assets/icons/slingshot.svg create mode 100644 assets/icons/sly.svg create mode 100644 assets/icons/small-fire.svg create mode 100644 assets/icons/smart.svg create mode 100644 assets/icons/smitten.svg create mode 100644 assets/icons/snake.svg create mode 100644 assets/icons/sparkle.svg create mode 100644 assets/icons/sparkles.svg create mode 100644 assets/icons/speaking.svg create mode 100644 assets/icons/spear.svg create mode 100644 assets/icons/spell-book.svg create mode 100644 assets/icons/spider-web.svg create mode 100644 assets/icons/spiked-mace.svg create mode 100644 assets/icons/spiked-wall.svg create mode 100644 assets/icons/spiral-bottle.svg create mode 100644 assets/icons/spirit.svg create mode 100644 assets/icons/sprint.svg create mode 100644 assets/icons/staff.svg create mode 100644 assets/icons/staffsling.webp create mode 100644 assets/icons/stag.svg create mode 100644 assets/icons/standing-potion.svg create mode 100644 assets/icons/star.svg create mode 100644 assets/icons/stealth.svg create mode 100644 assets/icons/steeltoe-boots.svg create mode 100644 assets/icons/stiletto.svg create mode 100644 assets/icons/stone-axe.svg create mode 100644 assets/icons/stone-bust.svg create mode 100644 assets/icons/stone-spear.svg create mode 100644 assets/icons/stones.svg create mode 100644 assets/icons/strike.svg create mode 100644 assets/icons/striking-arrows.svg create mode 100644 assets/icons/striking-balls.svg create mode 100644 assets/icons/striking-splinter.svg create mode 100644 assets/icons/string.svg create mode 100644 assets/icons/strong-man.svg create mode 100644 assets/icons/strong.svg create mode 100644 assets/icons/sun-priest.svg create mode 100644 assets/icons/surgical-instruments.svg create mode 100644 assets/icons/surprised.svg create mode 100644 assets/icons/surrender.svg create mode 100644 assets/icons/surrounded-shield.svg create mode 100644 assets/icons/surtr.svg create mode 100644 assets/icons/survival.svg create mode 100644 assets/icons/suspicious.svg create mode 100644 assets/icons/swimming.svg create mode 100644 assets/icons/sword-smithing.svg create mode 100644 assets/icons/sword.svg create mode 100644 assets/icons/swordman.svg create mode 100644 assets/icons/swordwoman.svg create mode 100644 assets/icons/tarot-card.svg create mode 100644 assets/icons/tarotry.svg create mode 100644 assets/icons/taurus.svg create mode 100644 assets/icons/teacher.svg create mode 100644 assets/icons/team-downgrade.svg create mode 100644 assets/icons/team-upgrade.svg create mode 100644 assets/icons/telepathy.svg create mode 100644 assets/icons/teleport.svg create mode 100644 assets/icons/terror.svg create mode 100644 assets/icons/textilecraft.svg create mode 100644 assets/icons/third-eye.svg create mode 100644 assets/icons/thor.svg create mode 100644 assets/icons/three-friends.svg create mode 100644 assets/icons/throne-king.svg create mode 100644 assets/icons/throw.svg create mode 100644 assets/icons/tied-scroll.svg create mode 100644 assets/icons/tightrope.svg create mode 100644 assets/icons/timber.svg create mode 100644 assets/icons/tired.svg create mode 100644 assets/icons/torch.svg create mode 100644 assets/icons/tornado.svg create mode 100644 assets/icons/tracking.svg create mode 100644 assets/icons/treasure-map.svg create mode 100644 assets/icons/tree-branch.svg create mode 100644 assets/icons/tree.svg create mode 100644 assets/icons/tribunal-jury.svg create mode 100644 assets/icons/trident.svg create mode 100644 assets/icons/trip.svg create mode 100644 assets/icons/trousers.svg create mode 100644 assets/icons/trout.svg create mode 100644 assets/icons/tuna.svg create mode 100644 assets/icons/tunic.svg create mode 100644 assets/icons/turkey.svg create mode 100644 assets/icons/two-shadows.svg create mode 100644 assets/icons/tyr.svg create mode 100644 assets/icons/uncertainty.svg create mode 100644 assets/icons/unicorn.svg create mode 100644 assets/icons/uprising.svg create mode 100644 assets/icons/user-gear.svg create mode 100644 assets/icons/vampire-cape.svg create mode 100644 assets/icons/venus-of-willendorf.svg create mode 100644 assets/icons/vest.svg create mode 100644 assets/icons/virgo.svg create mode 100644 assets/icons/visored-helm.svg create mode 100644 assets/icons/vortex.svg create mode 100644 assets/icons/walk.svg create mode 100644 assets/icons/warhammer.svg create mode 100644 assets/icons/water-mill.svg create mode 100644 assets/icons/water.svg create mode 100644 assets/icons/wave-crest.svg create mode 100644 assets/icons/waves.svg create mode 100644 assets/icons/weakness.svg create mode 100644 assets/icons/weather.svg create mode 100644 assets/icons/weight-lifting-up.svg create mode 100644 assets/icons/weight.svg create mode 100644 assets/icons/whale.svg create mode 100644 assets/icons/whip.svg create mode 100644 assets/icons/whirlwind.svg create mode 100644 assets/icons/will.svg create mode 100644 assets/icons/wind.svg create mode 100644 assets/icons/wisdom.svg create mode 100644 assets/icons/wizard-staff.svg create mode 100644 assets/icons/wolf-head.svg create mode 100644 assets/icons/wolf.svg create mode 100644 assets/icons/wood-pen.svg create mode 100644 assets/icons/woodcraft.svg create mode 100644 assets/icons/ymir.svg create mode 100644 assets/silhouette/character-bioimage.webp create mode 100644 assets/silhouette/character-headshot.webp create mode 100644 assets/silhouette/character-token.svg create mode 100644 assets/silhouette/creature-bioimage.webp create mode 100644 assets/silhouette/creature-headshot.webp create mode 100644 assets/silhouette/creature-token.svg create mode 100644 assets/silhouette/legendary/folk-basic-bioimage.webp create mode 100644 assets/silhouette/legendary/folk-basic-headshot.webp create mode 100644 assets/silhouette/legendary/folk-basic-token.svg create mode 100644 biome.json create mode 100644 css/sohl.css create mode 100644 css/sohl.css.map create mode 100644 eslint.config.js create mode 100644 fonts/Harn-Lakise-Normal.otf create mode 100644 fonts/Harn-Runic-Normal.otf create mode 100644 fonts/Lankorian-Blackhand.otf create mode 100644 lang/en.json create mode 100644 module/golden.js create mode 100644 module/island.js create mode 100644 module/legendary.js create mode 100644 module/sohl-common.js create mode 100644 module/sohl.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packs/.gitignore create mode 100755 packs/generate/legendary/build-pack.sh create mode 100755 packs/generate/legendary/build.sh create mode 100755 packs/generate/legendary/leg-characteristics/clean.py create mode 100644 packs/generate/legendary/leg-characteristics/data/afflictions.yaml create mode 100644 packs/generate/legendary/leg-characteristics/data/anatomies/humanoid.yaml create mode 100644 packs/generate/legendary/leg-characteristics/data/combatmaneuvers.yaml create mode 100644 packs/generate/legendary/leg-characteristics/data/combattechsm.yaml create mode 100644 packs/generate/legendary/leg-characteristics/data/folders.yaml create mode 100644 packs/generate/legendary/leg-characteristics/data/skills.yaml create mode 100644 packs/generate/legendary/leg-characteristics/data/traits.yaml create mode 100755 packs/generate/legendary/leg-characteristics/generate-leg-characteristics.py create mode 100755 packs/generate/legendary/leg-characteristics/generate-legendary-humanoid-body.py create mode 100644 packs/generate/legendary/leg-characteristics/pack.properties create mode 100644 packs/generate/legendary/leg-characteristics/unique/Humanoid_M10pzGVlLgO1zsnh.json create mode 100644 packs/generate/legendary/leg-characteristics/unique/Humanoid_M10pzGVlLgO1zsnh.yaml create mode 100644 packs/generate/legendary/leg-characters/data/folders.yaml create mode 100755 packs/generate/legendary/leg-characters/generate-leg-characters.py create mode 100644 packs/generate/legendary/leg-characters/pack.properties create mode 100644 packs/generate/legendary/leg-characters/unique/Basic_Folk_KooPYQcYORLZqrLY.json create mode 100644 packs/generate/legendary/leg-characters/unique/Fridja_Crm4ZEGtfbNyACCI.json create mode 100644 packs/generate/legendary/leg-creatures/data/folders.yaml create mode 100755 packs/generate/legendary/leg-creatures/generate-leg-creatures.py create mode 100644 packs/generate/legendary/leg-creatures/pack.properties create mode 100644 packs/generate/legendary/leg-creatures/unique/Grod_2SK6g2KHjS1ufBvw.json create mode 100644 packs/generate/legendary/leg-mysteries/data/domains.yaml create mode 100644 packs/generate/legendary/leg-mysteries/data/folders.yaml create mode 100644 packs/generate/legendary/leg-mysteries/data/mysteries.yaml create mode 100644 packs/generate/legendary/leg-mysteries/data/mysticalabilities.yaml create mode 100755 packs/generate/legendary/leg-mysteries/generate-leg-mysteries.py create mode 100644 packs/generate/legendary/leg-mysteries/pack.properties create mode 100644 packs/generate/legendary/leg-possessions/data/armorgear.yaml create mode 100644 packs/generate/legendary/leg-possessions/data/concoctiongear.yaml create mode 100644 packs/generate/legendary/leg-possessions/data/containergear.yaml create mode 100644 packs/generate/legendary/leg-possessions/data/folders.yaml create mode 100644 packs/generate/legendary/leg-possessions/data/miscgear.yaml create mode 100644 packs/generate/legendary/leg-possessions/data/projectilegear.yaml create mode 100644 packs/generate/legendary/leg-possessions/data/weapongear.yaml create mode 100644 packs/generate/legendary/leg-possessions/data/weapons-strike-modes.yaml create mode 100755 packs/generate/legendary/leg-possessions/generate-leg-possessions.py create mode 100644 packs/generate/legendary/leg-possessions/pack.properties create mode 100644 packs/generate/requirements.txt create mode 100644 scss/components/_bodyloc.scss create mode 100644 scss/components/_effects.scss create mode 100644 scss/components/_facade.scss create mode 100644 scss/components/_forms.scss create mode 100644 scss/components/_items.scss create mode 100644 scss/components/_profile.scss create mode 100644 scss/components/_resource.scss create mode 100644 scss/components/_tabs.scss create mode 100644 scss/components/_top.scss create mode 100644 scss/global/_chat.scss create mode 100644 scss/global/_editor.scss create mode 100644 scss/global/_flex.scss create mode 100644 scss/global/_grid.scss create mode 100644 scss/global/_hotbar.scss create mode 100644 scss/global/_nav.scss create mode 100644 scss/global/_tooltip.scss create mode 100644 scss/global/_window.scss create mode 100644 scss/sohl.scss create mode 100644 scss/utils/_colors.scss create mode 100644 scss/utils/_mixins.scss create mode 100644 scss/utils/_typography.scss create mode 100644 scss/utils/_variables.scss create mode 100644 system.json create mode 100644 template.json create mode 100644 templates/actor/actor-sheet.html create mode 100644 templates/chat/attack-card.html create mode 100644 templates/chat/attack-result-card.html create mode 100644 templates/chat/damage-card.html create mode 100644 templates/chat/fate-roll-card.html create mode 100644 templates/chat/injury-card.html create mode 100644 templates/chat/item-desc-card.html create mode 100644 templates/chat/missile-damage-card.html create mode 100644 templates/chat/opposed-request-card.html create mode 100644 templates/chat/opposed-result-card.html create mode 100644 templates/chat/shock-card.html create mode 100644 templates/chat/skillvalue-result-card.html create mode 100644 templates/chat/standard-test-card.html create mode 100644 templates/chat/timer-expired-card.html create mode 100644 templates/chat/treatment-result-card.html create mode 100644 templates/chat/weapon-break-card.html create mode 100644 templates/dialog/active-effect-start.html create mode 100644 templates/dialog/attack-dialog.html create mode 100644 templates/dialog/container-size.html create mode 100644 templates/dialog/create-item.html create mode 100644 templates/dialog/damage-dialog.html create mode 100644 templates/dialog/embedded-item-dialog.html create mode 100644 templates/dialog/injury-dialog.html create mode 100644 templates/dialog/keyvalue-dialog.html create mode 100644 templates/dialog/macro-config.html create mode 100644 templates/dialog/missile-damage-dialog.html create mode 100644 templates/dialog/opposed-response-dialog.html create mode 100644 templates/dialog/query-injuries-dialog.html create mode 100644 templates/dialog/query-tactical-advantage-dialog.html create mode 100644 templates/dialog/query-weapon-dialog.html create mode 100644 templates/dialog/shock-test-dialog.html create mode 100644 templates/dialog/standard-test-dialog.html create mode 100644 templates/dialog/strike-mode-dialog.html create mode 100644 templates/dialog/time-dialog.html create mode 100644 templates/dialog/welcome.html create mode 100644 templates/effect/active-effect-config.html create mode 100644 templates/item/affiliation-sheet.html create mode 100644 templates/item/affliction-sheet.html create mode 100644 templates/item/anatomy-sheet.html create mode 100644 templates/item/armorgear-sheet.html create mode 100644 templates/item/bodylocation-sheet.html create mode 100644 templates/item/bodypart-sheet.html create mode 100644 templates/item/bodyzone-sheet.html create mode 100644 templates/item/combattechniquestrikemode-sheet.html create mode 100644 templates/item/concoctiongear-sheet.html create mode 100644 templates/item/containergear-sheet.html create mode 100644 templates/item/domain-sheet.html create mode 100644 templates/item/event-sheet.html create mode 100644 templates/item/injury-sheet.html create mode 100644 templates/item/meleestrikemode-sheet.html create mode 100644 templates/item/miscgear-sheet.html create mode 100644 templates/item/missilestrikemode-sheet.html create mode 100644 templates/item/mystery-sheet.html create mode 100644 templates/item/mysticalability-sheet.html create mode 100644 templates/item/mysticaldevice-sheet.html create mode 100644 templates/item/parts/item-actions-list.hbs create mode 100644 templates/item/parts/item-active-effects.hbs create mode 100644 templates/item/parts/item-description.hbs create mode 100644 templates/item/parts/item-gear-list.hbs create mode 100644 templates/item/parts/item-gear.hbs create mode 100644 templates/item/parts/item-header.hbs create mode 100644 templates/item/parts/item-masterylevel.hbs create mode 100644 templates/item/parts/item-nesteditems-list.hbs create mode 100644 templates/item/parts/item-refnote.hbs create mode 100644 templates/item/parts/item-strikemode.hbs create mode 100644 templates/item/philosophy-sheet.html create mode 100644 templates/item/projectilegear-sheet.html create mode 100644 templates/item/skill-sheet.html create mode 100644 templates/item/stereotype-sheet.html create mode 100644 templates/item/trait-sheet.html create mode 100644 templates/item/weapongear-sheet.html create mode 100644 ui/parchment.jpg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1df7a5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +# Dependency directories +node_modules/ +jspm_packages/ + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Visual Studio +.vscode/ +*.code-workspace + +# macOS specific files +# general +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Build files +build/ +_source/ +venv/ + +# Distrubution files +dist/ + +# Package builds +package/ + +# Hidden files +nogit/ + +# Foundry Project Creator config file +foundryconfig.json diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..4713c21 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,13 @@ +audio +css +fonts +images +lang +nogit +packs +system.json +template.json +package-lock.json +**/*.json +**/*.html +**/*.hbs diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..048af66 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,15 @@ +{ + "tabWidth": 4, + "experimentalTernaries": true, + "bracketSameLine": true, + "singleAttributePerLine": false, + "overrides": [ + { + "files": "**/*.hbs", + "options": { + "parser": "angular" + } + } + ] + +} diff --git a/LICENSE b/LICENSE index f288702..3f83d91 100644 --- a/LICENSE +++ b/LICENSE @@ -1,190 +1,193 @@ +Song of Heroic Lands content and software is Copyright 2024 by Thomas Rodriguez +under the GPLv3 License. + GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. Preamble - The GNU General Public License is a free, copyleft license for +The GNU General Public License is a free, copyleft license for software and other kinds of works. - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the +software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to +any other work released this way by its authors. You can apply it to your programs, too. - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. - For example, if you distribute copies of such a program, whether +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they know their rights. - Developers that use the GNU GPL protect your rights with two steps: +Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. - Some devices are designed to deny users access to install or run +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we +use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we +products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. - Finally, every program is threatened constantly by software patents. +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that +make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. - The precise terms and conditions for copying, distribution and +The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS - 0. Definitions. +0. Definitions. - "This License" refers to version 3 of the GNU General Public License. +"This License" refers to version 3 of the GNU General Public License. - "Copyright" also means copyright-like laws that apply to other kinds of +"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. - To "modify" a work means to copy from or adapt all or part of the work +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the +exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. - A "covered work" means either the unmodified Program or a work based +A "covered work" means either the unmodified Program or a work based on the Program. - To "propagate" a work means to do anything with it that, without +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, +computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - An interactive user interface displays "Appropriate Legal Notices" +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If +work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - 1. Source Code. +1. Source Code. - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source +The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source form of a work. - A "Standard Interface" means an interface that either is an official +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - The "System Libraries" of an executable work include anything, other +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A +implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - The "Corresponding Source" for a work in object code form means all +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's +control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source +which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. - The Corresponding Source need not include anything that users +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - The Corresponding Source for a work in source code form is that +The Corresponding Source for a work in source code form is that same work. - 2. Basic Permissions. +2. Basic Permissions. - All rights granted under this License are granted for the term of +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your +content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - You may make, run and propagate covered works that you do not +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose +in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works +not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 +Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. +3. Protecting Users' Legal Rights From Anti-Circumvention Law. - No covered work shall be deemed part of an effective technological +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - When you convey a covered work, you waive any legal power to forbid +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or @@ -192,9 +195,9 @@ modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - 4. Conveying Verbatim Copies. +4. Conveying Verbatim Copies. - You may convey verbatim copies of the Program's source code as you +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any @@ -202,12 +205,12 @@ non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - You may charge any price or no price for each copy that you convey, +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - 5. Conveying Modified Source Versions. +5. Conveying Modified Source Versions. - You may convey a work based on the Program, or the modifications to +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: @@ -232,19 +235,19 @@ terms of section 4, provided that you also meet all of these conditions: interfaces that do not display Appropriate Legal Notices, your work need not make them do so. - A compilation of a covered work with other separate and independent +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work +beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - 6. Conveying Non-Source Forms. +6. Conveying Non-Source Forms. - You may convey a covered work in object code form under the terms +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: @@ -290,75 +293,75 @@ in one of these ways: Source of the work are being offered to the general public at no charge under subsection 6d. - A separable portion of the object code, whose source code is excluded +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - A "User Product" is either (1) a "consumer product", which means any +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product +actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - "Installation Information" for a User Product means any methods, +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must +a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - If you convey an object code work under this section in, or with, or +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply +by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - The requirement to provide Installation Information does not include a +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a +the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - Corresponding Source conveyed, and Installation Information provided, +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - 7. Additional Terms. +7. Additional Terms. - "Additional permissions" are terms that supplement the terms of this +"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions +that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - When you convey a copy of a covered work, you may at your option +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - Notwithstanding any other provision of this License, for material you +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: @@ -385,74 +388,74 @@ that material) supplement the terms of this License with terms: any liability that these contractual assumptions directly impose on those licensors and authors. - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains +restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - If you add terms to a covered work in accord with this section, you +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - Additional terms, permissive or non-permissive, may be stated in the +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - 8. Termination. +8. Termination. - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - However, if you cease all violation of this License, then your +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - Moreover, your license from a particular copyright holder is +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - Termination of your rights under this section does not terminate the +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently +this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - 9. Acceptance Not Required for Having Copies. +9. Acceptance Not Required for Having Copies. - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work +You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, +to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - 10. Automatic Licensing of Downstream Recipients. +10. Automatic Licensing of Downstream Recipients. - Each time you convey a covered work, the recipient automatically +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible +propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - An "entity transaction" is a transaction transferring control of an +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered +organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could @@ -460,43 +463,43 @@ give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - 11. Patents. +11. Patents. - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". - A contributor's "essential patent claims" are all patent claims +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For +consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - Each contributor grants you a non-exclusive, worldwide, royalty-free +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - In the following three paragraphs, a "patent license" is any express +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a +sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - If you convey a covered work, knowingly relying on a patent license, +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, @@ -504,13 +507,13 @@ then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have +license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - If, pursuant to or in connection with a single transaction or +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify @@ -518,10 +521,10 @@ or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - A patent license is "discriminatory" if it does not include within +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered +specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying @@ -533,73 +536,73 @@ for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - Nothing in this License shall be construed as excluding or limiting +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - 12. No Surrender of Others' Freedom. +12. No Surrender of Others' Freedom. - If conditions are imposed on you (whether by court order, agreement or +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a +excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you +not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - 13. Use with the GNU Affero General Public License. +13. Use with the GNU Affero General Public License. - Notwithstanding any other provision of this License, you have +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this +combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. - 14. Revised Versions of this License. +14. Revised Versions of this License. - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will +The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - Each version is given a distinguishing version number. If the +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the +Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. - If the Program specifies that a proxy can decide which future +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - 15. Disclaimer of Warranty. +15. Disclaimer of Warranty. - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 16. Limitation of Liability. +16. Limitation of Liability. - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE @@ -609,9 +612,9 @@ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - 17. Interpretation of Sections 15 and 16. +17. Interpretation of Sections 15 and 16. - If the disclaimer of warranty and limitation of liability provided +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the @@ -622,11 +625,11 @@ copy of the Program in return for a fee. How to Apply These Terms to Your New Programs - If you develop a new program, and you want it to be of the greatest +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - To do so, attach the following notices to the program. It is safest +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. @@ -649,7 +652,7 @@ the "copyright" line and a pointer to where the full notice is found. Also add information on how to contact you by electronic and paper mail. - If the program does terminal interaction, make it output a short +If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) @@ -658,17 +661,17 @@ notice like this when it starts in an interactive mode: under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands +parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". - You should also get your employer (if you work as a programmer) or school, +You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you +The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read . diff --git a/README.md b/README.md new file mode 100644 index 0000000..af33a1e --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# Song-of-Heroic-Lands-FoundryVTT + +![GitHub release (latest by date)](https://img.shields.io/github/v/release/toastygm/Song-of-Heroic-Lands-FoundryVTT) +![GitHub issues](https://img.shields.io/github/issues-raw/toastygm/Song-of-Heroic-Lands-FoundryVTT) +![Forge Installs](https://img.shields.io/badge/dynamic/json?label=Forge%20Installs&query=package.installs&suffix=%25&url=https%3A%2F%2Fforge-vtt.com%2Fapi%2Fbazaar%2Fpackage%2Fhm) +[![GitHub downloads (latest)]()](https://github.com/toastygm/Song-of-Heroic-Lands-FoundryVTT/releases/latest) + +This is a game system for the Song of Heroic Lands RPG for [Foundry Virtual Tabletop](http://foundryvtt.com/). + +See the `LICENSE` file for details on license for this project. diff --git a/assets/audio/grunt1.ogg b/assets/audio/grunt1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e232b8a72cd2b061fbc420a1b6e9188c8c9aca4a GIT binary patch literal 11397 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 DV0nyc literal 0 HcmV?d00001 diff --git a/assets/audio/grunt2.ogg b/assets/audio/grunt2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6ca17bdecb3e0c2063b6928012089bd27ed2f388 GIT binary patch literal 14316 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 literal 0 HcmV?d00001 diff --git a/assets/audio/grunt3.ogg b/assets/audio/grunt3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1aa4a18cd16b07c9ac63752816f985d4cc103212 GIT binary patch literal 14666 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%0Djc>&$D#u9>wYWJIzN>F?;98noOL7hHP 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 literal 0 HcmV?d00001 diff --git a/assets/icons/abbot-meeple.svg b/assets/icons/abbot-meeple.svg new file mode 100644 index 0000000..7e393dc --- /dev/null +++ b/assets/icons/abbot-meeple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/abdominal-armor.svg b/assets/icons/abdominal-armor.svg new file mode 100644 index 0000000..94f97c1 --- /dev/null +++ b/assets/icons/abdominal-armor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/acrobatic.svg b/assets/icons/acrobatic.svg new file mode 100644 index 0000000..3b5deb4 --- /dev/null +++ b/assets/icons/acrobatic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/acrobatics.svg b/assets/icons/acrobatics.svg new file mode 100644 index 0000000..1138241 --- /dev/null +++ b/assets/icons/acrobatics.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/acting.svg b/assets/icons/acting.svg new file mode 100644 index 0000000..b5138a8 --- /dev/null +++ b/assets/icons/acting.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/ages.svg b/assets/icons/ages.svg new file mode 100644 index 0000000..e435eaa --- /dev/null +++ b/assets/icons/ages.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/agriculture.svg b/assets/icons/agriculture.svg new file mode 100644 index 0000000..a8a09d5 --- /dev/null +++ b/assets/icons/agriculture.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/agrik.png b/assets/icons/agrik.png new file mode 100644 index 0000000000000000000000000000000000000000..b5509d7de788bac4734e12a6082e06148fad147d GIT binary patch literal 53928 zcmV(yK zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3^y(&e~yW&d*&9s=2&{l5Qkf&OWc z|N5uvUswO{fBKijkK@m;r+-Dt|rvukg>$`K$9+yT|>q`dD=p_+uv)&b44wS$8hKTe}0M$ z3E!W6D`$cK`s>g3-~V7gnri09T;|3Lj(h$-VwUjlww2C4Cw{K*_uml;*R%e7087Mo z7aoQqki%U=Dxrq^iSY@6b!=?V;K^gkak2xUl(=}vm{Y3pdSZ)yH-F{{=VxPyHTuh7 z6B|)dO%Hq1(_pi5F4)hL8#XjbD!G(W%TwA_dKopse;^i(vzR^)aQBH)1T22 zR$5vG30v!J^w<*^SbFVGZ@u?1;x+i9!DkJAe()+2?pMpEtkdt?%=; zx4&b>l@>6u>UvgNeT^Ni4N~m9%dY#`ZTCGsZ0$>5{>oRs=WAd8#^1a4XIKBjU;hug z7XIv7JUivjJ%8^Szj{5-Ump>Klj5GSV=)JI{BZ{`=;)r^E#w^CIrr@DkwZ};4_Vxs zYXx_VEzCQ_@`b&#rGw(f8=R2G4b~hfiba zChs$!xbIzffpzbPcYw`&PyO?|?PBR08`?%@Rr$`FMZjF2#ixC-x(2w1_baX-yYoEn zY@>wz=At9-89>_7nm#%XqlGzV-<22Nag9(|nD~r&<0rn`4-wJW3ickx!;ZWh#QoGQ z0UCF@T4*)Bn9A};`u%Bc{1YDJ!8mhmebrQ+IKah18}>n*M$M({pg;w9Jj-R)~Y_fxLSp?X*S3TyOCcjV0@zB6V3q=&Wo zD@g-+9xRl9c|UFGNiRFcdyo9!wimBfc=Z*rVBX;F<74?Y)>z&-?wa<_Umm-0WS7kGRn*L78dZSdCr)yc&xO!yX@Ta-Rns}YTkL(nlHZi{@9>a z>I!v+fpc-K%gWl)uC?%?DT4z`n~l8oh62HMz_vVjWRPRr*Mqm1APH^`Y@K)zpmwdu z*B17vL=Ge{bNgFB2gbzTT3uspEOc~W)2~Ta;;4az`vc%vxYC*rKEd!dLEy@X>FWb( zK*aH2Oktg$7z^Cor8GV{&In_R@7f{pt{+D62#B4X&*jDZ(wy}c*y@Anvn(v$1K13= zE_`m2CS2EI6svf^g@dB8c_Q`nyS=@s(G|Kqj3FI;u={Aqp* z-1#1WFY=X~!n}HZz`~akHZik0>we*tD{<1^QJVf^$2hmguVnlh{t>hPR*DsrEYAa4 z;g0S%#ZXgvp}Jp%g>5VoU}$_LX8r~UH($sR8oq z|7GiI;SHa+bRm-UVP)c)FCQP;41JfY#aL1(3#T4SPZdnVK=2!1cZcT7BVx3?NCU#^ z7smVGTz%&jUwlQy;IZQ?NnT_R?amzb`r!$_@!&lshRI(n<#<@8u{(aA6@Tv!B7$30 z1`NO~v8C(!I!+0M;gB`#GHg7|TnX!0JVAL@hK|$%>*q+5LRQ zzz?>E6N|xMqU_2R5h~j?dEajqy~qGp`Lla?hzG#JPI>xx%gRxI+5VR;V4r)|A`3h$ z-kWa&%lN)ywQ;_W;+z3tJnHS(dBMrXRV&$g-Gz7bpb-)8Mue{og*V0jb39ALE z`Dj$y#i390AbSR;G8oEn!XqW1=ixbe&7cho6$AsCSHsrzBp}WU96q3LdT|#QHX>Tj zgU%SU`XfyEC2Jm`+$?_b*gq95{*;BwTX@LA;%YZAgaL_63PL&Ng%RTf%IKKSO50(!6z-I>^RCsF^ zV@WP~fLwrk?H0uE;huOyp0Mr<7!d2gpvCuX{9ky+`+>8$Y1=nk1dcgGkUDC9AuK$h zERvJm%5(F<5W))|8>OyTFsiEH22Kh55fequl-X(%0SC~$D9syW!d12v zYruiyxmUj#@wIOhML0Sthj~3f%ZzO4 z9H>HERTt(FFMB~ASsHM`#o!BZ5uAn_bQ&Mz7xQ?cjDwZG+m(Z72I}4MS9mqR2}nn8 zcpi}uJ8=Z?R=^a@YCIWEfOErV;e$W~)~&|2+h(v#4 zg9tfAknD@_CjJ;kj{8Gh-oiA%wlaSTBo9wzJ9z&9k3rJ$s`NVBP55#p8wf8^<0(i(C>0`#H=B6J_D* zg)LXUzP@S;&h@}^v-5a5r7QyF2Q55F(sJdrun!(2ZT<2WBRGP1foInpkRB+rC{2cN zbl83c!ux26*KQEY@Coco9{%xaJG}ZlY+28OK*X;lV6X!P1JMij$4}>N*b=5WKa41| z+?Y8SgWrY$y$SRxtiZ#%zXoU_Ppczp6q1K07-oHBemI>z^wv=11zzGaMvZ(w;IKf& z8$s}*ZU9+G+Eov=QfaE=1a6_~({(`8( z;cx^Od`S6-9D$%szX5^ubPik=S@E)L1j~W*8GHahiEltZ!Tixg0BSS{1mZ;qTH?8l zPaxd=NuKE^{voKCIIQrQpIiNfvXzVvr{n@2k~QccjXLw0&j5Y8kyMzG?T+6UQY>0j9?ejJ_3Tjv}GM;P`G z(_LZ??sZ*8Nn(NY@rIlP#73GyA@x9U!2>WKFU>Qd7o|kU&MQZTC42yuE_>%lU5SIt zGQ49L7J;=P8tx4E7-ig!Pu+Xn%z66_kjlx90p~1y6z7CfcF2ff`bR%TopBUr& z9pl8=1%!w=gkCs$5zeW5>?mm1{N_+s_7GXMCg7iCq4{3wJ2XT1g#Onv2{;W--guR! zyo$`W@`@9l6F^4E(XH+RVBZUx4~v^>UuhjF~%JW%}3(?SfPu4CZ(CQhGS#IfG>JM1gILz+29gv zKUB(7r-Trcp3gEFF&3+`|yxdUKH>*If>vV7FyZq0LB815kHR$gNQ&NBHW9ORM7!f z`vP&?Q+z*X;z8cChn&p9pC6o+G;hd|eR48|VuLKDs(KG=s)Yi2*|_V+w(?97 zQ)Qhe0D~z**Z?{pBEP|p{zZd0=-1?YegQpd3J>_;NIkH9IP-oub-VLL9U2*QPnfJ; zntg^Ac+kgV+_8*zUYe$=7)(N-0AVlihs#4wPx1D9+RFj$MP+4ZrD3jY#iRZj>K(BG{JRXWlX6(=4 zcfnsw9q)j_$|f)**1bpIm2-jW;&?oVXX9Q0MJb)%jAPeH3^0}T#3A#HXoYDYD)P(V z#<=ycINgpXg?smmC#;BLz6&9SlEdUN!IPcW)30i-=(%|iPCsAKN(TD^w2WV58(%0t zM;#&C@o#Ec#ReN-%;i2-fiD4(Lv4ULPmV9DAwI}Z`O;7e@u6kR1%8_cQZ!zzK-iJY zxB~pBoFOBf?)VGC2)Sl5S&_#u0ZQHgVdU}fk1RL))TKTU_Gp~1@PsNi1Q_yqs&`&a z6n+M6DQ{qf=H&4Zjt$k!fx9D@=3DRjG9MdcWE_lgT=#jun{#p-P9uce&H1#IY&AO3U9|jN4!MYCK#F=e!Z0w z7BNO#6{dI#fvh{~G2w#}8rd)A!30w~5hI$*^cKC-w_^4uUlcw%Nd;D{Se=u2)q5c)zD z(&mGnLmFZJ9G=6QTf{Qi4RbPpGd$inbCfxcV2};q|ALrL55db&j(9^Y%7Ih zRRmT9pa>i%Z^onEO)<<{VL6adq*_SGNgf8kz%BCM3*L_F$T@Eqc6-d_;*a%7ePMPy zs@fhue~UwUFiy@e$QnCNoIk}G#b7TZZzi4sNMx8Ao5yDG0n1%_@~xcm;NI9P3;u4t z8W(`+;L(EFvG$brx!~!?hbIhiJSQ`CFbUy^+ysJoZOAKVi@5_#pm5NwnM1%MCMzI7 zopmXCfZ~bfg?MUns+U@uB(@m3zzt_Jf{<3W5+%Ih0wW~2*Dce0__Y0^APt5*oGM-j zCkV!ZVQ)t1!mB_n2=0553jBdXlHnxT1NK-qnyW$WH(JzD_ygx5tpNBJ81bnD3ruMcg2%{uE!IBBzHC#Hs z)itgHdPEyw-%ZDRz@ajNn8H((XSPt`mvjafTe0KkS zue{-u@ot8Pjl#q9Wcm>U;^EB&BAsEydkpB`jY}~-w5;U-EX#djp{vP{A~p-N{O|{e znI*viUEvLoe&dWEz7cXTu<2HK^$x#}LP>Q)*<2_RQ2UrytqL0a#ZoGocy69NSTL(J zD%^OYC~?wn!(iElmp>Y|(d>j1GRs%5B+df8s;#CIm)|Ef(aDMR{eA0XOLMh`pj8$0 zm*T**Zr2K53qM7!vk08+aCVkcf&LwO-IB#{=-~;qa?Dc3myI&fdU({74Px`Iu%3B` ziOiZNnDNC1G(q!+?d5FnnSl7lofhPYdL6F~p?>(@0lEF88aJx>eS{l?-yHZ1oe@q3 ztQ~?tm&BA-%@0&S`oVE>Xg!KBxH(`?kKc7X^J@+UmCg6`WK3il4-Q7G=Ilc(VCgyr z&uT{3vB0fh?T^a7viJ}um>37h-HO-NyBp`^fLbdD!-J>lhOuhvt&p$fO^+F?#1n%= zz!b(cflKx)jaxCgugEbjcuNl4jb!FLL=>_qI5Y*|f>%;~)zm#Du*!%@!QM_17+-*Q z0aQA=pS9rNziN~KBkHGI0@plYO*w$S*2wMWRQy5cqanD2-!Ul;i9t9o;rN0_DI9R* z+loZ28xAL-*2-hQc_H8{8<=WeO(vbQmQB=f){;oH$lBK2RH80CZ+i`!>`c zn(5wS43C18Pd)Ax=8sd>&VRd@MMV&>7%4K)d%_z?IA8}0eU1Om!TG=dFweK+piibc zLH#x;&c|~=a5G>O!hs|3u|8_C=VXcSjR*qPADRJ%@TsUe$X}5$McxD$xjCdzY<(Zz zm-7e}1o6RA&=nU090OF35v8TUg9D+;@bu0mn6mn#_Y3aXvor+#*o|tOOdV_mhyyHn zp%Us=R;`HruLA(MG*nyN(Kvbx@|i1~s*Icp7(Rmpo1MZh%~0{Gut})L=4=3qH+oqG zfT0-eoqqPoTCS%pEZgusF3fZ`s?^W`0wkV5nU3p(a3uF{jW9deYQ%WpaGdHln0Vpn znDJvNp=JD(RU9|!@O42uKfU0UFKiTeU{yun2`)lhaPpj?_vN&+-G>!kVHEZ_nZPi# z@Sy)VMBo;JJOdYIZc*BI|6X)p%l;RHKo8Ua2oE+1=nP^udv0OCw$iEatccK0fC?MdR-xqp1$*2=3%>*eOJ=?V)0vM&Qg6DR8=R{8@RN$=%;UI&34r@K zQVHW78)B2D46xP@-qWQ7H(m?%U)8wtzTo`f(JJBjm{Nj-q9M?`#~o)=POS3lM<5HJ zA)G;uc8^E~NG52G(BS-Et-pqgEiySZULbHb{Q&o^IgE-E-pHb8iQL4xIO=$!To=r{ zu)zk8=2?feHHNVAgm1MG`EPI0)Td5kJQu77e1g#7&N#JJ0V!5_ z?AuH(NCZB7=H&s{_$L?M+9z67GfrqM4pzMkJmgTjMFPeSEYoAPH=Kim{bdy@M>R%4 z!UPTy~-7mf*GXN{nQ8`rSRq+!f}OAgcUBgl2~TKe?N11|%x0s17lsg_a!Zl+~8E0;0M zbd=DT=B#jDd}!l{0EKNBdeGY&ost;yZHA%@1wl)|lBDoP@LmIw1`;Cm`K2wuzs6>Q zHB+EhO{b8mqS08@$%}o1SBt8ubAx&Lp|_dP}U$kQKtbctzf+>oQ1s`+l)WN@V-nv z%N|}B%#GyyEJ?5`%CK;UYpE=(7E7Pyct)WWIS|H^&Ula&JmOfF1v#I2*9S*-L%YyN z3q|-XWr(#p?;)x99-J6j0EEnMAAUSC1aXg#VbxiqU^Ox}04id;$~d0Ubggx(MlNt1 zSll;E1y%v?iAFAPY`p~hHM{@b805Pj<2~k%ITF|bkXUa_&1Cp*A4`F^j-$0@!wE+aX5p5JuC3@eQHEtP7f5B594QoBoHE{YS}_+5ZLVYNkEA%9^K1RIsck@76ut9QhwSGUFYgzB{3({i;U_Q{Fs}Cv6M7=@ zOnk%orkd6m`ytR4+2I{;ea*W~1YLHtP1Ej{LJstHT0Qho(W>5;DST{t=`3*W+%z0evod9eV) zY<>v_m{UFeq8S7VR#5~aNx4|!Y@S3H3%Z-NI-wk|erSk+;B7OW!o4n{7^%a6^x*2D*h zGN%v-*HE?df}P{nwWF?|`IdT?w;G#If-S~mntN$lz!eq`S%A!091s71SHNdLzzKh6 zFJS%%H%kNzFL?uSt#hb3gfML!WI!$B6ZZFh zs!MC4W3Q(^`n4`QLN2G#-6AF$ry6l%@rbyE$vtUXT=w(}s($kl;3BBn*+D!87?63b zfmh5AS^%#O)c_)3r2soFP_E{B=D;pvk zB%eQO7_o)R3<1128gQ!fM`w^_uQhGS4!tG?S3!rKpRVw<6nQnnl^qCvtP0r3ESUFg zt*Y^AP`99YD(Zd}QTkNroA}_g_7jcC>$KKDN36IlrgGpWU%G5jNVtA52^ouN+@~;U zp2GhmdARrK(nywAnS;7b)|wF0o`8{IM)telI2;};4wG5L$amOEae5%21K|E$@d(kh z#0=00Y;zjhZ0|cNRKV^TYuI72hgQIi(R8VuUMqk=mjWqk5O2`q1dy`n;9*#-n^a_H z6dr&FN@`vxF*w0(L9teAzJb+5#Xw83F<4jB3U|m4@Xdo^RG2=8{ zLvzuE>1gWFfS(Kum|B1guc;!Bm}qsO)vP@BRi)mRjXtJy^SDJJ^9B$LmK`nFRL$KG z0K2^T=PXdd0}=78B>0M|L(_f%W9KZqBA_Di6w7ido)TZXUF^yH1QH0a^0@Xn`r6xg zb_a5w^+Ng4YrI;`#dE$*BT4g-N-LOr(n_sV#nCK8I{Ovi;5d=jC_uBbf?WoP=7nVB zAh2T~ywS9Jh?Fa|ytQe=ym`AZ?rPnRMYj4g ztT8PUepZ|yvw}f$_!9Kj+D8sEbUA~xN*ozQsi)AF4+oO4R^uHesdGW0O&B+CX%Z?a zGOgX23Yk%qZkQZg5=mT6FAOKbJ%svU?C-C=ln>grlijVL(9_i_yc$~GjEH7Y1eW$% z@iVu4aV~2*vc(|-Z;y-WU3@_Zfw3U+Bj#10)7W%!c{ppsW z^LM1my?aC)#{yyJd}T`t@PS58a3rt)IZk@>e)d(h7u{)b-w6b!knB?5SX+OpKK9%K)P%xXnslkT=dWy`5;gh$;9Bd`OOW7)}t|7aXx{Jx>X<%zAJ zK6q-Vmm{GeMx0?oTRyf8_~FN4JFC1V^yy(3tginjdyH-;SOcd{qqBu%g90OgPoVz|qFNm_#~@ zIt>Y-F8)_ai>rKeSNG{B+f2s}rViS_|-H#TF|76Lt#(j!3jk zY#Wh*w3v^aJR{DdK*JU;5#`Y3*%C(Zj4M1<6hypPQOUaA1x3ZbDH6UzG)*U1X@JAHYg^{sN3dU{ zG)^_d^3=L-cyW@m0vvn)wypfa8PI!`BYg|;Oi%D*8)g_lC1r|?qwqX1^Sc&A9Arh#?CJ-osJrwJLJ6L@T3h68oUhkg_O1vkDHeHYy|c|5 zHg6g3fDq$Ot@Y<{q3FiAO?NzONk7%`ia0M`ef*#gZ;;;a_WuT29B7Op%F}9zcLXaGO;G%vXv z)`+OkOz}56!g?r}ogEO@RQJ7R!h^ELkwN(Puu=l89NDZa{jn3O`nrG zha6KFmq*>!DP9@D1!l75)gG0{u;%S1!A_@o%hotp=>5nm-~H`SO3U4j!MAW|Cl8_a z1VPyii;OTDvw-ds;Bq>1t5Hfc<;jXWD^Po*>t@88|95oE-$9 zR-iJ%q>8VIc()h?KQ>3T8aDFN*%l3~?6PFclDBCNC-3_N&>m|X?RJ7TntuzmJ`eg` zEpa;0(H~gZ{<;~1Q^{jRlqHZx(XHMOfWf0T+PhXOV3)x-2!r(UHk8CxEhG09ffjtA zrCgxWWhsv3#Y$E4m>Z*n>2_x>4a@aD`?i&9=UIBPFv0wv6vL=ILZ10&Woz{er6f&!D zwOwEsbC@_#$Ys5pnepcQA)Ku-3gA4CZ{8So$!hXLyi$$NX_okov^yNh>H$E*9$q-Y zyv|Gy+&U)vvfw6+%Zm*{CGD+73`Q#}>IqF_(;xaR|DqVr@@L^Ckdb)d#XOyme9xRE zBJc5#sc!0R4jG@Z1PiwA? z+y(mHY&mEaL*n49amPTc03(Q7;e36riW4^4eXhRaK6x*V36p+ z2CfJfY1zJn6szj58MXjysv+%QbobLZz`hC*|PN>H94Q;FEAN|5o zEYXJ`C6wFnoJ>$)4A;~E{wx06GHAF>fO|Ji3_yQh1DL6HVCt}-5Uv^6X8e`itT;58ps}WE05I5V7efThR*Wcq!<={3m&oPD#g{rxZ4V`I0er)Mk=sePpm*7K&p7 zJlkgB2hZ3aEW7Z;mRqe)$z+%tKLP23@MB4@?RW{K|5&sn=$h65@T@D$r`q3g^X1qg z7)L9B(~0McO4H&ntO|jy&g#HIvjnH1O5evGmUdf~hn*YaR7^ts%>F0)(j2#CW9nnF zwzjC7U)Ex93g_nG0O;4IxZ`LCZ&f7Dp6OZQzU<;eT`dKO)k)_2RPewyHUOJ~BtGs8 z-h6x<4So_-4yg=74){EK9qxI>fWVW%w~1HcwB@n$=_vm)kcW9&yrJZgorypFcIEf3k2zT6e(G%f|=Vk6VJY4kWfC`T_$L3CBV_5HkIa< z?Z9&s3KAv)Bi#TvB6`6{Rgy*5C^%Lx;xUaZ)_#RCfkk{}wifkGCmjB5*%`i!jR5lO z8@IAJS-o%a{&^e^bvk$*LEzvn#}<9j!jjk}wMQm#+)hE=6F>cnq81m}v5;Z~V&%AD z9rtTW3UoNN#23<)!}8gI3CMglie(reHr!wK<+IEZ(?pct&#B}Cz94q+A7piH_jmQ%lbT5;BHb~qZ{)>*VR zSYj{(`tC+;=n~#dOR-+SQn<$1L=Du-QC}u#ZvE;x4(S`N3QG5og@M2EIVHEnIcv@K zkY$7yA1iY3XV!C-btb~B&uoeLL-y9%ORUWZY2&O2@!;N(Wl$BH0Sl1N3&Sl#Jw#H z*&MqyRl`5+JORt>OU6&X(V<&-t7LT|7Ka*b4rMVd)-7KEJt1BN1Y}Rct-iJC-zqyy zsK3WN0j!M+oK_gBkrM7109`Cw`PQ}C-Y=l_8NT1@&C>|Oai74>$}15=ip@uA7Vq$aCn7YV5hiF`pLHVwxwi(97&Z5dW9h6d}kU&m<`Yddmw zbP)cGAF?zKhy0uwIufdE`Lbn;rw7UdkLZW7+@}n`p^lDvu+zBOBR;I~bp8mWEy#d? zk%@o#V7F)%Jf0j7Iai%*F%cG=T4?FM_%dVx-Y;4rW`p)Lop0KK|D8mr;fU-+BQT^k z9d&xG+pz3M8jK-*{W{Z}98GpcfN+{|GvJbiLpJr=Q#xU4HnPUoB3_he;Ph=PT$E?{ zWYqe&Sd?_yjiEr#C=Lg>E&F_8n!n7JlPzFcALat_HZZ`RwPxpUBf5;LB)+0cBjF zEt{N}tKC@fR4!y>->|v;Ov|Y-yb~E%*oI@9P_RGQ(5<8W+%I3)uX z{hStK^rI0WJHGYW!*TS~XZVW5$EW+hlh@1EHcF8ze;8=2n9N^bUrDf>`U;elN>OQ0%|n z{8x#C?wu+{7;etov(2`=o5;CWgzy{5WSWs;xIQCY~7$M(C&k8FrX?&!gd2miqaaIj- z{Rwg<_#IzwYv5k%defOh8GQDQ=r^v-%HM{HpsbN2P;zvRh{1?;s+>$= zDo*z>D}5ql2?IAl;83aC$_5_(jQM)eg}{uhx@$t99vQPtN}Kpxa@YTC;46s*Ww~f zJIl@MbfRv-px#!k+hPw4R-SqwyDu)}Ed&G^7VUj=ddlOd#G;SEBeAjDXg(UCI8R}k z6SQXv&w)QbhW=V!b7{xj&rA;QTxW)^qX_279h+--v8y!$^a#=Dlnd*tJ?Pz}^zHBj z^cD)z^7=APiCG0`k-bPOytnKIqd-TRCRj$Z_b{ak##c^INn#@e_qJC_!j9pCK-L;o zi-mXtK+KVa{Mpw+lxk`BYl0Ks+vl*}IlMuxm+XUaAfsK-Sp0WF-p$U+p~c=7o1v_Y z58E7W%|hZ6Ubyf16=dIcrU0~T{S3nI41AD?(-JGxJOE!lFzfL+~*+IN!*#P#5z{MTyYR~+3 ze#Xw$nMF%`;cFQwV|4TIf13qtW8x6NNvx7&H!ULUPK`um!>OL^EaNBrnnB=>e1tkA zy{D2n?yso)i=FAek$v4F1s2>cj(y5@_NBF+JbZWD4@MS%XNM8mxiIY!o4-G2yeANLuQRdtv!=~pfSm==ZuJ2V98QLgXLN(GoQDZ^Y(T^Q&{F>gFsg8ok?`dEQ5jdrv(WD+h?oRWwg(uHw{Lb z%PY1Q;(1+lLpI2z<)m&lT#~v^f!lPh-whLn^qoOF^E&m4pZ(3Zc?OfdxJZ^DS(0J~ z3g$hmIZaN`g$@z0hu0R;&m46*BlXxwm~6O~RKbI#5M%)mRIR^83mty; zzK$qx^39n>y3XJ;T%6%PhmSvY=i7x{uC8aVw#C>#h--r}IJ2xiXZoxtZmA}O%Q~yu zL9)w=Y~GeHF%;y$+5KH3mb&a0a=a#1q61<{_XK0N%)sXqC>?>2sQ zieuV|`g&J@@%sX`bT|#$u^RNtCh|M{2692FKJ?>sN_v7L@%I||@E9Gqo&f2`u~eT> zgJVZJ52uaSo-Jf=&fTu}y1;Sk0#4u8`#u=Td!MmyTDiSKFk%?EZ8M)exvwc2;L|y{ z#>ye!c0eYx5cxqv!4#05(b9iM{-N}vg7vQ^sl}5&o9wQGc$Jnp-QU?}~0rmS=m6$(yhwoU8+zp07= z9ph9?O9kGg7s06OFxJy7X?c!$v&zdxRRhFlQV3M~^CF6Re6Zz#+hUj64S~Pu8J7#e zJ`~4Gqp*|tZgbyo&;FhQkdse>t>TOa;tk(FoMQwzD3B=(NXN6q`ra2d% z0}tA1G;Jp=DndCLdY)0w!|2>8v7C?7hFR^= zc+Wr!`{@-qmnRz@V`t+`!!a{(a|5-fKGbZeH6RX#^#-fA^3iFY&iZ@Xz~x+#7ks(? z2yc7Qt=aDj^ukZ=Zlf}6fKL-+w}W|u<321#cecGVIZU8eN3Ynw7G&r+Zp(8g-r=!1 zu%7`}$TowNe6+r%N@9UowylCMUU|_iI=L-)g|S&xoUL*IAyD(nd9s%Djzg*}8VC+j zJ+lv;U2%I)(Zi!`2QMrGGIn7(x#C1FPc1zrJAZSV#X*M&+K(!W#K3LxgbrrgR8VgQ z;BDS1ran2e*6EGY8e*&o=)fg8c3HqqCLpj^7L_N#rPw9yeN1PRHm8@JlC>bK?@L&c z_^`U=j9zDnLAl`YgJIP~1MF?gDCd3=$2VIOv+!)ru7l0r&JM~~w>AM??_laPoXVzb z3k|pPNSr>q#r&|IyAvw?xs1tI2RXVTfqhM7FZ1>KipI$WF!qp{M zx5=By2mcvymu1vrW}$(r|8I z^(|#MBLdjlb7Jzi2=NbjX2{9R<}IU%&OmxDBYo514|Xs)LI@e_oLAV%i>eRJuJ~{M z8C5!+QFoevK^94*Ep={nx>huGSk5XH>`Z}#7zBgT=_j4PX=Nb|8?K9$qzek|5!*425#$c!27UQYa2ccf;T zPB?dp8t2-1Lx9b4kUHmr^}tl7L)>nx(Tpfu^5bCUXymj!4lsgfed{!8f;d&7uGPrO z5Q8Qc97hYH#8V0u9f@IL6fx#?Lldsz#Q+d3#PL3y7Z2nucE*hVRC8xu!}>QH6p~e! z?WkO9*_&-?&V{YE#uU4|%4Po@kM9hpyk|dKm;RAMq`)HwiuHvaaSp!bYMc9aOnJ-@R?+h*mN&{GbS|JZxuWKI%$oQnFJNye#s4MV#Y zXBwwvXrE(EU6GSTg(h%9q9c(x8=%IG4{`FV64e>G=SCAWT?JGXUE3w4q)R$Px?Z|L zxB}889STZ!cXulw4bmmuUD9#sZjhAj{tw?;KP+Hfn3;RxslE3zL*&mm7rQq?7tW7@ z!uxnkm9&2!M`Z5fi-W)LA5-O<2p-MwGmZ}0j2Rn-L+x`Gc=y~R5$S!pM|q6Wk<_q8pZT-q7r77mj}weFYR0Z7 z{kMOH!Y0SDxDOnx=aSYIzhPtvoOVon&)G|BJHmHEG%_q;X_tETnMwau14D4r&9&3F zlN?OWF1ULdRwj^pT&;lHNu+OM(ZNCtt)R!;t0tTJ#;wbj6J;2&Q%s5WA?-9u;csmW+42|trG&rzttE1>RJkgy`s)Q?8=OJ@XpP)mNvLI+G^!vq^uY}8-=9$UOe zXP&8?T&#o7gjgm+DR#VceUBeghn+G-q^6LO!$ey`W_`kV(AT~~*}a6qh!`Y_R$k|F zon`0c`HLD6elu6tiZ&6jaL_*_nsh|i6p-+AIb&tet9&Oe`)XsBb!f1)!=Zdmzxm(%QP0ESTXaL8`NFa|m=^V8oWWD*AI_%ZlM&f!kdiwTq4sizHM(AS z-sVA$M2B!^EX`g}D9wm-L@xs`VY58f4VpZuS=L8w+=n&KJ(er*Z@1{s?{==%*ZDE+ zzX0^7Y^(+3r;Kj>mhRU-LUyV(90j(Csj=U2+n|_8$MY-g5ZX1=Vws+BB-Dxguey<`~?Ye=)y&Gkv#Q*3Cr6Pv^Db~t3V zZ$m!&hHw&A)pD!8H@cvAGy7D};havaO5)~GCC9gJMpkDsR-`7?yy&a;;T(M|t)A^% zuBBe=aCpy_{9sepm>jXs;yyujj+l~7M%~}8N#`f|T+ZPGpjNPTGUc_nBBGxs z`M@frL+3kL2Ehtw-^e`(Y#I=-sFs=H~78gCteZ#VOb%dY|>C)4VS*$c$q$<6KMed-)_m1 zudn_=t!Ix)gj=vvy?w8Yzvwd6KE_66@AiLxur_+N5jsdtHZG=!Fq?ZH=_Hc!2(nOmdG@=)d>_wO}g(NA8b);g- zCwFD6*oIG3nUn^9i6t6t(*7fid4=Tn>F2a&CT>$JITHM#Nr!=#oK*(Zwa}0wrT!`p zJJEG}DN-}Z#++v$iYHyeh&y?pi*zA_O}u}g^8s9xn8{PcM}8?W8!5uRdk?ELxaKm} z##2Li(vwCB!^OQ-n(?|Eg_iSqmjcW`N3S6PlKnnNIQgn&?x`P}28FQ_*U$udiGp|h zSHFD!Q#4d%GF9o^Acn-`Iq63Frpkpn)qJARW(|&Kqq}Q?0%?vgu6%PzSSuG^S=CEk zl16novx^+U9~0fhSk7&9IUENQW7*ZhGF%zUC^&|Zt+$5c$N7(vwolVtC&z)p+r<=* zP1)1Q^7AKAF^9(@bO&T#C#~_*w@pbarIafszsmjL&(p?)lGN!3;o;x13;IQzd#ui$ z&++EW)RzoumVW|FR(<8Sjh{}}h?4@97$wPTN+n?^^_x<6MA22hxFytg6N-0@3Ov^8 z4jSnwW!d6J6%y^YwcRei8R*N5x&0>?H5yo>M&ZZ8FFwTHo>xgdOmt$JJoo69T2l1c zgMYlyWiV#;#F}mxW}ziCjEH@dQdYOZ|Fh_GczK-s2e<*_KZKZlFeuddSO#pNg9@Gq zR;S|%VRmgJ?qfBY4YxCfR&BFtLs*IW$V$J!npx z_D~E3ArxnIKuGeLPlBYgIryEwn^*iTP>fE zk-g>&gO=H|cj-|0cL^{RBlEE|`pXwtIi>GC5j$KGpuT<1);4z|G3VC)$LQu&oYUPa zw8zY9f`mwdCn{{&%>wed>`U5X}$Az(DRGzqhds57%T$m)$QPsp1pQ0(BH+|tUeiXS>II@n3z;g2XD&kAq z^MCfCQlm`YYEtV3y=X6(&1V^6b{@-Czrl^lxeOwN4C-iBwL9LWmB{y}WW4)2s$J)T zW{(~yF!N@_Y#LA08`jjYep8xCbL7pNi-lgDgACD#QJ?c9^f|9ybYDMcWyZ?KdUHo) zLnL$2-4O_Z$J?UW(ywf5mH*Vo>^`$Qd(pj>((joRVLRm>u$=r@x6+vUo+};OrSsSW zc3iGEj4EF+OI?*sROv}cIlShJWFLXFRn<^xyRNld5Eg;3=%=acBmZ`7SS>k@i)XU$*38!&G*oqBF| z#2HJAYV{^ymfkT?^?skoyDgpL;hQkL^bcr4P1-n#Fr1nr(p!FPTsQ|-eF5}$hhGCi z$oBGomRxfsxbyqiXN>e^a>;tiOW(D_|6jt}Zp^B#J11fF8Og?Aoe@&RiMp z(gy`Zx3TQ8lL?#LUE%o^(lBFdVd#ydRV`! zdTSpHp+gc81R|_(6K~IerMT#H()kj+Pge-WH@-*AAL6o4zx^5&gMRVWC&xl*w>G=J zwdeQDaTv8fANq$W>`OY?pBQ}QueBvLZRZC7$V3u8D_JF5)QMIc8S4T zl`t^pc^al(qE3iU^}N*UkoJ9G=veKQ4x2-Hy@t|zcSHSm{1(+ZS{o0oW-5nOZsbpE zWVyiwq_O6U)t{DQV2vh!3|S=N2cw+MS*cZMl2W*$SvebyI1#aJb+pZuq2N{b`sU&W z{I+l$_RR`b4ZeS*6+}X!-3^U3^!k^7?wHG&6tFFGuUjav2HRPaY_>i2>8+CA#xHIu z?s_B&i?2&u6A#|i=|8=8Zy6P6wN0{zlOs(_u$jjTn^0&mQsLE_2nmRW7GqhvFGzh2 zWube#WnNK3ofI>&@LH2$x}!ACN^Nl(Y290t^F5PkRAlP6vek;XvHV1A8h)Bz7&Lq= zNiR^7554p#>&PVX{Yb5?>qigXkgcCPAXj%w|7P*uVXXRbcxiX(rKOrlVzJ#?ke@&9 z6N?OyAv=f<;i_>icX z`iZN(`Kv$n_Lq;eCRBiX25d-rrv+3}35^!rZA zs*?)Y<+BO&4KaN_ax|ktT5PfI3Ve2U_giL)ar)t7M5r9ZLkPwNx1c`@`ZfG zc{Hx5Kar0O^s~qPHJT9ng88Vn>i0)=F!Y};_=Sfwb=!2;wmjXs8@gp+@rUBG+wv_H z`_9jTx$DRw-R#Q#urLZIyBG}5#t?cvx(Rlx1%^XPYhQ-sQ)K;5_M!s^x}pKouzG~O z$r+@r;SQf~j66IvVPRN3j$i#cuJBdWI*4U4QLQ=*j7h#gte*GZ3hgC2b{htQq$b27=gTPN)*g-@ zVmiLOhUA5^|Ful#%)#dg-TN$fiD@b)hgFn)<3ldUuof!Io?0`1?|%Rn*_fWKS6G1=Fps zHE-Ok<$OwT5frJMttaP03qh`5*0?eS{V>#|%vZgJEYW`MkJ>fXyIG~5=aYJeZPf#A zN5|QzU_{&Z`73a*E?uwD(YlzvZr)0$(`4ISi0ojdRC~Tosy1fQhEK!Cn?VnBOuj&N zv2{gx2sV)1nz3X#cVNYJ(@_4onD^I;a};l|>=$;pDXxgnrC*Ri72BvH(=pj*<5o__ zL7a5~l6=7t0#eQexhS)z8}>RniKBDY-ew!LNBO=H!8Rya^;OGS_j(}u%4@3P)_2u! z`Lu=!@%Kvvzg+!{@T;vS#LVOmiXC68aaA2O7R6N+C&vgDun-Ez&d7_pu= zm&uYeGwt4ETWNvoqDB_$TK3u`uGnR39kt%(oBO07T1#4ZI&!p!XwD$i%KRkO;r(7? z0@{5OGdKC0t|l_8PXCMpBBvFSTbR=*cAkJgoz2>=XNWCbrUmL-(<^LTH)!gRR{i3Z z=FOv0Ht~C^Bj`KX6~o|mv_s)dXFcql1~xW-90;eyj_ytHpY~u*#!PEG+zL1N#o*;_ z`ybZ&zRB)g=b^%%+qFI~Xk@YE z-n=mQQNH0)t@Qj@-*GSR_f~&1Ec2z`_O$BXR+AeI>@h!{Mm3V7HkM^Is z>+;S3>`gm7*`7AN*6gRtV&&(=_P#|uXpm|BwML6R` z)5URdq8&4o87w-8UT52m1Kay%jcV^qY+QD?9h!~Szx-Oh*UJh}bP<>q2uO*XN%!N) z@1TeXrNk~!nkBJ}nKaWk9CNRFsLt4S40KzuZ6Uc?^$eP)fmf!hNF2S9Sw!VU-lLR> zjH|8w_6w#%TnsubCjY+r-W~PUiyN$P~GT{zT20MKfx*<#|4D-aEVv% zj&?2{)pj`ZIB$Bai?3hT?74C~h`wT8s@f^@9&?b@VgHshvZBk++!wOQwOF;nN%H3O zZyw=!4Vz{PEOBSG4V~`SkR_?1;(&qQ0r>_y^ysy5E(UI@PL2e(naTeu452NXKU$bW zCpS%Dq}=RQ*doGz_YdB7!WuCyKzW8XPpr>FC23nDO%Lc=7|p%g(om>!;L5$io%CD^ z6>vxBzQMts9Jka2d>wt$60Ri}L6Z@`Ifef@0P8+G&rL0D>a=xqObDSz=_0}h4mwih z%X)^OyZN-dDRlXlRCO~*A31Im{pW!QVPpm3jd%Jx5%M85qHesg^!RwnTnp(-a-@I#qYwGIVj9^Vej40^Rc`f-h7Y z^fNHp-cSi6{4j~J)@9TcU5~sH(YNES~&9dMrgwSOdTDJwkiI$Lj^qIR#HEKS~ zwNsI#d#A011|_c*OamW{6`^tC{kKoQeP5Tl8#z0`Kp#ttR!0$K)L+}FV=Tati$VV? zDYX7N@27!ko0DL0G>Nukuea)~NldTrY?r@dSR6vZMzSCahQIccAin-Fk>Hlur6ARm z#C^cSJx>@LO&3qXvx#++WlP)~Nu~Yccq&(k&!ygo4_8Ia?thsT44?Z($eI-i=d#5#|n3GN>b3cAsj-qF2A zX-%@fVC`&9O4_@Y4DqOc8>lyEasNZ!caLDQyD>25L79s||9>;#NM%8l48flx$cY`Y0Y zye#oTd~GN8#tRA4iP)M3KGZTqBvFDA4A#*mfd*9nHKfqEoVe_W_?!0JG3wrcP4AZG z>jn=bRor7aGF9Q^U&n zMAsu8ezi&diU6yM0)f@h8<=|KIrvcBM$JV6}H%X~@k?`qkb&vlcBRKm>j?}fs zST)oAU)8M8%JTHeV!KJo<0H(JvHj?xQiM5p1netASt$t2 z^ULS2)`B?j8x&h8s))N^(9DO`{eRGheW30m)T_%a zEp>Vd^)7+lw^+1#2rBu3t=h0-WpXrmGnsr-45Gr ze^g}O{g3*N68oEepNmfDZhhD;MX0IcVJ%^(X=LbC>Ekm$^_?Q*!ixH?#79c|ApnAB zST2t{o*4$c#2P=Yc;89gIW->IH1EdCKYe=82T#{Pb<+EiWwxiF$$sJnXhq01(-D1T(d_B!;L_yFzW zdk<-+U1?WYfGzH)3UegnKao3+V}Tt%v~1-VY@64$JF&!Eoyh=mY;94 zM^n?sZTaNJP2+$5{CV-`4eh3Jbmngq>9>8#)B^7zO^&WFTc@C$WTBwqK6tNG@&GL~Ks*w~Nl7U9>=&04UU zQV`s_!&N&{)FAPAX&O^Av#@v-_cMtstWPDMSn$rz&qdFLT|R&IZMz+@Q4u1)W>$(b z4wKBOsj3oRw@p%4SEnbBnLIn=$Wvj^*4EC}E|rvF5Pl!MIR@tTF7BhYt}abp{7UqH zuVfhPN&6g*zyaXApNWZ=>g1?FLTG-W7sr{i-FBpp0UnApIBG>|FUtT@RsixUX-d$1dd1O!Y30tk89rTgvw`7tpu#SeVFfNW%(SY|2p=X9PBS=Sq$t~Gy` z4y67b`a~h#nMoHnFg7?Ct}bBDym8v#6iM2bWy`m8a`V@oA8hA1oE!u%qUVC|)UCJr z%L8Rc!}C{;k0m7~U|8z3U`zsnf_uGDBzRGhMd~GPqlmK9J}S6(yOTM)LnuQd15t%sbW_42mwp_`#2u%^KBURUN_3{q zez793kl^@Y^^$lw+M=AC0PCfO_m!H%oVH+|Hcsj3=`Y(w9JSwr6D2udM=Db=sVys+ zqbx&%Lw<-HM;$k?JK(IRVL`D(fk2BB_F@t&EG)`g#Cc2_WxIYol;=I+AA-ZWI8P8u z;wQ@4SXj*Dq2*CKeYdA1nQy6Cu(Fh-+wdjHmjHW5p9wwi@Y>5u1a_$m z3?uS1Wo#$ZR1jNO;%AFoQmA)wXqz0w1xJ|}GgXfEk`j0wF#0K6|J0Vt869w*em2-I zG&D3|F1vS^2kv$~n|4j!j{?B+!M39UCutSzaPt$JGUo$JS&h1Y zjO&Luz60 zXFHuv70rJ(?Z9@|)YL$x%@b6L@K~6cm6!=~l9P#Eh71;S|L7y3W4Qytyf^E{6^`Vgj~eXu8vb>dxY+OwCn^y z;O_o@&tvsI}W z`etlm!jL+m;^84EeE+X{L7AHRkz{8L?eFTnpI()EiP?w15A{t=#qwmxu)LVJN7^OR z{Z4wVuh>V+4)&K(2ZNaMB)6%+UNR<37&ASvus$fMu}kUA=8^DPzxcB7^^$}3_$Nku zw-E#GK;5tz1Tm8t;Hn^orlN*)GsX=RTJn_W&VB;M8Pxp+Kc?>!^>?K(h&bZco!_GC zwwnCWIib?ePZYQ3lP!rJ$E_L+c~klFsovYOPg>7`;#45gtI^;npStQcmX(0j3GXpv z#0jIHb^63ia9^ay_FcO0E5{x`uXo?3-OI5enX}hxO=S#5X()IweRgW}cq-sr5a;kQ zLO$`4s*jthf#91UO``^0WGU?uT6f)W*45P&+w%RsySoD}s`9Y=@1Ght4kQSC5K7+I z!eWGUo7>usabi3Oou%>dST7a6LPCl zdo_%SL*|QhR*b|^?kjz*Pcc}ueRlDie8sJ;dOe$`!Lxk_T2j%Qg__LyAWni4U)D;R zCR-M=N3Qbe6a`DtMd= zY#F?#1OkyGR7;ix3`xb4^=r!=~qF9dpJ%Qf?lh8g1+0|gy7-)gamvLNgtDrG;OK? z7zV}TIK{Z&3U~-aZe$GTm5LEnn4Fxv$meYhTRG3Tc3oL*^AcQkfC^77F3Lh6&lif% zkoLQh_F|i-Xu+dj&$}*kbt6g zZcbx-po-_&!6pTnJ^KPo(f4hMBe1Zuq-_+A{$>B*nYYkU( zNyEW`^YM)BnIm1)=gGi-y}MgLDqHnjqiie;m#zjnH8Ug0)_Q?sHD48!Ur@l1uAnNA zo*zQ)E^YAqZ@&6sPthkO!}Dw)7=M)Fp_5{)dG*n{guVUw@%XwmcoX{c4+;WNG`ZJ> za!N)9kIAdq2N(p|*oY>_JsjZnU;+e$gj5J&++1DLwUJFCVOZ^chiRO}umq2@Z~&jm!KbW9BjDq?Z@3A{9dp zB1*pz9B}MM-6c7O#GyOwzxG-QGVi>OjQXOBfH(74&i#s4F*h}pP8j;e&B0+md3AiW z+4IZkeD7r8HT)tg@p@Y zOmy_3R*!4<3>J_^gV>JKpGVpQ?%CycJ34%AvOyFj;jtWhrr@*faMhp0B-j}qj?74e zP_N%xYiK0yh%78FCT#NUKiwZ+FB^gIM#!prf?TEBKpO7GyI{9JyK|LBei0Pfo%thH{&+Ny>lKf3dp!*)vuFxYYdu{Md&vYG zrG0$9e*JT<`{0cgw0m@f5b zuzT$6^=3~L6fD8>nFEdQ^rs=?Z zqeH<8>g~;#!{UjGEl>gq@ z`QGVd?R_R?2A`ey%lr=KD!Uz`1CTI_g*~ncCkqrw=xTIX?*rG$nvYcA;oFs3-1218UXxTO7>}PF6oK6 z%N_X~9T?%!ku~(Tf#~z%k<~GosJ9S%{0wkXy2+YdN+ott%ly&3$%5(A&Aw@H){Mf$ z>t@?^|Koel_4D)*T9~Eb*tir>+%=p#Bo2Lh*=Z=BSg5Vu^T{xO&YJe7~YtVSI$;@oht;fkbdU*3RO;t|mTfIyi#a!0TpghqJL zwcg$+NkL3}h8)gicjMBq47J*%^xNp_6di(oVoaD?Tl;1AUTn=$FuW$K5=*6MO8 zEoBAOEX?zgA3TyHH7gz}cYJI>cf@@w*oRXGPzTo5*6vwcU0-`RBQAw3A!7Y`Z$Fyr z+elIIJv0Nk=?nQhzw61bpO%ftn82W`=6?e)QmjP(W*zqa>hPSIok-^3@Q_>b!xoKQ zk&Ttr`>_#x>aFH&9l3PpH@3f$?0Fgg^P=dJ~}x%x;hIlohNgeyf~cm5zt|Y2QS2tZKV$t zAa`jE8gUFE_x}Zb_|9D)m@nLS>zV0LhD% zu)U1y_-12=Hj$;q3n5mzDWNV(QBGMH11Cw(8Ec5i4r_fOnFzwY}z#|4*jfGh6=CoqIT z#rj{DQFznZv8zy74t!nU&k=nMnWE;SrlIqB`Ba`g3u*cARp5?eL=KG&f3ta$Kk8ao zE!K_HH>V(w$}rN)juLXVyG*inK^Zt3vCLE1oH@f3iGI^3$Yk_jAT_Bmx*;eSAITg4 zq#_|@h7r4&C(mzfU8aY5uN?C9V9|64}{-I&J4VJ{*MGk}O6h!dxCs`VtVl_rH zo!WweKEmz5oCw68@)rY$|+F|68QMN zxV?H=+*b~>yHTl9xL7$_FC2Jzb=E{LxC)Q!qo$$uRLcVtygqdO!5RZ1AHrr)&zhD_KgF68%k@MPv0D1ulX( z!(SBT6pnsfGZ>^lc3K=$%%`eJMsfVzZ$T9_U~*0}Tto2@)>RZ+FYXsLN zDiC-8LMpyIm@Uc5q9Uu?+&cv`A+C+_6mc-NEF@8qQAU0TwxmSyxh;g` zlRF`iT>R0S%~A}J!DMUXxPR_KG%KRi-pm_bMg_LtY@Ln~@On}1h3*Z-=6w`2tb8w+ z%9TIxJ+PIDFrQ@*H{R2H3Q~E98kHuSB0u5yLzzzJqCcLF{qW5MO?;RN(H!z%(Q9;c zv-6MQ2Y)XE0`=PHc7mB~yS3}k#8?xndlig8y_u&%Uhw+(i$SmJX3SJ~&u&%^)|{Q-u@Z{Hu6 zBI_&8KLhYDJ1BsB;B(XMxRdTO(I;~CpW;U{Qmx6mAg_h1oK_x768y_+`XH1%O8jkR>%v2kI}co*vxvp88{|O`sF$ zE-N3Q!q=o$3pE3(MS+8iSY}y+hl2@B7i$5S6MzT>QOj&44G^v1e-}|-UR_NvmA8lk zuJ`XyVo`Z{jL7{w6bE~JG+i((bQj&m6&}z)2&7Up;`I>`%W zDbsJ2d3=1l_#Wd4Q61)T{TIt-Nt?Zcg$PHjCV)fBa0m)vGBUE__V(2P98zN9mvXMS zq(l}S1EUyNEH@8NKA>hkd3ZG23~{`h_uZ=uT5FIPJaoo|QFzKoNl^iH^-BiH@yj(H z_-o%@0f8yMrX!BJBXzw&$hQ=ko#9ZN>W6NRq)r#97Q6t6O;9;}a&V~LKR&KE^mfgl zp?__&01KBRcIvuBjEasbPpxh-xVuhuGJm*OPjdK~{9~u{V32Pr?L_4F#e&Gaa|yUy znxC(9j@#>dDB{f$+5)-Q==`m_v>J-QS@w-O+6P`X2&VT*Mfl+MLVYUzNsB6eK zE_RaZ3zUy&RVP%ti2P;nzNx?QIbLd1g`&h<*irrXC^6~pL@M=S0PufmmTi>KE7t`L zDp19EQn?epn|%yYrRmNU%At?r0hu;~#mU=y1-G#hpWkS0eM>=J-i=hND31z3=ucmF zvgQ)UYm*6uC{}NghBur~+8oJK-|{u_07?l-Q1%S$fM*0ZJmSXIx0qu-2jHQuN+75D zAk{9D(#2e7kDLC&0&JZThitH_d3f0DO(v!A$8E z9|qu+7Mfkkp;_kU=Gg!TjDe89i)P>|FHJ{BX9gf=ihhm~y;7Fam?wLh_9m~-Iq#)~ zE#MIri&TnCk!k^D+;*OR3}9A>DJW|kFLsqNgZfn!h4c7j5602`G04+W0duA*>ThlT z?ORWG4Jk$l10L!)h@Ha26TgxW@ZascAHEV$igFIj4EdRH6EATe- zuHt_y0XqWV)YR;()aK^q!u$&#LhO44@JI{6PRNxyMfo!o&Ld7x(?50wKR( zPLt6wfU(TLsA@c}t=$iFR%KquhKqZEw5BFDY+$cKd~QN6X6oCf`*FF1gnpNIW+HBq zPf@H1fg8vv3J;n9e=GwPeQpWSLE2J`5jsN_2AaS{sf||zPFP?F2|4^Qij90>z=$#b_5~Y#0$^xR^v4_W}Zq|o%OPeM!9}oPtS*iT8qSxk`RaWhB8?|tUKPG zeFHRdF4(mu&sz?_$r0zgY3MC~7%U&FwU~|6Ezq1xi%-O~1uW*p>gV^{;xJ_?x3_Nc zb%2Bx&g|whtm>#nDRzq$1yqd%4#y~Q`iSu!2vhEUo8-4{w&*MOVyIL{TI68qUV`2J z!NIvL{(NXNpuJ4(?SBXe2ndbykWgSr5BypZBM)}E1`M2qLJr8qlQxetHsfz&gv3`L zk6eJ}u!l?)&*sAeAJnvp0OyG}eMyTON=M|6O5uOX>=P=nMe zHPrx2O8o@BX$afxi=Aw)IiziKWI{`}w~f7QZq{ivvCwJl#olwj&PNr{w=$7|$@Vpn zym9>uUrVQ1a`^`0U)8yU;4b(mi_1$*tzB=Ou2{m92MDFKmCG_0vqQ>vsGjHSOq2s> zHwW!c7Nt&hYiXXTq;KAwcw+d_;h?-^4O2%)HJ>si`Y{m9g@;YYBoo;TW=^-l!cbnU zOFZirw=7@-=jZ1;^2ySC3?{PcYir${U(Gtz&cpM37bhSEflQ5$XZaZI>>eECyo`mMJRkf3WctM|)F*?0fPg+(PNh%dkmEgkTR>u-Y-1o2u*3x<8htRyU<_}Y>Lr7b-xvk6~{%Zg1D25cxwJV zcT-gB&+UQz1kLUAfvPqhMSrOFRgK{6Pr!sbIXUfJX9b}J`R`QclfkFd z0bq2D0VdQ~c0kqoS1|0LNk9UcZqyP2J=23f4^Nzf&^nk`zzY;CD_+$vm8_ zcV~P}K%pj$KVk(n`bjd2lTAtd5BP=ERhvkHuN*{HDbjJTdbl-h!ysMN6>dc2-caOf z{QvI-=+KR{i;~PCb|wc@mq7Z=aX>m7U}E}}LG}yThesocztoj}`#ls;d8#kdbaAop zCe^J6^`nC#NQ0ozGw<{l>)(wt8+|tkZxC2mxaknczoVQD@EIl^xx>`zYPp3xNIt|Q zBjWqJ|Q9cc?OhLDmp*VuJ~(cHulG2H4FO_eXroP3I50dkFZb;eBY=f-7K1}aPVPv zYHCaCB<+bLf;(9bfR4Z8YiVdm5rjVH*S3KEsew6FV)V9M{j6D`JT|4OU*+w;nGL9@ zO^JguJ)$?&paM{&e*NVPFhZG>8xKxcS>CX|b-vv+2XL+`U4Qxv!=nVFbI`W$fwZ8i z8kgS{n~y5RH`t`F(DIJq%|Rtke>!E{z?)iPx=&r0E^3vrau_rze18o8OPB4W?n)9@ z0#qDNqAfae&DE9ji)tY&8&SZ3;7oEP1~1@?h*phSJNgU7(!yeL7V#UUje8dZLS-|+ z*t@fUQ}R}y^t`^f&`keq{bSHxE^LFFioa4n-aTq52}$MaGK>jZQ9XR19LDO#Ms^>O z_-+h*-q*-EM_VLih7ShMce8s|HXbDM3JMd`B^rAf9!FU~HLhQAFNwbG%CfStp`*^$ zYj!p(s8cB#TXtEMpSS#(JxVS}TcAjyFaWz)5 ze9N2+-4SLHA0GlT$sV-hqqANjNAhdn>_84U;~FcOHgCE&%u@l{t{mXs7yeVVXsytl zeR1!XvJvq9pXwvTHK*)ILB$DjFW`Z-_4KB94)*u6L1165FDWgJVoX4Nq27T!X|1AB zq$adXcKWYnJVPa1-~0C4A$^Vs;qjY+n4L@?eJIH>N!0CJjal4iB_1jw81i%@oaa-5 zhW@zS1IR-vpveJjz}1@$77GdL(q;$+jZ;lGS>}MA_gN0o`ss* zGfU~@qs!Z5m9f?L2Tf%M-EkdU9P|4>Iy(@e>Ta<;oBt}rf5ncQS9@?Kl>&rG>HGDI zUc>)h6xVrmYlV(eCq0ehR}U?7@(o6V$y2Tc#IsJ^c9ktsX{q-x!otGjeW|Hj$O9X# zu0lt4{a*&{LWELB+`F1+XKZf}`d1c`PUX&DrM8m)OD638TCMeoHSrTj2!Ii52ZBPI zOnd4XERg61jjMq}?)UpIoq<L5D%o`8!4ds74whLPv0@o|nM zRVMVFHcGHMO(w=+#6c78pK%h4?N5Ge3qVx*`%1qy`1P=KqX4S1@DM4J28Q6-#z`yt z20QB~%LY;F=u?NGhxY)gfbnPCcU?DDTc_Ayc-DLxnujB$XG!RJ=!l($Kls?rS;#zL z0+*G^w%~InM;$W_zZ27N4CqGTlza%x%-+Ql4C*KP$Jvp)>f|d zsRJkkUXqK`!HhEKa=1UbPc&Xt6uG4VJqPLfUYDQl9(F{_zu*A<3tZ>Lv_WnP3$5V~ zx^HpZ`|)2lNlYIDn5MuQ^G&Dik=SQ5c(mkXS0?W=VPugNxn>m&DV8UZQ=_fx;KE$@d}`$uPWh$vBc| zCE2_Y?O@FflY?*x3(EruHHIxBrt!a?eI_s{MMc$0&0H{pJ^p|H{!Q6E5$d~kn!MZ|;yyAPUTUwX(8mb7g*JWfPO) z^4-C7U1m?w>DPyUkE}%EorYWAmFCy`$Hw$SAWCDva4omXXCLgbY`_nL$WaJd8H8Vj zJ_BVwo!1xTk3_j`N2M%Zw2`^kI#n-+(`Dr+X!5Y;Ke!m-tEBHfc&nTJh)G{~@e#Y^ zjn?0;u#CJqsqa?B+=rvKfN^aT%SKv<@8=MUSE3FF?Eyk^cr8N87{8+4i)Az3V*XlN zvhK~6QVZHa;Nv(aMCU-K2$o>_yua=QX=kSu${oZH8fbZ4Y_@%3rp0P5ll_s?ZRjV9 zHnt2E*L$khxlo|?#e~w%5^wJz!CLp^PAjDGtrz`0+}}ULQck9<4hRS^2XfuZS6gKI zfchV&&C>=XI4jiTk2g+@y6OONw6VThidjd?G!gwCD^49o*LhPGn)%D_&h5#sy^rh= z82|Lj%FzJDiJh65+4ul|#^jnpYf&PphB^n6rO|OLLht)X()>0{K$Nr*)MIJ0{G#P5 zta<0>vEB#J-0tJCPkUWLf(jQ0hd8KHx%l}%dU<*Emif|7QG6akR-|@BNkcJ*&;j){ zj4tCB=%AUmoPi&b48>jD+uO?m0_!|sc7o|BpeB`L#8A6}LrPzJkn;#BRf3)pBirKX zVr=2Nb5F{au>Zsgu0X@bOEX0qvi1sfWOGZ49Ka=$R1=_Hjqy z6@R(lb_01dMv&H_OUH>)py8 zv+&&t&M4&t0dwc>;lVvI{bv(?Rb0Jyc^Ep9Vi3K#JM6$rpb7|#j9hZwn9olTYHZB> z&~xjvNEeXM?UqkyifPt4{?i^J^L-mosea??UpZz+s)*a^JIKq)g1XAFH8aX-^*}W) z9@?GihKtZxy59K?Ej4UOJw=tL$%cdsja=W@4*O|yT`W*$oc1RgTp#TF*nQ=8F7ekM zoQL8zb!NYQFL3hzIdM`ciU-nFYGD7H&1XP}mO$C_tL#T6;zxJi$QDB~kT$wH?gee{ z`hUe13~Nik&Xgi=Zi@p>ufQ-Yl*U-<&>nPu`%s7Jq08$4VUYf^@jg!#Nx@fBU3ZEc0`ac^&1vGkjwzfQ`68;Sn>oAj;X6_lJn8hM}Qka1^xd1`nUkyJNOkn2j zoW&gnd07GZ@Yx&oRj*bp^8pIVIA{87Q`VUYZtZS0^FtRAmLK7 zeYFgeu5Nnihy?2OyuJ{pTspuA^0}a~4)l0w$PR2q*?8u}kfHlvzJ5Ih+ChZ5E9*=V zjsj8@)7;RFw*fGIq54iv*x%uxfYu2RoQjy1KkKji3=aXd2c9WE_Vfb}@mj<5G`KIG zWK|k;ixy8a0_^hA@(KK-x~GsiLNW(5XaF1ianK~G8Y(&o#H#4s(^UZ1!F-&ugn8Y* zOwh!Av?mP#{er?;+a5=aeMWFpiz^iM<;?uAamlh@IBGF$;|8z3_amP$thg=-tk{Nh%xeKqMjRa+G%2gd>Dx zg~<|Q2Quab1htYAyyZ);5#U-*Z289DUoZiGVK?l|9kAGNEI0YQlWPOL&|pYtkq~Kxx`*Up zNyhQoeN+R`;*z_p98)RJO^8WJe={M_hIjoUC**YwmMv5YMe-Z3HO8FoI` zjb_t|XeeOJ#KKUvS!7F*5)qx+-VG)BC>3C`ciFdTx8&t5T;!9QiaOa-ov@C)eU z=tm89QvXNOdBPu>g`JPj%VAvzc3rpUl5X7#HC8RD5((Rb}2q>|Sfc0j4COjIi^4iBdJ_ z@!ucM$`^Nh_stnClGiOYsCXA8CN92JlGAY^^K)D|w>haRGRj%W`$^H?pXEu1fFc$g z;>LDK;hzwST;eYE7hU6RTvXEJ1}G854a@&oBRQi*cUO|?3q17tyXoa$ zzXCh-(@$M5_^A?5GbCDC+L!QTUFSnVhnh%e%x#!eJSVtdA?cfQ7n^mR#E!z~X0Z8k zqEzdrqlPF&?u%>R9TBTlbMz~n{?;zmcCX9gTNx?WyYv}1S62fl-p+ZjPb0n<2!#Gf z6VsR)cU;E0@lt%=rkB!SgQzPnH@8YUf{p@v+FHE)uE9I|t_HzaR4>>)*W}eSz(w%M;aP%ib_MdtaXjB5 z2=ne!WN1bZ5jL^8+KoH&4Gm%p^a!2Tdba|7xfX+-Ms{30^!ImuNRX|0#>{c_cy;~g zKq#N;E`GQQ`e{EEg~ZB)vdWFW90M{djbRG1AL}^Jd%sFO0F#-$$uauu>cc<^!d@JM(_(&!5(06R7oE3>JXyyN2Q3 zy>mH)8u6$Dt4;uY?B5^n{|-`kpmk&DC2D+VD1c?H8x2yH8)I-# z*b01r03B?6obK#I2V&mU7var~CKdUOg;9TCr!+UvJ?9ux{7( zmQHRWF57tbqm|G`E?ZpINSIhEL|Uv9TX$wq<74sGuX)cpGv(R-Ui@2-n|m@>;WV26 z!8MH7YE_JVMqvCPy`Rb>FexKG#$Cs8t5q|n_;Q<}B+ZTj`$YaK0%GaM#$2jurh8FP-E-#MP zTW08sZcDz0(cuzkIpnNlcMwgI85Himq-0d?E-w0T>{UxW2}JBvLD6TbTp;7i9JHrs z5wpi8a0}Mlysp9zMv6#})(2iu#f(^Gg~pSM8P`ud@H^|ABNV=~xX`heq_NVFj^qj$ zD~7hauXi(OCCbL;`uPf|BpuxeVbm7Mgh}DN^TL;Hz1$q3^u8M!UFg=GzInD^^E;mF zrY4HwC_V&yuWAB^kjko^Mvp>+QiQzxQAF?BbschMzSc>Xc}V2R$SVeD&G>m?L<1rgth{v0$8F7iJU>ZqpOYya7L_TfY`2gdHRI~_#@mV|lz$FZTBjhqw zSo=jeZeaCAi00#YzKVPrw_R`;QeGZzI`1Pf1BH%1_Ro{=L-PkJF|*=r$3!IzqqWdM zC83aQKE5B3{+6yMT2VXbRv(Ub>aQzZWniYIlgcm19P zBiH%zZ(&0?az|+MEdjRym7{s{9q?CeB=Vy8>gY7`stsH!RPvr=^576`Mtr*_TpXsm(gn*A}=H=f?W(9UvB0aD^h;y7qM?XW?nkhwk`Ce;Qlc^856T-4A_?!Zq^Q zfih8;2t1N#c}Z$6Y|^MtVb{UBop*gNFng|a3uRpPG#n~*Tt(t>s4!g)ylXp+CO8YM zJjK-WKN9Jg@cWN^e7~R&SM~=!ibQ=}?GXjx^8Qyfy z?2r;Vx1859w(s6vBRp9y-KS>uEyw*9CH0Z<^hnquuW$_DD<572f1W-o3|}pAoHW{)dZ6FspBoMT^ZPPmRy&xj3KCZdr%; zjV3!5wyyq+2e;hSdeg+CJ)_?yb>Sfk#-gqsWNMbS%&cYbC{`J0?fJa!NhXIyf_ zrL2qtmuTp4jy7?Y+{t%su5-GzFuKv^8{xcA8Yh+}&tfs*$DL49Qadt}T7*LFJho|X zwKn}fng6`kI76beF@o9I?!y$`_dJcm!_#w`RwS-1kDt&`tbwsI{ogw- z#NwmZ)c4lXC`K(QzZ5!mJtZpqkR>LRGLwgS>ve#8Dtc4}9Xmq6oFYCN)vfO0^A?k~ zh+QJAZ>HIOhS}VkobD1g#mj;gbnBXbKKXK?Qr?O=!L9T3ye`Js#iaCyQRAE<*lJHs zS}gZ4^6Q^|R`MPIya3vzaT{lan+wO};4roO@8<@hK4`VsonHyApf^QME!$2Jwk zTW)tdM}%8)hYss2m0#PvLV7>T`!IZd15MEMd#l3=stmj4M~4qmya&(7l2k);nef%5 zI-VX&Ti*zWxv86KyLs+(ZP1G)hoHiWi%-kM*7JN5bXsD0sSL*M=aQnL-(3z}@&fr@ zH=v)YYWRHjWc}>)(vI-kmo<(Y3uVooo<|fJHxU%6TW&~2gtRy$+h!{<|s^9M!Lr(cvkGLjEy}2>SOL87#D1)=MBXg8JTF~5J%2IF1rb|A z0TWzs%#dGXw>4T|94G$7u}yga-?lqnMjh^Iejz`#QO>#1LoJ|I@QCvTht#F#Uvk+&U+qWWasss@M zf#O5U1-QZB_h^c{KWQVEYkW`x9fKr8AD+scX;;zEl>6^2UK}6$XlwALsIb0p8R;nE z9vi9sSW;2~hL6`JC0)w8a-dq1eWJmz?~^}{*9|liSyL~c$~C_+<4+$8=R}XKAlL-i zX98qZ?8$@vJQZ(Mloytc-%n!VLUvYD=Hp76uy+p+Nxm@B z*N!ymsDz4nEmxs9;!{k6UF;l%)-(~Ppj9z>-O5=J!9!N(Nxrk(=Ho;4O*FYMu|b;B zXC!@{k4f_mBms|tP5HM{C8q#mou!-G8y%_R0)^$g-4@2F-fk}TM`$93F=lyphlF;{$f471K6#=upylwVsCLCfx4b&n&CZD2A4fX$DojbiF&RhaE$P*E9z zSco%Z>vpH(SnR~&@vps!CY~w2XiG%PfQO1^m$7=+)*UKg=ip#7VT&VL5Z#dua@Zsdy6Nibn&+*N zO%SO3+@M`GWFpCZi5;iu&4efvwf=N=i)5@ox?KJ-%sNZNo;4I`#=pE^q-dm9k{f9>w= z-GNUj6^h*bd6ZsOGd}_Ie!1uudpusOS3MIjodd!8(OvPSHyZ{*E`k+19_Ivn3}IHa zwYBzn(sEAl_T1)REW8r(jWMu3Z^IrnZVIKASbJ9ytaZhMsz0`&X3jmL<~4l||MRcS zw@%-KE+htjX+WDJA}9Cm8aWL8a~(P7LNX4=yJ#mf2hAeG^aTMf_yLbn=cE60Q=(&7euo}e!u3`K43jHPAMNJ$*u zE`Pk%W}qj{Wlou*7KQvvw!*7@9<$44h0&%jr?#!*^`Fj~6F@?NPfYIH+1b$sSj2h< z{ukGPjUSF=AIR(MSooS31{iP1_&hL<+vh<#2%U-~dVFGfD(YAT5mC{dEV=f4>yM4c zx=M(PZ=0J*yjBrTYu!lB*#=&E7aj!?TIHOLnt;}B^lvxrr^ikAwjwC{qy01Q{^m?( z`y<9;gl3ucABtq=YLk!{r9!MK+~p1tI}sep9wnQ2Qt=T3VHl0eNjr{Fr*IS1VvU2=QZKn!>&S>+35A>L zgA`u$reFl7}-9RPA2F$c~tH*Je!{U*lnPboKDy zV13E|qDz|MG$Y=ql7MN>vjzHDhg|fl~fYzb$86GgW()uV`D)> zagqnr)-MS*R>XTM9U7kdO{{Z)aT36>$CXK*z3hSk0c)`pXpI}4jhBeBNQ$}J3VeFi z`#B~w_D-q-cS`nBx7Z}Ot27jLZ-^Z;$GmNwvPVDe4a!b{s+1Q~#uckN-=%Gwd((0L zt|$+JMK%7fnI?esYAsol&k<``BS z-+V<)z?DBUCG>zwF#&D9BMWZldi$Qz;e(@dJ1wxfqo~r*_e|H@YO=CK_E}W!&NWuN zeLdcW7^bJb&3hd<+@-+n{5WK>8zJ#Nh^l1@B^=));l!Gyg56bY0(t&$CG`B}W9-!? z@EMEdVID@bKW4~7Dr~S@x0Fq}1cMu}z9QV6;804U3w$5Kn?$z^L9dJgQX zlq~OCPyRdTYyw-(x~PqAnE|)#z_xl^a*Fz!E@N^1-!?41KPU(p5kBDj1IF!##=%?& z1(MbM1Zb4si!d_rVqLqRE%)Zx%g?_*elB?*cJ`)i7v=VBslfTeBJxkc7K$L3@tfNS z_#6R3^x*e%IQrH2d1;G!Rjye8f#}0}3EmEBPe@MaOw%c^-%t4f^LU{gq~!(CIhyxA zNE9gH@A%u@6s3-)!DFcXRaA=DUj9oS=nm)O=cjA74#(?^VaaSl8%;B<;Q6x}C{n zbvbx{Te#>lk=TG)0V+qCw*wcF~=``z{0D|4s|u1b)kvdw$`e2G3J!27FW>P8sq2r;LwKhycF_1s)0&udOu% z)Pxtab^py?YLrDhCAwiyDIU5F=pnLPPIare7;?JJ7VkVUlbj;8TahS-CCrp>;A4$l z1D7|qxnB~1r680srx*LDH}K{w3#9db3Pv5T9HN}{*&FiJ#Ow{-lf&zLX0lmn6>aqB z=xCip5cW~0lyeW6L&89Gn^u1sFO2)bMd1C~r8a{Ahb|X2?JY7x^)HxMX=JyX{c@&p zQ0&PbNdcrwDct%uQyiEADTDg4Tvu_jB{$j{dgX!1k$( ztBiQ0lKvQs&Rx0TixOuxs z5xM2`Rlr0TIi(BALE_#c9It2oYURtl7*gmqrby*zwkYvP)`wkd0wAg|+!ek%Ck63crUa)WpneQZEZQ2wAUfE_dlvLN@?dwey(=cmHD7zZBu4H4 zwE`v>_uVRK?4yFh5u*|pl4SG(SmMYVw&|P`)0VxMbBIcsk5pUI-~F? zoLpS8IeO||r3Mr81i9a0s2>!Ydp6%a$5`D%htQGS7tiK5U?CSiFcn&}s}c2Kf+fCC zTir8Z$+#XXXFncS{n-Oi15ML9%3*#rKhvfP=3;?mc@t^K5`gWj0Bf^~Rz2~B)WP@X zR@3Vc9b&tP7T6ac*Ju5ihJm3}>4k#RSm9X&miE99v=aLi&>=$r%W-v(^=Rjs0F+_o zZ@yJy0QL}S$!-QCy&a9pwOVq0>p>DMe1ux$NepDLoZU_R#KC&CxFv_e(SMfmhsMLX z`98!Gcogt?1=zJ}mcGMyJ{sKlV6pCM6zq)p=73!IB z(FqPn1v(V%n`$ z$QZf$^Zyca!1NCN)mW0-a@g6JQSfn->3Xuh$=Js8-}B$7$I4N)4CdB>!mGjtB-a z-6v19!gVT?3vF3b9hQ0K=(g@sQn$*YlTGC-! z&{7$CF|sS)1(s5zG_~U>>`6nBoxS0nFckf;>i!wP9vBG$))}W|Vf4)dAMd}6$7!7M z@NrWSLmqbMDx;Blz2X`O2x1+4#w-*3^R;M{*X?aQ+f#*?q;l#ga@9&W+Gx}J$FW3C z_HQJvd5&5$H(EP$j#4pa;JbNAeT&I9xWB! zA)IKfVDXCUu;Eoy!KNqn*p;_wDN=nHuE10b@h7DBNJnrg+rm#&XnX)}2V7^5<;AyO z4nUrMJZv+U&d>jE3_DtxLag2C{{8#)+IYFLo*6hx;*WZRXtM4%MevX&3%>VW$Dud4 z;9ulci^Th@4m5@w!5>`qX?L6U!?5#@Ki8T5&2A?~{g)>GwM&!?J(IY6V9vtCN~wl9v2b zMk?aGK``gxtC>hi#H&OC77O1akqeZfCBXX-HS$7i1hiHW3{i$SOMlvxUDhKzM(kE$ zS`t8gfy&9?%&2Q^-SfewrlOJ&JStXxkf%ls10HCo+;FPEhJvzPO#)4rgg#h+atzgW z$)p><`Rad%9(USV<^l@<0P+flp?Vn(9FurTJS>k2+@q+KB%n*7ADhW5ZvPPQ$55iDtxKRR zCfCh4Od;c41x6`eU*oWp@bW4QATVRSZGRgOcByp`8wBmJXQv-0Frh|LCl)8^>h5pB z3JwR=Z`%_Aj7XslatB<$#J)Uj%O#Hm+2OnKU1;IjC$v6;-Z`bBIcDY!?)tz*ss3iz zLOGqVKf$9u79hx3cJTxn*5caWw{gg&4M2w`DmFWC6LG|`n(>C@yT;IdR=u^VMmI^^B=lTr^?tCJ)QB13`c{I1l17D9|E~I45T$rZp+`lNs{1SE z*_u@qQ*R|VQ6idY>}%cV1mEIq5{y%Sw#pc555>y(7x`PvQW$Vvs%9B^_a{?IAmy}~ zd6_>O72y=?Z&G{Odul!r1Bl z&PQI8Cgr+Czi#y9NjTec-ORz`oMuCqDL;(vP&mOOsl;KPh#Ks*>9%_QTE%=j1(RQX z=778<>4@Xep5(VFs!9<{;R2mEV2uwxGUzA75hYxUGs8ZE6TWQ*HKP;0-iK-u@c z4`#ZP);93cjVy4o*m7cUKMk-Bi2O(QskcZ6G&U6U=MY0gcA3@K+GB!!QFz`O>-qWm zp~ro&ce(UYh|xPaKE2KY(N%}gTOP2+-?!kqnHc3DxBp<0_{;$0Sd5R6x`663JX&1y zsYA60pxNcx6q}Zpmxt!R{CxiSvlqY3?sc#k74x!oV!)u^vI0jgo0 z7rGUe`$W=(y9`|--x-83!3Y{d11j`ih8p7>Ns*iW|opLRYVgS&2HjBQ29?$wS>o`3!q%F22*>?F4y@r8MEy5EO@?7Eg0&!OhHnzukI zK$8KIM`nc7datytB|KL&aGrLVez?op)jxtgN;J5Br0AGBU?o`pEv=4wGUqcKP+*7i zS`E0M;-A|~z4Zf9mEb{`zf)UMcUTro?QRzrbvU+v7T5f6Ph+Tk=RGC{Hd6w=C0>xy>q2G#;oVAP=!9#yBdFT74$Vo)J8f9!lx(#M z?I7A|R+ngHZ0mG-cPI=)D89Q$fAapIoPQxUt;0+9OH2-$FA~@GjeaRkSXqNN2p37L|?K3DR5j`Vafq z=wn41{gYq8AJIsHPCR$wvW_AjRSYPDvcca+A2>ceq73oe? z@?i+GCqF7snB!UtC~Odic?xu9mWVD+JBrpE60uMB$6z{tUZ6_#1Zsv98`E47#UR?f zU`}>Nz4E{dSMuHN9gpH?)>n0njX0eA4khGscMFBh)zL`(z!LvFE;&2@HlLye!kYqz zgz-zpzC*Xk+ zw6l;R2)c4pO1>jY>b>&%w`ew&)(gGY({TuTnZWV5FQS*yVmLGY?kjCe_{&`voukh! z?&eFDfS46*xG*f9ao9iNcIRllFXavN_+vqYWo!R5R3tMHRV6c0+d+&flg{3~50G`y z1SQRA;uQ8@I$j02-!yjN^FCmRza5)_*MuqI+$2y}UvHW>V#B2{Z>1Ws!RP44X;brN zm&Hw=3o%6`ilO)iDaP(dTGzooo6V&`ZO1B25E<28*yowA&Mp!X^BZmP*Kc(iPP}EgGQiJA&L^<0(ne^K*nPqIx ziaQ1M#qu)x0UE?Jm9UbzwE?pV6+WFG{jGK7H1NBO*D<#SF}`Q+ z6815AgI5svtsC#Q6xqnSo@QLit=4eH z`Etg~=j=&B-vu{3$u?xB7l-*7C@pTp{%C2)~Jgr@-IUxWAq zfc%23i5a9`fj2yf@?isRRD38hR}DNhwVRj%){768VSe-;7pslHt7hiw*Y6lrSTV$F zha&UhTD{ZSj%0lwiW|*jtqTU6)_#3*AshO}n4!TIlk(Quzfj5EZ*hF*}I<_CFTIw-7qIX4!#qkJxJElFe2tH~k z1hMTD|IYAdO}ACK61?~g@_YobOmDLC$Dkb^%y988jGFrgvx?6IIe!X9quEh^iKgHE zR))n~p!1mBNUl}eFgJJvTlB?xqI+3?^xJiu6}hzQp7tntLsj;RfBCO&WY{Js`|Y!J zHF75F$481X$b|6@cx!j^SuxSjRI9opm14(B^Kr}#-j|m41j<7*XI7$xErF-JR*mER zuOHKq^gcN$j#!*3+mg7)SuYVD!d1HzapX*N7&YYPB3Y3(()+BwF`M~jCBcvJ{(3za z%Y$Y%7+^`lVhF5Uw#;S70}7R60n=1TO8;4*Zbf(elj^epA$H%8XiS+6_rZpl-RrN; z1ow%j5J<){&W9$%>#GBrKmC=-r|eDpo4=RU8&!t5`!(mE$qd*}Qq_12W7g#0!WV9c za%^dAP&n`yi)p+YV1Y^DsEUnm`>HbwNqfSkgD92PYa%p-51M*n23JDl%rm%UZ4cHZ zDP&tqUw1+7y2Fbz z6Z9x71p_x67nQ~0)(FsMzD`Y*46!S!^-~i#B_mGs#KzpZZ>}HPllJ>^5#2L{316Nx z0Qe9q6*MUC!5KSpQ}~$GM<%TzNIg~6lYNvar7zSW(O|%vMw7IUB&-OE0B~1hC;Nca ziHs4Gb=B_}n}gHUe_3FRYDW@UzKOX^G~7S@JG$^7g*LMv;4D8wc>8kYA+kA{l-fti zATh#CNcAbchods-Noom+!xq(_q_@&KS+|5;o|t~<*3S%4Ji(;1s>;4l z)hm6yArxby{qZfm7I(Pf3#Yv-nNH65w&IYcIc^_qnN{n_FJhhs#4%ZRZtK`6`;TlC z%S~f>ieZgHTJC%67(@GfxQHVEqmfy&vRt7s!2SEvl%EoRZ+$EyLWvpfwU#Y2TN7uD zDWN;)LoX^UY!`#{-sd+xjts#xOseNKWY~Cy;}CW!J5XS8jHgNnj``m5PEggYX6Lef@NHZyMd|d0 zju%_8uxTJ$43&)-E@nuK1>aV@DuNGkPS5S{ zEEp%)be+!TW)2-<@~TT_l`-}J(^ptHBE!?|!W=a`2%Xu^`He4m!(tCW1*qP{`0r0y zD8l{zq~Ic`fj3Bdt)3Ia@#CA%3Ogg3IC1Ck0?`R|_#gQ{6cgzmNS3DCpC-v zr`zPOqz&w*tlAh=2*gsBDJ=W2VKZLblX8cbe>=9hpUulTY@}XpjDdyLsiilWLHbKu z=UQmLjyFLD6Fy-})^TBbWL=`LMkpb3l-4j)x^6a=JNN80bxp=+_5sK)>yDpqig3O= zx-KszRjHpK0XdoFs^XE_O04K(`H~c~s&S3lN_KcM6nZbAms_Y&#bKEDE8Gpc-wR7fr~_#9>nQcxTm&s- zjEP7|X`)PQfZMpZqR?DauMW~HAc=3b7M;=IrF>oz4$GGRNs23F7PpPp9BNI?tej#! zWqey%uk4wqNOPio-Y~2BZzxElfG6(5{8si%#}G%1PmNnsRg_U*Nx6}E+GU`c z{#86({T!X7yBx*mHr{3~bG-r9hm1>#{)yCd1621Godo9oDAxBj1QS#}FP2Fi*3z&= zOtnf!6);Z~eLo5+k?0)X;Vk+ut3SQ<5|2n`>L4QZiPmAz*yAb{ZRQu~%Z&9{kWT|K z$ezkS{%_{Tk_UFx;JaPdmjV=Cx=)_S!?Wk=;_?Ebv0=#Je|;4I8GkISC@0p)vUAx7!xMfFD5wM5rl*bVO3k`-1pd1zz${aNWrAT9D03YCD%zhg%9>I!kfiMb z+Jh~O!5mg>#e^8@fun8G!v^9w6~5=E?1Qvx4A*xr6#Y{kd19)217tn_v&SU75UW*7 zfJB>2DWl6xXv$rHj5uD$z^8Et~)rD6Wg=1USi^kY!7c23%dV{V$ln%TtflQXZ zXhTL{O_^o7RS3crF<5wU%1q{>rtg{L?YwFYQw04dB<5URzWN}HKr}NWgKY4ZrjZCf z($e^REAn$Dpod{7AR;Xd;)qHfD||m*mx@FZVTCDx1}=>lyghrcnY@AOx|bX%z9a*2 z08!QfURI^g4lrHTtzq)>>e)+(VGA0jYva@V7FPra8!e39L3LjujeZ{w=K7Yf>lUZC zsPy+pR`AIeHv7=W!Z1SgpDQU_cS@5zEJn-r_ELJJh0Li7n~2bd>iwmUGqf!-kZsym zmu?oGr@={|XfI0On@D!@Y~Ta0c|+h2oYjp1z9X?8N)%@GjKeuau|)jo(ce^rA{G6Jf=W7eI_tEQfswQxllJ3?0$7UW!coTC2x6FoGvjazx z1OJ6FlhGFyy6+YBe*{R-BN~*bMR}bm>x+h21vh394qqNla#mx`U?p93P@-pMcA9j4 zVdwA^ra$?qcv|rHe7O0M>VJDQf+PZ|5<`}wvj2Sle*aw~7b!niJ!&1{?}yCgd8*+t z!=gy$o@ZW*qax>Y^Cas#8MKwge>WifRyvj_KI%q=4b`d_ntKMz2MET#bLWmojKbFD zW(aQAb3V(O$%WZoNDF@uyi=;6vWAKf33r|w9zI&z+p8ks2n-4`6@R0Za0H<)>mb4e z9`{fyo6f)aTDiQPc6|+D2h((ttTY*qv*+X1jObz@uR3D4<;u^+<>K0)0<+KO=hMbF zZwNk^5YD+%z1w|ha;G!EQoFpn_sP?na~EUlAm(kKrk3`e%3Oy=Qi9LBs;bI)=%D4@ zU+KJ0NtEPJg3SyQ@gByuqbd4pA&wy1{Zi@sCU&FAoge3rC=OA~qW=WCdc?h!zl7t% z`$mL&J^8($9gYswXBPwm$3i0R8mK0{umfykkge8cX0bhEQT0p)RvZ$_e`#E8Z#x_Q z^EA23bX$ePFOfGv&0fshSUAqSol3R-j2_d4r}kUs-?vqPuQF3hZxH^24GZG8Lme>4 ze{%wz2qlhH&ntJjVSAy<#>ScZF+Ae0$>k>Yd{Qr7!peta{(?(K-FGtY7724pnT77S z7ji+q?YI*}1#CITC{r3oGGtv75pWdAKAs-DJ5fm-N19`kxB5hI&c=kcJxei6PDp6d z{{;kZ<&O66P2=SfHVYo??-OCZ5EUOtuOH8nFP;k=IyEk304cdX{fn7d0%}`o@-FIT3`c1U|&f(#?VyYg(wBE(n^LXC0 zoK3M3l0B%D@KxoCz;}S$pR4V2B8tRcfIO5uk*2qGbH?m6(Gs$d6N}0hevEDy0m9sh zmsV+dy}Om!Km(=%>+OY_VE8ayAs%{0MG$~+$m)Fu4!HLT^&kWN{I=Ze=QKq`F{$*+ za}evv$%cj~Ag+*jp2wMNx{VrZbaZr-$xRebx>AUZRn@#2r;v-GlilI;vC)``Q|c&= zm}4IGB zj9Q}hQ;BoO`kz*DeL}c2YZreX7#L{Z`Yw@tBdMF}m)Hc6G8QwatNp3rs*&wsI&;kY zkG>_Z*X=36hZfPUFLug(Eyua&{uq&GjVX)VA=Zey!N-GV($h;zk!z_Wdh&5kE+Zjp zg1xrFN-SsSRI?G;Km+K{_n^Y*MT1%7TKZ%3ISg&_MhGLe5>Bg&Vm1Br=~JZzU#x9K z?&&BN|65E;X4fFonx&~J3R;KTnVQ;LB$4^&!r>IIP&!N)`QaA zWj`1qyy^k_$wYF#<<#dpdiU-fg!(_*Hm2h}UBg5Z9Js6982OI)TRK#<|C;;Rb;z#$cWSBdv4CU=P#SeVLqb9;#Qg!o@oAfbIK^U{(u^@`I&#M8O)Al3 z8;~3OE$kEyI$14RKX-~9S%gDeevvj-5|)X2)G#Zq6@w~i7aGdo=jSK&$MGroldGws zA1d*LS_7#&L;Roje(#NluXLxesR;-RN1dGoShR)QWC}S#3j+l8(qw}}wS41GdaEUH z)QS)%`hHrObN1p1x#fZcm>qNL2Q%3htDZW%P7RQOe4SWK&?NbdG?b*qPDMU2ZM`;o z%bKQM{NVj=kc|XcleV|E4lm~}1T9t9)J#$)|B}&-<#ns418`x<7QZm3jNV_vxlK)AA2U z^EmFM^V(LKgZAKP`SGD5cMP!2D<9x)3rOuLiKmuyx8KY<7LT9`&tr|h@8xQq!Md|C zkbw&57LU`5#KFck($!5NF3K@U@zd&r9Oc9He(Rd!46;X<_h}0DCKb1l4j%UB%XQfWMcdb>NU?*s~Sqi`k?Dfu# zLjjgwzkV$h{pfylEHl=)CaOM4=18Ic#VacwCRV=BxV_qT#dhkDzif26kA zl-N7sFRvZ~_H52P;@fDOF%W|DwXw-^=Ic0@uR87-=yZG!T3-Vg`SU@CPkvcT>cb%` z4@+G|6BW*r?#t6H4DC-A7x^TfcbEcKBg(W(2p{OwFD~G6-oo$D@Ap z8+Mg@LOCe*0&18_&C*E~0+bX{3Gn*(U$frik!3@3Cgt&{a?Zo;?QuMwr_^8^NFK;T ziqz#JH7EGDS_kj)gFi;UxEM8?oeAo>#>}u1vhBY0?2cRici$h7`v`&JKl&elxU$K( znh?aaK%f1Zao@itN3J(CCIr{{=eMc5YMMXACkYQ3-Q=L<>EL>1K-?rkivMsWh(L9q6Gm~p?p^<+) zH(O>x(Z3bi?&;kPKNCrh0<#XsQiIJ_zALa!&c{8Sa8BUbI;X zG;dnU+s=?gsSjGFG1!mWMv{4#-J|x)inHgxK?HP5+0*OpVJU15Z}{Ew}gAU>=>!sjJk!6oD>!b*Ju!Hgnk=y~~gY3i?BIv|!z^q40*CfmS9OT3{J z0qG+n=(l!NkW?f=N;*og*TID&#?GnL_E>6g13*39;BXCZH%EqhgC2d}=1AfzWb=Zz zQ(0MA+fhRw|4@R%Z852r%>8%gdY#{lmp;)UqVMLXPg2e6*H^#iFpbDDwQ6QW*&z|l zs<-51@a-Kbwef23!uN$|0s<%!iSir|mp@(6lpQ*{veGfTX7jtg)Wvj2=o+V?;kdjv zL3hy8M7@=H6FT+AD_<7JyG|y?=KwLwrL^yz5hu{jS+5Sb4_p`E{qy9}5*C02R>n}d zsk@%#To*owmyXpqoKg0alsU-?Qed0pfMW2_5Ri=yxP&=nIgondQp&?ch;>NWfk zi*`9>$v)INk*{*ls7FwwSVF&pWgz2j9=6Pz9T?@e}CD<$(YnD`z=${jQVYlmNJ=#G{~18%dc^PG6?%+-spJ` zMg!VZ?J5NVXnr{tAKBdXavnHo7HCk`QnBqh4qq`*{4#g_SsnjD+nO`OMYB6cg}xy- z10FY?J|C2xTE!PBatR@aC_emA{C)~@SF1?E{lgsX<#*P#!yK$EGjP+I&XGrr-mupm zE@P$h6=8F*X|MBrU~1#4dTuh)^Oy)-J2ml_LDMkl>;151s_(T9qVMq1>Brldh!cC5 z1aA+7MhqA_nAe@W93F#d8aZt?-6C^CRVe8%ud#Z8PCv2@>bnmP2bBuPz3WFL_M`{w+!5rw@a0RiPaRkHSbhLP+y zMd^6V$eMCCCQ&IA_cE%dyEf1_RsSP#@%OKDiQ?_D2V_@!rbiZy%MozYN`nfMb55aU z_bKni>bwD(%L3G`Dv%q~geMaI8R}wJTiedu9%4fTEPT{$CH&-mYdJG6ot1fKri$;< z{gc2zRSC&fWc{7#>g@i#zo1-cTUYnCZ{r$3+8c=6ab`8QA95T^~?M=;-J?H7Lz(#%ks?XNjOl4UdVvgCRZ}hTf+^ z@mOEUu9`(UP2D6ReZ$LvD2Pv2?Iqb?;@l8_V>`#@qlV7>_^$Tott*pfbq`6CqeKEsj0O4+Mb7cuTWl~e*|;aw z#CD$}3k8K=kY{m=tz?*KC_Mx^_7*%|a7&I-&ePeRct_IP@;+Rg(aQbDz2*6r4Y5+2E`+TYmR9#%THgtd8M;dW zD=+5i`?(_8gdUM!A6>&=)~p1ChFU7`f%pkQ#Y8Q^{BYp(&V2qGKuAKeKBX%kv)d8~ zY2MzDX&+b^3-}`CSJxZoOOKdj#=6|ze|qZMyg2ND|7!0|?g?(*3pbkoD5qu+ovH8C~qDAjuI z`5as3uLS%@5RAfS*%A%Q9d}ITG_eo^(Z6*X2(K6o0i!CIWCs4d+&a5fWhHBcTVO7F z#oNdRF;E_5dP!duWnKsYxj4F(zuIO)>gr-3U>pCjOZ~h`B)X3MC!1+RKQ7$#^eUoo zfgB;`2AAQnFs7_ShFbfA*XJbgc>0LKM^RR^7V~8{Ae8JpxanO2%(hm+QdBf_EZ+Nx zZo-+8DeU5f*M$7_={7)*-Fn^r2^!|OOeFY!ftKL(QiJs8cqeS+;>4l`q_uk1* z%0WZ>$#{V(95@?0a2K39!mGTR{cKCigms+r9 z0wAmT=f6F1mcArJAdLbOBIzwG{tvCKiJ+kYV(vECR9`O|dSv?{4lXa`4T@Jmk5NK{ z0sZTlUAbkn_+toZg)eJ*dK%&h)705lC3F^EPuZ~jpRTSv8p<_{e@z+L5{k0iNm(M4 zr9t*}EYVdOjGgL4mLyxmFd@rW3f1kREFop+l1R*TV{(Pe%@SpXsVq}m1~Y`YPygOO zXU?4S&3V7~ea`zlzwLI>|di~1D*?3l>_>9nx8*~T##Y$k(k zkrheBRoHucAYMaL(?2xSsbl`j13D}%xMWJn)Bc1s9Bnf*%Ixnm6At<{g~$eq>Vy2K zERAIkYm&pI$hJ+40f9DXDtXiG?!zww#+f76wS4su0D+lhKv{Vy-u2S?G!0ZX< zJ~~Q}R3$UOLG@yEubtA=8Bt@5lktA}mKmX-c6hXhma^i`2r}@}GrJCkO|;caXD*yE zG|Y*l{hboYiBsDjM+Uv(dI^A2$-wx4%O7mzx#PHS=vV#DpBE^Zo<06PbK-Lc(uQUR zAvM5r27j0*b#(zy*sF(v!73c0E(oZ~EWn*yC?hKjuLNLo(m=q3^|+N;m=zKgbrzE= zdutv7)##;>oyuCKG7=aA)h9lbz+P}Nd}Ei1iy>CTw&Aoi)QC%pwdfDOB=tJs0R_VL zH2${Z37DF8fmsQx*y{B-hOwKTY!~Q`a*GPMXP@F1-=8_<9~|u9DOTbu`Oo6kn(>Rf zpvpN0xq@m=GBPrt^=SY-lYrGPq)a90thM>Vx+8Id1~l*)>BH>3=_(EL$dzjf00R4} zE;PAoVAqyht&P#8Cik)onw1PH%HVB755*iK(^#fuG&?!e9pqn*ZN`lvbJJ1Sb51)f z$lkR>%K|;c2Ac`W2I(~o1*hSRzW`9^LDFG;EL=B5teOZv|8nA~R=i5Ne;$5{lrK_@ zr*hg<##AOqamK;ET4C$s*7>y~?3uYax?T9yA5e*)-PhLDEg!&;Z6!b*w1!Vfb+P?o zQ1!^u-f{TDhYUbh03(4t1i4#%!aX*(9V+YV>xuC7D`rLIm$iyK7sH>U60?dfPXeKH zeZ4hj=V|s8=g1a$(;we-oeU0+K)NoFHM+o!Ynj_KY)_X);Q5_k7Tb>Zaf4L2pH+?) zahbo#4FnZ3r5BFGp_rg_raH<`pU5ckrvPY660KM*f5bXiB%<_Y`voU@Gto{Z&Y{8YY9f*Lm>dpVWts-9}6lmZk4ub0tcsg@R= z+X?RT7HZj0qng7$SvC6TTPEoE zr00|9Pd#Z^5E@D^7k@>-y%2WCWw%K}YoMf`yUJurouPD=BIxauF-aJz*{2LdNltNa z0mZ{pW45HIrLqf}$Xy}Bu$qQ}yum6P&vOI23zDo!@5HGLeWli7j>j}XzIN!Y;N@3c zB^kqW@#L1duJ4i@59BC{$9=hn$Va~mUO7RI&+pt&Au5!T%=@u7mQKk^>xms0{~AtV zVGqq>_6;oG4^=OFsUU-FxUe=jF_A=fmg2Zi!%>~mL;Y-KuVDZ=b&-@d#f$Q0bGMx| zcjZlCb(U_#ZXS_+S|8dLrkBXM%1Y#EBvKZ)`tlgg`t2Ogq7}LT)4NfevBbgltNMx{ zTW>!y!?G#;JQX4%R3q(alchemy diff --git a/assets/icons/anatomy.svg b/assets/icons/anatomy.svg new file mode 100644 index 0000000..913a4c0 --- /dev/null +++ b/assets/icons/anatomy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/anchor.svg b/assets/icons/anchor.svg new file mode 100644 index 0000000..533be6e --- /dev/null +++ b/assets/icons/anchor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/anemia.svg b/assets/icons/anemia.svg new file mode 100644 index 0000000..f1be0d2 --- /dev/null +++ b/assets/icons/anemia.svg @@ -0,0 +1,43 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/animalcraft.svg b/assets/icons/animalcraft.svg new file mode 100644 index 0000000..820c74b --- /dev/null +++ b/assets/icons/animalcraft.svg @@ -0,0 +1 @@ +cowCreated with Sketch. diff --git a/assets/icons/anvil-impact.svg b/assets/icons/anvil-impact.svg new file mode 100644 index 0000000..4a094cf --- /dev/null +++ b/assets/icons/anvil-impact.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/anvil.svg b/assets/icons/anvil.svg new file mode 100644 index 0000000..49bdb3c --- /dev/null +++ b/assets/icons/anvil.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/apron.svg b/assets/icons/apron.svg new file mode 100644 index 0000000..06b919f --- /dev/null +++ b/assets/icons/apron.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/icons/aquarius.svg b/assets/icons/aquarius.svg new file mode 100644 index 0000000..87bda27 --- /dev/null +++ b/assets/icons/aquarius.svg @@ -0,0 +1,672 @@ + + + + + + diff --git a/assets/icons/aries.svg b/assets/icons/aries.svg new file mode 100644 index 0000000..279b74f --- /dev/null +++ b/assets/icons/aries.svg @@ -0,0 +1,402 @@ + + + + + + diff --git a/assets/icons/arm-bandage.svg b/assets/icons/arm-bandage.svg new file mode 100644 index 0000000..fe9f9b5 --- /dev/null +++ b/assets/icons/arm-bandage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/arm-sling.svg b/assets/icons/arm-sling.svg new file mode 100644 index 0000000..0cce014 --- /dev/null +++ b/assets/icons/arm-sling.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/armor-vest.svg b/assets/icons/armor-vest.svg new file mode 100644 index 0000000..2875fad --- /dev/null +++ b/assets/icons/armor-vest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/armor.svg b/assets/icons/armor.svg new file mode 100644 index 0000000..e79ea74 --- /dev/null +++ b/assets/icons/armor.svg @@ -0,0 +1 @@ +GANE_ICON_100 diff --git a/assets/icons/arrow.svg b/assets/icons/arrow.svg new file mode 100644 index 0000000..862bb49 --- /dev/null +++ b/assets/icons/arrow.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/arrowed.svg b/assets/icons/arrowed.svg new file mode 100644 index 0000000..9568e18 --- /dev/null +++ b/assets/icons/arrowed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/astrology.svg b/assets/icons/astrology.svg new file mode 100644 index 0000000..3cfe56f --- /dev/null +++ b/assets/icons/astrology.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/atlas.svg b/assets/icons/atlas.svg new file mode 100644 index 0000000..0dc02af --- /dev/null +++ b/assets/icons/atlas.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/aura.svg b/assets/icons/aura.svg new file mode 100644 index 0000000..b690abc --- /dev/null +++ b/assets/icons/aura.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/awareness.svg b/assets/icons/awareness.svg new file mode 100644 index 0000000..c714038 --- /dev/null +++ b/assets/icons/awareness.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/axe.svg b/assets/icons/axe.svg new file mode 100644 index 0000000..32c3eed --- /dev/null +++ b/assets/icons/axe.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/back-pain.svg b/assets/icons/back-pain.svg new file mode 100644 index 0000000..e743e7c --- /dev/null +++ b/assets/icons/back-pain.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/backstab.svg b/assets/icons/backstab.svg new file mode 100644 index 0000000..eda75ec --- /dev/null +++ b/assets/icons/backstab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/backup.svg b/assets/icons/backup.svg new file mode 100644 index 0000000..9385065 --- /dev/null +++ b/assets/icons/backup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/badger.svg b/assets/icons/badger.svg new file mode 100644 index 0000000..f769f80 --- /dev/null +++ b/assets/icons/badger.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/icons/baldr.svg b/assets/icons/baldr.svg new file mode 100644 index 0000000..03d7b2c --- /dev/null +++ b/assets/icons/baldr.svg @@ -0,0 +1,1463 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/bandage-roll.svg b/assets/icons/bandage-roll.svg new file mode 100644 index 0000000..9794061 --- /dev/null +++ b/assets/icons/bandage-roll.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/barbute.svg b/assets/icons/barbute.svg new file mode 100644 index 0000000..7c7784f --- /dev/null +++ b/assets/icons/barbute.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/basket.svg b/assets/icons/basket.svg new file mode 100644 index 0000000..7bdeca1 --- /dev/null +++ b/assets/icons/basket.svg @@ -0,0 +1,18 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/bass.svg b/assets/icons/bass.svg new file mode 100644 index 0000000..9f81fd8 --- /dev/null +++ b/assets/icons/bass.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/battle-axe.svg b/assets/icons/battle-axe.svg new file mode 100644 index 0000000..836b779 --- /dev/null +++ b/assets/icons/battle-axe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/beams-aura.svg b/assets/icons/beams-aura.svg new file mode 100644 index 0000000..810e4be --- /dev/null +++ b/assets/icons/beams-aura.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bear.svg b/assets/icons/bear.svg new file mode 100644 index 0000000..e35b232 --- /dev/null +++ b/assets/icons/bear.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/icons/bell-shield.svg b/assets/icons/bell-shield.svg new file mode 100644 index 0000000..53d8638 --- /dev/null +++ b/assets/icons/bell-shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/biceps.svg b/assets/icons/biceps.svg new file mode 100644 index 0000000..de6a445 --- /dev/null +++ b/assets/icons/biceps.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bison.svg b/assets/icons/bison.svg new file mode 100644 index 0000000..bbd4067 --- /dev/null +++ b/assets/icons/bison.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/black-knight-helm.svg b/assets/icons/black-knight-helm.svg new file mode 100644 index 0000000..2e48a07 --- /dev/null +++ b/assets/icons/black-knight-helm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/blacksmith.svg b/assets/icons/blacksmith.svg new file mode 100644 index 0000000..be25bd7 --- /dev/null +++ b/assets/icons/blacksmith.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/blowgun.svg b/assets/icons/blowgun.svg new file mode 100644 index 0000000..5a85eaf --- /dev/null +++ b/assets/icons/blowgun.svg @@ -0,0 +1,28 @@ + + + + + diff --git a/assets/icons/boar.svg b/assets/icons/boar.svg new file mode 100644 index 0000000..3342b36 --- /dev/null +++ b/assets/icons/boar.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/boat-fishing.svg b/assets/icons/boat-fishing.svg new file mode 100644 index 0000000..866fcd9 --- /dev/null +++ b/assets/icons/boat-fishing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bobcat.svg b/assets/icons/bobcat.svg new file mode 100644 index 0000000..04a115b --- /dev/null +++ b/assets/icons/bobcat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/body-balance.svg b/assets/icons/body-balance.svg new file mode 100644 index 0000000..a0409b8 --- /dev/null +++ b/assets/icons/body-balance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/body-height.svg b/assets/icons/body-height.svg new file mode 100644 index 0000000..6236dad --- /dev/null +++ b/assets/icons/body-height.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/body-swapping.svg b/assets/icons/body-swapping.svg new file mode 100644 index 0000000..0e4cb73 --- /dev/null +++ b/assets/icons/body-swapping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/body.svg b/assets/icons/body.svg new file mode 100644 index 0000000..2337fc8 --- /dev/null +++ b/assets/icons/body.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/icons/bolas.svg b/assets/icons/bolas.svg new file mode 100644 index 0000000..e103924 --- /dev/null +++ b/assets/icons/bolas.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/bone-knife.svg b/assets/icons/bone-knife.svg new file mode 100644 index 0000000..d4acacf --- /dev/null +++ b/assets/icons/bone-knife.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/book-cover.svg b/assets/icons/book-cover.svg new file mode 100644 index 0000000..19a42a2 --- /dev/null +++ b/assets/icons/book-cover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/book-sparkles.svg b/assets/icons/book-sparkles.svg new file mode 100644 index 0000000..05daa11 --- /dev/null +++ b/assets/icons/book-sparkles.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/book.svg b/assets/icons/book.svg new file mode 100644 index 0000000..19a676d --- /dev/null +++ b/assets/icons/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/boomerang.svg b/assets/icons/boomerang.svg new file mode 100644 index 0000000..c374830 --- /dev/null +++ b/assets/icons/boomerang.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/icons/boots.svg b/assets/icons/boots.svg new file mode 100644 index 0000000..da10837 --- /dev/null +++ b/assets/icons/boots.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bottle-vapors.svg b/assets/icons/bottle-vapors.svg new file mode 100644 index 0000000..378a01b --- /dev/null +++ b/assets/icons/bottle-vapors.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bowman.svg b/assets/icons/bowman.svg new file mode 100644 index 0000000..dd97731 --- /dev/null +++ b/assets/icons/bowman.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bracer.svg b/assets/icons/bracer.svg new file mode 100644 index 0000000..8635365 --- /dev/null +++ b/assets/icons/bracer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/brain-dump.svg b/assets/icons/brain-dump.svg new file mode 100644 index 0000000..7a098fc --- /dev/null +++ b/assets/icons/brain-dump.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/brandy-bottle.svg b/assets/icons/brandy-bottle.svg new file mode 100644 index 0000000..0fcc780 --- /dev/null +++ b/assets/icons/brandy-bottle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/breastplate.svg b/assets/icons/breastplate.svg new file mode 100644 index 0000000..4156310 --- /dev/null +++ b/assets/icons/breastplate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/brewing.svg b/assets/icons/brewing.svg new file mode 100644 index 0000000..4fd4b59 --- /dev/null +++ b/assets/icons/brewing.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/brick-pile.svg b/assets/icons/brick-pile.svg new file mode 100644 index 0000000..97bfcf7 --- /dev/null +++ b/assets/icons/brick-pile.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/brick-wall.svg b/assets/icons/brick-wall.svg new file mode 100644 index 0000000..2cc58d4 --- /dev/null +++ b/assets/icons/brick-wall.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bright-explosion.svg b/assets/icons/bright-explosion.svg new file mode 100644 index 0000000..3a3c6e1 --- /dev/null +++ b/assets/icons/bright-explosion.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/broad-dagger.svg b/assets/icons/broad-dagger.svg new file mode 100644 index 0000000..5ec33df --- /dev/null +++ b/assets/icons/broad-dagger.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bubbling-flask.svg b/assets/icons/bubbling-flask.svg new file mode 100644 index 0000000..51aaeb2 --- /dev/null +++ b/assets/icons/bubbling-flask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/buffalo-head.svg b/assets/icons/buffalo-head.svg new file mode 100644 index 0000000..8bb26f1 --- /dev/null +++ b/assets/icons/buffalo-head.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bull.svg b/assets/icons/bull.svg new file mode 100644 index 0000000..b6bb89b --- /dev/null +++ b/assets/icons/bull.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/bullseye.svg b/assets/icons/bullseye.svg new file mode 100644 index 0000000..a2d2789 --- /dev/null +++ b/assets/icons/bullseye.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/burning-dot.svg b/assets/icons/burning-dot.svg new file mode 100644 index 0000000..1707ec0 --- /dev/null +++ b/assets/icons/burning-dot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/burning-meteor.svg b/assets/icons/burning-meteor.svg new file mode 100644 index 0000000..06f81f5 --- /dev/null +++ b/assets/icons/burning-meteor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/caduceus.svg b/assets/icons/caduceus.svg new file mode 100644 index 0000000..ef602d9 --- /dev/null +++ b/assets/icons/caduceus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/camp-cooking-pot.svg b/assets/icons/camp-cooking-pot.svg new file mode 100644 index 0000000..283913d --- /dev/null +++ b/assets/icons/camp-cooking-pot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/campfire.svg b/assets/icons/campfire.svg new file mode 100644 index 0000000..2cccb99 --- /dev/null +++ b/assets/icons/campfire.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cancer.svg b/assets/icons/cancer.svg new file mode 100644 index 0000000..cb69fcf --- /dev/null +++ b/assets/icons/cancer.svg @@ -0,0 +1,667 @@ + + + + + + diff --git a/assets/icons/candle-flame.svg b/assets/icons/candle-flame.svg new file mode 100644 index 0000000..a27ca6f --- /dev/null +++ b/assets/icons/candle-flame.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/candle-holder.svg b/assets/icons/candle-holder.svg new file mode 100644 index 0000000..3e75536 --- /dev/null +++ b/assets/icons/candle-holder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/candle.svg b/assets/icons/candle.svg new file mode 100644 index 0000000..0993faf --- /dev/null +++ b/assets/icons/candle.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/cap.svg b/assets/icons/cap.svg new file mode 100644 index 0000000..56c0497 --- /dev/null +++ b/assets/icons/cap.svg @@ -0,0 +1 @@ +кепка diff --git a/assets/icons/capricorn.svg b/assets/icons/capricorn.svg new file mode 100644 index 0000000..37505b9 --- /dev/null +++ b/assets/icons/capricorn.svg @@ -0,0 +1,464 @@ + + + + + + diff --git a/assets/icons/carrying-sack.svg b/assets/icons/carrying-sack.svg new file mode 100644 index 0000000..7af3118 --- /dev/null +++ b/assets/icons/carrying-sack.svg @@ -0,0 +1,15 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/cartwheel.svg b/assets/icons/cartwheel.svg new file mode 100644 index 0000000..a24a8b7 --- /dev/null +++ b/assets/icons/cartwheel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cash.svg b/assets/icons/cash.svg new file mode 100644 index 0000000..de672bc --- /dev/null +++ b/assets/icons/cash.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/category.svg b/assets/icons/category.svg new file mode 100644 index 0000000..aa81d24 --- /dev/null +++ b/assets/icons/category.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/catfish.svg b/assets/icons/catfish.svg new file mode 100644 index 0000000..8fbf72f --- /dev/null +++ b/assets/icons/catfish.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/cauldron.svg b/assets/icons/cauldron.svg new file mode 100644 index 0000000..4dba131 --- /dev/null +++ b/assets/icons/cauldron.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cavalry.svg b/assets/icons/cavalry.svg new file mode 100644 index 0000000..c635f94 --- /dev/null +++ b/assets/icons/cavalry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/caveman.svg b/assets/icons/caveman.svg new file mode 100644 index 0000000..432c284 --- /dev/null +++ b/assets/icons/caveman.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/celebration-fire.svg b/assets/icons/celebration-fire.svg new file mode 100644 index 0000000..9f3b9c3 --- /dev/null +++ b/assets/icons/celebration-fire.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/centaur.svg b/assets/icons/centaur.svg new file mode 100644 index 0000000..39e066e --- /dev/null +++ b/assets/icons/centaur.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/ceramics.svg b/assets/icons/ceramics.svg new file mode 100644 index 0000000..9966e1a --- /dev/null +++ b/assets/icons/ceramics.svg @@ -0,0 +1,4 @@ + diff --git a/assets/icons/ceremonial-mask.svg b/assets/icons/ceremonial-mask.svg new file mode 100644 index 0000000..824e7bf --- /dev/null +++ b/assets/icons/ceremonial-mask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/chain-mail.svg b/assets/icons/chain-mail.svg new file mode 100644 index 0000000..4cc8a05 --- /dev/null +++ b/assets/icons/chain-mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/chalk-outline-murder.svg b/assets/icons/chalk-outline-murder.svg new file mode 100644 index 0000000..6b6b82a --- /dev/null +++ b/assets/icons/chalk-outline-murder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/character.svg b/assets/icons/character.svg new file mode 100644 index 0000000..551d8bb --- /dev/null +++ b/assets/icons/character.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/charm.svg b/assets/icons/charm.svg new file mode 100644 index 0000000..3277154 --- /dev/null +++ b/assets/icons/charm.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/chemical-drop.svg b/assets/icons/chemical-drop.svg new file mode 100644 index 0000000..9a2773d --- /dev/null +++ b/assets/icons/chemical-drop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/chest-armor.svg b/assets/icons/chest-armor.svg new file mode 100644 index 0000000..f887990 --- /dev/null +++ b/assets/icons/chest-armor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/chest.svg b/assets/icons/chest.svg new file mode 100644 index 0000000..e62177f --- /dev/null +++ b/assets/icons/chest.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/chicken.svg b/assets/icons/chicken.svg new file mode 100644 index 0000000..3716ff7 --- /dev/null +++ b/assets/icons/chicken.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/icons/circle.svg b/assets/icons/circle.svg new file mode 100644 index 0000000..a13d55f --- /dev/null +++ b/assets/icons/circle.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/claw.svg b/assets/icons/claw.svg new file mode 100644 index 0000000..4181c0a --- /dev/null +++ b/assets/icons/claw.svg @@ -0,0 +1,5 @@ + diff --git a/assets/icons/climbing.svg b/assets/icons/climbing.svg new file mode 100644 index 0000000..0365c2f --- /dev/null +++ b/assets/icons/climbing.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/cloak-dagger.svg b/assets/icons/cloak-dagger.svg new file mode 100644 index 0000000..d26f11d --- /dev/null +++ b/assets/icons/cloak-dagger.svg @@ -0,0 +1,62 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/assets/icons/cloak.svg b/assets/icons/cloak.svg new file mode 100644 index 0000000..97ff242 --- /dev/null +++ b/assets/icons/cloak.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/icons/closed-barbute.svg b/assets/icons/closed-barbute.svg new file mode 100644 index 0000000..19270d9 --- /dev/null +++ b/assets/icons/closed-barbute.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/club.svg b/assets/icons/club.svg new file mode 100644 index 0000000..4a5dbb2 --- /dev/null +++ b/assets/icons/club.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/cobweb.svg b/assets/icons/cobweb.svg new file mode 100644 index 0000000..adab874 --- /dev/null +++ b/assets/icons/cobweb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/coiling-curl.svg b/assets/icons/coiling-curl.svg new file mode 100644 index 0000000..91b44c1 --- /dev/null +++ b/assets/icons/coiling-curl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/coins.svg b/assets/icons/coins.svg new file mode 100644 index 0000000..0d38af1 --- /dev/null +++ b/assets/icons/coins.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/coma.svg b/assets/icons/coma.svg new file mode 100644 index 0000000..0e6f71f --- /dev/null +++ b/assets/icons/coma.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/concentration-orb.svg b/assets/icons/concentration-orb.svg new file mode 100644 index 0000000..2e3af7c --- /dev/null +++ b/assets/icons/concentration-orb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/confrontation.svg b/assets/icons/confrontation.svg new file mode 100644 index 0000000..1627a2f --- /dev/null +++ b/assets/icons/confrontation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/conqueror.svg b/assets/icons/conqueror.svg new file mode 100644 index 0000000..6d5fe9f --- /dev/null +++ b/assets/icons/conqueror.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/contortionist.svg b/assets/icons/contortionist.svg new file mode 100644 index 0000000..174724f --- /dev/null +++ b/assets/icons/contortionist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/convict.svg b/assets/icons/convict.svg new file mode 100644 index 0000000..e5359e3 --- /dev/null +++ b/assets/icons/convict.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/convince.svg b/assets/icons/convince.svg new file mode 100644 index 0000000..3ec8490 --- /dev/null +++ b/assets/icons/convince.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cook.svg b/assets/icons/cook.svg new file mode 100644 index 0000000..fb2737f --- /dev/null +++ b/assets/icons/cook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cookery.svg b/assets/icons/cookery.svg new file mode 100644 index 0000000..c3233ec --- /dev/null +++ b/assets/icons/cookery.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/cooking-pot.svg b/assets/icons/cooking-pot.svg new file mode 100644 index 0000000..987d003 --- /dev/null +++ b/assets/icons/cooking-pot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/corner-explosion.svg b/assets/icons/corner-explosion.svg new file mode 100644 index 0000000..e22dd61 --- /dev/null +++ b/assets/icons/corner-explosion.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cow.svg b/assets/icons/cow.svg new file mode 100644 index 0000000..6ede749 --- /dev/null +++ b/assets/icons/cow.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/icons/creativity.svg b/assets/icons/creativity.svg new file mode 100644 index 0000000..5c21976 --- /dev/null +++ b/assets/icons/creativity.svg @@ -0,0 +1,26 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/crested-helmet.svg b/assets/icons/crested-helmet.svg new file mode 100644 index 0000000..722f41d --- /dev/null +++ b/assets/icons/crested-helmet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cross-mark.svg b/assets/icons/cross-mark.svg new file mode 100644 index 0000000..19c990c --- /dev/null +++ b/assets/icons/cross-mark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/crossbow.svg b/assets/icons/crossbow.svg new file mode 100644 index 0000000..a684cb4 --- /dev/null +++ b/assets/icons/crossbow.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/crossed-axes.svg b/assets/icons/crossed-axes.svg new file mode 100644 index 0000000..0b569f9 --- /dev/null +++ b/assets/icons/crossed-axes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/crossed-swords.svg b/assets/icons/crossed-swords.svg new file mode 100644 index 0000000..e9bb709 --- /dev/null +++ b/assets/icons/crossed-swords.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/crow.svg b/assets/icons/crow.svg new file mode 100644 index 0000000..c04170a --- /dev/null +++ b/assets/icons/crow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/icons/crowbar.svg b/assets/icons/crowbar.svg new file mode 100644 index 0000000..4092cf7 --- /dev/null +++ b/assets/icons/crowbar.svg @@ -0,0 +1,15 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/crystal-wand.svg b/assets/icons/crystal-wand.svg new file mode 100644 index 0000000..4ce7fd4 --- /dev/null +++ b/assets/icons/crystal-wand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/cultist.svg b/assets/icons/cultist.svg new file mode 100644 index 0000000..16b1c3b --- /dev/null +++ b/assets/icons/cultist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/curling-vines.svg b/assets/icons/curling-vines.svg new file mode 100644 index 0000000..4447913 --- /dev/null +++ b/assets/icons/curling-vines.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/curly-mask.svg b/assets/icons/curly-mask.svg new file mode 100644 index 0000000..f9e816b --- /dev/null +++ b/assets/icons/curly-mask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/daemon-skull.svg b/assets/icons/daemon-skull.svg new file mode 100644 index 0000000..1154dc1 --- /dev/null +++ b/assets/icons/daemon-skull.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/dagger.svg b/assets/icons/dagger.svg new file mode 100644 index 0000000..bd72b14 --- /dev/null +++ b/assets/icons/dagger.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/damage.svg b/assets/icons/damage.svg new file mode 100644 index 0000000..5bd86f5 --- /dev/null +++ b/assets/icons/damage.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/dance.svg b/assets/icons/dance.svg new file mode 100644 index 0000000..9f5631d --- /dev/null +++ b/assets/icons/dance.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/dart.svg b/assets/icons/dart.svg new file mode 100644 index 0000000..e2fc438 --- /dev/null +++ b/assets/icons/dart.svg @@ -0,0 +1,2 @@ + + diff --git a/assets/icons/deadly-strike.svg b/assets/icons/deadly-strike.svg new file mode 100644 index 0000000..2db1681 --- /dev/null +++ b/assets/icons/deadly-strike.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/deer-track.svg b/assets/icons/deer-track.svg new file mode 100644 index 0000000..7deb7ff --- /dev/null +++ b/assets/icons/deer-track.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/deer.svg b/assets/icons/deer.svg new file mode 100644 index 0000000..439291a --- /dev/null +++ b/assets/icons/deer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/default-action.svg b/assets/icons/default-action.svg new file mode 100644 index 0000000..b55b725 --- /dev/null +++ b/assets/icons/default-action.svg @@ -0,0 +1,15 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/despair.svg b/assets/icons/despair.svg new file mode 100644 index 0000000..96aecb0 --- /dev/null +++ b/assets/icons/despair.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/dice-d20.svg b/assets/icons/dice-d20.svg new file mode 100644 index 0000000..498558c --- /dev/null +++ b/assets/icons/dice-d20.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/dice-d6.svg b/assets/icons/dice-d6.svg new file mode 100644 index 0000000..652ec8c --- /dev/null +++ b/assets/icons/dice-d6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/dig-dug.svg b/assets/icons/dig-dug.svg new file mode 100644 index 0000000..9c84cdc --- /dev/null +++ b/assets/icons/dig-dug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/disease.svg b/assets/icons/disease.svg new file mode 100644 index 0000000..e21d976 --- /dev/null +++ b/assets/icons/disease.svg @@ -0,0 +1,2 @@ + + diff --git a/assets/icons/distraction.svg b/assets/icons/distraction.svg new file mode 100644 index 0000000..e0dd044 --- /dev/null +++ b/assets/icons/distraction.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/divination.svg b/assets/icons/divination.svg new file mode 100644 index 0000000..b1a171b --- /dev/null +++ b/assets/icons/divination.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/dodge.svg b/assets/icons/dodge.svg new file mode 100644 index 0000000..f3871c6 --- /dev/null +++ b/assets/icons/dodge.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/dodging.svg b/assets/icons/dodging.svg new file mode 100644 index 0000000..79f2417 --- /dev/null +++ b/assets/icons/dodging.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/donkey.svg b/assets/icons/donkey.svg new file mode 100644 index 0000000..a8414f0 --- /dev/null +++ b/assets/icons/donkey.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/icons/dorsal-scales.svg b/assets/icons/dorsal-scales.svg new file mode 100644 index 0000000..937807f --- /dev/null +++ b/assets/icons/dorsal-scales.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/double-face-mask.svg b/assets/icons/double-face-mask.svg new file mode 100644 index 0000000..f35f7cb --- /dev/null +++ b/assets/icons/double-face-mask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/double-ringed-orb.svg b/assets/icons/double-ringed-orb.svg new file mode 100644 index 0000000..01027cc --- /dev/null +++ b/assets/icons/double-ringed-orb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/dove.svg b/assets/icons/dove.svg new file mode 100644 index 0000000..ec22692 --- /dev/null +++ b/assets/icons/dove.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/icons/drama-masks.svg b/assets/icons/drama-masks.svg new file mode 100644 index 0000000..b71ea4f --- /dev/null +++ b/assets/icons/drama-masks.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/drawing.svg b/assets/icons/drawing.svg new file mode 100644 index 0000000..ef6a3d5 --- /dev/null +++ b/assets/icons/drawing.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/dread.svg b/assets/icons/dread.svg new file mode 100644 index 0000000..7b82eb4 --- /dev/null +++ b/assets/icons/dread.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/dress.svg b/assets/icons/dress.svg new file mode 100644 index 0000000..0d446cb --- /dev/null +++ b/assets/icons/dress.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/drum.svg b/assets/icons/drum.svg new file mode 100644 index 0000000..955d806 --- /dev/null +++ b/assets/icons/drum.svg @@ -0,0 +1,30 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/duality.svg b/assets/icons/duality.svg new file mode 100644 index 0000000..f58736f --- /dev/null +++ b/assets/icons/duality.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/duck.svg b/assets/icons/duck.svg new file mode 100644 index 0000000..ace31c7 --- /dev/null +++ b/assets/icons/duck.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/dulcimer.svg b/assets/icons/dulcimer.svg new file mode 100644 index 0000000..18c1fc7 --- /dev/null +++ b/assets/icons/dulcimer.svg @@ -0,0 +1,30 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/eagle.svg b/assets/icons/eagle.svg new file mode 100644 index 0000000..34da5b8 --- /dev/null +++ b/assets/icons/eagle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/egyptian-walk.svg b/assets/icons/egyptian-walk.svg new file mode 100644 index 0000000..d656371 --- /dev/null +++ b/assets/icons/egyptian-walk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/elbow-pad.svg b/assets/icons/elbow-pad.svg new file mode 100644 index 0000000..ef9ef62 --- /dev/null +++ b/assets/icons/elbow-pad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/embalming.svg b/assets/icons/embalming.svg new file mode 100644 index 0000000..7c0f508 --- /dev/null +++ b/assets/icons/embalming.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/embrassed-energy.svg b/assets/icons/embrassed-energy.svg new file mode 100644 index 0000000..7577efc --- /dev/null +++ b/assets/icons/embrassed-energy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/emerald.svg b/assets/icons/emerald.svg new file mode 100644 index 0000000..b7603bf --- /dev/null +++ b/assets/icons/emerald.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/empathy.svg b/assets/icons/empathy.svg new file mode 100644 index 0000000..f07a548 --- /dev/null +++ b/assets/icons/empathy.svg @@ -0,0 +1,22 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/energy-arrow.svg b/assets/icons/energy-arrow.svg new file mode 100644 index 0000000..8675f4b --- /dev/null +++ b/assets/icons/energy-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/engineering.svg b/assets/icons/engineering.svg new file mode 100644 index 0000000..cf756c5 --- /dev/null +++ b/assets/icons/engineering.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/enrage.svg b/assets/icons/enrage.svg new file mode 100644 index 0000000..d0973ac --- /dev/null +++ b/assets/icons/enrage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/entangled-typhoon.svg b/assets/icons/entangled-typhoon.svg new file mode 100644 index 0000000..e7373f3 --- /dev/null +++ b/assets/icons/entangled-typhoon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/event.svg b/assets/icons/event.svg new file mode 100644 index 0000000..308391a --- /dev/null +++ b/assets/icons/event.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/explosion-rays.svg b/assets/icons/explosion-rays.svg new file mode 100644 index 0000000..2ac695e --- /dev/null +++ b/assets/icons/explosion-rays.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/face-to-face.svg b/assets/icons/face-to-face.svg new file mode 100644 index 0000000..2787016 --- /dev/null +++ b/assets/icons/face-to-face.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/falcon.svg b/assets/icons/falcon.svg new file mode 100644 index 0000000..06fed6d --- /dev/null +++ b/assets/icons/falcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/falling.svg b/assets/icons/falling.svg new file mode 100644 index 0000000..663cbc9 --- /dev/null +++ b/assets/icons/falling.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/fangs.svg b/assets/icons/fangs.svg new file mode 100644 index 0000000..1f17a40 --- /dev/null +++ b/assets/icons/fangs.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/farmer.svg b/assets/icons/farmer.svg new file mode 100644 index 0000000..dc2c0d9 --- /dev/null +++ b/assets/icons/farmer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/fat.svg b/assets/icons/fat.svg new file mode 100644 index 0000000..7e84eee --- /dev/null +++ b/assets/icons/fat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/feather.svg b/assets/icons/feather.svg new file mode 100644 index 0000000..2e6457b --- /dev/null +++ b/assets/icons/feather.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/fire-dash.svg b/assets/icons/fire-dash.svg new file mode 100644 index 0000000..e9bc42e --- /dev/null +++ b/assets/icons/fire-dash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/fire-silhouette.svg b/assets/icons/fire-silhouette.svg new file mode 100644 index 0000000..3a13061 --- /dev/null +++ b/assets/icons/fire-silhouette.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/fire.svg b/assets/icons/fire.svg new file mode 100644 index 0000000..6d266c9 --- /dev/null +++ b/assets/icons/fire.svg @@ -0,0 +1,54 @@ + +image/svg+xml diff --git a/assets/icons/fireball.svg b/assets/icons/fireball.svg new file mode 100644 index 0000000..f0d16f7 --- /dev/null +++ b/assets/icons/fireball.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/fish-scales.svg b/assets/icons/fish-scales.svg new file mode 100644 index 0000000..2b67b6a --- /dev/null +++ b/assets/icons/fish-scales.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/fishing.svg b/assets/icons/fishing.svg new file mode 100644 index 0000000..6a514a3 --- /dev/null +++ b/assets/icons/fishing.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/flail.svg b/assets/icons/flail.svg new file mode 100644 index 0000000..e872021 --- /dev/null +++ b/assets/icons/flail.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/flanged-mace.svg b/assets/icons/flanged-mace.svg new file mode 100644 index 0000000..067e348 --- /dev/null +++ b/assets/icons/flanged-mace.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/flat-paw-print.svg b/assets/icons/flat-paw-print.svg new file mode 100644 index 0000000..4bb19f3 --- /dev/null +++ b/assets/icons/flat-paw-print.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/flax.svg b/assets/icons/flax.svg new file mode 100644 index 0000000..3d09d75 --- /dev/null +++ b/assets/icons/flax.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/flute.svg b/assets/icons/flute.svg new file mode 100644 index 0000000..d5d90e0 --- /dev/null +++ b/assets/icons/flute.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/footprint.svg b/assets/icons/footprint.svg new file mode 100644 index 0000000..e8afcab --- /dev/null +++ b/assets/icons/footprint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/foraging.svg b/assets/icons/foraging.svg new file mode 100644 index 0000000..84a09ad --- /dev/null +++ b/assets/icons/foraging.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/fox.svg b/assets/icons/fox.svg new file mode 100644 index 0000000..c456581 --- /dev/null +++ b/assets/icons/fox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/freyja.svg b/assets/icons/freyja.svg new file mode 100644 index 0000000..b8f061d --- /dev/null +++ b/assets/icons/freyja.svg @@ -0,0 +1,664 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/freyr.svg b/assets/icons/freyr.svg new file mode 100644 index 0000000..dbafd0e --- /dev/null +++ b/assets/icons/freyr.svg @@ -0,0 +1,1273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/frozen-body.svg b/assets/icons/frozen-body.svg new file mode 100644 index 0000000..a488bae --- /dev/null +++ b/assets/icons/frozen-body.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/full-wood-bucket.svg b/assets/icons/full-wood-bucket.svg new file mode 100644 index 0000000..0fa08df --- /dev/null +++ b/assets/icons/full-wood-bucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/galleon.svg b/assets/icons/galleon.svg new file mode 100644 index 0000000..19c4bb4 --- /dev/null +++ b/assets/icons/galleon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/gauntlet.svg b/assets/icons/gauntlet.svg new file mode 100644 index 0000000..8dc27f4 --- /dev/null +++ b/assets/icons/gauntlet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/gear.svg b/assets/icons/gear.svg new file mode 100644 index 0000000..69f43df --- /dev/null +++ b/assets/icons/gear.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/gem-chain.svg b/assets/icons/gem-chain.svg new file mode 100644 index 0000000..86537a4 --- /dev/null +++ b/assets/icons/gem-chain.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/gem-pendant.svg b/assets/icons/gem-pendant.svg new file mode 100644 index 0000000..5bf1926 --- /dev/null +++ b/assets/icons/gem-pendant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/gemini.svg b/assets/icons/gemini.svg new file mode 100644 index 0000000..46fdb12 --- /dev/null +++ b/assets/icons/gemini.svg @@ -0,0 +1,402 @@ + + + + + + diff --git a/assets/icons/gems.svg b/assets/icons/gems.svg new file mode 100644 index 0000000..98ec4b0 --- /dev/null +++ b/assets/icons/gems.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/ghost-ally.svg b/assets/icons/ghost-ally.svg new file mode 100644 index 0000000..816d2d6 --- /dev/null +++ b/assets/icons/ghost-ally.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/giant.svg b/assets/icons/giant.svg new file mode 100644 index 0000000..f05f614 --- /dev/null +++ b/assets/icons/giant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/glaive.svg b/assets/icons/glaive.svg new file mode 100644 index 0000000..7a0e668 --- /dev/null +++ b/assets/icons/glaive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/glassworking.svg b/assets/icons/glassworking.svg new file mode 100644 index 0000000..2593a29 --- /dev/null +++ b/assets/icons/glassworking.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/gloves.svg b/assets/icons/gloves.svg new file mode 100644 index 0000000..6868502 --- /dev/null +++ b/assets/icons/gloves.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/goat.svg b/assets/icons/goat.svg new file mode 100644 index 0000000..3c89ba7 --- /dev/null +++ b/assets/icons/goat.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/goose.svg b/assets/icons/goose.svg new file mode 100644 index 0000000..960dc55 --- /dev/null +++ b/assets/icons/goose.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/icons/grab-hold.svg b/assets/icons/grab-hold.svg new file mode 100644 index 0000000..14f6c41 --- /dev/null +++ b/assets/icons/grab-hold.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/icons/grab-take.svg b/assets/icons/grab-take.svg new file mode 100644 index 0000000..72b8911 --- /dev/null +++ b/assets/icons/grab-take.svg @@ -0,0 +1,5 @@ + + + Grab + + \ No newline at end of file diff --git a/assets/icons/grainflail.svg b/assets/icons/grainflail.svg new file mode 100644 index 0000000..7914813 --- /dev/null +++ b/assets/icons/grainflail.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/grappling-hook.svg b/assets/icons/grappling-hook.svg new file mode 100644 index 0000000..326615b --- /dev/null +++ b/assets/icons/grappling-hook.svg @@ -0,0 +1,27 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/greaves.svg b/assets/icons/greaves.svg new file mode 100644 index 0000000..0cab704 --- /dev/null +++ b/assets/icons/greaves.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/guards.svg b/assets/icons/guards.svg new file mode 100644 index 0000000..f297d58 --- /dev/null +++ b/assets/icons/guards.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/halea.png b/assets/icons/halea.png new file mode 100644 index 0000000000000000000000000000000000000000..635fdd678bf0fbd3e992cf5e5e5156684193b02d GIT binary patch literal 34524 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

sh8Xw$R+fpMe0+?s8_vI;BUyd(!DD9ePcsX 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

;OvZv@h76fMbK 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 +const fields = foundry.data.fields; + +const GOLD = { + CONST: {}, + CONFIG: {}, +}; + +const GoldActorDataModels = foundry.utils.mergeObject( + sohl.SohlActorDataModels, + {}, + { inplace: false }, +); + +const GoldItemDataModels = foundry.utils.mergeObject( + sohl.SohlItemDataModels, + {}, + { inplace: false }, +); + +const GoldModifiers = foundry.utils.mergeObject( + sohl.SohlModifiers, + {}, + { inplace: false }, +); + +export const verData = { + id: "legendary", + label: "Song of Heroic Lands: Golden Edition", + CONFIG: { + Helper: { + modifiers: GoldModifiers, + contextMenu: sohl.SohlContextMenu, + }, + Actor: { + documentClass: sohl.SohlActor, + documentSheets: [ + { + cls: sohl.SohlActorSheet, + types: Object.keys(GoldActorDataModels), + }, + ], + dataModels: GoldActorDataModels, + typeLabels: sohl.SohlActorTypeLabels, + typeIcons: sohl.SohlActorTypeIcons, + types: Object.keys(GoldActorDataModels), + defaultType: sohl.AnimateEntityActorData.typeName, + compendiums: [], + }, + Item: { + documentClass: sohl.SohlItem, + documentSheets: [ + { + cls: sohl.SohlItemSheet, + types: Object.keys(GoldItemDataModels).filter( + (t) => t !== sohl.ContainerGearItemData.typeName, + ), + }, + { + cls: sohl.SohlContainerGearItemSheet, + types: [sohl.ContainerGearItemData.typeName], + }, + ], + dataModels: GoldItemDataModels, + typeLabels: sohl.SohlItemTypeLabels, + typeIcons: sohl.SohlItemTypeIcons, + types: Object.keys(GoldItemDataModels), + compendiums: ["sohl.golden-basic-items"], + }, + ActiveEffect: { + documentClass: sohl.SohlActiveEffect, + legacyTransferral: false, + }, + Macro: { + documentClass: sohl.SohlMacro, + documentSheet: sohl.SohlMacroConfig, + }, + }, + CONST: foundry.utils.mergeObject(sohl.SOHL.CONST, GOLD.CONST, { + inplace: false, + }), +}; diff --git a/module/island.js b/module/island.js new file mode 100644 index 0000000..99df49f --- /dev/null +++ b/module/island.js @@ -0,0 +1,89 @@ +/* eslint-disable no-unused-vars */ +import * as sohl from "./sohl-common.js"; + +/* ====================================================================== */ +/* Constants */ +/* ====================================================================== */ + +// biome-ignore lint/correctness/noUnusedVariables: +const fields = foundry.data.fields; + +const ISLE = { + CONST: {}, + CONFIG: {}, +}; + +const IsleActorDataModels = foundry.utils.mergeObject( + sohl.SohlActorDataModels, + {}, + { inplace: false }, +); + +const IsleItemDataModels = foundry.utils.mergeObject( + sohl.SohlItemDataModels, + {}, + { inplace: false }, +); + +const IsleModifiers = foundry.utils.mergeObject( + sohl.SohlModifiers, + {}, + { inplace: false }, +); + +export const verData = { + id: "legendary", + label: "Song of Heroic Lands: Island Edition", + CONFIG: { + Helper: { + modifiers: IsleModifiers, + contextMenu: sohl.SohlContextMenu, + }, + Actor: { + documentClass: sohl.SohlActor, + documentSheets: [ + { + cls: sohl.SohlActorSheet, + types: Object.keys(IsleActorDataModels), + }, + ], + dataModels: IsleActorDataModels, + typeLabels: sohl.SohlActorTypeLabels, + typeIcons: sohl.SohlActorTypeIcons, + types: Object.keys(IsleActorDataModels), + defaultType: sohl.AnimateEntityActorData.typeName, + compendiums: [], + }, + Item: { + documentClass: sohl.SohlItem, + documentSheets: [ + { + cls: sohl.SohlItemSheet, + types: Object.keys(IsleItemDataModels).filter( + (t) => t !== sohl.ContainerGearItemData.typeName, + ), + }, + { + cls: sohl.SohlContainerGearItemSheet, + types: [sohl.ContainerGearItemData.typeName], + }, + ], + dataModels: IsleItemDataModels, + typeLabels: sohl.SohlItemTypeLabels, + typeIcons: sohl.SohlItemTypeIcons, + types: Object.keys(IsleItemDataModels), + compendiums: ["sohl.island-basic-items"], + }, + ActiveEffect: { + documentClass: sohl.SohlActiveEffect, + legacyTransferral: false, + }, + Macro: { + documentClass: sohl.SohlMacro, + documentSheet: sohl.SohlMacroConfig, + }, + }, + CONST: foundry.utils.mergeObject(sohl.SOHL.CONST, ISLE.CONST, { + inplace: false, + }), +}; diff --git a/module/legendary.js b/module/legendary.js new file mode 100644 index 0000000..027553f --- /dev/null +++ b/module/legendary.js @@ -0,0 +1,8189 @@ +/* eslint-disable no-unused-vars */ +import * as sohl from "./sohl-common.js"; + +/* ====================================================================== */ +/* Constants */ +/* ====================================================================== */ + +const fields = foundry.data.fields; + +const LGND = { + CONST: { + // Legendary init message with ASCII Artwork (Doom font) + initVersionMessage: ` _ _ +| | | | +| | ___ __ _ ___ _ __ __| | __ _ _ __ _ _ +| | / _ \\/ _\` |/ _ \\ '_ \\ / _\` |/ _\` | '__| | | | +| |___| __/ (_| | __/ | | | (_| | (_| | | | |_| | +\\_____/\\___|\\__, |\\___|_| |_|\\__,_|\\__,_|_| \\__, | + __/ | __/ | + |___/ |___/ +===========================================================`, + + /** @enum */ + TACADV: { + Action: "Action", + Impact: "Impact", + Precision: "Precision", + Setup: "Setup", + }, + + MODS: { + FATE: { NAME: "Fate", ABBR: "Fate" }, + REACH: { NAME: "Reach", ABBR: "Rch" }, + PULL: { NAME: "Pull", ABBR: "Pull" }, + IMPACTTA: { NAME: "Impact Tactical Advantage", ABBR: "ImpTA" }, + HEFT: { NAME: "Heft Penalty", ABBR: "Heft" }, + HEAL: { NAME: "Healing Base", ABBR: "Heal" }, + MOBILITY: { NAME: "Mobility", ABBR: "Mob" }, + PBIMPACT: { NAME: "Point Blank Impact", ABBR: "PBImp" }, + PBATTACK: { NAME: "Point Blank Attack", ABBR: "PBAtk" }, + V2RANGE: { NAME: "Volley x2 Range", ABBR: "V2Rng" }, + V3RANGE: { NAME: "Volley x3 Range", ABBR: "V3Rng" }, + V4RANGE: { NAME: "Volley x4 Range", ABBR: "V4Rng" }, + WTENC: { NAME: "Weight Encumbrance", ABBR: "WtEnc" }, + AGLSTR: { NAME: "Agility/Strength Modifier", ABBR: "AglStrMod" }, + WINDEDNESS: { NAME: "Windedness Fatigue", ABBR: "FtgWind" }, + WEARINESS: { NAME: "Weariness Fatigue", ABBR: "FtgWear" }, + WEAKNESS: { NAME: "Weakness Fatigue", ABBR: "FtgWeak" }, + FATIGUE: { NAME: "Fatigue", ABBR: "Fatg" }, + WEIGHT: { NAME: "Weight", ABBR: "Wt" }, + ENC: { NAME: "Encumbrance", ABBR: "Enc" }, + PRONE: { NAME: "Prone", ABBR: "Prone" }, + SPELLDIFF: { NAME: "Spell Difficulty \u00D72", ABBR: "SpDiff" }, + STRIMPMOD: { NAME: "Strength Impact Modifier", ABBR: "StrImpMod" }, + ARMORREDUCTION: { NAME: "Armor Reduction", ABBR: "ArmRed" }, + DEFARMOR: { NAME: "Defender Armor", ABBR: "DefArmor" }, + DURABILITY: { NAME: "Durability", ABBR: "Dur" }, + QUALITY: { NAME: "Quality", ABBR: "Qual" }, + }, + + /** @enum */ + IMPACTTA: { + Blunt: 3, + Edged: 5, + Piercing: 4, + Fire: 2, + }, + + /** @enum */ + RANGES: { + PB: "PB", + Direct: "Direct", + V2: "V2", + V3: "V3", + V4: "V4", + }, + + /** @enum */ + STATUSEFFECTS: { + Sleep: "sleep", + Prone: "prone", + Unconscious: "unconscious", + Incapacitated: "incapacitated", + Stunned: "stun", + Dead: "dead", + }, + + VERSETTINGS: { + encIncr: { + key: "encIncr", + data: { + name: "Encumbrance tracking increment", + hint: "Calculate encumbrance by specified steps", + scope: "world", + config: true, + type: new fields.NumberField({ + required: true, + nullable: false, + initial: 5, + min: 1, + }), + }, + }, + attrSecModIncr: { + key: "attrSecModIncr", + data: { + name: "Attribute secondary modifier increment", + hint: "Calculate attribute secondary modifier by specified steps", + scope: "world", + config: true, + type: new fields.NumberField({ + required: true, + nullable: false, + initial: 5, + min: 1, + }), + }, + }, + optionGearDamage: { + key: "optionGearDamage", + data: { + name: "Gear Damage", + hint: "Enable combat rule that allows gear (weapons and armor) to be damaged or destroyed on successful block", + scope: "world", + config: true, + type: new fields.BooleanField({ initial: false }), + }, + }, + }, + + injuryLocations: { + Custom: { + impactType: "custom", + location: { probWeight: 50 }, + isStumble: false, + isFumble: false, + amputatePenalty: 0, + shockValue: 5, + bleedingSevThreshold: 0, + affectsMobility: false, + }, + Skull: { + impactType: "skull", + location: { probWeight: 50 }, + isStumble: false, + isFumble: false, + amputatePenalty: 0, + shockValue: 5, + bleedingSevThreshold: 5, + affectsMobility: true, + }, + Face: { + impactType: "face", + location: { probWeight: 30 }, + isStumble: false, + isFumble: false, + amputatePenalty: 0, + shockValue: 4, + bleedingSevThreshold: 4, + affectsMobility: true, + }, + Neck: { + impactType: "neck", + location: { probWeight: 20 }, + isStumble: false, + isFumble: false, + amputatePenalty: -10, + shockValue: 5, + bleedingSevThreshold: 3, + affectsMobility: true, + }, + Shoulder: { + impactType: "shoulder", + location: { probWeight: 15 }, + isStumble: false, + isFumble: true, + amputatePenalty: 0, + shockValue: 3, + bleedingSevThreshold: 4, + affectsMobility: false, + }, + "Upper Arm": { + impactType: "upperarm", + location: { probWeight: 15 }, + isStumble: false, + isFumble: true, + amputatePenalty: -20, + shockValue: 1, + bleedingSevThreshold: 5, + affectsMobility: false, + }, + Elbow: { + impactType: "elbow", + location: { probWeight: 5 }, + isStumble: false, + isFumble: true, + amputatePenalty: -20, + shockValue: 2, + bleedingSevThreshold: 5, + affectsMobility: false, + }, + Forearm: { + impactType: "forearm", + location: { probWeight: 10 }, + isStumble: false, + isFumble: true, + amputatePenalty: -20, + shockValue: 1, + bleedingSevThreshold: 5, + affectsMobility: false, + }, + Hand: { + impactType: "hand", + location: { probWeight: 5 }, + isStumble: false, + isFumble: true, + amputatePenalty: -30, + shockValue: 2, + bleedingSevThreshold: 0, + affectsMobility: false, + }, + Thorax: { + impactType: "thorax", + location: { probWeight: 13 }, + isStumble: false, + isFumble: false, + amputatePenalty: 0, + shockValue: 4, + bleedingSevThreshold: 4, + affectsMobility: true, + }, + Abdomen: { + impactType: "abdomen", + location: { probWeight: 13 }, + isStumble: false, + isFumble: false, + amputatePenalty: 0, + shockValue: 4, + bleedingSevThreshold: 3, + affectsMobility: true, + }, + Pelvis: { + impactType: "pelvis", + location: { probWeight: 7 }, + isStumble: false, + isFumble: false, + amputatePenalty: 0, + shockValue: 4, + bleedingSevThreshold: 4, + affectsMobility: true, + }, + Thigh: { + impactType: "thigh", + location: { probWeight: 20 }, + isStumble: true, + isFumble: false, + amputatePenalty: -10, + shockValue: 3, + bleedingSevThreshold: 4, + affectsMobility: true, + }, + Knee: { + impactType: "knee", + location: { probWeight: 5 }, + isStumble: true, + isFumble: false, + amputatePenalty: -20, + shockValue: 2, + bleedingSevThreshold: 5, + affectsMobility: true, + }, + Calf: { + impactType: "calf", + location: { probWeight: 15 }, + isStumble: true, + isFumble: false, + amputatePenalty: -20, + shockValue: 1, + bleedingSevThreshold: 5, + affectsMobility: true, + }, + Foot: { + impactType: "foot", + location: { probWeight: 10 }, + isStumble: true, + isFumble: false, + amputatePenalty: -20, + shockValue: 2, + bleedingSevThreshold: 0, + affectsMobility: true, + }, + }, + + meleeCombatTable: { + block: { + "cf:cf": { + atkFumble: true, + defFumble: true, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:cf": { + atkFumble: false, + defFumble: true, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "ms:cf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 2, + defDice: 0, + }, + "cs:cf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 3, + defDice: 0, + }, + + "cf:mf": { + atkFumble: true, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:mf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: true, + atkDice: 0, + defDice: 0, + }, + "ms:mf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 1, + defDice: 0, + }, + "cs:mf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 2, + defDice: 0, + }, + + "cf:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: true, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: true, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "ms:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: true, + atkDice: 0, + defDice: 0, + }, + "cs:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 1, + defDice: 0, + }, + + "cf:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: true, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: true, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "ms:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: true, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "cs:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: true, + atkDice: 0, + defDice: 0, + }, + }, + counterstrike: { + "cf:cf": { + atkFumble: true, + defFumble: true, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:cf": { + atkFumble: false, + defFumble: true, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "ms:cf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 3, + defDice: 0, + }, + "cs:cf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 4, + defDice: 0, + }, + + "cf:mf": { + atkFumble: true, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:mf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: true, + atkDice: 0, + defDice: 0, + }, + "ms:mf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 2, + defDice: 0, + }, + "cs:mf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 3, + defDice: 0, + }, + + "cf:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 2, + }, + "mf:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 1, + }, + "ms:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 1, + defDice: 1, + }, + "cs:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 1, + defDice: 0, + }, + + "cf:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 3, + }, + "mf:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 2, + }, + "ms:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 1, + }, + "cs:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 2, + defDice: 2, + }, + }, + dodge: { + "cf:cf": { + atkFumble: false, + defFumble: false, + atkStumble: true, + defStumble: true, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:cf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: true, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "ms:cf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 2, + defDice: 0, + }, + "cs:cf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 3, + defDice: 0, + }, + + "cf:mf": { + atkFumble: false, + defFumble: false, + atkStumble: true, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:mf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: true, + atkDice: 0, + defDice: 0, + }, + "ms:mf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 1, + defDice: 0, + }, + "cs:mf": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 2, + defDice: 0, + }, + + "cf:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: true, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: true, + atkDice: 0, + defDice: 0, + }, + "ms:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: true, + atkDice: 0, + defDice: 0, + }, + "cs:ms": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 1, + defDice: 0, + }, + + "cf:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: true, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "mf:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: true, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + "ms:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: true, + atkDice: 0, + defDice: 0, + }, + "cs:cs": { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: true, + atkDice: 0, + defDice: 0, + }, + }, + ignore: { + cf: { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: true, + block: false, + miss: false, + atkDice: 0, + defDice: 0, + }, + mf: { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 1, + defDice: 0, + }, + ms: { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 3, + defDice: 0, + }, + cs: { + atkFumble: false, + defFumble: false, + atkStumble: false, + defStumble: false, + dta: false, + block: false, + miss: false, + atkDice: 4, + defDice: 0, + }, + }, + }, + + missileCombatTable: { + block: { + "cf:cf": { wild: true, block: false, miss: false, atkDice: 0 }, + "mf:cf": { wild: false, block: false, miss: true, atkDice: 0 }, + "ms:cf": { wild: false, block: false, miss: false, atkDice: 2 }, + "cs:cf": { wild: false, block: false, miss: false, atkDice: 3 }, + + "cf:mf": { wild: true, block: false, miss: false, atkDice: 0 }, + "mf:mf": { wild: false, block: false, miss: true, atkDice: 0 }, + "ms:mf": { wild: false, block: false, miss: false, atkDice: 1 }, + "cs:mf": { wild: false, block: false, miss: false, atkDice: 2 }, + + "cf:ms": { wild: true, block: false, miss: false, atkDice: 0 }, + "mf:ms": { wild: false, block: false, miss: true, atkDice: 0 }, + "ms:ms": { wild: false, block: true, miss: false, atkDice: 0 }, + "cs:ms": { wild: false, block: false, miss: false, atkDice: 1 }, + + "cf:cs": { wild: true, block: false, miss: false, atkDice: 0 }, + "mf:cs": { wild: false, block: false, miss: true, atkDice: 0 }, + "ms:cs": { wild: false, block: true, miss: false, atkDice: 0 }, + "cs:cs": { wild: false, block: true, miss: false, atkDice: 0 }, + }, + dodge: { + "cf:cf": { wild: true, block: false, miss: false, atkDice: 0 }, + "mf:cf": { wild: false, block: false, miss: true, atkDice: 0 }, + "ms:cf": { wild: false, block: false, miss: false, atkDice: 2 }, + "cs:cf": { wild: false, block: false, miss: false, atkDice: 3 }, + + "cf:mf": { wild: true, block: false, miss: false, atkDice: 0 }, + "mf:mf": { wild: false, block: false, miss: true, atkDice: 0 }, + "ms:mf": { wild: false, block: false, miss: false, atkDice: 1 }, + "cs:mf": { wild: false, block: false, miss: false, atkDice: 2 }, + + "cf:ms": { wild: true, block: false, miss: false, atkDice: 0 }, + "mf:ms": { wild: false, block: false, miss: true, atkDice: 0 }, + "ms:ms": { wild: false, block: false, miss: true, atkDice: 0 }, + "cs:ms": { wild: false, block: false, miss: false, atkDice: 1 }, + + "cf:cs": { wild: true, block: false, miss: false, atkDice: 0 }, + "mf:cs": { wild: false, block: false, miss: true, atkDice: 0 }, + "ms:cs": { wild: false, block: false, miss: true, atkDice: 0 }, + "cs:cs": { wild: false, block: false, miss: true, atkDice: 0 }, + }, + ignore: { + cf: { wild: true, block: false, miss: false, atkDice: 0 }, + mf: { wild: false, block: false, miss: true, atkDice: 0 }, + ms: { wild: false, block: false, miss: false, atkDice: 2 }, + cs: { wild: false, block: false, miss: false, atkDice: 3 }, + }, + }, + + treatment: { + blunt: { + M: { + treatment: "Compress", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 30, + }, + useDexMod: false, + cf: { + hr: 4, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + mf: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + ms: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: -1, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + S: { + treatment: "Set & Splint", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 10, + }, + useDexMod: false, + cf: { + hr: 3, + infect: false, + impair: true, + bleed: false, + newInj: -1, + }, + mf: { + hr: 4, + infect: false, + impair: true, + bleed: false, + newInj: -1, + }, + ms: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + G: { + treatment: "Clean, Dress & Surgery", + mod: null, + useDexMod: true, + cf: { + hr: 2, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + mf: { + hr: 3, + infect: false, + impair: true, + bleed: false, + newInj: -1, + }, + ms: { + hr: 4, + infect: false, + impair: true, + bleed: false, + newInj: -1, + }, + cs: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + }, + piercing: { + M: { + treatment: "Clean & Dress", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 10, + }, + useDexMod: false, + cf: { + hr: 4, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }, + mf: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + ms: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: -1, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + S: { + treatment: "Clean & Dress", + mod: null, + useDexMod: false, + cf: { + hr: 3, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + mf: { + hr: 4, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }, + ms: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + G: { + treatment: "Clean, Dress & Surgery", + mod: { + name: "Treatment Penalty", + abbrev: "TrtBns", + value: -10, + }, + useDexMod: true, + cf: { + hr: 2, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + mf: { + hr: 3, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + ms: { + hr: 4, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + cs: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + }, + edged: { + M: { + treatment: "Clean & Dress", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 20, + }, + useDexMod: false, + cf: { + hr: 4, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }, + mf: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + ms: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: -1, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + S: { + treatment: "Clean & Dress", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 10, + }, + useDexMod: false, + cf: { + hr: 3, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + mf: { + hr: 4, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + ms: { + hr: 5, + infect: false, + impair: true, + bleed: false, + newInj: -1, + }, + cs: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + G: { + treatment: "Clean, Dress & Surgery", + mod: null, + useDexMod: true, + cf: { + hr: 2, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + mf: { + hr: 3, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + ms: { + hr: 4, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + cs: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + }, + projectile: { + M: { + treatment: "Clean & Dress", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 10, + }, + useDexMod: false, + cf: { + hr: 4, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }, + mf: { hr: 5, infect: false, impair: false, bleed: false }, + newInj: -1, + ms: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: -1, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + S: { + treatment: "Extract Projectile", + mod: null, + useDexMod: true, + cf: { hr: 3, infect: true, impair: true, bleed: false }, + newInj: -1, + mf: { + hr: 4, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + ms: { + hr: 5, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + G: { + treatment: "Extract Projectile", + mod: { + name: "Treatment Penalty", + abbrev: "TrtBns", + value: -10, + }, + useDexMod: true, + cf: { + hr: 2, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + mf: { + hr: 3, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + ms: { + hr: 4, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + cs: { + hr: 5, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }, + }, + }, + fire: { + M: { + treatment: "Compress", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 20, + }, + useDexMod: false, + cf: { + hr: 4, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + mf: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + ms: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: -1, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + S: { + treatment: "Clean & Dress", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 10, + }, + useDexMod: false, + cf: { + hr: 3, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }, + mf: { + hr: 4, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }, + ms: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + G: { + treatment: "Clean & Dress", + mod: null, + useDexMod: false, + cf: { + hr: 2, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + mf: { + hr: 3, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + ms: { + hr: 4, + infect: true, + impair: true, + bleed: false, + newInj: -1, + }, + cs: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + }, + frost: { + M: { + treatment: "Warm", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 40, + }, + useDexMod: false, + cf: { hr: 4, infect: false, impair: false, bleed: false }, + mf: { hr: 5, infect: false, impair: false, bleed: false }, + ms: { hr: -1, infect: false, impair: false, bleed: false }, + cs: { hr: -1, infect: false, impair: false, bleed: false }, + }, + S: { + treatment: "Warm", + mod: { + name: "Treatment Bonus", + abbrev: "TrtBns", + value: 20, + }, + useDexMod: false, + cf: { + hr: 3, + infect: false, + impair: true, + bleed: false, + newInj: -1, + }, + mf: { + hr: 4, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + ms: { + hr: 5, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + cs: { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }, + }, + G: { + treatment: "Surgery & Amputate", + mod: null, + useDexMod: true, + cf: { + hr: -1, + infect: true, + impair: false, + bleed: true, + newInj: 5, + }, + mf: { + hr: -1, + infect: false, + impair: false, + bleed: true, + newInj: 4, + }, + ms: { + hr: -1, + infect: false, + impair: false, + bleed: true, + newInj: 3, + }, + cs: { + hr: -1, + infect: false, + impair: false, + bleed: false, + newInj: 2, + }, + }, + }, + }, + }, +}; + +class LgndImpactModifier extends sohl.ImpactModifier { + // List of possible dice for impact dice. + static get dice() { + return { + 0: "None", + 4: "d4", + 6: "d6", + 8: "d8", + 10: "d10", + 12: "d12", + }; + } + + static get maxImpactDie() { + return Object.values(this.dice).at(-1); + } + + get impactTA() { + switch (this.aspect) { + case "blunt": + return 3; + case "edged": + return 5; + case "piercing": + return 4; + case "fire": + return 2; + default: + return 0; + } + } +} + +class LgndMasteryLevelModifier extends sohl.MasteryLevelModifier { + constructor(parent, initProperties = {}) { + super( + parent, + foundry.utils.mergeObject( + initProperties, + { + secMod: (thisVM) => { + const secModIncr = game.settings.get( + "sohl", + "attrSecModIncr", + ); + return Math.min( + 25, + Math.max( + -25, + Math.trunc( + ((thisVM.base ?? 0) / 2 - 25) / secModIncr, + ) * secModIncr, + ), + ); + }, + }, + { inplace: false, recursive: false }, + ), + ); + } +} + +class LgndAnimateEntityActorData extends sohl.AnimateEntityActorData { + $combatReach; + $hasAuralShock; + $maxZones; + $healingBase; + $encumbrance; + $sunsign; + + get intrinsicActions() { + let actions = super.intrinsicActions.map((a) => { + if (a.contextGroup === sohl.SohlContextMenu.sortGroups.Default) { + a.contextGroup = sohl.SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push( + // TODO - Add Lgnd Actor Actions + ); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + async damageRoll({ + targetToken, + impactMod, + numImpactTAs = 0, + bodyLocationUuid, + skipDialog = false, + ...options + } = {}) { + return super.damageRoll({ + targetToken, + impactMod, + numImpactTAs, + bodyLocationUuid, + skipDialog, + ...options, + }); + } + + async _damageDialog({ + type, + label, + strikeMode, + impactMod, + numImpactTAs = 0, + ...options + }) { + return super._damageDialog({ + type, + label, + strikeMode, + impactMod, + numImpactTAs, + ...options, + }); + } + + async _damageDialogCallback(html, { type, impactMod, strikeMode }) { + const form = html[0].querySelector("form"); + const formNumImpactTAs = + Number.parseInt(form.numImpactTAs.value, 10) || 0; + const newImpact = impactMod + ? this.constructor.create(impactMod) + : { + die: Number.parseInt(form.impactDie.value, 10) || 0, + modifier: Number.parseInt(form.impactModifier.value, 10) || 0, + aspect: form.impactAspect.value, + }; + if (formNumImpactTAs) { + const impactAdd = + (strikeMode?.system.$traits.impactTA || newImpact.impactTA) * + formNumImpactTAs; + newImpact.add(`${formNumImpactTAs} Impact TAs`, "ImpTA", impactAdd); + } + + return super._damageDialogCallback(html, { + type, + impactMod, + strikeMode, + }); + } + + prepareBaseData() { + super.prepareBaseData(); + this.$maxZones = 0; + this.$combatReach = -99; + this.$hasAuralShock = false; + this.$healingBase = new sohl.ValueModifier(this); + this.$encumbrance = new sohl.ValueModifier(this, { + total: (thisVM) => { + const encDiv = game.settings.get( + "sohl", + LGND.CONST.VERSETTINGS.encIncr.key, + ); + let result = Math.round( + Math.floor((thisVM.effective + Number.EPSILON) * encDiv) / + encDiv, + ); + return result; + }, + }); + this.$encumbrance.floor("Min Zero", "Min0", 0); + } +} + +function LgndStrikeModeItemDataMixin(BaseMLID) { + return class LgndStrikeModeItemData extends BaseMLID { + $length; + $reach; + $heft; + + get lengthBase() { + return this.item.getFlag("sohl", "legendary.lengthBase") || 0; + } + + get heftBase() { + return this.item.getFlag("sohl", "legendary.heftBase") || 0; + } + + get zoneDie() { + return this.item.getFlag("sohl", "legendary.zoneDie") || 0; + } + + static get effectKeys() { + return sohl.Utility.simpleMerge(super.effectKeys, { + "mod:system.$impact.armorReduction": { + label: "Armor Reduction", + abbrev: "AR", + }, + "system.$defense.block.successLevelMod": { + label: "Block Success Level", + abbrev: "BlkSL", + }, + "system.$defense.counterstrike.successLevelMod": { + label: "Counterstrike Success Level", + abbrev: "CXSL", + }, + "system.$traits.opponentDef": { + label: "Opponent Defense", + abbrev: "OppDef", + }, + "system.$traits.entangle": { + label: "Entangle", + abbrev: "Entangle", + }, + "system.$traits.envelop": { + label: "Envelop", + abbrev: "Envlp", + }, + "system.$traits.lowAim": { + label: "High Strike", + abbrev: "HiStrike", + }, + "system.$traits.impactTA": { + label: "Impact Tac Adv", + abbrev: "ImpTA", + }, + "system.$traits.notInClose": { + label: "Not In Close", + abbrev: "NotInCls", + }, + "system.$traits.onlyInClose": { + label: "Only In Close", + abbrev: "OnlyInCls", + }, + "system.$traits.lowStrike": { + label: "Low Strike", + abbrev: "LoStrike", + }, + "system.$traits.deflectTN": { + label: "Deflect TN", + abbrev: "DeflTN", + }, + "system.$traits.shieldMod": { + label: "Shield Mod", + abbrev: "ShldMod", + }, + "system.$traits.extraBleedRisk": { + label: "Extra Bleed Risk", + abbrev: "XBldRsk", + }, + "system.$traits.noStrMod": { + label: "No STR Mod", + abbrev: "NoStrMod", + }, + "system.$traits.halfImpact": { + label: "Half Impact", + abbrev: "HlfImp", + }, + }); + } + + prepareBaseData() { + super.prepareBaseData(); + this.$length = new sohl.ValueModifier(this); + this.$reach = new sohl.ValueModifier(this); + this.$heft = new sohl.ValueModifier(this); + foundry.utils.mergeObject(this.$traits, { + armorReduction: 0, + blockSLMod: 0, + cxSLMod: 0, + opponentDef: 0, + entangle: false, + envelop: false, + lowAim: false, + impactTA: 0, + notInClose: false, + onlyInClose: false, + deflectTN: 0, + shieldMod: 0, + extraBleedRisk: false, + noStrMod: false, + halfImpact: false, + noBlock: false, + noAttack: false, + }); + } + + processSiblings() { + super.processSiblings(); + if (this.$traits.noBlock) this.$defense.block.disabled = true; + if (this.$traits.noAttack) { + this.$attack.disabled = true; + this.$defense.counterstrike.disabled = true; + } + if (this.$traits.blockSLMod) + this.$defense.block.successLevelMod.add( + "SL Modifier", + "SLMod", + this.$traits.blockSLMod, + ); + + if (this.$traits.cxSLMod) + this.$defense.counterstrike.successLevelMod.add( + "SL Modifier", + "SLMod", + this.$traits.cxSLMod, + ); + + const weapon = this.item.nestedIn; + const strength = this.actor.getTraitByAbbrev("str"); + + if (weapon?.system instanceof sohl.WeaponGearItemData) { + this.$heft.addVM(weapon.system.$heft, { + includeBase: true, + }); + this.$length.addVM(weapon.system.$length, { + includeBase: true, + }); + + // If held in a non-favored part, attack/block/CX are at -5 + if (!weapon.system.$heldByFavoredPart) { + this.$heft.add("Held by non-favored limb", "NonFavLimb", 5); + } + + // If held in two hands (for a weapon that only requires one hand) + // reduce the HFT by 5 + if (weapon.system.$heldBy.length > this.minParts) { + this.$heft.add("Multi-Limb Bonus", "MultLimb", -5); + + if (strength) { + // If swung and STR is greater than base unmodified heft, impact + // increases by 1 + if ( + this.$traits.swung && + strength.system.$score?.base >= this.heftBase + ) { + this.$impact.add( + "Swung Strength Bonus", + "SwgStr", + 1, + ); + } + } + } + } else { + this.$length.setBase(this.lengthBase); + this.$heft.setBase(this.heftBase); + } + + if (strength) { + const strValue = strength.system.$score?.effective || 0; + + const heftPenalty = + Math.max(0, this.$heft.effective - strValue) * -5; + + if (heftPenalty) { + this.$attack.add( + "Heft Strength Penalty", + "HeftStr", + heftPenalty, + ); + this.$defense.block.add( + "Heft Strength Penalty", + "HeftStr", + heftPenalty, + ); + this.$defense.counterstrike.add( + "Heft Strength Penalty", + "HeftStr", + heftPenalty, + ); + } + } + + this.$reach.addVM(this.$length, { + includeBase: true, + }); + + const size = this.actor.getTraitByAbbrev("siz"); + if (size) { + const sizeReachMod = size.system.$params?.reachMod || 0; + this.$reach.add("Size Modifier", "Siz", sizeReachMod); + } + } + }; +} + +class LgndMeleeWeaponStrikeModeItemData extends LgndStrikeModeItemDataMixin( + sohl.MeleeWeaponStrikeModeItemData, +) { + static get effectKeys() { + return sohl.Utility.simpleMerge(super.effectKeys, { + "mod:system.$heft": { label: "Heft", abbrev: "Hft" }, + "system.$traits.couched": { label: "Couched", abbrev: "Couched" }, + "system.$traits.slow": { label: "Slow", abbrev: "Slow" }, + "system.$traits.thrust": { label: "Thrust", abbrev: "Thst" }, + "system.$traits.swung": { label: "Swung", abbrev: "Swng" }, + "system.$traits.halfSword": { + label: "Half Sword", + abbrev: "HlfSwd", + }, + "system.$traits.twoPartLen": { + label: "2H Length", + abbrev: "2HLen", + }, + }); + } + + get intrinsicActions() { + let actions = super.intrinsicActions + .filter((a) => a.name !== "attack") + .map((a) => { + if ( + a.contextGroup === sohl.SohlContextMenu.sortGroups.Default + ) { + a.contextGroup = sohl.SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push({ + functionName: "automatedAttack", + name: "Automated Attack", + contextIconClass: "fas fa-sword", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$attack.disabled; + }, + contextGroup: sohl.SohlContextMenu.sortGroups.Default, + }); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + async automatedAttack( + speaker = null, + actor = null, + token = null, + character = null, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-bleed-stop-test`, + title = `${this.item.label} Bleeding Stoppage Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + }, + ) { + ({ speaker, actor, token, character } = + sohl.SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + })); + + // TODO - Melee Automated Attack + ui.notifications.warn("Melee Automated Attack Not Implemented"); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + foundry.utils.mergeObject(this.$traits, { + couched: false, + noAttack: false, + noBlock: false, + slow: false, + thrust: false, + swung: false, + halfSword: false, + twoPartLen: 0, + }); + } + + processSiblings() { + super.processSiblings(); + + const strength = this.actor.getTraitByAbbrev("str"); + if (strength) { + const strValue = strength.system.$score?.effective || 0; + const strImpactMod = LgndUtility.strImpactMod(strValue); + if (strImpactMod && !this.$traits.noStrMod) { + this.$impact.add( + "Strength Impact Modifier", + "StrImpMod", + strImpactMod, + ); + } + } + + if (this.actor.system.$engagedOpponents.effective > 1) { + const outnumberedPenalty = + this.actor.system.$engagedOpponents.effective * -10; + this.$defense.block.add("Outnumbered", "Outn", outnumberedPenalty); + this.$defense.counterstrike.add( + "Outnumbered", + "Outn", + outnumberedPenalty, + ); + } + } +} + +class LgndMissileWeaponStrikeModeItemData extends LgndStrikeModeItemDataMixin( + sohl.MissileWeaponStrikeModeItemData, +) { + $baseRange; + $draw; + $canDraw; + $pull; + + get maxVolleyMult() { + return this.item.getFlag("sohl", "legendary.maxVolleyMult") || 0; + } + + get baseRangeBase() { + return this.item.getFlag("sohl", "legendary.baseRangeBase") || 0; + } + + get drawBase() { + return this.item.getFlag("sohl", "legendary.drawBase") || 0; + } + + get zoneDie() { + return ( + this.item.nestedIn?.getFlag("sohl", "legendary.zoneDie") || + this.item.getFlag("sohl", "legendary.zoneDie") || + 0 + ); + } + + get intrinsicActions() { + let actions = super.intrinsicActions + .filter((a) => a.name !== "attack") + .map((a) => { + if ( + a.contextGroup === sohl.SohlContextMenu.sortGroups.Default + ) { + a.contextGroup = sohl.SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push( + { + functionName: "automatedAttack", + name: "Automated Attack", + contextIconClass: "fas fa-bow-arrow", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$attack.disabled; + }, + contextGroup: sohl.SohlContextMenu.sortGroups.Default, + }, + { + functionName: "directAttackTest", + name: "Direct Attack Test", + contextIconClass: "fas fa-location-arrow-up fa-rotate-90", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$attack.disabled; + }, + contextGroup: sohl.SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "volleyAttackTest", + name: "Volley Attack Test", + contextIconClass: "fas fa-location-arrow", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$attack.disabled; + }, + contextGroup: sohl.SohlContextMenu.sortGroups.Primary, + }, + ); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + async automatedAttack( + speaker = null, + actor = null, + token = null, + character = null, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-bleed-stop-test`, + title = `${this.item.label} Bleeding Stoppage Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + }, + ) { + ({ speaker, actor, token, character } = + sohl.SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + })); + + // TODO - Missile Automated Attack + ui.notifications.warn("Missile Automated Attack Not Implemented"); + } + + volleyAttack( + speaker = null, + actor = null, + token = null, + character = null, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-volley-attack`, + title = `${this.item.label} Volley Attack`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + }, + ) { + ({ speaker, actor, token, character } = + sohl.SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + })); + + // TODO - Missile Volley Attack + ui.notifications.warn("Missile Volley Attack Not Implemented"); + } + + directAttack( + speaker = null, + actor = null, + token = null, + character = null, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-direct-missile-attack`, + title = `${this.item.label} Direct Missile Attack`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + }, + ) { + ({ speaker, actor, token, character } = + sohl.SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + })); + + // TODO - Missile Direct Attack + ui.notifications.warn("Missile Direct Attack Not Implemented"); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + foundry.utils.mergeObject(this.$traits, { + armorReduction: 0, + bleed: false, + }); + this.$maxVolleyMult = this.item.getFlag( + "sohl", + "legendary.maxVolleyMult", + ); + this.$baseRange = new sohl.ValueModifier(this).setBase( + this.item.getFlag("sohl", "legendary.baseRangeBase"), + ); + this.$draw = new sohl.ValueModifier(this).setBase( + this.item.getFlag("sohl", "legendary.drawBase"), + ); + + this.$draw = new sohl.ValueModifier(this).setBase(this.drawBase); + this.$pull = new sohl.ValueModifier(this); + } + + postProcess() { + super.postProcess(); + const strength = this.actor.getTraitByAbbrev("str"); + if (strength) { + const strML = strength.system.$masteryLevel?.effective || 0; + this.$pull.add("Strength ML", "StrML", strML); + } + if (this.$assocSkill) { + this.$pull.add( + `${this.$assocSkill.name}`, + "AssocSkill", + this.$assocSkill.system.$masteryLevel.effective, + ); + } + + this.$canDraw = + !this.$pull.disabled && + this.$pull.effective >= this.$draw.effective; + this.$attack.disabled ||= !this.$canDraw; + } +} + +class LgndCombatTechniqueStrikeModeItemData extends LgndStrikeModeItemDataMixin( + sohl.CombatTechniqueStrikeModeItemData, +) { + static get effectKeys() { + return sohl.Utility.simpleMerge(super.effectKeys, { + "system.$traits.strRoll": { + label: "Strength Roll", + abbrev: "StrRoll", + }, + }); + } + + get zoneDie() { + return this.item.getFlag("sohl", "legendary.zoneDie") || 0; + } + + get reachBase() { + return this.item.getFlag("sohl", "legendary.reachBase") || 0; + } + + get intrinsicActions() { + let actions = super.intrinsicActions + .filter((a) => a.name !== "attack") + .map((a) => { + if ( + a.contextGroup === sohl.SohlContextMenu.sortGroups.Default + ) { + a.contextGroup = sohl.SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push({ + functionName: "assistedAttack", + name: "Automated Attack", + contextIconClass: "fas fa-hand-fist fa-rotate-90", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$attack.disabled; + }, + contextGroup: sohl.SohlContextMenu.sortGroups.Default, + }); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + async automatedAttack( + speaker = null, + actor = null, + token = null, + character = null, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-bleed-stop-test`, + title = `${this.item.label} Bleeding Stoppage Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + }, + ) { + ({ speaker, actor, token, character } = + sohl.SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + })); + + // TODO - Combat Technique Automated Attack + ui.notifications.warn( + "Combat Technique Automated Attack Not Implemented", + ); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + foundry.utils.mergeObject(this.$traits, { + strRoll: false, + }); + + const reachBase = this.item.getFlag("sohl", "legendary.reachBase") || 0; + this.$reach.setBase(reachBase); + } + + processSiblings() { + super.processSiblings(); + const size = this.actor.getTraitByAbbrev("siz"); + if (size?.system.$params) { + this.$reach.add( + `${size.system.displayVal} Creature Size`, + "CSize", + size.system.$params.reachMod, + ); + } + + const strength = this.actor.getTraitByAbbrev("str"); + if (strength) { + const strValue = strength.system.$score?.effective || 0; + const strImpactMod = LgndUtility.strImpactMod(strValue); + if (strImpactMod && !this.$traits.noStrMod) { + this.$impact.add( + "Strength Impact Modifier", + "StrImpMod", + strImpactMod, + ); + } + } + } + + postProcess() { + super.postProcess(); + if (this.item.nestedIn instanceof sohl.GearItemData) { + this.$reach.setBase(this.item.nestedIn.system.lengthBase); + const size = this.actor.getTraitByAbbrev("siz"); + if (size?.system.$params) { + this.$reach.add( + `${size.system.displayVal} Creature Size`, + "CSize", + size.system.$params.reachMod, + ); + } + } + } +} + +/*===============================================================*/ +/* Legendary Data Model Classes */ +/*===============================================================*/ + +function LgndMasteryLevelItemDataMixin(BaseMLID) { + return class LgndMasteryLevelItemData extends BaseMLID { + get isFateAllowed() { + return ( + super.isFateAllowed && + !this.actor.system.$hasAuralShock && + !this.skillBaseFormula?.includes("@aur") + ); + } + + /** @override */ + applyPenalties() { + // Apply Encumbrance Penalty to Mastery Level + const sbAttrs = this.skillBase.attributes; + if (sbAttrs.at(0) === "Agility") { + const enc = this.actor.system.$encumbrance.total; + if (enc) this.$masteryLevel.add("Encumbrance", "Enc", -enc); + } + } + + prepareBaseData() { + super.prepareBaseData(); + this.$masteryLevel &&= LgndMasteryLevelModifier.create( + this.$masteryLevel, + { parent: this }, + ); + } + }; +} + +class LgndDomainItemData extends sohl.DomainItemData { + $divineAspects; + + prepareBaseData() { + super.prepareBaseData(); + const aspects = this.item.getFlag("sohl", "legendary.aspects") || []; + this.$divineAspects = new Set(aspects); + } +} + +class LgndInjuryItemData extends sohl.InjuryItemData { + static get aspectTypes() { + return { + blunt: "Blunt", + edged: "Edged", + piercing: "Piercing", + fire: "Fire", + frost: "Frost", + projectile: "Projectile", + }; + } + + static calcZoneDieFormula(die, offset) { + const result = + (die ? "d" + die + (offset < 0 ? "" : "+") : "") + offset; + return result; + } + + get isBarbed() { + return this.item.getFlag("sohl", "legendary.isBarbed"); + } + + set isBarbed(val) { + this.item.setFlag("sohl", "legendary.isBarbed", !!val); + } + + get isGlancing() { + return this.item.getFlag("sohl", "legendary.isGlancing"); + } + + set isGlancing(val) { + this.item.setFlag("sohl", "legendary.isGlancing", !!val); + } + + get extraBleedRisk() { + return this.item.getFlag("sohl", "legendary.extraBleedRisk"); + } + + set extraBleedRisk(val) { + this.item.setFlag("sohl", "legendary.extraBleedRisk", !!val); + } + + get permanentImpairment() { + return this.item.getFlag("sohl", "legendary.permanentImpairment"); + } + + set permanentImpairment(val) { + if (typeof val === "number") { + val = Math.max(0, val); + this.item.setFlag("sohl", "legendary.permanentImpairment", val); + } + } + + get untreatedHealing() { + const treatSev = this.$healingRate?.severity; + let treatmt = (treatSev !== "0" + ? LGND.CONST.treatment[this.aspect]?.[treatSev]?.["cf"] + : { + hr: 6, + infect: false, + impair: false, + bleed: false, + newInj: -1, + }) || { + hr: 5, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }; + return treatmt; + } + + prepareBaseData() { + super.prepareBaseData(); + const newIL = new sohl.ValueModifier(this, { + severity: (thisVM) => { + let severity; + if (thisVM.effective <= 0) { + severity = "0"; + } else if (thisVM.effective == 1) { + severity = "M1"; + } else if (thisVM.effective <= 3) { + severity = `S${thisVM.effective}`; + } else { + severity = `G${thisVM.effective}`; + } + return severity; + }, + }); + this.$injuryLevel = newIL.addVM(this.$injuryLevel, { + includeBase: true, + }); + } + /** @override */ + postProcess() { + super.postProcess(); + if (!this.isInEffect) return; + + // Apply this injury as impairment to bodylocations + const blItem = this.actor.items.find( + (it) => + it.system instanceof sohl.BodyLocationItemData && + it.name === this.bodyLocation, + ); + if (blItem) { + const blData = blItem.system; + if (this.injuryLevel.effective > 3) { + blData.impairment.setProperty("unusable", true); + blData.impairment.set( + `${this.item.name} Grevious Injury: Unusable`, + "GInjUnusable", + 0, + ); + } else if (this.injuryLevel.effective > 1) { + blData.impairment.add( + `${this.item.name} Serious Injury`, + "SInj", + -10, + ); + } else if ( + this.injuryLevel.effective > 0 && + this.healingRate.effective < 6 && + this.isInEffect + ) { + blData.impairment.add( + `${this.item.name} Minor Injury`, + "MInj", + -5, + ); + } + } + + // const injuryDurationDays = Math.trunc((game.time.worldTime - this.item.system.createdTime) / 86400); + if (this.alData.mayBePermanent) { + //const permanentImpairment = Math.min(25, Math.trunc(injuryDurationDays / 20) * 5); + // FIXME - Permanent Injury + } + } +} + +class LgndMysticalAbilityItemData extends LgndMasteryLevelItemDataMixin( + sohl.MysticalAbilityItemData, +) {} + +class LgndTraitItemData extends sohl.TraitItemData { + get actionBodyParts() { + return this.item.getFlag("sohl", "legendary.actionBodyParts") || []; + } + + get diceFormula() { + return this.item.getFlag("sohl", "legendary.diceFormula"); + } + + prepareBaseData() { + super.prepareBaseData(); + this.$masteryLevel &&= LgndMasteryLevelModifier.create( + this.$masteryLevel, + { + parent: this, + }, + ); + } + + processSiblings() { + super.processSiblings(); + if (this.isNumeric) { + this.actionBodyParts.forEach((bp) => { + const bodyPart = sohl.IterWrap.create( + this.actor.allItems(), + ).find( + (it) => + it.system instanceof sohl.BodyPartItemData && + it.name === bp, + ); + if (bodyPart) { + if (bodyPart.system.$impairment.unusable) { + this.$masteryLevel.set( + `${this.item.name} Unusable`, + `${this.abbrev}Unusable`, + 0, + ); + } else if (bodyPart.system.$impairment.value) { + this.$masteryLevel.add( + `${this.item.name} Impairment`, + `${this.abbrev}Imp`, + bodyPart.system.$impairment.value, + ); + } + } + }); + } + + if (this.intensity === "attribute" && this.subType === "physique") { + sohl.IterWrap.create(this.actor.allItems()).forEach((it) => { + if ( + it.system instanceof sohl.AfflictionItemData && + it.system.subType === "fatigue" + ) { + this.$masteryLevel.add( + it.name, + it.system.constructor.subTypeAbbreviation[ + it.system.subType + ], + -it.system.$level.effective, + ); + } + }); + } + } +} + +class LgndSkillItemData extends LgndMasteryLevelItemDataMixin( + sohl.SkillItemData, +) { + get actionBodyParts() { + return this.item.getFlag("sohl", "legendary.actionBodyParts") || []; + } + + get initSM() { + return this.item.getFlag("sohl", "legendary.initSM") || 0; + } + + static get sunsignTypes() { + return { + social: "water", + nature: "earth", + craft: "metal", + lore: "aura", + language: "aura", + script: "aura", + ritual: "aura", + physical: "air", + combat: "fire", + esoteric: null, + }; + } + + processSiblings() { + super.processSiblings(); + this.actionBodyParts.forEach((bp) => { + const bodyPart = sohl.IterWrap.create(this.actor.allItems()).find( + (it) => + it.system instanceof sohl.BodyPartItemData && + it.name === bp, + ); + if (bodyPart) { + if (bodyPart.system.$impairment.unusable) { + this.$masteryLevel.set( + `${this.item.name} Unusable`, + `${this.abbrev}Unusable`, + 0, + ); + } else if (bodyPart.system.$impairment.value) { + this.$masteryLevel.add( + `${this.item.name} Impairment`, + `${this.abbrev}Imp`, + bodyPart.system.$impairment.value, + ); + } + } + }); + + if (["craft", "combat", "physical"].includes(this.subType)) { + sohl.IterWrap.create(this.actor.allItems()).forEach((it) => { + if ( + it.system instanceof sohl.AfflictionItemData && + it.system.subType === "fatigue" + ) { + this.$masteryLevel.add( + it.name, + it.system.constructor.subTypeAbbreviation[ + it.system.subType + ], + -it.system.$level.effective, + ); + } + }); + } + } +} + +class LgndAfflictionItemData extends sohl.AfflictionItemData { + static get fatigueKinds() { + return { + windedness: "Windedness", + weariness: "Weariness", + weakness: "Weakness", + }; + } + + static get afflictionType() { + return foundry.utils.mergeObject(super.afflictionType, { + psyche: "Psyche Stress", + auralshock: "Aural Shock", + }); + } + + static get privationKinds() { + return { + asphixia: "Asphixia", + cold: "Cold Exposure", + heat: "Heat Exposure", + starvation: "Starvation", + dehydration: "Dehydration", + nosleep: "Sleep Deprivation", + }; + } + static get fearLevels() { + return [ + "No Effect", + "Brave", + "Steady", + "Afraid", + "Terrified", + "Catatonic", + ]; + } + + static get moraleLevels() { + return [ + "No Effect", + "Brave", + "Steady", + "Withdrawing", + "Routed", + "Catatonic", + ]; + } + + get intrinsicActions() { + let actions = super.intrinsicActions; + actions.push({ + functionName: "infectionCourseTest", + name: "Infection Course Test", + contextIconClass: "fas fa-bullseye", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const affliction = fromUuidSync(li.dataset.uuid); + return ( + affliction && + affliction.system.subType === "infection" && + !affliction.system.$healingRate.effective < 6 + ); + }, + contextGroup: sohl.SohlContextMenu.sortGroups.Primary, + }); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + /** @override */ + setupVirtualItems() { + super.setupVirtualItems(); + if (["privation", "infection"].includes(this.subType)) { + let weakness = 0; + if (this.$healingRate.effective <= 2) { + weakness = 10; + } else if (this.$healingRate.effective <= 4) { + weakness = 5; + } + if (weakness) { + this.item.constructor.create( + { + name: `${this.item.name} Fatigue`, + type: sohl.AfflictionItemData.typeName, + "system.subType": "weakness", + "system.fatigueBase": weakness, + }, + { cause: this.item, parent: this.actor }, + ); + } + } + } +} + +class LgndBodyZoneItemData extends sohl.BodyZoneItemData { + // List of possible dice for Zone Dice. + static get dice() { + return { + 0: "None", + 1: "d1", + 2: "d2", + 3: "d3", + 4: "d4", + 5: "d5", + 6: "d6", + 8: "d8", + 10: "d10", + 12: "d12", + 16: "d16", + 20: "d20", + 24: "d24", + 32: "d32", + 40: "d40", + 48: "d48", + }; + } + + get zoneNumbers() { + return this.item.getFlag("sohl", "legendary.zones") || []; + } + + set zoneNumbers(zones) { + let result = []; + if (Array.isArray(zones)) { + result = zones; + } else if (typeof zones === "string") { + result = zones.split(/.*,.*/).reduce((ary, zone) => { + const num = Number.parseInt(zone, 10); + if (!Number.isNaN(num) && !ary.includes(num)) ary.push(num); + }, result); + } else { + throw new Error(`Invalid zones '${zones}'`); + } + result.sort((a, b) => a - b); + this.item.setFlag("sohl", "legendary.zones", result); + } + + get zoneNumbersLabel() { + return this.zoneNumbers.join(","); + } + + get affectsMobility() { + return !!this.item.getFlag("sohl", "legendary.affectsMobility"); + } + + get affectedSkills() { + return this.item.getFlag("sohl", "legendary.affectedSkills") || []; + } + + get affectedAttributes() { + return this.item.getFlag("sohl", "legendary.affectedAttributes") || []; + } + + static get maxZoneDie() { + return Object.values(this.dice).at(-1); + } + + /** @override */ + processSiblings() { + super.processSiblings(); + this.actor.maxZones = Math.max( + this.actor.system.maxZones, + ...this.zoneNumbers, + ); + } +} + +class LgndBodyPartItemData extends sohl.BodyPartItemData { + /** + * Represents body part impairment based on injuries. + * If body part is injured, impairment will be less than + * zero. Values greater than zero are treated as zero + * impairment. + * + * @type {ValueModifier} + */ + $impairment; + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$impairment = new sohl.ValueModifier(this, { + unusable: false, + value: (thisVM) => { + Math.min(thisVM.effective, 0); + }, + }); + } + + /** @override */ + processSiblings() { + super.processSiblings(); + this.actor.system.$health.max += this.$health.effective; + + // Add this body part's health to overall actor health. + // If this body part is unusable, or impairment is < -10, + // then none of the body part health is added to the + // actor health. + if (!this.$impairment.unusable) { + if (!this.$impairment.value) { + // If no impairment, then add full body part health + this.actor.system.$health.add( + `${this.item.name} Impairment`, + "Impair", + this.$health.effective, + ); + } else if (this.$impairment.effective >= -5) { + // If minor impairment, then add half body part health + this.actor.system.$health.add( + `${this.item.name} Impairment`, + "Impair", + Math.floor(this.$health.effective / 2), + ); + } else if (this.$impairment.value >= -10) { + // If major impairment, then add 1/4 body part health + this.actor.system.$health.add( + `${this.item.name} Impairment`, + "Impair", + Math.floor(this.$health.effective / 4), + ); + } + } else { + // Body parts marked "unusable" can never hold anything. + if (this.heldItem?.system instanceof sohl.GearItemData) { + if (this.heldItem.system.isHeldBy.includes(this.item.id)) { + ui.notifications.warn( + `${this.item.name} is unusable, so dropping everything being held in the body part`, + ); + this.update({ "system.heldItem": "" }); + } + } + } + } +} + +class LgndBodyLocationItemData extends sohl.BodyLocationItemData { + $impairment; + + get isRigid() { + return this.item.getFlag("sohl", "legendary.bleedingSevThreshold"); + } + + get bleedingSevThreshold() { + return this.item.getFlag("sohl", "legendary.isRigid"); + } + + get amputatePenalty() { + return this.item.getFlag("sohl", "legendary.amputatePenalty"); + } + + get shockValue() { + return this.item.getFlag("sohl", "legendary.shockValue"); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$impairment = new sohl.ValueModifier(this, { unusable: false }); + } + + prepareSiblings() { + super.prepareSiblings(); + // biome-ignore lint/correctness/noUnusedVariables: + let thisIsUnusable = this.$impairment.unusable; + + const bpItem = this.item.nestedIn; + if (bpItem) { + const bpImp = bpItem.system.$impairment; + if (this.$impairment.effective) { + bpImp.addVM(this.$impairment); + } + + if (this.$impairment.unusable) { + bpImp.$impairment.unusable = true; + } + } + } +} + +class LgndArmorGearItemData extends sohl.ArmorGearItemData { + $encumbrance; + + static get effectKeys() { + return sohl.Utility.simpleMerge(super.effectKeys, super.effectKeys, { + "system.$encumbrance": { + label: "Encumbrance", + abbrev: "Enc", + }, + }); + } + + get encumbrance() { + return this.item.getFlag("sohl", "legendary.encumbrance") || 0; + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + + this.$encumbrance = new sohl.ValueModifier(this); + this.$encumbrance.setBase(this.encumbrance); + + // Armor, when equipped, is weightless + if (this.isEquipped) { + this.$weight.setBase(0); + } + } + + /** @override */ + processSiblings() { + super.processSiblings(); + + if (this.$encumbrance && this.isEquipped) { + // Armor, when worn, may have an encumbrance effect. If present, use it. + this.actor.system.$encumbrance.add( + `this.item.name Encumbrance`, + "Enc", + this.$encumbrance, + ); + } + } +} +class LgndWeaponGearItemData extends sohl.WeaponGearItemData { + $length; + $heft; + + get lengthBase() { + return this.item.getFlag("sohl", "legendary.lengthBase") || 0; + } + + get heftBase() { + return this.item.getFlag("sohl", "legendary.heftBase") || 0; + } + + prepareBaseData() { + super.prepareBaseData(); + + this.$length = new sohl.ValueModifier(this); + this.$length.setBase(this.lengthBase); + + this.$heft = new sohl.ValueModifier(this); + this.$heft.setBase(this.heftBase); + } + + setupVirtualItems() { + super.setupVirtualItems(); + this.items.forEach((it) => { + if ( + !it.system.transfer && + it.system instanceof sohl.MissileWeaponStrikeModeItemData + ) { + const missileSM = it; + if ( + missileSM.system.projectileType && + missileSM.system.projectileType !== "none" + ) { + this.actor.itemTypes.projectilegear.forEach((proj, idx) => { + if ( + proj.system.quantity > 0 && + proj.system.subType === + missileSM.system.projectileType + ) { + const itemData = missileSM.toObject(); + itemData._id = foundry.utils.randomID(); + itemData.sort += idx; + if (proj.system.impactBase.die >= 0) { + itemData.system.impactBase.die = + proj.system.impactBase.die; + } + if (proj.system.impactBase.aspect) { + itemData.system.impactBase.aspect = + proj.system.impactBase.aspect; + } + if (proj.system.impactBase.modifier >= 0) { + itemData.system.impactBase.modifier = + proj.system.impactBase.modifier; + } + itemData.name = proj.name; + + itemData.effects.push( + ...proj.effects.contents.map((e) => + e.toObject(), + ), + ); + const item = new sohl.SohlItem(itemData, { + parent: this.item.actor, + }); + item.cause = this.item; + } + }); + } + } + }); + } +} + +// class LgndWeaponGearItemData extends LgndGearItemDataMixin(sohl.WeaponGearRuleset) { + +// /** @override */ +// setupBaseDataNoActor() { +// super.setupBaseDataNoActor(); +// } + +// /** @override */ +// setupDerivedDataHasActor() { +// super.setupDerivedDataHasActor(); +// this.strikeModes.forEach(sm => { +// sm.item = this; +// if (!sm.disabled) { +// sm.baseRange = (new sohl.ValueModifier(this)).setBase(sm.baseRangeBase); +// sm.draw = (new sohl.ValueModifier(this)).setBase(sm.drawBase); +// sm.impact = (new LgndImpactModifier(this, sm.impactBase.aspect, sm.impactBase.die)) +// .setBase(sm.impactBase.modifier); +// } +// }); +// } + +// /** @override */ +// setupDerivedDataNoActor() { +// super.setupDerivedDataNoActor(); +// } + +// /** @override */ +// setupDerivedDataHasActor() { +// super.setupDerivedDataHasActor(); +// } + +// /** @override */ +// postProcess() { +// super.postProcess(); +// // Create all of the weapons and missiles from strike modes +// this.strikeModes.forEach(sm => { +// // Add strength impact modifier unless directed not to +// const strImpMod = this.actor.system.strengthMod; +// if (strImpMod && !sm.traits.noStrMod) { +// sm.impact.add(LGND.CONST.MODS.STRIMPMOD.NAME, LGND.CONST.MODS.STRIMPMOD.ABBR, strImpMod); +// } + +// // If baseRangeBase is 0 it is a melee strike mode, otherwise +// // it is a missile strike mode +// if (!sm.baseRangeBase) { +// const weaponData = foundry.utils.mergeObject({ +// id: `${this.item.id}_${sm.name}`, +// type: 'weapon', +// weaponId: this.item.id, +// parentId: this.actor.id, +// mode: sm.name, +// name: `${this.item.name} (${sm.name})`, +// img: this.item.img, +// assocSkill: this.assocSkill, +// quantity: this.quantity, +// heldBy: this.heldBy, +// twoHanded: this.heldBy.length > 1, +// heft: this.heft, +// length: this.length, +// reach: new sohl.ValueModifier(this).setBase(this.length.effective), +// notes: this.notes +// }, sm); +// weaponData.uuid = this.actor.uuid + '.Weapon.' + weaponData.id; +// const smSkillMod = this.actor.getCombatStat(weaponData.assocSkill); +// weaponData.attack.addVM(smSkillMod, { includeBase: true }); +// weaponData.defense.block.addVM(smSkillMod, { includeBase: true }); +// weaponData.defense.counterstrike.addVM(smSkillMod, { includeBase: true }); + +// if (weaponData.twoHanded) { +// // When a weapon is used two-handed, it's heft is reduced by 6 +// weaponData.heft.add("Two Handed", "2H", -6); + +// // Add in two-handed length adjustment +// if (sm.traits.twoPartLen) { +// weaponData.length.add("Two Handed", "2H", sm.traits.twoPartLen); +// } + +// if (weaponData.traits.swung && strValue >= weaponData.heft.base) { +// // If the weapon is swung and STR >= the unadjusted heft, +// // add one to impact. +// weaponData.impact.add("Swung Strength Modifier", "SwSTRMod", 1); +// } +// } + +// const heftPenalty = Math.max(0, weaponData.heft.effective - strValue) * -5; +// if (heftPenalty) { +// weaponData.attack.add(sohl.SOHL.CONST.MODS.HEFT.NAME, sohl.SOHL.CONST.MODS.HEFT.ABBR, heftPenalty); +// weaponData.defense.block.add(sohl.SOHL.CONST.MODS.HEFT.NAME, sohl.SOHL.CONST.MODS.HEFT.ABBR, heftPenalty); +// weaponData.defense.counterstrike.add(sohl.SOHL.CONST.MODS.HEFT.NAME, sohl.SOHL.CONST.MODS.HEFT.ABBR, heftPenalty); +// } + +// if (this.actor.system.engagedOpponents.effective > 1) { +// const outnumberedPenalty = this.actor.system.engagedOpponents.effective * -10; +// weaponData.defense.block.add(sohl.SOHL.CONST.MODS.OUTNUMBERED.NAME, sohl.SOHL.CONST.MODS.OUTNUMBERED.ABBR, outnumberedPenalty); +// weaponData.defense.counterstrike.add(sohl.SOHL.CONST.MODS.OUTNUMBERED.NAME, sohl.SOHL.CONST.MODS.OUTNUMBERED.ABBR, outnumberedPenalty); +// } + +// // Calculate Weapon Reach +// const sizeReachMod = sohl.SOHL.CONST.CREATURESIZE[this.actor.system.size]?.reachMod || 0; +// if (sizeReachMod) weaponData.reach.add("Creature Size", "Size", sizeReachMod); +// this.actor.system.combatReach = Math.max(this.actor.system.combatReach, weaponData.reach.effective); + +// this.actor.system.weapons.push(weaponData); +// } else { +// const missileData = foundry.utils.mergeObject({ +// id: `${this.item.id}_${sm.name}`, +// type: 'missile', +// weaponId: this.item.id, +// projectileId: "", +// parentId: this.actor.id, +// name: this.actor.name, +// img: this.actor.img, +// cantDraw: false, +// range: '', +// zoneDie: 0, +// }, sm); +// missileData.uuid = this.actor.uuid + '.Missile.' + missileData.id; +// const mslSkillMods = this.actor.getCombatStat(missileData.assocSkill); +// missileData.attack.addVM(mslSkillMods, { includeBase: true }); + +// if ((sm.projectileType || 'None') !== 'None') { + +// const projectiles = this.actor.items.filter(it => it.type === sohl.ProjectileGearItemData.typeName && it.system.isCarried && it.system.quantity && it.system.container === 'on-person' && it.system.type === sm.projectileType); +// projectiles.forEach(proj => { +// const projData = proj.system; + +// const maxVM = Math.max(missileData.maxVolleyMult, projData.maxVolleyMult); + +// for (const rng of sohl.SOHL.CONST.RANGES) { +// if (sohl.SOHL.CONST.RANGES.indexOf(rng) > maxVM) continue; + +// const mdata = foundry.utils.deepClone(missileData); +// mdata.id += `_${proj.id}_${rng}`; +// mdata.uuid = this.actor.uuid + '.Missile.' + mdata.id; +// mdata.projectileId = proj.id; +// mdata.name += ` (${proj.name})`; +// mdata.quantity = projData.quantity; +// mdata.range = rng; + +// // Handle copying traits from projectile +// mdata.traits.extraBleedRisk &&= projData.traits.extraBleedRisk; +// mdata.traits.halfImpact &&= projData.traits.halfImpact; +// mdata.traits.impactTA ||= mdata.traits.impactTA; + +// // Copy attack mods +// mdata.canDraw = this.actor.system.pull.effective >= missile.draw.effective; +// mdata.pull = this.actor.system.pull.effective; +// mdata.attack.addVM(projData.attack); +// mdata.attack.successLevelMod = +// mdata.attack.successLevelMod + +// projData.attack.successLevelMod; + +// // Override missile impact value with projectile impact if necessary +// if (projData.impact.die >= 0) mdata.impact.die = projData.impact.die; +// mdata.impact.addVM(projData.impact); +// if (projData.impact.base > 0) { +// mdata.impact.setBase(projData.impact.base); +// } +// if (projData.impact.armorReduction.effective) { +// mdata.impact.armorReduction.add(`Projectile`, 'Proj', mdata.impact.armorReduction.effective); +// } +// if (projData.impact.aspect) mdata.impact.aspect = projData.impact.aspect; + +// switch (rng) { +// case 'PB': +// mdata.zoneDie = 6; +// mdata.impact.add(sohl.SOHL.CONST.MODS.PBIMPACT.NAME, sohl.SOHL.CONST.MODS.PBIMPACT.ABBR, 2); +// mdata.distance = Math.floor(sm.baseRange.effective / 2) || 0; +// if (projData.type !== 'Bullet') { +// mdata.attack.add(sohl.SOHL.CONST.MODS.PBIMPACT.NAME, sohl.SOHL.CONST.MODS.PBIMPACT.ABBR, 10); +// } +// break; + +// case 'Direct': +// mdata.zoneDie = 8; +// mdata.distance = sm.baseRange.effective || 0; +// break; + +// case 'V2': +// mdata.zoneDie = 10; +// mdata.impact.add(sohl.SOHL.CONST.MODS.V2RANGE.NAME, sohl.SOHL.CONST.MODS.V2RANGE.ABBR, -2); +// mdata.distance = (sm.baseRange.effective * 2) || 0; +// break; + +// case 'V3': +// mdata.zoneDie = 10; +// mdata.impact.add(sohl.SOHL.CONST.MODS.V3RANGE.NAME, sohl.SOHL.CONST.MODS.V3RANGE.ABBR, -3); +// mdata.distance = (sm.baseRange.effective * 3) || 0; +// break; + +// case 'V4': +// mdata.zoneDie = 10; +// mdata.impact.add(sohl.SOHL.CONST.MODS.V4RANGE.NAME, sohl.SOHL.CONST.MODS.V4RANGE.ABBR, -4); +// mdata.distance = (sm.baseRange.effective * 4) || 0; +// break; +// } + +// mdata.traits = foundry.utils.mergeObject(mdata.traits, projData.traits); + +// if (projData.notes) { +// mdata.notes += (mdata.notes ? ", " : "") + projData.notes; +// } + +// actorData.missiles.push(mdata); +// }; +// }); +// } else { +// for (const rng of sohl.SOHL.CONST.RANGES) { +// if (sohl.SOHL.CONST.RANGES.indexOf(rng) > sm.maxVolleyMult) continue; +// const mdata = foundry.utils.deepClone(missileData); +// mdata.id += `_${rng}`; +// mdata.uuid = this.actor.uuid + '.Missile.' + mdata.id; +// mdata.name += ` (${sm.name})`; +// mdata.range = rng; +// const heftPenalty = Math.max(0, mdata.heft - strValue) * -5; +// if (heftPenalty) { +// mdata.attack.add(sohl.SOHL.CONST.MODS.HEFT.NAME, sohl.SOHL.CONST.MODS.HEFT.ABBR, heftPenalty); +// } + +// switch (rng) { +// case 'PB': +// mdata.distance = Math.floor(sm.baseRange.effective / 2) || 0; +// mdata.attack.add(sohl.SOHL.CONST.MODS.PBATTACK.NAME, sohl.SOHL.CONST.MODS.PBATTACK.ABBR, 10); +// mdata.impact.add(sohl.SOHL.CONST.MODS.PBIMPACT.NAME, sohl.SOHL.CONST.MODS.PBIMPACT.ABBR, 2); +// break; + +// case 'Direct': +// mdata.zoneDie = 8; +// mdata.distance = sm.baseRange.effective || 0; +// break; + +// case 'V2': +// mdata.zoneDie = 10; +// mdata.impact.add(sohl.SOHL.CONST.MODS.V2RANGE.NAME, sohl.SOHL.CONST.MODS.V2RANGE.ABBR, -2); +// mdata.distance = (sm.baseRange.effective * 2) || 0; +// break; + +// case 'V3': +// mdata.zoneDie = 10; +// mdata.impact.add(sohl.SOHL.CONST.MODS.V3RANGE.NAME, sohl.SOHL.CONST.MODS.V3RANGE.ABBR, -3); +// mdata.distance = (sm.baseRange.effective * 3) || 0; +// break; + +// case 'V4': +// mdata.zoneDie = 10; +// mdata.impact.add(sohl.SOHL.CONST.MODS.V4RANGE.NAME, sohl.SOHL.CONST.MODS.V4RANGE.ABBR, -4); +// mdata.distance = (sm.baseRange.effective * 4) || 0; +// break; +// } + +// this.actor.system.missiles.push(mdata); +// } +// } +// } +// }); +// } +// } + +/*===============================================================*/ +/* Legendary Classes */ +/*===============================================================*/ + +export class LgndTour extends Tour { + actor; + item; + + async _preStep() { + await super._preStep(); + const currentStep = this.currentStep; + + if (currentStep.actor) { + this.actor = await CONFIG.Actor.documentClass.create( + currentStep.actor, + ); + await this.actor.sheet?._render(true); + } + + if (currentStep.itemName) { + if (!this.actor) { + console.warn("No actor found for step " + currentStep.title); + } + this.item = this.actor?.items.getName(currentStep.itemName); + const app = this.item.sheet; + if (!app.rendered) { + await app._render(true); + } + currentStep.selector = currentStep.selector?.replace( + "itemSheetID", + app.id, + ); + } + + if (currentStep.tab) { + switch (currentStep.tab.parent) { + case LGND.CONST.TOUR_TAB_PARENTS.ACTOR: { + if (!this.actor) { + console.warn("No Actor Found"); + break; + } + const app = this.actor.sheet; + app?.activateTab(currentStep.tab.id); + break; + } + + case LGND.CONST.TOUR_TAB_PARENTS.ITEM: { + if (!this.item) { + console.warn("No Item Found"); + break; + } + const app = this.item.sheet; + app?.activateTab(currentStep.tab.id); + break; + } + } + } + currentStep.selector = currentStep.selector?.replace( + "actorSheetID", + this.actor?.sheet?.id, + ); + } +} + +// class LgndDice { +// /*--------------------------------------------------------------------------------*/ +// /* STANDARD D100 ROLL PROCESSING +// /*--------------------------------------------------------------------------------*/ + +// /** +// * @typedef {Object} D100RollResult +// * @property {string} type +// * @property {string} title +// * @property {string} origTarget +// * @property {object[]} mods +// * @property {number} successLevelMod +// * @property {number} successLevel +// * @property {number} effTarget +// * @property {boolean} isSuccess +// * @property {boolean} isCritical +// * @property {number} rollValue +// * @property {number} rollResult +// * @property {boolean} showResult +// * @property {string} resultText +// * @property {string} resultDesc +// * @property {string} description +// * @property {boolean} isOpposed +// * @property {string} initiator +// * @property {string} targetTokenId +// * @property {string} notes +// * @property {HMItem} item +// * @property {RollResult} roll +// */ + +// /** +// * Performs a standard d100 skill roll, optionally presenting a dialog +// * to collect a modifier (although can be used for any straignt d100 roll +// * that takes an optional modifier and rolls against a target value). +// * +// * Note that the modifier affects the target value, not the die roll. +// * The die roll is always a strait "1d100" roll without modifiers. +// * +// * rollData is expected to contain the following values: +// * target: Target value to check against +// * modifier: Modifier to target value +// * label: The label associated with the 'target' value +// * fastForward: If true, assume no modifier and don't present Dialog +// * noStunPenalty: if true, don't apply the stunned success level penalty +// * speaker: the Speaker to use in Chat +// * rollMode: the rollMode to use +// * actorData: actor data +// * +// * @param {object} rollData +// * @param {string} [rollData.mod] Mod object containing modifiers and effective target for the roll +// * @param {number} [rollData.label] Descriptive text to use in the dialog and chat +// * @param {boolean} [rollData.showSuccessLevel] Flag to determine whether to display the success level +// * @param {object} [rollData.speaker] +// * @param {boolean} [rollData.noStunPenalty] +// * @param {boolean} [rollData.skipDialog] +// * @param {string} [rollData.notes] +// * @param {boolean} [rollData.isOpposed] +// * @param {*} [rollData.initiator] +// * @param {string} targetTokenId +// * +// */ +// static async d100StdRoll(rollData = { mod, label, showSuccessLevel, speaker, noStunPenalty, skipDialog, notes, isOpposed, initiator, targetTokenId }) { +// rollData.speaker = rollData.speaker || ChatMessage.getSpeaker(); + +// const actor = ChatMessage.getSpeakerActor(rollData.speaker); + +// const dialogOptions = foundry.utils.mergeObject({ +// type: rollData.type, +// target: rollData.mod.effective, +// label: rollData.label, +// showSuccessLevel: true, +// }, rollData.mod); + +// dialogOptions.successLevelMod = dialogOptions.successLevelMod || 0; +// if (!rollData.noStunPenalty && actor.system.shock === LGND.CONST.SHOCK.Stunned) dialogOptions.successLevelMod--; + +// // Create the Roll instance +// let rollTestData; +// if (rollData.skipDialog) { +// rollTestData = { +// type: dialogOptions.type, +// diceSides: 100, +// diceNum: 1, +// mods: dialogOptions.mods, +// successLevelMod: dialogOptions.successLevelMod, +// target: dialogOptions.target +// }; +// } else { +// rollTestData = await LgndDice.d100StdDialog(dialogOptions); +// if (!rollTestData) return null; +// } + +// const roll = await LgndDice.rollTest(rollTestData); + +// // If user cancelled the roll, then return immediately +// if (!roll) return null; + +// const notesData = mergeObject(rollData.notesData, { +// actor: rollData.speaker.alias, +// target: roll.target, +// successLevelMod: roll.successLevelMod, +// roll: roll.rollObj.total, +// rollText: roll.description, +// isSuccess: roll.isSuccess, +// isCritical: roll.isCritical, +// successLevel: roll.successLevel, +// successLevelIncr: roll.successLevelIncr, +// isCS: roll.isSuccess && roll.isCritical, +// isMS: roll.isSuccess && !roll.isCritical, +// isMF: !roll.isSuccess && !roll.isCritical, +// isCF: !roll.isSuccess && roll.isCritical +// }); +// const renderedNotes = rollData.notes ? sohl.Utility.stringReplacer(rollData.notes, notesData) : ""; + +// const chatTemplateData = { +// type: roll.type, +// title: rollData.label, +// origTarget: rollData.mod.basis, +// mods: rollTestData.mods, +// successLevelMod: roll.successLevelMod, +// successLevel: roll.successLevel, +// successLevelIncr: roll.successLevelIncr, +// effTarget: roll.target, +// isSuccess: roll.isSuccess, +// isCritical: roll.isCritical, +// rollValue: roll.rollObj.total, +// rollResult: roll.rollObj.total, +// showResult: false, +// resultText: '', +// resultDesc: '', +// description: roll.description, +// isOpposed: rollData.isOpposed, +// initiator: rollData.initiator, +// targetTokenId: rollData.targetTokenId, +// notes: renderedNotes, +// roll: roll +// }; + +// if (roll.isCritical) { +// if (roll.isSuccess && rollData.csResultText) { +// chatTemplateData.resultText = rollData.csResultText; +// chatTemplateData.resultDesc = rollData.csResultDesc; +// } else if (!roll.isSuccess) { +// const isCF5 = roll.lastDigit === 5; +// if (isCF5 && rollData.cf5ResultText) { +// chatTemplateData.resultText = rollData.cf5ResultText; +// chatTemplateData.resultDesc = rollData.cf5ResultDesc; +// } else if (!isCF5 && rollData.cf0ResultText) { +// chatTemplateData.resultText = rollData.cf0ResultText; +// chatTemplateData.resultDesc = rollData.cf0ResultDesc; +// } +// } +// } else { +// if (roll.isSuccess && rollData.msResultText) { +// chatTemplateData.resultText = rollData.msResultText; +// chatTemplateData.resultDesc = rollData.msResultDesc; +// } else if (!roll.isSuccess && rollData.mfResultText) { +// chatTemplateData.resultText = rollData.mfResultText; +// chatTemplateData.resultDesc = rollData.mfResultDesc; +// } +// } + +// // Output to Chat +// if (!rollData.noChat) { +// const chatTemplate = 'systems/sohl/templates/chat/standard-test-card.html'; + +// const html = await renderTemplate(chatTemplate, chatTemplateData); + +// const messageData = { +// user: game.user.id, +// speaker: rollData.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.ROLL, +// sound: CONFIG.sounds.dice, +// roll: roll.rollObj +// }; + +// const messageOptions = { +// rollMode: game.settings.get("core", "rollMode") +// }; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) +// } + +// return chatTemplateData; +// } + +// /** +// * Renders a dialog to get the modifier for a d100 skill roll, and then +// * perform a d100 dice roll to determine results. Returns Roll object +// * representing outcome of die roll, or null if user cancelled dialog. +// * +// * @param {*} dialogOptions +// */ +// static async d100StdDialog(dialogOptions) { + +// // Render modal dialog +// let dlgTemplate = dialogOptions.template || "systems/sohl/templates/dialog/standard-test-dialog.html"; +// let dialogData = { +// target: dialogOptions.effective, +// base: dialogOptions.basis, +// mods: dialogOptions.mods, +// modifier: 0, +// successLevelMod: dialogOptions.successLevelMod +// }; +// const html = await renderTemplate(dlgTemplate, dialogData); + +// // Create the dialog window +// return Dialog.prompt({ +// title: dialogOptions.label, +// content: html.trim(), +// label: "Roll", +// callback: html => { +// const formModifier = Number.parseInt(html[0].querySelector("form").modifier.value, 10); +// const formSuccessLevelMod = Number.parseInt(html[0].querySelector("form").successLevelMod.value, 10); +// const data = foundry.utils.deepClone(dialogData); +// if (formModifier) { +// data.add("Player Modifier", 'PlyrMod', formModifier); +// } +// LgndUtility.applyMods(data); +// data.successLevelMod = formSuccessLevelMod; +// const rollTestData = { +// type: dialogOptions.type, +// target: data.effective, +// data: data, +// diceSides: 100, +// diceNum: 1, +// effMod: data.effMod, +// mods: data.mods, +// successLevelMod: data.successLevelMod +// }; +// return rollTestData; +// }, +// rejectClose: false +// }); +// } + +// static async fateRoll(rollData) { +// const speaker = rollData.speaker || ChatMessage.getSpeaker(); + +// const dialogOptions = foundry.utils.mergeObject({ +// type: rollData.type, +// target: rollData.mod.effective, +// label: rollData.label, +// showSuccessLevel: true, +// }, rollData.mod); + +// // Create the Roll instance +// let rollTestData; +// if (rollData.skipDialog) { +// rollTestData = { +// type: dialogOptions.type, +// diceSides: 100, +// diceNum: 1, +// mods: dialogOptions.mod.mods, +// effMod: dialogOptions.mod.effMod, +// successLevelMod: dialogOptions.mod.successLevelMod, +// target: dialogOptions.mod.effective +// }; +// } else { +// rollTestData = await LgndDice.d100StdDialog(dialogOptions); +// if (!rollTestData) return null; +// } + +// const roll = await LgndDice.rollTest(rollTestData); + +// // If user cancelled the roll, then return immediately +// if (!roll) return null; + +// // Prepare for Chat Message +// const chatTemplate = 'systems/sohl/templates/chat/fate-test-card.html'; + +// const notesData = mergeObject(rollData.notesData, { +// actor: speaker.alias, +// target: rollData.target, +// roll: roll.rollObj.total, +// rollText: roll.description, +// isSuccess: roll.isSuccess, +// isCritical: roll.isCritical, +// isCS: roll.isSuccess && roll.isCritical, +// isMS: roll.isSuccess && !roll.isCritical, +// isMF: !roll.isSuccess && !roll.isCritical, +// isCF: !roll.isSuccess && roll.isCritical +// }); +// const renderedNotes = rollData.notes ? sohl.Utility.stringReplacer(rollData.notes, notesData) : ""; + +// const chatTemplateData = { +// type: roll.type, +// title: rollData.label, +// mods: rollTestData.mods, +// successLevelMod: roll.successLevelMod, +// successLevel: roll.successLevel, +// successLevelIncr: roll.successLevelIncr, +// effTarget: roll.target, +// isSuccess: roll.isSuccess, +// isCritical: roll.isCritical, +// rollValue: roll.rollObj.total, +// rollResult: roll.rollObj.total, +// showResult: false, +// resultText: '', +// resultDesc: '', +// description: roll.description, +// isOpposed: rollData.isOpposed, +// initiator: rollData.initiator, +// targetTokenId: rollData.targetTokenId, +// notes: renderedNotes, +// roll: roll +// }; + +// const html = await renderTemplate(chatTemplate, chatTemplateData); + +// const messageData = { +// user: game.user.id, +// speaker: speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.ROLL, +// sound: CONFIG.sounds.dice, +// roll: roll.rollObj +// }; + +// const messageOptions = { +// rollMode: game.settings.get("core", "rollMode") +// }; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) + +// return chatTemplateData; +// } + +// /*--------------------------------------------------------------------------------*/ +// /* GENERIC DICE ROLLING PROCESSING +// /*--------------------------------------------------------------------------------*/ + +// /** +// * @typedef {Object} RollResult +// * @property {string} type +// * @property {number} target +// * @property {boolean} isCapped +// * @property {Roll} rollObj +// * @property {boolean} isCritical +// * @property {boolean} isSuccess +// * @property {number} lastDigit +// * @property {number} successLevel +// * @property {number} successLevelMod +// * @property {number} successLevelIncr +// * @property {string} description +// * @property {Object} preData +// */ + +// /** +// * Perform a generic dice roll +// * +// * @param {Object} rollData +// * @param {Integer} rollData.diceSides Number of sides to the dice +// * @param {Integer} rollData.diceNum Number of dice to roll +// * @param {Integer} rollData.successLevelMod Success Level Modifier +// * @param {Integer} rollData.target Target value to test against +// * @param {String} rollData.type Label for the type of roll +// * @param {Object} rollData.data Dice roll context data +// * @returns {Object} Object containing results of the roll +// */ +// static async rollTest({ diceSides = 100, diceNum = 1, successLevelMod = 0, target = 0, type, data } = {}) { +// successLevelMod = Number.parseInt(successLevelMod, 10); + +// const diceType = `d${diceSides}`; +// const numDice = Math.max(1, diceNum); +// const diceSpec = numDice + diceType; +// const rollObj = new Roll(diceSpec, data); +// const roll = await rollObj.evaluate({ async: true }); +// if (!roll) { +// console.error(`sohl.SoHL | Roll evaluation failed, diceSpec=${diceSpec}`) +// } +// const lastDigit = roll.total % 10; +// const baseTargetNum = Number.parseInt(target, 10); +// // Ensure target num is between 9 and 95; always a 5% chance of success/failure +// const targetNum = diceSides === 100 ? Math.max(Math.min(baseTargetNum, 95), 5) : baseTargetNum; +// let isCritical = lastDigit === 0 || lastDigit === 5; + +// // Calculate the success level +// let successLevel = 0; +// if (diceSides === 100) { +// // ********** Failure *********** +// if (roll.total > targetNum) { +// successLevel = isCritical ? sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalFailure : sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalFailure; +// } +// // ********** Success *********** +// else { +// successLevel = isCritical ? sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalSuccess : sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess; +// } +// } else { +// successLevel = (roll.total <= targetNum) ? sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess : sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalFailure; +// } + +// // Add in any success level modifier +// successLevel += successLevelMod; + +// // Calculate the description of the success/failure +// let description; +// let successLevelIncr = 0; +// const isSuccess = successLevel >= sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess; +// if (diceSides === 100) { +// isCritical = (successLevel <= sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalFailure) || (successLevel >= sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalSuccess); + +// if (isCritical) { +// description = isSuccess ? "Critical Success" : "Critical Failure"; +// } else { +// description = isSuccess ? "Marginal Success" : "Marginal Failure"; +// } + +// // If success level is greater than critical success or less than critical failure +// // then add the amount to the end of the description +// let isNeg = false; + +// if (successLevel > sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalSuccess) { +// successLevelIncr = successLevel - sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalSuccess; +// } else if (successLevel < sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalFailure) { +// successLevelIncr = Math.abs(successLevel - sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalFailure); +// isNeg = true; +// } +// if (successLevelIncr > 1) { +// description += successLevelIncr ? ` (${isNeg ? '-' : '+'}${successLevelIncr})` : ''; +// } +// } else { +// description = isSuccess ? "Success" : "Failure"; +// } + +// let rollResults = { +// type, +// target: targetNum, +// isCapped: baseTargetNum !== targetNum, +// rollObj: roll, +// isCritical, +// isSuccess, +// lastDigit, +// successLevel, +// successLevelMod, +// successLevelIncr, +// description: description, +// preData: { diceSides, diceNum, successLevelMod, target, type, data } +// }; + +// return rollResults; +// } +// } + +// class LgndCommand { +// static async performTest(testName, { itemName, actorId } = {}) { +// const actor = getActor(actorId); +// if (!actor) return null; +// if (!actor.system) { +// throw new Error(`sohl.Ruleset not defined for actor ${actor.name}, uuid=${actor.uuid}`); +// } + +// switch (testName) { +// case sohl.SkillItemData.typeName: +// return await actor.system.skillTest(itemName, options); + +// case 'skillvalue': +// return await actor.system.skillValueTest(itemName, options); + +// case sohl.MysticalAbilityItemData.typeName: +// return await actor.system.castSpellTest(itemName, options); + +// case 'assistedattack': +// return await actor.system.assistedAttackTest(itemName, options); + +// case 'assisteddefense': +// return await actor.system.assistedDefendTest(itemName, type, options); + +// case 'fate': +// return await actor.system.fateTest(itemName, options); + +// case 'healing': +// return await actor.system.healingTest(itemName, options); + +// case 'shock': +// return await actor.system.shockTest(options); + +// case 'shockretest': +// return await actor.system.shockReTest(options); + +// case 'treatment': +// return await actor.system.treatmentTest(options); + +// case 'fear': +// return await actor.system.fearTest(itemName, options); + +// case 'morale': +// return await actor.system.moraleTest(itemName, options); + +// case 'rally': +// return await actor.system.rallyTest(options); + +// case 'stumble': +// return await actor.system.stumbleTest(options); + +// case 'fumble': +// return await actor.system.fumbleTest(options); + +// case 'opposed': +// return await actor.system.opposedTest(itemName, options); + +// case 'automatedattack': +// if (!actor.token?.inCombat) { +// ui.notifications.warn('Automated combat may only be used when your character is in combat; please join a combat first, then perform your attack'); +// return null; +// } +// return await actor.system.automatedAttack(options); + +// default: +// ui.notifications.warn(`Unknown "${testName}" test requested, ignoring.`); +// return null; +// } +// } + +// static async changeMissileQuanity(missileName, newValue, options = {}) { +// const actor = getActor(options.actorId); +// if (!actor) return null; +// return await actor.system?.changeMissileQuanity(missileName, newValue, options); +// } + +// static async setSkillDevelopmentFlag(skillName, newValue = false, options = {}) { +// const actor = getActor(options.actorId); +// if (!actor) return null; +// return await actor.system?.setSkillDevelopmentFlag(skillName, newValue, options); +// } + +// static async damageRoll(options = {}) { +// const actor = getActor(options.actorId); +// if (!actor) return null; +// return await actor.system?.damageRoll(options); +// } + +// static async secondaryskillRoll(skillName, options = {}) { +// const actor = getActor(options.actorId); +// if (!actor) return null; +// return await actor.system?.secondaryskillRoll(skillName, options); +// } + +// static async skillDevelopmentRoll(skillName, options = {}) { +// const actor = getActor(options.actorId); +// if (!actor) return null; +// return await actor.system?.skillDevelopmentRoll(skillName, options); +// } + +// static async injuryRoll(options = {}) { +// const actor = getActor(options.actorId); +// if (!actor) return null; +// return await actor.system?.injuryRoll(options); +// } + +// /** +// * Try several things to determine what the current actor is. These include: (1) if UUID is specified, find +// * the actor with that UUID; (2) If there is a combat ongoing, and if the current combatant is owned, then +// * select that actor, or (3) if there is a character defined in the user profile, choose that actor. +// * +// * @param {string} actorId +// * @returns The Actor that was identified. +// */ +// getActor(actorId = null) { +// let actor = null; + +// if (actorId) { +// actor = fromUuidSync(actorId); +// if (!actor) { +// ui.notifications.warn(`Cannot find actor with UUID ${actorId}`); +// return null; +// } +// } else { +// // We have to guess which actor to select. +// // If in combat, then choose the combatant whose turn it is +// actor = game.combat?.combatant?.actor; +// if (!actor?.isOwner) { +// // If we're not an owner of the current combatant (or we are not in combat), then +// // fallback to our "user character" (if defined) +// actor = game.user.character; +// if (!actor) { +// const msg = `Cannot identify a default character; please consider defining your default character in your user profile.`; +// console.warn(`sohl.SoHL | ${msg}`); +// ui.notifications.warn(msg); +// return null; +// } +// } +// } + +// return actor; +// } +// } + +// class LgndMigration { +// /** +// * Perform a system migration for the entire World, applying migrations for Actors, Items, and Compendium packs +// * @returns {Promise} A Promise which resolves once the migration is completed +// */ +// static async migrateWorld() { +// const version = game.system.version; +// ui.notifications.info(`sohl.SoHL | Beginning ${version} Migration`, { permanent: true }); + +// //const migrationData = await getMigrationData(); +// const migrationData = {}; + +// replaceActorArmorLocationAndZoneLocation(); + +// // Migrate World Actors +// for (let a of game.actors) { +// try { +// let items = []; + +// const updateData = await migrateActorData(a.toObject(), migrationData); +// addCombatTechniques(a.toObject(), updateData) +// //await addTraitsAndSkills(a.toObject(), updateData); +// if (!foundry.utils.isEmpty(updateData)) { +// console.log(`sohl.SoHL | Migrating Actor document ${a.name}`); +// await a.update(updateData, { enforceTypes: false }); +// } +// } catch (err) { +// err.message = `sohl.SoHL | Failed system migration for Actor ${a.name}: ${err.message}`; +// console.error(err); +// } +// } + +// // Migrate World Items +// for (let i of game.items) { +// try { +// const updateData = await migrateItemData(i.toObject(), migrationData); +// if (i.system instanceof ArmorGearData && i.system.encumbrance > -1) { +// const effect = { +// changes: [{ +// key: "system.traits.encumbrance", +// mode: 2, +// priority: null, +// value: i.system.encumbrance.toString() +// }], +// disabled: false, +// duration: { +// label: "None", +// type: "none" +// }, +// flags: { +// sohl: { +// targetName: i.name, +// targetType: ArmorGearItemData.typeName +// } +// }, +// icon: 'icons/svg/aura.svg', +// label: 'Encumbrance', +// origin: i.uuid, +// transfer: true +// }; +// const effects = i.toObject().effects.concat(effect); +// const newEffects = foundry.utils.flattenObject({ effects: effects }); +// foundry.utils.mergeObject(updateData, newEffects); +// } +// if (!foundry.utils.isEmpty(updateData)) { +// console.log(`Migrating Item document ${i.name}`); +// await i.update(updateData, { enforceTypes: false }); +// } +// const updateEffectsData = i.updateEffectsOrigin(); +// if (updateEffectsData.length) i.updateEmbeddedDocuments("ActiveEffect", updateEffectsData); +// } catch (err) { +// err.message = `sohl.SoHL | Failed system migration for Item ${i.name}: ${err.message}`; +// console.error(err); +// } +// } + +// // Migrate World Macros +// for (const m of game.macros) { +// try { +// const updateData = migrateMacroData(m.toObject(), migrationData); +// if (!foundry.utils.isEmpty(updateData)) { +// console.log(`sohl.SoHL | Migrating Macro document ${m.name}`); +// await m.update(updateData, { enforceTypes: false }); +// } +// } catch (err) { +// err.message = `sohl.SoHL | Failed system migration for Macro ${m.name}: ${err.message}`; +// console.error(err); +// } +// } + +// // Migrate Actor Override Tokens +// for (let s of game.scenes) { +// try { +// const updateData = migrateSceneData(s, migrationData); +// if (!foundry.utils.isEmpty(updateData)) { +// console.log(`sohl.SoHL | Migrating Scene document ${s.name}`); +// await s.update(updateData, { enforceTypes: false }); +// // If we do not do this, then synthetic token actors remain in cache +// // with the un-updated actorData. +// s.tokens.forEach(t => t._actor = null); +// } +// } catch (err) { +// err.message = `sohl.SoHL | Failed system migration for Scene ${s.name}: ${err.message}`; +// console.error(err); +// } +// } + +// // Migrate World Compendium Packs +// for (let p of game.packs) { +// if (p.metadata.package !== "world") continue; +// if (!["Actor", "Item", "Scene"].includes(p.documentName)) continue; +// await migrateCompendium(p); +// } + +// // Set the migration as complete +// game.settings.set("legendary", "systemMigrationVersion", game.system.version); +// ui.notifications.info(`sohl.SoHL | Migration of ${version} complete!`, { permanent: true }); +// }; + +// // const itemConvert = { +// // "Staff": "Staff (2h)", +// // "Beltpouch, leather": "Belt pouch, leather, med", +// // "Belt, leather": "Belt, Leather", +// // "Leather Boots": "Leather Calf Boots", +// // "Coin purse, leather": "Purse, leather", +// // "Plate Helm": "Plate Halfhelm", +// // "Kurbul Helm": "Kurbul Halfhelm", +// // "Three-quarter helm, plate": "Plate 3/4-Helm", +// // "Coudes, kurbul": "Kurbul Coudes", +// // "Vial, glass": "Flask, glass, 1pt.", +// // "Shoulderbag, small, canvas": "Bag, sm, canvas", +// // "Beltpouch, silk": "Belt pouch, silk", +// // "Flask of oil, metal": "Oil, 1 pt.", +// // "Physician's Bag": "Surgical Tools", +// // "Coudes, plate": "Plate Coudes", +// // "torch": "Torch", +// // "rations": "Rations, Standard", +// // "leather belt, waist": "Belt, Leather", +// // "leather scabbard (small)": "Scabbard", +// // "silver pence": "Pence", +// // "Leather Belt Pouch": "Belt pouch, leather, med", +// // "Silk Coin Purse": "Purse, silk", +// // "Belt Pouch, Leather SM": "Belt pouch, leather, med", +// // "Harp": "Harp, Aeolian (small)", +// // "Flute": "Flute, wooden", +// // "Drum": "Drum, hand", +// // "Plate Great helm": "Plate Great Helm", +// // "Cap, quilt": "Quilted Cap", +// // "Bullet": "Bullet, Sling", +// // "Rope, hemp, light, 100'": 'Rope, ½” hemp, per ft (330 lb cap.*)', +// // "Pick": "Pickaxe" +// // }; + +// // static async replaceActorArmorLocationAndZoneLocation() { +// // ui.notifications.info(`sohl.SoHL | Beginning Replacing Body Records for all Actors`); + +// // const migrationData = {}; + +// // // Migrate World Actors +// // for (let a of game.actors) { +// // try { +// // const updateData = { items: [] }; +// // const deleteDocs = []; + +// // for (let it of a.items) { +// // if ([BodyLocationData.TYPENAME, BodyZoneData.TYPENAME].includes(it.type)) { +// // deleteDocs.push(it._id); +// // } +// // } + +// // await sohl.Utility.addItemsFromPack(LGND.FLAVOR.defaultCharacterBodyZones, LGND.FLAVOR.COMPENDIUMS.charbody, updateData.items, BodyZoneData.TYPENAME); +// // await sohl.Utility.addItemsFromPack(LGND.FLAVOR.defaultCharacterBodyParts, LGND.FLAVOR.COMPENDIUMS.charbody, updateData.items, BodyPartData.TYPENAME); +// // await sohl.Utility.addItemsFromPack(LGND.FLAVOR.defaultCharacterBodyLocations, LGND.FLAVOR.COMPENDIUMS.charbody, updateData.items, BodyLocationData.TYPENAME); + +// // await a.deleteEmbeddedDocuments("Item", deleteDocs); +// // await a.createEmbeddedDocuments("Item", updateData.items, { enforceTypes: false }); + +// // } catch (err) { +// // err.message = `sohl.SoHL | Failed to replace body records for Actor ${a.name}: ${err.message}`; +// // console.error(err); +// // } + +// // } +// //} + +// // export async function upgradeActors () { +// // ui.notifications.info(`sohl.SoHL | Beginning Actors upgrade`, { permanent: true }); + +// // const migrationData = {}; + +// // // Migrate World Actors +// // for (let a of game.actors) { +// // try { +// // const updateData = { items: [] }; +// // const deleteDocs = []; +// // const gear = a.items.reduce((gr, it) => { +// // if (it.type.endsWith("gear")) { +// // if (itemConvert[it.name]) { +// // gr.names.push(itemConvert[it.name]); +// // } else { +// // gr.names.push(it.name); +// // } +// // console.log(`sohl.SoHL | Migration | Replacing gear ${it.name}, quantity ${it.system.quantity}`); +// // gr.qty.push(it.system.quantity); +// // gr.item.push(it); +// // } +// // return gr; +// // }, {names:[], qty:[], item:[]}); + +// // await sohl.Utility.addItemsFromPack(gear.names, ['legendary.sohl-possessions'], updateData.items); + +// // console.log(`sohl.SoHL | Upgrading Actor document ${a.name} with ${gear.names.length} gear and ${updateData.items.length} items`); +// // if (updateData.items.length) { +// // for (let idx = 0; idx < gear.names.length; idx++) { +// // let found = updateData.items.find(it => it.name === gear.names[idx]); +// // if (found) { +// // found.system.quantity = gear.qty[idx]; +// // deleteDocs.push(gear.item[idx]._id); +// // } else { +// // console.log(`sohl.SoHL | can't find ${gear.names[idx]}`); +// // } +// // } +// // } + +// // await a.deleteEmbeddedDocuments("Item", deleteDocs); +// // await a.createEmbeddedDocuments("Item", updateData.items, { enforceTypes: false }); + +// // } catch (err) { +// // err.message = `sohl.SoHL | Failed upgrade for Actor ${a.name}: ${err.message}`; +// // console.error(err); +// // } +// // } + +// // ui.notifications.info(`sohl.SoHL | Upgrade of Actors complete!`, { permanent: true }); +// // }; + +// // static async addCombatTechniques(actor, updateData) { +// // let ctList = []; +// // if (actor.type === 'character') { +// // ctList = LGND.FLAVOR.defaultCharacterCombatTechniques.reduce((ary, traitName) => { +// // if (!actor.items.some(it => it.system instanceof CombatTechniqueItemData && it.name === traitName)) { +// // ary.push(traitName); +// // } +// // return ary; +// // }, []); +// // } + +// // if (ctList.length) { +// // if (!updateData.items) updateData.items = []; +// // console.log(`sohl.SoHL | ${actor.name} is of type ${actor.type}`); +// // console.log(`sohl.SoHL | ${actor.name} Adding Combat Techniques ${ctList.join(',')}`); +// // await sohl.Utility.addItemsFromPack(ctList, LGND.FLAVOR.COMPENDIUMS.combattechniques, updateData.items) +// // } +// // } + +// // async function addTraitsAndSkills(actor, updateData) { +// // let traitList = []; +// // let skillList = []; +// // if (actor.type === 'character') { +// // traitList = LGND.CONFIG.defaultCharacterTraits.reduce((ary, traitName) => { +// // if (!actor.items.some(it => it.system instanceof TraitData && it.name===traitName)) { +// // ary.push(traitName); +// // } +// // return ary; +// // }, []); +// // skillList = LGND.CONFIG.defaultCharacterSkills.reduce((ary, skillName) => { +// // if (!actor.items.some(it => it.type ===LgndSkillData.TYPENAME && it.name===skillName)) { +// // ary.push(skillName); +// // } +// // return ary; +// // }, []); +// // } else if (actor.type === 'creature') { +// // traitList = LGND.CONFIG.defaultCreatureTraits.reduce((ary, traitName) => { +// // if (!actor.items.some(it => it.system instanceof TraitData && it.name===traitName)) { +// // ary.push(traitName); +// // } +// // return ary; +// // }, []); +// // skillList = LGND.CONFIG.defaultCreatureSkills.reduce((ary, skillName) => { +// // if (!actor.items.some(it => it.type ===LgndSkillData.TYPENAME && it.name===skillName)) { +// // ary.push(skillName); +// // } +// // return ary; +// // }, []); +// // } + +// // if (traitList.length || skillList.length) { +// // if (!updateData.items) updateData.items = []; +// // console.log(`sohl.SoHL | ${actor.name} is of type ${actor.type}`); +// // console.log(`sohl.SoHL | ${actor.name} Adding Traits ${traitList.join(',')}`); +// // console.log(`sohl.SoHL | ${actor.name} Adding Skills ${skillList.join(',')}`); +// // await sohl.Utility.addItemsFromPack(traitList, LGND.CONFIG.COMPENDIUMS.traits, updateData.items) +// // await sohl.Utility.addItemsFromPack(skillList, LGND.CONFIG.COMPENDIUMS.skills, updateData.items) +// // } +// // } + +// // function _convertAttributesToTraits(actor, items) { +// // items.push({name: 'Strength', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/biceps.svg', 'system.type': 'Physique', 'system.abbr': 'str', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.strength.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Endurance', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/climbing.svg', 'system.type': 'Physique', 'system.abbr': 'end', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.endurance.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Dexterity', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/juggler.svg', 'system.type': 'Physique', 'system.abbr': 'dex', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.dexterity.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Agility', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/acrobatics.svg', 'system.type': 'Physique', 'system.abbr': 'agl', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.agility.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Perception', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/awareness.svg', 'system.type': 'Physique', 'system.abbr': 'per', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.perception.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Comeliness', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/charm.svg', 'system.type': 'Physique', 'system.abbr': 'cml', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.comeliness.base.toString(), 'system.intensity': 'Attribute'}); + +// // items.push({name: 'Aura', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/aura.svg', 'system.type': 'Transcendent', 'system.abbr': 'aur', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.aura.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Will', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/will.svg', 'system.type': 'Personality', 'system.abbr': 'wil', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.will.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Reasoning', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/reasoning.svg', 'system.type': 'Personality', 'system.abbr': 'rea', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.reasoning.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Creativity', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/creativity.svg', 'system.type': 'Personality', 'system.abbr': 'cre', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.creativity.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Empathy', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/empathy.svg', 'system.type': 'Personality', 'system.abbr': 'emp', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.empathy.base.toString(), 'system.intensity': 'Attribute'}); +// // items.push({name: 'Eloquence', type: TraitData.TYPENAME, img: 'systems/sohl/assets/icons/oratory.svg', 'system.type': 'Personality', 'system.abbr': 'elo', +// // 'system.isNumeric': true, 'system.textValue': actor.system.attributes.eloquence.base.toString(), 'system.intensity': 'Attribute'}); +// // } + +// /* -------------------------------------------- */ + +// /** +// * Apply migration rules to all Documents within a single Compendium pack +// * @param {CompendiumCollection} pack Pack to be migrated. +// * @returns {Promise} +// */ +// static async migrateCompendium(pack) { +// const documentName = pack.documentName; +// if (!["Actor", "Item", "Scene"].includes(documentName)) return; + +// const migrationData = await getMigrationData(); + +// // Unlock the pack for editing +// const wasLocked = pack.locked; +// await pack.configure({ locked: false }); + +// // Begin by requesting server-side data model migration and get the migrated content +// await pack.migrate(); +// const documents = await pack.getDocuments(); + +// // Iterate over compendium entries - applying fine-tuned migration functions +// for (let doc of documents) { +// let updateData = {}; +// try { +// switch (documentName) { +// case "Actor": +// updateData = await migrateActorData(doc.toObject(), migrationData); +// // await addTraitsAndSkills(doc.toObject(), updateData); +// break; +// case "Item": +// updateData = await migrateItemData(doc.toObject(), migrationData); +// break; +// case "Scene": +// updateData = migrateSceneData(doc.toObject(), migrationData); +// break; +// } + +// // Save the entry, if data was changed +// if (foundry.utils.isEmpty(updateData)) continue; +// await doc.update(updateData); +// console.log(`sohl.SoHL | Migrated ${documentName} document ${doc.name} in Compendium ${pack.collection}`); +// } + +// // Handle migration failures +// catch (err) { +// err.message = `sohl.SoHL | Failed system migration for document ${doc.name} in pack ${pack.collection}: ${err.message}`; +// console.error(err); +// } +// } + +// // Apply the original locked status for the pack +// await pack.configure({ locked: wasLocked }); +// console.log(`sohl.SoHL | Migrated all ${documentName} documents from Compendium ${pack.collection}`); +// }; + +// /* -------------------------------------------- */ +// /* Document Type Migration Helpers */ +// /* -------------------------------------------- */ + +// /** +// * Migrate a single Actor document to incorporate latest data model changes +// * Return an Object of updateData to be applied +// * @param {object} actor The actor data object to update +// * @param {object} [migrationData] Additional data to perform the migration +// * @returns {object} The updateData to apply +// */ +// static async migrateActorData(actor, migrationData) { +// const updateData = {}; +// _cleanActorCruft(actor, updateData); +// // Actor Data Updates + +// // Migrate embedded effects +// if (actor.effects) { +// const effects = migrateEffects(actor, migrationData); +// if (effects.length > 0) updateData.effects = effects; +// } + +// // Migrate Owned Items +// if (actor.items?.length) { +// let items = await actor.items.reduce(async (arr, i) => { +// // Migrate the Owned Item +// const itemData = i instanceof CONFIG.Item.documentClass ? i.toObject() : i; +// let itemUpdate = await migrateItemData(itemData, migrationData, actor.name); + +// // Update the Owned Item +// if (!foundry.utils.isEmpty(itemUpdate)) { +// itemUpdate._id = itemData._id; +// (await arr).push(foundry.utils.expandObject(itemUpdate)); +// } + +// return (await arr); +// }, []); + +// if (items.length > 0) updateData.items = items; +// } + +// cleanExtraData(actor.system, game.system.model.Actor.character, updateData, "system.") + +// return updateData; +// }; + +// static _cleanActorCruft(actorData, updateData) { + +// return updateData; +// } + +// /** +// * Migrate a single Item document to incorporate latest data model changes +// * +// * @param {object} item Item data to migrate +// * @param {object} [migrationData] Additional data to perform the migration +// * @returns {object} The updateData to apply +// */ +// static async migrateItemData(item, migrationData, actorName = 'None') { +// const updateData = {}; + +// if (item.type.endsWith('gear')) { + +// if (item.system.hasOwnProperty('weaponQuality')) { +// updateData['system.durability.base'] = item.system.weaponQuality; +// updateData['system.-=weaponQuality'] = null; +// } else if (item.system.hasOwnProperty('armorQuality')) { +// updateData['system.durability.base'] = item.system.armorQuality; +// updateData['system.-=armorQuality'] = null; +// } + +// if (item.system.hasOwnProperty('quality')) { +// if (typeof item.system.quality !== 'object') { +// updateData['system.-=quality'] = null; +// updateData['system.quality.base'] = item.system.quality; +// } +// } else { +// updateData['system.quality.base'] = 0; +// } + +// if (item.system.hasOwnProperty('side')) { +// updateData['system.-=side'] = null; +// const newPart = item.system.side === 'Left' ? 'Left Arm' : 'Right Arm'; +// updateData['system.bodyPart'] = newPart; +// } +// } + +// // Migrate embedded effects +// if (!item.parent && item.effects) { +// //console.log(`sohl.SoHL | Migrating ${item.name} effects`); +// const effects = migrateEffects(item, migrationData); +// if (effects.length > 0) updateData.effects = effects; +// } + +// if (game.system.model.Item.hasOwnProperty(item.type)) { +// cleanExtraData(item.system, game.system.model.Item[item.type], updateData, "system.") +// } + +// return updateData; +// }; + +// /* -------------------------------------------- */ + +// /** +// * Migrate a single Scene document to incorporate changes to the data model of it's actor data overrides +// * Return an Object of updateData to be applied +// * @param {object} scene The Scene data to Update +// * @param {object} [migrationData] Additional data to perform the migration +// * @returns {object} The updateData to apply +// */ +// static async migrateSceneData(scene, migrationData) { +// const tokens = await scene.tokens.map(async token => { +// const t = (await token).toObject(); +// const update = {}; +// if (Object.keys(update).length) foundry.utils.mergeObject(t, update); +// if (!t.actorId || t.actorLink) { +// t.actorData = {}; +// } +// else if (!game.actors.has(t.actorId)) { +// t.actorId = null; +// t.actorData = {}; +// } +// else if (!t.actorLink) { +// const actorData = duplicate(t.actorData); +// actorData.type = (await token).actor?.type; +// const update = await migrateActorData(actorData, migrationData); +// ["items", "effects"].forEach(embeddedName => { +// if (!update[embeddedName]?.length) return; +// const updates = new Map(update[embeddedName].map(u => [u._id, u])); +// t.actorData[embeddedName].forEach(original => { +// const update = updates.get(original._id); +// if (update) foundry.utils.mergeObject(original, update); +// }); +// delete update[embeddedName]; +// }); + +// foundry.utils.mergeObject(t.actorData, update); +// } +// return t; +// }); +// return { tokens }; +// }; + +// /** +// * Migrate any active effects attached to the provided parent. +// * @param {object} parent Data of the parent being migrated. +// * @param {object} [migrationData] Additional data to perform the migration. +// * @returns {object[]} Updates to apply on the embedded effects. +// */ +// static async migrateEffects(parent, migrationData) { +// if (!parent.effects) return {}; +// const mData = foundry.utils.deepClone(migrationData); + +// if (parent.parent) mData.origin = ['Actor', parent.parent._id, 'Item', parent._id].join('.'); + +// return parent.effects.reduce((arr, e) => { +// const effectData = e instanceof CONFIG.ActiveEffect.documentClass ? e.toObject() : e; +// let effectUpdate = migrateEffectData(effectData, mData); +// if (!foundry.utils.isEmpty(effectUpdate)) { +// effectUpdate._id = effectData._id; +// arr.push(foundry.utils.expandObject(effectUpdate)); +// } +// return arr; +// }, []); +// }; + +// /* -------------------------------------------- */ + +// /** +// * Migrate the provided active effect data. +// * @param {object} effect Effect data to migrate. +// * @param {object} [migrationData] Additional data to perform the migration. +// * @returns {object} The updateData to apply. +// */ +// static async migrateEffectData(effect, migrationData) { + +// if (effect.changes.length) { +// effect.changes = effect.changes.map(ch => { +// if (ch.key.startsWith('trait:')) { +// ch.key = `system.traits.${ch.key.slice(6)}`; +// ch.mode = CONST.ACTIVE_EFFECTS_MODES.OVERRIDE; +// ch.value = "true"; +// } +// }); +// } + +// return updateData; +// }; + +// /* -------------------------------------------- */ + +// /** +// * Migrate a single Macro document to incorporate latest data model changes. +// * @param {object} macro Macro data to migrate +// * @param {object} [migrationData] Additional data to perform the migration +// * @returns {object} The updateData to apply +// */ +// static async migrateMacroData(macro, migrationData) { +// const updateData = {}; +// return updateData; +// }; + +// /* -------------------------------------------- */ +// /* Low level migration utilities +// /* -------------------------------------------- */ + +// static async cleanExtraData(source, template, updateData, prefix) { +// // Validate input +// const ts = getType(source); +// const tt = getType(template); +// if ((ts !== "Object") || (tt !== "Object")) throw new Error("One of source or template are not Objects!"); + +// // Define recursive filtering function +// const _filter = function (s, t, updateData, prefix) { +// for (let [k, v] of Object.entries(s)) { +// let has = t.hasOwnProperty(k); +// let x = t[k]; + +// // Case 3 - Not in template +// if (!has) { +// updateData[`${prefix}-=${k}`] = null; +// } + +// // Case 2 - inner object +// else if (has && (getType(v) === "Object") && (getType(x) === "Object")) { +// _filter(v, x, updateData, `${prefix}${k}.`); +// } + +// // Case 3 - delete key +// else if (k.startsWith("-=")) { +// updateData[`${prefix}${k}`] = v; +// } +// } +// return updateData; +// }; + +// // Begin filtering at the outer-most layer +// return _filter(source, template, updateData, prefix); + +// }; + +// /** +// * A general tool to purge flags from all documents in a Compendium pack. +// * @param {CompendiumCollection} pack The compendium pack to clean. +// * @private +// */ +// static async purgeFlags(pack) { +// const cleanFlags = flags => { +// const flags5e = flags.dnd5e || null; +// return flags5e ? { dnd5e: flags5e } : {}; +// }; +// await pack.configure({ locked: false }); +// const content = await pack.getDocuments(); +// for (let doc of content) { +// const update = { flags: cleanFlags(doc.flags) }; +// if (pack.documentName === "Actor") { +// update.items = doc.items.map(i => { +// i.flags = cleanFlags(i.flags); +// return i; +// }); +// } +// await doc.update(update, { recursive: false }); +// console.log(`Purged flags from ${doc.name}`); +// } +// await pack.configure({ locked: true }); +// } + +// /* -------------------------------------------- */ + +// /** +// * Purge the data model of any inner objects which have been flagged as _deprecated. +// * @param {object} data The data to clean. +// * @returns {object} Cleaned data. +// * @private +// */ +// static removeDeprecatedObjects(data) { +// for (let [k, v] of Object.entries(data)) { +// if (getType(v) === "Object") { +// if (v._deprecated === true) { +// console.log(`sohl.SoHL | Deleting deprecated object key ${k}`); +// delete data[k]; +// } +// else removeDeprecatedObjects(v); +// } +// } +// return data; +// } + +// static upgrade() { +// console.log(`sohl.SoHL | Beginning upgrade of World Items`); +// game.items.forEach(it => { +// it.effects.forEach(e => { +// if (e.targetType !== 'actor') { +// console.log(`sohl.SoHL | Changing effect ${e.name} on item ${it.name} to target 'this'`); +// e.update({ 'flags.legendary.targetType': 'this', 'flags.legendary.targetName': '' }); +// } +// }); +// }); +// console.log(`sohl.SoHL | Finished upgrade of World Items`); +// } +// } + +// class LgndHotbar { +// /** +// * Create a script macro from an Item drop. +// * Get an existing item macro if one exists, otherwise create a new one. +// * @param {object} data The dropped data +// * @param {number} slot The hotbar slot to use +// * @returns {Promise} +// */ +// static createLgndMacro(data, slot) { +// if (data.type !== "Item") return true; // Continue normal processing for non-Item documents +// handleItemMacro(data, slot); +// return false; +// } + +// static async handleItemMacro(data, slot) { +// const item = await fromUuid(data.uuid); +// if (!item?.system) { +// ui.notifications.warn("No macro exists for that type of object."); +// return null; +// } + +// let title = item.name; +// if (item.actor) { +// title = `${item.actor.name}'s ${item.name}`; +// } + +// let cmdSuffix; +// switch (item.type) { +// case sohl.ArtifactRulesetSkillItemData.typeName: +// cmdSuffix = `skillRoll("${item.uuid}");`; +// break; + +// case sohl.MysticalAbilityItemData.typeName: +// cmdSuffix = `castSpellRoll("${item.uuid}");`; +// break; + +// case LgndWeaponGearItemData.typeName: +// return await askWeaponMacro(item.uuid, slot, item.img); + +// case InjuryItemData.typeName: +// cmdSuffix = `healingRoll("${item.name}");`; +// break; + +// default: +// return null; // Unhandled item, so ignore +// } + +// return await applyMacro(title, `await game.sohl.macros.${cmdSuffix}`, slot, item.img, { "hm3.itemMacro": false }); +// } + +// static async applyMacro(name, command, slot, img, flags) { +// let macro = [game.legendary.cmds.values()].find(m => (m.name === name) && (m.command === command)); +// if (!macro) { +// macro = await Macro.create({ +// name: name, +// type: "script", +// img: img, +// command: command, +// flags: flags +// }); +// } +// game.user.assignHotbarMacro(macro, slot); +// return null; +// } + +// static askWeaponMacro(weaponUuid, slot, img) { +// const item = fromUuidSync(weaponUuid); +// if (!item) { +// ui.notifications.warn(`No weapon with Uuid ${weaponUuid}`); +// } + +// const dlghtml = '

Select the type of weapon macro to create:

'; + +// let actorName = ""; +// if (item.actor) { +// actorName = `${item.actor.name}'s `; +// } + +// // Create the dialog window +// return new Promise(resolve => { +// new Dialog({ +// title: 'Select Weapon Macro', +// content: dlghtml.trim(), +// buttons: { +// enhAttackButton: { +// label: "Automated Combat", +// callback: async (html) => { +// return await applyMacro(`${item.name} Automated Combat`, `await game.sohl.macros.weaponAttack("${weaponUuid}");`, slot, img, { "hm3.itemMacro": false }); +// } +// }, +// attackButton: { +// label: "Attack", +// callback: async (html) => { +// return await applyMacro(`${actorName}${item.name} Attack Roll`, `await game.sohl.macros.weaponAttackRoll("${weaponUuid}");`, slot, img, { "hm3.itemMacro": false }); +// } +// }, +// defendButton: { +// label: "Defend", +// callback: async (html) => { +// return await applyMacro(`${actorName}${item.name} Defend Roll`, `await game.sohl.macros.weaponDefendRoll("${weaponUuid}");`, slot, img, { "hm3.itemMacro": false }); +// } +// }, +// damageButton: { +// label: "Damage", +// callback: async (html) => { +// return await applyMacro(`${actorName}${item.name} Damage Roll`, `await game.sohl.macros.weaponDamageRoll("${weaponUuid}");`, slot, img, { "hm3.itemMacro": false }); +// } +// } +// }, +// default: "enhAttackButton", +// close: () => resolve(false) +// }).render(true) +// }); +// } + +// static askMissileMacro(name, slot, img, actorSuffix) { +// const dlghtml = '

Select the type of missile macro to create:

' + +// // Create the dialog window +// return new Promise(resolve => { +// new Dialog({ +// title: 'Select Missile Macro', +// content: dlghtml.trim(), +// buttons: { +// enhAttackButton: { +// label: "Automated Combat", +// callback: async (html) => { +// return await applyMacro(`${name} Automated Combat`, `game.sohl.macros.missileAttack("${name}");`, slot, img, { "hm3.itemMacro": false }); +// } +// }, +// attackButton: { +// label: "Attack", +// callback: async (html) => { +// return await applyMacro(`${actorName}'s ${name} Attack Roll`, `game.sohl.macros.missileAttackRoll("${name}"${actorSuffix});`, slot, img, { "hm3.itemMacro": false }); +// } +// }, +// damageButton: { +// label: "Damage", +// callback: async (html) => { +// return await applyMacro(`${actorName}'s ${name} Damage Roll`, `game.sohl.macros.missileDamageRoll("${name}"${actorSuffix});`, slot, img, { "hm3.itemMacro": false }); +// } +// } +// }, +// default: "enhAttackButton", +// close: () => resolve(false) +// }).render(true) +// }); +// } +// } + +export class LgndUtility extends sohl.Utility { + static strImpactMod(str) { + if (typeof str !== "number") return -10; + return str > 5 + ? Math.trunc(str / 2) - 5 + : [-10, -10, -8, -6, -4, -3].at(Math.max(str, 0)); + } +} + +class LgndActorSheet extends sohl.SohlActorSheet { + getData() { + const data = super.getData(); + data.effectStatus = { + sleep: this.actor.statuses.has(LGND.CONST.STATUSEFFECTS.Sleep), + prone: this.actor.statuses.has(LGND.CONST.STATUSEFFECTS.Prone), + stun: this.actor.statuses.has(LGND.CONST.STATUSEFFECTS.Stunned), + incapacitated: this.actor.statuses.has( + LGND.CONST.STATUSEFFECTS.Incapacitated, + ), + unconscious: this.actor.statuses.has( + LGND.CONST.STATUSEFFECTS.Unconscious, + ), + dead: this.actor.statuses.has(LGND.CONST.STATUSEFFECTS.Dead), + }; + + data.fateMods = this.actor.system.$ssMod; + return data; + } +} + +// class LgndCharacterCreatureActorRuleset extends sohl.CharacterCreatureActorRuleset { +// shock; +// combatReach; +// weapons = []; +// missiles = []; +// domains = []; +// fatigue = {}; +// pull; +// hasAuralShock; +// fate; +// size; +// maxZones = 0; + +// constructor(parentTypeDataModel) { +// super(parentTypeDataModel); +// this.shock = LGND.CONST.SHOCK.None; +// this.combatReach = -99; +// this.fatigue = { +// personal: (new sohl.ValueModifier(this)).setBase(5), +// weakness: new sohl.ValueModifier(this), +// weariness: new sohl.ValueModifier(this), +// windedness: new sohl.ValueModifier(this) +// }; +// this.pull = new sohl.ValueModifier(this); +// this.fate = new LgndMasteryLevelModifier(this); +// } + +// get strengthMod() { +// const str = this.actor.getTrait('Strength')?.system.score?.effective; +// let result = -12; + +// if (Number.isInteger(str) && str > 0) { +// switch (str) { +// case 1: result = -10; break; +// case 2: result = -8; break; +// case 3: result = -6; break; +// case 4: result = -4; break; +// case 5: result = -3; break; +// case 6: result = -2; break; +// case 7: result = -2; break; +// case 8: result = -1; break; +// case 9: result = -1; break; +// default: +// return Math.floor((str - 10) / 2); +// } +// } + +// return result; +// } + +// applyCombatFatigue(dist) { +// } + +// calcAttributeAverage(...attrNames) { +// if (!attrNames.length) return 0; +// const vals = []; +// for (let attrName of attrNames) { +// const attr = this.actor.getTrait(attrName); +// if (attr?.system.intensity === sohl.TraitItemData.intensities.Attribute) { +// const attrVal = attr.system.targetLevel.effective; +// vals.push(attrVal); +// } +// } +// if (vals.length < 2) return vals.at(0); + +// let result = vals.reduce((a,b) => a+b, 0) / vals.length; + +// if (vals.length === 2) { +// // Special rounding rule: if primary attr > secondary attr, round up, otherwise round down +// result = vals[0] > vals[1] ? Math.ceil(result) : Math.floor(result); +// } else { +// // Otherwise use normal rounding rules +// result = Math.round(result); +// } +// return result; +// } + +// /** +// * Calculate the convocational affinity between a character's selected convocation and another convocation. +// * +// * @param {string} affinity The character's convocational affinity +// * @param {string} spellDomain The convocation to check +// * @returns The degree of affinity of the given convocation to the character's convocation. +// */ +// calcDomainDegree(spellDomain) { +// const affinityTrait = this.actor.getTrait("Arcane Attunement"); + +// const affinityIdx = LGND.FLAVOR.DOMAINS.indexOf(affinityTrait.system.textValue); +// const spellDomainIdx = LGND.FLAVOR.DOMAINS.indexOf(spellDomain); + +// // If either is not a Domain, then it is Diametric +// if (affinityIdx < 0 || spellDomainIdx < 0) return LGND.CONST.DOMAINDEGREE.Diametric; + +// // If the affinity is the same as the domain, it is always Primary +// if (affinityIdx === spellDomainIdx) return LGND.CONST.DOMAINDEGREE.Primary; + +// // If the affinity is Neutral, then all spell domains are treated as Primary (i.e., grey mage) +// if (affinityIdx === LGND.CONST.DOMAINDEGREE.Neutral) return LGND.CONST.DOMAINDEGREE.Primary; + +// // If the spell domain is Neutral, then treat degree as Neutral regardless of affinity +// if (spellDomainIdx === LGND.CONST.DOMAINDEGREE.Neutral) return LGND.CONST.DOMAINDEGREE.Neutral; + +// // Otherwise, the result is based on the distance between affinity and spell domain +// let result = Math.abs(spellDomainIdx - affinityIdx); +// switch (result) { +// case 1: return LGND.CONST.DOMAINDEGREE.Secondary; +// case 2: return LGND.CONST.DOMAINDEGREE.Tertiary; +// case 3: return LGND.CONST.DOMAINDEGREE.Diametric; +// case 4: return LGND.CONST.DOMAINDEGREE.Tertiary; +// case 5: return LGND.CONST.DOMAINDEGREE.Secondary; +// } + +// // This should never happen, since all cases should have been handled above +// return LGND.CONST.DOMAINDEGREE.Diametric; +// } + +// prepareBaseData() { +// super.prepareBaseData(); +// } + +// prepareDerivedData() { +// if (!game._documentsReady) return; +// if (!this.actor?.items.size) return; // We should never have 0 items, if so ignore processing +// super.prepareDerivedData(); + +// if (this.actor.type === 'container') return; + +// // Calculate shock state from effects flags +// if (this.actor.statuses.has(LGND.CONST.STATUSEFFECTS.Dead)) { +// this.shock = LGND.CONST.SHOCK.Killed; +// this.health.value = 0; +// } else if (this.actor.statuses.has(LGND.CONST.STATUSEFFECTS.Unconscious)) { +// this.shock = LGND.CONST.SHOCK.Unconscious; +// } else if (this.actor.statuses.has(LGND.CONST.STATUSEFFECTS.Incapacitated)) { +// this.shock = LGND.CONST.SHOCK.Incapacitated; +// this.health.value = Math.floor(this.health.max * 0.1); +// } else if (this.actor.statuses.has(LGND.CONST.STATUSEFFECTS.Stunned)) { +// this.shock = LGND.CONST.SHOCK.Stunned; +// this.health.value = Math.floor(this.system.health.value * 0.5); +// } else { +// this.shock = LGND.CONST.SHOCK.None; +// if (this.actor.statuses.has(LGND.CONST.STATUSEFFECTS.Prone)) { +// this.health.value = Math.floor(this.health.value * 0.75); +// } +// } + +// this.health.pct = Math.floor((this.health.value / this.health.max) * 100); + +// this.healingBase.setBase(this.actor.system.calcAttributeAverage('Endurance', 'Will')); + +// // Account for carried weight in encumbrance +// const weightEnc = this.weightCarried.getProperty('total') / 4; +// if (weightEnc) this.encumbrance.add(`Carried Weight Encumbrance`, `WtEnc`, weightEnc); + +// this.fatigue.personal.add('Encumbrance', 'Enc', this.encumbrance.getProperty('total')); + +// const strMod = this.strengthMod * -5; +// if (strMod) { +// this.actor.system.encumbrance.add('Strength Modifier', 'StrMod', strMod); +// } +// } + +// /** +// * Determines whether the target is inside the attacker's engagement zone. This is used because with battlemaps, +// * distances are usually expressed in terms of 5 feet, such as 5', 10', 15', etc. In the case, a dagger with a +// * reach of 3 would never be able to engage any targets. This effectively "expands" the reach of most weapons to +// * the next highest 5' area. +// * +// * This problem is not typical with missiles, so for those we just check whether the target is within the missile's range. +// * +// * @param {object} atkWeapon Attacker's weapon +// * @param {number} tgtDistance Distance in feet to the target +// * @returns true if the target is inside the attacker's engagement zone, otherwise false +// */ +// static insideEngagementZone(atkWeapon, tgtDistance) { +// let result = false; +// if (['weapon', sohl.CombatTechniqueItemData.typeName].includes(atkWeapon.type)) { +// let ezReach = 1; +// if (atkWeapon.reach.effective >= 2) { +// ezReach += Math.trunc((atkWeapon.reach.effective - 2) / 5) * 5; +// } +// result = tgtDistance <= ezReach; +// } else if (atkWeapon.type === 'missile') { +// result = tgtDistance <= atkWeapon.distance; +// } + +// return result; +// } + +// /* ------------------------------------------------------------ */ +// /* Miscellaneous Tests */ +// /* ------------------------------------------------------------ */ + +// /** +// * Perform a shock test and display a chat card with the results of the test. +// * +// * @param {object} [options={}] Options which specify how to perform the test +// * @param {number} [options.shockIndex=0] Default shock index to start with +// * @param {boolean} [options.skipDialog=false] Do not present dialog, use default behavior +// * @returns Object containing the results of the test +// * +// * @override +// */ +// async shockTest({ shockIndex = 0, skipDialog = false } = {}) { +// // This function does not use the standard d100StdRoll function, since it also includes +// // the ShockIndex. So we do all the calculation here. + +// const mods = LgndCombatModifier.create(this, this.actor.getCombatStat('Shock')); + +// const rollData = { +// diceSize: 100, +// diceNum: 1, +// mod: mods, +// shockIndex, +// title: `Shock Test`, +// type: 'shock' +// }; + +// // Shock rolls are never affected by Stun penalties +// // Also, shock rolls are never affected by impairment penalties, only fatigue + +// if (!skipDialog) { +// // Render modal dialog +// let dlgTemplate = "systems/sohl/templates/dialog/shock-test-dialog.html"; +// let dialogData = { +// target: rollData.mod.effective, +// mods: rollData.mod.mods, +// modifier: 0, +// shockIndex: rollData.shockIndex, +// successLevelMod: rollData.mod.successLevelMod +// }; +// const html = await renderTemplate(dlgTemplate, dialogData); + +// // Create the dialog window +// const dlgResult = await Dialog.prompt({ +// title: rollData.title, +// content: html.trim(), +// label: "Shock Test", +// callback: html => { +// const form = html[0].querySelector("form"); +// const formModifier = Number.parseInt(form.modifier.value, 10); +// const formSuccessLevelMod = Number.parseInt(form.successLevelMod.value, 10); +// const formShockIndex = Number.parseInt(form.shockIndex.value, 10); +// if (formModifier) { +// dialogData.add("Player Modifier", 'PlyrMod', formModifier); +// } +// const rollTestData = { +// mods: dialogData.mods, +// successLevelMod: formSuccessLevelMod, +// shockIndex: formShockIndex +// }; +// return rollTestData; +// }, +// rejectClose: false +// }); +// if (!dlgResult) return null; + +// rollData.mod.mods = dlgResult.mods; +// rollData.mod.successLevelMod = dlgResult.successLevelMod; +// rollData.shockIndex = dlgResult.shockIndex; +// LgndUtility.applyMods(rollData.mod); +// } + +// const roll = await LgndDice.rollTest(rollData); +// if (!roll) return null; + +// // Prepare for Chat Message +// const chatTemplate = 'systems/sohl/templates/chat/shock-card.html'; + +// const shockRollMod = 1 - roll.successLevel; +// const curShock = this.system.shock; +// let finalShockIndex = rollData.shockIndex + shockRollMod; + +// const shockText = Object.keys(LGND.CONST.SHOCK); + +// const chatTemplateData = { +// title: rollData.title, +// origShockML: rollData.mod.basis, +// shockML: roll.target, +// shockTestMod: Math.abs(rollData.mod.effMod), +// stPlusMinus: rollData.mod.effMod < 0 ? '-' : '+', +// curShock: shockText[curShock], +// successLevelMod: roll.successLevelMod, +// shockRollMod: Math.abs(shockRollMod), +// siPlusMinus: shockRollMod < 0 ? '-' : '+', +// origShockIndex: rollData.shockIndex, +// finalShockIndex, +// stRollValue: roll.rollObj.total, +// shockText: 'No change', +// shockUpgradeText: '', +// description: roll.description, +// isSuccess: roll.isSuccess, +// isCritical: roll.isCritical, +// isCS: roll.isSuccess && roll.isCritical, +// isMS: roll.isSuccess && !roll.isCritical, +// isMF: !roll.isSuccess && !roll.isCritical, +// isCF: !roll.isSuccess && roll.isCritical +// }; + +// if (finalShockIndex >= 10) { +// chatTemplateData.shockText = shockText[LGND.CONST.SHOCK.Killed]; +// } else if (finalShockIndex === 9) { +// chatTemplateData.shockText = shockText[LGND.CONST.SHOCK.Unconscious]; +// } else if (finalShockIndex === 8) { +// if (curShock === LGND.CONST.SHOCK.Incapacitated) { +// chatTemplateData.shockText = shockText[LGND.CONST.SHOCK.Unconscious]; +// chatTemplateData.shockUpgradeText = "Incapacitated result when already incapacitated changes to Unconscious" +// } else { +// chatTemplateData.shockText = shockText[LGND.CONST.SHOCK.Incapacitated]; +// } +// } else if (finalShockIndex === 7) { +// if (curShock === LGND.CONST.SHOCK.Stunned) { +// chatTemplateData.shockText = shockText[LGND.CONST.SHOCK.Incapacitated]; +// chatTemplateData.shockUpgradeText = "Stunned result when already stunned changes to Incapacitated" +// } else { +// chatTemplateData.shockText = shockText[LGND.CONST.SHOCK.Stunned]; +// } +// } + +// chatTemplateData.finalShockIndex = finalShockIndex; + +// const html = await renderTemplate(chatTemplate, chatTemplateData); + +// const messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.ROLL, +// sound: CONFIG.sounds.dice, +// roll: roll.rollObj +// }; + +// const messageOptions = { +// rollMode: game.settings.get("core", "rollMode") +// }; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) + +// return chatTemplateData; +// } + +// /** +// * Perform a shock re-test and display a chat card with the results of the test. +// * +// * @param {object} [options={}] Options which specify how to perform the test +// * @param {boolean} [options.skipDialog=false] Do not present dialog, use default behavior +// * @returns Object containing the results of the test +// * +// * @override +// */ +// async shockReTest({ skipDialog = false } = {}) { +// const extraMods = LgndUtility.addMod([], 'Shock Re-Test', 'ShkRT', -20); + +// const shockSkill = this.itemTypes.skill.find(it => it.name === 'Shock'); +// if (!shockSkill) { +// const msg = `${this.isToken ? this.token.name : this.name} does not have the Shock skill, can't perform Shock Re-Test`; +// ui.notifications.warn(msg); +// console.warn(`sohl.SoHL | ${msg}`); +// return null; +// } + +// const skillRollResult = await this.skillTest(shockSkill, { +// skipDialog, +// noChat: true, +// extraMods +// }); +// if (!skillRollResult) return null; + +// skillRollResult.title = 'Shock Re-Test'; + +// if (skillRollResult.isCritical) { +// if (skillRollResult.isSuccess) { +// skillRollResult.resultText = 'Shock Removed'; +// skillRollResult.resultDesc = "Character's Shock State is Removed"; +// } else { +// if (skillRollResult.lastDigit === 5) { +// skillRollResult.resultText = 'Extended Shock'; +// skillRollResult.resultDesc = 'Character suffers Extended Shock (HR4)'; +// } else { +// skillRollResult.resultText = 'Extended Shock'; +// skillRollResult.resultDesc = 'Character suffers Extended Shock (HR4)'; +// } + +// if (this.effects.has(LGND.CONST.STATUSEFFECTS.UNCONSCIOUS)) { +// skillRollResult.resultText += ' and Coma'; +// skillRollResult.resultDesc += ' and lapses into a Coma'; +// } +// } +// } else { +// if (skillRollResult.isSuccess) { +// skillRollResult.resultText = 'Stunned'; +// skillRollResult.resultDesc = "Character's Shock State changes to Stunned"; +// } else if (!skillRollResult.isSuccess) { +// skillRollResult.resultText = 'Extended Shock'; +// skillRollResult.resultDesc = 'Character suffers Extended Shock (HR4)'; +// } +// } + +// const chatTemplate = 'systems/sohl/templates/chat/standard-test-card.html'; + +// const html = await renderTemplate(chatTemplate, skillRollResult); + +// const messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.ROLL, +// sound: CONFIG.sounds.dice, +// roll: skillRollResult.roll.rollObj +// }; + +// const messageOptions = { +// rollMode: game.settings.get("core", "rollMode") +// }; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) + +// return skillRollResult; +// } + +// /** +// * Perform a treatment test display a chat card with the results of the test. No update of injuries are performed. +// * +// * @param {object} [options={}] Options which specify how to perform the test +// * @returns Object containing the results of the test +// * +// * @override +// */ +// async treatmentTest(options = {}) { +// // Get important injury info: severity and aspect +// const dlgHtml = ` +//
+//
+// +// +//
+ +//
+// +// +//
+//
`; + +// // Pop up the dialog to get the defender's data +// const dlgResult = await Dialog.prompt({ +// title: "Injury Information", +// content: dlgHtml.trim(), +// label: "OK", +// callback: html => { +// const form = html[0].querySelector("form"); +// const result = { +// aspect: form.aspect.value, +// severity: form.severity.value +// } +// return result; +// }, +// rejectClose: false +// }); + +// // If dialog cancelled then quit +// if (!dlgResult) return null; +// const aspect = dlgResult.aspect; +// const severity = dlgResult.severity; +// const treatBase = LGND.CONST.treatment[aspect][severity]; + +// const confirmTreatment = await Dialog.confirm({ +// title: "Confirm Treatment", +// content: `

Please confirm you have the necessary materials and equipment +// to perform ${treatBase.treatment} on the patient.

`, +// defaultYes: true, +// rejectClose: false +// }); +// if (!confirmTreatment) return null; + +// let treatmentMods = treatBase.mod ? LgndUtility.addMod([], treatBase.mod.name, treatBase.mod.abbr, treatBase.mod.value) : []; +// if (aspect === 'Projectile') { +// if (severity === 'S') { +// LgndUtility.addMod(treatmentMods, 'Broadhead Penalty', 'BrdPnlt', -20); +// } else if (severity === 'G') { +// LgndUtility.addMod(treatmentMods, 'Broadhead Penalty', 'BrdPnlt', -30); +// } +// } + +// if (treatBase.useDexMod) { +// const attr = this.itemTypes.trait.find(trait => trait.name === 'Dexterity')?.system; +// if (attr) LgndUtility.addMod(treatmentMods, 'Dexterity Secondary Modifier', 'Dex2Mod', attr.targetLevel.secMod); +// } + +// const skillRollResult = await this.skillTest("Physician", { +// label: 'Treatment Test', +// noChat: true +// }); +// if (!skillRollResult) return null; + +// skillRollResult.title = 'Treatment Test'; +// let treatBaseResult; +// if (skillRollResult.isSuccess) { +// if (skillRollResult.isCritical) { +// treatBaseResult = treatBase.cs; +// } else { +// treatBaseResult = treatBase.ms; +// } +// } else { +// if (skillRollResult.isCritical) { +// treatBaseResult = treatBase.cf; +// } else { +// treatBaseResult = treatBase.mf; +// } +// } + +// skillRollResult.resultText = treatBaseResult.hr < 0 ? 'Healed' : `Heal Rate H${treatBaseResult.hr}`; +// skillRollResult.resultDesc = `Treatment is ${treatBase.treatment}.`; +// if (treatBaseResult.infect) skillRollResult.resultDesc += ' NOTE: Infection risk.'; +// if (treatBaseResult.impair) skillRollResult.resultDesc += ' NOTE: Permanent impairment risk.'; +// if (treatBaseResult.bleed) skillRollResult.resultDesc += ' NOTE: Treatment results in a bleeder.'; +// if (treatBaseResult.newInj > 0) { +// const newsev = treatBaseResult.newInj > 3 ? "G" : (treatBaseResult.newInj > 1 ? "S" : "M"); +// skillRollResult.resultDesc += ' NOTE: Amputation results in a new ${newsev}${treatBaseResult.newInj} edged injury.'; +// } + +// // const chatTemplateData = foundry.utils.mergeObject({ +// // severity: severity === 'G' ? 'Grevious' : (severity === 'S' ? 'Serious' : 'Minor'), +// // aspect, +// // treatment: treatBase.treatment, +// // useDexMod: treatBase.useDexMod, +// // newSev: treatBaseResult.newInj > 3 ? "G" : (treatBaseResult.newInj > 1 ? "S" : "M"), +// // }, treatBaseResult); + +// // const chatTemplate = 'systems/sohl/templates/chat/treatment-result-card.html'; +// const chatTemplate = 'systems/sohl/templates/chat/standard-test-card.html'; + +// const html = await renderTemplate(chatTemplate, skillRollResult); + +// const messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.OTHER +// }; + +// // Create a chat message +// await ChatMessage.create(messageData); + +// return skillRollResult; +// } + +// /** +// * Perform a fear test and display a chat card with the results of the test. If applicable, a new fear stress item will be created. +// * +// * @param {string} fearName Stress item representing fear +// * @param {object} [options={}] Options which specify how to perform the test +// * @param {boolean} [options.skipDialog=false] Do not present dialog, use default behavior +// * @returns Object containing the results of the test +// * +// * @override +// */ +// async fearTest(fearName, { skipDialog = false } = {}) { +// let fearItem = fearName ? this.getItem(fearName, { types: [sohl.StressItemData.typeName] }) : null; + +// if (fearItem) { +// if (fearItem.system.type !== 'Fear') { +// throw new Error(`sohl.SoHL | Stress item ${fearItem.name} is of type '${fearItem.system.type}', not Fear`); +// } +// } else { +// let dlgHtml = ` +//
+//
+// +//
'; +// const dlgResult = await Dialog.prompt({ +// title: 'Select Fear Source', +// content: dlgHtml.trim(), +// label: 'OK', +// callback: html => { +// const form = html[0].querySelector("form"); +// return form.source.value; +// }, +// rejectClose: false +// }); +// if (!dlgResult) return null; +// if (dlgResult !== 'New') { +// fearItem = this.getItem(dlgResult, { types: [sohl.StressItemData.typeName] }); +// } else { +// const name = sohl.SohlActorSheet._createUniqueName('New Fear', this.itemTypes.stress); +// fearItem = { +// name: name, +// type: sohl.StressItemData.typeName, +// system: { +// type: 'Fear', +// level: { +// base: sohl.StressItemData.fearLevels.Steady, +// mods: LgndUtility.setModBase(sohl.StressItemData.fearLevels.Steady) +// }, +// nextCheckTime: game.time.worldTime, +// createdTime: game.time.worldTime +// } +// }; +// LgndUtility.applyMods(fearItem.system.level); +// } +// } + +// const oldFearLevel = fearItem.system.level.effective; +// const fearStates = Object.keys(sohl.StressItemData.fearLevels); + +// const attrRollResult = await this.attributeTest("Will", { +// skipDialog, +// label: 'Fear Test', +// noChat: true +// }); +// const name = this.isToken ? this.token.name : this.name +// let newFearLevel = sohl.StressItemData.fearLevels.Steady; +// let addInspiredAE = false; + +// if (attrRollResult.isCritical) { +// if (attrRollResult.isSuccess) { +// attrRollResult.resultText = fearStates[sohl.StressItemData.fearLevels.Brave]; +// attrRollResult.resultDesc = ''; +// addInspiredAE = true; +// newFearLevel = sohl.StressItemData.fearLevels.Brave; +// } else { +// if (attrRollResult.lastDigit === 5) { +// attrRollResult.resultText = fearStates[sohl.StressItemData.fearLevels.Terrified]; +// attrRollResult.resultDesc = ''; +// newFearLevel = sohl.StressItemData.fearLevels.Terrified; +// } else { +// attrRollResult.resultText = fearStates[sohl.StressItemData.fearLevels.Catatonic]; +// attrRollResult.resultDesc = ''; +// newFearLevel = sohl.StressItemData.fearLevels.Catatonic; +// } +// } +// } else { +// if (attrRollResult.isSuccess) { +// attrRollResult.resultText = fearStates[sohl.StressItemData.fearLevels.Steady]; +// attrRollResult.resultDesc = ''; +// newFearLevel = sohl.StressItemData.fearLevels.Steady; +// } else { +// attrRollResult.resultText = fearStates[sohl.StressItemData.fearLevels.Afraid]; +// attrRollResult.resultDesc = ''; +// newFearLevel = sohl.StressItemData.fearLevels.Afraid; +// } +// } + +// if (addInspiredAE) { +// // Create a new AE to provide the +20 to all further Fear and Morale rolls for 10 minutes +// } + +// if (!fearItem.id) { +// fearItem.system.level = { base: newFearLevel }; +// const updateData = foundry.utils.flattenObject(fearItem); +// fearItem = await Item.create(updateData, { parent: this }); +// } else if (newFearLevel !== oldFearLevel) { +// await fearItem.update({ "system.level.base": newFearLevel }); +// } + +// const chatTemplate = 'systems/sohl/templates/chat/standard-test-card.html'; + +// const html = await renderTemplate(chatTemplate, attrRollResult); + +// const messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.ROLL, +// sound: CONFIG.sounds.dice, +// roll: attrRollResult.roll.rollObj +// }; + +// const messageOptions = { +// rollMode: game.settings.get("core", "rollMode") +// }; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) +// attrRollResult.item = fearItem; +// return attrRollResult; +// } + +// /** +// * Perform a morale test and display a chat card with the results of the test. If applicable, a new morale stress item will be created. +// * +// * @param {string} morale Stress item representing the morale +// * @param {object} [options={}] Options which specify how to perform the test +// * @param {boolean} [options.skipDialog=false] Do not present dialog, use default behavior +// * @returns Object containing the results of the test +// * +// * @override +// */ +// async moraleTest(moraleName, { skipDialog = false } = {}) { +// let morale = this.getItem(moraleName, { types: [sohl.StressItemData.typeName] }); + +// if (morale) { +// if (morale.system.type !== 'Morale') { +// throw new Error(`sohl.SoHL | Stress item ${morale.name} is of type '${morale.system.type}', not Morale`); +// } +// } else { +// let dlgHtml = ` +//
+//
+// +//
'; +// const dlgResult = await Dialog.prompt({ +// title: 'Select Morale Source', +// content: dlgHtml.trim(), +// label: 'OK', +// callback: html => { +// const form = html[0].querySelector("form"); +// return form.source.value; +// }, +// rejectClose: false +// }); +// if (!dlgResult) return null; +// if (dlgResult !== 'New') { +// morale = this.getItem(dlgResult, sohl.StressItemData.typeName); +// } else { +// const name = sohl.SohlActorSheet._createUniqueName('New Morale', this.itemTypes.stress); +// morale = { +// name: name, +// type: sohl.StressItemData.typeName, +// system: { +// type: 'Morale', +// level: { +// base: sohl.StressItemData.moraleLevels.Steady, +// mods: LgndUtility.setModBase(sohl.StressItemData.moraleLevels.Steady) +// }, +// nextCheckTime: game.time.worldTime, +// createdTime: game.time.worldTime +// } +// }; +// LgndUtility.applyMods(morale.system.level); +// } +// } + +// const oldMoraleLevel = morale.system.level.effective; +// const moraleStates = Object.keys(sohl.StressItemData.moraleLevels); + +// const skillRollResult = await this.skillTest("Initiative", { +// skipDialog, +// label: 'Morale Test', +// noChat: true +// }); +// if (!skillRollResult) return null; + +// skillRollResult.title = 'Morale Test'; +// let newMoraleLevel = sohl.StressItemData.moraleLevels.Steady; +// let addInspiredAE = false; +// if (skillRollResult.isCritical) { +// if (skillRollResult.isSuccess) { +// skillRollResult.resultText = moraleStates[sohl.StressItemData.fearLevels.Brave]; +// skillRollResult.resultDesc = ''; +// addInspiredAE = true; +// newMoraleLevel = sohl.StressItemData.moraleLevels.Brave; +// } else { +// if (skillRollResult.lastDigit === 5) { +// skillRollResult.resultText = moraleStates[sohl.StressItemData.fearLevels.Terrified]; +// skillRollResult.resultDesc = ''; +// newMoraleLevel = sohl.StressItemData.moraleLevels.Routed; +// } else { +// skillRollResult.resultText = moraleStates[sohl.StressItemData.fearLevels.Catatonic]; +// skillRollResult.resultDesc = ''; +// newMoraleLevel = sohl.StressItemData.moraleLevels.Catatonic; +// } +// } +// } else { +// if (skillRollResult.isSuccess) { +// skillRollResult.resultText = moraleStates[sohl.StressItemData.fearLevels.Steady]; +// skillRollResult.resultDesc = ''; +// newMoraleLevel = sohl.StressItemData.moraleLevels.Steady; +// } else { +// skillRollResult.resultText = moraleStates[sohl.StressItemData.fearLevels.Afraid]; +// skillRollResult.resultDesc = ''; +// newMoraleLevel = sohl.StressItemData.moraleLevels.Withdrawing; +// } +// } + +// if (!morale.id) { +// morale.system.level = { base: newMoraleLevel }; +// const updateData = foundry.utils.flattenObject(morale); +// morale = await Item.create(updateData, { parent: this }); +// } else if (newMoraleLevel !== oldMoraleLevel) { +// await morale.update({ "system.level.base": newMoraleLevel }); +// } + +// const chatTemplate = 'systems/sohl/templates/chat/standard-test-card.html'; + +// const html = await renderTemplate(chatTemplate, skillRollResult); + +// const messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.ROLL, +// sound: CONFIG.sounds.dice, +// roll: skillRollResult.roll.rollObj +// }; + +// const messageOptions = { +// rollMode: game.settings.get("core", "rollMode") +// }; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) + +// skillRollResult.item = morale; +// return skillRollResult; +// } + +// /** +// * Perform a rally test and display a chat card with the results of the test. +// * +// * @param {object} [options={}] Options which specify how to perform the test +// * @param {boolean} [options.skipDialog=false] Do not present dialog, use default behavior +// * @returns Object containing the results of the test +// * +// * @override +// */ +// async rallyTest({ skipDialog = false } = {}) { +// const name = this.isToken ? this.token.name : this.name + +// const skillRollResult = await this.skillTest("Command", { +// skipDialog, +// label: 'Rally Test', +// noChat: true +// }); +// if (!skillRollResult) return null; + +// skillRollResult.title = skillRollResult.label; +// if (skillRollResult.isCritical) { +// if (skillRollResult.isSuccess) { +// skillRollResult.resultText = 'Steady'; +// skillRollResult.resultDesc = 'Allies cease withdrawing'; +// } else { +// skillRollResult.resultText = 'Unresponsive'; +// skillRollResult.resultDesc = 'Allies will not respond to any Rally Rolls for ten minutes (120 rounds)'; +// } +// } else { +// if (skillRollResult.isSuccess) { +// skillRollResult.resultText = 'Reaction Roll'; +// skillRollResult.resultDesc = 'At start of their turn, allies make a Reaction Roll'; +// } else { +// skillRollResult.resultText = 'Unresponsive'; +// skillRollResult.resultDesc = 'Allies will not respond to any Rally Rolls for one minute (12 rounds)'; +// } +// } + +// const chatTemplate = 'systems/sohl/templates/chat/standard-test-card.html'; + +// const html = await renderTemplate(chatTemplate, skillRollResult); + +// const messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.ROLL, +// sound: CONFIG.sounds.dice, +// roll: skillRollResult.roll.rollObj + +// }; + +// const messageOptions = { +// rollMode: game.settings.get("core", "rollMode") +// }; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) + +// return skillRollResult; +// } + +// /** +// * Perform a stumble test and display a chat card with the results of the test. +// * +// * @param {object} [options={}] Options which specify how to perform the test +// * @param {boolean} [options.skipDialog=false] Do not present dialog, use default behavior +// * @returns Object containing the results of the test +// * +// * @override +// */ +// async stumbleTest({ skipDialog = false } = {}) { +// let skillRollResult; +// const acrobatics = this.items.find(it => it.system instanceof sohl.SkillItemData && it.name === 'Acrobatics'); +// const aglAttr = this.itemTypes.trait.find(trait => trait.name === 'Agility'); + +// if (!acrobatics && !aglAttr) { +// const msg = `${this.isToken ? this.token.name : this.name} does not have Acrobatics skill or Agility attribute, so cannot Stumble`; +// ui.notifications.warn(msg); +// console.warn(`sohl.SoHL | ${msg}`); +// return null; +// } + +// if (!aglAttr || acrobatics?.system.masteryLevel.effective > aglAttr.system.targetLevel.effective) { +// skillRollResult = await this.skillTest(acrobatics.id, { +// skipDialog, +// label: 'Stumble (Acrobatics) Test' +// }); +// } else { +// skillRollResult = await this.attributeTest(aglAttr.id, { +// skipDialog, +// label: 'Stumble (Agility) Test' +// }); +// } + +// return skillRollResult; +// } + +// /** +// * Perform a fumble test and display a chat card with the results of the test. +// * +// * @param {object} [options={}] Options which specify how to perform the test +// * @param {boolean} [options.skipDialog=false] Do not present dialog, use default behavior +// * @returns Object containing the results of the test +// * +// * @override +// */ +// async fumbleTest({ skipDialog = false } = {}) { +// const legerdemain = this.items.find(it => it.system instanceof sohl.SkillItemData && it.name === 'Legerdemain'); +// const dexAttr = this.itemTypes.trait.find(trait => trait.name === 'Dexterity'); + +// if (!legerdemain && !dexAttr) { +// const msg = `${this.isToken ? this.token.name : this.name} does not have Legerdemain skill or Dexterity attribute, so cannot Fumble`; +// ui.notifications.warn(msg); +// console.warn(`sohl.SoHL | ${msg}`); +// return null; +// } + +// let skillRollResult; +// if (!dexAttr || legerdemain?.system.masteryLevel.effective > dexAttr.system.targetLevel.effective) { +// skillRollResult = await this.skillTest(legerdemain.id, { +// skipDialog, +// label: 'Fumble (Legerdemain) Test' +// }); +// } else { +// skillRollResult = await this.attributeTest(dexAttr.id, { +// skipDialog, +// label: 'Fumble (Dexterity) Test' +// }); +// } + +// return skillRollResult; +// } + +// /** +// * Modify the quantity of projectiles carried. +// * +// * @param {LgndItem} item Projectile to change quantity +// * @param {string} newValue New quantity value. If starts with + or -, then quantity change will +// * be relative to current quantity, otherwise quantity will be set to the specified value +// * @param {object} [options={}] Options which specify how to perform the test +// * +// * @override +// */ +// async changeMissileQuanity(projectileName, newValue, options = {}) { +// let item = this.getItem(projectileName, { types: [sohl.ProjectileGearItemData.typeName] }); +// if (!item) return null; + +// if (!this.actor.isOwner) { +// ui.notifications.warn(`You are not an owner of ${this.actor.name}, so you may not change ${item.name} quantity.`); +// return false; +// } + +// const updateData = {}; +// if (/^\s*[+-]/.test(newValue)) { +// // relative change +// const changeValue = parseInt(newValue, 10); +// if (!isNaN(changeValue)) updateData['system.quantity'] = Math.max(item.system.quantity + changeValue, 0); +// } else { +// const value = parseInt(newValue, 10); +// if (!isNaN(value)) updateData['system.quantity'] = value; +// } + +// if (typeof updateData['system.quantity'] !== 'undefined') { +// await item.update(updateData); +// } +// return true; +// } + +// /*--------------------------------------------------------------*/ +// /* OPPOSED ROLLS */ +// /*--------------------------------------------------------------*/ + +// /** +// * Perform an opposed test for the given skill, attribute, spell, or arcane talent against the current targeted token. +// * +// * @param {LgndItem} item Skill, attribute, spell, or arcane talent to oppose +// * @param {object} [options={}] Options which specify how to perform the test +// * +// * @override +// */ +// async opposedTest(skillName, options = {}) { +// let item = this.getItem(skillName, { types: [sohl.SkillItemData.typeName, sohl.TraitItemData.typeName, sohl.MysticalAbilityItemData.typeName] }); + +// //const targetToken = this.#getTargetedToken(); +// //if (!targetToken) return null; + +// const targetLevel = item.system.masteryLevel || item.system.targetLevel; +// if (!targetLevel) { +// const msg = `${item.name} does not support opposed rolls.`; +// ui.notifications.warn(msg); +// console.warn(`sohl.SoHL | ${msg}`); +// return null; +// } + +// if (this && this.system.shock === LGND.CONST.SHOCK.Stunned) targetLevel.successLevelMod--; + +// const dialogOptions = foundry.utils.mergeObject({ +// type: `opposed-${item.type}-roll`, +// label: `Opposed ${item.name} Test Request`, +// showSuccessLevel: true, +// }, targetLevel); + +// // Get roll info +// const rollData = await LgndDice.d100StdDialog(dialogOptions); + +// // If user cancelled the roll, then return immediately +// if (!rollData) return null; + +// // Prepare for Chat Message +// const chatTemplate = 'systems/sohl/templates/chat/standard-test-card.html'; + +// const chatTemplateData = { +// isOpposedTest: true, +// title: dialogOptions.label, +// attacker: this.name, +// atkActorUuid: this.uuid, +// mods: rollData.mods, +// atkRollData: JSON.stringify(rollData), +// effTarget: rollData.target, +// successLevelMod: rollData.successLevelMod, +// itemUuid: item.uuid, +// itemName: item.name, +// itemType: item.type +// }; + +// const html = await renderTemplate(chatTemplate, chatTemplateData); + +// const messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.OTHER +// }; + +// // Create a chat message +// await ChatMessage.create(messageData) + +// chatTemplateData.item = item; +// return chatTemplateData; +// } + +// /*--------------------------------------------------------------*/ +// /* AUTOMATED COMBAT */ +// /*--------------------------------------------------------------*/ + +// /** +// * Displays a dialog asking user to choose a weapon. +// * +// * @param {Token} atkToken +// * @param {number} distanceToTarget +// * @param {object} options +// * @param {string} [options.type] Type of weapon: 'weapon', 'missile', CombatTechniqueItemData.typeName +// * @param {string} [options.weaponUuid=null] Weapon ID to use (bypass dialog) +// * @returns {object} Selected weapon +// */ +// static async _selectWeaponDialog(atkToken, distanceToTarget, { types = ['weapon', 'missile', sohl.CombatTechniqueItemData.typeName], weaponId = null } = {}) { +// let result = null; +// if (weaponId) { +// const item = atkToken.actor.getItem(weaponId, { types }); +// if (!item) { +// ui.notifications.warn(`${atkToken.name} does not have a weapon with ID ${weaponId}`); +// return null; +// } + +// const insideEZ = this.insideEngagementZone(item, distanceToTarget) +// if (!insideEZ) { +// ui.notifications.warn(`${atkToken.name}'s ${item.name} cannot reach target, distance=${distanceToTarget}ft.`); +// return null; +// } + +// result = item; +// } else { +// const atkWpns = this.#getWeapons(atkToken, distanceToTarget, { types }); + +// if (!atkWpns.weapons.length) { +// ui.notifications.warn(`${atkToken.name} does not have any usable weapons of type ${types.map(t => LgndItem.typeLabels[t].singular).join(' or ')}.`); +// return null; +// } + +// const queryWeaponDialog = "systems/sohl/templates/dialog/query-weapon-dialog.html"; + +// const dlgHtml = await renderTemplate(queryWeaponDialog, { +// weapons: atkWpns.weapons, +// weaponUuid: atkWpns.defaultWeapon || atkWpns.weapons[0], +// prompt: 'Please select your weapon' +// }); + +// // Request weapon name +// const weaponUuid = await Dialog.prompt({ +// title: 'Select Weapon', +// content: dlgHtml.trim(), +// label: "OK", +// callback: html => { +// const form = html[0].querySelector("form"); +// const formWeaponUuid = form.weaponUuid.value; +// return formWeaponUuid; +// }, +// rejectClose: false +// }); + +// result = atkToken.actor.getItem(weaponUuid); +// } + +// return result; +// } + +// /** +// * Returns an array of either 1 or two numbers, representing the minimum zone die and the next higher +// * zone die that is less than the maximum number of specified zones. Normally should return two +// * numbers, but in the case where the next higher zone number is greater than the maxZones, there +// * will only be one number. +// */ +// static #zoneDieChoices(minZoneDie, maxZones) { +// const result = []; +// for (let zd in sohl.BodyZoneData.dice) { +// if (zd < minZoneDie) continue; +// if (zd > maxZones) continue; +// result.push(zd); +// if (result.length === 2) break; +// } +// if (!result.length) result.push(minZoneDie); +// return result; +// } + +// /** +// * @typedef {object} AttackProperties +// * @property {number} zoneOffset +// * @property {number} zoneDie +// * @property {number} successLevelMod +// * @property {boolean} isStillTarget +// * @property {ModObject} attack +// * @property {ModObject} impact +// */ + +// /** +// * Queries for the ZD, Aim Zone, and situational modifiers. +// * +// * @param {object} options Additional options for the attack +// * @param {Token} [options.attackToken] Token representing attacker +// * @param {Token} [options.defendToken] Token representing defender +// * @param {object} [options.weapon] The weapon to be used in the attack +// * @param {string} [options.type] One of 'Attack' or 'Counterstrike' +// * @param {number} [options.distance] Distance to the target +// * +// * @returns {Object} Attack properties on success, null if abandoned. +// */ + +// static async _attackDialog({ attackToken, defendToken, weaponItem, type = 'Attack', distance = 0 } = {}) { +// if (!attackToken || !defendToken) return null; + +// const dialogOptions = { +// title: `${attackToken.name} vs. ${defendToken.name} ${type} with ${weaponItem.name}`, +// distance: distance, +// zoneOffset: 0, +// weapon: weaponItem.name, +// zoneDieChoices: this.#zoneDieChoices(weaponItem.zoneDie, attackToken.actor.system.maxZones), +// impactLabel: weaponItem.impact.label, +// attackMods: weaponItem.attack.mods || [], +// attackModifier: 0, +// impactMods: weaponItem.impact.mods || [], +// impactModifier: 0, +// successLevelMod: weaponItem.attack.successLevelMod || 0, +// isMissile: weaponItem.type === 'missile', +// attackerMoving: false +// }; + +// const attackDialogTemplate = "systems/sohl/templates/dialog/attack-dialog.html"; +// const dlgHtml = await renderTemplate(attackDialogTemplate, dialogOptions); + +// // Request weapon details +// return await Dialog.prompt({ +// title: dialogOptions.title, +// content: dlgHtml.trim(), +// label: type, +// callback: html => { +// const form = html[0].querySelector("form"); +// const formZoneOffset = Number.parseInt(form.zoneOffset.value, 10) || 0; +// const formZoneDie = Number.parseInt(form.zoneDie.value, 10) || weaponItem.zoneDie; +// const formAttackModifier = Number.parseInt(form.attackModifier.value, 10) || 0; +// const formLgndImpactModifier = Number.parseInt(form.impactModifier.value, 10) || 0; +// const formSuccessLevelMod = Number.parseInt(form.successLevelMod.value, 10) || 0; + +// const result = { +// zoneDieFormula: LgndInjuryRuleset.calcZoneDieFormula(formZoneDie, formZoneOffset), +// successLevelMod: formSuccessLevelMod, +// isStillTarget: false, +// attack: foundry.utils.deepClone(type === 'Counterstrike' ? weaponItem.defense.counterstrike : weaponItem.attack), +// impact: foundry.utils.deepClone(weaponItem.impact) +// }; + +// if (formAttackModifier) { +// result.attack.add("Player Modifier", "PlyrMod", formAttackModifier); +// } + +// if (formLgndImpactModifier) { +// result.impact.add("Player Modifier", "PlyrMod", formLgndImpactModifier); +// } + +// if (dialogOptions.isMissle) { +// switch (form.targetMovement.value) { +// case 'still': +// result.isStillTarget = true; +// break; + +// case 'moving': +// result.attack.add(`${defToken.name} Moving`, 'TgtMove', -10); +// break; + +// case 'evading': +// const siPenalty = (defToken.actor.getCombatStat('Dodge').getProperty('index') * 4) || 0; +// const penalty = Math.min(siPenalty, -10); +// result.attack.add(`${defToken.name} Evading`, 'TgtEvade', penalty); +// break; +// } + +// if (weaponItem.assocSkill !== 'Throwing' && form.attackerMoving?.value) { +// result.attack.add(`${atkToken.name} Moving`, 'AtkMove', -10); +// } +// } + +// LgndUtility.applyMods(result.attack); +// LgndUtility.applyMods(result.impact); + +// return result; +// }, +// rejectClose: false +// }); +// } + +// /** +// * Determine default weapon for a particualr actor based on maximum impact. +// * +// * @param {Token} token Attacking token with weapons +// * @returns An object containing a list of weapons and the default weapon id +// */ +// static #getWeapons(token, distanceToTarget, { types = ['weapon', 'missile', CombatTechniqueItemData.typeName], ignoreRange = false }) { +// let result = { weapons: [], defaultWeapon: null, maxImpact: Number.MIN_SAFE_INTEGER }; +// if (!this._isLivingToken(token)) return result; + +// // Note that container actors cannot have missiles or weapons equipped, so just immediately return +// if (token.actor.type === 'container') return result; + +// // Find all usable melee weapon strike modes +// if (types.includes('weapon')) { +// result = token.actor.system.weapons.reduce((list, w) => { +// if (!w.traits.noAttack) { +// const inEngZone = ignoreRange || this.insideEngagementZone(w, distanceToTarget); +// if (inEngZone) { +// list.weapons.push({ uuid: w.uuid, name: `Weapon: ${w.name}`, obj: w }); +// const maxImpact = w.impact.die + w.impact.effective; +// if (maxImpact > list.maxImpact) { +// list.defaultWeapon = w.uuid; +// list.maxImpact = maxImpact; +// } +// } +// } +// return list; +// }, result); +// } + +// // Find all usable combat techniques +// if (types.includes(CombatTechniqueItemData.typeName)) { +// result = token.actor.itemTypes.combattechnique.reduce((list, ct) => { +// if (!ct.system.traits.noAttack) { +// const inEngZone = ignoreRange || this.insideEngagementZone(ct, distanceToTarget); +// if (inEngZone) { +// list.weapons.push({ uuid: ct.uuid, name: `Combat Technique: ${ct.name}`, obj: ct }); +// const maxImpact = ct.system.impact.die + ct.system.impact.effective; +// if (maxImpact > list.maxImpact) { +// list.defaultWeapon = ct.uuid; +// list.maxImpact = maxImpact; +// } +// } +// } +// return list; +// }, result); +// } + +// // Find all usable missile weapons +// if (types.includes('missile')) { +// const usableMissiles = token.actor.system.missiles.reduce((coll, m) => { +// let missileWeapon = coll.get(m.weaponId) || m; + +// if ((ignoreRange || (distanceToTarget <= missileWeapon.distance))) { +// coll.set(m.weaponId, m.distance < missileWeapon.distance ? m : missileWeapon); +// } +// return coll; +// }, new Collection()); +// result.weapons = result.weapons.concat(usableMissiles.contents); +// } + +// return result; +// } + +// #getTargetedToken() { +// const targets = game.user.targets; +// if (!targets?.size) { +// ui.notifications.warn(`No targets selected, you must select exactly one target, action aborted.`); +// return null; +// } else if (targets.size > 1) { +// ui.notifications.warn(`${targets} targets selected, you must select exactly one target, action aborted.`); +// return null; +// } + +// const targetToken = Array.from(targets)[0]; + +// if (targetToken.id === this.token?.id) { +// ui.notifications.warn(`Source and target are identical, action aborted.`); +// return null; +// } + +// return targetToken; +// } + +// async #checkWeaponBreak(atkToken, atkWeapon, defToken, defWeapon) { +// if (!atkWeapon || !atkToken) { +// console.error(`sohl.SoHL | Attack weapon was not specified`); +// return { attackWeaponBroke: false, defendWeaponBroke: false }; +// } + +// if (!defWeapon || !defToken) { +// console.error(`sohl.SoHL | Defend weapon was not specified`); +// return { attackWeaponBroke: false, defendWeaponBroke: false }; +// } + +// // Weapon Break Check +// let atkWeaponBroke = false; +// let defWeaponBroke = false; + +// const atkWeaponQuality = atkWeapon.system.quality; +// const defWeaponQuality = defWeapon.system.quality; + +// const atkBreakRoll = await new Roll('3d6').evaluate({ async: true }); +// const defBreakRoll = await new Roll('3d6').evaluate({ async: true }); + +// if (atkWeaponQuality <= defWeaponQuality) { +// // Check attacker first, then defender +// atkWeaponBroke = atkBreakRoll.total > atkWeaponQuality; +// defWeaponBroke = !atkWeaponBroke && defBreakRoll.total > defWeaponQuality; +// } else { +// // Check defender first, then attacker +// defWeaponBroke = defBreakRoll.total > defWeaponQuality; +// atkWeaponBroke = !defWeaponBroke && atkBreakRoll.total > atkWeaponQuality; +// } + +// const chatData = {}; + +// const messageData = { +// user: game.user.id, +// style: CONST.CHAT_MESSAGE_STYLES.ROLL, +// sound: CONFIG.sounds.dice +// }; + +// const chatTemplate = "systems/sohl/templates/chat/weapon-break-card.html"; + +// // Prepare and generate Attack Weapon Break chat message + +// chatData.tokenName = atkToken.name; +// chatData.weaponName = atkWeapon.name; +// chatData.quality = atkWeapon.system.quality; +// chatData.weaponBroke = atkWeaponBroke; +// chatData.rollValue = atkBreakRoll.total; +// chatData.actorId = atkWeapon.parentId; +// chatData.title = "Attack Weapon Break Check"; + +// let html = await renderTemplate(chatTemplate, chatData); + +// messageData.content = html.trim(); +// messageData.speaker = ChatMessage.getSpeaker({ token: defToken }); +// messageData.roll = atkBreakRoll; + +// const messageOptions = {}; + +// await ChatMessage.create(messageData, messageOptions) + +// // Prepare and generate Defend Weapon Break chat message + +// chatData.tokenName = defToken.name; +// chatData.weaponName = defWeapon.name; +// chatData.quality = defWeapon.system.quality; +// chatData.weaponBroke = defWeaponBroke; +// chatData.rollValue = defBreakRoll.total; +// chatData.actorId = defWeapon.parentId; +// chatData.title = "Defend Weapon Break Check"; + +// html = await renderTemplate(chatTemplate, chatData); + +// messageData.content = html.trim(); +// messageData.speaker = ChatMessage.getSpeaker({ token: defToken }); +// messageData.roll = defBreakRoll; + +// await ChatMessage.create(messageData, messageOptions); + +// return { attackWeaponBroke: atkWeaponBroke, defendWeaponBroke: defWeaponBroke }; +// } + +// static async _getTacticalAdvantages(validTAs, numTAs, wpn, taChoice) { +// if (!numTAs) return taChoice; + +// const dlgHtml = ` +//
`; +// for (let i = 1; i <= numTAs; i++) { +// dlgHtml += `
+// +//
'; +// } +// dlgHtml += '
'; +// let newTAChoice = await Dialog.prompt({ +// title: "Choose Target", +// content: dlgHtml.trim(), +// label: "OK", +// callback: async (html) => { +// const form = html[0].querySelector("form"); +// for (let i = 1; i <= numTAs; i++) { +// taType = form[`ta${i}`].value; +// taChoice[taType]++; +// } +// return taChoice; +// }, +// rejectClose: false +// }); +// if (!newTAChoice) { +// taChoice["Precision"] += numTAs; +// } else { +// taChoice = newTAChoice; +// } + +// return taChoice; +// } + +// /** +// * Display the results of meele +// * +// * @param {Integer} atkRoll The attack roll +// * @param {Integer} defRoll The defense roll +// * @param {String} defenseType The type of defense: "ignore", "block", "counterstrike", or "dodge" +// */ +// static _meleeCombatResult(atkRoll, defRoll, defenseType) { +// let result = { desc: 'Inconclusive.', defTA: 0, atkTA: 0, defSuccess: false, atkSuccess: false, defBlock: false, victoryStars: 0 }; +// result.victoryStars = this.calcVictoryStars(atkRoll.successLevel, defRoll?.successLevel); + +// if (defenseType === 'block') { +// if (result.victoryStars === null) return result; +// if (result.victoryStars === 0) { +// // Break ties: defender wins +// result.victoryStars--; +// } +// if (result.victoryStars > 0) return this.#meleeAttackSuccess(result.victoryStars, atkRoll, defRoll); +// if (result.victoryStars < 0) { +// result.desc = 'Defender blocks.'; +// result.defSuccess = true; +// result.defBlock = true; +// } +// result.defTA = result.victoryStars < -1 ? (-result.victoryStars) - 1 : 0; +// } else if (defenseType === 'dodge') { +// if (result.victoryStars === null) return result; +// if (result.victoryStars === 0) { +// // Break ties: higher roll wins +// if (atkRoll.rollObj.total > defRoll.rollObj.total) { +// result.victoryStars++; +// } else if (atkRoll.rollObj.total < defRoll.rollObj.total) { +// result.victoryStars--; +// } else if (atkRoll.target > defRoll.rollObj.target) { +// result.victoryStars++; +// } else { +// result.victoryStars--; +// } +// } +// if (result.victoryStars > 0) return this.#meleeAttackSuccess(result.victoryStars, atkRoll, defRoll); +// if (result.victoryStars < 0) { +// result.desc = 'Defender dodged.'; +// result.defSuccess = true; +// } +// result.defTA = result.victoryStars < -1 ? (-result.victoryStars) - 1 : 0; +// } else if (defenseType === 'ignore') { +// if (atkRoll.successLevel <= sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalFailure) { +// result.desc = 'Attacker missed.'; +// return result; +// } +// if (atkRoll.successLevel === sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalFailure) { +// result.desc = "Attacker hit."; +// result.victoryStars = 1; +// result.atkSuccess = true; +// } else if (atkRoll.successLevel >= sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess) { +// result.desc = "Attacker hit."; +// result.victoryStars = atkRoll.successLevel + 2; +// result.atkSuccess = true; +// } +// result.atkTA = atkRoll.successLevel >= sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess ? atkRoll.successLevel + 1 : 0; +// } else if (defenseType === 'counterstrike') { +// if (result.victoryStars === null) return result; +// if (result.victoryStars === 0) { +// // Resolve ties in favor of the attacker +// result.victoryStars++; +// } +// if (result.victoryStars > 0) return this.#meleeAttackSuccess(result.victoryStars); +// if (result.victoryStars < 0) { +// result.desc = "Counterstrike hit."; +// result.defSuccess = true; +// } +// result.defTA = result.victoryStars < -1 ? (-result.victoryStars) - 1 : 0; +// } + +// return result; +// } + +// static #meleeAttackSuccess(victoryStars) { +// if (victoryStars === null) return null; +// const result = { desc: 'Attacker hit.', defTA: 0, atkTA: 0, defSuccess: false, atkSuccess: true, defBlock: false, victoryStars: victoryStars }; +// result.atkTA = victoryStars > 1 ? victoryStars - 1 : 0; +// return result; +// } + +// /** +// * Initiate an automated attack against the current targeted token. +// * +// * @param {object} [options={}] Options which specify how to perform the test +// * @param {string} [options.weaponId=null] ID or name of melee weapon to use, or ask if null +// * @param {boolean} [options.forceAllow=false] Force allowing melee attack even if out of range +// * @param {boolean} [options.isTA=false] Flag indicating whether this is a result of a Tactical Advantage +// * +// * @override +// */ +// async automatedAttack({ weaponId = null, forceAllow = false, isTA = false } = {}) { +// if (!game.combat) { +// ui.notifications.warn(`No combat occuring; start combat before attacking`); +// return null; +// } + +// const actorTokens = this.getActiveTokens(); +// let atkToken = null; +// if (actorTokens.length <= 0) { +// ui.notifications.warn(`There is no token for the actor ${this.name} in the active scene, cannot perform automated combat`); +// return null; +// } else if (actorTokens.length > 1) { +// ui.notifications.warn(`There are multiple tokens for the actor ${this.name} in the active scene, please trigger actions from token's character sheet.`) +// return null; +// } else { +// atkToken = actorTokens[0]; +// } + +// if (atkToken.actor.type === 'container') { +// const msg = `sohl.SoHL | Attacker ${this.token.name} is invalid (it is a container).`; +// ui.notifications.warn(msg); +// throw new Error(msg); +// } + +// let defToken = this.#getTargetedToken(); +// if (!defToken && !canvas.templates.placeables.length) { +// ui.notifications.warn(`No defender token or template identified.`); +// return null; +// } + +// if (defToken && defToken.actor.type === 'container') { +// const msg = `sohl.SoHL | Defender ${defToken.name} is invalid (it is a container).`; +// ui.notifications.warn(msg); +// throw new Error(msg); +// } + +// let targetDistance = 0; +// if (defToken) { +// targetDistance = sohl.Utility.rangeToTarget(atkToken, defToken, false); +// } else { +// targetDistance = sohl.Utility.rangeToTarget(atkToken, canvas.templates.placeables[0], false) +// } + +// const wpn = await LgndCharacterCreatureActorRuleset._selectWeaponDialog(atkToken, targetDistance, { weaponId, volleyOnly: !defToken }); +// if (!wpn) return null; + +// let volleyTarget = null; +// const isVolley = wpn.type === 'missile' && ['V2', 'V3', 'V4'].includes(wpn.range); +// if (isVolley) { +// if (!canvas.templates.placeables.length) { +// ui.notifications.warn(`Volley missile attacks require you to place a single measured template on the scene where the missile is being aimed`); +// return null; +// } else if (canvas.templates.placeables.length > 1) { +// ui.notifications.warn(`Multiple templates are defined, please only define a single template for volley missile attacks`); +// } +// volleyTarget = canvas.templates.placeables[0]; +// } + +// const dialogResult = await LgndCharacterCreatureActorRuleset._attackDialog({ +// distance: targetDistance, +// type: 'Attack', +// attackToken: atkToken, +// defendToken: defToken, +// weaponItem: foundry.utils.deepClone(wpn) +// }); + +// // If user cancelled the dialog, then return immediately +// if (!dialogResult) return null; + +// let bodyLocation = 'Random'; + +// if (wpn.type === 'missile') { +// const missile = atkToken.actor.getItem(wpn.weaponId); +// const projectile = options.weapon.projectileId ? atkToken.actor.getItem(options.weapon.weaponId) : null; + +// // If missile is thrown, mark as uncarried and release from body part +// if (!projectile) { +// const updateData = [{ '_id': missile.id, 'system.isCarried': false }]; +// const bpItem = this.items.find(it => type === "bodypart" && it.system.heldItem === wpn.weaponId); +// if (bpItem) { +// updateData.push({ '_id': bpItem.id, 'system.heldItem': '' }); +// } +// this.updateEmbeddedDocuments("Item", updateData); +// } + +// // If Missile Quantity Tracking option is enabled, reduce missile quantity by 1 +// // If projectiles are in use, those will be reduced, otherwise the missile itself +// if (projectile && game.settings.get("sohl", sohl.SOHL.CONST.SETTINGS.optionProjectileTracking.key)) { +// await projectile.update({ 'system.quantity': mitem.system.quantity - 1 }); +// } + +// // Here we go. Missiles don't allow the target to defend itself from the missile, so +// // we're going to go ahead and handle the attack here directly. This is unlike melee +// // combat, since there you have a defender actually choosing a particular defense. +// const roll = await LgndDice.rollTest({ +// diceSides: 100, +// diceNum: 1, +// successLevelMod: dialogResult.attack.successLevelMod, +// target: dialogResult.attack.effective, +// type: 'missle' +// }); + +// let isStumble = false; +// let isFumble = false; +// let isStrike = false; +// let hitAlternate = null; +// let weaponDamage = 0; +// let taChoice = { +// "Impact": 0, +// "Precision": 0 +// }; +// const victoryStars = this.calcVictoryStars(roll.successLevel); +// let numTAs = isTA ? 0 : Math.max(combatResult.victoryStars - 1, 0); +// const victoryStarsText = this.victoryStarsText(victoryStars); +// const tacticalAdvantageList = [LGND.CONST.TACADV.PRECISION, LGND.CONST.TACADV.IMPACT]; +// if (isVolley) { + +// if (roll.successLevel <= sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalFailure) { +// // Mishap +// isStrike = false; +// if (roll.isCritical && roll.lastDigit === 0) { +// // CF0 - Fumble +// isFumble = true; +// } else { +// // CF5 - Stumble or Weapon Damage +// if (projectile) { +// // Bow/Sling/Crossbow Weapon Damage - d10+5 +// weaponDamage += (Math.floor(MersenneTwister.random() * 10) + 5) +// } else { +// // Thrown weapon Stumble +// isStumble = true; +// } +// } +// } else { +// // Other than a critical failure, all other results have a chance +// // to hit something during a volley attack. + +// const targetDie = wpn.range === 'V2' ? 12 : 20; +// let center = volleyTarget.center; +// center = canvas.grid.grid.getCenter(center.x, center.y); +// const centerGrid = canvas.grid.grid.getGridPositionFromPixels(center.x, center.y); +// let neighborGrids = 0; +// if (canvas.grid.type === CONST.GRID_TYPES.SQUARE) neighborGrids = 8; +// else if (canvas.grid.type === CONST.GRID_TYPES.GRIDLESS) neighborGrids = 8; +// else if (canvas.grid.type === CONST.GRID_TYPES.HEXODDR) neighborGrids = 6; +// else if (canvas.grid.type === CONST.GRID_TYPES.HEXEVENR) neighborGrids = 6; +// else if (canvas.grid.type === CONST.GRID_TYPES.HEXODDQ) neighborGrids = 6; +// else if (canvas.grid.type === CONST.GRID_TYPES.HEXEVENQ) neighborGrids = 6; + +// const volleyGridUseNeighbors = Math.floor(15 / canvas.scene.grid.units) > 0 +// const newCenterDistance = Math.ceil(15 / canvas.scene.grid.units); + +// if (roll.successLevel === sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalFailure) { +// // Calculate Deviation +// const newCenterDistance = Math.ceil(15 / canvas.scene.grid.units); +// const direction = Math.floor(MersenneTwister.random() * neighborGrids); +// if (canvas.grid.type !== CONST.GRID_TYPES.GRIDLESS) { +// for (let i = 0; i < newCenterDistance; i++) { +// const neighbors = canvas.grid.grid.getNeighbors(centerGrid.x, centerGrid.y); +// centerGrid = neighbors[direction]; +// } +// } else { +// const neighborPatterns = [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]]; +// const nPat = neighborPatterns[direction]; +// centerGrid.x = centerGrid.x + (nPat[0] * newCenterDistance); +// centerGrid.y = centerGrid.y + (nPat[1] * newCenterDistance); +// } +// } + +// // We handle Precision TAs directly, so we never present Precision TAs to the player +// let numRolls = 0; +// if (roll.successLevel >= sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalFailure) { +// numRolls = 1 +// } +// if (roll.successLevel > sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess) { +// numRolls += Math.max(roll.successLevel - sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess, 0) * 2 +// } + +// if (numRolls) { +// let potentialTargets = []; +// if (canvas.grid.type !== CONST.GRID_TYPES.GRIDLESS) { +// let volleyGridArea = [centerGrid]; +// if (volleyGridUseNeighbors) { +// volleyGridArea = volleyGridArea.concat(canvas.grid.grid.getNeighbors(centerGrid.x, centerGrid.y)); +// } + +// // Find all tokens inside volley grid area +// potentialTargets = canvas.tokens.placeables.reduce((ary, t) => { +// const tokenCenterGrid = canvas.grid.grid.getGridPositionFromPixels(t.x, t.y); +// if (volleyGridArea.some(vga => vga[0] === tokenCenterGrid[0] && vga[1] === tokenCenterGrid[1])) { +// return ary.push({ name: t.name, uuid: t.uuid }); +// } +// return ary; +// }, []); +// } else { +// // Find all tokens inside volley area +// const volleyAreaRadius = canvas.grid.size * Math.ceil(7.5 / canvas.scene.grid.units); +// potentialTargets = canvas.tokens.placeables.reduce((ary, t) => { +// const dist = canvas.grid.measureDistance({ x: centerGrid.x, y: centerGrid.y }, { x: t.x, y: t.y }); +// if (dist < volleyAreaRadius) { +// return ary.push({ name: t.name, uuid: t.uuid }); +// } +// return ary; +// }, []); +// } + +// const targets = []; +// for (let i = 0; i < numRolls; i++) { +// const newTarget = Math.floor(MersenneTwister.random() * targetDie); +// if (newTarget < potentialTargets.length && !targets.includes(potentialTargets[newTarget])) { +// targets.push(potentialTargets[newTarget]); +// } +// } + +// let targetTokenUuid = null; + +// if (targets.length === 1) { +// targetTokenUuid = targets[0]; +// } else if (targets.length > 1) { +// const dlgHtml = ` +//
+//
+// +//
'; +// targetTokenUuid = await Dialog.prompt({ +// title: "Choose Target", +// content: dlgHtml.trim(), +// label: "OK", +// callback: async html => { +// const form = html[0].querySelector("form"); +// return form.target.value; +// }, +// rejectClose: false +// }); +// if (!targetTokenUuid) targetTokenUuid = targets[0].uuid; +// defToken = fromUuidSync(targetTokenUuid); +// isStrike = true; +// } +// if (targetTokenUuid) { +// defToken = fromUuidSync(targetTokenUuid); +// isStrike = true; +// } +// } +// } +// } else { +// if (roll.successLevel <= sohl.SOHL.CONST.SUCCESS_LEVEL.CriticalFailure) { +// // Mishap +// isStrike = false; +// if (roll.isCritical && roll.lastDigit === 0) { +// // CF0 - Fumble +// isFumble = true; +// } else { +// // CF5 - Stumble or Weapon Damage +// if (projectile) { +// // Bow/Sling/Crossbow Weapon Damage - d10+5 +// weaponDamage += (Math.floor(MersenneTwister.random() * 10) + 5) +// } else { +// // Thrown weapon Stumble +// isStumble = true; +// } +// } +// } else if (roll.successLevel === sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalFailure) { +// // Miss +// isStrike = false; +// } else if (roll.successLevel === sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess) { +// // Success +// isStrike = true; +// if (dialogResult.isStillTarget) taChoice["Precision"]++; // Addl Precision TA +// } else { +// // Success + n Tactical Advantages +// isStrike = true; +// if (dialogResult.isStillTarget) taChoice["Precision"]++; // Addl Precision TA +// numTAs = roll.successLevel - sohl.SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess; +// } +// } + +// let resultDesc = isStrike ? `Missile Hit` : `Missile Missed`; +// if (!isStrike) { +// // Missile has missed target, but might hit an unintended victim within 7' of +// // the target. +// const targets = [] +// canvas.tokens.placeables.forEach(t => { +// if (t.id !== atkToken.id) { +// const distance = sohl.Utility.rangeToTarget(atkToken, t, false); +// if (distance <= 7) { +// targets.push(t); +// } +// } +// }); +// const roll = Roll.create('1d20').roll(); +// if (roll.total <= targets.length) { +// hitAlternate = targets.at(roll.total - 1); +// resultDesc += ` but there ${targets.length > 1 ? 'are ' + targets.length + ' targets' : 'is 1 target'} nearby, and hit unintended target ${hitAlternate.name}!`; +// } +// } + +// taChoice = await LgndCharacterCreatureActorRuleset._getTacticalAdvantages(Object.keys(taChoice), numTAs, wpn, taChoice); + +// if (taChoice['Impact']) { +// const impactAdd = (wpn.traits.impactTA || LGND.CONST.IMPACTTA[dialogResult.impact.aspect]) * taChoice['Impact']; +// dialogResult.impact.add(`${taChoice['Impact']} Impact TAs`, "ImpTA", impactAdd); +// taChoice['Impact'] = 0; +// } +// LgndUtility.applyMods(dialogResult.impact); + +// // Prepare for Chat Message +// const chatTemplate = 'systems/sohl/templates/chat/attack-result-card.html'; + +// const chatTemplateData = { +// title: `${missileItem.name} Attack Result`, +// attacker: atkToken.name, +// atkTokenUuid: atkToken.uuid, +// defender: defToken?.name || 'Nobody (Missed)', +// defTokenUuid: defToken?.uuid, +// attackWeapon: missileItem.name, +// effAML: dialogResult.attack.effective, +// mlType: 'AML', +// defense: 'None', +// effDML: 0, +// attackMods: dialogResult.attack.mods, +// defendMods: [], +// attackRoll: roll.rollObj.total, +// atkRollResult: roll.description, +// defenseRoll: 0, +// defRollResult: '', +// resultDesc, +// hitAlternate, +// vsText: victoryStarsText.text, +// atkWins: roll.isSuccess, +// defWins: false, +// atkIsSuccess: isStrike, +// defIsSuccess: false, +// atkIsCritical: roll.isCritical, +// defIsCritical: false, +// numAtkTA: numTAs, +// numDefTA: 0, +// atkImpactJson: isStrike ? JSON.stringify(dialogResult.impact) : '', +// defImpactJson: '', +// isProjectile: true, +// atkZoneDieFormula: dialogResult.zoneDieFormula, +// defZoneDieFormula: "", +// isAtkStumbleTest: isStumble, +// isAtkFumbleTest: isFumble, +// isDefStumbleTest: false, +// isDefFumbleTest: false, +// atkHandlerTokenUuid: atkToken.uuid, +// defHandlerTokenUuid: defToken?.uuid +// }; +// } else { +// // Prepare for Chat Message +// const chatTemplate = 'systems/sohl/templates/chat/attack-card.html'; + +// const chatTemplateData = { +// title: `${wpn.name} Melee Attack`, +// attacker: atkToken.name, +// atkTokenUuid: atkToken.uuid, +// defender: defToken.name, +// defTokenUuid: defToken.uuid, +// weaponType: 'weapon', +// weaponName: wpn.name, +// weaponId: wpn.id, +// zoneDieFormula: dialogResult.zoneDieFormula, +// impactLabel: dialogResult.impact.label, +// distance: targetDistance, +// baseML: dialogResult.attack.basis, +// effAML: dialogResult.attack.effective, +// amSign: dialogResult.attack.effMod < 0 ? '-' : '+', +// attackModAbs: Math.abs(dialogResult.attack.effMod), +// attackMods: dialogResult.attack.mods, +// impactMods: dialogResult.impact.mods, +// attackJson: JSON.stringify(dialogResult.attack), +// impactJson: JSON.stringify(dialogResult.impact), +// hasDodge: true, +// hasBlock: true, +// hasCounterstrike: true, +// hasIgnore: true, +// handlerActorUuid: defToken.actor.uuid, +// isTA, +// bodyLocation +// }; +// } + +// const html = await renderTemplate(chatTemplate, chatTemplateData); + +// const messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.OTHER +// }; + +// const messageOptions = {}; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions); +// if (game.settings.get("sohl", sohl.SOHL.CONST.SETTINGS.combatAudio.key)) { +// AudioHelper.play({ src: "sounds/drums.wav", autoplay: true, loop: false }, true); +// } + +// const updateData = { "flags.legendary.didCombat": true }; +// await atkToken.combatant.update(updateData); + +// return chatTemplateData; +// } + +// /** +// * @typedef {object} MeleeResumeChatData +// * @param {string} title Chat card title +// * @param {string} attacker Name of attacker +// * @param {string} atkTokenUuid UUID of Attacking Token +// * @param {string} defender Name of defender +// * @param {string} defTokenUuid UUID of Defending Token +// * @param {string} attackWeapon Name of attacker's weapon +// * @param {string} defendWeapon Name of defender's weapon +// * @param {string} mlType Either 'AML' or 'DML' +// * @param {string} defense Description of defense +// * @param {number} effAML Attack EML after all modifiers applied +// * @param {number} effDML Defense EML after all modifiers applied +// * @param {object} attackMods Modifiers to attack ML +// * @param {object} defendMods Modifiers to defense ML +// * @param {number} attackRoll The dice roll result for the attack +// * @param {string} attackRollResult Description of the result of the attack roll +// * @param {number} defenseRoll The dice roll result for the defense +// * @param {string} defRollResult Description of the result of the defense roll +// * @param {string} resultDesc Final overall description of the result +// * @param {string} vsText Victory Stars textual representation +// * @param {boolean} atkWins Attacker causes impact on defender +// * @param {boolean} defWins Defender avoids impact +// * @param {boolean} atkIsSuccess Attacker rolled a success +// * @param {boolean} defIsSuccess Defender rolled a success +// * @param {boolean} atkIsCritical Attakcer rolled a critical value +// * @param {boolean} defIsCritical Defender rolled a critical value +// * @param {number} numAtkTA Number of Tactical Advantages the attacker gets +// * @param {number} numDefTA Number of Tactical Advantages the defender gets +// * @param {string} atkTAChoices String listing the available TA choices to the attacker +// * @param {string} defTAChoices String listing the avaialble TA choices to the defender +// * @param {boolean} atkHasTAAction Does the attacker have an Action TA? +// * @param {boolean} defHasTAAction Does the defender have an Action TA? +// * @param {string} atkImpactJson JSON string representing the attacker's impact object +// * @param {string} defImpactJson JSON string representing the defender's impact object (such as in counterstrike) +// * @param {boolean} isProjectile Is this attack a projectile attack? +// * @param {number} atkZoneDice Zone die for the attacker +// * @param {number} atkZoneTarget Zone target for the attacker +// * @param {number} defZoneDice Zone die for the defender +// * @param {number} defZoneTarget Zone target for the defender +// * @param {boolean} isAtkStumbleTest Does the attacker perform a stumble roll? +// * @param {boolean} isAtkFumbleTest Does the attacker perform a fumble roll? +// * @param {boolean} isDefStumbleTest Does the defender perform a stumble roll? +// * @param {boolean} isDefFumbleTest Does the defender perform a fumble roll? +// * @param {string} atkHandlerTokenUuid UUID of token whose ruleset to use to resolve the attacker button presses +// * @param {string} defHandlerTokenUuid UUID of token whose ruleset to use to resolve the defender button presses +// */ + +// /** +// * Resume the attack with the defender performing the "Counterstrike" defense. +// * Note that this defense is only applicable to melee attacks. +// * +// * @param {object} options +// * @param {Token} [options.atkToken] Token representing the attacker +// * @param {object} [options.atkWeapon] The weapon the attacker is using +// * @param {object} [options.attack] The full attack object, including base ML, effective ML, success level modifier, and mods +// * @param {object} [options.impact] The full impact object, including impact die, modifier, aspect, and mods +// * @param {number} [options.zoneDie] The selected zone die for the attack +// * @param {number} [options.zoneOffset] The selected zone target for the attack +// * @param {boolean} [isTA=false] Is this defense a response to a tactical advantage +// * @param {number} [numPrecisionTAs=0] Number of Precision TAs the attacker has +// * @returns {MeleeResumeChatData} Data that was used to create chat message +// */ +// async meleeCounterstrikeResume({ atkToken, atkWeapon, attack, impact, atkZDFormula } = {}) { +// if (!LgndCharacterCreatureActorRuleset._isLivingToken(atkToken)) return null; + +// const defToken = this.token; +// if (!defToken) { +// ui.notifications.warn(`There is no token for the actor ${this.name}, cannot perform counterstrike`); +// return null; +// } + +// if (!defToken.isOwner) { +// ui.notifications.warn(`You do not have permissions to perform this operation on ${defToken.name}`); +// return null; +// } + +// const targetRange = sohl.Utility.rangeToTarget(defToken, atkToken, false); + +// const defWeaponId = await LgndCharacterCreatureActorRuleset._selectWeaponDialog(defToken, targetRange, { type: 'weapon' }); +// if (!defWeaponId) return null; + +// const defWeapon = defToken.actor.getItem(defWeaponId); + +// const csDialogResult = await LgndCharacterCreatureActorRuleset._attackDialog({ +// distance: targetRange, +// type: 'Counterstrike', +// attackToken: defToken, +// defendToken: atkToken, +// weapon: foundry.utils.deepClone(defWeapon) +// }); +// if (!csDialogResult) return null; + +// const csDefense = csDialogResult.attack; + +// if (atkWeapon.traits.opponentDefenseMod) { +// csDefense.add(`${atkWeapon.name} Opponent Defense`, 'OppDef', atkWeapon.traits.opponentDefenseMod); +// LgndUtility.applyMods(csDefense); +// } + +// const csReachPenalty = Math.max(0, atkToken.actor.system.combatReach - csOptions.weapon.reach) * -5; +// if (csReachPenalty) { +// csDefense.add("Reach Penalty", "Rch", csReachPenalty); +// LgndUtility.applyMods(csDefense); +// } + +// // Roll Attacker's Attack +// const atkRoll = await LgndDice.rollTest({ +// data: {}, +// diceSides: 100, +// diceNum: 1, +// successLevelMod: attack.successLevelMod, +// target: attack.effective +// }); + +// // Roll Counterstrike Attack +// const defRoll = await LgndDice.rollTest({ +// data: {}, +// diceSides: 100, +// diceNum: 1, +// successLevelMod: csDefense.successLevelMod, +// target: csDefense.effective +// }); + +// // If we have "Dice So Nice" module, roll them dice! +// if (game.dice3d) { +// atkRoll.rollObj.dice[0].options.colorset = "glitterparty"; +// await game.dice3d.showForRoll(atkRoll.rollObj, game.user, true); + +// defRoll.rollObj.dice[0].options.colorset = "bloodmoon"; +// await game.dice3d.showForRoll(defRoll.rollObj, game.user, true); +// } + +// const combatResult = LgndCharacterCreatureActorRuleset._meleeCombatResult(atkRoll, defRoll, 'counterstrike'); +// const victoryStarsText = this.victoryStarsText(combatResult.victoryStars); +// LgndUtility.applyMods(dialogResult.impact); + +// const chatData = { +// title: `Attack Result`, +// attacker: atkToken.name, +// atkTokenUuid: atkToken.uuid, +// defender: defToken.name, +// defTokenUuid: defToken.uuid, +// attackWeapon: atkWeapon.name, +// defendWeapon: csOptions.weapon.name, +// mlType: 'AML', +// defense: `CX (${csOptions.weapon.name})`, +// effAML: attack.effective, +// effDML: csDefense.effective, +// attackMods: attack.mods, +// defendMods: csDefense.mods, +// attackRoll: atkRoll.rollObj.total, +// atkRollResult: atkRoll.description, +// defenseRoll: defRoll.rollObj.total, +// defRollResult: defRoll.description, +// resultDesc: combatResult.desc, +// vsText: victoryStarsText.text, +// atkWins: combatResult.atkSuccess, +// defWins: combatResult.defSuccess, +// numAtkTA: combatResult.atkTA, +// numDefTA: combatResult.defTA, +// atkIsSuccess: atkRoll.isSuccess, +// defIsSuccess: defRoll.isSuccess, +// atkIsCritical: atkRoll.isCritical, +// defIsCritical: defRoll.isCritical, +// atkImpactJson: combatResult.atkSuccess ? JSON.stringify(impact) : '', +// defImpactJson: combatResult.defSuccess ? JSON.stringify(csDialogResult.impact) : '', +// isProjectile: false, +// atkZoneDieFormula: atkZDFormula, +// defZoneDieFormula: LgndInjuryRuleset.calcZoneDieFormula(csDialogResult.zoneDie, csDialogResult.zoneOffset), +// isAtkStumbleTest: !atkRoll.isSuccess && atkRoll.lastDigit === 5, +// isAtkFumbleTest: !atkRoll.isSuccess && atkRoll.lastDigit === 0, +// isDefStumbleTest: !defRoll.isSuccess && defRoll.lastDigit === 5, +// isDefFumbleTest: !defRoll.isSuccess && defRoll.lastDigit === 0, +// atkHandlerTokenUuid: atkToken.uuid, +// defHandlerTokenUuid: defToken.uuid +// } + +// let chatTemplate = "systems/sohl/templates/chat/attack-result-card.html"; + +// const html = await renderTemplate(chatTemplate, chatData); + +// let messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.OTHER +// }; + +// const messageOptions = {}; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) + +// const updateData = { "flags.legendary.didCombat": true }; +// await defToken.combatant.update(updateData); + +// return chatData; +// } + +// /** +// * Resume the attack with the defender performing the "Dodge" defense. +// * +// * @param {object} options +// * @param {Token} [options.atkToken] Token representing the attacker +// * @param {object} [options.atkWeapon] The weapon the attacker is using +// * @param {object} [options.attack] The full attack object, including base ML, effective ML, success level modifier, and mods +// * @param {object} [options.impact] The full impact object, including impact die, modifier, aspect, and mods +// * @param {number} [options.zoneDie] The selected zone die for the attack +// * @param {number} [options.zoneOffset] The selected zone target for the attack +// * @param {boolean} [isTA=false] Is this defense a response to a tactical advantage +// * @returns {MeleeResumeChatData} Data that was used to create chat message +// */ +// async dodgeResume({ atkToken, atkWeapon, attack, impact, atkZDFormula } = {}) { +// if (!LgndCharacterCreatureActorRuleset._isLivingToken(atkToken)) return null; + +// const defToken = this.token; +// if (!defToken) { +// ui.notifications.warn(`There is no token for the actor ${this.name}, cannot perform counterstrike`); +// return null; +// } + +// if (!defToken.isOwner) { +// ui.notifications.warn(`You do not have permissions to perform this operation on ${defToken.name}`); +// return null; +// } + +// const atkRoll = await LgndDice.rollTest({ +// data: {}, +// diceSides: 100, +// diceNum: 1, +// successLevelMod: attack.successLevelMod, +// target: attack.effective +// }); + +// const defense = foundry.utils.deepClone(defToken.actor.getCombatStat('Dodge')); + +// const defRoll = await LgndDice.rollTest({ +// data: {}, +// diceSides: 100, +// diceNum: 1, +// successLevelMod: defense.successLevelMod, +// target: defense.effective +// }); + +// if (game.dice3d) { +// const aRoll = atkRoll.rollObj; +// aRoll.dice[0].options.colorset = "glitterparty"; +// await game.dice3d.showForRoll(aRoll, game.user, true); + +// const dRoll = defRoll.rollObj; +// dRoll.dice[0].options.colorset = "bloodmoon"; +// await game.dice3d.showForRoll(dRoll, game.user, true); +// } + +// const combatResult = LgndCharacterCreatureActorRuleset._meleeCombatResult(atkRoll, defRoll, 'dodge'); +// // If this attack is the result of a TA, no more TAs are allowed +// const victoryStarsText = this.victoryStarsText(combatResult.victoryStars); +// LgndUtility.applyMods(dialogResult.impact); + +// const chatData = { +// title: `Attack Result`, +// attacker: atkToken.name, +// atkTokenUuid: atkToken.uuid, +// defender: defToken.name, +// defTokenUuid: defToken.uuid, +// attackWeapon: atkWeapon.name, +// effAML: attack.effective, +// mlType: 'AML', +// defense: 'Dodge', +// effAML: attack.effective, +// effDML: defToken.actor.getCombatStat('Dodge').effective, +// attackMods: attack.mods, +// defendMods: defToken.actor.getCombatStat('Dodge'), +// attackRoll: atkRoll.rollObj.total, +// atkRollResult: atkRoll.description, +// defenseRoll: defRoll.rollObj.total, +// defRollResult: defRoll.description, +// resultDesc: combatResult.desc, +// vsText: victoryStarsText.text, +// atkWins: combatResult.atkSuccess, +// defWins: combatResult.defSuccess, +// numAtkTA: combatResult.atkTA, +// numDefTA: combatResult.defTA, +// atkIsSuccess: atkRoll.isSuccess, +// defIsSuccess: defRoll.isSuccess, +// atkIsCritical: atkRoll.isCritical, +// defIsCritical: defRoll.isCritical, +// atkImpactJson: combatResult.atkSuccess ? JSON.stringify(impact) : '', +// defImpactJson: '', +// isProjectile: false, +// atkZoneDieFormula: atkZDFormula, +// defZoneDieFormula: "", +// isAtkStumbleTest: !atkRoll.isSuccess && atkRoll.lastDigit === 5, +// isAtkFumbleTest: !atkRoll.isSuccess && atkRoll.lastDigit === 0, +// isDefStumbleTest: !defRoll.isSuccess && defRoll.lastDigit === 5, +// isDefFumbleTest: !defRoll.isSuccess && defRoll.lastDigit === 0, +// atkHandlerTokenUuid: atkToken.uuid, +// defHandlerTokenUuid: defToken.uuid +// } + +// let chatTemplate = "systems/sohl/templates/chat/attack-result-card.html"; + +// const html = await renderTemplate(chatTemplate, chatData); + +// let messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.OTHER +// }; + +// const messageOptions = {}; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) +// if (combatResult.defSuccess && game.settings.get("sohl", sohl.SOHL.CONST.SETTINGS.combatAudio.key)) { +// AudioHelper.play({ src: "systems/sohl/audio/swoosh1.ogg", autoplay: true, loop: false }, true); +// } + +// const updateData = { "flags.legendary.didCombat": true }; +// await defToken.combatant.update(updateData); + +// return chatData; +// } + +// /** +// * Resume the attack with the defender performing the "Block" defense. +// * +// * @param {Token} [options.atkToken] Token representing the attacker +// * @param {object} [options.atkWeapon] The weapon the attacker is using +// * @param {object} [options.attack] The full attack object, including base ML, effective ML, success level modifier, and mods +// * @param {object} [options.impact] The full impact object, including impact die, modifier, aspect, and mods +// * @param {number} [options.zoneDie] The selected zone die for the attack +// * @param {number} [options.zoneOffset] The selected zone target for the attack +// * @param {boolean} [isTA=false] Is this defense a response to a tactical advantage +// * @param {number} [numPrecisionTAs=0] Number of Precision TAs the attacker has +// * @returns {MeleeResumeChatData} Data that was used to create chat message +// */ +// async blockResume({ atkToken, defToken, atkWeapon, attack, impact, zoneDie, zoneOffset } = {}) { +// if (!LgndCharacterCreatureActorRuleset._isLivingToken(atkToken) || !LgndCharacterCreatureActorRuleset._isLivingToken(defToken)) return null; +// if (!defToken.isOwner) { +// ui.notifications.warn(`You do not have permissions to perform this operation on ${defToken.name}`); +// return null; +// } + +// // By default we want to block with the weapon with the largest +// // defense ML. +// let weapons = defToken.actor.system.weapons.filter(w => !w.traits.noBlock); +// weapons.concat(defToken.actor.itemTypes.combattechnique.filter(ct => !ct.traits.noBlock)) +// let defaultWeapon = weapons.reduce((defaultWeapon, curWpn) => { +// if (!defaultWeapon) return curWpn; +// if (curWpn.defense.block.effective > defaultWeapon.defense.block.effective) { +// return curWpn; +// } else { +// return defaultWeapon; +// } +// }, null); + +// if (!weapons.length) { +// ui.notifications.warn(`${defToken.name} has no weapons that can be used for blocking, block defense refused.`); +// return null; +// } + +// const weaponId = await LgndCharacterCreatureActorRuleset._selectWeaponDialog(defToken, 0, { type: 'weapon', defaultWeaponId: defaultWeapon.id }); +// if (!weaponId) return null; + +// const weaponItem = defToken.actor.getItem(weaponId); + +// const atkReachPenalty = Math.max(0, atkWeapon.reach - weaponItem.reach) * -5; +// if (atkReachPenalty) { +// attack.add(LGND.CONST.MODS.REACH.NAME, LGND.CONST.MODS.REACH.ABBR, atkReachPenalty); +// LgndUtility.applyMods(attack); +// } + +// const atkRoll = await LgndDice.rollTest({ +// data: {}, +// diceSides: 100, +// diceNum: 1, +// successLevelMod: attack.successLevelMod, +// target: attack.effective +// }); + +// const defRoll = await LgndDice.rollTest({ +// data: {}, +// diceSides: 100, +// diceNum: 1, +// successLevelMod: options.weapon.defense.block.successLevelMod, +// target: options.weapon.defense.block.effective +// }); + +// if (game.dice3d) { +// const aRoll = atkRoll.rollObj; +// aRoll.dice[0].options.colorset = "glitterparty"; +// await game.dice3d.showForRoll(aRoll, game.user, true); + +// const dRoll = defRoll.rollObj; +// dRoll.dice[0].options.colorset = "bloodmoon"; +// await game.dice3d.showForRoll(dRoll, game.user, true); +// } + +// let taChoice = { +// "Action": 0, +// "Setup": 0 +// }; +// const combatResult = LgndCharacterCreatureActorRuleset._meleeCombatResult(atkRoll, defRoll, 'block'); +// // If this attack is the result of a TA, no more TAs are allowed +// const victoryStarsText = this.victoryStarsText(combatResult.victoryStars); +// LgndUtility.applyMods(dialogResult.impact); + +// const chatData = { +// title: `Attack Result`, +// attacker: atkToken.name, +// atkTokenUuid: atkToken.uuid, +// defender: defToken.name, +// defTokenUuid: defToken.uuid, +// attackWeapon: atkWeapon.name, +// effAML: attack.effective, +// mlType: 'AML', +// defense: `Block w/ ${weaponItem.name}`, +// effAML: attack.effective, +// effDML: weaponItem.defense.block.effective, +// attackMods: attack.mods, +// defendMods: weaponItem.defense.block.mods, +// attackRoll: atkRoll.rollObj.total, +// atkRollResult: atkRoll.description, +// defenseRoll: defRoll.rollObj.total, +// defRollResult: defRoll.description, +// resultDesc: combatResult.desc, +// vsText: victoryStarsText.text, +// atkWins: combatResult.atkSuccess, +// defWins: combatResult.defSuccess, +// numAtkTA: combatResult.atkTA, +// numDefTA: combatResult.defTA, +// atkIsSuccess: atkRoll.isSuccess, +// defIsSuccess: defRoll.isSuccess, +// atkIsCritical: atkRoll.isCritical, +// defIsCritical: defRoll.isCritical, +// atkImpactJson: combatResult.atkSuccess ? JSON.stringify(impact) : '', +// defImpactJson: '', +// isProjectile: false, +// atkZoneDie: zoneDie, +// atkZoneTarget: zoneOffset, +// isAtkStumbleTest: !atkRoll.isSuccess && atkRoll.lastDigit === 5, +// isAtkFumbleTest: !atkRoll.isSuccess && atkRoll.lastDigit === 0, +// isDefStumbleTest: !defRoll.isSuccess && defRoll.lastDigit === 5, +// isDefFumbleTest: !defRoll.isSuccess && defRoll.lastDigit === 0, +// atkHandlerTokenUuid: atkToken.uuid, +// defHandlerTokenUuid: defToken.uuid +// } + +// let chatTemplate = "systems/sohl/templates/chat/attack-result-card.html"; + +// const html = await renderTemplate(chatTemplate, chatData); + +// let messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.OTHER +// }; + +// const messageOptions = {}; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) +// if ((combatResult.atkSuccess || combatResult.defSuccess) && game.settings.get("sohl", sohl.SOHL.CONST.SETTINGS.combatAudio.key)) { +// AudioHelper.play({ src: "systems/sohl/audio/shield-bash.ogg", autoplay: true, loop: false }, true); +// } + +// const updateData = { "flags.legendary.didCombat": true }; +// await defToken.combatant.update(updateData); + +// return chatData; +// } + +// /** +// * Resume the attack with the defender performing the "Ignore" defense. +// * +// * @param {Token} [options.atkToken] Token representing the attacker +// * @param {object} [options.atkWeapon] The weapon the attacker is using +// * @param {object} [options.attack] The full attack object, including base ML, effective ML, success level modifier, and mods +// * @param {object} [options.impact] The full impact object, including impact die, modifier, aspect, and mods +// * @param {number} [options.zoneDie] The selected zone die for the attack +// * @param {number} [options.zoneOffset] The selected zone target for the attack +// * @param {boolean} [isTA=false] Is this defense a response to a tactical advantage +// * @param {number} [numPrecisionTAs=0] Number of Precision TAs the attacker has +// * @returns {MeleeResumeChatData} Data that was used to create chat message +// */ +// async ignoreResume({ atkToken, atkWeapon, attack, impact, zoneDie, zoneOffset } = {}) { +// if (!LgndCharacterCreatureActorRuleset._isLivingToken(atkToken)) return null; +// const defToken = this.token; + +// if (!defToken) { +// ui.notifications.warn(`There is no token for the actor ${this.name}, cannot perform counterstrike`); +// return null; +// } + +// if (!defToken.isOwner) { +// ui.notifications.warn(`You do not have permissions to perform this operation on ${defToken.name}`); +// return null; +// } + +// const atkRoll = await LgndDice.rollTest({ +// data: {}, +// diceSides: 100, +// diceNum: 1, +// successLevelMod: attack.successLevelMod, +// target: attack.effective +// }); + +// const effDML = 0; + +// if (game.dice3d) { +// const aRoll = atkRoll.rollObj; +// aRoll.dice[0].options.colorset = "glitterparty"; +// await game.dice3d.showForRoll(aRoll, game.user, true); +// } + +// const combatResult = LgndCharacterCreatureActorRuleset._meleeCombatResult(atkRoll, null, 'ignore'); +// const victoryStarsText = this.victoryStarsText(combatResult.victoryStars); + +// const chatData = { +// title: `Attack Result`, +// attacker: atkToken.name, +// atkTokenUuid: atkToken.uuid, +// defender: defToken.name, +// defTokenUuid: defToken.uuid, +// attackWeapon: atkWeapon.name, +// effAML: attack.effective, +// mlType: 'AML', +// defense: 'Ignore', +// effDML: 0, +// attackMods: attack.mods, +// defendMods: [], +// attackRoll: atkRoll.rollObj.total, +// atkRollResult: atkRoll.description, +// defenseRoll: 0, +// defRollResult: '', +// resultDesc: combatResult.desc, +// vsText: victoryStarsText.text, +// atkWins: combatResult.atkSuccess, +// defWins: combatResult.defSuccess, +// atkIsSuccess: atkRoll.isSuccess, +// defIsSuccess: false, +// atkIsCritical: atkRoll.isCritical, +// defIsCritical: false, +// numAtkTA: combatResult.atkTA, +// numDefTA: 0, +// atkTAChoices: taAllList.join(', '), +// defTAChoices: null, +// atkHasTAAction: true, +// defHasTAAction: false, +// atkImpactJson: combatResult.atkSuccess ? JSON.stringify(impact) : '', +// defImpactJson: '', +// isProjectile: false, +// atkZoneDie: zoneDie, +// atkZoneTarget: zoneOffset, +// isAtkStumbleTest: !atkRoll.isSuccess && atkRoll.lastDigit === 5, +// isAtkFumbleTest: !atkRoll.isSuccess && atkRoll.lastDigit === 0, +// isDefStumbleTest: false, +// isDefFumbleTest: false, +// atkHandlerTokenUuid: atkToken.uuid, +// defHandlerTokenUuid: defToken.uuid +// } + +// let chatTemplate = "systems/sohl/templates/chat/attack-result-card.html"; + +// const html = await renderTemplate(chatTemplate, chatData); + +// let messageData = { +// user: game.user.id, +// speaker: this.speaker, +// content: html.trim(), +// style: CONST.CHAT_MESSAGE_STYLES.OTHER +// }; + +// const messageOptions = {}; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions) + +// return chatData; +// } + +// /* --------------------------------------------------------------- */ +// // Helper Methods +// /* --------------------------------------------------------------- */ +// /** +// * Determine if the token is valid (must be either a 'creature' or 'character') +// * +// * @param {Token} token +// */ +// static _isLivingToken(token) { +// if (!token) { +// ui.notifications.warn('No token selected.'); +// return false; +// } + +// if (token.actor.type !== 'container') { +// return true; +// } else { +// ui.notifications.warn(`Token ${token.name} is not a character or creature.`); +// return false; +// } +// } + +// /*dumpActorCSV() { +// const defaultSkills = new Collection(game.items.filter(it => it.type ===LgndSkillData.TYPENAME).map(it => { +// return [it.name, -1]; +// })); + +// const csvAry = []; + +// csvAry.push(['Name', 'STR','END','DEX','AGL','PER','CML','AUR','WIL','REA','CRE','EMP','ELO'].concat(Array.from(defaultSkills.keys()))); +// game.actors.forEach(this => { +// const out = [actor.name, +// actor.system.attributes.strength.base, +// actor.system.attributes.endurance.base, +// actor.system.attributes.dexterity.base, +// actor.system.attributes.agility.base, +// actor.system.attributes.perception.base, +// actor.system.attributes.comeliness.base, +// actor.system.attributes.aura.base, +// actor.system.attributes.will.base, +// actor.system.attributes.reasoning.base, +// actor.system.attributes.creativity.base, +// actor.system.attributes.empathy.base, +// actor.system.attributes.eloquence.base, +// ]; + +// const skills = foundry.utils.deepClone(defaultSkills); +// actor.items.forEach(it => { +// if (it.type ===LgndSkillData.TYPENAME) { +// if (skills.has(it.name)) { +// skills.set(it.name, it.system.masteryLevel.base); +// } +// } +// }); + +// csvAry.push(out.concat(Array.from(defaultSkills.values()))); +// }); + +// const outStr = csvAry.reduce((outs, ary) => { +// let aryStr = ary.join(',') + '\n'; +// outs += aryStr; +// return outs; +// }, ''); + +// saveDataToFile(outStr, 'text/plain', 'actordump.csv'); +// }*/ + +// /*--------------------------------------------------------------------------------*/ +// /* INJURY ROLL PROCESSING +// /*--------------------------------------------------------------------------------*/ + +// /** +// * Performs processing, including a random roll, to determine +// * injury location and effects. +// * +// * @param {Object} options +// * @param {String} options.impactVal Impact damage +// * @param {String} options.aspect One of 'Blunt', 'Edged', 'Piercing', or 'Fire' +// * @param {Integer} options.zoneDieFormula The zone die formula (e.g., 'd4+4') +// * @param {Integer} options.armorReduction Amount of armor reduction to apply +// * @param {boolean} options.extraBleedRisk Is there a chance of severe bleeding? +// * @param {boolean} options.isMissile Is this injury a missile injury? +// * @param {Boolean} options.skipDialog Skip the dialog box +// */ +// async injuryRoll({ impactVal = 0, aspect = 'Blunt', zoneDieFormula, armorReduction = 0, extraBleedRisk = false, isMissile = false, +// skipDialog = false, numPrecisionTAs = 0 } = {}) { +// const actorData = this.system; +// const actorItems = this.items; + +// const secsToNextCheck = game.settings.get("sohl", sohl.SOHL.CONST.SETTINGS.healingSeconds.key); +// const hitLocations = actorItems.reduce((prev, cur) => { +// return cur.system instanceof BodyLocationData ? prev.concat(cur.name) : prev; +// }, ['Random']); + +// // Create the Roll instance +// const dlgResult = await this.#injuryDialog({ +// skipDialog, +// hitLocations, +// zoneDieFormula, +// secsToNextCheck, +// isMissile, +// extraBleedRisk, +// impactVal, +// aspect, +// armorReduction, +// numPrecisionTAs +// }); + +// if (!dlgResult) return null; + +// const result = await this.#calcInjury(dlgResult); + +// // If user cancelled the roll, then return immediately +// if (!result) return null; + +// if (this.isToken) result.tokenId = this.tokenId; + +// if (result.addToCharSheet) { +// this.#createInjury(result); +// } + +// result.maxZones = actorData.maxZones; +// result.outsideZone = result.zoneNum > result.maxZones; + +// // Prepare for Chat Message +// const chatTemplate = 'systems/sohl/templates/chat/injury-card.html'; + +// result.title = `${name} Injury`; +// result.handlerActorUuid = this.uuid; +// if (this.isToken) { +// result.tokenId = this.token.id; +// } else { +// result.actorId = this.id; +// } + +// const html = await renderTemplate(chatTemplate, result); + +// const messageData = { +// speaker: this.speaker, +// content: html.trim(), +// user: game.user.id, +// style: CONST.CHAT_MESSAGE_STYLES.OTHER, +// sound: CONFIG.sounds.notify +// }; + +// const messageOptions = { +// rollMode: game.settings.get("core", "rollMode") +// }; + +// // Create a chat message +// await ChatMessage.create(messageData, messageOptions); +// if (game.settings.get("sohl", sohl.SOHL.CONST.SETTINGS.combatAudio.key)) { +// AudioHelper.play({ src: "systems/sohl/audio/grunt1.ogg", autoplay: true, loop: false }, true); +// } +// return result; +// } + +// /** +// * +// * @param {*} actor +// * @param {*} result +// */ +// #createInjury(result) { +// if (result.injuryLevel.effective <= 0) return; + +// let injuryData = foundry.utils.deepClone(game.system.model.Item.injury); + +// injuryData.injuryLevel = { base: result.injuryLevel }; +// injuryData.healingRate = { base: result.healingRate }; +// injuryData.aspect = result.aspect; +// injuryData.isBleeding = result.isBleeding; +// injuryData.extraBleedRisk = result.extraBleedRisk; +// injuryData.isMissile = result.isMissile; +// injuryData.isGlancing = result.isGlancing; +// injuryData.bodyLocation = result.bodyLocationName; +// injuryData.nextCheckTime = result.nextCheckTime; + +// const createData = { +// name: result.name, +// type: InjuryItemData.typeName, +// data: injuryData +// }; + +// const item = Item.create(createData, { parent: this }); + +// return item; +// } + +// /** +// * @typedef InjuryDialogResponse +// * @property {string} location +// * @property {number} impactVal +// * @property {string} aspect +// * @property {boolean} isMissile +// * @property {boolean} extraBleedRisk +// * @property {number} armorReduction +// * @property {string} zoneDieFormula +// * @property {number} nextCheckTime +// * @property {boolean} addToCharSheet +// */ + +// /** +// * Render a dialog box for gathering information for use in the Injury roll +// * +// * @param {object} options +// * @param {boolean} [options.skipDialog] +// * @param {string[]} [options.hitLocations] +// * @param {string} [options.zoneDieFormula] +// * @param {number} [options.secsToNextCheck] +// * @param {boolean} [options.isMissile] +// * @param {boolean} [options.extraBleedRisk] +// * @param {number} [options.impactVal] +// * @param {string} [options.aspect] +// * @param {number} [options.armorReduction] +// * @returns {InjuryDialogResponse} +// */ +// async #injuryDialog({ +// skipDialog, +// hitLocations, +// zoneDieFormula, +// secsToNextCheck, +// isMissile, +// extraBleedRisk, +// impactVal, +// aspect, +// numPrecisionTAs = 0, +// armorReduction } = {}) { + +// const recordInjury = game.settings.get("sohl", sohl.SOHL.CONST.SETTINGS.recordInjuries.key); + +// const result = { +// location: hitLocations[0], +// impactVal, +// aspect, +// isMissile, +// extraBleedRisk, +// armorReduction, +// zoneDieFormula, +// numPrecisionTAs, +// nextCheckTime: secsToNextCheck ? game.time.worldTime + secsToNextCheck : 0, +// addToCharSheet: recordInjury !== 'disable' +// }; + +// if (skipDialog) return impactVal ? result : null; + +// // Render modal dialog +// let dlgTemplate = "systems/sohl/templates/dialog/injury-dialog.html"; + +// const html = await renderTemplate(dlgTemplate, { +// hitLocations, +// location: hitLocations[0], +// impactVal, +// aspect, +// zoneDie: Math.min(4, this.system.maxZones), +// zoneOffset: 0, +// zoneDieChoices: BodyZoneData.dice.reduce((ary, zd) => (zd <= this.system.maxZones) ? ary.concat([zd]) : ary, []), +// zoneDieFormula, +// numPrecisionTAs, +// secsToNextCheck, +// askRecordInjury: recordInjury === 'ask', +// armorReduction +// }); + +// // Create the dialog window +// return await Dialog.prompt({ +// title: "Determine Injury", +// content: html.trim(), +// label: "Determine Injury", +// callback: async html => { +// const form = html[0].querySelector("form"); +// if (!zoneDieFormula) { +// const formZoneDie = Number.parseInt(form.zoneDie.value, 10) || 0; +// const formZoneOffset = Number.parseInt(form.zoneOffset.value, 10) || 0; +// zoneDieFormula = LgndInjuryRuleset.calcZoneDieFormula(formZoneDie, formZoneOffset); +// } +// const formSecsToNextCheck = Number.parseInt(form.secsToNextCheck.value, 10) || 432000; // 5 days in seconds + +// result.location = form.location.value; +// result.aspect = form.aspect.value; +// result.impactVal = Number.parseInt(form.impactVal.value, 10) || 0; +// result.zoneDieFormula = zoneDieFormula; +// result.nextCheckTime = game.time.worldTime + formSecsToNextCheck; +// result.isMissile = form.isMissile.checked; +// result.extraBleedRisk = form.extraBleedRisk.checked; +// result.armorReduction = Number.parseInt(form.armorReduction.value, 10) || 0; +// result.addToCharSheet = recordInjury === 'ask' ? form.addToCharSheet.checked : recordInjury !== 'disable'; +// result.numPrecisionTAs = Number.parseInt(form.numPrecisionTAs.value, 10) || 0; +// return result; +// }, +// rejectClose: false +// }); +// } + +// /** +// * Return either the item specified by location, or if location === 'Random', +// * then randomly chooses a location and returns the item associated with it. +// * +// * @param {*} location +// * @param {*} zoneDieFormula +// */ +// async #calcInjuryLocation(location, zoneDieFormula) { +// const actorData = this.system; + +// let result = { locItem: null, partItem: null, zoneItem: null, zoneNumber: 0 }; + +// if (location !== 'Random') { +// result.locItem = this.items.find(it => it.system instanceof BodyLocationData && it.name === location); +// } else { +// /* -------- Determine Body Zone -------------- */ + +// const roll = await Roll.create(zoneDieFormula).roll(); +// result.zoneNumber = roll.total; +// if (result.zoneNumber > 0 && result.zoneNumber <= actorData.maxZones) { + +// // zoneItem is the zone that was selected +// result.zoneItem = this.items.find(it => it.system instanceof BodyZoneData && it.system.zoneNumbers.includes(result.zoneNumber)); + +// /* -------- Determine Body Part -------------- */ + +// let rollWeight = Math.floor(MersenneTwister.random() * result.zoneItem.probWeight.getProperty('sum')) + 1; +// result.partItem = this.items.filter(it => it.system instanceof BodyPartData && it.system.zone === result.zoneItem.name).reduce((foundPart, curPart) => { +// if (foundPart) return foundPart; +// rollWeight -= curPart.system.probWeight.effective; +// return (rollWeight <= 0) ? curPart : foundPart; +// }, null); + +// /* -------- Determine Body Location ---------- */ + +// rollWeight = Math.floor(MersenneTwister.random() * result.partItem.probWeight.getProperty('sum')) + 1; + +// result.locItem = this.items.filter(it => it.system instanceof BodyLocationData && it.system.location.bodyPartName === result.partItem.name).reduce((foundLoc, curLoc) => { +// if (foundLoc) return foundLoc; +// rollWeight -= curLoc.system.location.probWeight.effective; +// return (rollWeight <= 0) ? curLoc : foundLoc; +// }, null); +// } else { +// // Even though there was a weapon "hit", the zone is outside the allowed zones, +// // so it is effectively a "miss" +// return result; +// } +// } + +// return result; +// } + +// /** +// * This method calculates many items related to injuries that are used to populate +// * the chat message with the results of the injury +// * +// * @param {Object} options +// */ +// async #calcInjury({ location, impactVal, aspect, isMissile, extraBleedRisk, armorReduction, +// zoneDieFormula, nextCheckTime, addToCharSheet, numPrecisionTAs } = {}) { + +// const result = { +// type: InjuryItemData.typeName, +// isRandom: location === 'Random', +// name: 'Misc Injury', +// aspect: aspect || 'Blunt', +// bodyLocationName: location || 'Nowhere', +// isMissile: isMissile, +// extraBleedRisk: extraBleedRisk, +// isBleeding: false, +// bodyPartName: 'None', +// bodyZoneName: 'None', +// zoneNum: 0, +// impactVal, +// effImpact: impactVal, +// nextCheckTime: nextCheckTime, +// compoundInjury: false, +// severity: '', +// armorType: 'None', +// origArmorValue: 0, +// armorValue: 0, +// isGlancing: false, +// isInjured: false, +// injuryLevel: 0, +// injuryLevelText: InjuryData.injuryLevels[0], +// healingRate: -1, +// isFumble: false, +// isStumble: false, +// isAmputate: false, +// amputatePenalty: 0, +// shockIndex: 0, +// addToCharSheet: addToCharSheet +// }; + +// // determine location of injury +// let locResult = null; +// const possibleLocations = []; +// const dieRolls = numPrecisionTAs + 1; // We always have at least one die roll +// for (let i = 0; i < dieRolls; i++) { +// let lr = await this.#calcInjuryLocation(location, zoneDieFormula); +// if (lr && lr.locItem) { +// if (!possibleLocations.includes(lr)) possibleLocations.push(lr); +// } +// } + +// if (possibleLocations.length === 1) { +// locResult = possibleLocations[0]; +// } else if (possibleLocations.length > 1) { +// let dlgHtml = ` +//
+//
+// +//
'; +// let locItemId = await Dialog.prompt({ +// title: "Choose Hit Location", +// content: dlgHtml.trim(), +// label: "OK", +// callback: async (html) => { +// const form = html[0].querySelector("form"); +// return form.hitLocation.value; +// }, +// rejectClose: false +// }); +// locResult = possibleLocations.find(pl => pl.locItem.id === locItemId); +// } + +// if (!locResult || !locResult.locItem) { +// // this means we couldn't find the location, so no injury +// result.impactVal = 0; +// result.addToCharSheet = false; +// return result; +// } + +// result.zoneNum = locResult.zoneNumber; + +// // Just to make life simpler, get the system property which is what we really care about. +// const blData = locResult.locItem.system; + +// result.bodyLocationName = locResult.locItem.name; +// result.bodyZoneName = locResult.zoneItem.name; +// result.bodyPartName = locResult.partItem.name +// result.name = result.bodyLocationName; + +// result.armorType = !blData.layers ? 'None' : blData.layers; + +// // determine effective impact (impact - armor) +// if (result.aspect === 'Blunt') { +// result.origArmorValue = blData.blunt.effective; +// } else if (result.aspect === 'Edged') { +// result.origArmorValue = blData.edged.effective; +// } else if (result.aspect === 'Piercing' || result.aspect === 'Projectile') { +// result.origArmorValue = blData.piercing.effective; +// } else { +// result.origArmorValue = blData.fire.effective; +// } + +// result.armorValue = Math.max(0, result.origArmorValue - armorReduction); +// result.effImpact = Math.max(0, result.impactVal - result.armorValue); + +// let injuryLevel = 0; +// result.isInjured = true; + +// // Determine Injury Level +// if (result.effImpact <= 0) { +// injuryLevel = 0; +// result.isInjured = false; +// result.addToCharSheet = false; +// } else if (result.effImpact >= 20) { +// injuryLevel = 5; +// } else if (result.effImpact >= 15) { +// injuryLevel = 4; +// } else if (result.effImpact >= 10) { +// injuryLevel = 3; +// } else if (result.effImpact >= 5) { +// injuryLevel = 2; +// } else if (result.effImpact > 0) { +// injuryLevel = 1; +// } + +// // Calculation for Compound Injury +// if (result.isInjured) { +// // Only check for compound injuries if there are existing injuries in this same area +// const injSameArea = this.items.filter(it => it.system instanceof InjuryItemData && it.system.bodyLocation === locResult.locItem.name); +// if (injSameArea.length) { +// let totalIL = injuryLevel; +// let maxIL = injuryLevel; +// injSameArea.forEach(i => { +// const il = i.system.injuryLevel.effective; +// totalIL += il; +// maxIL = Math.max(maxIL, il); +// }); + +// // Instead of rolling dice, simply get a random number from 1-10 +// const ciRoll = Math.floor(MersenneTwister.random() * 10) + 1; + +// if (ciRoll <= totalIL) { +// // We have a compound injury +// if (injuryLevel === maxIL) { +// // The current injury is the worst injury, so simply increase it by one +// injuryLevel++; +// result.compoundInjury = true; +// } else { +// // Find which injury is the worst one, and increase it's injury level by 1 +// maxInjury = injSameArea.find(i => i.system.injuryLevel === maxIL); +// if (maxInjury) { +// const updateData = {}; +// if (maxInjury.system.isGlancing) { +// updateData['system.isGlancing'] = false; +// } else { +// updateData['system.injuryLevel.base'] = maxInjury.system.injuryLevel.base + 1; +// } +// await maxInjury.update(updateData); +// } +// result.addToCharSheet = false; +// } +// } +// } +// } + +// result.shockIndex = blData.shockValue + injuryLevel; + +// // Character will fumble/stumble when a grevious injury occurs +// if (injuryLevel >= 4) { +// result.isFumble ||= blData.isFumble; +// result.isStumble ||= blData.isStumble; +// } + +// // Amputation may occur when a G5 or worse injury occurs +// if (injuryLevel >= 5) { +// if (blData.amputatePenalty > 0) { +// result.amputatePenalty = blData.amputatePenalty; +// result.isAmputate = true; +// } +// } + +// // M1 injuries (not compound injuries) against rigid armor can instead be glancing blows +// if (blData.isRigid && !result.compoundInjury && injuryLevel === 1) { +// result.isGlancing = ['Edged', 'Piercing', 'Projectile'].includes(result.aspect); +// } + +// result.injuryLevel = injuryLevel; +// result.injuryLevelText = injuryLevel >= 5 ? `G${injuryLevel}` : InjuryData.injuryLevels[injuryLevel]; +// result.severity = result.injuryLevelText.charAt(0); +// const injDesc = LGND.CONST.INJURYDESC[result.aspect][result.severity]; +// result.name = `${result.bodyLocationName} ${injDesc || ''}`; + +// // In this section we calculate whether the injury is a bleeder +// let bleedIL = result.injuryLevel; +// if (extraBleedRisk) { +// // We have an injury that is particularly suseptible to bleeding (e.g., broadhead arrow) +// // Calculate effective IL for bleeding (only used for bleeding calculations). +// const effImpact = result.effImpact + 4; +// if (effImpact <= 0) { +// bleedIL = 0; +// } else if (effImpact >= 20) { +// bleedIL = 5; +// } else if (effImpact >= 15) { +// bleedIL = 4; +// } else if (effImpact >= 10) { +// bleedIL = 3; +// } else if (effImpact >= 5) { +// bleedIL = 2; +// } else if (effImpact > 0) { +// bleedIL = 1; +// } +// } + +// if (bleedIL) { +// // Bleeding only occurs if the severity equals or exceeds a threshold specified in the +// // armor location data for that location. +// if (bleedIL >= blData.bleedingSevThreshold) { +// // Blunt wounds only cause bleeding when Sev >= 5 +// // Piercing wounds only cause bleeding when Sev >= 4 +// // Edged wounds only cause bleeding when Sev >= 3 +// result.isBleeding = (bleedIL >= 3 && result.aspect === 'Edged') || +// (bleedIL >= 4 && result.aspect === 'Piercing') || +// (bleedIL >= 5 && result.aspect === 'Blunt'); +// } +// } + +// return result; +// } +// } + +export class LgndCommands extends sohl.Commands { + static async importActors(jsonFilename, folderName) { + const response = await fetch(jsonFilename); + const content = await response.json(); + + let actorFolder = game.folders.find( + (f) => f.name === folderName && f.type === "Actor", + ); + if (actorFolder) { + const msg = `Folder ${folderName} exists, delete it before proceeding`; + console.error(msg); + return; + } + + actorFolder = await Folder.create({ type: "Actor", name: folderName }); + + await sohl.Utility.asyncForEach(content.Actor, async (f) => { + console.log("Processing Animate Entity ${f.name}"); + const actor = await sohl.SohlActor.create({ name: f.name }); + const updateData = []; + const itemData = []; + // Fill in attribute values + Object.keys(f.system.attributes).forEach((attr) => { + const attrItem = actor.items.find( + (it) => + it.system instanceof sohl.TraitItemData && + it.name.toLowerCase() === attr, + ); + if (attrItem) + itemData.push({ + _id: attrItem.id, + "system.textValue": f.system.attributes[attr].base, + }); + }); + + updateData.push({ + "system.description": f.system.description, + "system.bioImage": f.system.bioImage, + "system.biography": f.system.biography, + "prototypeToken.actorLink": f.prototypeToken.actorLink, + "prototypeToken.name": f.prototypeToken.name, + "prototypeToken.texture.src": f.prototypeToken.texture.src, + folder: actorFolder.id, + items: itemData, + }); + + await actor.update(updateData); + }); + } +} +sohl.SOHL.cmds = LgndCommands; + +const LgndActorDataModels = foundry.utils.mergeObject( + sohl.SohlActorDataModels, + { + [sohl.AnimateEntityActorData.typeName]: LgndAnimateEntityActorData, + }, + { inplace: false }, +); + +const LgndItemDataModels = foundry.utils.mergeObject( + sohl.SohlItemDataModels, + { + [sohl.MysticalAbilityItemData.typeName]: LgndMysticalAbilityItemData, + [sohl.TraitItemData.typeName]: LgndTraitItemData, + [sohl.SkillItemData.typeName]: LgndSkillItemData, + [sohl.InjuryItemData.typeName]: LgndInjuryItemData, + [sohl.DomainItemData.typeName]: LgndDomainItemData, + [sohl.AfflictionItemData.typeName]: LgndAfflictionItemData, + [sohl.BodyZoneItemData.typeName]: LgndBodyZoneItemData, + [sohl.BodyPartItemData.typeName]: LgndBodyPartItemData, + [sohl.BodyLocationItemData.typeName]: LgndBodyLocationItemData, + [sohl.MeleeWeaponStrikeModeItemData.typeName]: + LgndMeleeWeaponStrikeModeItemData, + [sohl.MissileWeaponStrikeModeItemData.typeName]: + LgndMissileWeaponStrikeModeItemData, + [sohl.CombatTechniqueStrikeModeItemData.typeName]: + LgndCombatTechniqueStrikeModeItemData, + [sohl.ArmorGearItemData.typeName]: LgndArmorGearItemData, + [sohl.WeaponGearItemData.typeName]: LgndWeaponGearItemData, + }, + { inplace: false }, +); + +const LgndModifiers = foundry.utils.mergeObject( + sohl.SohlModifiers, + { + ImpactModifier: LgndImpactModifier, + MasteryLevelModifier: LgndMasteryLevelModifier, + }, + { inplace: false }, +); + +export const verData = { + id: "legendary", + label: "Song of Heroic Lands: Legendary Edition", + CONFIG: { + Helper: { + modifiers: LgndModifiers, + contextMenu: sohl.SohlContextMenu, + }, + Actor: { + documentClass: sohl.SohlActor, + documentSheets: [ + { + cls: LgndActorSheet, + types: Object.keys(LgndActorDataModels), + }, + ], + dataModels: LgndActorDataModels, + typeLabels: sohl.SohlActorTypeLabels, + typeIcons: sohl.SohlActorTypeIcons, + types: Object.keys(LgndActorDataModels), + defaultType: sohl.AnimateEntityActorData.typeName, + compendiums: ["sohl.leg-characters", "sohl.leg-creatures"], + }, + Item: { + documentClass: sohl.SohlItem, + documentSheets: [ + { + cls: sohl.SohlItemSheet, + types: Object.keys(LgndItemDataModels).filter( + (t) => t !== sohl.ContainerGearItemData.typeName, + ), + }, + { + cls: sohl.SohlContainerGearItemSheet, + types: [sohl.ContainerGearItemData.typeName], + }, + ], + dataModels: LgndItemDataModels, + typeLabels: sohl.SohlItemTypeLabels, + typeIcons: sohl.SohlItemTypeIcons, + types: Object.keys(LgndItemDataModels), + compendiums: [ + "sohl.leg-characteristics", + "sohl.leg-possessions", + "sohl.leg-mysteries", + ], + }, + ActiveEffect: { + documentClass: sohl.SohlActiveEffect, + dataModels: { + [sohl.SohlActiveEffectData.typeName]: sohl.SohlActiveEffectData, + }, + typeLabels: { + [sohl.SohlActiveEffectData.typeName]: + sohl.SohlActiveEffectData.typeLabel.singular, + }, + typeIcons: { [sohl.SohlActiveEffectData.typeName]: "fas fa-gears" }, + types: [sohl.SohlActiveEffectData.typeName], + legacyTransferral: false, + }, + Macro: { + documentClass: sohl.SohlMacro, + documentSheet: sohl.SohlMacroConfig, + }, + }, + CONST: foundry.utils.mergeObject(sohl.SOHL.CONST, LGND.CONST, { + inplace: false, + }), +}; diff --git a/module/sohl-common.js b/module/sohl-common.js new file mode 100644 index 0000000..ec5dfa8 --- /dev/null +++ b/module/sohl-common.js @@ -0,0 +1,14550 @@ +/* eslint-disable no-unused-vars */ +/*===============================================================*/ +/* SOHL Common Classes */ +/*===============================================================*/ +/** + * The fields property is a shortcut for foundry FieldData definitions + * + * @type {object} + */ +const fields = foundry.data.fields; + +/** + * Base SOHL object containing various properties, constants, and configuration + * parameters related to the SOHL system, + */ +export const SOHL = { + ready: false, + hasSimpleCalendar: false, + versionsData: {}, + defaultVersion: "legendary", + sysVer: {}, + registerSystemVersion: function (verId, verData) { + SOHL.versionsData[verId] = verData; + }, + statusEffects: [ + { + id: "incapacitated", + name: "incapacitated", + img: "systems/sohl/assets/icons/knockout.svg", + }, + { + id: "vanquished", + name: "vanquished", + img: "systems/sohl/assets/icons/surrender.svg", + }, + ], + + specialStatusEffects: { + DEFEATED: "vanquished", + }, + + controlIcons: { + defeated: "systems/sohl/assets/icons/surrender.svg", + }, + + CONST: { + // ASCII Artwork (Doom font) + sohlInitMessage: `Initializing the Song of Heroic Lands Game System +=========================================================== + _____ __ +/ ___| / _| +\\ \`--. ___ _ __ __ _ ___ | |_ + \`--. \\/ _ \\| '_ \\ / _\` | / _ \\| _| +/\\__/ / (_) | | | | (_| | | (_) | | +\\____/ \\___/|_| |_|\\__, | \\___/|_| + __/ | + |___/ + _ _ _ _ _ +| | | | (_) | | | | +| |_| | ___ _ __ ___ _ ___ | | __ _ _ __ __| |___ +| _ |/ _ \\ '__/ _ \\| |/ __| | | / _\` | '_ \\ / _\` / __| +| | | | __/ | | (_) | | (__ | |___| (_| | | | | (_| \\__ \\ +\\_| |_/\\___|_| \\___/|_|\\___| \\_____/\\__,_|_| |_|\\__,_|___/ +===========================================================`, + + /** @enum */ + CHARS: { + TIMES: "\u00D7", + GREATERTHANOREQUAL: "\u2265", + LESSTHANOREQUAL: "\u2264", + INFINITY: "\u221E", + STARF: "\u2605", + STAR: "\u2606", + }, + + SUCCESS_VALUE_TABLE: [ + { + maxValue: 0, + result: 0, + limited: [], + success: false, + label: "No Value", + description: "Test fails to produce a usable result", + }, + { + maxValue: 2, + result: 0, + limited: [], + success: false, + label: "Little Value", + description: "Test produces a limited or flawed result", + }, + { + maxValue: 4, + result: 0, + limited: [], + success: true, + label: "Base Value", + description: "Test produces an average result", + }, + { + maxValue: 8, + result: (chatData) => chatData.successValue - 4, + limited: [], + success: true, + label: (chatData) => + "\u2605".repeat(chatData.successValue - 4) + " Bonus Value", + description: "Test produces a superior result", + }, + { + maxValue: 999, + result: 5, + limited: [], + success: true, + label: "\u2605".repeat(5) + " Bonus Value", + description: "Test produces a superior result", + }, + ], + + /** @enum */ + SUCCESS_LEVEL: { + CriticalFailure: -1, + MarginalFailure: 0, + MarginalSuccess: 1, + CriticalSuccess: 2, + }, + + /** @enum */ + SHOCK: { + None: 0, + Stunned: 1, + Incapacitated: 2, + Unconscious: 3, + Killed: 4, + }, + + SETTINGS: { + systemMigrationVersion: { + key: "systemMigrationVersion", + }, + sohlVersion: { + key: "sohlVersion", + }, + showWelcomeDialog: { + key: "showWelcomeDialog", + data: { + name: "Show welcome dialog on start", + hint: "Display the welcome dialog box when the user logs in.", + scope: "client", + config: true, + type: new fields.BooleanField({ initial: true }), + }, + }, + combatAudio: { + key: "combatAudio", + data: { + name: "Combat sounds", + hint: "Enable combat flavor sounds", + scope: "world", + config: true, + type: new fields.BooleanField({ initial: true }), + }, + }, + defaultAnimateEntity: { + key: "defaultAnimateEntity", + data: { + name: "Default Animate Entity", + hint: "Name of default actor to use for new Animate Entities", + scope: "world", + config: true, + type: new fields.StringField({ + nullable: false, + blank: false, + initial: "Folk, Basic", + }), + }, + }, + searchActorCompendiums: { + key: "searchActorCompendiums", + data: { + name: "Additional Actor Compendiums", + hint: + "A comma-separated list of compendium IDs that should be used " + + "when searching for Actors. Local world actors first, then these " + + "compendiums will be searched, and finally system-specified compendiums.", + scope: "world", + config: true, + type: new fields.StringField({ + nullable: false, + initial: "", + }), + }, + }, + searchItemCompendiums: { + key: "searchItemCompendiums", + data: { + name: "Additional Item Compendiums", + hint: + "A comma-separated list of compendium IDs that should be used " + + "when searching for Items. Local world items first, then these " + + "compendiums will be searched, and finally system-specified compendiums.", + scope: "world", + config: true, + type: new fields.StringField({ + nullable: false, + initial: "", + }), + }, + }, + recordInjuries: { + key: "recordInjuries", + data: { + name: "Record injuries automatically on actor sheet", + hint: "Automatically add injuries to actor sheet", + scope: "world", + config: true, + default: "enable", + type: new fields.StringField({ + nullable: false, + blank: false, + initial: "enable", + choices: { + enable: "Record injuries automatically", + disable: "Don't record injuries automatically", + ask: "Prompt user on each injury", + }, + }), + }, + }, + healingSeconds: { + key: "healingSeconds", + data: { + name: "Seconds between healing checks", + hint: "Number of seconds between healing checks. Set to 0 to disable.", + scope: "world", + config: true, + type: new fields.NumberField({ + required: true, + nullable: false, + initial: 432000, // 5 days + }), + }, + }, + optionProjectileTracking: { + key: "optionProjectileTracking", + data: { + name: "Track Projectile/Missile Quantity", + hint: "Reduce projectile/missile quantity when used; disallow missile attack when quantity is zero", + scope: "world", + config: true, + type: new fields.BooleanField({ initial: false }), + }, + }, + optionFate: { + key: "optionFate", + data: { + name: "Use fate rules", + scope: "world", + config: true, + type: new fields.BooleanField({ initial: true }), + }, + }, + }, + }, +}; + +/** + * A class representing a value and associated modifications. It includes methods + * to set and get properties, add named modifiers to the data, and determine + * effective value. + * + * @export + * @class ValueModifier + * @typedef {ValueModifier} + */ +export class ValueModifier { + static _reserved_words; + _mods; + _effective; + _abbrev; + _parent; + _properties; + _disabled; + _dirty; + _base; + + constructor(parent, initProperties = {}) { + if (parent instanceof SohlBaseData) { + this._parent = parent; + } else { + throw new Error("parent must be a subclass of SohlBaseData"); + } + + this.reset(); + this._properties = new Collection(); + this._disabled = false; + this._dirty = true; + Object.keys(initProperties).forEach((p) => { + this.setProperty(p, initProperties[p]); + }); + } + + static get vmName() { + return "ValueModifier"; + } + + static get reservedWords() { + if (!this._reserved_words) { + this._reserved_words = Object.getOwnPropertyNames(this.prototype); + } + return this._reserved_words; + } + + get parent() { + return this._parent; + } + + get effective() { + if (this._disabled) return 0; + + this._apply(); + return this._effective; + } + + get modifier() { + if (this._disabled) return 0; + + return this.effective - (this.base || 0); + } + + get base() { + if (this._disabled) return undefined; + + this._apply(); + return this._base; + } + + get abbrev() { + if (this._disabled) return ""; + + this._apply(); + return this._abbrev; + } + + get index() { + return Math.trunc(this.effective / 10); + } + + get disabled() { + return this._disabled; + } + + set disabled(value) { + this._disabled = !!value; + } + + test() { + if (this.disabled) { + return null; + } + } + + getProperty(name) { + if (!this._properties.has(name)) { + return undefined; + } + + const val = this._properties.get(name); + if (val instanceof Function) { + this._apply(); + return val(this); + } + + return val; + } + + /** + * Sets the named property to the provided value. If the name is not currently a property + * of this ValueModifier, then it adds a getter and setter to this ValueModifier for + * ease of access and setting of the property value. + * + * @param {string} name Name of property to set to value + * @param {*} newValue New value of the property + * @returns {ValueModifier} the base ValueModifier + */ + setProperty(name, newValue) { + if (!this._properties.has(name)) { + if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)) { + throw new Error(`Name "${name}" is not a valid identifier`); + } + + if (this.constructor.reservedWords.includes(name)) { + throw new Error(`Cannot set property of reserved key ${name}`); + } + + const config = { + get() { + return this.getProperty(name); + }, + set(v) { + this.setProperty(name, v); + }, + enumerable: false, + configurable: false, + }; + + if (this.name) { + delete config.get; + } + + if (newValue instanceof Function) { + delete config.set; + } + + if (this.get || this.set) { + Object.defineProperty(this, name, config); + } + } + + if (this._properties.get(name) instanceof Function) { + throw new Error( + `Attempt to modify an unmodifiable property "${name}"`, + ); + } else { + const curVal = this._properties.get(name); + const type = typeof curVal; + if ( + !["undefined", "null"].includes(type) && + // biome-ignore lint/suspicious/useValidTypeof: This is a bogus error, the logic is fine + typeof newValue !== type + ) { + throw new Error("types do not match"); + } + this._properties.set(name, newValue); + this._dirty = true; + return this; + } + } + + hasProperty(name) { + return this._properties.has(name); + } + + /** + * Sets the base value to the provided value, replacing any existing base value. + * @param {number} value New value to add + * @returns {ValueModifier} the base ValueModifier + */ + setBase(value) { + // Delete any existing mod base + for (let idx = this._mods.length - 1; idx >= 0; idx--) { + if (this._mods[idx].name === SohlBaseData.mods.Base.name) + this._mods.splice(idx, 1); + } + + const type = typeof value; + if (type === "number") { + // Add new mod base to the beginning of the mods array + this._mods.unshift({ + name: SohlBaseData.mods.Base.name, + abbrev: SohlBaseData.mods.Base.abbrev, + op: CONST.ACTIVE_EFFECT_MODES.ADD, + value: ValueModifier._cleanNumber(value), + }); + } else if (value !== null && type !== "undefined") { + throw new Error(`value "${value}" must be a number`); + } + + this._dirty = true; + return this; + } + + /** + * Modifies the base by adding the provided value. + * + * @param {number} value Value to add to the current base value + * @returns {ValueModifier} the base ValueModifier + */ + addToBase(value) { + if (value !== null) { + const type = typeof value; + if (type === "undefined") { + return this; + } else if (type === "number") { + this._apply(); + this.setBase((this.base || 0) + value); + } else { + throw new Error(`value "${value}" must be a number`); + } + } + return this; + } + + reset() { + this._abbrev = null; + this._mods = []; + this._disabled = false; + this._properties?.keys().forEach((k) => { + const type = typeof this._properties[k]; + switch (type) { + case "number": + this._properties.set(k, 0); + break; + + case "string": + this._properties.set(k, ""); + break; + + case "boolean": + this._properties.set(k, false); + break; + } + }); + this._dirty = true; + return this; + } + + /** + * Adds the modifiers (and optionally the base value as well) from a source ValueModifier to this one. + * + * @param {ValueModifier} sourceVM An existing ValueModifier to add to the current one + * @param {object} [options={}] + * @param {boolean} [options.includeBase=false] Whether to include adding the base value; otherwise, just the modifications will be added + * @returns {ValueModifier} the base ValueModifier + */ + addVM(sourceVM, { includeBase = false } = {}) { + if (!(sourceVM instanceof ValueModifier)) { + throw new Error(`not a ValueModifier`); + } + + let newBase; + for (let mod of sourceVM._mods) { + if (mod.name !== SohlBaseData.mods.Base.name) { + this._mods.push(foundry.utils.deepClone(mod)); + } else { + newBase = mod.value; + } + } + if (includeBase && typeof newBase === "number") this.setBase(newBase); + + this._dirty = true; + return this; + } + + _oper(name, abbrev, value, op) { + const existingOverride = this._mods.find( + (m) => m.op === CONST.ACTIVE_EFFECT_MODES.OVERRIDE, + ); + if (existingOverride) { + // If the operation is not override, then ignore it (leave current override in place) + if (op === CONST.ACTIVE_EFFECT_MODES.OVERRIDE) { + // If this ValueModifier already been overriden to zero, all other modifications are ignored. + if (existingOverride.value !== 0) { + // If this ValueModifier is being overriden, throw out all other modifications + this._mods = []; + } + } + } else { + this._mods.push({ + name: name, + abbrev: abbrev, + op: op, + value: ValueModifier._cleanNumber(value), + }); + this._dirty = true; + } + + return this; + } + + add(name, abbrev, value) { + return this._oper(name, abbrev, value, CONST.ACTIVE_EFFECT_MODES.ADD); + } + + multiply(name, abbrev, value) { + return this._oper( + name, + abbrev, + value, + CONST.ACTIVE_EFFECT_MODES.MULTIPLY, + ); + } + + set(name, abbrev, value) { + return this._oper( + name, + abbrev, + value, + CONST.ACTIVE_EFFECT_MODES.OVERRIDE, + ); + } + + floor(name, abbrev, value) { + return this._oper( + name, + abbrev, + value, + CONST.ACTIVE_EFFECT_MODES.UPGRADE, + ); + } + + ceiling(name, abbrev, value) { + return this._oper( + name, + abbrev, + value, + CONST.ACTIVE_EFFECT_MODES.DOWNGRADE, + ); + } + + /** + * This is a relatively expensive operation, so it is preferred to use + * ValueModifier#getProperty or the getters instead unless these properties + * need to be accessed as an object. + * + * This method differs from ValueModifier#toObject, since the returned + * object does not have the private information needed to recreate the + * ValueModifier, and the properties are nomalized to be at the outer level + * of the object. + */ + get props() { + const result = { + base: this.base, + effective: this.effective, + abbrev: this.abbrev, + modifier: this.modifier, + }; + for (let k of this._properties.keys()) { + result[k] = this.getProperty(k); + } + return result; + } + + toObject() { + const propKeys = Array.from(this._properties.keys()); + return { + vmName: this.constructor.vmName, + mods: foundry.utils.deepClone(this._mods), + properties: propKeys.reduce((obj, k) => { + let prop = this.getProperty(k); + prop = prop instanceof ValueModifier ? prop.toObject() : prop; + obj[k] = prop; + return obj; + }, {}), + }; + } + + static fromObject(obj, parent) { + if (!obj || typeof obj !== "object" || obj.vmName !== this.vmName) + return obj; + if (!(parent instanceof SohlItemData)) { + throw new Error("parent must be a subclass of SohlItemData"); + } + const props = Object.entries(obj.properties).reduce( + (acc, [key, val]) => { + let prop = + typeof val === "object" + ? this.fromObject(val, parent) + : val; + acc[key] = prop; + return acc; + }, + {}, + ); + const vm = new this(parent, props); + let newBase; + for (let mod of obj.mods) { + if (mod.name !== SohlBaseData.mods.Base.name) { + vm._mods.push(mod); + } else { + newBase = mod.value; + } + if (newBase !== undefined) { + vm.setBase(newBase); + } + } + return vm; + } + + static fromJSON(json, parent) { + const result = this.fromObject(JSON.parse(json), parent); + if (!(result instanceof ValueModifier)) { + throw new Error("Not a ValueModifier"); + } + return result; + } + + toJSON() { + return this.toObject(); + } + + get chatHtml() { + let html = `
+
+ Adjustment + Value +
`; + this._mods.forEach((m) => { + html += `
+ ${m.name} + `; + switch (m.op) { + case CONST.ACTIVE_EFFECT_MODES.ADD: + html += `${m.value >= 0 ? "+" : ""}${m.value}`; + break; + + case CONST.ACTIVE_EFFECT_MODES.MULTIPLY: + html += `${SOHL.CONST.CHARS.TIMES}${m.value}`; + break; + + case CONST.ACTIVE_EFFECT_MODES.DOWNGRADE: + html += `${SOHL.CONST.CHARS.LESSTHANOREQUAL}${m.value}`; + break; + + case CONST.ACTIVE_EFFECT_MODES.UPGRADE: + html += `${SOHL.CONST.CHARS.GREATERTHANOREQUAL}${m.value}`; + break; + + case CONST.ACTIVE_EFFECT_MODES.OVERRIDE: + html += `=${m.value}`; + break; + + case CONST.ACTIVE_EFFECT_MODES.CUSTOM: + html += `${SOHL.CONST.CHARS.STAR}${m.value}`; + break; + + default: + throw Error( + `SoHL | Specified mode "${m.op}" not recognized while processing ${m.abbrev}`, + ); + } + html += `
`; + }); + html += "
"; + return html; + } + + /** + * Creates a new ValueModifier from a source ValueModifier and a parent DataModel. + * + * @static + * @param {ValueModifier|string} [sourceVM=null] a ValueModifier object or a JSON serialized ValueModifier + * @param {object} [options={}] + * @param {DataModel} [options.parent=null] The parent DataModel of the new ValueModifier. + * @returns {ValueModifier} + */ + static create(sourceVM = null, { parent = null } = {}) { + if (!parent) { + if (!(sourceVM instanceof ValueModifier)) { + throw new Error("Must supply parent"); + } else { + parent = sourceVM.parent; + } + } + + if (sourceVM instanceof ValueModifier) { + sourceVM = JSON.stringify(sourceVM.toJSON()); + } + + if (typeof sourceVM === "string") { + try { + sourceVM = this.fromJSON(sourceVM, parent); + } catch (error) { + Hooks.onError("ValueModifier#create", error, { + msg: "Invalid JSON serialized string", + log: "error", + }); + } + } else { + throw new Error( + `Must be ValueModifier or a JSON serialized ValueModifier`, + ); + } + + const props = IterWrap.create(sourceVM._properties.entries()).reduce( + (obj, [key, value]) => { + obj[key] = value; + return obj; + }, + {}, + ); + let result = new this(parent, props); + if (!result) throw new Error(`Not a valid ValueModifier`); + result._mods = sourceVM._mods; + + return result; + } + + _calcAbbrev() { + this._abbrev = ""; + this._mods.forEach((adj) => { + if (this._abbrev) { + this._abbrev += ", "; + } + + switch (adj.op) { + case CONST.ACTIVE_EFFECT_MODES.ADD: + this._abbrev += `${adj.abbrev} ${adj.value > 0 ? "+" : ""}${ + adj.value + }`; + break; + + case CONST.ACTIVE_EFFECT_MODES.MULTIPLY: + this._abbrev += `${adj.abbrev} ${SOHL.CONST.CHARS.TIMES}${adj.value}`; + break; + + case CONST.ACTIVE_EFFECT_MODES.DOWNGRADE: + this._abbrev += `${adj.abbrev} ${SOHL.CONST.CHARS.LESSTHANOREQUAL}${adj.value}`; + break; + + case CONST.ACTIVE_EFFECT_MODES.UPGRADE: + this._abbrev += `${adj.abbrev} ${SOHL.CONST.CHARS.GREATERTHANOREQUAL}${adj.value}`; + break; + + case CONST.ACTIVE_EFFECT_MODES.OVERRIDE: + this._abbrev += `${adj.abbrev} =${adj.value}`; + break; + + case CONST.ACTIVE_EFFECT_MODES.CUSTOM: + this._abbrev += `${adj.abbrev}`; + break; + } + }); + } + + static _cleanNumber(value) { + return Number.parseFloat(value) || 0; + } + + _apply() { + if (!this._dirty) return; + + // Sort modifiers so that we process Adds first, then Mults, then Floor, then Ceil + this._mods.sort((a, b) => (a.op < b.op ? -1 : a.op > b.op ? 1 : 0)); + + let minVal = null; + let maxVal = null; + let overrideVal = null; + + this._effective = 0; + + // Process each modifier + this._mods.forEach((adj) => { + let value = ValueModifier._cleanNumber(adj.value); + + if (typeof value === "number") { + value ||= 0; + switch (adj.op) { + case CONST.ACTIVE_EFFECT_MODES.ADD: + this._effective += value; + break; + + case CONST.ACTIVE_EFFECT_MODES.MULTIPLY: + this._effective *= value; + break; + + case CONST.ACTIVE_EFFECT_MODES.UPGRADE: + // set minVal to the largest minimum value + minVal = Math.max( + minVal ?? Number.MIN_SAFE_INTEGER, + value, + ); + break; + + case CONST.ACTIVE_EFFECT_MODES.DOWNGRADE: + // set maxVal to the smallest maximum value + maxVal = Math.min( + maxVal ?? Number.MAX_SAFE_INTEGER, + value, + ); + break; + + case CONST.ACTIVE_EFFECT_MODES.OVERRIDE: + overrideVal = value; + break; + } + } else if (typeof value === "boolean") { + switch (adj.op) { + case CONST.ACTIVE_EFFECT_MODES.ADD: + this._effective ||= value ? 1 : 0; + break; + + case CONST.ACTIVE_EFFECT_MODES.MULTIPLY: + this._effective = value && this._effective ? 1 : 0; + break; + + case CONST.ACTIVE_EFFECT_MODES.UPGRADE: + // set minVal to the largest minimum value + minVal = 0; + break; + + case CONST.ACTIVE_EFFECT_MODES.DOWNGRADE: + // set maxVal to the smallest maximum value + maxVal = 1; + break; + + case CONST.ACTIVE_EFFECT_MODES.OVERRIDE: + overrideVal = value ? 1 : 0; + break; + } + } + }); + + this._effective = + minVal === null + ? this._effective + : Math.max(minVal, this._effective); + this._effective = + maxVal === null + ? this._effective + : Math.min(maxVal, this._effective); + this._effective = overrideVal ?? this._effective; + this._effective ||= 0; + + // All values must be rounded to no more than 3 significant digits. + this._effective = Utility.maxPrecision(this._effective, 3); + + this._calcAbbrev(); + const baseAdj = this._mods.find( + (adj) => + adj.abbrev === SohlBaseData.mods.Base.abbrev && + adj.op === CONST.ACTIVE_EFFECT_MODES.ADD, + ); + this._base = baseAdj ? baseAdj.value : undefined; + this._dirty = false; + } + + /** + * Checks if the provided value is a valid array item by ensuring that it is an object with specific properties: 'name' as a string, 'abbr' as a string, 'op' as a number, and 'value' as a number. Returns true if the conditions are met, otherwise returns false. + * + * @static + * @param {*} value + * @returns {boolean} + */ + static _arrayItemValid(value) { + if (typeof value === "object") { + if ( + typeof value.name === "string" && + typeof value.abbrev === "string" && + typeof value.op === "number" && + typeof value.value === "number" + ) + return true; + } + return false; + } +} + +/** + * Specialized ValueModifier for Impacts + */ +export class ImpactModifier extends ValueModifier { + get disabled() { + let disabled = + this._disabled || (this.die === 0 && this.effective === 0); + return disabled; + } + + static get aspectTypes() { + return { + blunt: "Blunt", + edged: "Edged", + piercing: "Piercing", + fire: "Fire", + }; + } + + constructor( + parent, + { aspect = "blunt", die = 6, numDice = 1, ...initProperties } = {}, + ) { + super( + parent, + foundry.utils.mergeObject( + initProperties, + { + aspect, + die, + numDice, + lastResult: null, + }, + { inplace: false }, + ), + ); + } + + static get vmName() { + return "ImpactModifier"; + } + + get diceFormula() { + if (!this.numDice && !this.effective) return "0"; + const result = + (this.numDice + ? `${this.numDice > 1 ? this.numDice : ""}d${this.die}${ + this.effective >= 0 ? "+" : "" + }` + : "") + this.effective; + return result; + } + + get label() { + const aspectChar = this.aspect?.length + ? this.aspect.charAt(0).toLowerCase() + : ""; + return `${this.diceFormula}${aspectChar}`; + } + + async evaluate() { + const roll = await Roll.create(this.diceFormula).evaluate(); + this.setProperty("lastResultJson", roll.toJSON()); + return roll; + } +} + +export class MasteryLevelModifier extends ValueModifier { + constructor(parent, initProperties = {}) { + super( + parent, + foundry.utils.mergeObject( + { + minTarget: 5, + maxTarget: 95, + successLevelMod: 0, + critFailureDigits: [5, 0], + critSuccessDigits: [5, 0], + }, + initProperties, + { inplace: false, recursive: false }, + ), + ); + } + + static get vmName() { + return "MasteryLevelModifier"; + } + + get disabled() { + let disabled = super.disabled; + disabled ||= this.base <= 0; + return disabled; + } + + set disabled(val) { + super.disabled = val; + } + + get constrainedEffective() { + return Math.min( + this.maxTarget, + Math.max(this.minTarget, this.effective), + ); + } + + /** + * @typedef SuccessTestChatData + * @property {boolean} askFate Whether a fate roll may be made against this test + * @property {string} mlModJson JSON-encoded MasteryLevelModifier for this test + * @property {string} rollJson JSON-encoded Roll for this test + */ + + /** + * Perform a success test of the MasteryLevel. + * + * @param {object} options Configuration options for the roll + * @param {boolean} [options.skipDialog=false] Do not display dialog box (use defaults) + * @param {boolean} [options.noChat=false] Do not send any chat messages + * @param {string} [options.type] Test identifier string + * @param {label} [options.title] Human-readable short description + * @returns {SuccessTestResult} Object containing results of the roll + */ + async test({ + skipDialog = false, + noChat = false, + speaker, + type = "", + title = "", + } = {}) { + let mlMod = this.constructor.create(this, { + parent: this.parent, + }); + + if (!skipDialog) { + // Render modal dialog + let dlgTemplate = + "systems/sohl/templates/dialog/standard-test-dialog.html"; + + let dialogData = { + type, + title, + target: mlMod.effective, + base: mlMod.base, + mods: mlMod.chatHtml, + modifier: 0, + askSuccessLevelMod: true, + successLevelMod: mlMod.successLevelMod || 0, + }; + const html = await renderTemplate(dlgTemplate, dialogData); + + // Create the dialog window + mlMod = await Dialog.prompt({ + title: dialogData.title, + content: html.trim(), + label: "Roll", + callback: (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formData = fd.object; + + const formModifier = Number.parseInt(formData.modifier, 10); + if (formModifier) { + mlMod.add("Player Modifier", "PlyrMod", formModifier); + } + + if (dialogData.askSuccessLevelMod) { + const formSuccessLevelMod = Number.parseInt( + formData.successLevelMod, + 10, + ); + mlMod.successLevelMod = formSuccessLevelMod; + } + + return mlMod; + }, + rejectClose: false, + options: { jQuery: false }, + }); + + if (!mlMod) return; + } + + const roll = await new Roll("1d100").evaluate(); + if (!roll) { + throw new Error(`Roll evaluation failed`); + } + + const testResult = { + speaker, + askFate: this.parent.availableFate, + mlModJson: JSON.stringify(mlMod.toJSON()), + rollJson: JSON.stringify(roll.toJSON()), + type, + title, + }; + + if (!noChat) this.successTestToChat(testResult); + return testResult; + } + + /** + * @typedef SuccessTestChatData + * @property {string} type type name of test + * @property {string} title Title of chat card to display + * @property {number} origTarget The initial target (before modifiers) + * @property {string} modHtml HTML fragment containing modifier explanations + * @property {number} successLevel Final success level after all modifiers applied + * @property {number} successLevelMod Modifier to success level + * @property {number} effTarget Effective target after all modifiers applied + * @property {boolean} isCapped Whether the target was capped + * @property {boolean} isSuccess Whether the roll result was a success + * @property {boolean} isCritical Whether the roll result was a critical + * @property {string} rollJson JSON encoded string for the Roll object + * @property {number} rollTotal The total value of the roll + * @property {string} rollResultExpr An expression for the terms of the roll + * @property {number} lastDigit + * @property {string} resultText + * @property {string} resultDesc + * @property {string} description + * @property {boolean} askFate + * @property {number} fateCost + * @property {number} fateBonus + * @property {boolean} isOpposedTest + * @property {string} initActorUuid + * @property {string} initActorName + * @property {string} initItemUuid + * @property {string} initItemName + * @property {string} initItemTypeLabel + * @property {string} targetActorUuid + * @property {string} targetActorName + * @property {boolean} isSuccessValue + * @property {number} successValue + * @property {number} successValueExpr + * @property {number} svBonus + */ + + /** + * + * @param {*} speaker + * @param {*} actor + * @param {*} token + * @param {*} character + * @param {*} noChat + * @param {*} title + * @param {*} type + * @param {*} testResult + * @returns + */ + async successTestToChat({ + speaker, + noChat = false, + askFate, + mlModJson, + rollJson, + type, + title, + isSuccessValue = false, + fateBonus = 0, + ...testResult + }) { + if (!speaker) { + speaker = this.parent.actor + ? ChatMessage.getSpeaker({ actor: this.parent.actor }) + : ChatMessage.getSpeaker(); + } + const mlMod = this.constructor.fromJSON(mlModJson, this.parent); + const roll = Roll.fromJSON(rollJson); + + const chatData = { + mlMod: mlMod, + type: type, + title: title, + typeLabel: this.parent.constructor.typeLabel, + origTarget: mlMod.effective, + modHtml: mlMod.chatHtml, + successLevel: 0, + successLevelMod: mlMod.successLevelMod, + effTarget: mlMod.constrainedEffective, + isCapped: mlMod.effective !== mlMod.constrainedEffective, + isSuccess: false, + isCritical: false, + rollTotal: roll.total, + lastDigit: roll.total % 10, + resultText: "", + resultDesc: "", + description: "", + testResultJson: JSON.stringify(testResult), + nextTargetUuid: this.parent.item.uuid, + isSuccessValue, + successValueMod: -1, + svSuccess: false, + fateBonus, + }; + + const critAllowed = + chatData.mlMod.critSuccessDigits.length || + chatData.mlMod.critFailureDigits.length; + if (critAllowed) { + if (roll.total <= chatData.effTarget) { + if ( + chatData.mlMod.critSuccessDigits.includes( + chatData.lastDigit, + ) + ) { + chatData.successLevel = + SOHL.CONST.SUCCESS_LEVEL.CriticalSuccess; + } else { + chatData.successLevel = + SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess; + } + } else { + if ( + chatData.mlMod.critFailureDigits.includes( + chatData.lastDigit, + ) + ) { + chatData.successLevel = + SOHL.CONST.SUCCESS_LEVEL.CriticalFailure; + } else { + chatData.successLevel = + SOHL.CONST.SUCCESS_LEVEL.MarginalFailure; + } + } + } else { + if (roll.total <= chatData.effTarget) { + chatData.successLevel = + SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess; + } else { + chatData.successLevel = + SOHL.CONST.SUCCESS_LEVEL.MarginalFailure; + } + } + chatData.successLevel += chatData.successLevelMod; + chatData.successLevel += chatData.fateBonus; + if (!critAllowed) { + chatData.successLevel = Math.min( + Math.max( + chatData.successLevel, + SOHL.CONST.SUCCESS_LEVEL.MarginalFailure, + ), + SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess, + ); + } + chatData.isCritical = + critAllowed && + (chatData.successLevel <= + SOHL.CONST.SUCCESS_LEVEL.CriticalFailure || + chatData.successLevel >= + SOHL.CONST.SUCCESS_LEVEL.CriticalSuccess); + chatData.isSuccess = + chatData.successLevel >= SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess; + chatData.description = `${critAllowed ? (chatData.isCritical ? "Critical " : "Marginal ") : ""}${chatData.isSuccess ? "Success" : "Failure"}`; + + // If success level is greater than critical success or less than critical failure + // then add the amount to the end of the description + let successLevelIncr = 0; + if (chatData.isCritical) { + successLevelIncr = + chatData.successLevel - + (chatData.isSuccess + ? SOHL.CONST.SUCCESS_LEVEL.CriticalSuccess + : SOHL.CONST.SUCCESS_LEVEL.CriticalFailure); + } + if (successLevelIncr) { + chatData.description = `${chatData.description} (${ + (successLevelIncr > 0 ? "+" : "") + successLevelIncr + })`; + } + + if (!chatData.isSuccessValue) { + // If there is a table providing detailed description of + // the results of this test, then process that table to + // extract the detailed result descriptions. Many tests + // will not have these detailed descriptions, in which + // case only generic descriptions will be given. + if (chatData.mlMod.hasProperty("testDescTable")) { + MasteryLevelModifier._handleDetailedDescription( + chatData, + chatData.successLevel, + chatData.mlMod.testDescTable, + ); + } + } else { + chatData.successValueMod = chatData.successLevel - 1; + chatData.successValue = this.index + chatData.successValueMod; + const slSign = chatData.successValueMod < 0 ? "-" : "+"; + chatData.successValueExpr = `${ + this.index + } ${slSign} ${Math.abs(chatData.successValueMod)}`; + + // Each MasteryLevel item may optionally + // have its own success value table included; if + // so, then that one will be used, otherwise the + // default one will be used. + const svTable = + this.parent.item.getFlag("sohl", "successValueTable") || + SOHL.sysVer.CONST.SUCCESS_VALUE_TABLE; + + // The meaning of the success value bonus ("svBonus") is + // unique to each type of success value. Sometimes it + // represents the number of rolls on another table, or the + // increase in value or quality of a crafted item, or any + // other thing. See the description of the specific test + // to determine the meaning of the bonus. + chatData.svBonus = MasteryLevelModifier._handleDetailedDescription( + chatData, + chatData.successValue, + svTable, + ); + } + + if (!noChat) { + const chatTemplate = + "systems/sohl/templates/chat/standard-test-card.html"; + + const html = await renderTemplate(chatTemplate, chatData); + + const messageData = { + user: game.user.id, + speaker, + content: html.trim(), + sound: CONFIG.sounds.dice, + }; + + ChatMessage.applyRollMode(messageData, "roll"); + + // Create a chat message + await ChatMessage.create(messageData); + } + + return chatData; + } + + /** + * @typedef TestDetailedDescription + * @property {number} maxValue maximum value that applies to this description + * @property {number[]} lastDigit array of last digits that applies to this description + * @property {string} label The short text of the description + * @property {string} description The long text of the description + */ + + static _handleDetailedDescription(chatData, target, testDescTable) { + let result = null; + testDescTable.sort((a, b) => a.maxValue - b.maxValue); + const testDesc = testDescTable.find( + (entry) => entry.maxValue >= target, + ); + if (testDesc) { + // If the test description has a limitation based on + // the last digit, find the one that applies. + if (testDesc.limited?.length) { + const limitedDesc = testDesc.limited.find((d) => + d.lastDigits.includes(chatData.lastDigit), + ); + if (limitedDesc) { + const label = + limitedDesc.label instanceof Function + ? limitedDesc.label(chatData) + : limitedDesc.label; + const desc = + limitedDesc.description instanceof Function + ? limitedDesc.description(chatData) + : limitedDesc.description; + chatData.resultText = label || ""; + chatData.resultDesc = desc || ""; + chatData.svSuccess = limitedDesc.success; + result = limitedDesc.result; + } + } else { + const label = + testDesc.label instanceof Function + ? testDesc.label(chatData) + : testDesc.label; + const desc = + testDesc.description instanceof Function + ? testDesc.description(chatData) + : testDesc.description; + chatData.resultText = label || ""; + chatData.resultDesc = desc || ""; + chatData.svSuccess = testDesc.success; + result = testDesc.result; + } + } + + if (result instanceof Function) result = result(chatData); + + return result; + } +} + +export class CombatModifier extends MasteryLevelModifier { + /** + * Creates an instance of CombatModifier. + * + * @constructor + * @param {*} parent + * @param {object} [initProperties={}] + */ + constructor(parent, initProperties = {}) { + super( + parent, + foundry.utils.mergeObject( + initProperties, + { + successLevelMod: 0, + fate: new MasteryLevelModifier(parent), + }, + { inplace: false, recursive: false }, + ), + ); + } + + static get vmName() { + return "CombatModifier"; + } +} + +export class SohlItem extends Item { + /** + * An object that tracks the changes to the data model which were applied by active effects. + * See SohlActor.applyActiveEffects() for info on how this is set. + * @type {object} + */ + overrides = {}; + + _uuid; + _cause; + + /** @override */ + _configure(options) { + if (this.parent && !(this.parent instanceof SohlActor)) { + throw new Error("Parent must always be an instance of SohlActor"); + } + + super._configure(options); + + Object.defineProperty(this, "nestedIn", { + value: (() => { + if ([null, undefined].includes(options.nestedIn)) return null; + if (options.nestedIn instanceof SohlItem) + return options.nestedIn; + throw new Error( + "The provided nestedIn must be an SohlItem instance", + ); + })(), + writable: false, + enumerable: false, + }); + } + + _initialize(options = {}) { + super._initialize(options); + if (options.cause) this.cause = options.cause; + } + + get cause() { + return this._cause || this.nestedIn; + } + + set cause(item) { + if (!this.actor) return; + if (!(item instanceof SohlItem)) + throw new Error("must provide a valid cause"); + this._cause = item; + if (!this.actor.system.virtualItems.has(this.id)) { + this.actor.system.virtualItems.set(this.id, this); + } + } + + get label() { + let label = `${this.name} `; + if (this.system.subType) + label += `${ + this.system.constructor.subTypes[this.system.subType] + } `; + label += this.system.constructor.typeLabel.singular; + return label; + } + + get isVirtual() { + return !this.isNested && this.actor?.system.virtualItems.get(this.id); + } + + get isNested() { + return !!this.nestedIn; + } + + get fromCompendiumOrWorld() { + return !!(this.pack || game.items.some((it) => it.id === this.id)); + } + + /** @override */ + get actor() { + return super.actor || this.nestedIn?.actor || this.cause?.actor; + } + + get permission() { + if (this.isNested) return this.nestedIn.permission; + return super.permission(); + } + + get transferredEffects() { + if (!this.actor) return []; + + // Collect all of the effects in the actor that match this item"s name + const actorThisItemEffects = this.actor.effects.reduce( + (itEffects, e) => { + // If the effect"s targetType is not the same as this item, ignore it + if (e.system.targetType !== this.actor.type) return itEffects; + + // Ignore the effect if it"s name doesn"t match the targetName + const effectTargetName = new RegExp(e.system.targetNameRE); + if (effectTargetName.test(this.actor.name)) + return itEffects.concat(e); + + return itEffects; + }, + [], + ); + + // Search through all sibling items for any which are targeting this item + const siblingItemEffects = IterWrap.create( + this.actor.allItems(), + ).reduce((effects, it) => { + if (it.id === this.id) return effects; + const transferredItemEffects = it.effects.reduce((itEffects, e) => { + // If the effect"s targetType is not the same as this item, ignore it + if (e.system.targetType !== this.type) return itEffects; + + // Accept the effect if we have a skill base and the effect target is one of our attributes + if ( + this.system instanceof MasteryLevelItemData && + e.targetAttr + ) { + if (this.skillBase.attributes.includes(e.targetAttr)) { + return itEffects.concat(e); + } + } + + // Accept the effect if it"s name matches the targetName + const effectTargetName = new RegExp(e.system.targetNameRE); + if (effectTargetName.test(this.name)) + return itEffects.concat(e); + + // Otherwise, ignore the effect + return itEffects; + }, []); + return effects.concat(transferredItemEffects); + }, []); + + return actorThisItemEffects.concat(siblingItemEffects); + } + + static defaultName({ type, parent, pack, subType } = {}) { + const documentName = this.metadata.name; + const cls = CONFIG[documentName].dataModels?.[type]; + let collection; + if (parent) { + if (!(parent instanceof SohlActor)) { + throw new Error("parent must be an actor"); + } else { + collection = new Collection( + IterWrap.create(parent.allItems()).map((it) => [it.id, it]), + ); + } + } else if (pack) { + collection = game.packs.get(pack); + } else { + collection = game.collections.get(documentName); + } + + const takenNames = new Set(); + for (const document of collection) takenNames.add(document.name); + let baseName = CONFIG[documentName].typeLabels?.[type]; + if (subType) baseName = `${cls?.subTypes?.[subType]} ${baseName}`; + let name = baseName; + let index = 1; + while (takenNames.has(name)) name = `${baseName} (${++index})`; + return name; + } + + /** + * Creates a dialog for creating an item based on the provided data and options. + * + * @static + * @async + * @param {object} [data={}] + * @param {object} [options={}] + * @returns {SohlItem} the new SohlItem described by the dialog + */ + static async createDialog( + data = {}, + { parent = null, pack = null, types, ...options } = {}, + ) { + const cls = this.implementation; + + data = foundry.utils.expandObject(data); + + // Identify allowed types + let documentTypes = []; + let defaultType = CONFIG[this.documentName]?.defaultType; + let defaultTypeAllowed = false; + // biome-ignore lint/correctness/noUnusedVariables: + let hasTypes = false; + if (this.TYPES.length > 1) { + if (types?.length === 0) + throw new Error( + "The array of sub-types to restrict to must not be empty", + ); + + // Register supported types + for (const type of this.TYPES) { + if (type === CONST.BASE_DOCUMENT_TYPE) continue; + if (types && !types.includes(type)) continue; + let label = + CONFIG[this.documentName]?.typeLabels?.[type] || type; + documentTypes.push({ value: type, label }); + if (type === defaultType) defaultTypeAllowed = true; + } + if (!documentTypes.length) + throw new Error( + "No document types were permitted to be created", + ); + + if (!defaultTypeAllowed) defaultType = documentTypes[0].value; + // Sort alphabetically + documentTypes.sort((a, b) => + a.label.localeCompare(b.label, game.i18n.lang), + ); + hasTypes = true; + } + + let askType = + !!types || !documentTypes.some((t) => t.value === data.type); + + const itemClassSubtypes = + SOHL.sysVer.CONFIG.Item.dataModels[defaultType].subTypes; + let subTypes = itemClassSubtypes + ? Object.entries(itemClassSubtypes).reduce((ary, [name, value]) => { + ary.push({ name, label: value }); + return ary; + }, []) + : []; + + let askSubType = + askType || !subTypes.some((t) => t.name === data.system?.subType); + + let subType; + if (subTypes.length) { + subType = data.system?.subType || subTypes[0]?.name; + } + + // Identify destination collection + let collection; + if (!parent) { + if (pack) collection = game.packs.get(pack); + else collection = game.collections.get(this.documentName); + } + + // Collect data + const folders = collection?._formatFolderSelectOptions() ?? []; + const label = game.i18n.localize(this.metadata.label); + const title = game.i18n.format("DOCUMENT.Create", { type: label }); + const type = data.type || defaultType; + + const html = await renderTemplate( + "templates/sidebar/document-create.html", + { + folders, + name: data.name, + defaultName: cls.defaultName({ type, parent, pack, subType }), + folder: data.folder, + hasFolders: folders.length >= 1, + hasTypes: this.hasTypeData, + type, + types: documentTypes, + subType, + subTypes, + content: `
+ + +
`, + }, + ); + + return await Dialog.prompt({ + title, + content: html, + label: title, + render: (html) => { + const formTop = html.querySelector("form"); + const fd = new FormDataExtended(formTop); + const formData = foundry.utils.mergeObject(fd.object, { + parent, + pack, + askType, + askSubType, + }); + SohlItem._handleTypeChange(formTop, formData); + html.querySelector('[name="type"]').addEventListener( + "change", + (ev) => { + formData.type = ev.target.value; + SohlItem._handleTypeChange(formTop, formData); + }, + ); + + html.querySelector('[name="subType"]').addEventListener( + "change", + (ev) => { + formData.subType = ev.target.value; + SohlItem._handleTypeChange(formTop, formData); + }, + ); + }, + callback: (html) => { + const formTop = html.querySelector("form"); + const fd = new FormDataExtended(formTop); + const formData = foundry.utils.expandObject(fd.object); + const formName = formData.name; + const formType = formData.type || type; + const formFolder = formData.folder; + let formSubType = formData.subType || subType; + formSubType = formSubType?.replace(" selected", "") || ""; + + data.name = formName; + if (!data.name?.trim()) + data.name = this.defaultName({ + type: formType, + parent: parent, + pack: pack, + subType: formSubType, + }); + if (formFolder) { + data.folder = formFolder; + } else { + delete data.folder; + } + + data.type = formType || type; + + const subTypes = + SOHL.sysVer.CONFIG.Item.dataModels[data.type].subTypes; + if (subTypes && Object.keys(subTypes)?.includes(formSubType)) { + data["system.subType"] = formSubType; + } + + // Make sure gear goes into the top container of the + // actor unless specifically nested elsewhere + let nestedIn = options.nestedIn; + + return this.implementation.create(data, { + parent, + pack, + nestedIn, + renderSheet: true, + }); + }, + rejectClose: false, + options: { jQuery: false, ...options }, + }); + } + + /** + * Handles the type change event for the create item dialog by updating the + * form elements based on the selected type and subtype options. + * + * @static + * @param {*} formTop + * @param {object} dlgOptions + */ + static _handleTypeChange( + formTop, + { type, subType, askType, askSubType, parent, pack } = {}, + ) { + const formSubtypes = formTop.querySelector("#subtypes"); + const formSubtypeSelect = formTop.querySelector('[name="subType"]'); + formTop.elements.type.disabled = !askType; + + // Determine if subtypes exist for this type, and if so, create the subtype dropdown + const subTypeObj = SOHL.sysVer.CONFIG.Item.dataModels[type]?.subTypes; + if (typeof subTypeObj === "object" && Object.keys(subTypeObj).length) { + let subTypes = Object.entries(subTypeObj)?.reduce( + (ary, [name, value]) => { + ary.push({ name, label: value }); + return ary; + }, + [], + ); + + // Create subtype dropdown + subType = subTypes.some((t) => t.name === subType) + ? subType + : subTypes[0].name; + formSubtypes.style.visibility = "visible"; + const selectOptions = subTypes.reduce((str, st) => { + str += ``; + return str; + }, ""); + formSubtypeSelect.innerHTML = selectOptions; + formTop.elements.subType.value = `${subType} selected`; + formSubtypeSelect.disabled = !askSubType; + } else { + // Hide subtype dropdown if type doesn't support it + formSubtypes.style.visibility = "hidden"; + subType = ""; + } + + // Update the item name field placeholder + const nameInput = formTop.querySelector('[name="name"]'); + nameInput.placeholder = this.defaultName({ + type, + parent, + pack, + subType, + }); + } + + *allApplicableEffects() { + // Grab all of the effects on this item that affects itself + const effects = this.actor.effects.filter( + (e) => e.system.targetType === "this", + ); + for (const effect of effects) { + yield effect; + } + + // Add all of the transferred effects from the items that affect this actor + for (const effect of this.transferredEffects) { + yield effect; + } + } + + applyActiveEffects() { + if (!this.actor) return; + + const overrides = { + [this.id]: {}, + }; + + // Organize non-disabled effects by their application priority + const changes = []; + for (const effect of this.allApplicableEffects()) { + if (!effect.active) continue; + const targets = effect.targets; + if (!targets.length) continue; + changes.push( + ...effect.changes.map((change) => { + const c = foundry.utils.deepClone(change); + c.targets = targets; + c.effect = effect; + c.priority = c.priority ?? c.mode * 10; + return c; + }), + ); + } + changes.sort((a, b) => a.priority - b.priority); + + // Apply all changes + for (let change of changes) { + if (!change.key) continue; + if (!change.targets?.length) continue; + change.targets.forEach((t) => { + const changes = change.effect.apply(t, change); + if (Object.keys(changes).length) { + if (typeof overrides[t.id] === "object") + foundry.utils.mergeObject(overrides[t.id], changes); + else overrides[t.id] = changes; + } + }); + } + + // Expand the set of final overrides + this.overrides = foundry.utils.expandObject(overrides[this.id]); + IterWrap.create(this.actor.allItems()).forEach((it) => { + if (overrides[it.id]) + it.overrides = foundry.utils.expandObject(overrides[it.id]); + }); + } + + /** + * Create a list of updates to the origin of all effects of this item to point to this item + * + * @returns an Array of updates + */ + updateEffectsOrigin() { + let result = []; + + result = this.effects.reduce((toUpdate, e) => { + if (e.origin !== this.uuid) { + const updateData = { _id: e.id, origin: this.uuid }; + return toUpdate.concat(updateData); + } + return toUpdate; + }, result); + + return result; + } + + async _onSortItem(event, itemData) { + // Get the drag source and drop target + const items = this.system.items; + const source = items.get(itemData._id); + const dropTarget = event.target.closest("[data-item-id]"); + if (!dropTarget) return; + const target = items.get(dropTarget.dataset.itemId); + + // Don't sort on yourself + if (source.id === target.id) return; + + // Identify sibling items based on adjacent HTML elements + const siblings = []; + for (let el of dropTarget.parentElement.children) { + const siblingId = el.dataset.itemId; + if (siblingId && siblingId !== source.id) + siblings.push(items.get(el.dataset.itemId)); + } + + // Perform the sort + const sortUpdates = SortingHelpers.performIntegerSort(source, { + target, + siblings, + }); + + const newAry = foundry.utils.deepClone(this.system.nestedItems); + + sortUpdates.forEach((u) => { + const target = newAry.find((ent) => ent._id === u.target.id); + target.sort = u.update.sort; + }); + + newAry.sort((a, b) => a.sort - b.sort); + + // Perform the update + await this.update({ "system.nestedItems": newAry }); + } + + /** @override */ + async _preCreate(data, options, userId) { + const allowed = await super._preCreate(data, options, userId); + if (!allowed) return false; + + const updateData = {}; + // Unless specifically overriden, gear and body types have the + // "transfer" property set to true + if (data.type.endsWith("gear") || data.type.startsWith("body")) { + if (foundry.utils.getProperty("system.transfer") === undefined) { + updateData["system.transfer"] = true; + } + } + this.updateSource(updateData); + return true; + } + + /** @override */ + _onCreate(data, options, userId) { + super._onCreate(data, options, userId); + const toUpdate = this.updateEffectsOrigin(); + if (toUpdate.length) + this.updateEmbeddedDocuments("ActiveEffect", toUpdate); + } + + /** @override */ + get uuid() { + if (!this._uuid) { + if (this.nestedIn) { + // If this is a nested object, we come up with a new UUID format + // where the nested item is defined with a hash mark + let parts = [this.nestedIn.uuid, "NestedItem", this.id]; + this._uuid = parts.join("#"); + } else if (this.cause) { + // If this is a virtual object, but not nested, then the UUID is + // virtually useless; this is an ephemeral object, and cannot be usefully + // referred to in any meaningful way. Nevertheless, to allow for identity, + // we construct a value that will be unique for this virtual item on this actor. + // HOWEVER: Note that storing or referring to this ID is problematic, since the + // _id of pure virtual items changes every time the actor is refreshed. + let parts = [this.actor.uuid, "VirtualItem", this.id]; + this._uuid = parts.join("#"); + } else { + this._uuid = super.uuid; + } + } + + return this._uuid; + } + + /** + * Merge sourceItem into this item. sourceItem and this item must be the same + * type, have the same name, and if the type has subtypes, must be the same + * subtype. If type is a gear type, then simply update the quantity instead. + * + * @param {SohlItem} this Item that will remain when merge is complete + * @param {SohlItem} sourceItem Item to merge into destItem + * @returns {boolean} true if merge succeeded, false otherwise + */ + async merge(sourceItem, { quantity = 0 } = {}) { + if (this.id === sourceItem.id) { + // Cannot merge an item onto itself + return false; + } + + if (this.cause && !this.nestedIn) { + // this is a pure virtual item, no merge allowed + return false; + } + + if (this.type !== sourceItem.type) { + return false; + } + + if (this.name !== sourceItem.name) { + return false; + } + + // Special case of gear: update the quantity + if (this.system instanceof GearItemData) { + // If quantity is 0, then move all of the quantity + if (!quantity) quantity = sourceItem.system.quantity; + + let result = await this.update({ + "system.quantity": this.system.quantity + quantity, + }); + if (result) { + const remainingQuantity = sourceItem.system.quantity - quantity; + if (!remainingQuantity) { + await sourceItem.delete(); + } else { + result = await sourceItem.update({ + "system.quantity": remainingQuantity, + }); + return result; + } + } + } + + // If sub-types don't match, then return without change + if (this.system.subType !== sourceItem.system.subType) { + return false; + } + + const updateData = sourceItem.toObject(); + + // Remove standard Item fields that should not be updated + delete updateData._id; + delete updateData.name; + delete updateData.type; + delete updateData.ownership; + delete updateData._stats; + delete updateData.sort; + + // Don't change the creation date of the item + delete updateData.system.createdTime; + + // Only update descriptive data if the fields are currently empty; + // don't overwrite existing data + if (updateData.system.subType) delete updateData.system.subType; + if (this.system.notes) delete updateData.system.notes; + if (this.system.textReference) delete updateData.system.textReference; + if (this.system.description) delete updateData.system.description; + + // Only update the image if the new one is not the Default Icon + if (updateData.img === SohlItem.DEFAULT_ICON) delete updateData.img; + + // Handle Mastery Level Items + if (sourceItem.system instanceof MasteryLevelItemData) { + delete updateData.system.masteryLevelBase; + } + + // Generally, all fields will be updated. Depending on the + // specific type, some fields will be left unchanged. + switch (sourceItem.type) { + case MysteryItemData.typeName: + delete updateData.system.charges; + break; + + case MysticalAbilityItemData.typeName: + delete updateData.system.charges; + break; + + case AfflictionItemData.typeName: + delete updateData.system.healingRateBase; + break; + + case TraitItemData.typeName: + if (sourceItem.system.textValue) + delete updateData.system.textValue; + if (sourceItem.system.max) delete updateData.system.max; + break; + + case BodyPartItemData.typeName: + delete updateData.system.heldItem; + break; + } + + const result = await this.update(updateData); + return !!result; + } + + getNestedItemById(itemId) { + let found = this.system.items.get(itemId); + if (!found && this.system instanceof ContainerGearItemData) { + for (let it of this.system.items) { + if (it.system instanceof ContainerGearItemData) { + found = it.system.items.get(itemId); + if (found) break; + } + } + } + + return found; + } + + async nestIn( + nestTarget, + { quantity = Number.MAX_SAFE_INTEGER, destructive = false } = {}, + ) { + let newItem = null; + if ( + !(nestTarget instanceof SohlItem || nestTarget instanceof SohlActor) + ) { + throw new Error("Must specify a destination item to nest into"); + } + if (!quantity) return null; + destructive &&= !(this.fromCompendiumOrWorld || this.isVirtual); + + const siblings = + nestTarget instanceof SohlItem + ? nestTarget.system.items.contents + : nestTarget.items.contents; + const similarSibling = siblings.find( + (it) => + it.name === this.name && + it.type === this.type && + it.system.subType === this.system.subType, + ); + + if (similarSibling) { + if (this.fromCompendiumOrWorld) { + /* TODO: Implement refresh items recursively + // Ask whether to refresh the item from World/Compendium + const overwrite = await Dialog.confirm({ + title: "Confirm Overwrite", + content: `

Overwrite existing ${similarSibling.system.constructor.typeLabel.singlular} ${similarSibling.name}?

`, + defaultYes: false, + options: { jQuery: false }, + }); + */ + ui.notifications.warn( + `An Item named ${this.name} exists in ${nestTarget.name}, cannot create new item with same name`, + ); + return null; + } else if (similarSibling.id === this.id) { + // Don't re-nest an item if it is already there + ui.notifications.warn( + `Identical Item ${this.name} already exists in ${nestTarget.name}`, + ); + return null; + } + + if (this.system instanceof GearItemData) { + // In the case of gear, which has quantity, we need to consider + // how many to copy over. + if (!this.fromCompendiumOrWorld) { + // Copy everything unless otherwise specified + quantity = Math.max( + 0, + Math.min(this.system.quantity, quantity), + ); + await similarSibling.update({ + "system.quantity": + similarSibling.system.quantity + quantity, + }); + if (destructive) { + if (this.system.quantity > quantity) { + await this.update({ + "system.quantity": + this.system.quantity - quantity, + }); + } else { + await this.delete(); + } + } + } + } else { + ui.notification.warn( + `Similar sibling already exists, move denied`, + ); + return null; + } + } else { + // Nothing similar exists, so we need to nest a new item + const newData = this.toObject(); + delete newData._id; + + const createOptions = { + clean: true, + nestedIn: nestTarget instanceof SohlItem ? nestTarget : null, + parent: + nestTarget instanceof SohlItem + ? nestTarget.actor + : nestTarget, + }; + + if ( + this.fromCompendiumOrWorld || + !(this.system instanceof GearItemData) + ) { + newItem = await this.constructor.create(newData, createOptions); + } else { + // Copy all gear unless otherwise specified + quantity = Math.max( + 0, + Math.min(this.system.quantity, quantity), + ); + newData.system.quantity = quantity; + newItem = await this.constructor.create(newData, createOptions); + if (destructive) { + if (this.system.quantity > quantity) { + await this.update({ + "system.quantity": this.system.quantity - quantity, + }); + } else { + await this.delete(); + } + } + } + } + + return newItem; + } + + // biome-ignore lint/correctness/noUnusedVariables: + static async fromDropData(data, options = {}) { + let document = null; + + // Case 1 - Data explicitly provided + if (data.data) document = new this(data.data); + // Case 2 - UUID provided + else if (data.uuid) document = await fromUuid(data.uuid); + + // Ensure that we retrieved a valid document + if (!document) { + throw new Error( + "Failed to resolve Document from provided DragData. Either data or a UUID must be provided.", + ); + } + if (document.documentName !== this.documentName) { + throw new Error( + `Invalid Document type '${document.type}' provided to ${this.name}.fromDropData.`, + ); + } + + // Flag the source UUID + if (document.id && !document._stats?.compendiumSource) { + let uuid = document.uuid.split("#").at(0); + document.updateSource({ "_stats.compendiumSource": uuid }); + } + return document; + } + + static _resetIds(data, _i = 0) { + if (_i > 99) { + throw new Error("Maximum depth exceeded"); + } + data._id = foundry.utils.randomID(); + if (data.system?.macros?.length) { + for (let m of data.system.macros) { + m._id = foundry.utils.randomID(); + } + } + if (data.system?.nestedItems?.length) { + for (let obj of data.system.nestedItems) { + SohlItem._resetIds(obj, _i + 1); + } + } + data.effects = data.effects?.map((e) => { + if (e instanceof ActiveEffect) e = e.toObject(); + e._id = foundry.utils.randomID(); + return e; + }); + } + + static async create(data, options = {}) { + let newData = foundry.utils.deepClone(data); + + if (Object.keys(newData).some((k) => /\./.test(k))) { + newData = foundry.utils.expandObject(newData); + } + + if (!data.type) { + throw new Error("Must specify type of item to create"); + } + + if (options.clean) { + delete newData.folder; + delete newData.sort; + delete newData.pack; + if ("ownership" in newData) { + newData.ownership = { + default: CONST.DOCUMENT_OWNERSHIP_LEVELS.NONE, + [game.user.id]: CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER, + }; + } + + // Clear and disable all events associated with the item + if (newData.system?.nestedItems.length) { + for (const obj of newData.system.nestedItems) { + if (obj.type === "event" && obj.system.activation.enabled) { + obj.system.activation.enabled = false; + obj.system.activation.startTime = 0; + obj.system.activation.endTime = 0; + } + } + } + } + + if (options.parent && !(options.parent instanceof SohlActor)) + throw new Error("parent must always be an instance of SohlActor"); + + if (!(newData._id && options.keepId)) { + SohlItem._resetIds(newData); + } + + if (!newData.img) { + newData.img = + SOHL.sysVer.CONFIG.Item.dataModels[newData.type]?.defaultImage; + } + + // If nestedIn is specified, use update() on the nestedIn + if (options.nestedIn) { + if (options.nestedIn && !(options.nestedIn instanceof SohlItem)) { + throw new Error(`nestedIn must be an SohlItem document`); + } + + const newAry = foundry.utils.deepClone( + options.nestedIn.system.nestedItems, + ); + + const itemExists = newAry.some((obj) => obj._id === newData._id); + if (itemExists) { + throw new Error( + `Item with id ${newData._id} already exists in ${options.nestedIn.label}`, + ); + } + + let item = new SohlItem(newData, options); + //await item._preCreate(newData, options, game.user); + const itemData = item.toObject(); + + // Set sort property + let maxSort = newAry.reduce( + (max, obj) => Math.max(max, obj.sort), + 0, + ); + maxSort += CONST.SORT_INTEGER_DENSITY; + itemData.sort = maxSort; + newAry.push(itemData); + + const result = await options.nestedIn.update( + { "system.nestedItems": newAry }, + { nestedIn: options.nestedIn }, + ); + + return result; + } else { + return await super.create(newData, options); + } + } + + /** @override */ + update(data = [], context = {}) { + // Note that this method will return a direct response if called + // on an item with an nestedIn, otherwise it will return a Promise. + + let result = this.cause; + + if (this.nestedIn || this.cause) { + this.updateSource(data); + } + + if (this.nestedIn) { + const newAry = foundry.utils.deepClone( + this.nestedIn.system.nestedItems, + ); + const idx = newAry.findIndex((obj) => obj._id === this.id); + if (idx >= 0) { + const expandedData = foundry.utils.expandObject(data); + foundry.utils.mergeObject(newAry[idx], expandedData, { + performDeletions: true, + }); + newAry.sort((a, b) => a.sort - b.sort); + const updateData = { + "system.nestedItems": newAry, + }; + result = this.nestedIn.update(updateData, context); + } + } else if (!this.cause) { + result = super.update(data, context); + } + + return result; + } + + /** @override */ + delete(context = {}) { + // Note that this method will return a direct response if called + // on an item with either nestedIn or cause with a truthy value, + // otherwise it will return a Promise. + if (this.nestedIn || this.cause) { + if (this.nestedIn) { + const newAry = foundry.utils.deepClone( + this.nestedIn.system.nestedItems, + ); + const filtered = newAry.filter((obj) => obj._id !== this.id); + if (filtered.length !== newAry.length) { + this.nestedIn.update( + { "system.nestedItems": filtered }, + context, + ); + } + } + + if (this.cause) { + this.actor.system.virtualItems.delete(this.id); + this.actor.render(); + } + + return this; + } else { + return super.delete(context); + } + } +} + +export class SohlBaseData extends foundry.abstract.TypeDataModel { + /** + * An object containing collections, including macros and nested items + * + * @type {object} + */ + _collections = {}; + + static get comparison() { + return { + IDENTICAL: 0, + SIMILAR: 1, + DIFFERENT: 2, + }; + } + + static get typeName() { + throw new Error("Subclass must define typeName"); + } + + static get typeLabel() { + throw new Error("Subclass must define typeLabel"); + } + + same(other) { + if ( + this.constructor === other?.constructor && + this.macros.length === other.macros.length + ) { + // TODO: Compare macros are identical + return SohlBaseData.comparison.IDENTICAL; + } + return SohlBaseData.comparison.DIFFERENT; + } + + static get defaultImage() { + return "icons/svg/item-bag.svg"; + } + + static get effectKeys() { + return {}; + } + + // biome-ignore lint/correctness/noUnusedVariables: + getEvent(eventTag) { + throw new Error("Subclass must define getEvent"); + } + + static get eventTags() { + return { + none: "", + created: "Created", + lastmod: "Last Modified", + }; + } + + static get mods() { + return { + Player: { name: "Player Modifier", abbrev: "PlyrMod" }, + MinValue: { name: "Minimum Value", abbrev: "MinVal" }, + MaxValue: { name: "Maximum Value", abbrev: "MaxVal" }, + AE: { name: "Active Effect", abbrev: "AE" }, + Base: { name: "Base", abbrev: "Base" }, + Outnumbered: { name: "Outnumbered", abbrev: "Outn" }, + OffHand: { name: "Off-Hand Weapon Use", abbrev: "OffHnd" }, + }; + } + + static get sheet() { + throw new Error("Must define sheet path in subclass of SohlBaseData"); + } + + get availableFate() { + return false; + } + + get actor() { + if (this.parent instanceof SohlActor) { + return this.parent; + } else if (this.parent instanceof SohlItem) { + return this.parent.actor; + } else { + return null; + } + } + + async setupActionCache() { + let ary = []; + this.macros.forEach((m) => { + const macro = new SohlMacro(m, { + nestedIn: this.parent, + keepId: true, + }); + if (!macro) { + console.error( + `Failure to create macro ${m.name} on ${this.parent.name}`, + ); + } else { + ary.push([macro.id, macro]); + } + }); + + // Finally, add in the intrinsic actions (unless an action with same + // name has already been added). All of these macros will have the + // flag "flags.sohl.isIntrinsicAction" set to true. + this.intrinsicActions.forEach((intrinsicAction) => { + if (!ary.some(([, m]) => m.name === intrinsicAction.name)) { + let contextCondition; + const condType = typeof intrinsicAction.contextCondition; + if (intrinsicAction.contextCondition instanceof Function) { + contextCondition = intrinsicAction.contextCondition; + } else if (condType === "boolean") { + contextCondition = intrinsicAction.contextCondition; + } else { + contextCondition = false; + } + const macro = new SohlMacro( + { + name: intrinsicAction.name, + _id: Utility.createHash16( + this.parent.uuid + intrinsicAction.name, + ), + type: CONST.MACRO_TYPES.SCRIPT, + img: "systems/sohl/assets/icons/default-action.svg", + flags: { + sohl: { + notes: "", + description: "", + params: {}, + functionName: intrinsicAction.functionName, + contextLabel: intrinsicAction.name, + contextIconClass: + intrinsicAction.contextIconClass, + contextCondition, + contextGroup: intrinsicAction.contextGroup, + isIntrinsicAction: true, + useAsync: !!intrinsicAction.useAsync, + }, + }, + }, + { nestedIn: this.parent }, + ); + + ary.push([macro.id, macro]); + } + }); + + // Only accept the first default, all others set to Primary + let hasDefault = false; + ary.forEach((a) => { + const isDefault = + foundry.utils.getProperty(a[1], "flags.sohl.contextGroup") === + SohlContextMenu.sortGroups.Default; + if (hasDefault) { + if (isDefault) { + foundry.utils.setProperty( + a[1], + "flags.sohl.contextGroup", + SohlContextMenu.sortGroups.Primary, + ); + } + } else { + hasDefault ||= isDefault; + } + }); + + ary.sort((a, b) => { + const contextGroupA = + a[1].getFlag("sohl", "contextGroup") || + SohlContextMenu.sortGroups.General; + const contextGroupB = + b[1].getFlag("sohl", "contextGroup") || + SohlContextMenu.sortGroups.General; + return contextGroupA.localeCompare(contextGroupB); + }); + + // If no default was specified, then make the first element the default + if (!hasDefault && ary.length) { + foundry.utils.setProperty( + ary[0][1], + "flags.sohl.contextGroup", + SohlContextMenu.sortGroups.Default, + ); + } + + if (this._collections.actions) delete this._collections.actions; + ary.forEach((a) => this.actions.set(a[0], a[1])); + } + + get actions() { + this._collections.actions ||= new Collection(); + return this._collections.actions; + } + + /** + * Returns an array of predefined action descriptors for this item. These + * actions are already implemented in code, so they are always available. These + * can be specifically overridden by a macro with the same name. + * + * @readonly + * @type {{}} + */ + get intrinsicActions() { + return []; + } + + get events() { + const result = + IterWrap.create(this.actor?.allItems()).reduce((obj, it) => { + if (it.system instanceof EventItemData && it.system.isEnabled) { + // First, get all events targetting this item. + if (it.system.$targetUuid === this.uuid) { + obj[it.name] = { + name: it.name, + uuid: it.uuid, + source: it.nestedIn || this.actor, + sourceName: + it.nestedIn?.label || this.actor?.label || "", + target: this.item, + targetName: this.item.label, + when: it.system.activation.endTime, + remaining: it.system.remainingDuration, + oper: + EventItemData.operators[ + it.system.activation.oper + ] || "", + actionName: it.system.actionName, + item: it, + }; + } + + // Next, add any event that are nested in this item. + if ( + it.nestedIn?.uuid === this.uuid && + !Object.hasOwn(it.uuid) + ) { + obj[it.uuid] = { + name: it.name, + uuid: it.uuid, + source: it.nestedIn || this.actor, + sourceName: + it.nestedIn?.label || this.actor?.label || "", + target: it.system.target, + targetName: + it.system.target.uuid === it.uuid + ? "Self" + : it.system.target?.label || "", + when: it.system.activation.endTime, + remaining: it.system.remainingDuration, + oper: + EventItemData.operators[ + it.system.activation.oper + ] || "", + actionName: it.system.actionName, + item: it, + }; + } + } + return obj; + }, {}) || {}; + return result; + } + + /** @override */ + static defineSchema() { + return { + macros: new fields.ArrayField(new fields.ObjectField()), + }; + } + + getDefaultAction(html) { + const contextOptions = this._getContextOptions(); + const defAction = contextOptions.find( + (co) => + co.group === SohlContextMenu.sortGroups.Default && + (co.condition instanceof Function + ? co.condition(html) + : co.condition), + ); + return defAction; + } + + _getContextOptions() { + let result = this.actions.reduce((ary, m) => { + const contextCondition = m.contextCondition; + let cond = contextCondition; + if (typeof contextCondition === "string") { + if (!contextCondition || /^true$/i.test(contextCondition)) { + cond = true; + } else if (/^false$/i.test(contextCondition)) { + cond = false; + } else { + cond = function (header) { + const fn = new Function( + "header", + `{${contextCondition}}`, + ); + + try { + return fn.call(header); + } catch (err) { + Hooks.onError( + "SohlBaseData#_getContextOptions", + err, + { + msg: `Error executing context condition for ${m.name} on ${this.parent.name}`, + log: "error", + }, + ); + } + }; + } + } + + if (cond) { + const newAction = { + name: m.name, + icon: ``, + condition: cond, + callback: () => { + this.execute(m.name); + }, + group: m.contextGroup, + }; + ary.push(newAction); + } + return ary; + }, []); + return result; + } + + /** + * Execute an action. Executes a macro if available, otherwise executes any + * default implementation. Executes synchronously unless otherwise specified. + * + * @param {string} actionName Name of the action to perform + * @param {object} options Execution parameters which are passed to the action + * @param {boolean} [options.async=false] Whether to execute this action as an async function + * @param {object[]} [options.scope] additional parameters + */ + execute(actionName, { inPrepareData = false, ...scope } = {}) { + if (!actionName) return; + + let action = this.actions.find( + (a) => a.name === actionName || a.functionName === actionName, + ); + if (action) { + scope.actionName = actionName; + scope.self = this; + scope.inPrepareData = inPrepareData; + return action.execute(scope); + } + return null; + } + + prepareBaseData() { + super.prepareBaseData(); + this.setupActionCache(); + } +} + +export class SohlActorData extends SohlBaseData { + /** + * Virtual items either inherited or synthesized + * + * @type {Collection} + */ + #virtualItems; + + /** + * Represents the weight of gear being carried by an actor. + * + * @type {ValueModifier} + */ + $gearWeight; + + /** + * Indicates whether the setup process has been completed. + * + * @type {boolean} + */ + $isSetup; + + get virtualItems() { + if (!this.#virtualItems) this.#virtualItems = new Collection(); + return this.#virtualItems; + } + + getEvent(eventTag) { + return this.actor.items.find( + (it) => + it.system instanceof EventItemData && + it.system.tag === eventTag, + ); + } + + static get sheet() { + return "systems/sohl/templates/actor/actor-sheet.html"; + } + + /** @override */ + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + bioImage: new fields.FilePathField({ + categories: ["IMAGE"], + initial: CONST.DEFAULT_TOKEN, + label: "Biographical Image", + }), + description: new fields.HTMLField({ + initial: "", + label: "Description", + hint: "Physical description and traits", + }), + biography: new fields.HTMLField({ + initial: "", + label: "Biography", + hint: "Backstory and biographical information", + }), + }); + } + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "mod:system.$engagedOpponents": { + label: "Engaged Opponents", + abbrev: "EngOpp", + }, + "mod:system.$gearWeight": { + label: "Weight Carried", + abbrev: "WtCar", + }, + }); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$collection = new Collection(); + this.$gearWeight = new ValueModifier(this, { + maxFight: new ValueModifier(this), + max: new ValueModifier(this), + value: (thisVM) => { + return Math.round(thisVM.effective * 1000) / 1000; + }, + status: (thisVM) => { + if (thisVM.effective > thisVM.max.effective) + return ContainerGearItemData.status.OverCapacity; + else if (thisVM.effective > thisVM.maxFight.effective) + return ContainerGearItemData.status.OverFightCapacity; + else return ContainerGearItemData.status.Ok; + }, + }); + + // The maximum weights here are totally arbitrary. To get reasonable values, + // it is expected for the actor to have a "capacity" trait that sets these + // values correctly. + this.$gearWeight.maxFight.setBase(50); + this.$gearWeight.max.setBase(75); + } + + checkExpired() { + IterWrap.create(this.actor.allItems()).forEach((it) => { + it.system.checkExpired(); + }); + } +} + +export class SohlItemData extends SohlBaseData { + static get sheet() { + return `systems/sohl/templates/item/${this.typeName}-sheet.html`; + } + + getEvent(eventTag) { + return this.items.find( + (it) => + it.system instanceof EventItemData && + it.system.tag === eventTag, + ); + } + + get containers() { + const result = this.items.reduce((ary, ei) => { + if (ei.system instanceof ContainerGearItemData) { + ary.push(ei); + } + return ary; + }, []); + return result; + } + + /** + * Returns the collection of nested, but not active, items. + * These items do not get processed by prepareData(). These are + * not yet true items; in order to get processed, these items must + * be copied to the SohlActor#virtualItems collection prior to processing + * the nested collections. + * + * For example, the GearItemData#prepareBaseData method will copy all + * of the "gear" items to the SohlActor#virtualItems collection so they get + * processed. Similar actions occur with other items. + */ + get items() { + this._collections.items ||= new Collection(); + return this._collections.items; + } + + get item() { + if (this.parent instanceof SohlItem) { + return this.parent; + } + throw new Error( + `Invalid SohlItemData: must be associated with an SohlItem parent`, + ); + } + + get topItem() { + if (!this.item.cause) { + if (!this.item.nestedIn) { + return this.item; + } else { + return this.item.nestedIn.system.topItem; + } + } else { + return this.item.cause.system.topItem; + } + } + + /** @override */ + get actor() { + return this.item.actor; + } + + get id() { + return this.item.id; + } + + get name() { + return this.item.name; + } + + get img() { + return this.item.img; + } + + get uuid() { + return this.item.uuid; + } + + get transferToActor() { + return this.transfer; + } + + same(other) { + let result = super.same(other); + if (result === SohlBaseData.comparison.DIFFERENT) return result; + if ( + this.notes === other.notes && + this.description === other.description && + this.textReference === other.textReference && + this.transfer === other.transfer && + this.nestedItems.length === other.nestedItems.length + ) { + // TODO: Check that each nestedItem is identical + return result; + } + return SohlBaseData.comparison.DIFFERENT; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + notes: new fields.StringField({ + initial: "", + label: "Notes", + }), + description: new fields.HTMLField({ + initial: "", + label: "Description", + }), + textReference: new fields.StringField({ + initial: "", + label: "Reference", + }), + nestedItems: new fields.ArrayField(new fields.ObjectField()), + transfer: new fields.BooleanField({ + initial: false, + label: "Transfer to Actor", + }), + }); + } + + /** @override */ + // biome-ignore lint/correctness/noUnusedVariables: + async _preCreate(data, options, userId) { + return true; + } + + async deleteItem() { + let title = `Delete Item: ${this.name}`; + let content = + "

Are You Sure?

This item will be deleted and cannot be recovered.

"; + + if (this instanceof ContainerGearItemData) { + title = `Delete Container: ${this.name}`; + content += + "

WARNING: All items in this container will be deleted as well!

" + + content; + } + + // Create the dialog window + const agree = await Dialog.confirm({ + title: title, + content: content, + yes: () => true, + }); + + if (agree) { + await this.item.delete(); + } + } + + async editItem() { + await this.item.sheet.render(true); + } + + get intrinsicActions() { + return [ + { + functionName: "editItem", + name: "Edit", + contextIconClass: "fas fa-edit", + contextCondition: (header) => { + if (game.user.isGM) return true; + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item?.isOwner; + }, + contextGroup: SohlContextMenu.sortGroups.General, + }, + { + functionName: "deleteItem", + name: "Delete", + contextIconClass: "fas fa-trash", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return ( + !item?.isVirtual && (game.user.isGM || item?.isOwner) + ); + }, + contextGroup: SohlContextMenu.sortGroups.General, + }, + { + functionName: "showDescription", + name: "Show Description", + contextIconClass: "fas fa-scroll", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return ( + item && + !!( + item.system.description || + item.system.notes || + item.system.textReference + ) + ); + }, + contextGroup: SohlContextMenu.sortGroups.General, + }, + { + functionName: "setupVirtualItems", + name: "Setup Virtual Items", + contextIconClass: "", + contextCondition: false, + contextGroup: SohlContextMenu.sortGroups.General, + }, + { + functionName: "processSiblings", + name: "Process Siblings", + contextIconClass: "", + contextCondition: false, + contextGroup: SohlContextMenu.sortGroups.General, + }, + { + functionName: "postProcess", + name: "Post-Process", + contextIconClass: "", + contextCondition: false, + contextGroup: SohlContextMenu.sortGroups.General, + }, + ]; + } + + async showDescription() { + const chatData = { + name: this.item.name, + subtitle: `${this.subType} ${this.constructor.typeLabel.singular}`, + level: this.$level.effective, + desc: this.description, + notes: this.notes, + textRef: this.item.system.textReference, + }; + + if (this.item.type === MysticalAbilityItemData.typeName) { + chatData.name += ` (${this.$level.roman})`; + chatData.subtitle = `${this.domain} ${ + this.constructor.domainLabel[this.domain] || "Domain" + }`; + if (this.charges.usesCharges) { + chatData.charges = `${this.$charges.effective}`; + if (this.$maxCharges.effective) { + chatData.charges += `/${this.$maxCharges}`; + } + } + } + + const chatTemplate = "systems/sohl/templates/chat/item-desc-card.html"; + + const html = await renderTemplate(chatTemplate, chatData); + + const messageData = { + user: game.user.id, + speaker: ChatMessage.getSpeaker(), + content: html.trim(), + sound: CONFIG.sounds.notification, + }; + + // Create a chat message + return ChatMessage.create(messageData); + } + + /** + * Prepare base data processing. Cannot assume the actor exists or + * has been setup. + */ + prepareBaseData() { + super.prepareBaseData(); + + // Construct Embedded Collections + if (this._collections.items) delete this._collections.items; + this.nestedItems + .toSorted((a, b) => a.sort - b.sort) + .forEach((ni) => { + const item = new SohlItem(ni, { + nestedIn: this.item, + keepId: true, + }); + if (!item) { + console.error( + `Failure to create item ${ni.name} on ${this.nestedIn.name}`, + ); + } else { + this.items.set(item.id, item); + } + }); + } + + /** + * This method is the only place where it is safe to create new virtual items. + * It runs after prepareDerivedData() has completed, and is only run for items + * that are "owned" items or virtual items. + * + * The return value is the set of new items that were added to the Virtual Items list. + */ + setupVirtualItems() { + this.items.forEach((it) => { + // Add all enabled events to the virtual items list + if (it.system instanceof EventItemData) { + if (it.system.isEnabled) { + if (!it.cause) { + it.cause = this.item; + } + } else { + if ( + !it.system.activation.enabled && + it.system.activation.autoStart !== "never" + ) { + it.system.start(); + it.cause = this.item; + } + } + } else if (it.system.transferToActor) { + it.cause = this.item; + } + }); + } + + /** + * Perform processing requiring access to siblings. It is safe to access + * other virtual and nested items of the actor at this point. + */ + processSiblings() { + // Subclass provide implementation + } + + /** + * Final processing after all derived data has been calculated, and all + * items have been setup. It is safe to access other items of the actor + * at this point. + */ + postProcess() { + // Subclass provide implementation + } + + /** + * Perform processing to check whether timers have expired + */ + checkExpired() { + // Subclass provide implementation + } +} + +export class AnimateEntityActorData extends SohlActorData { + /** + * Represents the health of a entity. + * + * @type {ValueModifier} + */ + $health; + + /** + * Represents the sum of all zones. + * + * @type {number} + */ + $zoneSum; + + /** + * Represents the base body weight of a entity without any gear + * + * @type {ValueModifier} + */ + $bodyWeight; + + /** + * Represents the level of shock the character is experiencing. + * + * @type {number} + */ + $shockState; + + $fate; + + $engagedOpponents; + + $domains; + + static get typeName() { + return "entity"; + } + + static get typeLabel() { + return { + singular: "Animate Entity", + plural: "Animate Entities", + }; + } + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "mod:system.$engagedOpponents": { + label: "Engaged Opponents", + abbrev: "EngOpp", + }, + }); + } + + get intrinsicActions() { + let actions = super.intrinsicActions.map((a) => { + if (a.contextGroup === SohlContextMenu.sortGroups.Default) { + a.contextGroup = SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push( + { + functionName: "shockTest", + name: "Shock Test", + contextIconClass: "far fa-face-eyes-xmarks", + contextCondition: true, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "stumbleTest", + name: "Stumble Test", + contextIconClass: "far fa-person-falling", + contextCondition: true, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "fumbleTest", + name: "Fumble Test", + contextIconClass: "far fa-ball-pile", + contextCondition: true, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "moraleTest", + name: "Morale Test", + contextIconClass: "far fa-people-group", + contextCondition: true, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "fearTest", + name: "Fear Test", + contextIconClass: "far fa-face-scream", + contextCondition: true, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "opposedTestResume", + name: "Opposed Test Resume", + contextIconClass: "far fa-gears", + contextCondition: false, + contextGroup: SohlContextMenu.sortGroups.General, + }, + { + functionName: "contractTest", + name: "Contract Affliction Test", + contextIconClass: "fas fa-virus", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + const endurance = item?.actor?.getTraitByAbbrev("end"); + return ( + endurance && !endurance.system.$masteryLevel.disabled + ); + }, + contextGroup: SohlContextMenu.sortGroups.Default, + }, + ); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + /*--------------------------------------------------------------------------------*/ + /* DAMAGE ROLL PROCESSING + /*--------------------------------------------------------------------------------*/ + + /** + * Performs a damage roll, presenting a dialog + * to collect information about the damage. + * + * @param {object} rollData + * @param {object} [rollData.impactMod] A CombatModifier object representing the impact + * @param {string} [rollData.strikeModeUuid] UUID of strike mode + * @param {number} [numImpactTAs=0] Number of Impact Tactical Advantages + * @param {boolean} [rollData.skipDialog=false] if true, do not display dialog + */ + async damageRoll({ + targetToken, + impactMod, + bodyLocationUuid, + skipDialog = false, + ...options + } = {}) { + if (skipDialog && !impactMod) return null; + + const impactModifier = + SOHL.sysVer.CONFIG.Helper.modifiers.ImpactModifier; + const strikeMode = + impactMod.parent instanceof StrikeModeItemData + ? impactMod.parent.item + : null; + const bodyLocation = bodyLocationUuid + ? await fromUuid(bodyLocationUuid) + : null; + + const dialogOptions = { + type: "damage", + label: strikeMode ? `${strikeMode.name} Damage` : "Damage", + strikeMode, + impactMod: impactMod + ? impactModifier.create(impactMod) + : new impactModifier(this), + ...options, + }; + + let roll; + if (!impactMod || !skipDialog) { + // Create the Roll instance + roll = await this._damageDialog(dialogOptions); + + // If user cancelled the roll, then return immediately + if (!roll) return null; + } else { + roll = { + type: dialogOptions.type, + impactMod: dialogOptions.impactMod, + }; + roll.rollObj = await dialogOptions.impactMod.evaluate(); + } + + // Prepare for Chat Message + const chatTemplate = "systems/sohl/templates/chat/damage-card.html"; + const chatTemplateData = { + title: + dialogOptions.label + + (targetToken ? ` to ${targetToken.name}` : ""), + roll, + targetToken, + bodyLocation, + }; + const html = await renderTemplate(chatTemplate, chatTemplateData); + + const messageData = { + user: game.user.id, + speaker: this.speaker, + content: html.trim(), + style: CONST.CHAT_MESSAGE_STYLES.ROLL, + sound: CONFIG.sounds.dice, + roll: roll.rollObj, + }; + + const messageOptions = { + rollMode: game.settings.get("core", "rollMode"), + }; + + // Create a chat message + await ChatMessage.create(messageData, messageOptions); + + return chatTemplateData; + } + + /** + * Renders a dialog to get the information for a damage roll, and then + * perform processing to determine results. Returns Roll object + * representing outcome of die rolls, or null if user cancelled dialog. + * + * @param {*} dialogOptions + */ + async _damageDialog({ type, label, strikeMode, impactMod, ...options }) { + // Render modal dialog + let dlgTemplate = "systems/sohl/templates/dialog/damage-dialog.html"; + let dialogData = { + type, + strikeMode, + weaponName: strikeMode?.name || "Non-Weapon", + impactFormula: impactMod.label, + impactMod, + askImpact: !impactMod, + addlWeaponImpact: 0, + addlArmorReduction: 0, + config: SOHL.sysVer.CONFIG, + ...options, + }; + const html = await renderTemplate(dlgTemplate, dialogData); + + // Create the dialog window + return await Dialog.prompt({ + title: label, + content: html.trim(), + label: "Roll", + callback: async (html) => { + return this._damageDialogCallback(html, dialogData); + }, + rejectClose: false, + }); + } + + // biome-ignore lint/correctness/noUnusedVariables: + async _damageDialogCallback(html, { type, impactMod, strikeMode }) { + const form = html[0].querySelector("form"); + const formAddlWeaponImpact = + Number.parseInt(form.addlWeaponImpact.value, 10) || 0; + const formAddlArmorReduction = + Number.parseInt(form.addlArmorReduction.value, 10) || 0; + const newImpact = impactMod + ? this.constructor.create(impactMod) + : { + numDice: Number.parseInt(form.numDice?.value, 10) || 1, + die: Number.parseInt(form.impactDie?.value, 10) || 0, + modifier: + Number.parseInt(form.impactModifier?.value, 10) || 0, + aspect: form.impactAspect?.value || "blunt", + }; + foundry.utils.mergeObject(newImpact, { + extraBleedRisk: form.extraBleedRisk.checked, + armorReduction: { + mods: [], + }, + }); + if (formAddlWeaponImpact) { + newImpact.add("Player Modifier", "PlyrMod", formAddlWeaponImpact); + } + if (formAddlArmorReduction) { + newImpact.armorReduction.add( + "Player Modifier", + "PlyrMod", + formAddlArmorReduction, + ); + } + + const roll = { + type, + impactMod: impactMod, + }; + roll.rollObj = await impactMod.evaluate(); + return roll; + } + shockTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-shock-test`, + title = `${this.item.label} Shock Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Shock Test + ui.notifications.warn("Shock Test Not Implemented"); + } + + stumbleTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-stumble-test`, + title = `${this.item.label} Stumble Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Stumble Test + ui.notifications.warn("Stumble Test Not Implemented"); + } + + fumbleTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-fumble-test`, + title = `${this.item.label} Fumble Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Fumble Test + ui.notifications.warn("Fumble Test Not Implemented"); + } + + moraleTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-morale-test`, + title = `${this.item.label} Morale Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Morale Test + ui.notifications.warn("Morale Test Not Implemented"); + } + + fearTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-fear-test`, + title = `${this.item.label} Fear Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Fear Test + ui.notifications.warn("Fear Test Not Implemented"); + } + + /** + * Resume the opposed test + * + * @param {object} options + * @param {string} [options.atkItemUuid] UUID of the item the initiator is using + * @param {number} [options.atkRollData] The attack roll data + * @param {number} [options.atkSLMod] The Success Level modifier for the initiator + * @returns Object containing the results of the test + */ + async opposedTestResume( + speaker, + actor, + token, + character, + { + atkItemUuid, + successLevelMod: atkSuccLvlMod, + modifier: atkModifier, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + }, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsToken: true, + self: this, + })); + + // Get the attacker's item for the opposed roll + const atkItem = fromUuidSync(atkItemUuid); + + if (!atkItem) { + ui.notifications.error( + `Cannot find item with UUID: ${atkItemUuid}`, + ); + return null; + } + + const atkMasteryLevel = ValueModifier.create( + atkItem.system.$masteryLevel, + ); + if (!atkMasteryLevel) { + ui.notifications.error( + `${atkItem.name} does not support opposed rolls, can't continue`, + ); + return null; + } + atkMasteryLevel.successLevelMod = atkSuccLvlMod; + if (atkModifier) { + atkMasteryLevel.add("Player Modifier", "PlyrMod", atkModifier); + } + + // Build list of acceptable opposed items on this actor + const opposedItems = []; + IterWrap.create(actor.allItems()).forEach((it) => { + if (it.system instanceof MasteryLevelItemData) { + if (!it.system.$masteryLevel.disabled) { + let itemTypeName = + it.system instanceof TraitItemData && + it.system.intensity === "attribute" + ? "Attribute" + : SOHL.sysVer.CONFIG.Item.typeLabels[it.type]; + if (it.system.subType) { + itemTypeName += ` (${it.system.subType})`; + } + opposedItems.push({ + name: `${itemTypeName}: ${it.name} (TL:${it.system.$masteryLevel.effective})`, + uuid: it.uuid, + value: it.system.$masteryLevel, + }); + } + } + }); + opposedItems.sort((a, b) => a.localeCompare(b)); + + const defaultItem = this.parent.items.find( + (it) => it.type === atkItem.type && it.name === atkItem.name, + ); + const defaultItemUuid = defaultItem?.uuid || opposedItems[0].uuid; + + const dialogOptions = { + type: "opposed-test-resume", + title: "Opposed Roll", + opposedItems, + opposedItemUuid: defaultItemUuid, + mods: opposedItems[0].mods, + label: `Complete Opposed Roll`, + modifier: 0, + successLevelMod: 0, + }; + if (this.$shockState === SOHL.CONST.SHOCK.Stunned) + dialogOptions.successLevelMod--; + + const dlgTemplate = + "systems/sohl/templates/dialog/opposed-response-dialog.html"; + const dlgHtml = await renderTemplate(dlgTemplate, dialogOptions); + + // Pop up the dialog to get the defender's data + const dlgResult = await Dialog.prompt({ + title: dialogOptions.title, + content: dlgHtml.trim(), + label: dialogOptions.label, + render: (html) => { + const form = html[0].querySelector("form"); + const mods = html[0].querySelector("_mods"); + form.opposedItemUuid.addEventListener("change", () => { + const opposedItemUuid = form.opposedItemUuid.value; + const opposedItem = dialogOptions.opposedItems.find( + (it) => it.value === opposedItemUuid, + ); + const newHtml = opposedItem.chatHtml; + mods.innerHTML = newHtml; + }); + }, + callback: (html) => { + const form = html[0].querySelector("form"); + const defModifier = + Number.parseInt(form.modifier.value, 10) || 0; + const defSuccessLevelMod = + Number.parseInt(form.successLevelMod.value, 10) || 0; + const opposedItemUuid = form.opposedItemUuid.value; + const opposedItem = dialogOptions.opposedItems.find( + (it) => it.uuid === opposedItemUuid, + ); + const result = { + value: ValueModifier.create(opposedItem.value), + successLevelMod: defSuccessLevelMod, + opposedItemUuid, + }; + if (defModifier) { + result.value.add("Player Modifier", "PlyrMod", defModifier); + } + return result; + }, + rejectClose: false, + }); + + // If dialog cancelled then quit + if (!dlgResult) return null; + + // Get the defender's item for the opposed roll + const defItem = this.getItem(dlgResult.opposedItemId); + + if (!defItem) { + ui.notifications.error( + `Cannot find item ${dlgResult.opposedItemId} on actor ${this.name}`, + ); + return null; + } + + const defItemUuid = defItem.uuid; + + let defMasteryLevel; + if (!defItem.system.$masteryLevel) { + ui.notifications.error( + `${defItem.name} does not support opposed rolls, can't continue`, + ); + return null; + } else { + defMasteryLevel = ValueModifier.create( + defItem.system.$masteryLevel, + ); + } + + defMasteryLevel.addVM(dlgResult.value, { includeBase: true }); + defMasteryLevel.successLevelMod = dlgResult.value.successLevelMod; + + // Roll for the attacker + const atkTest = await atkMasteryLevel.test({ + type: "attacker-opposed-test", + }); + + // Roll for the defender + const defTest = await defMasteryLevel.test({ + type: "defender-opposed-test", + }); + + return await this.opposedTestSendToChat( + speaker, + actor, + token, + character, + { + prevAtkResultJson: JSON.stringify(atkTest), + prevDefResultJson: JSON.stringify(defTest), + atkItemUuid, + defItemUuid, + }, + ); + } + + async opposedTestSendToChat( + speaker, + actor, + token, + character, + // biome-ignore lint/correctness/noUnusedVariables: + { prevAtkResult, prevDefResult, atkItemUuid, defItemUuid, ...scope }, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsToken: true, + self: this, + })); + + prevAtkResult.mlMod = JSON.parse(prevAtkResult.mlModStr); + prevDefResult.mlMod = JSON.parse(prevDefResult.mlModStr); + const atkItem = await fromUuid(atkItemUuid); + const defItem = await fromUuid(defItemUuid); + const victoryStars = this.calcVictoryStars( + prevAtkResult.successLevel + prevAtkResult.atkFateBonus, + prevDefResult.successLevel + prevDefResult.defFateBonus, + ); + const atkWins = victoryStars > 0; + const defWins = victoryStars < 0; + const victoryStarsText = this.victoryStarsText( + !prevAtkResult.isSuccess && !prevDefResult.isSuccess + ? null + : victoryStars, + ); + + // Prepare for Chat Message + const chatTemplate = + "systems/sohl/templates/chat/opposed-result-card.html"; + + const chatTemplateData = { + title: `Opposed Roll Result`, + prevAtkResult, + prevDefResult, + prevAtkResultJson: JSON.stringify(prevAtkResult), + prevDefResultJson: JSON.stringify(prevDefResult), + atkItem, + defItem, + atkItemUuid, + defItemUuid, + atkWins, + defWins, + vsText: victoryStarsText.text, + vsisTied: victoryStarsText.isTied, + atkVictory: victoryStarsText.isTester, + defVictory: victoryStarsText.isOpponent, + }; + + const html = await renderTemplate(chatTemplate, chatTemplateData); + + const messageData = { + user: game.user.id, + speaker: this.speaker, + content: html.trim(), + style: CONST.CHAT_MESSAGE_STYLES.DICE, + }; + + const messageOptions = {}; + + // Create a chat message + await ChatMessage.create(messageData, messageOptions); + + return chatTemplateData; + } + + prepareBaseData() { + super.prepareBaseData(); + this.$health = new ValueModifier(this, { + max: 0, + value: (thisVM) => thisVM.effective, + pct: (thisVM) => + Math.round( + (thisVM.effective / (thisVM.max || Number.EPSILON)) * 100, + ), + }); + this.$zoneSum = 0; + this.$isSetup = true; + this.$shockState = SOHL.CONST.SHOCK.None; + this.$engagedOpponents = new ValueModifier(this); + this.$engagedOpponents.setBase(0); + this.$domains = Object.fromEntries( + Object.keys(DomainItemData.categories).map((c) => [ + c, + new Collection(), + ]), + ); + } +} + +// export class CharacterActorData extends LivingActorData { +// static get typeName() { +// return "character"; +// } + +// static get typeLabel() { +// return { +// singular: "Character", +// plural: "Characters", +// }; +// } + +// static getDefaultArtwork(data) { +// return { +// img: "systems/sohl/images/silhouette/character-headshot.webp", +// texture: { +// src: "systems/sohl/images/silhouette/character-token.svg", +// }, +// }; +// } + +// export class CreatureActorData extends LivingActorData { +// static get typeName() { +// return "creature"; +// } + +// static get typeLabel() { +// return { +// singular: "Creature", +// plural: "Creatures", +// }; +// } + +// static getDefaultArtwork(data) { +// return { +// img: "systems/sohl/assets/icons/claw.svg", +// texture: { +// src: "systems/sohl/images/silhouette/creature-token.svg", +// }, +// }; +// } + +// static get defaultBiography() { +// return `

Data

\n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +// \n +//
Habitat 
Height 
Weight
Diet 
Lifespan 
Group 
\n +//

Special Abilities

\n +//

Describe any special attributes.

\n +//

Attacks

\n +//

Describe methods of attack.

\n +//

Behavior

\n +//

Describe behavioral aspects.

`; +// } +// } + +export class InanimateObjectActorData extends SohlActorData { + static get typeName() { + return "object"; + } + + static get typeLabel() { + return { + singular: "Inanimate Object", + plural: "Inanimate Objects", + }; + } + + /** + * Defines the schema for a specific object by merging the schema defined by the superclass with additional properties. The resulting schema includes a capacityBase field that contains a number field with integer set to true and initial value set to 0. The merging operation is performed non-destructively by setting inplace to false. + * + * @static + * @returns {*} + */ + static defineSchema() { + return foundry.utils.mergeObject( + super.defineSchema(), + { + maxCapacity: new fields.NumberField({ + integer: true, + initial: 0, + }), + }, + { inplace: false }, + ); + } + + prepareBaseData() { + super.prepareBaseData(); + this.$isSetup = true; + } +} + +function SubtypeMixin(Base) { + return class SubtypeExtension extends Base { + static get subTypes() { + return new Error(`Subclasses must define subtypes`); + } + + static defineSchema() { + return foundry.utils.mergeObject( + super.defineSchema(), + { + subType: new fields.StringField({ + initial: Object.keys(this.subTypes)[0], + blank: false, + label: "Sub-type", + choices: this.subTypes, + }), + }, + { inplace: false }, + ); + } + }; +} + +export class StrikeModeItemData extends SohlItemData { + $traits; + $assocSkill; + $impact; + $attack; + $defense; + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "mod:system.$impact": { label: "Impact", abbrev: "Imp" }, + "mod:system.$attack": { label: "Attack", abbrev: "Atk" }, + "system.$defense.block": { label: "Block", abbrev: "Blk" }, + "system.$defense.counterstrike": { + label: "Counterstrike", + abbrev: "CXMod", + }, + "system.$traits.noAttack": { + label: "No Attack", + abbrev: "NoAtk", + }, + "system.$traits.noBlock": { + label: "No Blocking", + abbrev: "NoBlk", + }, + }); + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + mode: new fields.StringField({ + initial: "", + label: "Mode", + hint: "Name of the attack mode", + }), + minParts: new fields.NumberField({ + integer: true, + initial: 1, + min: 0, + label: "Min Parts", + hint: "Minimum number of body parts needed for this strike mode", + }), + assocSkillName: new fields.StringField({ + initial: "", + label: "Assoc Skill", + hint: "Skill that is used to perform this strike mode", + }), + impactBase: new fields.SchemaField({ + numDice: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "# of Dice", + }), + die: new fields.NumberField({ + integer: true, + initial: 6, + min: 1, + label: "Die", + }), + modifier: new fields.NumberField({ + integer: true, + initial: 0, + label: "Modifier", + }), + aspect: new fields.StringField({ + initial: "blunt", + blank: false, + label: "Aspect", + }), + }), + }); + } + + get intrinsicActions() { + let actions = super.intrinsicActions.map((a) => { + if (a.contextGroup === SohlContextMenu.sortGroups.Default) { + a.contextGroup = SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push( + { + functionName: "assistedAttackTest", + name: "Attack Test", + contextIconClass: "fas fa-dagger", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$attack.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Default, + }, + { + functionName: "calcImpact", + name: "Impact Roll", + contextIconClass: "fas fa-bullseye-arrow", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$impact.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.General, + }, + ); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + assistedAttackTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-attack-test`, + title = `${this.item.label} Attack Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + const chatResult = this.$attack.test({ + skipDialog, + noChat, + type, + title, + }); + + return chatResult; + } + + calcImpact( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-impact-roll`, + title = `${this.item.label} Impact Roll`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Implement Impact Calculation + ui.notifications.warn("Impact Calculation Not Implemented"); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$attack = new CombatModifier(this); + this.$defense = { + block: new CombatModifier(this), + counterstrike: new CombatModifier(this), + }; + this.$dodge = new CombatModifier(this); + this.$impact = new ImpactModifier(this, { + numDice: this.impactBase.numDice, + aspect: this.impactBase.aspect, + die: this.impactBase.die, + }); + this.$impact.setBase(this.impactBase.modifier); + this.$traits = { + noAttack: false, + noBlock: false, + }; + } + + postProcess() { + super.postProcess(); + this.$assocSkill = this.actor.getItem(this.assocSkillName, { + types: [SkillItemData.typeName], + }); + if (this.$assocSkill) { + this.$attack.addVM(this.$assocSkill.system.$masteryLevel, { + includeBase: true, + }); + this.$attack.fate.addVM( + this.$assocSkill.system.$masteryLevel.fate, + { + includeBase: true, + }, + ); + } else { + this.$attack.disabled = true; + } + this.$dodgeSkill = this.actor.getItem("Dodge", { + types: [SkillItemData.typeName], + }); + if (this.$dodgeSkill) { + this.$dodge.addVM(this.$dodgeSkill.system.$masteryLevel, { + includeBase: true, + }); + this.$dodge.fate.addVM(this.$assocSkill.system.$masteryLevel.fate, { + includeBase: true, + }); + } else { + this.$dodge.disabled = true; + } + } +} + +export class MeleeWeaponStrikeModeItemData extends StrikeModeItemData { + $length; + + static get typeName() { + return "meleestrikemode"; + } + + static get typeLabel() { + return { + singular: "Melee Strike Mode", + plural: "Melee Strike Modes", + }; + } + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "mod:system.$length": { label: "Length", abbrev: "Len" }, + "mod:system.$defense.block": { label: "Block", abbrev: "Blk" }, + "mod:system.$defense.counterstrike": { + label: "Counterstrike", + abbrev: "CX", + }, + }); + } + + get intrinsicActions() { + let actions = super.intrinsicActions; + + actions.push( + { + functionName: "assistedBlockTest", + name: "Block Test", + contextIconClass: "fas fa-shield", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$defense.block.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "assistedCounterstrikeTest", + name: "Counterstrike Test", + contextIconClass: "fas fa-swords", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$defense.counterstrike.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + ); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + assistedBlockTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-block-test`, + title = `${this.item.label} Block Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + const chatResult = this.$defense.block.test({ + skipDialog, + noChat, + type, + title, + }); + + return chatResult; + } + + assistedCounterstrikeTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-counterstrike-test`, + title = `${this.item.label} Counterstrike Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + skipDialog ??= false; + noChat ??= false; + type = `${this.type}-${this.name}-counterstrike-test`; + title = `${this.item.label} Counterstrike Test`; + + const chatResult = this.$defense.counterstrike.test({ + skipDialog, + noChat, + type, + title, + }); + + return chatResult; + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$length = new ValueModifier(this); + } + + processSiblings() { + super.processSiblings(); + // Length is only set if this Strike Mode is nested in a WeaponGear + if (this.item.nestedIn instanceof WeaponGearItemData) { + this.$length = this.item.nestedIn.system.lengthBase; + } + this.$assocSkill = this.actor.getItem(this.assocSkillName, { + types: [SkillItemData.typeName], + }); + if (this.$assocSkill) { + this.$defense.block.addVM(this.$assocSkill.system.$masteryLevel, { + includeBase: true, + }); + this.$defense.block.fate.addVM( + this.$assocSkill.system.$masteryLevel.fate, + { includeBase: true }, + ); + this.$defense.counterstrike.addVM( + this.$assocSkill.system.$masteryLevel, + { includeBase: true }, + ); + this.$defense.counterstrike.fate.addVM( + this.$assocSkill.system.$masteryLevel.fate, + { includeBase: true }, + ); + } else { + this.$attack.disabled = true; + this.$attack.fate.disabled = true; + this.$defense.block.disabled = true; + this.$defense.block.fate.disabled = true; + this.$defense.counterstrike.disabled = true; + this.$defense.counterstrike.fate.disabled = true; + } + + // If outnumbered, then add the outnumbered penalty to the defend "bonus" (in this case a penalty) + if (this.outnumberedPenalty) { + this.$defense.block.add( + "Outnumbered", + "OutN", + this.outnumberedPenalty, + ); + this.$defense.counterstrike.add( + "Outnumbered", + "OutN", + this.outnumberedPenalty, + ); + } + } +} + +export class MissileWeaponStrikeModeItemData extends StrikeModeItemData { + static get typeName() { + return "missilestrikemode"; + } + + static get typeLabel() { + return { + singular: "Missile Strike Mode", + plural: "Missile Strike Modes", + }; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + projectileType: new fields.StringField({ + initial: "none", + blank: false, + label: "Projectile Type", + choices: ProjectileGearItemData.subTypes, + hint: "Projectile type used by this strike mode", + }), + }); + } + + prepareBaseData() { + super.prepareBaseData(); + this.$defense.block.disabled = true; + this.$defense.counterstrike.disabled = true; + } +} + +export class CombatTechniqueStrikeModeItemData extends StrikeModeItemData { + $length; + + static get typeName() { + return "combattechniquestrikemode"; + } + + static get typeLabel() { + return { + singular: "Combat Technique", + plural: "Combat Techniques", + }; + } + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "mod:system.defense.block": { label: "Block", abbrev: "Blk" }, + "mod:system.defense.counterstrike": { + label: "Counterstrike", + abbrev: "CX", + }, + }); + } + + get intrinsicActions() { + let actions = super.intrinsicActions + .filter((a) => a.name !== "attack") + .map((a) => { + if (a.contextGroup === SohlContextMenu.sortGroups.Default) { + a.contextGroup = SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push( + { + functionName: "assistedBlockTest", + name: "Block Test", + contextIconClass: "fas fa-shield", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$defense.block.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "assistedCounterstrikeTest", + name: "Counterstrike Test", + contextIconClass: "fas fa-swords", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$defense.counterstrike.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + ); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + assistedBlockTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-block-test`, + title = `${this.item.label} Block Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + const chatResult = this.$defense.block.test({ + skipDialog, + noChat, + type, + title, + }); + + return chatResult; + } + + assistedCounterstrikeTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-counterstrike-test`, + title = `${this.item.label} Counterstrike Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + skipDialog ??= false; + noChat ??= false; + type = `${this.type}-${this.name}-attack-test`; + title = `${this.item.label} Attack Test`; + + const chatResult = this.$defense.counterstrike.test({ + skipDialog, + noChat, + type, + title, + }); + + return chatResult; + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$length = new ValueModifier(this); + this.$length.setBase(this.lengthBase); + } + + processSiblings() { + super.processSiblings(); + this.$assocSkill = this.actor.getItem(this.assocSkillName, { + types: [SkillItemData.typeName], + }); + if (this.$assocSkill) { + this.$attack.addVM(this.$assocSkill.system.$masteryLevel, { + includeBase: true, + }); + this.$defense.block.addVM(this.$assocSkill.system.$masteryLevel, { + includeBase: true, + }); + this.$defense.counterstrike.addVM( + this.$assocSkill.system.$masteryLevel, + { includeBase: true }, + ); + } else { + this.$attack.disabled = true; + this.$defense.block.disabled = true; + this.$defense.counterstrike.disabled = true; + } + + // If outnumbered, then add the outnumbered penalty to the defend "bonus" (in this case a penalty) + if (this.outnumberedPenalty) { + this.$defense.block.add( + "Outnumbered", + "OutN", + this.outnumberedPenalty, + ); + this.$defense.counterstrike.add( + "Outnumbered", + "OutN", + this.outnumberedPenalty, + ); + } + } +} + +export class CombatManeuverItemData extends SohlItemData { + static get typeName() { + return "combatmaneuver"; + } + + static get typeLabel() { + return { + singular: "Combat Maneuver", + plural: "Combat Maneuvers", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/sparkle.svg"; + } +} +export class MasteryLevelItemData extends SohlItemData { + $boosts; + $skillBase; + $masteryLevel; + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "system.$boosts": { label: "Mastery Boost", abbrev: "MBoost" }, + "mod:system.$masteryLevel": { + label: "Mastery Level", + abbrev: "ML", + }, + "mod:system.$masteryLevel.fate": { + label: "Fate", + abbrev: "Fate", + }, + "system.$masteryLevel.successLevelMod": { + label: "Success Level", + abbrev: "SL", + }, + }); + } + + get boosts() { + return this.$boosts; + } + + get availableFate() { + if (this.$masteryLevel.disabled) return null; + return ( + IterWrap.create(this.actor?.allItems()).reduce((ary, it) => { + if ( + it.system instanceof MysteryItemData && + it.system.subType === "fate" + ) { + const fateSkills = this.item.getFlag("sohl", "fateSkills"); + if ( + !fateSkills?.length || + fateSkills.includes(this.item.name) + ) { + if (it.system.$level.effective > 0) ary.push(it); + } + } + return ary; + }, []) || [] + ); + } + + get fateBonusItems() { + return ( + IterWrap.create(this.actor?.allItems()).reduce((ary, it) => { + if ( + it.system instanceof MysteryItemData && + it.system.subType === "fateBonus" + ) { + const skills = it.getFlag("sohl", "fateSkills"); + if (!skills || skills.includes(this.item.name)) { + if ( + !it.system.$charges.disabled || + it.system.$charges.effective > 0 + ) { + ary.push(it); + } + } + } + }, []) || [] + ); + } + + get canImprove() { + return ( + !this.item.isVirtual && + (game.user.isGM || this.item.isOwner) && + !this.$masteryLevel.disabled + ); + } + + get valid() { + return this.skillBase.valid; + } + + get skillBase() { + return this.$skillBase; + } + + get sdrIncr() { + return 1; + } + + get intrinsicActions() { + let actions = super.intrinsicActions.map((a) => { + if (a.contextGroup === SohlContextMenu.sortGroups.Default) { + a.contextGroup = SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions = actions.concat([ + { + functionName: "successTest", + name: "Success Test", + contextIconClass: "far fa-dice-d20", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$masteryLevel.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Default, + }, + { + functionName: "successValueTest", + name: "Success Value Test", + contextIconClass: "far fa-list", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$masteryLevel.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "opposedTestStart", + name: "Opposed Test", + contextIconClass: + "fas fa-arrow-down-left-and-arrow-up-right-to-center", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + if (!item) return false; + const token = item.actor?.getToken(); + return token && !item.system.$masteryLevel.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "fateTest", + name: "Fate Test", + contextIconClass: "fas fa-stars", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return ( + item && + !item.system.$masteryLevel.fate.disabled && + item.system.availableFate.length > 0 + ); + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "setImproveFlag", + name: "Set Skill Dev Flag", + contextIconClass: "fas fa-star", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return ( + item && + item.system.canImprove && + !item.system.improveFlag + ); + }, + contextGroup: SohlContextMenu.sortGroups.General, + }, + { + functionName: "unsetImproveFlag", + name: "Unset Skill Dev Flag", + contextIconClass: "far fa-star", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return ( + item && + item.system.canImprove && + item.system.improveFlag + ); + }, + contextGroup: SohlContextMenu.sortGroups.General, + }, + { + functionName: "improveWithXP", + name: "Improve Mastery using XP", + contextIconClass: "fas fa-lightbulb-on", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + if (!item || !item.system.canImprove) return false; + if (item.system.$masteryLevel.disabled) return false; + const xpItem = item.actor?.getTraitByAbbrev("xp"); + const xpVal = + (xpItem && + !xpItem?.system.$score?.disabled && + xpItem?.system.$score.effective) || + -1; + return xpItem && xpVal >= item.system.$masteryLevel.index; + }, + contextGroup: SohlContextMenu.sortGroups.General, + }, + { + functionName: "improveWithSDR", + name: "Improve Mastery using SDR", + contextIconClass: "fas fa-star", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item?.system.canImprove && item.system.improveFlag; + }, + contextGroup: SohlContextMenu.sortGroups.General, + }, + ]); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + abbrev: new fields.StringField({ + initial: "", + label: "Abbreviation", + }), + skillBaseFormula: new fields.StringField({ + initial: "", + nullable: false, + label: "Skill Base Formula", + }), + masteryLevelBase: new fields.NumberField({ + initial: 0, + min: 0, + label: "Mastery Level", + }), + improveFlag: new fields.BooleanField({ + initial: false, + label: "Flag for Mastery Improvement", + }), + }); + } + + setImproveFlag() { + if (!this.improveFlag) this.item.update({ "system.improveFlag": true }); + } + + async unsetImproveFlag() { + if (this.improveFlag) + await this.item.update({ "system.improveFlag": false }); + } + + toggleImproveFlag() { + if (this.improveFlag) this.unsetImproveFlag(); + else this.setImproveFlag(); + } + + /** + * Updates the boosts value by adding the given value if the input is a number. + * + * @param {*} val + */ + applyBoosts(val) { + if (typeof val === "number") { + this.$boosts += val; + } + } + + /** + * Applies penalties to the current context + */ + applyPenalties() { + // Subclasses can define behaviors + } + + /** + * Calculates the mastery boost based on the given mastery level. Returns different boost values based on different ranges of mastery levels. + * + * @static + * @param {*} ml + * @returns {(3 | 4 | 10 | 9 | 8 | 7 | 6 | 5)} + */ + static calcMasteryBoost(ml) { + if (ml <= 39) return 10; + else if (ml <= 44) return 9; + else if (ml <= 49) return 8; + else if (ml <= 59) return 7; + else if (ml <= 69) return 6; + else if (ml <= 79) return 5; + else if (ml <= 99) return 4; + else return 3; + } + + /** + * Perform Success Test for this Item + * + * @param {object} options + * @returns {SuccessTestChatData} + */ + async successTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-test`, + title = `${this.item.label} Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + const chatResult = await this.$masteryLevel.test({ + skipDialog, + noChat, + type, + title, + }); + + return chatResult; + } + + /** + * Perform Success Value Test for this Item. + * + * @param {object} options + * @returns {SuccessTestChatData} + */ + successValueTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-svtest`, + title = `${this.item.label} Success Value Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + return this.$masteryLevel + .test({ + skipDialog, + noChat: true, + type, + title, + }) + .then((chatResult) => { + chatResult.isSuccessValue = true; + if (!noChat) { + const ml = MasteryLevelModifier.fromJSON( + chatResult.mlModJson, + this, + ); + ml.successTestToChat(chatResult); + } + return chatResult; + }); + } + + /** + * Perform an opposed test + * @param {object} options + * @returns {SuccessTestChatData} + */ + opposedTestStart( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-opposedtest`, + title = `${this.item.label} Opposed Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsToken: true, + self: this, + })); + + let target = Utility.getSingleSelectedToken({ quiet: true }); + if (!canvas.scene) { + ui.notification.warn(`No active scene`); + } else if (!canvas.scene.tokens.size) { + ui.notifications.warn(`No tokens on the active scene`); + } + + let dlgHtml = `
+

Select target to perform Opposed Test against:

+
+
+ + +
+
+ + +
`; + return Dialog.prompt({ + title: "Choose Opposed Test Target", + content: dlgHtml, + label: "OK", + callback: async (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formdata = foundry.utils.expandObject(fd.object); + target = canvas.scene.tokens.get(formdata.tokenId); + const formModifier = + Number.parseInt(formdata.modifier, 10) || 0; + let successLevelMod = + Number.parseInt(formdata.successLevelMod, 10) || 0; + + if (this.actor.system.shock === SOHL.CONST.SHOCK.Stunned) + successLevelMod--; + + const chatTemplate = + "systems/sohl/templates/chat/opposed-request-card.html"; + + const chatData = { + sourceToken: token, + targetToken: target, + testItem: this.item, + modifier: formModifier, + successLevelMod, + }; + + const chatHtml = await renderTemplate(chatTemplate, chatData); + + const messageData = { + user: game.user.id, + speaker: this.actor?.getSpeaker || ChatMessage.getSpeaker(), + content: chatHtml.trim(), + sound: CONFIG.sounds.dice, + }; + + ChatMessage.applyRollMode(messageData, "roll"); + + // Create a chat message + return ChatMessage.create(messageData); + }, + options: { jQuery: false }, + rejectClose: false, + }); + } + + async fateTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-fatetest`, + title = `${this.item.label} Fate Test`, + nextTargetUuid, + nextAction, + testPropName: testResultPropName, + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // Ensure that there is fate available to be used + const fateList = this.availableFate; + let fateItem; + if (fateList?.length) { + if (fateList.length === 1) { + fateItem = fateList[0]; + } else { + let dlgHtml = `
+

Select which fate to use:

+
`; + fateItem = await Dialog.prompt({ + title: "Choose Fate", + content: dlgHtml, + label: "OK", + callback: async (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formdata = foundry.utils.expandObject(fd.object); + const formIndex = + Number.parseInt(formdata.fateIndex, 10) || 0; + return fateList.at(formIndex); + }, + options: { jQuery: false }, + rejectClose: false, + }); + if (!fateItem) return null; + } + } else { + ui.notifications.warn(`No fate available to use`); + return null; + } + const fateChatData = await this.$masteryLevel.fate.test({ + skipDialog, + noChat: true, + }); + + // If user cancelled the roll, then return immediately + if (!fateChatData) return null; + + if (fateChatData.isSuccess) { + // If we got a critical success, then ask the player how to proceed + if (fateChatData.isCritical) { + const fateChoice = await Dialog.wait({ + title, + content: `

Choose how to proceed: +

    +
  1. Free Fate: Get +1 success level bonus, but the character doesn't have to expend any fate points.
  2. +
  3. Double Fate: Get +2 success level bonus, but the character must expend one fate point.
  4. +

`, + buttons: { + freeFate: { + icon: '', + label: "Free", + callback: () => "+1 Bonus, no cost", + }, + doubleFate: { + icon: '', + label: "Double", + callback: () => "+2 Bonus, 1 Fate", + }, + }, + close: () => "freeFate", + default: "freeFate", + options: { jQuery: false }, + }); + + if (fateChoice === "doubleFate") { + fateChatData.fateBonus = 2; + fateChatData.fateCost = 1; + } else { + fateChatData.fateBonus = 1; + fateChatData.fateCost = 0; + } + } else { + fateChatData.fateBonus = 1; + fateChatData.fateCost = 1; + } + } else { + fateChatData.fateBonus = 0; + fateChatData.fateCost = fateChatData.isCritical ? 1 : 0; + } + + // Reduce the fate level by the fate cost if any + if (fateChatData.fateCost) { + const newFate = Math.max( + 0, + fateItem.system.levelBase - fateChatData.fateCost, + ); + if (newFate !== fateItem.system.levelBase) { + fateItem.update({ "system.levelBase": newFate }); + } + } + + // Reduce the number of charges for each fate bonus (if any) + this.fateBonusItems.forEach((it) => { + if (!it.system.$charges.disabled) { + const newCharges = Math.max(0, it.system.charges.value - 1); + if (newCharges !== it.system.charges.value) { + it.update({ "system.charges.value": newCharges }); + } + } + }); + + if (!noChat) { + await this.$masteryLevel.fate.successTestToChat(fateChatData); + } + + if (testResultPropName && Object.hasOwn(scope, testResultPropName)) { + const mlMod = MasteryLevelModifier.create( + scope[testResultPropName].mlModJson, + ); + mlMod.successLevelMod += fateChatData.fateBonus; + scope[testResultPropName].mlModJson = JSON.stringify( + mlMod.toJSON(), + ); + scope[testResultPropName].askFate = false; + const doc = await fromUuid(nextTargetUuid); + doc?.system.execute(nextAction, ...scope); + } + return fateChatData; + } + + async improveWithSDR(speaker) { + const updateData = { "system.improveFlag": false }; + let roll = await Roll.create("1d100 + @sb", { + sb: this.skillBase.value, + }); + const isSuccess = roll.total > this.$masteryLevel.base; + + if (isSuccess) { + updateData["system.masteryLevelBase"] = + this.masteryLevelBase + this.sdrIncr; + } + let prefix = `${this.constructor.subTypes[this.subType]} ${ + this.constructor.typeLabel.singular + }`; + const chatTemplate = + "systems/sohl/templates/chat/standard-test-card.html"; + const chatTemplateData = { + type: `${this.type}-${this.name}-improve-sdr`, + title: `${this.item.label} Development Roll`, + effTarget: this.$masteryLevel.base, + isSuccess: isSuccess, + rollValue: roll.total, + rollResult: roll.result, + showResult: true, + resultText: `${isSuccess ? "" : "No "}${prefix} Increase`, + resultDesc: isSuccess + ? `${this.item.label} increased by ${this.sdrIncr} to ${ + this.$masteryLevel.base + this.sdrIncr + }` + : "", + description: isSuccess ? "Success" : "Failure", + notes: "", + sdrIncr: this.sdrIncr, + }; + + const html = await renderTemplate(chatTemplate, chatTemplateData); + + const messageData = { + user: game.user.id, + speaker, + content: html.trim(), + sound: CONFIG.sounds.dice, + }; + + ChatMessage.applyRollMode(messageData, "roll"); + + // Create a chat message + await ChatMessage.create(messageData); + } + + async improveWithXP(speaker) { + const xpItem = this.actor.getTraitByAbbrev("xp"); + if (xpItem?.system.$score.disabled) { + ui.notifications.warn( + "Exprience Points disabled or don't exist, cannot improve with XP", + ); + return null; + } + const xpVal = xpItem.system.$score.effective || 0; + const newXPVal = xpVal - Math.max(this.$masteryLevel.index, 1); + if (newXPVal >= 0) { + await this.item.update({ + "system.masteryLevelBase": this.masteryLevelBase + 1, + }); + await xpItem.update({ + "system.textValue": String(newXPVal), + }); + const chatTemplate = "systems/sohl/templates/chat/xp-card.html"; + const chatTemplateData = { + type: `${this.type}-${this.name}-improve-xp`, + title: `${this.item.label} Experience Point Increase`, + xpCost: xpVal - newXPVal, + skillIncrease: 1, + }; + + const html = await renderTemplate(chatTemplate, chatTemplateData); + + const messageData = { + user: game.user.id, + speaker, + content: html.trim(), + sound: CONFIG.sounds.dice, + }; + + ChatMessage.applyRollMode(messageData, "roll"); + + // Create a chat message + await ChatMessage.create(messageData); + } + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$boosts = 0; + this.$masteryLevel = new MasteryLevelModifier(this, { + fate: new MasteryLevelModifier(this), + }); + this.$masteryLevel.setBase(this.masteryLevelBase); + } + + processSiblings() { + super.processSiblings(); + + this.$skillBase ||= new SkillBase(this.skillBaseFormula, { + items: Array.from(this.actor.allItems()), + }); + + if (this.abbrev === "fate") { + // Fate trait itself doesn't have fate, obviously! + this.$masteryLevel.fate.disabled = true; + } else if (this.skillBase.attributes.includes("Aura")) { + this.$masteryLevel.fate.set("Aura-Based, No Fate", "AurBsd", 0); + this.$masteryLevel.fate.disabled = true; + } else { + const fate = this.actor.getTraitByAbbrev("fate"); + if (fate) { + this.$masteryLevel.fate.addVM(fate.system.$masteryLevel, { + includeBase: true, + }); + } else { + this.$masteryLevel.fate.setBase(50); + } + + this.fateBonusItems.forEach((it) => { + this.$masteryLevel.fate.add( + it.label, + "FateBns", + it.system.$level.effective, + ); + }); + } + + if (this.$masteryLevel.base > 0) { + let newML = this.$masteryLevel.base; + + for (let i = 0; i < this.boosts; i++) { + newML += this.constructor.calcMasteryBoost(newML); + } + + this.$masteryLevel.setBase(newML); + } + + // Ensure base ML is not greater than MaxML + if (this.$masteryLevel.base > this.$masteryLevel.max) { + this.$masteryLevel.setBase(this.$masteryLevel.max); + } + + this.$masteryLevel.fate.disabled ||= this.$masteryLevel.disabled; + + // Apply Fate + if ( + !this.$masteryLevel.fate.base && + !this.$masteryLevel.fate.disabled + ) { + this.$masteryLevel.fate.addVM(this.actor.system.$fate, { + includeBase: true, + }); + this.$masteryLevel.fate.disabled = this.actor.system.$fate.disabled; + } + } + + /** @override */ + postProcess() { + super.postProcess(); + this.applyPenalties(); + } +} + +export class MysteryItemData extends SubtypeMixin(SohlItemData) { + $level; + $charges; + $domainLabel; + $paramLabel; + + static get typeName() { + return "mystery"; + } + + static get typeLabel() { + return { + singular: "Mystery", + plural: "Mysteries", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/sparkles.svg"; + } + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "system.$charges": { label: "Charges", abbrev: "Cgs" }, + "system.$charges.max": { + label: "Max Charges", + abbrev: "MaxCgs", + }, + }); + } + + static get subTypes() { + return { + grace: "Grace", + piety: "Piety", + fate: "Fate", + fateBonus: "Fate Bonus", + fatePointIncreaseBonus: "Fate Point Increase Bonus", + blessing: "Blessing", + ancestor: "Ancestor Insight", + totem: "Totem Attunement", + }; + } + + static get fieldName() { + return { + grace: "Domain", + piety: "Domain", + fate: "Skills", + fateBonus: "Skills", + fatePointIncreaseBonus: "", + blessing: "Skills", + ancestor: "Skills", + totem: "Creature", + }; + } + + get fieldData() { + if (this.constructor.fieldName[this.subType] === "Skills") { + if (this.skills.size) { + return Array.from(this.skills.values()) + .sort((a, b) => a.localeCompare(b)) + .join(", "); + } else { + return "All Skills"; + } + } else { + if (!this.item.actor) return this.domain; + let field; + if (["grace", "piety"].includes(this.subType)) { + field = this.item.actor.system.$domains.divine.get( + this.domain, + )?.name; + } else if (this.subType === "totem") { + field = this.item.actor.system.$domains.spirit.get( + this.domain, + )?.name; + } + return field || `Unknown (${this.domain})`; + } + } + + static defineSchema() { + return foundry.utils.mergeObject( + super.defineSchema(), + { + domain: new fields.StringField({ + initial: "", + label: "Domain", + }), + skills: new fields.SetField( + new fields.StringField({ + required: "true", + blank: false, + label: "Skill", + }), + { label: "Skills" }, + ), + levelBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Level", + }), + charges: new fields.SchemaField({ + usesCharges: new fields.BooleanField({ + initial: false, + label: "Uses Charges", + }), + value: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Charges", + hint: "Current number of charges available", + }), + // Note: if max charges is 0, then there is no maximum + max: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Max Charges", + hint: "Maximum number of charges possible", + }), + }), + }, + { inplace: false }, + ); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$label = ""; + this.$charges = new ValueModifier(this, { + max: new ValueModifier(this), + }); + if (!this.charges.usesCharges) { + this.$charges.disabled = true; + this.$charges.max.disabled = true; + } else { + this.$charges.setBase(this.charges.value); + this.$charges.max.setBase(this.charges.max); + } + this.$level = new ValueModifier(this, { + roman: (thisVM) => Utility.romanize(thisVM.effective), + }); + this.$level.setBase(this.levelBase); + } +} + +export class MysticalAbilityItemData extends SubtypeMixin( + MasteryLevelItemData, +) { + $charges; + $maxCharges; + $affectedSkill; + $fatigue; + $level; + + static get typeName() { + return "mysticalability"; + } + + static get typeLabel() { + return { + singular: "Mystical Ability", + plural: "Mystical Abilities", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/hand-sparkles.svg"; + } + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "system.$charges": { label: "Charges", abbrev: "Cgs" }, + "system.$charges.max": { + label: "Max Charges", + abbrev: "MaxCgs", + }, + }); + } + + static get subTypes() { + return { + energy: "Energy Spirit Power", + ceremony: "Ritual Ceremony", + festival: "Ritual Festival", + ordeal: "Ritual Ordeal", + devotion: "Ritual Devotion", + alchemy: "Alchemy", + divination: "Divination", + arcaneincantation: "Arcane Incantation", + arcaneinvocation: "Arcane Invocation", + divineincantation: "Divine Incantation", + arcanetalent: "Arcane Talent", + }; + } + + static get actionLabel() { + return { + energy: "Manipulate Element", + ceremony: "Perform Benediction", + festival: "Perform Benediction", + ordeal: "Complete Ordeal", + devotion: "Perform Ritual Devotion", + divination: "Perform Divination", + arcaneincantation: "Cast Spell", + arcaneinvocation: "Invoke Arcane Effect", + divineincantation: "Beseech Divine Aid", + arcanetalent: "Perform Arcane Talent", + }; + } + + static get improvableSubTypes() { + return ["arcaneincantation", "arcanetalent"]; + } + + static get domainLabel() { + return { + energy: "Element", + ceremony: "Ritual", + festival: "Ritual", + ordeal: "Domain", + devotion: "Ritual", + foretelling: "Skill", + arcaneincanting: "Domain", + arcaneinvocation: "Domain", + divineincanting: "Ritual", + arcanetalent: "Domain", + }; + } + + static get energySpiritPowerTypes() { + return { + air: "Air", + earth: "Earth", + water: "Water", + fire: "Fire", + }; + } + + static get domainDegree() { + return { + primary: { name: "Primary", value: 0 }, + secondary: { name: "Secondary", value: 1 }, + neutral: { name: "Neutral", value: 2 }, + tertiary: { name: "Tertiary", value: 3 }, + diametric: { name: "Diametric", value: 4 }, + }; + } + + get availableFate() { + // All of the Mystical Abilities are essentially aura based, so none of them + // may be Fated. + return false; + } + + /** + * Returns whether this item can be improved by using a mystical ability. + * Returns true if the subType of the item is one of the following: ArcaneInvocation, DivineInvocation, or ArcaneTalent. + * Returns false otherwise. + * + * @readonly + * @type {*} + */ + get canImprove() { + const result = + super.canImprove && + this.constructor.improvableSubTypes.includes(this.subType); + return result; + } + + /** + * Defines the schema for a specific entity. This function merges the base schema with additional fields including domain, level, and charges. Each field has its own specifications such as type, initial value, min value, and additional properties for charges. The function returns the merged schema object with the added fields. + * + * @static + * @returns {*} + */ + static defineSchema() { + return foundry.utils.mergeObject( + super.defineSchema(), + { + domain: new fields.StringField({ + initial: "", + label: "Domain", + }), + levelBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Level", + }), + charges: new fields.SchemaField({ + usesCharges: new fields.BooleanField({ + initial: false, + label: "Uses Charges", + }), + value: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Charges", + hint: "Current number of charges available", + }), + // Note: if max charges is 0, then there is no maximum + max: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Max Charges", + hint: "Maximum number of charges possible", + }), + }), + }, + { inplace: false }, + ); + } + + get intrinsicActions() { + let actions = super.intrinsicActions.map((a) => { + if (a.contextGroup === SohlContextMenu.sortGroups.Default) { + a.contextGroup = SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push({ + functionName: "perform", + name: `Perform ${this.constructor.subTypes[this.subType]}`, + contextIconClass: "far fa-bullseye", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.$masteryLevel.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Default, + }); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + perform( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-perform`, + title = `${this.item.label} Perform`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + // TODO - Mystical Ability Perform + ui.notifications.warn("Mystical Ability Perform Not Implemented"); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$charges = new ValueModifier(this, { + max: new ValueModifier(this), + }); + if (!this.charges.usesCharges) { + this.$charges.disabled = true; + this.$charges.max.disabled = true; + } else { + this.$charges.setBase(this.charges.value); + this.$charges.max.setBase(this.charges.max); + } + this.$level = new ValueModifier(this, { + roman: (thisVM) => Utility.romanize(thisVM.effective), + }); + this.$level.setBase(this.levelBase); + this.$fatigue = new ValueModifier(this); + this.$fatigue.setBase(this.fatigueBase); + } + + setupVirtualItems() { + super.setupVirtualItems(); + const domain = this.domain.trim(); + if (this.subType === "ancestor" && domain) { + /* + * Ancestor Spirit Powers are granted as bonuses to a particular skill, whose name + * is in the "domain" field. We expect that such a skill must be currently available + * as a owned item on the Actor. If for some reason that is not the case, then we + * we need to create a virtual skill item for that particular skill. + */ + this.$affectedSkill = IterWrap.create(this.actor.allItems()).find( + (it) => + it.system instanceof SkillItemData && it.name === domain, + ); + + if (!this.$affectedSkill) { + // The skill doesn't exist, so we need to create a stand-in skill for it. This skill + // will be set to ML 0. If there is a skill already in the nested items with the exact same + // name as requested, then we will use that as a template for the skill. + const item = this.items.find( + (it) => + it.system instanceof SkillItemData && + it.name === domain, + ); + let itemData = item?.toObject(); + + if (!itemData) { + // Couldn't find the named skill in the nested items, so + // create a new one from scratch. + itemData = { + name: domain, + type: SkillItemData.typeName, + }; + } + + itemData._id = foundry.utils.randomID(); + + // Ensure that ML is set to 0 + foundry.utils.setProperty( + itemData, + "system.masteryLevelBase", + 0, + ); + + // Create a new pure virtual skill as a stand-in for the missing skill + this.$affectedSkill = new SohlItem(itemData, { + parent: this.actor, + cause: this.item, + }); + } + } + } + + /** @override */ + postProcess() { + super.postProcess(); + if (this.subType === "ancestor") { + if (this.$affectedSkill) { + const ml = this.$affectedSkill.system.$masteryLevel; + let numBoosts = this.$level.effective; + if (!ml.base) { + ml.setBase(this.$affectedSkill.system.skillBase.value); + numBoosts--; + } + if (numBoosts) + this.$affectedSkill.system.applyBoosts(numBoosts); + } + } + } +} + +export class DomainItemData extends SohlItemData { + static get typeName() { + return "domain"; + } + + static get typeLabel() { + return { + singular: "Domain", + plural: "Domains", + }; + } + + static get categories() { + return { + arcane: "Arcane", + divine: "Divine", + spirit: "Spirit", + astral: "Astral", + natural: "Natural", + }; + } + + get categoriesLabel() { + return Array.from(this.categories.values()).sort().join(", "); + } + + static get defaultImage() { + return "systems/sohl/assets/icons/sparkle.svg"; + } + + static defineSchema() { + return foundry.utils.mergeObject( + super.defineSchema(), + { + categories: new fields.SetField( + new fields.StringField({ + required: "true", + blank: false, + label: "Category", + choices: DomainItemData.categories, + }), + { label: "Categories" }, + ), + abbrev: new fields.StringField({ + initial: "", + label: "Abbreviation", + }), + philosophy: new fields.StringField({ + initial: "", + label: "Philosophy", + }), + }, + { inplace: false }, + ); + } + + processSiblings() { + super.processSiblings(); + + // Load up the domain lists + this.categories.forEach((c) => { + this.actor.system.$domains[c] ??= new Collection(); + this.actor.system.$domains[c].set(this.abbrev, this); + }); + } +} + +export class InjuryItemData extends SohlItemData { + $healingRate; + $bleeding; + $injuryLevel; + + static get typeName() { + return "injury"; + } + + static get typeLabel() { + return { + singular: "Injury", + plural: "Injuries", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/injury.svg"; + } + + static get aspectTypes() { + return { + blunt: "Blunt", + edged: "Edged", + piercing: "Piercing", + fire: "Fire", + }; + } + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "system._healingRate": { label: "Healing Rate", abbrev: "HR" }, + "system._injuryLevel": { + label: "Injury Level", + abbrev: "InjLvl", + }, + }); + } + + static get injuryLevels() { + return ["NA", "M1", "S2", "S3", "G4", "G5"]; + } + + static get eventTags() { + return foundry.utils.mergeObject( + super.eventTags, + { + nextHealingCheck: "Next Healing Check", + }, + { inplace: false }, + ); + } + + get created() { + return this.getEvent("created")?.system; + } + + get nextHealingCheck() { + return this.getEvent("nextHealingCheck")?.system; + } + + get untreatedHealing() { + return { + hr: 4, + infect: true, + impair: false, + bleed: false, + newInj: -1, + }; + } + + static defineSchema() { + return foundry.utils.mergeObject( + super.defineSchema(), + { + injuryLevelBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Injury Level", + }), + healingRateBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Healing Rate", + }), + aspect: new fields.StringField({ + initial: "blunt", + blank: false, + label: "Aspect", + choices: InjuryItemData.aspectTypes, + }), + isTreated: new fields.BooleanField({ + initial: false, + label: "Treated", + }), + isBleeding: new fields.BooleanField({ + initial: false, + label: "Bleeding", + }), + bodyLocation: new fields.StringField({ + initial: "", + label: "Body Location", + }), + }, + { inplace: false }, + ); + } + + get intrinsicActions() { + let actions = super.intrinsicActions.map((a) => { + if (a.contextGroup === SohlContextMenu.sortGroups.Default) { + a.contextGroup = SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push( + { + functionName: "bleedingStoppageTest", + name: "Bleeding Stoppage Test", + contextIconClass: "fas fa-droplet-slash", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + if (!item?.system.isBleeding) return false; + const physician = item?.actor?.getSkillByAbbrev("pysn"); + return ( + physician && !physician.system.$masteryLevel.disabled + ); + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "bloodLossAdvanceTest", + name: "Blood Loss Advance Test", + contextIconClass: "fas fa-droplet", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + if (!item || !item.system.isBleeding) return false; + const strength = item?.actor?.getTraitByAbbrev("str"); + return strength && !strength.system.$masteryLevel?.disabled; + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "treatmentTest", + name: "Treatment Test", + contextIconClass: "fas fa-staff-snake", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + if (item?.system.isBleeding) return false; + const physician = item?.actor?.getSkillByAbbrev("pysn"); + return ( + physician && !physician.system.$masteryLevel.disabled + ); + }, + contextGroup: SohlContextMenu.sortGroups.Default, + }, + { + functionName: "healTest", + name: "Heal Test", + contextIconClass: "fas fa-heart-pulse", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + if (item?.system.isBleeding) return false; + const endurance = item?.actor?.getTraitByAbbrev("end"); + return ( + endurance && !endurance.system.$masteryLevel.disabled + ); + }, + contextGroup: SohlContextMenu.sortGroups.Default, + }, + ); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + treatmentTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-treatment-test`, + title = `${this.item.label} Treatment Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsToken: true, + self: this, + })); + + // TODO - Injury Treatment Test + ui.notifications.warn("Injury Treatment Test Not Implemented"); + } + + healTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-heal-test`, + title = `${this.item.label} Heal Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Injury Heal Test + ui.notifications.warn("Injury Heal Test Not Implemented"); + } + + bleedingStoppageTest( + speaker = null, + actor = null, + token = null, + character = null, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-bleed-stop-test`, + title = `${this.item.label} Bleeding Stoppage Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + }, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + })); + + // TODO - Injury Bleeding Stoppage Test + ui.notifications.warn("Injury Bleeding Stoppage Test Not Implemented"); + } + + bloodlossAdvanceTest( + speaker = null, + actor = null, + token = null, + character = null, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-bloodloss-advance-test`, + title = `${this.item.label} Bloodloss Advance Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + }, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + })); + + // TODO - Injury Bloodloss Advance Test + ui.notifications.warn("Injury Bloodloss Advance Test Not Implemented"); + } + + /** @override */ + async _preCreate(data, options, user) { + const allowed = await super._preCreate(data, options, user); + if (!allowed) return false; + + // Create a new event to represent the create time of the injury + const createdItem = await SohlItem.create({ + name: "Created", + type: "event", + system: { + tag: "created", + activation: { + scope: "self", + initTime: game.time.worldTime, + oper: "indefinite", + }, + }, + }); + + const updateData = { + nestedItems: this.nestedItems.concat(createdItem.toObject()), + }; + + if (!Object.hasOwn(options, "healTestDuration")) { + options.healTestDuration = game.settings.get( + "sohl", + "healingSeconds", + ); + } + + if (options.healTestDuration) { + // Create a new event to represent the next heal test + const nextHealTest = await SohlItem.create({ + name: "Next Heal Test", + type: "event", + system: { + tag: "nextHealingCheck", + actionName: "healTest", + activation: { + scope: "item", + initTime: game.time.worldTime, + duration: options.healTestDuration, + oper: "duration", + }, + }, + }); + updateData["nestedItems"].push(nextHealTest); + } + + await this.updateSource(updateData); + return true; + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + + this.$healingRate = new ValueModifier(this); + this.$injuryLevel = new ValueModifier(this, { + // biome-ignore lint/correctness/noUnusedVariables: + severity: (thisVM) => { + return "0"; + }, + }); + + this.$injuryLevel.setBase(this.injuryLevelBase); + this.$healingRate.setBase( + this.isTreated ? this.healingRateBase : this.untreatedHealing.hr, + ); + } + + postProcess() { + super.postProcess(); + if (this.$healingRate.effective <= 0) this.$healingRate.disabled; + } +} + +export class AfflictionItemData extends SubtypeMixin(SohlItemData) { + $healingRate; + $contagionIndex; + $level; + + static AFFLICTON_DEFEATED_HR = 6; + static SUBJECT_DEAD_HR = 0; + static UNDEFINED_HR = -1; + + static get typeName() { + return "affliction"; + } + + static get typeLabel() { + return { + singular: "Affliction", + plural: "Afflictions", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/sick.svg"; + } + + static get subTypes() { + return { + privation: "Privation", + fatigue: "Fatigue", + disease: "Disease", + infection: "Infection", + poisontoxin: "Poison/Toxin", + fear: "Fear", + morale: "Morale", + shadow: "Shadow", + }; + } + + static get subTypeAbbreviation() { + return { + privation: "Prv", + fatigue: "Fatg", + disease: "Disz", + infection: "Inft", + poisontoxin: "PsnTxn", + fear: "Fear", + morale: "Morl", + shadow: "Shdw", + }; + } + static get transmissionTypes() { + return { + none: "Noncommunicable", + airborne: "Airborne", + contact: "Contact", + bodyfluid: "Body Fluid", + injested: "Injested", + proximity: "Proximity", + vector: "Vector", + perception: "Perception", + arcane: "Arcane", + divine: "Divine", + spirit: "Spirit", + }; + } + + static defineSchema() { + return foundry.utils.mergeObject( + super.defineSchema(), + { + isDormant: new fields.BooleanField({ + initial: false, + label: "Dormant", + hint: "Doesn't affect carrier, but may be contagious or reactivate", + }), + isTreated: new fields.BooleanField({ + initial: false, + label: "Treated", + }), + diagnosisBonusBase: new fields.NumberField({ + integer: true, + initial: 0, + label: "Diagnosis Bonus", + hint: "Modifier to treatment test from diagnosis", + }), + levelBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Level", + hint: "Magnitude of Affliction", + }), + healingRateBase: new fields.NumberField({ + integer: true, + initial: this.UNDEFINED_HR, + min: this.UNDEFINED_HR, + label: "Healing Rate", + hint: "Virulence of Affliction", + }), + contagionIndexBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Contagion Index", + }), + transmission: new fields.StringField({ + initial: "none", + blank: false, + label: "Transmission", + choices: this.transmissionTypes, + }), + }, + { inplace: false }, + ); + } + + get intrinsicActions() { + let actions = super.intrinsicActions.map((a) => { + if (a.contextGroup === SohlContextMenu.sortGroups.Default) { + a.contextGroup = SohlContextMenu.sortGroups.Primary; + } + return a; + }); + + actions.push( + { + functionName: "transmit", + name: "Transmit Affliction", + contextIconClass: "fas fa-viruses", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item?.system.canTransmit; + }, + + contextGroup: SohlContextMenu.sortGroups.Default, + }, + { + functionName: "courseTest", + name: "Course Test", + contextIconClass: "fas fa-heart-pulse", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + if (item.system.isDormant) return false; + const endurance = item?.actor?.getTraitByAbbrev("end"); + return ( + endurance && !endurance.system.$masteryLevel.disabled + ); + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "diagnosisTest", + name: "Diagnosis Test", + contextIconClass: "fas fa-stethoscope", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.isTreated; + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "treatmentTest", + name: "Treatment Test", + contextIconClass: "fas fa-staff-snake", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + return item && !item.system.isTreated; + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + { + functionName: "healingTest", + name: "Healing Test", + contextIconClass: "fas fa-heart-pulse", + contextCondition: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const item = fromUuidSync(li.dataset.uuid); + if (item?.system.$healingRate.disabled) return false; + const endurance = item?.actor?.getTraitByAbbrev("end"); + return ( + endurance && !endurance.system.$masteryLevel.disabled + ); + }, + contextGroup: SohlContextMenu.sortGroups.Primary, + }, + ); + + actions.sort((a, b) => a.contextGroup.localeCompare(b.contextGroup)); + return actions; + } + + get canTransmit() { + return true; + } + + get canContract() { + return true; + } + + get hasCourse() { + return true; + } + + get canTreat() { + return true; + } + + get canHeal() { + return true; + } + + transmit( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-transmit`, + title = `${this.item.label} Transmit`, + target = null, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsToken: true, + self: this, + })); + // TODO - Affliction Transmit + ui.notifications.warn("Affliction Transmit Not Implemented"); + } + + contractTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-contract-test`, + title = `${this.item.label} Contract Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Affliction Contract Test + ui.notifications.warn("Affliction Contract Test Not Implemented"); + } + + courseTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-course-test`, + title = `${this.item.label} Course Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Affliction Course Test + ui.notifications.warn("Affliction Course Test Not Implemented"); + } + + diagnosisTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-treatment-test`, + title = `${this.item.label} Treatment Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsToken: true, + self: this, + })); + + // TODO - Affliction Diagnosis Test + ui.notifications.warn("Affliction Diagnosis Test Not Implemented"); + } + + treatmentTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-treatment-test`, + title = `${this.item.label} Treatment Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsToken: true, + self: this, + })); + + // TODO - Affliction Treatment Test + ui.notifications.warn("Affliction Treatment Test Not Implemented"); + } + + healingTest( + speaker, + actor, + token, + character, + { + skipDialog = false, + noChat = false, + type = `${this.type}-${this.name}-healing-test`, + title = `${this.item.label} Healing Test`, + // biome-ignore lint/correctness/noUnusedVariables: + ...scope + } = {}, + ) { + ({ speaker, actor, token, character } = SohlMacro.getExecuteDefaults({ + speaker, + actor, + token, + character, + needsActor: true, + self: this, + })); + + // TODO - Affliction Healing Test + ui.notifications.warn("Affliction Healing Test Not Implemented"); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$healingRate = new ValueModifier(this); + if (this.healingRateBase === -1) this.$healingRate.disabled = true; + else this.$healingRate.setBase(this.healingRateBase); + this.$contagionIndex = new ValueModifier(this).setBase( + this.contagionIndexBase, + ); + this.$level = new ValueModifier(this).setBase(this.levelBase); + } +} + +export class TraitItemData extends SubtypeMixin(MasteryLevelItemData) { + $valueDesc; + $score; + + static get typeName() { + return "trait"; + } + + static get typeLabel() { + return { + singular: "Trait", + plural: "Traits", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/user-gear.svg"; + } + + static get subTypes() { + return { + physique: "Physique", + personality: "Personality", + transcendent: "Transcendent", + }; + } + + static get intensities() { + return { + trait: "Trait", + impulse: "Impulse", + disorder: "Disorder", + attribute: "Attribute", + }; + } + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "system.score": { label: "Score", abbrev: "Scor" }, + "system.$masteryLevel": { label: "Value", abbrev: "Val" }, + "system.textValue": { label: "Text", abbrev: "Text" }, + }); + } + + get displayVal() { + let result = this.textValue; + if (this.isNumeric) { + result = this.$score.displayVal; + } else if (this.choices[this.textValue]) { + result = this.choices[this.textValue]; + } + return result; + } + + get intrinsicActions() { + if (this.intensity === "attribute" && this.isNumeric) { + return super.intrinsicActions; + } else { + // If this is not a numeric attribute, then targetlevel is + // actually not used, so don't include its intrinsic actions + // and instead use the intrinsic actions for SohlItemData. + return SohlItemData.prototype.intrinsicActions; + } + } + + /** + * abbrev: short abbreviation for this trait + * textValue: the value of this trait. Boolean and numeric values + * are coerced into strings. + * max: for numeric values, this represents the maximum value of + * the trait. Not applicable to any other type. + * isNumeric: whether the textValue should be evaluated as a number + * intensity: the severity of the trait. If set to "attribute", the + * trait is instead considered to be an attribute. + * actionBodyParts: Which body part impairments apply to this + * trait. A value of "Any" indicates all body parts affect + * this trait. + * valueDesc: an array defining labels describing the values of this + * trait. Only applicable to numeric traits. + * choices: A set of values representing valid choices for this trait. + * The textValue should be one of these choice values. + * + * @override + */ + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + textValue: new fields.StringField({ + initial: "", + label: "Value", + }), + max: new fields.NumberField({ + integer: true, + nullable: true, + initial: null, + label: "Maximum value", + }), + isNumeric: new fields.BooleanField({ + initial: false, + label: "Is Numeric", + hint: "Is value numeric", + }), + intensity: new fields.StringField({ + initial: "trait", + blank: false, + label: "Intensity", + choices: this.intensities, + }), + valueDesc: new fields.ArrayField( + new fields.SchemaField({ + label: new fields.StringField({ + initial: "", + label: "Value Label", + }), + maxValue: new fields.NumberField({ + integer: true, + initial: 0, + label: "The highest attribute value where this label applies", + }), + }), + ), + choices: new fields.ObjectField({ + label: "Choices", + }), + }); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$valueDesc = this.valueDesc + .concat() + .sort((a, b) => a.maxValue - b.maxValue); + this.$score = new ValueModifier(this, { + valueDesc: (thisVM) => { + let desc = ""; + const len = this.$valueDesc.length; + for (let i = 0; !desc && i < len; i++) { + if (thisVM.effective <= this.$valueDesc[i].maxValue) { + desc = this.$valueDesc[i].label; + break; + } + } + return desc; + }, + max: this.max, + displayVal: (thisVM) => { + let result = thisVM.effective; + const traitDesc = thisVM.valueDesc; + if (traitDesc) result += ` (${traitDesc})`; + if (typeof thisVM.max === "number") { + result += ` [max: ${thisVM.max}]`; + } + return result; + }, + }); + + if (this.isNumeric) { + const scoreVal = Number.parseInt(this.textValue, 10); + this.$score.setBase(scoreVal); + if (this.intensity === "attribute") { + this.$masteryLevel.disabled = false; + this.$masteryLevel.fate.disabled = false; + this.$masteryLevel.setBase(scoreVal * 5); + } + this.$skillBase = new SkillBase(this.skillBaseFormula, [this]); + } else { + this.$score.disabled = true; + this.$masteryLevel.disabled = true; + this.$masteryLevel.fate.disabled = true; + } + } + + /** @override */ + postProcess() { + super.postProcess(); + if (this.intensity === "attribute") { + // Various conditions (e.g., spells) can change the attribute score. + // If the score has been modified, then update + // all of the skills depending on that score in their SB formula. + if (this.$score.modifier) { + const newBase = Math.max( + 0, + Math.trunc(this.$score.effective) * 5, + ); + this.$masteryLevel.setBase(newBase); + + // For each occurrence of an attribute in the SB Formula, increase the ML + // by 5 x the score difference from the base score. + IterWrap.create(this.actor.allItems()).forEach((it) => { + if (it.system instanceof MasteryLevelItemData) { + const attributes = it.system.skillBase.attributes; + if (attributes.includes(this.item.name)) { + const numOccurances = attributes.filter( + (a) => a === this.item.name, + ).length; + it.system.$masteryLevel.add( + `${this.item.name} Increase`, + `${this.abbr}Inc`, + this.$score.modifier * numOccurances * 5, + ); + } + } + }); + } + } else { + this.$masteryLevel.disabled = true; + } + } +} + +export class SkillItemData extends SubtypeMixin(MasteryLevelItemData) { + static get typeName() { + return "skill"; + } + + static get typeLabel() { + return { + singular: "Skill", + plural: "Skills", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/head-gear.svg"; + } + + /** @enum */ + static get subTypes() { + return { + social: "Social", + nature: "Nature", + craft: "Craft", + lore: "Lore", + language: "Language", + script: "Script", + ritual: "Ritual", + physical: "Physical", + combat: "Combat", + esoteric: "Esoteric", + }; + } + + /** @enum */ + static get combatTypes() { + return { + none: "None", + all: "All Weapon Types", + melee: "Melee", + missile: "Missile", + meleemissile: "Melee & Missile", + maneuver: "Combat Maneuver", + meleemaneuver: "Melee & Combat Maneuver", + }; + } + + /** + * weaponGroup: the type of combat weapon this skill applies to + * actionBodyParts: Which body part impairments apply to this + * skill. A value of "Any" indicates all body parts affect + * this skill. + * + * @override + */ + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + weaponGroup: new fields.StringField({ + initial: "none", + blank: false, + label: "Weapon Group", + choices: this.combatTypes, + }), + baseSkill: new fields.StringField({ + initial: "", + label: "Base Skill", + hint: "If this is a specialization, then the name of the base skill, otherwise blank", + }), + domain: new fields.StringField({ + initial: "", + label: "Domain", + hint: "Domain associated with this skill, if any", + }), + }); + } +} + +export class AffiliationItemData extends SohlItemData { + static get typeName() { + return "affiliation"; + } + + static get typeLabel() { + return { + singular: "Affiliation", + plural: "Affiliations", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/people-group.svg"; + } + + static defineSchema() { + return foundry.utils.mergeObject( + super.defineSchema(), + { + society: new fields.StringField({ + initial: "", + label: "Society", + }), + office: new fields.StringField({ + initial: "", + label: "Office", + }), + title: new fields.StringField({ + initial: "", + label: "Title", + }), + level: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Level", + }), + }, + { inplace: false }, + ); + } +} + +export class AnatomyItemData extends SohlItemData { + $sum; + $defaultAim; + + static get typeName() { + return "anatomy"; + } + + static get typeLabel() { + return { + singular: "Anatomy", + plural: "Anatomies", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/person.svg"; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + defaultAim: new fields.StringField({ + initial: "", + label: "Default Aim", + }), + weaponLimbs: new fields.SetField( + new fields.StringField({ + initial: "", + label: "Weapon Limb", + }), + { + label: "Weapon Limbs", + }, + ), + }); + } + + prepareBaseData() { + super.prepareBaseData(); + this.$defaultAim = this.defaultAim; + this.$sum = {}; + } + + /** @override */ + postProcess() { + super.postProcess(); + + // Ensure our defaultAim is one of the defined aim locations; + // Otherwise, arbitrarily choose the first aim location as the + // default one. + if (!Object.hasOwn(this.$sum, this.$defaultAim)) { + this.$defaultAim = Object.keys(this.$sum).at(0) ?? ""; + } + } +} + +export class BodyZoneItemData extends SohlItemData { + $aim; + $bodyParts; + + static get typeName() { + return "bodyzone"; + } + + static get typeLabel() { + return { + singular: "Body Zone", + plural: "Body Zones", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/person.svg"; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + abbrev: new fields.StringField({ + initial: "", + label: "Abbreviation", + }), + aim: new fields.ArrayField( + new fields.SchemaField( + { + name: new fields.StringField({ + initial: "", + label: "Area Name", + name: "Area location name", + }), + probWeightBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Area Probability Weight", + hint: + "The ratio of how often this body " + + "zone is hit compared to all body zones " + + "in the same area", + }), + }, + { + label: "Aim", + }, + ), + ), + }); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$aim = {}; + this.$bodyParts = []; + } + + processSiblings() { + super.processSiblings(); + + // Body Zone Items should never show up under the actor's "owned" items, they should always be + // virtual items nested within an Anatomy item. But let's just ensure that if this is not the + // case we abandon processing immediately. + if (this.actor && !this.item.isNested) { + console.warn( + `Item ${this.uuid} is a BodyZone that is not nested in an Anatomy, please correct this`, + ); + } + + const anatomyData = this.item.cause.system; + this.aim.forEach((aim) => { + anatomyData.$sum[aim.name] += aim.probWeightBase || 0; + this.$aim[aim.name] = { + name: aim.name, + probWeight: new ValueModifier(this, { + pct: (thisVM) => + Math.trunc( + (thisVM.effective / + (anatomyData.$sum[aim.name] || + thisVM.effective || + 1)) * + 100, + ), + ratio: (thisVM) => + `${thisVM.effective}:${ + anatomyData.$sum[aim.name] || thisVM.effective + }`, + }), + }; + }); + + this.$bodyParts = IterWrap.create(this.actor.allItems()).reduce( + (ary, it) => { + if (it.system instanceof BodyPartItemData) { + if (it.nestedIn?.id === this.id) { + ary.push(it); + } + } + return ary; + }, + [], + ); + } +} + +export class BodyPartItemData extends SohlItemData { + $heldItem; + $aim; + $bodyLocations; + $health; + + static get typeName() { + return "bodypart"; + } + + static get typeLabel() { + return { + singular: "Body Part", + plural: "Body Parts", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/ribcage.svg"; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + abbrev: new fields.StringField({ + initial: "", + label: "Abbreviation", + }), + canHoldItem: new fields.BooleanField({ + initial: false, + label: "Can Hold Item", + hint: "Whether this body part can hold an item", + }), + heldItemId: new fields.StringField({ + initial: "", + label: "Held Item Id", + }), + isSubordinate: new fields.BooleanField({ + initial: false, + label: "Is Subordinate", + hint: "Whether this body part serves a lesser or supporting role compared to other body parts in the same body zone", + }), + healthBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "health", + hint: "How much this body part contributes to the overall health", + }), + aim: new fields.ArrayField( + new fields.SchemaField( + { + name: new fields.StringField({ + initial: "", + label: "Area Name", + name: "Area location name", + }), + probWeightBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Area Probability Weight", + hint: + "The ratio of how often this body " + + "part is hit compared to all body parts " + + "in the same area for the body zone", + }), + }, + { + label: "Aim", + }, + ), + ), + }); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$aim = {}; + this.$health = new ValueModifier(this); + this.$health.setBase(this.healthBase); + } + + /** @override */ + processSiblings() { + super.processSiblings(); + + // Body Part Items should never show up under the actor's "owned" items, they should always be + // virtual items nested within a BodyZone item. But let's just ensure that if this is not the + // case we abandon processing immediately. + if (this.actor && !this.item.isNested) { + console.warn( + `Item ${this.uuid} is a BodyPart that is not nested in a BodyZone, please correct this`, + ); + } + + const bodyZoneData = this.item.cause.system; + this.aim.forEach((aim) => { + if (bodyZoneData?.$aim[aim.name]) { + bodyZoneData.$aim[aim.name].sum = + bodyZoneData.$aim[aim.name].sum + aim.probWeightBase || 0; + } + this.$aim[aim.name] = { + name: aim.name, + probWeight: new ValueModifier(this, { + pct: (thisVM) => + Math.trunc( + (thisVM.effective / + (bodyZoneData.$aim[aim.name].sum || + thisVM.effective || + 1)) * + 100, + ), + ratio: (thisVM) => + `${thisVM.effective}:${ + bodyZoneData.$sum[aim.name] || thisVM.effective + }`, + }).setBase(aim.probWeightBase), + sum: 0, + }; + }); + + this.$bodyLocations = IterWrap.create(this.actor.allItems()).reduce( + (ary, it) => { + if (it.system instanceof BodyLocationItemData) { + if (it.cause?.id === this.id) { + ary.push(it); + } + } + return ary; + }, + [], + ); + + this.$heldItem = + this.canHoldItem && + this.heldItemId && + this.actor.items.find((it) => it.id === this.heldItemId); + } + + /** @override */ + postProcess() { + super.postProcess(); + /* + * Check all held items to ensure they still exist and are carried, + * otherwise drop the item from the body part. + */ + if (this.$heldItem?.system instanceof GearItemData) { + if (this.$heldItem.system.isCarried) { + this.$heldItem.system.$isHeldBy.push(this.item.id); + } else { + const heldItemType = + SohlItem.types[this.$heldItem.type].typeLabel.singular; + ui.notifications.warn( + `${heldItemType} ${this.$heldItem.name} is not carried, so dropping it from ${this.item.name}`, + ); + this.update({ "system.heldItem": "" }); + } + } + } +} + +export class BodyLocationItemData extends SohlItemData { + $protection; + $layers; + $aim; + $traits; + + static get typeName() { + return "bodylocation"; + } + + static get typeLabel() { + return { + singular: "Body Location", + plural: "Body Locations", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/hand.svg"; + } + + static get effectKeys() { + const aspects = Object.keys(ImpactModifier.aspectTypes).reduce( + (obj, key) => { + obj[`system.armorBase.${key}`] = [key, key]; + return obj; + }, + {}, + ); + return Utility.simpleMerge(super.effectKeys, aspects); + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + abbrev: new fields.StringField({ + initial: "", + label: "Abbreviation", + }), + layers: new fields.StringField({ + initial: "", + label: "Layers", + hint: "Materials that cover this location", + }), + armorBase: new fields.SchemaField( + { + blunt: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Blunt", + }), + edged: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Edged", + }), + piercing: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Piercing", + }), + fire: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Fire", + }), + }, + { + label: "Armor", + }, + ), + isFumble: new fields.BooleanField({ + initial: false, + label: "Fumble", + hint: "Can the location fumble", + }), + isStumble: new fields.BooleanField({ + initial: false, + label: "Stumble", + hint: "Can the location stumble", + }), + aim: new fields.ArrayField( + new fields.SchemaField( + { + name: new fields.StringField({ + initial: "", + label: "Area Name", + hint: "location name", + }), + probWeightBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Area Prob Weight", + hint: + "The ratio of how often this body " + + "location is hit compared to all body locations " + + "in the same area for the body part", + }), + }, + { + label: "Aim", + }, + ), + ), + }); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$aim = {}; + this.$protection = { + blunt: new ValueModifier(this).setBase(this.armorBase.blunt), + edged: new ValueModifier(this).setBase(this.armorBase.edged), + piercing: new ValueModifier(this).setBase(this.armorBase.piercing), + fire: new ValueModifier(this).setBase(this.armorBase.fire), + }; + this.$layers = this.layers; + this.$traits = { + isRigid: false, + }; + } + + /** @override */ + processSiblings() { + super.processSiblings(); + + // Body Location Items should never show up under the actor's "owned" items, they should always be + // virtual items nested within a BodyPart item. But let's just ensure that if this is not the + // case we abandon processing immediately. + if (this.actor && !this.item.isNested) { + console.warn( + `Item ${this.uuid} is a Body Location that is not nested in a Body Part, please correct this`, + ); + } + + const bodyPartData = this.item.nestedIn.system; + this.aim.forEach((aim) => { + if (bodyPartData.$aim[aim.name]) { + bodyPartData.$aim[aim.name].sum = + bodyPartData.$aim[aim.name].sum + aim.probWeightBase || 0; + } + this.$aim[aim.name] = { + name: aim.name, + probWeight: new ValueModifier(this, { + pct: (thisVM) => + Math.trunc( + (thisVM.effective / + (bodyPartData.$aim[aim.name]?.sum || 1)) * + 100, + ), + }).setBase(aim.probWeightBase), + sum: 0, + }; + }); + } +} + +export class MysticalDeviceItemData extends SubtypeMixin(SohlItemData) { + static get typeName() { + return "mysticaldevice"; + } + + static get typeLabel() { + return { + singular: "Mystical Device", + plural: "Mystical Devices", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/magic-wand.svg"; + } + + /** @enum */ + static get subTypes() { + return { + artifact: "Arcane Artifact", + talisman: "Shamanic Talisman", + remnant: "Earthmaster Remnant", + relic: "Divine Relic", + }; + } + + static get talismanTypes() { + return { + ancestor: "Ancestor Spirit Power", + totem: "Totem Spirit Power", + }; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + isAttuned: new fields.BooleanField({ + initial: false, + label: "Attuned", + }), + requiresAttunement: new fields.BooleanField({ + initial: false, + label: "Requires Attunement", + }), + volition: new fields.SchemaField( + { + ego: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Ego", + }), + morality: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Morality", + }), + purpose: new fields.StringField({ + initial: "", + label: "Purpose", + }), + }, + { + label: "Volition", + }, + ), + }); + } +} + +export class GearItemData extends SohlItemData { + _totalWeight; + $weight; + $value; + $quality; + $durability; + $isHeldBy; + $skillItem; + $traits; + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "system.$value": { label: "Value", abbrev: "Val" }, + "system.$weight": { label: "Weight", abbrev: "Wt" }, + "system.$quality": { label: "Quality", abbrev: "Qal" }, + "system.$durability": { label: "Durability", abbrev: "Dur" }, + }); + } + + static get mods() { + return foundry.utils.mergeObject(super.mods, { + Durability: { name: "Durability", abbrev: "Dur" }, + }); + } + + get container() { + return this.nestedIn instanceof ContainerGearItemData + ? this.nestedIn + : null; + } + + get totalWeight() { + return this._totalWeight; + } + + get equipped() { + return false; + } + + static defineSchema() { + return foundry.utils.mergeObject( + super.defineSchema(), + { + abbrev: new fields.StringField({ + initial: "", + label: "Abbreviation", + }), + quantity: new fields.NumberField({ + integer: true, + initial: 1, + min: 0, + label: "Quantity", + }), + weightBase: new fields.NumberField({ + initial: 0, + min: 0, + label: "Weight", + }), + valueBase: new fields.NumberField({ + initial: 0, + min: 0, + label: "Value", + }), + isCarried: new fields.BooleanField({ + initial: true, + label: "Carried", + }), + isEquipped: new fields.BooleanField({ + initial: false, + label: "Equipped", + }), + qualityBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Quality", + }), + durabilityBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Durability", + }), + }, + { inplace: false }, + ); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$isHeldBy = []; + this.$skillItem = null; + this.$value = new ValueModifier(this); + this.$value.setBase(this.valueBase); + this.$weight = new ValueModifier(this); + this.$weight.setBase(this.weightBase); + this.$quality = new ValueModifier(this); + this.$quality.setBase(this.qualityBase); + this.$durability = new ValueModifier(this); + this.$durability.setBase(this.durabilityBase); + this._totalWeight = new ValueModifier(this); + + // If the gear is inside of a container, then the "carried" + // flag is inherited from the container. + if (this.nestedIn) { + this.isCarried = this.nestedIn.system.isCarried; + + // Anything in a container is unequipped automatically + this.isEquipped = false; + } + + this.isEquipped &&= this.isCarried; + } + + /** @override */ + prepareDerivedData() { + super.prepareDerivedData(); + const baseWeight = this.isCarried + ? Utility.maxPrecision(this.quantity * this.$weight.effective, 2) + : 0; + this._totalWeight.setBase(baseWeight); + + // Add quality to durability + if (this.$quality.effective) { + this.$durability.add( + GearItemData.mods.Durability.name, + GearItemData.mods.Durability.abbrev, + this.$quality.effective, + ); + } + } +} + +export class ConcoctionGearItemData extends SubtypeMixin(GearItemData) { + static get typeName() { + return "concoctiongear"; + } + + static get typeLabel() { + return { + singular: "Concoction", + plural: "Concoctions", + }; + } + + static get subTypes() { + return { + mundane: "Mundane", + exotic: "Exotic", + elixir: "Elixir", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/potion.svg"; + } + + static get potencyTypes() { + return { + na: "NA", + mild: "Mild", + strong: "Strong", + great: "Great", + }; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + potency: new fields.StringField({ + initial: "na", + blank: false, + label: "Potency", + choices: this.potencyTypes, + }), + strength: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Strength", + }), + }); + } +} + +export class MiscGearItemData extends GearItemData { + static get typeName() { + return "miscgear"; + } + + static get typeLabel() { + return { + singular: "Misc Gear", + plural: "Misc Gear", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/miscgear.svg"; + } +} + +export class ContainerGearItemData extends GearItemData { + $capacity; + + static get typeName() { + return "containergear"; + } + + static get typeLabel() { + return { + singular: "Container", + plural: "Containers", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/sack.svg"; + } + + static get status() { + return { + Ok: 0, + OverEncumbered: 1, + OverMax: 2, + }; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + maxCapacityBase: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Max Capacity", + }), + }); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$capacity = new ValueModifier(this, { + max: new ValueModifier(this), + value: (thisVM) => { + return Math.round(thisVM.effective * 1000) / 1000; + }, + status: (thisVM) => { + if (thisVM.parent.totalWeight.modifier > thisVM.max.effective) { + return ContainerGearItemData.status.OverMax; + } else { + return ContainerGearItemData.status.Ok; + } + }, + }); + this.$capacity.max.setBase(this.maxCapacityBase); + } + + calcContentWeight() { + this.items.forEach((it) => { + if (it.system instanceof GearItemData) { + if (it.system instanceof ContainerGearItemData) { + it.system.calcContentWeight(); + } + + this.totalWeight.add( + this.name, + `${this.abbrev}Wt`, + it.system.totalWeight.effective, + ); + } + }); + } + + /** @override */ + postProcess() { + super.postProcess(); + this.calcContentWeight(); + } +} + +export class ArmorGearItemData extends GearItemData { + $protection; + $traits; + + static get typeName() { + return "armorgear"; + } + + static get typeLabel() { + return { + singular: "Armor", + plural: "Armor", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/armor.svg"; + } + + static get rididArmor() { + return { + gambeson: "Gambeson", + kurbul: "Kurbul", + scale: "Scale", + mail: "Mail", + plate: "Plate", + shell: "Shell", + stone: "Stone", + bone: "Bone", + other: "Other Rigid", + }; + } + + get equipped() { + return this.isEquipped; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + material: new fields.StringField({ + initial: "", + label: "Material", + }), + locations: new fields.SchemaField( + { + flexible: new fields.SetField( + new fields.StringField({ + initial: "", + }), + { + label: "Flexible", + }, + ), + rigid: new fields.SetField( + new fields.StringField({ + initial: "", + }), + { + label: "Rigid", + }, + ), + }, + { + label: "Locations", + }, + ), + protectionBase: new fields.SchemaField( + { + blunt: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Blunt", + }), + edged: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Edged", + }), + piercing: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Piercing", + }), + fire: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Fire", + }), + }, + { + label: "Protection", + }, + ), + }); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$protection = {}; + Object.keys(this.protectionBase).forEach((p) => { + this.$protection[p] = new ValueModifier(this); + this.$protection[p].setBase(this.protectionBase[p]); + }); + } + + /** @override */ + postProcess() { + super.postProcess(); + if (this.isEquipped) { + const blList = this.actor.itemTypes[ + BodyLocationItemData.typeName + ].filter( + (i) => + this.locations.flexible.has(i.name) || + this.locations.rigid.has(i.name), + ); + blList.forEach((bl) => { + const blData = bl.system; + + Object.keys(this.$protection).forEach((aspect) => { + if (this.$protection[aspect].effective) + blData.$protection[aspect].add( + this.item.name, + this.abbrev, + this.$protection[aspect].effective, + ); + }); + + // if a material has been specified, add it to the layers + if (this.material) { + if (blData.$layers) blData.$layers += ","; + blData.$layers += this.material; + } + + // If any of the armor is rigid, then flag the whole bodylocation as rigid. + blData.$traits.isRigid ||= this.locations.rigid.has(bl.name); + }); + } + } +} + +export class WeaponGearItemData extends GearItemData { + $heldBy; + $heldByFavoredPart; + + static get typeName() { + return "weapongear"; + } + + static get typeLabel() { + return { + singular: "Weapon", + plural: "Weapons", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/sword.svg"; + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$heldBy = []; + this.$heldByFavoredPart = false; + } + + /** @override */ + processSiblings() { + super.processSiblings(); + let favParts = this.actor.getTraitByAbbrev("favparts"); + favParts &&= favParts.system.textValue.split(",").map((v) => v.trim()); + this.$heldByFavoredPart = false; + this.$heldBy = this.actor.itemTypes[BodyPartItemData.typeName].reduce( + (ary, it) => { + if (it.system.heldItemId === this.item.id) { + ary.push(it); + this.$heldByFavoredPart ||= favParts.includes(it.name); + } + return ary; + }, + [], + ); + } +} + +export class ProjectileGearItemData extends SubtypeMixin(GearItemData) { + $traits; + $attack; + $impact; + + static get typeName() { + return "projectilegear"; + } + + static get typeLabel() { + return { + singular: "Projectile", + plural: "Projectiles", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/arrow.svg"; + } + + static get effectKeys() { + return Utility.simpleMerge(super.effectKeys, { + "system.traits.blunt": { + label: "Blunt Impact", + abbrev: "ProjBlunt", + }, + "system.traits.bleed": { label: "Bleeding", abbrev: "ProjBld" }, + "system.traits.armorReduction": { + label: "Armor Reduction", + abbrev: "ProjAR", + }, + }); + } + + /** @enum */ + static get subTypes() { + return { + none: "None", + arrow: "Arrow", + bolt: "Bolt", + bullet: "Bullet", + dart: "Dart", + other: "Other", + }; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + shortName: new fields.StringField({ + initial: "", + label: "Short Name", + }), + impactBase: new fields.SchemaField( + { + numDice: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "# of Dice", + }), + die: new fields.NumberField({ + integer: true, + initial: 6, + min: 1, + label: "Die", + }), + modifier: new fields.NumberField({ + integer: true, + initial: -1, + min: -1, + label: "Modifier", + }), + aspect: new fields.StringField({ + initial: "blunt", + blank: false, + label: "Aspect", + }), + }, + { label: "Impact" }, + ), + }); + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + this.$traits = { + impactTA: 0, + halfImpact: false, + extraBleedRisk: false, + }; + this.$attack = new CombatModifier(this); + this.$impact = new ImpactModifier(this, { + numDice: this.impactBase.numDice, + die: this.impactBase.die, + aspect: this.impactBase.aspect, + }); + this.$impact.setBase(this.impactBase.modifier); + } +} + +export class EventItemData extends SohlItemData { + $targetUuid; + + static get typeName() { + return "event"; + } + + static get typeLabel() { + return { + singular: "Event", + plural: "Events", + }; + } + + static get defaultImage() { + return "systems/sohl/assets/icons/gear.svg"; + } + + static get operators() { + return { + duration: "Duration", + indefinite: "Indefinite", + now: "Now", + }; + } + + static get actionScopes() { + return { + self: "Event", + item: "Parent Item", + actor: "Parent Actor", + other: "Other", + }; + } + + static get autoRestartStates() { + return { + never: "Never", + once: "Once", + always: "Always", + }; + } + + static defineSchema() { + return foundry.utils.mergeObject(super.defineSchema(), { + tag: new fields.StringField({ + initial: "", + label: "Purpose Tag", + hint: "Identifies the purpose of this event", + }), + actionName: new fields.StringField({ + initial: "", + label: "Action", + hint: "Action to perform when time expires", + }), + activation: new fields.SchemaField( + { + scope: new fields.StringField({ + initial: "self", + blank: false, + choices: EventItemData.actionScopes, + label: "Action Scope", + }), + targetUuid: new fields.StringField({ + initial: "", + label: "Target UUID", + }), + duration: new fields.NumberField({ + integer: true, + initial: 0, + min: 0, + label: "Duration", + }), + initTime: new fields.NumberField({ + integer: true, + initial: Number.MAX_SAFE_INTEGER, + min: 0, + label: "Initialize Time", + }), + oper: new fields.StringField({ + initial: "gte", + blank: false, + choices: EventItemData.operators, + label: "Operator", + }), + autoRestart: new fields.StringField({ + initial: "never", + blank: false, + choices: EventItemData.autoRestartStates, + label: "Auto Restart", + }), + }, + { + label: "Activation", + }, + ), + }); + } + + get target() { + let result; + switch (this.activation.scope) { + case "self": + result = this.item; + break; + + case "item": + result = this.item.nestedIn; + break; + + case "actor": + result = this.item.actor; + break; + + case "other": + result = fromUuidSync(this.$targetUuid); + break; + } + return result; + } + + get initiated() { + return this.activation.initTime >= game.time.worldTime; + } + + get initTime() { + return { + worldDate: EventItemData.getWorldDateLabel( + this.activation.initTime, + ), + time: this.activation.initTime, + }; + } + + get activateTime() { + let worldDate; + let time; + if (this.activation.oper === "indefinite") { + worldDate = "Indefinite"; + time = Number.MAX_SAFE_INTEGER; + } else if (this.activation.oper === "now") { + worldDate = EventItemData.getWorldDateLabel(game.time.worldTime); + time = game.time.worldTime; + } else { + const activateTime = + this.activation.initTime + this.activation.duration; + worldDate = EventItemData.getWorldDateLabel(activateTime); + time = activateTime; + } + return { worldDate, time }; + } + + get totalDuration() { + let label, value; + if (this.activation.oper === "indefinite") { + label = "Indefinite"; + value = Number.MAX_SAFE_INTEGER; + } else if (this.activation.oper === "now") { + label = "Now"; + value = 0; + } else { + label = Utility.formatDuration(this.activation.duration); + value = this.activation.duration; + } + return { label, value }; + } + + get remainingDuration() { + let label, value; + if (!this.initiated) { + label = "Not Initiated"; + value = 0; + } else if (this.activation.oper === "indefinite") { + label = "Indefinite"; + value = Number.MAX_SAFE_INTEGER; + } else if (this.activation.oper === "now") { + label = "Now"; + value = 0; + } else { + const duration = Math.max( + 0, + this.activateTime.time - game.time.worldTime, + ); + label = Utility.formatDuration(duration); + value = duration; + } + return { label, value }; + } + + get elapsedDuration() { + const duration = game.time.worldTime - this.activation.initTime; + let label, value; + if (!this.initiated) { + label = "Not Initiated"; + value = 0; + } else { + value = Math.max(0, duration); + label = Utility.formatDuration(duration); + } + return { label, value }; + } + + /** + * Encode the time using the in-world calendar, "Indefinite" + * if time is 0, or "No Calendar" if an in-world calendar is not defined + * + * @param {number} time in-world seconds since the start of the game + * @returns {string} the current calendar time formatted + * like "13 Nolus TR720 13:42:10", or "Indefinite" if time is 0 + */ + static getWorldDateLabel(time) { + let worldDateLabel = "No Calendar"; + if (SOHL.hasSimpleCalendar) { + const ct = SimpleCalendar.api.timestampToDate(time); + worldDateLabel = `${ct.display.day} ${ct.display.monthName} ${ct.display.yearPrefix}${ct.display.year}${ct.display.yearPostfix} ${ct.display.time}`; + } + return worldDateLabel; + } + + static _start(item, { time = game.time.worldTime } = {}) { + const updateData = { + "system.activation.initTime": time, + }; + + if (item.system.activation.autoRestart === "once") { + updateData["system.activation.autoRestart"] = "never"; + } + + return updateData; + } + + async start({ time = game.time.worldTime } = {}) { + const updateData = EventItemData._start(this.item, { time }); + return await this.item.update(updateData); + } + + async stop() { + const updateData = { + "system.activation.initTime": Number.MAX_SAFE_INTEGER, + }; + return await this.item.update(updateData); + } + + async checkAndExecute() { + if (!this.initiated) return false; + + let isActivated = false; + switch (EventItemData.operators[this.activation.oper]) { + case "duration": + isActivated = !this.remainingDuration.value; + break; + + case "indefinite": + isActivated = false; + break; + + case "now": + isActivated = true; + break; + + default: + throw new Error(`Invalid operator ${this.activation.oper}`); + } + + if (isActivated) { + const target = this.target; + if (!target) { + throw new Error(`Target not found`); + } + await target.system.execute(this.actionName); + if ( + this.activation.autoRestart === + EventItemData.autoRestartStates.never + ) { + await this.item.delete(); + } else { + const updateData = EventItemData._start(this.item); + if ( + this.activation.autoRestart === + EventItemData.autoRestartStates.once + ) { + updateData["system.activation.autoRestart"] = "never"; + } + return await this.item.update(updateData); + } + } + + return isActivated; + } + + /** @override */ + prepareBaseData() { + super.prepareBaseData(); + switch (this.activation.scope) { + case "self": + this.$targetUuid = this.item.uuid; + break; + + case "item": + this.$targetUuid = this.item.nestedIn?.uuid; + break; + + case "actor": + this.$targetUuid = this.item.actor?.uuid; + break; + + case "other": + this.$targetUuid = this.activation.targetUuid; + break; + } + } +} + +export class SkillBase { + _attrs; + _formula; + _sunsigns; + _parsedFormula; + _value; + + constructor(formula, { items = null, sunsign = null } = {}) { + if (!formula) { + this._formula = null; + this._attrs = {}; + this._sunsigns = []; + } + + if (items && !(Symbol.iterator in Object(items))) { + throw new Error("items must be iterable"); + } + + this._formula = formula || null; + this._attrs = {}; + this._sunsigns = sunsign?.system.textValue.split("-") || []; + this._parsedFormula = formula ? this._parseFormula : []; + if (items) { + const attributes = items.filter( + (it) => + it.type === "trait" && + it.system.intensity === "attribute" && + it.system.isNumeric, + ); + this._parsedFormula.forEach((param) => { + const type = typeof param; + + if (type === "string") { + const [subType, name, mult = 1] = param.split(":"); + if (subType === "attr") { + const attr = attributes.find( + (obj) => obj.system.abbrev === name, + ); + + const score = Number.parseInt( + attr.system.textValue, + 10, + ); + if (Number.isInteger(score)) { + this._attrs[attr.system.abbrev] = { + name: attr.name, + value: score * mult, + }; + } else { + throw new Error( + "invalid attribute value not number", + ); + } + } + } + }); + } + + this._value = formula ? this._calcValue() : 0; + } + + get valid() { + return !!this.parsedFormula.length; + } + + get formula() { + return this._formula; + } + + get parsedFormula() { + return this._parsedFormula; + } + + get sunsigns() { + return this._sunsigns; + } + + get attributes() { + return Object.values(this._attrs).map((a) => a.name); + } + + get value() { + return this._value; + } + + /** + * Parses a skill base formula. + * + * A valid SB formula looks like this: + * + * "@str, @int, @sta, hirin:2, ahnu, 5" + * + * meaning + * average STR, INT, and STA + * add 2 if sunsign hirin (modifier after colon ":") + * add 1 if sunsign ahnu (1 since no modifier specified) + * add 5 to result + * + * A valid formula must have exactly 2 or more attributes, everything else is optional. + * + * @returns {object[]} A parsed skill base formula + */ + get _parseFormula() { + const parseResult = []; + let modifier = 0; + + let isFormulaValid = true; + // All parts of the formula are separated by commas, + // and we lowercase here since the string is processed + // case-insensitive. + const sbParts = this._formula.toLowerCase().split(","); + + for (let param of sbParts) { + if (!isFormulaValid) break; + + param = param.trim(); + if (param != "") { + if (param.startsWith("@")) { + // This is a reference to an attribute + + // Must have more than just the "@" sign + if (param.length === 1) { + isFormulaValid = false; + break; + } + + const paramName = param.slice(1); + parseResult.push(`attr:${paramName}`); + continue; + } + + if (param.match(/^\W/)) { + // This is a sunsign + + let ssParts = param.split(":"); + + // if more than 2 parts, it's invalid + if (ssParts.length > 2) { + isFormulaValid = false; + break; + } + + const ssName = ssParts[0].trim; + let ssCount = 1; + // if second part provided, must be a number + if (ssParts.length === 2) { + const ssNumber = ssParts[1].trim().match(/^[-+]?\d+/); + if (ssNumber) { + ssCount = Number.parseInt(ssNumber[0], 10); + } else { + isFormulaValid = false; + } + break; + } + + parseResult.push(`ss:${ssName}:${ssCount}`); + + continue; + } + + // The only valid possibility left is a number. + // If it"s not a number, it's invalid. + if (param.match(/^[-+]?\d+$/)) { + modifier += Number.parseInt(param, 10); + parseResult.push(modifier); + } else { + isFormulaValid = false; + break; + } + } + } + + return isFormulaValid ? parseResult : null; + } + + /** + * Calculates a skill base value. + * + * @returns A number representing the calculated skill base + */ + _calcValue() { + if (!this.valid) return 0; + let attrScores = []; + let ssBonus = Number.MIN_SAFE_INTEGER; + let modifier = 0; + this.parsedFormula.forEach((param) => { + const type = typeof param; + + if (type === "number") { + modifier += param; + } else if (type === "string") { + const [subType, name, mult = 1] = param.split(":"); + if (subType === "attr") { + attrScores.push(this._attrs[name]?.value || 0); + } else if (subType === "ss") { + if (this.sunsigns.includes(name)) { + // We matched a character's sunsign, apply modifier + // Character only gets the largest sunsign bonus + ssBonus = Math.max(Number.parseInt(mult, 10), ssBonus); + } + } + } + }); + + ssBonus = ssBonus > Number.MIN_SAFE_INTEGER ? ssBonus : 0; + let result = attrScores.reduce((acc, cur) => acc + cur, 0); + result = result / attrScores.length; + + if (attrScores.length === 2) { + // Special rounding rule: if only two attributes, and + // primary attr > secondary attr, round up, otherwise round down + result = + attrScores[0] > attrScores[1] + ? Math.ceil(result) + : Math.floor(result); + } else { + // Otherwise use normal rounding rules + result = Math.round(result); + } + + result += ssBonus + modifier; + + result = Math.max(0, result); // Make sure result is >= 0 + + return result; + } +} + +export class Utility { + static *combine(...iterators) { + for (let it of iterators) yield* it; + } + + // A very simple object merge method that doesn't try to do + // anything fancy. Always modifies target. + static simpleMerge(target, changes) { + return Object.entries(changes).reduce((obj, [k, v]) => { + obj[k] = v; + return obj; + }, target); + } + + /* + cyrb53 (c) 2018 bryc (github.com/bryc) + License: Public domain (or MIT if needed). Attribution appreciated. + A fast and simple 53-bit string hash function with decent collision resistance. + Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity. + https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js +*/ + static cyrb53(str, seed = 0) { + let h1 = 0xdeadbeef ^ seed, + h2 = 0x41c6ce57 ^ seed; + for (let i = 0, ch; i < str.length; i++) { + ch = str.charCodeAt(i); + h1 = Math.imul(h1 ^ ch, 2654435761); + h2 = Math.imul(h2 ^ ch, 1597334677); + } + h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507); + h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909); + h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507); + h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909); + return 4294967296 * (2097151 & h2) + (h1 >>> 0); + } + + static async onAlterTime( + time, + { days = 0, hours = 0, mins = 0, secs = 0 } = {}, + ) { + const currentWorldTime = game.time.worldTime; + const gameStartTime = 0; + const dialogData = { + timeBases: { + world: "Current World Time", + existing: "From Existing Time", + epoch: "From Game Start Time", + }, + timeDirections: { + future: "Toward the Future", + past: "Toward the Past", + }, + timeBase: "world", + setTime: time, + days, + hours, + mins, + secs, + }; + + let dlgTemplate = "systems/sohl/templates/dialog/time-dialog.html"; + const html = await renderTemplate(dlgTemplate, dialogData); + + const dlgResult = await Dialog.prompt({ + title: "Adjust Time", + content: html.trim(), + label: `Adjust Time`, + render: (html) => { + html.querySelector('[name="timeBase"]').addEventListener( + "change", + (e) => { + const time = html.querySelector("#time"); + let newValue = + e.target.value === "existing" + ? Utility.htmlWorldTime(time) + : e.target.value === "world" + ? Utility.htmlWorldTime(currentWorldTime) + : Utility.htmlWorldTime(gameStartTime); + time.innerHTML = newValue; + }, + ); + }, + callback: (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formData = foundry.utils.expandObject(fd.object); + const timeBase = formData.timeBase; + const direction = formData.direction; + const days = Number.parseInt(formData.days, 10); + const hours = Number.parseInt(formData.hours, 10); + const mins = Number.parseInt(formData.mins, 10); + const secs = Number.parseInt(formData.secs, 10); + let newTime = + timeBase === "world" + ? game.time.worldTime + : timeBase === "existing" + ? dialogData.setTime + : 0; + const diff = days * 86400 + hours * 3600 + mins * 60 + secs; + newTime += direction === "future" ? diff : -diff; + return newTime; + }, + rejectClose: false, + options: { jQuery: false }, + }); + + return dlgResult; + } + + /** + * Coerces value to the specified maximum precision. If the value has greater than + * the specified precision, then rounds the value to the specified precision. If + * the value has less than or equal to the specified precision, the value is unchanged. + * + * @param {number} value Source value to be evaluated + * @param {number} [precision=0] Maximum number of characters after decimal point + * @returns {number} value rounded to the specified precision + */ + static maxPrecision(value, precision = 0) { + return +parseFloat(value).toFixed(precision); + } + + /** + * Returns number of victory stars. + * @param {*} atkSuccLvl + * @param {*} defSuccLvl + * @returns Positive numbers for attacker victory stars, and negative numbers for defender victory stars. + * Zero indicates a tie. If there are no victory stars at all (due to both having failures), returns null. + */ + static calcVictoryStars(atkSuccLvl, defSuccLvl = null) { + if (defSuccLvl === null) { + return atkSuccLvl >= SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess + ? atkSuccLvl + : null; + } else { + if ( + atkSuccLvl <= SOHL.CONST.SUCCESS_LEVEL.MarginalFailure && + defSuccLvl <= SOHL.CONST.SUCCESS_LEVEL.MarginalFailure + ) { + return null; + } else { + return atkSuccLvl - defSuccLvl; + } + } + } + + static victoryStarsText(vs) { + const result = { + vsList: ["None"], + text: "Both Fail", + isTester: false, + isOpponent: false, + isTied: false, + }; + if (vs !== null) { + result.victoryStars = Math.abs(vs); + if (vs) { + result.isTester = vs > 0; + result.isOpponent = !result.isTester; + result.vsList = new Array(result.victoryStars).fill( + result.isTester + ? SOHL.CONST.CHARS.STARF + : SOHL.CONST.CHARS.STAR, + ); + result.text = result.vsList.join(""); + } else { + result.isTied = true; + } + } + return result; + } + + static async moveQtyDialog(item, dest) { + // Render modal dialog + let dlgData = { + itemName: item.name, + targetName: dest.name || this.actor.name, + maxItems: item.system.quantity, + }; + + if (item.nestedIn) { + dlgData.sourceName = `${item.nestedIn.label}`; + } else { + dlgData.sourceName = this.actor.name; + } + + const compiled = Handlebars.compile(`
+

Moving ${dlgData.itemName} from ${dlgData.sourceName} to ${dlgData.targetName}

+
+ + {{numberInput ${dlgData.maxItems} name="itemstomove" step=1 min=0 max=${dlgData.maxItems}}} +
+
`); + const dlghtml = compiled(dlgData, { + allowProtoMethodsByDefault: true, + allowProtoPropertiesByDefault: true, + }); + + // Create the dialog window + const result = await Dialog.prompt({ + title: "Move Items", + content: dlghtml, + label: "OK", + callback: async (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formdata = foundry.utils.expandObject(fd.object); + let formQtyToMove = Number.parseInt(formdata.itemstomove) || 0; + + return formQtyToMove; + }, + options: { jQuery: false }, + rejectClose: false, + }); + + return result || 0; + } + + static createAction(event, parent) { + if (event.preventDefault) event.preventDefault(); + const dataset = event.currentTarget.dataset; + const isChat = dataset.type === "chat"; + + let dlghtml = `
+
+ + +
+
+ + +
+
`; + + // Create the dialog window + return Dialog.prompt({ + title: "Create Action", + content: dlghtml, + label: "Create", + callback: async (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formData = foundry.utils.expandObject(fd.object); + + const hasAction = parent.system.actions.some( + (it) => + !it.getFlag("sohl", "isIntrinsicAction") && + it.name === formData.name, + ); + if (hasAction) { + ui.notifications.error( + `An action named ${formData.name} already exists on ${parent.label}`, + ); + return null; + } + + const action = await SohlMacro.create( + { name: formData.name, type: formData.type }, + { nestedIn: parent }, + ); + action.sheet.render(true); + return action; + }, + options: { jQuery: false }, + rejectClose: false, + }); + } + + // biome-ignore lint/correctness/noUnusedVariables: + static deleteAction(event, action) { + if (!action) { + console.error(`SoHL | Delete aborted, action not specified.`); + return null; + } + + return Dialog.confirm({ + title: `Delete Action: ${action.name}`, + content: + "

Are You Sure?

This action will be deleted and cannot be recovered.

", + yes: () => { + return action.delete(); + }, + }); + } + + /** + * Generates a unique name by appending numerical suffixes to the specified prefix if necessary. Iterates over the provided items to ensure the generated name does not already exist in the list. + * + * @static + * @param {*} prefix + * @param {*} items + * @returns {*} + */ + static uniqueName(prefix, items) { + let candidate = prefix; + if (items instanceof Map || items instanceof Array) { + let ord = 0; + while (items.some((n) => n.name === candidate)) { + ord++; + candidate = `${prefix} ${ord}`; + } + } + + return candidate; + } + + static htmlWorldTime(value) { + const worldDateLabel = EventItemData.getWorldDateLabel(value); + const remainingDurationLabel = Utility.formatDuration( + value - game.time.worldTime, + ); + const html = `${remainingDurationLabel}`; + return html; + } + + static formatDuration(age) { + const duration = Math.abs(age); + const days = Math.floor(duration / 86400); + const hours = Math.floor((duration % 86400) / 3600); + const min = Math.floor((duration % 3600) / 60); + const sec = duration % 60; + let result = days ? `${days}d ` : ""; + result += hours ? `${hours}h ` : ""; + result += min ? `${min}m ` : ""; + result += !result || sec ? `${sec}s` : ""; + result += age > 0 ? " in the future" : age < 0 ? " ago" : ""; + return result; + } + + /** + * A static method that converts a given number of seconds to a normalized time format. It calculates the normalized hours, minutes, and seconds based on the input seconds value and constructs a formatted time string. Returns an object with 'label' property containing the formatted time string and 'inFuture' property indicating whether the input seconds value is negative. + * + * @static + * @param {*} seconds + * @returns {{ label: string; inFuture: boolean; }} + */ + static toNormTime(seconds) { + const asecs = Math.abs(seconds); + const normHours = Math.floor(asecs / 3600); + const remSeconds = asecs % 3600; + const normMinutes = Number(Math.floor(remSeconds / 60)) + .toString() + .padStart(2, "0"); + const normSeconds = Number(remSeconds % 60) + .toString() + .padStart(2, "0"); + return { + label: `${normHours}:${normMinutes}:${normSeconds}`, + inFuture: seconds < 0, + }; + } + + /** + * Convert an integer into a roman numeral. Taken from: + * http://blog.stevenlevithan.com/archives/javascript-roman-numeral-converter + * + * @param {Integer} num + */ + static romanize(num) { + if (isNaN(num)) return NaN; + var digits = String(+num).split(""), + key = [ + "", + "C", + "CC", + "CCC", + "CD", + "D", + "DC", + "DCC", + "DCCC", + "CM", + "", + "X", + "XX", + "XXX", + "XL", + "L", + "LX", + "LXX", + "LXXX", + "XC", + "", + "I", + "II", + "III", + "IV", + "V", + "VI", + "VII", + "VIII", + "IX", + ], + roman = "", + i = 3; + while (i--) roman = (key[+digits.pop() + i * 10] || "") + roman; + return Array(+digits.join("") + 1).join("M") + roman; + } + + /** + * @typedef {Object} RollResult + * @property {number} origTarget + * @property {number} target + * @property {boolean} isCapped + * @property {number} rollTotal + * @property {Roll} rollObj + * @property {boolean} isCritical + * @property {boolean} isSuccess + * @property {number} lastDigit + * @property {number} successLevel + * @property {string} description + */ + + /** + * Perform a generic dice roll + * + * @param {string} rollFormula Dice formula (e.g., "1d3+4") + * @param {number} target Target value to test against + * @param {number} successLevelMod Success Level Modifier + * @param {data} context replacement data for roll formula + * @returns {RollResult} Object containing results of the roll + */ + static async rollTest( + rollFormula, + { + target = 0, + critFailure = [], + critSuccess = [], + successLevelMod = 0, + minResult = Number.MIN_VALUE, + maxResult = Number.MAX_VALUE, + context = {}, + } = {}, + ) { + const rollObj = new Roll(rollFormula, context); + const roll = await rollObj.evaluate(); + if (!roll) { + throw new Error( + `SoHL | Roll evaluation failed, diceSpec=${rollFormula}`, + ); + } + + const lastDigit = roll.total % 10; + const cappedTarget = Math.max(Math.min(target, maxResult), minResult); + let rollResults = { + origTarget: target, + target: cappedTarget, + isCapped: target !== cappedTarget, + rollTotal: roll.total, + rollObj: roll, + isCritical: false, + isSuccess: false, + lastDigit: lastDigit, + successLevel: 0, + description: "", + }; + + rollResults.successLevel = + roll.total <= rollResults.target + ? SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess + : SOHL.CONST.SUCCESS_LEVEL.MarginalFailure; + rollResults.successLevel += successLevelMod; + rollResults.isSuccess = + rollResults.successLevel >= + SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess; + + if (critSuccess.length || critFailure.length) { + rollResults.isCritical = rollResults.isSuccess + ? critSuccess.includes(lastDigit) + : critFailure.includes(lastDigit); + if (rollResults.isCritical) { + rollResults.description = rollResults.isSuccess + ? "Critical Success" + : "Critical Failure"; + } else { + rollResults.description = rollResults.isSuccess + ? "Marginal Success" + : "Marginal Failure"; + } + + // If success level is greater than critical success or less than critical failure + // then add the amount to the end of the description + let successLevelIncr = 0; + if (rollResults.isCritical) { + successLevelIncr = + rollResults.successLevel - + (rollResults.isSuccess + ? SOHL.CONST.SUCCESS_LEVEL.CriticalSuccess + : SOHL.CONST.SUCCESS_LEVEL.CriticalFailure); + } + if (successLevelIncr > 1 || successLevelIncr < -1) { + rollResults.description = `${rollResults.description} (${ + (successLevelIncr > 0 ? "+" : "") + successLevelIncr + })`; + } + } else { + rollResults.successLevel = Math.max( + Math.min( + rollResults.successLevel, + SOHL.CONST.SUCCESS_LEVEL.MarginalSuccess, + ), + SOHL.CONST.SUCCESS_LEVEL.MarginalFailure, + ); + rollResults.description = rollResults.isSuccess + ? "Success" + : "Failure"; + } + + return rollResults; + } + + /** + * Calculates the distance from sourceToken to targetToken in "scene" units (e.g., feet). + * + * @param {Token} sourceToken + * @param {Token} targetToken + * @param {Boolean} gridUnits If true, return in grid units, not "scene" units + */ + static rangeToTarget(sourceToken, targetToken, gridUnits = false) { + if (!sourceToken) { + throw new Error(`sourceToken not provided`); + } + if (!targetToken) { + throw new Error(`target not provided`); + } + if (!canvas.scene?.grid) { + ui.notifications.warn(`No scene active`); + return null; + } + if (!gridUnits && !["feet", "ft"].includes(canvas.scene.grid.units)) { + ui.notifications.warn( + `Scene uses units of ${canvas.scene.grid.units} but only feet are supported, distance calculation not possible`, + ); + return null; + } + + // If the current scene is marked "Theatre of the Mind", then range is always 0 + if (canvas.scene.getFlag("sohl", "isTotm")) return 0; + + const source = sourceToken.center; + const dest = targetToken.center; + + const segments = []; + const ray = new Ray(source, dest); + segments.push({ ray }); + const distances = canvas.grid.measureDistances(segments, { + gridSpaces: true, + }); + + if (gridUnits) + return Math.round(distances[0] / canvas.dimensions.distance); + return distances[0]; + } + + /** + * Returns the single selected token if there is exactly one token selected + * on the canvas, otherwise issue a warning. + * + * @static + * @param {object} [options] + * @param {boolean} [options.quiet=false] suppress warning messages + * @returns {Token|null} The currently selected token, or null if there is not exactly one selected token + */ + static getSingleSelectedToken({ quiet = false } = {}) { + const numTargets = canvas.tokens?.controlled?.length; + if (!numTargets) { + if (!quiet) + ui.notifications.warn(`No selected tokens on the canvas.`); + return null; + } + + if (numTargets > 1) { + if (!quiet) + ui.notifications.warn( + `There are ${numTargets} selected tokens on the canvas, please select only one`, + ); + return null; + } + + return canvas.tokens.controlled[0].document; + } + + static async asyncForEach(array, callback) { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index, array); + } + } + + static async getDocsFromPacks( + packNames, + { documentName = "Item", docType }, + ) { + let allDocs = []; + for (let packName of packNames) { + const pack = game.packs.get(packName); + if (!pack) continue; + if (pack.documentName !== documentName) continue; + const query = {}; + if (docType) { + query["type"] = docType; + } + const items = await pack.getDocuments(query); + allDocs.push(...items); + } + return allDocs; + } + + /** + * A static asynchronous function that retrieves an item from the specified + * packs based on the item name, pack names, and optionally item type. + * It iterates over each pack name, gets the pack object from the game data, + * constructs a query object based on the item name and optional item type, + * and fetches documents that match the query from the pack. If any results + * are found, the first result is assigned to the variable 'result' and the + * iteration stops. Finally, it returns the found item or null if no item is found. + * + * @static + * @async + * @param {string} docName + * @param {string[]} packNames + * @param {object} options + * @param {string} [options.itemType] + * @param {boolean} [options.keepId] + * @returns {object} data representing a document from the compendium + */ + static async getDocumentFromPacks( + docName, + packNames, + { documentName = "Item", docType, keepId } = {}, + ) { + let data = null; + const allDocs = await Utility.getDocsFromPacks(packNames, { + documentName, + docType, + }); + const doc = allDocs?.find((it) => it.name === docName); + if (doc) { + // Cleanup item data + data = doc.toObject(); + if (!keepId) data._id = foundry.utils.randomID(); + delete data.folder; + delete data.sort; + if (doc.pack) + foundry.utils.setProperty( + data, + "_stats.compendiumSource", + doc.uuid, + ); + if ("ownership" in data) { + data.ownership = { + default: CONST.DOCUMENT_OWNERSHIP_LEVELS.NONE, + [game.user.id]: CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER, + }; + } + if (doc.effects) { + data.effects = doc.effects.contents.map((e) => e.toObject()); + } + } + + return data; + } + + /** + * Creates a 16-digit sequence of hexadecimal digits, suitable for use as + * an ID, but such that the same input string will produce the same output + * every time. + * + * @param {string} str Input string to convert to hash + * @returns Sequence of 16 hexadecimal digits as a string + */ + static createHash16(str) { + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + const ary = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + for (let i = 0; i < str.length; i++) { + ary[i % 16] += str.codePointAt(i); + } + let id = ""; + for (let i = 0; i < 16; i++) id += chars[ary[i] % chars.length]; + return id; + } + + /** + * Loads a JSON file and returns an object representing the JSON structure. + * + * @param {string} filepath path to the JSON file + * @returns {object} The parsed JSON structure + */ + static async loadJSONFromFile(filepath) { + const json = await foundry.utils.fetchJsonWithTimeout( + foundry.utils.getRoute(filepath, { prefix: ROUTE_PREFIX }), + ); + return json; + } +} + +/** + * Firefox and many other browsers do not implement the latest Iterator helper + * methods, so they are implemented in this class for compatibility. + * + * The reason to use this instead of Array.from() is that this class and its methods + * do not need to create an intermediate array, but handle the iterable directly. + */ +export class IterWrap { + _iter; + + constructor(iter) { + if (!(typeof iter[Symbol.iterator] === "function")) { + throw new Error( + "Parameter to IterWrap constructor must be iterable", + ); + } + + this._iter = iter; + } + + static create(iter) { + if (["null", "undefined"].includes(typeof iter)) return null; + return new IterWrap(iter); + } + + find(callbackFn) { + let idx = 0; + let { value, done } = this._iter.next(); + while (!done) { + const result = callbackFn(value, idx++); + if (result) return value; + ({ value, done } = this._iter.next()); + } + return null; + } + + filter(callbackFn) { + let idx = 0; + const ary = []; + let { value, done } = this._iter.next(); + while (!done) { + const result = callbackFn(value, idx++); + if (result) ary.push(value); + ({ value, done } = this._iter.next()); + } + return ary; + } + + map(callbackFn) { + let idx = 0; + const ary = []; + let { value, done } = this._iter.next(); + while (!done) { + const result = callbackFn(value, idx++); + ary.push(result); + ({ value, done } = this._iter.next()); + } + return ary; + } + + forEach(callbackFn) { + let idx = 0; + let { value, done } = this._iter.next(); + while (!done) { + callbackFn(value, idx++); + ({ value, done } = this._iter.next()); + } + return undefined; + } + + reduce(callbackFn, initialValue = null) { + let idx = 0; + let { value, done } = this._iter.next(); + let accumulator = initialValue; + if (!accumulator) { + if (!done) { + initialValue = value; + ({ value, done } = this._iter.next()); + } else { + throw new Error("No initializer"); + } + } + + while (!done) { + callbackFn(accumulator, value, idx++); + ({ value, done } = this._iter.next()); + } + return accumulator; + } + + some(callbackFn) { + return !!this.find(callbackFn); + } + + toArray() { + return Array.from(this._iter); + } + + [Symbol.iterator]() { + return this._iter; + } +} +export class SohlContextMenu extends ContextMenu { + static get sortGroups() { + return { + Default: "aaa", + Primary: "aab", + General: "zaa", + Deprecated: "zzz", + }; + } + + _setPosition(html, target, { event } = {}) { + //const container = target[0].parentElement; + let container = target.parents("div.app"); + + // Append to target and get the context bounds + target.css("position", "relative"); + html.css("visibility", "hidden"); + html.css("width", "fit-content"); + container.append(html); + + const contextRect = html[0].getBoundingClientRect(); + const containerRect = container[0].getBoundingClientRect(); + const mouseX = event.pageX - containerRect.left; + const mouseY = event.pageY - containerRect.top; + + const contextTopOffset = mouseY; + let contextLeftOffset = Math.min( + containerRect.width - contextRect.width, + mouseX, + ); + + // Determine whether to expand upwards + const contextTopMax = mouseY - contextRect.height; + const contextBottomMax = mouseY + contextRect.height; + const canOverflowUp = + contextTopMax > containerRect.top || + getComputedStyle(container[0]).overflowY === "visible"; + + // If it overflows the container bottom, but not the container top + this._expandUp = + contextBottomMax > containerRect.height && + (contextTopMax >= 0 || canOverflowUp); + + const contextTop = this._expandUp + ? contextTopOffset - contextRect.height + : contextTopOffset; + const contextBottom = contextTop + contextRect.height; + + // Display the menu + html.toggleClass("expand-up", this._expandUp); + html.toggleClass("expand-down", !this._expandUp); + + html.css("top", `${contextTop}px`); + html.css("bottom", `${contextBottom}px`); + if (contextLeftOffset) html.css("left", `${contextLeftOffset}px`); + html.css("visibility", ""); + target.addClass("context"); + } +} + +export class SohlActiveEffectData extends foundry.abstract.TypeDataModel { + static get typeName() { + return "sohlactiveeffect"; + } + + static get typeLabel() { + return { + singular: "Injury", + plural: "Injuries", + }; + } + + static get defaultImage() { + return "icons/svg/aura.svg"; + } + + get targetLabel() { + const targetType = this.targetType || "actor"; + const targetName = this.targetName || ""; + const attrs = this.targetAttr?.split(","); + const actor = + this.parent.parent instanceof SohlActor + ? this.parent.parent + : this.parent.parent.actor; + + let result; + if (targetType === "actor") { + result = `This Actor: ${ + actor.isToken ? actor.token.name : actor.name + }`; + } else if (targetType === "this") { + if (this.parent.parent instanceof SohlItem) { + result = `This ${this.parent.parent.system.constructor.typeLabel.singular}`; + } else if (actor) { + result = `This Actor: ${ + actor.isToken ? actor.token.name : actor.name + }`; + } + } else if (attrs?.length) { + result = `SB Formula Has: ${attrs.join(" or ")}`; + } else if (this.targetNameRE === ".+") { + result = `All ${SohlItem.types[targetType].typeLabel.plural}`; + } else { + result = `${SohlItem.types[targetType].typeLabel.singular}: ${targetName}`; + } + return result; + } + + get targetNameRE() { + let name = this.targetName; + // CASE 1: name is empty or starts with "attr:" means all names are valid + if (!name || name.startsWith("attr:")) return ".+"; + // CASE 2: name starts with "regex:" means remainder is already a regular expression + if (name.startsWith("regex:")) return name.slice(6).trim(); + // CASE 3: name is assumed to be in extended "glob" format, convert to RegEx + return this._globrex(name, { extended: true }).regex.source; + } + + get targetAttr() { + if (!this.targetName) return null; + + const name = this.targetName; + if (name.startsWith("attr:")) { + return name.slice(5).trim(); + } + return null; + } + + /* Return the single target of this one active effect */ + get target() { + // This really doesn't make sense, since AE in SOHL can have multiple targets, + // but this method is used in a number of places so we make it kinda work + const targets = this.targets; + return targets.length ? this.targets[0] : null; + } + + /* Return all of the documents (Items and Actors) targeted by this Active Effect */ + get targets() { + let targets = []; + const targetAttr = this.targetAttr; + const targetType = this.targetType; + if (targetType === "uuid") { + const target = fromUuidSync(this.targetName, { + strict: false, + }); + if (!target) { + console.warn( + `Effect target with UUID ${this.targetName} not found`, + ); + } else { + targets.push(target); + } + } else if (this.parent.parent instanceof SohlItem) { + const item = this.parent.parent; + const itemActor = item.actor; + if (targetType === "actor") return itemActor ? [itemActor] : []; + if (targetType === "this") return [item]; + + // If there is no parent actor, then we are done + if (!itemActor) return []; + + // If the targetAttr is defined, find all of the sibling items with that attribute in their SB Formula + if ( + targetAttr && + SOHL.sysVer.CONFIG.Item.dataModels[targetType] instanceof + MasteryLevelItemData + ) { + const targetAttrNames = this.targetAttr.split(","); + targetAttrNames.forEach((attrName) => { + targets = itemActor.itemTypes[targetType].filter((it) => + it.system.skillBase.attributes.includes(attrName), + ); + }); + } else { + // Find all of the sibling items matching the target name + const re = new RegExp(this.targetNameRE); + targets = itemActor.itemTypes[targetType].filter((it) => + re.test(it.name), + ); + } + } else if (this.parent.parent instanceof SohlActor) { + const actor = this.parent.parent; + if (["actor", "this"].includes(targetType)) return [actor]; + + // Find all actor's item targets + if ( + targetAttr && + [ + SkillItemData.typeName, + MysticalAbilityItemData.typeName, + ].includes(targetType) + ) { + const targetAttrNames = this.targetAttr.split(","); + targetAttrNames.forEach((attrName) => { + targets = actor.itemTypes[targetType].filter((it) => + it.system.skillBase.attributes.includes(attrName), + ); + }); + } else { + const re = new RegExp(this.targetNameRE); + targets = actor.itemTypes[targetType].filter((it) => + re.test(it.name), + ); + } + } + + return targets; + } + + /** @override */ + static defineSchema() { + return { + targetName: new fields.StringField({ + initial: "this", + label: "Target Name", + }), + targetType: new fields.StringField({ + initial: "", + label: "Target Type", + choices: SohlActiveEffect.targetTypes, + }), + }; + } + + /** + * Convert any glob pattern to a JavaScript Regexp object. + * + * Taken from https://github.com/terkelg/globrex + * + * @author Terkel Gjervig Nielsen + * @license MIT + * + * @param {String} glob Glob pattern to convert + * @param {Object} opts Configuration object + * @param {Boolean} [opts.extended=false] Support advanced ext globbing + * @param {Boolean} [opts.globstar=false] Support globstar + * @param {Boolean} [opts.strict=true] be laissez faire about mutiple slashes + * @param {Boolean} [opts.filepath=""] Parse as filepath for extra path related features + * @param {String} [opts.flags=""] RegExp globs + * @returns {Object} converted object with string, segments and RegExp object + */ + static _globrex( + glob, + { + extended = false, + globstar = false, + strict = false, + filepath = false, + flags = "", + } = {}, + ) { + const isWin = navigator.platform.indexOf("Win") > -1; + const SEP = isWin ? `\\\\+` : `\\/`; + const SEP_ESC = isWin ? `\\\\` : `/`; + const GLOBSTAR = `((?:[^/]*(?:/|$))*)`; + const WILDCARD = `([^/]*)`; + const GLOBSTAR_SEGMENT = `((?:[^${SEP_ESC}]*(?:${SEP_ESC}|$))*)`; + const WILDCARD_SEGMENT = `([^${SEP_ESC}]*)`; + + let regex = ""; + let segment = ""; + let path = { regex: "", segments: [] }; + + // If we are doing extended matching, this boolean is true when we are inside + // a group (eg {*.html,*.js}), and false otherwise. + let inGroup = false; + let inRange = false; + + // extglob stack. Keep track of scope + const ext = []; + + // Helper static to build string and segments + function add(str, { split, last, only } = {}) { + if (only !== "path") regex += str; + if (filepath && only !== "regex") { + path.regex += str === "\\/" ? SEP : str; + if (split) { + if (last) segment += str; + if (segment !== "") { + if (!flags.includes("g")) segment = `^${segment}$`; // change it "includes" + path.segments.push(new RegExp(segment, flags)); + } + segment = ""; + } else { + segment += str; + } + } + } + + let c, n; + for (let i = 0; i < glob.length; i++) { + c = glob[i]; + n = glob[i + 1]; + + if (["\\", "$", "^", ".", "="].includes(c)) { + add(`\\${c}`); + continue; + } + + if (c === "/") { + add(`\\${c}`, { split: true }); + if (n === "/" && !strict) regex += "?"; + continue; + } + + if (c === "(") { + if (ext.length) { + add(c); + continue; + } + add(`\\${c}`); + continue; + } + + if (c === ")") { + if (ext.length) { + add(c); + let type = ext.pop(); + if (type === "@") { + add("{1}"); + } else if (type === "!") { + add("([^/]*)"); + } else { + add(type); + } + continue; + } + add(`\\${c}`); + continue; + } + + if (c === "|") { + if (ext.length) { + add(c); + continue; + } + add(`\\${c}`); + continue; + } + + if (c === "+") { + if (n === "(" && extended) { + ext.push(c); + continue; + } + add(`\\${c}`); + continue; + } + + if (c === "@" && extended) { + if (n === "(") { + ext.push(c); + continue; + } + } + + if (c === "!") { + if (extended) { + if (inRange) { + add("^"); + continue; + } + if (n === "(") { + ext.push(c); + add("(?!"); + i++; + continue; + } + add(`\\${c}`); + continue; + } + add(`\\${c}`); + continue; + } + + if (c === "?") { + if (extended) { + if (n === "(") { + ext.push(c); + } else { + add("."); + } + continue; + } + add(`\\${c}`); + continue; + } + + if (c === "[") { + if (inRange && n === ":") { + i++; // skip [ + let value = ""; + while (glob[++i] !== ":") value += glob[i]; + if (value === "alnum") add("(\\w|\\d)"); + else if (value === "space") add("\\s"); + else if (value === "digit") add("\\d"); + i++; // skip last ] + continue; + } + if (extended) { + inRange = true; + add(c); + continue; + } + add(`\\${c}`); + continue; + } + + if (c === "]") { + if (extended) { + inRange = false; + add(c); + continue; + } + add(`\\${c}`); + continue; + } + + if (c === "{") { + if (extended) { + inGroup = true; + add("("); + continue; + } + add(`\\${c}`); + continue; + } + + if (c === "}") { + if (extended) { + inGroup = false; + add(")"); + continue; + } + add(`\\${c}`); + continue; + } + + if (c === ",") { + if (inGroup) { + add("|"); + continue; + } + add(`\\${c}`); + continue; + } + + if (c === "*") { + if (n === "(" && extended) { + ext.push(c); + continue; + } + // Move over all consecutive "*""s. + // Also store the previous and next characters + let prevChar = glob[i - 1]; + let starCount = 1; + while (glob[i + 1] === "*") { + starCount++; + i++; + } + let nextChar = glob[i + 1]; + if (!globstar) { + // globstar is disabled, so treat any number of "*" as one + add(".*"); + } else { + // globstar is enabled, so determine if this is a globstar segment + let isGlobstar = + starCount > 1 && // multiple "*""s + (prevChar === "/" || prevChar === undefined) && // from the start of the segment + (nextChar === "/" || nextChar === undefined); // to the end of the segment + if (isGlobstar) { + // it"s a globstar, so match zero or more path segments + add(GLOBSTAR, { only: "regex" }); + add(GLOBSTAR_SEGMENT, { + only: "path", + last: true, + split: true, + }); + i++; // move over the "/" + } else { + // it"s not a globstar, so only match one path segment + add(WILDCARD, { only: "regex" }); + add(WILDCARD_SEGMENT, { only: "path" }); + } + } + continue; + } + + add(c); + } + + // When regexp "g" flag is specified don"t + // constrain the regular expression with ^ & $ + if (!flags.includes("g")) { + regex = `^${regex}$`; + segment = `^${segment}$`; + if (filepath) path.regex = `^${path.regex}$`; + } + + const result = { regex: new RegExp(regex, flags) }; + + // Push the last segment + if (filepath) { + path.segments.push(new RegExp(segment, flags)); + path.regex = new RegExp(path.regex, flags); + path.globstar = new RegExp( + !flags.includes("g") + ? `^${GLOBSTAR_SEGMENT}$` + : GLOBSTAR_SEGMENT, + flags, + ); + result.path = path; + } + + return result; + } +} + +export class SohlActiveEffect extends ActiveEffect { + get targetTypes() { + return { + uuid: "Document UUID", + actor: "Actor", + this: "Parent", + }; + } + + get targetName() { + return this.system.target?.name || "Unknown"; + } + + get modifiesActor() { + if (!this.active) return false; + return this.parent instanceof SohlItem + ? this.system.targetType === "actor" + : ["actor", "this"].includes(this.system.targetType); + } + + /** @override */ + get isSuppressed() { + // let hasAuralShock = false; + // if (this.parent instanceof SohlActor) { + // if (!this.origin) return false; + // hasAuralShock = this.parent + // .allItems() + // .some( + // (it) => + // it.system instanceof AfflictionItemData && + // it.system.subType === "auralshock", + // ); + // } else { + if (!this.origin) return true; + // } + + if (this.parent instanceof SohlItem) { + const source = this.parent; + // If the item is a unequipped gear, then its effects are suppressed + if ( + source.system instanceof GearItemData && + !source.system.isEquipped + ) + return true; + } else { + const source = fromUuidSync(this.origin); + if (!source) { + console.warn( + `Actor ${this.parent.name} effect ${this.name} has invalid origin ${this.origin}`, + ); + return true; + } + } + + // if ( + // hasAuralShock && + // source.system.skillBase.attributes.includes("Aura") + // ) { + // return true; + // } + + return false; + } + + _getContextOptions() { + const result = [ + { + name: "Edit", + icon: ``, + condition: (header) => { + if (game.user.isGM) return true; + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".effect"); + const parent = fromUuidSync(li.dataset.effectParentUuid); + const effect = parent?.effects.get(li.dataset.effectId); + return effect?.isOwner; + }, + callback: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".effect"); + const parent = fromUuidSync(li.dataset.effectParentUuid); + const effect = parent?.effects.get(li.dataset.effectId); + if (effect) { + effect.sheet.render(true); + } else { + throw new Error( + `Effect ${li.dataset.effectUuid} not found.`, + ); + } + }, + group: SohlContextMenu.sortGroups.General, + }, + { + name: "Delete", + icon: ``, + condition: (header) => { + if (game.user.isGM) return true; + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".effect"); + const parent = fromUuidSync(li.dataset.effectParentUuid); + const effect = parent?.effects.get(li.dataset.effectId); + return effect?.isOwner; + }, + callback: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".effect"); + const parent = fromUuidSync(li.dataset.effectParentUuid); + const effect = parent?.effects.get(li.dataset.effectId); + if (effect) { + return Dialog.confirm({ + title: `Delete Active Effect: ${effect.name}`, + content: + "

Are You Sure?

This active effect will be deleted and cannot be recovered.

", + yes: () => { + return effect.delete(); + }, + }); + } else { + throw new Error( + `Effect ${li.dataset.effectUuid} not found.`, + ); + } + }, + group: SohlContextMenu.sortGroups.General, + }, + { + name: "Toggle", + icon: ``, + condition: (header) => { + if (game.user.isGM) return true; + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".effect"); + const parent = fromUuidSync(li.dataset.effectParentUuid); + const effect = parent?.effects.get(li.dataset.effectId); + return effect?.isOwner; + }, + callback: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".effect"); + const parent = fromUuidSync(li.dataset.effectParentUuid); + const effect = parent?.effects.get(li.dataset.effectId); + if (effect) { + effect.toggleEnabledState(); + } else { + throw new Error( + `Effect ${li.dataset.effectUuid} not found.`, + ); + } + }, + group: SohlContextMenu.sortGroups.General, + }, + ]; + return result; + } + + async toggleEnabledState() { + const updateData = {}; + if (this.disabled) { + // Enable the Active Effect + updateData["disabled"] = false; + + // Also set the timer to start now + updateData["duration.startTime"] = game.time.worldTime; + if (game.combat) { + updateData["duration.startRound"] = game.combat.round; + updateData["duration.startTurn"] = game.combat.turn; + } + } else { + // Disable the Active Effect + updateData["disabled"] = true; + } + return await this.update(updateData); + } + + /** @override */ + _onCreate(data, options, userId) { + super._onCreate(data, options, userId); + + // Reset the origin for this AE if it is on an item associated with an Actor + if ( + this.parent instanceof SohlItem && + this.parent.parent instanceof SohlActor + ) { + this.origin = this.parent.uuid; + } + } + + /** @override */ + apply(doc, change) { + let changes = {}; + if (change.key.startsWith("mod:")) { + // Any change that starts with "mod:" is a modifier + this._handleAEMods(doc, change, changes); + } else { + // Otherwise, handle as normal + changes = super.apply(doc, change); + } + return changes; + } + + _handleAEMods(doc, change, changes) { + const parts = change.key.split(":"); + const modId = parts[1]; + const modKey = parts[2]; + + const mods = foundry.utils.getProperty(doc, modKey); + if (!(mods instanceof ValueModifier)) { + console.error( + `SoHL | Invalid target: "${modKey}" is not a ValueModifier for ${doc.name}`, + ); + return; + } + + const modName = + modId === "AE" + ? `AE: ${this.sourceName}` + : doc.system.constructor.mods[modId].name; + const modAbbr = + modId === "AE" ? "AE" : doc.system.constructor.mods[modId].abbrev; + + switch (change.mode) { + case CONST.ACTIVE_EFFECT_MODES.ADD: + mods.add(modName, modAbbr, change.value); + break; + + case CONST.ACTIVE_EFFECT_MODES.MULTIPLY: + mods.multiply(modName, modAbbr, change.value); + break; + + case CONST.ACTIVE_EFFECT_MODES.UPGRADE: + mods.floor(modName, modAbbr, change.value); + break; + + case CONST.ACTIVE_EFFECT_MODES.DOWNGRADE: + mods.ceiling(modName, modAbbr, change.value); + break; + + case CONST.ACTIVE_EFFECT_MODES.OVERRIDE: + mods.set(modName, modAbbr, change.value); + break; + } + + return (changes[modKey] = mods); + } + + async checkExpiredAndDisable() { + if (!this.disabled) { + const duration = this.duration; + if (duration.type && duration.type !== "none") { + if (duration.remaining <= 0) { + await this.update({ disabled: true }); + } + } + } + } + + getEffectKeyValue(type, key) { + if (type === "this") { + type = this.parent.system.constructor.typeName; + } + const eKey = + SOHL.sysVer.CONFIG.Item.dataModels?.[type].effectKeys?.[key]; + return eKey || { label: "Unknown", abbrev: "UNKNOWN" }; + } + + getEffectKeyChoices(type) { + return SOHL.sysVer.CONFIG.Item.dataModels?.[type].effectKeys || []; + } + + /** + * Returns a string representation of the changes made. If there are no changes, it returns 'No Changes'. Each change is mapped to a formatted string based on the change mode. The format includes the key, value, and mode of the change. The prefix for each change is determined based on the targetType and the parent object. The format varies depending on the mode of the change, such as ADD, MULTIPLY, OVERRIDE, UPGRADE, DOWNGRADE, or default. The formatted strings for each change are joined with a comma separator and returned as a single string. + * + * @returns {*} + */ + get _aeChanges() { + if (!this.changes || !this.changes.length) { + return "No Changes"; + } + + return this.changes + .map((ch) => { + const modes = CONST.ACTIVE_EFFECT_MODES; + const key = ch.key; + const val = ch.value; + let prefix = this.getEffectKeyValue( + this.system.targetType, + key, + ).abbrev; + if (this.system.targetType === "this") { + if (this.parent instanceof SohlItem) { + prefix = this.getEffectKeyValue( + this.parent.type, + key, + ).abbrev; + } else if (this.parent instanceof SohlActor) { + prefix = this.getEffectKeyValue("actor", key).abbrev; + } + } + + switch (ch.mode) { + case modes.ADD: + return `${prefix} ${val < 0 ? "-" : "+"} ${Math.abs( + val, + )}`; + case modes.MULTIPLY: + return `${prefix} ${SOHL.CONST.CHARS.TIMES} ${val}`; + case modes.OVERRIDE: + return `${prefix} = ${val}`; + case modes.UPGRADE: + return `${prefix} ${SOHL.CONST.CHARS.GREATERTHANOREQUAL} ${val}`; + case modes.DOWNGRADE: + return `${prefix} ${SOHL.CONST.CHARS.LESSTHANOREQUAL} ${val}`; + default: + return !val ? `${prefix}` : `${prefix} ~ ${val}`; + } + }) + .join(", "); + } + + _prepareDuration() { + const d = super._prepareDuration(); + if (d.type === "seconds") { + d.endTime = d._worldTime + d.remaining; + d.endTimeHtml = Utility.htmlWorldTime(d.endTime); + } + return d; + } + + get _aeDuration() { + const d = this.duration; + + // Time-based duration + if (Number.isNumeric(d.seconds)) { + const start = d.startTime || game.time.worldTime; + const elapsed = game.time.worldTime - start; + const remaining = Math.max(d.seconds - elapsed, 0); + //const normDuration = toNormTime(d.seconds); + const normRemaining = Utility.formatDuration(remaining); + return { + type: "seconds", + duration: d.seconds, + remaining: remaining, + label: normRemaining, + }; + } + + // Turn-based duration + else if (d.rounds || d.turns) { + // Determine the current combat duration + const cbt = game.combat; + const c = { + round: cbt?.round ?? 0, + turn: cbt?.turn ?? 0, + nTurns: cbt?.turns.length ?? 1, + }; + + // Determine how many rounds and turns have elapsed + let elapsedRounds = Math.max(c.round - (d.startRound || 0), 0); + let elapsedTurns = c.turn - (d.startTurn || 0); + if (elapsedTurns < 0) { + elapsedRounds -= 1; + elapsedTurns += c.nTurns; + } + + // Compute the number of rounds and turns that are remaining + let remainingRounds = (d.rounds || 0) - elapsedRounds; + let remainingTurns = (d.turns || 0) - elapsedTurns; + if (remainingTurns < 0) { + remainingRounds -= 1; + remainingTurns += c.nTurns; + } else if (remainingTurns > c.nTurns) { + remainingRounds += Math.floor(remainingTurns / c.nTurns); + remainingTurns %= c.nTurns; + } + + // Total remaining duration + if (remainingRounds < 0) { + remainingRounds = 0; + remainingTurns = 0; + } + const duration = (c.rounds || 0) + (c.turns || 0) / 100; + const remaining = remainingRounds + remainingTurns / 100; + + // Remaining label + const label = [ + remainingRounds > 0 ? `${remainingRounds} Rounds` : null, + remainingTurns > 0 ? `${remainingTurns} Turns` : null, + remainingRounds + remainingTurns === 0 ? "None" : null, + ].filterJoin(", "); + return { + type: "turns", + duration: duration, + remaining: remaining, + label: label, + }; + } + + // No duration + else { + return { + type: "none", + duration: null, + remaining: null, + label: "None", + }; + } + } + static async create(data, options = {}) { + let newData = foundry.utils.deepClone(data); + + if (Object.keys(newData).some((k) => /\./.test(k))) { + newData = foundry.utils.expandObject(newData); + } + + if (options.clean) { + delete newData.sort; + } + + if (!newData.img) { + newData.img = CONFIG.controlIcons.effects; + } + + // If nestedIn is specified, use update() on the nestedIn + if (options.parent?.nestedIn) { + const newAry = options.parent.nestedIn.effects.contents; + + const effectExists = newAry.some((obj) => obj._id === newData._id); + if (effectExists) { + throw new Error( + `Effect with id ${newData._id} already exists in ${options.parent.nestedIn.label}`, + ); + } + + let effect = new SohlActiveEffect(newData, options); + //await item._preCreate(newData, options, game.user); + const effectData = effect.toObject(); + + // Set sort property + let maxSort = newAry.reduce( + (max, obj) => Math.max(max, obj.sort), + 0, + ); + maxSort += CONST.SORT_INTEGER_DENSITY; + effectData.sort = maxSort; + newAry.push(effectData); + + const result = await options.parent.nestedIn.update( + { "system.effects": newAry }, + { nestedIn: options.parent.nestedIn }, + ); + options.parent.sheet.render(); + return result; + } else { + return await super.create(newData, options); + } + } + + /** @override */ + update(data = [], context = {}) { + // Note that this method will return a direct response if called + // on an item with an nestedIn, otherwise it will return a Promise. + + let result = null; + + if (this.parent?.nestedIn) { + this.updateSource(data); + const newAry = this.parent.effects.contents; + const idx = newAry.findIndex((obj) => obj._id === this.id); + if (idx >= 0) { + newAry[idx] = this.toObject(); + newAry.sort((a, b) => a.sort - b.sort); + const updateData = { + "system.effects": newAry, + }; + result = this.parent.nestedIn.update(updateData, context); + this.parent.sheet.render(); + } + } else { + result = super.update(data, context); + } + + return result; + } + + /** @override */ + delete(context = {}) { + // Note that this method will return a direct response if called + // on an item with either nestedIn or cause with a truthy value, + // otherwise it will return a Promise. + if (this.parent?.nestedIn) { + const newAry = this.parent.effects.contents; + const filtered = newAry.filter((obj) => obj._id !== this.id); + if (filtered.length !== newAry.length) { + this.parent.nestedIn.update( + { "system.effects": filtered }, + context, + ); + } + this.parent.sheet.render(); + return this; + } else { + return super.delete(context); + } + } +} + +/** + * A form designed for creating and editing an Active Effect on an Actor or Item. + * @implements {FormApplication} + * + * @param {ActiveEffect} object The target active effect being configured + * @param {object} [options] Additional options which modify this application instance + */ +export class SohlActiveEffectConfig extends ActiveEffectConfig { + /** @override */ + static get defaultOptions() { + return foundry.utils.mergeObject(super.defaultOptions, { + template: "systems/sohl/templates/effect/active-effect-config.html", + }); + } + + /* ----------------------------------------- */ + + /** @override */ + // biome-ignore lint/correctness/noUnusedVariables: + async getData(options) { + const context = await super.getData(); + let targetType = context.data.system.targetType || "this"; + if (targetType === "this") { + if (this.object.parent instanceof Item) { + targetType = this.object.parent.type; + } else if (this.object.parent instanceof Actor) { + targetType = "actor"; + } + } + context.keyChoices = this.object.getEffectKeyChoices(targetType); + context.sourceName = await this.object.sourceName; + context.targetTypes = { + this: + this.object.parent instanceof Actor + ? "This Actor" + : `This ${ + SOHL.sysVer.CONFIG.Item.typeLabels[ + this.object.parent.type + ] + }`, + uuid: "Item UUID", + }; + if (this.object.parent instanceof Item) { + context.targetTypes.actor = "Actor"; + } + + for (const key of Object.keys(SOHL.sysVer.CONFIG.Item.dataModels)) { + switch (key) { + case "actor": + context.targetTypes[key] = "Actor"; + break; + + default: + context.targetTypes[key] = + SOHL.sysVer.CONFIG.Item.typeLabels[key]; + break; + } + } + + if (SOHL.hasSimpleCalendar) { + const ct = SimpleCalendar.api.timestampToDate( + context.data.duration.startTime, + ); + context.startTimeText = `${ct.display.day} ${ct.display.monthName} ${ct.display.yearPrefix}${ct.display.year}${ct.display.yearPostfix} ${ct.display.time}`; + } else { + const startTimeDiff = + game.time.worldTime - context.data.duration.startTime; + context.startTimeText = Utility.formatDuration(startTimeDiff); + } + + return context; + } + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + html.find(".alter-time").click((ev) => { + const property = ev.currentTarget.dataset.property; + let time = Number.parseInt(ev.currentTarget.dataset.time, 10); + if (Number.isNaN(time)) time = 0; + Utility.onAlterTime(time).then((result) => { + if (result !== null) { + const updateData = { [property]: result }; + this.object.update(updateData); + } + }); + }); + } +} + +export class SohlMacro extends Macro { + /** @override */ + _configure(options) { + if (this.parent && !(this.parent instanceof SohlActor)) { + throw new Error("Parent must always be an instance of SohlActor"); + } + + super._configure(options); + + Object.defineProperty(this, "nestedIn", { + value: (() => { + if ([null, undefined].includes(options.nestedIn)) return null; + if ( + options.nestedIn instanceof SohlItem || + options.nestedIn instanceof SohlActor + ) + return options.nestedIn; + throw new Error( + "The provided nestedIn must be an SohlItem or SohlActor instance", + ); + })(), + writable: false, + enumerable: false, + }); + } + + get isNested() { + return !!this.nestedIn; + } + + get item() { + if (this.nestedIn instanceof SohlItem) { + return this.nestedIn; + } + return null; + } + + get actor() { + if (this.nestedIn instanceof SohlActor) { + return this.parent; + } else if (this.nestedIn instanceof SohlItem) { + return this.nestedIn.actor; + } else { + return null; + } + } + + get notes() { + return this.getFlag("sohl", "notes") || ""; + } + + set notes(value) { + this.setFlag("sohl", "notes", value ?? ""); + } + + get description() { + return this.getFlag("sohl", "description") || ""; + } + + set description(value) { + this.setFlag("sohl", "description", value ?? ""); + } + + get useAsync() { + return this.getFlag("sohl", "useAsync"); + } + + set useAsync(val) { + this.setFlag("sohl", "useAsync", !!val); + } + + get nameParts() { + const index = this.functionName.indexOf("$"); + if (index < 0) return { prefix: "", functionName: this.functionName }; + const prefix = this.functionName.slice(0, index); + const fnName = this.functionName.slice(index + 1); + return { prefix, functionName: fnName }; + } + + get params() { + return this.getFlag("sohl", "params") || {}; + } + + get functionName() { + return this.getFlag("sohl", "functionName") ?? ""; + } + + set functionName(value) { + this.setFlag("sohl", "functionName", value); + } + + get isIntrinsicAction() { + return !!this.getFlag("sohl", "isIntrinsicAction"); + } + + set isIntrinsicAction(value) { + this.setFlag("sohl", "isIntrinsicAction", !!value); + } + + get contextIconClass() { + return this.getFlag("sohl", "contextIconClass") ?? ""; + } + + set contextIconClass(value) { + this.setFlag("sohl", "contextIconClass", value); + } + + get contextCondition() { + return this.getFlag("sohl", "contextCondition") ?? false; + } + + set contextCondition(value) { + this.setFlag("sohl", "contextCondition", value); + } + + get contextGroup() { + return this.getFlag("sohl", "contextGroup") ?? ""; + } + + set contextGroup(value) { + this.setFlag("sohl", "contextGroup", value); + } + + setParam(name, value) { + if (!name || Number.isNumeric(name)) { + throw new Error( + `Invalid parameter name "${name}", must be a non-numeric string`, + ); + } + + const newParams = foundry.utils.deepClone(this.params); + newParams[name] = value; + this.setFlag("sohl", "params", newParams); + } + + deleteParam(name) { + const newParams = foundry.utils.deepClone(this.params); + delete newParams[name]; + this.setFlag("sohl", "params", newParams); + } + + get paramsLabel() { + return Object.entries(this.params).reduce((str, [key, val]) => { + if (str) str += ","; + str += key; + if (typeof val !== "undefined") { + str += `=${val}`; + } + return str; + }, ""); + } + + /** @override */ + get uuid() { + if (!this._uuid) { + if (this.nestedIn) { + // If this is a nested object, we come up with a new UUID format + // where the nested macro is defined with a hash mark + let parts = [this.nestedIn.uuid, "NestedMacro", this.id]; + this._uuid = parts.join("#"); + } else { + this._uuid = super.uuid; + } + } + + return this._uuid; + } + + _getContextOptions() { + const opts = [ + { + name: "Execute", + icon: ``, + condition: this.canExecute, + callback: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const parent = fromUuidSync(li.dataset.parentUuid); + const action = parent.system.actions.get(li.dataset.itemId); + action.execute(); + }, + group: SohlContextMenu.sortGroups.Default, + }, + { + name: "Edit", + icon: ``, + condition: !this.isIntrinsicAction, + callback: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const parent = fromUuidSync(li.dataset.parentUuid); + const action = parent.system.actions.get(li.dataset.itemId); + action.sheet.render(true); + }, + group: SohlContextMenu.sortGroups.General, + }, + { + name: "Delete", + icon: ``, + condition: !this.isIntrinsicAction && this.isOwner, + callback: (header) => { + header = header instanceof HTMLElement ? header : header[0]; + const li = header.closest(".item"); + const parent = fromUuidSync(li.dataset.parentUuid); + const action = parent.system.actions.get(li.dataset.itemId); + return Dialog.confirm({ + title: `Delete Action: ${action.name}`, + content: + "

Are You Sure?

This action will be deleted and cannot be recovered.

", + yes: () => { + action.delete(); + }, + }); + }, + group: SohlContextMenu.sortGroups.General, + }, + ]; + + return opts; + } + + /** @override */ + async _preCreate(data, options, user) { + const allowed = await super._preCreate(data, options, user); + if (allowed === false) return false; + + const updateData = foundry.utils.mergeObject( + { + type: CONST.MACRO_TYPES.SCRIPT, + flags: { + sohl: { + notes: "", + description: "", + params: {}, + functionName: "", + contextIconClass: "", + contextCondition: false, + contextGroup: "", + isIntrinsicAction: false, + useAsync: true, + }, + }, + }, + data, + { insertKeys: false, insertValues: false }, + ); + this.updateSource(updateData); + return true; + } + + static getExecuteDefaults({ + speaker = null, + actor = null, + token = null, + character = null, + needsActor = false, + needsToken = false, + self = null, + }) { + if (speaker && actor && token && character) + return { speaker, actor, token, character }; + actor = actor || token?.actor; + if (!actor) { + actor = self.actor; + token = actor?.getToken(); + } + + // Add variables to the evaluation scope. + speaker ||= ChatMessage.getSpeaker({ actor, token }); + character ||= game.user.character; + token ||= canvas.ready ? canvas.tokens.get(speaker.token) : null; + actor ||= token?.actor || game.actors.get(speaker.actor); + + if (needsToken && !token) { + throw new Error(`No Token defined`); + } else if (needsActor && !actor) { + throw new Error(`No Actor defined`); + } else { + return { speaker, actor, token, character }; + } + } + + /** @override */ + execute({ self, actor, token, inPrepareData, ...scope } = {}) { + self ||= this.parent?.system || this.nestedIn?.system || this; + const argValues = Object.values(scope); + let speaker, character, fn; + if (this.type === CONST.MACRO_TYPES.CHAT) { + ({ actor, token } = SohlMacro.getExecuteDefaults({ + actor, + token, + self, + })); + scope.token = token; + scope.actor = actor; + return super.execute(scope); + } else if (this.type === CONST.MACRO_TYPES.SCRIPT) { + if (this.isIntrinsicAction) { + const { functionName } = this.nameParts; + fn = self[functionName]; + if (!(fn instanceof Function)) fn = null; + } else { + // Unpack argument names and values + const argNames = Object.keys(scope); + if (argNames.some((k) => Number.isNumeric(k))) { + throw new Error( + "Illegal numeric Macro parameter passed to execution scope.", + ); + } + + const args = [ + "speaker", + "actor", + "token", + "character", + "scope", + ...argNames, + `{${this.command}\n}`, + ]; + + if (this.useAsync) { + fn = new foundry.utils.AsyncFunction(...args); + } else { + fn = new Function(...args); + } + } + } + if (fn) { + // Attempt macro execution + try { + if (!inPrepareData) { + ({ speaker, actor, token, character } = + SohlMacro.getExecuteDefaults({ + actor, + token, + self, + })); + } + + return fn.call( + self, + speaker, + actor, + token, + character, + scope, + ...argValues, + ); + } catch (err) { + Hooks.onError("SohlMacro#execute", err, { + msg: `Error executing action ${this.name} on ${ + self.constructor.typeLabel?.singular || "SohlMacro" + } ${self.name}`, + log: "error", + }); + } + } + + return null; + } + + /** + * Creates a new instance based on the provided data and context. If the context has a parent, a new instance of SohlMacro is created using the data and context. If the data does not have an _id property or if context.keepId is not true, a unique _id is generated using foundry.utils.randomID(). The macro is then checked for existence in the parent system's macros array. If the macro already exists, an error is thrown. If the macro is new, it is added to the macros array and parent is updated. Returns the created macro instance if successful, otherwise delegates creation to the superclass. + * + * @static + * @async + * @param {*} data + * @param {{}} [context={}] + * @returns {unknown} + */ + static async create(data, context = {}) { + if (context.nestedIn) { + if (!(data._id && context.keepId)) { + data._id = foundry.utils.randomID(); + } + const macro = new SohlMacro(data, context); + if (!macro) throw new Error(`Macro creation failed`); + + const macroData = macro.toObject(); + + const newAry = foundry.utils.deepClone( + macro.nestedIn.system.macros, + ); + + // Set sort property + let maxSort = newAry.reduce( + (max, obj) => Math.max(max, obj.sort), + 0, + ); + maxSort += CONST.SORT_INTEGER_DENSITY; + macroData.sort = maxSort; + + const macroExists = newAry.some((obj) => obj._id === macro.id); + if (macroExists) { + if (!context.keepId) { + throw new Error( + `Macro with id ${macro.id} already exists in ${macro.nestedIn.label}`, + ); + } + } else { + newAry.push(macroData); + await macro.nestedIn.update( + { "system.macros": newAry }, + context, + ); + } + return macro; + } else { + return await super.create(data, context); + } + } + + async update(data = [], context = {}) { + if (this.nestedIn) { + this.updateSource(data, context); + this.sheet.render(); + + let result = null; + const idx = this.nestedIn.system.macros.findIndex( + (obj) => obj._id === this.id, + ); + if (idx >= 0) { + const newAry = foundry.utils.deepClone( + this.nestedIn.system.macros, + ); + newAry[idx] = this.toObject(); + newAry.sort((a, b) => a.sort - b.sort); + result = await this.nestedIn.update( + { "system.macros": newAry }, + context, + ); + } else { + console.error( + `Update called on SohlMacro that doesn't exist in ${this.nestedIn.name}, id=${this.id}`, + ); + } + return result; + } else { + return super.update(data, context); + } + } + + async delete(context = {}) { + if (this.nestedIn) { + const filtered = this.nestedIn.system.macros.filter( + (obj) => obj._id !== this.id, + ); + await this.nestedIn.update({ "system.macros": filtered }, context); + this.sheet.close(); + return this; + } else { + return super.delete(context); + } + } +} + +export class SohlMacroConfig extends MacroConfig { + /** @override */ + static get defaultOptions() { + return foundry.utils.mergeObject(super.defaultOptions, { + classes: ["sohl", "sheet", "macro", "macro-sheet"], + template: "systems/sohl/templates/dialog/macro-config.html", + tabs: [ + { + navSelector: ".sheet-tabs", + contentSelector: ".sheet-body", + initial: "script", + }, + ], + width: 560, + height: 600, + resizable: true, + }); + } + + /** @override */ + getData(options = {}) { + const data = super.getData(options); + data.macroTypes = game.documentTypes.Macro.reduce((obj, t) => { + if ( + t === CONST.MACRO_TYPES.SCRIPT && + !game.user.can("MACRO_SCRIPT") + ) + return obj; + obj[t] = game.i18n.localize(CONFIG.Macro.typeLabels[t]); + return obj; + }, {}); + data.editable = this.isEditable; + data.const = SOHL.sysVer.CONST; + data.config = SOHL.sysVer.CONFIG; + return data; + } + + get isEditable() { + return !this.isIntrinsicAction && super.isEditable; + } + + /** @inheritdoc */ + _onDragStart(event) { + const li = event.currentTarget; + if ("link" in event.target.dataset) return; + + // Create drag data + let dragData; + + // Owned Items + if (li.dataset.uuid) { + const item = fromUuidSync(li.dataset.uuid); + dragData = item.toDragData(); + } + + // Active Effect + else if (li.dataset.effectId) { + const effect = this.actor.effects.get(li.dataset.effectId); + dragData = effect.toDragData(); + } + + // Action + else if (li.dataset.actionName) { + const action = this.actor.system.actions.getName( + li.dataset.actionName, + ); + dragData = action.toDragData(); + } + + if (!dragData) return; + + // Set data transfer + event.dataTransfer.setData("text/plain", JSON.stringify(dragData)); + } +} + +export class SohlActor extends Actor { + $speaker; + + get speaker() { + if (!this.$speaker) { + this.$speaker = ChatMessage.getSpeaker({ + token: this.token, + actor: this, + }); + } + return this.$speaker; + } + + /** + * Union of all owned items and virtual items + */ + *allItems() { + for (let it of this.items.values()) yield it; + for (let it of this.system.virtualItems.values()) yield it; + } + + /** @override */ + get itemTypes() { + const types = Object.fromEntries( + game.documentTypes.Item.map((t) => [t, []]), + ); + const ary = IterWrap.create(this.allItems()) + .toArray() + .sort((a, b) => a.sort - b.sort); + const result = ary.reduce((obj, it) => { + obj[it.type].push(it); + return obj; + }, types); + + return result; + } + + get itemSubtypes() { + const result = Object.values(SOHL.sysVer.CONFIG.Item.dataModels).reduce( + (ist, clazz) => { + // Only create a subtype list if there are, in fact, subtypes defined + if (clazz.subTypes) { + ist[clazz.typeName] = Object.fromEntries( + Object.keys(clazz.subTypes).map((key) => [ + key, + { label: clazz.subTypes[key], items: [] }, + ]), + ); + } + return ist; + }, + {}, + ); + + // Load up all subtype lists + const ary = IterWrap.create(this.allItems()) + .toArray() + .sort((a, b) => a.sort - b.sort); + ary.forEach((it) => { + if (it.system instanceof TraitItemData) { + if (it.system.intensity !== "attribute") { + result.trait[it.system.subType].items.push(it); + } + } else if (it.system.subType) { + if (!result[it.type]?.[it.system.subType]) { + console.error( + `Item ${it.id} type ${it.type} has invalid subtype ${it.system.subType}`, + ); + result[it.type][it.system.subType] = { + label: `!!BAD!! ${it.system.subType}`, + items: [], + }; + } + result[it.type][it.system.subType].items.push(it); + } + }); + + return result; + } + + get label() { + return `Actor ${this.name}`; + } + + get sunsign() { + if (!this._sunsign) { + const sunsignTrait = this.getTraitByAbbrev("ss"); + if (!sunsignTrait) { + console.warn(`No Sunsign trait on actor ${this.name}`); + return ""; + } else { + this._sunsign = sunsignTrait.system.textValue; + } + } + return this._sunsign; + } + + /** + * Try several things to determine what the current actor is. These include: (1) if UUID is specified, find + * the actor with that UUID; (2) If there is a combat ongoing, and if the current combatant is owned, then + * select that actor, or (3) if there is a character defined in the user profile, choose that actor. + * + * @param {string} actorUuid + * @returns The SohlActor that was identified. + */ + static getActor(actorUuid = null) { + let actor = null; + + if (actorUuid) { + actor = fromUuidSync(actorUuid); + if (!actor) { + ui.notifications.warn( + `Cannot find actor with UUID ${actorUuid}`, + ); + return null; + } + } else { + // We have to guess which actor to select. + // If in combat, then choose the combatant whose turn it is + actor = game.combat?.combatant?.actor; + if (!actor?.isOwner) { + // If we're not an owner of the current combatant (or we are not in combat), then + // fallback to our "user character" (if defined) + actor = game.user.character; + if (!actor) { + const msg = `Cannot identify a default character; please consider defining your default character in your user profile.`; + console.warn(`sohl.SoHL | ${msg}`); + ui.notifications.warn(msg); + return null; + } + } + } + + return actor; + } + + /** + * Finds the token associated with this actor. If this actor is a synthetic actor, + * then this is trivial. But if this actor is not synthetic, then this method will + * search through the current scene to find the appropriate token associated with this + * actor. + * + * If a token in the current scene is selected, and it is linked to this actor, then it + * is chosen. If no token is selected, then choose one at random (in the best case there + * will only be one linked token anyway). + * + * @returns {Token} the token associated with this actor + */ + getToken() { + // If this is a synthetic actor, then get the token associated with the actor + let token = this.token; + + if (!token && canvas.tokens) { + // Actor is a linked token + // Case 1: A single token is selected, and it is the actor we are looking for + if ( + canvas.tokens.controlled?.length == 1 && + canvas.tokens.controlled[0].actor.id === this.id + ) { + token = canvas.tokens.controlled[0]; + } + + if (!token) { + // Case 2: Search all tokens on the active scene, and select the first + // one found where the token's actor is the one we are looking for + token ||= canvas.scene?.tokens.find( + (t) => t.actor.id === this.id, + ); + } + } + return token; + } + + /** + * Determines the actor to handle a button event, based on who pressed the button. + * Options are the sum of: + * User's character actor. + * If there is an active scene, all of the tokens on the active scene owned by the user. + * All of the global actors which are owned by the user. + * If the result is more than one actor, display a dialog asking the user to select one. + * + * @returns {SohlActor|null} one SohlActor document, or null if none can be found. + */ + static async getHandlerActor() { + const actors = []; + + // If the user has a character defined, add it to the list of actors + if (game.user.character) { + actors.push(game.user.character); + } + + // Find all of the tokens on the canvas, and if the current user has ownership permission, add them to the list. + canvas.tokens.placeables.forEach((token) => { + if (token.actor?.testUserPermission(game.user, "OWNER")) { + if (!actors.some((a) => a.id === token.actor.id)) + actors.push(token.actor); + } + }); + + // Find all of the global actors who the current user has OWNER permission for, and add them to the list. + game.actors.forEach((actor) => { + if (actor.testUserPermission(game.user, "OWNER")) { + if (!actors.some((a) => a.id === actor.id)) actors.push(actor); + } + }); + + if (actors.length === 0) return null; + if (actors.length === 1) return actors[0].value; + + let dlghtml = `
+
+ +
`; + + // Pop up the dialog to get the character selection + const dlgResult = await Dialog.prompt({ + title: "Select Animate Entity", + content: dlghtml.trim(), + label: "OK", + callback: (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formData = foundry.utils.expandObject(fd.object); + const actor = fromUuidSync(formData.entity); + return actor; + }, + rejectClose: false, + options: { jQuery: false }, + }); + + return dlgResult; + } + + static defaultName({ type, parent, pack } = {}) { + const documentName = this.metadata.name; + let collection; + if (parent) collection = parent.getEmbeddedCollection(documentName); + else if (pack) collection = game.packs.get(pack); + else collection = game.collections.get(documentName); + const takenNames = new Set(); + for (const document of collection) takenNames.add(document.name); + const baseName = CONFIG.Actor.typeLabels[type] + ? CONFIG.Actor.typeLabels[type] + : type; + let name = baseName; + let index = 1; + while (takenNames.has(name)) name = `${baseName} (${++index})`; + return name; + } + + static async createDialog( + data = {}, + { parent = null, pack = null, types, ...options } = {}, + ) { + const cls = this.implementation; + + // Identify allowed types + let documentTypes = []; + let defaultType = CONFIG[this.documentName]?.defaultType; + let defaultTypeAllowed = false; + let hasTypes = false; + if (this.TYPES.length > 1) { + if (types?.length === 0) + throw new Error( + "The array of sub-types to restrict to must not be empty", + ); + + // Register supported types + for (const type of this.TYPES) { + if (type === CONST.BASE_DOCUMENT_TYPE) continue; + if (types && !types.includes(type)) continue; + let label = + CONFIG[this.documentName]?.typeLabels?.[type] || type; + documentTypes.push({ value: type, label }); + if (type === defaultType) defaultTypeAllowed = true; + } + if (!documentTypes.length) + throw new Error( + "No document types were permitted to be created", + ); + + if (!defaultTypeAllowed) defaultType = documentTypes[0].value; + // Sort alphabetically + documentTypes.sort((a, b) => + a.label.localeCompare(b.label, game.i18n.lang), + ); + hasTypes = true; + } + + // Identify destination collection + let collection; + if (!parent) { + if (pack) collection = game.packs.get(pack); + else collection = game.collections.get(this.documentName); + } + + // Collect data + const folders = collection?._formatFolderSelectOptions() ?? []; + const label = game.i18n.localize(this.metadata.label); + const title = game.i18n.format("DOCUMENT.Create", { type: label }); + const type = data.type || defaultType; + let userCompendiums = game.settings + .get("sohl", "searchActorCompendiums") + .split(",") + .map((s) => s.trim()); + const defaultAnimateEntity = game.settings.get( + "sohl", + "defaultAnimateEntity", + ); + + const worldActors = game.actors.reduce((ary, actor) => { + if (actor.type === "entity") { + const elem = { + value: actor.uuid, + label: actor.name, + }; + ary.push(elem); + } + return ary; + }, []); + + const userPackActors = ( + await Utility.getDocsFromPacks(userCompendiums, { + documentName: "Actor", + docType: "entity", + }) + ).reduce((ary, actor) => { + const elem = { + value: actor.uuid, + label: actor.name, + }; + ary.push(elem); + return ary; + }, []); + + const sysPackActors = ( + await Utility.getDocsFromPacks( + SOHL.sysVer.CONFIG.Actor.compendiums, + { documentName: "Actor", docType: "entity" }, + ) + ).reduce((ary, actor) => { + const elem = { + value: actor.uuid, + label: actor.name, + }; + ary.push(elem); + return ary; + }, []); + let defaultCloneActor = worldActors.find( + (obj) => obj.label === defaultAnimateEntity, + ); + defaultCloneActor ||= userPackActors.find( + (obj) => obj.label === defaultAnimateEntity, + ); + defaultCloneActor ||= sysPackActors.find( + (obj) => obj.label === defaultAnimateEntity, + ); + const allActors = { + "Default Actors": [{ label: "None", value: "" }], + }; + + if (worldActors.length) { + allActors["World Actors"] = worldActors.sort((a, b) => + a.label.localeCompare(b.label), + ); + } + + if (userPackActors.length) { + allActors["User Compendiums"] = userPackActors.sort((a, b) => + a.label.localeCompare(b.label), + ); + } + + if (sysPackActors.length) { + allActors["System Compendiums"] = sysPackActors.sort((a, b) => + a.label.localeCompare(b.label), + ); + } + + if (defaultCloneActor) { + allActors["Default Actors"].unshift({ + label: defaultCloneActor.label, + value: defaultCloneActor.value, + }); + } + + let content = `
+ +
+ + + +
`; + + // Render the document creation form + const html = await renderTemplate( + "templates/sidebar/document-create.html", + { + name: data.name || "", + defaultName: this.implementation.defaultName({ + type, + parent, + pack, + }), + hasTypes: this.hasTypeData, + types: documentTypes, + type, + hasFolders: folders.length > 1, + folders, + folder: data.folder, + content, + }, + ); + + // Render the confirmation dialog window + return Dialog.prompt({ + title, + content: html, + label: title, + render: (html) => { + if (!hasTypes) return; + const doc = html[0]; + doc.querySelector('[name="rollattrs"]').addEventListener( + "change", + (e) => { + const rollFormula = doc.querySelector( + '[name="rollformula"]', + ); + if (e.target.value === "custom") { + rollFormula.placeholder = "e.g. 4d6kh3"; + rollFormula.disabled = false; + } else { + rollFormula.placeholder = ""; + rollFormula.disabled = true; + } + }, + ); + doc.querySelector('[name="type"]').addEventListener( + "change", + (e) => { + const nameInput = doc.querySelector('[name="name"]'); + nameInput.placeholder = cls.defaultName({ + type: e.target.value, + parent, + pack, + }); + const isAnimateEntity = e.target.value === "entity"; + if (isAnimateEntity) { + doc.querySelector("#cloneActor").style.visibility = + "visible"; + doc.querySelector("#randomattrs").style.visibility = + "visible"; + } else { + doc.querySelector("#cloneActor").style.visibility = + "hidden"; + doc.querySelector("#randomattrs").style.visibility = + "hidden"; + } + }, + ); + }, + callback: (html) => { + const form = html[0].querySelector("form"); + const fd = new FormDataExtended(form); + data.name = fd.object.name; + data.type = fd.object.type; + data.folder = fd.object.folder; + const cloneActorUuid = fd.object.cloneActor; + const rollAttrs = fd.object.rollattrs; + const rollFormula = + rollAttrs === "custom" ? fd.object.rollformula : rollAttrs; + if (!data.folder) delete data["folder"]; + if (documentTypes.length === 1) data.type = documentTypes[0]; + if (!data.name?.trim()) + data.name = cls.defaultName({ + type: data.type, + parent, + pack, + }); + return this.create(data, { + parent, + pack, + renderSheet: true, + cloneActorUuid, + rollFormula, + }); + }, + rejectClose: false, + options, + }); + } + + /** @override */ + async _preCreate(createData, options, user) { + const allowed = await super._preCreate(createData, options, user); + if (allowed === false) return false; + + const similarActorExists = + !this.pack && + game.actors.some( + (actor) => + actor.type === createData.type && + actor.name === createData.name, + ); + if (similarActorExists) { + ui.notifications.warn( + `An ${SohlItemTypeLabels[createData.type]} with identical name ("${createData.name}") already exists, cannot create.`, + ); + return false; + } + + // If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic + if (options.skipDefaults || createData.items) return; + + let updateData = {}; + + if (options.cloneActorUuid) { + const cloneActor = await fromUuid(options.cloneActorUuid); + if (cloneActor) { + let newData = cloneActor.toObject(); + delete newData._id; + delete newData.folder; + delete newData.sort; + delete newData.pack; + if ("ownership" in newData) { + newData.ownership = { + default: CONST.DOCUMENT_OWNERSHIP_LEVELS.NONE, + [game.user.id]: CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER, + }; + } + + updateData = foundry.utils.mergeObject(newData, createData); + } + } + + const artwork = this.constructor.getDefaultArtwork(this.toObject()); + updateData["img"] ||= artwork.img; + updateData["prototypeToken.texture.src"] ||= artwork.texture.src; + + // If a rollFormula is provided, then we will perform the designated rolling + // for all attributes, and then for all skills we will calculate the initial + // mastery level based on those attributes. + if (options.rollFormula) { + for (const obj of updateData.items) { + if ( + options.rollFormula && + obj.type === "trait" && + obj.system.intensity === "attribute" + ) { + const rollFormula = + (options.rollFormula === "default" + ? obj.flags?.sohl?.diceFormula + : options.rollFormula) || "0"; + + let roll = await Roll.create(rollFormula).evaluate(); + if (!roll) { + ui.notifications.error( + `Roll formula "${rollFormula}" is invalid`, + ); + return false; + } + obj.system.textValue = roll.total.toString(); + } + } + + // Calculate initial skills mastery levels + for (const obj of updateData.items) { + if (obj.type === "skill") { + if (obj.flags?.sohl?.legendary?.initSkillMult) { + const sb = new SkillBase(obj.system.skillBaseFormula, { + items: updateData.items, + }); + obj.system.masteryLevelBase = + sb.value * obj.flags.sohl.legendary.initSkillMult; + } + } + } + } + + this.updateSource(updateData); + + return true; + } + + _onCreate(data, options, userId) { + super._onCreate(data, options, userId); + this.updateEffectsOrigin(); + } + + _onSortItem(event, itemData) { + // Get the drag source and drop target + const source = IterWrap.create(this.allItems()).find( + (it) => it.id === itemData._id, + ); + const dropTarget = event.target.closest("[data-item-id]"); + if (!dropTarget) return; + const target = IterWrap.create(this.allItems()).find( + (it) => it.id === dropTarget.dataset.itemId, + ); + + // Don't sort on yourself + if (source.id === target.id) return; + + // Identify sibling items based on adjacent HTML elements + const siblings = []; + for (let el of dropTarget.parentElement.children) { + const siblingId = el.dataset.itemId; + if (siblingId && siblingId !== source.id) + siblings.push( + IterWrap.create(this.allItems()).find( + (it) => it.id === el.dataset.itemId, + ), + ); + } + + // Perform the sort + const sortUpdates = SortingHelpers.performIntegerSort(source, { + target, + siblings, + }); + + sortUpdates.forEach((u) => { + const update = u.update; + const item = this.getItem(u.target._id); + item.update(update); + }); + } + + prepareEmbeddedDocuments() { + // The Actor#prepareEmbeddedDocuments method performs Active Effect processing after + // preparing the embedded documents, but we don't want that. So we fully override to + // put back in the basic implementation from ClientDocument. + for (const collectionName of Object.keys( + this.constructor.hierarchy || {}, + )) { + for (let e of this.getEmbeddedCollection(collectionName)) { + e._safePrepareData(); + } + } + + // At this point, the virtual items list is empty. We now go through + // all of the "owned" items and request them to setup any virtual items they need. + // Any of those items that setup virtual items will have "setupVirtualItems" called + // when they are added to the Virtual Items list. + for (const it of this.allItems()) { + it.system.execute("Setup Virtual Items", { inPrepareData: true }); + if (it instanceof GearItemData) { + Hooks.callAll(`gearSetupVirtualItems`, it.system); + } + Hooks.callAll(`${it.type}SetupVirtualItems`, it.system); + } + + // Apply item active effects + IterWrap.create(this.allItems()).forEach((it) => { + it.applyActiveEffects(); + }); + + // Apply actor active effects + this.applyActiveEffects(); + + // Process any item activities that require access to sibling items + // Prior to this point accessing item siblings is unsafe + for (const it of this.allItems()) { + it.system.execute("Process Siblings", { inPrepareData: true }); + if (it instanceof GearItemData) { + Hooks.callAll(`gearProcessSiblings`, it.system); + } + Hooks.callAll(`${it.type}ProcessSiblings`, it.system); + } + } + + prepareDerivedData() { + super.prepareDerivedData(); + + // Perform final processing of all items after the actor's + // derived data has all been completed. + for (const it of this.allItems()) { + it.system.execute("Post-Process", { inPrepareData: true }); + if (it instanceof GearItemData) { + Hooks.callAll(`gearPostProcess`, it.system); + } + Hooks.callAll(`${it.type}PostProcess`, it.system); + } + } + + async updateEffectsOrigin() { + // If we are in a compendium, do nothing + if (this.pack) return; + + const actorUpdate = this.effects.reduce((toUpdate, e) => { + if (e.origin !== this.uuid) { + return toUpdate.concat({ _id: e.id, origin: this.uuid }); + } + return toUpdate; + }, []); + if (actorUpdate.length) { + await this.updateEmbeddedDocuments("ActiveEffect", actorUpdate); + } + + for (const it of this.items) { + const toUpdate = it.updateEffectsOrigin(); + if (toUpdate.length) { + await it.updateEmbeddedDocuments("ActiveEffect", toUpdate); + } + } + + this.system.virtualItems.forEach((it) => { + const toUpdate = it.updateEffectsOrigin(); + while (toUpdate.length) { + const eChange = toUpdate.pop(); + const effect = it.effects.get(eChange._id); + if (effect) { + effect.update({ origin: eChange.origin }); + } + } + }); + } + + /** + * + * @param {string} name Name of combat skill to find + * @returns {MasteryLevelModifier} clone of MasteryLevelModifier of combat skill + */ + getCombatStat(name) { + const combatSkill = this.itemTypes[SkillItemData.typeName].find( + (it) => it.system.type === "Combat" && it.name === name, + ); + if (combatSkill) { + return combatSkill.system.$masteryLevel; + } else { + return new MasteryLevelModifier(this.system).set( + `No ${name} Combat Skill`, + "NoSkill", + 0, + ); + } + } + + /** + * Get a reference to the trait item on the actor. + * + * @param {string} abbrev Abbreviation of trait Item to find + * @returns {SohlItem} SohlItem of the trait. + */ + getTraitByAbbrev(abbrev) { + const result = IterWrap.create(this.allItems()).find( + (it) => + it.system instanceof TraitItemData && + it.system.abbrev === abbrev, + ); + return result; + } + + /** + * Get a reference to the trait item on the actor. + * + * @param {string} abbrev Abbreviation of trait Item to find + * @returns {SohlItem} SohlItem of the trait. + */ + getSkillByAbbrev(abbrev) { + const result = IterWrap.create(this.allItems()).find( + (it) => + it.system instanceof SkillItemData && + it.system.abbrev === abbrev, + ); + return result; + } + + /** + * Finds an Item by name or UUID. If name is provided, searches within the specified actor. + * + * @param {String} itemName Either an item id, an item UUID, or an item name + * @param {String} type The type of Item (e.g., "weapongear") + */ + getItem(itemName, { types = [] } = {}) { + if (!itemName) { + throw new Error(`Must specify a name, id, or UUID`); + } + + const typeNames = + types + .map((t) => SOHL.sysVer.CONFIG.Item.typeLabels[t]) + .join(" or ") || "item"; + + let item = null; + if (itemName.includes(".")) { + // The name may be a UUID since it contains a dot + item = fromUuidSync(itemName); + if ( + item && + !(item instanceof SohlItem && item.actor.id === this.id) + ) { + throw new Error( + `${itemName} does not refer to an item in actor ${this.name}`, + ); + } + } + + if (!item) { + // Not an item UUID, so we assume it must be an item id or name. + + let items = []; + if (types?.length) { + // Type(s) have been specified, so we can use these as a hint as to where to look + // for the items. + IterWrap.create(this.allItems()).forEach((it) => { + if (types.includes(it.type) && it.name === itemName) { + items.push(it); + } + }); + } else { + // No types have been specified, so our only option is to assume it is an item ID and look for that + for (let candidate of this.allItems()) { + if (candidate.id === itemName) { + items = [candidate]; + break; + } + } + } + + if (items.length > 1) { + ui.notifications.warn( + `Actor ${ + this.token?.name || this.name + } has more than one ${typeNames} with name ${itemName}. The first matched item will be chosen.`, + ); + } else if (items.length === 0) { + ui.notifications.warn( + `Actor ${ + this.token?.name || this.name + } does not have an ${typeNames} named ${itemName}`, + ); + return null; + } + + // Filter returns potentially multiple matches; so just choose the + // first one as the result (there really should be only one result + // anyway, or the name is ambiguous). + item = items[0]; + } + + if (!item || (types.length && !types.includes(item.type))) { + ui.notifications.warn( + `Actor ${ + this.token?.name || this.name + } does not have an ${typeNames} named ${itemName}`, + ); + return null; + } + + return item; + } + + isValidItem(item, types = []) { + if (!(item?.system instanceof SohlItemData)) { + throw new Error(`Provided object is not a valid Item`); + } + + if (!types.includes(item.type)) { + throw new Error( + `Item ${item.system.typeLabel.singular} must be one of "${types + .map((t) => SOHL.sysVer.CONFIG.Item.typeLabels[t]) + .join(", ")}" but type is ${ + SOHL.sysVer.CONFIG.Item.typeLabels[item.type] + }`, + ); + } + } + + /** + * Gathers all effects from all items that are targeting the Actor and returns them as an array. + * + * @readonly + * @type {*} + */ + get transferredEffects() { + // Gather all of the effects from all items that are targeting the Actor + const transferredEffects = IterWrap.create(this.allItems()).reduce( + (effects, it) => { + const actorEffects = it.effects.filter( + (e) => e.system.targetType === "actor", + ); + return effects.concat(actorEffects); + }, + [], + ); + + return transferredEffects; + } + + *allApplicableEffects() { + // Grab all of the effects on this actor that affect this actor + const effects = this.effects.filter( + (e) => e.system.targetType === "this", + ); + for (const effect of effects) { + yield effect; + } + + // Add all of the transferred effects from the items that affect this actor + for (const effect of this.transferredEffects) { + yield effect; + } + } + + /** + * Apply all active effects to the actor, including special statuses, effects from items, and transferred effects. Update overrides and special statuses for the actor and its items accordingly. + */ + applyActiveEffects() { + const overrides = { + [this.id]: {}, + }; + + this.statuses ??= new Set(); + + // Identify which special statuses had been active + const specialStatuses = new Map(); + for (const statusId of Object.values(CONFIG.specialStatusEffects)) { + specialStatuses.set(statusId, this.statuses.has(statusId)); + } + this.statuses.clear(); + + // Organize non-disabled effects by their application priority + const changes = []; + for (const effect of this.allApplicableEffects()) { + if (!effect.active) continue; + const targets = effect.targets; + if (!targets.length) continue; + changes.push( + ...effect.changes.map((change) => { + const c = foundry.utils.deepClone(change); + c.targets = targets; + c.effect = effect; + c.priority = c.priority ?? c.mode * 10; + return c; + }), + ); + for (const statusId of effect.statuses) this.statuses.add(statusId); + } + changes.sort((a, b) => a.priority - b.priority); + + // Apply all changes + for (let change of changes) { + if (!change.key) continue; + if (!change.targets?.length) continue; + change.targets.forEach((t) => { + const changes = change.effect.apply(t, change); + if (Object.keys(changes).length) { + if (typeof overrides[t.id] === "object") + foundry.utils.mergeObject(overrides[t.id], changes); + else overrides[t.id] = changes; + } + }); + } + + // Expand the set of final overrides + this.overrides = foundry.utils.expandObject(overrides[this.id]); + IterWrap.create(this.allItems()).forEach((it) => { + if (overrides[it.id]) + it.overrides = foundry.utils.expandObject(overrides[it.id]); + }); + + // Apply special statuses that changed to active tokens + let tokens; + for (const [statusId, wasActive] of specialStatuses) { + const isActive = this.statuses.has(statusId); + if (isActive === wasActive) continue; + tokens ??= this.getActiveTokens(); + for (const token of tokens) + token._onApplyStatusEffect(statusId, isActive); + } + } + + /** + * Executes the checkAndExecute method for EventItemData instances in the allItems array and checks and disables expired effects for each item in the allItems array as well as the effects array. + */ + timeChangeWork() { + IterWrap.create(this.allItems()).forEach((it) => { + if (it.system instanceof EventItemData) it.checkAndExecute(); + it.effects.forEach((effect) => effect.checkExpiredAndDisable()); + }); + this.effects.forEach((effect) => effect.checkExpiredAndDisable()); + } + + /** + * Add all of the items from a pack with the specified names to this actor + * @param {String[]} itemNames Array of item names to include + * @param {String} packName Name of compendium pack containing items + * @param {Object[]} items array of ItemData elements to populate + */ + static async _addItemsFromPack( + itemNames, + packNames, + { itemType, keepId } = {}, + ) { + let itNames = foundry.utils.deepClone(itemNames); + const itemAry = []; + for (let itName of itNames) { + const data = await Utility.getItemFromPacks(itName, packNames, { + itemType, + keepId, + }); + if (data) itemAry.push(data); + } + + return itemAry; + } + + // biome-ignore lint/correctness/noUnusedVariables: + static async fromDropData(data, options = {}) { + let document = null; + + // Case 1 - Data explicitly provided + if (data.data) document = new this(data.data); + // Case 2 - UUID provided + else if (data.uuid) document = await fromUuid(data.uuid); + + // Ensure that we retrieved a valid document + if (!document) { + throw new Error( + "Failed to resolve Document from provided DragData. Either data or a UUID must be provided.", + ); + } + if (document.documentName !== this.documentName) { + throw new Error( + `Invalid Document type '${document.type}' provided to ${this.name}.fromDropData.`, + ); + } + + // Flag the source UUID + if (document.id && !document._stats?.compendiumSource) { + let uuid = document.uuid.split("#").at(0); + document.updateSource({ "_stats.compendiumSource": uuid }); + } + return document; + } +} + +function SohlSheetMixin(Base) { + return class SohlSheet extends Base { + /** @override */ + static get defaultOptions() { + return foundry.utils.mergeObject(super.defaultOptions, { + tabs: [ + { + navSelector: ".sheet-tabs", + contentSelector: ".sheet-body", + initial: "properties", + }, + ], + dragDrop: [ + { dragSelector: ".item-list .item", dropSelector: null }, + ], + }); + } + + get template() { + return this.document.system.constructor.sheet; + } + + getData() { + const data = super.getData(); + data.const = SOHL.sysVer.CONST; + data.config = SOHL.sysVer.CONFIG; + data.owner = this.document.isOwner; + data.limited = this.document.limited; + data.options = this.options; + data.editable = this.isEditable; + data.cssClass = data.owner ? "editable" : "locked"; + data.isAnimateEntity = + this.document.system instanceof AnimateEntityActorData; + data.isInanimateObject = + this.document.system instanceof InanimateObjectActorData; + data.actor = + this.document instanceof SohlActor + ? this.document + : this.document.actor; + data.flags = this.document.flags; + data.system = this.document.system; + data.isGM = game.user.isGM; + data.fields = this.document.system.schema.fields; + + data.effects = this.document.effects; + + // Collect all effects from other Items/Actors that are affecting this item + data.transferredEffects = {}; + this.document.transferredEffects.forEach((effect) => { + if (!effect.disabled) { + data.transferredEffects[effect.id] = effect; + } + }); + + return data; + } + + /** @override */ + // biome-ignore lint/correctness/noUnusedVariables: + _onSearchFilter(event, query, rgx, html) { + if (!html) return; + const visibleCategories = new Set(); + + for (const entry of html.querySelectorAll(".item")) { + if (!query) { + entry.classList.remove("hidden"); + continue; + } + + const name = entry.dataset.itemName; + const match = name && rgx.test(SearchFilter.cleanQuery(name)); + entry.classList.toggle("hidden", !match); + if (match) + visibleCategories.add( + entry.parentElement.parentElement.dataset.category, + ); + } + + for (const category of html.querySelectorAll(".category")) { + category.classList.toggle( + "hidden", + query && !visibleCategories.has(category.dataset.category), + ); + } + } + + _contextMenu(html) { + new SohlContextMenu(html, ".item", [], { + onOpen: this._onItemContextMenuOpen.bind(this), + }); + new SohlContextMenu(html, ".item-contextmenu", [], { + eventName: "click", + onOpen: this._onItemContextMenuOpen.bind(this), + }); + new SohlContextMenu(html, ".effect", [], { + onOpen: this._onEffectContextMenuOpen.bind(this), + }); + new SohlContextMenu(html, ".effect-contextmenu", [], { + eventName: "click", + onOpen: this._onEffectContextMenuOpen.bind(this), + }); + } + + _onItemContextMenuOpen(element) { + let ele = element.closest("[data-item-id]"); + if (!ele) return; + ele = ele instanceof HTMLElement ? ele : ele[0]; + const actionName = ele?.dataset.actionName; + const docId = ele?.dataset.itemId; + let doc; + if (actionName) { + doc = this.document.system.actions.get(docId); + } else { + doc = + this.document instanceof SohlItem + ? this.document.getNestedItemById(docId) + : this.document instanceof SohlActor + ? this.document.getItem(docId) + : null; + } + ui.context.menuItems = doc + ? this.constructor._getContextOptions(doc) + : []; + } + + _onEffectContextMenuOpen(element) { + let ele = element.closest("[data-effect-id]"); + if (!ele) return; + ele = ele instanceof HTMLElement ? ele : ele[0]; + const effectId = ele?.dataset.effectId; + const effect = this.document.effects.get(effectId); + ui.context.menuItems = effect + ? this.constructor._getContextOptions(effect) + : []; + } + + /** + * Retrieve the context options for the given item. Sort the menu items based on groups, with items having no group at the top, items in the 'primary' group in the middle, and items in the 'secondary' group at the bottom. + * + * @static + * @param {*} doc + * @returns {*} + */ + static _getContextOptions(doc) { + const result = + doc.system instanceof SohlBaseData + ? doc.system._getContextOptions() + : doc._getContextOptions(); + + // Sort the menu items according to group. Expect items with no group + // at the top, items in the "primary" group next, and items in the + // "secondary" group last. + const collator = new Intl.Collator("en-US"); + result.sort(collator.compare); + return result; + } + + async _onEffectToggle(event) { + const li = event.currentTarget.closest(".effect"); + const effect = this.document.effects.get(li.dataset.effectId); + return await effect.toggleEnabledState(); + } + + async _onEffectCreate() { + const dlgTemplate = + "systems/sohl/templates/dialog/active-effect-start.html"; + const dialogData = { + gameTime: game.time.worldTime, + }; + if (SOHL.hasSimpleCalendar) { + const ct = SimpleCalendar.api.timestampToDate( + dialogData.gameTime, + ); + dialogData.gameTime = `${ct.display.day} ${ct.display.monthName} ${ct.display.yearPrefix}${ct.display.year}${ct.display.yearPostfix} ${ct.display.time}`; + } + + if (game.combat) { + dialogData.combatId = game.combat.id; + dialogData.combatRound = game.combat.round; + dialogData.combatTurn = game.combat.turn; + } + const html = await renderTemplate(dlgTemplate, dialogData); + + // Create the dialog window + return await Dialog.prompt({ + title: "Create Event", + content: html, + label: "OK", + render: (html) => { + const worldTime = html.querySelector("#worldTime"); + const combatTime = html.querySelector("#combatTime"); + + html.querySelector("[name='startType']").addEventListener( + "click", + (ev) => { + if (ev.currentTarget.value === "worldTime") { + worldTime.style.visibility = "visible"; + combatTime.style.visibility = "hidden"; + } else { + worldTime.style.visibility = "hidden"; + combatTime.style.visibility = "visible"; + } + }, + ); + html.querySelector(".alter-time").addEventListener( + "click", + (ev) => { + let time = Number.parseInt( + ev.currentTarget.dataset.time, + 10, + ); + if (Number.isNaN(time)) time = game.time.worldTime; + Utility.onAlterTime(time).then((result) => { + if (result !== null) { + const updateData = { + "duration.startTime": result, + }; + this.object.update(updateData); + } + }); + }, + ); + }, + callback: async (html) => { + const form = html.querySelector("#active-effect-start"); + const fd = new FormDataExtended(form); + const formdata = fd.object; + const startType = formdata.startType; + const formStartTime = + Number.parseInt(formdata.startTime, 10) || + game.time.worldTime; + const formDuration = + Number.parseInt(formdata.duration, 10) || 1; + const formCombatRound = + Number.parseInt(formdata.combatRound, 10) || + dialogData.combatRound; + const formCombatTurn = + Number.parseInt(formdata.combatTurn, 10) || + dialogData.combatTurn; + const formCombatDurationRounds = + Number.parseInt(formdata.combatDurationRounds, 10) || 1; + const formCombatDurationTurns = + Number.parseInt(formdata.combatDurationTurns, 10) || 0; + const aeData = { + name: "New Effect", + type: SohlActiveEffectData.typeName, + icon: SohlActiveEffectData.defaultImage, + origin: this.document.uuid, + "system.targetName": formdata.targetName, + "system.targetType": formdata.targetType, + }; + if (startType === "worldTime") { + aeData["duration.startTime"] = formStartTime; + aeData["duration.seconds"] = formDuration; + } else if (startType === "combatTime") { + aeData["duration.combat"] = dialogData.combatId; + aeData["duration.startRound"] = formCombatRound; + aeData["duration.startTurn"] = formCombatTurn; + aeData["duration.rounds"] = formCombatDurationRounds; + aeData["duration.turns"] = formCombatDurationTurns; + } + return SohlActiveEffect.create(aeData, { + parent: this.document, + }); + }, + rejectClose: false, + options: { jQuery: false }, + }); + } + + /** @inheritdoc */ + _onDragStart(event) { + const li = event.currentTarget; + if ("link" in event.target.dataset) return; + + // Create drag data + let dragData; + + // Owned Items + if (li.dataset.uuid) { + const item = fromUuidSync(li.dataset.uuid); + dragData = item.toDragData(); + } + + // Active Effect + else if (li.dataset.effectId) { + const effect = this.actor.effects.get(li.dataset.effectId); + dragData = effect.toDragData(); + } + + // Action + else if (li.dataset.actionName) { + const action = this.actor.system.actions.getName( + li.dataset.actionName, + ); + dragData = action.toDragData(); + } + + if (!dragData) return; + + // Set data transfer + event.dataTransfer.setData("text/plain", JSON.stringify(dragData)); + } + + /** @override */ + async _onDropItem(event, data) { + if (!this.document.isOwner) return false; + + const droppedItem = await SohlItem.fromDropData(data); + if (!droppedItem) return false; + + if (droppedItem.system instanceof GearItemData) { + const destContainerId = event.target.closest( + "[data-container-id]", + )?.dataset.containerId; + + // If no other container is specified, use this item + let destContainer; + if (this.document instanceof SohlItem) { + destContainer = !destContainerId + ? this.document + : this.document.actor?.items.get(destContainerId) || + this.document.getNestedItemById(destContainerId) || + this.document; + } else { + destContainer = !destContainerId + ? this.document + : this.document.items.get(destContainerId); + } + + return await this._onDropGearItem( + event, + droppedItem, + destContainer, + ); + } else { + // Dropped item is not gear + if ( + droppedItem.nestedIn?.id === this.document.id || + droppedItem.parent?.id === this.document.id + ) { + // Sort items + return this.document._onSortItem( + event, + droppedItem.toObject(), + ); + } else { + if (this.document instanceof SohlActor) { + const newItem = await SohlItem.create( + droppedItem.toObject(), + { + parent: this.document, + }, + ); + if (!droppedItem.fromCompendiumOrWorld) { + await droppedItem.delete(); + } + return newItem; + } else { + // Nest the dropped item into this item + return await droppedItem.nestIn(this.document, { + droppedItem, + destructive: !droppedItem.fromCompendiumOrWorld, + }); + } + } + } + } + + /** @override */ + async _onDropItemCreate(data, event) { + if (!this.document.isOwner) return false; + + const isActor = this.document instanceof SohlActor; + const items = isActor + ? this.document.items + : this.document.system.items; + + const itemList = data instanceof Array ? data : [data]; + const toCreate = []; + for (let itemData of itemList) { + // Body items cannot be placed directly on actor; these must always be + // in an Anatomy object instead + if (isActor && itemData.type.startsWith("body")) { + ui.notifications.warn( + `You may not drop a ${ + SOHL.sysVer.CONFIG.Item.typeLabels[itemData.type] + } onto an Actor`, + ); + return false; + } + + // Determine if a similar item exists + let similarItem; + if (isActor && itemData.type === AnatomyItemData.typeName) { + // Only one Anatomy item is allowed to be on an actor at any time, + // so any existing one will be considered "similar". + similarItem = items.find( + (it) => it.type === AnatomyItemData.typeName, + ); + } + + if (!similarItem) { + similarItem = items.find( + (it) => + it.name === itemData.name && + it.type === itemData.type && + it.system.subType === itemData.system.subType, + ); + } + + if (similarItem) { + const confirm = await Dialog.confirm({ + title: `Confirm Overwrite: ${similarItem.label}`, + content: `

Are You Sure?

This item will be overwritten and cannot be recovered.

`, + options: { jQuery: false }, + }); + if (confirm) { + delete itemData._id; + delete itemData.pack; + let result = await similarItem.delete(); + if (result) { + result = await this.document.constructor.create( + itemData, + { + parent: isActor + ? this.document + : this.document.actor, + clean: true, + }, + ); + } else { + ui.notifications.warn("Overwrite failed"); + continue; + } + toCreate.push(itemData); + } + } else { + toCreate.push(itemData); + } + } + + return super._onDropItemCreate(toCreate, event); + } + + async _onDropGearItem(event, droppedItem, destContainer) { + if ( + (destContainer instanceof SohlItem && + destContainer.id === droppedItem.nestedIn?.id) || + (destContainer instanceof SohlActor && + destContainer.id === droppedItem.parent?.id) + ) { + // If dropped item is already in a container and + // source and dest containers are the same, + // then we are simply rearranging + return await destContainer._onSortItem( + event, + droppedItem.toObject(), + ); + } + + if (droppedItem.id === destContainer.id) { + // Prohibit moving a container into itself + ui.notifications.warn("Can't move a container into itself"); + return false; + } + + const items = + destContainer instanceof SohlItem + ? destContainer.system.items + : destContainer.items; + const similarItem = items.find( + (it) => + droppedItem.id === it.id || + (droppedItem.name === it.name && + droppedItem.type === it.type), + ); + + if (similarItem) { + ui.notifications.error( + `Similar item exists in ${destContainer.name}`, + ); + return false; + } + + let quantity = droppedItem.system.quantity; + if (quantity > 1 && !droppedItem.parent) { + // Ask how many to move + quantity = await Utility.moveQtyDialog( + droppedItem, + destContainer, + ); + } + + return await droppedItem.nestIn(destContainer, { + quantity, + destructive: true, + }); + } + + async _addPrimitiveSetItem(event) { + const dataset = event.currentTarget.dataset; + let newSet = foundry.utils.getProperty( + this.document, + dataset.array, + ); + let defaultValue = dataset.defaultValue; + const datatype = dataset.dtype; + const choices = dataset.choices; + if (["Number", "String"].includes(dataset.dtype)) { + if (dataset.dtype === "Number") + defaultValue = Number.parseFloat(defaultValue) || 0; + const dialogData = { + valueName: dataset.title, + newValue: defaultValue, + choices, + }; + + const compiled = Handlebars.compile(`
+
+ + {{#if choices}} + + {{else}} + + {{/if}} +
+
`); + const html = compiled(dialogData, { + allowProtoMethodsByDefault: true, + allowProtoPropertiesByDefault: true, + }); + + const dlgResult = await Dialog.prompt({ + title: dataset.title, + content: html.trim(), + label: `Add ${dataset.title}`, + callback: (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formData = foundry.utils.expandObject(fd.object); + let formValue = formData.newValue; + if (datatype === "Number") { + formValue = Number.parseFloat(formValue); + if (Number.isNaN(formValue)) + formValue = dataset.defaultValue; + } + return formValue; + }, + rejectClose: false, + options: { jQuery: false }, + }); + + // if dialog was closed, do nothing + if (!dlgResult) return null; + + if (!newSet.has(dlgResult)) { + newSet.set(dlgResult); + const updateData = { [dataset.array]: newSet }; + const result = await this.item.update(updateData); + if (result) this.render(); + } + } + } + + async _addAimArrayItem(event) { + const dataset = event.currentTarget.dataset; + let array = foundry.utils + .getProperty(this.document, dataset.array) + .concat(); + const compiled = Handlebars.compile(`
+
+
+ + +
+ + {{numberInput 0 name="probWeightBase" min=0 step=1}} +
`); + const html = compiled( + {}, + { + allowProtoMethodsByDefault: true, + allowProtoPropertiesByDefault: true, + }, + ); + + const dlgResult = await Dialog.prompt({ + title: dataset.title, + content: html.trim(), + label: `Add ${dataset.title}`, + callback: (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formData = foundry.utils.expandObject(fd.object); + const result = { + name: formData.name, + probWeightBase: + Number.parseInt(formData.probWeightBase, 10) || 0, + }; + return result; + }, + rejectClose: false, + options: { jQuery: false }, + }); + + // if dialog was closed, do nothing + if (!dlgResult) return null; + + if (array.some((a) => a.name === dlgResult.name)) { + ui.notifications.warn( + `Aim with name "${dlgResult.name} already exists, ignoring`, + ); + return null; + } + + array.push(dlgResult); + const updateData = { [dataset.array]: array }; + const result = await this.item.update(updateData); + return result; + } + + async _addValueDescArrayItem(event) { + const dataset = event.currentTarget.dataset; + let array = foundry.utils + .getProperty(this.document, dataset.array) + .concat(); + const compiled = Handlebars.compile(`
+
+
+ + +
+ + {{numberInput 0 name="maxValue" min=0 step=1}} +
`); + const html = compiled( + {}, + { + allowProtoMethodsByDefault: true, + allowProtoPropertiesByDefault: true, + }, + ); + + const dlgResult = await Dialog.prompt({ + title: dataset.title, + content: html.trim(), + label: `Add ${dataset.title}`, + callback: (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formData = foundry.utils.expandObject(fd.object); + const result = { + label: formData.label, + maxValue: Number.parseInt(formData.maxValue, 10) || 0, + }; + return result; + }, + rejectClose: false, + options: { jQuery: false }, + }); + + // if dialog was closed, do nothing + if (!dlgResult) return null; + + if (array.some((a) => a.label === dlgResult.label)) { + ui.notifications.warn( + `Aim with name "${dlgResult.name} already exists, ignoring`, + ); + return null; + } + + array.push(dlgResult); + array.sort((a, b) => a.maxValue - b.maxValue); + const updateData = { [dataset.array]: array }; + const result = await this.item.update(updateData); + if (result) this.render(); + return result; + } + + async _addArrayItem(event) { + const dataset = event.currentTarget.dataset; + await this._onSubmit(event); // Submit any unsaved changes + + let result; + if (["Number", "String"].includes(dataset.dtype)) { + result = await this._addPrimitiveSetItem(event); + } else if (dataset.objectType === "Aim") { + result = await this._addAimArrayItem(event); + } else if (dataset.objectType === "ValueDesc") { + result = await this._valueDescArrayItem(event); + } + if (result) this.render(); + return result; + } + + async _deleteArrayItem(event) { + const dataset = event.currentTarget.dataset; + if (!dataset.array) return null; + await this._onSubmit(event); // Submit any unsaved changes + let collection = foundry.utils.getProperty( + this.document, + dataset.array, + ); + if (collection instanceof Collection) { + collection.delete(dataset.value); + } else { + collection = collection.filter((a) => a !== dataset.value); + } + const result = await this.document.update({ + [dataset.array]: collection, + }); + if (result) this.render(); + return result; + } + + async _addObjectKey(event) { + const dataset = event.currentTarget.dataset; + + await this._onSubmit(event); // Submit any unsaved changes + + let object = foundry.utils.getProperty( + this.document, + dataset.object, + ); + + const dialogData = { + newKey: "", + newValue: "", + }; + + let dlgTemplate = + "systems/sohl/templates/dialog/keyvalue-dialog.html"; + const html = await renderTemplate(dlgTemplate, dialogData); + + const dlgResult = await Dialog.prompt({ + title: dataset.title, + content: html.trim(), + label: `Add ${dataset.title}`, + callback: (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formData = foundry.utils.expandObject(fd.object); + let formKey = formData.newKey; + let formValue = formData.newValue; + let value = Number.parseFloat(formValue); + if (Number.isNaN(value)) { + if (formValue === "true") value = true; + else if (formValue === "false") value = false; + else if (formValue === "null") value = null; + else value = formValue; + } + return { key: formKey, value: value }; + }, + rejectClose: false, + options: { jQuery: false }, + }); + + // if dialog was closed, or key is empty, do nothing + if (!dlgResult || !dlgResult.key) return null; + + object[dlgResult.key] = dlgResult.value; + const updateData = { [dataset.object]: object }; + const result = await this.item.update(updateData); + if (result) this.render(); + return result; + } + + /** + * Asynchronously deletes a key from an object. Retrieves the dataset from the current event, submits any unsaved changes, gets the object using the dataset, deletes the specified key from the object, and updates the list on the server with the modified object. + * + * @async + * @param {*} event + * @returns {unknown} + */ + async _deleteObjectKey(event) { + const dataset = event.currentTarget.dataset; + await this._onSubmit(event); // Submit any unsaved changes + // Update the list on the server + const result = await this.item.update({ + [dataset.object]: { + [`-=${dataset.key}`]: null, + }, + }); + + if (result) { + this.render(); + } + return result; + } + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Ensure all text is selected when entering text input field + html.on("click", "input[type='text']", (ev) => { + if (!ev.currentTarget.dataset?.type) ev.currentTarget.select(); + }); + + html.find(".effect-create").click(this._onEffectCreate.bind(this)); + + html.find(".effect-toggle").click(this._onEffectToggle.bind(this)); + + html.find(".alter-time").click((ev) => { + const property = ev.currentTarget.dataset.property; + let time = Number.parseInt(ev.currentTarget.dataset.time, 10); + if (Number.isNaN(time)) time = 0; + Utility.onAlterTime(time).then((result) => { + if (result !== null) { + const updateData = { [property]: result }; + this.item.update(updateData); + } + }); + }); + + // Add/delete Object Key + html.find(".add-array-item").click(this._addArrayItem.bind(this)); + html.find(".delete-array-item").click( + this._deleteArrayItem.bind(this), + ); + + // Add/delete Object Key + html.find(".add-object-key").click(this._addObjectKey.bind(this)); + html.find(".delete-object-key").click( + this._deleteObjectKey.bind(this), + ); + + // // Active Effect management + // html.find(".effect-control").click((ev) => + // SohlActiveEffect.onManageActiveEffect(ev, this.document), + // ); + + // html.find(".action-create").click((ev) => { + // return Utility.createAction(ev, this.document); + // }); + + // html.find(".action-execute").click((ev) => { + // const li = ev.currentTarget.closest(".action-item"); + // const itemId = li.dataset.itemId; + // const action = this.document.system.actions.get(itemId); + // action.execute(); + // }); + + // html.find(".action-edit").click((ev) => { + // const li = ev.currentTarget.closest(".action-item"); + // const itemId = li.dataset.itemId; + // const action = this.document.system.actions.get(itemId); + // if (!action) { + // throw new Error( + // `Action ${itemId} not found on ${this.document.name}.`, + // ); + // } + // action.sheet.render(true); + // }); + + // html.find(".action-delete").click((ev) => { + // const li = ev.currentTarget.closest(".action-item"); + // const itemId = li.dataset.itemId; + // const action = this.document.system.actions.get(itemId); + // if (!action) { + // throw new Error( + // `Action ${itemId} not found on ${this.document.name}.`, + // ); + // } + // return Utility.deleteAction(ev, action); + // }); + + html.find(".default-action").click((ev) => { + const li = ev.currentTarget.closest(".item"); + const itemId = li.dataset.itemId; + let item; + if (this.document instanceof SohlActor) { + item = this.actor.getItem(itemId); + } else { + item = this.item.system.items.get(itemId); + } + if (item) { + const defaultAction = item.system.getDefaultAction(li); + if (defaultAction?.callback instanceof Function) { + defaultAction.callback(); + } else { + ui.notifications.warn( + `${item.label} has no available default action`, + ); + } + } + }); + + // Activate context menu + this._contextMenu(html); + } + }; +} + +/** + * Extend the basic ActorSheet with some common capabilities + * @extends {ActorSheet} + */ +export class SohlActorSheet extends SohlSheetMixin(ActorSheet) { + /** @override */ + static get defaultOptions() { + return foundry.utils.mergeObject(super.defaultOptions, { + classes: ["sohl", "sheet", "actor"], + width: 900, + height: 640, + filters: [ + { + inputSelector: 'input[name="search-traits"]', + contentSelector: ".traits", + }, + { + inputSelector: 'input[name="search-skills"]', + contentSelector: ".skills", + }, + { + inputSelector: 'input[name="search-bodylocations"]', + contentSelector: ".bodylocations", + }, + { + inputSelector: 'input[name="search-fatigue"]', + contentSelector: ".fatigues", + }, + { + inputSelector: 'input[name="search-ailments"]', + contentSelector: ".ailments", + }, + { + inputSelector: 'input[name="search-stress"]', + contentSelector: ".stresses", + }, + { + inputSelector: 'input[name="search-mysteries"]', + contentSelector: ".mysteries", + }, + { + inputSelector: 'input[name="search-mysticalabilities"]', + contentSelector: ".mysticalabilities", + }, + { + inputSelector: 'input[name="search-gear"]', + contentSelector: ".gears", + }, + { + inputSelector: 'input[name="search-effects"]', + contentSelector: ".effects-list", + }, + ], + }); + } + + /** @inheritdoc */ + _getHeaderButtons() { + let buttons = super._getHeaderButtons(); + const closeIndex = buttons.findIndex((btn) => btn.label === "Sheet"); + buttons.splice(closeIndex, 0, { + label: "Print", + class: "print-actor", + icon: "fas fa-print", + onclick: (ev) => this._onPrintActor(ev), + }); + return buttons; + } + + /** @override */ + getData() { + const data = super.getData(); + data.adata = this.actor.system; + data.labels = this.actor.labels || {}; + data.itemTypes = this.actor.itemTypes; + data.itemSubtypes = this.actor.itemSubtypes; + data.effectStatus = IterWrap.create( + this.actor.statuses.values(), + ).reduce((obj, s) => { + obj[s] = true; + return obj; + }, {}); + data.macroTypes = foundry.utils.deepClone( + game.system.documentTypes.Macro, + ); + data.dtypes = ["String", "Number", "Boolean"]; + data.attributes = []; + data.philosophies = [ + { + name: "No Philosophy", + domains: [], + }, + ]; + let cmData = {}; + let wpnData = {}; + let mslData = {}; + IterWrap.create(this.actor.allItems()).forEach((it) => { + if (it.system instanceof TraitItemData) { + if (it.system.intensity === "attribute") { + data.attributes.push(it); + } else if (it.system.abbrev === "mov") { + data.move = it.system.$score.effective; + } + } + + if (it.system instanceof CombatTechniqueStrikeModeItemData) { + const maneuver = it.cause; + + if (maneuver?.system instanceof CombatManeuverItemData) { + cmData[maneuver.name] ||= { + item: maneuver, + strikeModes: [], + }; + cmData[maneuver.name].strikeModes.push(it); + } + } + + if (it.system instanceof MeleeWeaponStrikeModeItemData) { + const weapon = it.cause; + if ( + weapon?.system instanceof WeaponGearItemData && + weapon.system.$isHeldBy?.length >= it.system.minParts + ) { + wpnData[weapon.name] ||= { + item: weapon, + strikeModes: [], + }; + wpnData[weapon.name].strikeModes.push(it); + } + } + + if (it.system instanceof MissileWeaponStrikeModeItemData) { + const weapon = it.cause; + if ( + weapon?.system instanceof WeaponGearItemData && + weapon.system.$isHeldBy?.length >= it.system.minParts + ) { + mslData[weapon.name] ||= { + item: weapon, + strikeModes: [], + }; + mslData[weapon.name].strikeModes.push(it); + } + } + + if (it.system instanceof DomainItemData) { + const philName = + it.system.philosophy?.trim() || "No Philosophy"; + let phil = data.philosophies.find((p) => p.name === philName); + if (!phil) { + phil = { + name: philName, + domains: [], + }; + data.philosophies.push(phil); + } + + phil.domains.push(it); + } + }); + data.attributes.sort((a, b) => a.sort - b.sort); + data.philosophies.forEach((p) => + p.domains.sort((a, b) => a.sort - b.sort), + ); + + let smKeys = Object.keys(cmData).sort((a, b) => a.localeCompare(b)); + if (smKeys.includes("Unarmed")) { + smKeys = smKeys.filter((k) => k !== "Unarmed"); + smKeys.unshift("Unarmed"); + } + data.combatmaneuvers = smKeys.reduce((ary, key) => { + cmData[key].strikeModes.sort((a, b) => a.sort - b.sort); + ary.push(cmData[key]); + return ary; + }, []); + + smKeys = Object.keys(wpnData).sort((a, b) => a.localeCompare(b)); + data.meleeweapons = smKeys.reduce((ary, key) => { + wpnData[key].strikeModes.sort((a, b) => a.sort - b.sort); + ary.push(wpnData[key]); + return ary; + }, []); + + smKeys = Object.keys(mslData).sort((a, b) => a.localeCompare(b)); + data.missileweapons = smKeys.reduce((ary, key) => { + mslData[key].strikeModes.sort((a, b) => a.sort - b.sort); + ary.push(mslData[key]); + return ary; + }, []); + + data.weightCarried = game.documentTypes.Item.reduce( + (obj, t) => { + if (t.endsWith("gear")) { + obj[t] = 0; + } + return obj; + }, + { total: 0 }, + ); + IterWrap.create(this.actor.allItems()).forEach((it) => { + if (it.system instanceof GearItemData) { + data.weightCarried[it.type] += it.system.totalWeight.effective; + } + }); + + const topContainer = { + name: "On Body", + id: null, + system: { + $capacity: this.actor.system.$gearWeight, + notes: "", + description: "", + quantity: 1, + isCarried: true, + isEquipped: true, + qualityBase: 0, + durabilityBase: 0, + textReference: "", + macros: [], + nestedItems: [], + maxCapacityBase: 0, + valueBase: 0, + weightBase: 0, + createdTime: 0, + abbrev: "", + }, + items: [], + }; + data.containers = [topContainer]; + + this.actor.items.forEach((it) => { + if (it.system instanceof GearItemData) { + if (it.system instanceof ContainerGearItemData) { + data.containers.push({ + name: it.name, + id: it.id, + system: it.system, + items: [], + }); + } + topContainer.items.push(it); + } + }); + + this.actor.system.virtualItems.forEach((it) => { + if (it.system instanceof GearItemData) { + const containerId = + it.nestedIn?.system instanceof ContainerGearItemData + ? it.nestedIn.id + : null; + + const container = data.containers.find( + (c) => c.id === containerId, + ); + if (container) { + container.items.push(it); + } + } + }); + + data.shock = { + nextRerollDuration: "N/A", + }; + + return data; + } + + // /** + // * A static function that processes changes in an effect. If the effect has no changes or an empty array of changes, it will return 'No Changes'. Otherwise, it will process each change and generate a formatted string based on the change's mode and values. The processed changes are concatenated into a single comma-separated string and returned. + // * + // * @static + // * @param {*} effect + // * @returns {*} + // */ + // static _aeChanges(effect) { + // if (!effect.changes || !effect.changes.length) { + // return "No Changes"; + // } + + // return effect.changes + // .map((ch) => { + // const modes = CONST.ACTIVE_EFFECT_MODES; + // const key = ch.key; + // const val = ch.value; + // let prefix = effect.keys[effect.targetType]; + // if (!prefix) { + // console.warn( + // `SoHL | Effect type "${effect.targetType}" not found`, + // ); + // prefix = `NOTYPE[${effect.targetType}]`; + // } + // if (effect.targetType === "this") { + // if (effect.parent instanceof Item) { + // if (!effect.keys[effect.parent.type]) { + // console.warn( + // `SoHL | Effect type "${effect.parent.type}" not found`, + // ); + // prefix = `NOTYPE[${effect.parent.type}]`; + // } else { + // prefix = effect.keys[effect.parent.type]?.[key]; + // if (!prefix) { + // console.warn( + // `SoHL | Effect Key "${key}" not found in type "${effect.parent.type}"`, + // ); + // prefix = `BADKEY[${key}]`; + // } + // } + // } else if (effect.parent instanceof Actor) { + // prefix = effect.keys["actor"][key]; + // if (!prefix) { + // console.warn( + // `SoHL | Effect Key "${key}" not found in type "actor"`, + // ); + // prefix = `BADKEY[${key}]`; + // } + // } + // } + + // switch (ch.mode) { + // case modes.ADD: + // return `${prefix} ${val < 0 ? "-" : "+"} ${Math.abs( + // val, + // )}`; + // case modes.MULTIPLY: + // return `${prefix} ${SOHL.CONST.CHARS.TIMES} ${val}`; + // case modes.OVERRIDE: + // return `${prefix} = ${val}`; + // case modes.UPGRADE: + // return `${prefix} ${SOHL.CONST.CHARS.GREATERTHANOREQUAL} ${val}`; + // case modes.DOWNGRADE: + // return `${prefix} ${SOHL.CONST.CHARS.LESSTHANOREQUAL} ${val}`; + // default: + // return !val ? `${prefix}` : `${prefix} ~ ${val}`; + // } + // }) + // .join(", "); + // } + + async _onPrintActor() { + // Open new window and dump HTML to it. + const win = window.open( + "about:blank", + "_blank", + "width=800,height=640,scrollbars=yes,resizable=yes,menubar=no,status=no,toolbar=no", + ); + if (!win) { + console.error("Failed to open print window"); + return null; + } + + win.location.hash = "print"; + win._rootWindow = window; + + const html = await renderTemplate( + this.template, + foundry.utils.mergeObject({ printable: true }, this.getData()), + ); + win.document.write(html); + } + + // async _onItemDelete(event) { + // event.preventDefault(); + // const header = event.currentTarget; + // const li = header.closest(".item"); + // const itemId = li.dataset.itemId; + // const item = this.actor.getItem(itemId); + // await item.system.execute("delete"); + // } + + async _onItemCreate(event) { + if (event.preventDefault) event.preventDefault(); + const header = event.currentTarget; + // Grab any data associated with this control. + const dataset = header.dataset; + + const options = { parent: this.actor }; + const data = { + name: "", + }; + if (dataset.type) { + if (dataset.type === "gear") { + options.types = SOHL.CONST.GEARTYPES; + data.type = options.types[0]; + } else if (dataset.type === "body") { + options.types = [ + BodyLocationItemData.typeName, + BodyPartItemData.typeName, + BodyZoneItemData.typeName, + ]; + data.type = options.types[0]; + } else { + data.type = dataset.type; + } + } + if (dataset.subType) data["system.subType"] = dataset.subType; + const item = await SohlItem.createDialog(data, options); + return item; + } + + _improveToggleDialog(item) { + const dlghtml = + "

Do you want to perform a Skill Development Roll (SDR), or just disable the flag?

"; + + // Create the dialog window + return new Promise((resolve) => { + new Dialog({ + title: "Skill Development Toggle", + content: dlghtml.trim(), + buttons: { + performSDR: { + label: "Perform SDR", + callback: async () => { + return await SohlActor.skillDevRoll(item); + }, + }, + disableFlag: { + label: "Disable Flag", + callback: async () => { + return item.update({ "system.improveFlag": false }); + }, + }, + }, + default: "performSDR", + close: () => resolve(false), + }).render(true); + }); + } + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + // Everything below here is only needed if the sheet is editable + if (!this.options.editable) return; + + // Add Inventory Item + html.find(".item-create").click(this._onItemCreate.bind(this)); + + // Toggle Active Effects + html.find(".toggle-status-effect").click((ev) => { + const statusId = ev.currentTarget.dataset.statusId; + const effect = this.actor.effects.find((e) => + e.statuses.has(statusId), + ); + if (effect) { + effect.delete(); + } else { + let effectData = CONFIG.statusEffects.find( + (e) => e.id === statusId, + ); + const updateData = { + img: effectData.img, + name: game.i18n.localize(effectData.name), + statuses: effectData.id, + }; + ActiveEffect.create(updateData, { parent: this.actor }); + } + }); + + // Hide all hideable elements + html.find(".showhide").prop("disabled", false); + + html.find(".toggle-visibility").click((ev) => { + const filter = ".showhide"; + // (limitToClass ? `.${limitToClass}` : "") + ".showhide"; + const start = ev.currentTarget.closest(".item-list"); + const targets = start.find(filter); + // biome-ignore lint/correctness/noUnusedVariables: + targets.prop("disabled", (i, val) => !val); + }); + + // Toggle carry state + html.find(".item-carry").click((ev) => { + ev.preventDefault(); + const itemId = ev.currentTarget.closest(".item").dataset.itemId; + const item = this.actor.getItem(itemId); + + // Only process inventory items, otherwise ignore + if (item.system instanceof GearItemData) { + const attr = "system.isCarried"; + return item.update({ + [attr]: !foundry.utils.getProperty(item, attr), + }); + } + + return null; + }); + + // Toggle equip state + html.find(".item-equip").click((ev) => { + ev.preventDefault(); + const itemId = ev.currentTarget.closest(".item").dataset.itemId; + const item = this.actor.getItem(itemId); + + // Only process inventory items, otherwise ignore + if (item.system instanceof GearItemData) { + const attr = "system.isEquipped"; + return item.update({ + [attr]: !foundry.utils.getProperty(item, attr), + }); + } + + return null; + }); + + // Toggle improve flag + html.find(".toggle-improve-flag").click((ev) => { + ev.preventDefault(); + const itemId = ev.currentTarget.closest(".item").dataset.itemId; + const item = this.actor.getItem(itemId); + + // Only process MasteryLevel items + if ( + item?.system instanceof MasteryLevelItemData && + !item.isVirtual + ) { + return item.system.toggleImproveFlag(); + } + return null; + }); + } +} + +/** + * Extend the basic ItemSheet with some very simple modifications + * @extends {ItemSheet} + */ +export class SohlItemSheet extends SohlSheetMixin(ItemSheet) { + /** @override */ + static get defaultOptions() { + return foundry.utils.mergeObject(super.defaultOptions, { + classes: ["sohl", "sheet", "item"], + width: 560, + height: 550, + }); + } + + /* -------------------------------------------- */ + + /** @override */ + getData() { + const data = super.getData(); + + // Re-define the template data references (backwards compatible) + data.item = this.item; + data.idata = this.item.system; + data.itemType = this.item.type; + data.hasActor = !!this.actor; + + data.hasTraitChoices = + this.item.system instanceof TraitItemData && + Object.keys(this.item.system.choices).length; + + // If this is a container, then separate the nested items into two lists, + // one for gear and the other for all other items. If it is not a container, + // then all nested items simply go into the items list. + data.items = []; + data.gear = []; + + data.inContainer = null; + if ( + this.item.system instanceof GearItemData && + this.item.nestedIn instanceof ContainerGearItemData + ) { + data.inContainer = this.item.nestedIn; + } + + if (this.item.system instanceof ContainerGearItemData) { + const topContainer = { + name: this.item.name, + id: this.item.id, + system: this.item.system, + items: [], + }; + data.containers = [topContainer]; + + this.item.system.items.forEach((it) => { + if (it.system instanceof ContainerGearItemData) { + data.containers.push({ + name: it.name, + id: it.id, + system: it.system, + items: [], + }); + } + }); + + data.containers.forEach((c) => { + c.system.items.forEach((ci) => { + if (ci.system instanceof GearItemData) { + c.items.push(ci); + } + }); + }); + } + + data.traitChoices = this.item.system.choices; // this will only be defined for Traits, otherwise undefined + data.bodyLocationChoices = {}; + + if (this.item.actor) { + data.holdableItems = { "": "Nothing" }; + data.combatSkills = { + melee: { "": "None" }, + missile: { "": "None" }, + maneuver: { "": "None" }, + }; + + // Generate a list of domains specific to this item + data.domains = Object.entries( + this.item.actor.system.$domains, + ).reduce((obj, [cat, coll]) => { + const tmpAry = IterWrap.create(coll.entries()).map( + ([abbrev, domain]) => [abbrev, domain.name], + ); + + // If the current item's domain is not in the loaded set of domains, then temporarily + // add it (so that it doesn't get reset from the current value) + if ( + !tmpAry.some( + ([abbrev]) => abbrev === this.item.system.domain, + ) + ) + tmpAry.push([ + this.item.system.domain, + `Unknown (${this.item.system.domain})`, + ]); + + tmpAry.sort((a, b) => a[1].localeCompare(b[1])), + (obj[cat] = Object.fromEntries(tmpAry)); + return obj; + }, {}); + + IterWrap.create(this.item.actor.allItems()).forEach((it) => { + // Fill appropriate lists for individual item sheets + if (it.system instanceof BodyLocationItemData) { + data.bodyLocationChoices[it.name] = it.name; + } + + if (it.system instanceof BodyZoneItemData) { + if (!data.zoneNames) { + data.zoneNames = [it.name]; + } else { + if (!data.zoneNames.includes(it.name)) { + data.zoneNames.push(it.name); + } + } + } + + if (it.system instanceof AnatomyItemData) { + data.weaponLimbs = it.system.weaponLimbs; + } + + if (it.system instanceof SkillItemData) { + if (it.system.weaponGroup === "melee") { + data.combatSkills.melee[it.system.name] = + it.system.name; + } + + if (it.system.weaponGroup === "missile") { + data.combatSkills.missile[it.system.name] = + it.system.name; + } + + if (["maneuver", "melee"].includes(it.system.weaponGroup)) { + data.combatSkills.maneuver[it.system.name] = + it.system.name; + } + } + + if ( + !it.isNested && + it.system instanceof GearItemData && + !(it.system instanceof ArmorGearItemData) + ) { + data.holdableItems[it.id] = it.name; + } + + if (this.item.system instanceof WeaponGearItemData) { + if (it.system instanceof SkillItemData) { + if ( + ["melee", "missle"].includes(it.system.weaponGroup) + ) { + data.combatSkills[it.system.weaponGroup][it.name] = + it.name; + } else if (it.system.weaponGroup === "meleemissile") { + data.combatSkills.melee[it.name] = it.name; + data.combatSkills.missle[it.name] = it.name; + } + } + } + }); + } + if (!Object.keys(data.bodyLocationChoices).length) { + data.bodyLocationChoices[""] = "None"; + } + + return data; + } + + /** @override */ + setPosition(options = {}) { + const position = super.setPosition(options); + const sheetBody = this.element.find(".sheet-body"); + const bodyHeight = position.height - 192; + sheetBody.css("height", bodyHeight); + return position; + } + + get isEditable() { + return this.item.isVirtual ? false : super.isEditable; + } + + /** @inheritdoc */ + // biome-ignore lint/correctness/noUnusedVariables: + _canDragStart(selector) { + return this.isEditable; + } + + /* -------------------------------------------- */ + + /** @inheritdoc */ + // biome-ignore lint/correctness/noUnusedVariables: + _canDragDrop(selector) { + return this.isEditable; + } + + /* -------------------------------------------- */ + + /** @inheritdoc */ + _onDragStart(event) { + const li = event.currentTarget; + if ("link" in event.target.dataset) return; + + // Create drag data + let dragData; + + // Embed Items + if (li.dataset.itemId) { + const item = this.item.getNestedItemById(li.dataset.itemId); + dragData = item.toDragData(); + } + + // Active Effect + if (li.dataset.effectId) { + const effect = this.item.effects.get(li.dataset.effectId); + dragData = effect.toDragData(); + } + + // Macros + if (li.dataset.macroId) { + const macro = this.item.system.macros.find( + (m) => m._id === li.dataset.macroId, + ); + dragData = foundry.utils.deepClone(macro); + } + + if (!dragData) return; + + // Set data transfer + event.dataTransfer.setData("text/plain", JSON.stringify(dragData)); + } + + async _onSortItem(event) { + return this.item._onSortItem(event); + } + + /** @inheritdoc */ + async _onDrop(event) { + const data = TextEditor.getDragEventData(event); + const allowed = Hooks.call("dropItemSheetData", this.item, this, data); + if (allowed === false) return; + + if (data.type === "ActiveEffect") { + return this._onDropActiveEffect(event, data); + } else if (data.type === "Item") { + return this._onDropItem(event, data); + } else if (data.type === "Macro") { + return this._onDropMacro(event, data); + } + } + + async _onDropMacro(event, data) { + if (!this.item.isOwner) return false; + + const droppedMacro = await SohlMacro.fromDropData(data); + if (droppedMacro) { + if ( + this.item.system.macros.some((m) => m._id === droppedMacro.id) + ) { + // dropped macro is already in this item, + // so we just sort it. + return this._onSortMacro(event, droppedMacro.toObject()); + } else { + // Item is not currently in the list of items for the item, + // so add it. + return await SohlMacro.create(droppedMacro.toObject(), { + clean: true, + nestedIn: this.item, + }); + } + } + + // We can't deal with the dropped macro, so fail + return false; + } + + _onSortMacro(event, macroData) { + // Get the drag source and drop target + const macros = this.item.system.macros; + const source = macros.find((m) => m._id === macroData._id); + const dropTarget = event.target.closest("[data-macro-id]"); + if (!dropTarget) return; + const target = macros.get(dropTarget.dataset.macroId); + + // Don't sort on yourself + if (source.id === target.id) return; + + // Identify sibling items based on adjacent HTML elements + const siblings = []; + for (let el of dropTarget.parentElement.children) { + const siblingId = el.dataset.macroId; + if (siblingId && siblingId !== source.id) + siblings.push(macros.find((m) => m._id === el.dataset.macroId)); + } + + // Perform the sort + const sortUpdates = SortingHelpers.performIntegerSort(source, { + target, + siblings, + }); + + const updateData = { + "system.macros": foundry.utils.deepClone(this.item.system.macros), + }; + + sortUpdates.forEach((u) => { + const target = updateData["system.macros"].find( + (m) => m._id === u.target._id, + ); + if (target) target.sort = u.update.sort; + }); + + // Perform the update + return this.item.update(updateData); + } + + async _createNestedItem(event) { + await this._onSubmit(event); // Submit any unsaved changes + const dataset = event.currentTarget.dataset; + const options = { nestedIn: this.item, parent: this.item.actor }; + const data = { name: "" }; + if (dataset.type === "gear") { + options.types = SOHL.CONST.GEARTYPES; + data.type = options.types[0]; + } else if (dataset.type) { + data.type = dataset.type; + } + options.items = + IterWrap.create(this.item.actor?.allItems()).filter( + (it) => it.type === dataset.type, + ) || []; + options.items.sort((a, b) => a.sort - b.sort); + if (dataset.subType) data["system.subType"] = dataset.subType; + const item = await SohlItem.createDialog(data, options); + if (item) this.render(); + return item; + } + + async _deleteNestedItem(event) { + event.preventDefault(); + const li = event.currentTarget.closest(".item"); + const nestedItemId = li.dataset.itemId; + if (nestedItemId) { + const nestedItem = this.item.getNestedItemById(nestedItemId); + if (!nestedItem) { + console.error( + `SoHL | Delete aborted, nested item ${nestedItemId} in item ${this.item.name} was not found.`, + ); + return; + } + + await Dialog.confirm({ + title: `Delete Nested Item: ${nestedItem.label}`, + content: + "

Are You Sure?

This item will be deleted and cannot be recovered.

", + yes: () => { + nestedItem.delete(); + this.render(); + }, + }); + } + } + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + html.on("keypress", ".properties", (ev) => { + var keycode = ev.keyCode ? ev.keyCode : ev.which; + if (keycode == "13") { + super.close(); + } + }); + + // Create/edit/delete Embedded Item + html.find(".nested-item-create").click( + this._createNestedItem.bind(this), + ); + + html.find(".nested-item-edit").click((ev) => { + const li = ev.currentTarget.closest(".item"); + const itemId = li.dataset.itemId; + const nestedItem = this.item.getNestedItemById(itemId); + nestedItem.sheet.render(true); + }); + + html.find(".nested-item-delete").click( + this._deleteNestedItem.bind(this), + ); + } +} + +export class SohlContainerGearItemSheet extends SohlItemSheet { + static get defaultOptions() { + return foundry.utils.mergeObject(super.defaultOptions, { + width: 725, + }); + } +} + +export class NestedItemSheet extends ItemSheet { + /** + * Updates an object with new data. + * @param event The event triggering the update + * @param formData The new data to update the object with + * @returns A Promise that resolves to the updated object after the update operation is complete + * + * @async + * @param {*} event + * @param {*} formData + * @returns {unknown} + */ + + // biome-ignore lint/correctness/noUnusedVariables: + async _updateObject(event, formData) { + const newAry = foundry.utils.deepClone(this.item.system.items); + const index = newAry.findIndex((obj) => obj._id === formData._id); + if (index < 0) { + newAry.push(formData); + } else { + foundry.utils.mergeObject(newAry[index], formData); + newAry.splice(index, 1, formData); + } + + return this.item.update({ "system.items": newAry }); + } +} + +/** + * A class containing static methods for handling commands related to combat fatigue and chat card actions. Includes methods to handle combat fatigue, display chat action buttons, and handle chat card actions. + * + * @export + * @class Commands + * @typedef {Commands} + */ +export class Commands { + static async createItemFromJson(filepath) { + const descObj = await Utility.loadJSONFromFile(filepath); + + const createData = foundry.utils.deepClone(descObj.template); + createData._id ||= foundry.utils.randomID(); + + if (descObj.nestedItems) { + foundry.utils.mergeObject(createData, { + system: { + nestedItems: [], + }, + }); + + for (let [name, type] of descObj.nestedItems) { + const itemData = await Utility.getItemFromPacks( + name, + SOHL.sysVer.CONFIG.Item.compendiums, + { itemType: type }, + ); + if (itemData) { + itemData._id = foundry.utils.randomID(); + delete itemData.folder; + delete itemData.sort; + delete itemData._stats; + delete itemData.pack; + createData.system.nestedItems.push(itemData); + } + } + } + const result = await SohlItem.create(createData, { clean: true }); + console.log(`Item with name ${descObj.name} created`); + return result; + } + + /** + * Handles combat fatigue for each combatant in a combat. Calculates the distance a combatant has moved since the start of combat and applies combat fatigue to the combatant's actor. Updates flags to mark that the combatant has not participated in combat and sets the start location for the next combat round. + * + * @static + * @param {*} combat + */ + static handleCombatFatigue(combat) { + combat.turns.forEach((combatant) => { + const actor = combatant.token.actor; + const didCombat = combatant.getFlag("sohl", "didCombat"); + + if (didCombat) { + // Calculate distance combatant has moved + const startLocation = combatant.getFlag( + "sohl", + "startLocation", + ); + const dist = startLocation + ? combat.getDistance(startLocation, combatant.token.center) + : 0; + + actor?.system.applyCombatFatigue(dist); + } + + combatant.update({ + "flags.sohl.didCombat": false, + "flags.sohl.startLocation": combatant.token.center, + }); + }); + } + + /** + * Optionally hide the display of chat card action buttons which cannot be performed by the user + */ + + // biome-ignore lint/correctness/noUnusedVariables: + static displayChatActionButtons(message, html, data) { + const chatCard = html.find(".chat-card"); + if (chatCard.length > 0) { + // If the user is the GM, proceed + if (game.user.isGM) return; + + // Otherwise conceal action buttons + const buttons = chatCard.find("button[data-action]"); + // biome-ignore lint/correctness/noUnusedVariables: + buttons.each((i, btn) => { + if (btn.dataset?.handlerActorUuid) { + let actor = fromUuidSync(btn.dataset.handlerActorUuid); + if (!actor || !actor.isOwner) { + btn.style.display = "none"; + } + } + }); + } + } + + static async onChatCardAction(event) { + event.preventDefault(); + const button = event.currentTarget; + button.disabled = true; + const options = IterWrap.create(button.dataset?.entries()).reduce( + (obj, [key, val]) => { + if (key.endsWith("Json")) { + const newKey = key.slice(0, -4); + obj[newKey] = JSON.parse(val); + } else { + obj[key] = val; + } + return obj; + }, + {}, + ); + let doc = await fromUuid(options.targetUuid); + if (doc instanceof Token) { + options.token = doc.document; + options.actor = doc.actor; + doc = options.actor; + } else if (doc instanceof TokenDocument) { + options.token = doc; + options.actor = doc.actor; + doc = options.actor; + } else if (doc instanceof SohlActor) { + options.token = doc.getToken(); + options.actor = doc; + } else if (doc instanceof SohlItem) { + options.actor = doc.actor; + options.token = doc.actor.getToken(); + } else { + throw new Error( + `targetUuid ${options.targetUuid} is not a Token, TokenDocument, Actor, or Item UUID`, + ); + } + + doc.system.execute(options.action, ...options); + button.disabled = false; + } +} +SOHL.cmds = Commands; + +export const SohlActorDataModels = { + [AnimateEntityActorData.typeName]: AnimateEntityActorData, + [InanimateObjectActorData.typeName]: InanimateObjectActorData, +}; + +export const SohlActorTypeLabels = { + [AnimateEntityActorData.typeName]: + AnimateEntityActorData.typeLabel.singular, + [InanimateObjectActorData.typeName]: + InanimateObjectActorData.typeLabel.singular, +}; + +export const SohlActorTypeIcons = { + [AnimateEntityActorData.typeName]: "fas fa-person", + [InanimateObjectActorData.typeName]: "fas fa-treasure-chest", +}; + +export const SohlItemDataModels = { + [AffiliationItemData.typeName]: AffiliationItemData, + [AfflictionItemData.typeName]: AffiliationItemData, + [AnatomyItemData.typeName]: AnatomyItemData, + [ArmorGearItemData.typeName]: ArmorGearItemData, + [BodyLocationItemData.typeName]: BodyLocationItemData, + [BodyPartItemData.typeName]: BodyPartItemData, + [BodyZoneItemData.typeName]: BodyZoneItemData, + [CombatTechniqueStrikeModeItemData.typeName]: + CombatTechniqueStrikeModeItemData, + [CombatManeuverItemData.typeName]: CombatManeuverItemData, + [ConcoctionGearItemData.typeName]: ConcoctionGearItemData, + [ContainerGearItemData.typeName]: ContainerGearItemData, + [EventItemData.typeName]: EventItemData, + [InjuryItemData.typeName]: InjuryItemData, + [MeleeWeaponStrikeModeItemData.typeName]: MeleeWeaponStrikeModeItemData, + [MiscGearItemData.typeName]: MiscGearItemData, + [MissileWeaponStrikeModeItemData.typeName]: MissileWeaponStrikeModeItemData, + [MysteryItemData.typeName]: MysteryItemData, + [MysticalAbilityItemData.typeName]: MysticalAbilityItemData, + [DomainItemData.typeName]: DomainItemData, + [MysticalDeviceItemData.typeName]: MysticalDeviceItemData, + [ProjectileGearItemData.typeName]: ProjectileGearItemData, + [SkillItemData.typeName]: SkillItemData, + [TraitItemData.typeName]: TraitItemData, + [WeaponGearItemData.typeName]: WeaponGearItemData, +}; + +export const SohlItemTypeIcons = { + [AffiliationItemData.typeName]: "fa-duotone fa-people-group", + [AfflictionItemData.typeName]: "fas fa-face-nauseated", + [AnatomyItemData.typeName]: "fas fa-person", + [ArmorGearItemData.typeName]: "fas fa-shield-halved", + [BodyLocationItemData.typeName]: "fa-solid fa-hand", + [BodyPartItemData.typeName]: "fa-duotone fa-skeleton-ribs", + [BodyZoneItemData.typeName]: "fa-duotone fa-person", + [CombatTechniqueStrikeModeItemData.typeName]: "fas fa-hand-fist", + [CombatManeuverItemData.typeName]: "fas fa-hand-fist", + [ConcoctionGearItemData.typeName]: "fas fa-flask-round-potion", + [ContainerGearItemData.typeName]: "fas fa-sack", + [EventItemData.typeName]: "fas fa-gear", + [InjuryItemData.typeName]: "fas fa-user-injured", + [MeleeWeaponStrikeModeItemData.typeName]: "fas fa-sword", + [MiscGearItemData.typeName]: "fas fa-ball-pile", + [MissileWeaponStrikeModeItemData.typeName]: "fas fa-bow-arrow", + [MysteryItemData.typeName]: "fas fa-sparkles", + [MysticalAbilityItemData.typeName]: "fas fa-hand-sparkles", + [DomainItemData.typeName]: "fas fa-sparkle", + [MysticalDeviceItemData.typeName]: "fas fa-wand-sparkles", + [ProjectileGearItemData.typeName]: "fas fa-bow-arrow", + [SkillItemData.typeName]: "fas fa-head-side-gear", + [TraitItemData.typeName]: "fas fa-user-gear", + [WeaponGearItemData.typeName]: "fas fa-sword", +}; + +export const SohlModifiers = { + MasteryLevelModifier: MasteryLevelModifier, + ImpactModifier: ImpactModifier, + ValueModifier: ValueModifier, + CombatModifier: CombatModifier, +}; + +export const SohlItemTypeLabels = { + [AffiliationItemData.typeName]: AffiliationItemData.typeLabel.singular, + [AfflictionItemData.typeName]: AfflictionItemData.typeLabel.singular, + [AnatomyItemData.typeName]: AnatomyItemData.typeLabel.singular, + [ArmorGearItemData.typeName]: ArmorGearItemData.typeLabel.singular, + [BodyLocationItemData.typeName]: BodyLocationItemData.typeLabel.singular, + [BodyPartItemData.typeName]: BodyPartItemData.typeLabel.singular, + [BodyZoneItemData.typeName]: BodyZoneItemData.typeLabel.singular, + [CombatTechniqueStrikeModeItemData.typeName]: + CombatTechniqueStrikeModeItemData.typeLabel.singular, + [CombatManeuverItemData.typeName]: + CombatManeuverItemData.typeLabel.singular, + [ConcoctionGearItemData.typeName]: + ConcoctionGearItemData.typeLabel.singular, + [ContainerGearItemData.typeName]: ContainerGearItemData.typeLabel.singular, + [EventItemData.typeName]: EventItemData.typeLabel.singular, + [InjuryItemData.typeName]: InjuryItemData.typeLabel.singular, + [MeleeWeaponStrikeModeItemData.typeName]: + MeleeWeaponStrikeModeItemData.typeLabel.singular, + [MiscGearItemData.typeName]: MiscGearItemData.typeLabel.singular, + [MissileWeaponStrikeModeItemData.typeName]: + MissileWeaponStrikeModeItemData.typeLabel.singular, + [MysteryItemData.typeName]: MysteryItemData.typeLabel.singular, + [MysticalAbilityItemData.typeName]: + MysticalAbilityItemData.typeLabel.singular, + [DomainItemData.typeName]: DomainItemData.typeLabel.singular, + [MysticalDeviceItemData.typeName]: + MysticalDeviceItemData.typeLabel.singular, + [ProjectileGearItemData.typeName]: + ProjectileGearItemData.typeLabel.singular, + [SkillItemData.typeName]: SkillItemData.typeLabel.singular, + [TraitItemData.typeName]: TraitItemData.typeLabel.singular, + [WeaponGearItemData.typeName]: WeaponGearItemData.typeLabel.singular, +}; + +SOHL.class = { + SohlActor, + SohlItem, + SohlMacro, + SohlMacroConfig, + SohlActiveEffect, + SohlActiveEffectConfig, + SkillBase, + Utility, + SohlActorSheet, + SohlItemSheet, + NestedItemSheet, + Commands, +}; + +SOHL.CONST.GEARTYPES = [ + MiscGearItemData.typeName, + ContainerGearItemData.typeName, + ArmorGearItemData.typeName, + WeaponGearItemData.typeName, + ProjectileGearItemData.typeName, + ConcoctionGearItemData.typeName, +]; diff --git a/module/sohl.js b/module/sohl.js new file mode 100644 index 0000000..6db7ec7 --- /dev/null +++ b/module/sohl.js @@ -0,0 +1,747 @@ +/* eslint-disable no-unused-vars */ +import * as sohl from "./sohl-common.js"; +import * as legendary from "./legendary.js"; + +const fields = foundry.data.fields; + +function setupSohlVersion(verData) { + console.log(verData.CONST.initVersionMessage); + sohl.SOHL.sysVer = verData; + + Object.values(verData.CONST.VERSETTINGS).forEach((setting) => { + game.settings.register("sohl", setting.key, setting.data); + }); + + foundry.utils.mergeObject(CONFIG.Item, verData.CONFIG.Item, { + inplace: true, + }); + foundry.utils.mergeObject(CONFIG.Actor, verData.CONFIG.Actor, { + inplace: true, + }); + foundry.utils.mergeObject(CONFIG.Macro, verData.CONFIG.Macro, { + inplace: true, + }); + foundry.utils.mergeObject( + CONFIG.ActiveEffect, + verData.CONFIG.ActiveEffect, + { inplace: true }, + ); + + // Register sheet application classes + if (Actors.registeredSheets.length) { + Actors.unregisterSheet("sohl", ...Actors.registeredSheets); + } + + sohl.SOHL.sysVer.CONFIG.Actor.documentSheets.forEach(({ cls, types }) => { + Actors.registerSheet("sohl", cls, { + types: types, + makeDefault: true, + }); + }); + if (Items.registeredSheets.length) { + Items.unregisterSheet("sohl", ...Items.registeredSheets); + } + sohl.SOHL.sysVer.CONFIG.Item.documentSheets.forEach(({ cls, types }) => { + Items.registerSheet("sohl", cls, { + types: types, + makeDefault: true, + }); + }); + if (Macros.registeredSheets.length) { + Macros.unregisterSheet("sohl", ...Macros.registeredSheets); + } + Macros.registerSheet("sohl", verData.CONFIG.Macro.documentSheet, { + makeDefault: true, + label: `Default ${verData.label} Macro Sheet`, + }); + DocumentSheetConfig.unregisterSheet( + ActiveEffect, + "core", + ActiveEffectConfig, + ); + DocumentSheetConfig.registerSheet( + ActiveEffect, + "sohl", + sohl.SohlActiveEffectConfig, + { + makeDefault: true, + label: "Default HarnMaster Active Effect Sheet", + }, + ); + Macros.registerSheet("sohl", verData.CONFIG.Macro.documentSheet, { + makeDefault: true, + label: `Default ${verData.label} Macro Sheet`, + }); +} + +/*===============================================================*/ +/* System Settings */ +/*===============================================================*/ +function registerSystemSettings() { + game.settings.register( + "sohl", + sohl.SOHL.CONST.SETTINGS.systemMigrationVersion.key, + { + name: "System Migration Version", + scope: "world", + config: false, + type: new fields.StringField({ + required: true, + nullable: false, + initial: "", + }), + }, + ); + + if (!Object.keys(sohl.SOHL.versionsData)) { + throw new Error("No HM Versions Defined!"); + } + + game.settings.register("sohl", sohl.SOHL.CONST.SETTINGS.sohlVersion.key, { + name: "System Version", + hint: "What system version should be used for this world", + scope: "world", + config: false, + type: new fields.StringField({ + required: true, + nullable: false, + initial: "", + choices: Object.entries(sohl.SOHL.versionsData).reduce( + (obj, v) => { + obj[v[0]] = v[1]; + return obj; + }, + { "": "None" }, + ), + }), + requiresReload: true, + }); + Object.values(sohl.SOHL.CONST.SETTINGS).forEach((setting) => { + if ( + ![ + sohl.SOHL.CONST.SETTINGS.systemMigrationVersion.key, + sohl.SOHL.CONST.SETTINGS.sohlVersion.key, + ].includes(setting.key) + ) { + game.settings.register("sohl", setting.key, setting.data); + } + }); +} + +/*===============================================================*/ +/* System Initialization */ +/*===============================================================*/ + +Hooks.on("renderChatMessage", (app, html, data) => { + // Display action buttons + sohl.SOHL.cmds.displayChatActionButtons(app, html, data); +}); + +// biome-ignore lint/correctness/noUnusedVariables: +Hooks.on("renderChatLog", (app, html, data) => { + html.on( + "click", + ".card-buttons button", + sohl.SOHL.cmds.onChatCardAction.bind(this), + ); +}); + +// biome-ignore lint/correctness/noUnusedVariables: +Hooks.on("renderChatPopout", (app, html, data) => { + html.on( + "click", + ".card-buttons button", + sohl.SOHL.cmds.onChatCardAction.bind(this), + ); +}); + +// Since HM does not have the concept of rolling for initiative, +// this hook simply prepopulates the initiative value. This ensures +// that no die roll is needed. +// biome-ignore lint/correctness/noUnusedVariables: +Hooks.on("preCreateCombatant", (combat, combatant, options, id) => { + if (!combatant.initiative) { + let token = canvas.tokens.get(combatant.tokenId); + combatant.initiative = + token.actor.system.ruleset.getCombatStat("Initiative").effective; + } +}); + +// biome-ignore lint/correctness/noUnusedVariables: +Hooks.on("renderSceneConfig", (app, html, data) => { + const scene = app.object; + if (app.renderTOTMScene) return; + app.renderTOTMScene = true; + + let isTotm = scene.getFlag("sohl", "isTotm"); + if (typeof isTotm === "undefined") { + if (!scene.compendium) { + scene.setFlag("sohl", "isTotm", false); + } + isTotm = false; + } + + const totmHtml = ` +
+ + +

Configure scene for Theatre of the Mind (e.g., no range calcs).

+
+ `; + + const totmFind = html.find("input[name = 'gridAlpha']"); + const formGroup = totmFind.closest(".form-group"); + formGroup.after(totmHtml); +}); + +// biome-ignore lint/correctness/noUnusedVariables: +Hooks.on("closeSceneConfig", (app, html, data) => { + const scene = app.object; + app.renderTOTMScene = false; + if (!scene.compendium) { + scene.setFlag( + "sohl", + "isTotm", + html.find("input[name='sohlTotm']").is(":checked"), + ); + } +}); + +Hooks.once("init", async function () { + console.log(`SoHR | ${sohl.SOHL.CONST.sohlInitMessage}`); + + game.sohl = sohl.SOHL; + + // Register all available SoHR versions + sohl.SOHL.registerSystemVersion("legendary", legendary.verData); + + // Initialize all system settings + registerSystemSettings(); + + let hmVer = game.settings.get( + "sohl", + sohl.SOHL.CONST.SETTINGS.sohlVersion.key, + ); + if (hmVer) { + setupSohlVersion(sohl.SOHL.versionsData[hmVer]); + } + + /** + * Set an initiative formula for the system + * @type {String} + */ + CONFIG.Combat.initiative = { + formula: "@eph.combatStat.Initiative.base", + decimals: 2, + }; + + // Set Combat Time Length + CONFIG.time.roundTime = 5; + CONFIG.time.turnTime = 0; + + sohl.SOHL.statusEffects.forEach((s) => CONFIG.statusEffects.push(s)); + foundry.utils.mergeObject( + CONFIG.specialStatusEffects, + sohl.SOHL.specialStatusEffects, + ); + foundry.utils.mergeObject(CONFIG.controlIcons, sohl.SOHL.controlIcons); + + // Replace the standard fromUuidSync and fromUuid with new ones + // that can handle embed items. + globalThis.origFromUuidSync = globalThis.fromUuidSync; + globalThis.origFromUuid = globalThis.fromUuid; + globalThis.fromUuidSync = function (uuid, options = {}) { + let doc = options.doc; + let parts = options.parts; + if (!doc) { + parts = uuid.split("#"); + const topUuid = parts.shift(); + doc = globalThis.origFromUuidSync(topUuid, options); + } + + if (doc instanceof sohl.SohlActor && parts.length) { + // The UUID is for a nested or virtual item, + // and the doc is an Actor. Search for the + // item in the virtual items list. + const found = doc.system.virtualItems.find( + (it) => it.uuid === uuid, + ); + if (found) return found; + } + + while (doc && parts.length) { + const docType = parts.shift(); + const docId = parts.shift(); + + if (docType === "VirtualItem") { + if (!(doc instanceof sohl.SohlActor)) { + throw new Error(`Invalid UUID: ${uuid}`); + } + doc = doc.system.virtualItems.get(docId); + } else if (docType === "NestedItem") { + if (!(doc instanceof sohl.SohlItem)) { + throw new Error(`Invalid UUID: ${uuid}`); + } + doc = doc.system.items.get(docId); + } else if (docType === "NestedMacro") { + if (!(doc.system instanceof sohl.SohlBaseData)) { + throw new Error(`Invalid UUID: ${uuid}`); + } + doc = doc.system.actions.get(docId); + } else { + throw new Error(`Invalid UUID: ${uuid}`); + } + + if (!doc) { + console.error(`UUID ${uuid} not found`); + break; + } + } + + return doc; + }; + + globalThis.fromUuid = async function (uuid, options = {}) { + let parts = uuid.split("#"); + const topUuid = parts.shift(); + let doc = await globalThis.origFromUuid(topUuid, options); + return globalThis.fromUuidSync(null, { doc, parts }); + }; +}); + +/** + * Once the entire VTT framework is initialized, check to see if + * we should perform a data migration. + */ +Hooks.once("ready", function () { + // Setup world system version + const allSohlSystems = Object.keys(sohl.SOHL.versionsData).map((v) => [ + sohl.SOHL.versionsData[v].id, + sohl.SOHL.versionsData[v].label, + ]); + let hmVer = game.settings.get( + "sohl", + sohl.SOHL.CONST.SETTINGS.sohlVersion.key, + ); + if (!hmVer) { + if (game.user.isGM) { + (async function () { + while (!hmVer) { + let dlgHtml = `
+

Select which system version to use:

+
`; + hmVer = await Dialog.prompt({ + title: "Choose System Version", + content: dlgHtml, + label: "OK", + callback: async (html) => { + const form = html.querySelector("form"); + const fd = new FormDataExtended(form); + const formdata = foundry.utils.expandObject( + fd.object, + ); + return formdata.sohlVersion; + }, + options: { jQuery: false }, + rejectClose: false, + }); + } + game.settings.set( + "sohl", + sohl.SOHL.CONST.SETTINGS.sohlVersion.key, + hmVer, + ); + game.socket.emit("reload"); + foundry.utils.debouncedReload(); + })(); + } else { + game.logOut(); + } + } + + //Hooks.on("hotbarDrop", (bar, data, slot) => LegendaryCommand.createHMMacro(data, slot)); + + if ( + game.settings.get( + "sohl", + sohl.SOHL.CONST.SETTINGS.showWelcomeDialog.key, + ) + ) { + welcomeDialog().then((showAgain) => { + if (showAgain !== null) + game.settings.set("sohl", "showWelcomeDialog", showAgain); + }); + } + + if (game.user.isGM) { + if (game.modules.get("foundryvtt-simple-calendar")?.active) { + Hooks.on(SimpleCalendar.Hooks.Ready, () => { + sohl.SOHL.hasSimpleCalendar = true; + }); + } + + /* + * Certain actions must only be performed by a single player. These + * are best handled by the active GM. However, the active GM can change + * during the game if the current active GM leaves and a new Assistant GM + * becomes the active GM. So, these all check each time to determine whether + * they are the active GM before processing. + */ + + /* + * Various actions need to occur whenever there is a change to the + * current world time. + * + * NOTE: Time change actions only apply to actors with a token on the + * current scene; actors that don't have a token on the current scene + * will not be checked. + */ + + const timeChangeWork = () => { + if (game.user.ActiveGM?.isSelf) { + canvas.scene?.tokens.forEach((token) => { + token.actor?.timeChangeWork(); + }); + } + }; + + Hooks.on("updateWorldTime", timeChangeWork); + Hooks.on("updateCombat", timeChangeWork); + + /* + * Call the combat fatigue handler whenever combat is started or the round + * changes. + */ + + // biome-ignore lint/correctness/noUnusedVariables: + Hooks.on("combatStart", (combat, updateData) => { + if (game.user.ActiveGM?.isSelf) + sohl.SOHL.cmds.handleCombatFatigue(combat); + }); + + // biome-ignore lint/correctness/noUnusedVariables: + Hooks.on("combatRound", (combat, updateData, updateOptions) => { + if (game.user.ActiveGM?.isSelf) + sohl.SOHL.cmds.handleCombatFatigue(combat); + }); + + // see docs for more info https://github.com/fantasycalendar/FoundryVTT-ItemPiles/blob/master/docs/api.md + Hooks.once("item-piles-ready", async () => { + game.itempiles.API.addSystemIntegration({ + VERSION: "1.0.0", + + // The actor class type is the type of actor that will be used for the default item pile actor that is created on first item drop. + ACTOR_CLASS_TYPE: "object", + + // The item class type is the type of item that will be used for the default loot item + ITEM_CLASS_LOOT_TYPE: "miscgear", + + // The item class type is the type of item that will be used for the default weapon item + ITEM_CLASS_WEAPON_TYPE: "weapongear", + + // The item class type is the type of item that will be used for the default equipment item + ITEM_CLASS_EQUIPMENT_TYPE: "miscgear", + + CURRENCY_DECIMAL_DIGITS: 0.01, + + // The item quantity attribute is the path to the attribute on items that denote how many of that item that exists + ITEM_QUANTITY_ATTRIBUTE: "system.quantity", + + // The item price attribute is the path to the attribute on each item that determine how much it costs + ITEM_PRICE_ATTRIBUTE: "system.value", + + // Item types and the filters actively remove items from the item pile inventory UI that users cannot loot, such as spells, feats, and classes + ITEM_FILTERS: [ + { + path: "type", + filters: game.documentTypes.Item.filter( + (item) => item != "base" && !item.endsWith("gear"), + ).join(","), + }, + ], + + UNSTACKABLE_ITEM_TYPES: [ + "weapongear", + "armorgear", + "containergear", + ], + + // Item similarities determines how item piles detect similarities and differences in the system + ITEM_SIMILARITIES: ["name", "type"], + + // Currencies in item piles is a versatile system that can accept actor attributes (a number field on the actor's sheet) or items (actual items in their inventory) + // In the case of attributes, the path is relative to the "actor.system" + // In the case of items, it is recommended you export the item with `.toObject()` and strip out any module data + CURRENCIES: [ + { + type: "item", + name: "Pence", + img: "systems/sohl/assets/icons/coins.svg", + abbreviation: "{#}d", + data: { + item: { + name: "Pence", + type: "miscgear", + img: "systems/sohl/assets/icons/coins.svg", + system: { + quantity: 1, + isCarried: true, + isEquipped: false, + qualityBase: 0, + durabilityBase: 10, + valueBase: 1, + weightBase: 0.004, + }, + }, + }, + primary: true, + exchangeRate: 1, + }, + ], + }); + }); + + // Determine whether a system migration is required + const currentWorldSystemVersion = game.settings.get( + "sohl", + sohl.SOHL.CONST.SETTINGS.systemMigrationVersion.key, + ); + + if (currentWorldSystemVersion) { + console.log( + `SoHL | Current World Version = ${currentWorldSystemVersion}`, + ); + + if ( + foundry.utils.isNewerVersion( + game.system.flags.compatibleMigrationVersion, + currentWorldSystemVersion, + ) + ) { + ui.notifications.error( + `This world uses a version of SoHR (${currentWorldSystemVersion}) ` + + `that is too old to be migrated to the new version of S`, + { permanent: true }, + ); + } else { + if ( + foundry.utils.isNewerVersion( + game.system.flags.needsMigrationVersion, + currentWorldSystemVersion, + ) + ) { + // Perform the migration + console.warn("!!! PERFORM MIGRATION !!!"); + //LegendaryMigration.migrateWorld(); + } + } + } else { + game.settings.set( + "sohl", + "systemMigrationVersion", + game.system.version, + ); + } + } + + // Preload handlebars helpers and partials + registerHandlebarsHelpers(); + preloadHandlebarsTemplates(); + + sohl.SOHL.ready = true; +}); + +async function welcomeDialog() { + const dlgTemplate = "systems/sohl/templates/dialog/welcome.html"; + const html = await renderTemplate(dlgTemplate, {}); + + // Create the dialog window + return Dialog.prompt({ + title: "Welcome!", + content: html, + label: "Dismiss", + callback: (html) => { + const form = html.querySelector("#welcome"); + const fd = new FormDataExtended(form); + const data = fd.object; + return data.showOnStartup; + }, + rejectClose: false, + options: { jQuery: false }, + }); +} + +/*-------------------------------------------------------*/ +/* Handlebars FUNCTIONS */ +/*-------------------------------------------------------*/ +function registerHandlebarsHelpers() { + /** + * A helper to create a set of <option> elements in a <select> block based on a provided array. + * This helper supports both single-select as well as multi-select input fields. + * + * @param {object|Array>} choices An array containing the choices + * @param {object} options Helper options + * @param {string|string[]} [options.selected] Which key is currently selected? + * @param {string} [options.blank] Add a blank option as the first option with this label + * @param {boolean} [options.sort] Sort the options by their label after localization + * @returns {Handlebars.SafeString} + * + * @example The provided input data + * ```js + * let choices = {"Choice A", "Choice B"}; + * let value = "Choice A"; + * ``` + * The template HTML structure + * ```hbs + * + * ``` + * The resulting HTML + * ```html + * + * ``` + */ + Handlebars.registerHelper("selectArray", function (choices, options) { + let { selected = null, blank = null, sort = false } = options.hash; + selected = + selected instanceof Array + ? selected.map(String) + : [String(selected)]; + + // Prepare the choices as an array of objects + const selectOptions = []; + if (choices instanceof Array) { + for (const choice of choices) { + const label = String(choice); + selectOptions.push({ value: label, label }); + } + } else { + throw new Error("You must specify an array to selectArray"); + } + + // Sort the array of options + if (sort) selectOptions.sort((a, b) => a.label.localeCompare(b.label)); + + // Prepend a blank option + if (blank !== null) { + selectOptions.unshift({ value: "", label: blank }); + } + + // Create the HTML + let html = ""; + for (const option of selectOptions) { + const label = Handlebars.escapeExpression(option.label); + const isSelected = selected.includes(option.value); + html += ``; + } + return new Handlebars.SafeString(html); + }); + + Handlebars.registerHelper("endswith", function (op1, op2) { + return op1.endsWith(op2); + }); + + Handlebars.registerHelper("concat", function () { + var outStr = ""; + for (var arg in arguments) { + if (typeof arguments[arg] != "object") { + outStr += arguments[arg]; + } + } + return outStr; + }); + + Handlebars.registerHelper( + "optionalString", + function (cond, strTrue = "", strFalse = "") { + if (cond) return strTrue; + return strFalse; + }, + ); + + Handlebars.registerHelper("setHas", function (set, value) { + return set.has(value); + }); + + Handlebars.registerHelper("contains", function (container, value, options) { + return container.includes(value) + ? options.fn(this) + : options.inverse(this); + }); + + Handlebars.registerHelper("toJSON", function (obj) { + return JSON.stringify(obj); + }); + + Handlebars.registerHelper("toLowerCase", function (str) { + return str.toLowerCase(); + }); + + Handlebars.registerHelper("getProperty", function (object, key) { + return foundry.utils.getProperty(object, key); + }); + + Handlebars.registerHelper("arrayToString", function (ary) { + return ary.join(","); + }); + + Handlebars.registerHelper("injurySeverity", function (val) { + if (val <= 0) return "NA"; + return val <= 5 + ? sohl.SOHL.InjuryItemData.injuryLevels[val] + : `G${val}`; + }); + + Handlebars.registerHelper("object", function ({ hash }) { + return hash; + }); + + Handlebars.registerHelper("array", function () { + return Array.from(arguments).slice(0, arguments.length - 1); + }); + + Handlebars.registerHelper("textInput", function (value, options) { + const { class: cssClass, ...config } = options.hash; + config.value = value; + const element = foundry.applications.fields.createTextInput(config); + if (cssClass) element.className = cssClass; + return new Handlebars.SafeString(element.outerHTML); + }); + + // biome-ignore lint/correctness/noUnusedVariables: + Handlebars.registerHelper("displayWorldTime", function (value, options) { + return new Handlebars.SafeString(sohl.Utility.htmlWorldTime(value)); + }); +} + +async function preloadHandlebarsTemplates() { + const partials = [ + // Item Sheet Partials + "systems/sohl/templates/item/parts/item-actions-list.hbs", + "systems/sohl/templates/item/parts/item-active-effects.hbs", + "systems/sohl/templates/item/parts/item-description.hbs", + "systems/sohl/templates/item/parts/item-nesteditems-list.hbs", + "systems/sohl/templates/item/parts/item-gear-list.hbs", + "systems/sohl/templates/item/parts/item-gear.hbs", + "systems/sohl/templates/item/parts/item-masterylevel.hbs", + "systems/sohl/templates/item/parts/item-refnote.hbs", + "systems/sohl/templates/item/parts/item-strikemode.hbs", + "systems/sohl/templates/item/parts/item-header.hbs", + ]; + + const paths = {}; + for (const path of partials) { + paths[path.replace(".hbs", ".html")] = path; + paths[`sohl.${path.split("/").pop().replace(".hbs", "")}`] = path; + } + + return loadTemplates(paths); +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7d67122 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1341 @@ +{ + "name": "harnmaster-foundryvtt", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "harnmaster-foundryvtt", + "version": "2.0.0", + "license": "LICENSE", + "devDependencies": { + "@biomejs/biome": "1.8.3", + "@eslint/js": "^9.4.0", + "eslint": "^9.4.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "globals": "^15.3.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@biomejs/biome": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", + "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.8.3", + "@biomejs/cli-darwin-x64": "1.8.3", + "@biomejs/cli-linux-arm64": "1.8.3", + "@biomejs/cli-linux-arm64-musl": "1.8.3", + "@biomejs/cli-linux-x64": "1.8.3", + "@biomejs/cli-linux-x64-musl": "1.8.3", + "@biomejs/cli-win32-arm64": "1.8.3", + "@biomejs/cli-win32-x64": "1.8.3" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", + "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", + "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", + "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", + "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", + "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", + "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.15.1.tgz", + "integrity": "sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.4.0.tgz", + "integrity": "sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.3.tgz", + "integrity": "sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.4.0.tgz", + "integrity": "sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/config-array": "^0.15.1", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.4.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.3.0.tgz", + "integrity": "sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..67eff0c --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "harnmaster-foundryvtt", + "version": "2.0.0", + "description": "HarnMaster for Foundry VTT", + "main": "index.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Tom Rodriguez", + "repository": { + "type": "git", + "url": "git+https://github.com/toastygm/HarnMaster-FoundryVTT.git" + }, + "license": "LICENSE", + "bugs": { + "url": "https://github.com/toastygm/HarnMaster-FoundryVTT/issues" + }, + "homepage": "https://github.com/toastygm/HarnMaster-FoundryVTT/issues", + "devDependencies": { + "@biomejs/biome": "1.8.3", + "@eslint/js": "^9.4.0", + "eslint": "^9.4.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "globals": "^15.3.0" + } +} diff --git a/packs/.gitignore b/packs/.gitignore new file mode 100644 index 0000000..00fb84e --- /dev/null +++ b/packs/.gitignore @@ -0,0 +1,8 @@ +*.ldb +*.log +CURRENT +LOCK +LOG* +MANIFEST* +#* +#!_source diff --git a/packs/generate/legendary/build-pack.sh b/packs/generate/legendary/build-pack.sh new file mode 100755 index 0000000..54ad4fb --- /dev/null +++ b/packs/generate/legendary/build-pack.sh @@ -0,0 +1,16 @@ +#!/bin/bash +PACK=$1 +[ ! -d $1 ] && { echo -e "\033[0;31mERROR:\033[0m No such directory $PACK"; exit 1; } +cd $1 +PACKTYPE=$(grep "^type=" pack.properties| cut -d= -f2) +[ -d build ] && rm -rf build +mkdir build +python3 ./generate-$PACK.py build +if [ $? -eq 0 ]; then + [ -d unique -a ! -z "$( ls -A $PWD/unique/*.json 2>/dev/null )" ] && cp unique/*.json build + fvtt package pack -n $PACK -v --type System --id sohl -t $PACKTYPE --in build --out ../../.. +else + echo -e "\033[0;31mERROR:\033[0m Build Failed!!" + rm -rf build + exit 1 +fi diff --git a/packs/generate/legendary/build.sh b/packs/generate/legendary/build.sh new file mode 100755 index 0000000..1be34df --- /dev/null +++ b/packs/generate/legendary/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash +for i in leg-characters leg-creatures leg-characteristics leg-mysteries leg-possessions; do + ./build-pack.sh $i + [ $? ] || exit 1 +done diff --git a/packs/generate/legendary/leg-characteristics/clean.py b/packs/generate/legendary/leg-characteristics/clean.py new file mode 100755 index 0000000..0915044 --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/clean.py @@ -0,0 +1,27 @@ +#!./venv/bin/python3 + +from ruamel.yaml import YAML +from ruamel.yaml.scalarstring import LiteralScalarString +import json +import argparse +from unidecode import unidecode +from mergedeep import merge +from lxml import etree, html +import re +import sys, textwrap +from bs4 import BeautifulSoup as bs + +def LS(s): + return LiteralScalarString(textwrap.dedent(s)) + +yaml = YAML() + +with open("./data/traits.yaml", "r", encoding="utf8") as infile: + traitsData = yaml.load(infile) + +for trait in traitsData: + if trait["description"]: + soup = bs(LS(trait["description"]), features="lxml") + trait["description"] = soup.prettify(); + +yaml.dump(traitsData, sys.stdout) diff --git a/packs/generate/legendary/leg-characteristics/data/afflictions.yaml b/packs/generate/legendary/leg-characteristics/data/afflictions.yaml new file mode 100644 index 0000000..642ce37 --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/data/afflictions.yaml @@ -0,0 +1,820 @@ +- name: Black Death + id: gNNVfPh0ooYkfJZU + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

The Black Death, also known as the bubonic plague, is an infectious disease caused by the bacterium Yersinia pestis. It was responsible for devastating pandemics. Transmitted primarily through the bites of infected fleas on rodents, the disease presents with sudden high fever, chills, headache, muscle aches, and swollen lymph nodes known as buboes, which can become blackened. If untreated, it can progress to septicemic or pneumonic plague, both of which are more deadly. Without timely medical intervention, the mortality rate is exceedingly high.

+

Cause: Bacterium Yersinia pestis, often transmitted by flea bites from rodents + Symptoms: Initial symptoms include sudden onset of fever, chills, headache, fatigue, and muscle aches. Swollen, painful lymph nodes (buboes) typically develop in the groin, armpits, or neck. + Progression: If untreated, the infection can progress to septicemic plague (bacteria enter the bloodstream) causing abdominal pain, shock, and bleeding into the skin and other organs, or pneumonic plague (infecting the lungs) causing severe respiratory symptoms and a high risk of person-to-person transmission. + Treatment:

+
    +
  • Herbal antibiotics (Garlic, Echinacea, Goldenseal)
  • +
  • Lancing buboes (may result in infection)
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Leprosy + id: JLwnXqD0Ih30vIQY + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 1 + transmission: contact + description: |- +

Leprosy, or Hansen’s disease, is a chronic infectious disease caused by the bacterium Mycobacterium leprae. This disease primarily affects the skin, peripheral nerves, mucosal surfaces of the upper respiratory tract, and the eyes. Early symptoms include light or dark skin patches with loss of sensation, as well as muscle weakness. If left untreated, it can lead to severe nerve damage, resulting in debilitating complications like muscle wasting, paralysis, and deformities. Leprosy is not highly contagious, but prolonged, close contact with untreated cases can lead to transmission.

+

Cause: Bacterium Mycobacterium leprae + Symptoms: Early signs include discolored skin patches with loss of sensation, numbness, and weakness in the hands and feet. Muscle weakness and eye problems like dry eyes and reduced blinking may occur. + Progression: If untreated, the disease can cause progressive and permanent damage to the skin, nerves, limbs, and eyes. Severe cases result in significant disfigurement and disability, including clawed hands, dropped foot, and blindness. + Treatment:

+
    +
  • Neem leaves (antimicrobial) can be applied as a paste on affected areas or consumed as tea.
  • +
  • Chaulmoogra Oil used in various forms.
  • +
  • Possible amputation of affected limbs.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Smallpox + id: ft652e2oEuiW1EOq + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: airborne + description: |- +

Smallpox is an acute, contagious disease caused by the variola virus. The disease starts with high fever, fatigue, headache, and back pain, followed by a characteristic rash that progresses from macules to papules, vesicles, pustules, and scabs over the course of weeks. The rash is most dense on the face and extremities, and survivors often bear deep scars. Severe cases can cause blindness and death, but smallpox no longer poses a threat thanks to the success of vaccines.

+

Cause: Variola virus + Symptoms: Begins with high fever, fatigue, headache, and back pain. This is followed by the development of a characteristic rash, starting as red spots on the face and spreading to the arms, legs, and torso. These spots turn into pus-filled sores that eventually scab over and fall off. + Progression: Over a span of about two weeks, the sores evolve through stages of macules, papules, vesicles, pustules, and finally scabs. Severe cases can lead to blindness, permanent scarring, and death. + Treatment:

+
    +
  • Neem leaves used to bathe skin
  • +
  • Aloe Vera to sooth skin
  • +
  • Topical Calendula to promote healing
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Typhoid Fever + id: G7W1ahZqC5iXEINh + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: injested + description: |- +

Typhoid fever is a life-threatening bacterial infection caused by Salmonella typhi, often spread through contaminated water or food. The symptoms include prolonged high fever, fatigue, headache, abdominal pain, loss of appetite, and sometimes a distinctive rash of flat, rose-colored spots. Without treatment, the disease can cause serious complications such as intestinal perforation and hemorrhage, leading to septicemia and potentially death. Typhoid fever is particularly prevalent in areas with poor sanitation and limited clean water access.

+

Cause: Bacterium Salmonella typhi, usually spread through contaminated food or water + Symptoms: Initial symptoms include prolonged fever, fatigue, headache, nausea, and abdominal pain. Patients may also experience diarrhea or constipation, and a characteristic rash of flat, rose-colored spots may appear. + Progression: If untreated, the disease can cause serious complications, including intestinal bleeding or perforation, which can lead to severe abdominal pain, shock, and death. + Treatment:

+
    +
  • Herbal antibiotics (Garlic, Echinacea, Goldenseal)
  • +
  • Fever reducers (basil)
  • +
  • Clove used to alleviate infection
  • +
  • Rest and fluids; prayer may be helpful.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Chicken Pox + id: JRZbKLzCE4lM3PeX + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: airborne + description: |- +

Chicken pox, caused by the varicella-zoster virus (VZV), is a highly contagious viral infection primarily affecting children. Symptoms start with fever, fatigue, and headache, followed by an itchy rash that turns into fluid-filled blisters, eventually crusting over. The rash usually begins on the face, back, and chest before spreading to the rest of the body. Though usually mild, chickenpox can lead to complications such as bacterial infections of the skin, pneumonia, and encephalitis, particularly in immunocompromised individuals. Immunization with the varicella vaccine has significantly reduced the incidence of chickenpox.

+

Cause: Varicella-zoster virus (VZV) + Symptoms: Initial symptoms are fever, fatigue, and headache, followed by a highly itchy rash that starts as small red spots and progresses to fluid-filled blisters. These blisters eventually burst and form scabs. + Progression: The rash typically appears in multiple waves, starting on the face, back, and chest before spreading to the rest of the body. Complications can include bacterial infections of the skin, pneumonia, and encephalitis (brain inflammation). + Treatment:

+
    +
  • Oatmeal Baths to reduce itching and soothe skin
  • +
  • Calendula applied topically to reduce inflammation
  • +
  • Chamomile applied topically or bath infusion to soothe skin
  • +
  • Supportive care to prevent patient from scratching and secondary infections
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Malaria + id: RuyvpAU3VHXfCCgQ + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Malaria is a parasitic disease caused by Plasmodium species, transmitted through the bites of infected Anopheles mosquitoes. It presents with cyclical episodes of fever, chills, sweating, headache, nausea, and vomiting. Severe malaria can cause anemia, respiratory distress, cerebral malaria (affecting the brain), multi-organ failure, and death, especially in young children and pregnant women in endemic regions. Prompt medical treatment with antimalarial drugs and preventive measures like mosquito nets and insect repellents are vital for controlling and treating the disease.

+

Cause: Plasmodium parasites, transmitted through the bite of infected Anopheles mosquitoes + Symptoms: Initial symptoms include high fever, chills, sweats, headaches, nausea, vomiting, and muscle pain, often occurring in cyclical patterns due to the lifecycle of the parasite. + Progression: Without treatment, malaria can lead to severe complications such as anemia, respiratory distress, cerebral malaria (affecting the brain), multiple organ failure, and death. + Treatments:

+
    +
  • Artemisia (Sweet Wormwood, source of artemisinin)
  • +
  • Cinchona bark (containing quinine)
  • +
  • Neem leaves (used to reduce fever and symptoms)
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Tuburculosis + id: cENpCaIDYMMmBt9v + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: airborne + description: |- +

Tuberculosis (TB) is a contagious bacterial infection caused by Mycobacterium tuberculosis, primarily affecting the lungs but can spread to other organs. Symptoms include a persistent cough that may produce blood-tinged sputum, chest pain, night sweats, fever, weight loss, and fatigue. TB spreads through airborne droplets when an infected person coughs or sneezes. If untreated, it can cause extensive lung damage, respiratory failure, and death. Multi-drug resistant TB is a growing concern, making early detection and consistent treatment critical for controlling the disease.

+

Cause: Bacterium Mycobacterium tuberculosis + Symptoms: Primary symptoms include a persistent cough that may produce blood-tinged sputum, chest pain, fatigue, weight loss, fever, and night sweats. + Progression: If untreated, TB can spread from the lungs to other parts of the body (extrapulmonary TB), including the spine, brain, and kidneys, causing severe health issues like meningitis, spinal pain, joint damage, and organ dysfunction. + Treatments:

+
    +
  • Herbal Antibacterials (Garlic, Echinacea, Goldenseal)
  • +
  • Ginger (to relieve symptoms of congestion and inflammation)
  • +
  • Peppermint (to soothe respiratory tract irritation)
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Cholera + id: G77cuNmZpBjx6pNU + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: injested + description: |- +

Cholera is an acute diarrheal illness caused by the bacterium Vibrio cholerae, usually spread through contaminated water or food. It is characterized by the sudden onset of profuse, watery diarrhea described as "rice-water stools," accompanied by vomiting and rapid dehydration. Severe dehydration can lead to shock, kidney failure, and death if not promptly treated. Cholera outbreaks are common in areas with poor water sanitation and insufficient access to clean drinking water. Immediate rehydration therapy, alongside antibiotic treatment, is essential to manage and control the disease.

+

Cause: Bacterium Vibrio cholerae, usually spread through contaminated water or food + Symptoms: The disease typically begins with sudden onset of profuse, watery diarrhea described as “rice-water stools,” accompanied by vomiting and leg cramps. + Progression: Rapid fluid loss can lead to severe dehydration, characterized by dry mouth, sunken eyes, low blood pressure, rapid heart rate, and shock. Without prompt rehydration, cholera can be fatal within hours. + Treatments:

+
    +
  • Ginger (reduce symptoms of nausea and vomiting)
  • +
  • Mint (ease digestive discomfort)
  • +
  • Clove (antibacterial)
  • +
  • Focus on rehydration using dilute salt-sugar solution
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Pneumonia + id: MWnYy93iS3DO1cqD + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: airborne + description: |- +

Pneumonia is an infectious respiratory condition where the air sacs in one or both lungs fill with fluid or pus, caused by bacteria (e.g., Streptococcus pneumoniae), viruses, or fungi. Symptoms include fever, chills, cough producing mucus, shortness of breath, chest pain, and fatigue. Severe cases can cause respiratory failure, sepsis, or lung abscesses. It poses a significant risk to young children, the elderly, and individuals with weakened immune systems. Treatment typically involves antibiotics for bacterial pneumonia, antiviral medications, rest, and fluids to maintain hydration.

+

Cause: Bacteria (e.g., Streptococcus pneumoniae), viruses (e.g., influenza), or fungi, leading to infection and inflammation of the air sacs in the lungs + Symptoms: Symptoms include a high fever, chills, cough producing green or yellow mucus, shortness of breath, chest pain, and fatigue. + Progression: If untreated, pneumonia can lead to complications like respiratory failure, sepsis (spread of infection to the bloodstream), lung abscesses, and pleural effusion (fluid around the lungs). + Treatments:

+
    +
  • Eucalyptus (inhaling steam can ease breathing)
  • +
  • Thyme (antimicrobial, used as tea)
  • +
  • Astragalus (boost immune response)
  • +
  • Enforce rest
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Bronchitis + id: 8yXf2j4lDpH7otHO + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: airborne + description: |- +

Bronchitis is the inflammation of the bronchial tubes, which carry air to and from the lungs, commonly caused by viral infections like colds and the flu. Symptoms include a persistent cough that produces mucus, wheezing, chest discomfort, shortness of breath, and fatigue. Acute bronchitis is usually self-limiting and resolves within weeks, while chronic bronchitis, typically related to smoking or long-term exposure to irritants, is a form of chronic obstructive pulmonary disease (COPD) that requires ongoing management. Treatment focuses on relieving symptoms and reducing exposure to irritants.

+

Cause: Typically viruses that cause colds and flu, but can also be caused by bacterial infections or irritants like smoke and pollution + Symptoms: Presentation includes a persistent cough that produces mucus, wheezing, shortness of breath, and chest discomfort. Acute bronchitis often follows a cold or respiratory infection. + Progression: Acute bronchitis is usually self-limiting, resolving within a few weeks. Chronic bronchitis, frequently caused by long-term exposure to irritants like tobacco smoke, can lead to chronic obstructive pulmonary disease (COPD). + Treatments:

+
    +
  • Licorice Root (soothe throat and anti-inflammatory)
  • +
  • Ginger (reduce inflammation and soothe respiration)
  • +
  • Peppermint (steam inhalation to clear airways)
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Measles + id: Dlzv1oqgflmAtInB + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: airborne + description: |- +

Measles is a highly contagious viral infection caused by the measles virus. It begins with high fever, cough, runny nose, and red eyes, followed by the appearance of Koplik spots inside the mouth and a red, blotchy rash that starts on the face and spreads to the rest of the body. Complications can include ear infections, severe diarrhea, pneumonia, encephalitis, and death, particularly in young children and immunocompromised individuals. Vaccination with the measles, mumps, and rubella (MMR) vaccine is highly effective in preventing the disease.

+

Cause: Measles virus + Symptoms: Initial symptoms include high fever, cough, runny nose, and red eyes. These are followed by the appearance of tiny white spots (Koplik spots) inside the mouth and a characteristic red rash that spreads from the face down to the rest of the body. + Progression: The rash usually subsides in about a week, but complications can include ear infections, severe diarrhea, pneumonia, encephalitis (brain inflammation), and death. + Treatments:

+
    +
  • Neem leaves (a bath to soothe skin and itching)
  • +
  • Calendula (topically to reduce skin inflammation)
  • +
  • Echinacea (support immune response)
  • +
  • Isolate to prevent transmission.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Dengue Fever + id: wB9ANiSb5sC9YX5P + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Dengue fever is a mosquito-borne viral illness caused by the dengue virus, transmitted by Aedes mosquitoes. Symptoms include high fever, severe headache, pain behind the eyes, joint and muscle pain (hence "breakbone fever"), rash, and mild bleeding manifestations like nose or gum bleeding. Most cases are self-limiting, but a severe form, dengue hemorrhagic fever, can result in severe bleeding, blood plasma leakage, organ damage, and potentially fatal dengue shock syndrome. Supportive care to manage symptoms and maintain hydration is critical.

+

Cause: Dengue virus, transmitted by Aedes mosquitoes + Symptoms: Presentation includes high fever, severe headache, pain behind the eyes, joint and muscle pain, rash, and mild bleeding (such as nose or gum bleeds). + Progression: Severe dengue (dengue hemorrhagic fever) can develop, causing bleeding, plasma leakage, shock, and potentially death. Recovery generally occurs within a few weeks, but severe forms may require hospitalization. + Treatments:

+
    +
  • Papaya Leaf Extract (to boost blood)
  • +
  • Giloy (boost immunity)
  • +
  • Coriander (teas to reduce fever)
  • +
  • Rest
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Leishmaniasis + id: nnRrIAu42BuORIP6 + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Leishmaniasis is a parasitic disease caused by Leishmania parasites, transmitted by the bite of infected sandflies. It manifests in two main forms: cutaneous, causing skin sores that can become ulcers, and visceral, affecting internal organs like the spleen and liver. Visceral leishmaniasis, also known as kala-azar, presents with fever, weight loss, anemia, enlarged spleen, and liver, and can be fatal if untreated. Cutaneous leishmaniasis may heal on its own but can leave significant scars. The disease primarily affects people in tropical and subtropical regions.

+

Cause: Leishmania parasites, transmitted by infected sandfly bites + Forms:

+
    +
  • Cutaneous leishmaniasis: Presents as skin sores that can develop into ulcers and leave scars.
  • +
  • Visceral leishmaniasis: Manifests with fever, weight loss, enlargement of the spleen and liver, and anemia. + Progression: Cutaneous leishmaniasis may heal spontaneously but leave notable scars. Visceral leishmaniasis can be fatal if untreated, causing significant organ damage and susceptibility to other infections. + Treatments:
      +
    • Neem leaves (to treat skin sores)
    • +
    • Aloe Vera (applied to lesions to soothe and heal)
    • +
    • Turmeric (topical or consumed for anti-inflammatory effects)
    • +
    • Surgical removal of infected tissue or nodules where possible
    • +
    +
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Elephantiasis + id: 6xeeY5YQQiPIe326 + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Elephantiasis, or lymphatic filariasis, is a parasitic infection caused by filarial worms (Wuchereria bancrofti, Brugia malayi, and Brugia timori), transmitted through mosquito bites. People afflicted develop severe swelling and thickening of the skin and underlying tissues, typically in the legs, arms, or genital area. The disease often starts asymptomatically, but chronic infection leads to lymphatic system damage, resulting in lymphedema and significant disability due to the grossly enlarged and disfigured body parts. The condition can cause significant physical impairment and social stigma.

+

Cause: Parasitic worms (filarial worms) transmitted by mosquito bites + Symptoms: Often initially asymptomatic. Chronic infection leads to severe swelling and thickening of the skin in the legs, arms, or genital area. + Progression: Without proper treatment and care, affected limbs can become grossly enlarged and disfigured, leading to disability, secondary infections, and severe social stigma. + Treatments:

+
    +
  • Garlic (to kill parasites)
  • +
  • Tumeric (anti-inflammatory to help with swelling)
  • +
  • Castor Bean oil (to reduce swelling)
  • +
  • Possible surgical drainage of lymphatic fluid.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: River Blindness + id: 3XsslO0k18M7rRWx + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

River blindness, or onchocerciasis, is a parasitic disease caused by the filarial worm Onchocerca volvulus, transmitted through the bites of infected blackflies. The disease results in severe itching, skin rashes, and nodules under the skin. Chronic infection can lead to vision impairment and eventual blindness due to the inflammatory response to dying microfilariae in the eyes.

+

Cause: Onchocerca volvulus worms, transmitted by blackfly bites + Symptoms: Initial symptoms include intense itching, skin rashes, and nodules under the skin. Severe cases result in vision impairment and eventual blindness. + Progression: Chronic skin lesions and persistent itching can lead to significant discomfort and skin conditions like leopard skin. The progressive vision loss ultimately leads to blindness if untreated. + Treatments:

+
    +
  • Neem oil (insecticidal, topical application)
  • +
  • Garlic (anti-parasite)
  • +
  • Black Walnut Hull (to kill parasites)
  • +
  • Surgical removal of skin nodules containing larvae.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Trachoma + id: 3BGrdy9PCIzWr20Y + img: systems/sohl/assets/icons/disease.svg + subType: disease + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: contact + description: |- +

Trachoma is a bacterial infection of the eye caused by Chlamydia trachomatis. It begins with symptoms like mild itching and irritation of the eyes and eyelids, followed by blurred vision and eye pain as the disease progresses. Repeated infections cause scarring of the inner eyelid, leading to trichiasis (inward turning of eyelashes) that scratch the cornea, resulting in blindness if untreated. The condition is closely linked to poor sanitation and hygiene.

+

Cause: Bacterial infection (Chlamydia trachomatis) spread by direct contact with infected eye discharge or via flies + Symptoms: Early symptoms include eye irritation, discharge, pain, and swelling of the eyelids. Repeated infections cause scarring of the inner eyelid, leading to trichiasis (inward turning of the eyelashes). + Progression: Progressive scarring of the cornea from trichiasis can lead to opacification and blindness if left untreated. + Treatments:

+
    +
  • Chamomile compress (soothe irritated eyes)
  • +
  • Aloe Vera (reduce inflammation and soothe eyes)
  • +
  • Goldenseal (antibacterial eye wash)
  • +
  • Surgery to correct in-turned eyelashes
  • +
+ macros: [] + effects: [] + flags: {} + folderId: AcBtDYVewyDiK9zA +- name: Hemotoxin + id: qgDF3vVDt9BX1B93 + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Hemotoxins are toxins that destroy red blood cells, disrupt blood clotting, and cause tissue damage. These toxins lead to symptoms including severe pain, swelling, bruising, and internal bleeding. The destructive effect on blood components and tissues can cause complications such as kidney failure and disseminated intravascular coagulation, where blood clots form throughout the bloodstream. Hemotoxins act by breaking down cell membranes and proteins, making the affected area necrotic, and causing extensive damage that requires immediate medical attention.

+

Symptoms and Progression:

+
    +
  • Initial: Severe pain and swelling at bite site, localized tissue damage.
  • +
  • Progression: Bleeding disorders (disseminated intravascular coagulation), vomiting, diarrhea, muscle tremors, severe swelling and bruising, systemic symptoms like hypotension, and potential kidney failure.
  • +
+

Treatments:

+
    +
  • Garlic: Applied as a poultice for its antibacterial and anti-inflammatory properties.
  • +
  • Activated Charcoal: Ingested to adsorb toxins.
  • +
  • Herbal Teas: Made from Echinacea or Goldenseal for immune support.
  • +
  • Debridement: Surgical removal of dead tissue.
  • +
  • Incision and Drainage: To alleviate pressure and prevent necrosis.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Neurotoxin + id: ieVNDIy56rNOgjzq + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Neurotoxins are a class of toxins that specifically target the nervous system, leading to paralysis, convulsions, and potentially death. Neurotoxins work by interfering with the transmission of nerve signals, either by blocking neurotransmitter release or by disrupting ion channels, which results in muscle paralysis and respiratory failure. Symptoms start with localized pain, numbness, and tingling, progressing to more severe systemic effects like muscle weakness, difficulty breathing, and, in severe cases, death if respiratory muscles are paralyzed.

+

Symptoms and Progression:

+
    +
  • Initial: Local pain, numbness, tingling.
  • +
  • Progression: Muscle paralysis, respiratory difficulty, drooling, slurred speech, loss of coordination, seizures, respiratory failure, and if untreated, death.
  • +
+

Treatments:

+
    +
  • Garlic: Consumed for its general anti-toxic properties.
  • +
  • Ginger: Consumed to improve blood circulation and mitigate the effects of the toxin.
  • +
  • Coconut Water: To maintain hydration and potentially neutralize toxins.
  • +
  • Supportive care through manual ventilation (if respiratory failure occurs) and keeping the patient calm and immobile.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Cytotoxin + id: uXdY3E1OzXepSS9S + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Cytotoxins are toxins that cause cell death and tissue damage at the site of the injection. These toxins destroy cell membranes and lead to localized necrosis, resulting in ulceration and other severe skin lesions. Symptoms include intense pain, redness, and swelling at the injection site, which can progress to large, necrotic wounds. Systemic effects may include fever, chills, and muscle aches, and if untreated, infection and sepsis can set in. The tissue damage caused by cytotoxins often requires surgical intervention to remove dead tissue and to promote healing.

+

Symptoms and Progression:

+
    +
  • Initial: Pain at the injection site, redness, and swelling.
  • +
  • Progression: Tissue necrosis, ulceration, systemic symptoms like fever, chills, and muscle aches; possible sepsis if infection spreads.
  • +
+

Treatments:

+
    +
  • Pineapple Pulp: Applied as poultice for its enzymatic debridement properties.
  • +
  • Turmeric: Mixed into a paste and applied for its anti-inflammatory properties.
  • +
  • Aloe Vera: Gel applied topically to promote healing.
  • +
  • Debridement: Removing necrotic tissue to prevent infection.
  • +
  • Wound Care: Regular cleaning and dressing of ulcers.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Hemorrhagic Venom + id: GF1c8zMqVPVGGAhW + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Hemorrhagic venom causes widespread bleeding and disrupts the body's ability to clot blood. These toxins lead to extensive internal and external bleeding due to their effect on blood vessel integrity and platelet function. Initial symptoms include severe pain and swelling at the injection site, rapidly followed by bruising and bleeding from gums, nose, and other mucous membranes. Hemorrhagic venom can lead to hemorrhagic shock, organ failure, and death if not treated promptly. The toxins damage capillaries and blood vessels, causing a loss of blood and plasma, and impair clotting mechanisms, leading to disseminated intravascular coagulation.

+

Symptoms and Progression:

+
    +
  • Initial: Intense pain, swelling, and bruising at injection site.
  • +
  • Progression: Systemic bleeding (internal and external), coagulation disorders, severe hypotension, organ failure, and death if untreated.
  • +
+

Treatments:

+
    +
  • Dandelion: Taken as a tea to support liver function.
  • +
  • Basil: Applied as a poultice to control bleeding and swelling.
  • +
  • Shepherd's Purse: Taken as a tincture to help stop bleeding.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Bee Venom + id: EMqdYaJ7X8tGEhRi + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Melittin is a major component of bee venom, responsible for the pain and inflammation associated with bee stings. It is a powerful anti-inflammatory agent that increases the permeability of cell membranes, leading to the lysis of cells and the release of cellular contents, which causes localized pain, redness, and swelling. In non-allergic individuals, these symptoms are typically mild and resolve within hours. However, in allergic individuals, melittin can trigger systemic reactions, including anaphylaxis, characterized by hives, swelling, difficulty breathing, and potentially, death if untreated.

+

Animals/Insects:

+
    +
  • Honey Bees + Vector of Transmission: Sting
  • +
+

Symptoms and Progression:

+
    +
  • Initial: Sharp pain, swelling, redness at the sting site.
  • +
  • Progression: For non-allergic individuals, symptoms subside within a few hours. In allergic individuals, systemic reactions such as hives, swelling (angioedema), difficulty breathing, and anaphylactic shock.
  • +
+

Treatments:

+
    +
  • Baking Soda Paste: Applied to neutralize venom.
  • +
  • Honey: Applied topically for its antimicrobial properties and soothing effect.
  • +
  • Plantain Leaf: Chewed and applied to draw out toxins and reduce inflammation.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Wasp Venom + id: SZ2fZ54CUPIhJz8I + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Wasp venom contains a complex mixture of toxins, including peptides, enzymes, and amines, such as phospholipases and hyaluronidases. These substances cause intense pain, swelling, and inflammation at the sting site by breaking down cellular membranes and promoting the release of inflammatory mediators. In some cases, particularly in individuals with venom allergies, wasp stings can cause severe systemic reactions, including anaphylaxis, characterized by extensive swelling, hives, difficulty breathing, and low blood pressure. The venom’s components can also degrade extracellular matrix components, facilitating the spread of other toxins through the tissues, exacerbating the body's inflammatory response, and leading to more severe localized and systemic effects.

+

Animals/Insects:

+
    +
  • Wasps and Hornets + Vector of Transmission: Sting
  • +
+

Symptoms and Progression:

+
    +
  • Initial: Severe pain, redness, swelling at the sting site.
  • +
  • Progression: Localized to severe systemic allergic reactions, including swelling (angioedema), urticaria, difficulty breathing, anaphylaxis.
  • +
+

Treatments:

+
    +
  • Vinegar Compress: Applied to the sting site to neutralize the alkaline venom.
  • +
  • Lavender Essential Oil: Applied to reduce pain and inflammation.
  • +
  • Papaya: Applied as a paste to break down venom proteins.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Cnidarian Toxin + id: dK0hw4BkUWAi5KiK + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Cnidarian toxins, found in creatures like jellyfish, are delivered through specialized cells called cnidocytes. These cells contain nematocysts, which release toxins upon contact with the skin, causing immediate, excruciating pain, welts, and sometimes systemic symptoms like nausea, vomiting, difficulty breathing, muscle spasms, and cardiovascular collapse in severe cases. Some varieties are highly potent and can cause death within minutes due to its cardiotoxic properties, leading to cardiac arrest. The toxins act by targeting the nervous system and dermal tissues, often resulting in severe inflammatory responses and potential necrosis at the site of contact.

+

Animals/Insects:

+
    +
  • Jellyfish and other aquatic species + Vector of Transmission: Contact with tentacles
  • +
+

Symptoms and Progression:

+
    +
  • Initial: Intense pain, burning, red or purplish welts.
  • +
  • Progression: Nausea, vomiting, difficulty breathing, muscle spasms, cardiovascular collapse in severe cases (especially box jellyfish).
  • +
+

Traditional/Homeopathic Treatments:

+
    +
  • Vinegar Rinse: To neutralize toxins (especially important for box jellyfish stings).
  • +
  • Baking Soda Paste: Applied to soothe skin irritation and pain.
  • +
  • Papaya: Applied topically to breakdown toxins and reduce pain.
  • +
  • Removal of tentacles using tweezers, followed by submersion in hot water to alleviate pain.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Protein Toxin + id: 1hB1Y3KMI1an8IOn + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Toxins from marine animals contain potent protein toxins that cause severe pain, swelling, and tissue necrosis. Contact with venomous spines results in the injection of these proteins, leading to immediate and intense pain that can radiate and intensify, potentially lasting for hours to days. The toxins disrupt cell membranes and interfere with cellular metabolism, causing localized tissue damage and systemic symptoms like fever, muscle weakness, and cardiovascular distress. Severe cases may involve shock and death if the venom spreads rapidly through the bloodstream. The excruciating pain and possible tissue necrosis necessitate prompt and effective first aid measures, such as hot water immersion, to denature the toxins.

+

Symptoms and Progression:

+
    +
  • Initial: Immediate and intense pain, swelling at the site of the sting.
  • +
  • Progression: Local necrosis, cardiovascular symptoms (hypotension, tachycardia), fever, and systemic toxicity leading to shock and potentially death if untreated.
  • +
+

Treatments:

+
    +
  • Hot Water Immersion: To denature proteins and relieve pain (not herbal but essential first aid).
  • +
  • Turmeric Paste: Applied to reduce inflammation and pain.
  • +
  • Garlic: Consumed to boost general health and potentially neutralize some toxins.
  • +
  • Removal of spines remains to prevent further toxin release and monitor for secondary infections.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Tetrodotoxin + id: zZjDfgjLxkRw2uHz + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Tetrodotoxin is a potent neurotoxin found in Octopuses and certain species of newts and frogs. It blocks sodium channels on nerve cell membranes, preventing nerve signal transmission, leading to paralysis. Initial symptoms include numbness and tingling around the mouth and extremities, followed by nausea, vomiting, and increasing paralysis that affects voluntary muscles. Most critically, it can lead to respiratory paralysis, causing death by asphyxiation if not treated promptly. Tetrodotoxin's high affinity for sodium channels makes it extremely lethal even in small quantities, with no known antidote, making immediate supportive care, such as artificial respiration, crucial for survival.

+

Animals/Insects:

+
    +
  • Octopus, newts and frogs + Vector of Transmission: Bite or ingestion
  • +
+

Symptoms and Progression:

+
    +
  • Initial: Numbness and tingling around the mouth, salivation, nausea.
  • +
  • Progression: Increasing paralysis starting with face and extremities, loss of motor function, respiratory paralysis, and death due to respiratory failure if untreated.
  • +
+

Treatments:

+
    +
  • Activated Charcoal: Ingested to try to adsorb toxins (primarily if ingested).
  • +
  • Ginger Tea: Consumed to reduce nausea and support mild detoxification processes.
  • +
  • Coconut Water: To support hydration and potentially neutralize toxins.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Poneratoxin + id: qzCiP0GibDhQ9mcg + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Poneratoxin is a powerful neurotoxic peptide. It affects voltage-gated sodium channels in nerve cells, leading to overexcitement of the nerves and excessive pain transmission. A sting delivers this toxin, resulting in an immediate, intense, and prolonged pain that can last up to 24 hours. The pain is often described as one of the most painful insect stings in the world. Though not typically fatal, the venom can cause significant local swelling, redness, and systemic reactions such as nausea, vomiting, and dizziness. The potent effects of poneratoxin make the sting a severe and memorable experience, often used in traditional initiation rites in some cultures.

+

Symptoms and Progression:

+
    +
  • Initial: Intense, burning pain often described as the most painful of insect stings.
  • +
  • Progression: Pain can last up to 24 hours, with possible systemic symptoms such as nausea, vomiting, and vertigo (though not typically fatal).
  • +
+

Traditional/Homeopathic Treatments:

+
    +
  • Plantain Leaf: Chewed and applied to the sting site to draw out toxins and reduce pain.
  • +
  • Clove Oil: Applied to numb the area and reduce pain.
  • +
  • Basil Poultice: For its anti-inflammatory and pain-relieving properties.
  • +
+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Arsenic + id: cKYHVFfg3w78eeEO + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: injested + description: |- +

Arsenic, often referred to as the "king of poisons," is a naturally occurring element that is commonly used for poisoning. It is favored for its potent and insidious effects, often administered secretly in food or drink.

+

Symptoms and Progression: Initial symptoms include abdominal pain, vomiting, and diarrhea, often mistaken for food poisoning. Over time, it causes severe dehydration, gastrointestinal bleeding, and damage to the kidneys and liver. Chronic exposure can lead to hair loss, skin changes, and neurological symptoms like numbness and confusion, which can eventually result in death.

+

Treatment: Activated charcoal to absorb the poison, emetics to induce vomiting (e.g., mustard seed in warm water), and milk or egg whites to coat the stomach lining. Hydration with herbal teas and electrolyte replenishment using natural sources like coconut water.

+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Belladonna + id: bzbN2G3r1SWRZMYt + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: injested + description: |- +

Belladonna contains tropane alkaloids such as atropine and scopolamine. It is used for poisoning and as a cosmetic to dilate pupils. Both the berries and leaves are extremely toxic.

+

Symptoms and Progression: Symptoms include dry mouth, difficulty swallowing, blurred vision, hallucinations, rapid heartbeat, and delirium. The progression can lead to convulsions, paralysis, coma, and death due to respiratory failure.

+

Treatment: Inducing vomiting with emetics like mustard seed and water, activated charcoal to absorb toxins, and using cold compresses to reduce fever. Cooling drinks to manage temperature and herbs like chamomile to calm the nervous system.

+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Hemlock + id: XiXrJMPZpSmdZrpv + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: injested + description: |- +

Hemlock (Conium maculatum) is a highly toxic plant. All parts of the plant contain toxic alkaloids, but the seeds and root are especially potent.

+

Symptoms and Progression: Symptoms begin with nervous system disturbances, including trembling, salivation, and dilated pupils. As poisoning progresses, muscle weakness and paralysis set in, starting from the extremities and moving inward. The victim eventually dies from respiratory failure as the diaphragm becomes paralyzed.

+

Treatment: Inducing vomiting with emetics, ingesting activated charcoal, and using supportive measures such as garlic and herbal infusions to maintain hydration.

+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Aconite + id: avyDvHvhyDC2zxVd + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Aconite contains highly potent alkaloids such as aconitine, which are used both for poisoning and applied to arrow tips as a weapon. Aconite can cause severe cardiac and neurological disturbances.

+

Symptoms and Progression: Symptoms include a burning sensation in the mouth and throat, vomiting, diarrhea, numbness, and muscle weakness. Progression leads to cardiac arrhythmias, respiratory paralysis, and death.

+

Treatment: An immediate emetic like mustard powder mixed with water, activated charcoal, and herbal teas (such as ginger or peppermint) to alleviate nausea and support digestion. Keeping the victim warm and calm to counteract shock.

+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Digitalis + id: ymlS24R2v3lM5fjO + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: injested + description: |- +

Digitalis is derived from the foxglove plant and contains cardiac glycosides. It is used in various formulas for poisoning and can be administered covertly due to its potency even in small amounts.

+

Symptoms and Progression: Symptoms include nausea, vomiting, diarrhea, confusion, visual disturbances (such as seeing halos), and severe cardiac effects like bradycardia or arrhythmias, potentially leading to cardiac arrest.

+

Treatment: Activated charcoal to absorb poison, infusion of licorice root to counteract some of the cardiac effects, and use of calming herbs like valerian to manage symptoms of distress.

+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Curare + id: QSI1Des4pKMMbCRO + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: vector + description: |- +

Curare is a plant-derived toxin used by indigenous tribes for its potent paralyzing effect, often used on arrow tips.

+

Symptoms and Progression: Curare blocks neuromuscular transmission, leading to muscle paralysis. Initial symptoms include weakness and difficulty moving, progressing rapidly to total paralysis, including respiratory muscles, resulting in death by asphyxiation if untreated.

+

Treatment: While detailed herbal countermeasures for curare are limited, maintaining airway patency and manual ventilation techniques are used to keep the victim breathing until the effect of the toxin wears off, alongside the use of stimulant herbs like caffeine-containing plants to stimulate the respiratory system.

+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Mandrake + id: jbQU6N7jQuWpoU7c + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: injested + description: |- +

Mandrake, known for its psychoactive and toxic properties, is used both medicinally and for poisoning. It contains tropane alkaloids such as hyoscyamine and scopolamine.

+

Symptoms and Progression: Symptoms include hallucinations, dilation of pupils, dry mouth, rapid heartbeat, and confusion. Large doses cause delirium, seizures, and death due to respiratory failure.

+

Treatment: Emesis induced with mustard seed water, activated charcoal, and calming herbal teas with chamomile or valerian to soothe the nervous system and provide supportive care.

+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB +- name: Ricin + id: V7zgaQ5ATKC1BXm0 + img: systems/sohl/assets/icons/poison-bottle.svg + subType: poisontoxin + diagnosisBonus: 0 + level: 1 + healingRate: 3 + contagionIndex: 3 + transmission: injested + description: |- +

Ricin is a highly potent toxin derived from the castor bean plant. Even a small amount can be lethal, making it a favored tool for assassination.

+

Symptoms and Progression: Initial symptoms (if ingested) include nausea, vomiting, diarrhea, and severe abdominal pain, leading to dehydration and a drop in blood pressure. Over days, it can cause liver, kidney, and spleen failure, leading to death.

+

Treatment: Immediate emesis, cleansing the stomach with emetics like mustard seed water, and supportive treatments such as herbal teas to manage dehydration and pain. No specific antidote, so focus is on systemic support.

+ macros: [] + effects: [] + flags: {} + folderId: ZSPorSdfrawLi3WB diff --git a/packs/generate/legendary/leg-characteristics/data/anatomies/humanoid.yaml b/packs/generate/legendary/leg-characteristics/data/anatomies/humanoid.yaml new file mode 100644 index 0000000..a4d83de --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/data/anatomies/humanoid.yaml @@ -0,0 +1,1056 @@ +properties: + name: Humanoid + id: M10pzGVlLgO1zsnh + notes: "" + textReference: "" + description: "" + defaultAim: "" + weaponLimbs: + - Left Arm + - Right Arm + - Left Arm, Right Arm + macros: [] + flags: {} + effects: [] +bodyZones: + - name: Head + id: XQJBDj4Zd2ILR5rH + img: systems/sohl/assets/icons/body.svg + desc: "" + aim: + - name: Body + probWeightBase: 1 + notes: "" + textReference: "" + description: "" + effects: [] + flags: + sohl: + zones: + - 1 + affectsMobility: true + affectedSkills: + - Acrobatics + - Climbing + - Legerdemain + - Melee + - Archery + - Riding + - Stealth + - Swimming + affectedAttributes: + - Agility + - Dexterity + - Strength + - name: Arms + id: DzyCHcZwLLZekBgq + img: systems/sohl/assets/icons/body.svg + desc: "" + aim: + - name: Body + probWeightBase: 1 + notes: "" + textReference: "" + description: "" + effects: [] + flags: + sohl: + zones: + - 2 + - 3 + affectsMobility: false + affectedSkills: + - Acrobatics + - Climbing + - Legerdemain + - Melee + - Archery + - Riding + - Swimming + affectedAttributes: + - Dexterity + - Strength + - name: Torso + id: qPncC1ZBr2H8lPSy + img: systems/sohl/assets/icons/body.svg + desc: "" + aim: + - name: Body + probWeightBase: 1 + notes: "" + textReference: "" + description: "" + effects: [] + flags: + sohl: + zones: + - 4 + - 5 + - 6 + - 7 + affectsMobility: true + affectedSkills: + - Acrobatics + - Climbing + - Melee + - Archery + - Riding + - Stealth + - Swimming + affectedAttributes: + - Agility + - Dexterity + - Strength + - name: Legs + id: KFrOQEbBNicAxikZ + img: systems/sohl/assets/icons/body.svg + desc: "" + aim: + - name: Body + probWeightBase: 1 + notes: "" + textReference: "" + description: "" + effects: [] + flags: + sohl: + zones: + - 8 + - 9 + - 10 + affectsMobility: true + affectedSkills: + - Acrobatics + - Climbing + - Melee + - Archery + - Riding + - Stealth + - Swimming + affectedAttributes: + - Agility + - Strength +bodyParts: + - name: Head + id: WljCPWk6oAmUZ73d + img: systems/sohl/assets/icons/body.svg + bodyZone: Head + abbrev: Head + canHoldItem: false + health: 16 + aim: + - name: Body + probWeightBase: 100 + notes: "" + textReference: "" + description: "" + effects: [] + flags: {} + - name: Left Arm + id: rnqBua6Rduc0u0P6 + img: systems/sohl/assets/icons/body.svg + bodyZone: Arms + abbrev: LArm + canHoldItem: true + health: 8 + aim: + - name: Body + probWeightBase: 50 + notes: "" + textReference: "" + description: "" + effects: [] + flags: {} + - name: Right Arm + id: Tsrx9WQ2L9HyAVvi + img: systems/sohl/assets/icons/body.svg + bodyZone: Arms + abbrev: RArm + canHoldItem: true + health: 8 + aim: + - name: Body + probWeightBase: 50 + notes: "" + textReference: "" + description: "" + effects: [] + flags: {} + - name: Torso + id: ltL67w6gOzXDgHYD + img: systems/sohl/assets/icons/body.svg + bodyZone: Torso + abbrev: Torso + canHoldItem: false + health: 16 + aim: + - name: Body + probWeightBase: 100 + notes: "" + textReference: "" + description: "" + effects: [] + flags: {} + - name: Left Leg + id: KocnXsjJtL3doBVr + img: systems/sohl/assets/icons/body.svg + bodyZone: Legs + abbrev: LLeg + canHoldItem: false + health: 8 + aim: + - name: Body + probWeightBase: 50 + notes: "" + textReference: "" + description: "" + effects: [] + flags: {} + - name: Right Leg + id: 30kOIuDmY81IosL4 + img: systems/sohl/assets/icons/body.svg + bodyZone: Legs + abbrev: RLeg + canHoldItem: false + health: 8 + aim: + - name: Body + probWeightBase: 50 + notes: "" + textReference: "" + description: "" + effects: [] + flags: {} +bodyLocations: + - name: Skull + id: 0XmtjaBJDxMk0Ucd + injuryLocation: Skull + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 5 + bleedingSevThreshold: 5 + affectsMobility: true + aim: + - name: Body + probWeightBase: 500 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Eye + id: 6kX9YIUIVja3Y0MP + injuryLocation: Eye + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 5 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 15 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Eye + id: QEfArWukfNxKta0f + injuryLocation: Eye + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 5 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 15 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Nose + id: QRVralNrMEk93Kwj + injuryLocation: Nose + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 30 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Cheek + id: 8J1XWjV1tsFyugVH + injuryLocation: Face + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 60 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Cheek + id: ofe4FzVdGkKkZQV2 + injuryLocation: Face + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 60 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Ear + id: UwvPtm6rbB5noi7l + injuryLocation: Face + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 15 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Ear + id: htpEEuxEAhz7AAsP + injuryLocation: Face + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 15 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Mouth + id: U30OhbPBl2QhBQoF + injuryLocation: Face + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 30 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Jaw + id: ogK3sN7cu2ajAT5K + injuryLocation: Face + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 60 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Neck + id: vZA6OW3EaN0ggS6U + injuryLocation: Neck + bodyPart: Head + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: -10 + shockValue: 5 + bleedingSevThreshold: 3 + affectsMobility: true + aim: + - name: Body + probWeightBase: 200 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Shoulder + id: nuInmwcEVKaPbhiH + injuryLocation: Shoulder + bodyPart: Left Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: 0 + shockValue: 3 + bleedingSevThreshold: 4 + affectsMobility: false + aim: + - name: Body + probWeightBase: 30 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Upper Arm + id: NGjZLBbjFzHdvv0l + injuryLocation: Upper Arm + bodyPart: Left Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: -20 + shockValue: 1 + bleedingSevThreshold: 5 + affectsMobility: false + aim: + - name: Body + probWeightBase: 30 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Elbow + id: ubWdclQbNEQ70pEe + injuryLocation: Elbow + bodyPart: Left Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: -20 + shockValue: 2 + bleedingSevThreshold: 5 + affectsMobility: false + aim: + - name: Body + probWeightBase: 10 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Forearm + id: 6mLZet21nySm9VVd + injuryLocation: Forearm + bodyPart: Left Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: -20 + shockValue: 1 + bleedingSevThreshold: 5 + affectsMobility: false + aim: + - name: Body + probWeightBase: 20 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Hand + id: SrpubIBD6K42tsO1 + injuryLocation: Hand + bodyPart: Left Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: -30 + shockValue: 2 + bleedingSevThreshold: 0 + affectsMobility: false + aim: + - name: Body + probWeightBase: 10 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Shoulder + id: V7F5ilVtTWnzoyu6 + injuryLocation: Shoulder + bodyPart: Right Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: 0 + shockValue: 3 + bleedingSevThreshold: 4 + affectsMobility: false + aim: + - name: Body + probWeightBase: 30 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Upper Arm + id: YfN7RARAAi0UrPld + injuryLocation: Upper Arm + bodyPart: Right Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: -20 + shockValue: 1 + bleedingSevThreshold: 5 + affectsMobility: false + aim: + - name: Body + probWeightBase: 30 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Elbow + id: 1kH02rurCS8ft63Q + injuryLocation: Elbow + bodyPart: Right Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: -20 + shockValue: 2 + bleedingSevThreshold: 5 + affectsMobility: false + aim: + - name: Body + probWeightBase: 10 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Forearm + id: pNB4IdNQHFPOnvwD + injuryLocation: Forearm + bodyPart: Right Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: -20 + shockValue: 1 + bleedingSevThreshold: 5 + affectsMobility: false + aim: + - name: Body + probWeightBase: 20 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Hand + id: Rfi2iUDdK2qQz2pv + injuryLocation: Hand + bodyPart: Right Arm + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: true + isRigid: false + amputatePenalty: -30 + shockValue: 2 + bleedingSevThreshold: 0 + affectsMobility: false + aim: + - name: Body + probWeightBase: 10 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Thorax + id: Sfp6lj3H6N20woHc + injuryLocation: Thorax + bodyPart: Torso + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 40 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Abdomen + id: GYWlGzJ1oE2QlVc0 + injuryLocation: Abdomen + bodyPart: Torso + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 3 + affectsMobility: true + aim: + - name: Body + probWeightBase: 40 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Pelvis + id: yMsU1PHsaPfGlygr + injuryLocation: Pelvis + bodyPart: Torso + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: false + isFumble: false + isRigid: false + amputatePenalty: 0 + shockValue: 4 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 20 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Thigh + id: pOsgjfKKFAr8I8aE + injuryLocation: Thigh + bodyPart: Left Leg + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: true + isFumble: false + isRigid: false + amputatePenalty: -10 + shockValue: 3 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 40 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Knee + id: gi2S9Dt4w46x2wOL + injuryLocation: Knee + bodyPart: Left Leg + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: true + isFumble: false + isRigid: false + amputatePenalty: -20 + shockValue: 2 + bleedingSevThreshold: 5 + affectsMobility: true + aim: + - name: Body + probWeightBase: 10 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Calf + id: IX6Bbg9YSahDwI45 + injuryLocation: Calf + bodyPart: Left Leg + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: true + isFumble: false + isRigid: false + amputatePenalty: -20 + shockValue: 1 + bleedingSevThreshold: 5 + affectsMobility: true + aim: + - name: Body + probWeightBase: 30 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Left Foot + id: REmu5X3CBlbfLqvh + injuryLocation: Foot + bodyPart: Left Leg + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: true + isFumble: false + isRigid: false + amputatePenalty: -20 + shockValue: 2 + bleedingSevThreshold: 0 + affectsMobility: true + aim: + - name: Body + probWeightBase: 20 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Thigh + id: AJwjP1rJBbmpamNe + injuryLocation: Thigh + bodyPart: Right Leg + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: true + isFumble: false + isRigid: false + amputatePenalty: -10 + shockValue: 3 + bleedingSevThreshold: 4 + affectsMobility: true + aim: + - name: Body + probWeightBase: 40 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Knee + id: WUnUX9Vw3f9aJXuR + injuryLocation: Knee + bodyPart: Right Leg + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: true + isFumble: false + isRigid: false + amputatePenalty: -20 + shockValue: 2 + bleedingSevThreshold: 5 + affectsMobility: true + aim: + - name: Body + probWeightBase: 10 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Calf + id: Zb9lV9AXinrSftXd + injuryLocation: Calf + bodyPart: Right Leg + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: true + isFumble: false + isRigid: false + amputatePenalty: -20 + shockValue: 1 + bleedingSevThreshold: 5 + affectsMobility: true + aim: + - name: Body + probWeightBase: 30 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} + - name: Right Foot + id: aGOXGJxHUfwnfB5M + injuryLocation: Foot + bodyPart: Right Leg + layers: "" + quality: 0 + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + isStumble: true + isFumble: false + isRigid: false + amputatePenalty: -20 + shockValue: 2 + bleedingSevThreshold: 0 + affectsMobility: true + aim: + - name: Body + probWeightBase: 20 + notes: "" + textReference: "" + desc: "" + macros: [] + effects: [] + flags: {} diff --git a/packs/generate/legendary/leg-characteristics/data/combatmaneuvers.yaml b/packs/generate/legendary/leg-characteristics/data/combatmaneuvers.yaml new file mode 100644 index 0000000..ce6a710 --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/data/combatmaneuvers.yaml @@ -0,0 +1,9 @@ +- name: Unarmed + abbrev: unarmed + id: B3NcsoGN9cSTKmxD + img: systems/sohl/assets/icons/high-punch.svg + macros: [] + effects: [] + flags: {} + description: "" + folderId: dv8AthmrwfYNGB1k diff --git a/packs/generate/legendary/leg-characteristics/data/combattechsm.yaml b/packs/generate/legendary/leg-characteristics/data/combattechsm.yaml new file mode 100644 index 0000000..4ac013b --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/data/combattechsm.yaml @@ -0,0 +1,240 @@ +- subDesc: Bite + combatManeuverId: B3NcsoGN9cSTKmxD + strikeModeNum: 1 + name: Unarmed + id: vMwD4xyoZAW4qDSy + img: systems/sohl/assets/icons/fangs.svg + mode: Bite + lengthBase: 0 + zoneDie: 2 + impactDie: 4 + impactMod: 0 + impactAspect: piercing + minParts: 1 + assocSkill: Melee + effectId: pQ9YRcot8fJbocKs + effectChanges: + - key: system.$traits.impactTAMod + mode: 5 + value: "3" + priority: null + - key: system.$traits.noBlock + mode: 5 + value: "true" + priority: null + description: "" + macros: [] + flags: {} + folderId: dv8AthmrwfYNGB1k +- subDesc: Grab Hold + combatManeuverId: B3NcsoGN9cSTKmxD + strikeModeNum: 2 + name: Unarmed + id: B1EfmuOl5CtGQihu + img: systems/sohl/assets/icons/grab-hold.svg + mode: Grab (Hold) + lengthBase: 1 + zoneDie: 4 + impactDie: 0 + impactMod: 0 + impactAspect: blunt + minParts: 1 + assocSkill: Melee + effectId: 2wpKRk0GtcarYDiu + effectChanges: + - key: system.$traits.strRoll + mode: 5 + value: "true" + priority: null + - key: system.$traits.noBlock + mode: 5 + value: "true" + priority: null + description: "" + macros: [] + flags: {} + folderId: dv8AthmrwfYNGB1k +- subDesc: Grab Take + combatManeuverId: B3NcsoGN9cSTKmxD + strikeModeNum: 3 + name: Unarmed + id: rvFq5FepPUInqjxf + img: systems/sohl/assets/icons/grab-take.svg + mode: Grab (Take) + lengthBase: 1 + zoneDie: 4 + impactDie: 0 + impactMod: 0 + impactAspect: blunt + minParts: 1 + assocSkill: Melee + effectId: pmW5pO68PG2edXDM + effectChanges: + - key: system.$traits.strRoll + mode: 5 + value: "true" + priority: null + - key: system.$traits.noBlock + mode: 5 + value: "true" + priority: null + description: "" + macros: [] + flags: {} + folderId: dv8AthmrwfYNGB1k +- subDesc: Headbutt + combatManeuverId: B3NcsoGN9cSTKmxD + strikeModeNum: 4 + name: Unarmed + id: pqTDFnehx61A64by + img: systems/sohl/assets/icons/headbutt.svg + mode: Headbutt + lengthBase: 0 + zoneDie: 4 + impactDie: 6 + impactMod: -2 + impactAspect: blunt + minParts: 1 + assocSkill: Melee + effectId: 9np3UCkkiY7jXrfm + effectChanges: + - key: system.$traits.noBlock + mode: 5 + value: "true" + priority: null + description: "" + macros: [] + flags: {} + folderId: dv8AthmrwfYNGB1k +- subDesc: Kick + combatManeuverId: B3NcsoGN9cSTKmxD + strikeModeNum: 5 + name: Unarmed + id: 8fIXUjAkKWfXRweO + img: systems/sohl/assets/icons/high-kick.svg + mode: Kick + lengthBase: 2 + zoneDie: 4 + impactDie: 6 + impactMod: -2 + impactAspect: blunt + minParts: 1 + assocSkill: Melee + effectId: CJTKxlie1nYfdL2q + effectChanges: + - key: system.$traits.lowAim + mode: 2 + value: "-20" + priority: null + - key: system.$traits.noBlock + mode: 5 + value: "true" + priority: null + description: "" + macros: [] + flags: {} + folderId: dv8AthmrwfYNGB1k +- subDesc: Limb Block + combatManeuverId: B3NcsoGN9cSTKmxD + strikeModeNum: 6 + name: Unarmed + id: xFAcnR7IGhEaR66R + img: systems/sohl/assets/icons/high-punch.svg + mode: Limb Block + lengthBase: 1 + zoneDie: 0 + impactDie: 0 + impactMod: 0 + impactAspect: blunt + minParts: 1 + assocSkill: Melee + effectId: BvLLfEhsPFsgLh3B + effectChanges: + - key: system.$traits.noAttack + mode: 5 + value: "true" + priority: null + description: "" + macros: [] + flags: {} + folderId: dv8AthmrwfYNGB1k +- subDesc: Press + combatManeuverId: B3NcsoGN9cSTKmxD + strikeModeNum: 7 + name: Unarmed + id: qtcn70JC4Fac5DrZ + img: systems/sohl/assets/icons/push.svg + mode: Press + lengthBase: 1 + zoneDie: 0 + impactDie: 0 + impactMod: 0 + impactAspect: blunt + minParts: 1 + assocSkill: Melee + effectId: rsGf6USPpR6OrzM9 + effectChanges: + - key: system.$traits.strRoll + mode: 5 + value: "true" + priority: null + - key: system.$traits.noBlock + mode: 5 + value: "true" + priority: null + description: "" + macros: [] + flags: {} + folderId: dv8AthmrwfYNGB1k +- subDesc: Punch + combatManeuverId: B3NcsoGN9cSTKmxD + strikeModeNum: 8 + name: Unarmed + id: m2qf74BvOkEk0cQx + img: systems/sohl/assets/icons/punch-blast.svg + mode: Punch + lengthBase: 1 + zoneDie: 4 + impactDie: 6 + impactMod: -3 + impactAspect: blunt + minParts: 1 + assocSkill: Melee + effectId: HekLiZmYPPet6ByF + effectChanges: + - key: system.$traits.impactTAMod + mode: 5 + value: "2" + priority: null + description: "" + macros: [] + flags: {} + folderId: dv8AthmrwfYNGB1k +- subDesc: Trip + combatManeuverId: B3NcsoGN9cSTKmxD + strikeModeNum: 9 + name: Unarmed + id: MfUTMbvLNcjIdc0q + img: systems/sohl/assets/icons/trip.svg + mode: Trip + lengthBase: 2 + zoneDie: 0 + impactDie: 0 + impactMod: 0 + impactAspect: blunt + minParts: 1 + assocSkill: Melee + effectId: lyDBrC6e1Ag4qlMy + effectChanges: + - key: system.$traits.strRoll + mode: 5 + value: "true" + priority: null + - key: system.$traits.noBlock + mode: 5 + value: "true" + priority: null + description: "" + macros: [] + flags: {} + folderId: dv8AthmrwfYNGB1k diff --git a/packs/generate/legendary/leg-characteristics/data/folders.yaml b/packs/generate/legendary/leg-characteristics/data/folders.yaml new file mode 100644 index 0000000..8001f4a --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/data/folders.yaml @@ -0,0 +1,100 @@ +- name: Combat Maneuvers + id: dv8AthmrwfYNGB1k + parentFolderId: "" + color: '#d35400' +- name: Afflictions + id: BXfH5cKFM0lUbyhg + parentFolderId: "" + color: '#008000' +- name: Privation + id: 8Iba2eERxhfxORbT + parentFolderId: "BXfH5cKFM0lUbyhg" + color: '#008000' +- name: Diseases + id: AcBtDYVewyDiK9zA + parentFolderId: "BXfH5cKFM0lUbyhg" + color: '#008000' +- name: Poisons and Toxins + id: ZSPorSdfrawLi3WB + parentFolderId: "BXfH5cKFM0lUbyhg" + color: '#008000' +- name: Fatigue + id: G42U6CAVxSN4mfwC + parentFolderId: "BXfH5cKFM0lUbyhg" + color: '#008000' +- name: Body Types + id: P390fTDcDdREKmgz + parentFolderId: "" + color: '#b13de1' +- name: Skills + id: I7NdWG9IXkYkhYci + parentFolderId: "" + color: '#2337c9' +- name: Social + id: WETqhTfzZHlHlhuy + parentFolderId: "I7NdWG9IXkYkhYci" + color: '#ca3232' +- name: Nature + id: RiDyrDDcTmeSzOcJ + parentFolderId: "I7NdWG9IXkYkhYci" + color: '#ca3232' +- name: Craft + id: fAsGJTF5UFEssnmo + parentFolderId: "I7NdWG9IXkYkhYci" + color: '#ca3232' +- name: Lore + id: Di55poEX3myHuOuH + parentFolderId: "I7NdWG9IXkYkhYci" + color: '#ca3232' +- name: Physical + id: PI37Jcl41Y2em4KB + parentFolderId: "I7NdWG9IXkYkhYci" + color: '#ca3232' +- name: Combat + id: iCteCHglnfCfQqra + parentFolderId: "I7NdWG9IXkYkhYci" + color: '#ca3232' +- name: Esoteric + id: 5ZTScnOxLg4we0Zo + parentFolderId: "I7NdWG9IXkYkhYci" + color: '#ca3232' +- name: Languages & Scripts + id: evxGl6bHAVpxkHmN + parentFolderId: "I7NdWG9IXkYkhYci" + color: '#007a6c' +- name: Rituals + id: 7ndtuoO1haJpQbgf + parentFolderId: "I7NdWG9IXkYkhYci" + color: '#ca3232' +- name: Traits + id: XdOdcvH09hknfMZT + parentFolderId: "" + color: '#800080' +- name: Attributes + id: R0pSLJ4ywoJDzlGV + parentFolderId: "XdOdcvH09hknfMZT" + color: '#800080' +- name: Phobias + id: hOkudCNKvBOsAOXZ + parentFolderId: "XdOdcvH09hknfMZT" + color: '#800080' +- name: Physical + id: CAUS3HGrmqiL6vfB + parentFolderId: "XdOdcvH09hknfMZT" + color: '#800080' +- name: Personality + id: kjsxfInFZPEobmw1 + parentFolderId: "XdOdcvH09hknfMZT" + color: '#800080' +- name: Minor Traits + id: Cy4Z52IyVq4eZJOG + parentFolderId: "kjsxfInFZPEobmw1" + color: '#800080' +- name: Major Disorders + id: jPLSjYkEI5NGTK0X + parentFolderId: "kjsxfInFZPEobmw1" + color: '#800080' +- name: Transcendant + id: z6GcCOGsuwgwN1Ya + parentFolderId: "XdOdcvH09hknfMZT" + color: '#800080' diff --git a/packs/generate/legendary/leg-characteristics/data/skills.yaml b/packs/generate/legendary/leg-characteristics/data/skills.yaml new file mode 100644 index 0000000..36250d2 --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/data/skills.yaml @@ -0,0 +1,1276 @@ +- name: Common + abbrev: common + id: N21J8mDOazsflqZR + img: systems/sohl/assets/icons/speaking.svg + subType: language + skillBaseFormula: '@elo, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: evxGl6bHAVpxkHmN + initSM: 0 + baseSkill: '' +- name: Runic + abbrev: runic + id: zhF7K76YOQR30Vfg + img: systems/sohl/assets/icons/scroll-unfurled.svg + subType: script + skillBaseFormula: '@rea, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: evxGl6bHAVpxkHmN + initSM: 0 + baseSkill: '' +- name: Baldr + abbrev: baldr + id: OGscVILhTEGU7lMH + img: systems/sohl/assets/icons/baldr.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: baldr + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Fréyr + abbrev: freyr + id: mKLVtYgn4i4ccewY + img: systems/sohl/assets/icons/freyr.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: freyr + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Fréyja + abbrev: freyja + id: K97emgToaRPnxN4U + img: systems/sohl/assets/icons/freyja.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: freyja + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Hél + abbrev: hel + id: yHFeO6gQBSBkiBYF + img: systems/sohl/assets/icons/hel.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: hel + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Lôki + abbrev: loki + id: x4EAGBTIXFOhbtpI + img: systems/sohl/assets/icons/loki.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: loki + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Óðinn + abbrev: odin + id: 0z9eUnaUZeqbviPG + img: systems/sohl/assets/icons/odin.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: odin + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Súrtr + abbrev: surtr + id: 8qeYtGLMkIEEi8MW + img: systems/sohl/assets/icons/surtr.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: surtr + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Thórr + abbrev: thor + id: peDG8tkupCt971e9 + img: systems/sohl/assets/icons/thor.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: thor + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Týr + abbrev: tyr + id: Lj7p8esiNl2DbVn8 + img: systems/sohl/assets/icons/tyr.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: tyr + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Ymir + abbrev: ymir + id: BrCukVDUl8wcZKoi + img: systems/sohl/assets/icons/ymir.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: ymir + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Acrobatics + abbrev: acro + id: AsaVT4JV85rFSTvY + img: systems/sohl/assets/icons/acrobatics.svg + subType: physical + skillBaseFormula: '@agl, @end' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: PI37Jcl41Y2em4KB + initSM: 0 + baseSkill: '' +- name: Agriculture + abbrev: agri + id: 31ZqIOMd9sPbgiqe + img: systems/sohl/assets/icons/agriculture.svg + subType: nature + skillBaseFormula: '@per, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 0 + baseSkill: '' +- name: Alchemy + abbrev: alch + id: cps4oF5nVBFlLj0y + img: systems/sohl/assets/icons/alchemy.svg + subType: esoteric + skillBaseFormula: '@aur, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: 5ZTScnOxLg4we0Zo + initSM: 0 + baseSkill: '' +- name: Animalcraft + abbrev: anmcft + id: K1sBrJikLWiQIjjB + img: systems/sohl/assets/icons/animalcraft.svg + subType: nature + skillBaseFormula: '@emp, @wil' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 0 + baseSkill: '' +- name: Astrology + abbrev: astr + id: 5oD9W0X60sEkNsqH + img: systems/sohl/assets/icons/astrology.svg + subType: esoteric + skillBaseFormula: '@aur, @emp' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: 5ZTScnOxLg4we0Zo + initSM: 0 + baseSkill: '' +- name: Awareness + abbrev: awar + id: 5aSYfkXwlrZm6xzA + img: systems/sohl/assets/icons/awareness.svg + subType: physical + skillBaseFormula: '@per, @wil' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: PI37Jcl41Y2em4KB + initSM: 3 + baseSkill: '' +- name: Blowgun + abbrev: blgn + id: R7rWjxlXfWyX0i40 + img: systems/sohl/assets/icons/blowgun.svg + subType: combat + skillBaseFormula: '@per, @dex' + weaponGroup: missile + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 0 + baseSkill: '' +- name: Brewing + abbrev: brew + id: dT4YnBxLtCwWErLv + img: systems/sohl/assets/icons/brewing.svg + subType: lore + skillBaseFormula: '@per, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 0 + baseSkill: '' +- name: Ceramics + abbrev: cmcs + id: kZYgzXpACwVlWCzL + img: systems/sohl/assets/icons/ceramics.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Charm + abbrev: chrm + id: ghkiPEyMztj9Xh38 + img: systems/sohl/assets/icons/charm.svg + subType: social + skillBaseFormula: '@cml, @emp' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: WETqhTfzZHlHlhuy + initSM: 3 + baseSkill: '' +- name: Climbing + abbrev: clmb + id: 4FAPvWAKNoRPbdtz + img: systems/sohl/assets/icons/climbing.svg + subType: physical + skillBaseFormula: '@agl, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: PI37Jcl41Y2em4KB + initSM: 3 + baseSkill: '' +- name: Command + abbrev: cmd + id: uDJwA2LHQXHhHr6p + img: systems/sohl/assets/icons/rhetoric.svg + subType: social + skillBaseFormula: '@wil, @elo' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: WETqhTfzZHlHlhuy + initSM: 2 + baseSkill: '' +- name: Cookery + abbrev: cook + id: RcPswIec44IFMKew + img: systems/sohl/assets/icons/cookery.svg + subType: lore + skillBaseFormula: '@per, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 2 + baseSkill: '' +- name: Dancing + abbrev: dnce + id: SDwtBltYD0tQAXRG + img: systems/sohl/assets/icons/dance.svg + subType: physical + skillBaseFormula: '@agl, @end' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: PI37Jcl41Y2em4KB + initSM: 2 + baseSkill: '' +- name: Discourse + abbrev: dscr + id: 8Bl2wEGbjtG0BIbh + img: systems/sohl/assets/icons/face-to-face.svg + subType: social + skillBaseFormula: '@rea, @elo' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: WETqhTfzZHlHlhuy + initSM: 2 + baseSkill: '' +- name: Dodge + abbrev: dge + id: NYQ0l87HDML9CIYT + img: systems/sohl/assets/icons/dodge.svg + subType: combat + skillBaseFormula: '@agl, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 2 + baseSkill: '' +- name: Drawing + abbrev: draw + id: WaeJaU0YihDlJ2pY + img: systems/sohl/assets/icons/drawing.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 2 + baseSkill: '' +- name: Embalming + abbrev: embl + id: 73yZAkKbC0Azo4dw + img: systems/sohl/assets/icons/embalming.svg + subType: lore + skillBaseFormula: '@rea, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 0 + baseSkill: '' +- name: Engineering + abbrev: eng + id: Fip584W95bPFEJUp + img: systems/sohl/assets/icons/engineering.svg + subType: lore + skillBaseFormula: '@rea, @cre' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 0 + baseSkill: '' +- name: Fishing + abbrev: fish + id: cyyEUOoomBDdXda9 + img: systems/sohl/assets/icons/fishing.svg + subType: nature + skillBaseFormula: '@per, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 0 + baseSkill: '' +- name: Fletching + abbrev: fltch + id: tXcVbkB8qJsiBENc + img: systems/sohl/assets/icons/arrow.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Folklore + abbrev: folk + id: ZwmwSFkiYoH6qRty + img: systems/sohl/assets/icons/unicorn.svg + subType: lore + skillBaseFormula: '@rea, @wil' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 1 + baseSkill: '' +- name: Glassworking + abbrev: glas + id: baGHwmTYbwn7bON4 + img: systems/sohl/assets/icons/glassworking.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Guile + abbrev: guil + id: QP88ELEOcT37u5iY + img: systems/sohl/assets/icons/mischevous.svg + subType: social + skillBaseFormula: '@emp, @cre' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: WETqhTfzZHlHlhuy + initSM: 3 + baseSkill: '' +- name: Heraldry + abbrev: hrld + id: OlbJoKLPzyf04vVN + img: systems/sohl/assets/icons/heraldry.svg + subType: lore + skillBaseFormula: '@rea, @wil' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 0 + baseSkill: '' +- name: Herblore + abbrev: herb + id: d6bv7kUA4uEgtGOw + img: systems/sohl/assets/icons/herblore.svg + subType: nature + skillBaseFormula: '@rea, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 0 + baseSkill: '' +- name: Hideworking + abbrev: hide + id: 79p8qOAYPvErPBrG + img: systems/sohl/assets/icons/hidework.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Initiative + abbrev: init + id: m8pFDJhw72uj8kJ8 + img: systems/sohl/assets/icons/initiative.svg + subType: combat + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 3 + baseSkill: '' +- name: Instinctive Combat + abbrev: instcmbt + id: dX2DU2Wx8RA1ybVC + img: systems/sohl/assets/icons/claw.svg + subType: combat + skillBaseFormula: '@agl, @wil' + weaponGroup: melee + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 0 + baseSkill: '' +- name: Intrigue + abbrev: intr + id: 6HmrY8phCuDrflfO + img: systems/sohl/assets/icons/cloak-dagger.svg + subType: social + skillBaseFormula: '@emp, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: WETqhTfzZHlHlhuy + initSM: 3 + baseSkill: '' +- name: Jewelcraft + abbrev: jewl + id: pBeZLWzAeAEZAsWt + img: systems/sohl/assets/icons/jewel.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Jumping + abbrev: jump + id: NYysaIqvwz1Ir5mf + img: systems/sohl/assets/icons/jump-across.svg + subType: physical + skillBaseFormula: '@agl, @str' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: PI37Jcl41Y2em4KB + initSM: 4 + baseSkill: '' +- name: Language + abbrev: lang + id: 0WMCAQZCegZRDOrJ + img: systems/sohl/assets/icons/speaking.svg + subType: language + skillBaseFormula: '@elo, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: evxGl6bHAVpxkHmN + initSM: 0 + baseSkill: '' +- name: Law + abbrev: law + id: VsNFbPO46bCVDiMO + img: systems/sohl/assets/icons/law.svg + subType: lore + skillBaseFormula: '@rea, @wil' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 0 + baseSkill: '' +- name: Legerdemain + abbrev: lgdm + id: YDqesb2eObxgrdAj + img: systems/sohl/assets/icons/juggler.svg + subType: physical + skillBaseFormula: '@dex, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: PI37Jcl41Y2em4KB + initSM: 0 + baseSkill: '' +- name: Lockcraft + abbrev: lock + id: NPPfr5uMfRCDsch3 + img: systems/sohl/assets/icons/lock.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Masonry + abbrev: masn + id: kL8SqiGClE8YL98r + img: systems/sohl/assets/icons/masonry.svg + subType: craft + skillBaseFormula: '@per, @str' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Mathematics + abbrev: math + id: SLWaEQlzVIYj4MhH + img: systems/sohl/assets/icons/mathematics.svg + subType: lore + skillBaseFormula: '@rea, @cre' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 0 + baseSkill: '' +- name: Meteor Hammer + abbrev: metrhamr + id: 35dh7F81G8l3yngw + img: systems/sohl/assets/icons/bolas.svg + subType: combat + skillBaseFormula: '@dex, @agl' + weaponGroup: melee + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 0 + baseSkill: '' +- name: Melee + abbrev: melee + id: r04Yas6IuL9kUFAK + img: systems/sohl/assets/icons/crossed-swords.svg + subType: combat + skillBaseFormula: '@dex, @agl' + weaponGroup: melee + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 2 + baseSkill: '' +- name: Mercantilism + abbrev: mrcn + id: LafJjnaJfjef6cJI + img: systems/sohl/assets/icons/coins.svg + subType: lore + skillBaseFormula: '@per, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 0 + baseSkill: '' +- name: Metalcraft + abbrev: mtlc + id: AuTAhJALpmkM0BJL + img: systems/sohl/assets/icons/metal-bar.svg + subType: craft + skillBaseFormula: '@per, @str' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Milling + abbrev: mill + id: n4lzgjjiF2762IcU + img: systems/sohl/assets/icons/water-mill.svg + subType: craft + skillBaseFormula: '@per, @str' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Mineralogy + abbrev: mnrl + id: TLlhgMM0i7qW1UmG + img: systems/sohl/assets/icons/miner.svg + subType: nature + skillBaseFormula: '@rea, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 0 + baseSkill: '' +- name: Musician + abbrev: musc + id: qXqSLyV8VRxs6p8o + img: systems/sohl/assets/icons/harp.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Perfumery + abbrev: pfmy + id: PvpCkNMovXUzadsr + img: systems/sohl/assets/icons/perfume.svg + subType: lore + skillBaseFormula: '@per, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 0 + baseSkill: '' +- name: Physician + abbrev: pysn + id: k1krF4IVzO6hJgMl + img: systems/sohl/assets/icons/caduceus.svg + subType: lore + skillBaseFormula: '@rea, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 1 + baseSkill: '' +- name: Piloting + abbrev: pilt + id: s0gMtqw9zIFaOCv9 + img: systems/sohl/assets/icons/piloting.svg + subType: nature + skillBaseFormula: '@rea, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 0 + baseSkill: '' +- name: Magic + abbrev: pvarism + id: K5XmdHDxovuKxcxQ + img: systems/sohl/assets/icons/pvarism.svg + subType: esoteric + skillBaseFormula: '@aur, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: 5ZTScnOxLg4we0Zo + initSM: 0 + baseSkill: '' +- name: Riding + abbrev: ridg + id: DHSI4p4n2OBxf1bD + img: systems/sohl/assets/icons/horse-riding.svg + subType: physical + skillBaseFormula: '@emp, @agl' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: PI37Jcl41Y2em4KB + initSM: 1 + baseSkill: '' +- name: Ritual + abbrev: ritual + id: xrtIClZfNovPvXI8 + img: systems/sohl/assets/icons/circle.svg + subType: ritual + skillBaseFormula: '@wil, @rea' + weaponGroup: none + domain: ritual + macros: [] + effects: [] + flags: {} + description: '' + folderId: 7ndtuoO1haJpQbgf + initSM: 0 + baseSkill: '' +- name: Runecraft + abbrev: Rune + id: BciFc8QyZNpeu03s + img: systems/sohl/assets/icons/runecraft.svg + subType: esoteric + skillBaseFormula: '@aur, @emp' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: 5ZTScnOxLg4we0Zo + initSM: 0 + baseSkill: '' +- name: Script + abbrev: script + id: nCRpDhazp99DAlf7 + img: systems/sohl/assets/icons/scroll-unfurled.svg + subType: script + skillBaseFormula: '@rea, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: evxGl6bHAVpxkHmN + initSM: 0 + baseSkill: '' +- name: Seamanship + abbrev: smsh + id: jjf3TziTW0L8DMgz + img: systems/sohl/assets/icons/anchor.svg + subType: nature + skillBaseFormula: '@per, @wil' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 0 + baseSkill: '' +- name: Shipwright + abbrev: shpw + id: UalHN03Mhr6glT3r + img: systems/sohl/assets/icons/ship.svg + subType: lore + skillBaseFormula: '@rea, @cre' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: Di55poEX3myHuOuH + initSM: 0 + baseSkill: '' +- name: Shock + abbrev: shok + id: BAHwD5BQSFtfbfGD + img: systems/sohl/assets/icons/shock.svg + subType: combat + skillBaseFormula: '@str, @end' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 3 + baseSkill: '' +- name: Singing + abbrev: sing + id: CCqx4sjkxUIXUyLC + img: systems/sohl/assets/icons/sing.svg + subType: social + skillBaseFormula: '@voi, @cre' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 3 + baseSkill: '' +- name: Sling + abbrev: slng + id: lR1rlTeStCJvDwTR + img: systems/sohl/assets/icons/sling.svg + subType: combat + skillBaseFormula: '@dex, @per' + weaponGroup: missile + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 0 + baseSkill: '' +- name: Stealth + abbrev: stlth + id: YU9rN2c3R8eiC6Ih + img: systems/sohl/assets/icons/stealth.svg + subType: physical + skillBaseFormula: '@agl, @per' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: PI37Jcl41Y2em4KB + initSM: 3 + baseSkill: '' +- name: Summoning + abbrev: summ + id: 2SAir9JKa3rd7UbR + img: systems/sohl/assets/icons/enrage.svg + subType: esoteric + skillBaseFormula: '@aur, @elo' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: 5ZTScnOxLg4we0Zo + initSM: 0 + baseSkill: '' +- name: Survival + abbrev: srvl + id: OmfV1VgsGMZ1LJg7 + img: systems/sohl/assets/icons/survival.svg + subType: nature + skillBaseFormula: '@per, @wil' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 1 + baseSkill: '' +- name: Swimming + abbrev: swim + id: U1qbcjqVcFyiyaDe + img: systems/sohl/assets/icons/swimming.svg + subType: physical + skillBaseFormula: '@end, @agl' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: PI37Jcl41Y2em4KB + initSM: 1 + baseSkill: '' +- name: Talent + abbrev: tlnt + id: sb0iWwp6WzA6xrFq + img: systems/sohl/assets/icons/psychic-waves.svg + subType: esoteric + skillBaseFormula: '@aur, @wil' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: 5ZTScnOxLg4we0Zo + initSM: 0 + baseSkill: '' +- name: Tarotry + abbrev: tarot + id: V9Jm2BeuyksJEC4l + img: systems/sohl/assets/icons/tarotry.svg + subType: esoteric + skillBaseFormula: '@aur, @emp' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: 5ZTScnOxLg4we0Zo + initSM: 0 + baseSkill: '' +- name: Textilecraft + abbrev: txtl + id: CpzEUUXa7DSyqoEs + img: systems/sohl/assets/icons/textilecraft.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Theatrics + abbrev: thtcs + id: QiXS62ew4oy7fIEq + img: systems/sohl/assets/icons/drama-masks.svg + subType: social + skillBaseFormula: '@cre, @elo' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: WETqhTfzZHlHlhuy + initSM: 1 + baseSkill: '' +- name: Throwing + abbrev: thro + id: iOdCwOYdX9N6NeiD + img: systems/sohl/assets/icons/throw.svg + subType: combat + skillBaseFormula: '@dex, @per' + weaponGroup: missile + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 2 + baseSkill: '' +- name: Timbercraft + abbrev: timb + id: FHSFFv2uOTjTEhpt + img: systems/sohl/assets/icons/timber.svg + subType: nature + skillBaseFormula: '@per, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 0 + baseSkill: '' +- name: Tracking + abbrev: trak + id: r84g3zzaBmp1zDl4 + img: systems/sohl/assets/icons/tracking.svg + subType: nature + skillBaseFormula: '@per, @rea' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: RiDyrDDcTmeSzOcJ + initSM: 0 + baseSkill: '' +- name: Trance + abbrev: trnc + id: QUY1z2KG9kreEJTr + img: systems/sohl/assets/icons/meditation.svg + subType: esoteric + skillBaseFormula: '@aur, @cre' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: 5ZTScnOxLg4we0Zo + initSM: 0 + baseSkill: '' +- name: Unarmed Combat + abbrev: ucmb + id: S4F1g64XoDLZ4fEl + img: systems/sohl/assets/icons/crossed-swords.svg + subType: combat + skillBaseFormula: '@agl, @wil' + weaponGroup: melee + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: iCteCHglnfCfQqra + initSM: 0 + baseSkill: '' +- name: Weaponcraft + abbrev: wpnc + id: Zf8Z9rMwNJC0qFRe + img: systems/sohl/assets/icons/sword-smithing.svg + subType: craft + skillBaseFormula: '@per, @str' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' +- name: Woodworking + abbrev: wood + id: sOVLNMohekLbnHs7 + img: systems/sohl/assets/icons/woodcraft.svg + subType: craft + skillBaseFormula: '@per, @dex' + weaponGroup: none + domain: '' + macros: [] + effects: [] + flags: {} + description: '' + folderId: fAsGJTF5UFEssnmo + initSM: 0 + baseSkill: '' + diff --git a/packs/generate/legendary/leg-characteristics/data/traits.yaml b/packs/generate/legendary/leg-characteristics/data/traits.yaml new file mode 100644 index 0000000..427a62f --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/data/traits.yaml @@ -0,0 +1,9250 @@ +- name: Creativity + abbrev: cre + id: AG6QHBQCbkcVgYrj + img: systems/sohl/assets/icons/creativity.svg + subType: personality + description: "" + intensity: attribute + skillBaseFormula: '@cre' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Banal + maxValue: "4" + - label: Predictable + maxValue: "8" + - label: Average + maxValue: "12" + - label: Innovative + maxValue: "16" + - label: Visionary + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Eloquence + abbrev: elo + id: uX7asqHDkPWxVi1a + img: systems/sohl/assets/icons/oratory.svg + subType: personality + description: "" + intensity: attribute + skillBaseFormula: '@elo' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Incoherent + maxValue: "4" + - label: Muddled + maxValue: "8" + - label: Average + maxValue: "12" + - label: Articulate + maxValue: "16" + - label: Expressive + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Empathy + abbrev: emp + id: Pjlvi5DOwr2QLTg3 + img: systems/sohl/assets/icons/empathy.svg + subType: personality + description: "" + intensity: attribute + skillBaseFormula: '@emp' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Unfeeling + maxValue: "4" + - label: Remote + maxValue: "8" + - label: Average + maxValue: "12" + - label: Understanding + maxValue: "16" + - label: Sensitive + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Morality + abbrev: mor + id: qcuatkrxBTDfhOu9 + img: systems/sohl/assets/icons/morality.svg + subType: personality + description: "" + intensity: attribute + skillBaseFormula: '@mor' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Amoral + maxValue: "2" + - label: Immoral + maxValue: "4" + - label: Hipocritical + maxValue: "7" + - label: Unscrupulous + maxValue: "10" + - label: Conscientious + maxValue: "13" + - label: Principled + maxValue: "16" + - label: Virtuous + maxValue: "18" + - label: Paragon + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Reasoning + abbrev: rea + id: 6p1Mx0b9iatxBhfm + img: systems/sohl/assets/icons/reasoning.svg + subType: personality + description: "" + intensity: attribute + skillBaseFormula: '@rea' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Dim + maxValue: "4" + - label: Dull + maxValue: "8" + - label: Average + maxValue: "12" + - label: Sharp + maxValue: "16" + - label: Brilliant + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Will + abbrev: wil + id: 5Ujb7yXQ6ULMNIqY + img: systems/sohl/assets/icons/will.svg + subType: personality + description: "" + intensity: attribute + skillBaseFormula: '@wil' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Submissive + maxValue: "4" + - label: Indecisive + maxValue: "8" + - label: Average + maxValue: "12" + - label: Resolute + maxValue: "16" + - label: Implacable + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Aggressive + abbrev: aggressive + id: 5ev18rXcqae4iKJw + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Aggressive refers to a person’s tendency to respond to challenges, conflicts, or frustrations with hostility, dominance, or intimidation. Aggressive individuals often seek to assert control or power over others, sometimes through intimidation or force. While this trait can sometimes help them navigate difficult situations, it also risks alienating others and leading to conflict. In its most severe form, aggression can result in harmful actions and broken relationships.

+
    +
  • Benign Trait: Even at this stage, the individual is quick to resort to intimidation when confronted with difficulties or perceived threats. They are assertive, standing up for themselves and those around them, but often in a forceful or intimidating manner. While they generally manage to avoid physical confrontation, they rely on their strong presence and directness to overcome challenges, sometimes using fear or pressure to get their way. Despite their intimidating demeanor, they do not seek to harm others intentionally, though their approach may strain relationships.

    +
      +
    • Example (Benign Trait): Alaric, a blacksmith, responds to difficulties with a stern and forceful attitude. When a customer attempts to haggle over a price, Alaric steps forward and looms over the man, his voice low and commanding. The customer, intimidated, agrees to pay the full amount. While Alaric isn’t violent, his use of intimidation often ensures that others comply with his demands.
    • +
    +
  • +
  • Impulse Intensity: The individual’s aggression becomes more pronounced, with frequent confrontations and a tendency to escalate minor issues into major conflicts. They begin using aggressive tactics not just to resolve issues but to exert dominance over others. Their quick temper and impatience lead to confrontations where they may verbally lash out or physically intimidate people around them. This increasingly hostile behavior causes tension and alienation as others start avoiding them, unsure of when they will overreact.

    +
      +
    • Example (Impulse Intensity): Alaric’s aggressive behavior intensifies, and he now reacts to small inconveniences with anger. When a fellow blacksmith suggests he might need help on a large order, Alaric snaps, slamming his tools onto the workbench and yelling about how he doesn’t need anyone’s advice. His reputation for forceful behavior makes others wary of interacting with him, and even his apprentices start to avoid asking questions for fear of triggering his temper.
    • +
    +
  • +
  • Disorder Intensity (Uncontrolled Aggression): At its extreme, aggression becomes violent and uncontrolled, with the individual showing little concern for the harm they cause. They may lash out both physically and emotionally, disregarding the feelings or safety of others. Their aggressive outbursts become more frequent and severe, leading to serious consequences for their relationships, reputation, and possibly their legal standing. This level of aggression often results in deep social isolation, as their violent behavior alienates everyone around them.

    +
      +
    • Physical Symptoms: The individual may experience intense physical reactions to anger, such as elevated heart rate, muscle tension, or shaking. They may clench their fists, raise their voice, or feel an uncontrollable urge to lash out physically.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of domination, revenge, or violence. The individual may become obsessed with perceived slights, replaying conflicts in their mind and fantasizing about overpowering or punishing those who wronged them.

      +
    • +
    • Emotional Distress: The individual may experience constant frustration, anger, or dissatisfaction, struggling to maintain emotional control. They may feel regret or shame after outbursts, though they are unable to stop the cycle of hostility and violence.

      +
    • +
    • Example (Disorder Intensity): Alaric’s aggression spirals into violent outbursts. During an argument over a faulty delivery, he strikes the delivery man in a fit of rage, knocking him to the ground. The villagers, once wary of his intimidating demeanor, now fear for their safety around him. His blacksmith shop, once thriving, becomes empty as customers refuse to deal with his unpredictable temper. Alaric no longer feels guilty for his actions and blames others for provoking him, growing more isolated as his violent behavior destroys his relationships and reputation.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Partial Amnesia + abbrev: amnesiapartial + id: FDNixdF49dmtpqSJ + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Partial Amnesia refers to the loss of memory affecting specific events, people, or periods of time, while other memories remain intact. This type of amnesia may arise due to repressed trauma or fear of a terrifying event or period. The mind may block out painful or overwhelming memories as a defense mechanism, or the memory loss may result from physical damage to the brain. Those experiencing partial amnesia often struggle with confusion and frustration, especially when triggered by reminders of what they have forgotten, leading to emotional distress and difficulty reconciling the missing pieces of their past.

+
    +
  • Benign Trait: The individual experiences gaps in their memory but is otherwise able to function normally. Specific events, people, or periods may be forgotten, but these memory gaps do not significantly interfere with daily life. The individual may adapt to these missing memories, moving forward without dwelling too much on the past, whether the memory loss is due to trauma, fear, or injury.

    +
      +
    • Example (Benign Trait): Gareth, a former soldier, has missing memories of certain battles, but his day-to-day life is unaffected. He remembers his comrades and the general course of his military service, but key details of specific traumatic events are lost. While Gareth occasionally wonders about these missing pieces, he chooses to focus on the present and carries on with life, never pressing too hard to recover what’s gone.
    • +
    +
  • +
  • Impulse Intensity (Memory Loss from Trauma or Fear): The individual becomes increasingly aware of memory gaps, and these gaps may result from repressed trauma (physical or psychological) or a repressed fear of a terrifying event. They struggle with confusion and frustration as they attempt to piece together the lost moments of their life. Triggers associated with the forgotten memories, whether they stem from trauma or fear, provoke emotional distress, flashbacks, or anxiety similar to post-traumatic stress disorder (PTSD). The individual remains functional in daily life, but the persistent presence of missing memories and unexplained emotional reactions causes increasing anxiety, and they may start to avoid certain situations or stimuli that evoke these lost memories.

    +
      +
    • Example (Impulse Intensity): Gareth’s missing memories start to affect him more deeply, whether due to physical injury from his time in the army or his mind’s repression of the horror of battle. Whenever he hears trumpets—a sound that reminds him of a battle he cannot fully remember—he is seized with fear and anxiety. Fragmented images of comrades and battlefield chaos flash in his mind, but they remain disjointed, leaving Gareth frustrated and confused. While he continues with his life, the memories he has lost loom in the background, leaving him increasingly unsettled, and he avoids situations and people that might trigger these unsettling reactions.
    • +
    +
  • +
  • Disorder Intensity (Severe Emotional and Physical Distress): As partial amnesia worsens, the individual experiences more pronounced emotional distress from the missing memories, regardless of whether they stem from repressed trauma or fear of a past event. Triggers such as sounds, places, or visual cues associated with the forgotten memories provoke intense flashbacks, panic attacks, and debilitating anxiety. The individual becomes overwhelmed by the emotional and physical reactions to these gaps in their memory, struggling to understand their own past. They may feel isolated and disconnected, trapped between the pain of their lost memories and the confusion of being unable to recall them. These intense reactions severely impair their ability to function in daily life, and their relationships, sense of identity, and emotional well-being may deteriorate.

    +
      +
    • Physical Symptoms: The individual may experience panic attacks, nausea, hyperventilation, nightmares, or racing heartbeats when triggered by stimuli associated with their forgotten memories. The physical symptoms often mirror the emotional intensity of the traumatic, feared, or lost event, though they may not fully understand the source.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of the lost memories or moments, along with flashbacks or disturbing emotions tied to the gaps in their memory. The individual may become obsessed with trying to remember, even as they fear what those memories hold.

      +
    • +
    • Emotional Distress: The individual feels deeply distressed, alternating between fear, frustration, and helplessness. They may experience overwhelming anxiety, depression, or isolation as the emotional and physical toll of the missing memories disrupts their life.

      +
    • +
    • Example (Disorder Intensity): Gareth’s partial amnesia now consumes him, caused by the sheer terror he repressed. The sound of trumpets triggers vivid flashbacks, though the events remain incomplete in his mind. He becomes physically ill at the sound, his heart racing and his body shaking with anxiety. His nightmares are filled with faceless soldiers and the chaos of a battle he cannot fully recall. Gareth’s inability to remember key moments from his past leaves him feeling lost and disconnected. He withdraws from others, overwhelmed by the fear and confusion caused by the amnesia, and is unable to engage fully with life as the gaps in his memory widen the distance between his past and present.

      +
    • +
    +
  • +
+ intensity: disorder + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Total Amnesia + abbrev: amnesiatotal + id: Q9OsFkhEwtkfPAD1 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Total Amnesia involves the complete loss of all personal memories, including one’s identity, past experiences, and knowledge of one’s life. The profound loss of memory creates a sense of deep disorientation and confusion, as they struggle to rebuild a life without any foundation of personal identity. While they may retain certain skills or talents, these abilities feel foreign to them, as they are disconnected from the context of the individual's life. The inability to remember even basic details of their past can lead to feelings of isolation, fear, and vulnerability. They may experience emotional distress as they navigate the world with no sense of self, unable to connect with others on a personal level. Trust becomes difficult, both for the individual and for those around them, as the lack of personal history leaves others uncertain of their true nature. The mystery of retained skills only deepens the psychological strain, as the person is left questioning how they can perform tasks that their mind cannot remember learning.

+
    +
  • Physical Symptoms: The individual may suffer from disorientation, headaches, or physical fatigue as they struggle to adapt to a life with no memories. The emotional toll of constantly feeling lost can result in stress-related symptoms such as anxiety, trembling, or even insomnia.

    +
  • +
  • Intrusive Thoughts: Persistent confusion and frustration over their inability to recall anything from their past. The individual may obsess over the question of who they are, constantly seeking answers to the void in their memory.

    +
  • +
  • Emotional Distress: Feelings of deep insecurity, loneliness, and fear as they are unable to form emotional connections or understand their own identity. They may also experience distress or anxiety from the unexplained skills they possess, wondering whether their past is tied to dangerous or dark events they cannot remember.

    +
  • +
  • Example (Disorder Intensity): A mysterious traveler arrives in a small village, remembering nothing about his past—not even his own name. As the villagers try to help him, he astounds them by effortlessly performing complex acrobatic feats, wielding a sword with expert precision, and speaking multiple languages fluently. Despite these remarkable abilities, the traveler remains deeply confused and unsettled, unable to explain how he possesses such skills. The lack of memory leaves him vulnerable and isolated, as he questions who he truly is and what his past may hold. The villagers, while fascinated by his talents, begin to grow suspicious, wondering if his forgotten history hides a dark or dangerous secret. The traveler's total amnesia leaves him struggling not only with his identity but with the fear that his abilities may be linked to something ominous in his lost past.

    +
  • +
+ intensity: disorder + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Chronic Anger + abbrev: angerchronic + id: fVhhZVGxCrrnhY0z + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Chronic Anger is a condition where an individual experiences prolonged, persistent anger that affects their daily life and relationships. This type of anger may simmer beneath the surface, causing irritability and frustration, or it may erupt into frequent outbursts. While the individual may still function in society, their heightened sensitivity to perceived slights or frustrations often leads to strained relationships and increasing isolation. Over time, this condition can escalate into severe anger, with devastating consequences for personal and social well-being.

+
    +
  • Impulse Intensity: The individual feels a persistent undercurrent of anger or irritability, often triggered by minor frustrations. They may snap at others more frequently or hold grudges, but still manage to maintain basic social interactions. However, their patience is thin, and they struggle to find peace in their daily life.

    +
      +
    • Example (Impulse Intensity): Merchant Harwin feels a constant frustration that simmers beneath the surface. Small irritations—such as a late delivery or a miscount in his stock—set him off, leading to harsh words and tense exchanges with his workers. While he manages to keep his temper from escalating too often, those around him know to tread carefully.
    • +
    +
  • +
  • Disorder Intensity: As the anger intensifies, the individual’s emotional state is dominated by frequent, intense outbursts of rage. They may lash out verbally or physically at those around them, causing significant harm to relationships and social standing. This level of anger can lead to isolation, as people become fearful or avoidant of the individual. The person may lose control of their actions, damaging property, injuring others, or causing irreparable harm to their reputation.

    +
      +
    • Physical Symptoms: Persistent tension, frequent headaches, muscle aches, and elevated blood pressure due to constant anger. The individual may feel a sense of heat or trembling when anger flares, and their body remains in a heightened state of agitation.
    • +
    • Intrusive Thoughts: Constantly dwelling on perceived wrongs, fixating on how others have slighted or disrespected them. The individual may fantasize about revenge or feel an overwhelming urge to dominate or control those around them. They struggle to let go of anger, replaying incidents that fuel their rage.
    • +
    • Emotional Distress: Overwhelming feelings of helplessness in controlling their anger, deep frustration with the world, and a sense of alienation from those they care about. The individual may feel trapped in their rage, unsure how to break the cycle, which further isolates them from social interaction and support.
    • +
    • Example (Disorder Intensity): Lord Alric’s unrelenting anger makes him feared throughout his lands. Known for his violent outbursts, he punishes even the smallest mistake with brutal force, leaving his servants and family in constant fear of his wrath. His inability to control his temper has driven away his allies, and he is isolated in his manor, left with only the anger that consumes him. His reputation as a tyrant has spread, leading to unrest among his people, who live in dread of his unpredictable fury.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Antisocial + abbrev: antisocial + id: 9rDT4cqXppp1Lf63 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Antisocial refers to an individual’s tendency to avoid or withdraw from social interaction, preferring solitude over company. While antisocial behavior can be benign and reflect a preference for independence or quiet time, it can also intensify into impulsive avoidance of social situations or, in severe cases, a deep disregard for social norms and the well-being of others. This trait can evolve into disorderly behavior, manifesting as a lack of empathy and involvement in harmful or deceitful actions.

+
    +
  • Benign Trait: The individual prefers solitude or small, familiar groups, finding social interactions draining or unappealing. They may enjoy time alone to recharge, but they can still engage in social activities when necessary. Their avoidance of large social settings is a personal preference rather than an issue of anxiety or hostility, and they maintain respectful relationships with others despite their preference for solitude.

    +
      +
    • Example (Benign Trait): Maren, a village herbalist, often keeps to herself, enjoying the peace of her herb garden more than the bustling market square. She rarely attends festivals or social events, but when asked for help or advice, she is happy to interact with others. She prefers her quiet, solitary life but remains polite and respected by those in the village.
    • +
    +
  • +
  • Impulse Intensity (Disinterest in Social Interaction): The individual begins actively avoiding social situations, not out of fear or anxiety, but because they simply don’t care about interacting with others. They may see social interactions as unnecessary or bothersome and begin withdrawing from relationships, finding little value in maintaining connections with people. They lack concern for social obligations or expectations, seeing little reason to invest energy in pleasing others or following social norms. This indifference leads to isolation, as the individual finds it easier to focus on their own needs rather than engage with others.

    +
      +
    • Example (Impulse Intensity): Maren becomes more withdrawn because she feels social interactions are a waste of time. She avoids the market, feeling no need to engage with the villagers or maintain friendships. Maren is indifferent to what others think of her; she no longer cares if people think she’s rude or aloof. She prefers to spend her time alone, working on her herbal remedies, and ignores the growing distance between herself and the community.
    • +
    +
  • +
  • Disorder Intensity (Antisocial Personality Disorder): At its most extreme, antisocial behavior turns into a disregard for social norms, laws, or the well-being of others. The individual actively engages in harmful, deceitful, or manipulative behavior. They may lie, manipulate, or exploit others for personal gain, showing little to no remorse for their actions. This form of antisocial behavior is often accompanied by a lack of empathy, guilt, or consideration for the harm they cause, leading to fractured relationships, legal troubles, and deep emotional and societal consequences.

    +
      +
    • Physical Symptoms: The individual may experience heightened impulsivity, aggression, or restlessness. They may act without consideration of consequences, becoming involved in risky or dangerous activities.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of manipulating or exploiting others, with little regard for their feelings or well-being. They may focus on how to get what they want at the expense of others, without feeling guilt.

      +
    • +
    • Emotional Distress: The individual may feel isolated or alienated, but not necessarily distressed by their behavior. However, they may grow frustrated or angry when their actions result in negative consequences for themselves, even if they lack empathy for others.

      +
    • +
    • Example (Disorder Intensity): Maren’s antisocial behavior has evolved into a complete disregard for others. She now manipulates villagers into giving her more payment for simple remedies, often lying about the severity of their ailments to take advantage of their trust. When confronted, she shows no remorse, insisting that they deserve what they get for trusting her. Her reputation as a healer is now tarnished, but Maren cares little, focusing only on how to exploit others for her personal gain. The village grows wary of her, but her manipulation and deceit continue, as she no longer cares for the consequences of her actions.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Anxiety + abbrev: anxiety + id: 9II9RxYb1uxibIBa + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Anxiety is a condition characterized by excessive worry, fear, or nervousness that can significantly impact an individual's daily life. This heightened state of alertness and apprehension often arises in response to perceived threats or stressful situations, even when there is little or no actual danger. Anxiety can manifest both mentally and physically, leading to a range of symptoms that vary in intensity from mild discomfort to overwhelming panic.

+
    +
  • Impulse Intensity: The individual experiences persistent worry or nervousness that is difficult to control. This may lead to restlessness, difficulty concentrating, and a constant sense of unease. Though they can still function in daily life, these feelings of anxiety often interfere with their ability to relax or enjoy activities.

    +
      +
    • Example (Impulse Intensity): Clara finds herself worrying constantly about everyday tasks—whether she locked the door, if she said the right thing in a conversation, or how she will manage upcoming events. Even when everything is fine, she struggles to shake the feeling that something might go wrong, making it hard for her to focus on the present.
    • +
    +
  • +
  • Disorder Intensity: As anxiety intensifies, it can become all-consuming, leading to severe physical symptoms and avoidance behaviors. The individual may experience frequent panic attacks, overwhelming fear, and an inability to cope with daily stressors. This can result in significant disruptions to their personal and professional life, as they avoid situations that trigger their anxiety or become unable to perform routine activities.

    +
      +
    • Physical Symptoms: Rapid heartbeat, shortness of breath, sweating, trembling, dizziness, and gastrointestinal issues. The individual may also experience muscle tension, fatigue, and difficulty sleeping due to persistent anxiety.
    • +
    • Intrusive Thoughts: Constant fears about the future, health, safety, or social acceptance. The individual may fixate on worst-case scenarios, worrying excessively about things that are unlikely to happen or are beyond their control.
    • +
    • Emotional Distress: Overwhelming feelings of dread, helplessness, and frustration. The individual may feel trapped by their anxiety, unable to escape the cycle of worry and fear. This can lead to social isolation, as they avoid situations that trigger their anxiety, further exacerbating their sense of loneliness and distress.
    • +
    • Example (Disorder Intensity): Over time, Clara's anxiety has grown so severe that she avoids leaving her home, fearing that something terrible will happen if she does. Her constant state of panic has made it impossible for her to work or maintain relationships, and she feels increasingly isolated and hopeless. Every small task becomes an insurmountable challenge, as her mind races with fears of all the things that could go wrong.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Apathetic + abbrev: apathetic + id: hhnaXcsmMEWVWqOR + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Apathy is characterized by a pervasive lack of interest, enthusiasm, or concern for things that others typically find engaging or important. Individuals who exhibit apathetic tendencies may appear emotionally detached, indifferent to social interactions, and unmotivated to participate in activities. This condition can lead to significant social withdrawal, poor performance in personal and professional spheres, and strained relationships.

+
    +
  • Impulse Intensity: The individual shows a noticeable lack of interest in activities they once enjoyed. They may go through the motions in social situations without genuine engagement, often feeling indifferent or bored. While they still participate in daily life, their enthusiasm and emotional investment are minimal.

    +
      +
    • Example (Impulse Intensity): Elena used to be an avid reader and enjoyed spending time with friends, but lately, she finds herself uninterested in picking up a book or meeting others. She attends social events out of obligation but remains quiet and disengaged, feeling that nothing really matters.
    • +
    +
  • +
  • Disorder Intensity: As apathy deepens, the individual becomes increasingly detached from their surroundings and relationships. They may neglect responsibilities, fail to react emotionally to significant events, and withdraw almost entirely from social and personal interactions. This level of apathy can lead to severe isolation, underachievement, and a breakdown in communication with others.

    +
      +
    • Physical Symptoms: A marked decrease in energy or motivation, slow or lethargic movements, and a lack of expression or reaction to external stimuli. The individual may appear disinterested or fatigued most of the time.
    • +
    • Intrusive Thoughts: Thoughts of futility, such as "Nothing matters" or "Why bother?" These thoughts may reinforce the individual's detachment from life, leading them to question the purpose of actions or relationships.
    • +
    • Emotional Distress: Although the individual may outwardly seem indifferent, they might experience underlying feelings of emptiness or dissatisfaction with their life. This emotional void can lead to depression or a deeper sense of alienation as they struggle to find meaning or connection.
    • +
    • Example (Disorder Intensity): Over time, Elena's apathy has grown so pronounced that she no longer bothers to go to work or maintain her home. She spends most of her days in bed, uninterested in anything around her, including the well-being of her loved ones. Her family and friends are concerned, but Elena’s lack of reaction to their attempts to help only deepens her isolation.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Arrogant + abbrev: arrogant + id: y2VSd3A8Rw4khWod + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Arrogance is characterized by an inflated sense of self-importance, a belief in one's superiority over others, and a lack of humility. Individuals with an arrogant personality often dismiss the opinions or contributions of others, viewing themselves as more capable or deserving. This attitude can lead to strained relationships, social isolation, and conflicts as their behavior alienates those around them.

+
    +
  • Impulse Intensity: The individual frequently exhibits a sense of superiority, often speaking or acting in a condescending manner. They may dominate conversations, dismiss others' ideas, and seek recognition or praise for their perceived excellence. While they still interact with others, their arrogance can create tension and resentment in social or professional settings.

    +
      +
    • Example (Impulse Intensity): Sir Cedric often interrupts others during discussions, confident that his ideas are always the best. He rarely acknowledges the contributions of his peers and expects to be praised for his insights, causing friction among his colleagues who find his behavior overbearing.
    • +
    +
  • +
  • Disorder Intensity: As arrogance intensifies, the individual becomes increasingly dismissive and disdainful of others, leading to significant social and professional conflicts. Their inflated ego may cause them to take unnecessary risks, ignore advice, or undermine teamwork. This extreme level of arrogance can result in social isolation, as others grow tired of their self-centered behavior and unwillingness to collaborate or compromise.

    +
      +
    • Physical Symptoms: A tendency to take up more physical space, such as standing taller or invading others' personal space, and a habit of speaking in a loud, authoritative tone. The individual may also display exaggerated body language to assert dominance.
    • +
    • Intrusive Thoughts: Persistent thoughts of superiority, such as "I am better than others" or "No one else understands as I do." These thoughts reinforce the individual's belief in their exceptionalism and justify their dismissive or condescending behavior.
    • +
    • Emotional Distress: Although the individual may not openly express distress, they may experience underlying frustration or anger when their superiority is challenged or when others do not recognize their perceived greatness. This can lead to feelings of alienation and resentment if their arrogance drives others away.
    • +
    • Example (Disorder Intensity): Sir Cedric's arrogance has escalated to the point where he disregards the advice of his advisors and makes unilateral decisions that often backfire. His disdain for others' opinions and refusal to admit mistakes have alienated him from his peers, leaving him increasingly isolated. Despite his belief in his superiority, he finds himself alone, with few willing to work with him or even engage in conversation, as his arrogance has driven away those who once respected him.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Avoidant + abbrev: avoidant + id: EeFQthuKKKc5MySL + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Avoidance is characterized by a deep-seated fear of rejection, criticism, or disapproval, leading individuals to avoid social interactions and situations where they might be judged or embarrassed. These individuals often struggle with feelings of inadequacy and are hypersensitive to negative evaluation, which can severely limit their ability to form relationships or pursue opportunities.

+
    +
  • Impulse Intensity: The individual may avoid social gatherings, new situations, or activities that involve risk or exposure to judgment. They often feel anxious in social settings and may withdraw from conversations or activities that make them feel vulnerable, though they still maintain some social interactions, albeit with significant anxiety.

    +
      +
    • Example (Impulse Intensity): Emily often declines invitations to social events, fearing that others will judge her or find her boring. At work, she avoids speaking up in meetings, worried that her ideas might be criticized. While she still interacts with close friends, she keeps her circle small and rarely steps out of her comfort zone.
    • +
    +
  • +
  • Disorder Intensity: As avoidant tendencies intensify, the individual may become increasingly isolated, avoiding almost all social interactions and opportunities for fear of rejection or failure. They may struggle with low self-esteem and feelings of worthlessness, leading to severe limitations in their personal and professional life. This can result in social withdrawal, depression, and a persistent sense of loneliness and inadequacy.

    +
      +
    • Physical Symptoms: Physical symptoms of anxiety, such as sweating, trembling, or a racing heart, when faced with social situations. The individual may also experience fatigue and muscle tension due to chronic stress.
    • +
    • Intrusive Thoughts: Persistent thoughts of self-doubt, such as "I'm not good enough" or "They will reject me." The individual may also worry excessively about potential embarrassment or failure, replaying past negative experiences and fearing future ones.
    • +
    • Emotional Distress: Deep feelings of loneliness, sadness, and frustration due to the inability to connect with others. The individual may long for social interaction but feel trapped by their fear of rejection, leading to further withdrawal and isolation.
    • +
    • Example (Disorder Intensity): Over time, Emily has withdrawn almost entirely from social life. She avoids all social events, no longer speaks up at work, and has let relationships with friends and family fade. Her fear of rejection is so intense that she prefers to be alone, despite feeling lonely and unhappy. The thought of trying something new or putting herself out there fills her with dread, leaving her stuck in a cycle of isolation and self-doubt.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Bipolar Disorder + abbrev: bipolar + id: LLC5SMqrIxhA3fTf + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Bipolar is a mental health condition characterized by extreme mood swings that include emotional highs (mania or hypomania) and lows (depression). These mood swings can affect an individual's energy levels, activity, behavior, and ability to function in daily life. The intensity and duration of these episodes can vary, with some individuals experiencing more severe or prolonged symptoms. Without proper treatment, bipolar disorder can lead to significant disruptions in relationships, work, and overall quality of life.

+
    +
  • Impulse Intensity: In the early stages or during milder episodes, the individual may experience noticeable shifts in mood, energy, and behavior. They might go through periods of heightened energy, creativity, and confidence (hypomania), followed by periods of sadness, fatigue, and hopelessness (mild depression). These mood changes, while significant, may still allow the person to function, though they might struggle with consistency and stability.

    +
      +
    • Example (Impulse Intensity): Clara finds herself going through periods where she feels unusually energetic and inspired, taking on multiple projects at once and sleeping very little. However, these high-energy phases are often followed by days where she feels unmotivated and down, struggling to find joy in activities she usually enjoys. Though she manages to keep up with her responsibilities, the fluctuations in her mood leave her feeling unsettled.
    • +
    +
  • +
  • Disorder Intensity: As the disorder progresses or during more severe episodes, the individual may experience full-blown manic and depressive episodes. During manic episodes, they may engage in risky or impulsive behaviors, such as excessive spending, reckless driving, or inappropriate social interactions. In depressive episodes, they may feel overwhelmingly sad, hopeless, and unable to perform daily tasks, potentially leading to thoughts of self-harm or suicide. These extreme mood swings can cause serious disruptions in their personal and professional life, leading to strained relationships, financial difficulties, and a loss of stability.

    +
      +
    • Physical Symptoms: During manic episodes, individuals may experience increased energy, rapid speech, decreased need for sleep, and restlessness. During depressive episodes, they may experience fatigue, changes in appetite or sleep patterns, physical pain without a clear cause, and a lack of energy.
    • +
    • Intrusive Thoughts: During mania, thoughts may race uncontrollably, with grandiose ideas and plans that often lack realism. During depression, thoughts may be filled with hopelessness, self-doubt, and worthlessness, often fixating on failures or negative outcomes.
    • +
    • Emotional Distress: Intense emotional highs during mania, such as euphoria or irritability, followed by deep lows during depression, such as sadness or despair. The unpredictability of these mood swings can lead to feelings of confusion, frustration, and fear, as the individual struggles to maintain control over their emotions and life.
    • +
    • Example (Disorder Intensity): During a manic episode, Clara becomes convinced she can start a successful business overnight. She spends large sums of money on supplies and works day and night without rest. When the manic phase ends, she crashes into a deep depression, feeling overwhelmed by guilt and hopelessness as she faces the consequences of her actions. She withdraws from friends and family, unable to find the energy to engage with them, and begins to doubt her worth and future, leaving her trapped in a cycle of extreme highs and lows that disrupts her entire life.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Optimism + abbrev: optimism + id: jQK5f82M6QSM82Ym + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Optimism is a positive outlook on life, characterized by the expectation that good things will happen and that challenges can be overcome. While generally seen as a healthy and beneficial trait, optimism can vary in intensity and, in extreme cases, can lead to unrealistic expectations and poor decision-making.

+
    +
  • Benign Trait: The individual maintains a positive and hopeful attitude, believing that things will generally turn out well. They tend to focus on the bright side of situations, which helps them cope with stress and setbacks. This trait typically enhances well-being and social relationships.

    +
      +
    • Example (Benign Trait): Emma tends to see the silver lining in every situation. Even when things don't go as planned, she remains confident that everything will work out in the end. Her positive attitude lifts the spirits of those around her, making her a source of encouragement for her friends and family.
    • +
    +
  • +
  • Impulse Intensity: The individual’s optimism becomes more pronounced, leading them to consistently overlook potential risks or downsides. They may dismiss warnings or concerns from others, believing that everything will work out regardless of the circumstances. This level of optimism can lead to impulsive decisions and unpreparedness for challenges.

    +
      +
    • Example (Impulse Intensity): Emma decides to invest her savings into a new business venture, convinced that it will be an instant success despite the obvious risks. When her friends express concern, she brushes them off, insisting that her positive outlook will ensure everything goes smoothly. She moves forward with the plan, without fully considering the potential pitfalls.
    • +
    +
  • +
  • Disorder Intensity: At this extreme level, the individual’s optimism becomes detached from reality, leading to delusional or reckless behavior. They may engage in risky activities without considering the consequences, assuming that everything will turn out fine no matter the odds. This excessive optimism can result in significant harm to themselves and others, as they fail to acknowledge or prepare for potential negative outcomes.

    +
      +
    • Physical Symptoms: The physical manifestations might include a heightened state of excitement or energy during risky endeavors, a lack of stress response even in dangerous situations, and potential exhaustion or burnout from consistently overcommitting to optimistic goals.
    • +
    • Intrusive Thoughts: Persistent thoughts that everything will work out perfectly, regardless of evidence to the contrary. The individual may believe they are immune to failure or misfortune, leading them to ignore important warnings or advice.
    • +
    • Emotional Distress: While the individual may initially feel euphoric or invincible, repeated failures or setbacks may eventually lead to deep disappointment, frustration, and confusion. The gap between their optimistic expectations and reality can cause significant emotional turmoil when their unrealistic beliefs are challenged.
    • +
    • Example (Disorder Intensity): Emma’s optimism has spiraled out of control. She embarks on a series of increasingly risky ventures, each time ignoring the advice and warnings of those around her. When faced with the mounting consequences of her actions—financial loss, damaged relationships, and physical exhaustion—she remains convinced that everything will miraculously resolve itself. Her inability to recognize the severity of her situation leads to a downward spiral, as her overconfidence and reckless behavior begin to take a serious toll on her life.
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Codependent + abbrev: codependent + id: PzLFhcerUpEUbSjq + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Codependency is a behavioral condition where an individual has an excessive emotional or psychological reliance on another person, typically one who requires support due to an illness, addiction, or disability. The codependent person often places the needs and well-being of the other above their own, leading to an unhealthy, one-sided relationship dynamic. While caring for others is a natural and positive trait, codependency can escalate into patterns of self-neglect and enabling behaviors.

+
    +
  • Impulse Intensity: The individual feels a strong need to help or care for someone, often going out of their way to support that person at the expense of their own needs. They may begin to derive their sense of self-worth from the act of caregiving, becoming overly involved in the other person's life and problems. This level of codependency can lead to an imbalanced relationship, where the individual struggles to maintain boundaries and neglects their own well-being.

    +
      +
    • Example (Impulse Intensity): Sarah spends most of her time worrying about her partner's problems and doing whatever she can to fix them. She cancels her own plans and neglects her hobbies to be available for him at all times, believing that her value comes from being indispensable to him. She feels guilty when she takes time for herself, fearing that she is being selfish.
    • +
    +
  • +
  • Disorder Intensity: As codependency intensifies, the individual’s entire identity becomes intertwined with the well-being of the other person. They may lose sight of their own needs, desires, and goals, becoming consumed by the other person’s life. This can lead to severe emotional distress, as the codependent individual may feel responsible for the other person's happiness or success, and they may tolerate or even enable destructive behaviors (such as addiction or abuse) to maintain the relationship. The relationship dynamic becomes increasingly toxic, with the codependent person losing their sense of self and experiencing significant psychological strain.

    +
      +
    • Physical Symptoms: Chronic stress, fatigue, and health problems due to neglecting personal needs. The individual may experience anxiety, insomnia, or physical exhaustion from constantly being "on call" for the other person.
    • +
    • Intrusive Thoughts: Persistent thoughts of being needed by the other person, fear of abandonment if they fail to provide constant support, and a belief that their worth is solely tied to the relationship. They may also have thoughts of guilt or shame when considering their own needs or trying to establish boundaries.
    • +
    • Emotional Distress: Deep feelings of emptiness, anxiety, and depression due to the overwhelming responsibility they feel for the other person's well-being. The individual may feel trapped in the relationship, unable to assert their own needs or escape the cycle of dependency, leading to a loss of self-identity and severe emotional strain.
    • +
    • Example (Disorder Intensity): Sarah's codependency has reached a point where she no longer recognizes her own needs or desires. She has become completely consumed by her partner's struggles with addiction, feeling responsible for his every action and constantly trying to shield him from the consequences of his behavior. Despite the toll it takes on her physical and mental health, Sarah feels she cannot leave or set boundaries, fearing that her partner would fall apart without her. She experiences frequent anxiety attacks, sleepless nights, and a deep sense of despair, as her life revolves entirely around someone else's problems, leaving her with nothing of her own.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Compulsive Disclosure + abbrev: compulsivedisclosure + id: 2rz6kU9a4omj4b0o + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Compulsive Disclosure is a behavioral condition where an individual feels an uncontrollable urge to share personal, private, or sensitive information with others, often in inappropriate or unnecessary contexts. While they may sometimes recognize that they have overshared and feel embarrassed by their actions, individuals with more severe forms of this condition can be oblivious to the social consequences of their behavior. This lack of awareness can lead to repeated episodes of oversharing, resulting in damaged relationships, social isolation, and a decline in self-esteem.

+
    +
  • Impulse Intensity: The individual frequently discloses personal details in conversations, even when it might not be appropriate or relevant. They may occasionally realize afterward that they have shared too much and feel embarrassed, but despite this, they find it difficult to stop themselves from oversharing again. This can lead to anxiety and discomfort in social settings.

    +
      +
    • Example (Impulse Intensity): During a casual lunch with colleagues, Lisa begins sharing intimate details about her recent breakup, even though the conversation was about work. Afterward, she feels embarrassed and worries about how her colleagues now perceive her, but she struggles to avoid oversharing in future interactions.
    • +
    +
  • +
  • Disorder Intensity: As the compulsion intensifies, the individual’s need to disclose becomes more intrusive and uncontrollable, leading to frequent episodes of oversharing. In many cases, the individual becomes oblivious to the inappropriate nature of their disclosures, failing to recognize the discomfort or awkwardness it causes in others. This lack of awareness leads to repeated social missteps, and the individual may not understand why they face social rejection or isolation. For those who do recognize their oversharing, intense embarrassment and self-reproach follow, but they remain unable to control the behavior, perpetuating a cycle of disclosure and regret.

    +
      +
    • Physical Symptoms: The individual may experience physical discomfort, such as anxiety, sweating, or a racing heart, both during and after the act of disclosure. For those who are oblivious to the oversharing, there may be no immediate physical discomfort, but rather a continuous drive to share without awareness of its impact.
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to disclose personal information, often without considering the context or appropriateness. The individual may be driven by a need for validation, connection, or relief from anxiety, leading them to overshare without recognizing the social consequences.
    • +
    • Emotional Distress: For those who realize they have overshared, there is intense embarrassment, shame, and frustration after episodes of disclosure. Those who are oblivious may feel confused or hurt by the social distancing of others but may not understand that their behavior is the cause. Over time, both groups may experience a decline in self-esteem, leading to social withdrawal or isolation.
    • +
    • Example (Disorder Intensity): Lisa’s compulsion to share personal details has reached a point where she frequently divulges deeply private matters, even to acquaintances or strangers. In many cases, she is unaware of the discomfort she causes, continuing to share without noticing the awkwardness or withdrawal of those around her. For those moments when she does recognize her oversharing, she feels a wave of embarrassment and self-loathing but remains unable to stop herself from repeating the behavior. Her relationships suffer as friends and colleagues distance themselves, leaving Lisa confused and isolated, struggling to understand why she is being pushed away.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Conformist + abbrev: conformist + id: lsxzpN6U1C1T1wA9 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

The Conformist is characterized by a strong desire to fit in with social norms, group behaviors, and the expectations of others. Individuals with this personality type often prioritize harmony, acceptance, and approval over personal preferences or beliefs. While conformity can help maintain social cohesion, excessive conformism can lead to a loss of individuality, difficulty in making independent decisions, and vulnerability to peer pressure.

+
    +
  • Impulse Intensity: The individual frequently adapts their behavior, opinions, or appearance to align with those around them. They may avoid expressing personal views that differ from the group and may feel uncomfortable standing out or being perceived as different. While they still retain some individuality, their need to fit in often overrides their personal preferences.

    +
      +
    • Example (Impulse Intensity): Mark tends to agree with his friends' opinions, even when he privately disagrees. He dresses similarly to them and participates in activities he doesn't particularly enjoy, all to ensure he remains part of the group. Though he sometimes feels frustrated by this, he finds comfort in the acceptance and approval of his peers.
    • +
    +
  • +
  • Disorder Intensity: As conformism intensifies, the individual may lose touch with their own identity, values, and desires. They may find it nearly impossible to make decisions without seeking the approval of others and may struggle with self-esteem issues due to their reliance on external validation. This extreme level of conformity can lead to a lack of personal growth, difficulty in asserting boundaries, and susceptibility to manipulation or peer pressure.

    +
      +
    • Physical Symptoms: The individual may experience anxiety or stress when faced with situations where they must choose between their own preferences and those of the group. This can manifest as physical tension, headaches, or fatigue due to the constant effort to conform.
    • +
    • Intrusive Thoughts: Persistent worries about being judged, rejected, or excluded by others. The individual may constantly think about how to fit in, what others expect from them, and how to avoid conflict or disapproval.
    • +
    • Emotional Distress: Deep feelings of insecurity, self-doubt, and frustration from the inability to assert their own identity. The individual may feel trapped in a cycle of pleasing others at the expense of their own happiness, leading to a sense of emptiness or lack of fulfillment.
    • +
    • Example (Disorder Intensity): Mark’s need to conform has become so overwhelming that he no longer knows what he truly likes or believes. He constantly seeks validation from others, changing his opinions, interests, and even his appearance to match those around him. He feels anxious and stressed when he considers doing something different from the group, fearing rejection or criticism. Over time, Mark has lost touch with his own identity, feeling hollow and dissatisfied despite being well-liked by his peers.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Megalomania + abbrev: megalomania + id: CQOwHamezwqdvfuO + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Megalomania is a condition characterized by an obsession with power, wealth, or superiority. Individuals with megalomania often believe they possess extraordinary abilities, influence, or a unique destiny, which leads them to act recklessly or make unreasonable decisions. This exaggerated self-perception can result in damaging consequences, particularly when their grandiosity overrides rational thought. Megalomania may manifest as a symptom in mental health conditions such as narcissistic personality disorder or delusional disorder.

+
    +
  • Impulse Intensity: The individual exhibits strong feelings of self-importance and entitlement, often believing they are destined for greatness or superior to others. They may make boastful claims and seek admiration and validation for their perceived brilliance. Though their actions may be viewed as arrogant or unreasonable by others, they still function in society and maintain some degree of control over their behavior.

    +
      +
    • Example (Impulse Intensity): Lord Marcus, the ruler of a small keep, believes he is destined to lead great military campaigns, even though his territory is modest. He often speaks of expanding his lands and expects other lords to seek his counsel, even though his experience in warfare is minimal. While his peers respect his title, they quietly dismiss his grandiose claims.
    • +
    +
  • +
  • Disorder Intensity: As megalomania worsens, the individual becomes consumed by delusions of grandeur, which can lead to dangerous and reckless behavior. They may send others on ill-conceived missions, convinced of their infallibility, and when their plans fail, they refuse to take responsibility, blaming those around them. Their inability to accept mistakes damages their reputation and relationships, yet they remain blind to their shortcomings, still believing in their superiority.

    +
      +
    • Physical Symptoms: The individual may experience restlessness, excitement, or agitation when pursuing their grandiose plans. Lack of sleep or a hyperfocus on their ambitions may lead to exhaustion or irritability when they are questioned or challenged.
    • +
    • Intrusive Thoughts: Persistent fantasies of greatness, such as winning decisive battles, outwitting rivals, or amassing influence far beyond their current standing. They may believe they are destined to become a dominant figure, even when reality contradicts these beliefs.
    • +
    • Emotional Distress: Though they present as highly confident, the individual may experience anger or frustration when others do not recognize their greatness. Criticism or failure may result in emotional outbursts, and the individual may refuse to accept responsibility for their actions.
    • +
    • Example (Disorder Intensity): Lord Marcus becomes convinced that he alone has the insight to capture a rival lord on the battlefield. Ignoring the advice of his seasoned commanders, he sends out a small force of veteran fighters, expecting them to execute his bold plan and capture the rival. However, the poorly conceived strategy results in a humiliating defeat, with many of his men either captured or killed. Rather than acknowledge his own tactical blunders, Marcus blames the warriors for their "lack of skill" and refuses to accept that his plan was flawed. His reputation as a leader begins to unravel, but he remains delusional, convinced that his brilliance will eventually be recognized despite the mounting evidence against him.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Narcissism + abbrev: narcissism + id: z9TrbdlM0GgxyYBX + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Narcissism is a condition characterized by an excessive need for admiration, a sense of entitlement, and a lack of empathy for others. Individuals with narcissism often believe they are superior to those around them and are preoccupied with maintaining their inflated self-image. This need for validation drives them to seek constant praise and attention, often at the expense of others. Narcissism may manifest in conditions such as Narcissistic Personality Disorder (NPD), where the individual’s sense of self-importance overshadows their ability to form healthy relationships.

+
    +
  • Impulse Intensity: The individual consistently seeks admiration and validation from others, often exaggerating their achievements or talents to appear superior. They may display boastful or arrogant behavior and expect others to recognize their greatness. Although others may find their actions annoying or selfish, the individual can still function in society and maintain some degree of social engagement.

    +
      +
    • Example (Impulse Intensity): Lady Evelyn, a minor noblewoman, frequently brags about her beauty and social status. She dismisses others’ opinions and expects to be the center of attention at every gathering. Although her peers tolerate her behavior, they quietly criticize her constant need for praise and admiration.
    • +
    +
  • +
  • Disorder Intensity: As narcissism intensifies, the individual becomes consumed by their need for admiration, resorting to manipulative or aggressive behaviors to maintain their superiority. They may react poorly to criticism, viewing any challenge to their self-image as a personal attack. This can lead to strained relationships, social isolation, and significant emotional distress as the individual’s exaggerated self-worth begins to crumble.

    +
      +
    • Physical Symptoms: Heightened anxiety, irritability, or agitation when the individual’s need for validation is not met. They may experience restlessness, sleeplessness, or frustration when others fail to acknowledge their perceived superiority.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of being superior, preoccupation with their own success or appearance, and the belief that others are envious of them. They may also dwell on perceived slights or any failure to receive the recognition they expect.

      +
    • +
    • Emotional Distress: Deep frustration, anger, or sadness when their expectations for admiration are not fulfilled. The individual may react with rage or withdrawal, feeling victimized or misunderstood when others fail to affirm their self-image.

      +
    • +
    • Example (Disorder Intensity): As Lady Evelyn’s narcissism worsens, she lashes out at those who do not praise her sufficiently. She becomes enraged when another noblewoman receives a compliment, accusing her of trying to undermine her status. Her increasingly hostile behavior pushes away her friends and family, leaving her isolated and angry. Despite her diminishing social circle, Evelyn remains convinced of her superiority, blaming others for failing to recognize her brilliance.

      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Dementia + abbrev: dementia + id: LJDH9DS7XwWIoFcO + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Dementia is a condition characterized by a decline in cognitive function, affecting memory, thinking, and behavior. Individuals with dementia may experience difficulties with everyday tasks, struggle to recall recent events, or have trouble recognizing familiar people or places. The condition progressively impairs their ability to live independently and can lead to significant emotional distress. Dementia is often associated with aging and can manifest in various forms, such as Alzheimer’s disease or vascular dementia.

+
    +
  • Impulse Intensity: In the early stages, the individual may begin to experience occasional memory lapses or confusion. They may forget recent conversations, misplace items, or have difficulty planning or organizing tasks. Despite these symptoms, they are often still able to function independently, though they may become frustrated or embarrassed by their forgetfulness.

    +
      +
    • Example (Impulse Intensity): Sir Robert, an aging lord, has started to forget the names of his vassals and occasionally misplaces important documents. He becomes irritated when he cannot recall the details of recent meetings and increasingly relies on his advisors to manage day-to-day affairs. Although still capable of overseeing his estate, his forgetfulness worries his family.
    • +
    +
  • +
  • Disorder Intensity: As dementia progresses, the individual’s memory loss and cognitive decline become more pronounced. They may struggle to recognize familiar faces, get lost in familiar places, or become easily disoriented. Their ability to make decisions, solve problems, or communicate effectively deteriorates, leading to confusion, frustration, and anxiety. The individual may also experience mood swings, paranoia, or hallucinations, further complicating their interactions with others.

    +
      +
    • Physical Symptoms: Disorientation, difficulty with coordination, and challenges performing basic tasks, such as dressing or eating. The individual may appear agitated or restless due to their confusion and inability to navigate their environment.

      +
    • +
    • Intrusive Thoughts: The individual may experience persistent confusion about time, place, or identity. They may struggle to recall important details from their life and feel frightened or lost in familiar surroundings. In some cases, paranoia or delusions may develop, causing them to believe others are trying to harm or deceive them.

      +
    • +
    • Emotional Distress: The individual may experience profound feelings of frustration, fear, and sadness as they become increasingly aware of their cognitive decline. They may withdraw from social interactions, fearing embarrassment or judgment, and suffer from depression or anxiety as their condition worsens.

      +
    • +
    • Example (Disorder Intensity): Sir Robert’s dementia has advanced to the point where he no longer recognizes his own children. He becomes easily confused, wandering around his keep and asking for people who have long since passed. His once sharp mind has deteriorated, leaving him unable to make decisions or participate in conversations. When his servants try to assist him, he grows paranoid, accusing them of plotting against him. His family is heartbroken as they watch him slip further into confusion, yet Robert remains unaware of his declining mental state.

      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Depression + abbrev: depression + id: xjoGDuYVh5ZzkTaC + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Depression is a mood disorder characterized by persistent feelings of sadness, hopelessness, and a loss of interest in activities that were once enjoyable. Individuals with depression may experience a range of emotional and physical symptoms that can significantly impair their ability to function in daily life. The condition can vary in severity, from mild episodes of sadness to severe, chronic depression that interferes with personal, social, and professional responsibilities.

+
    +
  • Impulse Intensity: The individual experiences prolonged periods of sadness, fatigue, and disinterest in activities. They may withdraw from social engagements, feel more isolated, and struggle with feelings of worthlessness. Although still able to function in day-to-day tasks, they often feel emotionally drained and have difficulty finding motivation or joy in life.

    +
      +
    • Example (Impulse Intensity): Lady Isabella, once a vibrant and social figure in the court, has begun to withdraw from gatherings. She feels constantly tired and finds little pleasure in activities she once loved, like hosting feasts or attending hunts. Her friends notice her growing silence, but Isabella brushes off their concerns, unsure how to explain the overwhelming sense of sadness she feels.
    • +
    +
  • +
  • Disorder Intensity: As depression deepens, the individual may experience overwhelming hopelessness and despair. They may struggle to get out of bed, neglect personal hygiene, and feel that life is no longer worth living. Suicidal thoughts or self-harm may arise in severe cases. Their ability to maintain relationships, perform at work, or care for themselves deteriorates, leading to social isolation and further emotional distress.

    +
      +
    • Physical Symptoms: Chronic fatigue, changes in appetite or weight, insomnia or oversleeping, and physical aches or pains without a clear cause. The individual may exhibit slowed movements or speech due to the heavy emotional toll of the disorder.

      +
    • +
    • Intrusive Thoughts: Persistent negative thoughts about self-worth, failure, or hopelessness. The individual may dwell on past mistakes, believe they are a burden to others, or feel that things will never improve. In severe cases, suicidal ideation or thoughts of self-harm may dominate their mind.

      +
    • +
    • Emotional Distress: Deep sadness, feelings of guilt or worthlessness, and an inability to experience joy. The individual may feel disconnected from those around them, isolating themselves out of shame or a belief that others cannot understand their pain. Emotional numbness may also occur, where they feel detached from their surroundings.

      +
    • +
    • Example (Disorder Intensity): Lady Isabella’s depression has worsened to the point where she no longer leaves her chambers. She cannot summon the energy to bathe, dress, or attend meals, and she has stopped responding to letters or visits from her closest friends. Every day feels like an insurmountable burden, and she begins to think her life has no purpose. Though her family urges her to seek help, Isabella remains trapped in her despair, unable to see a way out of the darkness she feels.

      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Dramatic + abbrev: dramatic + id: rmyHccbOt3gJngwx + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Dramatic refers to an individual’s tendency to express emotions or react to situations in an exaggerated or theatrical manner. A dramatic person often amplifies emotions, gestures, and responses, seeking attention or making situations appear more intense or significant than they actually are. While being expressive and passionate can bring energy to social interactions, excessive dramatization can lead to conflicts, misunderstandings, or emotional exhaustion for both the individual and those around them.

+
    +
  • Benign Trait: The individual is expressive and passionate, adding energy and excitement to their interactions. Their reactions may be a bit more heightened than others, but they do so in a way that enhances social dynamics without overwhelming those around them. They are able to temper their reactions when necessary, and their dramatic flair is seen as charming or engaging.

    +
      +
    • Example (Benign Trait): Lady Isabella has a flair for the dramatic, often using vivid language and sweeping gestures when telling stories at court. Her expressive nature makes her the center of attention during social gatherings, but she is also mindful not to dominate conversations, allowing others to contribute.
    • +
    +
  • +
  • Impulse Intensity: The individual’s reactions become more exaggerated, often turning small matters into major events. They may seek attention or validation through their emotional responses and tend to blow situations out of proportion. While their dramatic behavior may be entertaining at times, it can also lead to frustration for those around them, especially if they feel that the individual is overreacting.

    +
      +
    • Example (Impulse Intensity): Lady Isabella now responds to minor setbacks with great displays of emotion, such as loudly lamenting a misplaced item or expressing extreme excitement over trivial news. While her friends enjoy her passion, some find it exhausting when Isabella turns every minor event into a spectacle.
    • +
    +
  • +
  • Disorder Intensity: As dramatization intensifies, the individual may become consumed by their need to make everything more significant, often creating unnecessary conflict or stress. Their constant overreaction to situations can alienate others, as their emotional outbursts and exaggerated responses make it difficult to engage in calm, rational conversations. This level of dramatization can lead to strained relationships, emotional instability, and difficulty managing real-life challenges, as the individual’s focus shifts to maintaining heightened emotions rather than resolving issues.

    +
      +
    • Physical Symptoms: The individual may experience stress, fatigue, or emotional exhaustion due to their constant emotional highs and lows. Their dramatic responses may leave them feeling drained, both mentally and physically.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about how situations should be more intense or significant. The individual may feel compelled to turn minor events into major episodes, focusing on how to dramatize or amplify their emotional responses.

      +
    • +
    • Emotional Distress: The individual may feel constantly overwhelmed or anxious, as their emotional dramatization leads to a chaotic mental state. They may struggle to keep relationships intact, as others find it difficult to cope with their intense and often exaggerated reactions.

      +
    • +
    • Example (Disorder Intensity): Lady Isabella’s dramatic tendencies have grown extreme. She now reacts to even the smallest inconveniences with tears, anger, or grand proclamations of despair. Her friends and family find it hard to speak to her, as any conversation quickly becomes an emotional outburst. Isabella thrives on the attention her dramatic reactions bring, but she is becoming increasingly isolated as those around her tire of her constant need for emotional spectacle. Even simple situations become overwhelming for Isabella, leaving her emotionally exhausted yet unable to tone down her reactions.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Energetic + abbrev: energetic + id: LnA2TAcjTPtZSDCd + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Energetic refers to an individual's naturally high level of physical and mental vitality. Energetic people are often active, enthusiastic, and driven, bringing a sense of dynamism to their tasks and interactions. Their high energy levels allow them to engage with multiple activities without tiring easily. However, excessive energy can sometimes lead to impulsiveness, difficulty focusing, or overcommitment to tasks, leaving the individual feeling overwhelmed or burned out.

+
    +
  • Benign Trait: The individual has a lively, active demeanor and is able to tackle multiple tasks with enthusiasm. Their energy motivates those around them and allows them to remain productive without becoming overextended. They balance their high energy with moments of rest, ensuring they stay efficient and focused.

    +
      +
    • Example (Benign Trait): Lady Eleanor is constantly on the move, organizing events, overseeing her household, and finding time for her hobbies. Her energy is contagious, encouraging her staff and friends to keep up with her pace. She manages her duties without losing focus or overworking herself, making her both efficient and inspiring to those around her.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more driven by their energy, often taking on too many tasks at once or moving quickly from one activity to another. While still effective, they may find it difficult to slow down or take breaks, causing minor stress or disorganization. Others may struggle to keep up with their pace, and they may occasionally overcommit themselves.

    +
      +
    • Example (Impulse Intensity): Lady Eleanor now takes on so many projects that her advisors struggle to keep up. She moves from one task to another, eager to keep everything running smoothly but often neglects to take a break or prioritize her commitments. Although her energy remains a positive influence, some of her plans begin to overlap, causing mild confusion among her staff.
    • +
    +
  • +
  • Disorder Intensity: As energy intensifies, the individual may become hyperactive, unable to control their drive to stay constantly active, leading to burnout, disorganization, or stress. They may overcommit, leaving tasks unfinished or jumping impulsively from one activity to another without proper planning. Their inability to rest or slow down can lead to exhaustion, strained relationships, or decreased productivity as their energy becomes overwhelming rather than constructive.

    +
      +
    • Physical Symptoms: The individual may experience fatigue, muscle tension, or stress from constant motion. They may struggle to sleep or relax due to their hyperactive energy levels, leading to physical exhaustion despite their desire to stay active.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about needing to stay active or productive, feeling restless or anxious when not engaged in tasks. The individual may struggle with slowing down or delegating responsibilities, fearing that inactivity means falling behind.

      +
    • +
    • Emotional Distress: The individual may feel overwhelmed by their own energy, frustrated by their inability to rest or manage their workload effectively. Their constant activity can lead to feelings of being overburdened, leaving them emotionally drained or dissatisfied with their accomplishments.

      +
    • +
    • Example (Disorder Intensity): Lady Eleanor’s energy has become so intense that she exhibits hyperactive behavior, constantly adding new tasks to her agenda and leaving many unfinished as she moves rapidly from one project to the next. Her staff feels overwhelmed by her pace, and Eleanor herself feels frustrated, as her relentless drive leaves her physically and mentally drained. Despite her exhaustion, she cannot bring herself to stop, fearing that if she slows down, she’ll lose her edge or fall behind on her duties.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Sensitive + abbrev: sensitive + id: zuMb9t573bB96FXJ + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Sensitive refers to an individual's heightened emotional awareness, often leading them to react strongly to situations or feedback that others might perceive as minor. While being sensitive can involve an acute awareness of personal feelings, oversensitivity occurs when the individual becomes excessively reactive to criticism or perceived slights directed at themselves. This heightened sensitivity can lead to emotional distress, strained relationships, and difficulty managing social interactions.

+
    +
  • Benign Trait: The individual is mildly defensive when receiving criticism and may attempt to rationalize or justify their actions. While they feel the need to protect their self-image, they still maintain control over their emotional reactions and are able to accept feedback after some reflection. Their mild self-defensiveness does not significantly impact their relationships or decision-making, though they may occasionally resist criticism before ultimately understanding it.

    +
      +
    • Example (Benign Trait): Lady Margot initially responds to feedback by explaining why she made her decisions, often offering reasons to defend her actions. While she may seem resistant at first, after some thought, she acknowledges the value of the feedback and makes adjustments where needed. Her mild defensiveness is more a reflex than a serious barrier to personal growth.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more emotionally reactive, often interpreting comments or situations as more negative or hurtful than they are intended. While still able to manage social situations, they may struggle with feelings of insecurity or hurt, reacting defensively or withdrawing when faced with criticism or perceived slights. Their heightened emotional response can cause minor friction in relationships, as others may not fully understand the intensity of their feelings.

    +
      +
    • Example (Impulse Intensity): Lady Margot begins to take even mild feedback personally, feeling hurt or defensive when her decisions are questioned. She often withdraws from conversations that she perceives as critical, even if no harm was intended. Her friends and colleagues notice that she is becoming more sensitive to minor comments, sometimes overreacting emotionally.
    • +
    +
  • +
  • Disorder Intensity: As sensitivity intensifies, the individual becomes oversensitive, reacting with strong emotional distress to even small, innocuous events or comments. They may become easily offended, frequently feeling misunderstood, criticized, or slighted by others. This extreme emotional reactivity can lead to social withdrawal, conflict in relationships, and feelings of constant emotional overwhelm. Their heightened emotional state often prevents them from rationally processing feedback or criticism, causing significant personal and interpersonal strain.

    +
      +
    • Physical Symptoms: The individual may experience physical signs of stress, such as tension headaches, fatigue, or an upset stomach, due to their constant emotional distress. Their heightened emotional reactions can take a toll on their overall well-being.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about being judged, criticized, or misunderstood by others. The individual may replay conversations in their mind, focusing on perceived slights or negative interactions, leading to anxiety or self-doubt.

      +
    • +
    • Emotional Distress: The individual may feel constantly on edge, overwhelmed by their emotional responses to everyday situations. They may struggle with feelings of inadequacy, insecurity, or emotional exhaustion, as their oversensitivity prevents them from managing their emotions effectively.

      +
    • +
    • Example (Disorder Intensity): Lady Margot’s oversensitivity has reached the point where even a neutral comment feels like a personal attack. She frequently breaks down in tears over small misunderstandings or perceived criticisms, and her relationships are becoming strained as those around her feel they must walk on eggshells to avoid upsetting her. Margot often withdraws, feeling misunderstood and overwhelmed by her emotions, unable to shake the constant feeling of being criticized or judged.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Impulsive + abbrev: impulsive + id: Y8sKCJ0YInWJzQdI + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Impulsive refers to an individual’s tendency to act on immediate urges, desires, or emotions without considering the long-term consequences of their actions. Impulsive individuals often make decisions quickly and react spontaneously, sometimes leading to excitement or boldness, but also resulting in recklessness, poor judgment, or unintended harm. While occasional impulsivity can bring spontaneity or creativity, excessive impulsiveness can cause personal and social challenges.

+
    +
  • Benign Trait: The individual acts spontaneously and is often open to taking risks or trying new things without overthinking. Their impulsivity adds excitement to their life, and they make quick decisions that lead to positive or enjoyable outcomes. While they may occasionally act without thorough consideration, their impulsiveness is balanced, and they generally avoid negative consequences.

    +
      +
    • Example (Benign Trait): Sir Roland enjoys making spur-of-the-moment plans, such as deciding to host a feast on a whim or exploring new territories without extensive planning. His impulsive nature adds excitement to his life, but he is careful enough not to take unnecessary risks that could endanger himself or others.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more prone to acting without thinking, often making decisions based on emotional impulses or desires. They may occasionally overlook important details or consequences, leading to minor mistakes or regrets. While still functional in their daily life, their impulsive actions can cause frustration or confusion for others, especially when their decisions seem hasty or poorly planned.

    +
      +
    • Example (Impulse Intensity): Sir Roland increasingly acts on whims, such as buying expensive items without consulting his advisors or making sudden changes to estate plans. His impulsiveness causes his staff to scramble to adjust to his last-minute decisions, and while most of his choices are harmless, they sometimes lead to small setbacks or unexpected challenges.
    • +
    +
  • +
  • Disorder Intensity: As impulsivity intensifies, the individual becomes unable to resist their urges or immediate desires, frequently making reckless or poorly considered decisions. They may engage in risky behaviors, disregard the consequences of their actions, and struggle to control their impulses, often leading to negative outcomes such as financial loss, relationship strain, or personal harm. This extreme impulsiveness can cause significant disruptions in their life and the lives of those around them.

    +
      +
    • Physical Symptoms: The individual may experience stress, tension, or even exhaustion from the constant need to act on impulses without proper planning or reflection. Their impulsiveness can lead to physical accidents, injuries, or involvement in dangerous situations due to lack of forethought.

      +
    • +
    • Intrusive Thoughts: Persistent urges to act quickly without thinking, coupled with feelings of impatience or frustration when forced to slow down or consider consequences. The individual may feel compelled to act on their desires immediately, fearing they’ll miss out if they hesitate.

      +
    • +
    • Emotional Distress: The individual may feel regret, guilt, or frustration after their impulsive actions lead to negative consequences. They may struggle with feelings of being out of control, as their impulsive decisions often harm their relationships, finances, or well-being.

      +
    • +
    • Example (Disorder Intensity): Sir Roland’s impulsive behavior has become dangerous. He frequently makes reckless decisions, such as leading his knights into unnecessary skirmishes or gambling away large sums of money without thinking of the estate’s future. His inability to control his urges causes tension with his advisors, who are frustrated by his unpredictable actions. Roland often regrets his decisions afterward, but his impulsiveness prevents him from learning from his mistakes, leading to ongoing financial and personal problems.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Irresponsible + abbrev: irresponsible + id: 0JAM2U7UjFMjwBtA + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Irresponsible refers to an individual’s tendency to neglect duties, obligations, or consequences in favor of immediate gratification, avoidance, or lack of care. Irresponsible people often fail to fulfill their commitments or make decisions that negatively impact themselves and others due to their lack of consideration. While occasional lapses in responsibility can be harmless, chronic irresponsibility can lead to personal, social, or financial challenges.

+
    +
  • Benign Trait: The individual may occasionally overlook minor responsibilities or take a more laid-back approach to obligations. Their tendency to be less detail-oriented may cause small mistakes, but these lapses do not significantly harm their relationships or tasks. They are generally able to course-correct and fulfill important duties.

    +
      +
    • Example (Benign Trait): Lord Henry is known to be relaxed when it comes to managing minor household tasks, sometimes forgetting to attend to less urgent matters. However, when it comes to significant decisions or issues, he steps up and ensures everything is properly handled. His mild irresponsibility is seen as a casual attitude rather than neglect.
    • +
    +
  • +
  • Impulse Intensity: The individual begins to consistently neglect responsibilities or make decisions that impact others negatively due to a lack of planning or accountability. They may prioritize short-term pleasures over long-term obligations and often leave important tasks unfinished. Their behavior causes frustration for those who rely on them, though they still function and occasionally manage to meet their duties.

    +
      +
    • Example (Impulse Intensity): Lord Henry increasingly forgets important meetings or estate matters, choosing instead to focus on hunting or social events. His advisors begin to notice a pattern of neglect when it comes to his responsibilities, and while Henry still completes some of his duties, his inconsistent focus causes confusion and delays in estate management.
    • +
    +
  • +
  • Disorder Intensity: As irresponsibility intensifies, the individual frequently abandons their duties, makes reckless decisions without regard for the consequences, and neglects the needs of others. Their actions lead to ongoing personal or financial crises, as they fail to manage their commitments. This level of irresponsibility causes severe harm to relationships, finances, or personal well-being, as the individual repeatedly ignores the repercussions of their behavior.

    +
      +
    • Physical Symptoms: The individual may experience stress or anxiety when their irresponsibility leads to serious consequences, such as financial hardship or strained relationships. They may become overwhelmed by the fallout of their actions but remain unable to take responsibility.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of avoiding duties or ignoring obligations. The individual may rationalize their behavior, believing that consequences will not be severe, or they may prioritize their own desires over long-term commitments.

      +
    • +
    • Emotional Distress: The individual may experience guilt or regret when their irresponsibility causes harm, but they struggle to change their behavior. Over time, they may become apathetic or detached, accepting their pattern of neglect as normal, even as it damages their life and the lives of those around them.

      +
    • +
    • Example (Disorder Intensity): Lord Henry has become completely irresponsible, neglecting his estate’s finances, ignoring urgent matters, and spending lavishly on parties and personal indulgences. His advisors struggle to maintain the estate in his absence, and his reckless spending leads to growing debts. When confronted, Henry dismisses the problems, choosing to continue his carefree lifestyle rather than face the consequences of his actions. His irresponsibility begins to alienate his family and damage the estate’s future, but he remains indifferent, leaving others to deal with the fallout.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Machiavellian + abbrev: machiavellian + id: TZGyU6sVPMjbR0rM + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Machiavellian refers to an individual’s tendency to manipulate, deceive, or exploit others for personal gain, often disregarding morality or ethics. Machiavellian individuals are strategic and cunning, using others as tools to achieve their goals. This behavior becomes more harmful as it intensifies, leading to broken relationships, mistrust, and isolation.

+
    +
  • Impulse Intensity: The individual begins to increasingly manipulate situations or people to gain an advantage. They may use subtle deception, half-truths, or exploit others' weaknesses to achieve their objectives. While still maintaining a semblance of fairness or ethical boundaries, they prioritize self-interest over honesty, resulting in strained relationships as those around them begin to sense their manipulative behavior.

    +
      +
    • Example (Impulse Intensity): Lord Marcus starts to use covert manipulation to keep his rivals in check. He subtly undermines them by withholding information or spreading rumors, carefully maintaining plausible deniability. While his tactics give him an edge in politics, his allies begin to distrust him, sensing that his loyalty is conditional and his methods are underhanded.
    • +
    +
  • +
  • Disorder Intensity: As Machiavellianism intensifies, the individual becomes deeply manipulative, deceitful, and morally unscrupulous. They prioritize power and personal gain above all else, using manipulation, coercion, and outright lies to maintain control. Others are viewed purely as pawns to be exploited or discarded. This extreme form of manipulation leads to widespread mistrust, alienation, and eventual isolation, as their constant scheming damages relationships and invites retaliation.

    +
      +
    • Physical Symptoms: The individual may experience paranoia, stress, or exhaustion from constantly plotting and fearing retaliation. The pressure to maintain control and stay ahead of others can take a physical and emotional toll.

      +
    • +
    • Intrusive Thoughts: Persistent, obsessive thoughts about power, control, and manipulation. The individual continuously schemes, always looking for opportunities to exploit or deceive others to maintain their advantage.

      +
    • +
    • Emotional Distress: Although they may feel little empathy, the individual may feel stress or anxiety from maintaining their web of manipulation. Their relationships deteriorate as those around them grow wary or hostile, leaving them emotionally isolated.

      +
    • +
    • Example (Disorder Intensity): Lord Marcus fully embraces ruthless tactics to eliminate his rivals and consolidate power. He blackmails, spreads damaging lies, and betrays those who once trusted him. His actions alienate everyone around him, and his paranoia grows as he fears retaliation from those he’s wronged. Though he continues to succeed politically, his manipulative behavior has left him without allies, and his once-loyal supporters now plot his downfall. Marcus, consumed by his need for control, lives in constant fear and isolation.

      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Misanthropy + abbrev: misanthropy + id: PHEiEzs7QW8kDvTG + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Misanthropy refers to a deep-seated distrust or dislike of humanity, where an individual harbors negative feelings toward people in general. A misanthropic person views human behavior with cynicism and contempt, often isolating themselves or acting out of disdain for society. While misanthropy can intensify into destructive behavior, its benign form may manifest as simple skepticism or detachment from society without actively harming others.

+
    +
  • Benign Trait: The individual exhibits mild skepticism or disillusionment with human nature but remains functional in society. They may prefer solitude or small, trusted groups over large social gatherings and have a cynical outlook but without hatred or bitterness. Their detachment allows them to maintain relationships, although they may be selective about their interactions.

    +
      +
    • Example (Benign Trait): Lord Alaric often speaks critically of human nature, expressing frustration with the greed and folly he sees in the world. However, he remains polite and cordial in his dealings with others, choosing to spend time with a few close friends rather than engaging in larger social circles. His misanthropy is more of a quiet preference for solitude than an active dislike of others.
    • +
    +
  • +
  • Impulse Intensity: The individual begins to show increasing disdain or cynicism toward people, believing that human nature is inherently selfish, corrupt, or foolish. While they may still engage with others, their interactions are marked by a growing sense of distrust or scorn. This leads to strained relationships, as they view most people with suspicion or contempt and withdraw emotionally from social situations.

    +
      +
    • Example (Impulse Intensity): Lord Alaric, once a respected member of his community, begins to express contempt for the peasants under his rule. He criticizes their actions, seeing them as lazy and greedy, and distances himself from social gatherings, feeling that most people are beneath him. His bitterness is noted by his peers, who sense his growing cynicism but still find him approachable on occasion.
    • +
    +
  • +
  • Disorder Intensity: As misanthropy worsens, the individual may become consumed by a hatred of humanity, withdrawing completely from social life or actively seeking to harm or undermine others. They view people as unworthy of trust or kindness and may become hostile, manipulative, or even vengeful toward those they interact with. This extreme misanthropy can lead to social isolation, destructive actions, and emotional instability as the individual’s contempt for humanity poisons all their relationships and interactions.

    +
      +
    • Physical Symptoms: The individual may experience physical tension, stress, or anxiety from constant emotional turmoil and negative thoughts about others. Their hostility may lead to social isolation, which can cause further physical and emotional decline.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of disgust or hatred toward humanity, often fixating on the flaws, corruption, or perceived stupidity of others. They may fantasize about distancing themselves entirely from society or finding ways to punish those they deem unworthy.

      +
    • +
    • Emotional Distress: The individual may feel anger, frustration, or bitterness whenever interacting with others. Their misanthropic outlook creates emotional strain, as they struggle with feelings of alienation, resentment, and loneliness.

      +
    • +
    • Example (Disorder Intensity): Lord Alaric’s misanthropy has grown to the point where he refuses to leave his keep, avoiding all interaction with the outside world. He openly speaks of his hatred for humanity, viewing everyone around him as corrupt or foolish. Alaric dismisses the needs of his people and actively sabotages alliances, convinced that no one deserves his loyalty or trust. His extreme misanthropy isolates him completely, leaving him bitter, angry, and alone.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Narcissistic + abbrev: narcissistic + id: 0AVHGqwHCtzZ8YFm + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Narcissistic refers to an individual’s excessive sense of self-importance, entitlement, and desire for admiration. A narcissistic person often believes they are superior to others and seeks constant validation to reinforce their inflated self-image. While they may appear confident and charismatic, their relationships can suffer due to their lack of empathy and preoccupation with their own needs. In more extreme cases, this self-centered behavior becomes manipulative, exploitative, and destructive.

+
    +
  • Benign Trait: The individual exhibits strong self-confidence and enjoys recognition for their achievements. They believe they are skilled and deserving of admiration, often taking pride in their accomplishments. Though their self-assurance can sometimes come across as boastful or arrogant, they generally maintain healthy relationships, as they do not intend to harm others. However, they may struggle with criticism and be sensitive to any challenges to their self-image.

    +
      +
    • Example (Benign Trait): Edwin, a successful merchant, often talks about his business success, relishing in the praise and admiration of his peers. He enjoys being the center of attention at the marketplace, boasting about his profits and connections. While some find his arrogance off-putting, Edwin is still generous with his wealth and maintains amicable relationships, though he is quick to dismiss any criticism of his methods or decisions.
    • +
    +
  • +
  • Impulse Intensity (Need for Validation): The individual’s self-centered behavior becomes more pronounced, as they seek constant admiration and validation from others. They may become more preoccupied with their image, expecting praise and attention at all times. Criticism or even perceived slights cause them significant distress, and they begin to view others as tools for boosting their own ego. Their relationships begin to suffer as they prioritize their need for attention over others’ feelings, often failing to show empathy or concern for anyone but themselves.

    +
      +
    • Example (Impulse Intensity): Edwin’s desire for recognition grows stronger. He constantly demands admiration from his peers, interrupting conversations to brag about his latest successes. When someone else is praised, Edwin becomes jealous, downplaying their achievements and steering the focus back to himself. He dismisses friends who don’t give him enough attention, leaving those close to him feeling neglected and used, as Edwin’s need for validation consumes his interactions.
    • +
    +
  • +
  • Disorder Intensity (Narcissistic Personality Disorder): At its extreme, narcissism becomes manipulative and destructive. The individual sees others solely as means to elevate themselves, showing little empathy or regard for their well-being. They may lie, manipulate, or exploit people to maintain their grandiose self-image, reacting with rage or severe emotional distress if their sense of superiority is challenged. This behavior results in fractured relationships, as their inability to care for others drives people away. The individual often becomes isolated, surrounded only by those willing to feed their ego or by those they can manipulate, and their distorted self-perception may eventually lead to legal or social consequences.

    +
      +
    • Physical Symptoms: The individual may experience anxiety or frustration when they are not the center of attention or when their self-image is challenged. Their obsession with control and admiration can cause stress, restlessness, or even aggression.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of superiority and entitlement. The individual may fantasize about power, wealth, or influence, viewing others as inferior or expendable. They may obsess over their image and how others perceive them.

      +
    • +
    • Emotional Distress: The individual may feel intense anger or humiliation when criticized, reacting with outbursts or manipulative behavior to regain a sense of control. They may experience severe mood swings if their need for admiration is unmet, leading to feelings of emptiness or worthlessness despite their inflated self-image.

      +
    • +
    • Example (Disorder Intensity): Edwin’s narcissism now dominates his life. He manipulates clients and competitors alike, spreading lies about them to maintain his dominance in the marketplace. Anyone who questions his success or refuses to praise him is cut off or sabotaged. When his business partner suggests a different strategy, Edwin reacts with rage, accusing them of incompetence and threatening to dissolve the partnership. His inflated self-worth drives others away, and while Edwin surrounds himself with people who flatter him, his relationships become shallow and transactional. Despite his outward success, Edwin feels deeply dissatisfied, as his insatiable need for admiration leaves him isolated and disconnected from those around him.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Obsessive + abbrev: obsessive + id: 85BcUCz2NtcJyduh + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Obsessive refers to an individual’s tendency to fixate intensely on specific thoughts, tasks, or ideas. People with obsessive tendencies may become preoccupied with perfection, control, or order, constantly revisiting the same thoughts or behaviors. While obsession can sometimes lead to thoroughness and attention to detail, it can also cause distress and disruption when the individual cannot let go of their preoccupations. In extreme cases, obsessive behavior may lead to compulsions, where the person feels driven to perform certain actions repetitively, even when it negatively impacts their life.

+
    +
  • Benign Trait: The individual is highly focused and detail-oriented, showing dedication to their tasks or interests. They may be particularly thorough and meticulous in their work, always striving for perfection. While their focus can sometimes come across as overzealous or excessive, they maintain a healthy balance, knowing when to step back or shift their attention to other areas.

    +
      +
    • Example (Benign Trait): Rowan, a scribe, is known for his meticulous copying of manuscripts. He takes great pride in ensuring that each letter is perfectly aligned, reviewing his work multiple times to catch even the smallest errors. Though some find his attention to detail excessive, Rowan’s dedication ensures that his manuscripts are flawless, and his clients appreciate the quality of his work.
    • +
    +
  • +
  • Impulse Intensity (Fixation, Preoccupation, and Racing Thoughts): The individual’s fixation on certain tasks or thoughts becomes more intense, accompanied by bursts of energy and excitement that fuel their obsession. They may feel an urgent need to complete tasks perfectly, often losing track of time and neglecting other responsibilities. This fixation begins to dominate their daily life, as they become hyper-focused on small details or specific issues, often working for hours on end without rest. Their heightened energy and sense of urgency can make them more irritable or impatient when things don’t go as planned, and their relationships begin to suffer as they prioritize their obsessive tasks over other aspects of their life.

    +
      +
    • Example (Impulse Intensity): Rowan’s fixation becomes more consuming, as he feels a growing urgency to finish every manuscript with absolute perfection. He often works late into the night, driven by a restless energy that won’t let him stop until every letter is flawless. His thoughts race as he works, jumping from one minute detail to the next. Rowan’s colleagues notice that he has become more irritable, snapping at anyone who interrupts him or questions his need for perfection. His obsessive focus leads to delays, and his constant drive to improve his work strains his relationships with clients and friends, who begin to feel neglected or pushed aside.
    • +
    +
  • +
  • Disorder Intensity (Uncontrollable Obsession and Exhaustion): At its most severe, the individual’s obsession spirals into overwhelming compulsion, fueled by relentless bursts of energy that push them to obsessively complete tasks. They may become consumed by their work or thoughts, unable to rest or stop until they achieve an impossible level of perfection. Their mind races continuously, making it difficult to focus on anything but their obsession. This unrelenting drive often leads to physical and emotional exhaustion, as the individual’s need for control takes over their life. Relationships deteriorate, daily responsibilities are neglected, and the individual’s well-being suffers as they are trapped in a cycle of frantic obsession and burnout.

    +
      +
    • Physical Symptoms: The individual may experience extreme fatigue, insomnia, and tension as they push themselves beyond their limits. Their body struggles to keep up with the constant mental activity, leading to exhaustion and physical strain. They may also feel restless, unable to sit still or relax.

      +
    • +
    • Intrusive Thoughts: Persistent and racing thoughts of tasks, organization, or perfection flood their mind, making it impossible to focus on anything else. They feel compelled to revisit tasks over and over, unable to break free from their obsessive thoughts.

      +
    • +
    • Emotional Distress: The individual feels increasingly anxious and irritable as their obsession controls their every action. They may experience intense frustration when they cannot achieve their desired results, leading to emotional outbursts or despair. Their relationships suffer as they isolate themselves, consumed by their obsession.

      +
    • +
    • Example (Disorder Intensity): Rowan’s obsession has taken over his life. He spends days locked in his workshop, his thoughts racing as he frantically rewrites the same passages, convinced that they are never good enough. His energy seems endless, as he works through the night without sleep, unable to stop. Despite his tireless efforts, Rowan feels increasingly frustrated, snapping at anyone who tries to help or question his methods. His body is exhausted, but his mind won’t let him rest. Clients stop coming, and friends drift away as Rowan becomes more isolated, lost in the unrelenting drive to perfect his work—a goal that remains ever out of reach.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Overconfident + abbrev: overconfident + id: KGyI4nHeKyUQVWUT + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Overconfidence refers to a chronic psychological attitude in which an individual consistently overestimates their abilities, knowledge, or judgment, regardless of external feedback or evidence to the contrary. Overconfidence involves an inflated belief in one's competence across various situations. This mindset leads the individual to take unnecessary risks, dismiss advice, and struggle with failure due to an inability to accurately assess their own limitations. As it intensifies, overconfidence can cause repeated errors, strained relationships, and an ongoing cycle of poor decision-making.

+
    +
  • Benign Trait: The individual exhibits high self-confidence and may occasionally overestimate their abilities. This can help them tackle challenges with boldness, though they still recognize their limits when confronted with failure or feedback. They are generally able to correct course when they make mistakes. This level of overconfidence can sometimes be motivating, pushing the individual to take on difficult tasks they might otherwise avoid.

    +
      +
    • Example (Benign Trait): Thomas, a village merchant, believes he can strike a better deal with a trader than his peers, despite having little experience in negotiation. While he overestimates his skill, he is quick to realize his mistake when the deal falls through and adjusts his strategy for future interactions. His self-assurance helps him remain ambitious, even if he occasionally misjudges his capabilities.
    • +
    +
  • +
  • Impulse Intensity (Persistent Overestimation): The individual’s overconfidence begins to affect more areas of their life. They routinely overestimate their abilities or knowledge, ignoring the advice of others or dismissing risks because they are certain of their success. This attitude leads to rash decisions and a refusal to acknowledge personal limitations. While they may still experience moments of success, their constant overconfidence often results in avoidable mistakes and failures. Their relationships begin to suffer, as they dismiss feedback or become frustrated when others don’t share their inflated view of their abilities.

    +
      +
    • Example (Impulse Intensity): Thomas’s overconfidence becomes a dominant part of his personality. He frequently makes bold, risky business decisions, convinced that his natural instincts will lead him to success. He ignores the advice of seasoned traders, believing his way is superior. When a series of bad deals costs him money, Thomas blames external circumstances rather than his poor judgment. His peers grow frustrated with his unwillingness to listen, and Thomas’s once-thriving relationships start to falter as his overconfidence isolates him from valuable feedback.
    • +
    +
  • +
  • Disorder Intensity (Blinding Overconfidence and Repeated Failure): At this extreme level, overconfidence becomes deeply ingrained, leading the individual to continuously make poor judgments and engage in reckless behavior. They ignore all feedback and view themselves as infallible, even when faced with repeated failures. Their self-image is so inflated that they refuse to learn from mistakes, often blaming others or external factors for their setbacks. This can result in damaged relationships, ruined reputations, and serious personal or professional consequences. The individual becomes trapped in a cycle of overconfidence and failure, unable to see their own role in their downfall.

    +
      +
    • Physical Symptoms: The individual may exhibit signs of stress, frustration, or exhaustion as they face repeated setbacks while refusing to adjust their behavior. They may experience tension from the ongoing conflict between their belief in their abilities and the reality of failure.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of superiority, with a refusal to acknowledge mistakes or limitations. The individual constantly believes they are destined for success, even when their actions prove otherwise.

      +
    • +
    • Emotional Distress: The individual may feel anger or frustration when their overconfidence leads to failure, but they are unable to accept responsibility. Their self-image depends on their perceived superiority, making them emotionally defensive when criticized or challenged.

      +
    • +
    • Example (Disorder Intensity): Thomas’s overconfidence has now spiraled out of control. He continues making bold business deals, even after suffering multiple losses, refusing to change his approach or heed advice. His business collapses, but Thomas blames the economy, his clients, or even bad luck—never acknowledging his own role in the failure. His relationships deteriorate further as he lashes out at those who criticize him. Despite the mounting evidence against him, Thomas remains convinced that his next decision will be the one that proves his brilliance, and he continues repeating the same mistakes, locked in a cycle of overconfidence and denial.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Passive + abbrev: passive + id: VXdpk5KrqPwUJFMG + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Passive refers to a personality trait characterized by a tendency to avoid assertiveness, confrontation, or taking active control of situations. A passive individual often prefers to let others make decisions for them, prioritizing peace and minimizing stress. While this can help maintain harmony in some situations, it may also lead to a lack of personal agency, missed opportunities, and frustration. At its extreme, passivity can result in emotional suppression, a desire to withdraw entirely from responsibility, and a loss of self-direction.

+
    +
  • Benign Trait: The individual tends to avoid confrontation and prefers to take a backseat in decision-making. They are peace-oriented, valuing harmony and compromise over asserting their own preferences. This passivity can make them easy to get along with in social situations, as they often accommodate others’ wishes to maintain smooth interactions. While they may occasionally feel overlooked, they generally feel content when conflicts are avoided.

    +
      +
    • Example (Benign Trait): Eliza, a village seamstress, is known for her calm and accommodating nature. When a customer asks for changes to a garment, even at the last minute, Eliza agrees without protest, preferring to avoid conflict. She rarely expresses dissatisfaction, allowing others to take the lead in conversations and decisions. Though she sometimes wishes she could be more assertive, Eliza takes comfort in the peace that her passivity brings to her relationships.
    • +
    +
  • +
  • Impulse Intensity (Desire to Avoid Choices and Responsibility): The individual’s passivity grows stronger and they begin actively seeking to avoid making any decisions or taking responsibility. They lose interest in participating in decisions about their life and prefer others to take full control. Their primary motivation becomes the desire to exist with as little stress, impact, or responsibility as possible. They no longer feel frustrated by being overlooked but find comfort in their lack of involvement. This mindset can lead them to withdraw from meaningful engagement with others or life in general, as they find decision-making and active participation too burdensome.

    +
      +
    • Example (Impulse Intensity): Eliza’s passivity deepens. Rather than simply avoiding conflict, she now seeks to remove herself from decision-making entirely. When a family member asks for her opinion on household matters, Eliza shrugs and says, "Whatever you think is best." She doesn’t care about the outcome, as long as she is not burdened with making a choice. She feels content simply following others' lead, doing whatever is asked of her, and staying in the background. The idea of making a decision seems exhausting, and Eliza prefers to simply exist without shaping events around her.
    • +
    +
  • +
  • Disorder Intensity (Complete Detachment from Decision-Making and Life Engagement): At this extreme level, the individual actively disengages from life to minimize stress and impact. They no longer care about controlling any aspect of their life, wishing only to avoid responsibility and stress at all costs. They become completely passive, desiring to fade into the background of their relationships, work, and life. This results in emotional and mental withdrawal, as they seek to live with as little impact as possible. They may feel disconnected from their own needs and desires, not because they are suppressed, but because they no longer feel the need to engage with them.

    +
      +
    • Physical Symptoms: The individual may exhibit signs of fatigue or emotional detachment, as they stop engaging with life’s demands. Their energy is focused on doing as little as possible to avoid responsibility or stress.

      +
    • +
    • Intrusive Thoughts: Thoughts of avoiding stress and decisions at all costs. The individual may feel relieved by the idea of others making every choice for them, preferring to simply follow rather than lead.

      +
    • +
    • Emotional Distress: The individual experiences a sense of detachment and numbness. They may feel indifferent toward their surroundings, relationships, and even their own well-being. The lack of stress in their passive approach may bring temporary comfort, but it often leads to deep feelings of emptiness and meaninglessness over time.

      +
    • +
    • Example (Disorder Intensity): Eliza’s passivity now dominates her entire life. She no longer participates in household or work decisions, fully content to let others decide everything for her. She moves through her days without purpose or desire, existing only to avoid any stress or responsibility. Her family and customers notice her complete detachment—Eliza doesn't seem to care about the quality of her work or the direction of her life. She no longer feels the frustration of being overlooked, as she has no desire to influence the world around her. The lack of engagement leaves her feeling numb and distant, as her life becomes a passive, stress-free existence devoid of meaning.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Perfectionist + abbrev: perfectionist + id: GsfY3HGCxLkhJNQB + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Perfectionist refers to an individual who strives for flawlessness and sets exceedingly high standards for themselves or their work. A perfectionist is often meticulous, detail-oriented, and highly critical of their own performance, seeking to avoid any mistakes or imperfections. While striving for excellence can lead to impressive achievements, perfectionism can become unhealthy when it leads to stress, anxiety, procrastination, or an inability to accept anything less than perfect, resulting in emotional and practical difficulties.

+
    +
  • Benign Trait: The individual sets high standards for themselves and works diligently to meet them. They take pride in doing things well and are attentive to detail, but they are still able to accept minor imperfections when necessary and can complete tasks without overburdening themselves. Their perfectionism leads to high-quality outcomes without causing significant stress or delays.

    +
      +
    • Example (Benign Trait): Sir Cedric always ensures that his armor and weapons are in top condition before every battle. He meticulously checks his equipment, but he also understands that minor imperfections will not affect the outcome and is able to prepare efficiently. His focus on doing things well earns him the respect of his fellow knights without causing unnecessary delays.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on achieving perfection, spending excessive time on tasks to ensure that every detail is flawless. While their results are impressive, this heightened attention to perfection can lead to delays, stress, or frustration. They may find it difficult to delegate tasks or feel dissatisfied with their work, even when it is objectively excellent.

    +
      +
    • Example (Impulse Intensity): Sir Cedric now spends hours perfecting his equipment, refusing to leave for training until everything is perfectly polished and aligned. His fellow knights begin to notice that Cedric often shows up late because he’s obsessing over minor details, and while his work is always flawless, his drive for perfection is slowing him down.
    • +
    +
  • +
  • Disorder Intensity: As perfectionism intensifies, the individual becomes consumed by their need for everything to be flawless. They may struggle to complete tasks, constantly revising or reworking them in an effort to reach unattainable standards. This excessive focus on perfection can lead to procrastination, emotional distress, and a sense of failure, even when their work is objectively good. Relationships may suffer as they become critical of others or overly self-critical, and their mental and physical health may deteriorate due to stress.

    +
      +
    • Physical Symptoms: The individual may experience stress, fatigue, or tension from overworking themselves in an attempt to meet impossible standards. They may suffer from headaches, insomnia, or other physical ailments due to the pressure they place on themselves.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about achieving absolute perfection, with a constant fear of failure or inadequacy. The individual may worry obsessively about small details, fearing that any mistake will lead to catastrophe, and may struggle to let go of tasks or accept good enough.

      +
    • +
    • Emotional Distress: The individual may feel overwhelmed, anxious, or frustrated due to their inability to meet their own high standards. They may experience feelings of inadequacy or failure, even when they succeed, and become highly self-critical. Relationships may be strained as the individual becomes demanding or overly critical of others.

      +
    • +
    • Example (Disorder Intensity): Sir Cedric’s perfectionism has become debilitating. He spends entire days polishing his armor and reworking battle plans, unable to accept anything less than perfection. He often misses important training sessions, and his fellow knights grow frustrated as Cedric constantly criticizes himself and others for not meeting his impossible standards. Cedric feels anxious and exhausted, but he cannot stop obsessing over every detail, convinced that even the smallest flaw could lead to disaster. His stress is taking a toll on his health, but he remains trapped in his pursuit of perfection.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Schitzophrenia + abbrev: schitzophrenia + id: rd6nkUNkcIou5SBM + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Schizophrenic refers to an individual experiencing symptoms associated with schizophrenia, a severe mental disorder that affects how a person thinks, feels, and behaves. Schizophrenia often manifests as delusions, hallucinations, disorganized thinking, and a distorted perception of reality. While symptoms vary in intensity, at its worst, schizophrenia can profoundly disrupt an individual's ability to function, leading to social isolation, paranoia, and emotional instability.

+
    +
  • Impulse Intensity: The individual begins to experience mild to moderate symptoms of schizophrenia, such as occasional hallucinations, disorganized thoughts, or paranoid delusions. These symptoms may come and go, but the person can still function in society, although with increasing difficulty. They may begin to withdraw socially, experiencing confusion or fear due to their altered perception of reality. At this stage, they are aware that something feels off but may rationalize or minimize the severity of their experiences.

    +
      +
    • Example (Impulse Intensity): Lady Isabelle occasionally hears voices that no one else can hear and sees fleeting images that disappear when she tries to focus on them. She becomes more reclusive, avoiding social gatherings because she fears others might notice her strange behavior. While she still maintains some normalcy, her mind is often preoccupied with confusion, and she is becoming more suspicious of those around her, wondering if they are plotting against her.
    • +
    +
  • +
  • Disorder Intensity: As schizophrenia intensifies, the individual becomes fully consumed by severe delusions, hallucinations, and disorganized thoughts. They can no longer distinguish between reality and their distorted perceptions, leading to irrational behavior, fear, or paranoia. At this stage, they may believe in elaborate conspiracies, speak incoherently, or act based on hallucinations. Their ability to function socially and personally is severely impaired, and they may become isolated, unable to engage with others due to their distorted view of the world. Their emotional responses are often inappropriate or flat, and they may lose touch with reality entirely.

    +
      +
    • Physical Symptoms: The individual may exhibit unusual body movements or show a lack of movement (catatonia). They might experience sleeplessness or neglect basic hygiene, as they lose the ability to care for themselves. Their physical health can deteriorate due to self-neglect or fear of the outside world.

      +
    • +
    • Intrusive Thoughts: The individual may experience persistent delusions, such as believing they are being persecuted or that they have special powers or messages to deliver. Hallucinations (both auditory and visual) are frequent and intrusive, controlling their thoughts and actions. Disorganized thinking makes it difficult for them to concentrate or follow logical conversations.

      +
    • +
    • Emotional Distress: The individual may feel intense fear, confusion, or paranoia as their distorted reality becomes overwhelming. Emotional responses may be flat or inappropriate, leading to social isolation and alienation. They may become distressed or agitated when others do not understand or believe in their delusions.

      +
    • +
    • Example (Disorder Intensity): Lady Isabelle is now fully consumed by schizophrenia. She believes that her family is plotting to poison her and that the voices she hears are divine messengers guiding her through a grand conspiracy. She locks herself in her chambers, speaking incoherently to unseen figures, and refuses to eat, convinced that her food is tainted. Her advisors and family can no longer reason with her, as her paranoia and hallucinations dominate her reality. Lady Isabelle's ability to function within her estate is lost, leaving her isolated, terrified, and disconnected from the world around her.

      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Stoic + abbrev: stoic + id: vYZQa3HWedJDzOOh + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Stoic refers to an individual’s ability to endure pain, hardship, or emotional turbulence without outwardly showing their feelings or being overtly affected by them. A stoic person is calm, composed, and resilient in the face of adversity. While stoicism can be a strength, promoting self-control and emotional stability, it can also become unhealthy if the individual suppresses their emotions to the point of emotional detachment or neglecting their personal needs and relationships.

+
    +
  • Benign Trait: The individual is calm and composed, able to handle challenges and adversity with resilience and grace. They rarely overreact to emotional or stressful situations and are able to maintain a steady demeanor, offering a source of stability for those around them. While they may not always show their emotions openly, they remain empathetic and connected to others, using their stoicism as a tool for personal strength and composure.

    +
      +
    • Example (Benign Trait): Lord Theon remains composed during a tense political negotiation, offering rational solutions while others let their emotions guide them. His calm demeanor helps to de-escalate the situation, and though he keeps his feelings private, he remains compassionate toward his peers.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more emotionally reserved, suppressing their feelings and reactions in favor of appearing calm and unbothered. While they are still functional, their increasing emotional detachment may cause others to see them as distant or unfeeling. They may begin to struggle with expressing their emotions, fearing vulnerability or weakness, and often avoid discussing their personal struggles or needs.

    +
      +
    • Example (Impulse Intensity): Lord Theon begins to suppress his emotions more frequently, choosing to avoid sharing his feelings with even close family members. While he remains reliable and strong in public, his friends notice his growing emotional distance. He dismisses their concerns, believing that showing emotions would make him seem weak.
    • +
    +
  • +
  • Disorder Intensity: As stoicism intensifies, the individual may become emotionally detached, refusing to acknowledge or express any emotions, even in situations that require empathy or vulnerability. This level of emotional suppression can lead to an inability to connect with others on a meaningful level, causing isolation, emotional numbness, or internalized stress. The individual may neglect their mental and emotional health, believing that expressing emotions is a sign of weakness, which can lead to deep emotional or psychological harm.

    +
      +
    • Physical Symptoms: The individual may experience tension, stress, or even physical health issues due to suppressing emotions for extended periods. Bottling up emotions may lead to fatigue, headaches, or other stress-related ailments.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to stay strong and unemotional, even in situations where expressing emotions is appropriate or necessary. The individual may believe that showing vulnerability is a weakness and feel compelled to maintain an emotionless front at all times.

      +
    • +
    • Emotional Distress: Although outwardly calm, the individual may experience significant internal distress from suppressing their emotions. They may struggle with feelings of isolation, frustration, or numbness, as their inability to express emotions erodes their mental well-being and relationships.

      +
    • +
    • Example (Disorder Intensity): Lord Theon no longer expresses any emotion, even during the most difficult or personal moments. He refuses to grieve the death of a close family member, seeing any display of sorrow as weakness. His friends and family find it increasingly difficult to connect with him, and Theon’s internalized stress leads to health problems. Though he outwardly appears calm and in control, Theon feels increasingly detached from those around him, suffering in silence as he isolates himself emotionally.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Stubborn + abbrev: stubborn + id: Z43MxDNEi54IX4MD + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Stubborn refers to an individual's tendency to resist change, cling to their opinions or decisions, and refuse to compromise, even in the face of reason or evidence. A stubborn person is often firm in their beliefs and decisions, standing their ground regardless of the circumstances. While this trait can reflect determination and conviction, excessive stubbornness can lead to inflexibility, strained relationships, and missed opportunities for growth or collaboration.

+
    +
  • Benign Trait: The individual is firm in their beliefs and decisions, demonstrating strong conviction and perseverance. They are not easily swayed by external pressure, which can be a strength in maintaining integrity and consistency. While they are confident in their ideas, they are still willing to listen to others and adjust their views when necessary, maintaining a healthy balance between conviction and openness.

    +
      +
    • Example (Benign Trait): Professor Elena is dedicated to her research in ancient history and has long held firm beliefs about a particular historical event. When a colleague presents new evidence that challenges her views, Elena is initially skeptical but takes the time to review the data. After careful consideration, she adjusts her interpretation, appreciating the value of new findings while maintaining her core research values.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more resistant to change and increasingly unwilling to reconsider their theories or ideas. They may ignore new information or alternative perspectives, insisting that their views are correct even when there are signs that an updated approach would be more accurate. Their rigidity causes frustration among colleagues or students, as they seem unwilling to adapt to new developments in their field.

    +
      +
    • Example (Impulse Intensity): Professor Elena dismisses recent studies that offer new interpretations of historical events she has researched for decades. She insists that her original conclusions are correct and refuses to consider alternative perspectives, even as her colleagues and apprentices raise valid points. Her unwillingness to engage with new ideas causes other scholars to question her objectivity, and apprentices begin to feel stifled in her lectures.
    • +
    +
  • +
  • Disorder Intensity: As stubbornness intensifies, the individual becomes completely inflexible, rejecting any new research or alternative ideas outright. They refuse to engage with differing opinions, believing that their views are beyond challenge. This extreme stubbornness leads to intellectual isolation, as they refuse to learn or grow from new developments in their field. They may alienate colleagues and students, damaging their reputation and stalling their academic progress.

    +
      +
    • Physical Symptoms: The stress of maintaining an unyielding stance can lead to physical tension, fatigue, or headaches. The individual may also experience emotional exhaustion from the constant defense of their beliefs, even when they no longer serve them or are clearly outdated.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to defend their long-held ideas at all costs. The individual may feel that accepting new research or alternative perspectives would undermine their credibility, leading them to resist any form of challenge or reconsideration.

      +
    • +
    • Emotional Distress: The individual may feel frustration, isolation, or bitterness as their stubbornness alienates colleagues and students. Their refusal to adapt or grow intellectually can lead to feelings of resentment, as they struggle with the increasing irrelevance of their work.

      +
    • +
    • Example (Disorder Intensity): Professor Elena refuses to read any new research that contradicts her theories, fearing change and convinced that her long-held conclusions are definitive. When apprentices challenge her views with recent studies, she becomes defensive and dismissive, insisting that her work cannot be wrong. Colleagues stop collaborating with her, and apprentices transfer to other scholars. Elena becomes increasingly isolated within the scholarly community, clinging to her outdated theories while the world of scholarship moves on without her.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Indecisive + abbrev: indecisive + id: 70qXvkFG3nCbqwgT + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Indecisive refers to an individual's difficulty in making decisions or choosing between options. An indecisive person may waver, second-guess, or avoid making choices altogether due to anxiety, fear of making the wrong decision, or an overwhelming number of possibilities. While some indecisiveness is common and harmless, excessive indecision can lead to missed opportunities, frustration, and strained relationships.

+
    +
  • Benign Trait: The individual may take longer to make decisions, carefully weighing options and considering all potential outcomes. While their decision-making process can be slow, they usually arrive at thoughtful conclusions and avoid rushing into poor choices. Their indecisiveness rarely causes significant disruption, as they eventually make choices that benefit them and others.

    +
      +
    • Example (Benign Trait): Hugh, a village blacksmith, carefully deliberates before accepting large commissions or trying new techniques. He often consults his apprentices and neighboring craftsmen before making decisions, ensuring his work is precise and durable. Though he may take longer to start a project, his craftsmanship is renowned, and villagers trust his thoroughness.
    • +
    +
  • +
  • Impulse Intensity: The individual’s indecisiveness becomes more pronounced, as they are frequently overwhelmed by the number of choices available to them. They struggle to choose even between relatively simple options, fearing that one wrong decision could lead to regret or failure. The weight of potential outcomes leads to constant second-guessing, delaying action. Their fear of making the wrong choice begins to affect their ability to take timely decisions, causing delays in their work or responsibilities.

    +
      +
    • Example (Impulse Intensity): Hugh increasingly hesitates with each new commission. When asked to forge tools for the harvest, he feels overwhelmed by the different types of metal and designs he could use, afraid that one mistake will disappoint his customers. He frequently asks his apprentices for advice but is unable to settle on a choice, and orders begin piling up. The growing number of options and the fear of choosing incorrectly leave Hugh feeling anxious and drained, delaying even small decisions.
    • +
    +
  • +
  • Disorder Intensity: As indecisiveness intensifies, the individual becomes completely paralyzed by the fear of making the wrong choice. Even minor decisions, such as which hammer to use or which project to start, seem insurmountable. They feel overwhelmed by the sheer number of options, perceiving each decision as critical, no matter how trivial. This extreme fear of error prevents them from taking any action, leading to significant delays in their work, missed opportunities, and growing frustration from others. The individual becomes consumed by anxiety, feeling helpless and inadequate in the face of choices they once found manageable.

    +
      +
    • Physical Symptoms: The stress of chronic indecision may cause physical symptoms such as headaches, fatigue, or restlessness. The constant pressure of needing to make decisions but feeling unable to act leads to emotional exhaustion and physical tension.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about potential negative outcomes, focusing on worst-case scenarios. The individual may obsess over every possible option, fearing that each decision could result in disaster, even if the choices are trivial. They become overwhelmed by the perceived weight of every decision.

      +
    • +
    • Emotional Distress: The individual may feel frustration, helplessness, or anxiety as they struggle to make even the most insignificant decisions. Their indecisiveness can lead to a loss of confidence and self-worth, as they begin to doubt their ability to function in daily life. This emotional burden worsens as they realize they are unable to move forward.

      +
    • +
    • Example (Disorder Intensity): Hugh is completely overwhelmed by his fear of making the wrong choice. Even deciding which hammer to use for a simple task feels like an impossible decision. He stares at the tools in his workshop, paralyzed by the idea that choosing incorrectly will lead to failure. Every option feels equally daunting, and he can no longer trust himself to make even the smallest choices. His apprentices and customers grow impatient, but Hugh’s anxiety prevents him from starting any project. His once-thriving blacksmithing business grinds to a halt, and he retreats further into himself, convinced that every decision is too dangerous to make.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Overachiever + abbrev: overachiever + id: iToEu4A6tvigomYB + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Overachiever refers to an individual who consistently strives to perform at a level beyond what is expected or required. Overachievers often push themselves to excel in their work, studies, or personal goals, frequently setting high standards for success. While this ambition can lead to significant accomplishments, it may also result in stress, burnout, and an imbalance between personal and professional life as the individual struggles to maintain their heightened expectations.

+
    +
  • Benign Trait: The individual is highly motivated and driven, consistently aiming to achieve beyond the standard expectations. They set ambitious goals and work diligently to meet them, balancing their drive for success with personal well-being. Their efforts result in meaningful accomplishments, but they also know when to step back and avoid overextending themselves.

    +
      +
    • Example (Benign Trait): Emily, a talented baker, enjoys experimenting with new recipes and perfecting her craft. She often spends extra time refining her pastries to ensure they meet her high standards, but she still makes time for her family and friends. Her ambition to improve her skills is balanced with a healthy social life and self-care.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on achieving success, constantly pushing themselves to meet increasingly high goals. They often take on more responsibilities than necessary, fearing failure or inadequacy if they don’t continue to excel. While they still function well, their ambition starts to cause mild stress or fatigue, and they may struggle to relax or enjoy activities outside of their work or goals.

    +
      +
    • Example (Impulse Intensity): Emily begins to accept more orders than she can comfortably handle, staying up late to complete elaborate cakes and pastries for her clients. She rarely takes time off, fearing that turning down orders will hurt her reputation. Although her business is thriving, Emily starts to feel fatigued and finds it harder to relax, even during her downtime.
    • +
    +
  • +
  • Disorder Intensity: As overachievement intensifies, the individual becomes consumed by their need to excel, often sacrificing their well-being, relationships, and mental health to meet their goals. They may struggle with perfectionism, constantly feeling that their efforts are never good enough. This extreme drive can lead to burnout, exhaustion, and a lack of balance between personal and professional life, as the individual becomes trapped in a cycle of overworking and chasing success at any cost.

    +
      +
    • Physical Symptoms: The individual may experience fatigue, stress-related illnesses, or insomnia due to their constant drive to overachieve. Their physical health often deteriorates as they neglect rest and self-care in pursuit of their goals.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to achieve more, fearing that anything less than perfection will result in failure. The individual may feel anxious when not working or pushing toward a new goal, unable to relax or enjoy downtime.

      +
    • +
    • Emotional Distress: The individual may feel constantly stressed, anxious, or frustrated by their inability to reach increasingly unattainable goals. They may experience feelings of inadequacy or guilt when they are not excelling, even when they are performing well by normal standards.

      +
    • +
    • Example (Disorder Intensity): Emily’s drive to succeed has taken over her life. She works tirelessly in her bakery, never turning down an order, even if it means working through the night. Her friends and family no longer see her, and she hasn’t taken a day off in months. Emily’s constant pursuit of perfection leaves her physically and emotionally exhausted, and despite her success, she feels like she’s never doing enough. Her health begins to suffer, but she can’t bring herself to slow down, fearing that doing so will damage her business.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: jPLSjYkEI5NGTK0X +- name: Absent-Minded + abbrev: absentminded + id: FOoc8aLvj9BRMExf + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Absent-minded refers to an individual who is often forgetful, distracted, or lost in thought. An absent-minded person may have difficulty focusing on tasks at hand, forget appointments, or appear detached from their surroundings due to daydreaming or preoccupation with their thoughts. While this trait can sometimes be harmless or even charming, excessive absent-mindedness can lead to neglect of responsibilities, misunderstandings, or frustration in social and professional contexts.

+
    +
  • Benign Trait: The individual occasionally forgets minor details or becomes distracted, often due to being absorbed in their own thoughts. Their absent-mindedness is not disruptive, and they are usually able to catch up quickly when reminded of their duties. This trait may be seen as endearing or a sign of deep thinking, rather than neglect.

    +
      +
    • Example (Benign Trait): Geoffrey, a local painter, often loses track of time while working on frescoes for the church or portraits for noble patrons, forgetting to eat or attend evening prayer. While the village priest teases him about his forgetfulness, everyone knows it’s because Geoffrey is immersed in his artistic work, and he quickly makes up for any missed duties.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more frequently distracted or forgetful, missing appointments or neglecting tasks due to their preoccupation with unrelated thoughts or daydreams. While they still manage to function, their increasing absent-mindedness causes minor frustration for those around them, as they may need to be reminded more frequently or have trouble keeping up with daily responsibilities.

    +
      +
    • Example (Impulse Intensity): Geoffrey now frequently forgets meetings with his patrons, leaving noblemen waiting for hours while he works on his paintings. He misplaces his brushes and tools, often searching for them while deep in thought about a new piece. Though his work is still admired, his patrons and apprentices grow frustrated by his lack of focus, and Geoffrey has to be reminded of his commitments more often.
    • +
    +
  • +
  • Disorder Intensity: As absent-mindedness intensifies, the individual becomes chronically distracted, struggling to keep track of time, commitments, or basic responsibilities. They may forget important events, miss deadlines, or neglect personal obligations entirely, leading to significant consequences in both their personal and professional life. Their preoccupation with their own thoughts becomes overwhelming, preventing them from functioning effectively in daily tasks, and others may lose patience with their constant forgetfulness and distraction.

    +
      +
    • Physical Symptoms: The individual may experience fatigue or stress as they struggle to manage their distractions. Their mind may feel scattered, and they may have difficulty organizing tasks or following through with plans.

      +
    • +
    • Intrusive Thoughts: Persistent daydreaming or wandering thoughts that pull them away from the task at hand. The individual may be unable to focus on important tasks, as their mind constantly drifts toward unrelated topics.

      +
    • +
    • Emotional Distress: The individual may feel frustrated, embarrassed, or anxious about their inability to focus or remember things. Their absent-mindedness may lead to feelings of inadequacy as they struggle to meet expectations and obligations, both socially and professionally.

      +
    • +
    • Example (Disorder Intensity): Geoffrey’s absent-mindedness has worsened to the point where he forgets important meetings with patrons, neglects to complete promised paintings, and even misses significant religious festivals. His patrons grow weary of waiting for their commissions, and his apprentices struggle to work under his increasingly erratic guidance. Geoffrey feels overwhelmed by his forgetfulness and the growing frustration of those around him, but his wandering thoughts prevent him from organizing his life. His once-brilliant reputation begins to suffer as his absent-mindedness consumes him.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Acrophobia + abbrev: acrophobia + id: nSZ1V5R7JrSMFyI3 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Acrophobia is an intense, irrational fear of heights. People + with acrophobia may experience a range of symptoms when they are at a high + elevation or even thinking about being in a high place. +

+
    +
  • + Impulse Intensity: Individuals might avoid situations where + they could be exposed to heights, such as avoiding tall buildings, + mountains, bridges, or even escalators. Abberance (ABE) increases by 1 from + the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: A person may feel overwhelming anxiety or panic when exposed to + heights, whether by looking down from a high place or even imagining the + situation. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: These can include rapid heartbeat, + sweating, trembling, shortness of breath, nausea, or even dizziness. +
    • +
    • + Intrusive Thoughts: Those with acrophobia might have + persistent and distressing thoughts about falling or losing balance even + when they are on solid ground. +
    • +
    • + Emotional Distress: The fear can lead to feelings of + helplessness, dread, or a sense of impending doom, particularly in + situations where the individual feels unsecure at height. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Adaptable + abbrev: adaptable + id: r5D9fkUcenN7evHl + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Adaptable refers to an individual's ability to adjust to new situations, challenges, or environments with ease and flexibility. An adaptable person can quickly modify their approach, thoughts, or actions in response to changing circumstances. This trait is often seen as a strength, as it allows individuals to thrive in unpredictable or difficult situations. However, at its extreme, an over-adaptable individual may struggle with maintaining their own identity or convictions, bending too easily to external pressures.

+
    +
  • Benign Trait: The individual can smoothly adjust to new tasks, environments, or challenges, showing flexibility without losing their sense of direction or purpose. Their ability to adapt helps them navigate uncertain situations with confidence and efficiency. Others value their resourcefulness, as they can handle unexpected changes while maintaining their original goals.

    +
      +
    • Example (Benign Trait): A skilled merchant named Roland travels between different towns, adjusting his goods and prices based on the needs of each marketplace. Whether he is bartering with a noble or a humble farmer, Roland can quickly adapt his approach to suit the situation, ensuring successful trade deals. His adaptability is admired by fellow merchants, who seek his advice on how to handle changing circumstances.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on adapting to external changes, sometimes compromising their own preferences or plans in order to fit in or succeed. While their flexibility remains an asset, they may begin to sacrifice long-term goals or personal values in favor of short-term adjustments. Their willingness to change can create confusion in their direction, as they may alter their plans too often in response to new situations.

    +
      +
    • Example (Impulse Intensity): Roland starts to adjust his business practices excessively, constantly changing his trade routes and offerings based on the latest trends in each village. While this keeps him competitive, his apprentices find it difficult to keep up with his frequent changes in strategy. Roland begins to lose sight of his long-term business goals as he focuses more on short-term gains, and his ability to plan ahead is weakened.
    • +
    +
  • +
  • Disorder Intensity: As adaptability intensifies, the individual may become overly flexible, losing their sense of self or consistency. They change too frequently in response to external pressures, constantly adjusting their behavior, opinions, or plans to suit the needs or expectations of others. This extreme flexibility can lead to a lack of direction, as the individual becomes reactive rather than proactive, struggling to maintain a clear sense of identity or purpose. Their over-adaptability may cause others to view them as inconsistent or unreliable.

    +
      +
    • Physical Symptoms: The constant need to adapt to new circumstances may lead to stress, fatigue, or anxiety. The individual may feel pressured to keep up with rapid changes, leaving them exhausted by their constant adjustments.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to change or adjust to fit in or succeed, even when the changes conflict with their true desires or long-term goals. They may feel unable to stick to one approach or decision for fear of missing out on opportunities or failing to meet expectations.

      +
    • +
    • Emotional Distress: The individual may feel frustrated, lost, or overwhelmed by their inability to maintain a stable direction or sense of self. Their constant changes can lead to emotional exhaustion and dissatisfaction, as they struggle to find balance between adaptability and stability.

      +
    • +
    • Example (Disorder Intensity): Roland’s over-adaptability has reached a point where he can no longer make firm decisions. He changes his trade routes weekly, shifts his product offerings constantly, and alters his business strategy with every new suggestion he hears. His apprentices and partners grow frustrated with his inconsistency, and Roland himself feels increasingly anxious, unable to settle on a plan for fear that another change will be needed soon. His constant adjustments leave him feeling lost and without direction, as he struggles to keep up with the expectations he feels from others.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Adventurous + abbrev: adventurous + id: h8norCLUDyf4t35X + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Adventurous refers to an individual’s willingness to take risks, explore new experiences, and embrace the unknown with enthusiasm. An adventurous person is open to trying new things, whether it be physical challenges, unfamiliar environments, or bold ideas. This trait is often associated with curiosity, courage, and a desire for discovery. However, extreme adventurousness can lead to reckless behavior or a disregard for safety and responsibility, causing potential harm or instability.

+
    +
  • Benign Trait: The individual is open to new experiences and challenges, showing a willingness to step outside their comfort zone. Their adventurous spirit leads them to explore different places, ideas, or opportunities, while still maintaining a sense of caution. They inspire others with their boldness but are careful not to take unnecessary risks.

    +
      +
    • Example (Benign Trait): Edgar, a village hunter, is known for his willingness to track game farther into the forest than most. He is careful to study the terrain and weather before heading out, always ensuring he can return safely. His adventurous nature allows him to bring back larger game and rare pelts, earning him a reputation for bravery without causing undue concern among his fellow villagers.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes increasingly driven by the desire for new and exciting experiences, particularly those that involve greater risks. The individual begins to seek out danger and challenge as a source of exhilaration, gaining a thrill from taking on more dangerous hunts or venturing into more treacherous areas. While their adventurous spirit is still admired, this desire for the heightened excitement that comes from perilous situations may cause friends and family to worry that they are putting themselves in unnecessary danger.

    +
      +
    • Example (Impulse Intensity): Edgar begins deliberately tracking more dangerous prey, such as wild boars or large wolves, finding a rush in the danger these hunts present. He ventures into the deepest, wildest parts of the forest, feeling alive when facing these risks. He thrives on the challenge, returning to the village with stories of close calls, but his growing thirst for danger starts to make his fellow hunters uneasy. They fear he is becoming too reckless, more focused on the thrill than the safety of the hunt.
    • +
    +
  • +
  • Disorder Intensity: As adventurousness intensifies, the individual becomes consumed by the desire for increasingly dangerous challenges, gaining a high from the risk and danger. They seek out perilous situations, craving the thrill of near-death experiences. The more dangerous the challenge, the better they feel, leading them to neglect safety, caution, or even common sense. Their obsession with danger puts their life in constant jeopardy, and their relationships deteriorate as others grow alarmed by their increasingly reckless and thrill-seeking behavior.

    +
      +
    • Physical Symptoms: The constant pursuit of danger and excitement can lead to injuries, exhaustion, and physical deterioration, as the individual continuously pushes themselves beyond their limits.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about seeking ever-greater risks and challenges. The individual feels restless and unsatisfied with routine or ordinary hunts, constantly seeking more dangerous prey or more treacherous conditions to feel a rush of excitement.

      +
    • +
    • Emotional Distress: The individual may feel anxious or bored when not facing a dangerous challenge, as ordinary activities or hunts no longer provide any satisfaction. They may become disconnected from friends and family who cannot understand their constant need for risk.

      +
    • +
    • Example (Disorder Intensity): Edgar’s craving for danger has spiraled out of control. He now actively seeks out the most hazardous areas of the forest, alone, hoping for encounters with bears or packs of wolves. The rush he feels from surviving these deadly situations has become addictive. Injuries have started to pile up, but they only seem to fuel his hunger for even greater danger. His fellow hunters refuse to accompany him, and his family is terrified that he will not return from one of his hunts. Yet Edgar cannot stop; the more perilous the challenge, the more alive he feels, even if it means risking everything.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Agoraphobia + abbrev: agoraphobia + id: qWYVjdWgVZPDamlU + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Agoraphobia is an intense, irrational fear of open or crowded + spaces where escape might be difficult. People with agoraphobia may experience + a range of symptoms when they are in settings such as markets, public + transportation, or wide-open areas. +

+
    +
  • + Impulse Intensity: Avoidance of public spaces and + transportation, sometimes leading to the person staying homebound. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Severe anxiety or panic attacks in crowded or open spaces. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: This includes rapid heartbeat, + sweating, trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent fears of being trapped, + losing control, or having a panic attack in public. +
    • +
    • + Emotional Distress: The constant worry creates a cycle + of fear and avoidance, severely impacting social and professional life. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Passive-Aggressive + abbrev: passiveaggressive + id: PvYRpy8auZ4N3y3F + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Passive-aggressive behavior refers to an individual’s tendency to express negative feelings, resistance, or disagreement indirectly, often masking their true intentions behind a façade of compliance. Passive-aggressive individuals may agree outwardly to requests but act in ways that sabotage or delay tasks, using subtle resistance to achieve hidden goals or avoid confrontation. This behavior often stems from a reluctance to express anger or disagreement openly, leading to frustration for both the individual and those around them. Over time, passive-aggressive behavior can damage relationships and foster mistrust, as others become aware of the individual's hidden agendas.

+
    +
  • Benign Trait: The individual occasionally avoids confrontation by subtly delaying tasks or making excuses, using passive resistance to avoid tasks they don’t want to do. Their hidden resistance may stem from a desire to protect their time or avoid conflict, but their behavior is mild and doesn’t cause major issues. While their motives may be unclear, their passive behavior is usually not harmful and may go unnoticed by others.

    +
      +
    • Example (Benign Trait): Thomas, a mill worker, agrees to repair the mill’s waterwheel but takes longer than expected, citing “unexpected issues” with the equipment. His hidden agenda is to avoid the extra workload for as long as possible, but he does eventually complete the task. His passive resistance causes minor delays, but no lasting problems.
    • +
    +
  • +
  • Impulse Intensity: The individual begins to regularly engage in passive-aggressive behavior, agreeing to tasks while harboring hidden agendas, such as delaying work to avoid responsibility or making others look bad. They consistently drag their feet, procrastinate, or offer excuses to avoid fulfilling their duties. Their actions are driven by a desire to subtly undermine others or assert control without openly confronting the situation. This behavior creates frustration and confusion, as those around them may sense their hidden motives but are unable to address them directly.

    +
      +
    • Example (Impulse Intensity): Thomas frequently agrees to tasks at the mill but intentionally delays completing them, always finding reasons why the work cannot be finished on time. His hidden agenda is to make his fellow workers seem incompetent, hoping to position himself as indispensable to the mill’s operations. While he never openly opposes his duties, his constant delays and minor sabotage begin to frustrate his peers and supervisors.
    • +
    +
  • +
  • Disorder Intensity: As passive-aggressive behavior intensifies, the individual becomes deeply resistant, using passive tactics to manipulate situations in line with their hidden agendas. They may agree to projects or responsibilities with no intention of following through, using procrastination, “forgetfulness,” or intentional mistakes to undermine progress. Their hidden agendas, such as avoiding responsibility, gaining control, or creating discord, drive their behavior. This level of passive-aggressiveness leads to significant mistrust and broken relationships, as others become aware of the individual’s deceitful patterns but find it difficult to address directly.

    +
      +
    • Physical Symptoms: The individual may experience stress from constantly concealing their true feelings and agendas, leading to tension headaches, fatigue, or irritability. Their hidden agendas add a layer of anxiety as they worry about being exposed or challenged.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of avoidance, subtle sabotage, or manipulating situations to align with their hidden goals. The individual may fixate on ways to resist tasks or control outcomes without being directly confrontational, often feeling frustrated or resentful.

      +
    • +
    • Emotional Distress: The individual feels conflicted, harboring frustration or anger that they refuse to express openly. Their hidden agendas and passive resistance cause them to feel disconnected or resentful toward those who expect them to perform duties or follow through on commitments. This can lead to feelings of isolation or guilt as their actions erode trust.

      +
    • +
    • Example (Disorder Intensity): Thomas’s passive-aggressive behavior has grown more manipulative. He agrees to repair a critical part of the mill’s machinery but intentionally delays the work, making excuses and subtly sabotaging progress. His hidden agenda is to cause enough disruption that the mill owner will fire one of his coworkers, someone Thomas dislikes. Though outwardly compliant, his actions create chaos, and his peers begin to suspect that Thomas is intentionally undermining the team. His reputation suffers, and relationships at the mill deteriorate, but Thomas refuses to admit his true motives, continuing to work behind the scenes to push his hidden agenda.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Agreeable + abbrev: agreeable + id: 2qqLIsnBTmgADSsw + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Agreeable refers to an individual's tendency to be cooperative, empathetic, and supportive in social interactions. Agreeable people prioritize harmony, positive relationships, and are often willing to compromise to avoid conflict. They are kind, polite, and considerate of others' feelings, making them well-liked in their communities. However, extreme agreeableness can sometimes lead to the individual suppressing their own needs or opinions in order to maintain peace.

+
    +
  • Benign Trait: The individual is naturally warm, helpful, and empathetic. They strive to keep the peace and make others feel valued, but they are still able to assert their opinions when necessary. Their kindness fosters strong, supportive relationships, and others appreciate their willingness to listen and collaborate.

    +
      +
    • Example (Benign Trait): Agnes, a village healer, is known for her gentle nature and willingness to help others in need. She listens carefully to villagers’ concerns and offers advice without judgment. Though she prefers to avoid arguments, Agnes doesn’t hesitate to speak up if she believes someone is being treated unfairly, always with kindness and tact.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on maintaining harmony, often going out of their way to avoid conflict. While they are still helpful and compassionate, they may begin to compromise too easily, sometimes holding back their true feelings or opinions to prevent disagreements. This behavior can cause minor frustrations, as others may feel they are being overly accommodating or passive.

    +
      +
    • Example (Impulse Intensity): Agnes starts to avoid sharing her own opinions when village disputes arise, choosing instead to agree with whichever side seems most upset, hoping to calm tensions. Though she continues to be a valuable presence in the village, her fellow villagers sometimes notice that Agnes rarely speaks her mind anymore, preferring to go along with others for the sake of peace.
    • +
    +
  • +
  • Disorder Intensity: As agreeableness intensifies, the individual becomes overly focused on avoiding conflict at all costs. They may suppress their own needs and opinions entirely, becoming passive and unable to assert themselves. This extreme agreeableness can lead to personal frustration and resentment, as they consistently prioritize others' well-being over their own. Others may take advantage of their accommodating nature, and the individual may struggle with feelings of powerlessness or a lack of self-worth.

    +
      +
    • Physical Symptoms: The stress of constantly putting others first and avoiding conflict can lead to fatigue, headaches, or emotional exhaustion. The individual may feel mentally drained from always trying to maintain peace.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to please others and avoid conflict, even when it would be in their best interest to assert their own needs. They may fear rejection or disapproval if they disagree.

      +
    • +
    • Emotional Distress: The individual may feel resentment or frustration from constantly suppressing their true feelings. Their inability to express themselves can lead to a sense of being undervalued or unseen by others, contributing to feelings of helplessness.

      +
    • +
    • Example (Disorder Intensity): Agnes has become so focused on keeping the peace that she never speaks up, even when she feels strongly about something. Villagers come to her for advice, knowing she will always agree with them, but Agnes privately feels frustrated that no one truly listens to her thoughts. Her own needs go unaddressed, and she begins to feel invisible, losing confidence in her ability to make decisions or assert her opinions. Despite her kindness, Agnes is left feeling emotionally drained and unheard.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Amaxophobia + abbrev: amaxophobia + id: QMq2hsIc0HOLzUEf + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Amaxophobia is an intense, irrational fear of driving or + being in a cart, wagon, or other vehicle. People with amaxophobia may + experience a range of symptoms when they think about, see, or are inside + vehicles. +

+
    +
  • + Impulse Intensity: Avoiding driving or even getting inside a + vehicle. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming anxiety or panic at the thought of driving or riding + in a vehicle. Abberance (ABE) increases by 3 (instead of 1) from the source + of fear. +
  • +
  • + Physical Symptoms: Rapid heartbeat, sweating, trembling, + shortness of breath, and nausea. +
  • +
  • + Intrusive Thoughts: Persistent fears of vehicle accidents + or losing control of a vehicle. +
  • +
  • + Emotional Distress: Feelings of helplessness and dread, + particularly when the individual cannot avoid vehicular travel. +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Ambitious + abbrev: ambitious + id: qvAXZ6gk0rEndTqr + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Ambition refers to an individual's strong desire to achieve success, power, or recognition. An ambitious person is driven by goals and aspirations, often setting high standards for themselves and working diligently to achieve them. Ambition can be a positive force, inspiring individuals to push beyond their limits and attain personal and professional growth. However, unchecked or blind ambition can lead to overreaching, ethical compromises, or strained relationships, especially when the desire for success outweighs other considerations.

+
    +
  • Benign Trait: The individual sets clear goals and works hard to achieve them, balancing their drive for success with respect for others and an ethical approach. They are motivated and take initiative but do not let their ambition cloud their judgment or harm relationships. Their ambition is admired, as they seek to better themselves without compromising their values.

    +
      +
    • Example (Benign Trait): Eadric, a young scribe, dreams of one day becoming a scholar in the royal court. He diligently studies ancient texts in his spare time and volunteers to assist senior scribes. His ambition pushes him to improve his skills, but he remains humble and respectful toward his peers, helping others when needed without stepping over them to advance his career.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes increasingly focused on their goals, often believing that the ends justify the means. They may disregard rules, ethics, or the feelings of others, rationalizing that achieving their desired outcome is worth any compromises along the way. While they are still functional and productive, their ambition begins to overshadow their principles, and they are more willing to bend the rules or exploit situations to get ahead. Their actions may cause tension with others, as their willingness to cut ethical corners becomes more apparent.

    +
      +
    • Example (Impulse Intensity): Eadric’s ambition grows stronger, and he begins to adopt a "whatever it takes" mindset. He manipulates situations in his favor, bending the truth to gain favor with his superiors and taking credit for work that wasn’t entirely his own. He believes that these small transgressions are justified if they help him achieve his larger goal of becoming head scribe. Although his peers start to notice his questionable tactics, Eadric convinces himself that success is worth any minor ethical compromises.
    • +
    +
  • +
  • Disorder Intensity (Blind Ambition): As ambition intensifies into blind ambition, the individual becomes consumed by the desire for success, ignoring the consequences of their actions and the needs of others. Their pursuit of goals becomes reckless and obsessive, often leading to unethical behavior or the manipulation of others. They may sacrifice personal relationships, integrity, and even their well-being in order to climb higher, blind to the damage they cause along the way. Their single-minded focus can lead to self-destruction, alienation, and moral compromise, as they are willing to do anything to achieve their goals.

    +
      +
    • Physical Symptoms: The individual may experience extreme stress, exhaustion, or physical strain from overworking and neglecting self-care in the pursuit of their goals. Their drive can lead to burnout or illness due to the relentless pressure they place on themselves.

      +
    • +
    • Intrusive Thoughts: Persistent and obsessive thoughts of success, power, or recognition. The individual becomes fixated on achieving their goals, constantly strategizing how to advance, even if it means resorting to unethical means or betraying others.

      +
    • +
    • Emotional Distress: The individual may feel frustration, anger, or resentment toward anyone they perceive as an obstacle to their success. Their relationships deteriorate as they prioritize personal ambition over loyalty, ethics, or collaboration, often leading to isolation or guilt as they struggle to reconcile their actions with their original values.

      +
    • +
    • Example (Disorder Intensity): Eadric’s ambition has turned into blind ambition. Desperate to become head scribe, he begins to sabotage his fellow scribes, taking credit for their work and spreading false rumors to discredit them. His hunger for power becomes all-consuming, and he no longer cares about the friendships he is destroying. Eadric is constantly anxious, feeling that every interaction is a test of his ability to rise higher. His obsession with success blinds him to the damage he is causing, both to others and to himself, and despite achieving his goal, he is left isolated and unfulfilled, having sacrificed everything for power.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Androphobia + abbrev: androphobia + id: Eq7Ph9EOlzU9BlcJ + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Androphobia is an intense, irrational fear of men. People + with androphobia may experience a range of symptoms when they think about, + see, or are near men. +

+
    +
  • + Impulse Intensity: Avoidance of social situations or + environments where men are present. Abberance (ABE) increases by 1 from the + source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Severe anxiety or panic when encountering men. Abberance (ABE) + increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about threats or harm from men. +
    • +
    • + Emotional Distress: Profound feelings of helplessness + and dread in situations involving men. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Anthophobia + abbrev: anthophobia + id: ChVKJ7tby0OahQcO + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Anthophobia is an intense, irrational fear of flowers. People + with anthophobia may experience a range of symptoms when they think about, + see, or are near flowers. +

+
    +
  • + Impulse Intensity: Avoiding gardens, parks, or any place + where flowers are likely to be present. Abberance (ABE) increases by 1 from + the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming anxiety or panic at the sight or thought of flowers. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being harmed by flowers, often without a clear rationale. +
    • +
    • + Emotional Distress: Feelings of dread and helplessness, + particularly in social or natural settings where flowers are common. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Anthropophobia + abbrev: anthropophobia + id: v48yL6ItKyzwuE70 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Anthropophobia is an intense, irrational fear of people or + society. People with anthropophobia may experience a range of symptoms when + they think about, see, or are in social settings. +

+
    +
  • + Impulse Intensity: Avoiding social interactions, gatherings, + or public places. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Severe anxiety or panic in social situations, even casual + encounters. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being judged, rejected, or humiliated by others. +
    • +
    • + Emotional Distress: Deep feelings of dread, isolation, + and helplessness that can significantly impact daily life and + relationships. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Apiphobia + abbrev: apiphobia + id: Gswbp8mnhBE9dnyV + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Apiphobia is an intense, irrational fear of bees. People with + apiphobia may experience a range of symptoms when they think about, see, or + are near bees. +

+
    +
  • + Impulse Intensity: Avoiding gardens, parks, or any areas + where bees might be present. Abberance (ABE) increases by 1 from the source + of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of bees. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being stung or attacked by bees. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when bees are near. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Aquaphobia + abbrev: aquaphobia + id: GYz3LKrUIu56GLP6 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Aquaphobia is an intense, irrational fear of water. People + with aquaphobia may experience a range of symptoms when they think about, see, + or are near bodies of water or environments where it is possible they might + drown or slip and fall. +

+
    +
  • + Impulse Intensity: Avoiding bathing, swimming, boats, or any + activities involving water. Abberance (ABE) increases by 1 from the source + of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of water, such + as lakes, rivers, oceans, bathtubs, washbasins, and puddles, including any + source of water where they could possibly drown. Abberance (ABE) increases + by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent fears about drowning or + being harmed by water. +
    • +
    • + Emotional Distress: Feelings of dread and helplessness, + especially in environments where water is present. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Arachnophobia + abbrev: arachnophobia + id: 84WmkRRSb6K0t9wh + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Arachnophobia is an intense, irrational fear of spiders. + People with arachnophobia may experience a range of symptoms when they think + about, see, or are near spiders. +

+
    +
  • + Impulse Intensity: Avoiding places where spiders might be + found, such as basements, attics, or wooded areas. Abberance (ABE) increases + by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of spiders. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about spiders, even when they are not present. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when encountering or thinking about spiders. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Assertive + abbrev: assertive + id: pPonvD4K9NejLVpN + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Assertive refers to an individual's ability to express their thoughts, needs, and desires confidently and directly, without being aggressive or submissive. An assertive person is clear in communicating their boundaries and expectations, while also respecting the rights and opinions of others. This balance allows them to navigate social and professional situations effectively, earning respect and fostering productive relationships. However, excessive assertiveness can sometimes come across as domineering or overbearing if not tempered with empathy and tact.

+
    +
  • Benign Trait: The individual communicates their needs clearly and confidently, standing up for themselves while maintaining respect for others. They are able to negotiate effectively and resolve conflicts without resorting to aggression or passive behavior. Their assertiveness allows them to achieve their goals while fostering positive relationships.

    +
      +
    • Example (Benign Trait): Baldwin, a traveling merchant, confidently negotiates fair prices with other traders and townspeople. When a buyer tries to undercut his goods, Baldwin calmly and firmly explains the value of his wares, standing his ground without becoming hostile. His assertiveness ensures that he gets a fair deal while maintaining a good relationship with his customers.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on asserting their position, occasionally coming across as overly forceful or insistent in their communication. While they are still respectful, their assertiveness begins to border on dominance, as they prioritize their own needs or opinions over others. This behavior may cause tension in negotiations or relationships, as others feel pressured or overshadowed by their assertive nature.

    +
      +
    • Example (Impulse Intensity): Baldwin’s assertiveness starts to escalate as he becomes more insistent on getting the best deal. He pushes harder in negotiations, occasionally interrupting or talking over his trading partners to make sure his point is heard. While he still conducts business fairly, some customers start to feel intimidated by his forcefulness, and a few traders begin avoiding deals with him, sensing that Baldwin’s assertiveness is becoming too aggressive.
    • +
    +
  • +
  • Disorder Intensity (Overbearing Assertiveness): As assertiveness intensifies, the individual becomes overly dominant, often dismissing others' opinions or needs in favor of their own. They may come across as controlling or domineering, leaving little room for collaboration or compromise. This extreme assertiveness can damage relationships, as others may feel steamrolled or disrespected. The individual’s excessive focus on getting their way leads to conflict, isolation, and strained negotiations, as their assertiveness crosses into aggression.

    +
      +
    • Physical Symptoms: The individual may experience heightened stress or tension from constantly trying to maintain control or dominance in interactions. The pressure to assert themselves may lead to irritability, headaches, or exhaustion.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to control situations, be heard, or get their way. The individual may struggle to listen to others, constantly focused on pushing their own agenda, believing that if they don’t assert themselves, they will be taken advantage of.

      +
    • +
    • Emotional Distress: The individual may feel frustration or anger when others challenge their position or do not comply with their demands. They may become impatient, quick to argue, and dismissive of differing opinions, leading to conflicts and damaged relationships.

      +
    • +
    • Example (Disorder Intensity): Baldwin’s assertiveness has become overwhelming. In every negotiation, he interrupts and dismisses his trading partners, insisting that his terms are non-negotiable. He no longer listens to his customers or other merchants, frequently forcing his deals through without compromise. His overbearing behavior drives away long-time partners, and he begins losing business as people avoid dealing with him. Though Baldwin believes he is being assertive, his aggressive nature has left him isolated, with fewer opportunities for trade and profit.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Astraphobia + abbrev: astraphobia + id: OwMQOHEyDIE35tyF + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Astraphobia is an intense, irrational fear of thunder and + lightning. People with astraphobia may experience a range of symptoms when + they think about, see, or hear thunder and lightning. +

+
    +
  • + Impulse Intensity: Avoiding going outside or even looking + outside during a storm. Abberance (ABE) increases by 1 from the source of + fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic during thunderstorms. Abberance (ABE) + increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about the dangers of thunderstorms. +
    • +
    • + Emotional Distress: Feelings of dread and helplessness + during stormy weather. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Autorityophobia + abbrev: autorityophobia + id: Wafp3wfqz9Gb2KUZ + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Autorityophobia is an intense, irrational fear of authority + figures or being in authoritative environments. People with autorityophobia + may experience a range of symptoms when they think about, see, or are near + authority figures such as police officers, bosses, or teachers. +

+
    +
  • + Impulse Intensity: Avoiding situations where authority + figures are present or where authority is exercised. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or presence of + authority figures. Abberance (ABE) increases by 3 (instead of 1) from the + source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being judged, reprimanded, or punished by authority figures. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in situations involving authority. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Ballistophobia + abbrev: ballistophobia + id: cY62hGkxpAcPZodS + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Ballistophobia is an intense, irrational fear of projectiles. + People with ballistophobia may experience a range of symptoms when + they think about, see, or are around missile weapons or projectiles. +

+
    +
  • + Impulse Intensity: Avoiding places where missile weapons are + present, such as practice ranges, hunting areas, or even certain + neighborhoods. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of projectiles or + missile weapons. Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent fears about being + injured or killed by a projectile. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near projectiles or missile weapons. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Barophobia + abbrev: barophobia + id: eKsw5wXtpgvJWgvW + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Barophobia is an intense, irrational fear of gravity or the + effects of gravity. People with barophobia may experience a range of symptoms + when they think about, feel, or are in situations where they believe gravity + might affect them negatively. +

+
    +
  • + Impulse Intensity: Avoiding activities that prominently + involve gravity, like roller coasters, elevators, or skydiving. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Severe anxiety or panic when feeling the effects of gravity, such + as during heavy lifting or high-impact activities. Abberance (ABE) increases + by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent fears of falling, being + crushed, or injury due to gravity. +
    • +
    • + Emotional Distress: Profound feelings of dread and + helplessness when considering the force of gravity. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Bibliophobia + abbrev: bibliophobia + id: KuIJSWPkqePsQ8uG + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Bibliophobia is an intense, irrational fear of books. People + with bibliophobia may experience a range of symptoms when they think about, + see, or are near books. +

+
    +
  • + Impulse Intensity: Avoiding reading, libraries, or even + conversations about books. Abberance (ABE) increases by 1 from the source of + fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of books. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about books being overwhelming, incomprehensible, or causing stress. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness related to reading or handling books. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Botanophobia + abbrev: botanophobia + id: 9CsrdimIL48fqdpl + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Botanophobia is an intense, irrational fear of plants. People + with botanophobia may experience a range of symptoms when they think about, + see, or are near plants. +

+
    +
  • + Impulse Intensity: Avoiding gardens, forests, or any places + where plants are present. Abberance (ABE) increases by 1 from the source of + fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of plants. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent fears about being harmed + by plants, often without a clear rationale. +
    • +
    • + Emotional Distress: Feelings of dread and helplessness + in environments where plants are present. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Cacophobia + abbrev: cacophobia + id: OoI63FJOkaLYGaBw + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Cacophobia is an intense, irrational fear of ugliness, + whether in objects, people, or situations. People with cacophobia may + experience a range of symptoms when they think about, see, or encounter + anything they perceive as ugly. +

+
    +
  • + Impulse Intensity: Avoiding scenarios or environments where + something unattractive might be encountered. Abberance (ABE) increases by 1 + from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic when confronted with perceived + ugliness. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about ugliness and what it represents. +
    • +
    • + Emotional Distress: Profound feelings of dread and + helplessness, leading to social isolation or excessive concern with + aesthetics. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Calm + abbrev: calm + id: z60IBUGFmjVJdZC3 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Calm refers to an individual's ability to remain composed, steady, and peaceful in the face of stress, conflict, or adversity. A calm person is able to handle difficult situations with poise and patience, rarely reacting impulsively or emotionally. This trait allows them to think clearly and make rational decisions, even under pressure. However, extreme calmness can sometimes lead to emotional detachment or a lack of urgency when action is needed.

+
    +
  • Benign Trait: The individual remains composed in stressful or challenging situations, providing stability and reassurance to those around them. They can handle conflicts and difficulties without becoming overwhelmed or reactive, making thoughtful and measured decisions. Their calm demeanor fosters a peaceful environment and helps others feel more secure.

    +
      +
    • Example (Benign Trait): Miriam, a village healer, maintains a steady composure even when treating seriously injured patients. During a sudden outbreak of illness, she calmly assesses each case, prioritizing her patients and administering remedies without rushing or panicking. Her calmness reassures the sick and their families, allowing them to trust her judgment even in a crisis.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on staying calm, sometimes to the point where they may seem indifferent or lacking concern for urgent situations. While their calmness helps them stay composed, others may perceive it as an inappropriate lack of urgency or empathy. This behavior can cause frustration, as patients and their families may feel that the healer isn’t fully recognizing the severity of the situation or showing enough emotional support.

    +
      +
    • Example (Impulse Intensity): Miriam’s calm demeanor persists even in moments that require swift action. When a young boy with a high fever is brought to her, Miriam remains steady but shows no change in pace or tone. The child’s parents grow anxious, perceiving Miriam’s calm as a lack of concern for their son’s condition. Although she administers the treatment effectively, her measured response causes the family to worry that she isn’t taking the situation seriously enough.
    • +
    +
  • +
  • Disorder Intensity (Emotional Detachment/ Poor Bedside Manner): As calmness intensifies, the individual may become emotionally detached, displaying a lack of empathy or warmth. Their extreme calmness can be perceived as a poor bedside manner, where patients and those around them feel unsupported, even though the healer’s intention is simply to stay composed. This emotional disconnection can result in strained relationships with patients, who may feel they are being treated like tasks rather than people. In critical situations, this poor bedside manner may lead to distrust and frustration, as her patients feel alienated or uncared for.

    +
      +
    • Physical Symptoms: The individual may appear emotionally distant, focusing purely on the technical aspects of care while neglecting the emotional support needed by patients. Their emotional detachment may lead to complaints of coldness or indifference.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of maintaining composure and professionalism, even at the expense of providing comfort or empathy. The individual may feel that showing emotion would be unprofessional or a sign of weakness.

      +
    • +
    • Emotional Distress: The individual may feel emotionally disconnected from their work, believing they are fulfilling their duties but struggling to connect with the human element of healing. They may be unaware of the growing emotional gap between them and their patients, leading to feelings of isolation or guilt over time.

      +
    • +
    • Example (Disorder Intensity): Miriam’s calmness has developed into a clinical detachment, and her patients now see her as cold and distant. When a family brings in their injured father, she treats his wounds efficiently but speaks curtly and without sympathy, instructing them to wait outside while she works. Her matter-of-fact tone and lack of reassurance make the family feel anxious and uncared for, as though their father’s life is just another task to be completed. Although Miriam believes she is being professional, her poor bedside manner alienates the villagers, and many start to avoid seeking her help unless absolutely necessary.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Cardiophobia + abbrev: cardiophobia + id: n8dBsntYMUsOH7nh + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Cardiophobia is an intense, irrational fear of heart-related issues. + People with cardiophobia may experience a range of + symptoms when they think about, hear, or read about heart problems. +

+
    +
  • + Impulse Intensity: Avoiding physical activities or any + actions that might cause an increased heart rate. Abberance (ABE) increases + by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of having a heart + attack or other heart-related issues. Abberance (ABE) increases by 3 + (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. These symptoms + simply reinforce the fear rapidly. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about heart health, often leading to excessive self-monitoring. +
    • +
    • + Emotional Distress: Profound feelings of dread, + helplessness, and preoccupation with cardiac health. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Catagelophobia + abbrev: catagelophobia + id: 578oVmqxkirXu5qY + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Catagelophobia is an intense, irrational fear of being + ridiculed or humiliated. People with catagelophobia may experience a range of + symptoms when they think about, are in, or foresee social situations where + they might be made fun of. +

+
    +
  • + Impulse Intensity: Avoiding social gatherings, public + speaking, or any situations where criticism might occur. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of being laughed at or + humiliated. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about past humiliations or potential ridicule. +
    • +
    • + Emotional Distress: Deep feelings of dread, + helplessness, and social withdrawal to avoid negative judgment or + embarrassment. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Catoptrophobia + abbrev: catoptrophobia + id: Yn2fYu5hNZh7cqc1 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Catoptrophobia is an intense, irrational fear of mirrors or + reflections. People with catoptrophobia may experience a range of symptoms + when they think about, see, or are near mirrors. +

+
    +
  • + Impulse Intensity: Avoiding mirrors or reflective surfaces, + potentially avoiding grooming or beautifying routines altogether. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of mirrors. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about reflections, often tied to self-image or supernatural beliefs. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when encountering mirrors or reflections. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Cautious + abbrev: cautious + id: 3IQfYbbYAls4AQjj + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Cautious refers to an individual's tendency to carefully consider risks and potential outcomes before taking action. A cautious person is thoughtful, deliberate, and often avoids hasty decisions, prioritizing safety and security over speed or spontaneity. While caution can prevent mistakes and ensure stability, excessive caution can lead to missed opportunities, slow progress, or even indecision in critical situations.

+
    +
  • Benign Trait: The individual takes their time assessing situations and weighing options, ensuring that decisions are well-informed and risks are minimized. Their caution often prevents costly mistakes and ensures that plans are carried out smoothly and safely. However, they can still act decisively when necessary, balancing careful planning with effective action.

    +
      +
    • Example (Benign Trait): Thomas, the castle steward, is known for his meticulous attention to detail. Before approving any expenditures for the castle, he carefully examines the costs, ensuring that the funds are used wisely. When organizing a banquet for visiting nobles, Thomas double-checks all the preparations to ensure that nothing goes wrong. His cautious nature ensures the smooth running of the castle without any waste or unnecessary risk.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on avoiding risk, sometimes hesitating longer than necessary when making decisions. While their caution still prevents major errors, it can lead to delays or frustration among others who are waiting for actions to be taken. Their fear of potential mistakes may cause them to overanalyze situations, slowing down progress and causing minor tension.

    +
      +
    • Example (Impulse Intensity): Thomas begins to take longer with his decisions, delaying repairs to the castle walls because he wants to be absolutely sure that the chosen craftsmen are the best for the job. His careful approach begins to frustrate the lord of the castle, who grows impatient with the slow pace of improvements. Although Thomas prevents costly errors, his extreme caution causes delays in important projects, leading others to question whether he’s taking too long to act.
    • +
    +
  • +
  • Disorder Intensity (Over-Cautious/Paralyzing Caution): As caution intensifies, the individual becomes overly hesitant and fearful of making mistakes, often delaying decisions to the point of inaction. They may become paralyzed by the fear of potential risks, refusing to move forward with plans or projects even when they are necessary. Their extreme caution can lead to missed opportunities, stalled progress, and growing frustration among those who rely on them. This level of caution may also damage their reputation, as others see them as indecisive or overly fearful.

    +
      +
    • Physical Symptoms: The constant stress of worrying about potential mistakes may lead to anxiety, tension headaches, or fatigue. The individual may feel overwhelmed by the weight of decision-making.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of potential risks or worst-case scenarios, leading the individual to avoid making decisions or take unnecessary precautions to avoid failure.

      +
    • +
    • Emotional Distress: The individual may feel frustrated or overwhelmed by their inability to act, leading to feelings of inadequacy or helplessness as they become trapped by their own caution.

      +
    • +
    • Example (Disorder Intensity): Thomas’s caution has reached the point of paralysis. When the castle's defenses need urgent repairs, he endlessly debates the best course of action, worried about the cost, the reliability of the craftsmen, and the potential consequences of choosing poorly. His indecision leaves the walls vulnerable, and the lord and other castle staff grow increasingly frustrated with his inability to take action. Although he believes he is protecting the castle from mistakes, his over-cautious nature puts the entire estate at risk, as repairs are delayed indefinitely.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Chemophobia + abbrev: chemophobia + id: XG5YCsGBH7sD3v3P + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Chemophobia is an intense, irrational fear of chemicals or + chemical compounds. People with chemophobia may experience a range of symptoms + when they think about, see, or are near chemicals. +

+
    +
  • + Impulse Intensity: Avoiding products with chemicals, such as + cleaning supplies, cosmetics, or processed foods. Abberance (ABE) increases + by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of chemicals or + chemical exposure. Abberance (ABE) increases by 3 (instead of 1) from the + source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about chemical toxicity or contamination. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness, possibly leading to obsessive behaviors aimed at + eliminating chemical exposure. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Chiroptophobia + abbrev: chiroptophobia + id: scPZkDZqWsQczOl7 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Chiroptophobia is an intense, irrational fear of bats. People + with chiroptophobia may experience a range of symptoms when they think about, + see, or are near bats. +

+
    +
  • + Impulse Intensity: Avoiding caves, forests, or areas where + bats are known to reside. Abberance (ABE) increases by 1 from the source of + fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of bats. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about bats causing harm or spreading disease. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near places where bats might be present. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Chromophobia + abbrev: chromophobia + id: RQue9pTmH7y03jlA + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Chromophobia is an intense, irrational fear of colors or a + specific color. People with chromophobia may experience a range of symptoms + when they think about, see, or are near certain colors. +

+
    +
  • + Impulse Intensity: Avoiding objects, environments, or + clothing with the affected color(s). Abberance (ABE) increases by 1 from the + source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of a + particular color. Abberance (ABE) increases by 3 (instead of 1) from the + source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about the harmful associations of certain colors. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness triggered by exposure to the specific color or colors. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Claustrophobia + abbrev: claustrophobia + id: HCi8NvmUp61z3fnw + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Claustrophobia is an intense, irrational fear of confined + spaces. People with claustrophobia may experience a range of symptoms when + they think about, see, or are in small or enclosed areas. +

+
    +
  • + Impulse Intensity: Avoiding elevators, tunnels, small rooms, + or crowded places. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic when in tight or crowded spaces. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being trapped or unable to escape. +
    • +
    • + Emotional Distress: Deep feelings of dread, + helplessness, and a strong desire to escape when in confined spaces. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Cleptophobia + abbrev: cleptophobia + id: Ks87L5MA5MzeSyu3 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Cleptophobia is an intense, irrational fear of theft or being + stolen from. People with cleptophobia may experience a range of symptoms when + they think about, see, or are in situations where theft might occur. +

+
    +
  • + Impulse Intensity: Avoiding places perceived as high-risk for + theft, such as crowded areas or unsafe neighborhoods. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or presence of stealing + or thieves. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being robbed. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in situations where theft seems likely. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Seducer + abbrev: seducer + id: zJ7K2sJUKG52vRpX + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Seducer refers to an individual who uses charm, flirtation, and seduction as a means to manipulate, control, or gain power over others. This person is driven by a desire to be desired and admired, often thriving on the attention and affection of others. They view seduction as a game or tool to boost their ego and reinforce their sense of superiority. While they may appear charismatic and alluring, their interest in others is often shallow, focusing primarily on the power dynamic rather than genuine emotional connection.

+
    +
  • Benign Trait: The individual is naturally charming and charismatic, often able to easily attract others' attention. They enjoy being admired and may flirt playfully, but they do not intentionally harm others or manipulate emotions. Their seductiveness is seen more as a social skill or talent that makes them popular in their circles.

    +
      +
    • Example (Benign Trait): Isabella, a local merchant, has a magnetic personality and enjoys the attention she receives from her customers. She flirts lightheartedly to keep people engaged, but her intentions are not harmful. Her charm helps her sell goods, and she enjoys being admired, but she does not actively try to manipulate others.
    • +
    +
  • +
  • Impulse Intensity: The individual begins to focus more on the thrill of seduction, seeking admiration and validation through romantic or sexual conquest. They may use their allure to gain favors or influence, enjoying the sense of power that comes from being desired. At this stage, their actions may lead to hurt feelings or misunderstandings, as they prioritize their need for attention over the emotional well-being of others.

    +
      +
    • Example (Impulse Intensity): Isabella starts to enjoy the power she feels when others are drawn to her. She flirts more intensely, knowing she can influence people's decisions, and begins to seduce clients to secure better deals. Though she doesn’t intend to cause harm, her growing need for admiration starts to affect her relationships, as some people feel used when they realize her attention is more about manipulation than genuine interest.
    • +
    +
  • +
  • Disorder Intensity (Manipulative Seduction): As seduction becomes an obsessive tool for validation and power, the individual becomes a seductive narcissist. They thrive on the act of seduction, not out of desire for emotional connection, but for the control and dominance it gives them over others. They may repeatedly engage in romantic or sexual conquests without regard for the emotional consequences, leaving a trail of manipulated, hurt, or discarded individuals. Their behavior becomes emotionally harmful, as they use others solely for ego gratification, often showing little remorse or empathy for the impact of their actions.

    +
      +
    • Physical Symptoms: The individual may experience tension or restlessness when they are not the center of attention or when their seduction attempts fail. The constant need for admiration can lead to emotional highs and lows, depending on their level of control over others.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about maintaining control, being admired, and gaining the upper hand through seduction. The individual may constantly strategize how to keep others under their influence or seek new targets for their seductive power.

      +
    • +
    • Emotional Distress: The individual may feel frustration or emptiness when they are not able to seduce or manipulate others. Their self-worth becomes tied to their ability to control and dominate through attraction, leading to dissatisfaction when relationships don’t offer the level of control they desire.

      +
    • +
    • Example (Disorder Intensity): Isabella’s need for power through seduction has taken over her life. She constantly flirts with and seduces noblemen and wealthy clients, not because she wants a relationship but because she craves the power it gives her. She discards her lovers as soon as she no longer finds them useful, leaving them confused and hurt. Isabella enjoys the game of manipulation, seeing others' affection as proof of her superiority. However, her reputation begins to suffer as word spreads of her manipulative behavior, isolating her as she continues to seek out new conquests.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Compassionate + abbrev: compassionate + id: l50VINyxSkIVOgPu + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Compassionate refers to an individual's deep empathy and genuine concern for the well-being of others. A compassionate person goes out of their way to help those in need, offering emotional support, care, and kindness. They are attuned to the suffering of others and are often motivated to alleviate that suffering, even at a personal cost. While compassion fosters strong relationships and a caring environment, extreme compassion can sometimes lead to self-neglect or burnout as the individual prioritizes others' needs over their own.

+
    +
  • Benign Trait: The individual is kind-hearted and quick to offer help or comfort to those in need. They listen carefully, show empathy, and take thoughtful actions to support others. Their compassion is balanced, allowing them to care for others without overwhelming themselves.

    +
      +
    • Example (Benign Trait): Sister Margaret, a nun in the village convent, is known for her gentle, caring nature. When villagers come to her seeking counsel or support, she listens patiently and offers heartfelt advice. She visits the sick regularly, providing both spiritual and physical comfort. Her compassion makes her well-loved by the community, as she is always there to lend a hand or a kind word when needed.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on helping others, sometimes prioritizing their well-being over their own needs. They may become emotionally involved in the suffering of others, feeling compelled to offer help even in situations where it is not their responsibility. Their selflessness, while admirable, may start to cause emotional strain as they take on more than they can handle.

    +
      +
    • Example (Impulse Intensity): Sister Margaret begins spending most of her time caring for the sick and troubled, often skipping meals and rest to attend to the needs of the villagers. She feels deeply for the suffering of others and cannot turn anyone away. While her devotion is appreciated, some of her fellow sisters worry that she is wearing herself thin, as she takes on more and more responsibility, leaving little time for her own spiritual and physical well-being.
    • +
    +
  • +
  • Disorder Intensity (Self-Sacrificing Compassion): As compassion intensifies, the individual may become completely absorbed in the suffering of others, neglecting their own needs and health in the process. They feel responsible for solving every problem they encounter, leading to physical and emotional burnout. This extreme level of compassion can also cause them to be easily manipulated by those who take advantage of their kindness. Their inability to set boundaries can result in exhaustion, as they are constantly giving without receiving support in return.

    +
      +
    • Physical Symptoms: The individual may experience fatigue, headaches, or other stress-related symptoms due to overextending themselves in caring for others. Their health may begin to deteriorate as they neglect their own needs.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of guilt or responsibility for the well-being of others, even when they are not in a position to help. They may feel as though they are failing if they cannot ease the suffering around them.

      +
    • +
    • Emotional Distress: The individual may feel overwhelmed, anxious, or frustrated, as they take on the burdens of others without giving themselves time to rest. Their constant emotional involvement in others' problems leaves them emotionally drained, and they may struggle with feelings of helplessness when they cannot provide immediate relief.

      +
    • +
    • Example (Disorder Intensity): Sister Margaret becomes consumed by her compassion for others, taking on the care of several sick villagers at once, often working through the night without rest. She refuses to leave anyone in need, even when her health begins to suffer. Her fellow sisters try to intervene, but Margaret feels guilty if she isn’t helping others constantly. Over time, her physical and emotional exhaustion grows, and she becomes overwhelmed by the weight of her responsibilities. Despite her best efforts, Sister Margaret can no longer sustain the level of care she provides, leaving her emotionally drained and physically unwell.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Confident + abbrev: confident + id: YwlqH8R9uGJMty8Q + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Confidence refers to an individual's belief in their abilities, decisions, and judgment. A confident person trusts themselves and their capabilities, often taking on challenges with assurance and composure. Confidence allows individuals to handle difficult situations effectively and maintain a strong sense of self-worth. However, overconfidence can sometimes lead to rash decisions or an inflated sense of one's abilities, resulting in mistakes or strained relationships.

+
    +
  • Benign Trait: The individual believes in their abilities and approaches challenges with poise and certainty. They are self-assured without being boastful, and their confidence inspires others. They remain humble, balancing their sense of competence with an understanding of their limitations.

    +
      +
    • Example (Benign Trait): Sir Roland, a knight in the king’s service, confidently leads his troops into battle. He has trained extensively and trusts in his skills with both sword and strategy. His calm, assured demeanor reassures his soldiers, who look to him for guidance in the heat of battle. Sir Roland’s confidence is well-placed, as he knows his strengths but also recognizes when to seek counsel from more experienced commanders.
    • +
    +
  • +
  • Impulse Intensity: The individual’s confidence begins to grow, sometimes bordering on overconfidence. While they still perform well, they may take on greater risks, trusting too much in their own abilities. They start to overlook advice from others, believing they know best in most situations. This behavior may lead to minor mistakes or friction with others who feel their opinions are being dismissed.

    +
      +
    • Example (Impulse Intensity): Sir Roland, emboldened by his recent victories, begins to take more daring approaches in battle, often disregarding the advice of his fellow knights. His growing confidence leads him to believe he can handle any situation alone. Though he continues to perform admirably, some of his comrades begin to worry that his boldness may lead to unnecessary risks in future engagements.
    • +
    +
  • +
  • Disorder Intensity (Overconfidence): As confidence intensifies into overconfidence, the individual becomes excessively sure of their abilities, often taking on challenges without considering potential consequences. They may act rashly, dismissing the input of others and assuming they can succeed in any task, no matter how difficult. This overconfidence can result in significant mistakes, damage to their reputation, or even physical harm. Their unwillingness to acknowledge their limitations may cause conflicts with peers, who see their behavior as arrogant or reckless.

    +
      +
    • Physical Symptoms: The individual may experience increased adrenaline and restlessness as they take on greater risks, often putting themselves in dangerous situations due to their inflated sense of invulnerability.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of superiority, assuming that they can handle any task without error or the need for assistance. The individual may view challenges as opportunities to prove their worth, even when caution is warranted.

      +
    • +
    • Emotional Distress: The individual may feel frustration or anger when faced with failure or setbacks, as they have difficulty accepting that their abilities have limits. They may struggle with disappointment or resentment toward others when their overconfidence leads to mistakes.

      +
    • +
    • Example (Disorder Intensity): Sir Roland’s confidence turns into overconfidence after a series of successful campaigns. He begins to disregard all advice, convinced that his instincts are infallible. In a critical battle, he charges headlong into the enemy, underestimating their strength. His decision results in heavy losses for his troops, and he is wounded in the fray. Rather than acknowledging his error, Sir Roland blames his men for not following his lead properly. His overconfidence strains his relationship with his fellow knights, who see him as reckless and arrogant.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Coulrophobia + abbrev: coulrophobia + id: xO3RIBN9HuiOscp8 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Coulrophobia is an intense, irrational fear of clowns. People + with coulrophobia may experience a range of symptoms when they think about, + see, or are near clowns. +

+
    +
  • + Impulse Intensity: Avoiding events or places where clowns + might be present, such as circuses or children's parties. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of clowns. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about clowns causing harm or fear. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when encountering clowns or even images of clowns. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Cunning + abbrev: cunning + id: 0CzxPUMt3bYB0yt5 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Cunning refers to an individual's ability to achieve their goals through cleverness, strategy, and subtle manipulation. A cunning person is skilled at outmaneuvering others, often using intelligence, charm, or deceit to their advantage. While cunning can be a valuable trait in negotiation, diplomacy, or survival, it can also be seen as deceitful or untrustworthy when used excessively or without regard for ethics.

+
    +
  • Benign Trait: The individual is strategic and intelligent, using their sharp mind to navigate complex situations. They are resourceful, able to find solutions that others may overlook. While their actions may involve subtle manipulation, they typically work toward beneficial outcomes without harming others.

    +
      +
    • Example (Benign Trait): Alistair, a trusted court advisor, is known for his clever diplomacy. When tensions rise between the king and a rival lord, Alistair carefully crafts a plan to resolve the conflict through negotiation. He subtly influences both parties, ensuring they believe the compromise is in their best interest. Alistair’s cunning ensures peace in the kingdom without causing offense or deception, making him a valuable asset to the king.
    • +
    +
  • +
  • Impulse Intensity: The individual begins to rely more heavily on manipulation and clever tactics, seeing situations as opportunities to outwit others. They may start using their cunning to serve personal interests, sometimes at the expense of others. While their actions remain mostly effective, they can lead to growing suspicion among peers, as their strategies may seem self-serving or overly calculated.

    +
      +
    • Example (Impulse Intensity): Alistair, noticing a chance to advance his own influence, begins to manipulate court politics more actively. He orchestrates events that subtly discredit rivals, ensuring that he gains favor with the king. Though his plans succeed, some nobles start to grow wary of Alistair, sensing that his advice is not entirely selfless. His cunning, once purely beneficial to the kingdom, is now tinged with personal ambition.
    • +
    +
  • +
  • Disorder Intensity (Deceptive Manipulation): As cunning intensifies, the individual becomes increasingly manipulative, using deceit and trickery to achieve their goals without regard for the harm it may cause others. They may engage in complex schemes, hiding their true intentions behind layers of manipulation. This excessive cunning often results in broken trust, as those around them realize they have been used as pawns in the individual’s game. Their reputation becomes tarnished, and relationships deteriorate due to the underhanded nature of their actions.

    +
      +
    • Physical Symptoms: The stress of constantly managing complex schemes and ensuring they are not discovered may lead to paranoia, anxiety, or restlessness. The individual may always be on edge, fearing exposure.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of control, manipulation, and outmaneuvering others. The individual constantly strategizes, looking for ways to gain the upper hand, often viewing others as tools rather than allies.

      +
    • +
    • Emotional Distress: The individual may feel isolated, as their manipulative tactics create distance between themselves and those who no longer trust them. While they may feel a sense of pride in their schemes, the lack of genuine connection can lead to emotional emptiness or frustration.

      +
    • +
    • Example (Disorder Intensity): Alistair’s cunning has turned to deceit. In his pursuit of power, he begins spreading false rumors and manipulating alliances within the court. He plays nobles against each other, using half-truths and hidden motives to consolidate his influence. Though Alistair’s schemes initially bring him success, his deceptions are eventually uncovered. The king and the court lose trust in him, and he finds himself increasingly isolated. While he still believes in his own cleverness, his manipulations have left a trail of damaged relationships and eroded his reputation as a trusted advisor.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Cynophobia + abbrev: cynophobia + id: NTiQn1BqiEQYifMD + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Cynophobia is an intense, irrational fear of dogs. People + with cynophobia may experience a range of symptoms when they think about, see, + or are near dogs. +

+
    +
  • + Impulse Intensity: Avoiding parks, sidewalks, or any + environments where dogs are likely to be present. Abberance (ABE) increases + by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of dogs. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being bitten or attacked by a dog. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near dogs or places they frequent. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Decisive + abbrev: decisive + id: 0FPqLNVbOKnTKY7V + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Decisive refers to an individual's ability to make clear, quick, and confident decisions without hesitation. A decisive person trusts their judgment and is able to take action swiftly, often leading others with certainty in moments of uncertainty or pressure. Decisiveness allows for efficient problem-solving and strong leadership, though it can become problematic if the individual becomes overly rigid or fails to consider the input of others.

+
    +
  • Benign Trait: The individual is able to make timely, confident decisions, weighing options thoughtfully but not dwelling too long on uncertainty. Their decisiveness allows them to take action when needed, often leading to efficient solutions. They balance clarity and confidence with openness to feedback, ensuring their decisions are both effective and considerate of others.

    +
      +
    • Example (Benign Trait): Conrad, a seasoned mercenary, is known for his quick, confident decisions in the heat of battle. When ambushed by a rival band of mercenaries, Conrad swiftly assesses the situation and orders his men to retreat to higher ground, turning the tide of the fight. His calm, assured leadership in dangerous situations earns him the loyalty of his comrades and the respect of his employers.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on quick decision-making, sometimes making choices too hastily or without full consideration of all factors. Their confidence in their judgment may lead them to overlook important details or dismiss the advice of others. While they remain capable, their decisiveness may cause minor conflicts, as others may feel ignored or rushed.

    +
      +
    • Example (Impulse Intensity): Conrad starts making decisions more rapidly, trusting his instincts above all else. In one skirmish, he orders his men to charge into battle without scouting the terrain, believing his experience is enough to handle any challenge. Though they win the fight, some of his fellow mercenaries begin to worry that Conrad is becoming too quick to act, taking risks that could be avoided with more careful planning.
    • +
    +
  • +
  • Disorder Intensity (Impulsive or Overly Rigid): As decisiveness intensifies, the individual may become rigid, making decisions too quickly or refusing to reconsider their choices even in the face of new information. They may dismiss others' advice entirely, believing their judgment to be superior, or become impulsive, acting without proper consideration of the consequences. This excessive decisiveness can lead to poor outcomes, strained relationships, and a reputation for being stubborn or reckless.

    +
      +
    • Physical Symptoms: The individual may experience stress or restlessness due to the pressure to always act quickly. Their insistence on rapid decision-making may leave them fatigued or frustrated when things do not go as planned.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to act immediately, even when there may be time for more consideration. The individual may feel anxious about delays and pressure themselves to make quick choices in every situation.

      +
    • +
    • Emotional Distress: The individual may feel frustration or impatience when others do not act quickly enough, or when their decisions are questioned. Their inability to slow down or reconsider decisions may lead to feelings of isolation or tension with peers.

      +
    • +
    • Example (Disorder Intensity): Conrad’s decisiveness becomes reckless, as he begins to act impulsively without thinking through the consequences. In a crucial battle, he orders an attack on a fortified enemy camp without waiting for reinforcements, believing speed is more important than caution. His mercenary band suffers heavy losses as a result of his hasty decision. When his men question his judgment, Conrad stubbornly refuses to admit any fault, blaming them for the failure. His once-respected leadership now alienates his comrades, who start to see him as a liability rather than a trusted leader.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Dentophobia + abbrev: dentophobia + id: 4VBHeBargLnQtHbG + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

Dentophobia is an intense, irrational fear of + dental procedures. People with dentophobia may experience a range of symptoms + when they think about, see, or are near situations involving dental treatments.

+
    +
  • Impulse Intensity: Avoiding dental + treatments, even when necessary. Abberance (ABE) increases by 1 from the + source of fear.
  • +
  • Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of dental treatments + Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness.
    • +
    • Intrusive Thoughts: Persistent and distressing thoughts + about pain or discomfort during dental procedures.
    • +
    • Emotional Distress: Deep feelings of dread and + helplessness when facing the prospect of dental treatment.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Diligent + abbrev: diligent + id: RmT8JPDpSb8sAcpb + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Diligent refers to an individual's consistent and careful effort in their work or responsibilities. A diligent person is dedicated, thorough, and persistent, ensuring tasks are completed with precision and care. This trait often leads to high-quality results and reliability, as diligent individuals take pride in doing things properly. However, excessive diligence can sometimes lead to perfectionism, overwork, or a lack of flexibility when things don’t go as planned.

+
    +
  • Benign Trait: The individual consistently works hard, pays attention to detail, and completes tasks with care and precision. They are reliable and trustworthy, ensuring that everything they do is done to the best of their ability without overburdening themselves or others. Their diligence results in high-quality outcomes and makes them a valued member of any team.

    +
      +
    • Example (Benign Trait): Elric, a blacksmith’s apprentice, is known for his diligent work ethic. He carefully hammers each piece of iron with precision, ensuring the weapons and tools he helps create are of the highest quality. His master praises him for his thoroughness, knowing that Elric never cuts corners and takes pride in every piece he produces.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on the details of their work, sometimes prioritizing thoroughness to the point of slowing down progress. While their diligence still results in high-quality work, they may take longer to complete tasks as they strive for perfection. This may cause minor frustrations for others who are waiting for results, as the individual may focus too much on the small details instead of the bigger picture.

    +
      +
    • Example (Impulse Intensity): Elric’s attention to detail becomes more intense as he tries to perfect every weapon and tool he forges. He spends extra hours polishing each blade and adjusting the smallest imperfections, often working late into the night. His master appreciates the quality but begins to worry that Elric’s obsession with perfection is causing delays in fulfilling larger orders.
    • +
    +
  • +
  • Disorder Intensity (Perfectionism/Overwork): As diligence intensifies, the individual may become overly focused on perfection, refusing to accept anything less than flawless results. This can lead to excessive working hours, burnout, and frustration when things don’t meet their impossibly high standards. The individual may struggle to delegate tasks or accept help, feeling that no one else can match their level of care. Their overwork and insistence on perfection can cause them to miss deadlines or strain relationships with others who feel they are too rigid or demanding.

    +
      +
    • Physical Symptoms: The individual may experience exhaustion, stress, or physical strain from overworking and refusing to rest. They may push themselves to the point of burnout as they try to maintain their high standards.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to achieve perfection, feeling anxious or dissatisfied with anything that isn’t flawless. The individual may struggle to stop working, constantly finding minor issues to fix.

      +
    • +
    • Emotional Distress: The individual may feel overwhelmed by their workload, frustrated when things don’t meet their high expectations, or anxious about the possibility of failure. Their inability to accept less-than-perfect results can lead to emotional burnout and strained relationships.

      +
    • +
    • Example (Disorder Intensity): Elric’s diligence turns into perfectionism, as he now refuses to let any weapon or tool leave the forge unless it meets his exacting standards. He spends hours reworking even the smallest details, causing significant delays in orders. His master grows frustrated as customers begin to complain about the wait times, but Elric insists that the quality of the work must come before everything else. Elric’s perfectionism strains his relationship with his master and leaves him exhausted, as he refuses to rest until each piece is flawless, even at the cost of his health and deadlines.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Dysphoria + abbrev: dysphoria + id: 1R0jXZP5iyBQiNd0 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Dysphoria is a state of profound unease or dissatisfaction, often characterized by feelings of anxiety, restlessness, or emotional discomfort. Unlike depression, which is marked by persistent sadness, dysphoria encompasses a broader sense of emotional turmoil, where the individual feels unsettled, irritable, or disconnected from themselves and their surroundings. Dysphoria can manifest as a symptom of various mental health conditions, including anxiety disorders and depression.

+
    +
  • Impulse Intensity: The individual experiences periods of restlessness or emotional discomfort, feeling generally dissatisfied or unsettled. While they may not be able to pinpoint the exact cause of their unease, these feelings often leave them irritable or anxious. Despite these emotions, the individual can still function in their daily life, though they may seem preoccupied or distracted.

    +
      +
    • Example (Impulse Intensity): Sir Edwin, a once confident and composed knight, has recently felt a persistent sense of discomfort he can’t quite explain. He grows irritable over minor inconveniences and finds himself pacing aimlessly around his keep, unable to focus on his duties. Though he continues to fulfill his responsibilities, his lingering feelings of unease make him more withdrawn and on edge.
    • +
    +
  • +
  • Disorder Intensity: As dysphoria intensifies, the individual becomes increasingly unable to shake their sense of emotional unrest or dissatisfaction. They may feel disconnected from themselves, as if something is inherently wrong, and struggle with frequent irritability or anxiety. This ongoing state of discomfort can lead to social isolation, difficulty in maintaining relationships, and an inability to find pleasure or contentment in daily activities.

    +
      +
    • Physical Symptoms: Physical symptoms of dysphoria can include restlessness, agitation, muscle tension, or fidgeting. The individual may experience changes in appetite, difficulty sleeping, or persistent fatigue as a result of their emotional discomfort.

      +
    • +
    • Intrusive Thoughts: The individual may have persistent thoughts that something is wrong with them or that they are out of sync with the world around them. They might dwell on feelings of inadequacy, frustration, or existential unease, struggling to find purpose or meaning in their life.

      +
    • +
    • Emotional Distress: Intense emotional discomfort, irritability, or dissatisfaction with oneself or one’s circumstances. The individual may feel emotionally detached from others and struggle to find any sense of stability or peace, leading to further frustration and restlessness.

      +
    • +
    • Example (Disorder Intensity): Sir Edwin’s dysphoria worsens to the point where he no longer feels like himself. He is constantly agitated, snapping at his servants and withdrawing from social gatherings. No matter what he does, he cannot shake the sense that something is fundamentally wrong, leaving him in a perpetual state of emotional discomfort. His duties become a burden, and his relationships begin to fray as he pushes others away, unable to explain or alleviate the deep unease that consumes him.

      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Dystychiphobia + abbrev: dystychiphobia + id: 45Uk2WaDKbQHmF3u + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Dystychiphobia is an intense, irrational fear of accidents. + People with dystychiphobia may experience a range of symptoms when they think + about, see, or are in situations where accidents could occur. +

+
    +
  • + Impulse Intensity: Avoiding activities perceived as risky, + such as driving, sports, or certain types of travel. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of being in an + accident. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about potential accidents and injuries. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in situations that may result in an accident. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Emetophobia + abbrev: emetophobia + id: BvRoC2CR0VS5YaoE + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Emetophobia is an intense, irrational fear of vomiting. + People with emetophobia may experience a range of symptoms when they think + about, see, or feel the sensation of nausea. +

+
    +
  • + Impulse Intensity: Avoiding certain foods, situations, or + places (such as social gatherings or public transportation) that might + induce vomiting. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of vomiting or seeing + others vomit. Abberance (ABE) increases by 3 (instead of 1) from the source + of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about vomiting in public or losing control. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness related to the fear of vomiting. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Enigmatic + abbrev: enigmatic + id: dWo2fuKoyexq2SaI + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Enigmatic refers to an individual's mysterious, intriguing nature that captivates and piques the curiosity of others. An enigmatic person reveals little about their true thoughts and intentions, often keeping people guessing. This air of mystery can be appealing, as it invites intrigue, but when taken too far, it can create frustration or distrust. While a degree of secrecy can make a person seem interesting, excessive enigma can lead to isolation and a sense of disconnection from others.

+
    +
  • Benign Trait: The individual maintains an air of mystery, sharing just enough to keep others intrigued while withholding deeper details about themselves. Their enigmatic nature is used thoughtfully, and while they don’t always reveal everything, it adds to their charm without causing suspicion or frustration. People find them interesting and are drawn to their subtle, quiet allure.

    +
      +
    • Example (Benign Trait): Dorian, a wandering minstrel, travels from town to town, charming listeners with his songs and stories. Though he never speaks much about his own life, his reserved demeanor and occasional cryptic remarks leave audiences curious. His mystery makes people admire him, wondering who he truly is without ever feeling alienated.
    • +
    +
  • +
  • Impulse Intensity (Intentional Mystery): The individual becomes more deliberate in maintaining their mystery, often speaking in cryptic ways that suggest hidden meanings. They enjoy keeping others on edge, hinting that there’s always something deeper behind their words without ever clarifying their true intentions. This intentional mystery frustrates those around them, as they feel the person is playing games, leaving people wishing they would just speak plainly and say what they mean. The enigmatic allure becomes more of a puzzle, and while some find it intriguing, others grow weary of the constant guessing.

    +
      +
    • Example (Impulse Intensity): Dorian now begins to revel in his enigmatic persona. When asked simple questions, he responds with vague, cryptic phrases, hinting at deeper meanings without explaining them. People start to feel like there’s always something unsaid or hidden behind his words, which leaves them both fascinated and frustrated. Villagers often whisper to each other, trying to decipher what Dorian truly meant, wishing he would just be straightforward. His deliberate air of mystery keeps them engaged, but some start to feel manipulated by his evasiveness.
    • +
    +
  • +
  • Disorder Intensity (Alienation through Cryptic Obfuscation): As the enigmatic nature intensifies, the individual becomes excessively cryptic and elusive, using riddles, vague language, or hidden meanings to create distance between themselves and others. They may speak in such obscure terms that others can no longer understand them, making interactions increasingly frustrating. What was once an intriguing mystery becomes exhausting, as people give up trying to decipher the person’s intentions. The individual uses this cryptic nature as a shield, avoiding real connection and creating an emotional distance that leads to alienation and isolation.

    +
      +
    • Physical Symptoms: The individual may experience stress or anxiety from maintaining their cryptic persona, always calculating their words to ensure they remain mysterious. This can lead to emotional exhaustion and a sense of detachment from others.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to maintain their mystery, fearing vulnerability or exposure. The individual may constantly devise cryptic responses, focusing on keeping others guessing.

      +
    • +
    • Emotional Distress: The individual may feel increasingly isolated, as their cryptic behavior pushes others away. Though they use mystery to protect themselves, they may become lonely or disconnected from genuine relationships, leading to feelings of emptiness.

      +
    • +
    • Example (Disorder Intensity): Dorian’s love for cryptic speech has deepened into full-blown obfuscation. He never answers questions directly, preferring to cloak even the simplest conversations in riddles and hidden meanings. People no longer find his mystery intriguing but exhausting, and many have stopped engaging with him altogether. Even when it’s clear his words hold no real meaning, Dorian continues to speak cryptically, using his puzzles as a wall to keep everyone at a distance. Though he travels and performs, he remains emotionally isolated, trapped by the very mystery that once made him fascinating.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Enthusiastic + abbrev: enthusiastic + id: AmlUQjFyd39p9oSs + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Enthusiasm refers to an individual's lively, eager, and energetic attitude toward tasks, ideas, or experiences. An enthusiastic person approaches life with excitement and passion, often motivating and inspiring others around them. Their positive energy can drive progress and foster a joyful environment, though unchecked enthusiasm may sometimes lead to impulsive decisions or a lack of focus on important details.

+
    +
  • Benign Trait: The individual approaches tasks with eagerness and a genuine passion, bringing a positive and motivating energy to their surroundings. Their enthusiasm is contagious, and they inspire others to engage with the same excitement. They balance their energy with thoughtfulness, ensuring that their passion is focused and productive.

    +
      +
    • Example (Benign Trait): Hugh, a young squire, eagerly follows his knight master to every battle and training session, excited to learn the ways of knighthood. He works diligently, always offering to help with tasks, whether it’s polishing armor or tending to the horses. Hugh’s enthusiasm is infectious, lifting the spirits of the knights around him, as his eagerness to serve reminds them of their own beginnings. His energy drives him to excel, but he remains focused on learning the discipline required to be a knight.
    • +
    +
  • +
  • Impulse Intensity: The individual’s enthusiasm begins to intensify, sometimes leading them to act too quickly or dive into tasks without fully considering the details. While their energy remains positive, they may rush into decisions or take on too much at once. Others may appreciate their passion but occasionally feel that they should slow down and think things through more carefully before acting.

    +
      +
    • Example (Impulse Intensity): Hugh’s enthusiasm grows as he becomes more confident in his role. He starts volunteering for every task and mission, eager to prove himself. However, his eagerness sometimes causes him to overlook key details or rush through his work, like hastily packing supplies for a journey or forgetting to secure his master’s armor properly. While his knight master admires Hugh’s drive, he gently reminds him to slow down and focus on doing things thoroughly rather than just quickly.
    • +
    +
  • +
  • Disorder Intensity (Reckless Enthusiasm): As enthusiasm intensifies, the individual may become overly eager, acting impulsively or recklessly in their desire to engage with tasks or ideas. They may jump into situations without proper preparation, driven by excitement rather than careful thought. Their unchecked enthusiasm can lead to mistakes, burnout, or frustration from those around them, as their energy becomes overwhelming or misdirected. Others may see them as rash or overly eager, and their impulsiveness may cause more harm than good.

    +
      +
    • Physical Symptoms: The individual may experience exhaustion from overextending themselves, constantly taking on tasks or challenges without pacing their energy. Their boundless enthusiasm may lead to stress or fatigue as they struggle to keep up with everything they’ve committed to.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to be involved or take action in every situation, driven by excitement and a fear of missing out. They may feel restless or anxious when not actively engaging in something exciting or new.

      +
    • +
    • Emotional Distress: The individual may feel frustrated when their enthusiasm leads to mistakes or when others suggest they slow down. Their impulsiveness may lead to feelings of inadequacy or disappointment when things don’t go as planned.

      +
    • +
    • Example (Disorder Intensity): Hugh’s enthusiasm now borders on recklessness. In his eagerness to prove himself, he volunteers for a dangerous scouting mission without properly preparing or consulting his knight master. He rushes ahead of the group, excited to be the first to spot the enemy, but his lack of caution leads him into an ambush. Though his heart is in the right place, his unrestrained enthusiasm causes more harm than good, and his knight master has to intervene to save him. Hugh’s impulsiveness not only puts him in danger but also strains the trust between him and his fellow squires, who begin to see him as too reckless.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Entomophobia + abbrev: entomophobia + id: wzg05gE58HcxHfsh + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Entomophobia is an intense, irrational fear of insects. + People with entomophobia may experience a range of symptoms when they think + about, see, or are near insects. +

+
    +
  • + Impulse Intensity: Avoiding outdoor activities, gardens, or + environments where insects are common. Abberance (ABE) increases by 1 from + the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of insects. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being bitten or infested by insects. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in environments where insects might be present. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Eosophobia + abbrev: eosophobia + id: gpxh3PJ4cXweWeQd + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Eosophobia is an intense, irrational fear of dawn or + daylight. People with eosophobia may experience a range of symptoms when they + think about, see, or are exposed to dawn or early daylight. +

+
    +
  • + Impulse Intensity: Staying indoors, keeping windows covered, + or altering sleep schedules to avoid exposure to dawn. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or sight of dawn. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about what dawn represents, whether it's the start of a new day or + specific associations with bad experiences. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness related to the onset of daylight. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Ephebiphobia + abbrev: ephebiphobia + id: 6hZqLd67K88X0d9W + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Ephebiphobia is an intense, irrational fear of teenagers or + adolescents. People with ephebiphobia may experience a range of symptoms when + they think about, see, or are near teenagers. +

+
    +
  • + Impulse Intensity: Avoiding places where teens gather, such + as schools, malls, or parks. Abberance (ABE) increases by 1 from the source + of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of teenagers. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being judged or harmed by teenagers. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when encountering or thinking about teenagers. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Equinophobia + abbrev: equinophobia + id: NmYfjDjevHGTqj0A + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Equinophobia is an intense, irrational fear of horses. People + with equinophobia may experience a range of symptoms when they think about, + see, or are near horses. +

+
    +
  • + Impulse Intensity: Avoiding farms, stables, or events where + horses are present, such as equestrian competitions. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of horses. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being bitten, kicked, or trampled by a horse. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near horses or places they frequent. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Ergophobia + abbrev: ergophobia + id: p5IvSyKW9xLHc5gm + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Ergophobia is an intense, irrational fear of work or the + workplace. People with ergophobia may experience a range of symptoms when they + think about, see, or are in work situations. +

+
    +
  • + Impulse Intensity: Avoiding work, procrastinating, or even + quitting jobs to escape. Abberance (ABE) increases by 1 from the source of + fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or presence of + work-related tasks. Abberance (ABE) increases by 3 (instead of 1) from the + source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about failure, judgment, or deadlines at work. +
    • +
    • + Emotional Distress: Deep feelings of dread, + helplessness, and inadequacy related to professional responsibilities. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Focused + abbrev: focused + id: icrPuli3Hp72gH42 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Focused refers to an individual's ability to concentrate deeply on tasks, thoughts, or goals. A focused person is often determined, persistent, and able to block out distractions in order to achieve their objectives. While focus is a valuable trait that allows individuals to be productive and goal-oriented, when it intensifies, it can lead to tunnel vision or obsession, causing the person to neglect other aspects of their life or relationships.

+
    +
  • Benign Trait: The individual demonstrates a healthy ability to concentrate on tasks or goals, managing distractions effectively while still maintaining a balanced life. They are productive, detail-oriented, and capable of maintaining long periods of attention when necessary, without ignoring the needs of others or their own well-being.

    +
      +
    • Example (Benign Trait): Lord Richard is known for his keen attention to detail when managing his estate. He is able to devote several hours to important matters, reviewing reports and ensuring everything runs smoothly, yet he always makes time for his family and social obligations. His focus allows him to be both successful and balanced.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes highly absorbed in their work or tasks, sometimes to the point of neglecting other responsibilities or relationships. Although they remain capable of functioning socially, they may prioritize their focused interests above all else, often appearing preoccupied or distant to others.

    +
      +
    • Example (Impulse Intensity): Lord Richard now spends nearly all of his time on estate management, often working late into the night. He frequently cancels meetings and social engagements, telling himself that the estate’s needs are more important. His friends and family notice he has become more distant, and he rarely participates in activities he used to enjoy.
    • +
    +
  • +
  • Disorder Intensity: As focus intensifies into an obsession, the individual may become so fixated on their goals or tasks that they neglect their health, relationships, or other important aspects of life. Their tunnel vision can lead to physical and emotional exhaustion, as they cannot pull themselves away from their work. The individual may become socially isolated, and their intense focus may lead to frustration, burnout, or even harmful behavior when things do not go according to plan.

    +
      +
    • Physical Symptoms: The individual may experience fatigue, headaches, or other physical symptoms from overworking themselves. They may neglect basic self-care, such as eating or sleeping, in their pursuit of perfection or completion of their goals.

      +
    • +
    • Intrusive Thoughts: Persistent, obsessive thoughts about their tasks or goals. The individual may feel they cannot rest or take a break until they have completed their work perfectly. These thoughts can dominate their mind, making it difficult to focus on anything else.

      +
    • +
    • Emotional Distress: Intense frustration or anger when distracted or interrupted. The individual may become irritable, anxious, or depressed due to their inability to find balance, and they may struggle with feelings of isolation as they push others away to maintain focus.

      +
    • +
    • Example (Disorder Intensity): Lord Richard’s focus on estate management has consumed him completely. He no longer speaks to his family, rarely sleeps, and has stopped attending any social functions. His entire day is spent obsessing over the smallest details of the estate, and he becomes furious when interrupted by even the simplest questions or requests. His health begins to decline as he skips meals and works late into the night, and those around him worry about his increasingly obsessive behavior, but Richard remains blind to the consequences of his all-consuming focus.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Frigophobia + abbrev: frigophobia + id: 7yZSeugz0kIqAHTJ + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Frigophobia is an intense, irrational fear of cold or cold + things. People with frigophobia may experience a range of symptoms when they + think about, see, or are exposed to cold temperatures. +

+
    +
  • + Impulse Intensity: Avoiding cold places, cold drinks, or + snowy environments. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or sensation of cold. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness even in cold + environments. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being harmed by or unable to cope with cold. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when faced with cold temperatures or objects. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Frivolous + abbrev: frivolous + id: GvNn5KBOIfkqIu06 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Frivolous refers to behavior that is lighthearted, superficial, or lacking in seriousness. Individuals who exhibit frivolous tendencies may prioritize fun, entertainment, or fleeting pleasures over more meaningful or responsible actions. While being lighthearted can bring joy, when intensified, frivolity can lead to irresponsibility, neglect of important duties, and a lack of concern for consequences.

+
    +
  • Benign Trait: The individual enjoys fun and lighthearted activities, often engaging in playful or carefree behavior. While they may occasionally prioritize enjoyment over responsibility, they still recognize when it’s time to be serious and fulfill their obligations. Their frivolous tendencies are generally harmless and can even bring a sense of joy or levity to those around them.

    +
      +
    • Example (Benign Trait): Lady Beatrice loves to host lavish parties, filling her estate with laughter and music. She enjoys spending her wealth on fine clothes and entertainment, but she always makes sure her estate is well-managed and that her guests feel welcome and cared for.
    • +
    +
  • +
  • Impulse Intensity: The individual begins to prioritize fun and pleasure over more pressing responsibilities. They may neglect important tasks or commitments, opting for entertainment instead of addressing serious matters. While still functioning in society, their behavior starts to frustrate those around them, as they increasingly ignore their obligations in favor of lighthearted pursuits.

    +
      +
    • Example (Impulse Intensity): Lady Beatrice begins to shirk her duties, spending more and more time planning elaborate parties rather than managing her estate. She frequently ignores pressing issues, such as estate maintenance and important meetings, leading her advisors to grow concerned about her lack of focus on matters of importance.
    • +
    +
  • +
  • Disorder Intensity: As frivolity intensifies, the individual becomes completely detached from responsibility, focusing solely on fleeting pleasures and superficial matters. They may abandon significant obligations, relationships, or duties, leading to financial ruin, strained social connections, or personal chaos. The person may struggle to recognize the seriousness of their situation, continuing to seek fun and entertainment at the expense of their well-being and stability.

    +
      +
    • Physical Symptoms: The individual may experience physical exhaustion from overindulgence in entertainment or pleasure-seeking activities. They may also suffer from financial strain, neglect their health, or exhibit signs of stress when their behavior leads to real-world consequences.

      +
    • +
    • Intrusive Thoughts: Persistent desires for enjoyment, pleasure, or distraction. The individual may fixate on planning events, spending money on luxury items, or seeking out fun experiences, even when doing so causes harm to themselves or others.

      +
    • +
    • Emotional Distress: As their life becomes increasingly unmanageable, the individual may feel fleeting happiness but also underlying guilt, anxiety, or frustration as the consequences of their frivolous behavior mount. They may also feel disconnected from those around them who view their behavior as irresponsible or reckless.

      +
    • +
    • Example (Disorder Intensity): Lady Beatrice's frivolous behavior has taken over her life. She spends lavishly on extravagant parties, ignoring the mounting debts and failing infrastructure of her estate. Her servants and advisors plead with her to take matters seriously, but she laughs off their concerns, focused only on her next ball or celebration. As her estate falls into disrepair and her reputation crumbles, Beatrice remains fixated on her desire for entertainment, blind to the long-term damage her frivolousness has caused.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Galeophobia + abbrev: galeophobia + id: lhIbM9v7CRc7pN9O + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Galeophobia is an intense, irrational fear of sharks. People + with galeophobia may experience a range of symptoms when they think about, + see, or are near environments where sharks might be present. +

+
    +
  • + Impulse Intensity: Avoiding swimming in the ocean, watching + documentaries about sharks, or visiting aquariums with shark exhibits. + Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of sharks. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being attacked or eaten by sharks. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near bodies of water where sharks might be or when + thinking about them. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Gamophobia + abbrev: gamophobia + id: zAa9GXWYGXv5kiqy + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Gamophobia is an intense, irrational fear of marriage or + commitment. People with gamophobia may experience a range of symptoms when + they think about, see, or are in situations where commitment or marriage is a + topic. +

+
    +
  • + Impulse Intensity: Avoiding discussions about future plans, + commitment ceremonies, or romantic relationships that might lead to + marriage. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of marriage or + long-term commitment. Abberance (ABE) increases by 3 (instead of 1) from the + source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about the responsibilities and permanence of marriage. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in romantic relationships or discussions of commitment. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Generous + abbrev: generous + id: Ezfl220jcCGtIk9P + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Generous refers to an individual's willingness to give or share resources, time, or care with others without expecting anything in return. A generous person acts with kindness, often putting others' needs ahead of their own. While generosity is typically seen as a positive and admirable trait, excessive generosity can sometimes lead to self-neglect or being taken advantage of by others.

+
    +
  • Benign Trait: The individual consistently offers help, resources, or emotional support to others. Their generosity is balanced, as they give without expecting something in return but still maintain healthy boundaries. They are often appreciated for their kindness and willingness to support those around them, without overextending themselves.

    +
      +
    • Example (Benign Trait): Lord William is known for his charitable nature. He regularly donates food and supplies to the villagers during difficult harvest seasons and offers his time to help solve disputes among his people. His generosity strengthens the bond between him and the community, who respect him for his kind heart.
    • +
    +
  • +
  • Impulse Intensity: The individual begins to prioritize others' needs over their own more frequently, sometimes offering resources or help without considering their own well-being. They may find it difficult to say no to requests for help, leading to occasional feelings of being overwhelmed or taken for granted. Their generosity remains well-meaning but begins to stretch their personal limits.

    +
      +
    • Example (Impulse Intensity): Lord William now finds himself giving more than he can afford, loaning money to other nobles and offering assistance to every villager who comes to him for help. He begins to neglect his own responsibilities, struggling to manage his estate because he cannot say no to those in need. Though he is still admired for his generosity, some worry that he is giving too much of himself.
    • +
    +
  • +
  • Disorder Intensity: As generosity intensifies, the individual may completely neglect their own well-being, health, or resources in their desire to help others. They may give to the point of exhaustion or financial ruin, unaware that their excessive generosity is harming themselves and enabling others to take advantage of them. This level of generosity can lead to burnout, depletion of resources, and a loss of personal identity as the individual becomes solely focused on others' needs.

    +
      +
    • Physical Symptoms: Fatigue, stress, or even physical illness due to overextending themselves physically, emotionally, or financially in an attempt to support others. The individual may feel drained and unable to care for their own needs.

      +
    • +
    • Intrusive Thoughts: Constant preoccupation with how to help others, coupled with feelings of guilt if they are unable to provide assistance. The individual may believe that their worth is tied to how much they give, leading to a cycle of overgiving and self-neglect.

      +
    • +
    • Emotional Distress: The individual may experience emotional exhaustion or frustration as they realize that their generosity is being exploited or that they have nothing left to give. Despite this, they may continue to push themselves, unable to stop their compulsion to help others, even to their own detriment.

      +
    • +
    • Example (Disorder Intensity): Lord William's generosity has reached a dangerous level. He has depleted his estate’s treasury by continuously providing for those in need, leaving his own household in financial distress. He works tirelessly to meet the endless requests for help, neglecting his own health and estate. His family pleads with him to stop, but William feels immense guilt at the thought of turning anyone away. He becomes physically exhausted and emotionally drained, yet remains unable to refuse the constant demands for his support, even as his own life and legacy crumble around him.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Gephyrophobia + abbrev: gephyrophobia + id: l8Yjs1bNPduZcsm2 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Gephyrophobia is an intense, irrational fear of bridges or + crossing bridges. People with gephyrophobia may experience a range of symptoms + when they think about, see, or are near bridges. +

+
    +
  • + Impulse Intensity: Avoiding routes that involve bridges and + opting for alternative paths. Abberance (ABE) increases by 1 from the source + of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or act of crossing a + bridge. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about bridges collapsing or falling off a bridge. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in situations where crossing a bridge is unavoidable. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Glossophobia + abbrev: glossophobia + id: DJNA9hAGS9WpIKGu + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Glossophobia is an intense, irrational fear of public + speaking or speaking in front of a group. People with glossophobia may + experience a range of symptoms when they think about, see, or are in speaking + situations. +

+
    +
  • + Impulse Intensity: Avoiding any form of public speaking, + including presentations, speeches, or even classroom participation. + Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of speaking publicly. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being judged or failing during public speaking. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when faced with the prospect of speaking in front of + others. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Goal-oriented + abbrev: goaloriented + id: KmwK0eO8pq0ZXOAH + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Goal-Oriented refers to an individual's focus on achieving specific objectives and outcomes. A goal-oriented person is driven, organized, and persistent, often structuring their time and efforts around their ambitions. While being goal-oriented is generally a positive trait that leads to productivity and success, an excessive focus on goals can lead to neglect of personal well-being or relationships, as the individual becomes consumed by their pursuit of achievement.

+
    +
  • Benign Trait: The individual sets clear goals and works steadily towards achieving them. They are organized and motivated, balancing their ambition with other aspects of life, such as relationships and personal interests. They are able to adjust their approach if needed and are open to feedback, all while maintaining a strong sense of purpose.

    +
      +
    • Example (Benign Trait): Lady Helena has a clear vision for expanding her estate’s trade routes. She creates a detailed plan and steadily works toward her goal, collaborating with merchants and ensuring her workers are cared for. Helena’s focused approach allows her to succeed without sacrificing her relationships or health.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more intensely focused on their goals, sometimes prioritizing them over other important aspects of life. While they remain effective and driven, they may begin to neglect social interactions, relaxation, or self-care in their pursuit of achievement. Others may see them as overly focused, but they still maintain a functional balance.

    +
      +
    • Example (Impulse Intensity): Lady Helena becomes increasingly focused on her trade expansion, spending late nights reviewing reports and meeting with merchants. She starts to cancel social events and neglects her personal hobbies, telling herself that these sacrifices are necessary to achieve her ambitions. Though still effective in her role, Helena’s friends and family begin to notice her growing distance.
    • +
    +
  • +
  • Disorder Intensity: As goal orientation intensifies, the individual may become completely consumed by their pursuit of success, often at the expense of their health, relationships, or emotional well-being. They may become rigid in their approach, refusing to deviate from their goals or accept setbacks. Their obsession with achievement can lead to burnout, stress, and a sense of isolation as they prioritize their objectives above all else.

    +
      +
    • Physical Symptoms: The individual may experience exhaustion, insomnia, or physical stress from overworking themselves to meet their goals. They may neglect proper nutrition, sleep, or exercise in favor of completing tasks related to their ambitions.

      +
    • +
    • Intrusive Thoughts: Persistent, obsessive thoughts about their goals and how to achieve them. The individual may feel anxious or guilty if they are not actively working towards their objectives, becoming preoccupied with reaching milestones at all costs.

      +
    • +
    • Emotional Distress: The individual may experience frustration, anger, or despair when their goals are not progressing as expected. They may feel isolated, as their single-minded focus distances them from friends and loved ones. Burnout or feelings of inadequacy may arise if they are unable to meet their own high standards.

      +
    • +
    • Example (Disorder Intensity): Lady Helena’s goal of expanding her trade routes has become an all-consuming obsession. She refuses to take breaks, working through illness and fatigue. Her relationships deteriorate as she isolates herself, believing that any moment not spent working is wasted. When unforeseen obstacles arise, Helena becomes frustrated and lashes out at her staff, unable to cope with setbacks. Despite achieving some success, she feels constantly unsatisfied and overwhelmed, as her pursuit of perfection drains her energy and leaves her emotionally and physically exhausted.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Gynophobia + abbrev: gynophobia + id: xTOqTJtdibWnsxZz + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Gynophobia is an intense, irrational fear of women. People + with gynophobia may experience a range of symptoms when they think about, see, + or are near women. +

+
    +
  • + Impulse Intensity: Avoiding social situations, work + environments, or places where women are present. Abberance (ABE) increases + by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of women. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about interactions with women. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in situations involving women. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Haematophobia + abbrev: haematophobia + id: vnyPYt3qdW0KNgGr + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Haematophobia is an intense, irrational fear of blood. People + with haematophobia may experience a range of symptoms when they think about, + see, or are near blood. +

+
    +
  • + Impulse Intensity: Avoiding medical procedures, injuries, or + anything where blood might be present. Abberance (ABE) increases by 1 from + the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of blood. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, dizziness, and sometimes + fainting. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about bleeding or blood loss. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when encountering blood. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Heliophobia + abbrev: heliophobia + id: Cibi8DwlN9BZfocP + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Heliophobia is an intense, irrational fear of the sun or + sunlight. People with heliophobia may experience a range of symptoms when they + think about, see, or are exposed to sunlight. +

+
    +
  • + Impulse Intensity: Staying indoors during daylight hours, + using heavy curtains, or wearing protective clothing when outside. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or sight of sunlight. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about the harmful effects of sunlight, such as skin cancer or sunburn. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when exposed to sunlight. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Herpetophobia + abbrev: herpetophobia + id: qfm5oP7YGtA72I2j + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Herpetophobia is an intense, irrational fear of reptiles, + particularly snakes and lizards. People with herpetophobia may experience a + range of symptoms when they think about, see, or are near reptiles. +

+
    +
  • + Impulse Intensity: Avoiding zoos, pet stores, or natural + habitats where reptiles might be present. Abberance (ABE) increases by 1 + from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of reptiles. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being bitten or attacked by reptiles. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near or thinking about reptiles. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Hoplophobia + abbrev: hoplophobia + id: CYnX4Hf8TtzXdThU + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Hoplophobia is an intense, irrational fear of weapons or + armed combat. People with hoplophobia may experience a range of symptoms when + they think about, see, or are near situations involving weapons or combat with + weapons. +

+
    +
  • + Impulse Intensity: Avoiding weapon practice arenas, + tournaments, hunting stores, military environments, or any settings where + weapons might be present. Abberance (ABE) increases by 1 from the source of + fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of weapons or + armed violence. Abberance (ABE) increases by 3 (instead of 1) from the + source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being injured, killed, or witnessing violence involving weapons. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when in situations involving or resembling combat with + weapons. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Humility + abbrev: humility + id: bhKvGoZnt2z0rv7p + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Humility is the quality of being modest, unassuming, and respectful of others. A humble individual recognizes their own strengths and weaknesses without seeking praise or placing themselves above others. They are open to feedback and are able to acknowledge their own limitations. While humility is a valued and constructive trait, excessive humility can lead to self-doubt, passivity, or allowing others to take advantage of them.

+
    +
  • Benign Trait: The individual possesses a healthy sense of modesty, acknowledging their accomplishments without seeking excessive praise. They are open to learning from others, admitting their mistakes, and giving credit where it is due. Their humility helps them form positive relationships, as they treat others with respect and value their contributions.

    +
      +
    • Example (Benign Trait): Lady Catherine, despite her success in overseeing her estate’s growth, always credits her workers for their efforts. When praised, she graciously accepts compliments but does not boast of her achievements. She is known for treating everyone with kindness and respect, from her servants to visiting nobles.
    • +
    +
  • +
  • Impulse Intensity: The individual’s humility begins to border on self-effacement, as they downplay their accomplishments and may struggle to accept praise. They may hesitate to take credit for their work, allowing others to overshadow them. While their humility is still seen as a positive trait, it can sometimes limit their opportunities, as they avoid stepping into the spotlight.

    +
      +
    • Example (Impulse Intensity): Lady Catherine constantly downplays her role in the estate’s success, giving all the credit to others and feeling uncomfortable with any recognition. She begins to defer to others in decision-making, even when her input is vital, and misses opportunities to showcase her leadership abilities.
    • +
    +
  • +
  • Disorder Intensity: As humility intensifies, the individual may become excessively self-deprecating, allowing others to dominate them or take advantage of their reluctance to assert themselves. They may avoid leadership roles or challenges, believing they are not worthy, even when they are highly capable. Their excessive humility can lead to passivity, missed opportunities, and feelings of inadequacy, as they struggle to assert their own value.

    +
      +
    • Physical Symptoms: The individual may experience anxiety or discomfort when given attention or praise. They may feel a sense of stress or tension when expected to assert themselves or make decisions, leading to physical symptoms like restlessness or fatigue.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of inadequacy, where the individual constantly questions their worth or ability. They may feel undeserving of praise or success and believe that others are more capable, leading to a reluctance to take initiative or lead.

      +
    • +
    • Emotional Distress: The individual may feel frustration or sadness due to their inability to accept their own value. They may become overly passive, allowing others to overshadow them or take advantage of their humility, which can lead to feelings of resentment, inadequacy, or emotional exhaustion.

      +
    • +
    • Example (Disorder Intensity): Lady Catherine’s humility has reached the point where she no longer accepts any praise or responsibility. When she is offered opportunities to advance her position or contribute her ideas, she declines, convinced that others are more deserving. She avoids decision-making altogether, allowing others to take control, even when her estate begins to suffer as a result. Catherine feels increasingly inadequate and passive, unable to see her own worth and believing she is unworthy of any recognition or success.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Hypochondriasis + abbrev: hypochondriasis + id: Q40pCzMMvsJza7XT + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Hypochondriasis, also known as health anxiety or illness anxiety disorder, is a condition characterized by an excessive preoccupation with the belief that one is seriously ill, despite having little or no medical evidence to support this belief. Individuals with hypochondriasis often misinterpret normal bodily sensations as symptoms of a severe illness. This constant worry can interfere with daily life, relationships, and overall well-being, as the individual becomes consumed with fear of illness.

+
    +
  • Impulse Intensity: The individual frequently worries about their health, often interpreting mild or common physical sensations (such as headaches, muscle twitches, or stomach aches) as signs of a serious condition. They may seek reassurance from doctors or loved ones but still experience persistent doubt about their health, though their anxiety remains manageable and they can continue functioning in daily life.

    +
      +
    • Example (Impulse Intensity): Sir Edmund has begun to worry about every ache and pain, convinced that each one signals the onset of a serious illness. He visits his physician frequently for reassurance, but even after receiving a clean bill of health, he continues to fixate on the possibility that something might be wrong. Despite his concerns, he continues his duties as lord of his estate, though with lingering anxiety.
    • +
    +
  • +
  • Disorder Intensity: As hypochondriasis worsens, the individual becomes obsessed with the idea that they are seriously ill. They may repeatedly seek medical opinions, undergo unnecessary tests, or avoid activities out of fear that they will exacerbate their supposed illness. Their constant focus on their health can cause significant disruptions to their personal and professional life, leading to social isolation, emotional distress, and strained relationships.

    +
      +
    • Physical Symptoms: The individual may experience real physical symptoms such as tension headaches, stomach discomfort, or fatigue, often as a result of the stress and anxiety they feel. These symptoms, in turn, reinforce their belief that they are ill.

      +
    • +
    • Intrusive Thoughts: Persistent, irrational fears of having or developing a serious illness. The individual may fixate on specific symptoms or diseases, despite medical evidence to the contrary. They constantly worry about their health and may believe that doctors are missing a serious diagnosis.

      +
    • +
    • Emotional Distress: The individual may experience deep anxiety, frustration, and sadness due to their overwhelming fear of illness. Their constant worry can cause emotional strain, as they struggle to trust medical professionals or the reassurance of loved ones. This often leads to feelings of helplessness or despair.

      +
    • +
    • Example (Disorder Intensity): Sir Edmund’s hypochondriasis has become so severe that he refuses to leave his manor, fearing that exposure to the outside world will worsen his imagined condition. He spends hours researching diseases and symptoms, convinced that his physicians have missed something. His family grows frustrated with his refusal to believe he is healthy, and his constant need for reassurance strains his relationships. Despite undergoing numerous tests and treatments, Edmund remains convinced that he is gravely ill, his life consumed by fear and anxiety.

      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Iatrophobia + abbrev: iatrophobia + id: cTn5v1jyg54HEpK3 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Iatrophobia is an intense, irrational fear of physicians or + medical treatment. People with iatrophobia may experience a range of symptoms + when they think about, see, or are near physicians or medical facilities. +

+
    +
  • + Impulse Intensity: Avoiding medical appointments, treatments, + or any interaction with physicians. Abberance (ABE) increases by + 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of medical treatment or + physicians. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about medical interventions and potential diagnoses. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness related to healthcare. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Ichthyophobia + abbrev: ichthyophobia + id: IxBD8PWyLjdLbamj + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Ichthyophobia is an intense, irrational fear of fish. People + with ichthyophobia may experience a range of symptoms when they think about, + see, or are near fish. +

+
    +
  • + Impulse Intensity: Avoiding swimming, fishing, going to + seafood markets, or aquariums. Abberance (ABE) increases by 1 from the + source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of fish. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being touched, bitten, or encountered by fish. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near water where fish might be or when thinking about + fish. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Imaginative + abbrev: imaginative + id: r8UvDrxqEpKhB9kx + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Imaginative refers to an individual's ability to think creatively, form vivid mental images, and explore possibilities beyond the ordinary. A person with a strong imagination can envision new ideas, worlds, or solutions, often drawing inspiration from their inner thoughts and creativity. While imagination is typically a valuable trait, allowing for innovation and artistic expression, an overactive imagination can sometimes lead to detachment from reality, daydreaming, or difficulty focusing on practical matters.

+
    +
  • Benign Trait: The individual possesses a healthy sense of creativity, often coming up with original ideas or solutions. They are able to balance their imagination with reality, using it to enhance their problem-solving abilities, storytelling, or artistic pursuits. Their creativity brings joy to themselves and those around them, without detracting from their ability to function in daily life.

    +
      +
    • Example (Benign Trait): Lady Anwen has a vivid imagination, often spinning elaborate stories for her children and guests. Her creativity shines in her paintings and poetry, which bring delight to her household. Despite her flights of fancy, Anwen remains practical and grounded, using her imagination to enhance her duties rather than distract from them.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more frequently lost in their imagination, sometimes daydreaming or getting distracted by their creative thoughts. They may have difficulty focusing on more practical tasks, as their mind often drifts to the ideas, stories, or fantasies they are creating. While still functional in daily life, their imagination can begin to interfere with their responsibilities.

    +
      +
    • Example (Impulse Intensity): Lady Anwen increasingly finds herself daydreaming during important meetings or tasks, her mind wandering to the worlds and characters she has imagined. While her stories and ideas are captivating, she occasionally misses important details or fails to complete her work on time, much to the frustration of her advisors.
    • +
    +
  • +
  • Disorder Intensity: As imagination becomes more intense, the individual may become overly detached from reality, spending much of their time in their fantasies or creative thoughts. They may struggle to engage with the practical world, neglecting responsibilities or relationships in favor of their imagined worlds. This level of detachment can lead to social isolation, difficulties in maintaining a stable life, and emotional distress when they are forced to confront reality.

    +
      +
    • Physical Symptoms: The individual may experience physical restlessness or fatigue from spending long hours lost in their thoughts. They may neglect self-care or other responsibilities, losing track of time as they immerse themselves in their imagination.

      +
    • +
    • Intrusive Thoughts: Persistent fantasies or creative ideas that dominate the individual's mind, making it difficult to focus on the present. They may feel compelled to explore these thoughts, often losing touch with the real world as they become absorbed in their imagination.

      +
    • +
    • Emotional Distress: The individual may experience frustration, disappointment, or confusion when their imagined world does not align with reality. They may struggle with feelings of inadequacy or dissatisfaction as their creative pursuits take precedence over real-life achievements or relationships.

      +
    • +
    • Example (Disorder Intensity): Lady Anwen's imagination has grown so powerful that she spends most of her time in her own world of stories and fantasies. She neglects her duties as head of the household, leaving decisions to her staff while she loses herself in daydreams. Her family worries about her detachment, as Anwen seems more interested in her imaginary characters than in her real-life relationships. Despite this, she continues to prioritize her imaginative creations, feeling disconnected from the responsibilities and realities of her everyday life.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Independent + abbrev: independent + id: i3YlL1ie9QNFO9dh + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Independent refers to an individual's ability to think, act, and make decisions autonomously, without relying heavily on others for guidance or support. Independent individuals are self-sufficient, confident in their abilities, and often prefer to manage their affairs without seeking external help. While independence is generally viewed as a positive trait that fosters self-reliance and personal growth, excessive independence can lead to isolation, difficulty in collaboration, or reluctance to seek help when needed.

+
    +
  • Benign Trait: The individual confidently handles tasks and challenges on their own, making decisions without needing constant guidance or reassurance. They are able to work well independently while also understanding the value of collaboration when necessary. Their independence allows them to be resourceful and self-reliant, balancing autonomy with healthy social connections.

    +
      +
    • Example (Benign Trait): Lord Edwin is known for his ability to manage his estate without relying heavily on his advisors. He takes pride in making decisions himself, but he also knows when to seek counsel or delegate tasks to others when needed. His independence is admired by those around him as it allows him to maintain control while still fostering strong relationships.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more inclined to take on tasks alone, sometimes avoiding collaboration or rejecting offers of help. While they still function well, their increasing need to do everything independently may strain relationships, as others feel excluded or undervalued. They may become reluctant to delegate, even when doing so would benefit them.

    +
      +
    • Example (Impulse Intensity): Lord Edwin increasingly insists on handling all matters of the estate himself, turning down offers of assistance from his advisors. He begins to feel that relying on others is a sign of weakness, leading him to overextend himself. His staff notices that he is taking on more than he can handle, but Edwin remains determined to manage everything alone.
    • +
    +
  • +
  • Disorder Intensity: As independence intensifies, the individual may become excessively self-reliant to the point of rejecting all offers of help or collaboration. They may isolate themselves, viewing assistance from others as unnecessary or a threat to their autonomy. This extreme level of independence can lead to burnout, strained relationships, and an inability to accept support even in times of genuine need.

    +
      +
    • Physical Symptoms: The individual may experience fatigue, stress, or physical exhaustion from constantly trying to manage everything alone. Their reluctance to delegate tasks or seek help can lead to overwork and poor self-care.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about maintaining control and autonomy, coupled with fears of being perceived as weak if they rely on others. The individual may feel compelled to prove their self-sufficiency, even to their own detriment.

      +
    • +
    • Emotional Distress: The individual may experience frustration or anxiety when others offer help, seeing it as a challenge to their independence. They may feel isolated or lonely, but they often struggle to reach out for support, believing that they must handle everything on their own.

      +
    • +
    • Example (Disorder Intensity): Lord Edwin’s need for independence has reached an extreme. He refuses all offers of help, even when managing the estate becomes overwhelming. He works late into the night, becoming increasingly fatigued and stressed, but he stubbornly insists on handling every task himself. His relationships suffer, as his advisors and family feel pushed away, but Edwin remains fixated on proving that he can manage everything alone, even as his health and estate begin to deteriorate.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Indigiphobia + abbrev: indigiphobia + id: SDxeTOgzlXxqDaLw + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Indigiphobia is an intense, irrational fear of indigenous + people, driven by the perception that they are savage barbarians bent on + causing harm or destruction. People with indigiphobia may experience a range + of symptoms when they think about, see, or are near indigenous people or areas + associated with them. +

+
    +
  • + Impulse Intensity: Avoiding areas where indigenous people are + known to live, cultural events, festivals, or any engagements that might + involve indigenous traditions or presence. Abberance (ABE) increases by 1 + from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of indigenous + people, believing they pose a threat to personal safety or property. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being attacked, harmed, or having one's home and family + threatened by indigenous people. +
    • +
    • + Emotional Distress: Deep feelings of dread, + helplessness, and a sense of impending danger when near indigenous + people or considering their presence, leading to significant social + withdrawal and heightened security measures. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Innovative + abbrev: innovative + id: DauRvaal3b8COj44 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Innovative refers to an individual's ability to generate new ideas, approaches, or solutions to problems. An innovative person is creative, resourceful, and often looks for ways to improve existing methods or create something entirely new. While innovation is typically a valuable trait that drives progress and creativity, an excessive focus on innovation can lead to impractical ideas, constant disruption of established processes, or a failure to follow through on plans due to a relentless pursuit of newness.

+
    +
  • Benign Trait: The individual regularly comes up with creative solutions and improvements to existing processes. They are open to exploring new ideas and are often seen as resourceful and forward-thinking. Their innovations bring positive change and improvement, and they are able to balance their creativity with practicality, ensuring their ideas are feasible and beneficial.

    +
      +
    • Example (Benign Trait): Lady Elara, known for her creative mind, often introduces new farming techniques on her estate, increasing crop yields and efficiency. She listens to her workers' input and blends her innovative ideas with practical methods, making her estate both productive and progressive. Her balanced approach to innovation earns her the admiration of both her peers and those under her care.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on introducing new ideas, sometimes at the expense of established systems. They may feel a strong urge to change or improve processes even when unnecessary, occasionally disrupting routines. While they still bring positive contributions, their constant drive for innovation may lead to frustration from those who prefer stability or consistency.

    +
      +
    • Example (Impulse Intensity): Lady Elara frequently proposes new projects and changes, such as reorganizing the estate’s workflow or introducing new technologies. Her advisors occasionally find it difficult to keep up with her constant stream of ideas, and some workers feel frustrated by the frequent changes. Despite these challenges, Elara remains focused on innovation, though the rapid pace of change begins to cause friction.
    • +
    +
  • +
  • Disorder Intensity: As the need for innovation intensifies, the individual may become obsessed with constantly reinventing or disrupting systems, even when unnecessary or impractical. Their focus on creating new solutions can lead to a disregard for the effectiveness of existing methods, resulting in chaos or failure to follow through on projects. This excessive drive for newness can alienate others, create instability, and cause frustration as the individual overlooks practical concerns in their pursuit of innovation.

    +
      +
    • Physical Symptoms: The individual may experience restlessness or stress from constantly seeking new ideas. They may neglect important tasks or responsibilities while pursuing endless new projects or initiatives, leading to exhaustion or burnout.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about improvement, change, or new solutions, often fixating on the need to innovate at all costs. The individual may struggle to maintain focus on completed projects, quickly moving on to the next idea before finishing the current one.

      +
    • +
    • Emotional Distress: The individual may feel frustration or dissatisfaction with existing processes, becoming overly critical of anything perceived as outdated. They may feel anxious or pressured to always generate new ideas, even when unnecessary, leading to tension with others who prefer stability or practical solutions.

      +
    • +
    • Example (Disorder Intensity): Lady Elara’s obsession with innovation has reached a point where she constantly disrupts the estate’s operations, introducing new techniques or projects without giving her workers time to adapt. Many of her ideas are impractical or too ambitious, leading to confusion and decreased productivity. Her advisors grow frustrated as she abandons unfinished projects in favor of the next new idea, leaving chaos in her wake. Despite the growing discontent among her staff, Elara remains fixated on introducing new innovations, unable to see the damage her constant drive for change is causing.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Vanity + abbrev: vanity + id: FahmSOpTgbWlZn2h + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Vanity refers to an excessive pride in one’s appearance, achievements, or qualities, often coupled with a preoccupation with how others perceive them. A vain individual tends to focus on superficial attributes and may seek constant validation or praise. While self-confidence and self-care are healthy traits, vanity can lead to shallow behavior, a lack of empathy, and strained relationships due to an overemphasis on external appearance and approval.

+
    +
  • Benign Trait: The individual takes pride in their appearance and accomplishments, enjoying the positive attention they receive. They care about how they present themselves and put effort into maintaining a good image, but they still engage in meaningful relationships and are capable of empathy. Their self-esteem is boosted by their appearance, but it does not dominate their life.

    +
      +
    • Example (Benign Trait): Lady Marissa enjoys dressing in the finest clothes and takes pride in her beauty. She enjoys compliments and social recognition but remains kind and considerate to others. Her vanity is seen as confidence, and it enhances her social life without overshadowing her other qualities.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on their appearance or external validation, spending an increasing amount of time and energy maintaining or improving their image. They may begin to neglect other aspects of their life, such as personal relationships or responsibilities, in favor of keeping up their looks or reputation. Although still functioning in daily life, their preoccupation with vanity starts to cause friction with those around them.

    +
      +
    • Example (Impulse Intensity): Lady Marissa starts to spend excessive time in front of the mirror, constantly seeking out new clothes and beauty treatments. She avoids social gatherings unless she feels she looks perfect and becomes irritated when others do not acknowledge her appearance. Her friends begin to notice that her conversations revolve mostly around her looks, causing some tension.
    • +
    +
  • +
  • Disorder Intensity: As vanity intensifies, the individual becomes excessively preoccupied with their appearance, status, or achievements, to the point where it consumes their life. They may obsess over their image, constantly seeking praise or attention, while neglecting relationships, responsibilities, or deeper aspects of their personality. This extreme focus on external validation can lead to superficial relationships, emotional distress, and insecurity when their vanity is not satisfied.

    +
      +
    • Physical Symptoms: The individual may experience anxiety or distress when their appearance is not up to their own high standards. They may spend excessive time and money on beauty treatments, clothing, or fitness routines, often neglecting other needs. Their sense of self-worth may fluctuate based on external validation.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about their appearance or how they are perceived by others. They may constantly compare themselves to others, feel dissatisfied with their looks or achievements, and worry excessively about maintaining their image.

      +
    • +
    • Emotional Distress: The individual may feel deep frustration, insecurity, or sadness when they believe they do not look their best or when others do not praise them. Their self-esteem becomes tied to external validation, leading to emotional volatility, shallow relationships, and a sense of emptiness.

      +
    • +
    • Example (Disorder Intensity): Lady Marissa becomes completely consumed by her vanity, spending hours each day perfecting her appearance. She avoids social situations where she fears she won’t receive enough attention and becomes angry or despondent when others fail to compliment her. Her obsession with beauty drives her to neglect her duties, family, and friends, leaving her isolated and constantly anxious about her looks. Marissa’s once-glowing self-confidence turns into an unhealthy fixation, and she finds herself deeply unhappy despite her outward appearance.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Inquisitive + abbrev: inquisitive + id: yae4KF1QWQNb3Mxd + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Inquisitive refers to an individual's natural curiosity and desire to seek out knowledge, ask questions, and explore new ideas or experiences. An inquisitive person is often eager to learn, driven by a strong interest in understanding the world around them. While curiosity is generally seen as a positive and valuable trait, leading to intellectual growth and problem-solving, an excessive focus on questioning can become intrusive or overwhelming to others, especially if it leads to a disregard for boundaries or an inability to focus on practical matters.

+
    +
  • Benign Trait: The individual shows a healthy curiosity, often asking thoughtful questions and seeking out new information. They enjoy learning and are eager to explore different ideas or perspectives, enriching their understanding of the world. Their inquisitiveness fosters creativity, intellectual engagement, and meaningful discussions, all while maintaining respect for others' boundaries.

    +
      +
    • Example (Benign Trait): Lord Alistair has always been fascinated by the natural world. He spends hours asking scholars and explorers about their discoveries, eager to expand his knowledge of geography and science. His questions are thoughtful and respectful, making him a valuable conversationalist at court.
    • +
    +
  • +
  • Impulse Intensity: The individual's curiosity intensifies, leading them to frequently ask questions or seek out information, even in situations where it may not be appropriate. They may struggle to focus on one topic, constantly jumping from one curiosity to the next, and may overwhelm others with their persistent questioning. Although their inquisitiveness is still largely positive, it can sometimes come across as intrusive or overbearing.

    +
      +
    • Example (Impulse Intensity): Lord Alistair’s curiosity has grown to the point where he interrupts conversations with endless questions, eager to know every detail about even the smallest matters. His advisors begin to feel frustrated, as they find it hard to complete tasks without being bombarded with inquiries. Alistair often switches between topics quickly, making it difficult for his advisors to keep up.
    • +
    +
  • +
  • Disorder Intensity: As inquisitiveness intensifies further, the individual may become obsessive in their pursuit of knowledge, constantly questioning everything around them. They may disregard personal boundaries or social etiquette in their relentless need to learn or understand. This excessive curiosity can lead to strained relationships, as others feel overwhelmed or alienated by the individual's incessant inquiries. The individual may also struggle to focus on practical tasks, becoming so consumed by their quest for answers that they neglect their responsibilities.

    +
      +
    • Physical Symptoms: The individual may experience mental exhaustion or stress due to their constant questioning and inability to settle on a single answer. They may also have difficulty focusing, as their mind is always jumping to the next question or area of interest.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about needing to know more, driven by an insatiable curiosity. The individual may feel anxious or frustrated if they do not have all the answers, leading them to push boundaries or ignore social cues in their pursuit of knowledge.

      +
    • +
    • Emotional Distress: The individual may feel restless, dissatisfied, or frustrated when they cannot immediately satisfy their curiosity. Their constant need for information or answers can strain relationships, as others may feel bombarded or annoyed by the endless stream of questions.

      +
    • +
    • Example (Disorder Intensity): Lord Alistair’s curiosity has grown into an obsession. He constantly interrupts important meetings with irrelevant questions, delving into topics that have no bearing on the issue at hand. His advisors and guests have begun avoiding him, finding his endless inquiries exhausting and disruptive. Alistair often disregards personal boundaries, probing into sensitive topics without considering others' discomfort. His relentless need to know more leaves him mentally exhausted, yet he continues to seek out answers, unable to stop his overwhelming curiosity.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Introverted + abbrev: introverted + id: O5W6NQwSZT7XyJrF + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Introverted refers to an individual's tendency to focus inward and find comfort in solitude or small, intimate social settings. Introverted people often feel more energized by quiet, personal reflection or close interactions, rather than large social gatherings. While introversion is a perfectly healthy personality trait, providing time for deep thinking and personal recharge, excessive introversion can sometimes lead to social withdrawal, isolation, or difficulty forming relationships.

+
    +
  • Benign Trait: The individual enjoys spending time alone or in small groups, using this time for reflection, creativity, or relaxation. While they may not seek out large social events, they still engage with others meaningfully and maintain healthy relationships. Their introverted nature allows them to focus on personal growth and introspective thinking without isolating themselves from the world.

    +
      +
    • Example (Benign Trait): Lady Eleanor prefers quiet afternoons in her garden, where she can read and reflect in peace. She attends social events sparingly, choosing intimate gatherings over grand parties. Her friends appreciate her thoughtful nature and enjoy her company in smaller, more personal settings.
    • +
    +
  • +
  • Impulse Intensity: The individual increasingly withdraws from social settings, preferring solitude more often than before. They may decline invitations to social events or avoid interactions that require prolonged engagement with large groups. Although they still maintain relationships, their growing desire for alone time can sometimes cause frustration for those who wish to spend more time with them.

    +
      +
    • Example (Impulse Intensity): Lady Eleanor starts turning down invitations to even smaller gatherings, preferring to stay in her chambers with her books. Though she still meets with a few close friends, she increasingly avoids social events, leaving some of her acquaintances feeling neglected or concerned about her growing distance.
    • +
    +
  • +
  • Disorder Intensity: As introversion intensifies, the individual may become excessively withdrawn, avoiding most social interactions and isolating themselves from others. They may find it difficult to engage in conversations or feel overwhelmed by even small social gatherings. This extreme introversion can lead to loneliness, social anxiety, or emotional distress, as they struggle to maintain relationships or participate in everyday social activities.

    +
      +
    • Physical Symptoms: The individual may feel drained or fatigued after social interactions, even in small groups, and may experience physical discomfort, such as tension or restlessness, when forced into social situations. They may prefer to remain in quiet, solitary environments for extended periods.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about avoiding social interactions or fears of social engagement. The individual may worry about being overwhelmed or judged in social settings, leading to further withdrawal from social life.

      +
    • +
    • Emotional Distress: The individual may feel anxious, uncomfortable, or distressed in social situations, even among close friends or family. They may experience loneliness or frustration from their inability to connect with others, but their extreme introversion prevents them from reaching out.

      +
    • +
    • Example (Disorder Intensity): Lady Eleanor’s introversion becomes extreme, leading her to avoid nearly all social contact. She rarely leaves her quarters, refusing to attend even the smallest family gatherings. Her friends and family express concern, but Eleanor feels overwhelmed at the thought of interacting with others and chooses to retreat further into isolation. Though she values her peace and quiet, her increasing withdrawal leaves her feeling lonely and disconnected from the world around her.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Intuitive + abbrev: intuitive + id: DvyRAJwzIUt7E09f + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Intuitive refers to an individual's ability to understand or grasp ideas, situations, or people instinctively, without relying on explicit reasoning or conscious thought. Intuitive individuals often have a strong sense of awareness and can make decisions based on a "gut feeling" or deep internal understanding rather than through analysis or detailed information. While intuition can lead to quick, insightful judgments, excessive reliance on it may cause a person to overlook important details or fail to verify their assumptions.

+
    +
  • Benign Trait: The individual often makes insightful decisions or observations based on their instinctual understanding of people, situations, or concepts. Their intuition helps them navigate social interactions, solve problems, or sense changes in their environment without needing a lot of information. They balance this natural understanding with thoughtful reflection when needed, leading to both effective and accurate judgments.

    +
      +
    • Example (Benign Trait): Lady Catrin often has a natural sense of the mood in the room during court meetings, instinctively knowing when to speak up and when to hold back. Her intuitive understanding of people and their motives allows her to navigate complex social dynamics gracefully and with minimal conflict.
    • +
    +
  • +
  • Impulse Intensity: The individual increasingly relies on their intuition to make decisions, sometimes dismissing more concrete data or the advice of others. While their instincts are often correct, they may occasionally overlook important facts or logic in favor of their gut feeling. This can lead to conflict with others who prefer a more evidence-based approach, though the individual still functions effectively overall.

    +
      +
    • Example (Impulse Intensity): Lady Catrin begins to trust her instincts so much that she starts making decisions for the estate without consulting her advisors or considering all the available information. While her intuition is often right, her advisors grow frustrated when she dismisses their concerns or detailed reports in favor of her "gut feeling."
    • +
    +
  • +
  • Disorder Intensity: As reliance on intuition intensifies, the individual may become overly dependent on their instincts, often ignoring facts, logic, or the advice of others. They may reject concrete evidence or rational thinking, believing their intuition to be infallible. This extreme reliance on intuition can lead to poor decision-making, as the individual becomes blind to key information or fails to verify their assumptions, resulting in costly mistakes or strained relationships.

    +
      +
    • Physical Symptoms: The individual may experience stress or anxiety when their intuitive feelings clash with logical reasoning or outside advice. This tension may lead to restlessness or difficulty focusing on practical matters.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about trusting their intuition above all else, even when presented with conflicting information. The individual may feel compelled to act based on their gut feeling, even when it goes against common sense or available facts.

      +
    • +
    • Emotional Distress: The individual may experience frustration or defensiveness when their intuition is questioned or when their decisions, made based on instinct, result in negative outcomes. They may feel isolated as others become frustrated with their refusal to consider facts or advice.

      +
    • +
    • Example (Disorder Intensity): Lady Catrin becomes so convinced of her intuitive abilities that she completely ignores the advice of her advisors, even when managing important estate affairs. When a poor harvest looms, her intuition tells her that the crops will recover, and she refuses to make preparations for potential shortages. When the crops fail, the estate suffers, but Catrin remains convinced that her intuition was correct, blaming external factors rather than recognizing her failure to act on practical information. Her advisors and workers grow increasingly disillusioned, leaving Catrin isolated and defensive about her decisions.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Monstraphobia + abbrev: monstraphobia + id: 8EfYGBIq4ODIGnlF + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

Monstraphobia is an intense, irrational fear of unknown or fantastical creatures, often perceived as monstrous or otherworldly. While most people experience a natural sense of caution or fear when encountering unfamiliar creatures, Monstraphobia is an extreme and overwhelming manifestation of this fear. Individuals with this phobia experience profound anxiety at the thought, sight, or even mention of creatures they deem unnatural, whether they are real but unknown animals, or mythical beasts from legends and folklore.

+
    +
  • Impulse Intensity: The individual avoids environments or situations where they might encounter unfamiliar or monstrous creatures. Their anxiety intensifies in unfamiliar regions, during travel, or when hearing tales of unknown beasts. The fear becomes disruptive to their life, causing them to avoid certain places, people, or conversations. When encountering such creatures, Abberance (ABE) increases by 1 from the source of fear.
      +
    • Example (Impulse Intensity): A merchant who used to travel widely now refuses to enter regions known for strange fauna or rumored mythical creatures. Even the sight of exotic animals in a distant marketplace unnerves him, and he avoids caravans that might carry unknown beasts. His fear causes him to abandon potentially profitable routes, and he becomes overly cautious of every journey, even avoiding maps depicting regions with dangerous creatures.
    • +
    +
  • +
  • Disorder Intensity: The individual experiences severe anxiety or panic even when merely thinking about or hearing mention of unknown creatures. Their life becomes dominated by this fear, leading to withdrawal from travel, exploration, and social activities where such creatures could be discussed. When encountering such creatures, Abberance (ABE) increases by 3 (instead of 1) from the source of fear. The irrational nature of their fear leads others to ridicule or mock them for being terrified of creatures that likely don’t exist, further deepening their isolation and distress.
      +
    • Physical Symptoms: Rapid heartbeat, sweating, trembling, shortness of breath, nausea, or dizziness when confronted with thoughts or visuals of unfamiliar or monstrous creatures.
    • +
    • Intrusive Thoughts: Persistent, distressing thoughts of being attacked or harmed by strange or mythical creatures, often triggered by any mention or reminder of such beings.
    • +
    • Emotional Distress: Intense dread and helplessness in any situation where unknown creatures might be present or even mentioned. Social mockery and ridicule heighten the individual’s sense of isolation, and they become increasingly withdrawn, as they cannot shake the belief that these creatures are lurking nearby.
    • +
    • Example (Disorder Intensity): The merchant has completely abandoned his trade, refusing to leave his home out of fear of encountering strange creatures. He becomes the subject of mockery among his peers, who laugh at his irrational belief in monsters that no one else has seen. The merchant’s once-respected reputation fades as others ridicule his growing paranoia. Despite the ridicule, the merchant remains convinced that the world is filled with terrifying beasts, and his constant state of fear isolates him further. Even within his own home, he feels no escape from the terrifying creatures he believes are waiting just outside.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Duergarphobia + abbrev: duergarphobia + id: 7D1RgFwiRDifJToF + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

Duergarphobia is an intense, irrational fear of dwarves, particularly those depicted in folklore as stout, strong, and skilled in mining, blacksmithing, and underground living. While many cultures view dwarves as industrious and noble beings, individuals with Duergarphobia experience overwhelming anxiety when encountering or thinking about these beings. The fear is often rooted in their physical appearance, underground lifestyle, or perceived mysterious powers, leading to avoidance of any stories, settings, or depictions involving dwarves.

+
    +
  • Impulse Intensity: The individual avoids environments or situations where they might encounter representations or depictions of dwarves, such as underground settings, blacksmiths, or even stories featuring such creatures. They may experience anxiety when faced with these situations but can still function by distancing themselves. When encountering Dwarves, Abberance (ABE) increases by 1 from the source of fear.

    +
      +
    • Example (Impulse Intensity): A traveler with Duergarphobia refuses to enter any cave systems, fearing they might encounter dwarves living beneath the surface. Even hearing stories of dwarves in taverns makes them uneasy, causing them to leave the conversation or avoid adventuring parties that seek to explore mountains or mines.
    • +
    +
  • +
  • Disorder Intensity: The individual experiences severe anxiety or panic when exposed to any representation of dwarves, whether in conversation, literature, or visual depictions. Their fear of dwarves dominates their life, causing them to withdraw from social interactions that might involve folklore or even professions such as blacksmithing. They may become ridiculed for their irrational fear of dwarves, with peers finding the phobia baseless. When encountering such creatures, Abberance (ABE) increases by 3 (instead of 1) from the source of fear.

    +
      +
    • Physical Symptoms: Rapid heartbeat, sweating, trembling, shortness of breath, nausea, or dizziness when encountering images or discussions of dwarves.

      +
    • +
    • Intrusive Thoughts: Persistent, distressing thoughts of being harmed or overwhelmed by dwarves, often triggered by stories or reminders of such beings.

      +
    • +
    • Emotional Distress: Intense feelings of helplessness and dread, particularly in any environment where dwarves could be imagined. The individual often becomes the subject of ridicule due to the irrational nature of the fear, as others mock them for being afraid of mythical creatures.

      +
        +
      • Example (Disorder Intensity): A merchant with Duergarphobia is mocked by peers for refusing to conduct any business near mountain ranges or mining towns, fearing that dwarves might reside there. They suffer from panic attacks at the mere mention of dwarves, causing them to leave meetings or social events abruptly. The fear dominates their life, and the ridicule they face only deepens their isolation and distress.
      • +
      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Kind + abbrev: kind + id: YONNvSmSlBcMBHQl + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Kind refers to an individual's natural inclination to be + compassionate, caring, and considerate towards others. A kind person often goes out + of their way to help, support, and show empathy, even in situations where there is + no direct benefit to themselves. Kindness fosters positive relationships and creates + a sense of trust and community. However, excessive kindness can sometimes lead to + self-sacrifice, allowing others to take advantage of the individual, or the neglect + of personal needs.

+
    +
  • +

    Benign Trait: The individual regularly shows empathy and + compassion, offering help and support to those in need. They are considerate of + others’ feelings and go out of their way to spread positivity. Their kindness + strengthens relationships and fosters a supportive, nurturing environment + without putting their own well-being at risk.

    +
      +
    • Example (Benign Trait): Lady Eliza is known throughout the + village for her kindness. She frequently visits the sick, helps the poor, and + offers wise, compassionate advice to her family and friends. Her kindness is + balanced with wisdom, and while she’s always there to help, she knows when to + set boundaries to protect her time and energy.
    • +
    +
  • +
  • +

    Impulse Intensity: The individual becomes more focused on + helping others, sometimes neglecting their own needs or overcommitting + themselves to acts of kindness. While their intentions remain positive, they may + feel increasingly burdened by the expectations of others. Although they are + still capable of managing their responsibilities, their excessive kindness may + begin to cause mild stress or exhaustion.

    +
      +
    • Example (Impulse Intensity): Lady Eliza spends nearly all + her time helping others, from caring for villagers to advising her fellow + nobles. While she finds joy in being kind, she often feels overwhelmed and + fatigued, as she struggles to balance her acts of kindness with her own needs. + Her family worries she’s stretching herself too thin.
    • +
    +
  • +
  • +

    Disorder Intensity: As kindness intensifies, the individual + may completely neglect their own well-being in favor of helping others, allowing + themselves to be taken advantage of or sacrificing their personal needs and + boundaries. They may feel compelled to always say yes, leading to burnout, + resentment, or emotional exhaustion. This extreme selflessness can result in + damaged relationships, as the individual’s kindness may become unsustainable and + unreciprocated, causing frustration and strain.

    +
      +
    • +

      Physical Symptoms: The individual may experience + exhaustion, stress, or burnout from constantly putting others’ needs ahead + of their own. Physical signs of fatigue or emotional strain may emerge, as + the pressure to be kind becomes overwhelming.

      +
    • +
    • +

      Intrusive Thoughts: Persistent thoughts about helping + others, coupled with guilt if they are unable to assist. The individual may + feel obligated to constantly put others first, even to their own detriment. +

      +
    • +
    • +

      Emotional Distress: The individual may feel overwhelmed, + resentful, or unappreciated as their acts of kindness go unnoticed or + unreciprocated. They may experience emotional exhaustion from always being + there for others, without allowing themselves time to recharge or set + boundaries.

      +
    • +
    • +

      Example (Disorder Intensity): Lady Eliza’s kindness has + become so extreme that she never says no to anyone’s requests for help. She + spends all her days tending to others' needs, often going without sleep + or neglecting her own health. Villagers and nobles alike come to her with + their problems, knowing she will always help, but her kindness is now being + taken for granted. Eliza feels exhausted and unappreciated, but she cannot + stop helping, even though it’s beginning to take a serious toll on her + physical and emotional well-being.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Koumpounophobia + abbrev: koumpounophobia + id: Kj5Morx2Ejtno57C + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Koumpounophobia is an intense, irrational fear of buttons. + People with koumpounophobia may experience a range of symptoms when they think + about, see, or are near buttons. +

+
    +
  • + Impulse Intensity: Avoiding clothing with buttons, buttons + themselves, or even environments where buttons are present. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of buttons. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about buttons being unhygienic or uncomfortable. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near buttons or button-wearing individuals. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Lepidopterophobia + abbrev: lepidopterophobia + id: CMHjqCyh5EL34RTJ + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Lepidopterophobia is an intense, irrational fear of + butterflies or moths. People with lepidopterophobia may experience a range of + symptoms when they think about, see, or are near these insects. +

+
    +
  • + Impulse Intensity: Avoiding gardens, forests, or any areas + where butterflies or moths are likely to be. Abberance (ABE) increases by 1 + from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of butterflies + or moths. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being harmed or overwhelmed by butterflies or moths. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in environments where these insects are present. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Ligyrophobia + abbrev: ligyrophobia + id: eZT5iYbu6FruQFky + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Ligyrophobia is an intense, irrational fear of loud noises. + People with ligyrophobia may experience a range of symptoms when they think + about, hear, or anticipate loud sounds. +

+
    +
  • + Impulse Intensity: Avoiding places where loud noises are + common, such as concerts, fireworks displays, or construction sites. + Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at loud noises or the anticipation of + them. Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about loud noises causing harm or discomfort. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when exposed to or anticipating loud sounds. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Loyal + abbrev: loyal + id: rPHGFIgIWHeTA4bz + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Loyal refers to an individual's steadfast commitment and + dedication to a person, cause, or group. A loyal person is reliable, supportive, and + often willing to make sacrifices to uphold their bonds and obligations. They stand + by those they care about through both good and difficult times. While loyalty is a + highly valued trait that strengthens relationships and fosters trust, excessive + loyalty can sometimes lead to self-sacrifice, the enabling of harmful behavior, or + an unwillingness to recognize when loyalty is no longer deserved.

+
    +
  • +

    Benign Trait: The individual is dependable and consistently + supportive of their friends, family, or allies. Their loyalty builds strong + relationships, as they stand by those they care for, offering help and + protection when needed. This loyalty is balanced with wisdom, allowing them to + remain faithful without becoming overly attached to situations that may be + damaging.

    +
      +
    • Example (Benign Trait): Sir Gregory has been a loyal knight + to his lord for many years, serving with honor and dedication. He is always + there when his lord needs him, whether in battle or during times of peace. His + loyalty is not blind, as he is willing to offer honest advice, even when it + may be difficult to hear, to protect the lord and the realm.
    • +
    +
  • +
  • +

    Impulse Intensity: The individual becomes more intensely + focused on their loyalty, going out of their way to support or defend their + friends or cause. They may overlook certain faults or make sacrifices that go + beyond what is necessary. While they still maintain a degree of balance, this + heightened loyalty can lead to stress or a sense of duty that occasionally + causes strain in their own life.

    +
      +
    • Example (Impulse Intensity): Sir Gregory begins to + prioritize his loyalty to his lord over his own well-being, refusing rest or + time with his family to ensure his lord’s protection and success. His peers + admire his dedication, but some worry that Gregory is pushing himself too hard + and may eventually burn out from his relentless commitment.
    • +
    +
  • +
  • +

    Disorder Intensity: As loyalty intensifies, the individual may + become overly devoted, to the point where they are unable to recognize when + their loyalty is misplaced or harmful. They may continue to support a person or + cause even when it negatively impacts their well-being or the well-being of + others. This extreme loyalty can lead to self-sacrifice, blind allegiance, or + enabling destructive behavior, ultimately harming both the individual and those + around them.

    +
      +
    • +

      Physical Symptoms: The individual may experience physical + exhaustion or stress from constantly putting the needs of others before + their own. They may neglect their health or responsibilities as they + overcommit to proving their loyalty.

      +
    • +
    • +

      Intrusive Thoughts: Persistent thoughts of duty and + obligation, coupled with guilt or anxiety at the thought of failing or + betraying someone they are loyal to. The individual may feel compelled to + remain loyal even when it is no longer reasonable or healthy to do so.

      +
    • +
    • +

      Emotional Distress: The individual may feel trapped, + conflicted, or resentful as their extreme loyalty begins to take a toll on + their well-being. They may be unable to separate their loyalty from their + own needs, leading to feelings of helplessness or frustration as they + continue to support someone or something to their own detriment.

      +
    • +
    • +

      Example (Disorder Intensity): Sir Gregory's loyalty + has become so intense that he refuses to see any faults in his lord, even as + the lord makes increasingly poor and harmful decisions. Gregory neglects his + family and personal health, working tirelessly to serve his lord’s every + command, even when he knows it may lead to ruin. His friends express + concern, but Gregory feels bound by his duty, unwilling to question his + loyalty or consider abandoning his post, even as it causes his life to + unravel.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Megalophobia + abbrev: megalophobia + id: 7H1GkyD0llrkEAPz + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Megalophobia is an intense, irrational fear of large objects. + People with megalophobia may experience a range of symptoms when they think + about, see, or are near large objects. +

+
    +
  • + Impulse Intensity: Avoiding areas with large statues, + buildings, or vehicles. Abberance (ABE) increases by 1 from the source of + fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of large + objects. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about large objects causing harm or being overwhelming. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in the presence of large objects. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Melanophobia + abbrev: melanophobia + id: UGCKoMBInNL1A0jj + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Melanophobia is an intense, irrational fear of the color + black or things associated with black. People with melanophobia may experience + a range of symptoms when they think about, see, or are near black objects. +

+
    +
  • + Impulse Intensity: Avoiding objects, clothing, or + environments with the color black. Abberance (ABE) increases by 1 from the + source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of black. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about the color black and its associations. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness related to black-colored items or environments. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Meticulous + abbrev: meticulous + id: vNjUZJ9t3L3Xk5U3 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Meticulous refers to an individual's attention to detail, + precision, and thoroughness in their work or tasks. A meticulous person is highly + organized, careful, and ensures that everything is done correctly, often + double-checking their work to avoid mistakes. While this trait is generally admired + for producing high-quality results, excessive meticulousness can lead to + perfectionism, procrastination, or difficulty completing tasks due to an + overemphasis on details.

+
    +
  • +

    Benign Trait: The individual demonstrates a strong focus on + detail and accuracy, ensuring that their work is completed to a high standard. + They are methodical in their approach, taking pride in their carefulness without + allowing it to delay progress or disrupt their efficiency. Their meticulous + nature ensures that they consistently produce reliable, high-quality outcomes. +

    +
      +
    • Example (Benign Trait): Lady Beatrice is known for her + meticulous bookkeeping, ensuring that every coin spent and earned on her + estate is properly accounted for. Her attention to detail prevents errors and + keeps her estate running smoothly. While she takes time to ensure accuracy, + Beatrice is also efficient and manages her tasks within reasonable time + frames.
    • +
    +
  • +
  • +

    Impulse Intensity: The individual becomes more focused on + perfection and detail, occasionally spending excessive time reviewing their work + or correcting minor errors. Although their results remain high-quality, this + heightened attention to detail can cause delays, and they may become frustrated + when things are not perfect. Others may admire their work but find the + individual’s process slower or more rigid than necessary.

    +
      +
    • Example (Impulse Intensity): Lady Beatrice now spends hours + revising her estate’s records, double-checking every entry multiple times. She + often becomes frustrated when something seems out of place, even if it’s a + minor discrepancy. Her meticulousness ensures accuracy, but her advisors worry + that she is dedicating too much time to small details, slowing down important + decisions.
    • +
    +
  • +
  • +

    Disorder Intensity: As meticulousness intensifies, the + individual may become excessively focused on minute details to the point where + they struggle to complete tasks. They may constantly revise their work, fearing + that any imperfection could lead to disaster. This obsession with perfection can + lead to procrastination, inefficiency, and anxiety, as the individual becomes + overwhelmed by the need for everything to be flawless, preventing them from + moving forward.

    +
      +
    • +

      Physical Symptoms: The individual may experience stress, + fatigue, or tension from constantly overanalyzing details and feeling + pressure to achieve perfection. The prolonged focus on small tasks may lead + to physical discomfort, such as headaches or exhaustion.

      +
    • +
    • +

      Intrusive Thoughts: Persistent thoughts about achieving + absolute perfection in their work. The individual may worry excessively + about small flaws or errors, fearing that any mistake could ruin the entire + task. These thoughts can lead to anxiety and difficulty letting go of tasks. +

      +
    • +
    • +

      Emotional Distress: The individual may feel overwhelmed, + frustrated, or anxious due to their inability to finish tasks or move past + minor imperfections. They may become emotionally distressed when others + don’t share their level of attention to detail, leading to tension in + relationships or collaborative work.

      +
    • +
    • +

      Example (Disorder Intensity): Lady Beatrice’s + meticulousness has become an obsession. She spends days going over the + estate’s records, rechecking everything repeatedly, convinced that even the + smallest mistake could ruin the estate. Her staff grows increasingly + frustrated, as Beatrice’s need for perfection delays important decisions and + causes anxiety throughout the household. Beatrice feels stressed and + overwhelmed, but she cannot stop herself from obsessing over every detail, + afraid that something vital will be overlooked if she doesn’t maintain + perfect control.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Monophobia + abbrev: monophobia + id: r6eOJXUWO8mnkQZ9 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Monophobia is an intense, irrational fear of being alone. + People with monophobia may experience a range of symptoms when they think + about, see, or are in situations where they are alone. +

+
    +
  • + Impulse Intensity: Constantly seeking companionship and + avoiding activities or situations where solitude is required. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of being by oneself. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about abandonment, isolation, or lack of security. +
    • +
    • + Emotional Distress: Deep feelings of dread, loneliness, + and helplessness when alone or contemplating solitude. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Musophobia + abbrev: musophobia + id: 13DJpPf6QmzpNGsH + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Musophobia is an intense, irrational fear of mice or rats. + People with musophobia may experience a range of symptoms when they think + about, see, or are near these rodents. +

+
    +
  • + Impulse Intensity: Avoiding environments where mice or rats + might be, such as basements, attics, or certain outdoor areas. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of mice or + rats. Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being bitten, contaminated, or harmed by mice or rats. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when encountering or thinking about these rodents. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Necrophobia + abbrev: necrophobia + id: PpOsvVyBV0lAIc7E + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Necrophobia is an intense, irrational fear of death or dead + things. People with necrophobia may experience a range of symptoms when they + think about, see, or are near anything related to death or corpses. +

+
    +
  • + Impulse Intensity: Avoiding funerals, cemeteries, hospitals, + or any place associated with death. Abberance (ABE) increases by 1 from the + source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of death or + encountering dead bodies. Abberance (ABE) increases by 3 (instead of 1) from + the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about dying, dead bodies, or life after death. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness related to the concept of death and dying. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Nervous + abbrev: nervous + id: 6at32D2gYGRBmozj + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Chronic Nervousness refers to a persistent state of anxiety and + unease that affects an individual's ability to engage with tasks, people, or + situations without experiencing significant worry or self-doubt. Those with chronic + nervousness are frequently on edge, overthinking potential outcomes, and + anticipating negative consequences even in relatively low-risk scenarios. While a + degree of nervousness can help prepare for challenges, chronic nervousness can lead + to indecision, avoidance, and a diminished ability to cope with stress.

+
    +
  • +

    Benign Trait: The individual feels nervous regularly but is + able to manage it, using their heightened sense of caution to carefully plan and + prepare for potential challenges. Their nervousness makes them vigilant, but + they can still function and complete tasks effectively. Others may notice their + anxious tendencies, but the individual remains capable of handling their + responsibilities.

    +
      +
    • Example (Benign Trait): Roland, an apprentice blacksmith, + feels nervous before showing his work to his master, constantly worrying if it + will meet the standard. However, his nervousness drives him to be thorough, + checking his work multiple times. Although he fidgets and feels a knot in his + stomach, he eventually presents his work and receives praise for his + diligence.
    • +
    +
  • +
  • +

    Impulse Intensity: The individual’s nervousness becomes more + pervasive, with worry starting to dominate their thoughts. They feel tense and + restless, anticipating problems or negative outcomes even when the situation + doesn't warrant such concern. Their anxious energy can cause delays in + tasks, as they spend extra time preparing for unlikely issues. While still + capable of completing tasks, they may appear preoccupied with nervous thoughts, + and others may notice that they seem overly worried or cautious.

    +
      +
    • Example (Impulse Intensity): Roland’s nervousness now + manifests as constant worry about what might go wrong. Before every project at + the forge, he feels a sense of dread, imagining accidents or errors that could + happen. His nerves slow him down as he takes longer than necessary to prepare + and check everything, even for simple tasks. Though he still manages to + complete his work, Roland’s constant state of worry starts to wear on him and + those around him.
    • +
    +
  • +
  • +

    Disorder Intensity (Chronic Nervousness): As chronic + nervousness intensifies, the individual becomes overwhelmed by fears of being + judged, making a fool of themselves, or causing a disaster, even when such + outcomes are improbable. They become preoccupied with how others perceive them, + worrying excessively about embarrassing themselves or disappointing those around + them. These fears manifest physically, with trembling, sweating, or a racing + heart, and lead to avoidance of tasks or social interactions. This chronic + condition results in emotional exhaustion, isolation, and diminished ability to + engage in daily life due to a constant fear of doing something wrong or + embarrassing.

    +
      +
    • +

      Physical Symptoms: The individual may suffer from + trembling hands, sweating, heart palpitations, or nausea as their anxiety + about how others perceive them takes a toll. They may experience fatigue + from constantly worrying about making mistakes or being judged.

      +
    • +
    • +

      Intrusive Thoughts: Persistent fears of being ridiculed, + making a public mistake, or causing a disaster. The individual may + constantly replay scenarios where they imagine embarrassing or catastrophic + outcomes, even in low-risk situations.

      +
    • +
    • +

      Emotional Distress: The individual may feel overwhelmed by + their constant fear of judgment, leading to withdrawal from social + situations or tasks that require public interaction. Their chronic worry + about being judged or failing leaves them emotionally drained and fearful of + engaging in normal activities.

      +
    • +
    • +

      Example (Disorder Intensity): Roland’s chronic nervousness + now centers around a fear of making a fool of himself in front of others. He + is terrified that he will botch a simple task at the forge and become a + laughingstock among his peers. He imagines disastrous scenarios, such as + accidentally starting a fire or breaking an important tool, and becomes + convinced that he will ruin his reputation. Even when reassured by his + master, Roland feels paralyzed by the idea that others are watching and + judging him. His hands shake uncontrollably, and he avoids working in front + of others, isolating himself and feeling completely overwhelmed by the fear + of making mistakes.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Nosocomephobia + abbrev: nosocomephobia + id: 8SCxFkEwl1pz7hmr + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Nosocomephobia is an intense, irrational fear of sick people + or being around those who are ill. People with nosocomephobia may experience a + range of symptoms when they think about, see, or are near individuals who are + sick or environments associated with illness, such as hospitals. +

+
    +
  • + Impulse Intensity: Avoiding hospitals or any places where + sick people might be present. This can also extend to avoiding social + situations or public places during seasons associated with sickness or + outbreaks. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of sick + individuals or being in places where illness is present. Abberance (ABE) + increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about catching diseases, becoming seriously ill, or the consequences of + being exposed to illness. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near sick people or when thinking about the potential + for exposure to illness, leading to significant social withdrawal and + health-related anxieties. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Nyctophobia + abbrev: nyctophobia + id: nsWS6twIY8gH7L3Z + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Nyctophobia is an intense, irrational fear of the dark. + People with nyctophobia may experience a range of symptoms when they think + about, see, or are in dark environments. +

+
    +
  • + Impulse Intensity: Avoiding dark places, sleeping with lights + on, or refusing to go out at night. Abberance (ABE) increases by 1 from the + source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or presence of + darkness. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about dangers lurking in the dark, often without logical basis. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when in darkness or contemplating it. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Ombrophobia + abbrev: ombrophobia + id: 7wHX5OmdEQLoLlqQ + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Ombrophobia is an intense, irrational fear of rain. People + with ombrophobia may experience a range of symptoms when they think about, + see, or are exposed to rain. +

+
    +
  • + Impulse Intensity: Avoiding going outside during rain, + checking weather forecasts obsessively, or using excessive protective gear. + Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or sight of rain. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about flooding, slipping, or being caught in a storm. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when rain is imminent or ongoing. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Ophidiophobia + abbrev: ophidiophobia + id: hnXbwGkcvYFda0D9 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Ophidiophobia is an intense, irrational fear of snakes. + People with ophidiophobia may experience a range of symptoms when they think + about, see, or are near snakes. +

+
    +
  • + Impulse Intensity: Avoiding areas where snakes might be + found, such as forests, deserts, or certain exhibits in zoos. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of snakes. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being bitten or killed by snakes. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near areas where snakes might be present. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Patient + abbrev: patient + id: areuJpaZ6i7JyoEO + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Patient refers to an individual's ability to remain calm and composed in the face of delays, challenges, or difficulties. A patient person does not rush or become easily frustrated, instead allowing time for things to unfold naturally. They are willing to wait for the right moment and understand that some tasks or goals take time to achieve. Patience fosters resilience and careful planning, though excessive patience can sometimes cause harm when individuals wait for ideal conditions, even if it negatively affects their interests or well-being.

+
    +
  • Benign Trait: The individual approaches tasks and situations with calmness, taking the necessary time to complete things thoroughly without feeling rushed. They remain composed, even when progress is slow or setbacks occur, understanding that persistence leads to better outcomes. Their patience allows them to produce high-quality work and navigate challenges with ease.

    +
      +
    • Example (Benign Trait): Edmund, a woodworker, is known for his patience. He spends hours carefully sanding each piece of furniture, ensuring that every detail is perfect. When carving intricate designs, he does not rush the process, understanding that true craftsmanship takes time. His clients appreciate the quality of his work, knowing that Edmund’s patience ensures a lasting, beautifully made product.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on waiting for the perfect moment or condition, sometimes to the point of missing opportunities or letting time slip by. They may wait for the most favorable circumstances before taking action, even if doing so slows progress. While their careful approach still produces excellent results, their patience may lead them to accept delays or challenges that harm their interests. Others may notice their reluctance to act quickly, even when it would be beneficial.

    +
      +
    • Example (Impulse Intensity): Edmund’s patience begins to hold him back slightly as he waits for the perfect piece of wood or the ideal moment to start his projects. He passes up more readily available materials, convinced that the right one will come along soon. While this leads to flawless craftsmanship, it also means Edmund sometimes waits longer than necessary, and opportunities to take on urgent commissions are lost. He accepts these delays, believing they are necessary for the best results, even though it affects his business.
    • +
    +
  • +
  • Disorder Intensity (Excessive Patience/Self-Sacrifice): As patience intensifies, the individual may wait too long to act, enduring setbacks or unfavorable conditions without protest. They may avoid pushing forward in difficult situations, choosing to wait indefinitely rather than risk acting prematurely. This extreme patience can harm their interests, as they endure unnecessary hardships or delays, missing opportunities or failing to address issues that require immediate action. Their willingness to wait, even when it causes harm to themselves, frustrates those around them who wish for more decisive action.

    +
      +
    • Physical Symptoms: The individual may experience stress or fatigue from enduring difficult situations for too long, feeling drained by waiting for conditions to improve. This passive endurance can lead to tension as they refrain from taking action.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to wait for the perfect moment or solution, even when action is required. The individual may believe that by waiting, they will avoid mistakes or improve outcomes, even if evidence suggests otherwise.

      +
    • +
    • Emotional Distress: The individual may feel frustration or regret over missed opportunities or the strain caused by waiting too long, yet they remain reluctant to act. They may struggle with the knowledge that their patience has harmed their interests but still feel unable to push forward.

      +
    • +
    • Example (Disorder Intensity): Edmund’s excessive patience has led him to endure unnecessary setbacks in his work. When his tools become damaged, instead of purchasing replacements right away, he decides to wait for a better deal, even though his current tools slow him down and make his work harder. Clients begin to grow impatient, but Edmund remains calm, willing to accept the loss of business as he continues waiting for the "right" solution. His reluctance to act quickly, even when it harms his livelihood, causes frustration among those who depend on him, yet he insists that patience will eventually lead to the best outcome, regardless of the cost to himself.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Pediophobia + abbrev: pediophobia + id: H8XV0tS2HrBIgLj4 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Pediophobia is an intense, irrational fear of dolls. People + with pediophobia may experience a range of symptoms when they think about, + see, or are near dolls. +

+
    +
  • + Impulse Intensity: Avoiding toy stores, homes with doll + collections, or any place where dolls might be present. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of dolls. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about dolls being animated, haunted, or threatening. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near dolls or thinking about them. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Pessimistic + abbrev: pessimistic + id: 5K8NYrp3gHk0a2c6 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Pessimism refers to an individual's tendency to expect negative outcomes or focus on the worst possible scenarios. A pessimistic person often anticipates difficulties or failure and may view challenges with a sense of defeat before even attempting to overcome them. While pessimism can sometimes help avoid unnecessary risks by preparing for potential problems, it often leads to missed opportunities, discouragement, and a tendency to overlook positive possibilities.

+
    +
  • Benign Trait: The individual has a tendency to see things in a negative light, always expecting the worst possible outcome. However, this mindset helps them prepare for setbacks and difficulties, ensuring they are never caught off guard. While they may often expect failure or problems, they use this outlook to stay vigilant and take precautions. Though others may view them as overly cautious or negative, their approach helps them avoid surprises and ensures they are prepared for adversity.

    +
      +
    • Example (Benign Trait): Mathilde, a farmer, always assumes the worst when it comes to her crops. She constantly worries about droughts, pests, and storms, and as a result, she takes extra precautions like building strong storage facilities and planting hardy crops that can withstand difficult conditions. While her neighbors sometimes tease her for being so negative, Mathilde’s pessimism keeps her well-prepared when tough times do come, and her farm is rarely caught off guard by sudden challenges.
    • +
    +
  • +
  • Impulse Intensity: The individual’s pessimism becomes more pronounced, causing them to focus primarily on negative outcomes. They may begin to assume that most efforts will fail or that problems are inevitable, which can dampen their motivation. Their cautious outlook may make them hesitant to take risks, and they might discourage others from pursuing ambitious plans. While their mindset helps them avoid disappointment, it often leads to a lack of enthusiasm or hope for positive change.

    +
      +
    • Example (Impulse Intensity): Mathilde’s pessimism grows stronger, and she begins to expect failure in every venture. When her neighbors plan to expand their farm, she warns them that the extra work won’t pay off, convinced that poor weather will ruin the crops. Though her caution helps her avoid big losses, her constant focus on what could go wrong starts to sap the energy of those around her. Others begin to notice that Mathilde rarely sees any hope in new endeavors, and her pessimistic outlook makes it hard for her to engage with opportunities.
    • +
    +
  • +
  • Disorder Intensity (Chronic Pessimism): As pessimism intensifies, the individual becomes consumed by negative expectations, which start to create a self-fulfilling prophecy. They begin to act in ways that ensure failure, as their belief in inevitable disaster causes them to give up before trying. Their chronic pessimism leads to passivity, missed opportunities, and mistakes that could have been avoided. This belief in failure not only harms their own motivation but also spreads to those around them, creating an environment of defeat. The individual becomes emotionally withdrawn, seeing the world as a place where nothing will ever improve, and their actions—or lack of action—end up causing the very failures they feared.

    +
      +
    • Physical Symptoms: The individual may experience fatigue or lethargy, as their constant anticipation of failure saps their energy and motivation. They may feel drained from always expecting the worst.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of inevitable failure, loss, or disaster. The individual may dwell on worst-case scenarios and feel powerless to change their circumstances, convinced that bad outcomes are unavoidable.

      +
    • +
    • Emotional Distress: The individual may feel a deep sense of hopelessness or resignation, struggling to find joy or purpose in their efforts. Their pessimism may lead to emotional detachment, as they begin to believe that nothing they do will lead to a positive result.

      +
    • +
    • Example (Disorder Intensity): Mathilde’s pessimism has now become chronic, turning into a self-fulfilling prophecy. Convinced that no harvest will succeed, she neglects her fields, barely planting or caring for her crops. When her plants wither and die, Mathilde views this as confirmation that she was right all along, not realizing that her own inaction caused the failure. She avoids any new ventures, certain they will meet the same fate. Her belief that everything will fail causes her to give up before she even tries, and her once-thriving farm falls into disrepair. Despite her neighbors offering help, Mathilde withdraws further, trapped in her own belief that nothing can change for the better.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Phagophobia + abbrev: phagophobia + id: VG2SYHcdMSNVdK3Z + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Phagophobia is an intense, irrational fear of swallowing or + choking. People with phagophobia may experience a range of symptoms when they + think about, see, or are in situations where they need to swallow. +

+
    +
  • + Impulse Intensity: Avoiding certain foods or even eating and + drinking altogether. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or act of swallowing. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about choking, aspirating, or being unable to swallow. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when eating or drinking. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Photophobia + abbrev: photophobia + id: Flr72O8VzJf9zmxg + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Photophobia is a condition characterized by an intense, + irrational sensitivity and fear of light. People with photophobia may + experience a range of symptoms when they think about, see, or are exposed to + bright light. +

+
    +
  • + Impulse Intensity: Wearing sunglasses indoors, keeping lights + dim, or avoiding outdoor activities during daylight. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming discomfort or panic at the sight or presence of + bright light. Abberance (ABE) increases by 3 (instead of 1) from the source + of fear. +
      +
    • + Physical Symptoms: Squinting, headaches, nausea, + dizziness, or even pain in the eyes. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about light causing harm or extreme discomfort. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when exposed to bright light or thinking about exposure. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Playful + abbrev: playful + id: vng7fgrcKD6BfOZW + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Playful refers to an individual's lighthearted, fun-loving nature, often marked by a sense of humor, spontaneity, and a desire to bring joy to others. A playful person approaches life with a sense of fun, not taking things too seriously and using humor to ease tensions or brighten the mood. While playfulness can create a positive and lively atmosphere, excessive playfulness may be seen as a lack of seriousness, especially in situations that require focus or discipline.

+
    +
  • Benign Trait: The individual brings joy and levity to social situations, using humor and playful behavior to keep things light and enjoyable. Their playful nature helps ease tension and fosters a positive, relaxed environment. They know when to shift gears and take things seriously when needed, balancing their lightheartedness with an understanding of context.

    +
      +
    • Example (Benign Trait): Jago, the court jester, is known for his quick wit and playful antics. He delights the royal court with his jokes, acrobatics, and funny impressions of the nobility. Jago’s playful nature lifts the spirits of even the most serious courtiers, making tense situations more bearable. While he’s always ready with a joke, he knows when to ease back and show respect when the situation calls for it.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on keeping things fun and lighthearted, sometimes struggling to know when to be serious. Their constant playfulness, while still endearing, may begin to grate on others in situations where more focus or gravity is needed. They may use humor to avoid dealing with difficult emotions or topics, which can make it harder for others to connect with them on a deeper level.

    +
      +
    • Example (Impulse Intensity): Jago begins to push his playful nature further, making jokes even during solemn court meetings or serious discussions. While the court still finds him amusing, some of the nobility start to feel that Jago doesn’t know when to stop, especially when his jokes interrupt important matters. Jago uses humor to deflect from serious conversations, sometimes avoiding more uncomfortable topics by turning them into a joke, which makes others wish he would take things more seriously at times.
    • +
    +
  • +
  • Disorder Intensity (Excessive Playfulness): As playfulness intensifies, the individual may become overly focused on being humorous or entertaining, to the point where they are unable to take anything seriously. Their constant joking and lighthearted behavior can lead to misunderstandings or frustration, as they are perceived as irresponsible or out of touch with the seriousness of situations. Their excessive playfulness may cause them to ignore important issues or avoid emotional depth, creating strain in relationships as others begin to view them as unreliable or unwilling to engage meaningfully.

    +
      +
    • Physical Symptoms: The individual may feel restless or anxious when faced with serious situations, instinctively turning to humor or playfulness to avoid dealing with emotional discomfort. Their constant need to entertain may lead to stress or fatigue, especially if they feel pressure to always keep things light.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to keep things fun or humorous, even when inappropriate. The individual may feel anxious about not being liked if they stop being playful, leading them to constantly seek approval through humor.

      +
    • +
    • Emotional Distress: The individual may struggle with deeper emotional connections, using playfulness as a shield to avoid vulnerability or serious conversations. They may feel isolated or misunderstood, as their constant joking prevents others from engaging with them on a more meaningful level.

      +
    • +
    • Example (Disorder Intensity): Jago’s playful nature becomes excessive. He cracks jokes during royal ceremonies, even in moments of mourning or solemnity, causing discomfort and anger among the courtiers. His inability to recognize the seriousness of situations begins to erode his relationship with the court, who now see him as irresponsible and out of touch. Even when confronted with personal issues, Jago avoids the conversation by turning it into a joke, leaving him emotionally disconnected from those around him. His once-charming playfulness now creates tension, as the court grows weary of his inability to ever be serious.

      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Practical + abbrev: practical + id: S9IdZB55skpgnmyr + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Practical refers to an individual's focus on realistic, efficient, and functional approaches to problem-solving or daily tasks. A practical person prioritizes what works best in a given situation, often favoring simplicity and utility over abstract thinking or emotional considerations. They are grounded, action-oriented, and focused on tangible results. While practicality can lead to effective solutions, it may sometimes come across as too rigid or dismissive of creative or emotional aspects.

+
    +
  • Benign Trait: The individual takes a grounded, no-nonsense approach to tasks, focusing on the most effective and straightforward solutions. They are efficient and reliable, using their practical mindset to solve problems with minimal fuss or complexity. Their approach often makes them dependable in situations where clear action is needed, and they are valued for their ability to get things done efficiently.

    +
      +
    • Example (Benign Trait): Rowan, a carpenter in the village, is known for his practical approach to building. He focuses on using durable materials and straightforward designs that are easy to construct and maintain. When a house in the village needs repair, Rowan quickly assesses what needs to be done and implements the simplest and most effective solution, ensuring the job is done well without overcomplicating the process.
    • +
    +
  • +
  • Impulse Intensity: The individual becomes more focused on practicality, occasionally overlooking more creative or nuanced solutions in favor of what's easiest or most efficient. While their practical mindset continues to produce results, it may lead them to dismiss emotional or aesthetic considerations that others might find important. Their strong preference for efficiency can make them seem inflexible or overly pragmatic, causing tension with those who value more creative or emotional approaches.

    +
      +
    • Example (Impulse Intensity): Rowan's practicality becomes more pronounced as he starts to disregard anything he considers unnecessary. When a villager asks for decorative touches on a piece of furniture, Rowan refuses, insisting that only the functional aspects matter. While his work remains sturdy and dependable, some villagers feel that Rowan’s focus on efficiency comes at the expense of artistry, and they wish he would put more care into making things aesthetically pleasing as well.
    • +
    +
  • +
  • Disorder Intensity (Rigid Practicality): As practicality intensifies, the individual may become rigid in their approach, focusing solely on what is functional and dismissing any considerations beyond pure efficiency. They may refuse to entertain creative ideas or emotional factors, viewing them as distractions from the "real" task at hand. Their excessive focus on practicality can cause them to come across as cold, unimaginative, or unfeeling, as they prioritize results over relationships or creativity. This rigid practicality can lead to conflicts, especially when others feel their ideas or feelings are being ignored or undervalued.

    +
      +
    • Physical Symptoms: The individual may feel tension or stress from their constant focus on efficiency, especially if they encounter tasks that require creativity or emotional sensitivity, which they may find difficult to navigate.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to prioritize function and efficiency, dismissing anything that doesn’t serve an immediate, practical purpose. They may view creative or emotional aspects as wasteful or irrelevant.

      +
    • +
    • Emotional Distress: The individual may struggle to connect with others on an emotional level, as their focus on practicality leads them to overlook or undervalue feelings and relationships. This can lead to feelings of isolation or frustration, as others may view them as too rigid or unfeeling.

      +
    • +
    • Example (Disorder Intensity): Rowan’s practicality has now turned into rigid efficiency. He refuses to take on any projects that involve creative designs, insisting that decoration is a waste of time and materials. When a villager asks for a special piece of furniture for a wedding, Rowan dismisses the request, saying that a simple table will do the job just as well. His cold, no-nonsense attitude starts to alienate his clients, who feel that he cares only about functionality and nothing about personal significance or beauty. Rowan’s rigid practicality has made him an excellent craftsman, but his refusal to consider anything beyond utility begins to hurt his relationships in the village.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Precise + abbrev: precise + id: ws20vSp2G3Zd9H77 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Precise refers to an individual's ability to work with great accuracy and attention to detail, ensuring that every aspect of their task is exact and carefully measured. A precise person takes care to avoid mistakes, valuing thoroughness and correctness in their work. This trait is essential in fields where exact measurements and careful planning are crucial to success. While precision ensures high-quality outcomes, excessive focus on it can sometimes lead to perfectionism or delays.

+
    +
  • Benign Trait: The individual consistently works with high accuracy, paying close attention to every detail and ensuring that their work meets exacting standards. They take pride in getting things right the first time, and their precision helps prevent errors and ensures quality. Others appreciate their careful approach, knowing they can trust the individual to produce reliable, well-crafted results.

    +
      +
    • Example (Benign Trait): Geoffrey, a master mason, is known for his precision in laying stones for the cathedral's towering walls. Every stone he places is carefully measured and aligned, ensuring that the structure is both beautiful and stable. His colleagues admire Geoffrey’s attention to detail, knowing that the precision in his work will stand the test of time. Even the cathedral’s most intricate carvings are handled with care, and his precise measurements ensure that all elements of the building fit together seamlessly.
    • +
    +
  • +
  • Impulse Intensity: The individual’s focus on precision intensifies, leading them to spend more time than necessary on minute details. While their work remains high in quality, they may start to slow down as they double-check and recheck every aspect of their task. Their colleagues may begin to notice delays, as the individual's desire for absolute accuracy takes precedence over speed or efficiency. Though the results are still excellent, this level of precision may frustrate others who are waiting for the work to be completed.

    +
      +
    • Example (Impulse Intensity): Geoffrey’s precision starts to slow him down. As the construction of the cathedral progresses, he spends more time measuring and re-measuring each stone, worried that even the slightest error could compromise the structure. While his work remains flawless, the delays frustrate the workers who rely on him to keep the project moving. Geoffrey’s focus on getting every detail perfect means that progress is slower than expected, but his colleagues know that the quality of the work is never compromised.
    • +
    +
  • +
  • Disorder Intensity (Overly Precise/Perfectionism): As precision intensifies into perfectionism, the individual becomes excessively focused on getting every detail exactly right, to the point where they struggle to complete tasks. They may become paralyzed by the fear of making even the smallest mistake, checking and rechecking their work to the detriment of progress. Their need for perfection may lead to delays, frustration, and missed opportunities, as others begin to see them as overly rigid or difficult to work with. Their insistence on exactness can cause tension, especially when it prevents them from moving forward or adapting to changing circumstances.

    +
      +
    • Physical Symptoms: The individual may experience stress or fatigue from the constant pressure they place on themselves to get everything perfect. They may feel anxious about making mistakes, leading to mental exhaustion.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to fix small imperfections or review their work repeatedly. The individual may become consumed by worries that their work isn’t good enough, even if others are satisfied.

      +
    • +
    • Emotional Distress: The individual may feel frustrated with their own inability to complete tasks on time, as their focus on precision keeps them from moving forward. They may also feel disconnected from others, as their perfectionism prevents them from collaborating or accepting help.

      +
    • +
    • Example (Disorder Intensity): Geoffrey’s precision turns into perfectionism. He refuses to move forward with parts of the cathedral’s construction until every single measurement and alignment is flawless. Even when other masons assure him that the structure is sound, Geoffrey reworks and adjusts stones multiple times, delaying the project significantly. His colleagues grow frustrated, as the delays threaten the overall completion of the cathedral. Geoffrey’s obsession with precision consumes him, leaving him unable to accept that no structure can be perfect, and his fear of imperfection causes tension with his team and jeopardizes the project’s timeline.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Pteromerhanophobia + abbrev: pteromerhanophobia + id: LQosx7BdIQ35Ytkb + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Pteromerhanophobia is an intense, irrational fear of flying + creatures, including birds, bats, or any creature with wings. People with + pteromerhanophobia may experience a range of symptoms when they think about, + see, or are near flying creatures. +

+
    +
  • + Impulse Intensity: Avoiding parks, forests, caves, aviaries, + bird watching, or any environments where flying creatures might be present, + including literature featuring them. Abberance (ABE) increases by 1 from the + source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of flying + creatures, particularly when they are in close proximity or in flight. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, dizziness, or even feelings of + faintness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being attacked, harmed, or overwhelmed by flying creatures. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near flying creatures or even when thinking about + encountering them. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Pteronophobia + abbrev: pteronophobia + id: 9aHymZBx4r5j4ztB + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Pteronophobia is an intense, irrational fear of feathers or + being tickled by feathers. People with pteronophobia may experience a range of + symptoms when they think about, see, or come in contact with feathers. +

+
    +
  • + Impulse Intensity: Avoiding birds, feather-stuffed pillows, + down comforters, and events or locations where feathers are present. + Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of feathers. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being tickled or discomfort caused by feathers. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near feathers or when thinking about them. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Ptochophobia + abbrev: ptochophobia + id: JECtd4Ed1Vp1b0te + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Ptochophobia is an intense, irrational fear of poverty or + becoming poor. People with ptochophobia may experience a range of symptoms + when they think about, see, or are in situations related to poverty. +

+
    +
  • + Impulse Intensity: Avoiding areas perceived as economically + disadvantaged, obsessively saving money, or refusing to spend on essentials. + Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or sight of poverty. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about becoming destitute or losing financial stability. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when faced with financial uncertainty or observing poverty. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Pyrophobia + abbrev: pyrophobia + id: mwOACm8h2bt9mL6t + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Pyrophobia is an intense, irrational fear of fire. People + with pyrophobia may experience a range of symptoms when they think about, see, + or are near fire. +

+
    +
  • + Impulse Intensity: Avoiding being near open flames, such as + campfires, candles, or even cooking on a stove. Abberance (ABE) increases by + 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of fire. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being burned, fire causing destruction, or losing control. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when exposed to fire or thinking about it. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Alfarphobia + abbrev: alfarphobia + id: TUIimlRAZlkucLWd + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

Alfarphobia is an intense, irrational fear of elves, particularly those depicted in folklore and mythology. These beings, known for their ethereal beauty, longevity, and magical abilities, can evoke awe in many, but individuals with Alfarphobia experience overwhelming anxiety at the thought or presence of these creatures. Whether or not elves truly exist, the fear manifests when these beings are mentioned in stories, seen in depictions, or imagined in forests or mystical places associated with folklore.

+
    +
  • Impulse Intensity: The individual avoids environments or situations where they might encounter stories or representations of elves, such as forested areas or tales involving magical beings. Their anxiety increases when discussing or seeing places linked to elves, but they can still manage by avoiding direct confrontation with their fears. When encountering elves, Abberance (ABE) increases by 1 from the source of fear.

    +
      +
    • Example (Impulse Intensity): A scholar with Alfarphobia refuses to venture into dense forests or read books about mythical beings. The mere mention of elves in folklore makes them uncomfortable, and they go out of their way to avoid areas rumored to be home to such creatures, even skipping gatherings where elven tales are told.
    • +
    +
  • +
  • Disorder Intensity: The individual experiences severe anxiety or panic when encountering any mention or representation of elves. This fear is all consuming, causing them to avoid social gatherings, storytelling, or activities in forested regions that might be associated with these beings. The individual becomes the subject of ridicule, as their fear is considered irrational by others who see elves as unthreatening or fictional. When encountering elves, Abberance (ABE) increases by 3 (instead of 1) from the source of fear.

    +
      +
    • Physical Symptoms: Rapid heartbeat, sweating, trembling, shortness of breath, nausea, or dizziness when encountering images or discussions of elves or elven lore.

      +
    • +
    • Intrusive Thoughts: Persistent, distressing thoughts of being in danger from elves or their magic, even in situations where these beings are only mentioned in passing.

      +
    • +
    • Emotional Distress: Profound feelings of helplessness, dread, and isolation as the individual is unable to participate in discussions or activities involving folklore or nature. They are often ridiculed by others for their intense fear of creatures that may not even exist.

      +
        +
      • Example (Disorder Intensity): A merchant with Alfarphobia is ridiculed by peers for refusing to travel near ancient forests, fearing that elves dwell within. The mere mention of elves in a conversation makes them anxious, and they flee any social gathering where elven myths are discussed. Despite believing that elves are mythical, they cannot shake the overwhelming terror that consumes them. Others mock them for their irrational fear of these folklore creatures, leaving the merchant socially isolated and consumed by fear.
      • +
      +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Reliable + abbrev: reliable + id: 5Zsxcn7h93tBRuXT + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Reliable refers to an individual's consistent ability to fulfill their duties, keep promises, and meet expectations. A reliable person can be trusted to perform tasks and responsibilities without needing constant supervision or reminders. They are dependable, ensuring that others can count on them to do what is required, often going above and beyond to ensure their commitments are met. While reliability builds trust and stability, an overly reliable person may sometimes take on too much, risking burnout in their effort to be dependable.

+
    +
  • Benign Trait: The individual consistently fulfills their duties, proving themselves dependable in any situation. They are trustworthy and often the first person others turn to when something important needs to be done. Their reliability fosters strong relationships, as people know they can always be counted on to follow through with their commitments.

    +
      +
    • Example (Benign Trait): Aldwin, a retainer in the service of a noble family, is known for his unwavering reliability. Whether he’s tasked with delivering an urgent message, overseeing the household’s finances, or organizing supplies for a long journey, Aldwin always completes his tasks on time and with great care. The noble family trusts him implicitly, knowing that he will never let them down. His consistent dedication ensures that the household runs smoothly and that their needs are always met.
    • +
    +
  • +
  • Impulse Intensity: The individual’s reliability becomes more pronounced, and they start taking on more tasks and responsibilities to ensure everything runs smoothly. While they remain dependable, their increasing workload can lead to occasional stress or delays, as they try to juggle too many commitments at once. Though they still fulfill their obligations, others may begin to worry that the individual is stretching themselves too thin, trying to meet everyone’s expectations without resting.

    +
      +
    • Example (Impulse Intensity): Aldwin’s reliability grows as he takes on more duties to keep the household functioning smoothly. He becomes the go-to person for every problem, from managing disputes among the servants to making sure the horses are well-fed for a long journey. While he still manages to get everything done, Aldwin begins to feel the pressure of constantly being relied upon, and some tasks take longer to complete. The noble family appreciates his dedication, but they start to worry that Aldwin might be overburdening himself.
    • +
    +
  • +
  • Disorder Intensity (Hyper-Reliability and Burnout): As reliability intensifies, the individual becomes overwhelmed by a consuming fear that they will fail to meet all their commitments. In their attempt to be hyper-reliable, they take on too many responsibilities, leading to missed deadlines and overlooked tasks. This relentless pressure causes them to feel increasingly out of control, and their worst fear starts to materialize: becoming unreliable. The extreme distress of failing to meet their obligations further erodes their confidence, trapping them in a cycle of anxiety, burnout, and unreliability, which devastates their sense of self-worth.

    +
      +
    • Physical Symptoms: The individual experiences fatigue, headaches, and physical exhaustion from overworking and pushing themselves beyond their limits. Stress-related symptoms, such as insomnia, may also emerge as they worry about falling behind.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of failure, falling short of expectations, and becoming unreliable. The individual may be consumed by the fear of disappointing others, obsessively worrying that they are not doing enough.

      +
    • +
    • Emotional Distress: The individual feels intense anxiety and distress as they begin to miss deadlines and drop tasks. The realization that they are becoming what they most fear—unreliable—causes emotional turmoil, leading to feelings of inadequacy, frustration, and guilt.

      +
    • +
    • Example (Disorder Intensity): Aldwin’s once unshakable reliability has turned into a source of intense anxiety. Convinced that he must meet every expectation placed upon him, Aldwin takes on more work than he can handle. Despite his best efforts, he starts missing deadlines and forgetting important tasks, which only increases his panic. He becomes consumed by the fear of becoming unreliable, and this fear paralyzes him, leading to more mistakes. The noble family, once fully confident in his dependability, starts to notice the cracks in Aldwin’s performance, but he hides his distress, fearing they will see him as a failure. His overwhelming need to be dependable ultimately results in the very thing he dreads: unreliability, and the resulting shame and guilt cause Aldwin deep emotional anguish.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Resilient + abbrev: resilient + id: dhwWuJM5gqXq1fBU + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Resilience refers to an individual's ability to recover quickly from hardships, setbacks, or challenges. A resilient person possesses mental and emotional toughness, allowing them to persevere through difficulties and adapt to changing or harsh circumstances without giving up. This trait is essential in navigating life's obstacles and bouncing back stronger from adversity. While resilience fosters strength and endurance, extreme resilience can sometimes lead to an inability to ask for help or rest, as the individual may feel they must always be strong, even at a personal cost.

+
    +
  • Benign Trait: The individual consistently recovers from setbacks, maintaining a positive and determined attitude in the face of hardship. They adapt to difficult situations with a strong sense of perseverance, finding ways to push through challenges without being overwhelmed. Their resilience earns them the respect of others, as they remain steadfast in difficult times, showing an inspiring ability to endure and continue forward.

    +
      +
    • Example (Benign Trait): Ellyn, a peasant, faces difficult seasons of drought and poor harvest, but she continues to work her land tirelessly. Even when her crops fail and food is scarce, Ellyn finds ways to support her family, gathering wild herbs and taking on extra tasks in the village to ensure they survive the winter. Though the challenges are many, Ellyn's resilience allows her to persevere, and her neighbors admire her strength and ability to push through adversity without losing hope.
    • +
    +
  • +
  • Impulse Intensity: The individual's resilience becomes more prominent, driving them to push through even the toughest challenges, sometimes at the expense of their well-being. While they continue to withstand hardships, they may start to neglect their own needs, convinced that they must endure everything without pause. They refuse to slow down or ask for help, believing that doing so would be a sign of weakness. Though their determination is admirable, their refusal to rest or accept support can lead to physical or emotional exhaustion.

    +
      +
    • Example (Impulse Intensity): Ellyn's resilience intensifies as she faces yet another poor harvest. She refuses to let the challenges break her spirit, taking on even more work despite her growing fatigue. When a neighbor offers to help her with the fields, Ellyn declines, insisting that she can manage on her own. She works from dawn to dusk, unwilling to show any sign of weakness, even as her health starts to suffer from the constant strain. While others admire her determination, they begin to worry that Ellyn is pushing herself too hard.
    • +
    +
  • +
  • Disorder Intensity (Over-Resilience/Blind Endurance): As resilience intensifies, the individual may become overly focused on enduring hardships, refusing to recognize when a situation is beyond salvaging and needs to be abandoned. They push through even when it is clear that continuing will only cause more harm. Their refusal to acknowledge when it's time to stop or change course can lead to self-destruction, burnout, and worsening circumstances. This relentless drive to endure makes them feel they must overcome every obstacle at any cost, even when abandoning or adjusting the path would be the wiser choice.

    +
      +
    • Physical Symptoms: The individual may experience chronic fatigue, injuries, or illnesses from pushing their body and mind too far. They may continue working despite physical pain or exhaustion, unwilling to admit defeat or failure.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of needing to endure at all costs, coupled with an intense fear of being seen as weak or incapable if they give up. They may convince themselves that abandoning a task is equivalent to failure, no matter how destructive the situation.

      +
    • +
    • Emotional Distress: The individual feels trapped by their own determination, unable to admit that they are overwhelmed or need to stop. They may experience frustration, guilt, and emotional numbness as they refuse to let themselves step back, even when it’s clearly necessary.

      +
    • +
    • Example (Disorder Intensity): Ellyn’s resilience becomes self-destructive. After years of failed crops, she continues to work the same barren fields, refusing to relocate or try different crops despite advice from others. She tells herself that giving up would mean failing her family, even as they struggle to survive. Ellyn works herself to exhaustion, ignoring the worsening conditions and her declining health, convinced that sheer endurance will eventually bring success. Her inability to recognize that she must change her approach or abandon the farm leads to further suffering, as her refusal to stop only deepens the hardship. Neighbors who once admired her strength now worry for her, but Ellyn is determined to endure at any cost, even if it destroys her.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Resourceful + abbrev: resourceful + id: CfRVLxf00r94m5QN + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Resourcefulness is the ability to find quick and clever ways to overcome difficulties. Resourceful individuals are admired for their creativity and problem-solving skills.

\n

Example: A castle steward who, during a siege, cleverly repurposes materials and food stores to sustain the inhabitants for longer than anyone expected.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Responsive + abbrev: responsive + id: ZowkOgbTHyB9rIhS + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Responsiveness involves reacting quickly and positively to changes or needs. Being responsive is crucial in customer service, healthcare, and leadership roles.

\n

Example: A village leader who quickly organizes a response to an unexpected flood, directing villagers to higher ground and arranging for food and shelter.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Reticent + abbrev: reticent + id: Y1vVaOJ86qldrFdP + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Reticence is the quality of being reserved or restrained in communication. Reticent individuals may be seen as thoughtful or introverted, often choosing their words carefully.

\n

Example: A monk who speaks little, preferring to observe and meditate in silence, communicating only when necessary and always with great care.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Self-protective + abbrev: self-protective + id: cP6ZEVtkgYYtdXZn + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Self-protectiveness involves taking actions to guard oneself from harm or emotional pain. This trait can be seen in people who are cautious in relationships or decision-making to avoid vulnerability.

\n

Example: A traveling merchant who is always wary of bandits, taking care to conceal his wealth and avoid dangerous routes to protect himself and his goods.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Self-sufficient + abbrev: self-sufficient + id: WvLSKgq7rAeVpZiJ + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Self-sufficiency is the ability to provide for oneself without relying on others. Self-sufficient individuals are admired for their independence and ability to manage their own needs, whether it be in terms of finances, emotional well-being, or practical life skills.

\n

Example: A homesteader who lives on a small plot of land, growing his own food, raising livestock, and making his own clothes, relying on no one but himself and his immediate family to survive.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Sensitive + abbrev: sensitive + id: MMkjYig9qFISMszW + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Sensitivity involves being attuned to the emotions and feelings of oneself and others. Sensitive individuals are often seen as empathetic and compassionate, though they may also be more easily affected by stress or criticism.

\n

Example: A troubadour who, deeply moved by the emotions of those around him, composes and performs songs that capture the joys and sorrows of his audience, often bringing them to tears or laughter with his poignant words.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Sicariophobia + abbrev: sicariophobia + id: eeMLjBZOU1nUseeM + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Sicariophobia is an intense, irrational fear of being + murdered or of murder itself. People with sicariophobia may experience a range + of symptoms when they think about, see, or are in situations where they + perceive a risk of homicide. +

+
    +
  • + Impulse Intensity: Avoiding dark or deserted areas, staying + away from individuals perceived as threatening, or being overly cautious in + everyday activities. Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or perception of + murder. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being murdered or witnessing a murder. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when thinking about violence or in potentially threatening + situations. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Silliness + abbrev: silliness + id: ooiSB2g2OdBsJE9v + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Silliness is characterized by behavior that is lighthearted, playful, and often lacking in seriousness. While it can be a source of amusement, excessive silliness may be seen as inappropriate or immature in certain contexts.

+

Example: A young page who is always making jokes, pulling pranks, and laughing at inappropriate times, causing both frustration and amusement among the knights, who see him as lacking the seriousness required for his future duties.

+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Sociable + abbrev: sociable + id: 2anybJYlXU3x7cYY + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Sociable individuals enjoy interacting with others and thrive in social settings. They are often outgoing and comfortable in groups, making them good at networking and forming relationships in personal and professional contexts.

\n

Example: A tavern owner who knows all the villagers by name and enjoys engaging in lively conversation with patrons, making his establishment a popular gathering place for news, gossip, and community bonding.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Sociophobia + abbrev: sociophobia + id: 8Yfh7YvLv9Xa1jtt + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Sociophobia, also known as social phobia or social anxiety + disorder, is an intense, irrational fear of social situations. People with + sociophobia may experience a range of symptoms when they think about, see, or + are in social settings. +

+
    +
  • + Impulse Intensity: Avoiding social gatherings, meetings, + public speaking, or any interaction that could lead to perceived judgment. + Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic in social environments, especially + where interactions are expected. Abberance (ABE) increases by 3 (instead of + 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being judged, embarrassed, or rejected in social settings. +
    • +
    • + Emotional Distress: Deep feelings of dread, isolation, + and helplessness when social interaction is unavoidable. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Spontaneous + abbrev: spontaneous + id: vhphGbRMOKPY3Tu4 + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Spontaneity is the trait of acting on impulse without prior planning. Spontaneous individuals are often seen as fun and adventurous, bringing energy and excitement to their surroundings.

\n

Example: A minstrel who, while traveling through a new village, suddenly decides to perform a surprise concert in the town square, lifting the spirits of the townspeople with his impromptu music and stories.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Suspicious + abbrev: suspicious + id: DL0zhndKCEDUtPPa + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description: |- +

Suspicious individuals tend to be wary and cautious, often questioning the motives and actions of others. They may sense something is off or not quite right in situations, leading them to be on guard and hesitant to trust easily. While not as extreme as paranoia, this mild suspicion can cause them to approach relationships and new experiences with a degree of skepticism and careful observation.

+

Example: A blacksmith�s apprentice who, after hearing rumors of theft in the village, begins to closely watch anyone who enters the workshop. He carefully monitors customers and even his fellow apprentices, making sure that no tools or materials go missing. Though his suspicions keep the workshop secure, they also create an air of tension, as others sense his constant vigilance.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Team-oriented + abbrev: teamoriented + id: e39heaM7Lc3Ltukg + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Team-oriented individuals work well within groups, often prioritizing the success of the team over individual accolades. They are cooperative, communicative, and focused on collective goals.

\n

Example: A member of a medieval guild who collaborates closely with fellow craftsmen, sharing skills and resources to ensure the prosperity of the guild and the quality of its products.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Thalassophobia + abbrev: thalassophobia + id: hqeLwTZlyOg7D4tJ + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Thalassophobia is an intense, irrational fear of the sea or + large bodies of water. People with thalassophobia may experience a range of + symptoms when they think about, see, or are near the ocean or large lakes. +

+
    +
  • + Impulse Intensity: Avoiding trips to the beach, boating, + swimming, or any activity that involves the ocean or large lakes. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of vast bodies + of water. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about drowning, sea creatures, or being lost at sea. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when near or thinking about the ocean or large bodies of + water. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Thanatophobia + abbrev: thanatophobia + id: CfoIL7yBqiLoqruO + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Thanatophobia is an intense, irrational fear of mortality or + the dying process. People with thanatophobia may experience a range of + symptoms when they think about, see, or are in situations related to dying. +

+
    +
  • + Impulse Intensity: Avoiding discussions about death, + funerals, or anything that may act as a reminder of mortality. Abberance + (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought of mortality or dying. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about one's own death, the process of dying, or what happens after + death. +
    • +
    • + Emotional Distress: Deep feelings of dread, + helplessness, and existential anxiety related to death and mortality. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Thaumatophobia + abbrev: thaumatophobia + id: iSyY0kLWhbgehtFa + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Thaumatophobia is an intense, irrational fear of magic or + supernatural occurrences. People with thaumatophobia may experience a range of + symptoms when they think about, see, or are near anything they perceive as + magical or supernatural. +

+
    +
  • + Impulse Intensity: Avoiding literature, activities, or + situations involving magic or the supernatural. Abberance (ABE) increases by + 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or sight of magic or + supernatural activities. Abberance (ABE) increases by 3 (instead of 1) from + the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about magic causing harm or being uncontrollable. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when confronted with anything related to magic or + supernatural phenomena. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Thoughtful + abbrev: thoughtful + id: FJHw3A4gcO8Ft3uD + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Thoughtfulness is the consideration of others' feelings and needs, as well as the careful contemplation of one's own actions and decisions. Thoughtful people are often regarded as kind, reflective, and deliberate in their interactions.

\n

Example: A knight who, before embarking on a journey, writes letters to his family and friends, offering words of comfort and wisdom, and ensuring that his affairs are in order, showing care for the well-being of those he leaves behind.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Turophobia + abbrev: turophobia + id: JF1yMtDdugpHIzeC + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Turophobia is an intense, irrational fear of cheese. People + with turophobia may experience a range of symptoms when they think about, see, + or are near cheese. +

+
    +
  • + Impulse Intensity: Avoiding cheese-containing foods, + restaurants, and grocery stores. Abberance (ABE) increases by 1 from the + source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of cheese. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about cheese being repulsive, harmful, or overwhelming. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when encountering cheese. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Venustraphobia + abbrev: venustraphobia + id: YVCvUKX0zA3XDZlQ + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Venustraphobia is an intense, irrational fear of beautiful + women. People with venustraphobia may experience a range of symptoms when they + think about, see, or are near attractive women. +

+
    +
  • + Impulse Intensity: Avoiding social situations where beautiful + women might be present, including certain social events or public places. + Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the thought or sight of beautiful + women. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about rejection, inadequacy, or being judged by attractive women. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness in social settings involving beautiful women. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Vigilant + abbrev: vigilant + id: RI9iTNytVPvp3qVJ + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Vigilance involves being watchful and alert to potential dangers or problems. Vigilant individuals are valued for their ability to anticipate and prevent issues before they arise, often in roles related to security or safety.

\n

Example: A castle guard who keeps a close watch on the surrounding landscape from the battlements, always alert for signs of approaching enemies, ensuring the safety of the inhabitants.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Watchful + abbrev: watchful + id: oRIL5tDePzVE34MB + img: systems/sohl/assets/icons/user-gear.svg + subType: personality + description:

Watchfulness is the state of being observant and attentive to one's surroundings. Watchful individuals are often those who notice details that others might miss, making them valuable in roles that require careful observation.

\n

Example: A hunter in the forest, who keenly observes the movements of animals and the subtle signs of their presence, allowing him to track and capture game with great skill.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: Cy4Z52IyVq4eZJOG +- name: Xenophobia + abbrev: xenophobia + id: YFFYFDofeUHgZQEK + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Xenophobia is an intense, irrational fear of strangers or + foreigners. People with xenophobia may experience a range of symptoms when + they think about, see, or are near individuals they perceive as different or + unfamiliar. +

+
    +
  • + Impulse Intensity: Avoiding interactions with people from + different cultures, as well as places where they are likely to be present. + Abberance (ABE) increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic in the presence of strangers or + foreigners. Abberance (ABE) increases by 3 (instead of 1) from the source of + fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being harmed or overwhelmed by outsiders. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when dealing with or thinking about strangers or + foreigners. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Zoophobia + abbrev: zoophobia + id: I15cDy9Rfah6aoo0 + img: systems/sohl/assets/icons/dread.svg + subType: personality + description: |- +

+ Zoophobia is an intense, irrational fear of animals. People + with zoophobia may experience a range of symptoms when they think about, see, + or are near animals. +

+
    +
  • + Impulse Intensity: Avoiding zoos, farms, pet stores, or any + environments where animals are likely to be present. Abberance (ABE) + increases by 1 from the source of fear. +
  • +
  • + Disorder Intensity: In addition to trait intensity + behaviors: Overwhelming fear or panic at the sight or thought of animals. + Abberance (ABE) increases by 3 (instead of 1) from the source of fear. +
      +
    • + Physical Symptoms: Rapid heartbeat, sweating, + trembling, shortness of breath, nausea, or dizziness. +
    • +
    • + Intrusive Thoughts: Persistent and distressing thoughts + about being bitten, attacked, or harmed by animals. +
    • +
    • + Emotional Distress: Deep feelings of dread and + helplessness when encountering or thinking about animals. +
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: hOkudCNKvBOsAOXZ +- name: Agility + abbrev: agl + id: dri4kRojNyOo9oe7 + img: systems/sohl/assets/icons/acrobatics.svg + subType: physique + description: "" + intensity: attribute + skillBaseFormula: '@agl' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Blundering + maxValue: "4" + - label: Clumsy + maxValue: "8" + - label: Average + maxValue: "12" + - label: Nimble + maxValue: "16" + - label: Graceful + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Comeliness + abbrev: cml + id: fgMl4WCIvTTBDUJ8 + img: systems/sohl/assets/icons/charm.svg + subType: physique + description: "" + intensity: attribute + skillBaseFormula: '@cml' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Ugly + maxValue: "4" + - label: Unattractive + maxValue: "8" + - label: Plain + maxValue: "12" + - label: Attractive + maxValue: "16" + - label: Striking + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Dexterity + abbrev: dex + id: EXXJU3HJnvd9MatX + img: systems/sohl/assets/icons/juggler.svg + subType: physique + description: "" + intensity: attribute + skillBaseFormula: '@dex' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Uncoordinated + maxValue: "4" + - label: Awkward + maxValue: "8" + - label: Average + maxValue: "12" + - label: Deft + maxValue: "16" + - label: Adroit + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Endurance + abbrev: end + id: WRVbCGB5lFT9LZlY + img: systems/sohl/assets/icons/climbing.svg + subType: physique + description: "" + intensity: attribute + skillBaseFormula: '@end' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Frail + maxValue: "4" + - label: Unfit + maxValue: "8" + - label: Average + maxValue: "12" + - label: Robust + maxValue: "16" + - label: Hardy + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Perception + abbrev: per + id: f3RTqhcs0l7npPAY + img: systems/sohl/assets/icons/awareness.svg + subType: physique + description: "" + intensity: attribute + skillBaseFormula: '@per' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Impaired + maxValue: "4" + - label: Dulled + maxValue: "8" + - label: Average + maxValue: "12" + - label: Sharp + maxValue: "16" + - label: Acute + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Strength + abbrev: str + id: bFJqb8DqPuPr5cwl + img: systems/sohl/assets/icons/biceps.svg + subType: physique + description: "" + intensity: attribute + skillBaseFormula: '@str' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Feeble + maxValue: "4" + - label: Weak + maxValue: "8" + - label: Average + maxValue: "12" + - label: Forceful + maxValue: "16" + - label: Mighty + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Voice + abbrev: voi + id: sJtinBCJ1DVPGeau + img: systems/sohl/assets/icons/sing.svg + subType: physique + description: "" + intensity: attribute + skillBaseFormula: '@voi' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Jarring + maxValue: "4" + - label: Tuneless + maxValue: "8" + - label: Average + maxValue: "12" + - label: Melodious + maxValue: "16" + - label: Dulcet + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Allergy + abbrev: allergymajor + id: VSbTDQSeGf228g5P + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Allergy is an overreaction of the body's humors to a normally harmless substance, such as pollen, food, or animal hair. When exposed to such substances, the body may react with various symptoms, from mild irritation to severe affliction, believed to be caused by an imbalance in the body's natural elements.

+
    +
  • Impulse Intensity: Sneezing, itching, or watery eyes upon exposure to the offending substance. These symptoms, though bothersome, can often be managed with herbal remedies or avoidance of the trigger.
      +
    • Example (Impulse Intensity): Lady Elspeth finds herself sneezing and with watery eyes each spring when the fields are in bloom. Though uncomfortable, she manages by staying indoors and applying a cool cloth to her face.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Severe reactions, such as difficulty breathing, widespread rashes, or swelling, which could lead to grave illness or even death without intervention. Exposure to the allergen can be dangerous and incapacitating.
      +
    • Physical Symptoms: Difficulty breathing, hives, swelling of the face or throat, nausea, or dizziness.
    • +
    • Intrusive Thoughts: Persistent fears of accidental exposure to the allergen, and dread of experiencing another severe reaction, leading to constant vigilance and anxiety.
    • +
    • Emotional Distress: Overwhelming fear, frustration, and a sense of helplessness, especially when in environments where the allergen might be present. The afflicted may avoid social gatherings or certain foods, fearing another attack.
    • +
    • Example (Disorder Intensity): Brother Aelfric, upon consuming honey, experiences a sudden swelling of the throat and a struggle to draw breath. As he gasps for air, he is consumed by terror, fearing that this attack may be his last. His companions must act quickly, applying poultices and prayers to save him from the brink of death, leaving Aelfric haunted by the experience.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Impaired Smell + abbrev: impairedsmell + id: SV76XlXffG8R7WxY + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Impaired Smell is a diminished ability to detect and perceive odors, often believed to be a sign of imbalance in the body's humors. Those afflicted may find their sense of smell dulled, reducing their ability to fully experience the world around them.

+
    +
  • Impulse Intensity: Difficulty distinguishing or detecting faint odors, leading to a reduced awareness of one’s surroundings. Though bothersome, it may be managed by focusing on other senses or avoiding situations where smell is crucial.
      +
    • Example (Impulse Intensity): Cook Edric notices that the fragrant herbs in his stew no longer carry the same strength. Though he can still taste the food, the experience is less vivid, and he must rely on his memory and judgment more than his nose.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Significant impairment in detecting even strong odors, leading to challenges in daily life, such as cooking, detecting spoiled food, or recognizing smoke from a fire. This loss can cause serious safety concerns and emotional distress.
      +
    • Physical Symptoms: Weakened sense of taste, frequent difficulty detecting odors, and potential weight loss due to a lack of appetite.
    • +
    • Intrusive Thoughts: Worries about the inability to detect dangerous situations, such as spoiled food or approaching fire, and fears of further sensory decline.
    • +
    • Emotional Distress: Frustration, sadness, and anxiety over the inability to experience the fullness of life’s scents, such as the smell of fresh bread or blooming flowers. This loss may lead to social withdrawal or a sense of isolation.
    • +
    • Example (Disorder Intensity): Brewer Theobald finds that he can no longer distinguish between the rich scents of his ales, leading to a decline in the quality of his brews. As the impairment worsens, Theobald becomes increasingly anxious, fearing that his craft is slipping away from him. The constant worry over missing the smell of smoke or spoiled ingredients causes him great distress, leaving him feeling isolated and vulnerable.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Asthma + abbrev: asthma + id: yZCpQz2lgtRK9w6u + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Asthma is a chronic condition of the lungs, where the airways become narrowed and inflamed, causing difficulty in breathing. Without modern medicine, those afflicted rely on rest, avoiding known triggers, and natural remedies to manage their symptoms. The condition can be life-threatening during severe attacks.

+
    +
  • Impulse Intensity: Shortness of breath, wheezing, and chest tightness, especially during physical activity or exposure to environmental triggers. These symptoms can often be managed by resting and avoiding known triggers.
      +
    • Example (Impulse Intensity): Blacksmith Osric finds himself wheezing and short of breath after working the forge on cold mornings. Though the tightness in his chest is uncomfortable, he knows to step away and rest until his breathing eases.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Severe difficulty breathing, persistent coughing, and frequent asthma attacks, which may lead to life-threatening situations without immediate intervention. The condition significantly impacts daily life, causing anxiety and limiting physical activities.
      +
    • Physical Symptoms: Intense wheezing, chronic coughing, severe shortness of breath, chest pain, and fatigue, especially after exposure to triggers or during an attack.
    • +
    • Intrusive Thoughts: Constant fear of the next asthma attack, worries about suffocating, and anxiety over being away from safe spaces or helpers during an episode.
    • +
    • Emotional Distress: Profound feelings of vulnerability, fear, and frustration due to the unpredictability of asthma attacks. The condition may lead to social withdrawal and a sense of helplessness, especially during periods of frequent attacks.
    • +
    • Example (Disorder Intensity): Farmer Aldwin experiences severe asthma attacks whenever he is exposed to the dust and pollen of the fields. During these attacks, his chest tightens painfully, and he struggles to draw breath, consumed by the terror that he might not survive. The fear of another attack haunts him constantly, leading him to avoid his beloved work and withdraw from community gatherings, leaving him isolated and anxious.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Impaired Vision + abbrev: impairedvision + id: MnRZLMrpfl9LcWyY + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Impaired Vision is a condition where one's ability to see clearly is reduced, causing difficulties in performing everyday tasks. Without the availability of modern corrective lenses or treatments, those afflicted must rely on natural adaptations and assistance from others to manage their impaired sight.

+
    +
  • Impulse Intensity: Difficulty focusing on distant or near objects, leading to blurred vision, eye strain, and occasional disorientation. These symptoms can be managed by adjusting one’s activities and relying more on other senses.
      +
    • Example (Impulse Intensity): Scribe Mathias finds it increasingly difficult to read the fine script of ancient manuscripts. He often squints and moves the parchment closer to his face, straining his eyes to make out the words, but manages to complete his work with effort.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Severe impairment in vision, making it challenging to recognize faces, read, or navigate environments. This condition can lead to significant disruptions in daily life and increased reliance on others for assistance.
      +
    • Physical Symptoms: Persistent blurred vision, frequent headaches from eye strain, difficulty distinguishing objects or people, and clumsiness due to impaired depth perception.
    • +
    • Intrusive Thoughts: Fears of worsening vision, anxiety over becoming entirely dependent on others, and concerns about missing important details or dangers in the environment.
    • +
    • Emotional Distress: Frustration, sadness, and a sense of helplessness stemming from the inability to perform tasks that require clear vision, such as reading or crafting. This can lead to social withdrawal and a feeling of isolation.
    • +
    • Example (Disorder Intensity): Weaver Talia’s vision has worsened to the point where she can no longer see the fine threads of her loom clearly. She struggles to continue her craft, often making mistakes and feeling overwhelmed by the prospect of losing her livelihood. Her worry about becoming a burden to her family and the fear of further deterioration in her sight weigh heavily on her mind, leading her to withdraw from social activities.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Blindness + abbrev: blindness + id: DfcJ3iO8c66JLAGq + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Total Blindness is the complete loss of sight, leaving an individual unable to perceive light, shapes, or any visual stimuli. Without vision, those afflicted must rely entirely on their other senses and the assistance of others to navigate the world and perform daily tasks.

+
    +
  • Disorder Intensity: The absence of sight, making independent movement and task completion nearly impossible without assistance. The individual must adapt to a life without visual cues, relying on touch, hearing, and smell to interact with their environment.
      +
    • Physical Symptoms: Inability to see, leading to complete reliance on other senses. Increased risk of injury due to the inability to detect obstacles, hazards, or changes in the environment.
    • +
    • Intrusive Thoughts: Persistent fears of vulnerability, anxiety about navigating the world without sight, and concerns about becoming entirely dependent on others for basic needs and safety.
    • +
    • Emotional Distress: Profound feelings of isolation, helplessness, and frustration due to the loss of independence. The individual may experience deep sadness or depression as they mourn the loss of their sight and the life they once knew, often withdrawing from social interactions and becoming reliant on close companions for support and guidance.
    • +
    +
  • +
+ intensity: disorder + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Chronic Fatigue Syndrome + abbrev: cfs + id: 4AvtK7IMvrRtdDlT + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Chronic Fatigue Syndrome (CFS) is a debilitating condition characterized by persistent and overwhelming fatigue that is not relieved by rest. Those afflicted find even simple tasks exhausting, and their energy levels are constantly depleted.

+
    +
  • Impulse Intensity: Constant feelings of tiredness and lack of energy, even after a full night’s rest. Individuals may struggle to complete daily tasks and often require frequent breaks to manage their fatigue.
      +
    • Example (Impulse Intensity): Merchant Alaric finds himself increasingly fatigued after a day in the marketplace. Once lively and energetic, he now struggles to keep up with the demands of his trade, often needing to sit and rest, despite the relatively simple nature of his work.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Severe and debilitating exhaustion that makes even basic activities, such as walking or carrying out routine tasks, feel insurmountable. The individual may be bedridden or require significant assistance in daily life, with the condition severely impacting their ability to function.
      +
    • Physical Symptoms: Persistent and profound fatigue, muscle and joint pain, headaches, sleep disturbances, and difficulty concentrating (often referred to as "brain fog"). Even minimal physical or mental exertion can lead to a significant worsening of symptoms.
    • +
    • Intrusive Thoughts: Constant worries about never feeling well again, fear of being seen as weak or lazy, and anxiety about the future and how to manage daily responsibilities while feeling so drained.
    • +
    • Emotional Distress: Overwhelming feelings of frustration, hopelessness, and sadness due to the chronic and unrelenting nature of the condition. The individual may experience social withdrawal and isolation, feeling disconnected from others who cannot fully understand the severity of their fatigue.
    • +
    • Example (Disorder Intensity): Lady Isolde, once active and engaged in her household and community, now spends most of her days in bed, her body too weary to move. Even small tasks, like dressing or eating, leave her exhausted. The constant fatigue weighs heavily on her spirit, leading her to withdraw from the company of others, plagued by fears of never regaining her strength and losing her place in the world.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Impaired Hearing + abbrev: impairedhearing + id: cscALulqsdsJVmBL + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Impaired Hearing is a condition where one’s ability to hear sounds is diminished, making it difficult to perceive conversations and environmental noises. Without access to modern hearing aids or treatments, those afflicted must rely on alternative communication methods and heightened awareness to manage their condition.

+
    +
  • Impulse Intensity: Difficulty hearing soft or distant sounds, leading to frequent misunderstandings and the need to ask others to repeat themselves. This can cause frustration and strain in communication.

    +
      +
    • Example (Impulse Intensity): Farmer Eadric often misses the sounds of approaching footsteps or distant calls while working in the fields. He frequently asks his family to speak louder, struggling to catch every word in conversation.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Significant hearing loss that makes it challenging to engage in conversations, even in quiet settings. The individual may struggle to hear anything below a loud volume, leading to social isolation and difficulty performing daily tasks.

    +
      +
    • Physical Symptoms: Inability to hear normal conversations, difficulty distinguishing between sounds, and the need to rely on lip-reading or other visual cues to understand speech.
    • +
    • Intrusive Thoughts: Constant anxiety about missing important information or failing to respond appropriately in conversations, fear of becoming completely deaf, and worries about being left out or misunderstood.
    • +
    • Emotional Distress: Deep frustration, sadness, and a sense of isolation due to the inability to participate fully in social interactions. The individual may withdraw from social situations, feeling disconnected from others and fearful of becoming a burden.
    • +
    • Example (Disorder Intensity): Elderly Seraphina can no longer hear the chatter of her grandchildren or the sounds of daily life in the village. She feels increasingly isolated, unable to join in conversations without misunderstanding or missing key points. The silence around her deepens her sense of loneliness and fear of being cut off from the world she once enjoyed.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Deafness + abbrev: deafness + id: dhEbirI3YbhROtB5 + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Deafness is the complete loss of the ability to hear, leaving an individual unable to perceive any sounds. Without the ability to hear, the afflicted person must rely entirely on visual cues, gestures, and written communication to interact with the world.

+
    +
  • Disorder Intensity: The absence of hearing, making verbal communication impossible without alternative methods such as sign language or written notes. The individual must adapt to a life without auditory cues, relying on sight and touch to understand their environment and communicate with others.
      +
    • Physical Symptoms: Complete inability to detect any sound, including voices, environmental noises, or alarms. This can lead to increased vulnerability, as the individual cannot hear warnings or calls for attention.
    • +
    • Intrusive Thoughts: Persistent fears of missing critical information or danger, anxiety about being unable to communicate effectively, and concerns about becoming socially isolated due to the inability to engage in conversations.
    • +
    • Emotional Distress: Profound feelings of isolation, frustration, and helplessness stemming from the loss of a primary sense. The individual may experience deep sadness or depression, particularly as they adjust to the challenges of living in a silent world, often feeling disconnected from those around them and from the sounds of life they once knew.
    • +
    +
  • +
+ intensity: disorder + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Shortness of Breath + abbrev: shortnessofbreath + id: ccl1Kpb6OwZIGfcv + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Shortness of Breath is a condition characterized by difficulty breathing where the act of drawing air feels laborious and uncomfortable. Those suffering from dyspnea must rely on rest, herbal remedies, and the support of others to manage their condition.

+
    +
  • Impulse Intensity: Occasional shortness of breath, often triggered by physical exertion, stress, or environmental factors like high altitude or cold air. The individual may need to pause and focus on breathing to regain comfort.

    +
      +
    • Example (Impulse Intensity): Knight Roderic feels winded after a long march in his heavy armor. He must pause frequently to catch his breath, leaning on his sword for support as he waits for the tightness in his chest to ease.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Persistent and severe difficulty in breathing, even at rest, which may cause significant distress and interfere with daily activities. The individual may experience frequent bouts of breathlessness, leading to anxiety and physical limitations.

    +
      +
    • Physical Symptoms: Constant shortness of breath, rapid or shallow breathing, a sensation of tightness in the chest, and fatigue due to the effort required to breathe. This may also be accompanied by wheezing or a sense of suffocation.
    • +
    • Intrusive Thoughts: Overwhelming fear of suffocation, anxiety about engaging in any physical activity, and constant worry about the next episode of breathlessness. The individual may become preoccupied with the act of breathing, fearing they might suddenly be unable to catch their breath.
    • +
    • Emotional Distress: Deep frustration, helplessness, and fear stemming from the inability to breathe easily. The individual may withdraw from physical activities and social interactions, feeling that their condition limits their ability to live a normal life. This can lead to a sense of isolation and despair, particularly if the condition worsens over time.
    • +
    • Example (Disorder Intensity): Weaver Margery struggles with every breath, her chest tight and lungs burning even when she is at rest. The fear of being unable to draw in enough air haunts her constantly, leading her to avoid any exertion and retreat from her loom, which once brought her joy. As her condition worsens, Margery is consumed by anxiety and sadness, feeling as though she is slowly suffocating in a world that once felt safe.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Hyperacusis + abbrev: hyperacusis + id: 9ZxGBDQdNowCgrIE + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Hyperacusis is a condition characterized by an increased sensitivity to normal environmental sounds, where everyday noises become unbearably loud or painful. Those afflicted with hyperacusis must seek quiet environments and avoid noisy situations to manage their symptoms.

+
    +
  • Impulse Intensity: Discomfort or irritation from sounds that others find normal or mild, such as clinking dishes, rustling leaves, or casual conversation. The individual may need to cover their ears or distance themselves from the source of the noise to find relief.

    +
      +
    • Example (Impulse Intensity): Scholar Aldwyn finds the clatter of quills on parchment and the murmur of voices in the scriptorium unbearably loud. He frequently steps outside to escape the overwhelming noise, needing silence to maintain his focus.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Severe and persistent discomfort or pain in response to everyday sounds, which can lead to significant distress and an inability to tolerate normal environments. The individual may become increasingly isolated as they avoid situations where sound is unavoidable.

    +
      +
    • Physical Symptoms: Sharp pain, discomfort, or a sense of pressure in the ears when exposed to sounds, even those at low volumes. This may be accompanied by headaches, ear pain, or a ringing sensation in the ears (tinnitus).
    • +
    • Intrusive Thoughts: Constant anxiety about encountering loud noises, fear of sudden sounds causing pain, and a preoccupation with finding and maintaining quiet spaces. The individual may become hyper-aware of potential noise sources and feel trapped in a world that is overwhelmingly loud.
    • +
    • Emotional Distress: Intense frustration, helplessness, and fear of social situations due to the inability to tolerate normal sounds. The individual may withdraw from social interactions, work, or public spaces, leading to feelings of isolation, loneliness, and despair.
    • +
    • Example (Disorder Intensity): Lady Cecily finds that even the cheerful chatter of her household staff and the creaking of wooden floors cause her ears to throb with pain. She retreats to her chambers, shuttering the windows and stuffing fabric under the door to block out any sound. The once vibrant home now feels like a prison, and Lady Cecily's fear of noise leaves her isolated and despondent, dreading the everyday sounds that others take for granted.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Tremors + abbrev: tremors + id: ZTUv0EzyqGa2WO1M + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Tremors are involuntary, rhythmic shaking movements of the limbs or extremities, often occurring without the person's control. These tremors can make it difficult to perform tasks requiring steady hands or precise movements. Those suffering from tremors must adapt to their condition through alternative strategies and rely on others for support.

+
    +
  • Impulse Intensity: Mild, occasional shaking of the hands, arms, or other extremities, particularly during times of stress or fatigue. The tremors may be noticeable but do not significantly interfere with daily tasks.

    +
      +
    • Example (Impulse Intensity): Apothecary Roland notices his hands shaking slightly when he is tired or anxious, making it difficult to measure out precise doses of herbs. Though he can still perform his work, he must take extra care to steady his hands.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Persistent and more pronounced shaking that significantly interferes with daily activities. The individual may struggle with basic tasks such as eating, writing, or holding objects, leading to frustration and a reliance on others for assistance.

    +
      +
    • Physical Symptoms: Continuous or frequent rhythmic shaking of the limbs, particularly the hands, arms, or legs. The tremors may worsen with stress, fatigue, or intentional movement, making it difficult to perform precise tasks.
    • +
    • Intrusive Thoughts: Fear of losing the ability to control the tremors, anxiety about performing tasks in public, and concerns about being perceived as weak or incapable. The individual may constantly worry about their condition worsening and the impact it will have on their independence.
    • +
    • Emotional Distress: Deep frustration, embarrassment, and sadness due to the inability to control the shaking. The individual may avoid social situations or activities that highlight their tremors, leading to feelings of isolation and helplessness.
    • +
    • Example (Disorder Intensity): Scholar Beatrice’s hands tremble uncontrollably, making it nearly impossible for her to write or handle delicate objects. The constant shaking fills her with despair, as she struggles to maintain the precision required for her work. The fear of dropping something valuable or being unable to perform her duties weighs heavily on her mind, causing her to withdraw from her studies and seek solace in solitude.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Limb Weakness + abbrev: limbweakness + id: jhxymB5bu2gZzdMB + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Limb Weakness is a condition characterized by a partial loss of strength or control in one or more limbs. This weakness can make it difficult to perform everyday tasks and may cause a sense of heaviness or fatigue in the affected limb. Those afflicted must rely on rest, physical therapy, and adaptive strategies to manage their symptoms.

+
    +
  • Impulse Intensity: Noticeable weakness in the affected limb(s), leading to difficulty with tasks that require strength or dexterity, such as lifting objects, walking, or gripping. The individual may experience fatigue in the limb more quickly than usual.

    +
      +
    • Example (Impulse Intensity): Carpenter Geraint finds that his right arm tires quickly while working with his tools. The once simple task of hammering nails now leaves his arm trembling and weak, forcing him to take frequent breaks to recover.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: Significant weakness that severely limits the use of the affected limb(s), making it difficult to perform even basic tasks. The individual may struggle with walking, lifting, or holding objects, leading to a reliance on others for assistance.

    +
      +
    • Physical Symptoms: Partial loss of movement or strength in the limb, muscle fatigue, and difficulty coordinating movements. The affected limb may feel heavy, unresponsive, or prone to shaking under strain.
    • +
    • Intrusive Thoughts: Anxiety about losing further strength, fears of becoming fully paralyzed, and concerns about becoming dependent on others for daily tasks. The individual may worry constantly about worsening symptoms and the impact on their livelihood and independence.
    • +
    • Emotional Distress: Frustration, helplessness, and sadness due to the inability to perform tasks that once came easily. The individual may withdraw from activities they once enjoyed, feeling isolated and fearful of their growing weakness.
    • +
    • Example (Disorder Intensity): Lady Eleanor’s left leg has become so weak that she struggles to walk without assistance. Each step feels like a monumental effort, and she often stumbles, fearing that one day she may not be able to rise again. The fear of losing her mobility haunts her, leading her to retreat to her chambers, where she spends her days worrying about the future and mourning the loss of her independence.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Morbus Monstruosus + abbrev: morbusmonstruosus + id: G5OOEQEYspmSg33B + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Morbus Monstruosus is a condition marked by the presence of numerous or large neurofibromas, benign tumors that grow from nerve tissue and typically appear as soft lumps on or under the skin. These tumors can grow large and multiply, significantly altering a person's physical appearance, leading to disfigurement. Beyond the aesthetic impact, these tumors may cause discomfort, pain, and interfere with normal bodily functions. The condition often results in social stigma, psychological distress, and physical limitations.

+
    +
  • Impulse Intensity: The early stages of Morbus Monstruosus are characterized by the appearance of a few small neurofibromas, which may cause mild discomfort or irritation but do not severely impact the individual’s appearance. Though noticeable, the condition may not yet lead to significant social or psychological consequences.

    +
      +
    • Example (Impulse Intensity): Villager Tomas notices several small, soft lumps forming on his arms and neck. Though they are painless, they attract occasional stares from others in the village. Tomas begins to feel self-conscious, but he continues his work and interactions, hoping the condition won’t worsen.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: The neurofibromas grow larger and multiply, leading to visible disfigurement that alters the person’s physical appearance. This advanced stage of Morbus Monstruosus causes significant social isolation as others may react with fear, avoidance, or cruelty. The individual may experience physical pain, discomfort, and difficulty performing tasks due to the size and location of the tumors, requiring ongoing assistance from family or the community.

    +
      +
    • Physical Symptoms: Multiple large neurofibromas covering significant portions of the body, causing disfigurement, discomfort, pain, and interference with normal bodily functions. The condition may also limit mobility or dexterity if the tumors develop near joints or muscles.
    • +
    • Intrusive Thoughts: Anxiety about being shunned or judged by others, fear of further disfigurement, and constant worry about the physical progression of the condition. The individual may also be preoccupied with concerns about becoming a burden to others due to their need for care.
    • +
    • Emotional Distress: Profound feelings of isolation, depression, and frustration due to the social stigma attached to their altered appearance. The individual may feel rejected by their community and struggle with their self-image, leading to withdrawal from social interactions and increasing reliance on family members or close friends for emotional and physical support.
    • +
    • Example (Disorder Intensity): Villager Rurik’s once strong frame is now covered in large neurofibromas that distort his features and make even simple tasks difficult. The villagers keep their distance, whispering behind his back and avoiding him out of fear. The physical pain and discomfort of the tumors, combined with the loneliness of being shunned, weigh heavily on Rurik, and he retreats into isolation, relying solely on his sister’s care and companionship.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Dysphonia + abbrev: dysphonia + id: OWU8K9FtiXQZHEIU + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Dysphonia is a condition characterized by difficulty or abnormality in vocal production, often manifesting as hoarseness, a weak voice, or trouble speaking. If left untreated, it can progressively worsen, leading to complete voice loss (aphonia). Dysphonia can be caused by vocal cord strain, injury, or underlying conditions that affect the vocal cords or nervous system.

+
    +
  • Impulse Intensity: Initial symptoms include a hoarse or weakened voice, difficulty speaking loudly, or temporary loss of voice after extended use. These symptoms may fluctuate, and with rest, the voice might return to normal temporarily.

    +
      +
    • Example (Impulse Intensity): Bard Eirik begins to notice his voice growing weaker during long performances. After singing for just a short time, his voice cracks and fades, forcing him to pause frequently, though he can still carry on conversations once rested.
    • +
    +
  • +
  • Disorder Intensity: In addition to impulse intensity behaviors: The condition worsens over time, with the individual experiencing frequent or persistent voice loss, making communication increasingly difficult. Attempts to speak may result in strained or inaudible sounds, causing frustration and leading to social withdrawal.

    +
      +
    • Physical Symptoms: Persistent hoarseness, vocal fatigue, weak or breathy voice, and episodes of complete voice loss. Speaking becomes physically taxing, and the person may feel tightness or discomfort in the throat.
    • +
    • Intrusive Thoughts: Anxiety about the voice deteriorating further, constant worry about how to communicate effectively, and fear of becoming completely mute. The individual may feel obsessed with trying to prevent the worsening of the condition.
    • +
    • Emotional Distress: Frustration, sadness, and isolation due to the inability to speak clearly. The individual may avoid social situations, feeling self-conscious about their voice and fearing judgment or misunderstanding from others.
    • +
    • Example (Disorder Intensity): Town elder Margot’s voice has weakened to the point where she can barely be heard. Her speech is strained and breaks often, causing her to retreat from public meetings and avoid giving advice. The constant worry that she may never regain her voice has left her feeling helpless, fearing she may soon lose the ability to communicate entirely.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Muteness + abbrev: muteness + id: Wom0wSGya4jJgDCg + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Muteness is the complete inability to speak, either due to physical, neurological, or psychological factors. Individuals with muteness are unable to produce verbal speech and must rely entirely on alternative methods of communication, such as gestures, written language, or sign language. The loss of speech can lead to profound social isolation, frustration, and emotional distress.

+
    +
  • Disorder Intensity: The total loss of speech, where the individual is unable to produce any sounds or words, significantly impairing communication. This condition can lead to reliance on non-verbal forms of expression and may cause the individual to feel disconnected from others and socially isolated.
      +
    • Physical Symptoms: Inability to produce vocal sounds, whether due to damage to the vocal cords, nerves, or brain. There may be associated conditions such as facial muscle weakness or difficulty with breathing and swallowing in some cases.
    • +
    • Intrusive Thoughts: Constant fears about being misunderstood or ignored, anxiety about losing the ability to convey important information or emotions, and worries about being perceived as incompetent or disconnected due to the inability to speak.
    • +
    • Emotional Distress: Deep feelings of frustration, helplessness, and loneliness stemming from the inability to communicate verbally. The individual may withdraw from social interactions, feeling isolated and misunderstood, leading to sadness or depression.
    • +
    • Example (Disorder Intensity): Once a vibrant storyteller, Willem is now completely mute. Unable to speak, he finds himself relying on gestures and written notes to communicate. The once warm conversations he shared with his fellow villagers have become brief and awkward, leaving him feeling alone in the crowd. His inability to express his thoughts and emotions weighs heavily on him, causing a deep sense of isolation and frustration.
    • +
    +
  • +
+ intensity: disorder + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Numbness + abbrev: numbness + id: uS8Ez3pbC9PGWShF + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Numbness is a condition where the sense of touch is partially or completely diminished. It can range from reduced sensitivity to a total loss of tactile sensation. As numbness progresses, it can interfere with daily activities, lead to injury due to the lack of sensory feedback, and cause significant emotional and physical distress.

+
    +
  • Impulse Intensity: Noticeable reduction in the ability to feel pressure, temperature, or texture, with increased difficulty performing tasks that require fine motor skills. The individual may misjudge the force or sensitivity needed to handle objects, leading to occasional accidents or clumsiness. Though touch is not fully lost, the impairment is significant and begins to interfere with daily life.

    +
      +
    • Example (Impulse Intensity): Farmer Lydia struggles to feel the tools in her hands as she works, often misjudging her grip or applying too much pressure. Her hands feel distant and dull, and she has accidentally dropped her tools multiple times. Though she can still feel large objects, the fine sensation she once relied on is almost gone.
    • +
    +
  • +
  • Disorder Intensity: The complete loss of the sense of touch, where the individual can no longer feel pressure, temperature, or texture in the affected areas. This condition makes even the simplest tasks nearly impossible, as the individual cannot detect tactile feedback and is at high risk of injury.

    +
      +
    • Physical Symptoms: Total loss of tactile sensation in the affected areas, making it impossible to feel any form of touch, including pain, heat, or cold. This can lead to accidental injuries like burns or cuts, as the individual is unable to detect harmful stimuli.
    • +
    • Intrusive Thoughts: Fear of the inability to sense danger or react to physical threats, anxiety over the loss of bodily awareness, and worries about relying on others for basic tasks.
    • +
    • Emotional Distress: Intense feelings of helplessness, frustration, and isolation due to the inability to perform even the most basic tasks without assistance. The individual may withdraw from social activities, fearing accidents or appearing incapable.
    • +
    • Example (Disorder Intensity): Blacksmith Willem can no longer feel the heat of the forge or the tools in his hands. His complete loss of touch makes his work impossible, as he is unable to judge the pressure needed to shape metal or detect if something is too hot to handle. The constant risk of injury leaves him anxious, and he relies heavily on others for assistance, feeling frustrated and isolated.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Scoliosis + abbrev: scoliosis + id: yzhCnjJtsjCSXq8S + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Scoliosis is a condition where the spine curves abnormally to the side, often forming an "S" or "C" shape. This spinal curvature can cause physical discomfort, visible deformity, and, in severe cases, complications with movement, posture, and even breathing. Individuals with scoliosis must manage the condition through physical adaptation and assistance from others.

+
    +
  • Impulse Intensity: Mild to moderate curvature of the spine, resulting in a visible asymmetry of the shoulders, hips, or back. The individual may experience occasional discomfort, muscle strain, or stiffness, but can still perform most tasks with minimal difficulty.

    +
      +
    • Example (Impulse Intensity): Apprentice mason Aldred notices his back aching after long hours of work. His shoulders appear slightly uneven, but the discomfort is manageable with rest and stretching. Though his posture is not perfect, he continues to work efficiently, compensating for the mild curve in his spine.
    • +
    +
  • +
  • Disorder Intensity: The spinal curvature becomes more pronounced, leading to significant physical limitations and visible deformity. The individual may struggle with mobility, posture, and balance, experiencing chronic pain and stiffness. Severe cases can affect lung function and overall movement.

    +
      +
    • Physical Symptoms: A visibly curved spine, uneven shoulders and hips, chronic back pain, stiffness, difficulty standing for long periods, and restricted movement. In severe cases, the rib cage may press against the lungs, making breathing difficult.
    • +
    • Intrusive Thoughts: Anxiety about worsening deformity, fear of losing the ability to move freely, and concerns about social judgment or isolation due to the visible nature of the condition.
    • +
    • Emotional Distress: Frustration, embarrassment, and sadness over the visible changes to their body and the physical limitations scoliosis imposes. The individual may withdraw from social activities due to the discomfort and self-consciousness about their appearance.
    • +
    • Example (Disorder Intensity): Lady Eleanor’s once graceful posture is now severely altered by scoliosis. Her spine curves sharply, causing her constant pain and making it difficult to walk or stand for long periods. The visible deformity draws unwanted attention, and she retreats from social gatherings, fearing judgment and struggling to cope with her limited mobility.
    • +
    +
  • +
+ intensity: disorder + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Area Armor Value + abbrev: aav + id: w3lRgPqayEY7oH9Y + img: systems/sohl/assets/icons/armor.svg + subType: physique + description: "" + intensity: trait + skillBaseFormula: "" + textValue: 0 + max: 0 + isNumeric: true + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Albinism + abbrev: albinism + id: J06diTBIzK1ml5lC + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Albinism is a genetic condition characterized by a lack of pigment in the skin, hair, and eyes, leading to pale features and increased sensitivity to sunlight.

+

Example: A child born with pale skin and white hair, feared by superstitious villagers who believe his appearance is a sign of otherworldly influence or divine punishment.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Arthritis + abbrev: arthritis + id: yKKuUXl5wmxFp2d0 + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Arthritis is a condition that causes inflammation and stiffness in the joints, leading to pain, swelling, and decreased mobility. It can affect one or more joints, making daily tasks difficult and often worsening over time. Individuals with arthritis must rely on rest, herbal remedies, and lifestyle adjustments to manage their symptoms and maintain their quality of life.

+
    +
  • Impulse Intensity: Mild to moderate joint pain, stiffness, and swelling, particularly after periods of rest or during cold weather. The individual may experience discomfort when moving or using the affected joints but can still perform most tasks with some difficulty.

    +
      +
    • Example (Impulse Intensity): Potter Miriam finds her fingers aching and stiff when shaping clay early in the morning. After some stretching and warming of her hands, she can resume her work, though the pain lingers throughout the day, slowing her progress.
    • +
    +
  • +
  • Disorder Intensity: The joint inflammation becomes severe, causing chronic pain, significant stiffness, and noticeable swelling. The individual may struggle with basic tasks, such as walking, gripping objects, or lifting items, and their mobility may become limited.

    +
      +
    • Physical Symptoms: Persistent joint pain, swelling, stiffness, and reduced range of motion in the affected joints. The joints may feel warm or tender to the touch, and deformities may develop in advanced cases, affecting the individual’s posture or gait.
    • +
    • Intrusive Thoughts: Constant worries about worsening pain, fear of losing mobility or independence, and anxiety over becoming dependent on others for daily tasks.
    • +
    • Emotional Distress: Frustration, helplessness, and sadness from the inability to perform routine activities without pain. The individual may experience isolation due to reduced mobility and withdraw from social interactions or physical activities they once enjoyed.
    • +
    • Example (Disorder Intensity): Elder Gregory’s knees have become so swollen and painful that he can no longer walk without assistance. Each step sends a jolt of pain through his body, and his once sturdy hands now struggle to grip even the lightest tools. The constant pain and limitations leave Gregory feeling frustrated and dependent on his family for help, leading him to withdraw from the activities he once loved.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Area Attack Shock + abbrev: ashk + id: H78E1z3phcjqmNfT + img: systems/sohl/assets/icons/shock.svg + subType: physique + description: "" + intensity: trait + skillBaseFormula: "" + textValue: 6 + max: 0 + isNumeric: true + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Neurofibromatosis + abbrev: neurofibromatosis + id: rzd8p7q9F7zD8M8F + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Neurofibromatosis is a genetic disorder that causes tumors, known as neurofibromas, to grow along nerves, affecting various parts of the body, including the skin, bones, and nervous system. These tumors, though typically benign, can lead to visible deformities, chronic pain, and significant neurological complications. The visible nature of the tumors often leads to social stigmatization and emotional distress as the individual contends with both physical and social challenges.

+
    +
  • Impulse Intensity: The condition begins with the appearance of café-au-lait spots and small, visible neurofibromas, typically causing no pain but raising concerns about appearance and future health issues. While still in the early stages, the visibility of these spots and lumps can lead to social discomfort, with others noticing and reacting to the unusual markings.

    +
      +
    • Example (Impulse Intensity): Matthew has developed several café-au-lait spots on his arms and back, as well as small neurofibromas that are starting to become noticeable. Though the condition causes him no physical discomfort yet, the curious and sometimes uneasy glances from others in the village make him feel self-conscious. He begins wearing long sleeves even in warm weather to hide the marks.
    • +
    +
  • +
  • Disorder Intensity: As the condition worsens, neurofibromas grow larger and more numerous, often disfiguring the skin, face, and limbs. These visible tumors can cause severe social stigma, with the individual facing discrimination, avoidance, or even fear from others. Physical pain and neurological issues such as muscle weakness or numbness add to the difficulties, but the psychological toll of being visibly "different" can be even more damaging. Social isolation, anxiety, and depression often accompany the physical progression of the disease.

    +
      +
    • Physical Symptoms: Large, disfiguring neurofibromas on the skin and deeper within the body, often growing in highly visible areas like the face, neck, and limbs. These tumors can lead to chronic pain, deformities, loss of muscle function, numbness, and in severe cases, vision and hearing impairments. Scoliosis or other bone abnormalities may also develop.
    • +
    • Intrusive Thoughts: Constant fear of being judged or ostracized due to the visible nature of the tumors, anxiety about worsening deformities, and a pervasive sense of dread over the potential for physical deterioration. Worries about becoming socially isolated or unable to find acceptance are common.
    • +
    • Emotional Distress: Deep frustration, sadness, and helplessness due to the visible disfigurement and the reaction from others. The individual may feel socially rejected, and fear of judgment can lead to withdrawal from social activities. Depression and anxiety are common as the individual struggles to cope with the visible, painful, and progressive nature of the disease.
    • +
    • Example (Disorder Intensity): By his teenage years, Matthew’s neurofibromas have grown significantly, covering large parts of his face and neck, drawing stares and whispers wherever he goes. Even old friends have started to avoid him, and strangers sometimes react with visible discomfort or fear. The disfigurement makes Matthew anxious to be seen in public, and the pain from the growing tumors makes it difficult to go about daily life. He has become withdrawn, no longer attending social events or even leaving his home without his family’s encouragement, consumed by feelings of isolation and self-consciousness.
    • +
    +
  • +
+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Carrying Capacity + abbrev: cap + id: 0FO8plqmytFaDEqx + img: systems/sohl/assets/icons/carrying-sack.svg + subType: physique + description: "" + intensity: trait + skillBaseFormula: "" + textValue: 50 + max: 75 + isNumeric: true + valueDesc: [] + choices: {} + flags: {} + macros: + - name: Process Siblings + type: script + _id: g67nIylRbiwsHvo7 + scope: global + command: |- + this.processSiblings(); + const gw = this.actor.system.$gearWeight; + gw.maxFight.setBase(this.$score.base); + gw.max.setBase(this.max); + flags: + sohl: + notes: "" + functionName: processSiblings + contextLabel: "" + contextIconClass: "" + contextCondition: "" + contextGroup: aaa + useAsync: false + folderId: CAUS3HGrmqiL6vfB +- name: Cauliflower Ear + abbrev: cauliflowerear + id: ZtFNokw8XgpFWSTX + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Cauliflower ear is a condition where the ear becomes deformed due to repeated trauma, often seen in wrestlers or fighters. The ear swells and hardens, taking on a lumpy appearance.

+

Example: A seasoned warrior whose ears are thick and misshapen from years of combat, serving as a visible reminder of the many battles he has fought.

+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Clubfoot + abbrev: clubfoot + id: 6DW7bb3RhPVzbCda + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Clubfoot is a congenital deformity where one or both feet are twisted out of shape or position, making it difficult to walk. It can be corrected with treatment, but without intervention, it can cause lifelong disability.

+

Example: A child born with his foot twisted inward, struggling to walk and facing ridicule from others in the village, with few options for treatment beyond rudimentary attempts at straightening the limb.

+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Cold Intolerance + abbrev: coldintolerance + id: EoBGpKNpDH2D5zF5 + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Cold intolerance is a condition where an individual is unusually sensitive to cold temperatures, reacting more severely than others when exposed to cooler environments. While most people feel uncomfortable in cold weather, individuals with cold intolerance experience much greater physical discomfort and may find it difficult to tolerate even mild cold. This heightened sensitivity can affect daily life, leading the person to take extra precautions to avoid cold environments and social activities. Though not life-threatening, cold intolerance can cause significant emotional and physical distress as it worsens.

+
    +
  • Benign Trait: The individual feels uncomfortable in cool or cold weather more quickly than others. They may experience mild shivering, cold extremities (hands, feet, nose, and ears), and prefer to stay in warmer areas. While the cold is bothersome, it does not interfere significantly with daily tasks, and they can function normally by wearing extra layers or staying close to heat sources. This discomfort is minor and easily managed.

    +
      +
    • Example (Benign Trait): Ingrid, a village seamstress, notices that her fingers and toes get cold very quickly when she steps outside during winter. She shivers more than her friends when they go to the market, but after wrapping herself in extra wool and drinking hot tea, she feels fine. While the cold is unpleasant, it doesn’t stop her from working or going about her day, though she does prefer to stay close to the fire.
    • +
    +
  • +
  • Impulse Intensity (Discomfort and Physical Strain): The individual's cold intolerance becomes more pronounced, leading to more persistent and uncomfortable symptoms, such as intense shivering, numbness, and aching in the extremities. They may find it harder to stay warm, even with several layers of clothing, and the cold begins to interfere with their ability to focus or work. The individual starts avoiding outdoor activities in colder months, as they find the discomfort more difficult to bear. Their sensitivity to cold begins to cause frustration and anxiety, as they worry about how to handle even mild exposure.

    +
      +
    • Example (Impulse Intensity): Ingrid’s sensitivity to the cold has worsened, and now even a brief trip outside makes her hands and feet ache and go numb. She wears thick woolen layers, but they barely keep the cold at bay. Ingrid finds it difficult to concentrate on sewing when her fingers feel stiff and frozen, and she dreads leaving her house on cold days. She avoids village fairs or winter gatherings because the cold air leaves her exhausted and miserable, and no amount of blankets or hot drinks seem to warm her.
    • +
    +
  • +
  • Disorder Intensity (Severe Physical and Emotional Distress): At this extreme level, cold intolerance causes intense discomfort even in mildly cool environments. The individual experiences constant shivering, numbness, and pain in their extremities whenever exposed to cold, even for short periods. They become increasingly distressed, emotionally and mentally, by the cold, and may develop anxiety or depression from their inability to cope with even normal seasonal changes. Social isolation becomes common as the person withdraws from any activities that require being outside in colder weather, leaving them feeling trapped and helpless by their sensitivity to cold temperatures.

    +
      +
    • Physical Symptoms: The individual experiences constant, intense shivering, numbness, and sharp pain in the fingers, toes, ears, and nose. Even indoors, they may struggle to stay warm without being close to a fire or heat source, and their extremities often feel cold to the touch.

      +
    • +
    • Intrusive Thoughts: Persistent worry about exposure to cold, with obsessive thoughts about avoiding any outdoor activity. The individual may spend a significant amount of time thinking about how to stay warm and plan their day around cold avoidance.

      +
    • +
    • Emotional Distress: The individual may feel frustrated, anxious, or depressed due to their inability to tolerate the cold. They may avoid social gatherings or work that requires exposure to cooler temperatures, leading to feelings of isolation and helplessness.

      +
    • +
    • Example (Disorder Intensity): Ingrid’s cold intolerance has reached a point where she can hardly function in winter. Even with multiple layers of clothing, her hands and feet feel numb and painful after only a few minutes outside. She no longer goes to the market or visits friends, choosing instead to stay indoors, wrapped in blankets by the fire. Ingrid feels increasingly isolated, as the cold weather has made it impossible for her to enjoy life the way she once did. She becomes anxious whenever the temperature drops, and the constant battle to stay warm has left her physically drained and emotionally fragile.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Dwarfism + abbrev: dwarfism + id: J0u1FakZedt5mCfo + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Dwarfism is a medical condition characterized by significantly shorter stature and disproportionate body growth, often caused by genetic factors or growth hormone deficiencies. Individuals with dwarfism tend to be much shorter than average, which can lead to physical limitations such as joint pain, mobility issues, or difficulties with daily tasks in environments designed for taller people. Despite these challenges, people with dwarfism often lead fulfilling lives and can excel in areas where intellect, creativity, and skill are more important than physical size. In certain societies, individuals with dwarfism may face social isolation or be treated as curiosities, while in others, they are fully integrated and respected for their talents.

+

People with dwarfism may find it challenging to fit into a world designed for average height individuals, both physically and socially. While their stature can lead to practical difficulties, it also fosters creativity, adaptability, and a unique perspective. However, social discrimination or misunderstanding can add emotional challenges to the condition.

+
    +
  • Benefits:

    +
      +
    • Unique physical appearance, which can draw attention and provide opportunities, particularly in roles such as storytelling, entertainment, or craftsmanship.
    • +
    • Enhanced creativity and problem-solving skills, as they adapt to a world designed for taller people, finding alternative ways to navigate their environment.
    • +
    • In some cultures, individuals with dwarfism may be seen as possessing special qualities or wisdom, giving them elevated social status or unique roles.
    • +
    +
  • +
  • Drawbacks:

    +
      +
    • Physical discomfort such as joint pain, back pain, and limited mobility, often due to the disproportionate growth of limbs or joints.
    • +
    • Difficulty using or accessing everyday tools, furniture, or environments designed for taller individuals, which can lead to a reliance on modifications or assistance.
    • +
    • Social isolation, as their small stature sets them apart from the majority, sometimes leading to discrimination, mockery, or exclusion.
    • +
    • Emotional challenges stemming from being viewed as a curiosity or underestimated due to their height, which may affect self-esteem.
    • +
    +
  • +
+

Example: Halric, the court bard, is known throughout the kingdom for his wit, charm, and mastery of song. His voice fills the great hall, captivating audiences with tales of valor and romance. Though Halric's small stature due to dwarfism makes him stand out, his talent has earned him the favor of the court. However, his height also subjects him to quiet whispers and occasional stares, as many see him more as a curiosity than an equal. The furniture in the castle is built for taller individuals, so Halric often has to climb into chairs or use a special stool to perform on stage. While admired for his artistry, he feels isolated at times, as his size and appearance keep him at a distance from others, who tend to see him as something of an oddity rather than as a fellow courtier. Despite the applause and praise, Halric struggles with the weight of being seen as different, longing for the day when his skills will be the only thing people notice.

+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Eczema + abbrev: eczema + id: MxoRrAp1mt03VvAM + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Eczema (also known as atopic dermatitis) is a chronic skin condition characterized by inflammation, itching, dryness, and redness. It can flare up periodically, often triggered by environmental factors such as allergens, stress, or irritants. While the condition can be mild and manageable, in more severe cases, eczema can cause intense discomfort and lead to complications, including infections or significant impacts on daily life and emotional well-being.

+
    +
  • Benign Trait: The individual experiences mild itching and dryness, typically in localized areas like the hands, elbows, or face. The condition is noticeable but manageable with basic care, such as applying moisturizing creams or avoiding known irritants. Though the skin may occasionally become red or flaky, it does not cause significant discomfort or interfere with daily activities. The individual may find it mildly irritating but easily tolerable.

    +
      +
    • Example (Benign Trait): Lydia, a farm worker, notices occasional patches of dry, itchy skin on her hands after long days working outdoors. The skin becomes a bit red and flaky, but after applying a simple herbal salve from the village healer, the irritation subsides. While it’s a mild inconvenience, Lydia hardly thinks about it and continues her daily tasks with ease.
    • +
    +
  • +
  • Impulse Intensity (Persistent Itching and Flare-ups): The eczema begins to worsen, with flare-ups occurring more frequently and covering larger areas of the skin. The itching becomes more intense and persistent, leading the individual to scratch, which further irritates the skin. The skin may become cracked, blistered, or infected due to constant scratching. The condition starts to interfere with daily life, causing discomfort during work or social situations. Despite efforts to manage the symptoms with remedies, flare-ups continue to occur, and the individual may start feeling self-conscious about the appearance of their skin.

    +
      +
    • Example (Impulse Intensity): Lydia’s eczema now flares up regularly, particularly after long hours spent in the sun or handling rough materials. Her hands and arms are constantly itchy, and despite trying not to, she often scratches them, leading to cracked and sore skin. The herbal salve provides only temporary relief, and the red, inflamed patches of skin make Lydia feel embarrassed when she’s around others. She starts wearing long sleeves, even in the heat, to hide the marks on her skin and finds herself distracted by the itching during conversations or while working.
    • +
    +
  • +
  • Disorder Intensity (Severe Inflammation and Disruption of Life): At this stage, the eczema is severe, causing constant itching, pain, and inflammation across significant portions of the skin. The individual may develop open sores, bleeding, or secondary infections from scratching. The discomfort is unbearable, making it difficult to sleep, focus, or participate in daily activities. The visible appearance of the skin may lead to social withdrawal due to embarrassment or fear of judgment. The condition becomes a major source of physical and emotional distress, with the individual feeling overwhelmed by the inability to find relief. Their self-esteem may suffer, and the physical toll of the condition could lead to fatigue or depression.

    +
      +
    • Physical Symptoms: Intense, unrelenting itching, cracked and bleeding skin, frequent infections, and significant skin discoloration. The individual may experience extreme fatigue or sleep deprivation due to constant discomfort.

      +
    • +
    • Intrusive Thoughts: Persistent worries about flare-ups, the appearance of the skin, and the fear of infection or worsening symptoms. The individual may feel trapped by the condition, constantly preoccupied with managing or concealing their eczema.

      +
    • +
    • Emotional Distress: Deep feelings of frustration, embarrassment, and self-consciousness. The individual may withdraw from social activities, feeling ashamed or anxious about their skin's appearance. They may experience mood swings, depression, or anxiety related to the chronic nature of the condition.

      +
    • +
    • Example (Disorder Intensity): Lydia’s eczema has now spread across her arms, neck, and face. The itching is constant and agonizing, and no herbal remedies seem to provide relief. She wakes up in the middle of the night, scratching until her skin bleeds, leaving open sores that sometimes become infected. The red, raw patches of skin are impossible to hide, and Lydia feels ashamed to be seen in public. She avoids social gatherings and finds it difficult to concentrate on her work, as the pain and itching consume her thoughts. Despite her best efforts, Lydia feels helpless, trapped in a cycle of discomfort and shame that affects her entire life.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Favored Parts + abbrev: favparts + id: nBEseUj5nUJMDyHU + img: systems/sohl/assets/icons/hands.svg + subType: physique + description: "" + intensity: trait + skillBaseFormula: "" + textValue: Right Arm + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Gigantism + abbrev: gigantism + id: hhT4PkPRmZLK7cfN + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Gigantism is a condition characterized by abnormal and excessive growth due to an overproduction of growth hormone, resulting in a person reaching extraordinary height and size. Those with gigantism possess remarkable physical strength and an imposing presence, often revered in roles that demand power, such as combat or manual labor. However, this great size also brings significant challenges, both physically and socially. While their strength can be an asset, the condition also leads to chronic health issues, such as joint pain, cardiovascular strain, and mobility problems, making daily life difficult.

+

In social situations, individuals with gigantism often find themselves as outsiders. Their imposing stature can set them apart, causing them to be viewed as something more than human—a spectacle or oddity rather than a person. They may struggle to fit into normal societal roles, as their size prevents them from participating fully in many common activities, whether it's fitting into standard-sized chairs, clothing, or buildings designed for average-sized people. The awe, fear, or fascination they inspire often leads to social isolation, with others treating them differently, either avoiding them or only engaging with them because of their size, rather than as equals. The mental and emotional toll of being constantly seen as "other" can weigh heavily on those with gigantism, making it difficult to form close personal relationships.

+
    +
  • Benefits:

    +
      +
    • Great physical strength, making them powerful in combat or manual tasks.
    • +
    • Commanding presence, often inspiring respect or fear, which can be advantageous in leadership roles or confrontational situations.
    • +
    +
  • +
  • Drawbacks:

    +
      +
    • Chronic pain in joints and back due to the strain of supporting their large frame.
    • +
    • Mobility challenges, with difficulty moving quickly or fitting into spaces designed for smaller individuals.
    • +
    • Cardiovascular strain, causing fatigue and increased health risks.
    • +
    • Social isolation, as their size sets them apart, making it difficult to engage in normal activities or interact comfortably with others.
    • +
    • Emotional toll from being viewed as an outsider, treated with fascination or fear rather than as an equal.
    • +
    +
  • +
+

Example: Sir Roland, a knight of immense stature, stands nearly a head taller than even the largest of men. His strength on the battlefield is unmatched, able to wield weapons others can barely lift and intimidate foes with his mere presence. However, outside of combat, Sir Roland feels like a stranger in his own world. In social gatherings, people gaze at him in awe or whisper from a distance, rarely approaching him for conversation. He struggles to sit comfortably in the chairs at the local tavern, and most homes are built too small to accommodate his frame. Children gawk at him as if he were a giant from the tales, and adults speak to him with a reverence that makes him feel less like a man and more like an oddity. Over time, Sir Roland finds himself withdrawing from these gatherings, not because he dislikes people, but because he feels he doesn’t truly belong. Despite his success and strength, Roland is left feeling disconnected from the very society he protects, unable to shake the feeling of being an outsider in a world too small for him.

+ intensity: impulse + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Heat Intolerance + abbrev: heatintolerance + id: 8vdvX2QhwiwVQ0mq + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Heat intolerance is a condition where an individual reacts abnormally to heat, causing them to experience discomfort or difficulty in warm environments. This condition can escalate into more severe forms, such as heat illness and, in extreme cases, heat stroke, which are potentially life-threatening if left untreated. The sensitivity to heat can range from mild discomfort to a severe inability to function in any warm environment. As the intensity of the intolerance increases, so too does the risk of heat-related illnesses.

+
    +
  • Benign Trait: The individual feels uncomfortable and overheated more quickly than others in warm environments. They may sweat more than usual and prefer cooler environments. While the heat causes discomfort, it doesn’t interfere significantly with their ability to function. However, prolonged exposure to heat can still pose risks of heat exhaustion if not managed, leading to fatigue, dizziness, or muscle cramps.

    +
      +
    • Example (Benign Trait): Tomas, a baker, feels hot quickly while working near the ovens and avoids being outdoors during the hottest part of the day. He drinks plenty of water and rests in the shade, preventing any serious issues. However, on particularly warm days, he notices mild headaches and fatigue, early signs of heat illness if not managed carefully.
    • +
    +
  • +
  • Impulse Intensity (Discomfort and Risk of Heat Illness): The individual’s sensitivity to heat becomes more severe, leading to frequent physical discomfort such as heat illness, characterized by excessive sweating, headaches, dizziness, and nausea. The risk of heat exhaustion rises with increased exposure, and they must take extra precautions to prevent overheating, including frequent breaks, hydration, and cooling measures. Heat illness may disrupt daily tasks, and the individual may begin avoiding activities that expose them to warmth, even socially.

    +
      +
    • Example (Impulse Intensity): Tomas’s heat intolerance worsens, and he now experiences heat illness symptoms like nausea and dizziness after short periods of heat exposure. His heavy sweating leaves him dehydrated quickly, and the warmth from his bakery becomes unbearable. On market days, Tomas struggles to stand in the sun for long, feeling weak and lightheaded. If he doesn’t take breaks or drink water regularly, the symptoms of heat illness escalate, and he worries about his health during the warmer months.
    • +
    +
  • +
  • Disorder Intensity (Severe Physical and Emotional Distress, Risk of Heat Stroke): At this extreme stage, heat intolerance is accompanied by constant, severe physical symptoms such as heat illness or, in extreme cases, heat stroke. The body’s ability to cool itself is overwhelmed, leading to overheating. The individual may suffer from heat stroke, a medical emergency that includes symptoms like confusion, rapid heartbeat, cessation of sweating, and possible loss of consciousness. Heat stroke can be life-threatening without immediate medical attention. Social isolation is common, as the person avoids any environment where heat may be present, fearing the onset of debilitating symptoms.

    +
      +
    • Physical Symptoms: Constant excessive sweating, dizziness, and fainting spells in mild heat. Risk of heat stroke with severe symptoms, including confusion, rapid heart rate, loss of consciousness, and lack of sweating. Medical intervention is critical if heat stroke occurs, as it can lead to permanent organ damage or death if untreated.

      +
    • +
    • Intrusive Thoughts: Persistent fear of overheating or heat stroke. The individual obsesses over staying cool, avoiding any situation where heat might be present, and planning their day around the possibility of exposure.

      +
    • +
    • Emotional Distress: Intense anxiety and isolation due to the fear of suffering from heat-related illnesses. Social life and daily activities are severely limited, as the individual becomes housebound or only ventures out at night when temperatures are cooler.

      +
    • +
    • Example (Disorder Intensity): Tomas’s heat intolerance has reached a dangerous level. Even mild heat exposure causes symptoms of heat illness, including profuse sweating, dizziness, and severe nausea. After spending too long in the sun one day, he collapses from heat stroke, his body no longer sweating and his mind confused. His friends rush him indoors, placing him in a bath of cool water until he recovers, but the experience leaves him terrified. Now, Tomas barely leaves his home during the day, only stepping outside when the temperature is at its lowest. His bakery suffers as he avoids working near the ovens, and he becomes increasingly isolated from his community, living in constant fear of another heat stroke episode.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Move + abbrev: mov + id: hoTc5AUcRrxQVp4c + img: systems/sohl/assets/icons/run.svg + subType: physique + description: "" + intensity: trait + skillBaseFormula: "" + textValue: 0 + max: 0 + isNumeric: true + valueDesc: [] + choices: {} + flags: {} + macros: + - name: Process Siblings + type: script + _id: 6sb0lWgldEbCY4Vk + img: icons/svg/dice-target.svg + scope: global + command: |- + this.postProcess(); + Array.from(this.actor.allItems()).forEach((it) => { + if (it.type === "affliction" && it.system.subType === "fatigue") { + this.$masteryLevel.add( + it.name, + it.system.constructor.subTypeAbbreviation[it.system.subType], + -it.system.$level.effective, + ); + }}); + sort: "0" + flags: + sohl: + notes: "" + functionName: processSiblings + contextLabel: "" + contextIconClass: "" + contextCondition: "" + contextGroup: aaa + useAsync: false + folderId: CAUS3HGrmqiL6vfB +- name: Obesity + abbrev: obesity + id: 8ZngpBnkbbMqzSPi + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Obesity is a medical condition characterized by an excessive accumulation of body fat that poses significant health risks. The condition often results from a combination of factors, including genetic predispositions, overconsumption of high-calorie foods, a sedentary lifestyle, and cultural influences. Obesity is associated with an increased risk of various health problems, such as heart disease, diabetes, joint pain, and respiratory issues. The way obesity is perceived varies across cultures—while some view it as a sign of poor health and lack of discipline, others regard it as a symbol of wealth, prosperity, and social status.

+
    +
  • Benign Trait: The individual is noticeably overweight but experiences few immediate health issues. Their body size may be seen as a sign of prosperity or indulgence within their community, with the person taking pride in their ability to afford rich foods. They remain largely functional, though they may notice slight discomfort or fatigue with physical tasks. Their condition is generally accepted by society, and they may even be admired for their appearance.

    +
      +
    • Example (Benign Trait): Aldric, a prosperous merchant, has gained a significant amount of weight due to his luxurious lifestyle. His large size is seen as a reflection of his success, as he can afford to indulge in fine meals daily and avoid the hard labor that others in his village endure. Though he sometimes feels winded after climbing stairs, Aldric is proud of his size, as it sets him apart as someone of wealth and leisure.
    • +
    +
  • +
  • Impulse Intensity (Mobility Issues and Social Perception): The individual begins to experience more noticeable physical limitations due to their weight. They may struggle with stamina, experience joint pain, or find it increasingly difficult to move about freely. In some cultures, they may still be seen as prosperous, but others might begin to view their obesity as a source of concern, noting the physical challenges and potential long-term health risks. The individual may begin to feel self-conscious about their condition, especially if they face stigma or judgment from others.

    +
      +
    • Example (Impulse Intensity): Aldric’s weight has become a growing concern for him. His once-admired size now causes difficulty with basic tasks, such as walking across the marketplace or getting in and out of carriages. Some villagers still admire his wealth, but whispers have started about how his indulgent lifestyle might be costing him his health. Aldric notices that fewer people seek him out for social events, and he feels isolated as his mobility issues worsen. Despite this, he finds it hard to change his habits, as the rich meals and comforts of his life have become part of his identity.
    • +
    +
  • +
  • Disorder Intensity (Severe Health Implications and Social Isolation): At this extreme level, obesity leads to severe health problems such as chronic pain, heart disease, or diabetes. The individual is significantly impaired in their ability to move or carry out daily activities, and they may become isolated due to the physical and social challenges they face. Social stigma becomes more pronounced, and the individual may experience feelings of shame or depression as they struggle with both their health and societal judgment. Despite these challenges, they may feel trapped in a cycle of overeating and inactivity.

    +
      +
    • Physical Symptoms: The individual experiences chronic pain in the joints, difficulty breathing, extreme fatigue, and possibly serious conditions like heart disease or diabetes. These physical symptoms often limit their mobility, contributing to a further decline in health.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about their inability to change their habits, feelings of helplessness, and fear about the future health risks they face. They may feel trapped by their condition and overwhelmed by the societal pressure to change.

      +
    • +
    • Emotional Distress: The individual may suffer from anxiety, depression, or deep feelings of isolation as their body size becomes a source of both personal and public concern. They may withdraw from social life due to stigma or embarrassment.

      +
    • +
    • Example (Disorder Intensity): Aldric’s condition has worsened to the point where he can no longer walk through the village without severe pain in his knees and back. He struggles to breathe after even minor exertion and spends most of his days seated, unable to work or engage with others as he once did. The villagers now speak of him with concern rather than admiration, and some openly pity him. Aldric feels ashamed of his condition but is unable to change his habits, feeling isolated by his physical limitations and the judgment of those around him. His once-proud size has become a burden, both physically and socially.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Photosensitivity + abbrev: photosensitivity + id: KDRTA3a2CY4TtHu6 + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Photosensitivity refers to an abnormal sensitivity to light, typically sunlight, which causes discomfort, pain, or other adverse reactions when exposed to light. Individuals with photosensitivity may experience a range of symptoms, from mild discomfort to severe reactions such as rashes, burning sensations, or even eye pain. In a time with limited medical understanding and treatments, such a condition could be particularly distressing, as people may not understand the cause of their symptoms and have little recourse for relief beyond avoiding sunlight.

+
    +
  • Benign Trait: The individual experiences mild discomfort or sensitivity when exposed to bright light or sunlight. This sensitivity may cause squinting, mild headaches, or slight irritation in the eyes. They find relief by staying in shaded areas, wearing protective clothing, or limiting their time in the sun. The symptoms are manageable, and the individual can continue with daily life as long as they take precautions.

    +
      +
    • Example (Benign Trait): Beatrice, a herbalist, notices her eyes becoming irritated and sore after spending long hours gathering herbs in the bright sun. She squints and occasionally feels a slight headache. To ease the discomfort, Beatrice begins wearing a wide-brimmed hat when working outdoors and seeks shade whenever possible. Though she is aware of her sensitivity to light, it doesn’t interfere too much with her daily routine.
    • +
    +
  • +
  • Impulse Intensity (Increased Sensitivity and Physical Reactions): The sensitivity to light becomes more pronounced, causing more frequent and severe symptoms when exposed to sunlight or bright light. The individual may experience painful burning sensations on the skin, redness, and inflammation after only short periods of exposure. Eyes become more sensitive, leading to intense squinting, watery eyes, and migraines. The individual begins to avoid going outside during the day and must rely on herbal remedies or makeshift protective clothing to mitigate the symptoms, which increasingly interfere with daily life.

    +
      +
    • Example (Impulse Intensity): Beatrice's sensitivity to light worsens, and now even brief exposure to sunlight causes her skin to turn red and inflamed, with painful burning sensations. Her eyes constantly water, and she finds herself retreating indoors before noon to avoid the sun’s intensity. Her work as a herbalist suffers, as she can only gather plants early in the morning or late in the evening. She applies herbal salves to her skin, but the discomfort persists, making it harder for her to maintain her daily routine.
    • +
    +
  • +
  • Disorder Intensity (Severe Sensitivity and Social Withdrawal): At this extreme level, photosensitivity causes debilitating reactions even after minimal exposure to light. The individual may develop painful blisters, severe rashes, and intense eye pain, leading to near-complete avoidance of sunlight. They may become isolated, as they are unable to go outside during the day and must stay in dimly lit environments to avoid discomfort. Social interactions and daily activities are severely limited, and the individual may feel trapped and hopeless as their condition worsens.

    +
      +
    • Physical Symptoms: The individual experiences intense burning sensations, rashes, blisters, or swelling of the skin after exposure to sunlight. They may suffer from migraines, severe eye pain, or vision problems. These symptoms can also be accompanied by fatigue or fever.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts about the inability to escape the pain caused by sunlight, leading to feelings of isolation or helplessness. The individual may dread any exposure to daylight, obsessing over how to avoid light at all costs.

      +
    • +
    • Emotional Distress: The individual feels deep frustration, anxiety, or depression due to their inability to live a normal life. The isolation caused by their condition may lead to emotional withdrawal, as they struggle to connect with others or participate in social activities.

      +
    • +
    • Example (Disorder Intensity): Beatrice’s photosensitivity has become so severe that even a few moments in the sun cause her skin to blister painfully, and her eyes are constantly red and aching. She now spends most of her time indoors, avoiding windows and keeping her home dimly lit. Her work as a herbalist is impossible during the day, and she only ventures out after sunset. Beatrice feels trapped by her condition, unable to visit friends or participate in village life. The once-vibrant herbalist now lives in isolation, her world growing darker as she withdraws further from sunlight and society.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Polydactyly + abbrev: polydactyly + id: vbRKusDAufJ12BfX + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Polydactyly is a congenital condition where a person is born with extra fingers or toes. It can vary in severity and may require surgical intervention, especially if it affects function.

+

Example: A child born with six fingers on each hand, seen by the villagers as a sign of good luck or, conversely, as a mark of the supernatural, depending on local beliefs.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Polyphagia + abbrev: polyphagia + id: 7QDf1eQjNBeWasrV + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Polyphagia is excessive hunger and abnormally large intake of food, often associated with conditions like diabetes or hyperthyroidism. It can lead to weight gain and other health issues if not managed properly.

+

Example: A man who is constantly eating and never seems to be satisfied, puzzling his neighbors and depleting his family�s food stores, causing concern that he may be cursed or afflicted with a strange illness.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Size + abbrev: siz + id: dsxo2zxUpEL1fpte + img: systems/sohl/assets/icons/body-height.svg + subType: physique + description: "" + intensity: trait + skillBaseFormula: "" + textValue: Medium + max: 0 + isNumeric: false + valueDesc: [] + choices: + tiny: Tiny + small: Small + medium: Medium + large: Large + big: Big + huge: Huge + colossal: Colossal + titanic: Titanic + flags: + sohl: + sizes: + tiny: + maxStr: "4" + lbs: "20" + zones: "3" + target: "1" + reachMod: "-2" + spaces: "0.5" + feet: "2" + small: + maxStr: "8" + lbs: "100" + zones: "6" + target: "1" + reachMod: "-1" + spaces: "1" + feet: "4" + medium: + maxStr: "19" + lbs: "400" + zones: "10" + target: "1" + reachMod: "0" + spaces: "1" + feet: "5" + large: + maxStr: "29" + lbs: "800" + zones: "16" + target: "2" + reachMod: "1" + spaces: "1" + feet: "6" + big: + maxStr: "39" + lbs: "1600" + zones: "20" + target: "2" + reachMod: "1" + spaces: "2" + feet: "7" + huge: + maxStr: "49" + lbs: "3200" + zones: "30" + target: "3" + reachMod: "2" + spaces: "2" + feet: "9" + colossal: + maxStr: "59" + lbs: "6400" + zones: "40" + target: "4" + reachMod: "4" + spaces: "2" + feet: "10" + titanic: + maxStr: "69" + lbs: "12800" + zones: "80" + target: "8" + reachMod: "6" + spaces: "3" + feet: "15" + macros: + - name: Setup Virtual Items + type: script + _id: AikqcRquJ15TgCSg + author: 5VOJ7NCf7bEZjieU + img: icons/svg/dice-target.svg + scope: global + command: |- + this.setupVirtualItems(); + const sizes = this.item.getFlag("sohl", "sizes"); + this.$params = sizes?.[this.textValue] || { + maxStr: 19, + lbs: 400, + zones: 10, + target: 1, + reachMod: 0, + spaces: 1, + feet: 5 + }; + folder: null + sort: "0" + ownership: + default: "0" + flags: + sohl: + notes: "" + functionName: setupVirtualItems + contextLabel: "" + contextIconClass: "" + contextCondition: "" + contextGroup: aaa + useAsync: false + folderId: CAUS3HGrmqiL6vfB +- name: Syndactyly + abbrev: syndactyly + id: Nm4Q0Yxe968r39sv + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Syndactyly is a condition where two or more fingers or toes are fused together. It is often corrected with surgery to improve function and appearance.

+

Example: A child born with webbed fingers, seen by some as a sign of aquatic ancestry or a mystical connection, while others view it with superstition and suspicion.

+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Tinnitus + abbrev: tinnitus + id: yqQYjEh31hKODz2z + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Tinnitus is the perception of sound, such as ringing, buzzing, or whistling, in the ears without any external sound source. The condition can be mild, but it often worsens over time, becoming a constant and distracting presence in an individual's life. Tinnitus may result from various causes, including prolonged exposure to loud noises, ear infections, age-related hearing loss, or injuries to the ear or head. In environments with limited medical knowledge and treatments, such as a medieval setting, tinnitus might be misunderstood, leaving individuals to suffer without relief.

+
    +
  • Benign Trait: The individual experiences occasional, mild ringing or buzzing in the ears. These episodes are infrequent and short-lived, causing little to no distress. The person may notice the sound more in quiet environments or at night but can usually ignore it and carry on with daily activities. Basic herbal remedies or rest may help, though no significant treatment is necessary at this stage.

    +
      +
    • Example (Benign Trait): Edgar, a village carpenter, occasionally hears a faint ringing in his ears after long days of hammering and sawing. The sound is most noticeable when he lies down to sleep at night, but it quickly fades and doesn’t disrupt his life. He mentions it to the healer, who advises him to rest and avoid loud noises for a few days. The sound lingers occasionally, but Edgar pays it little mind.
    • +
    +
  • +
  • Impulse Intensity (Persistent Noise and Discomfort): The individual begins experiencing more frequent and persistent ringing or buzzing in the ears, which becomes harder to ignore. The sound may last for hours or even days at a time, interfering with concentration, sleep, and conversations. Herbal remedies and periods of rest provide little to no relief. The constant presence of the noise causes frustration and irritability, as the person struggles to escape the sound. They may also begin to feel socially withdrawn, avoiding loud gatherings or conversations to prevent worsening their condition.

    +
      +
    • Example (Impulse Intensity): Edgar’s tinnitus grows worse over the months. Now the ringing is nearly constant, and it distracts him from his work at the carpentry shop. He has difficulty focusing on conversations and often misses details because of the overwhelming sound in his ears. The village healer provides herbal infusions, but they do little to quiet the noise. Edgar becomes increasingly irritable, snapping at apprentices and customers alike. He begins avoiding the busy marketplace, where the clamor only seems to amplify the incessant ringing in his ears.
    • +
    +
  • +
  • Disorder Intensity (Debilitating Noise and Social Isolation): At this extreme level, tinnitus is constant and severe, causing significant distress and disruption to the individual’s life. The individual may hear loud ringing, buzzing, or even roaring sounds, which dominate their perception and make it difficult to think, sleep, or interact with others. The lack of any effective treatments in a medieval setting leaves the individual feeling hopeless, as no remedy can quiet the sound. This may lead to social isolation, anxiety, depression, and even hallucinations, as the individual struggles to cope with the overwhelming noise in their head. The condition becomes so consuming that it interferes with every aspect of daily life.

    +
      +
    • Physical Symptoms: The individual may experience headaches, fatigue, and sleep disturbances due to the constant noise. They may also suffer from hearing loss, dizziness, or balance issues as the tinnitus worsens.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of despair and frustration as the individual struggles to escape the relentless noise. They may worry that the condition will never improve and that they will be trapped in a world of unending sound.

      +
    • +
    • Emotional Distress: The individual may feel overwhelmed by the noise, experiencing anxiety, irritability, and even bouts of depression. Social interactions become exhausting, and the individual may withdraw from friends and family, feeling unable to cope with the constant auditory assault.

      +
    • +
    • Example (Disorder Intensity): Edgar’s tinnitus has become unbearable. The ringing has grown so loud that it feels as if his head is filled with a constant, piercing hum. He can barely concentrate on his work and often skips meals because the noise makes it impossible to focus on anything else. Conversations are impossible—he hears only the relentless sound in his ears. Edgar’s frustration turns into despair, as the village healer’s remedies fail to help, and he spends more time alone, withdrawing from his work and friends. Sleep is elusive, and Edgar’s once-steady hands now tremble as he struggles to endure the torment of his condition.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Ulcer + abbrev: ulcer + id: z8aijY8GVDsblSbL + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Ulcer refers to an open sore or lesion that develops on the skin or the lining of internal organs, most commonly in the stomach or the intestines. Ulcers are caused by a variety of factors, including infections, prolonged use of certain medications, or excessive stomach acid. When an ulcer forms, it can result in significant discomfort, pain, and other complications depending on its severity and location. Over time, if left untreated, ulcers can lead to further damage, including bleeding, infection, or perforation of the affected tissue.

+
    +
  • Benign Trait: The individual experiences mild discomfort or pain in the affected area, often noticing symptoms such as a burning sensation, indigestion, or minor irritation. The ulcer is small and manageable, and while it causes noticeable symptoms, it doesn't significantly interfere with daily life. Treatment may be simple, with the individual taking care to avoid irritants or stress that could worsen the condition.

    +
      +
    • Example (Benign Trait): Elias, a miller in the village, has started feeling a burning sensation in his stomach after meals. While the discomfort is noticeable, it comes and goes, and he finds that eating smaller portions and drinking herbal tea helps ease the symptoms. He continues his work at the mill without much disruption, simply being mindful of his diet and taking time to rest when the discomfort flares up.
    • +
    +
  • +
  • Impulse Intensity (Moderate Pain and Persistent Symptoms): The ulcer begins to cause more severe pain and becomes a more persistent problem, disrupting the individual's daily life. The burning or gnawing pain may become constant, especially after eating or during the night. The individual may begin avoiding certain foods, activities, or situations that aggravate the symptoms. Despite efforts to manage the condition, the ulcer continues to cause frequent discomfort and requires more focused treatment, possibly including medications to reduce stomach acid or more restrictive lifestyle changes.

    +
      +
    • Example (Impulse Intensity): Elias’s ulcer has worsened, and now the pain strikes him after every meal. He avoids eating rich or spicy foods, knowing they will make the burning in his stomach unbearable. The discomfort often wakes him at night, leaving him fatigued during the day as he struggles to keep up with his work at the mill. He tries remedies from the village healer, but the relief is temporary. Elias becomes increasingly frustrated, feeling as though the ulcer is dictating his daily routine.
    • +
    +
  • +
  • Disorder Intensity (Severe Pain, Complications, and Health Risks): The ulcer has become severe, causing debilitating pain and potentially dangerous complications such as bleeding or perforation of the stomach or intestines. The individual may experience intense, constant pain, vomiting (sometimes with blood), or significant weight loss due to an inability to eat. There is a risk of infection or internal bleeding, and medical intervention becomes critical. The person may be bedridden or incapacitated, unable to work or engage in normal activities due to the overwhelming physical symptoms and likelihood of death.

    +
      +
    • Physical Symptoms: The individual may experience intense, sharp pain in the abdomen, vomiting, weight loss, and weakness. In severe cases, they may vomit blood or notice dark, tarry stools, indicating internal bleeding. Fever and chills may also accompany the condition if infection sets in.

      +
    • +
    • Intrusive Thoughts: Persistent worry about the ulcer worsening or causing serious complications. The individual may feel anxious about eating or fear the pain that comes with food, leading to avoidance of meals and further health decline.

      +
    • +
    • Emotional Distress: The individual feels overwhelmed by the constant pain and the fear of serious health risks. They may become depressed or anxious, feeling unable to manage the condition on their own and worried about potential long-term consequences.

      +
    • +
    • Example (Disorder Intensity): Elias’s ulcer has worsened to the point where he can barely eat without excruciating pain. He frequently vomits, and there have been traces of blood, which leaves him terrified of the worsening state of his health. He feels weak and dizzy, struggling to keep up with the demands of the mill, and spends more time bedridden than working. He grows fearful that death is approaching, as the village healer has done all she can. Friends and family visit less often, afraid of what might befall him, and Elias spends his days in agony, knowing there is no cure beyond the rudimentary treatments available. His strength fades as the ulcer consumes him, leaving him in a state of hopelessness and isolation.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Vitiligo + abbrev: vitiligo + id: wDBb1NDzQ61rm0Bx + img: systems/sohl/assets/icons/user-gear.svg + subType: physique + description: |- +

Vitiligo is a skin condition characterized by the loss of pigment in patches, resulting in irregular white spots on different areas of the body. This occurs when melanocytes, the cells responsible for producing melanin (the pigment that gives skin its color) are destroyed. The affected areas can spread over time, with the extent and rate of color loss varying from person to person. Vitiligo can affect any part of the body, including the skin, hair, and mucous membranes.

+
    +
  • Benign Trait: The individual experiences small, isolated patches of depigmentation on their skin, often in areas exposed to the sun. These patches may not cause physical discomfort, but they can lead to a heightened awareness of their appearance. In mild cases, the depigmentation may be slow to spread or remain limited, and the individual adapts to the condition with little impact on their daily life or self-esteem.

    +
      +
    • Example (Benign Trait): Margery, a young woman living in a small village, notices a few pale spots on her hands and forearms. The patches are small and easy to cover with clothing, and while some of the villagers occasionally ask about her skin, Margery is not overly concerned. She continues with her life, accepting the slight change in her appearance as something she cannot control.
    • +
    +
  • +
  • Impulse Intensity (Growing Self-Consciousness and Social Stigma): The depigmentation begins to spread more noticeably, causing the individual to become more self-conscious about their appearance. The affected areas become larger or more visible, particularly on the face, hands, or other exposed areas. As the changes become more obvious, people in the village begin to whisper and avoid the individual, thinking her condition might be a sign of a curse or illness. Although there are no physical symptoms, the emotional impact increases as the individual feels more ostracized by others and avoids social interactions out of fear of being judged or rejected.

    +
      +
    • Example (Impulse Intensity): Margery's vitiligo spreads to her face, forming visible patches around her eyes and mouth. As the changes become more apparent, villagers begin to whisper behind her back, calling her "marked" and speculating that her skin might be a sign of bad fortune. Some avoid standing near her at the market, fearing her condition could be contagious. Margery becomes increasingly anxious, feeling the weight of their judgment. She withdraws from village gatherings, covering her skin with scarves and long sleeves, even in the heat of summer. The fear of being gossiped about drives her into isolation.
    • +
    +
  • +
  • Disorder Intensity (Severe Emotional Distress, Social Rejection, and Stigma): At this stage, the vitiligo has spread extensively, affecting large areas of the body, including the face, hands, and other highly visible parts. The individual is now heavily stigmatized by the community, with people openly avoiding or shunning them. Whispers of curses, illness, or bad luck grow louder, and the individual is treated as a pariah. The emotional toll becomes overwhelming, with feelings of intense anxiety, shame, and depression. The person withdraws from society, becoming deeply isolated, avoiding public places, and struggling with their sense of self-worth.

    +
      +
    • Physical Symptoms: The individual may not experience physical pain from the condition itself, but the psychological and emotional stress from the stigma and social rejection can lead to physical symptoms such as headaches, nausea, and fatigue.

      +
    • +
    • Intrusive Thoughts: Persistent thoughts of being judged, feared, or hated by others due to their appearance. They may obsess over how to hide their skin or thoughts of being cursed, leading to severe anxiety.

      +
    • +
    • Emotional Distress: The individual feels profound emotional pain, shame, and isolation. They may avoid all public interactions, convinced that they are an outcast or a source of bad fortune. Depression and a sense of hopelessness may set in as they feel completely ostracized from their community.

      +
    • +
    • Example (Disorder Intensity): Margery’s vitiligo has now spread across her arms, face, and neck, leaving large white patches that can no longer be concealed. The villagers no longer simply whisper; they avoid her completely. People cross the street when they see her coming, and children are warned not to approach her. Rumors spread that her skin is a sign of a curse that has brought bad harvests or sickness to the village. Margery, overwhelmed by the stigma, stops leaving her house altogether, feeling like an outcast. Her isolation deepens, and she becomes consumed by despair, wondering if the villagers are right and that her appearance has brought them misfortune. She feels entirely cut off from the life she once knew, trapped in the shadows of her own skin.

      +
    • +
    +
  • +
+ intensity: benign + skillBaseFormula: "" + textValue: "" + max: 0 + isNumeric: false + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Body Weight + abbrev: wt + id: GPJxHDbVcGAnaXZs + img: systems/sohl/assets/icons/weight.svg + subType: physique + description: "" + intensity: trait + skillBaseFormula: "" + textValue: 150 + max: 0 + isNumeric: true + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: CAUS3HGrmqiL6vfB +- name: Aura + abbrev: aur + id: KmwIUCSi0PJ0Wnay + img: systems/sohl/assets/icons/aura.svg + subType: transcendent + description: "" + intensity: attribute + skillBaseFormula: '@aur' + textValue: 0 + max: 0 + isNumeric: true + valueDesc: + - label: Mundane + maxValue: "4" + - label: Shallow + maxValue: "8" + - label: Average + maxValue: "12" + - label: Deep + maxValue: "16" + - label: Profound + maxValue: "999" + choices: {} + flags: + sohl: + diceFormula: 3d6 + macros: [] + folderId: R0pSLJ4ywoJDzlGV +- name: Basic Fate + abbrev: fate + id: fMIbVoGrbAVdfQ1U + img: systems/sohl/assets/icons/user-gear.svg + subType: transcendent + description: "" + intensity: trait + skillBaseFormula: "" + textValue: 50 + max: 0 + isNumeric: true + valueDesc: [] + choices: [] + flags: {} + macros: {} + folderId: z6GcCOGsuwgwN1Ya +- name: Sunsign + abbrev: ss + id: UKZU7cUxdwazKN6l + img: systems/sohl/assets/icons/astrology.svg + subType: transcendent + description: "" + intensity: trait + skillBaseFormula: "" + textValue: ulandus + max: 0 + isNumeric: false + valueDesc: [] + choices: + ulandus: Ùlándus + ulandusaralius: Ùlándus-Arálius + aralius: Arálius + araliusfeneri: Arálius-Fenéri + feneri: Fenéri + feneriahnu: Fenéri-Áhnù + ahnu: Áhnù + ahnuangberelius: Áhnù-Angberélius + angberelius: Angberélius + angbereliusnadai: Angberélius-Nadái + nadai: Nadái + nadaihirin: Nadái-Hîrin + hirin: Hîrin + hirintarael: Hîrin-Táræl + tarael: Táræl + taraeltai: Táræl-Tai + tai: Tai + taiskorus: Tai-Skôrus + skorus: Skôrus + skorusmasara: Skôrus-Masâra + masara: Masâra + masaralado: Masâra-Ládo + lado: Ládo + ladoulandus: Ládo-Ùlándus + flags: + sohl: + legendary: + values: + ulandus: + label: Ùlándus + cusp: false + ssMod: + earth: "15" + metal: "5" + fire: "-5" + air: "-15" + aura: "-5" + water: "5" + ulandusaralius: + label: Ùlándus-Arálius + cusp: true + ssMod: + earth: "15" + metal: "10" + fire: "0" + air: "-10" + aura: "-5" + water: "5" + aralius: + label: Arálius + cusp: false + ssMod: + earth: "10" + metal: "10" + fire: "0" + air: "-10" + aura: "-10" + water: "0" + araliusfeneri: + label: Arálius-Fenéri + cusp: true + ssMod: + earth: "10" + metal: "15" + fire: "5" + air: "-5" + aura: "-10" + water: "0" + feneri: + label: Fenéri + cusp: false + ssMod: + earth: "5" + metal: "15" + fire: "5" + air: "-5" + aura: "-15" + water: "-5" + feneriahnu: + label: Fenéri-Áhnù + cusp: true + ssMod: + earth: "5" + metal: "15" + fire: "10" + air: "0" + aura: "-10" + water: "-5" + ahnu: + label: Áhnù + cusp: false + ssMod: + earth: "0" + metal: "10" + fire: "10" + air: "0" + aura: "-10" + water: "-10" + ahnuangberelius: + label: Áhnù-Angberélius + cusp: true + ssMod: + earth: "0" + metal: "10" + fire: "15" + air: "5" + aura: "-5" + water: "-10" + angberelius: + label: Angberélius + cusp: false + ssMod: + earth: "-5" + metal: "5" + fire: "15" + air: "5" + aura: "-5" + water: "-15" + angbereliusnadai: + label: Angberélius-Nadái + cusp: true + ssMod: + earth: "-5" + metal: "5" + fire: "15" + air: "10" + aura: "0" + water: "-10" + nadai: + label: Nadái + cusp: false + ssMod: + earth: "-10" + metal: "0" + fire: "10" + air: "10" + aura: "0" + water: "-10" + nadaihirin: + label: Nadái-Hîrin + cusp: true + ssMod: + earth: "-10" + metal: "0" + fire: "10" + air: "10" + aura: "0" + water: "-5" + hirin: + label: Hîrin + cusp: false + ssMod: + earth: "-15" + metal: "-5" + fire: "5" + air: "15" + aura: "5" + water: "-5" + hirintarael: + label: Hîrin-Táræl + cusp: true + ssMod: + earth: "-10" + metal: "-5" + fire: "5" + air: "15" + aura: "10" + water: "0" + tarael: + label: Táræl + cusp: false + ssMod: + earth: "-10" + metal: "-10" + fire: "0" + air: "10" + aura: "10" + water: "0" + taraeltai: + label: Táræl-Tai + cusp: true + ssMod: + earth: "-5" + metal: "-10" + fire: "0" + air: "10" + aura: "15" + water: "5" + tai: + label: Tai + cusp: false + ssMod: + earth: "-5" + metal: "-15" + fire: "-5" + air: "5" + aura: "15" + water: "5" + taiskorus: + label: Tai-Skôrus + cusp: true + ssMod: + earth: "0" + metal: "-10" + fire: "-5" + air: "5" + aura: "15" + water: "10" + skorus: + label: Skôrus + cusp: false + ssMod: + earth: "0" + metal: "-10" + fire: "-10" + air: "0" + aura: "10" + water: "10" + skorusmasara: + label: Skôrus-Masâra + cusp: true + ssMod: + earth: "5" + metal: "-5" + fire: "-10" + air: "0" + aura: "10" + water: "15" + masara: + label: Masâra + cusp: false + ssMod: + earth: "5" + metal: "-5" + fire: "-15" + air: "-5" + aura: "5" + water: "15" + masaralado: + label: Masâra-Ládo + cusp: true + ssMod: + earth: "10" + metal: "0" + fire: "-10" + air: "-5" + aura: "5" + water: "15" + lado: + label: Ládo + cusp: false + ssMod: + earth: "10" + metal: "0" + fire: "-10" + air: "-10" + aura: "0" + water: "10" + ladoulandus: + label: Ládo-Ùlándus + cusp: true + ssMod: + earth: "15" + metal: "5" + fire: "-5" + air: "-10" + aura: "0" + water: "10" + macros: + - name: Setup Virtual Items + type: script + _id: PIqhsQx8cNUItQQU + author: 5VOJ7NCf7bEZjieU + img: icons/svg/dice-target.svg + scope: global + command: |- + this.setupVirtualItems(); + const values = this.item.getFlag("sohl", "values"); + this.actor.system.$ssMod = values[this.textValue]; + folder: null + sort: "0" + ownership: + default: "0" + flags: + sohl: + notes: "" + functionName: setupVirtualItems + contextLabel: "" + contextIconClass: "" + contextCondition: "" + contextGroup: aaa + useAsync: false + folderId: z6GcCOGsuwgwN1Ya +- name: Experience Points + abbrev: xp + id: uvWL5n1B5J43uNs6 + img: systems/sohl/assets/icons/beams-aura.svg + subType: transcendent + description: "" + intensity: trait + skillBaseFormula: "" + textValue: 0 + max: 0 + isNumeric: true + valueDesc: [] + choices: {} + flags: {} + macros: [] + folderId: z6GcCOGsuwgwN1Ya diff --git a/packs/generate/legendary/leg-characteristics/generate-leg-characteristics.py b/packs/generate/legendary/leg-characteristics/generate-leg-characteristics.py new file mode 100755 index 0000000..0e07025 --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/generate-leg-characteristics.py @@ -0,0 +1,316 @@ +#!./venv/bin/python3 + +import yaml +import json +import argparse +from unidecode import unidecode +from mergedeep import merge +import re + +parser = argparse.ArgumentParser() +parser.add_argument("outputDir", help="folder where generated files should be placed") +args = parser.parse_args() + +stats = { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M", +} + +with open("./data/traits.yaml", "r", encoding="utf8") as infile: + traitsData = yaml.safe_load(infile) + +for trait in traitsData: + print(f"Processing trait {trait['name']}") + fname = trait["name"] + "_" + trait["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": trait["name"], + "type": "trait", + "img": trait["img"], + "_id": trait["id"], + "system": { + "subType": trait["subType"], + "notes": "", + "textReference": "", + "description": trait["description"], + "macros": trait["macros"], + "nestedItems": [], + "transfer": False, + "abbrev": trait["abbrev"], + "skillBaseFormula": trait["skillBaseFormula"], + "masteryLevelBase": 0, + "improveFlag": False, + "textValue": trait["textValue"], + "isNumeric": trait["isNumeric"] == "TRUE", + "intensity": trait["intensity"], + "max": trait["max"], + "valueDesc": trait["valueDesc"], + "choices": trait["choices"], + }, + "effects": [], + "flags": trait["flags"], + "_stats": stats, + "folder": trait["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + "_key": "!items!" + trait["id"], + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/skills.yaml", "r", encoding="utf8") as infile: + skillsData = yaml.safe_load(infile) + +for skill in skillsData: + print(f"Processing skill {skill['name']}") + fname = skill["name"] + "_" + skill["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + merge( + skill["flags"], + { + "sohl": { + "legendary": { + "initSkillMult": skill["initSM"], + "expertiseParentSkill": skill.get("expertiseParentSkill", ""), + }, + }, + }, + ) + out = { + "name": skill["name"], + "type": "skill", + "img": skill["img"], + "_id": skill["id"], + "system": { + "subType": skill["subType"], + "notes": "", + "textReference": "", + "description": skill["description"], + "macros": skill["macros"], + "nestedItems": [], + "transfer": False, + "abbrev": skill["abbrev"], + "skillBaseFormula": skill["skillBaseFormula"], + "masteryLevelBase": 0, + "improveFlag": False, + "weaponGroup": skill["weaponGroup"], + "domain": skill["domain"], + "baseSkill": skill["baseSkill"], + }, + "effects": skill["effects"], + "flags": skill["flags"], + "_stats": stats, + "folder": skill["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + "_key": "!items!" + skill["id"], + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/combatmaneuvers.yaml", "r", encoding="utf8") as infile: + combatmaneuversData = yaml.safe_load(infile) + +with open("./data/combattechsm.yaml", "r", encoding="utf8") as infile: + combattechniquesmData = yaml.safe_load(infile) + +combatmaneuvers = {} + +for cmbtman in combatmaneuversData: + print(f"Processing Combat Maneuver {cmbtman['name']}") + id = cmbtman["id"] + fname = cmbtman["name"] + "_" + id + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + combatmaneuvers[id] = { + "name": cmbtman["name"], + "type": "combatmaneuver", + "img": cmbtman["img"], + "_id": cmbtman["id"], + "system": { + "notes": "", + "textReference": "", + "description": cmbtman["description"], + "macros": cmbtman["macros"], + "nestedItems": [], + "transfer": True, + "abbrev": cmbtman["abbrev"], + }, + "effects": cmbtman["effects"], + "flags": cmbtman["flags"], + "_stats": stats, + "folder": cmbtman["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + "_key": "!items!" + cmbtman["id"], + } + +for cmbttech in combattechniquesmData: + smname = f"{cmbttech['name']} ({cmbttech['subDesc']})" + print(f"Processing StrikeMode {smname}") + maneuver = combatmaneuvers[cmbttech["combatManeuverId"]] + subdesc = cmbttech["subDesc"] + + merge( + cmbttech["flags"], + { + "sohl": { + "legendary": { + "zoneDie": cmbttech["zoneDie"], + "lengthBase": cmbttech["lengthBase"], + }, + }, + }, + ) + + sm = { + "name": cmbttech["subDesc"], + "type": "combattechniquestrikemode", + "img": cmbttech["img"], + "_id": cmbttech["id"], + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": cmbttech["macros"], + "nestedItems": [], + "transfer": True, + "mode": subdesc, + "minParts": cmbttech["minParts"], + "assocSkillName": cmbttech["assocSkill"], + "impactBase": { + "numDice": 1 if cmbttech["impactDie"] > 0 else 0, + "die": cmbttech["impactDie"], + "modifier": cmbttech["impactMod"], + "aspect": cmbttech["impactAspect"], + }, + }, + "effects": [], + "flags": cmbttech["flags"], + "_stats": stats, + "folder": None, + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + + eid = cmbttech["effectId"] + effect = { + "name": f"{cmbttech['subDesc']} Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": eid, + "disabled": False, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "", + }, + "duration": { + "startTime": None, + "seconds": None, + "combat": None, + "rounds": None, + "turns": None, + "startRound": None, + "startTurn": None, + }, + "origin": "", + "tint": None, + "transfer": False, + "description": "", + "statuses": [], + "_key": "!items.effects!" + sm["_id"] + "." + eid, + } + + sm["effects"].append(effect) + combatmaneuvers[cmbttech["combatManeuverId"]]["system"]["nestedItems"].append(sm) + +for cmid in combatmaneuvers.keys(): + if cmid == None: + continue + fname = combatmaneuvers[cmid]["name"] + "_" + cmid + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + with open(pname, "w", encoding="utf8") as outfile: + json.dump(combatmaneuvers[cmid], outfile, indent=2, ensure_ascii=False) + +with open("./data/afflictions.yaml", "r", encoding="utf8") as infile: + afflictionsData = yaml.safe_load(infile) + +for affliction in afflictionsData: + print(f"Processing Affliction {affliction['name']}") + fname = affliction["name"] + "_" + affliction["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": affliction["name"], + "type": "affliction", + "img": affliction["img"], + "_id": affliction["id"], + "_key": "!items!" + affliction["id"], + "system": { + "subType": affliction["subType"], + "notes": "", + "textReference": "", + "description": affliction["description"], + "macros": affliction["macros"], + "nestedItems": [], + "transfer": False, + "isDormant": False, + "isTreated": False, + "diagnosisBonusBase": affliction["diagnosisBonus"], + "levelBase": affliction["level"], + "healingRateBase": affliction["healingRate"], + "contagionIndexBase": affliction["contagionIndex"], + "transmission": affliction["transmission"], + }, + "effects": affliction["effects"], + "flags": affliction["flags"], + "_stats": stats, + "folder": affliction["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/folders.yaml", "r", encoding="utf8") as infile: + foldersData = yaml.safe_load(infile) + +for folder in foldersData: + print(f"Processing Folder {folder['name']}") + fname = folder["name"] + "_" + folder["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": folder["name"], + "sorting": "a", + "folder": folder["parentFolderId"] or None, + "type": "Item", + "_id": folder["id"], + "sort": 0, + "color": folder["color"], + "flags": {}, + "_stats": stats, + "_key": "!folders!" + folder["id"], + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) diff --git a/packs/generate/legendary/leg-characteristics/generate-legendary-humanoid-body.py b/packs/generate/legendary/leg-characteristics/generate-legendary-humanoid-body.py new file mode 100755 index 0000000..84e385b --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/generate-legendary-humanoid-body.py @@ -0,0 +1,302 @@ +#!./venv/bin/python3 + +import openpyxl +import json; +import random; +import string; +from unidecode import unidecode; +import re; + +anatomy = { + "name": "Humanoid", + "type": "anatomy", + "img": "icons/svg/item-bag.svg", + "system": { + "macros": json.loads(row[MACROS].value), + "notes": "", + "description": row[DESC].value, + "textReference": "", + "transfer": False, + "defaultAim": "", + "weaponLimbs": [ "Left Arm", "Right Arm", "Left Arm, Right Arm" ], + "macros": [] + "nestedItems": [], + }, + "effects": [], + "flags": {}, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.7.2", + "coreVersion": "11.313", + "createdTime": 1684119710177, + "modifiedTime": 1684119710177, + "lastModifiedBy": "nM52Hn9VSW6oonaL" + }, + "_id": "M10pzGVlLgO1zsnh", + "folder": None, + "sort": 0, + "ownership": { + "default": 0, + "nM52Hn9VSW6oonaL": 3 + }, + "_key": "!items!M10pzGVlLgO1zsnh" +} + +templBodyLocation = { + "name": "", + "type": "bodylocation", + "img": "icons/svg/item-bag.svg", + "system": { + "notes": "", + "description": "", + "source": "", + "layers": "", + "quality": 0, + "blunt": { + "base": 0 + }, + "edged": { + "base": 0 + }, + "piercing": { + "base": 0 + }, + "fire": { + "base": 0 + }, + "isFumble": False, + "isStumble": False, + "isRigid": False, + "bleedingSevThreshold": 0, + "amputatePenalty": -1, + "shockValue": 0, + "impactType": "custom", + "location": { + "bodyPart": "", + "probWeight": { + "base": 0 + } + } + }, + "effects": [], + "flags": {}, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.7.2", + "coreVersion": "11.313", + "createdTime": 1684119710177, + "modifiedTime": 1684119710177, + "lastModifiedBy": "nM52Hn9VSW6oonaL" + }, + "_id": "", + "folder": None, + "sort": 0, + "ownership": { + "default": 0, + "nM52Hn9VSW6oonaL": 3 + }, + "_key": "!items!8XMvH9YELdut0Q5o" +} + +templBodyPart = { + "name": "", + "type": "bodypart", + "img": "icons/svg/item-bag.svg", + "system": { + "notes": "", + "description": "", + "source": "", + "abbrev": "", + "zone": "", + "expand": False, + "probWeight": { + "base": 0 + } + }, + "effects": [], + "flags": {}, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.7.2", + "coreVersion": "11.313", + "createdTime": 1684119710177, + "modifiedTime": 1684119710177, + "lastModifiedBy": "nM52Hn9VSW6oonaL" + }, + "_id": "", + "folder": None, + "sort": 0, + "ownership": { + "default": 0, + "nM52Hn9VSW6oonaL": 3 + }, + "_key": "!items!8XMvH9YELdut0Q5o" +} + +templZoneLocation = { + "name": "", + "type": "bodyzone", + "img": "icons/svg/item-bag.svg", + "system": { + "notes": "", + "description": "", + "source": "", + "probWeight": { + "base": 0 + }, + "affectedSkills": [], + "affectedAttributes": [], + "affectsMobility": False + }, + "effects": [], + "flags": {}, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.7.2", + "coreVersion": "11.313", + "createdTime": 1684119710177, + "modifiedTime": 1684119710177, + "lastModifiedBy": "nM52Hn9VSW6oonaL" + }, + "_id": "", + "folder": None, + "sort": 0, + "ownership": { + "default": 0, + "nM52Hn9VSW6oonaL": 3 + }, + "_key": "!items!8XMvH9YELdut0Q5o" +} + +injuryLocations = { + "Custom": { "impactType": "custom", "location": {"probWeight": 50}, "isStumble": False, "isFumble": False, "amputatePenalty": 0, "shockValue": 5, "bleedingSevThreshold": 0, "affectsMobility": False }, + "Skull": { "impactType": "skull", "location": {"probWeight": 50}, "isStumble": False, "isFumble": False, "amputatePenalty": 0, "shockValue": 5, "bleedingSevThreshold": 5, "affectsMobility": True }, + "Face": { "impactType": "face", "location": {"probWeight": 30}, "isStumble": False, "isFumble": False, "amputatePenalty": 0, "shockValue": 4, "bleedingSevThreshold": 4, "affectsMobility": True }, + "Eye": { "impactType": "face", "location": {"probWeight": 30}, "isStumble": False, "isFumble": False, "amputatePenalty": 0, "shockValue": 5, "bleedingSevThreshold": 4, "affectsMobility": True }, + "Nose": { "impactType": "face", "location": {"probWeight": 30}, "isStumble": False, "isFumble": False, "amputatePenalty": 0, "shockValue": 5, "bleedingSevThreshold": 4, "affectsMobility": True }, + "Neck": { "impactType": "neck", "location": {"probWeight": 20}, "isStumble": False, "isFumble": False, "amputatePenalty": -10, "shockValue": 5, "bleedingSevThreshold": 3, "affectsMobility": True }, + "Shoulder": { "impactType": "shoulder", "location": {"probWeight": 15}, "isStumble": False, "isFumble": True, "amputatePenalty": 0, "shockValue": 3, "bleedingSevThreshold": 4, "affectsMobility": False }, + "Upper Arm": { "impactType": "upperarm", "location": {"probWeight": 15}, "isStumble": False, "isFumble": True, "amputatePenalty": -20, "shockValue": 1, "bleedingSevThreshold": 5, "affectsMobility": False }, + "Elbow": { "impactType": "elbow", "location": {"probWeight": 5}, "isStumble": False, "isFumble": True, "amputatePenalty": -20, "shockValue": 2, "bleedingSevThreshold": 5, "affectsMobility": False }, + "Forearm": { "impactType": "forearm", "location": {"probWeight": 10}, "isStumble": False, "isFumble": True, "amputatePenalty": -20, "shockValue": 1, "bleedingSevThreshold": 5, "affectsMobility": False }, + "Hand": { "impactType": "hand", "location": {"probWeight": 5}, "isStumble": False, "isFumble": True, "amputatePenalty": -30, "shockValue": 2, "bleedingSevThreshold": 0, "affectsMobility": False }, + "Thorax": { "impactType": "thorax", "location": {"probWeight": 13}, "isStumble": False, "isFumble": False, "amputatePenalty": 0, "shockValue": 4, "bleedingSevThreshold": 4, "affectsMobility": True }, + "Abdomen": { "impactType": "abdomen", "location": {"probWeight": 13}, "isStumble": False, "isFumble": False, "amputatePenalty": 0, "shockValue": 4, "bleedingSevThreshold": 3, "affectsMobility": True }, + "Pelvis": { "impactType": "pelvis", "location": {"probWeight": 7}, "isStumble": False, "isFumble": False, "amputatePenalty": 0, "shockValue": 4, "bleedingSevThreshold": 4, "affectsMobility": True }, + "Thigh": { "impactType": "thigh", "location": {"probWeight": 20}, "isStumble": True, "isFumble": False, "amputatePenalty": -10, "shockValue": 3, "bleedingSevThreshold": 4, "affectsMobility": True }, + "Knee": { "impactType": "knee", "location": {"probWeight": 5}, "isStumble": True, "isFumble": False, "amputatePenalty": -20, "shockValue": 2, "bleedingSevThreshold": 5, "affectsMobility": True }, + "Calf": { "impactType": "calf", "location": {"probWeight": 15}, "isStumble": True, "isFumble": False, "amputatePenalty": -20, "shockValue": 1, "bleedingSevThreshold": 5, "affectsMobility": True }, + "Foot": { "impactType": "foot", "location": {"probWeight": 10}, "isStumble": True, "isFumble": False, "amputatePenalty": -20, "shockValue": 2, "bleedingSevThreshold": 0, "affectsMobility": True }, +} + +zoneList = [ + {"id": "XQJBDj4Zd2ILR5rH", "name": 'Head', "zoneNumbers": [1], "affectsMobility": True, + "affectedSkills": ['Acrobatics','Climbing','Legerdemain','Melee','Archery','Riding','Stealth','Swimming'], + "affectedAttributes": ['Agility','Dexterity','Strength']}, + {"id": "DzyCHcZwLLZekBgq", "name": 'Arms', "zoneNumbers": [2,3], "affectsMobility": False, + "affectedSkills": ['Acrobatics','Climbing','Legerdemain','Melee','Archery','Riding','Swimming'], + "affectedAttributes": ['Dexterity','Strength']}, + {"id": "qPncC1ZBr2H8lPSy", "name": 'Torso', "zoneNumbers": [4,5,6,7], "affectsMobility": True, + "affectedSkills": ['Acrobatics','Climbing','Melee','Archery','Riding','Stealth','Swimming'], + "affectedAttributes": ['Agility','Dexterity','Strength']}, + {"id": "KFrOQEbBNicAxikZ", "name": 'Legs', "zoneNumbers": [8,9,10], "affectsMobility": True, + "affectedSkills": ['Acrobatics','Climbing','Melee','Archery','Riding','Stealth','Swimming'], + "affectedAttributes": ['Agility','Strength']} + ] + +bodyPartList = [ + {"id": "WljCPWk6oAmUZ73d", "name": 'Head', "zone": 'Head', "probWeight": 100, "abbrev": "Head"}, + {"id": "Tsrx9WQ2L9HyAVvi", "name": 'Right Arm', "zone": 'Arms', "probWeight": 50, "abbrev": "RArm"}, + {"id": "rnqBua6Rduc0u0P6", "name": 'Left Arm', "zone": 'Arms', "probWeight": 50, "abbrev": "LArm"}, + {"id": "ltL67w6gOzXDgHYD", "name": 'Torso', "zone": 'Torso', "probWeight": 100, "abbrev": "Torso"}, + {"id": "30kOIuDmY81IosL4", "name": 'Right Leg', "zone": 'Legs', "probWeight": 50, "abbrev": "RLeg"}, + {"id": "KocnXsjJtL3doBVr", "name": 'Left Leg', "zone": 'Legs', "probWeight": 50, "abbrev": "LLeg"} + ] + +bodyLocationList = [ + [ 'Skull',"0XmtjaBJDxMk0Ucd", 'Skull', 'Head', 500], + [ 'Left Eye',"6kX9YIUIVja3Y0MP", 'Eye', 'Head', 15], + [ 'Right Eye',"QEfArWukfNxKta0f", 'Eye', 'Head', 15], + [ 'Nose',"QRVralNrMEk93Kwj", 'Nose', 'Head', 30], + [ 'Left Cheek',"8J1XWjV1tsFyugVH", 'Face', 'Head', 60], + [ 'Right Cheek',"ofe4FzVdGkKkZQV2", 'Face', 'Head', 60], + [ 'Left Ear',"UwvPtm6rbB5noi7l", 'Face', 'Head', 15], + [ 'Right Ear',"htpEEuxEAhz7AAsP", 'Face', 'Head', 15], + [ 'Mouth',"U30OhbPBl2QhBQoF", 'Face', 'Head', 30], + [ 'Jaw',"ogK3sN7cu2ajAT5K", 'Face', 'Head', 60], + [ 'Neck',"vZA6OW3EaN0ggS6U", 'Neck', 'Head', 200], + [ 'Left Shoulder',"nuInmwcEVKaPbhiH", 'Shoulder', 'Left Arm', 30], + [ 'Left Upper Arm',"NGjZLBbjFzHdvv0l", 'Upper Arm', 'Left Arm', 30], + [ 'Left Elbow',"ubWdclQbNEQ70pEe", 'Elbow', 'Left Arm', 10], + [ 'Left Forearm',"6mLZet21nySm9VVd", 'Forearm', 'Left Arm', 20], + [ 'Left Hand',"SrpubIBD6K42tsO1", 'Hand', 'Left Arm', 10], + [ 'Right Shoulder',"V7F5ilVtTWnzoyu6", 'Shoulder', 'Right Arm', 30], + [ 'Right Upper Arm',"YfN7RARAAi0UrPld", 'Upper Arm', 'Right Arm', 30], + [ 'Right Elbow',"1kH02rurCS8ft63Q", 'Elbow', 'Right Arm', 10], + [ 'Right Forearm',"pNB4IdNQHFPOnvwD", 'Forearm', 'Right Arm', 20], + [ 'Right Hand',"Rfi2iUDdK2qQz2pv", 'Hand', 'Right Arm', 10], + [ 'Thorax',"Sfp6lj3H6N20woHc", 'Thorax', 'Torso', 40], + [ 'Abdomen',"GYWlGzJ1oE2QlVc0", 'Abdomen', 'Torso', 40], + [ 'Pelvis',"yMsU1PHsaPfGlygr", 'Pelvis', 'Torso', 20], + [ 'Left Thigh',"pOsgjfKKFAr8I8aE", 'Thigh', 'Left Leg', 40], + [ 'Left Knee',"gi2S9Dt4w46x2wOL", 'Knee', 'Left Leg', 10], + [ 'Left Calf',"IX6Bbg9YSahDwI45", 'Calf', 'Left Leg', 30], + [ 'Left Foot',"REmu5X3CBlbfLqvh", 'Foot', 'Left Leg', 20], + [ 'Right Thigh',"AJwjP1rJBbmpamNe", 'Thigh', 'Right Leg', 40], + [ 'Right Knee',"WUnUX9Vw3f9aJXuR", 'Knee', 'Right Leg', 10], + [ 'Right Calf',"Zb9lV9AXinrSftXd", 'Calf', 'Right Leg', 30], + [ 'Right Foot',"aGOXGJxHUfwnfB5M", 'Foot', 'Right Leg', 20] + ] + + +for row in zoneList: + fname = row['name']+'_'+row['id'] + fname = unidecode(fname) + fname = re.sub(r'[^0-9a-zA-Z]+','_',fname) + '.json' + templZoneLocation['_id'] = row['id'] + templZoneLocation['_key'] = "!items!" + row['id'] + templZoneLocation['name'] = row['name'] + templZoneLocation['system']['zoneNumbers'] = row['zoneNumbers'] + templZoneLocation['system']['affectsMobility'] = row['affectsMobility'] + templZoneLocation['system']['affectedSkills'] = row['affectedSkills'] + templZoneLocation['system']['affectedAttributes'] = row['affectedAttributes'] + with open(fname, 'w', encoding='utf8') as outfile: + json.dump(templZoneLocation, outfile, indent=2, ensure_ascii=False) + +for row in bodyPartList: + fname = row['name']+'_'+row['id'] + fname = unidecode(fname) + fname = re.sub(r'[^0-9a-zA-Z]+','_',fname) + '.json' + templBodyPart['_id'] = row['id'] + templBodyPart['_key'] = "!items!" + row['id'] + templBodyPart['name'] = row['name'] + templBodyPart['system']['abbrev'] = row['abbrev'] + templBodyPart['system']['zone'] = row['zone'] + templBodyPart['system']['probWeight']['base'] = row['probWeight'] + with open(fname, 'w', encoding='utf8') as outfile: + json.dump(templBodyPart, outfile, indent=2, ensure_ascii=False) + + +for row in bodyLocationList: + name = row[0] + id = row[1] + bodypart = row[3] + probweight = row[4] + il = injuryLocations[row[2]] + + fname = name+'_'+id + fname = unidecode(fname) + fname = re.sub(r'[^0-9a-zA-Z]+','_',fname) + '.json' + templBodyLocation['_id'] = id + templBodyLocation['_key'] = "!items!" + id + templBodyLocation['name'] = name + templBodyLocation['system']['isStumble'] = il['isStumble'] + templBodyLocation['system']['isFumble'] = il['isFumble'] + templBodyLocation['system']['amputatePenalty'] = il['amputatePenalty'] + templBodyLocation['system']['shockValue'] = il['shockValue'] + templBodyLocation['system']['impactType'] = il['impactType'] + templBodyLocation['system']['bleedingThreshold'] = il['bleedingSevThreshold'] + templBodyLocation['system']['location']['bodyPart'] = bodypart + templBodyLocation['system']['location']['probWeight']['base'] = probweight + with open(fname, 'w', encoding='utf8') as outfile: + json.dump(templBodyLocation, outfile, indent=2, ensure_ascii=False) diff --git a/packs/generate/legendary/leg-characteristics/pack.properties b/packs/generate/legendary/leg-characteristics/pack.properties new file mode 100644 index 0000000..d4f7578 --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/pack.properties @@ -0,0 +1 @@ +type=Item diff --git a/packs/generate/legendary/leg-characteristics/unique/Humanoid_M10pzGVlLgO1zsnh.json b/packs/generate/legendary/leg-characteristics/unique/Humanoid_M10pzGVlLgO1zsnh.json new file mode 100644 index 0000000..ba598f9 --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/unique/Humanoid_M10pzGVlLgO1zsnh.json @@ -0,0 +1,1824 @@ +{ + "name": "Humanoid", + "type": "anatomy", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "macros": [], + "nestedItems": [ + { + "name": "Head", + "type": "bodyzone", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Head", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "Head", + "canHoldItem": false, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Skull", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 500 + } + ] + }, + "sort": 100000, + "ownership": { + "default": 0 + }, + "_id": "0XmtjaBJDxMk0Ucd", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": 0, + "shockValue": 5 + } + } + } + }, + { + "name": "Left Eye", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 15 + } + ] + }, + "sort": 200000, + "ownership": { + "default": 0 + }, + "_id": "6kX9YIUIVja3Y0MP", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 5 + } + } + } + }, + { + "name": "Left Ear", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 15 + } + ] + }, + "sort": 300000, + "ownership": { + "default": 0 + }, + "_id": "UwvPtm6rbB5noi7l", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Left Cheek", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 60 + } + ] + }, + "sort": 400000, + "ownership": { + "default": 0 + }, + "_id": "8J1XWjV1tsFyugVH", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Right Eye", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 15 + } + ] + }, + "sort": 500000, + "ownership": { + "default": 0 + }, + "_id": "QEfArWukfNxKta0f", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 5 + } + } + } + }, + { + "name": "Right Ear", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 15 + } + ] + }, + "sort": 600000, + "ownership": { + "default": 0 + }, + "_id": "htpEEuxEAhz7AAsP", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Right Cheek", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 60 + } + ] + }, + "sort": 700000, + "ownership": { + "default": 0 + }, + "_id": "ofe4FzVdGkKkZQV2", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Nose", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 800000, + "ownership": { + "default": 0 + }, + "_id": "QRVralNrMEk93Kwj", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 5 + } + } + } + }, + { + "name": "Mouth", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 900000, + "ownership": { + "default": 0 + }, + "_id": "U30OhbPBl2QhBQoF", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Jaw", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 60 + } + ] + }, + "sort": 1000000, + "ownership": { + "default": 0 + }, + "_id": "ogK3sN7cu2ajAT5K", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Neck", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 200 + } + ] + }, + "sort": 1100000, + "ownership": { + "default": 0 + }, + "_id": "vZA6OW3EaN0ggS6U", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 3, + "amputatePenalty": -10, + "shockValue": 5 + } + } + } + } + ], + "healthBase": 16, + "aim": [ + { + "name": "Body", + "probWeightBase": 100 + } + ] + }, + "sort": 100000, + "ownership": { + "default": 0 + }, + "_id": "WljCPWk6oAmUZ73d" + } + ], + "abbrev": "Head", + "aim": [ + { + "name": "Body", + "probWeightBase": 1 + } + ] + }, + "sort": 100000, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "legendary": { + "zones": [ + 1 + ], + "affectsMobility": true, + "affectedSkills": [ + "Acrobatics", + "Climbing", + "Legerdemain", + "Melee", + "Archery", + "Riding", + "Stealth", + "Swimming" + ], + "affectedAttributes": [ + "Agility", + "Dexterity", + "Strength" + ] + } + } + }, + "_id": "XQJBDj4Zd2ILR5rH" + }, + { + "name": "Arms", + "type": "bodyzone", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Left Arm", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "LArm", + "canHoldItem": true, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Left Shoulder", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 1200000, + "ownership": { + "default": 0 + }, + "_id": "nuInmwcEVKaPbhiH", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 3 + } + } + } + }, + { + "name": "Left Upper Arm", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 1300000, + "ownership": { + "default": 0 + }, + "_id": "NGjZLBbjFzHdvv0l", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Left Elbow", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 1400000, + "ownership": { + "default": 0 + }, + "_id": "ubWdclQbNEQ70pEe", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + }, + { + "name": "Left Forearm", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 1500000, + "ownership": { + "default": 0 + }, + "_id": "6mLZet21nySm9VVd", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Left Hand", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 1600000, + "ownership": { + "default": 0 + }, + "_id": "SrpubIBD6K42tsO1", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 0, + "amputatePenalty": -30, + "shockValue": 2 + } + } + } + } + ], + "healthBase": 8, + "aim": [ + { + "name": "Body", + "probWeightBase": 50 + } + ] + }, + "sort": 200000, + "ownership": { + "default": 0 + }, + "_id": "rnqBua6Rduc0u0P6" + }, + { + "name": "Right Arm", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "RArm", + "canHoldItem": true, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Right Shoulder", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 1700000, + "ownership": { + "default": 0 + }, + "_id": "V7F5ilVtTWnzoyu6", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 3 + } + } + } + }, + { + "name": "Right Upper Arm", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 1800000, + "ownership": { + "default": 0 + }, + "_id": "YfN7RARAAi0UrPld", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Right Elbow", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 1900000, + "ownership": { + "default": 0 + }, + "_id": "1kH02rurCS8ft63Q", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + }, + { + "name": "Right Forearm", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 2000000, + "ownership": { + "default": 0 + }, + "_id": "pNB4IdNQHFPOnvwD", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Right Hand", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 2100000, + "ownership": { + "default": 0 + }, + "_id": "Rfi2iUDdK2qQz2pv", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 0, + "amputatePenalty": -30, + "shockValue": 2 + } + } + } + } + ], + "healthBase": 8, + "aim": [ + { + "name": "Body", + "probWeightBase": 50 + } + ] + }, + "sort": 300000, + "ownership": { + "default": 0 + }, + "_id": "Tsrx9WQ2L9HyAVvi" + } + ], + "abbrev": "Arms", + "aim": [ + { + "name": "Body", + "probWeightBase": 1 + } + ] + }, + "sort": 200000, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "legendary": { + "zones": [ + 2, + 3 + ], + "affectsMobility": false, + "affectedSkills": [ + "Acrobatics", + "Climbing", + "Legerdemain", + "Melee", + "Archery", + "Riding", + "Swimming" + ], + "affectedAttributes": [ + "Dexterity", + "Strength" + ] + } + } + }, + "_id": "DzyCHcZwLLZekBgq" + }, + { + "name": "Torso", + "type": "bodyzone", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Torso", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "Torso", + "canHoldItem": false, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Thorax", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 40 + } + ] + }, + "sort": 2200000, + "ownership": { + "default": 0 + }, + "_id": "Sfp6lj3H6N20woHc", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Abdomen", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 40 + } + ] + }, + "sort": 2300000, + "ownership": { + "default": 0 + }, + "_id": "GYWlGzJ1oE2QlVc0", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 3, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Pelvis", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 2400000, + "ownership": { + "default": 0 + }, + "_id": "yMsU1PHsaPfGlygr", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + } + ], + "healthBase": 16, + "aim": [ + { + "name": "Body", + "probWeightBase": 100 + } + ] + }, + "sort": 400000, + "ownership": { + "default": 0 + }, + "_id": "ltL67w6gOzXDgHYD" + } + ], + "abbrev": "Torso", + "aim": [ + { + "name": "Body", + "probWeightBase": 1 + } + ] + }, + "sort": 300000, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "legendary": { + "zones": [ + 4, + 5, + 6, + 7 + ], + "affectsMobility": true, + "affectedSkills": [ + "Acrobatics", + "Climbing", + "Melee", + "Archery", + "Riding", + "Stealth", + "Swimming" + ], + "affectedAttributes": [ + "Agility", + "Dexterity", + "Strength" + ] + } + } + }, + "_id": "qPncC1ZBr2H8lPSy" + }, + { + "name": "Legs", + "type": "bodyzone", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Left Leg", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "LLeg", + "canHoldItem": false, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Left Thigh", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 40 + } + ] + }, + "sort": 2500000, + "ownership": { + "default": 0 + }, + "_id": "pOsgjfKKFAr8I8aE", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": -10, + "shockValue": 3 + } + } + } + }, + { + "name": "Left Knee", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 2600000, + "ownership": { + "default": 0 + }, + "_id": "gi2S9Dt4w46x2wOL", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + }, + { + "name": "Left Calf", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 2800000, + "ownership": { + "default": 0 + }, + "_id": "IX6Bbg9YSahDwI45", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Left Foot", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 2900000, + "ownership": { + "default": 0 + }, + "_id": "REmu5X3CBlbfLqvh", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 0, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + } + ], + "healthBase": 8, + "aim": [ + { + "name": "Body", + "probWeightBase": 50 + } + ] + }, + "sort": 500000, + "ownership": { + "default": 0 + }, + "_id": "KocnXsjJtL3doBVr" + }, + { + "name": "Right Leg", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "RLeg", + "canHoldItem": false, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Right Thigh", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 40 + } + ] + }, + "sort": 3000000, + "ownership": { + "default": 0 + }, + "_id": "AJwjP1rJBbmpamNe", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": -10, + "shockValue": 3 + } + } + } + }, + { + "name": "Right Knee", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 3100000, + "ownership": { + "default": 0 + }, + "_id": "WUnUX9Vw3f9aJXuR", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + }, + { + "name": "Right Calf", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 3200000, + "ownership": { + "default": 0 + }, + "_id": "Zb9lV9AXinrSftXd", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Right Foot", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 3300000, + "ownership": { + "default": 0 + }, + "_id": "aGOXGJxHUfwnfB5M", + "flags": { + "sohl": { + "legendary": { + "isRigid": false, + "bleedingSevThreshold": 0, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + } + ], + "healthBase": 8, + "aim": [ + { + "name": "Body", + "probWeightBase": 50 + } + ] + }, + "sort": 600000, + "ownership": { + "default": 0 + }, + "_id": "30kOIuDmY81IosL4" + } + ], + "abbrev": "Legs", + "aim": [ + { + "name": "Body", + "probWeightBase": 1 + } + ] + }, + "sort": 400000, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "legendary": { + "zones": [ + 8, + 9, + 10 + ], + "affectsMobility": true, + "affectedSkills": [ + "Acrobatics", + "Climbing", + "Melee", + "Archery", + "Riding", + "Stealth", + "Swimming" + ], + "affectedAttributes": [ + "Agility", + "Strength" + ] + } + } + }, + "_id": "KFrOQEbBNicAxikZ" + } + ], + "defaultAim": "", + "weaponLimbs": [ + "Left Arm", + "Right Arm", + "Left Arm, Right Arm" + ], + "transfer": false + }, + "sort": 0, + "ownership": { + "default": 3 + }, + "effects": [], + "flags": {}, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.7.2", + "coreVersion": "11.313", + "createdTime": 1684119710177, + "modifiedTime": 1684119710177, + "lastModifiedBy": "nM52Hn9VSW6oonaL" + }, + "_id": "M10pzGVlLgO1zsnh", + "folder": "P390fTDcDdREKmgz", + "_key": "!items!M10pzGVlLgO1zsnh" +} diff --git a/packs/generate/legendary/leg-characteristics/unique/Humanoid_M10pzGVlLgO1zsnh.yaml b/packs/generate/legendary/leg-characteristics/unique/Humanoid_M10pzGVlLgO1zsnh.yaml new file mode 100644 index 0000000..b7d6f63 --- /dev/null +++ b/packs/generate/legendary/leg-characteristics/unique/Humanoid_M10pzGVlLgO1zsnh.yaml @@ -0,0 +1,1361 @@ +name: Humanoid +type: anatomy +img: systems/sohl/assets/icons/body.svg +system: + notes: "" + description: "" + textReference: "" + macros: [] + nestedItems: + - name: Head + type: bodyzone + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Head + type: bodypart + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + abbrev: Head + canHoldItem: false + heldItem: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Skull + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 500 + sort: 100000 + ownership: + default: 0 + _id: 0XmtjaBJDxMk0Ucd + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: 0 + shockValue: 5 + - name: Left Eye + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 15 + sort: 200000 + ownership: + default: 0 + _id: 6kX9YIUIVja3Y0MP + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 5 + - name: Left Ear + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 15 + sort: 300000 + ownership: + default: 0 + _id: UwvPtm6rbB5noi7l + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 4 + - name: Left Cheek + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 60 + sort: 400000 + ownership: + default: 0 + _id: 8J1XWjV1tsFyugVH + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 4 + - name: Right Eye + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 15 + sort: 500000 + ownership: + default: 0 + _id: QEfArWukfNxKta0f + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 5 + - name: Right Ear + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 15 + sort: 600000 + ownership: + default: 0 + _id: htpEEuxEAhz7AAsP + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 4 + - name: Right Cheek + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 60 + sort: 700000 + ownership: + default: 0 + _id: ofe4FzVdGkKkZQV2 + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 4 + - name: Nose + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 30 + sort: 800000 + ownership: + default: 0 + _id: QRVralNrMEk93Kwj + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 5 + - name: Mouth + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 30 + sort: 900000 + ownership: + default: 0 + _id: U30OhbPBl2QhBQoF + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 4 + - name: Jaw + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 60 + sort: 1000000 + ownership: + default: 0 + _id: ogK3sN7cu2ajAT5K + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 4 + - name: Neck + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 200 + sort: 1100000 + ownership: + default: 0 + _id: vZA6OW3EaN0ggS6U + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 3 + amputatePenalty: -10 + shockValue: 5 + healthBase: 16 + aim: + - name: Body + probWeightBase: 100 + sort: 100000 + ownership: + default: 0 + _id: WljCPWk6oAmUZ73d + abbrev: Head + aim: + - name: Body + probWeightBase: 1 + sort: 100000 + ownership: + default: 0 + flags: + sohl: + legendary: + zones: + - 1 + affectsMobility: true + affectedSkills: + - Acrobatics + - Climbing + - Legerdemain + - Melee + - Archery + - Riding + - Stealth + - Swimming + affectedAttributes: + - Agility + - Dexterity + - Strength + _id: XQJBDj4Zd2ILR5rH + - name: Arms + type: bodyzone + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Left Arm + type: bodypart + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + abbrev: LArm + canHoldItem: true + heldItem: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Left Shoulder + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 30 + sort: 1200000 + ownership: + default: 0 + _id: nuInmwcEVKaPbhiH + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 3 + - name: Left Upper Arm + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 30 + sort: 1300000 + ownership: + default: 0 + _id: NGjZLBbjFzHdvv0l + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 1 + - name: Left Elbow + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 10 + sort: 1400000 + ownership: + default: 0 + _id: ubWdclQbNEQ70pEe + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 2 + - name: Left Forearm + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 20 + sort: 1500000 + ownership: + default: 0 + _id: 6mLZet21nySm9VVd + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 1 + - name: Left Hand + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 10 + sort: 1600000 + ownership: + default: 0 + _id: SrpubIBD6K42tsO1 + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 0 + amputatePenalty: -30 + shockValue: 2 + healthBase: 8 + aim: + - name: Body + probWeightBase: 50 + sort: 200000 + ownership: + default: 0 + _id: rnqBua6Rduc0u0P6 + - name: Right Arm + type: bodypart + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + abbrev: RArm + canHoldItem: true + heldItem: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Right Shoulder + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 30 + sort: 1700000 + ownership: + default: 0 + _id: V7F5ilVtTWnzoyu6 + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 3 + - name: Right Upper Arm + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 30 + sort: 1800000 + ownership: + default: 0 + _id: YfN7RARAAi0UrPld + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 1 + - name: Right Elbow + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 10 + sort: 1900000 + ownership: + default: 0 + _id: 1kH02rurCS8ft63Q + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 2 + - name: Right Forearm + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 20 + sort: 2000000 + ownership: + default: 0 + _id: pNB4IdNQHFPOnvwD + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 1 + - name: Right Hand + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: true + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 10 + sort: 2100000 + ownership: + default: 0 + _id: Rfi2iUDdK2qQz2pv + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 0 + amputatePenalty: -30 + shockValue: 2 + healthBase: 8 + aim: + - name: Body + probWeightBase: 50 + sort: 300000 + ownership: + default: 0 + _id: Tsrx9WQ2L9HyAVvi + abbrev: Arms + aim: + - name: Body + probWeightBase: 1 + sort: 200000 + ownership: + default: 0 + flags: + sohl: + legendary: + zones: + - 2 + - 3 + affectsMobility: false + affectedSkills: + - Acrobatics + - Climbing + - Legerdemain + - Melee + - Archery + - Riding + - Swimming + affectedAttributes: + - Dexterity + - Strength + _id: DzyCHcZwLLZekBgq + - name: Torso + type: bodyzone + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Torso + type: bodypart + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + abbrev: Torso + canHoldItem: false + heldItem: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Thorax + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 40 + sort: 2200000 + ownership: + default: 0 + _id: Sfp6lj3H6N20woHc + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 4 + - name: Abdomen + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 40 + sort: 2300000 + ownership: + default: 0 + _id: GYWlGzJ1oE2QlVc0 + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 3 + amputatePenalty: 0 + shockValue: 4 + - name: Pelvis + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: false + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 20 + sort: 2400000 + ownership: + default: 0 + _id: yMsU1PHsaPfGlygr + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: 0 + shockValue: 4 + healthBase: 16 + aim: + - name: Body + probWeightBase: 100 + sort: 400000 + ownership: + default: 0 + _id: ltL67w6gOzXDgHYD + abbrev: Torso + aim: + - name: Body + probWeightBase: 1 + sort: 300000 + ownership: + default: 0 + flags: + sohl: + legendary: + zones: + - 4 + - 5 + - 6 + - 7 + affectsMobility: true + affectedSkills: + - Acrobatics + - Climbing + - Melee + - Archery + - Riding + - Stealth + - Swimming + affectedAttributes: + - Agility + - Dexterity + - Strength + _id: qPncC1ZBr2H8lPSy + - name: Legs + type: bodyzone + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Left Leg + type: bodypart + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + abbrev: LLeg + canHoldItem: false + heldItem: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Left Thigh + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: true + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 40 + sort: 2500000 + ownership: + default: 0 + _id: pOsgjfKKFAr8I8aE + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: -10 + shockValue: 3 + - name: Left Knee + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: true + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 10 + sort: 2600000 + ownership: + default: 0 + _id: gi2S9Dt4w46x2wOL + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 2 + - name: Left Calf + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: true + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 30 + sort: 2800000 + ownership: + default: 0 + _id: IX6Bbg9YSahDwI45 + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 1 + - name: Left Foot + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: true + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 20 + sort: 2900000 + ownership: + default: 0 + _id: REmu5X3CBlbfLqvh + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 0 + amputatePenalty: -20 + shockValue: 2 + healthBase: 8 + aim: + - name: Body + probWeightBase: 50 + sort: 500000 + ownership: + default: 0 + _id: KocnXsjJtL3doBVr + - name: Right Leg + type: bodypart + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + abbrev: RLeg + canHoldItem: false + heldItem: "" + textReference: "" + transfer: true + macros: [] + nestedItems: + - name: Right Thigh + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: true + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 40 + sort: 3000000 + ownership: + default: 0 + _id: AJwjP1rJBbmpamNe + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 4 + amputatePenalty: -10 + shockValue: 3 + - name: Right Knee + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: true + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 10 + sort: 3100000 + ownership: + default: 0 + _id: WUnUX9Vw3f9aJXuR + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 2 + - name: Right Calf + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: true + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 30 + sort: 3200000 + ownership: + default: 0 + _id: Zb9lV9AXinrSftXd + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 5 + amputatePenalty: -20 + shockValue: 1 + - name: Right Foot + type: bodylocation + img: systems/sohl/assets/icons/body.svg + system: + notes: "" + description: "" + layers: "" + quality: 0 + isFumble: false + isStumble: true + textReference: "" + transfer: true + armorBase: + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + macros: [] + nestedItems: [] + aim: + - name: Body + probWeightBase: 20 + sort: 3300000 + ownership: + default: 0 + _id: aGOXGJxHUfwnfB5M + flags: + sohl: + legendary: + isRigid: false + bleedingSevThreshold: 0 + amputatePenalty: -20 + shockValue: 2 + healthBase: 8 + aim: + - name: Body + probWeightBase: 50 + sort: 600000 + ownership: + default: 0 + _id: 30kOIuDmY81IosL4 + abbrev: Legs + aim: + - name: Body + probWeightBase: 1 + sort: 400000 + ownership: + default: 0 + flags: + sohl: + legendary: + zones: + - 8 + - 9 + - 10 + affectsMobility: true + affectedSkills: + - Acrobatics + - Climbing + - Melee + - Archery + - Riding + - Stealth + - Swimming + affectedAttributes: + - Agility + - Strength + _id: KFrOQEbBNicAxikZ + defaultAim: "" + weaponLimbs: + - Left Arm + - Right Arm + - Left Arm, Right Arm + transfer: false +sort: 0 +ownership: + default: 3 +effects: [] +flags: {} +_stats: + systemId: sohl + systemVersion: 0.7.2 + coreVersion: "11.313" + createdTime: 1684119710177 + modifiedTime: 1684119710177 + lastModifiedBy: nM52Hn9VSW6oonaL +_id: M10pzGVlLgO1zsnh +folder: P390fTDcDdREKmgz +_key: '!items!M10pzGVlLgO1zsnh' diff --git a/packs/generate/legendary/leg-characters/data/folders.yaml b/packs/generate/legendary/leg-characters/data/folders.yaml new file mode 100644 index 0000000..9e61378 --- /dev/null +++ b/packs/generate/legendary/leg-characters/data/folders.yaml @@ -0,0 +1,12 @@ +- name: Pregens + id: 5mMLOWFQcdODwR8q + parentFolderId: "" + color: '#d35400' +- name: Prototypes + id: B7TbLzcpM0uOivzx + parentFolderId: "" + color: '#007a6c' +- name: Samples + id: 6agrTJfWrikRraVu + parentFolderId: "" + color: '#ca3232' diff --git a/packs/generate/legendary/leg-characters/generate-leg-characters.py b/packs/generate/legendary/leg-characters/generate-leg-characters.py new file mode 100755 index 0000000..dec29c0 --- /dev/null +++ b/packs/generate/legendary/leg-characters/generate-leg-characters.py @@ -0,0 +1,45 @@ +#!./venv/bin/python3 + +import yaml +import json +import argparse +from unidecode import unidecode +import re + +parser = argparse.ArgumentParser() +parser.add_argument("outputDir", help="folder where generated files should be placed") +args = parser.parse_args() + +stats = { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M", +} + +with open("./data/folders.yaml", "r", encoding="utf8") as infile: + foldersData = yaml.safe_load(infile) + +for folder in foldersData: + print(f"Processing Folder {folder['name']}") + fname = folder["name"] + "_" + folder["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": folder["name"], + "sorting": "a", + "folder": folder["parentFolderId"] or None, + "type": "Item", + "_id": folder["id"], + "sort": 0, + "color": folder["color"], + "flags": {}, + "_stats": stats, + "_key": "!folders!" + folder["id"], + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) diff --git a/packs/generate/legendary/leg-characters/pack.properties b/packs/generate/legendary/leg-characters/pack.properties new file mode 100644 index 0000000..ce9c5c8 --- /dev/null +++ b/packs/generate/legendary/leg-characters/pack.properties @@ -0,0 +1 @@ +type=Actor diff --git a/packs/generate/legendary/leg-characters/unique/Basic_Folk_KooPYQcYORLZqrLY.json b/packs/generate/legendary/leg-characters/unique/Basic_Folk_KooPYQcYORLZqrLY.json new file mode 100644 index 0000000..c18efcb --- /dev/null +++ b/packs/generate/legendary/leg-characters/unique/Basic_Folk_KooPYQcYORLZqrLY.json @@ -0,0 +1,7508 @@ +{ + "name": "Basic Folk", + "type": "entity", + "_id": "KooPYQcYORLZqrLY", + "img": "systems/sohl/assets/silhouette/character-headshot.webp", + "system": { + "macros": [], + "bioImage": "systems/sohl/assets/silhouette/character-bioimage.webp", + "description": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Apparent Age 
Culture 
Social Class 
Height 
Frame 
Weight 
Appearance/Comeliness 
Hair Color 
Eye Color 
Voice 
Obvious Medical Traits
 
Apparent Occupation
 
Apparent Wealth
 
Weapons
 
Armour 
Companions 
Other obvious features 
", + "biography": "

Data

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Birthdate 
Birthplace 
Sibling Rankx of y
Parent(s) 
Parent Affiliation 
Estrangement 
Clanhead 
Medical Traits 
Psyche Traits 
\n

Life Story

" + }, + "prototypeToken": { + "name": "Basic Folk", + "displayName": 0, + "actorLink": false, + "appendNumber": false, + "prependAdjective": false, + "width": 1, + "height": 1, + "texture": { + "src": "systems/sohl/assets/silhouette/character-token.svg", + "anchorX": 0.5, + "anchorY": 0.5, + "offsetX": 0, + "offsetY": 0, + "fit": "contain", + "scaleX": 1, + "scaleY": 1, + "rotation": 0, + "tint": "#ffffff", + "alphaThreshold": 0.75 + }, + "hexagonalShape": 0, + "lockRotation": false, + "rotation": 0, + "alpha": 1, + "disposition": -1, + "displayBars": 0, + "bar1": { + "attribute": "health" + }, + "bar2": { + "attribute": null + }, + "light": { + "negative": false, + "priority": 0, + "alpha": 0.5, + "angle": 360, + "bright": 0, + "color": null, + "coloration": 1, + "dim": 0, + "attenuation": 0.5, + "luminosity": 0.5, + "saturation": 0, + "contrast": 0, + "shadows": 0, + "animation": { + "type": null, + "speed": 5, + "intensity": 5, + "reverse": false + }, + "darkness": { + "min": 0, + "max": 1 + } + }, + "sight": { + "enabled": false, + "range": 0, + "angle": 360, + "visionMode": "basic", + "color": null, + "attenuation": 0.1, + "brightness": 0, + "saturation": 0, + "contrast": 0 + }, + "detectionModes": [], + "occludable": { + "radius": 0 + }, + "ring": { + "enabled": false, + "colors": { + "ring": null, + "background": null + }, + "effects": 1, + "subject": { + "scale": 1, + "texture": null + } + }, + "flags": {}, + "randomImg": false + }, + "items": [ + { + "name": "Strength", + "img": "systems/sohl/assets/icons/biceps.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "str", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Feeble", + "maxValue": 4 + }, + { + "label": "Weak", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Forceful", + "maxValue": 16 + }, + { + "label": "Mighty", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "7gcJh223TUXq6g8v", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.7gcJh223TUXq6g8v" + }, + { + "name": "Endurance", + "img": "systems/sohl/assets/icons/climbing.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "end", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Frail", + "maxValue": 4 + }, + { + "label": "Unfit", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Robust", + "maxValue": 16 + }, + { + "label": "Hardy", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "a2RVrFyBOcxIeSuz", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.a2RVrFyBOcxIeSuz" + }, + { + "name": "Dexterity", + "img": "systems/sohl/assets/icons/juggler.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "dex", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Uncoordinated", + "maxValue": 4 + }, + { + "label": "Awkward", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Deft", + "maxValue": 16 + }, + { + "label": "Adroit", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "9SJfTE6F2EZjinEW", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.9SJfTE6F2EZjinEW" + }, + { + "name": "Agility", + "img": "systems/sohl/assets/icons/acrobatics.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "agl", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Blundering", + "maxValue": 4 + }, + { + "label": "Clumsy", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Nimble", + "maxValue": 16 + }, + { + "label": "Graceful", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "68ackmeNKCsgnHaw", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.68ackmeNKCsgnHaw" + }, + { + "name": "Perception", + "img": "systems/sohl/assets/icons/awareness.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "per", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Impaired", + "maxValue": 4 + }, + { + "label": "Dulled", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Sharp", + "maxValue": 16 + }, + { + "label": "Acute", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "UHAn8zhYqDKyUuaj", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.UHAn8zhYqDKyUuaj" + }, + { + "name": "Comeliness", + "img": "systems/sohl/assets/icons/charm.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "cml", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Ugly", + "maxValue": 4 + }, + { + "label": "Unattractive", + "maxValue": 8 + }, + { + "label": "Plain", + "maxValue": 12 + }, + { + "label": "Attractive", + "maxValue": 16 + }, + { + "label": "Striking", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "lOhAZU1t4KWD6agK", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.lOhAZU1t4KWD6agK" + }, + { + "name": "Aura", + "img": "systems/sohl/assets/icons/aura.svg", + "system": { + "notes": "", + "description": "", + "subType": "transcendent", + "abbrev": "aur", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Mundane", + "maxValue": 4 + }, + { + "label": "Shallow", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Deep", + "maxValue": 16 + }, + { + "label": "Profound", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "YkGxgxLkqzPBN7qI", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.YkGxgxLkqzPBN7qI" + }, + { + "name": "Will", + "img": "systems/sohl/assets/icons/will.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "wil", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Submissive", + "maxValue": 4 + }, + { + "label": "Indecisive", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Resolute", + "maxValue": 16 + }, + { + "label": "Implacable", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "oX9jTQwWhs3EXQKS", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.oX9jTQwWhs3EXQKS" + }, + { + "name": "Reasoning", + "img": "systems/sohl/assets/icons/reasoning.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "rea", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Dim", + "maxValue": 4 + }, + { + "label": "Dull", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Sharp", + "maxValue": 16 + }, + { + "label": "Brilliant", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "lXKEgCXh7R1dxzbq", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.lXKEgCXh7R1dxzbq" + }, + { + "name": "Creativity", + "img": "systems/sohl/assets/icons/creativity.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "cre", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Banal", + "maxValue": 4 + }, + { + "label": "Predictable", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Innovative", + "maxValue": 16 + }, + { + "label": "Visionary", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "8wZCfX0ltTLvZnp1", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.8wZCfX0ltTLvZnp1" + }, + { + "name": "Empathy", + "img": "systems/sohl/assets/icons/empathy.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "emp", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Unfeeling", + "maxValue": 4 + }, + { + "label": "Remote", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Understanding", + "maxValue": 16 + }, + { + "label": "Sensitive", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "XSt8l0nBgymKlgk8", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.XSt8l0nBgymKlgk8" + }, + { + "name": "Eloquence", + "img": "systems/sohl/assets/icons/oratory.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "elo", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Incoherent", + "maxValue": 4 + }, + { + "label": "Muddled", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Articulate", + "maxValue": 16 + }, + { + "label": "Expressive", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "9kpA8IAMkSqKVykw", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.9kpA8IAMkSqKVykw" + }, + { + "name": "Voice", + "img": "systems/sohl/assets/icons/sing.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "voi", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Jarring", + "maxValue": 4 + }, + { + "label": "Tuneless", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Melodious", + "maxValue": 16 + }, + { + "label": "Dulcet", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "pXWrHxBryuy3SDEx", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.pXWrHxBryuy3SDEx" + }, + { + "name": "Morality", + "img": "systems/sohl/assets/icons/morality.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "mor", + "textValue": "0", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Amoral", + "maxValue": 2 + }, + { + "label": "Immoral", + "maxValue": 4 + }, + { + "label": "Hipocritical", + "maxValue": 7 + }, + { + "label": "Unscrupulous", + "maxValue": 10 + }, + { + "label": "Conscientious", + "maxValue": 13 + }, + { + "label": "Principled", + "maxValue": 16 + }, + { + "label": "Virtuous", + "maxValue": 18 + }, + { + "label": "Paragon", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Z8XfPxIuhn7Crr7E", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.Z8XfPxIuhn7Crr7E" + }, + { + "name": "Sunsign", + "img": "systems/sohl/assets/icons/astrology.svg", + "system": { + "notes": "", + "description": "", + "subType": "transcendent", + "abbrev": "ss", + "textValue": "ulandus", + "isNumeric": false, + "intensity": "trait", + "max": null, + "textReference": "", + "valueDesc": [], + "choices": { + "ulandus": "Ùlándus", + "ulandusaralius": "Ùlándus-Arálius", + "aralius": "Arálius", + "araliusfeneri": "Arálius-Fenéri", + "feneri": "Fenéri", + "feneriahnu": "Fenéri-Áhnù", + "ahnu": "Áhnù", + "ahnuangberelius": "Áhnù-Angberélius", + "angberelius": "Angberélius", + "angbereliusnadai": "Angberélius-Nadái", + "nadai": "Nadái", + "nadaihirin": "Nadái-Hîrin", + "hirin": "Hîrin", + "hirintarael": "Hîrin-Táræl", + "tarael": "Táræl", + "taraeltai": "Táræl-Tai", + "tai": "Tai", + "taiskorus": "Tai-Skôrus", + "skorus": "Skôrus", + "skorusmasara": "Skôrus-Masâra", + "masara": "Masâra", + "masaralado": "Masâra-Ládo", + "lado": "Ládo", + "ladoulandus": "Ládo-Ùlándus" + }, + "macros": [ + { + "name": "Setup Virtual Items", + "type": "script", + "_id": "PZFbSGy377ZmHXud", + "author": "5VOJ7NCf7bEZjieU", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.setupVirtualItems();\nconst values = this.item.getFlag(\"sohl\", \"values\");\nthis.actor.system.$ssMod = values[this.textValue];", + "folder": null, + "sort": 0, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "functionName": "setupVirtualItems", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "_stats": { + "coreVersion": "12.327", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "values": { + "ulandus": { + "label": "Ùlándus", + "cusp": false, + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -15, + "aura": -5, + "water": 5 + } + }, + "ulandusaralius": { + "label": "Ùlándus-Arálius", + "cusp": true, + "ssMod": { + "earth": 15, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -5, + "water": 5 + } + }, + "aralius": { + "label": "Arálius", + "cusp": false, + "ssMod": { + "earth": 10, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -10, + "water": 0 + } + }, + "araliusfeneri": { + "label": "Arálius-Fenéri", + "cusp": true, + "ssMod": { + "earth": 10, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -10, + "water": 0 + } + }, + "feneri": { + "label": "Fenéri", + "cusp": false, + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -15, + "water": -5 + } + }, + "feneriahnu": { + "label": "Fenéri-Áhnù", + "cusp": true, + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 10, + "air": 0, + "aura": -10, + "water": -5 + } + }, + "ahnu": { + "label": "Áhnù", + "cusp": false, + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 10, + "air": 0, + "aura": -10, + "water": -10 + } + }, + "ahnuangberelius": { + "label": "Áhnù-Angberélius", + "cusp": true, + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 15, + "air": 5, + "aura": -5, + "water": -10 + } + }, + "angberelius": { + "label": "Angberélius", + "cusp": false, + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 5, + "aura": -5, + "water": -15 + } + }, + "angbereliusnadai": { + "label": "Angberélius-Nadái", + "cusp": true, + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 10, + "aura": 0, + "water": -10 + } + }, + "nadai": { + "label": "Nadái", + "cusp": false, + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -10 + } + }, + "nadaihirin": { + "label": "Nadái-Hîrin", + "cusp": true, + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -5 + } + }, + "hirin": { + "label": "Hîrin", + "cusp": false, + "ssMod": { + "earth": -15, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 5, + "water": -5 + } + }, + "hirintarael": { + "label": "Hîrin-Táræl", + "cusp": true, + "ssMod": { + "earth": -10, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 10, + "water": 0 + } + }, + "tarael": { + "label": "Táræl", + "cusp": false, + "ssMod": { + "earth": -10, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 10, + "water": 0 + } + }, + "taraeltai": { + "label": "Táræl-Tai", + "cusp": true, + "ssMod": { + "earth": -5, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 15, + "water": 5 + } + }, + "tai": { + "label": "Tai", + "cusp": false, + "ssMod": { + "earth": -5, + "metal": -15, + "fire": -5, + "air": 5, + "aura": 15, + "water": 5 + } + }, + "taiskorus": { + "label": "Tai-Skôrus", + "cusp": true, + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -5, + "air": 5, + "aura": 15, + "water": 10 + } + }, + "skorus": { + "label": "Skôrus", + "cusp": false, + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -10, + "air": 0, + "aura": 10, + "water": 10 + } + }, + "skorusmasara": { + "label": "Skôrus-Masâra", + "cusp": true, + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -10, + "air": 0, + "aura": 10, + "water": 15 + } + }, + "masara": { + "label": "Masâra", + "cusp": false, + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -15, + "air": -5, + "aura": 5, + "water": 15 + } + }, + "masaralado": { + "label": "Masâra-Ládo", + "cusp": true, + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -5, + "aura": 5, + "water": 15 + } + }, + "lado": { + "label": "Ládo", + "cusp": false, + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -10, + "aura": 0, + "water": 10 + } + }, + "ladoulandus": { + "label": "Ládo-Ùlándus", + "cusp": true, + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -10, + "aura": 0, + "water": 10 + } + } + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "1lXY0B1E2nwgATc7", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.1lXY0B1E2nwgATc7" + }, + { + "name": "Basic Fate", + "type": "trait", + "img": "systems/sohl/assets/icons/user-gear.svg", + "system": { + "subType": "transcendent", + "macros": [ + { + "name": "Setup Virtual Items", + "type": "script", + "_id": "gpnwBsX76ZqKs6Ee", + "author": "RsnPoY20XgcrucTn", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.setupVirtualItems();\nthis.$masteryLevel.disabled = false;\nthis.$masteryLevel.setBase(this.$score.base);\nconst aura = this.actor.getTraitByAbbrev(\"aur\");\nif (aura) {\n this.$masteryLevel.add(\"Aura Secondary Modifier\", \"AuraSM\", aura.system.$masteryLevel.secMod);\n}\nconst ss = this.actor.getTraitByAbbrev(\"ss\");\nif (ss) {\n const values = ss.getFlag(\"sohl\", \"values\");\n const value = values[this.textValue];\n if (value) {\n this.$masteryLevel.add(\"Sunsign Modifier\", \"SS\", value[\"aura\"] || 0);\n }\n}", + "folder": null, + "sort": 0, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "_stats": { + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false, + "abbrev": "fate", + "textValue": "50", + "max": null, + "isNumeric": true, + "intensity": "trait", + "valueDesc": [], + "choices": {} + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "cQlbxisGuasZn7oH", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.cQlbxisGuasZn7oH" + }, + { + "name": "Size", + "img": "systems/sohl/assets/icons/body-height.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "siz", + "textValue": "Medium", + "isNumeric": false, + "intensity": "trait", + "max": null, + "textReference": "", + "valueDesc": [], + "choices": { + "tiny": "Tiny", + "small": "Small", + "medium": "Medium", + "large": "Large", + "big": "Big", + "huge": "Huge", + "colossal": "Colossal", + "titanic": "Titanic" + }, + "macros": [ + { + "name": "Setup Virtual Items", + "type": "script", + "_id": "VEMB4c34IFaAaa7W", + "author": "5VOJ7NCf7bEZjieU", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.setupVirtualItems();\nconst sizes = this.item.getFlag(\"sohl\", \"sizes\");\nthis.$params = sizes?.[this.textValue] || {\n maxStr: 19,\n lbs: 400,\n zones: 10,\n target: 1,\n reachMod: 0,\n spaces: 1,\n feet: 5\n};", + "folder": null, + "sort": 0, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "functionName": "setupVirtualItems", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "_stats": { + "coreVersion": "12.329", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "sizes": { + "tiny": { + "maxStr": 4, + "lbs": 20, + "zones": 3, + "target": 1, + "reachMod": -2, + "spaces": 0.5, + "feet": 2 + }, + "small": { + "maxStr": 8, + "lbs": 100, + "zones": 6, + "target": 1, + "reachMod": -1, + "spaces": 1, + "feet": 4 + }, + "medium": { + "maxStr": 19, + "lbs": 400, + "zones": 10, + "target": 1, + "reachMod": 0, + "spaces": 1, + "feet": 5 + }, + "large": { + "maxStr": 29, + "lbs": 800, + "zones": 16, + "target": 2, + "reachMod": 1, + "spaces": 1, + "feet": 6 + }, + "big": { + "maxStr": 39, + "lbs": 1600, + "zones": 20, + "target": 2, + "reachMod": 1, + "spaces": 2, + "feet": 7 + }, + "huge": { + "maxStr": 49, + "lbs": 3200, + "zones": 30, + "target": 3, + "reachMod": 2, + "spaces": 2, + "feet": 9 + }, + "colossal": { + "maxStr": 59, + "lbs": 6400, + "zones": 40, + "target": 4, + "reachMod": 4, + "spaces": 2, + "feet": 10 + }, + "titanic": { + "maxStr": 69, + "lbs": 12800, + "zones": 80, + "target": 8, + "reachMod": 6, + "spaces": 3, + "feet": 15 + } + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "EvL76CDP3s85EX3m", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.EvL76CDP3s85EX3m" + }, + { + "name": "Carrying Capacity", + "type": "trait", + "system": { + "subType": "physique", + "macros": [ + { + "name": "Process Siblings", + "type": "script", + "_id": "Hm2BL94GnC3Y3HYL", + "scope": "global", + "command": "this.processSiblings();\nconst gw = this.actor.system.$gearWeight;\ngw.maxFight.setBase(this.$score.base);\ngw.max.setBase(this.max);", + "flags": { + "sohl": { + "notes": "", + "functionName": "processSiblings", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + } + } + ], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "abbrev": "cap", + "textValue": "50", + "max": 75, + "isNumeric": true, + "intensity": "trait", + "valueDesc": [], + "choices": {}, + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "img": "systems/sohl/assets/icons/carrying-sack.svg", + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "5FT9yI4MaxvZkEXB", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.5FT9yI4MaxvZkEXB" + }, + { + "name": "Move", + "img": "systems/sohl/assets/icons/run.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "mov", + "textValue": "0", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [ + { + "name": "Process Siblings", + "type": "script", + "_id": "yHTQV0aRXKKvoDdT", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.postProcess();\nArray.from(this.actor.allItems()).forEach((it) => {\nif (it.type === \"affliction\" && it.system.subType === \"fatigue\") {\n this.$masteryLevel.add(\n it.name,\n it.system.constructor.subTypeAbbreviation[it.system.subType],\n -it.system.$level.effective,\n );\n}});", + "sort": 0, + "flags": { + "sohl": { + "notes": "", + "functionName": "processSiblings", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + } + } + ], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "MaI4IHUVeCzPUDF0", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.MaI4IHUVeCzPUDF0" + }, + { + "name": "Favored Parts", + "img": "systems/sohl/assets/icons/hands.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "favparts", + "textValue": "Right Arm", + "isNumeric": false, + "intensity": "trait", + "max": null, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "zMnbP3lFXKJ5qXhj", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.zMnbP3lFXKJ5qXhj" + }, + { + "name": "Body Weight", + "img": "systems/sohl/assets/icons/weight.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "wt", + "textValue": "150", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "dbyrBP97fWyP5klm", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.dbyrBP97fWyP5klm" + }, + { + "name": "Experience Points", + "img": "systems/sohl/assets/icons/beams-aura.svg", + "system": { + "notes": "", + "description": "", + "subType": "transcendent", + "abbrev": "xp", + "textValue": "0", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "GQkz9U6YjFPfNabV", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.GQkz9U6YjFPfNabV" + }, + { + "name": "Area Attack Shock", + "img": "systems/sohl/assets/icons/shock.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "ashk", + "textValue": "6", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "42Tis14hT6bVOpFv", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.42Tis14hT6bVOpFv" + }, + { + "name": "Charm", + "type": "skill", + "img": "systems/sohl/assets/icons/charm.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@cml, @emp", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "chrm", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "EdTr3cJ0PFOdmKLC", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.EdTr3cJ0PFOdmKLC" + }, + { + "name": "Command", + "type": "skill", + "img": "systems/sohl/assets/icons/rhetoric.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@wil, @elo", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "cmd", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "ElZrSPPaRpjTOzP0", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.ElZrSPPaRpjTOzP0" + }, + { + "name": "Discourse", + "type": "skill", + "img": "systems/sohl/assets/icons/face-to-face.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @elo", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "dscr", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "itsP4V8viYAaWmCC", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.itsP4V8viYAaWmCC" + }, + { + "name": "Guile", + "type": "skill", + "img": "systems/sohl/assets/icons/mischevous.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @cre", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "guil", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "v8aTMSWBmJhqjg6n", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.v8aTMSWBmJhqjg6n" + }, + { + "name": "Intrigue", + "type": "skill", + "img": "systems/sohl/assets/icons/cloak-dagger.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @rea", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "intr", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "bIEjWjjs1IlOivSO", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.bIEjWjjs1IlOivSO" + }, + { + "name": "Singing", + "type": "skill", + "img": "systems/sohl/assets/icons/sing.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@voi, @cre", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "craft", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "sing", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "gVXuhMWdoyk1qUps", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.gVXuhMWdoyk1qUps" + }, + { + "name": "Theatrics", + "type": "skill", + "img": "systems/sohl/assets/icons/drama-masks.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@cre, @elo", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "thtcs", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "vTF6s0f6t1k1bIcf", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.vTF6s0f6t1k1bIcf" + }, + { + "name": "Survival", + "type": "skill", + "img": "systems/sohl/assets/icons/survival.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @wil", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "nature", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "srvl", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "VPuuz4lPxRwFTeDN", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.VPuuz4lPxRwFTeDN" + }, + { + "name": "Drawing", + "type": "skill", + "img": "systems/sohl/assets/icons/drawing.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @dex", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "craft", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "draw", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "eDRy14Ycc9SID3C2", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.eDRy14Ycc9SID3C2" + }, + { + "name": "Cookery", + "type": "skill", + "img": "systems/sohl/assets/icons/cookery.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @rea", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "lore", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "cook", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "qZdnYA4FJ8ITyM9f", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.qZdnYA4FJ8ITyM9f" + }, + { + "name": "Folklore", + "type": "skill", + "img": "systems/sohl/assets/icons/unicorn.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @wil", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "lore", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "folk", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "neUKfLi6plK5iXN6", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.neUKfLi6plK5iXN6" + }, + { + "name": "Physician", + "type": "skill", + "img": "systems/sohl/assets/icons/caduceus.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @per", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "lore", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "pysn", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "HT9zLRCwgbJitgKe", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.HT9zLRCwgbJitgKe" + }, + { + "name": "Awareness", + "type": "skill", + "img": "systems/sohl/assets/icons/awareness.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @wil", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "awar", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "sD1UI8YRIoKSH0zF", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.sD1UI8YRIoKSH0zF" + }, + { + "name": "Climbing", + "type": "skill", + "img": "systems/sohl/assets/icons/climbing.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @dex", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "clmb", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "QHcBLyeeaaSoZmuZ", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.QHcBLyeeaaSoZmuZ" + }, + { + "name": "Dancing", + "type": "skill", + "img": "systems/sohl/assets/icons/dance.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @end", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "dnce", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "sjPdSBc2NTa4WrEp", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.sjPdSBc2NTa4WrEp" + }, + { + "name": "Jumping", + "type": "skill", + "img": "systems/sohl/assets/icons/jump-across.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @str", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "jump", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 4 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "ieywnJJHcBe01x4y", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.ieywnJJHcBe01x4y" + }, + { + "name": "Riding", + "type": "skill", + "img": "systems/sohl/assets/icons/horse-riding.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @agl", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "ridg", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "SJCbPJE2AtZR0aml", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.SJCbPJE2AtZR0aml" + }, + { + "name": "Stealth", + "type": "skill", + "img": "systems/sohl/assets/icons/stealth.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @per", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "stlth", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "k612ocCxaJj0HJIb", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.k612ocCxaJj0HJIb" + }, + { + "name": "Swimming", + "type": "skill", + "img": "systems/sohl/assets/icons/swimming.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@end, @agl", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "swim", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "icw5Fc2O1wkWEwDn", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.icw5Fc2O1wkWEwDn" + }, + { + "name": "Initiative", + "type": "skill", + "img": "systems/sohl/assets/icons/initiative.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@wil, @rea", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "init", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "B7lnj4HXgf92OfR1", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.B7lnj4HXgf92OfR1" + }, + { + "name": "Shock", + "type": "skill", + "img": "systems/sohl/assets/icons/shock.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@str, @end", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "shok", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "FEKBPzGheb4rCy8W", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.FEKBPzGheb4rCy8W" + }, + { + "name": "Melee", + "type": "skill", + "img": "systems/sohl/assets/icons/crossed-swords.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@dex, @agl", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "melee", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "melee", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "VlPZ5On8yDFy4SmA", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.VlPZ5On8yDFy4SmA" + }, + { + "name": "Dodge", + "type": "skill", + "img": "systems/sohl/assets/icons/dodge.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @per", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "dge", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "zXBoDfzwg30LIS68", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.zXBoDfzwg30LIS68" + }, + { + "name": "Archery", + "type": "skill", + "img": "systems/sohl/assets/icons/striking-arrows.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @dex", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "missile", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "archy", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "ynEE0adOc8NSTRCs", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.ynEE0adOc8NSTRCs" + }, + { + "name": "Throwing", + "type": "skill", + "img": "systems/sohl/assets/icons/throw.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@dex, @per", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "missile", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "thro", + "domain": "", + "baseSkill": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "MeENMaPSfrTPDXCQ", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.MeENMaPSfrTPDXCQ" + }, + { + "name": "Premonition", + "type": "mystery", + "system": { + "subType": "fate", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "domain": "", + "skills": [], + "levelBase": 0, + "charges": { + "usesCharges": true, + "value": 5, + "max": 0 + } + }, + "img": "systems/sohl/assets/icons/sparkles.svg", + "effects": [], + "flags": { + "exportSource": { + "world": "hm-test", + "system": "sohl", + "coreVersion": "12.330", + "systemVersion": "0.9.0" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "vUKAjHjHHVEPU7m6", + "sort": 0, + "_key": "!actors.items!KooPYQcYORLZqrLY.vUKAjHjHHVEPU7m6" + }, + { + "name": "Nadái", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "zLTHkmxXMEynNiKS", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "nadai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.zLTHkmxXMEynNiKS" + }, + { + "name": "Arálius-Fenéri", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "eugoMXEkkAiGK8RU", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "araliusfeneri", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 10, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.eugoMXEkkAiGK8RU" + }, + { + "name": "Môrgath", + "type": "domain", + "img": "systems/sohl/assets/icons/morgath.png", + "_id": "ZJf9yP8jaB59g3H7", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "morgath", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "mor" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.ZJf9yP8jaB59g3H7" + }, + { + "name": "Skôrus-Masâra", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "kaMMQNXRySWZ8AGH", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "skorusmasara", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -10, + "air": 0, + "aura": 10, + "water": 15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.kaMMQNXRySWZ8AGH" + }, + { + "name": "Ùlándus-Arálius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "sDoIMbNEw2IHwlFX", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ulandusaralius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 15, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -5, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.sDoIMbNEw2IHwlFX" + }, + { + "name": "Fenéri", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "L67W93G6kY1myCE4", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "feneri", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -15, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.L67W93G6kY1myCE4" + }, + { + "name": "Masâra", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "G2DKuUfsy8mgIv2r", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "masara", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -15, + "air": -5, + "aura": 5, + "water": 15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.G2DKuUfsy8mgIv2r" + }, + { + "name": "Ùlándus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "0CPkp71Cg18V1m4f", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ulandus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -15, + "aura": -5, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.0CPkp71Cg18V1m4f" + }, + { + "name": "Hîrin", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "jZpDrG8fKMbmugxy", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "hirin", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -15, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 5, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.jZpDrG8fKMbmugxy" + }, + { + "name": "Tai", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "cp37ZBhcYsaDRmNl", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "tai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -5, + "metal": -15, + "fire": -5, + "air": 5, + "aura": 15, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.cp37ZBhcYsaDRmNl" + }, + { + "name": "Navéh", + "type": "domain", + "img": "systems/sohl/assets/icons/naveh.png", + "_id": "OLFz6r4hY9kmzkP9", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "naveh", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "nav" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.OLFz6r4hY9kmzkP9" + }, + { + "name": "Angberélius-Nadái", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "BdiNBZxY2ZHiy6T6", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "angbereliusnadai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 10, + "aura": 0, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.BdiNBZxY2ZHiy6T6" + }, + { + "name": "Haléa", + "type": "domain", + "img": "systems/sohl/assets/icons/halea.png", + "_id": "N3zRxWeYZvwlxT4q", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "halea", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "hal" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.N3zRxWeYZvwlxT4q" + }, + { + "name": "Sárajìn", + "type": "domain", + "img": "systems/sohl/assets/icons/sarajin.png", + "_id": "mWsHjXaWhShRR8jD", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "sarajin", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "kaj" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.mWsHjXaWhShRR8jD" + }, + { + "name": "Skôrus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "9R2UFJfb4F6rWf6Y", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "skorus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -10, + "air": 0, + "aura": 10, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.9R2UFJfb4F6rWf6Y" + }, + { + "name": "Ládo", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "xd0BofnqZdjjbekV", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "lado", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -10, + "aura": 0, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.xd0BofnqZdjjbekV" + }, + { + "name": "Nadái-Hîrin", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "tYGsQsWkV9GqMitw", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "nadaihirin", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.tYGsQsWkV9GqMitw" + }, + { + "name": "Táræl", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "la8XUWBveNmqxzCX", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "tarael", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -10, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.la8XUWBveNmqxzCX" + }, + { + "name": "Ilvîr", + "type": "domain", + "img": "systems/sohl/assets/icons/ilvir.png", + "_id": "TlnuAnWE9fUxlaT3", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "ilvir", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "ivo" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.TlnuAnWE9fUxlaT3" + }, + { + "name": "Hîrin-Táræl", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "8V3ERPK4EoSd11bN", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "hirintarael", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": -10, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.8V3ERPK4EoSd11bN" + }, + { + "name": "Fenéri-Áhnù", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "WatLO5qPon5ibRvg", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "feneriahnu", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 10, + "air": 0, + "aura": -10, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.WatLO5qPon5ibRvg" + }, + { + "name": "Tai-Skôrus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "VotdIWb30aH2Q5qQ", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "taiskorus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -5, + "air": 5, + "aura": 15, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.VotdIWb30aH2Q5qQ" + }, + { + "name": "Áhnù", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "skksYnY3yDtIiuIy", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ahnu", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 10, + "air": 0, + "aura": -10, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.skksYnY3yDtIiuIy" + }, + { + "name": "Masâra-Ládo", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "v6i5sExylYYDZzCj", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "masaralado", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -5, + "aura": 5, + "water": 15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.v6i5sExylYYDZzCj" + }, + { + "name": "Ágrik", + "type": "domain", + "img": "systems/sohl/assets/icons/agrik.png", + "_id": "liLDyl7H9bg765A6", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "agrik", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "agr" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.liLDyl7H9bg765A6" + }, + { + "name": "Siém", + "type": "domain", + "img": "systems/sohl/assets/icons/siem.png", + "_id": "kRr4k967ehwFMe0Y", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "siem", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "zem" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.kRr4k967ehwFMe0Y" + }, + { + "name": "Peóni", + "type": "domain", + "img": "systems/sohl/assets/icons/peoni.png", + "_id": "u8iebOhdBKlZUM2A", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "peoni", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "eon" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.u8iebOhdBKlZUM2A" + }, + { + "name": "Sávè-K'nôr", + "type": "domain", + "img": "systems/sohl/assets/icons/saveknor.png", + "_id": "kAgEL0TXnBRvwMjG", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "saveknor", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "zer" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.kAgEL0TXnBRvwMjG" + }, + { + "name": "Laráni", + "type": "domain", + "img": "systems/sohl/assets/icons/larani.png", + "_id": "Dbk6z8APIxSNr8sz", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "larani", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "ara" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.Dbk6z8APIxSNr8sz" + }, + { + "name": "Angberélius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "koXuZ1UgaRHdNHHD", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "angberelius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 5, + "aura": -5, + "water": -15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.koXuZ1UgaRHdNHHD" + }, + { + "name": "Arálius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "Qm7fuPN2IGQBbl0v", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "aralius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 10, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.Qm7fuPN2IGQBbl0v" + }, + { + "name": "Táræl-Tai", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "UhwDhmGx7wbqzeA9", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "taraeltai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": -5, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 15, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.UhwDhmGx7wbqzeA9" + }, + { + "name": "Ládo-Ùlándus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "JxUMGGPJ6VSIFXPR", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ladoulandus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -10, + "aura": 0, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.JxUMGGPJ6VSIFXPR" + }, + { + "name": "Áhnù-Angberélius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "469ymMXf3TF9Nsdo", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ahnuangberelius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 15, + "air": 5, + "aura": -5, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.469ymMXf3TF9Nsdo" + }, + { + "name": "Humanoid", + "type": "anatomy", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "macros": [], + "nestedItems": [ + { + "name": "Head", + "type": "bodyzone", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Head", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "Head", + "canHoldItem": false, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Skull", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 500 + } + ] + }, + "sort": 100000, + "ownership": { + "default": 0 + }, + "_id": "7PQhH0RPW3mgarTr", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": 0, + "shockValue": 5 + } + } + } + }, + { + "name": "Left Eye", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 15 + } + ] + }, + "sort": 200000, + "ownership": { + "default": 0 + }, + "_id": "6ICSqupyQxwcNj6g", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 5 + } + } + } + }, + { + "name": "Left Ear", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 15 + } + ] + }, + "sort": 300000, + "ownership": { + "default": 0 + }, + "_id": "Q8OozxBISBTZ3bDz", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Left Cheek", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 60 + } + ] + }, + "sort": 400000, + "ownership": { + "default": 0 + }, + "_id": "hzIZI0Owke9AQubt", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Right Eye", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 15 + } + ] + }, + "sort": 500000, + "ownership": { + "default": 0 + }, + "_id": "9rMSR8eFPQWo5V8k", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 5 + } + } + } + }, + { + "name": "Right Ear", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 15 + } + ] + }, + "sort": 600000, + "ownership": { + "default": 0 + }, + "_id": "PixX2PECvkZ3SOAW", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Right Cheek", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 60 + } + ] + }, + "sort": 700000, + "ownership": { + "default": 0 + }, + "_id": "ThzzZLSxOXq2VP6b", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Nose", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 800000, + "ownership": { + "default": 0 + }, + "_id": "CDY7gKxG2yvfajbP", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 5 + } + } + } + }, + { + "name": "Mouth", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 900000, + "ownership": { + "default": 0 + }, + "_id": "g4Xl1EuEtioxrDCn", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Jaw", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 60 + } + ] + }, + "sort": 1000000, + "ownership": { + "default": 0 + }, + "_id": "SZZNPr7cZrik7nfz", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Neck", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 200 + } + ] + }, + "sort": 1100000, + "ownership": { + "default": 0 + }, + "_id": "2l3EsqJFuCD2EUHG", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 3, + "amputatePenalty": -10, + "shockValue": 5 + } + } + } + } + ], + "healthBase": 16, + "aim": [ + { + "name": "Body", + "probWeightBase": 100 + } + ] + }, + "sort": 100000, + "ownership": { + "default": 0 + }, + "_id": "MyQcjX0LLvFrQ1pg" + } + ], + "abbrev": "Head", + "aim": [ + { + "name": "Body", + "probWeightBase": 1 + } + ] + }, + "sort": 100000, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "kethira": { + "zones": [ + 1 + ], + "affectsMobility": true, + "affectedSkills": [ + "Acrobatics", + "Climbing", + "Legerdemain", + "Melee", + "Archery", + "Riding", + "Stealth", + "Swimming" + ], + "affectedAttributes": [ + "Agility", + "Dexterity", + "Strength" + ] + } + } + }, + "_id": "bcFk6Fs6BPoAhF6s" + }, + { + "name": "Arms", + "type": "bodyzone", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Left Arm", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "LArm", + "canHoldItem": true, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Left Shoulder", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 1200000, + "ownership": { + "default": 0 + }, + "_id": "xNR7RIIr2hbi65iM", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 3 + } + } + } + }, + { + "name": "Left Upper Arm", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 1300000, + "ownership": { + "default": 0 + }, + "_id": "jOuIP6ZqNAtDhjHa", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Left Elbow", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 1400000, + "ownership": { + "default": 0 + }, + "_id": "57g71FRbX0LAfgBG", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + }, + { + "name": "Left Forearm", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 1500000, + "ownership": { + "default": 0 + }, + "_id": "RQte995VtKFdD2w6", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Left Hand", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 1600000, + "ownership": { + "default": 0 + }, + "_id": "As2eIA30dWOUzBlF", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 0, + "amputatePenalty": -30, + "shockValue": 2 + } + } + } + } + ], + "healthBase": 8, + "aim": [ + { + "name": "Body", + "probWeightBase": 50 + } + ] + }, + "sort": 200000, + "ownership": { + "default": 0 + }, + "_id": "ImBEii5DA1DZ3wFw" + }, + { + "name": "Right Arm", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "RArm", + "canHoldItem": true, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Right Shoulder", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 1700000, + "ownership": { + "default": 0 + }, + "_id": "Jycxi3XfkecUWvYc", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 3 + } + } + } + }, + { + "name": "Right Upper Arm", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 1800000, + "ownership": { + "default": 0 + }, + "_id": "6Y3dw8uIHAid4M7b", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Right Elbow", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 1900000, + "ownership": { + "default": 0 + }, + "_id": "LcD0USF2dGDatHxK", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + }, + { + "name": "Right Forearm", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 2000000, + "ownership": { + "default": 0 + }, + "_id": "vTeTnNuwyMZdbdeb", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Right Hand", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": true, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 2100000, + "ownership": { + "default": 0 + }, + "_id": "PrlT2ZmDnXLpNOsb", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 0, + "amputatePenalty": -30, + "shockValue": 2 + } + } + } + } + ], + "healthBase": 8, + "aim": [ + { + "name": "Body", + "probWeightBase": 50 + } + ] + }, + "sort": 300000, + "ownership": { + "default": 0 + }, + "_id": "JAFssGAfTThHWANq" + } + ], + "abbrev": "Arms", + "aim": [ + { + "name": "Body", + "probWeightBase": 1 + } + ] + }, + "sort": 200000, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "kethira": { + "zones": [ + 2, + 3 + ], + "affectsMobility": false, + "affectedSkills": [ + "Acrobatics", + "Climbing", + "Legerdemain", + "Melee", + "Archery", + "Riding", + "Swimming" + ], + "affectedAttributes": [ + "Dexterity", + "Strength" + ] + } + } + }, + "_id": "OTTCcQ2tTRqxsMpc" + }, + { + "name": "Torso", + "type": "bodyzone", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Torso", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "Torso", + "canHoldItem": false, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Thorax", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 40 + } + ] + }, + "sort": 2200000, + "ownership": { + "default": 0 + }, + "_id": "rWnf31nfmUokAclz", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Abdomen", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 40 + } + ] + }, + "sort": 2300000, + "ownership": { + "default": 0 + }, + "_id": "CRYzI4zcxRLIuuYk", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 3, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + }, + { + "name": "Pelvis", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": false, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 2400000, + "ownership": { + "default": 0 + }, + "_id": "54AgowkrqoWDkUK4", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": 0, + "shockValue": 4 + } + } + } + } + ], + "healthBase": 16, + "aim": [ + { + "name": "Body", + "probWeightBase": 100 + } + ] + }, + "sort": 400000, + "ownership": { + "default": 0 + }, + "_id": "c6Bbb65mrqMdAakq" + } + ], + "abbrev": "Torso", + "aim": [ + { + "name": "Body", + "probWeightBase": 1 + } + ] + }, + "sort": 300000, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "kethira": { + "zones": [ + 4, + 5, + 6, + 7 + ], + "affectsMobility": true, + "affectedSkills": [ + "Acrobatics", + "Climbing", + "Melee", + "Archery", + "Riding", + "Stealth", + "Swimming" + ], + "affectedAttributes": [ + "Agility", + "Dexterity", + "Strength" + ] + } + } + }, + "_id": "mPe5KXxiwDdf1aXJ" + }, + { + "name": "Legs", + "type": "bodyzone", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Left Leg", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "LLeg", + "canHoldItem": false, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Left Thigh", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 40 + } + ] + }, + "sort": 2500000, + "ownership": { + "default": 0 + }, + "_id": "vGNL3YMSQtoQjIAf", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": -10, + "shockValue": 3 + } + } + } + }, + { + "name": "Left Knee", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 2600000, + "ownership": { + "default": 0 + }, + "_id": "TOW7mrrYm9dI4zlp", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + }, + { + "name": "Left Calf", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 2800000, + "ownership": { + "default": 0 + }, + "_id": "lit9Ia6chec0FJuh", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Left Foot", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 2900000, + "ownership": { + "default": 0 + }, + "_id": "92VySRxEyh82WjOs", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 0, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + } + ], + "healthBase": 8, + "aim": [ + { + "name": "Body", + "probWeightBase": 50 + } + ] + }, + "sort": 500000, + "ownership": { + "default": 0 + }, + "_id": "TnPoBeZ1nnGdChAe" + }, + { + "name": "Right Leg", + "type": "bodypart", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "abbrev": "RLeg", + "canHoldItem": false, + "heldItem": "", + "textReference": "", + "transfer": true, + "macros": [], + "nestedItems": [ + { + "name": "Right Thigh", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 40 + } + ] + }, + "sort": 3000000, + "ownership": { + "default": 0 + }, + "_id": "hupfb22wi4NFjaMR", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 4, + "amputatePenalty": -10, + "shockValue": 3 + } + } + } + }, + { + "name": "Right Knee", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 10 + } + ] + }, + "sort": 3100000, + "ownership": { + "default": 0 + }, + "_id": "fRcVlXmbAzyxByk5", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + }, + { + "name": "Right Calf", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 30 + } + ] + }, + "sort": 3200000, + "ownership": { + "default": 0 + }, + "_id": "USZaJDuGn2SNU9yg", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 5, + "amputatePenalty": -20, + "shockValue": 1 + } + } + } + }, + { + "name": "Right Foot", + "type": "bodylocation", + "img": "systems/sohl/assets/icons/body.svg", + "system": { + "notes": "", + "description": "", + "layers": "", + "quality": 0, + "isFumble": false, + "isStumble": true, + "textReference": "", + "transfer": true, + "armorBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + }, + "macros": [], + "nestedItems": [], + "aim": [ + { + "name": "Body", + "probWeightBase": 20 + } + ] + }, + "sort": 3300000, + "ownership": { + "default": 0 + }, + "_id": "aLkaKGu36quhoe0C", + "flags": { + "sohl": { + "kethira": { + "isRigid": false, + "bleedingSevThreshold": 0, + "amputatePenalty": -20, + "shockValue": 2 + } + } + } + } + ], + "healthBase": 8, + "aim": [ + { + "name": "Body", + "probWeightBase": 50 + } + ] + }, + "sort": 600000, + "ownership": { + "default": 0 + }, + "_id": "V5bPC9hspMHRqlGz" + } + ], + "abbrev": "Legs", + "aim": [ + { + "name": "Body", + "probWeightBase": 1 + } + ] + }, + "sort": 400000, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "kethira": { + "zones": [ + 8, + 9, + 10 + ], + "affectsMobility": true, + "affectedSkills": [ + "Acrobatics", + "Climbing", + "Melee", + "Archery", + "Riding", + "Stealth", + "Swimming" + ], + "affectedAttributes": [ + "Agility", + "Strength" + ] + } + } + }, + "_id": "hlnAcz5PsiHK65xI" + } + ], + "defaultAim": "", + "weaponLimbs": [ + "Left Arm", + "Right Arm", + "Left Arm, Right Arm" + ], + "transfer": false + }, + "sort": 0, + "ownership": { + "default": 3, + "Xk2diVX4vLfJ0Sp8": 3 + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.leg-characteristics.Item.M10pzGVlLgO1zsnh", + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "FW6YpUdnAFALMs15", + "folder": "P390fTDcDdREKmgz", + "_key": "!actors.items!KooPYQcYORLZqrLY.FW6YpUdnAFALMs15" + }, + { + "name": "Unarmed", + "type": "combatmaneuver", + "img": "systems/sohl/assets/icons/high-punch.svg", + "_id": "wbSZ9k4L2mQxwc9w", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [ + { + "name": "Bite", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/fangs.svg", + "_id": "hIozS5g1rEFSqHrL", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": true, + "mode": "Bite", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 4, + "modifier": 0, + "aspect": "piercing" + } + }, + "effects": [ + { + "name": "Bite Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": "5XTIeEPPc9sNS0mN", + "disabled": false, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "" + }, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!vMwD4xyoZAW4qDSy.pQ9YRcot8fJbocKs" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 2, + "lengthBase": 0 + } + } + }, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M" + }, + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3 + } + }, + { + "name": "Grab Hold", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/grab-hold.svg", + "_id": "jBgZ0asqxJQQZXOa", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": true, + "mode": "Grab Hold", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 0, + "die": 0, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Grab Hold Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": "17n3xMjzrvt0GBRP", + "disabled": false, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "" + }, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!B1EfmuOl5CtGQihu.2wpKRk0GtcarYDiu" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4, + "lengthBase": 1 + } + } + }, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M" + }, + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3 + } + }, + { + "name": "Grab Take", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/grab-take.svg", + "_id": "zzjCot4tGhFkNxGE", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": true, + "mode": "Grab Take", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 0, + "die": 0, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Grab Take Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": "eoS20CUy8iqU1Jfi", + "disabled": false, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "" + }, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!rvFq5FepPUInqjxf.pmW5pO68PG2edXDM" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4, + "lengthBase": 1 + } + } + }, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M" + }, + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3 + } + }, + { + "name": "Headbutt", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/headbutt.svg", + "_id": "8YbBCJJ3GwGph8hi", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": true, + "mode": "Headbutt", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 6, + "modifier": -2, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Headbutt Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": "EHeZGmwtf8xuRagi", + "disabled": false, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "" + }, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!pqTDFnehx61A64by.9np3UCkkiY7jXrfm" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4, + "lengthBase": 0 + } + } + }, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M" + }, + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3 + } + }, + { + "name": "Kick", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/high-kick.svg", + "_id": "pqokN4gKBDJ2sRO8", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": true, + "mode": "Kick", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 6, + "modifier": -2, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Kick Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": "geW68WOd0euMGFdH", + "disabled": false, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "" + }, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!8fIXUjAkKWfXRweO.CJTKxlie1nYfdL2q" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4, + "lengthBase": 2 + } + } + }, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M" + }, + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3 + } + }, + { + "name": "Limb Block", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/high-punch.svg", + "_id": "C0Vy8w4LVK40CE6P", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": true, + "mode": "Limb Block", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 0, + "die": 0, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Limb Block Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": "JHmnYaae9dDYUHld", + "disabled": false, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "" + }, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!xFAcnR7IGhEaR66R.BvLLfEhsPFsgLh3B" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 0, + "lengthBase": 1 + } + } + }, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M" + }, + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3 + } + }, + { + "name": "Press", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/push.svg", + "_id": "izcjUVrrnpwD8415", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": true, + "mode": "Press", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 0, + "die": 0, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Press Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": "Z4C49ckcn4Rz8ZxE", + "disabled": false, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "" + }, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!qtcn70JC4Fac5DrZ.rsGf6USPpR6OrzM9" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 0, + "lengthBase": 1 + } + } + }, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M" + }, + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3 + } + }, + { + "name": "Punch", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/punch-blast.svg", + "_id": "QYrhZNP9ciOCVX5g", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": true, + "mode": "Punch", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 6, + "modifier": -3, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Punch Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": "VJ3DgWLzA6mRFw30", + "disabled": false, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "" + }, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!m2qf74BvOkEk0cQx.HekLiZmYPPet6ByF" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4, + "lengthBase": 1 + } + } + }, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M" + }, + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3 + } + }, + { + "name": "Trip", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/trip.svg", + "_id": "vYwek6HdTS8MoYYt", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": true, + "mode": "Trip", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 0, + "die": 0, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Trip Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "_id": "bzwiZNw9NdiGDMX2", + "disabled": false, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "" + }, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!MfUTMbvLNcjIdc0q.lyDBrC6e1Ag4qlMy" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 0, + "lengthBase": 2 + } + } + }, + "_stats": { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M" + }, + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3 + } + } + ], + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.leg-characteristics.Item.B3NcsoGN9cSTKmxD", + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "dv8AthmrwfYNGB1k", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "Xk2diVX4vLfJ0Sp8": 3 + }, + "_key": "!actors.items!KooPYQcYORLZqrLY.wbSZ9k4L2mQxwc9w" + } + ], + "effects": [], + "folder": "B7TbLzcpM0uOivzx", + "flags": { + "exportSource": { + "world": "bandits-of-hegovyn-vale", + "system": "sohl", + "coreVersion": "12.331", + "systemVersion": "0.9.0" + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.331", + "systemId": "sohl", + "systemVersion": "0.3.0", + "createdTime": 1731897360663, + "modifiedTime": 1731897360663, + "lastModifiedBy": "d7ZipxuFhoWeX6Wb" + }, + "sort": 0, + "ownership": { + "default": 0, + "d7ZipxuFhoWeX6Wb": 3 + }, + "_key": "!actors!KooPYQcYORLZqrLY" +} diff --git a/packs/generate/legendary/leg-characters/unique/Fridja_Crm4ZEGtfbNyACCI.json b/packs/generate/legendary/leg-characters/unique/Fridja_Crm4ZEGtfbNyACCI.json new file mode 100644 index 0000000..26b8051 --- /dev/null +++ b/packs/generate/legendary/leg-characters/unique/Fridja_Crm4ZEGtfbNyACCI.json @@ -0,0 +1,7906 @@ +{ + "name": "Fridja", + "type": "entity", + "img": "systems/sohl/assets/silhouette/character-headshot.webp", + "system": { + "macros": [], + "bioImage": "systems/sohl/assets/silhouette/character-bioimage.webp", + "description": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Apparent Age 
Culture 
Social Class 
Height 
Frame 
Weight 
Appearance/Comeliness 
Hair Color 
Eye Color 
Voice 
Obvious Medical Traits
 
Apparent Occupation
 
Apparent Wealth
 
Weapons
 
Armour 
Companions 
Other obvious features 
", + "biography": "

Data

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Birthdate27 Peonu 697
BirthplaceRaldlund, Ivinia
Sibling Rank2 of 3
Parent(s)Gundar and Jofrid Green-Eye
Parent Affiliation 
EstrangementPopular
Clanhead 
Medical Traits 
Psyche Traits 
\n

Life Story

" + }, + "prototypeToken": { + "name": "Fridja", + "displayName": 50, + "actorLink": true, + "appendNumber": false, + "prependAdjective": false, + "width": 1, + "height": 1, + "texture": { + "src": "systems/sohl/assets/silhouette/character-token.svg", + "anchorX": 0.5, + "anchorY": 0.5, + "offsetX": 0, + "offsetY": 0, + "fit": "contain", + "scaleX": 1, + "scaleY": 1, + "rotation": 0, + "tint": "#ffffff", + "alphaThreshold": 0.75 + }, + "hexagonalShape": 0, + "lockRotation": false, + "rotation": 0, + "alpha": 1, + "disposition": -1, + "displayBars": 0, + "bar1": { + "attribute": null + }, + "bar2": { + "attribute": null + }, + "light": { + "negative": false, + "priority": 0, + "alpha": 0.5, + "angle": 360, + "bright": 0, + "color": null, + "coloration": 1, + "dim": 0, + "attenuation": 0.5, + "luminosity": 0.5, + "saturation": 0, + "contrast": 0, + "shadows": 0, + "animation": { + "type": null, + "speed": 5, + "intensity": 5, + "reverse": false + }, + "darkness": { + "min": 0, + "max": 1 + } + }, + "sight": { + "enabled": false, + "range": 0, + "angle": 360, + "visionMode": "basic", + "color": null, + "attenuation": 0.1, + "brightness": 0, + "saturation": 0, + "contrast": 0 + }, + "detectionModes": [], + "occludable": { + "radius": 0 + }, + "ring": { + "enabled": true, + "colors": { + "ring": "#e21898", + "background": "#ffffff" + }, + "effects": 1, + "subject": { + "scale": 1, + "texture": null + } + }, + "flags": {}, + "randomImg": false + }, + "items": [ + { + "name": "Strength", + "img": "systems/sohl/assets/icons/biceps.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "str", + "textValue": "11", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Feeble", + "maxValue": 4 + }, + { + "label": "Weak", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Forceful", + "maxValue": 16 + }, + { + "label": "Mighty", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "n2qSIE4qVFbHGmgL", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.n2qSIE4qVFbHGmgL" + }, + { + "name": "Endurance", + "img": "systems/sohl/assets/icons/climbing.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "end", + "textValue": "9", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Frail", + "maxValue": 4 + }, + { + "label": "Unfit", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Robust", + "maxValue": 16 + }, + { + "label": "Hardy", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "bUm48FhHaYAGSyQC", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.bUm48FhHaYAGSyQC" + }, + { + "name": "Dexterity", + "img": "systems/sohl/assets/icons/juggler.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "dex", + "textValue": "10", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Uncoordinated", + "maxValue": 4 + }, + { + "label": "Awkward", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Deft", + "maxValue": 16 + }, + { + "label": "Adroit", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "2fUKE7bxzbpfSwhF", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.2fUKE7bxzbpfSwhF" + }, + { + "name": "Agility", + "img": "systems/sohl/assets/icons/acrobatics.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "agl", + "textValue": "14", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Blundering", + "maxValue": 4 + }, + { + "label": "Clumsy", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Nimble", + "maxValue": 16 + }, + { + "label": "Graceful", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "yJv9TLfz7GmjUobz", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.yJv9TLfz7GmjUobz" + }, + { + "name": "Perception", + "img": "systems/sohl/assets/icons/awareness.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "per", + "textValue": "11", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Impaired", + "maxValue": 4 + }, + { + "label": "Dulled", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Sharp", + "maxValue": 16 + }, + { + "label": "Acute", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Upc4n7eVQAaILxnx", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.Upc4n7eVQAaILxnx" + }, + { + "name": "Comeliness", + "img": "systems/sohl/assets/icons/charm.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "cml", + "textValue": "14", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Ugly", + "maxValue": 4 + }, + { + "label": "Unattractive", + "maxValue": 8 + }, + { + "label": "Plain", + "maxValue": 12 + }, + { + "label": "Attractive", + "maxValue": 16 + }, + { + "label": "Striking", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "F87Y9FbMdCRRpsEU", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.F87Y9FbMdCRRpsEU" + }, + { + "name": "Aura", + "img": "systems/sohl/assets/icons/aura.svg", + "system": { + "notes": "", + "description": "", + "subType": "transcendent", + "abbrev": "aur", + "textValue": "17", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Mundane", + "maxValue": 4 + }, + { + "label": "Shallow", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Deep", + "maxValue": 16 + }, + { + "label": "Profound", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Pk0DImYAlJScZ9wk", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.Pk0DImYAlJScZ9wk" + }, + { + "name": "Will", + "img": "systems/sohl/assets/icons/will.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "wil", + "textValue": "12", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Submissive", + "maxValue": 4 + }, + { + "label": "Indecisive", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Resolute", + "maxValue": 16 + }, + { + "label": "Implacable", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "X2HZX0tdGjBzIi9S", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.X2HZX0tdGjBzIi9S" + }, + { + "name": "Reasoning", + "img": "systems/sohl/assets/icons/reasoning.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "rea", + "textValue": "10", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Dim", + "maxValue": 4 + }, + { + "label": "Dull", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Sharp", + "maxValue": 16 + }, + { + "label": "Brilliant", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Sibmw3nzuj5ppauE", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.Sibmw3nzuj5ppauE" + }, + { + "name": "Creativity", + "img": "systems/sohl/assets/icons/creativity.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "cre", + "textValue": "15", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Banal", + "maxValue": 4 + }, + { + "label": "Predictable", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Innovative", + "maxValue": 16 + }, + { + "label": "Visionary", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "hcFauvllk69rfUaG", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.hcFauvllk69rfUaG" + }, + { + "name": "Empathy", + "img": "systems/sohl/assets/icons/empathy.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "emp", + "textValue": "14", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Unfeeling", + "maxValue": 4 + }, + { + "label": "Remote", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Understanding", + "maxValue": 16 + }, + { + "label": "Sensitive", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "dIgs2dfJlA5yhqoC", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.dIgs2dfJlA5yhqoC" + }, + { + "name": "Eloquence", + "img": "systems/sohl/assets/icons/oratory.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "elo", + "textValue": "9", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Incoherent", + "maxValue": 4 + }, + { + "label": "Muddled", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Articulate", + "maxValue": 16 + }, + { + "label": "Expressive", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "5tfrG7stXUGt8sHc", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.5tfrG7stXUGt8sHc" + }, + { + "name": "Voice", + "img": "systems/sohl/assets/icons/sing.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "voi", + "textValue": "12", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Jarring", + "maxValue": 4 + }, + { + "label": "Tuneless", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Melodious", + "maxValue": 16 + }, + { + "label": "Dulcet", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "VJL6U0otndLZHMr9", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.VJL6U0otndLZHMr9" + }, + { + "name": "Morality", + "img": "systems/sohl/assets/icons/morality.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "mor", + "textValue": "15", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Amoral", + "maxValue": 2 + }, + { + "label": "Immoral", + "maxValue": 4 + }, + { + "label": "Hipocritical", + "maxValue": 7 + }, + { + "label": "Unscrupulous", + "maxValue": 10 + }, + { + "label": "Conscientious", + "maxValue": 13 + }, + { + "label": "Principled", + "maxValue": 16 + }, + { + "label": "Virtuous", + "maxValue": 18 + }, + { + "label": "Paragon", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "OXFiz5COCmXKxjnK", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.OXFiz5COCmXKxjnK" + }, + { + "name": "Sunsign", + "img": "systems/sohl/assets/icons/astrology.svg", + "system": { + "notes": "", + "description": "", + "subType": "transcendent", + "abbrev": "ss", + "textValue": "aralius", + "isNumeric": false, + "intensity": "trait", + "max": null, + "textReference": "", + "valueDesc": [], + "choices": { + "ulandus": "Ùlándus", + "ulandusaralius": "Ùlándus-Arálius", + "aralius": "Arálius", + "araliusfeneri": "Arálius-Fenéri", + "feneri": "Fenéri", + "feneriahnu": "Fenéri-Áhnù", + "ahnu": "Áhnù", + "ahnuangberelius": "Áhnù-Angberélius", + "angberelius": "Angberélius", + "angbereliusnadai": "Angberélius-Nadái", + "nadai": "Nadái", + "nadaihirin": "Nadái-Hîrin", + "hirin": "Hîrin", + "hirintarael": "Hîrin-Táræl", + "tarael": "Táræl", + "taraeltai": "Táræl-Tai", + "tai": "Tai", + "taiskorus": "Tai-Skôrus", + "skorus": "Skôrus", + "skorusmasara": "Skôrus-Masâra", + "masara": "Masâra", + "masaralado": "Masâra-Ládo", + "lado": "Ládo", + "ladoulandus": "Ládo-Ùlándus" + }, + "macros": [ + { + "name": "Setup Virtual Items", + "type": "script", + "_id": "PZFbSGy377ZmHXud", + "author": "5VOJ7NCf7bEZjieU", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.setupVirtualItems();\nconst values = this.item.getFlag(\"sohl\", \"values\");\nthis.actor.system.$ssMod = values[this.textValue];", + "folder": null, + "sort": 0, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "functionName": "setupVirtualItems", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "_stats": { + "coreVersion": "12.327", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "values": { + "ulandus": { + "label": "Ùlándus", + "cusp": false, + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -15, + "aura": -5, + "water": 5 + } + }, + "ulandusaralius": { + "label": "Ùlándus-Arálius", + "cusp": true, + "ssMod": { + "earth": 15, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -5, + "water": 5 + } + }, + "aralius": { + "label": "Arálius", + "cusp": false, + "ssMod": { + "earth": 10, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -10, + "water": 0 + } + }, + "araliusfeneri": { + "label": "Arálius-Fenéri", + "cusp": true, + "ssMod": { + "earth": 10, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -10, + "water": 0 + } + }, + "feneri": { + "label": "Fenéri", + "cusp": false, + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -15, + "water": -5 + } + }, + "feneriahnu": { + "label": "Fenéri-Áhnù", + "cusp": true, + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 10, + "air": 0, + "aura": -10, + "water": -5 + } + }, + "ahnu": { + "label": "Áhnù", + "cusp": false, + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 10, + "air": 0, + "aura": -10, + "water": -10 + } + }, + "ahnuangberelius": { + "label": "Áhnù-Angberélius", + "cusp": true, + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 15, + "air": 5, + "aura": -5, + "water": -10 + } + }, + "angberelius": { + "label": "Angberélius", + "cusp": false, + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 5, + "aura": -5, + "water": -15 + } + }, + "angbereliusnadai": { + "label": "Angberélius-Nadái", + "cusp": true, + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 10, + "aura": 0, + "water": -10 + } + }, + "nadai": { + "label": "Nadái", + "cusp": false, + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -10 + } + }, + "nadaihirin": { + "label": "Nadái-Hîrin", + "cusp": true, + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -5 + } + }, + "hirin": { + "label": "Hîrin", + "cusp": false, + "ssMod": { + "earth": -15, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 5, + "water": -5 + } + }, + "hirintarael": { + "label": "Hîrin-Táræl", + "cusp": true, + "ssMod": { + "earth": -10, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 10, + "water": 0 + } + }, + "tarael": { + "label": "Táræl", + "cusp": false, + "ssMod": { + "earth": -10, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 10, + "water": 0 + } + }, + "taraeltai": { + "label": "Táræl-Tai", + "cusp": true, + "ssMod": { + "earth": -5, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 15, + "water": 5 + } + }, + "tai": { + "label": "Tai", + "cusp": false, + "ssMod": { + "earth": -5, + "metal": -15, + "fire": -5, + "air": 5, + "aura": 15, + "water": 5 + } + }, + "taiskorus": { + "label": "Tai-Skôrus", + "cusp": true, + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -5, + "air": 5, + "aura": 15, + "water": 10 + } + }, + "skorus": { + "label": "Skôrus", + "cusp": false, + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -10, + "air": 0, + "aura": 10, + "water": 10 + } + }, + "skorusmasara": { + "label": "Skôrus-Masâra", + "cusp": true, + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -10, + "air": 0, + "aura": 10, + "water": 15 + } + }, + "masara": { + "label": "Masâra", + "cusp": false, + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -15, + "air": -5, + "aura": 5, + "water": 15 + } + }, + "masaralado": { + "label": "Masâra-Ládo", + "cusp": true, + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -5, + "aura": 5, + "water": 15 + } + }, + "lado": { + "label": "Ládo", + "cusp": false, + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -10, + "aura": 0, + "water": 10 + } + }, + "ladoulandus": { + "label": "Ládo-Ùlándus", + "cusp": true, + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -10, + "aura": 0, + "water": 10 + } + } + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "mSZhHhqJ5TkgHnpy", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.mSZhHhqJ5TkgHnpy" + }, + { + "name": "Basic Fate", + "type": "trait", + "img": "systems/sohl/assets/icons/user-gear.svg", + "system": { + "subType": "transcendent", + "macros": [ + { + "name": "Setup Virtual Items", + "type": "script", + "_id": "gpnwBsX76ZqKs6Ee", + "author": "RsnPoY20XgcrucTn", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.setupVirtualItems();\nthis.$masteryLevel.disabled = false;\nthis.$masteryLevel.setBase(this.$score.base);\nconst aura = this.actor.getTraitByAbbrev(\"aur\");\nif (aura) {\n this.$masteryLevel.add(\"Aura Secondary Modifier\", \"AuraSM\", aura.system.$masteryLevel.secMod);\n}\nconst ss = this.actor.getTraitByAbbrev(\"ss\");\nif (ss) {\n const values = ss.getFlag(\"sohl\", \"values\");\n const value = values[this.textValue];\n if (value) {\n this.$masteryLevel.add(\"Sunsign Modifier\", \"SS\", value[\"aura\"] || 0);\n }\n}", + "folder": null, + "sort": 0, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "_stats": { + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false, + "abbrev": "fate", + "textValue": "50", + "max": null, + "isNumeric": true, + "intensity": "trait", + "valueDesc": [], + "choices": {} + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "B0i5mxpOVHCbue3R", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.B0i5mxpOVHCbue3R" + }, + { + "name": "Size", + "img": "systems/sohl/assets/icons/body-height.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "siz", + "textValue": "Medium", + "isNumeric": false, + "intensity": "trait", + "max": null, + "textReference": "", + "valueDesc": [], + "choices": { + "tiny": "Tiny", + "small": "Small", + "medium": "Medium", + "large": "Large", + "big": "Big", + "huge": "Huge", + "colossal": "Colossal", + "titanic": "Titanic" + }, + "macros": [ + { + "name": "Setup Virtual Items", + "type": "script", + "_id": "VEMB4c34IFaAaa7W", + "author": "5VOJ7NCf7bEZjieU", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.setupVirtualItems();\nconst sizes = this.item.getFlag(\"sohl\", \"sizes\");\nthis.$params = sizes?.[this.textValue] || {\n maxStr: 19,\n lbs: 400,\n zones: 10,\n target: 1,\n reachMod: 0,\n spaces: 1,\n feet: 5\n};", + "folder": null, + "sort": 0, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "functionName": "setupVirtualItems", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "_stats": { + "coreVersion": "12.329", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "sizes": { + "tiny": { + "maxStr": 4, + "lbs": 20, + "zones": 3, + "target": 1, + "reachMod": -2, + "spaces": 0.5, + "feet": 2 + }, + "small": { + "maxStr": 8, + "lbs": 100, + "zones": 6, + "target": 1, + "reachMod": -1, + "spaces": 1, + "feet": 4 + }, + "medium": { + "maxStr": 19, + "lbs": 400, + "zones": 10, + "target": 1, + "reachMod": 0, + "spaces": 1, + "feet": 5 + }, + "large": { + "maxStr": 29, + "lbs": 800, + "zones": 16, + "target": 2, + "reachMod": 1, + "spaces": 1, + "feet": 6 + }, + "big": { + "maxStr": 39, + "lbs": 1600, + "zones": 20, + "target": 2, + "reachMod": 1, + "spaces": 2, + "feet": 7 + }, + "huge": { + "maxStr": 49, + "lbs": 3200, + "zones": 30, + "target": 3, + "reachMod": 2, + "spaces": 2, + "feet": 9 + }, + "colossal": { + "maxStr": 59, + "lbs": 6400, + "zones": 40, + "target": 4, + "reachMod": 4, + "spaces": 2, + "feet": 10 + }, + "titanic": { + "maxStr": 69, + "lbs": 12800, + "zones": 80, + "target": 8, + "reachMod": 6, + "spaces": 3, + "feet": 15 + } + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "TYQknuqstNxhdHYU", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.TYQknuqstNxhdHYU" + }, + { + "name": "Carrying Capacity", + "type": "trait", + "system": { + "subType": "physique", + "macros": [ + { + "name": "Process Siblings", + "type": "script", + "_id": "Hm2BL94GnC3Y3HYL", + "scope": "global", + "command": "this.processSiblings();\nconst gw = this.actor.system.$gearWeight;\ngw.maxFight.setBase(this.$score.base);\ngw.max.setBase(this.max);", + "flags": { + "sohl": { + "notes": "", + "functionName": "processSiblings", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + } + } + ], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "abbrev": "cap", + "textValue": "50", + "max": 75, + "isNumeric": true, + "intensity": "trait", + "valueDesc": [], + "choices": {}, + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "img": "systems/sohl/assets/icons/carrying-sack.svg", + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "aodQvn7weejpgNUF", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.aodQvn7weejpgNUF" + }, + { + "name": "Move", + "img": "systems/sohl/assets/icons/run.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "mov", + "textValue": "0", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [ + { + "name": "Process Siblings", + "type": "script", + "_id": "yHTQV0aRXKKvoDdT", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.postProcess();\nArray.from(this.actor.allItems()).forEach((it) => {\nif (it.type === \"affliction\" && it.system.subType === \"fatigue\") {\n this.$masteryLevel.add(\n it.name,\n it.system.constructor.subTypeAbbreviation[it.system.subType],\n -it.system.$level.effective,\n );\n}});", + "sort": 0, + "flags": { + "sohl": { + "notes": "", + "functionName": "processSiblings", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "author": "RsnPoY20XgcrucTn", + "folder": null, + "ownership": { + "default": 0 + }, + "_stats": { + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "6zqS6l5pELD5WNLK", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.6zqS6l5pELD5WNLK" + }, + { + "name": "Favored Parts", + "img": "systems/sohl/assets/icons/hands.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "favparts", + "textValue": "Right Arm", + "isNumeric": false, + "intensity": "trait", + "max": null, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "At5JgIDu86qu4WXL", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.At5JgIDu86qu4WXL" + }, + { + "name": "Body Weight", + "img": "systems/sohl/assets/icons/weight.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "wt", + "textValue": "150", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "SPRY7trPlewL5snE", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.SPRY7trPlewL5snE" + }, + { + "name": "Experience Points", + "img": "systems/sohl/assets/icons/beams-aura.svg", + "system": { + "notes": "", + "description": "", + "subType": "transcendent", + "abbrev": "xp", + "textValue": "0", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "0EOnHQBJSDD1Ze6d", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.0EOnHQBJSDD1Ze6d" + }, + { + "name": "Area Attack Shock", + "img": "systems/sohl/assets/icons/shock.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "ashk", + "textValue": "6", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Dsr8bZurkQjSoDAk", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.Dsr8bZurkQjSoDAk" + }, + { + "name": "Charm", + "type": "skill", + "img": "systems/sohl/assets/icons/charm.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@cml, @emp", + "textReference": "", + "masteryLevelBase": 42, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "chrm", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "AmplMGFigl1eyPjQ", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.AmplMGFigl1eyPjQ" + }, + { + "name": "Command", + "type": "skill", + "img": "systems/sohl/assets/icons/rhetoric.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@wil, @elo", + "textReference": "", + "masteryLevelBase": 23, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "cmd", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "IuJNTe5RMkWBV5U0", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.IuJNTe5RMkWBV5U0" + }, + { + "name": "Discourse", + "type": "skill", + "img": "systems/sohl/assets/icons/face-to-face.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @elo", + "textReference": "", + "masteryLevelBase": 20, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "dscr", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "IrHackORm95Ky3uE", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.IrHackORm95Ky3uE" + }, + { + "name": "Guile", + "type": "skill", + "img": "systems/sohl/assets/icons/mischevous.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @cre", + "textReference": "", + "masteryLevelBase": 42, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "guil", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "ZpfmslkdtlVqG0aZ", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.ZpfmslkdtlVqG0aZ" + }, + { + "name": "Intrigue", + "type": "skill", + "img": "systems/sohl/assets/icons/cloak-dagger.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @rea", + "textReference": "", + "masteryLevelBase": 36, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "intr", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "XRc180JAVuYWSrCj", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.XRc180JAVuYWSrCj" + }, + { + "name": "Singing", + "type": "skill", + "img": "systems/sohl/assets/icons/sing.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@voi, @cre", + "textReference": "", + "masteryLevelBase": 39, + "weaponGroup": "none", + "subType": "craft", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "sing", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "0BIKAcwtJjOeXClp", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.0BIKAcwtJjOeXClp" + }, + { + "name": "Theatrics", + "type": "skill", + "img": "systems/sohl/assets/icons/drama-masks.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@cre, @elo", + "textReference": "", + "masteryLevelBase": 12, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "thtcs", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "IKxWaln1RVPl0NkO", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.IKxWaln1RVPl0NkO" + }, + { + "name": "Survival", + "type": "skill", + "img": "systems/sohl/assets/icons/survival.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @wil", + "textReference": "", + "masteryLevelBase": 75, + "weaponGroup": "none", + "subType": "nature", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "srvl", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "CtddqlEfLRRHAD4c", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.CtddqlEfLRRHAD4c" + }, + { + "name": "Drawing", + "type": "skill", + "img": "systems/sohl/assets/icons/drawing.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @dex", + "textReference": "", + "masteryLevelBase": 48, + "weaponGroup": "none", + "subType": "craft", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "draw", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "1ZzrWdFtZ2Eq4JtY", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.1ZzrWdFtZ2Eq4JtY" + }, + { + "name": "Cookery", + "type": "skill", + "img": "systems/sohl/assets/icons/cookery.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @rea", + "textReference": "", + "masteryLevelBase": 22, + "weaponGroup": "none", + "subType": "lore", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "cook", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "u1RHH2HIpZGCabHq", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.u1RHH2HIpZGCabHq" + }, + { + "name": "Folklore", + "type": "skill", + "img": "systems/sohl/assets/icons/unicorn.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @wil", + "textReference": "", + "masteryLevelBase": 45, + "weaponGroup": "none", + "subType": "lore", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "folk", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "ES7lVuEcIxTGZkOD", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.ES7lVuEcIxTGZkOD" + }, + { + "name": "Physician", + "type": "skill", + "img": "systems/sohl/assets/icons/caduceus.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @per", + "textReference": "", + "masteryLevelBase": 50, + "weaponGroup": "none", + "subType": "lore", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "pysn", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "rwbiIbeCgF1Kl6UC", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.rwbiIbeCgF1Kl6UC" + }, + { + "name": "Awareness", + "type": "skill", + "img": "systems/sohl/assets/icons/awareness.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @wil", + "textReference": "", + "masteryLevelBase": 33, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "awar", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "S9LkWGVNcI80BMmq", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.S9LkWGVNcI80BMmq" + }, + { + "name": "Climbing", + "type": "skill", + "img": "systems/sohl/assets/icons/climbing.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @dex", + "textReference": "", + "masteryLevelBase": 36, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "clmb", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "XIh9lOpQt7QGNgH0", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.XIh9lOpQt7QGNgH0" + }, + { + "name": "Dancing", + "type": "skill", + "img": "systems/sohl/assets/icons/dance.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @end", + "textReference": "", + "masteryLevelBase": 24, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "dnce", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "llyiJJEb6rgF6WVE", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.llyiJJEb6rgF6WVE" + }, + { + "name": "Jumping", + "type": "skill", + "img": "systems/sohl/assets/icons/jump-across.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @str", + "textReference": "", + "masteryLevelBase": 39, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "jump", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 4, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "es1rBa8YJcDZN9EJ", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.es1rBa8YJcDZN9EJ" + }, + { + "name": "Riding", + "type": "skill", + "img": "systems/sohl/assets/icons/horse-riding.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @agl", + "textReference": "", + "masteryLevelBase": 14, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "ridg", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "voDwnQDAi88Q1cTN", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.voDwnQDAi88Q1cTN" + }, + { + "name": "Stealth", + "type": "skill", + "img": "systems/sohl/assets/icons/stealth.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @per", + "textReference": "", + "masteryLevelBase": 42, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "stlth", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "hYLk5x20jK3t6zc4", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.hYLk5x20jK3t6zc4" + }, + { + "name": "Swimming", + "type": "skill", + "img": "systems/sohl/assets/icons/swimming.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@end, @agl", + "textReference": "", + "masteryLevelBase": 11, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "swim", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "rqZqxFwaoxffWI9v", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.rqZqxFwaoxffWI9v" + }, + { + "name": "Initiative", + "type": "skill", + "img": "systems/sohl/assets/icons/initiative.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@wil, @rea", + "textReference": "", + "masteryLevelBase": 33, + "weaponGroup": "none", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "init", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Ra3oGqSukY01rZCY", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.Ra3oGqSukY01rZCY" + }, + { + "name": "Shock", + "type": "skill", + "img": "systems/sohl/assets/icons/shock.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@str, @end", + "textReference": "", + "masteryLevelBase": 33, + "weaponGroup": "none", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "shok", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "zHHiRHrpDISmgOE2", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.zHHiRHrpDISmgOE2" + }, + { + "name": "Melee", + "type": "skill", + "img": "systems/sohl/assets/icons/crossed-swords.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@dex, @agl", + "textReference": "", + "masteryLevelBase": 24, + "weaponGroup": "melee", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "melee", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "BlTnwOycn45ke2pC", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.BlTnwOycn45ke2pC" + }, + { + "name": "Dodge", + "type": "skill", + "img": "systems/sohl/assets/icons/dodge.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @per", + "textReference": "", + "masteryLevelBase": 26, + "weaponGroup": "none", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "dge", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "RrKwWss5Nq5kdSeC", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.RrKwWss5Nq5kdSeC" + }, + { + "name": "Archery", + "type": "skill", + "img": "systems/sohl/assets/icons/striking-arrows.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @dex", + "textReference": "", + "masteryLevelBase": 11, + "weaponGroup": "missile", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "archy", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "LQbXDLfwxWm0j2gi", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.LQbXDLfwxWm0j2gi" + }, + { + "name": "Throwing", + "type": "skill", + "img": "systems/sohl/assets/icons/throw.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@dex, @per", + "textReference": "", + "masteryLevelBase": 20, + "weaponGroup": "missile", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "thro", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "YKFfDNYPQ4KYxV0B", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.YKFfDNYPQ4KYxV0B" + }, + { + "name": "Premonition", + "type": "mystery", + "system": { + "subType": "fate", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "domain": "", + "levelBase": 0, + "charges": { + "usesCharges": true, + "value": 5, + "max": 0 + }, + "skills": [] + }, + "img": "systems/sohl/assets/icons/sparkles.svg", + "effects": [], + "flags": { + "exportSource": { + "world": "hm-test", + "system": "sohl", + "coreVersion": "12.330", + "systemVersion": "0.9.0" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "zMzMpGhhCg48QfK7", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.zMzMpGhhCg48QfK7" + }, + { + "name": "Bite", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/fangs.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 0, + "impactBase": { + "die": 4, + "modifier": 0, + "aspect": "piercing", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Bite Traits", + "origin": "Actor.BmzNJK44MVywOa1t.Item.2o2XhQXyQB7R8yor", + "_id": "Jh2naQoAd90Bxcmi", + "changes": [ + { + "key": "system.traits.impactTAMod", + "mode": 5, + "value": "3", + "priority": null + }, + { + "key": "system.traits.lowStrike", + "mode": 2, + "value": "-20", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!Crm4ZEGtfbNyACCI.2o2XhQXyQB7R8yor.Jh2naQoAd90Bxcmi" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 2 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "2o2XhQXyQB7R8yor", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.2o2XhQXyQB7R8yor" + }, + { + "name": "Grab (Hold)", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/grab-hold.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "numDice": 0, + "die": 1, + "modifier": 0, + "aspect": "blunt" + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Grab (Hold) Traits", + "origin": "Actor.BmzNJK44MVywOa1t.Item.1gTdui1KxIQdjozS", + "_id": "tLb3IbqT4a5uZsg0", + "changes": [ + { + "key": "system.traits.strRoll", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noStrMod", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!Crm4ZEGtfbNyACCI.1gTdui1KxIQdjozS.tLb3IbqT4a5uZsg0" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "1gTdui1KxIQdjozS", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.1gTdui1KxIQdjozS" + }, + { + "name": "Grab (Take)", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/grab-take.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "numDice": 0, + "die": 1, + "modifier": 0, + "aspect": "blunt" + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Grab (Hold) Traits", + "origin": "Actor.BmzNJK44MVywOa1t.Item.52pc9Y0mHyIzjMBf", + "_id": "80Le8vlDzYbm5zOz", + "changes": [ + { + "key": "system.traits.strRoll", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noStrMod", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!Crm4ZEGtfbNyACCI.52pc9Y0mHyIzjMBf.80Le8vlDzYbm5zOz" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "52pc9Y0mHyIzjMBf", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.52pc9Y0mHyIzjMBf" + }, + { + "name": "Headbutt", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/headbutt.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 0, + "impactBase": { + "die": 6, + "modifier": 0, + "aspect": "blunt", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Headbutt Traits", + "origin": "Actor.BmzNJK44MVywOa1t.Item.YPdZTxgS196h1P92", + "_id": "pRvNFHvpsFgvh65a", + "changes": [ + { + "key": "system.traits.lowStrike", + "mode": 2, + "value": "-20", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!Crm4ZEGtfbNyACCI.YPdZTxgS196h1P92.pRvNFHvpsFgvh65a" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "YPdZTxgS196h1P92", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.YPdZTxgS196h1P92" + }, + { + "name": "Limb Block", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/high-punch.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "numDice": 0, + "die": 1, + "modifier": 0, + "aspect": "blunt" + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Limb Block Traits", + "origin": "Actor.BmzNJK44MVywOa1t.Item.yZ5FFip37dN8yiiB", + "_id": "vBzDOY0EEIvlhV9p", + "changes": [ + { + "key": "system.traits.noAttack", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!Crm4ZEGtfbNyACCI.yZ5FFip37dN8yiiB.vBzDOY0EEIvlhV9p" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 0 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "yZ5FFip37dN8yiiB", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.yZ5FFip37dN8yiiB" + }, + { + "name": "Kick", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/high-kick.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 2, + "impactBase": { + "die": 6, + "modifier": 0, + "aspect": "blunt", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Kick Traits", + "origin": "Actor.BmzNJK44MVywOa1t.Item.YdkmAyoAovM2IpOy", + "_id": "pDNFKukg4vaahtJR", + "changes": [ + { + "key": "system.traits.lowAim", + "mode": 2, + "value": "-20", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!Crm4ZEGtfbNyACCI.YdkmAyoAovM2IpOy.pDNFKukg4vaahtJR" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "YdkmAyoAovM2IpOy", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.YdkmAyoAovM2IpOy" + }, + { + "name": "Press", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/push.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "numDice": 0, + "die": 1, + "modifier": 0, + "aspect": "blunt" + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Press Traits", + "origin": "Actor.BmzNJK44MVywOa1t.Item.OulzDc9ck1WAuDfa", + "_id": "8DZUnu0NIgDCsvHg", + "changes": [ + { + "key": "system.traits.strRoll", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noStrMod", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!Crm4ZEGtfbNyACCI.OulzDc9ck1WAuDfa.8DZUnu0NIgDCsvHg" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 0 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "OulzDc9ck1WAuDfa", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.OulzDc9ck1WAuDfa" + }, + { + "name": "Punch", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/punch-blast.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "die": 6, + "modifier": 0, + "aspect": "blunt", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Punch Traits", + "origin": "Actor.BmzNJK44MVywOa1t.Item.rYacKrJNW8EleuGI", + "_id": "V2B2dpCf6MHaj7Nh", + "changes": [ + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.impactTAMod", + "mode": 2, + "value": "2", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!Crm4ZEGtfbNyACCI.rYacKrJNW8EleuGI.V2B2dpCf6MHaj7Nh" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "rYacKrJNW8EleuGI", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.rYacKrJNW8EleuGI" + }, + { + "name": "Trip", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/trip.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 2, + "impactBase": { + "die": 1, + "modifier": 0, + "aspect": "blunt", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Trip Traits", + "origin": "Actor.BmzNJK44MVywOa1t.Item.xhxxFL9aXnzQYL4Q", + "_id": "Dcc6Z7IFoCcae0ZV", + "changes": [ + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noStrMod", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.strRoll", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!Crm4ZEGtfbNyACCI.xhxxFL9aXnzQYL4Q.Dcc6Z7IFoCcae0ZV" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 0 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "xhxxFL9aXnzQYL4Q", + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.xhxxFL9aXnzQYL4Q" + }, + { + "name": "Ivínian", + "type": "skill", + "img": "systems/sohl/assets/icons/speaking.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@elo, @rea", + "textReference": "", + "masteryLevelBase": 65, + "weaponGroup": "none", + "subType": "language", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "ivinian", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.2yfbMe6ZTqPR1nFb", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "evxGl6bHAVpxkHmN", + "_id": "EwyWa0yZPIBcT4oO", + "sort": 900000, + "ownership": { + "default": 0, + "osJE0diDAAoo8Ydn": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.EwyWa0yZPIBcT4oO" + }, + { + "name": "Jârin", + "type": "skill", + "img": "systems/sohl/assets/icons/speaking.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@elo, @rea", + "textReference": "", + "masteryLevelBase": 42, + "weaponGroup": "none", + "subType": "language", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "jarin", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.MONOo4chhMcTu1pG", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "evxGl6bHAVpxkHmN", + "_id": "17ddeyvtRY13GN87", + "sort": 800000, + "ownership": { + "default": 0, + "osJE0diDAAoo8Ydn": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.17ddeyvtRY13GN87" + }, + { + "name": "Hârnic", + "type": "skill", + "img": "systems/sohl/assets/icons/speaking.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@elo, @rea", + "textReference": "", + "masteryLevelBase": 42, + "weaponGroup": "none", + "subType": "language", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "harnic", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.woFaMUgznLPQREME", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "evxGl6bHAVpxkHmN", + "_id": "YTb9VcYs5Vbvl2fV", + "sort": 1100000, + "ownership": { + "default": 0, + "osJE0diDAAoo8Ydn": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.YTb9VcYs5Vbvl2fV" + }, + { + "name": "Sárajìn", + "type": "skill", + "img": "systems/sohl/assets/icons/sarajin.png", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@wil, @rea", + "textReference": "", + "masteryLevelBase": 11, + "weaponGroup": "none", + "subType": "ritual", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "sarajin", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.4N4tdZFvVVXQeNcq", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "7ndtuoO1haJpQbgf", + "_id": "EmYzYmRuaaYR2Y1k", + "sort": 101563, + "ownership": { + "default": 0, + "osJE0diDAAoo8Ydn": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.EmYzYmRuaaYR2Y1k" + }, + { + "name": "Ilvîr", + "type": "skill", + "img": "systems/sohl/assets/icons/ilvir.png", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@wil, @rea", + "textReference": "", + "masteryLevelBase": 11, + "weaponGroup": "none", + "subType": "ritual", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "ilvir", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.BL0SMfIJsWRVDXsP", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "7ndtuoO1haJpQbgf", + "_id": "Yy92yraYwvsRYyAq", + "sort": 150000, + "ownership": { + "default": 0, + "osJE0diDAAoo8Ydn": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.Yy92yraYwvsRYyAq" + }, + { + "name": "Runic", + "type": "skill", + "img": "systems/sohl/assets/icons/scroll-unfurled.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @per", + "textReference": "", + "masteryLevelBase": 20, + "weaponGroup": "none", + "subType": "script", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "runic", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.zhF7K76YOQR30Vfg", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "evxGl6bHAVpxkHmN", + "_id": "LI8XLcsZEr2LJiCB", + "sort": 100025, + "ownership": { + "default": 0, + "osJE0diDAAoo8Ydn": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.LI8XLcsZEr2LJiCB" + }, + { + "name": "Lakíse", + "type": "skill", + "img": "systems/sohl/assets/icons/scroll-unfurled.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @per", + "textReference": "", + "masteryLevelBase": 15, + "weaponGroup": "none", + "subType": "script", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "lakise", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.DiFLbQpEF1ZJm262", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "evxGl6bHAVpxkHmN", + "_id": "EQv6FlHuBhCmqTdz", + "sort": 100098, + "ownership": { + "default": 0, + "osJE0diDAAoo8Ydn": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.EQv6FlHuBhCmqTdz" + }, + { + "name": "Animalcraft", + "type": "skill", + "img": "systems/sohl/assets/icons/animalcraft.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @wil", + "textReference": "", + "masteryLevelBase": 13, + "weaponGroup": "none", + "subType": "nature", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "anmcft", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.K1sBrJikLWiQIjjB", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "9dJU1q9ijfWF6Qlp", + "folder": "I7NdWG9IXkYkhYci", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.9dJU1q9ijfWF6Qlp" + }, + { + "name": "Herblore", + "type": "skill", + "img": "systems/sohl/assets/icons/herblore.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @per", + "textReference": "", + "masteryLevelBase": 92, + "weaponGroup": "none", + "subType": "nature", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "herb", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.d6bv7kUA4uEgtGOw", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "u3677db5uUR4k6xY", + "folder": "I7NdWG9IXkYkhYci", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.u3677db5uUR4k6xY" + }, + { + "name": "Tracking", + "type": "skill", + "img": "systems/sohl/assets/icons/tracking.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @rea", + "textReference": "", + "masteryLevelBase": 33, + "weaponGroup": "none", + "subType": "nature", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "trak", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.r84g3zzaBmp1zDl4", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "3VPyRa7AjTknbpk2", + "folder": "I7NdWG9IXkYkhYci", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.3VPyRa7AjTknbpk2" + }, + { + "name": "Trance", + "type": "skill", + "img": "systems/sohl/assets/icons/meditation.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@aur, @cre", + "textReference": "", + "masteryLevelBase": 80, + "weaponGroup": "none", + "subType": "esoteric", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "trnc", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.QUY1z2KG9kreEJTr", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "JmDMMNIxfuROyYAF", + "folder": "I7NdWG9IXkYkhYci", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "RsnPoY20XgcrucTn": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.JmDMMNIxfuROyYAF" + }, + { + "folder": "BXfH5cKFM0lUbyhg", + "name": "Sensitivity", + "type": "mysticalability", + "_id": "R0sby33lpxXb3de2", + "img": "systems/sohl/assets/icons/psionics.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@aur, @wil", + "textReference": "", + "masteryLevelBase": 48, + "subType": "arcanetalent", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "domain": "", + "transfer": false, + "abbrev": "snst", + "levelBase": 0, + "charges": { + "usesCharges": false, + "value": 0, + "max": 0 + } + }, + "effects": [], + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.GvNrbskSwZjdAamV", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.R0sby33lpxXb3de2" + }, + { + "folder": "BXfH5cKFM0lUbyhg", + "name": "Elemental Bolt", + "type": "mysticalability", + "_id": "EfS89UmNOE5kAmyu", + "img": "systems/sohl/assets/icons/psionics.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@aur, @wil", + "textReference": "", + "masteryLevelBase": 51, + "subType": "arcanetalent", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "domain": "", + "transfer": false, + "abbrev": "eblt", + "levelBase": 0, + "charges": { + "usesCharges": false, + "value": 0, + "max": 0 + } + }, + "effects": [], + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.gDV7D2Cmb3Ww5sBe", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.EfS89UmNOE5kAmyu" + }, + { + "name": "Staff", + "type": "weapongear", + "img": "systems/sohl/assets/icons/staff.svg", + "system": { + "macros": [], + "nestedItems": [ + { + "name": "Staff (Crush)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Crush", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 6, + "modifier": 3, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Staff Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 3, + "priority": null + }, + { + "key": "system.$traits.swung", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.$traits.twoHandLen", + "mode": 2, + "value": -1, + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Crush", + "onsetTime": 0 + } + }, + "_id": "zNhrqu7rG98bWjcS", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!jWw9oGraqYYwdZOz.QS2jZpQvHVm4edTR" + } + ], + "flags": {}, + "_id": "qK0rfvOFaVtqIcTo", + "_key": "!items!jWw9oGraqYYwdZOz", + "sort": 100000 + }, + { + "name": "Staff (Shaft)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Shaft", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 6, + "modifier": 1, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Staff Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "mod:system.$length", + "mode": 2, + "value": -2, + "priority": null + }, + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 3, + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Shaft", + "onsetTime": 0 + } + }, + "_id": "Za3vLDVwofTJvqqd", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!GmxhLs1EFGlzZg6H.13eLz7S95RYMYUJ6" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 8 + } + } + }, + "_id": "iSIsw8GyTvyvgiCH", + "_key": "!items!GmxhLs1EFGlzZg6H", + "sort": 200000 + }, + { + "name": "Staff (Half-Sword Shaft)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Half-Sword Shaft", + "minParts": 2, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 6, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Staff Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "mod:system.$length", + "mode": 2, + "value": -2, + "priority": null + }, + { + "key": "mod:system.$length", + "mode": 4, + "value": 3, + "priority": null + }, + { + "key": "system.$traits.halfSword", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 3, + "priority": null + }, + { + "key": "system.$traits.thrust", + "mode": 5, + "value": "true", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Half-Sword Shaft", + "onsetTime": 0 + } + }, + "_id": "h8ePOndcB5c4Rb2x", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!3wvWWmndeimjciMF.shz8RgTQ5B7Nii09" + } + ], + "flags": { + "sohl": { + "kethira": {} + } + }, + "_id": "rFPwVXSUqG9n20iv", + "_key": "!items!3wvWWmndeimjciMF", + "sort": 300000 + } + ], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 4, + "valueBase": 24, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 11, + "abbrev": "Stf", + "heftBase": 12, + "lengthBase": 6 + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.MHe30MVgUd2B7AXS", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "Z7oYjBojnCNpPrFt", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.Z7oYjBojnCNpPrFt" + }, + { + "name": "Dagger", + "type": "weapongear", + "img": "systems/sohl/assets/icons/broad-dagger.svg", + "system": { + "macros": [], + "nestedItems": [ + { + "name": "Dagger (Impale)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Impale", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 8, + "modifier": 2, + "aspect": "piercing" + } + }, + "effects": [ + { + "name": "Dagger Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 4, + "priority": null + }, + { + "key": "system.$traits.thrust", + "mode": 5, + "value": "true", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Impale", + "onsetTime": 0 + } + }, + "_id": "OGbC0EZr6stwMDKd", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!D1K2tze7iNK1plqh.ztnzpqYPv62ih6hY" + } + ], + "flags": {}, + "_id": "MxiNMkDmWq1avWlU", + "_key": "!items!D1K2tze7iNK1plqh", + "sort": 100000 + }, + { + "name": "Dagger (Cut)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Cut", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 10, + "modifier": 1, + "aspect": "edged" + } + }, + "effects": [ + { + "name": "Dagger Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 5, + "priority": null + }, + { + "key": "system.$traits.swung", + "mode": 5, + "value": "true", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Cut", + "onsetTime": 0 + } + }, + "_id": "DQzGprpfY4SQQTO7", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!B0FtAea9Dop60ajy.BXDhjA70TRFAJMWC" + } + ], + "flags": {}, + "_id": "SS7Gark9sYaA9ygJ", + "_key": "!items!B0FtAea9Dop60ajy", + "sort": 200000 + }, + { + "name": "Dagger (Pommel)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Pommel", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "numDice": 1, + "die": 6, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Dagger Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "mod:system.$length", + "mode": 5, + "value": 1, + "priority": null + }, + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 3, + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Pommel", + "onsetTime": 0 + } + }, + "_id": "LI5ZgE67TKIj6Cp1", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!6nxQJIEFijtyiYN7.MgdVLXEemfrSq1BN" + } + ], + "flags": { + "sohl": { + "kethira": { + "zoneDie": 4 + } + } + }, + "_id": "iCfObNpmDK8LuOpH", + "_key": "!items!6nxQJIEFijtyiYN7", + "sort": 300000 + } + ], + "notes": "In sheath on right hip", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 1, + "valueBase": 24, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 11, + "abbrev": "Dgr", + "heftBase": 7, + "lengthBase": 3 + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.9ijT9drcTK805O5F", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "IKFJoRlW5AnxJjkr", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.IKFJoRlW5AnxJjkr" + }, + { + "name": "Worsted Dress", + "type": "armorgear", + "img": "systems/sohl/assets/icons/dress.svg", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 3.2, + "valueBase": 190, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 9, + "abbrev": "WDress", + "material": "Worsted", + "locations": { + "flexible": [ + "Left Shoulder", + "Right Shoulder", + "Left Upper Arm", + "Right Upper Arm", + "Left Elbow", + "Right Elbow", + "Left Forearm", + "Right Forearm", + "Thorax", + "Abdomen", + "Pelvis", + "Left Thigh", + "Right Thigh", + "Left Knee", + "Right Knee", + "Left Calf", + "Right Calf" + ], + "rigid": [] + }, + "protectionBase": { + "blunt": 0, + "edged": 1, + "piercing": 0, + "fire": 1 + } + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.wPcQ8ykyivZCyikd", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "jumZZ38k9SDXIEbI", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.jumZZ38k9SDXIEbI" + }, + { + "name": "Worsted Cowl", + "type": "armorgear", + "img": "systems/sohl/assets/icons/hood.svg", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 0.2, + "valueBase": 14, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 9, + "abbrev": "WCowl", + "material": "Worsted", + "locations": { + "flexible": [ + "Skull", + "Neck" + ], + "rigid": [] + }, + "protectionBase": { + "blunt": 0, + "edged": 1, + "piercing": 0, + "fire": 1 + } + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.HwAZqhOppRIqVbJs", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "ao0OGDFW2GhSZ6MR", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.ao0OGDFW2GhSZ6MR" + }, + { + "name": "Russet Gloves", + "type": "armorgear", + "img": "systems/sohl/assets/icons/gloves.svg", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 0.2, + "valueBase": 24, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 7, + "abbrev": "RGlv", + "material": "Russet", + "locations": { + "flexible": [ + "Left Hand", + "Right Hand" + ], + "rigid": [] + }, + "protectionBase": { + "blunt": 0, + "edged": 0, + "piercing": 0, + "fire": 0 + } + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.WNrm1UMM4JpiawVA", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "mhlpfVbY89xCRsSh", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.mhlpfVbY89xCRsSh" + }, + { + "name": "Rawhide Calf Boots", + "type": "armorgear", + "img": "systems/sohl/assets/icons/leather-boot.svg", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 2.9, + "valueBase": 76, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 11, + "abbrev": "LtCBoot", + "material": "Rawhide", + "locations": { + "flexible": [ + "Left Calf", + "Right Calf", + "Left Foot", + "Right Foot" + ], + "rigid": [] + }, + "protectionBase": { + "blunt": 1, + "edged": 2, + "piercing": 1, + "fire": 3 + } + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.oOOMdsP9QBnFL6yp", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "u9ILM0RvGz5pBZoY", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.u9ILM0RvGz5pBZoY" + }, + { + "name": "Backpack", + "type": "containergear", + "img": "systems/sohl/assets/icons/sack.svg", + "system": { + "notes": "", + "description": "", + "quantity": 1, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 8, + "textReference": "", + "macros": [], + "nestedItems": [ + { + "name": "Rations, Standard", + "type": "miscgear", + "img": "systems/sohl/assets/icons/miscgear.svg", + "system": { + "notes": "1 day/person, shelf life 10 days", + "description": "", + "quantity": 1, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 7, + "textReference": "", + "macros": [], + "nestedItems": [], + "valueBase": 2, + "weightBase": 3, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.0jGZS74JTgQ4lTrA", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": 1723386207795, + "modifiedTime": 1723386207795, + "lastModifiedBy": "RsnPoY20XgcrucTn" + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "zYjDGWXDOprd31UP", + "folder": null, + "sort": 200000 + } + ], + "maxCapacityBase": 30, + "valueBase": 30, + "weightBase": 2, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.rMnbWzyue0vPuDdS", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "G2xcqbNDccg9MIZx", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.G2xcqbNDccg9MIZx" + }, + { + "name": "Bedroll, heavy", + "type": "miscgear", + "img": "systems/sohl/assets/icons/sleeping-bag.svg", + "system": { + "notes": "Tied under backpack", + "description": "", + "quantity": 1, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 7, + "textReference": "", + "macros": [], + "nestedItems": [], + "valueBase": 100, + "weightBase": 10, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.I6gNf8y6ZgxFgxdI", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "VAe5wR9YJPLTtAUg", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.VAe5wR9YJPLTtAUg" + }, + { + "name": "Waterskin, 2qt.", + "type": "containergear", + "img": "systems/sohl/assets/icons/miscgear.svg", + "system": { + "notes": "Tied at waist", + "description": "", + "quantity": 1, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 7, + "textReference": "", + "macros": [], + "nestedItems": [ + { + "name": "Water, 1pt.", + "type": "concoctiongear", + "img": "systems/sohl/assets/icons/potion.svg", + "system": { + "notes": "", + "description": "", + "quantity": 1, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 0, + "textReference": "", + "subType": "mundane", + "potency": "na", + "strength": 0, + "macros": [], + "nestedItems": [], + "valueBase": 0, + "weightBase": 4, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.QrVx5mD4WSidHTTV", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": 1723386198359, + "modifiedTime": 1723386198359, + "lastModifiedBy": "RsnPoY20XgcrucTn" + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "ynXtkKNe4FcAM1AZ", + "folder": null, + "sort": 100000 + } + ], + "maxCapacityBase": 4, + "valueBase": 24, + "weightBase": 1, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.DdlmMVb2ldCpGzkk", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "78RdpAKXSHWycLvW", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.78RdpAKXSHWycLvW" + }, + { + "name": "Belt pouch, leather, med", + "type": "containergear", + "img": "systems/sohl/assets/icons/sack.svg", + "system": { + "notes": "", + "description": "", + "quantity": 1, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 8, + "textReference": "", + "macros": [], + "nestedItems": [ + { + "name": "Pence", + "type": "miscgear", + "img": "systems/sohl/assets/icons/coins.svg", + "system": { + "notes": "", + "description": "", + "quantity": 63, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 10, + "textReference": "", + "macros": [], + "nestedItems": [], + "valueBase": 1, + "weightBase": 0.004, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.cIPNCrBR04BqbtqJ", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": 1723386161886, + "modifiedTime": 1723386265922, + "lastModifiedBy": "RsnPoY20XgcrucTn" + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "XXPAwkDTbX76Ywlq", + "folder": null, + "sort": 100000 + }, + { + "name": "Bandage", + "type": "miscgear", + "img": "systems/sohl/assets/icons/bandage-roll.svg", + "system": { + "notes": "1 bandage per IL for CLEAN & DRESS treatment; STAUNCH treatment uses d6 bandages per Bloodloss Point", + "description": "", + "quantity": 16, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 7, + "textReference": "", + "macros": [], + "nestedItems": [], + "valueBase": 0.75, + "weightBase": 0.1, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.28T0XYglrvCALMTy", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": 1723386190433, + "modifiedTime": 1723386280573, + "lastModifiedBy": "RsnPoY20XgcrucTn" + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "LaHXB55pivyFs3hF", + "folder": null, + "sort": 200000 + } + ], + "maxCapacityBase": 3, + "valueBase": 4, + "weightBase": 0.5, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.JMXUmoqI6uWt5LN4", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "vwcudN2ORCDuO09p", + "folder": null, + "sort": 0, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.vwcudN2ORCDuO09p" + }, + { + "name": "Ilvirian Piety", + "type": "mystery", + "system": { + "subType": "piety", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "domain": "ilvir", + "levelBase": 0, + "charges": { + "usesCharges": true, + "value": 1, + "max": 1 + }, + "skills": [] + }, + "_id": "aB5V7amqPxqUuaRh", + "img": "systems/sohl/assets/icons/sparkles.svg", + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.aB5V7amqPxqUuaRh" + }, + { + "folder": "BXfH5cKFM0lUbyhg", + "name": "Spirit", + "type": "mysticalability", + "_id": "xBZ3vbgJw0ez7YOh", + "img": "systems/sohl/assets/icons/psionics.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@aur, @wil", + "textReference": "", + "masteryLevelBase": 88, + "subType": "arcanetalent", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "domain": "", + "transfer": false, + "abbrev": "sprt", + "levelBase": 0, + "charges": { + "usesCharges": false, + "value": 0, + "max": 0 + } + }, + "effects": [], + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.kethira-basic-items.Item.lKVbkvzIGDFCC3UI", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.xBZ3vbgJw0ez7YOh" + }, + { + "name": "Crow", + "type": "domain", + "img": "systems/sohl/assets/icons/crow.svg", + "_id": "aVPLLAn3Cvqb72Cr", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [], + "abbrev": "crow", + "philosophy": "Totem" + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.mysteries.Item.gqv7Cco3Axw0FaAt", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "ZJzBrmBAMjcUijuX", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.aVPLLAn3Cvqb72Cr" + }, + { + "name": "Crow: Curious and Resourceful", + "type": "mystery", + "img": "systems/sohl/assets/icons/crow.svg", + "_id": "bUi4Y4FXqzmyYgQj", + "system": { + "subType": "totem", + "notes": "", + "textReference": "", + "description": "

Animal Ideal: Mischievous and vindictive, crows are highly intelligent birds that can hold grudges and are known to play tricks on both animals and humans.

\n

Description: Mischevous, curious, and resourceful, this person has a knack for problem-solving and enjoys playing tricks. They are curious and often use their wits to navigate complex situations.

\n
    \n
  • Physical: Keen, observant eyes; lean and agile.
  • \n
  • Behavioral: Highly curious, resourceful in problem-solving and tool use.
  • Positive: Resourceful, innovative, and problem-solving.
  • \n
  • Negative: Mischievous, vindictive, and may play tricks on others.
  • \n
  • Minor Trait: Innovative
  • \n
  • Major Disorder: Narcissistic Personality Disorder (NPD), linked with vindictive and manipulative behaviors.
  • \n
", + "macros": [], + "nestedItems": [], + "transfer": false, + "domain": "crow", + "skills": [], + "levelBase": 0, + "charges": { + "usesCharges": false, + "value": 0, + "max": 0 + } + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.mysteries.Item.XHwwkctPOTYwybx5", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "eJSuuML2ROg3V1W6", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.bUi4Y4FXqzmyYgQj" + }, + { + "name": "Nadái", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "jt8vCwlwokZq47hy", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "nadai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.jt8vCwlwokZq47hy" + }, + { + "name": "Arálius-Fenéri", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "T4z059UYJ73U4P6j", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "araliusfeneri", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 10, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.T4z059UYJ73U4P6j" + }, + { + "name": "Môrgath", + "type": "domain", + "img": "systems/sohl/assets/icons/morgath.png", + "_id": "p3t7SM8TQT59jqSx", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "morgath", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "mor" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.p3t7SM8TQT59jqSx" + }, + { + "name": "Skôrus-Masâra", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "cGEoy27idSdITrVu", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "skorusmasara", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -10, + "air": 0, + "aura": 10, + "water": 15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.cGEoy27idSdITrVu" + }, + { + "name": "Ùlándus-Arálius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "WPa7EK7q1aH1sWEn", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ulandusaralius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 15, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -5, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.WPa7EK7q1aH1sWEn" + }, + { + "name": "Fenéri", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "JI2y9HH8MnUFIR7H", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "feneri", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -15, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.JI2y9HH8MnUFIR7H" + }, + { + "name": "Masâra", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "vpQa0ZAl5ZZ4KA3e", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "masara", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -15, + "air": -5, + "aura": 5, + "water": 15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.vpQa0ZAl5ZZ4KA3e" + }, + { + "name": "Ùlándus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "Mww81Bs6TS4QBCVz", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ulandus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -15, + "aura": -5, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.Mww81Bs6TS4QBCVz" + }, + { + "name": "Hîrin", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "tNVNxwRyL5WpHBcR", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "hirin", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -15, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 5, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.tNVNxwRyL5WpHBcR" + }, + { + "name": "Tai", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "FJDJEFwVUV0HCNg2", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "tai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -5, + "metal": -15, + "fire": -5, + "air": 5, + "aura": 15, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.FJDJEFwVUV0HCNg2" + }, + { + "name": "Navéh", + "type": "domain", + "img": "systems/sohl/assets/icons/naveh.png", + "_id": "uowIWuhijAn17UkX", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "naveh", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "nav" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.uowIWuhijAn17UkX" + }, + { + "name": "Angberélius-Nadái", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "oafWIA8ghcJwNsxS", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "angbereliusnadai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 10, + "aura": 0, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.oafWIA8ghcJwNsxS" + }, + { + "name": "Haléa", + "type": "domain", + "img": "systems/sohl/assets/icons/halea.png", + "_id": "4byVTuTIyAinG9Es", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "halea", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "hal" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.4byVTuTIyAinG9Es" + }, + { + "name": "Sárajìn", + "type": "domain", + "img": "systems/sohl/assets/icons/sarajin.png", + "_id": "31NlV0tlW0rXFvyL", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "sarajin", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "kaj" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.31NlV0tlW0rXFvyL" + }, + { + "name": "Skôrus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "e0NoHQA77bcNVqE1", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "skorus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -10, + "air": 0, + "aura": 10, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.e0NoHQA77bcNVqE1" + }, + { + "name": "Ládo", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "TnvCGwgSwkCApGQX", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "lado", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -10, + "aura": 0, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.TnvCGwgSwkCApGQX" + }, + { + "name": "Táræl", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "J4kxf0jyvfHjmiQO", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "tarael", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -10, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.J4kxf0jyvfHjmiQO" + }, + { + "name": "Ilvîr", + "type": "domain", + "img": "systems/sohl/assets/icons/ilvir.png", + "_id": "qAF5EqZd7U7eLRAt", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "ilvir", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "ivo" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.qAF5EqZd7U7eLRAt" + }, + { + "name": "Nadái-Hîrin", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "zDWhLpIlr3Rz1LSI", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "nadaihirin", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.zDWhLpIlr3Rz1LSI" + }, + { + "name": "Hîrin-Táræl", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "O2obTlOgxrZ4ClDb", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "hirintarael", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": -10, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.O2obTlOgxrZ4ClDb" + }, + { + "name": "Fenéri-Áhnù", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "mVkYzqa0013WEDUr", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "feneriahnu", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 10, + "air": 0, + "aura": -10, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.mVkYzqa0013WEDUr" + }, + { + "name": "Tai-Skôrus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "vUK9vJCkIiQVxatW", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "taiskorus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -5, + "air": 5, + "aura": 15, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.vUK9vJCkIiQVxatW" + }, + { + "name": "Áhnù", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "4CQLoEkccVCwDQmQ", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ahnu", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 10, + "air": 0, + "aura": -10, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.4CQLoEkccVCwDQmQ" + }, + { + "name": "Masâra-Ládo", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "62GqL8QCOTK4VaNs", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "masaralado", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -5, + "aura": 5, + "water": 15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.62GqL8QCOTK4VaNs" + }, + { + "name": "Ágrik", + "type": "domain", + "img": "systems/sohl/assets/icons/agrik.png", + "_id": "z9eaVtZZjSyMGYaJ", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "agrik", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "agr" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.z9eaVtZZjSyMGYaJ" + }, + { + "name": "Siém", + "type": "domain", + "img": "systems/sohl/assets/icons/siem.png", + "_id": "lDgdPlWRPEbSC5PN", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "siem", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "zem" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.lDgdPlWRPEbSC5PN" + }, + { + "name": "Peóni", + "type": "domain", + "img": "systems/sohl/assets/icons/peoni.png", + "_id": "bw8UFFYAvo3SgZqC", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "peoni", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "eon" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.bw8UFFYAvo3SgZqC" + }, + { + "name": "Sávè-K'nôr", + "type": "domain", + "img": "systems/sohl/assets/icons/saveknor.png", + "_id": "YxZSvqFLkMH06e5M", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "saveknor", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "zer" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.YxZSvqFLkMH06e5M" + }, + { + "name": "Laráni", + "type": "domain", + "img": "systems/sohl/assets/icons/larani.png", + "_id": "A0pU93ow1XrWNg3n", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "larani", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "kethira": { + "aspects": [ + "ara" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.A0pU93ow1XrWNg3n" + }, + { + "name": "Angberélius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "0xux98CkXobWOV1E", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "angberelius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 5, + "aura": -5, + "water": -15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.0xux98CkXobWOV1E" + }, + { + "name": "Arálius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "Z3ZP82nkeRZJpwS0", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "aralius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "kethira": { + "ssMod": { + "earth": 10, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.Z3ZP82nkeRZJpwS0" + }, + { + "name": "Táræl-Tai", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "I8ow1kA6dEVysjRB", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "taraeltai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": -5, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 15, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.I8ow1kA6dEVysjRB" + }, + { + "name": "Ládo-Ùlándus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "h4JnDKQzZx3tUbqs", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ladoulandus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -10, + "aura": 0, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.h4JnDKQzZx3tUbqs" + }, + { + "name": "Áhnù-Angberélius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "jlhvn1yvA9TQiWnm", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ahnuangberelius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "kethira": { + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 15, + "air": 5, + "aura": -5, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!Crm4ZEGtfbNyACCI.jlhvn1yvA9TQiWnm" + } + ], + "effects": [], + "folder": "5mMLOWFQcdODwR8q", + "flags": { + "exportSource": { + "world": "hm-test", + "system": "sohl", + "coreVersion": "12.330", + "systemVersion": "0.9.0" + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": 1724530631972, + "modifiedTime": 1724530632126, + "lastModifiedBy": "0year58XBVccywIu" + }, + "_id": "Crm4ZEGtfbNyACCI", + "sort": 200000, + "ownership": { + "default": 0, + "0year58XBVccywIu": 3 + }, + "_key": "!actors!Crm4ZEGtfbNyACCI" +} diff --git a/packs/generate/legendary/leg-creatures/data/folders.yaml b/packs/generate/legendary/leg-creatures/data/folders.yaml new file mode 100644 index 0000000..9ceb99f --- /dev/null +++ b/packs/generate/legendary/leg-creatures/data/folders.yaml @@ -0,0 +1,28 @@ +- name: Grukhar + id: 0BseEBCRdQbFhNEK + parentFolderId: "" + color: '#d35400' +- name: Dreadspawn + id: A7pUZEhTA9APCbqP + parentFolderId: "" + color: '#007a6c' +- name: Elementals + id: q0BriritebVrkS79 + parentFolderId: "" + color: '#ca3232' +- name: Spirits + id: 1Z8RlJiWhtMSpe2t + parentFolderId: "" + color: '#008000' +- name: Undead + id: 2Tb4ez5itKoirUR2 + parentFolderId: "" + color: '#b13de1' +- name: Natural Creatures + id: j6vn1U2cYlAyO0DL + parentFolderId: "" + color: '#2337c9' +- name: Constructs + id: PnggYGtXdS5PCdhv + parentFolderId: "" + color: '#800080' diff --git a/packs/generate/legendary/leg-creatures/generate-leg-creatures.py b/packs/generate/legendary/leg-creatures/generate-leg-creatures.py new file mode 100755 index 0000000..4516782 --- /dev/null +++ b/packs/generate/legendary/leg-creatures/generate-leg-creatures.py @@ -0,0 +1,45 @@ +#!python3 + +import yaml +import json +import argparse +from unidecode import unidecode +import re + +parser = argparse.ArgumentParser() +parser.add_argument("outputDir", help="folder where generated files should be placed") +args = parser.parse_args() + +stats = { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M", +} + +with open("./data/folders.yaml", "r", encoding="utf8") as infile: + foldersData = yaml.safe_load(infile) + +for folder in foldersData: + print(f"Processing Folder {folder['name']}") + fname = folder["name"] + "_" + folder["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": folder["name"], + "sorting": "a", + "folder": folder["parentFolderId"] or None, + "type": "Item", + "_id": folder["id"], + "sort": 0, + "color": folder["color"], + "flags": {}, + "_stats": stats, + "_key": "!folders!" + folder["id"], + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) diff --git a/packs/generate/legendary/leg-creatures/pack.properties b/packs/generate/legendary/leg-creatures/pack.properties new file mode 100644 index 0000000..ce9c5c8 --- /dev/null +++ b/packs/generate/legendary/leg-creatures/pack.properties @@ -0,0 +1 @@ +type=Actor diff --git a/packs/generate/legendary/leg-creatures/unique/Grod_2SK6g2KHjS1ufBvw.json b/packs/generate/legendary/leg-creatures/unique/Grod_2SK6g2KHjS1ufBvw.json new file mode 100644 index 0000000..7d16400 --- /dev/null +++ b/packs/generate/legendary/leg-creatures/unique/Grod_2SK6g2KHjS1ufBvw.json @@ -0,0 +1,7863 @@ +{ + "name": "Grod", + "type": "entity", + "img": "systems/sohl/assets/silhouette/legendary/folk-basic-headshot.webp", + "system": { + "macros": [ + { + "name": "asdf", + "type": "script", + "_id": "t40f48F92RNSm3R1", + "author": "RsnPoY20XgcrucTn", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "return true;", + "folder": null, + "sort": 100000, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "useAsync": false, + "contextIconClass": "", + "contextGroup": "aaa", + "contextCondition": "return true;" + } + }, + "_stats": { + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "bioImage": "systems/sohl/assets/silhouette/legendary/folk-basic-bioimage.webp", + "description": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Apparent Age 
Culture 
Social Class 
Height 
Frame 
Weight 
Appearance/Comeliness 
Hair Color 
Eye Color 
Voice 
Obvious Medical Traits
 
Apparent Occupation
 
Apparent Wealth
 
Weapons
 
Armour 
Companions 
Other obvious features 
", + "biography": "

Data

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Birthdate 
Birthplace 
Sibling Rankx of y
Parent(s) 
Parent Affiliation 
Estrangement 
Clanhead 
Medical Traits 
Psyche Traits 
\n

Life Story

" + }, + "prototypeToken": { + "name": "asdf", + "displayName": 0, + "actorLink": false, + "appendNumber": false, + "prependAdjective": false, + "width": 1, + "height": 1, + "texture": { + "src": "systems/sohl/assets/silhouette/legendary/folk-basic-token.svg", + "anchorX": 0.5, + "anchorY": 0.5, + "offsetX": 0, + "offsetY": 0, + "fit": "contain", + "scaleX": 1, + "scaleY": 1, + "rotation": 0, + "tint": "#ffffff", + "alphaThreshold": 0.75 + }, + "hexagonalShape": 0, + "lockRotation": false, + "rotation": 0, + "alpha": 1, + "disposition": -1, + "displayBars": 0, + "bar1": { + "attribute": "health" + }, + "bar2": { + "attribute": null + }, + "light": { + "negative": false, + "priority": 0, + "alpha": 0.5, + "angle": 360, + "bright": 0, + "color": null, + "coloration": 1, + "dim": 0, + "attenuation": 0.5, + "luminosity": 0.5, + "saturation": 0, + "contrast": 0, + "shadows": 0, + "animation": { + "type": null, + "speed": 5, + "intensity": 5, + "reverse": false + }, + "darkness": { + "min": 0, + "max": 1 + } + }, + "sight": { + "enabled": false, + "range": 0, + "angle": 360, + "visionMode": "basic", + "color": null, + "attenuation": 0.1, + "brightness": 0, + "saturation": 0, + "contrast": 0 + }, + "detectionModes": [], + "occludable": { + "radius": 0 + }, + "ring": { + "enabled": false, + "colors": { + "ring": null, + "background": null + }, + "effects": 1, + "subject": { + "scale": 1, + "texture": null + } + }, + "flags": {}, + "randomImg": false + }, + "items": [ + { + "name": "Strength", + "img": "systems/sohl/assets/icons/biceps.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "str", + "textValue": "9", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Feeble", + "maxValue": 4 + }, + { + "label": "Weak", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Forceful", + "maxValue": 16 + }, + { + "label": "Mighty", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "9dTiY5vPZtpba4fj", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.9dTiY5vPZtpba4fj" + }, + { + "name": "Endurance", + "img": "systems/sohl/assets/icons/climbing.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "end", + "textValue": "6", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Frail", + "maxValue": 4 + }, + { + "label": "Unfit", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Robust", + "maxValue": 16 + }, + { + "label": "Hardy", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "hYhyVtyNVj6ZMC14", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.hYhyVtyNVj6ZMC14" + }, + { + "name": "Dexterity", + "img": "systems/sohl/assets/icons/juggler.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "dex", + "textValue": "6", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Uncoordinated", + "maxValue": 4 + }, + { + "label": "Awkward", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Deft", + "maxValue": 16 + }, + { + "label": "Adroit", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "9dw7zTz4rbqHWpUw", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.9dw7zTz4rbqHWpUw" + }, + { + "name": "Agility", + "img": "systems/sohl/assets/icons/acrobatics.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "agl", + "textValue": "12", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Blundering", + "maxValue": 4 + }, + { + "label": "Clumsy", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Nimble", + "maxValue": 16 + }, + { + "label": "Graceful", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "NTrrYcLijXDMU6tu", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.NTrrYcLijXDMU6tu" + }, + { + "name": "Perception", + "img": "systems/sohl/assets/icons/awareness.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "per", + "textValue": "13", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Impaired", + "maxValue": 4 + }, + { + "label": "Dulled", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Sharp", + "maxValue": 16 + }, + { + "label": "Acute", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "d7OoxXm6awklTX8X", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.d7OoxXm6awklTX8X" + }, + { + "name": "Comeliness", + "img": "systems/sohl/assets/icons/charm.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "cml", + "textValue": "10", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Ugly", + "maxValue": 4 + }, + { + "label": "Unattractive", + "maxValue": 8 + }, + { + "label": "Plain", + "maxValue": 12 + }, + { + "label": "Attractive", + "maxValue": 16 + }, + { + "label": "Striking", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "wQ9p5BlXMi5BSCyV", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.wQ9p5BlXMi5BSCyV" + }, + { + "name": "Aura", + "img": "systems/sohl/assets/icons/aura.svg", + "system": { + "notes": "", + "description": "", + "subType": "transcendent", + "abbrev": "aur", + "textValue": "10", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Mundane", + "maxValue": 4 + }, + { + "label": "Shallow", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Deep", + "maxValue": 16 + }, + { + "label": "Profound", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "eZyYChDG6VZWo0yQ", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.eZyYChDG6VZWo0yQ" + }, + { + "name": "Will", + "img": "systems/sohl/assets/icons/will.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "wil", + "textValue": "14", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Submissive", + "maxValue": 4 + }, + { + "label": "Indecisive", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Resolute", + "maxValue": 16 + }, + { + "label": "Implacable", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "zvPGrCR6b0y8lvBT", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.zvPGrCR6b0y8lvBT" + }, + { + "name": "Reasoning", + "img": "systems/sohl/assets/icons/reasoning.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "rea", + "textValue": "11", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Dim", + "maxValue": 4 + }, + { + "label": "Dull", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Sharp", + "maxValue": 16 + }, + { + "label": "Brilliant", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "lJ4LP2y3oBTIzgCz", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.lJ4LP2y3oBTIzgCz" + }, + { + "name": "Creativity", + "img": "systems/sohl/assets/icons/creativity.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "cre", + "textValue": "10", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Banal", + "maxValue": 4 + }, + { + "label": "Predictable", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Innovative", + "maxValue": 16 + }, + { + "label": "Visionary", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "jPrXV1DdFYytxlvq", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.jPrXV1DdFYytxlvq" + }, + { + "name": "Empathy", + "img": "systems/sohl/assets/icons/empathy.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "emp", + "textValue": "16", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Unfeeling", + "maxValue": 4 + }, + { + "label": "Remote", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Understanding", + "maxValue": 16 + }, + { + "label": "Sensitive", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "TvsIxSo1XTVrbzup", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.TvsIxSo1XTVrbzup" + }, + { + "name": "Eloquence", + "img": "systems/sohl/assets/icons/oratory.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "elo", + "textValue": "10", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Incoherent", + "maxValue": 4 + }, + { + "label": "Muddled", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Articulate", + "maxValue": 16 + }, + { + "label": "Expressive", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "ozBIbqZPbRSyNcp5", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.ozBIbqZPbRSyNcp5" + }, + { + "name": "Voice", + "img": "systems/sohl/assets/icons/sing.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "voi", + "textValue": "11", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Jarring", + "maxValue": 4 + }, + { + "label": "Tuneless", + "maxValue": 8 + }, + { + "label": "Average", + "maxValue": 12 + }, + { + "label": "Melodious", + "maxValue": 16 + }, + { + "label": "Dulcet", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "0bGmLPvKjag5mNhx", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.0bGmLPvKjag5mNhx" + }, + { + "name": "Morality", + "img": "systems/sohl/assets/icons/morality.svg", + "system": { + "notes": "", + "description": "", + "subType": "personality", + "abbrev": "mor", + "textValue": "6", + "isNumeric": true, + "intensity": "attribute", + "max": 0, + "textReference": "", + "valueDesc": [ + { + "label": "Amoral", + "maxValue": 2 + }, + { + "label": "Immoral", + "maxValue": 4 + }, + { + "label": "Hipocritical", + "maxValue": 7 + }, + { + "label": "Unscrupulous", + "maxValue": 10 + }, + { + "label": "Conscientious", + "maxValue": 13 + }, + { + "label": "Principled", + "maxValue": 16 + }, + { + "label": "Virtuous", + "maxValue": 18 + }, + { + "label": "Paragon", + "maxValue": 999 + } + ], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "diceFormula": "3d6" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "yIzzagWsSIzmR8R8", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.yIzzagWsSIzmR8R8" + }, + { + "name": "Sunsign", + "img": "systems/sohl/assets/icons/astrology.svg", + "system": { + "notes": "", + "description": "", + "subType": "transcendent", + "abbrev": "ss", + "textValue": "lado", + "isNumeric": false, + "intensity": "trait", + "max": null, + "textReference": "", + "valueDesc": [], + "choices": { + "ulandus": "Ùlándus", + "ulandusaralius": "Ùlándus-Arálius", + "aralius": "Arálius", + "araliusfeneri": "Arálius-Fenéri", + "feneri": "Fenéri", + "feneriahnu": "Fenéri-Áhnù", + "ahnu": "Áhnù", + "ahnuangberelius": "Áhnù-Angberélius", + "angberelius": "Angberélius", + "angbereliusnadai": "Angberélius-Nadái", + "nadai": "Nadái", + "nadaihirin": "Nadái-Hîrin", + "hirin": "Hîrin", + "hirintarael": "Hîrin-Táræl", + "tarael": "Táræl", + "taraeltai": "Táræl-Tai", + "tai": "Tai", + "taiskorus": "Tai-Skôrus", + "skorus": "Skôrus", + "skorusmasara": "Skôrus-Masâra", + "masara": "Masâra", + "masaralado": "Masâra-Ládo", + "lado": "Ládo", + "ladoulandus": "Ládo-Ùlándus" + }, + "macros": [ + { + "name": "Setup Virtual Items", + "type": "script", + "_id": "PZFbSGy377ZmHXud", + "author": "5VOJ7NCf7bEZjieU", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.setupVirtualItems();\nconst values = this.item.getFlag(\"sohl\", \"values\");\nthis.actor.system.$ssMod = values[this.textValue];", + "folder": null, + "sort": 0, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "functionName": "setupVirtualItems", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "_stats": { + "coreVersion": "12.327", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "values": { + "ulandus": { + "label": "Ùlándus", + "cusp": false, + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -15, + "aura": -5, + "water": 5 + } + }, + "ulandusaralius": { + "label": "Ùlándus-Arálius", + "cusp": true, + "ssMod": { + "earth": 15, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -5, + "water": 5 + } + }, + "aralius": { + "label": "Arálius", + "cusp": false, + "ssMod": { + "earth": 10, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -10, + "water": 0 + } + }, + "araliusfeneri": { + "label": "Arálius-Fenéri", + "cusp": true, + "ssMod": { + "earth": 10, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -10, + "water": 0 + } + }, + "feneri": { + "label": "Fenéri", + "cusp": false, + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -15, + "water": -5 + } + }, + "feneriahnu": { + "label": "Fenéri-Áhnù", + "cusp": true, + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 10, + "air": 0, + "aura": -10, + "water": -5 + } + }, + "ahnu": { + "label": "Áhnù", + "cusp": false, + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 10, + "air": 0, + "aura": -10, + "water": -10 + } + }, + "ahnuangberelius": { + "label": "Áhnù-Angberélius", + "cusp": true, + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 15, + "air": 5, + "aura": -5, + "water": -10 + } + }, + "angberelius": { + "label": "Angberélius", + "cusp": false, + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 5, + "aura": -5, + "water": -15 + } + }, + "angbereliusnadai": { + "label": "Angberélius-Nadái", + "cusp": true, + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 10, + "aura": 0, + "water": -10 + } + }, + "nadai": { + "label": "Nadái", + "cusp": false, + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -10 + } + }, + "nadaihirin": { + "label": "Nadái-Hîrin", + "cusp": true, + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -5 + } + }, + "hirin": { + "label": "Hîrin", + "cusp": false, + "ssMod": { + "earth": -15, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 5, + "water": -5 + } + }, + "hirintarael": { + "label": "Hîrin-Táræl", + "cusp": true, + "ssMod": { + "earth": -10, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 10, + "water": 0 + } + }, + "tarael": { + "label": "Táræl", + "cusp": false, + "ssMod": { + "earth": -10, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 10, + "water": 0 + } + }, + "taraeltai": { + "label": "Táræl-Tai", + "cusp": true, + "ssMod": { + "earth": -5, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 15, + "water": 5 + } + }, + "tai": { + "label": "Tai", + "cusp": false, + "ssMod": { + "earth": -5, + "metal": -15, + "fire": -5, + "air": 5, + "aura": 15, + "water": 5 + } + }, + "taiskorus": { + "label": "Tai-Skôrus", + "cusp": true, + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -5, + "air": 5, + "aura": 15, + "water": 10 + } + }, + "skorus": { + "label": "Skôrus", + "cusp": false, + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -10, + "air": 0, + "aura": 10, + "water": 10 + } + }, + "skorusmasara": { + "label": "Skôrus-Masâra", + "cusp": true, + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -10, + "air": 0, + "aura": 10, + "water": 15 + } + }, + "masara": { + "label": "Masâra", + "cusp": false, + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -15, + "air": -5, + "aura": 5, + "water": 15 + } + }, + "masaralado": { + "label": "Masâra-Ládo", + "cusp": true, + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -5, + "aura": 5, + "water": 15 + } + }, + "lado": { + "label": "Ládo", + "cusp": false, + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -10, + "aura": 0, + "water": 10 + } + }, + "ladoulandus": { + "label": "Ládo-Ùlándus", + "cusp": true, + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -10, + "aura": 0, + "water": 10 + } + } + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "PzXbFxKAA2H5R9I9", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.PzXbFxKAA2H5R9I9" + }, + { + "name": "Basic Fate", + "type": "trait", + "img": "systems/sohl/assets/icons/user-gear.svg", + "system": { + "subType": "transcendent", + "macros": [ + { + "name": "Setup Virtual Items", + "type": "script", + "_id": "gpnwBsX76ZqKs6Ee", + "author": "RsnPoY20XgcrucTn", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.setupVirtualItems();\nthis.$masteryLevel.disabled = false;\nthis.$masteryLevel.setBase(this.$score.base);\nconst aura = this.actor.getTraitByAbbrev(\"aur\");\nif (aura) {\n this.$masteryLevel.add(\"Aura Secondary Modifier\", \"SecMod\", aura.system.$masteryLevel.secMod);\n}\nconst ss = this.actor.getTraitByAbbrev(\"ss\");\nif (ss) {\n const values = ss.getFlag(\"sohl\", \"values\");\n const value = values[this.textValue];\n if (value) {\n this.$masteryLevel.add(\"Sunsign Modifier\", \"ssMod\", value[\"aura\"] || 0);\n }\n}", + "folder": null, + "sort": 0, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "_stats": { + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false, + "abbrev": "fate", + "textValue": "50", + "max": null, + "isNumeric": true, + "intensity": "trait", + "valueDesc": [], + "choices": {} + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "aY0CBQLx0cddg8R8", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.aY0CBQLx0cddg8R8" + }, + { + "name": "Size", + "img": "systems/sohl/assets/icons/body-height.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "siz", + "textValue": "Medium", + "isNumeric": false, + "intensity": "trait", + "max": null, + "textReference": "", + "valueDesc": [], + "choices": { + "tiny": "Tiny", + "small": "Small", + "medium": "Medium", + "large": "Large", + "big": "Big", + "huge": "Huge", + "colossal": "Colossal", + "titanic": "Titanic" + }, + "macros": [ + { + "name": "Setup Virtual Items", + "type": "script", + "_id": "VEMB4c34IFaAaa7W", + "author": "5VOJ7NCf7bEZjieU", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.setupVirtualItems();\nconst sizes = this.item.getFlag(\"sohl\", \"sizes\");\nthis.$params = sizes?.[this.textValue] || {\n maxStr: 19,\n lbs: 400,\n zones: 10,\n target: 1,\n reachMod: 0,\n spaces: 1,\n feet: 5\n};", + "folder": null, + "sort": 0, + "ownership": { + "default": 0 + }, + "flags": { + "sohl": { + "notes": "", + "functionName": "setupVirtualItems", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "_stats": { + "coreVersion": "12.329", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": { + "sohl": { + "sizes": { + "tiny": { + "maxStr": 4, + "lbs": 20, + "zones": 3, + "target": 1, + "reachMod": -2, + "spaces": 0.5, + "feet": 2 + }, + "small": { + "maxStr": 8, + "lbs": 100, + "zones": 6, + "target": 1, + "reachMod": -1, + "spaces": 1, + "feet": 4 + }, + "medium": { + "maxStr": 19, + "lbs": 400, + "zones": 10, + "target": 1, + "reachMod": 0, + "spaces": 1, + "feet": 5 + }, + "large": { + "maxStr": 29, + "lbs": 800, + "zones": 16, + "target": 2, + "reachMod": 1, + "spaces": 1, + "feet": 6 + }, + "big": { + "maxStr": 39, + "lbs": 1600, + "zones": 20, + "target": 2, + "reachMod": 1, + "spaces": 2, + "feet": 7 + }, + "huge": { + "maxStr": 49, + "lbs": 3200, + "zones": 30, + "target": 3, + "reachMod": 2, + "spaces": 2, + "feet": 9 + }, + "colossal": { + "maxStr": 59, + "lbs": 6400, + "zones": 40, + "target": 4, + "reachMod": 4, + "spaces": 2, + "feet": 10 + }, + "titanic": { + "maxStr": 69, + "lbs": 12800, + "zones": 80, + "target": 8, + "reachMod": 6, + "spaces": 3, + "feet": 15 + } + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "934pm3tqFd8u9msN", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.934pm3tqFd8u9msN" + }, + { + "name": "Carrying Capacity", + "type": "trait", + "system": { + "subType": "physique", + "macros": [ + { + "name": "Process Siblings", + "type": "script", + "_id": "Hm2BL94GnC3Y3HYL", + "scope": "global", + "command": "this.processSiblings();\nconst gw = this.actor.system.$gearWeight;\ngw.maxFight.setBase(this.$score.base);\ngw.max.setBase(this.max);", + "flags": { + "sohl": { + "notes": "", + "functionName": "processSiblings", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + } + } + ], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "abbrev": "cap", + "textValue": "50", + "max": 75, + "isNumeric": true, + "intensity": "trait", + "valueDesc": [], + "choices": {}, + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "img": "systems/sohl/assets/icons/carrying-sack.svg", + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "UUctaRuEocuVU9aT", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.UUctaRuEocuVU9aT" + }, + { + "name": "Move", + "img": "systems/sohl/assets/icons/run.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "mov", + "textValue": "0", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [ + { + "name": "Process Siblings", + "type": "script", + "_id": "yHTQV0aRXKKvoDdT", + "img": "icons/svg/dice-target.svg", + "scope": "global", + "command": "this.postProcess();\nArray.from(this.actor.allItems()).forEach((it) => {\nif (it.type === \"affliction\" && it.system.subType === \"fatigue\") {\n this.$masteryLevel.add(\n it.name,\n it.system.constructor.subTypeAbbreviation[it.system.subType],\n -it.system.$level.effective,\n );\n}});", + "sort": 0, + "flags": { + "sohl": { + "notes": "", + "functionName": "processSiblings", + "contextLabel": "", + "contextIconClass": "", + "contextCondition": "", + "contextGroup": "aaa", + "useAsync": false + } + }, + "author": "RsnPoY20XgcrucTn", + "folder": null, + "ownership": { + "default": 0 + }, + "_stats": { + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null, + "compendiumSource": null, + "duplicateSource": null + } + } + ], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "VuNqXefRrznwkfe0", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.VuNqXefRrznwkfe0" + }, + { + "name": "Favored Parts", + "img": "systems/sohl/assets/icons/hands.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "favparts", + "textValue": "Right Arm", + "isNumeric": false, + "intensity": "trait", + "max": null, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "hED2gtzArrkygn5x", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.hED2gtzArrkygn5x" + }, + { + "name": "Body Weight", + "img": "systems/sohl/assets/icons/weight.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "wt", + "textValue": "150", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "HJ8O0hBgcoM6EjgK", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.HJ8O0hBgcoM6EjgK" + }, + { + "name": "Experience Points", + "img": "systems/sohl/assets/icons/beams-aura.svg", + "system": { + "notes": "", + "description": "", + "subType": "transcendent", + "abbrev": "xp", + "textValue": "0", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "GFjqjpw4Yja7gwJP", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.GFjqjpw4Yja7gwJP" + }, + { + "name": "Area Attack Shock", + "img": "systems/sohl/assets/icons/shock.svg", + "system": { + "notes": "", + "description": "", + "subType": "physique", + "abbrev": "ashk", + "textValue": "6", + "isNumeric": true, + "intensity": "trait", + "max": 0, + "textReference": "", + "valueDesc": [], + "choices": {}, + "macros": [], + "nestedItems": [], + "transfer": false, + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "flags": {}, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "type": "trait", + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "OpYbH37OMJdTOOHl", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.OpYbH37OMJdTOOHl" + }, + { + "name": "Charm", + "type": "skill", + "img": "systems/sohl/assets/icons/charm.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@cml, @emp", + "textReference": "", + "masteryLevelBase": 39, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "chrm", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Gh9PQTIMDXbU9gZU", + "sort": 100000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.Gh9PQTIMDXbU9gZU" + }, + { + "name": "Command", + "type": "skill", + "img": "systems/sohl/assets/icons/rhetoric.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@wil, @elo", + "textReference": "", + "masteryLevelBase": 24, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "cmd", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2, + "expertise": { + "required": false + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Q8JYIyQ5wVyso0Xg", + "sort": 106250, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.Q8JYIyQ5wVyso0Xg" + }, + { + "name": "Discourse", + "type": "skill", + "img": "systems/sohl/assets/icons/face-to-face.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @elo", + "textReference": "", + "masteryLevelBase": 22, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "dscr", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "BYUsRENFvIZmadFe", + "sort": 400000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.BYUsRENFvIZmadFe" + }, + { + "name": "Guile", + "type": "skill", + "img": "systems/sohl/assets/icons/mischevous.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @cre", + "textReference": "", + "masteryLevelBase": 39, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "guil", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "ZDp3yvkNbw0NzPLf", + "sort": 500000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.ZDp3yvkNbw0NzPLf" + }, + { + "name": "Intrigue", + "type": "skill", + "img": "systems/sohl/assets/icons/cloak-dagger.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @rea", + "textReference": "", + "masteryLevelBase": 42, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "intr", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "wI9AqNwNcthCDcp3", + "sort": 112500, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.wI9AqNwNcthCDcp3" + }, + { + "name": "Singing", + "type": "skill", + "img": "systems/sohl/assets/icons/sing.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@voi, @cre", + "textReference": "", + "masteryLevelBase": 33, + "weaponGroup": "none", + "subType": "craft", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "sing", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "kKb60ieWTpj11lT0", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.kKb60ieWTpj11lT0" + }, + { + "name": "Theatrics", + "type": "skill", + "img": "systems/sohl/assets/icons/drama-masks.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@cre, @elo", + "textReference": "", + "masteryLevelBase": 10, + "weaponGroup": "none", + "subType": "social", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "thtcs", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "xeYQ2RR4ZlzzGxIi", + "sort": 118750, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.xeYQ2RR4ZlzzGxIi" + }, + { + "name": "Survival", + "type": "skill", + "img": "systems/sohl/assets/icons/survival.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @wil", + "textReference": "", + "masteryLevelBase": 13, + "weaponGroup": "none", + "subType": "nature", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "srvl", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "RMHIybBnCmoQ2XuN", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.RMHIybBnCmoQ2XuN" + }, + { + "name": "Drawing", + "type": "skill", + "img": "systems/sohl/assets/icons/drawing.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @dex", + "textReference": "", + "masteryLevelBase": 20, + "weaponGroup": "none", + "subType": "craft", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "draw", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Nqd75CXInYPF79f6", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.Nqd75CXInYPF79f6" + }, + { + "name": "Cookery", + "type": "skill", + "img": "systems/sohl/assets/icons/cookery.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @rea", + "textReference": "", + "masteryLevelBase": 24, + "weaponGroup": "none", + "subType": "lore", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "cook", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "g8JKKCFX6CAcnXNc", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.g8JKKCFX6CAcnXNc" + }, + { + "name": "Folklore", + "type": "skill", + "img": "systems/sohl/assets/icons/unicorn.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @wil", + "textReference": "", + "masteryLevelBase": 12, + "weaponGroup": "none", + "subType": "lore", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "folk", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "dWajegCMayyD7e6l", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.dWajegCMayyD7e6l" + }, + { + "name": "Physician", + "type": "skill", + "img": "systems/sohl/assets/icons/caduceus.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@rea, @per", + "textReference": "", + "masteryLevelBase": 12, + "weaponGroup": "none", + "subType": "lore", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "pysn", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "DinDAF0aSc39fc4M", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.DinDAF0aSc39fc4M" + }, + { + "name": "Awareness", + "type": "skill", + "img": "systems/sohl/assets/icons/awareness.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @wil", + "textReference": "", + "masteryLevelBase": 39, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "awar", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "XeaJNulsuITbTvw4", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.XeaJNulsuITbTvw4" + }, + { + "name": "Climbing", + "type": "skill", + "img": "systems/sohl/assets/icons/climbing.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @dex", + "textReference": "", + "masteryLevelBase": 27, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "clmb", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Qj6WgbILO4MK9WiL", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.Qj6WgbILO4MK9WiL" + }, + { + "name": "Dancing", + "type": "skill", + "img": "systems/sohl/assets/icons/dance.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @end", + "textReference": "", + "masteryLevelBase": 18, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "dnce", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "EQODmSbCuBoEQZIx", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.EQODmSbCuBoEQZIx" + }, + { + "name": "Jumping", + "type": "skill", + "img": "systems/sohl/assets/icons/jump-across.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @str", + "textReference": "", + "masteryLevelBase": 44, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "jump", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 4 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "g3BedALWV6aPQEzx", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.g3BedALWV6aPQEzx" + }, + { + "name": "Riding", + "type": "skill", + "img": "systems/sohl/assets/icons/horse-riding.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@emp, @agl", + "textReference": "", + "masteryLevelBase": 14, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "ridg", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "19isFcSiJaIHFNOh", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.19isFcSiJaIHFNOh" + }, + { + "name": "Stealth", + "type": "skill", + "img": "systems/sohl/assets/icons/stealth.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @per", + "textReference": "", + "masteryLevelBase": 36, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "stlth", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "mQdCeyyaHMelLJeD", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.mQdCeyyaHMelLJeD" + }, + { + "name": "Swimming", + "type": "skill", + "img": "systems/sohl/assets/icons/swimming.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@end, @agl", + "textReference": "", + "masteryLevelBase": 9, + "weaponGroup": "none", + "subType": "physical", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "swim", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "5y0zHbusIeHWhJNA", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.5y0zHbusIeHWhJNA" + }, + { + "name": "Initiative", + "type": "skill", + "img": "systems/sohl/assets/icons/initiative.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@wil, @rea", + "textReference": "", + "masteryLevelBase": 39, + "weaponGroup": "none", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "init", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "vemrbqsD40lzX206", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.vemrbqsD40lzX206" + }, + { + "name": "Shock", + "type": "skill", + "img": "systems/sohl/assets/icons/shock.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@str, @end", + "textReference": "", + "masteryLevelBase": 24, + "weaponGroup": "none", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "shok", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 3 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "wNeOHAPYW8ImguSO", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.wNeOHAPYW8ImguSO" + }, + { + "name": "Melee", + "type": "skill", + "img": "systems/sohl/assets/icons/crossed-swords.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@dex, @agl", + "textReference": "", + "masteryLevelBase": 18, + "weaponGroup": "melee", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "melee", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "ZR0CsDCMJJowgXtC", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.ZR0CsDCMJJowgXtC" + }, + { + "name": "Dodge", + "type": "skill", + "img": "systems/sohl/assets/icons/dodge.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@agl, @per", + "textReference": "", + "masteryLevelBase": 24, + "weaponGroup": "none", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "dge", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "TXvCgLIUa0CjeUMr", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.TXvCgLIUa0CjeUMr" + }, + { + "name": "Archery", + "type": "skill", + "img": "systems/sohl/assets/icons/striking-arrows.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@per, @dex", + "textReference": "", + "masteryLevelBase": 10, + "weaponGroup": "missile", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "archy", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 1 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Pkv8ZYZM8En9zWXJ", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.Pkv8ZYZM8En9zWXJ" + }, + { + "name": "Throwing", + "type": "skill", + "img": "systems/sohl/assets/icons/throw.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@dex, @per", + "textReference": "", + "masteryLevelBase": 18, + "weaponGroup": "missile", + "subType": "combat", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "thro", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "initSkillMult": 2 + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "8QMguX9lUZa8HiCc", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.8QMguX9lUZa8HiCc" + }, + { + "name": "Premonition", + "type": "mystery", + "system": { + "subType": "fate", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "domain": "", + "levelBase": 0, + "charges": { + "usesCharges": true, + "value": 5, + "max": 0 + }, + "skills": [] + }, + "img": "systems/sohl/assets/icons/sparkles.svg", + "effects": [], + "flags": { + "exportSource": { + "world": "sohl-test", + "system": "sohl", + "coreVersion": "12.330", + "systemVersion": "0.9.0" + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "3AkddKCZpjc7VPuF", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.3AkddKCZpjc7VPuF" + }, + { + "name": "Bite", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/fangs.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 0, + "impactBase": { + "die": 4, + "modifier": 0, + "aspect": "piercing", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Bite Traits", + "origin": "Actor.TZzvOGswIwY15yIM.Item.a8GEEPInJUGD8Skp", + "_id": "Jh2naQoAd90Bxcmi", + "changes": [ + { + "key": "system.traits.impactTAMod", + "mode": 5, + "value": "3", + "priority": null + }, + { + "key": "system.traits.lowStrike", + "mode": 2, + "value": "-20", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.a8GEEPInJUGD8Skp.Jh2naQoAd90Bxcmi" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 2 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "a8GEEPInJUGD8Skp", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.a8GEEPInJUGD8Skp" + }, + { + "name": "Grab (Hold)", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/grab-hold.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "numDice": 0, + "die": 1, + "modifier": 0, + "aspect": "blunt" + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Grab (Hold) Traits", + "origin": "Actor.TZzvOGswIwY15yIM.Item.M34fO9lM32MQjfLt", + "_id": "tLb3IbqT4a5uZsg0", + "changes": [ + { + "key": "system.traits.strRoll", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noStrMod", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.M34fO9lM32MQjfLt.tLb3IbqT4a5uZsg0" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "M34fO9lM32MQjfLt", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.M34fO9lM32MQjfLt" + }, + { + "name": "Grab (Take)", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/grab-take.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "numDice": 0, + "die": 1, + "modifier": 0, + "aspect": "blunt" + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Grab (Hold) Traits", + "origin": "Actor.TZzvOGswIwY15yIM.Item.9CPDmbL78N3KLrXg", + "_id": "80Le8vlDzYbm5zOz", + "changes": [ + { + "key": "system.traits.strRoll", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noStrMod", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.9CPDmbL78N3KLrXg.80Le8vlDzYbm5zOz" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "9CPDmbL78N3KLrXg", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.9CPDmbL78N3KLrXg" + }, + { + "name": "Headbutt", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/headbutt.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 0, + "impactBase": { + "die": 6, + "modifier": 0, + "aspect": "blunt", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Headbutt Traits", + "origin": "Actor.TZzvOGswIwY15yIM.Item.UYLPkQyMTYdhxQuG", + "_id": "pRvNFHvpsFgvh65a", + "changes": [ + { + "key": "system.traits.lowStrike", + "mode": 2, + "value": "-20", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.UYLPkQyMTYdhxQuG.pRvNFHvpsFgvh65a" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "UYLPkQyMTYdhxQuG", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.UYLPkQyMTYdhxQuG" + }, + { + "name": "Limb Block", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/high-punch.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "numDice": 0, + "die": 1, + "modifier": 0, + "aspect": "blunt" + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Limb Block Traits", + "origin": "Actor.TZzvOGswIwY15yIM.Item.JvsowbIdSzzEoZeJ", + "_id": "vBzDOY0EEIvlhV9p", + "changes": [ + { + "key": "system.traits.noAttack", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.JvsowbIdSzzEoZeJ.vBzDOY0EEIvlhV9p" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 0 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "JvsowbIdSzzEoZeJ", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.JvsowbIdSzzEoZeJ" + }, + { + "name": "Kick", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/high-kick.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 2, + "impactBase": { + "die": 6, + "modifier": 0, + "aspect": "blunt", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Kick Traits", + "origin": "Actor.TZzvOGswIwY15yIM.Item.kOwQnAaLE3XLutwW", + "_id": "pDNFKukg4vaahtJR", + "changes": [ + { + "key": "system.traits.lowAim", + "mode": 2, + "value": "-20", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.kOwQnAaLE3XLutwW.pDNFKukg4vaahtJR" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "kOwQnAaLE3XLutwW", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.kOwQnAaLE3XLutwW" + }, + { + "name": "Press", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/push.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "numDice": 0, + "die": 1, + "modifier": 0, + "aspect": "blunt" + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Press Traits", + "origin": "Actor.TZzvOGswIwY15yIM.Item.q2bZ06OtYYlbT2WN", + "_id": "8DZUnu0NIgDCsvHg", + "changes": [ + { + "key": "system.traits.strRoll", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noStrMod", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.q2bZ06OtYYlbT2WN.8DZUnu0NIgDCsvHg" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 0 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "q2bZ06OtYYlbT2WN", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.q2bZ06OtYYlbT2WN" + }, + { + "name": "Punch", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/punch-blast.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 1, + "impactBase": { + "die": 6, + "modifier": 0, + "aspect": "blunt", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Punch Traits", + "origin": "Actor.TZzvOGswIwY15yIM.Item.wPAXHB7Mkr2dk7H0", + "_id": "V2B2dpCf6MHaj7Nh", + "changes": [ + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.impactTAMod", + "mode": 2, + "value": "2", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.wPAXHB7Mkr2dk7H0.V2B2dpCf6MHaj7Nh" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 4 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "wPAXHB7Mkr2dk7H0", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.wPAXHB7Mkr2dk7H0" + }, + { + "name": "Trip", + "type": "combattechniquestrikemode", + "img": "systems/sohl/assets/icons/trip.svg", + "system": { + "notes": "", + "textReference": "", + "lengthBase": 2, + "impactBase": { + "die": 1, + "modifier": 0, + "aspect": "blunt", + "numDice": 0 + }, + "macros": [], + "nestedItems": [], + "minParts": 1, + "description": "", + "assocSkillName": "Melee", + "transfer": false, + "mode": "" + }, + "effects": [ + { + "name": "Trip Traits", + "origin": "Actor.TZzvOGswIwY15yIM.Item.M34gIfS1cQK1fClm", + "_id": "Dcc6Z7IFoCcae0ZV", + "changes": [ + { + "key": "system.traits.noBlock", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.noStrMod", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.traits.strRoll", + "mode": 5, + "value": "true", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "", + "transfer": true, + "statuses": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "onsetTime": 0, + "strikeMode": "" + } + }, + "tint": "#ffffff", + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.M34gIfS1cQK1fClm.Dcc6Z7IFoCcae0ZV" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 0 + } + } + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "folder": null, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "M34gIfS1cQK1fClm", + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.M34gIfS1cQK1fClm" + }, + { + "name": "Pvârism", + "type": "skill", + "img": "systems/sohl/assets/icons/pvarism.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@aur, @rea", + "textReference": "", + "masteryLevelBase": 50, + "weaponGroup": "none", + "subType": "esoteric", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "pvarism", + "domain": "" + }, + "effects": [], + "flags": { + "sohl": { + "expertise": { + "required": false + } + } + }, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.K5XmdHDxovuKxcxQ", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "ZlkGrCk3idclEqXn", + "folder": null, + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.ZlkGrCk3idclEqXn" + }, + { + "name": "Clairvoyance", + "type": "mysticalability", + "img": "systems/sohl/assets/icons/psionics.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@aur, @wil", + "textReference": "", + "masteryLevelBase": 0, + "subType": "arcanetalent", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "domain": "", + "transfer": false, + "abbrev": "clrv", + "levelBase": 0, + "charges": { + "usesCharges": false, + "value": 0, + "max": 0 + } + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.N2SuuuRJq86wgYy6", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "jAffr7bMWUFFkos7", + "folder": null, + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.jAffr7bMWUFFkos7" + }, + { + "name": "Elemental Bolt", + "type": "mysticalability", + "img": "systems/sohl/assets/icons/psionics.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@aur, @wil", + "textReference": "", + "masteryLevelBase": 0, + "subType": "arcanetalent", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "domain": "", + "transfer": false, + "abbrev": "eblt", + "levelBase": 0, + "charges": { + "usesCharges": false, + "value": 0, + "max": 0 + } + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.gDV7D2Cmb3Ww5sBe", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "EFGL29A2755wzVwq", + "folder": null, + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.EFGL29A2755wzVwq" + }, + { + "name": "Fire Fiend", + "type": "mysticalability", + "img": "systems/sohl/assets/icons/fire.svg", + "system": { + "notes": "", + "description": "", + "domain": "Pèleáhn", + "textReference": "", + "subType": "arcaneincantation", + "macros": [], + "nestedItems": [], + "levelBase": 6, + "charges": { + "usesCharges": false, + "value": 0, + "max": 0 + }, + "transfer": false, + "abbrev": "", + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.i8TCVZ58VDyZHwoV", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "aUyMA8WiH9LPE6Yn", + "folder": null, + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.aUyMA8WiH9LPE6Yn" + }, + { + "name": "Floe", + "type": "mysticalability", + "img": "systems/sohl/assets/icons/water.svg", + "system": { + "notes": "", + "description": "", + "domain": "Odívshè", + "textReference": "", + "subType": "arcaneincantation", + "macros": [], + "nestedItems": [], + "levelBase": 6, + "charges": { + "usesCharges": false, + "value": 0, + "max": 0 + }, + "transfer": false, + "abbrev": "", + "skillBaseFormula": "", + "masteryLevelBase": 0, + "improveFlag": false + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.1AL3MdbG3qboSQ9o", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "dX4cAu6GnfSrernc", + "folder": null, + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.dX4cAu6GnfSrernc" + }, + { + "name": "Pèleáhn", + "type": "skill", + "img": "systems/sohl/assets/icons/fire.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@aur, @rea", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "esoteric", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "peleahn", + "domain": "" + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.mz9bCjPmh8SuX9QE", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "UsGezab7Xsn8owr5", + "folder": null, + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.UsGezab7Xsn8owr5" + }, + { + "name": "Odívshè", + "type": "skill", + "img": "systems/sohl/assets/icons/water.svg", + "system": { + "notes": "", + "description": "", + "skillBaseFormula": "@aur, @rea", + "textReference": "", + "masteryLevelBase": 0, + "weaponGroup": "none", + "subType": "esoteric", + "macros": [], + "nestedItems": [], + "improveFlag": false, + "transfer": false, + "abbrev": "odivshe", + "domain": "" + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.CDXslJIQbILfLiDA", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "02x1BdeYHdwKixvm", + "folder": null, + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.02x1BdeYHdwKixvm" + }, + { + "name": "Arrow Bag", + "type": "containergear", + "img": "systems/sohl/assets/icons/quiver.svg", + "system": { + "notes": "24 arrow capacity, worn over shoulder", + "description": "", + "quantity": 1, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 7, + "textReference": "", + "macros": [], + "nestedItems": [ + { + "name": "Arrow, Heavy Broad", + "type": "projectilegear", + "img": "systems/sohl/assets/icons/arrow.svg", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "quantity": 24, + "weightBase": 0.22, + "valueBase": 10, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 1, + "subType": "arrow", + "abbrev": "ArwHBrd", + "shortName": "Heavy Broad", + "impactBase": { + "die": 12, + "modifier": -1, + "aspect": "piercing" + }, + "transfer": true + }, + "effects": [ + { + "name": "Heavy Broad arrow Traits", + "changes": [ + { + "key": "mod:system.$impact.armorReduction", + "mode": 2, + "value": "4", + "priority": null + }, + { + "key": "system.$traits.extraBleedRisk", + "mode": 5, + "value": "true", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "", + "onsetTime": 0 + } + }, + "_id": "SQAMSXMvVbzLC9aR", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "Actor.LItCbkbfw6fgPvHq.Item.MWpsLhsLzkP1ddTb", + "tint": "#ffffff", + "transfer": false, + "description": "", + "statuses": [], + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": 1723129511748, + "lastModifiedBy": "RsnPoY20XgcrucTn" + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0 + } + ], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.rlUtsnS0uTXB5u64", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": 1723129511585, + "modifiedTime": 1723129523767, + "lastModifiedBy": "RsnPoY20XgcrucTn" + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "3EKeOxua7weeZ93g", + "folder": null, + "sort": 100000 + } + ], + "maxCapacityBase": 6, + "valueBase": 32, + "weightBase": 4, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.8vlivFbijzC7mfTa", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "Z2lBQpC9gQ7xnQPP", + "folder": null, + "sort": 100000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.Z2lBQpC9gQ7xnQPP" + }, + { + "name": "Longbow 100", + "type": "weapongear", + "img": "systems/sohl/assets/icons/longbow.svg", + "system": { + "macros": [], + "nestedItems": [ + { + "name": "Longbow 100 (Crush)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Crush", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "die": 6, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Longbow 100 Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "system.$traits.swung", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "mod:system.$durability", + "mode": 2, + "value": -5, + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Crush", + "onsetTime": 0 + } + }, + "_id": "YzRh0KAarcYfTSCb", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!oe2oX576wwOXKq1h.Bv3Qk3kVShdWOXDp" + } + ], + "flags": {}, + "_id": "qEFe3smZcgnPnwDE", + "_key": "!items!oe2oX576wwOXKq1h", + "sort": 100000 + }, + { + "name": "Longbow 100 (Ranged)", + "type": "missilestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Ranged", + "minParts": 2, + "assocSkillName": "Archery", + "impactBase": { + "die": 0, + "modifier": 3, + "aspect": "piercing" + }, + "projectileType": "arrow" + }, + "effects": [ + { + "name": "Longbow 100 Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Ranged", + "onsetTime": 0 + } + }, + "_id": "zQazE6xdv7TvXJad", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!B7wGpA01vYRNyMg0.kU2GBRq1lWm0eqUz" + } + ], + "flags": { + "sohl": { + "legendary": { + "maxVolleyMult": 4, + "baseRangeBase": 210, + "drawBase": 100, + "zoneDie": 0 + } + } + }, + "_id": "bMzgUgvGkTt49VtP", + "_key": "!items!B7wGpA01vYRNyMg0", + "img": "systems/sohl/assets/icons/svg/arrow.svg", + "sort": 200000 + } + ], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 3, + "valueBase": 54, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 10, + "abbrev": "LBw100", + "heftBase": 13, + "lengthBase": 6 + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.DaJiW4RWuvOYLB9T", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "IMwGu5hd9ozIdNIE", + "folder": null, + "sort": 375000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.IMwGu5hd9ozIdNIE" + }, + { + "name": "Backpack", + "type": "containergear", + "img": "systems/sohl/assets/icons/sack.svg", + "system": { + "notes": "", + "description": "", + "quantity": 1, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 8, + "textReference": "", + "macros": [], + "nestedItems": [], + "maxCapacityBase": 30, + "valueBase": 30, + "weightBase": 2, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.rMnbWzyue0vPuDdS", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "2INtIGySql189Oz7", + "folder": null, + "sort": 900000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.2INtIGySql189Oz7" + }, + { + "name": "Buckler", + "type": "weapongear", + "img": "systems/sohl/assets/icons/round-shield.svg", + "system": { + "macros": [], + "nestedItems": [ + { + "name": "Buckler (Bash)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Bash", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "die": 6, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Buckler Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "system.$traits.deflectTN", + "mode": 5, + "value": 1, + "priority": null + }, + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 3, + "priority": null + }, + { + "key": "system.$traits.shieldMod", + "mode": 5, + "value": "true", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Bash", + "onsetTime": 0 + } + }, + "_id": "whpVA4afI4aw10el", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!5fmqo5l04oywTVo3.IqWi6W6RITBcPEJb" + } + ], + "flags": {}, + "_id": "to5AuIdZzwsryiMg", + "_key": "!items!5fmqo5l04oywTVo3", + "sort": 100000 + } + ], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 3, + "valueBase": 30, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 9, + "abbrev": "Bklr", + "heftBase": 8, + "lengthBase": 1 + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.keOzxtWCsMbPxhuV", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "bI1M9fVaB9jujYZa", + "folder": null, + "sort": 500000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.bI1M9fVaB9jujYZa" + }, + { + "name": "Broadsword", + "type": "weapongear", + "img": "systems/sohl/assets/icons/sword.svg", + "system": { + "macros": [], + "nestedItems": [ + { + "name": "Broadsword (Cut)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Cut", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "die": 10, + "modifier": 3, + "aspect": "edged" + } + }, + "effects": [ + { + "name": "Broadsword Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 5, + "priority": null + }, + { + "key": "system.$traits.swung", + "mode": 5, + "value": "true", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Cut", + "onsetTime": 0 + } + }, + "_id": "F63QoO3RnPD3kBzM", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!hFyrrqlwVjfHA1Ji.C0EVykhYEfy1RRC3" + } + ], + "flags": {}, + "_id": "9PRiCgOb5fROU8oA", + "_key": "!items!hFyrrqlwVjfHA1Ji", + "sort": 100000 + }, + { + "name": "Broadsword (Impale)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Impale", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "die": 8, + "modifier": 1, + "aspect": "piercing" + } + }, + "effects": [ + { + "name": "Broadsword Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 4, + "priority": null + }, + { + "key": "system.$traits.thrust", + "mode": 5, + "value": "true", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Impale", + "onsetTime": 0 + } + }, + "_id": "H7aHJsCJ77qyOIuC", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!kHfEo2Ew2s1c7Dhy.qeB15WHn3LD5WKl1" + } + ], + "flags": {}, + "_id": "QWVyamL5KVyJk2oD", + "_key": "!items!kHfEo2Ew2s1c7Dhy", + "sort": 200000 + }, + { + "name": "Broadsword (Pommel)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Pommel", + "minParts": 1, + "assocSkillName": "Melee", + "impactBase": { + "die": 6, + "modifier": 0, + "aspect": "blunt" + } + }, + "effects": [ + { + "name": "Broadsword Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "mod:system.$length", + "mode": 5, + "value": 1, + "priority": null + }, + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 3, + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Pommel", + "onsetTime": 0 + } + }, + "_id": "CAQHlW6DwAlyDjSg", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!pnw3OgT6Er72uYZr.kGs7u1uH1kb3PKsm" + } + ], + "flags": { + "sohl": { + "legendary": { + "zoneDie": 4 + } + } + }, + "_id": "fFEflEO2FxOzEMoA", + "_key": "!items!pnw3OgT6Er72uYZr", + "sort": 300000 + }, + { + "name": "Broadsword (Half-Sword Impale)", + "type": "meleestrikemode", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "mode": "Half-Sword Impale", + "minParts": 2, + "assocSkillName": "Melee", + "impactBase": { + "die": 8, + "modifier": 1, + "aspect": "piercing" + } + }, + "effects": [ + { + "name": "Broadsword Traits", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "mod:system.$length", + "mode": 2, + "value": -2, + "priority": null + }, + { + "key": "mod:system.$length", + "mode": 4, + "value": 3, + "priority": null + }, + { + "key": "system.$traits.halfSword", + "mode": 5, + "value": "true", + "priority": null + }, + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": 4, + "priority": null + }, + { + "key": "system.$traits.thrust", + "mode": 5, + "value": "true", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "Half-Sword Impale", + "onsetTime": 0 + } + }, + "_id": "gT1d6KJHzEUpcOHO", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "", + "tint": null, + "transfer": false, + "description": "", + "statuses": [], + "_key": "!items.effects!F95rKQBqJYNF6Fnk.LlE0613WzWsFNIU3" + } + ], + "flags": { + "sohl": { + "legendary": {} + } + }, + "_id": "tIKIMTh92V3GoMXW", + "_key": "!items!F95rKQBqJYNF6Fnk", + "sort": 400000 + } + ], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 3, + "valueBase": 156, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 12, + "abbrev": "BrdSwd", + "heftBase": 10, + "lengthBase": 5 + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.wjTLAt0dcAyim60L", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "WyZJxgvdr33Tzbs1", + "folder": null, + "sort": 600000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.WyZJxgvdr33Tzbs1" + }, + { + "name": "Scale Leggings", + "type": "armorgear", + "img": "systems/sohl/assets/icons/leggings.svg", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 19.8, + "valueBase": 360, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 14, + "abbrev": "SLeg", + "material": "Scale", + "locations": { + "flexible": [], + "rigid": [ + "Pelvis", + "Left Thigh", + "Right Thigh", + "Left Knee", + "Right Knee", + "Left Calf", + "Right Calf", + "Left Foot", + "Right Foot" + ] + }, + "protectionBase": { + "blunt": 4, + "edged": 8, + "piercing": 5, + "fire": 5 + } + }, + "effects": [ + { + "name": "Scale Leggings Encumbrance", + "changes": [ + { + "key": "system.traits.encumbrance", + "mode": 2, + "value": "10.0", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "", + "onsetTime": 0 + } + }, + "_id": "gzPTIUNeZLip9Ea1", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "Actor.TZzvOGswIwY15yIM.Item.BNZsRNZKnRnIqGI3", + "tint": "#ffffff", + "transfer": false, + "description": "", + "statuses": [], + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.BNZsRNZKnRnIqGI3.gzPTIUNeZLip9Ea1" + } + ], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.U4tGAFCfCWktT9He", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "BNZsRNZKnRnIqGI3", + "folder": null, + "sort": 150000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.BNZsRNZKnRnIqGI3" + }, + { + "name": "Rawhide Long Vest", + "type": "armorgear", + "img": "systems/sohl/assets/icons/leather-armor.svg", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 6.8, + "valueBase": 148, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 11, + "abbrev": "RhLngVst", + "material": "Rawhide", + "locations": { + "flexible": [ + "Neck", + "Left Shoulder", + "Right Shoulder", + "Thorax", + "Abdomen", + "Pelvis" + ], + "rigid": [] + }, + "protectionBase": { + "blunt": 1, + "edged": 2, + "piercing": 1, + "fire": 3 + } + }, + "effects": [ + { + "name": "Rawhide Long Vest Encumbrance", + "changes": [ + { + "key": "system.traits.encumbrance", + "mode": 2, + "value": "5.0", + "priority": null + } + ], + "flags": { + "sohl": { + "targetType": "this", + "targetName": "", + "strikeMode": "", + "onsetTime": 0 + } + }, + "_id": "e5F4Fqt75voH9gbN", + "disabled": false, + "duration": { + "startTime": null, + "seconds": null, + "combat": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "origin": "Actor.TZzvOGswIwY15yIM.Item.8NlSSg6Fq0Xj1Ydf", + "tint": "#ffffff", + "transfer": false, + "description": "", + "statuses": [], + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "img": "icons/svg/aura.svg", + "type": "base", + "system": {}, + "sort": 0, + "_key": "!actors.items.effects!2SK6g2KHjS1ufBvw.8NlSSg6Fq0Xj1Ydf.e5F4Fqt75voH9gbN" + } + ], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.53XtDmQZDs9ve4ud", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "8NlSSg6Fq0Xj1Ydf", + "folder": null, + "sort": 250000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.8NlSSg6Fq0Xj1Ydf" + }, + { + "name": "Rawhide Calf Boots", + "type": "armorgear", + "img": "systems/sohl/assets/icons/leather-boot.svg", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 2.9, + "valueBase": 76, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 11, + "abbrev": "LtCBoot", + "material": "Rawhide", + "locations": { + "flexible": [ + "Left Calf", + "Right Calf", + "Left Foot", + "Right Foot" + ], + "rigid": [] + }, + "protectionBase": { + "blunt": 1, + "edged": 2, + "piercing": 1, + "fire": 3 + } + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.oOOMdsP9QBnFL6yp", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "Iks3y6lL8ESxP3KO", + "folder": null, + "sort": 900000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.Iks3y6lL8ESxP3KO" + }, + { + "name": "Rawhide Cap", + "type": "armorgear", + "img": "systems/sohl/assets/icons/cap.svg", + "system": { + "macros": [], + "nestedItems": [], + "notes": "", + "description": "", + "textReference": "", + "transfer": true, + "quantity": 1, + "weightBase": 0.6, + "valueBase": 16, + "isCarried": true, + "isEquipped": true, + "qualityBase": 0, + "durabilityBase": 11, + "abbrev": "RhCap", + "material": "Rawhide", + "locations": { + "flexible": [ + "Skull" + ], + "rigid": [] + }, + "protectionBase": { + "blunt": 1, + "edged": 2, + "piercing": 1, + "fire": 3 + } + }, + "effects": [], + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.Fa1kEtj1CenIKvzc", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_id": "qkTPM6cHMuer2tFd", + "folder": null, + "sort": 900000, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.qkTPM6cHMuer2tFd" + }, + { + "name": "Flask, glass, 1pt.", + "type": "containergear", + "img": "systems/sohl/assets/icons/round-bottom-flask.svg", + "system": { + "notes": "", + "description": "2 lbs. if full", + "quantity": 1, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 7, + "textReference": "", + "macros": [], + "nestedItems": [ + { + "name": "Fireshield Elixir", + "type": "concoctiongear", + "img": "systems/sohl/assets/icons/potion.svg", + "system": { + "notes": "", + "description": "", + "quantity": 4, + "isCarried": true, + "isEquipped": false, + "qualityBase": 0, + "durabilityBase": 5, + "textReference": "", + "subType": "elixir", + "potency": "na", + "strength": 0, + "macros": [], + "nestedItems": [], + "valueBase": 0, + "weightBase": 0.25, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.fhPyd9yfLe9dAfAk", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": 1723129237332, + "modifiedTime": 1723129237332, + "lastModifiedBy": "RsnPoY20XgcrucTn" + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "czuzxDx5lxIuVyW2", + "folder": null, + "sort": 100000 + } + ], + "maxCapacityBase": 1, + "valueBase": 6, + "weightBase": 1, + "abbrev": "", + "transfer": true + }, + "effects": [], + "flags": {}, + "_stats": { + "compendiumSource": "Compendium.sohl.legendary-basic-items.Item.4jbaN2veD9azYYmS", + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "_id": "B01xfwIBhUwg0XF3", + "folder": null, + "sort": 0, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.B01xfwIBhUwg0XF3" + }, + { + "name": "Head", + "type": "injury", + "_id": "OUe82pi8rEyC9xgV", + "img": "systems/sohl/assets/icons/injury.svg", + "system": { + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "injuryLevelBase": 0, + "healingRateBase": 2, + "aspect": "blunt", + "isTreated": false, + "isBleeding": false, + "bodyLocation": "Head" + }, + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.OUe82pi8rEyC9xgV" + }, + { + "name": "Intrinsic Weariness", + "type": "affliction", + "system": { + "subType": "fatigue", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "isDormant": false, + "isTreated": false, + "diagnosisBonusBase": 0, + "levelBase": 2, + "healingRateBase": -1, + "contagionIndexBase": 0, + "transmission": "none" + }, + "_id": "XWDIPAfF2WiiJWDv", + "img": "systems/sohl/assets/icons/tired.svg", + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.XWDIPAfF2WiiJWDv" + }, + { + "name": "Influenza", + "type": "affliction", + "system": { + "subType": "disease", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "isDormant": false, + "isTreated": false, + "diagnosisBonusBase": 0, + "levelBase": 2, + "healingRateBase": 3, + "contagionIndexBase": 0, + "transmission": "none" + }, + "_id": "WvgQgUyXOAaiNJF7", + "img": "systems/sohl/assets/icons/sick.svg", + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.WvgQgUyXOAaiNJF7" + }, + { + "name": "Nerve Toxin", + "type": "affliction", + "system": { + "subType": "poisontoxin", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "isDormant": false, + "isTreated": false, + "diagnosisBonusBase": 0, + "levelBase": 1, + "healingRateBase": 3, + "contagionIndexBase": 0, + "transmission": "none" + }, + "_id": "qhAFDSbpszjA52tN", + "img": "systems/sohl/assets/icons/sick.svg", + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.qhAFDSbpszjA52tN" + }, + { + "name": "Gargun", + "type": "affliction", + "system": { + "subType": "fear", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "isDormant": false, + "isTreated": false, + "diagnosisBonusBase": 0, + "levelBase": 4, + "healingRateBase": 1, + "contagionIndexBase": 0, + "transmission": "none" + }, + "_id": "NmbZJ0PToHGjOw58", + "img": "systems/sohl/assets/icons/screaming.svg", + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.NmbZJ0PToHGjOw58" + }, + { + "name": "Gargun Horde", + "type": "affliction", + "system": { + "subType": "morale", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "isDormant": false, + "isTreated": false, + "diagnosisBonusBase": 0, + "levelBase": 2, + "healingRateBase": 2, + "contagionIndexBase": 0, + "transmission": "none" + }, + "_id": "KvOwnRsMs9Ul27z2", + "img": "systems/sohl/assets/icons/run.svg", + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.KvOwnRsMs9Ul27z2" + }, + { + "name": "Morvin", + "type": "affliction", + "system": { + "subType": "shadow", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "isDormant": false, + "isTreated": false, + "diagnosisBonusBase": 0, + "levelBase": 3, + "healingRateBase": 4, + "contagionIndexBase": 0, + "transmission": "none" + }, + "_id": "lGisCtxTFvXugXFZ", + "img": "systems/sohl/assets/icons/daemon-skull.svg", + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.lGisCtxTFvXugXFZ" + }, + { + "name": "Anemia", + "type": "affliction", + "system": { + "subType": "fatigue", + "macros": [], + "notes": "", + "description": "", + "textReference": "", + "nestedItems": [], + "transfer": false, + "isDormant": false, + "isTreated": false, + "diagnosisBonusBase": 0, + "levelBase": 4, + "healingRateBase": -1, + "contagionIndexBase": 0, + "transmission": "none" + }, + "_id": "WB5rr9v8f7TmrvCn", + "img": "systems/sohl/assets/icons/anemia.svg", + "effects": [], + "folder": null, + "sort": 0, + "ownership": { + "default": 0, + "RsnPoY20XgcrucTn": 3 + }, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.WB5rr9v8f7TmrvCn" + }, + { + "name": "Nadái", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "0aRyHNYuZ0kyOBMd", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "nadai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.0aRyHNYuZ0kyOBMd" + }, + { + "name": "Arálius-Fenéri", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "MLKyBH4zMo6xvynV", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "araliusfeneri", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": 10, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.MLKyBH4zMo6xvynV" + }, + { + "name": "Môrgath", + "type": "domain", + "img": "systems/sohl/assets/icons/morgath.png", + "_id": "sgyzO4ambhzlU5Nf", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "morgath", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "mor" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.sgyzO4ambhzlU5Nf" + }, + { + "name": "Skôrus-Masâra", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "R51PocI5R8zVuff4", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "skorusmasara", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -10, + "air": 0, + "aura": 10, + "water": 15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.R51PocI5R8zVuff4" + }, + { + "name": "Ùlándus-Arálius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "8yENbyv6Z7fRIz6x", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ulandusaralius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": 15, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -5, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.8yENbyv6Z7fRIz6x" + }, + { + "name": "Fenéri", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "hPEtHIV351qmTdFM", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "feneri", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 5, + "air": -5, + "aura": -15, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.hPEtHIV351qmTdFM" + }, + { + "name": "Masâra", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "fnLlCWjDjYnOXfW1", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "masara", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": 5, + "metal": -5, + "fire": -15, + "air": -5, + "aura": 5, + "water": 15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.fnLlCWjDjYnOXfW1" + }, + { + "name": "Ùlándus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "DEJFczyETtq567LM", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ulandus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -15, + "aura": -5, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.DEJFczyETtq567LM" + }, + { + "name": "Hîrin", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "Ixp3Y7iyqSM8HIuH", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "hirin", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": -15, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 5, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.Ixp3Y7iyqSM8HIuH" + }, + { + "name": "Tai", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "tlTgHtpRxWAbeol3", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "tai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": -5, + "metal": -15, + "fire": -5, + "air": 5, + "aura": 15, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.tlTgHtpRxWAbeol3" + }, + { + "name": "Navéh", + "type": "domain", + "img": "systems/sohl/assets/icons/naveh.png", + "_id": "AFx6EFh6IdvHklRH", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "naveh", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "nav" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.AFx6EFh6IdvHklRH" + }, + { + "name": "Angberélius-Nadái", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "WGzkvRr3K5ugvO17", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "angbereliusnadai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 10, + "aura": 0, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.WGzkvRr3K5ugvO17" + }, + { + "name": "Haléa", + "type": "domain", + "img": "systems/sohl/assets/icons/halea.png", + "_id": "6NEYvrvuQk6aM3xQ", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "halea", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "hal" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.6NEYvrvuQk6aM3xQ" + }, + { + "name": "Sárajìn", + "type": "domain", + "img": "systems/sohl/assets/icons/sarajin.png", + "_id": "WOxblRJdyp1HcSVz", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "sarajin", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "kaj" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.WOxblRJdyp1HcSVz" + }, + { + "name": "Skôrus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "9eeYdDztrpvfxD9F", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "skorus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -10, + "air": 0, + "aura": 10, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.9eeYdDztrpvfxD9F" + }, + { + "name": "Ládo", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "ICGXfMmRXNAYYi1X", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "lado", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -10, + "aura": 0, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.ICGXfMmRXNAYYi1X" + }, + { + "name": "Nadái-Hîrin", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "ABSzpR4mHu7l99Kj", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "nadaihirin", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": -10, + "metal": 0, + "fire": 10, + "air": 10, + "aura": 0, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.ABSzpR4mHu7l99Kj" + }, + { + "name": "Táræl", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "eC0oQJDTQ1mA3ZUi", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "tarael", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": -10, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.eC0oQJDTQ1mA3ZUi" + }, + { + "name": "Ilvîr", + "type": "domain", + "img": "systems/sohl/assets/icons/ilvir.png", + "_id": "UGZ1tvihPZRYHLfv", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "ilvir", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "ivo" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.UGZ1tvihPZRYHLfv" + }, + { + "name": "Hîrin-Táræl", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "elHS2Dxv0x37Zvql", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "hirintarael", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": -10, + "metal": -5, + "fire": 5, + "air": 15, + "aura": 10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.elHS2Dxv0x37Zvql" + }, + { + "name": "Fenéri-Áhnù", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "iEQiN0meCCP3nhCx", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "feneriahnu", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": 5, + "metal": 15, + "fire": 10, + "air": 0, + "aura": -10, + "water": -5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.iEQiN0meCCP3nhCx" + }, + { + "name": "Tai-Skôrus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "iXkeEPpaAIsBCTbU", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "taiskorus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": 0, + "metal": -10, + "fire": -5, + "air": 5, + "aura": 15, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.iXkeEPpaAIsBCTbU" + }, + { + "name": "Áhnù", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "29PMkqi1wM1eNN2V", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ahnu", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 10, + "air": 0, + "aura": -10, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.29PMkqi1wM1eNN2V" + }, + { + "name": "Masâra-Ládo", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "chvs1zYL1czSg1xn", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "masaralado", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": 10, + "metal": 0, + "fire": -10, + "air": -5, + "aura": 5, + "water": 15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.chvs1zYL1czSg1xn" + }, + { + "name": "Ágrik", + "type": "domain", + "img": "systems/sohl/assets/icons/agrik.png", + "_id": "69Ak2P5LnKAWF8DN", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "agrik", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "agr" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.69Ak2P5LnKAWF8DN" + }, + { + "name": "Siém", + "type": "domain", + "img": "systems/sohl/assets/icons/siem.png", + "_id": "fcpkwIv9wZZGkT3B", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "siem", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "zem" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.fcpkwIv9wZZGkT3B" + }, + { + "name": "Peóni", + "type": "domain", + "img": "systems/sohl/assets/icons/peoni.png", + "_id": "1nj5yxd88GP7wok5", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "peoni", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "eon" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.1nj5yxd88GP7wok5" + }, + { + "name": "Sávè-K'nôr", + "type": "domain", + "img": "systems/sohl/assets/icons/saveknor.png", + "_id": "DitjfeFXQ5GHtM5c", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "saveknor", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "zer" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.DitjfeFXQ5GHtM5c" + }, + { + "name": "Laráni", + "type": "domain", + "img": "systems/sohl/assets/icons/larani.png", + "_id": "YLWf6arvx2uSs8fQ", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "divine" + ], + "abbrev": "larani", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "legendary": { + "aspects": [ + "ara" + ] + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.YLWf6arvx2uSs8fQ" + }, + { + "name": "Angberélius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "41oq3jQgKdXPC9tM", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "angberelius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": -5, + "metal": 5, + "fire": 15, + "air": 5, + "aura": -5, + "water": -15 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.41oq3jQgKdXPC9tM" + }, + { + "name": "Arálius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "QS0r8YSsNUFlsDrb", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "aralius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": false, + "legendary": { + "ssMod": { + "earth": 10, + "metal": 10, + "fire": 0, + "air": -10, + "aura": -10, + "water": 0 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.QS0r8YSsNUFlsDrb" + }, + { + "name": "Táræl-Tai", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "AeqFgxniP4htxasC", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "taraeltai", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": -5, + "metal": -10, + "fire": 0, + "air": 10, + "aura": 15, + "water": 5 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.AeqFgxniP4htxasC" + }, + { + "name": "Ládo-Ùlándus", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "p9KiADdlPvjLCPJ7", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ladoulandus", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": 15, + "metal": 5, + "fire": -5, + "air": -10, + "aura": 0, + "water": 10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.p9KiADdlPvjLCPJ7" + }, + { + "name": "Áhnù-Angberélius", + "type": "domain", + "img": "systems/sohl/assets/icons/astrology.svg", + "_id": "XW70H6KOuThwkTyY", + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": [], + "nestedItems": [], + "transfer": false, + "categories": [ + "astral" + ], + "abbrev": "ahnuangberelius", + "philosophy": "West Venârian" + }, + "effects": [], + "flags": { + "sohl": { + "cusp": true, + "legendary": { + "ssMod": { + "earth": 0, + "metal": 10, + "fire": 15, + "air": 5, + "aura": -5, + "water": -10 + } + } + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": null, + "modifiedTime": null, + "lastModifiedBy": null + }, + "folder": "PkHkW8isQDuz1LmJ", + "sort": 0, + "ownership": { + "default": 0, + "TMJsvJWT6ytpHZ0M": 3, + "0year58XBVccywIu": 3 + }, + "_key": "!actors.items!2SK6g2KHjS1ufBvw.XW70H6KOuThwkTyY" + } + ], + "effects": [], + "folder": "6agrTJfWrikRraVu", + "flags": { + "exportSource": { + "world": "sohl-test", + "system": "sohl", + "coreVersion": "12.330", + "systemVersion": "0.9.0" + } + }, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "coreVersion": "12.330", + "systemId": "sohl", + "systemVersion": "0.9.0", + "createdTime": 1724530649440, + "modifiedTime": 1724530649440, + "lastModifiedBy": "0year58XBVccywIu" + }, + "_id": "2SK6g2KHjS1ufBvw", + "sort": 0, + "ownership": { + "default": 0, + "0year58XBVccywIu": 3 + }, + "_key": "!actors!2SK6g2KHjS1ufBvw" +} diff --git a/packs/generate/legendary/leg-mysteries/data/domains.yaml b/packs/generate/legendary/leg-mysteries/data/domains.yaml new file mode 100644 index 0000000..2d5ae4f --- /dev/null +++ b/packs/generate/legendary/leg-mysteries/data/domains.yaml @@ -0,0 +1,1935 @@ +- name: Fire + abbrev: fire + id: G8t818wUbHLNj5LA + folderId: J6IAJZ5uWs3Bdqwj + img: systems/sohl/assets/icons/fire.svg + categories: + - arcane + philosophy: Magic + macros: [] + flags: {} + effects: [] + description: "" +- name: Water + abbrev: water + id: 18LdBLEj7DnUvLeD + folderId: J6IAJZ5uWs3Bdqwj + img: systems/sohl/assets/icons/water.svg + categories: + - arcane + philosophy: Magic + macros: [] + flags: {} + effects: [] + description: "" +- name: Neutral + abbrev: neutral + id: jKn8JtadrQLtPYST + folderId: J6IAJZ5uWs3Bdqwj + img: systems/sohl/assets/icons/circle.svg + categories: + - arcane + philosophy: Magic + macros: [] + flags: {} + effects: [] + description: "" +- name: Spirit + abbrev: spirit + id: veOom04mHP3wIyqS + folderId: J6IAJZ5uWs3Bdqwj + img: systems/sohl/assets/icons/divination.svg + categories: + - arcane + philosophy: Magic + macros: [] + flags: {} + effects: [] + description: "" +- name: Wind + abbrev: wind + id: wghlZTwMhrFu65vk + folderId: J6IAJZ5uWs3Bdqwj + img: systems/sohl/assets/icons/wind.svg + categories: + - arcane + philosophy: Magic + macros: [] + flags: {} + effects: [] + description: "" +- name: Metal + abbrev: metal + id: hsYqwHpxvZ4HecZI + folderId: J6IAJZ5uWs3Bdqwj + img: systems/sohl/assets/icons/anvil.svg + categories: + - arcane + philosophy: Magic + macros: [] + flags: {} + effects: [] + description: "" +- name: Earth + abbrev: earth + id: HSTW5VjsXkQ3MYQE + folderId: J6IAJZ5uWs3Bdqwj + img: systems/sohl/assets/icons/tree.svg + categories: + - arcane + philosophy: Magic + macros: [] + flags: {} + effects: [] + description: "" +- name: Baldr + abbrev: baldr + id: viP5RD0YBjPW3E6F + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/baldr.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - zem + effects: [] + description: |- +

Baldr, revered as the god of the elder races, holds special significance for both elves and dwarves. Among these ancient and noble beings, Baldr is celebrated as the divine patron who oversees their realms and sustains their way of life. The elves, in particular, see him as a protector of their enchanted forests and hidden groves, while the dwarves honor him as a guardian of their deep, ancient halls and mystical craftsmanship.

+

Baldr's influence extends to dreams, where he serves as a guide through the ethereal landscapes of sleep. He is the weaver of dreamscapes, creating visions that inspire, heal, and foretell. Through his intervention, dreams become pathways to otherworldly wisdom and inner peace. His followers often engage in rituals and meditative practices to connect with him, seeking his guidance in their dreams.

+

As the god of light, Baldr embodies purity and enlightenment, casting away shadows and bringing clarity. His light is not merely physical but also symbolic, representing hope, truth, and the power to overcome darkness. This sacred light nurtures life and fosters growth, harmonizing with the natural world. His followers, deeply connected to nature, strive to live in balance with their surroundings, honoring the cycles of life and the sacredness of every living thing.

+

Baldr is often depicted with an aura of radiant light, his visage serene and his eyes filled with boundless compassion and wisdom. Around him, symbols of nature and the elder races—ancient trees, intricate runes, luminous crystals—serve as testaments to his divine connection with the world. His presence is a beacon of tranquility and inspiration, guiding all who seek harmony, wisdom, and the light of understanding.

+

Religion of Baldr: The Luminous Path

+

Sacred Objects:

+
    +
  • Sunstone: Represents light and clarity.
  • +
  • Feather of an Owl: Symbolizes wisdom and guidance in dreams.
  • +
  • Silver Leaf: Reflects purity and the connection to nature.
  • +
  • Crystal Dewdrop: Signifies purity and the ethereal nature of dreams.
  • +
+

Relics:

+
    +
  • The Lightstone: A radiant gem believed to be a fragment of Baldr’s divine essence.
  • +
+

Clergy Hierarchical Levels:

+
    +
  • Draumr Sveinn/Mær (Circle I: "Dream Boy/Girl") - Dream Acolyte
  • +
  • Ljós Goði/Goðe (Circle III: "Light Priest/Priestess") - Dreamweaver Priest/Priestess
  • +
  • Draumr Hersir (Circle IV: "Dream Warlord") - Luminous Herald
  • +
  • Ljós Jarl (Circle V: "Light Jarl") - Guardian of the Elder Realms
  • +
  • Ljós Konungr/Konungrkvinde (Circle VI: "Light King/Queen") - Lightbringer
  • +
  • Viska Allsherjargoði (Circle VII: "Wisdom High Priest") - Elder Sage
  • +
  • Ljós Faðir/Móðir (Circle VIII: "Father/Mother of Light") - Pontiff of the Radiant Dream
  • +
+

Key Skills:

+
    +
  • Dream interpretation
  • +
  • Archery
  • +
  • Survival
  • +
  • Tracking
  • +
  • Trance
  • +
  • Communication with elder races
  • +
  • Prophecy
  • +
+

Divine Servants:

+
    +
  • Luminae: Beings of pure light who serve as Baldr’s messengers
  • +
  • Dreamwardens: Spirits who roam the spirit realm and guide souls through their dreams.
  • +
+

Low Ceremonies:

+
    +
  • The Blessing of Light: A ceremony, preferentially held in a forest, where the faithful receive a blessing from the priests to inspire connection to light and nature and ward against darkness and despair.
  • +
+

High Ceremonies for Clergy:

+
    +
  • The Rite of Illumination: A sacred ritual where the clergy gather to deepen their connection with Baldr’s light, often resulting in visions or divine inspiration.
  • +
  • The Weaving of Dreams: A ceremony where high-ranking priests create protective wards and dreamscapes for the community, ensuring peaceful and insightful dreams.
  • +
+

Festivals:

+
    +
  • Festival of the Radiant Dawn: Celebrated at the summer solstice, this festival honors Baldr’s light with grand processions, music, and the lighting of massive bonfires.
  • +
  • The Night of Dreams: An annual event where the faithful gather to share their dreams and visions, seeking wisdom and guidance from Baldr.
  • +
+

Ordeals for Favor:

+
    +
  • The Dreamwalk: A journey through the spirit realm, where the faithful must navigate and confront their fears and desires to emerge enlightened.
  • +
  • The Elder’s Blessing: A pilgrimage to the ancient groves or halls of the elder races, seeking their wisdom and Baldr’s favor.
  • +
  • The Luminous Quest: A task where the faithful must retrieve a lost artifact of light from a dark and dangerous place.
  • +
  • The Rite of Pure Vision: An ordeal involving a period of sensory deprivation, allowing the participant to experience true vision and clarity, but at the risk of psychological trauma.
  • +
+

Clerical Orders:

+
    +
  • Order of the Radiant Hand: Priests dedicated to healing and spreading Baldr’s light, often serving as medics and counselors.
  • +
  • Elder’s Voice: Priests who act as intermediaries between the elder races and mortals, preserving ancient knowledge and ensuring harmony.
  • +
+

Fighting Orders:

+
    +
  • Eldingsekr ("Lightning Swords") - Fighters who have been trained by the elder races, using ancient techniques and magic to uphold Baldr’s will.
  • +
+- name: Fréyr + abbrev: freyr + id: wJg0DeQJUJ78KnUf + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/freyr.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - eon + effects: [] + description: |- +

Fréyr, the compassionate god of fertility, agriculture, peace, and healing, holds a special place in the hearts of farmers and rural folk. As the deity who ensures bountiful harvests and thriving livestock, Fréyr's blessings are vital to those who work the land. Known for his nurturing presence, he fosters growth and life, symbolizing the very essence of the natural world's fertility.

+

A god of peace, Fréyr tirelessly works to bring harmony among people. He is a divine mediator, striving to resolve conflicts and promote understanding. His influence is crucial in maintaining unity and preventing discord within communities. Fréyr’s followers are dedicated to his ideals, seeking to cultivate peace and compassion in their daily lives.

+

Fréyr is also the revered god of healing, and his mendicant clergy reflect his humility and dedication. These priests are often found working hand-in-hand with their flock in fields and glens, embodying the close bond between divinity and nature. They perform services outdoors, under the open sky, connecting worshippers directly with the earth and its bounties. The rare temples dedicated to Fréyr serve dual purposes; they are invariably attached to hospitals and primarily cater to the needs of the sick. These sacred buildings are sanctuaries of care and recovery, where healing is provided to all, regardless of their ability to pay.

+

The clergy of Fréyr are known for their selflessness and dedication to service. They are skilled healers, tending to physical ailments with herbal remedies and divine blessings. Their presence in the community is a source of comfort and hope, as they work to heal both bodies and hearts. These priests see themselves as stewards of the land and its people, ensuring that both flourish under Fréyr’s benevolent gaze.

+

Fréyr is often depicted as a serene and nurturing figure, his visage radiating kindness and warmth. He is commonly shown with symbols of agriculture, such as sheaves of wheat or fruits, emphasizing his role in promoting fertility and growth. His attire is simple, reflecting his close connection to the humble, yet vital, rural life. In one hand, he may hold a staff or a bundle of healing herbs, representing his dual role as a nurturer of the land and a healer of its people.

+

Sites of worship dedicated to Fréyr are typically outdoors, set in fields, forests, or gardens, where the natural world is a living altar. These spaces capture the essence of his divine presence, with ceremonies and rituals conducted in the open air to honor the god who nurtures all life. The few temples that exist are integral parts of hospitals, designed to bring spiritual and physical healing together.

+

Fréyr’s influence is woven into the fabric of rural existence, ensuring that life prospers in harmony and peace. His followers seek his guidance and blessings in all aspects of their lives, from the growth of their crops to the health of their families, embodying his principles of compassion, peace, and healing.

+

Religion of Fréyr: The Verdant Path

+

Sacred Objects:

+
    +
  • Sheaf of Wheat: Represents fertility and agriculture.
  • +
  • Oak Leaf: Symbolizes strength and growth in nature.
  • +
  • Healing Herb Bundle: Used in rituals of healing and blessing.
  • +
  • River Stone: Represents the flow of life and the nurturing aspect of water.
  • +
+

Relics:

+
    +
  • The Staff of Growth: (Unique) A divine staff said to be imbued with Fréyr’s power, capable of making barren land fertile.
  • +
  • Healing Chalice: A sacred cup used in rituals, believed to hold the power of healing when filled with blessed water.
  • +
+

Clergy Hierarchical Levels:

+
    +
  • Frjó Thræll (Circle I: "Fertile Thrall") - Seed Acolyte
  • +
  • Heill Goði/Goðe (Circle III: "Blessing Priest/Priestess") - Harvest Priest/Priestess
  • +
  • Jörð Hersir (Circle IV: "Earth Warlord") - Grove Keeper
  • +
  • Frjó Jarl (Circle V: "Fertility Jarl") - Steward of the Land
  • +
  • Gróður Konungr/Konungrkvinde (Circle VI: "Growth King/Queen") - High Steward
  • +
  • Vetr Allsherjargoði (Circle VII: "Winter High Priest") - Greenwarden
  • +
  • Líf Faðir/Móðir (Circle VIII: "Father/Mother of Life") - Pontiff of the Verdant Way
  • +
+

Key Skills:

+
    +
  • Herbalism
  • +
  • Physician
  • +
  • Survival
  • +
  • Animalcraft
  • +
  • Agriculture
  • +
+

Divine Servants:

+
    +
  • Sylvans: Forest spirits who aid in the growth and protection of the natural world.
  • +
  • Healing Wisps: Ethereal beings that assist in the healing arts, subtly guiding the hands of Fréyr’s priests.
  • +
+

Low Ceremonies:

+
    +
  • The Blessing of the Fields: A monthly ritual where the faithful gather to bless their crops and ensure a bountiful harvest and where the sick and wounded receive blessings from the priests, invoking Fréyr’s healing powers. Preferably held outdoors.
  • +
+

High Ceremonies for Clergy:

+
    +
  • The Rite of Renewal: A sacred ritual performed by the clergy to renew the earth’s fertility, often involving the planting of sacred seeds.
  • +
  • The Grove’s Embrace: A ceremony where high priests enter a sacred grove to commune with Fréyr, seeking his guidance for the coming seasons.
  • +
+

Festivals:

+
    +
  • Festival of the First Harvest: Held at the beginning of the harvest season, this festival celebrates the bounty of the earth with feasts, music, and communal blessings.
  • +
  • The Day of Peace: An annual event dedicated to promoting harmony among communities, with rituals focused on conflict resolution and reconciliation.
  • +
+

Ordeals for Favor:

+
    +
  • The Pilgrimage of Growth: A journey to sacred sites, where the faithful plant trees and restore life to barren lands.
  • +
  • The Healing Trial: A test where participants must heal a grievously injured creature, using only the natural remedies provided by Fréyr.
  • +
  • The Peacewalk: A task where the faithful must mediate a dispute between feuding families or tribes, bringing them to a peaceful resolution.
  • +
  • The Blessing of the Wild: An ordeal where the participant must survive alone in the wilderness, relying on their connection to nature and Fréyr’s guidance.
  • +
  • The Seed of Life: A ritual where the faithful must nurture a seedling through harsh conditions, ensuring its growth into a strong and healthy tree.
  • +
+

Clerical Orders:

+
    +
  • Order of the Green Hand: Priests dedicated to healing and the nurturing of the earth, often working as herbalists and caretakers of sacred groves.
  • +
  • Heralds of Peace: Mediators who specialize in resolving conflicts and maintaining harmony within and between communities.
  • +
  • Healers of the Hearth: Priests who focus on healing the body and soul, providing care for the sick and comforting the distressed.
  • +
+- name: Fréyja + abbrev: freyja + id: MKannngXbetAujhR + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/freyja.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - hal + effects: [] + description: |- +

Fréyja, the goddess of love, beauty, and prosperity, stands as an alluring and multifaceted figure in the pantheon. As the embodiment of love and beauty, Fréyja inspires passion and enchantment, capturing the hearts of all who seek her favor. She is worshipped by those who revel in the pleasures of life, from romantic and carnal delights to the joys of art and nature's splendor.

+

However, Fréyja's domain extends beyond the pleasures of the heart and body. As the goddess of prosperity, she is a powerful patroness for merchants, usurers, and all who pursue wealth. Many of the affluent and hedonistic followers turn to Fréyja seeking both sensual gratification and material success. Her blessings are believed to bring not only beauty and love but also abundance and financial gain.

+

Fréyja's temples are grand structures that serve dual purposes as centers of commerce and pleasure palaces. These sacred places are adorned with opulent decorations, blending the awe of divine beauty with the wealth of mercantile success. Inside, one may find luxurious halls where transactions are made, alongside sumptuous chambers dedicated to hedonistic pursuits. The temples are often bustling with activity, where deals are struck as easily as hearts are won.

+

The priestesses of Fréyja are renowned for their mastery of the art of seduction. They are not just spiritual guides but also enchantresses who embody the goddess's alluring qualities. Skilled in the ways of attraction, charm, and negotiation, they serve as intermediaries who can turn desires into reality, be they of the heart or of the purse. Their rituals often involve intricate and lavish ceremonies designed to invoke Fréyja's blessings of love and prosperity upon her followers.

+

Fréyja is depicted as a radiant and sensual goddess, her beauty unparalleled and her charm irresistible. She is often shown adorned with elegant garments and precious jewels, symbols of both her divine allure and her association with wealth. Her golden hair and enchanting eyes captivate all who gaze upon her, embodying the irresistible charm she bestows upon her followers. In her hands, she may hold a mirror, a symbol of beauty and self-reflection, or a cornucopia, representing prosperity and abundance.

+

Worshippers of Fréyja engage in rituals designed to celebrate life's pleasures and seek her blessings for love and wealth. These rituals can range from intimate and private acts of devotion to grand public festivities filled with music, dance, and revelry. The followers of Fréyja believe that by honoring her with such celebrations, they secure her favor and invite her blessings into their lives.

+

In essence, Fréyja exists as a divine figure who bridges the worlds of hedonistic pleasure and material prosperity. Her influence is felt in the hearts of lovers and the ledgers of merchants alike, making her a goddess of extraordinary appeal and power. Through her, the joys of love, beauty, and wealth converge, offering her followers a life touched by the divine essence of pleasure and prosperity.

+

Religion of Fréyja: The Golden Path

+

Sacred Objects:

+
    +
  • Rose Petal: Represents love and beauty.
  • +
  • Silver Coin: Symbolizes prosperity and wealth.
  • +
  • Mirror Shard: Used in rituals of self-reflection.
  • +
  • Honeycomb: Signifies abundance and sweetness in life.
  • +
+

Divine Relics:

+
    +
  • Mirror of Desire: A sacred mirror said to reflect one’s truest desires.
  • +
  • The Cornucopia of Abundance: (Unique) A divine horn that pours forth endless wealth and prosperity, symbolizing Fréyja’s power over abundance.
  • +
+

Clergy Hierarchical Levels: + The higher levels of clergy, circle V and above, are only accessible to females.

+
    +
  • Gull Thræll (Circle I: "Golden Thrall") - Silk Acolyte
  • +
  • Fegurð Goði/Goðe (Circle III: "Beauty Priest/Priestess") - Priest/Priestess of Charm
  • +
  • Fágr Hersir (Circle IV: "Fair Warlord") - Gilded Voice
  • +
  • Gull Jarl (Circle V: "Gold Jarl") - Guardian of Prosperity
  • +
  • Fríðr Konungrkvinde (Circle VI: "Fair Queen") - Golden Sovereign
  • +
  • Sefja Allsherjargoði (Circle VII: "Charming High Priest") - High Enchantress
  • +
  • Fríðr Móðir (Circle VIII: "Mother of Beauty") - Pontiff of the Golden Veil
  • +
+

Key Skills:

+
    +
  • Seduction and charm
  • +
  • Mercantilism
  • +
  • Mathematics
  • +
+

Divine Servants:

+
    +
  • Seraphs of Desire: Ethereal beings who embody Fréyja’s allure, serving as guides in rituals of love and beauty.
  • +
  • Gilded Wisps: Spirits that bring wealth and prosperity to Fréyja’s followers, often appearing as shimmering lights.
  • +
+

Low Ceremonies:

+
    +
  • The Blessing of Wealth: A ritual where the faithful offer tokens of gold or precious items to Fréyja, asking for prosperity and financial success.
  • +
  • The Golden Veil: A mystery rite for those who have proven their devotion to Fréyja where the clergy don transparent golden garments and perform sacred rituals of seduction with the faithful, honoring Fréyja's gifts.
  • +
+

High Ceremonies:

+
    +
  • The Rite of Enchantment: A sacred ceremony where high priests invoke Fréyja’s power to bless objects, people, or places with beauty, charm, and wealth.
  • +
+

Festivals:

+
    +
  • Festival of the Rose: Held in spring, this festival celebrates love and beauty with grand banquets, elaborate dances, and rituals to honor Fréyja.
  • +
  • The Day of Silver: An annual event focused on wealth and prosperity, where the faithful gather to share their successes and offer thanks to Fréyja for her blessings.
  • +
+

Ordeals for Favor:

+
    +
  • The Golden Pilgrimage: A journey to Fréyja’s grandest temples, where the faithful offer their most prized possessions in hopes of receiving her blessings.
  • +
  • The Blessing of the Mirror: A ritual where the faithful must gaze into the Mirror of Desire for an entire night, contemplating their deepest desires and how to achieve them, risking psychological trauma.
  • +
  • The Gilded Harvest: A task where participants must accumulate a significant amount of wealth through trade, negotiation, or other means, dedicating it to Fréyja’s temples.
  • +
+

Clerical Orders:

+
    +
  • Order of the Enchanted Rose: Priests dedicated to mastering the arts of love and beauty, often serving as advisors to the powerful and influential.
  • +
  • Keepers of the Golden Veil: Guardians of Fréyja’s sacred wealth, ensuring that the temples are prosperous and well-maintained.
  • +
  • Gilded Voices: Priests known for their persuasive abilities, often serving as diplomats, negotiators, and ambassadors for Fréyja’s faith.
  • +
+

Fighting Orders:

+
    +
  • Knights of the Golden Rose: Elite warriors who protect the temples and followers of Fréyja.
  • +
+- name: Hél + abbrev: hel + id: Zn81uf5Kkg8HxYff + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/hel.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - mor + effects: [] + description: |- +

Hél, the god of the underworld, is a figure shrouded in darkness and malevolence. Hél harbors a profound disdain for life itself. He considers existence a blight upon the cosmos and works tirelessly to bring all creation to chaos and ruin. His dominion over the underworld is absolute, and it is a place of endless torment and despair, reflecting his contempt for living beings.

+

Hél draws upon the power and madness of the Eye of the Void, a primordial artifact of pure, concentrated corruption. This dreadful relic amplifies his dark energies and drives him further into insanity, making him one of the most feared beings in the pantheon. The Eye of the Void's influence corrupts everything in its vicinity, casting an aura of dread and hopelessness that seeps into the mortal world.

+

Hél's followers are a fanatically devoted to the propagation of death and chaos. The priests perform ritual human sacrifices, believing these offerings increase chaos and Hél's power and hasten the end of all life. Through these grim ceremonies, they seek his favor and seek to be granted dominion in the ruined world he envisions.

+

Hél commands an army of the undead—Nightwights (the favored and terrible) and Hélthraals (corpses of the weak and dishonored)—reanimated by his dark magic to serve as his relentless minions. These undead legions are his twisted gift to the world, spreading terror and devastation wherever they go. He is often depicted as a ghastly figure, his eyes burning with a baleful light, and a morbid grin permanently etched on his face. Around his neck hangs the Eye of the Void, a source of his unholy strength and the symbol of his eternal hatred for all living things.

+

Religion of Hél: The Eternal Night

+

Sacred Objects:

+
    +
  • Obsidian Shard: Represents darkness and the void.
  • +
  • Bone Fragment: A reminder of mortality and the power over the dead.
  • +
  • Black Candle: Used in rituals to honor Hél’s dominion over the underworld.
  • +
+

Relics:

+
    +
  • The Eye of the Void: (Unique) A cursed artifact said to amplify the powers of death and chaos, venerated in every temple of Hél.
  • +
  • Nightblade: A ceremonial dagger used in ritual sacrifices, believed to hold the power to sever the soul from the body.
  • +
+

Clergy Hierarchical Levels:

+
    +
  • Nádr Thræll (Circle I: Shadow Thrall) - Shadow Acolyte
  • +
  • Dauðr Goði/Goðe (Circle III: Priest/Priestess of Death) - Void Priest/Priestess
  • +
  • Skuggi Hersir (Circle IV: Shadow Warlord) - Harbinger of Chaos
  • +
  • Heljar Jarl (Circle V: Jarl of the Underworld) - Warden of the Abyss
  • +
  • Dauðr Konungr/Konungrkvinde (Circle VI: Death King/Queen) - Archshadow
  • +
  • Ragnar Allsherjargoði (Circle VII: Ragnar High Priest) - Doombringer
  • +
  • Heljar Faðir/Móðir (Father/Mother of Hel) - Pontiff of Despair
  • +
+

Key Skills:

+
    +
  • Embalming
  • +
+

Divine Servants:

+
    +
  • Nightwights: Elite undead warriors, favored by Hél, who serve as guardians of his temples.
  • +
  • Hélthraals: Reanimated corpses of the dishonored, used as servants and soldiers in Hél's legions.
  • +
+

Low Ceremonies:

+
    +
  • The Night Vigil: A monthly ceremony where followers gather in the presence of clergy to meditate on the inevitability of death and decay.
  • +
  • The Offering of Shadows: A ritual where followers offer a piece of their essence (blood or hair) to Hél, seeking to expand chaos in the world.
  • +
+

High Ceremonies:

+
    +
  • The Rite of Eternal Darkness: A secret ceremony performed by the clergy to beseech power from the Eye of the Void, deepening their connection to Hél.
  • +
  • The Binding of Souls: A ritual where high-ranking clergy create Helspawn by sacrificing folk victims to serve Hél in the afterlife.
  • +
+

Festivals:

+
    +
  • Night of the Dead: Held on the longest night of the year, this festival celebrates Hél’s dominion over the dead, with processions that include elaborate sacrifices assissted by Nightwights.
  • +
  • The Veil of Shadows: An annual event where the faithful gather to witness the temporary merging of the mortal world with Hél’s domain, causing widespread fear and chaos.
  • +
+

Ordeals for Favor:

+
    +
  • The Walk of the Dead: A journey through a battlefield, where the faithful with the assistance of an unholy relic must summon, confront, and survive the spirits of the fallen courageous who would otherwise go to Valhalla, sending their souls instead to the Void.
  • +
  • The Blood Oath: A binding pact made in blood, where the participant pledges their soul to Hél in exchange for dark powers.
  • +
  • The Grave Descent: A trial where the faithful must spend a night buried alive, relying only on their faith in Hél to survive, often resulting in severe psychological trauma.
  • +
  • The Bone Ritual: An ordeal where participants must fashion weapons from the bones of the dead and use them successfully in combat.
  • +
  • The Shadow Hunt: A task where the faithful must track and capture a living sacrifice under the cover of darkness, offering it to Hél at dawn, the more difficult the target the greater the favor.
  • +
+

Clerical Orders:

+
    +
  • Order of the Void: A secretive group dedicated to sowing chaos and expanding the influence of the Eye of the Void.
  • +
  • Keepers of the Abyss: Guardians of the temples and unholy inquisitors, tasked with protecting sacred sites and maintaining the rituals of Hél.
  • +
  • Harbingers of Despair: Missionaries who spread the doctrine of Hél through fear and terror, converting or destroying all in their path.
  • +
  • Soulweavers: Priests specialized in binding souls to Hél's service, both in life and after death.
  • +
+

Fighting Orders:

+
    +
  • Nightstalkers: Elite assassins who carry out Hél's will through targeted killings designed for maximum chaos and impact.
  • +
+- name: Lôki + abbrev: loki + id: mzjCAUHomor1wU9L + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/loki.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - nav + effects: [] + description: |- +

Lôki, the god of cunning, deception, and thieves, is the archetypal trickster—an unpredictable force of chaos and disruption. He is revered and feared in equal measure, embodying a dynamic, shape-shifting energy that defies the status quo and undermines conventional power structures. Lôki’s followers are a diverse group, including assassins, thieves, and the downtrodden—those who lurk in society's shadows and navigate its underworld.

+

Known for his sharp intellect and silver tongue, Lôki is a master of disguise and manipulation. His trickery knows no bounds, and he delights in orchestrating elaborate schemes that bring downfall to the powerful and instigate disorder. His ultimate goal is not to elevate the marginalized but to sow chaos and dismantle established order. By toppling those in power, Lôki seeks to create a world where unpredictability reigns supreme.

+

Followers of Lôki are drawn to his cunning and resourcefulness, seeing in him a kindred spirit who understands the art of survival in a harsh and unforgiving world. They often lead lives on the edge of societal norms, using their skills in deception and thievery to navigate a system that has cast them aside. Assassins look to him for guidance in their deadly craft, while thieves invoke his name for success in their heists. To the downtrodden, Lôki represents a beacon of subversive strength, showing that even the weakest can wield power through wit and guile.

+

Temples dedicated to Lôki are rare and typically hidden from plain sight, often disguised as common establishments or concealed in the darkest corners of cities. These sanctuaries are places where his followers gather to share knowledge, plan their exploits, and pay homage to the god who empowers their rebellion against societal norms. Rituals in his name often involve acts of trickery and subversion, as well as offerings of stolen goods or other symbols of their defiance.

+

Lôki is depicted as a charismatic and enigmatic figure, his expression always carrying a hint of a knowing smile. He often wears attire that denotes both elegance and subtlety, adorned with symbols of his many disguises and his affinity for chaos. His eyes, sharp and alert, gleam with mischief and intelligence, capable of seeing through any façade or deceit. In his hands, Lôki might hold a dagger or a coin, icons of his domains of assassination and thievery, or a mask, symbolizing his mastery over deception and disguise.

+

The myths surrounding Lôki often highlight his cunning escapades and the intricate webs of intrigue he spins. Though his actions can cause tremendous disruption, they also serve as cautionary tales about the dangers of complacency and the false security of power. His followers are encouraged to be ever watchful, adaptable, and ready to seize opportunities in the chaos he creates.

+

Lôki's influence brings a volatile and transformative energy to the world. To the powerful, he is a force of fear and uncertainty; to the disenfranchised, a symbol of possible upheaval. His essence challenges the status quo, reminding all that underneath the veneer of order lies the potential for upheaval—and that in chaos, there is power.

+

Religion of Lôki: The Serpent's Path

+

Sacred Objects:

+
    +
  • Serpent Skin: Represents cunning and transformation.
  • +
  • Shifting Sand: Symbolizes change and the instability of illusions.
  • +
  • Broken Chain Link: Signifies breaking free from constraints through cleverness.
  • +
  • Shadowed Glass: Used in rituals of deception and hidden truths.
  • +
+

Relics

+
    +
  • The Mask of Deception: (Unique) A sacred artifact that allows its wearer to assume any identity.
  • +
  • Dagger of Shadows: A ceremonial blade used in clandestine rites, believed to be able to pierce through lies and illusions.
  • +
+

Clergy Hierarchical Levels:

+
    +
  • Skuggi Thræll (Circle I: "Shadow Thrall") - Shade Acolyte
  • +
  • Svik Goði/Goðe (Circle III: "Deception Priest/Priestess") - Priest/Priestess of the Veil
  • +
  • Ormr Hersir (Circle IV: "Serpent Warlord") - Whispering Serpent
  • +
  • Skuggi Jarl (Circle V: "Shadow Jarl") - Shadowbinder
  • +
  • Ráð Konungr/Konungrkvinde (Circle VI: "Ruse King/Queen") - Veilmaster
  • +
  • Skáld Allsherjargoði (Circle VII: "Trickster High Priest") - Serpent of the Shadows
  • +
  • Ormr Faðir/Móðir (Circle VIII: "Father/Mother of Serpents") - Pontiff of the Shifting Veil
  • +
+

Key Skills:

+
    +
  • Disguise and infiltration
  • +
  • Espionage and subterfuge
  • +
  • Manipulation and persuasion
  • +
  • Alchemy and Herbalism (Poisons)
  • +
  • Intrigue
  • +
  • Stealth
  • +
+

Divine Servants:

+
    +
  • Shadow Serpents: Ethereal snakes that serve as messengers and agents of Lôki, often appearing in times of deception or mischief.
  • +
  • Whispering Winds: Spirits that carry secrets and lies, aiding Lôki’s followers in their schemes.
  • +
+

Low Ceremonies for Laity:

+
    +
  • The Masked Vigil: A monthly ritual where followers don masks and share secrets, invoking Lôki’s blessings for their cunning and craft.
  • +
+

High Ceremonies for Clergy:

+
    +
  • The Rite of Shadows: A secretive ritual where the clergy gather to deepen their connection with Lôki, often resulting in new insights and abilities in the art of deception.
  • +
+

Festivals:

+
    +
  • Festival of Masks: Held in the autumn, this festival celebrates Lôki’s mastery of disguise and deception with elaborate masquerades and games of wit.
  • +
  • The Night of Whispers: An annual event where the faithful engage in a night of intrigue and subterfuge, with prizes awarded to the most cunning participants.
  • +
+

Ordeals for Favor:

+
    +
  • The Shadow Walk: A task where participants must infiltrate a heavily guarded location and retrieve a valuable item, relying solely on their skills in stealth and deception.
  • +
  • The Trial of Lies: A challenge where the faithful must weave a web of lies so intricate that it ensnares a powerful figure, securing a significant advantage or treasure.
  • +
  • The Serpent’s Maze: An ordeal where the participant must navigate a deadly labyrinth filled with traps, illusions, and false leads, emerging with a key to their next goal.
  • +
  • The Whispering Hunt: A task where participants must gather valuable secrets from influential figures, using them to manipulate events in Lôki’s favor.
  • +
+

Clerical Orders:

+
    +
  • Order of the Shifting Veil: Priests dedicated to mastering the arts of illusion and disguise, often serving as spies and infiltrators.
  • +
+

Fighting Orders:

+
    +
  • Serpentfangs: Fighters who combine physical prowess with the art of poison, using their knowledge of toxins to weaken and kill their foes.
  • +
  • Knights of the Shifting Shadow: A militant order dedicated to protecting Lôki’s temples and followers, using stealth and strategy to defeat their enemies.
  • +
+- name: Óðinn + abbrev: odin + id: FABhdXdYQUSTY5bb + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/odin.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - zer + effects: [] + description: |- +

Óðinn is revered as the god of knowledge, wisdom, and the relentless pursuit of understanding. His insatiable quest for knowledge is legendary, marked by his sacrifice of an eye at the well of Mimir in exchange for a drink of its wisdom-bestowing waters. This act symbolizes his profound commitment to enlightenment. Óðinn's wisdom is not just scholarly but also deeply connected to the mystical and the arcane, encompassing the runes, the secrets of the cosmos, and the mysteries of life and death.

+

Óðinn is often depicted as an imposing figure, with a long, flowing beard and a wide-brimmed hat that casts a shadow over his single, all-seeing eye. He is accompanied by his two ravens, Huginn (thought) and Muninn (memory), who fly across the world each day, gathering knowledge and news to bring back to their master. These ravens represent Óðinn’s ever-present awareness and his connection to both the conscious mind and the deeper, more hidden aspects of memory and thought.

+

Followers of Óðinn are seekers of truth, valuing wisdom and knowledge above all else. They strive to emulate his dedication to learning, whether through the study of runes, the pursuit of scholarly knowledge, or the exploration of the metaphysical. Temples dedicated to Óðinn are often austere yet filled with symbols of learning—books, scrolls, runes, and artifacts from far-off lands. These places of worship are sanctuaries for those who seek to expand their understanding, whether they be scholars, warriors, or leaders, all united in their quest for truth under Óðinn’s watchful eye.

+

Óðinn’s influence extends far beyond mere intellectual pursuits; he is also a god of poetry, war, and honorable death, guiding souls to Valhalla and inspiring warriors with the courage to fight and the wisdom to know when to wield their power. His complex nature makes him a god of paradoxes—both creator and destroyer, wise and warlike, loving and fearsome. His followers are encouraged to embrace this complexity, finding strength in the balance of opposites.

+

In artistic depictions, Óðinn is often shown holding a spear, Gungnir, which never misses its mark, symbolizing his precision and authority. He may also be depicted with the severed head of Mimir, from whom he continues to seek counsel, reinforcing his role as the ultimate seeker of knowledge. Rituals in Óðinn’s name often involve the recitation of runes and chants, seeking his blessings for wisdom, courage, and guidance in times of need.

+

Religion of Óðinn: The Enlightened Path

+

Sacred Objects:

+
    +
  • Raven Feather: Represents thought and memory, symbolizing Huginn and Muninn.
  • +
  • Runestone: Symbolizes the power of knowledge and ancient wisdom.
  • +
  • Well Water: Taken from sacred wells, it represents the quest for understanding.
  • +
  • Worn Scroll: A symbol of learning and the preservation of knowledge.
  • +
+

Relics:

+
    +
  • Gungnir's Echo - A fragment of Óðinn's legendary spear, Gungnir, and is believed to grant its bearer unparalleled precision and authority in both combat and leadership.
  • +
  • Wisdom's Eye - A small, blessed polished stone, often carried by Óðinn's followers, said to offer the holder enhanced intuition and the ability to see through deception.
  • +
  • Raven's Feather Quill - A writing instrument made from a feather said to have fallen from Huginn or Muninn. Prized by scribes and seers, this quill is believed to channel Óðinn’s wisdom directly into the written word. Writings made with these quills are said to contain profound insights and they are often used in the recording of important sagas, prophecies, and treaties.
  • +
+

Clergy Hierarchical Levels:

+
    +
  • Hrafn Thræll (Circle I: "Raven Thrall") - Raven Acolyte
  • +
  • Rún Goði/Goðe (Circle III: "Rune Priest/Priestess") - Rune Priest/Priestess
  • +
  • Vitki Hersir (Circle IV: "Sage Warlord") - Wisdom Herald
  • +
  • Rún Jarl (Circle V: "Rune Jarl") - Guardian of the Runes
  • +
  • Rún Konungr/Konungrkvinde (Circle VI: "Rune King/Queen") - Runebringer
  • +
  • Vitki Allsherjargoði (Circle VII: "Sage High Priest") - Elder Seer
  • +
  • Óðinn Faðir/Móðir (Circle VIII: "Father/Mother of Óðinn") - Pontiff of the Enlightened
  • +
+

Key Skills:

+
    +
  • Rune casting and divination
  • +
  • Shamanic journeying
  • +
  • Poetic inspiration and storytelling
  • +
  • Battle wisdom and strategic insight
  • +
  • Intrigue and Politics
  • +
  • Arcane arts
  • +
+

Divine Servants:

+
    +
  • Valkyries: Choosers of the slain, they select fallen warriors to bring to Valhalla.
  • +
  • Einherjar: The honored dead who reside in Valhalla, training for the final battle of Ragnarok.
  • +
  • Huginn: One of Óðinn's ravens, representing thought, who flies across the world gathering knowledge and wisdom.
  • +
  • Muninn: The other of Óðinn's ravens, symbolizing memory, who travels far and wide to bring back insights from all corners of the world.
  • +
+

Low Ceremonies:

+
    +
  • Rune Casting: A public ritual where runes are cast to provide guidance for the community.
  • +
  • The All-Father's Blessing: A ceremony where the faithful receive a blessing for wisdom and protection in their endeavors.
  • +
+

High Ceremonies:

+
    +
  • The Rite of Mimir's Well: A sacred ritual where the clergy ritualistically drink from blessed chalice said to represent a Mimir's Well to deepen their connection to Óðinn’s wisdom.
  • +
+

Festivals:

+
    +
  • The Feast of Valhalla: An annual celebration in honor of fallen warriors, filled with feasting, storytelling, and the retelling of heroic sagas.
  • +
+

Ordeals for Favor:

+
    +
  • The Trial of the Runes: An ordeal where the faithful must accurately interpret a complex rune casting in a time of crisis.
  • +
  • The Vision Quest: A solitary journey into the wilderness to seek visions from Óðinn, often involving fasting and meditation.
  • +
  • The Saga's Challenge: An ordeal where participants must compose and recite a saga that honors Óðinn, testing their poetic skill.
  • +
  • The Warrior's Vigil: A night-long vigil where the faithful must stay awake, guarding a sacred site or artifact.
  • +
  • The Raven's Oath: A binding oath made under the watch of ravens, pledging commitment to a task or goal that must then be achieved.
  • +
+

Clerical Orders:

+
    +
  • Order of the Raven: Priests dedicated to the study of runes and divination, serving as advisors and seers.
  • +
  • Skalds of Valhalla: Poets and storytellers who preserve the sagas and tales of heroes, spreading Óðinn's wisdom through song and verse.
  • +
  • Order of the All-Seeing Eye: Dedicated to the pursuit and preservation of knowledge, wisdom, and learning. Members of this order are known as Seiðrwisemen or Seiðrwisewomen, and they are considered the most learned and scholarly among Óðinn’s followers. Their temples contain vast libraries and archives.
  • +
+- name: Súrtr + abbrev: surtr + id: s8YWtwTHwQcGkWrI + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/surtr.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - agr + effects: [] + description: |- +

Súrtr, the fire giant and god of savage battle, embodies the raw, destructive force of fire and the unrelenting fury of war. He is a fearsome figure, towering over his enemies, his body wreathed in flames that consume all they touch. Súrtr’s presence is a harbinger of destruction, symbolizing the inevitable end of worlds, as foretold in the prophecies of Ragnarok, where he will lead the fire giants in the final battle, bringing an end to the cosmos as it is known.

+

Súrtr is depicted as a massive, menacing figure, his skin blackened by the eternal flames that engulf him. He wields a colossal sword, often described as being made of fire, capable of incinerating anything in its path. This sword, said to be the weapon that will set the world ablaze during Ragnarok, is a symbol of Súrtr’s unparalleled power and his role as the destroyer of worlds.

+

In the cosmic struggle, Súrtr is the embodiment of chaos and destruction, standing in direct opposition to Týr, who represents order and justice. This conflict between Súrtr and Týr is not just a battle of physical might, but a deeper, existential struggle over the fate of the cosmos itself. Týr’s commitment to justice and order directly challenges Súrtr’s belief in the cleansing power of fire and chaos. The rivalry between these two gods is legendary, with each battle between them symbolizing the ongoing struggle between chaos and order.

+

Followers of Súrtr are warriors who embrace the chaos and brutality of battle. They see war as a purifying force, one that burns away the weak and the unworthy, leaving only the strong to claim victory. These devotees are feared on the battlefield, known for their ferocity and their willingness to fight to the death, believing that through fire and destruction, they will achieve ultimate power and transformation. For them, Súrtr represents not just an end, but a necessary force of change and renewal.

+

Worship of Súrtr is intense and often involves acts of ritualistic violence or symbolic destruction. His altars are typically simple, often made of stone or metal, and are located in places associated with fire—volcanoes, forges, or the aftermath of a great fire. Sacrifices made to Súrtr might include weapons, armor, or effigies burned in his name, all symbolizing the destructive power that he embodies.

+

In artistic depictions, Súrtr is a figure of terrifying grandeur, surrounded by flames and holding his burning sword aloft, ready to unleash the final destruction. His face is often obscured by fire, representing the all-consuming nature of his power. Rituals dedicated to Súrtr might involve the lighting of great bonfires, symbolizing the destructive but also transformative power of fire, and battles demonstrating strength, cruelty, and prowess in battle..

+

Religion of Súrtr: The Flameborn Path

+

Sacred Objects:

+
    +
  • Ember: Represents the destructive power of fire.
  • +
  • Charred Bone: Symbolizes the remnants of battle and destruction.
  • +
  • Volcanic Rock: Represents the primal force of fire and earth.
  • +
  • Ash: A symbol of what remains after the flames have consumed.
  • +
+

Relics

+
    +
  • Heart of Ragnarok: (Unique) A molten core said to be a part of Súrtr’s firey essence, this divine relic is encased in a blackened iron vessel, radiating intense heat and energy. It is believed that it will be used during Ragnarok by Súrtr to ignite the flames that will consume the world. It is said that any who dare to touch it directly will be consumed by its flames, leaving nothing but ash.
  • +
  • Ashen Gauntlets: The Ashen Gauntlets are a pair of gloves forged from volcanic ash and imbued with Súrtr’s fiery essence. They grant the wearer enhanced strength and the ability to withstand extreme heat. Worn by Súrtr’s warriors, these gauntlets are a symbol of their devotion to the fire god and are used in combat to deliver crushing blows that can shatter stone and bone alike.
  • +
  • Emberstone Amulet: The Emberstone Amulet is a small, fiery gem set in a simple iron pendant. It is said to hold a fragment of Súrtr’s eternal flame. When worn by those with true faith, the Emberstone is said to provide its bearer with protection from fire and the ability to ignite flames at will. The amulet is often used in rituals. Though common among Súrtr’s followers, each Emberstone is considered a personal connection to the fire giant, symbolizing their commitment to his fiery path.
  • +
+

Clergy Hierarchical Levels:

+
    +
  • Eldr Thræll (Circle I: "Fire Thrall") - Flame Acolyte
  • +
  • Eldr Goði/Goðe (Circle III: "Fire Priest/Priestess") - Flame Priest/Priestess
  • +
  • Elding Hersir (Circle IV: "Lightning Warlord") - Inferno Herald
  • +
  • Bál Jarl (Circle V: "Pyre Jarl") - Warden of Flames
  • +
  • Eldjötunn Konungr/Konungrkvinde (Circle VI: "Fire Giant King/Queen") - Flamebringer
  • +
  • Aska Allsherjargoði (Circle VII: "Ash High Priest") - Ashen Lord
  • +
  • Eldr Faðir/Móðir (Circle VIII: "Father/Mother of Fire") - Pontiff of the Eternal Flame
  • +
+

Key Skills:

+
    +
  • Fire manipulation and pyromancy
  • +
  • Battle tactics and warfare
  • +
  • Destruction and rebirth rituals
  • +
  • Forge and metalworking
  • +
+

Divine Servants:

+
    +
  • Fire Giants: Massive beings of flame and stone who serve Súrtr as warriors and guardians.
  • +
  • Infernal Hounds: Fierce, flame-breathing beasts that hunt down the enemies of Súrtr.
  • +
+

Low Ceremonies:

+
    +
  • The Ash Offering: A ritual where the faithful offer burnt sacrifices to Súrtr, asking for strength and conquest of enemies.
  • +
+

High Ceremonies for Clergy:

+
    +
  • The Ashen Walk: A ceremony where high priests walk across hot coals or through flames, demonstrating their devotion and immunity to fire.
  • +
+

Festivals:

+
    +
  • The Pyre’s Awakening: An annual celebration of fire and destruction, where great bonfires are lit, and the faithful gather for spectacles of gladatorial battles and ritual combat, sometimes involving wild beasts or captured slaves. Enemies are often burned alive at these festivals.
  • +
  • The Forge’s Fury: A festival dedicated to the creation of weapons and armor, with competitions to see who can forge the finest items under Súrtr’s guidance.
  • +
+

Ordeals for Favor:

+
    +
  • The Firewalk: An ordeal where participants must walk barefoot across a bed of hot coals, proving their devotion to Súrtr.
  • +
  • The Flame’s Trial: An ordeal where the faithful must survive in a volcanic region, relying on Súrtr’s protection to endure the heat and danger.
  • +
+

Clerical Orders:

+
    +
  • Order of the Inferno: Priests dedicated to mastering the power of fire, often serving as blacksmiths and forge masters.
  • +
+

Fighting Orders:

+
    +
  • Infernal Blades: Elite warriors known for their ferocity in battle.
  • +
  • Flameguard: A militant order dedicated to protecting Súrtr’s temples and followers, using fire-based combat techniques.
  • +
+- name: Thórr + abbrev: thor + id: 1SoGIhMK6WH3DHAg + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/thor.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - kaj + effects: [] + description: |- +

Thórr, the thunderous god of war, reavers, and the sea, stands as a formidable protector and champion of both gods and humans. Known for his immense strength and unyielding courage, Thórr is the embodiment of the warrior spirit, a force of nature who defends the realms from the chaos of giants and other threats. His domain extends over the seas, making him a patron of sailors and reavers, who invoke his name for safe passage and victory in their raids.

+

Thórr is most famously depicted wielding his mighty hammer, Mjolnir, a weapon of immense power that can crush mountains and summon thunder and lightning. Mjolnir is not only a symbol of Thórr’s might in battle but also a tool of protection, used to bless and sanctify, ensuring safety and prosperity for those under his care. Thórr’s physical appearance is that of a giant among men, muscular and bearded, with a fierce yet protective demeanor that inspires both fear and reverence.

+

Followers of Thórr include warriors, seafarers, and those who live by the strength of their arms. His worshippers seek his favor for success in battle and protection during their perilous journeys across the seas. Temples dedicated to Thórr are often located near the coast, where the sound of the crashing waves serves as a constant reminder of his power. These temples are filled with symbols of war and the sea—shields, swords, anchors, and depictions of fierce sea storms—reflecting Thórr’s dual role as a god of both land and sea.

+

Thórr’s influence is deeply rooted in the daily lives of his followers. In battle, they call upon him for the strength to overcome their enemies, believing that his power flows through them in moments of greatest need. At sea, they offer prayers and sacrifices to ensure Thórr’s protection against the dangers of the deep, trusting in his ability to calm the waters or unleash their fury as he sees fit.

+

In artistic representations, Thórr is often shown driving his chariot pulled by two goats, Tanngrisnir and Tanngnjóstr, across the sky, creating thunder with each strike of Mjolnir. His image is a common motif in amulets and charms, worn by warriors and sailors alike as a talisman of protection and power. Rituals in Thórr’s name might involve the reenactment of heroic battles or the blessing of ships and weapons, invoking his strength and ensuring his presence in the lives of his followers.

+

Religion of Thórr: The Stormborn Path

+

Sacred Objects:

+
    +
  • Hammer Stone: Represents strength and protection, symbolizing Mjolnir.
  • +
  • Iron Nail: Symbolizes the hardiness and resilience of warriors.
  • +
  • Sea Shell: Represents the god’s dominion over the seas.
  • +
  • Stormwater: Collected during a thunderstorm, it symbolizes Thórr’s power over storms.
  • +
+

Relics:

+
    +
  • Mjolnir's Fragment - Mjolnir's Fragment is a shard from Thórr’s legendary hammer, Mjolnir. This divine relic is imbued with the thunder god’s power, crackling with energy and surrounded by a faint aura of lightning. It is said that those who carry Mjolnir’s Fragment into battle are granted unparalleled might, the power to summon storms, and the protection of Thórr himself.
  • +
  • Stormcaller's Amulet - The Stormcaller's Amulet is a pendant crafted from a polished piece of sky iron. It is worn by Thórr’s priests and warriors, said to bolster their strength in battle. The amulet is often used in rituals to invoke Thórr’s blessings before a journey or a fight. While a common relic, each Stormcaller's Amulet is treated with reverence, symbolizing the wearer’s connection to the thunder god.
  • +
  • Thunderstruck Ring - The Thunderstruck Ring is a simple iron band said to be infused with the essence of lightning. It is said that these rings are forged during a thunderstorm, capturing a bolt of lightning within the metal. When worn by the true faithful, the Thunderstruck Ring can be called upon to provide the wearer with increased speed and reflexes, allowing them to move with the swiftness of a lightning strike. The ring is also believed to offer protection against electric or storm-related dangers. The Thunderstruck Ring is a cherished talisman, often passed down through generations as a symbol of the thunder god’s enduring power.
  • +
+

Clergy Hierarchical Levels:

+
    +
  • Thrumu Thræll (Circle I: "Thunder Thrall") - Storm Acolyte
  • +
  • Reið Goði/Goðe (Circle III: "Storm Priest/Priestess") - Storm Priest/Priestess
  • +
  • Thrumu Hersir (Circle IV: "Thunder Warlord") - Thunder Herald
  • +
  • Sjór Jarl (Circle V: "Sea Jarl") - Warden of the Sea
  • +
  • Haf Konungr/Konungrkvinde (Circle VI: "Ocean King/Queen") - Stormbringer
  • +
  • Thór Allsherjargoði (Circle VII: "Thor High Priest") - Thundering Lord
  • +
  • Thrumu Faðir/Móðir (Circle VIII: "Father/Mother of Thunder") - Pontiff of the Thunderer
  • +
+

Key Skills:

+
    +
  • Weather manipulation and storm calling
  • +
  • Combat training and weapon mastery
  • +
  • Seafaring and navigation
  • +
  • Protection and blessing rituals
  • +
+

Divine Servants:

+
    +
  • Storm Giants: Massive beings who control storms and wield immense power over the seas.
  • +
  • Thunderbears: Thunderbears are massive, imposing bears with fur that shimmers like storm clouds and eyes that glow with the light of distant lightning. These mighty creatures are embodiments of Thórr’s strength and fury. Their roars are said to echo like thunder, and their footsteps can cause the ground to tremble. Thunderbears serve as Thórr’s guardians and enforcers, patrolling his sacred sites and accompanying him into battle. In combat, they unleash devastating physical power, charging through enemy ranks with the force of a storm. Thunderbears are symbols of unyielding strength and protection, feared by enemies and revered by Thórr’s followers.
  • +
+

Low Ceremonies:

+
    +
  • The Hammer’s Blessing: A ritual where the faithful receive a blessing for strength and protection in their daily lives.
  • +
+

High Ceremonies for Clergy:

+
    +
  • The Hammer’s Vigil: A ceremony where high priests stand guard over sacred relics, calling upon Thórr’s protection through the night.
  • +
+

Festivals:

+
    +
  • The Ocean’s Roar: A festival dedicated to seafaring and exploration, with races, competitions, and rituals to honor Thórr’s dominion over the seas.
  • +
+

Ordeals for Favor:

+
    +
  • The Hammer’s Trial: A test where the faithful must lift and carry a heavy hammer over a great distance, dedicating their strength to Thórr.
  • +
  • The Ocean’s Challenge: An ordeal where participants must navigate treacherous waters, trusting in Thórr to guide them safely.
  • +
  • The Iron Vigil: An ordeal where participants must remain vigilant through a stormy night, protecting a sacred site from any threat.
  • +
+

Clerical Orders:

+
    +
  • Order of the Hammer: Priests dedicated to the mastery of combat and protection, often serving as warriors and guardians.
  • +
  • Sea Wardens: Priests who specialize in seafaring and navigation, often blessing ships and guiding sailors.
  • +
+

Fighting Orders:

+
    +
  • Hammer of Thórr: Elite warriors who wield mighty hammers in battle, channeling Thórr’s strength and protection.
  • +
  • Seaforged: Fighters who have undergone rigorous training at sea, becoming masters of naval combat and defense.
  • +
+- name: Týr + abbrev: tyr + id: MBgRRo1SXi7hYcb0 + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/tyr.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - ara + effects: [] + description: |- +

Týr, the god of justice and honorable combat, embodies the ideals of fairness, valor, and sacrifice. As a deity who values truth and righteousness above all, Týr is revered as the ultimate judge, whose decisions are guided by an unwavering commitment to the greater good. His most famous act of sacrifice—losing his hand to the great wolf Fenrir—exemplifies his dedication to justice and the protection of the world, even at great personal cost.

+

Týr is depicted as a noble and stoic figure, often shown with his one remaining hand holding a sword or scales, symbolizing his role as both a warrior and a judge. His presence commands respect, as he represents the moral compass by which warriors and leaders are guided. Týr’s followers are those who seek to live by a strict code of honor, upholding the principles of fairness, truth, and duty in all aspects of their lives.

+

In the cosmic struggle between order and chaos, Týr is a stalwart defender of justice, standing in direct opposition to Súrtr, whose embodiment of destruction and chaos is the antithesis of all Týr stands for. The conflict between Týr and Súrtr is a key element in the balance of the cosmos, with Týr’s commitment to justice constantly challenged by Súrtr’s relentless drive toward annihilation. Their battles are seen as symbolic of the eternal struggle between order and chaos, with each victory or defeat tipping the scales of the universe.

+

Týr’s bond with Fréyr is one of deep mutual respect and shared purpose. While Fréyr nurtures the earth and fosters peace, Týr ensures that justice prevails, creating a harmonious balance between growth and order. Their friendship is a cornerstone of the cosmic order, with each god supporting the other in their respective domains. Together, they work to maintain the stability of the world, protecting it from the forces of chaos that threaten to undo all that they have built.

+

Temples dedicated to Týr serve as places of law and order, where disputes are settled and oaths are sworn. These sacred spaces are often simple yet dignified, reflecting the seriousness of the god’s domain. Within these walls, warriors are trained not just in the art of combat, but in the ethical principles that should guide their actions. To worship Týr is to commit oneself to the pursuit of justice, whether in the battlefield, in governance, or in personal conduct.

+

Týr’s influence is seen in the way his followers conduct themselves, especially in matters of conflict. They are expected to fight with honor, never resorting to deceit or unnecessary cruelty. For them, combat is not just a means to an end, but a reflection of their inner values and a way to demonstrate their loyalty to Týr’s ideals. In times of peace, they serve as mediators and judges, using their wisdom and fairness to resolve disputes and maintain harmony.

+

In artistic depictions, Týr is often shown standing tall and resolute, his one hand holding a sword that represents his unyielding commitment to justice. The image of the wolf Fenrir is sometimes included, reminding viewers of the great sacrifice Týr made to protect the world from chaos. Rituals in Týr’s honor often involve oaths of loyalty and justice

+

Religion of Týr: The Just Path

+

Sacred Objects:

+
    +
  • Iron Scale: Represents balance and fairness in judgment.
  • +
  • Broken Sword: Symbolizes sacrifice for the greater good.
  • +
  • Shield Fragment: Represents protection and the defense of justice.
  • +
  • Oath Ring: Used in rituals of binding oaths and maintaining honor.
  • +
+

Relics:

+
    +
  • The Hand of Justice - (Unique) The Hand of Justice is a finely crafted gauntlet made of silver and iron, forged to replace Týr’s lost hand. This divine relic is imbued with Týr’s unwavering commitment to justice and sacrifice. When worn, it grants the bearer the power to discern truth from lies, making them an unparalleled judge in disputes and a fearsome adversary in battle.
  • +
  • Oathkeeper's Sword - Oathkeeper’s Sword is a ceremonial blade carried by those who swear oaths in Týr’s name. The sword is inscribed with runes of truth and justice, and it is said that any oath sworn upon this blade is unbreakable, bound by Týr’s divine authority. Oathkeeper’s Swords are found in larger or more important temples of Týr, where they are used during rituals of oath-taking and binding agreements. While they may not possess the raw power of divine weapons, these swords are revered for their symbolic importance and the weight they carry in matters of honor.
  • +
  • Shield of Honor - The Shield of Honor is a sturdy shield emblazoned with the scales of justice, a symbol of Týr’s role as the protector of fairness and righteousness. This relic is carried by warriors and judges who dedicate themselves to upholding the principles of justice. The Shield of Honor is believed to provide its bearer with enhanced protection against treachery and deceit, helping them to stand firm in the face of injustice.
  • +
+

Clergy Hierarchical Levels:

+
    +
  • Dómr Thræll ("Judgment Thrall") - Justice Acolyte
  • +
  • Rétt Goði/Goðe ("Justice Priest/Priestess") - Justice Priest/Priestess
  • +
  • Dýrr Hersir ("Valiant Warlord") - Valor Herald
  • +
  • Lög Jarl ("Law Jarl") - Warden of Law
  • +
  • Dómskonungr/Konungrkvinde ("Law King/Queen") - Lawbringer
  • +
  • Týr Allsherjargoði ("Týr High Priest") - Honorable Lord
  • +
  • Sverð Faðir/Móðir ("Father/Mother of the Sword") - Pontiff of the Sword
  • +
+

Key Skills:

+
    +
  • Legal knowledge and judgment
  • +
  • Combat and strategy
  • +
  • Oathbinding and mediation
  • +
  • Sacrifice and self-discipline
  • +
+

Divine Servants:

+
    +
  • Honorguard: Divine warriors who protect the sanctity of law and order.
  • +
  • Fenrir’s Bane: Spirits that uphold justice, often appearing in times of conflict to ensure fairness.
  • +
+

Low Ceremonies:

+
    +
  • The Shield’s Blessing: A ceremony where the faithful receive blessings for protection and courage in upholding justice.
  • +
+

High Ceremonies for Clergy:

+
    +
  • The Trial of Valor: A ceremony where high priests undergo trials of combat and judgment, proving their worthiness to lead.
  • +
+

Festivals:

+
    +
  • The Day of Honor: An annual celebration of Týr’s justice, filled with tournaments, oaths, and ceremonies honoring the god’s sacrifice.
  • +
+

Ordeals for Favor:

+
    +
  • The Sword’s Trial: An ordeal where participants must defend a sacred site or person from harm, proving their valor and dedication.
  • +
  • The Oathkeeper’s Challenge: A test where the faithful must uphold a difficult oath, showing their commitment to justice and honor.
  • +
  • The Sacrifice of the Hand: An ordeal where participants must symbolically sacrifice a part of themselves, showing their willingness to give all for justice.
  • +
+

Clerical Orders:

+
    +
  • Order of the Sword: Priests dedicated to the mastery of combat and the upholding of justice, often serving as judges and defenders.
  • +
  • Oathsworn: Priests who oversee the swearing of oaths and the maintenance of honor, often acting as mediators in disputes.
  • +
+

Fighting Orders:

+
    +
  • Sword of Týr: Elite warriors who wield swords in the name of justice, defending the faith and its followers.
  • +
  • Oathkeepers: Warriors who have sworn powerful oaths to Týr, dedicating their lives to the protection and defense of the faith.
  • +
+- name: Ymir + abbrev: ymir + id: GOPlvabFfbtb4ZJn + folderId: JPJijWGcJUmeLfSu + img: systems/sohl/assets/icons/ymir.svg + categories: + - divine + philosophy: Asgardian + macros: [] + flags: + sohl: + legendary: + aspects: + - zem + effects: [] + description: |- +

Ymir, the god of creation, is a master craftsman and the divine architect of life. Ymir focuses his boundless creative energy on crafting new, unique forms of life, which he refers to as his "children." This god of innovation and experimentation resides in the physical world, where he has established vast laboratories and sprawling factories dedicated to his ceaseless work.

+

Ymir's passion lies in recycling the souls of his previous creations, giving them new, often experimental bodies. He is a relentless tinkerer, always seeking the perfect form and combining attributes in novel ways. However, many of his creations do not meet his high expectations and are discarded as failures. His dissatisfaction drives him to incessant experimentation, as he searches for elusive perfection. Despite the multitude of failures, some of his creations stand out, and he takes great pride in these exceptional beings.

+

The collective term for Ymir's creations is "Dreadspawn." These beings are diverse and often bizarre, reflecting the god's unrestrained creativity. One consistent trait among the Dreadspawn is their incapacity for reproduction; every new Dreadspawn must be hand-crafted by Ymir himself. This reliance on their creator ensures that each Dreadspawn is a unique product of Ymir's vision and ingenuity.

+

Ymir's presence in the material world is a rarity among the gods, and he is largely indifferent to the mortal realm’s affairs. His laboratories and factories are marvels of divine craftsmanship, filled with alchemical apparatus, strange machinery, and fragments of discarded experiments. These places of creation throng with unfinished beings and the echoes of his relentless workshops, embodying both his genius and his often monstrous endeavors.

+

Though Ymir possesses worshipers and a clergy dedicated to him, his lack of concern for them results in their disorganization and weakness. His followers, fascinated by the shadows of his creative genius, are often left to fend for themselves. They gather in loose, scattered factions, united more by their admiration of Ymir’s work than by any formal structure or doctrine. Lacking direction from their god, these devotees struggle to find cohesion, their endeavors pale imitations of the master's grand designs.

+

Depictions of Ymir are as varied as his creations. He is often shown as an imposing figure, clad in the garments of a craftsman—tools and instruments of creation always close at hand. His eyes, filled with a blend of frustration and infinite possibility, are said to pierce through the very essence of life, seeking out the potential for transformation. His hands, large and dexterous, grasp at the raw materials of existence, shaping them into new forms through force of will alone.

+

In myths, Ymir's ceaseless drive to create often paints him as a tragic figure, forever chasing a vision of perfection that remains just out of reach. His Dreadspawn, despite their inability to procreate, stand as monuments to his relentless pursuit of innovation. The stories tell of his occasional triumphs, rare beings of extraordinary capability that fill Ymir with fleeting pride before he returns to his endless cycle of creation.

+

Ymir's ethos challenges the notions of life and form, constantly pushing the boundaries of what is possible. His laboratories and factories serve as living testaments to the raw, untamed force of divine creativity, filled with the creations and remnants of his divine craftsmanship. Through Ymir, the fabric of existence is perpetually transformed, reflecting the endless dance of creation and destruction that defines his extraordinary world.

+

Religion of Ymir: The Divine Architect's Path

+

Sacred Objects:

+
    +
  • Fragment of the Forge: (Unique) A piece of Ymir's first laboratory, representing the origin of his endless creative journey.
  • +
  • Crystal Vial of Souls: (Unique) A relic said to contain the essence of souls recycled by Ymir for his experiments, symbolizing the cycle of life and creation.
  • +
  • Incomplete Form: (Unique) A preserved Dreadspawn that was abandoned during creation, revered as a symbol of Ymir's relentless drive and the imperfection inherent in existence.
  • +
+

Clergy and Structure: Ymir's religion lacks formal hierarchy or structured organization. Instead, it consists of various scattered factions, each focused on different aspects of Ymir's work. These groups often operate independently, united only by their admiration of Ymir’s creative genius. There are no official titles or ranks, but some individuals may gain influence due to their skill in creation or their perceived connection to Ymir’s Dreadspawn.

+

Key Roles (Informal and Fluid):

+
    +
  • Soul Weavers: Individuals who attempt to understand and guide the process of soul recycling, believing they can aid Ymir in refining his creations.
  • +
  • Dreadspawn Keepers: Followers who dedicate their lives to studying, protecting, or controlling the Dreadspawn, sometimes forming a perilous bond with these beings.
  • +
  • Echoes of the Creator: Worshippers who identify with Ymir's drive for perfection and seek to embody his relentless pursuit in their own lives, often becoming creators or innovators in their own right.
  • +
+

Key Skills:

+
    +
  • Understanding the nature of life and the process of creation
  • +
  • Experimenting with the fusion of different forms and essences
  • +
  • Controlling or communing with Dreadspawn and other creations
  • +
  • Surviving and thriving in chaotic, experimental environments
  • +
+

Divine Servants:

+
    +
  • Dreadspawn: Ymir's unique creations, each handcrafted with purpose and potential but often left abandoned due to his dissatisfaction. They are diverse, powerful, and frequently bizarre in form and function.
  • +
+

High Ceremonies (Rare and Disorganized):

+
    +
  • The Call of the Dreadspawn: A chaotic ritual where priests attempt to summon powerful Dreadspawn, often leading to dangerous and unpredictable results.
  • +
+

Ordeals for Favor:

+
    +
  • The Dreadspawn’s Bond: A dangerous task where followers must form a bond with a powerful Dreadspawn, demonstrating their devotion and willingness to share in Ymir’s creative torment.
  • +
  • The Creator’s Vision: A pilgrimage to Ymir’s laboratories, where followers seek to witness or participate in the god’s ongoing experiments, risking both their lives and sanity.
  • +
+- name: Ares + abbrev: ares + id: FghefGKc77EDeHNq + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/aquarius.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: 15 + metal: 5 + fire: -5 + air: -15 + aura: -5 + water: 5 + effects: [] + description: "" +- name: Ares-Taurus + abbrev: arestaurus + id: BOVYlQRWEWB1JaIL + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/aquarius.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: 15 + metal: 10 + fire: 0 + air: -10 + aura: -5 + water: 5 + effects: [] + description: "" +- name: Taurus + abbrev: taurus + id: zhhzyVhiWzKJYE2w + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/taurus.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: 10 + metal: 10 + fire: 0 + air: -10 + aura: -10 + water: 0 + effects: [] + description: "" +- name: Taurus-Gemini + abbrev: taurusgemini + id: 7KCgoSu561EKgbZ0 + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/taurus.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: 10 + metal: 15 + fire: 5 + air: -5 + aura: -10 + water: 0 + effects: [] + description: "" +- name: Gemini + abbrev: gemini + id: JThKSJ1VD9THPSzm + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/gemini.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: 5 + metal: 15 + fire: 5 + air: -5 + aura: -15 + water: -5 + effects: [] + description: "" +- name: Gemini-Cancer + abbrev: geminicancer + id: RMsNXg2bV86ZZlKA + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/gemini.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: 5 + metal: 15 + fire: 10 + air: 0 + aura: -10 + water: -5 + effects: [] + description: "" +- name: Cancer + abbrev: cancer + id: MDrTrl0XEQplyEcc + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/cancer.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: 0 + metal: 10 + fire: 10 + air: 0 + aura: -10 + water: -10 + effects: [] + description: "" +- name: Cancer-Leo + abbrev: cancerleo + id: bWriUJlrEQJwBcIZ + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/cancer.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: 0 + metal: 10 + fire: 15 + air: 5 + aura: -5 + water: -10 + effects: [] + description: "" +- name: Leo + abbrev: leo + id: FySmZPtQqLH3E0al + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/leo.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: -5 + metal: 5 + fire: 15 + air: 5 + aura: -5 + water: -15 + effects: [] + description: "" +- name: Leo-Virgo + abbrev: leovirgo + id: 9utvXSZJ6Kg6NtWs + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/leo.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: -5 + metal: 5 + fire: 15 + air: 10 + aura: 0 + water: -10 + effects: [] + description: "" +- name: Virgo + abbrev: virgo + id: HGsjd1lFfPHaJRAU + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/virgo.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: -10 + metal: 0 + fire: 10 + air: 10 + aura: 0 + water: -10 + effects: [] + description: "" +- name: Virgo-Libra + abbrev: virgolibra + id: So0zFATgQbBhlK3H + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/virgo.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: -10 + metal: 0 + fire: 10 + air: 10 + aura: 0 + water: -5 + effects: [] + description: "" +- name: Libra + abbrev: libra + id: 9xVUZBycW841KnhS + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/libra.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: -15 + metal: -5 + fire: 5 + air: 15 + aura: 5 + water: -5 + effects: [] + description: "" +- name: Libra-Scorpio + abbrev: librascorpio + id: ZPGfCj3r4rAlIoVo + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/libra.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: -10 + metal: -5 + fire: 5 + air: 15 + aura: 10 + water: 0 + effects: [] + description: "" +- name: Scorpio + abbrev: scorpio + id: cBlSRnD07LmOUhbg + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/scorpio.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: -10 + metal: -10 + fire: 0 + air: 10 + aura: 10 + water: 0 + effects: [] + description: "" +- name: Scorpio-Sagittarius + abbrev: scorpiosagittarius + id: iGID1brCe8Z75gib + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/scorpio.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: -5 + metal: -10 + fire: 0 + air: 10 + aura: 15 + water: 5 + effects: [] + description: "" +- name: Sagittarius + abbrev: sagittarius + id: jH1JyFW8HeMFG1gz + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/sagittarius.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: -5 + metal: -15 + fire: -5 + air: 5 + aura: 15 + water: 5 + effects: [] + description: "" +- name: Sagittarius-Capricorn + abbrev: sagittariuscapricorn + id: QzM1FJkmEYlHmkFq + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/sagittarius.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: 0 + metal: -10 + fire: -5 + air: 5 + aura: 15 + water: 10 + effects: [] + description: "" +- name: Capricorn + abbrev: capricorn + id: LvhjPVvzxqmQmYWS + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/capricorn.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: 0 + metal: -10 + fire: -10 + air: 0 + aura: 10 + water: 10 + effects: [] + description: "" +- name: Capricorn-Aquarius + abbrev: capricornaquarius + id: TnxhvsAabwq8XAjr + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/capricorn.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: 5 + metal: -5 + fire: -10 + air: 0 + aura: 10 + water: 15 + effects: [] + description: "" +- name: Aquarius + abbrev: aquarius + id: qyqAKysUAvyryrHX + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/aquarius.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: 5 + metal: -5 + fire: -15 + air: -5 + aura: 5 + water: 15 + effects: [] + description: "" +- name: Aquarius-Pisces + abbrev: aquariuspisces + id: aESBs3s7y3s9lcsW + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/aquarius.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: 10 + metal: 0 + fire: -10 + air: -5 + aura: 5 + water: 15 + effects: [] + description: "" +- name: Pisces + abbrev: pisces + id: GgbQH8wGoqlbSHy4 + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/pisces.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: false + legendary: + ssMod: + earth: 10 + metal: 0 + fire: -10 + air: -10 + aura: 0 + water: 10 + effects: [] + description: "" +- name: Pisces-Ares + abbrev: piscesares + id: mmkdapSLPWRwbrEE + folderId: wI7ZM7GUB6h877lc + img: systems/sohl/assets/icons/pisces.svg + categories: + - astral + philosophy: Zodiac + macros: [] + flags: + sohl: + cusp: true + legendary: + ssMod: + earth: 15 + metal: 5 + fire: -5 + air: -10 + aura: 0 + water: 10 + effects: [] + description: "" +- name: Badger + abbrev: badger + id: jyTP76HQCwtiIPkE + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/badger.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Bear + abbrev: bear + id: m7UpOVIu6im59rmm + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/bear.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Bison + abbrev: bison + id: BhpupAC1tZHLHkZx + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/bison.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Boar + abbrev: boar + id: Lzvt8VPqODVDsdKc + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/boar.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Bobcat + abbrev: bobcat + id: FZhdDuv8joQCvDpJ + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/bobcat.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Bull + abbrev: bull + id: 2JgKk7dtgYw2i8gq + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/bull.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Catfish + abbrev: catfish + id: ffXAYtXscn7UqBIs + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/catfish.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Chicken + abbrev: chicken + id: qxywS0CNoIOAYdcX + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/chicken.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Cow + abbrev: cow + id: HCF1POKu22Kb8q4O + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/cow.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Crow + abbrev: crow + id: gqv7Cco3Axw0FaAt + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/crow.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Deer + abbrev: deer + id: nVfNxY3KWFm3aBop + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/deer.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Donkey + abbrev: donkey + id: wRT7zVOej4liTpeo + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/donkey.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Dove + abbrev: dove + id: NH9G0scRPPZN6sbE + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/dove.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Duck + abbrev: duck + id: 7hzrmmyp8WMAGU2n + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/duck.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Eagle + abbrev: eagle + id: gIr2OENs8Vd6Uu15 + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/eagle.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Falcon + abbrev: falcon + id: Tf8hzxqQgLY6uvTh + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/falcon.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Fox + abbrev: fox + id: xFZ3PR1advleD6vI + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/fox.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Goat + abbrev: goat + id: SW2hulo07cNp6d2x + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/goat.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Goose + abbrev: goose + id: kC3VJJzfsJXgF6YU + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/goose.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Hamster + abbrev: hamster + id: ndbpyYxUuvdWgLyA + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/hamster.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Hawk + abbrev: hawk + id: xcJp19aJbkRyBp4B + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/hawk.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Hedgehog + abbrev: hedgehog + id: xjGzPOUk0smnTorE + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/hedgehog.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Horse + abbrev: horse + id: HaM6Gfjpu0Y7b3iJ + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/horse.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Jaguar + abbrev: jaguar + id: acvDBg5KimgYCj0X + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/jaguar.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Leopard + abbrev: leopard + id: Hxww1H11kYoqlLW1 + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/leopard.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Lion + abbrev: lion + id: ufPsQp09pBdjEPSr + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/lion.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Lynx + abbrev: lynx + id: eailNoxDLI3M0Ik9 + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/lynx.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Otter + abbrev: otter + id: sAuEzNMa09X7p7DU + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/otter.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Owl + abbrev: owl + id: KG2CPILsdQ30eRq4 + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/owl.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Ox + abbrev: ox + id: lWNYikQ4g15K3utR + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/ox.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Parrot + abbrev: parrot + id: 5Eh2QJiP9VZZESl2 + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/parrot.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Pigeon + abbrev: pigeon + id: gOzXGeJlxZ159Qxf + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/pigeon.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Rabbit + abbrev: rabbit + id: bSX6hKk4HVPkvvKC + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/rabbit.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Sea Bass + abbrev: seabass + id: CvyuESboiXlNDu5F + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/seabass.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Shark + abbrev: shark + id: NEm0XhbzLUIg2N8d + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/shark.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Sheep + abbrev: sheep + id: ZOtHhdrLktjfaOWR + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/sheep.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Snake + abbrev: snake + id: TfPBbrx0BSbJMP9I + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/snake.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Stag + abbrev: stag + id: QVpxmfJp1DqdZsvB + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/stag.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Sturgeon + abbrev: sturgeon + id: xk9XRltA2E9wrgo8 + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/sturgeon.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Trout + abbrev: trout + id: 9cwlFadNbLqSJsPe + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/trout.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Tuna + abbrev: tuna + id: WTFv5BPCe75CS4bY + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/tuna.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Turkey + abbrev: turkey + id: cGdn7koekrxZzvTE + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/turkey.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Whale + abbrev: whale + id: 9INGAcnnBkwtFYgn + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/whale.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" +- name: Wolf + abbrev: wolf + id: MJSkzdWXnH1TemiE + folderId: ZJzBrmBAMjcUijuX + img: systems/sohl/assets/icons/wolf.svg + categories: spirit + philosophy: Totem + macros: [] + flags: {} + effects: [] + description: "" diff --git a/packs/generate/legendary/leg-mysteries/data/folders.yaml b/packs/generate/legendary/leg-mysteries/data/folders.yaml new file mode 100644 index 0000000..1e7fe23 --- /dev/null +++ b/packs/generate/legendary/leg-mysteries/data/folders.yaml @@ -0,0 +1,64 @@ +- name: Fate + id: HQdjhe67Av3z8APh + parentFolderId: "" + color: '#e59f25' +- name: Domains + id: R5yDwwVBNF7yE4fc + parentFolderId: "" + color: '#008F00' +- name: Magic + id: J6IAJZ5uWs3Bdqwj + parentFolderId: R5yDwwVBNF7yE4fc + color: '#088F00' +- name: Asgardian + id: JPJijWGcJUmeLfSu + parentFolderId: R5yDwwVBNF7yE4fc + color: '#108F00' +- name: Zodiac + id: wI7ZM7GUB6h877lc + parentFolderId: R5yDwwVBNF7yE4fc + color: '#148F00' +- name: Totems + id: ZJzBrmBAMjcUijuX + parentFolderId: R5yDwwVBNF7yE4fc + color: '#188F00' +- name: Spells + id: gVI9JYbauW6iZ3qY + parentFolderId: "" + color: '#800000' +- name: Earth + id: OVnl7dt16e0W1noV + parentFolderId: gVI9JYbauW6iZ3qY + color: '#8b4513' +- name: Metal + id: 8iCp9ElYOPcPrE59 + parentFolderId: gVI9JYbauW6iZ3qY + color: '#a9a9a9' +- name: Wind + id: ODuFSQKM8KJTQ7wQ + parentFolderId: gVI9JYbauW6iZ3qY + color: '#00bfff' +- name: Neutral + id: RpuF61QnMRyujYaM + parentFolderId: gVI9JYbauW6iZ3qY + color: '#5c5c5c' +- name: Water + id: uPcOyKGtVi0qnGTR + parentFolderId: gVI9JYbauW6iZ3qY + color: '#0000ff' +- name: Fire + id: o4FdHOz6uN8hxo99 + parentFolderId: gVI9JYbauW6iZ3qY + color: '#ff0000' +- name: Spirit + id: uM9DgrQnQkVQqLPq + parentFolderId: gVI9JYbauW6iZ3qY + color: '#648264' +- name: Totems + id: eJSuuML2ROg3V1W6 + parentFolderId: "" + color: '#008000' +- name: Arcane Talents + id: BXfH5cKFM0lUbyhg + parentFolderId: "" + color: '#008000' diff --git a/packs/generate/legendary/leg-mysteries/data/mysteries.yaml b/packs/generate/legendary/leg-mysteries/data/mysteries.yaml new file mode 100644 index 0000000..77ee79f --- /dev/null +++ b/packs/generate/legendary/leg-mysteries/data/mysteries.yaml @@ -0,0 +1,1071 @@ +- name: Premonition + id: hrSi238FiXLA5O8m + subType: fate + domain: "" + skills: [] + level: 0 + usesCharges: true + chargesValue: 5 + chargesMax: 0 + description: "" + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/sparkles.svg + folderId: HQdjhe67Av3z8APh +- name: "Badger: Tenacious and Independent" + id: WxZsuNGUm8U7JpQn + subType: totem + domain: badger + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Tenacious and solitary, badgers are fiercely independent animals that will defend their territory with determination and persistence.

+

Human Personality: Fiercely determined and self-reliant, this individual prefers solitary tasks and will defend their personal space and principles with unwavering commitment.

+
    +
  • Physical: Strong, stocky build; possibly sharper, more penetrating gaze.
  • +
  • Behavioral: Highly determined, fiercely independent, unwilling to let go of tasks.
  • Positive Aspects: Determined, fiercely independent, and resilient.
  • +
  • Negative Aspects: Stubborn, isolated, unwilling to let go of tasks, and resistant to collaboration.
  • +
  • Minor Trait: Self-sufficient.
  • +
  • Major Disorder: Obsessive-Compulsive Personality Disorder (OCPD) due to extreme stubbornness and rigidity in behaviors.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/badger.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Bear: Solitary and Calm" + id: IPxMGQOSQBsOi48s + subType: totem + domain: bear + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Quiet and shy, bears prefer to avoid confrontation, retreating into the wilderness where they live a largely solitary and reclusive life.

+

Description: Quiet and reclusive, this person enjoys their own company and avoids unnecessary confrontation. They thrive in peaceful, solitary environments and are at their best when left to their own devices.

+
    +
  • Physical: Large, robust frame; capable of producing an intimidating presence.
  • +
  • Behavioral: Prefers solitude, generally calm demeanor but potentially explosive when provoked.
  • Positive: Self-sufficient, calm, and introspective.
  • +
  • Negative: Reclusive, avoidant, and emotionally distant.
  • +
  • Minor Trait: Introverted.
  • +
  • Major Disorder: Avoidant Personality Disorder, characterized by extreme shyness and avoidance of social interaction.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/bear.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Bison: Stoic and Protective" + id: 2CpsqSoWBpEsHCU9 + subType: totem + domain: bison + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Stoic and protective, bison form strong herd bonds and will fiercely defend their young and territory from any threats.

+

Description: Steadfast and dependable, this person places a high value on family and community. They are willing to go to great lengths to protect their loved ones and are seen as pillars of strength.

+
    +
  • Physical: Sturdy, muscular build; a grounded and imposing presence.
  • +
  • Behavioral: Stoic in face of adversity, protective of loved ones and territory.
  • Positive: Loyal, dependable, and community-oriented.
  • +
  • Negative: Overprotective, inflexible, and resistant to change.
  • +
  • Minor Trait: Reliable.
  • +
  • Major Disorder: Protective Stoicism Disorder, exhibiting a stoic demeanor while being exceedingly overprotective, inflexible, and resistant to change. This disorder also encompasses traits of Dependent Personality Disorder, resulting in a blend of emotional rigidity, excessive caution, and an overwhelming need to guard and control their environment and relationships for a perceived sense of safety and stability.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/bison.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Boar: Willful and Determined" + id: jdBjqI048XnA4tfr + subType: totem + domain: boar + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Willful and stubborn, boars are highly determined and will fight vigorously when provoked, relying on their strength and tenacity.

+

Description: Highly determined and unwavering, this person faces challenges head-on. Their strong will and resistance to giving up ensure they persevere through even the toughest situations.

+
    +
  • Physical: Strong, solid body; possibly more facial hair or hirsute.
  • +
  • Behavioral: Willful, confrontational, takes a headstrong approach to challenges.
  • Positive: Strong-willed, determined, and resilient.
  • +
  • Negative: Stubborn, aggressive, and hard to reason with.
  • +
  • Minor Trait: Assertive.
  • +
  • Major Disorder: Oppositional Defiant Disorder (ODD), due to chronic stubbornness and defiance.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/boar.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Bobcat: Secretive and Cautious" + id: 6Y0jmaBIzCwrwz1p + subType: totem + domain: bobcat + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Secretive and cautious, bobcats are elusive hunters, using their stealth and patience to silently stalk and ambush their prey.

+

Description: Elusive and careful, this individual is always cautious about their surroundings. They prefer to remain out of the spotlight and use their keen observation to make informed decisions.

+
    +
  • Physical: Lean, agile physique; sharp, penetrating eyes.
  • +
  • Behavioral: Extremely cautious, prefers to stay under the radar, secretive.
  • Positive: Cautious, observant, and strategic.
  • +
  • Negative: Secretive, withdrawn, and overly suspicious.
  • +
  • Minor Trait: Vigilant.
  • +
  • Major Disorder: Social Anxiety Disorder, linked to heightened caution and reluctance to social exposure.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/bobcat.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Bull: Destructive and Unpredictable" + id: kDExCsZvttQtSzlq + subType: totem + domain: bull + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Destructive and unpredictable, bulls are powerful animals that can quickly become aggressive, especially when threatened or provoked.

+

Description: Powerful and sometimes volatile, this person can become aggressive when provoked. They possess strong emotions and their reactions can be intense and forceful.

+
    +
  • Physical: Thick, muscular neck and broad shoulders; imposing stance.
  • +
  • Behavioral: Potentially volatile and destructive, unpredictable in reactions.
  • Positive: Powerful, assertive, and decisive.
  • +
  • Negative: Aggressive, volatile, and difficult to control.
  • +
  • Minor Trait: Decisive.
  • +
  • Major Disorder: Intermittent Explosive Disorder, marked by episodes of aggressive outbursts.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/bull.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Catfish: Nocturnal and Opportunistic" + id: RbJ9D3CclnLOGenm + subType: totem + domain: catfish + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Nocturnal and opportunistic, catfish are bottom-dwellers that take advantage of the cover of darkness to feed on whatever they can find.

+

Description: Preferring to work under the radar, this person takes advantage of situations that others might overlook. They are most active and productive in less obvious settings.

+
    +
  • Physical: Smooth skin with a slight sheen; sinuous movements.
  • +
  • Behavioral: Active at night, takes advantage of situations and opportunities.
  • Positive: Adaptable, resourceful, and efficient.
  • +
  • Negative: Opportunistic, secretive, and may avoid daytime interactions.
  • +
  • Minor Trait: Adaptable.
  • +
  • Major Disorder: Antisocial Personality Disorder, associated with taking advantage of situations without regard for others.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/catfish.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Chicken: Cautious and Alert" + id: zAcMdNEQ72INVoNU + subType: totem + domain: chicken + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Timid and skittish, chickens are easily startled and rely on their quick reflexes and flocking behavior for safety.

+

Description: Easily startled and cautious, this individual seeks safety in familiarity and routine. They often rely on their quick reflexes and social networks to navigate potential threats.

+
    +
  • Physical: Smaller, less imposing frame; possibly quick, jittery movements.
  • +
  • Behavioral: Timid and easily startled, wary of risks and changes.
  • Positive: Quick reflexes, cautious, and community-oriented.
  • +
  • Negative: Easily startled, anxious, and overly reliant on group dynamics.
  • +
  • Minor Trait: Cautious.
  • +
  • Major Disorder: Generalized Anxiety Disorder (GAD), characterized by persistent worry and fear.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/chicken.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Cow: Gentle and Routine-Oriented" + id: zJVBT4rbche7Cmfb + subType: totem + domain: cow + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Docile and routine-oriented, cows are gentle creatures that thrive in familiar environments, following established patterns for feeding and resting.

+

Description: Docile and calm, this person thrives on consistency and routine. They are gentle in their interactions and prefer environments where they can follow familiar patterns.

+
    +
  • Physical: Robust, steady frame; calm, reflective countenance.
  • +
  • Behavioral: Gentle, prefers routines, calm demeanor.
  • Positive: Calm, dependable, and adaptable to routines.
  • +
  • Negative: Predictable, resistant to change, and may lack initiative.
  • +
  • Minor Trait: Calm.
  • +
  • Major Disorder: Depressive Disorder related to lack of initiative and resistance to change.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/cow.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Crow: Curious and Resourceful" + id: XHwwkctPOTYwybx5 + subType: totem + domain: crow + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Mischievous and vindictive, crows are highly intelligent birds that can hold grudges and are known to play tricks on both animals and humans.

+

Description: Mischevous, curious, and resourceful, this person has a knack for problem-solving and enjoys playing tricks. They are curious and often use their wits to navigate complex situations.

+
    +
  • Physical: Keen, observant eyes; lean and agile.
  • +
  • Behavioral: Highly curious, resourceful in problem-solving and tool use.
  • Positive: Resourceful, innovative, and problem-solving.
  • +
  • Negative: Mischievous, vindictive, and may play tricks on others.
  • +
  • Minor Trait: Innovative
  • +
  • Major Disorder: Narcissistic Personality Disorder (NPD), linked with vindictive and manipulative behaviors.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/crow.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Deer: Alert and Elusive" + id: xbBAhWDbWnyD8p2l + subType: totem + domain: deer + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Alert and elusive, deer are constantly vigilant, using their keen senses to detect danger and flee at the first sign of a threat.

+

Description: Constantly vigilant, this individual is always aware of their surroundings. They are quick to evade danger and prefer blending into the background to avoid confrontation.

+
    +
  • Physical: Lean, light build; graceful and delicate movements.
  • +
  • Behavioral: Always alert, evasive and elusive, often avoiding confrontation.
  • Positive: Vigilant, alert, and responsive to danger.
  • +
  • Negative: Skittish, elusive, and may avoid social interactions.
  • +
  • Minor Trait: Responsive.
  • +
  • Major Disorder: Hypervigilant Elusiveness Disorder, characterized by an individual's intense vigilance and alertness, combined with an elusive nature and heightened sensitivity to perceived dangers, they are constantly on guard, excessively aware of their surroundings, and quick to withdraw or evade potential threats. This combination often results in significant social and occupational difficulties due to their constant state of alertness and avoidance behaviors.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/deer.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Donkey: Patient and Obstinate" + id: 06wasGpojK17FTdC + subType: totem + domain: donkey + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Patient and obstinate, donkeys are known for their stubbornness and will resist any force they perceive as unreasonable or threatening.

+

Description: Stubborn and resilient, this person stands firm in their beliefs and resists being forced into actions they perceive as unreasonable. They are patient, enduring, and steadfast.

+
    +
  • Physical: Compact, sturdy build; strong legs and back.
  • +
  • Behavioral: Extremely patient, often stubborn and resistant to change.
  • Positive: Resilient, persistent, and patient.
  • +
  • Negative: Stubborn, resistant to guidance, and inflexible.
  • +
  • Minor Trait: Persistent.
  • +
  • Major Disorder: Resilient Stubbornness Disorder, characterized by an individual's extreme patience coupled with profound obstinacy, individuals are generally calm and persistent, but as they encounter provocation or pressure, their stubbornness and inflexibility intensify dramatically. This disorder manifests as a combination of steadfast determination and an increasing resistance to change when faced with adversity or challenge.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/donkey.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Dove: Gentle and Companionable" + id: 7tU9QZR1Fp4H8H3v + subType: totem + domain: dove + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Gentle and peaceful, instinctively seeking harmony and companionship, often displaying strong pair bonding and a calming presence in their surroundings.

+

Description: This person is peaceful and harmonious, seeking strong, friendly bonds with others. They are calming presences who strive for tranquility and companionship in their relationships.

+
    +
  • Physical: Soft, gentle features; calm and serene appearance.
  • +
  • Behavioral: Companionable, seeks peace and harmony in social settings.
  • Positive: Peaceful, harmonious, and good at forming bonds.
  • +
  • Negative: Overly dependent on companionship and may avoid conflict even when necessary.
  • +
  • Minor Trait: Agreeable.
  • +
  • Major Disorder: Dependent Personality Disorder, due to dependence on companionship and others for decision-making.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/dove.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Duck: Adaptable and Social" + id: iQHwJSWiNaowM9nN + subType: totem + domain: duck + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Gregarious and adaptable, ducks are social birds that thrive in diverse environments, often forming strong bonds with their flock.

+

Description: Gregarious and flexible, this person thrives in diverse environments and builds strong social bonds. They easily adapt to changing circumstances and enjoy being part of a community.

+
    +
  • Physical: Agile, adept at both land and water movement; webbed feet.
  • +
  • Behavioral: Highly adaptable, enjoys social interaction, quick to adjust to surroundings.
  • Positive: Social, adaptable, and builds strong relationships.
  • +
  • Negative: May be too reliant on social approval and could struggle with independence.
  • +
  • Minor Trait: Sociable.
  • +
  • Major Disorder: Histrionic Personality Disorder (HPD), characterized by dependence on social approval and attention.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/duck.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Eagle: Merciless and Focused" + id: T2EpauXH7NkoWDwt + subType: totem + domain: eagle + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Blunt, impatient, and merciless, eagles are apex predators that strike with precision, showing little tolerance for any hindrances in their pursuit of prey.

+

Description: Blunt and decisive, this individual exhibits little tolerance for obstacles and pursues their goals with ruthless efficiency. They are highly focused and not easily deterred.

+
    +
  • Physical: Sharp vision; strong, prominent features, especially the nose and brow.
  • +
  • Behavioral: Focused to the point of being ruthless, relentless in pursuits.
  • Positive: Blunt, decisive, and highly effective.
  • +
  • Negative: Ruthless, intolerant of mistakes, and could be overly aggressive in pursuits.
  • +
  • Minor Trait: Goal-oriented.
  • +
  • Major Disorder: Antisocial Personality Disorder, characterized by ruthless and aggressive pursuit of goals.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/eagle.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Falcon: Precise and Relentless" + id: RakVBHejmx0qHcIn + subType: totem + domain: falcon + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Precise and relentless, falcons are master hunters that dive at incredible speeds to capture prey, showing unparalleled focus and determination.

+

Description: This person is a master of focus and determination, diving into tasks with unmatched precision. They relentlessly pursue their objectives, often succeeding due to their intense concentration.

+
    +
  • Physical: Streamlined, athletic build; intense, unwavering gaze.
  • +
  • Behavioral: Precise in actions, relentless in efforts and pursuits.
  • Positive: Highly focused, determined, and efficient.
  • +
  • Negative: Can be overly intense and may not tolerate distractions or setbacks well.
  • +
  • Minor Trait: Precise.
  • +
  • Major Disorder: Obsessive-Compulsive Personality Disorder (OCPD), linked to relentless perfectionism.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/falcon.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Fox: Cunning and Resourceful" + id: YS9L9w2AUIAqL6fy + subType: totem + domain: fox + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Deceitful and cunning, foxes are highly intelligent and resourceful, using their wits to outsmart both prey and predators alike.

+

Description: Deceitful and intelligent, this individual uses their sharp mind to navigate challenges. They are skilled at outsmarting both opponents and obstacles, often finding clever solutions.

+
    +
  • Physical: Lean, quick; alert, watchful eyes.
  • +
  • Behavioral: Smart, resourceful, able to outwit and maneuver through challenges.
  • Positive: Clever, strategic, and resourceful.
  • +
  • Negative: Deceitful, manipulative, and may use cunning at the expense of others' trust.
  • +
  • Minor Trait: Resourceful.
  • +
  • Major Disorder: Antisocial Personality Disorder, due to manipulative and deceitful behavior.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/fox.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Goat: Curious and Determined" + id: lWxRr0XkTqO3qDNa + subType: totem + domain: goat + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Curious and determined, goats are naturally inquisitive animals that will climb, explore, and test their environment to satisfy their curiosity.

+

Description: Inquisitive and adventurous, this person constantly explores and tests their environment. Their determination drives them to overcome barriers and satisfy their curiosity.

+
    +
  • Physical: Lean, muscular legs; agile and sure-footed.
  • +
  • Behavioral: Inquisitive and determined, won't shy away from obstacles.
  • Positive: Inquisitive, adventurous, and resilient.
  • +
  • Negative: Can be overly stubborn and reckless in pursuing curiosity.
  • +
  • Minor Trait: Inquisitive.
  • +
  • Major Disorder: Attention Deficit Hyperactivity Disorder (ADHD), characterized by impulsive and exploratory behaviors.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/goat.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Goose: Territorial and Aggressive" + id: deLZxIhQUl5cFaIO + subType: totem + domain: goose + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Territorial and aggressive, geese are fiercely protective of their nesting sites and will not hesitate to confront intruders with loud honks and aggressive displays.

+

Description: Fiercely protective of their space, this individual confronts intruders with assertive behavior. They are loyal to their environment and those they care about, showing strong defensive instincts.

+
    +
  • Physical: Broad, strong shoulders; sharp eyes.
  • +
  • Behavioral: Highly territorial, can be surprisingly aggressive in defense.
  • Positive: Loyal, protective, and assertive.
  • +
  • Negative: Aggressive, overly territorial, and confrontational.
  • +
  • Minor Trait: Assertive.
  • +
  • Major Disorder: Borderline Personality Disorder (BPD), due to extreme aggression and difficulty managing relationships.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/goose.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Hamster: Cautious and Hoarding" + id: aVh7hIiGfJgn3CRU + subType: totem + domain: hamster + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Cautious and hoarding, hamsters instinctively gather and store food in their cheek pouches, always preparing for future scarcity.

+

Description: Always preparing for future scarcity, this person is cautious and tends to gather resources. They prefer to have safety nets and are diligent in securing their needs.

+
    +
  • Physical: Small, compact frame; nimble, capable of quick movements.
  • +
  • Behavioral: Cautious and highly protective of personal space and possessions.
  • Positive: Prepared, cautious, and resourceful.
  • +
  • Negative: Overly cautious, hoarding behaviors, and may struggle with trust.
  • +
  • Minor Trait: Prudent.
  • +
  • Major Disorder: Hoarding Disorder, linked to excessive gathering and storage.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/hamster.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Hawk: Observant and Swift" + id: 2Ed7btYI6bIBYi7P + subType: totem + domain: hawk + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Observant and swift, hawks use their sharp vision to spot prey from great distances and strike with incredible speed and accuracy.

+

Description: Highly observant and quick to act, this person spots opportunities and threats from a distance. Their swift actions and sharp focus make them effective in accomplishing their goals.

+
    +
  • Physical: Piercing eyes; quick, agile movements.
  • +
  • Behavioral: Observant, takes swift and decisive actions.
  • Positive: Highly observant, quick-witted, and effective.
  • +
  • Negative: May be impulsive and overly focused, potentially missing broader contexts.
  • +
  • Minor Trait: Focused.
  • +
  • Major Disorder: Obsessive-Compulsive Disorder (OCD), linked to hyper-focus and compulsion.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/hawk.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Hedgehog: Defensive and Solitary" + id: 0xUsGQi0l0TkirTM + subType: totem + domain: hedgehog + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Defensive and solitary, hedgehogs rely on their spines for protection and prefer to remain hidden and alone in their burrows.

+

Description: Preferring to stay hidden and alone, this individual relies on their defenses to navigate social interactions. They are self-protective and often choose solitude over socializing.

+
    +
  • Physical: Small, round build; defensive body language.
  • +
  • Behavioral: Prefers solitude, defensive and wary of threats.
  • Positive: Self-protective, independent, and resilient.
  • +
  • Negative: Overly defensive and may isolate themselves too much.
  • +
  • Minor Trait: Self-protective.
  • +
  • Major Disorder: Schizoid Personality Disorder (SPD), characterized by a preference for solitude and limited social interaction.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/hedgehog.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Horse: Free-Spirited and Independent" + id: UZVuHQMOLIbrSvYS + subType: totem + domain: horse + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Undisciplined and irresponsible, horses in the wild are free-spirited animals that roam in herds, often following their instincts over any imposed structure.

+

Description: This person embodies a free-spirited nature, thriving in groups but often following their instincts over structured rules. They love exploring and enjoying life on their terms.

+
    +
  • Physical: Strong, lean build; fluid and graceful in movements.
  • +
  • Behavioral: Free-spirited, values independence, often rebellious.
  • Positive: Independent, adventurous, and freedom-loving.
  • +
  • Negative: Undisciplined, irresponsible, and resistant to structure.
  • +
  • Minor Trait: Adventurous.
  • +
  • Major Disorder: Conduct Disorder, linked to resistance to conformity and reckless behavior.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/horse.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Jaguar: Stealthy and Powerful" + id: wUJqCGHtATIIh99Q + subType: totem + domain: jaguar + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Stealthy and powerful, jaguars are solitary hunters that rely on their strength and stealth to ambush and overpower their prey in dense forests.

+

Description: This person is a solitary and calculated individual, using their strength and stealth to achieve their goals. They are efficient and often prefer working alone.

+
    +
  • Physical: Muscular and agile; quiet but powerful movements.
  • +
  • Behavioral: Stealthy, capable of intense bursts of power and action.
  • Positive: Strong, efficient, and strategic.
  • +
  • Negative: Secretive, solitary, and may avoid teamwork.
  • +
  • Minor Trait: Cunning.
  • +
  • Major Disorder: Antisocial Personality Disorder, noted for solitary tendencies and calculating behaviors.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/jaguar.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Leopard: Independent and Secretive" + id: 9kURQgBvCgSoahoC + subType: totem + domain: leopard + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Independent and secretive, leopards are solitary predators that prefer to hunt alone, often dragging their kill into trees to avoid scavengers.

+

Description: Preferring solitude, this individual is self-reliant and keeps to themselves. They are strategic, often hiding their successes from others to avoid unnecessary attention.

+
    +
  • Physical: Lean and muscular; quiet and agile.
  • +
  • Behavioral: Prefers solitude and secrecy, rarely seen but highly capable.
  • Positive: Self-reliant, strategic, and capable.
  • +
  • Negative: Secretive, avoidant, and may struggle with trust and collaboration.
  • +
  • Minor Trait: Independent.
  • +
  • Major Disorder: Schizotypal Personality Disorder (STPD), linked to odd or eccentric behavior and social isolation.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/leopard.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Lion: Dominant and Strategic" + id: MU6HVFla6YShVxgi + subType: totem + domain: lion + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Dominant and strategic, lions are social big cats that work cooperatively within a pride to hunt and defend their territory with calculated precision.

+

Description: This person is a natural leader who works well within a team, using their strategic mind to lead and defend their group. They are dominant, taking charge of situations.

+
    +
  • Physical: Strong, dominant presence; regal and authoritative appearance.
  • +
  • Behavioral: Dominant, strategic in leadership and social engagements.
  • Positive: Natural leader, cooperative, and strategic.
  • +
  • Negative: Can be domineering and may struggle with letting others take charge.
  • +
  • Minor Trait: Assertive.
  • +
  • Major Disorder: Narcissistic Personality Disorder (NPD), characterized by dominance and a need for admiration.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/lion.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Lynx: Elusive and Nocturnal" + id: HIWEuBejSbFz9oAK + subType: totem + domain: lynx + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Elusive and watchful, lynxes are solitary and nocturnal hunters that use their keen eyesight to silently stalk prey through dense forests.

+

Description: Preferring the quiet of night, this individual is watchful and solitary. They use their keen senses to navigate effectively while remaining largely out of sight.

+
    +
  • Physical: Sharp features; keen, watchful eyes, agile.
  • +
  • Behavioral: Highly elusive, prefers night-time activity, secretive.
  • Positive: Highly aware, observant, and strategic.
  • +
  • Negative: Secretive, reclusive, and may avoid daytime engagement.
  • +
  • Minor Trait: Watchful.
  • +
  • Major Disorder: Avoidant Personality Disorder, characterized by social withdrawal and preference for isolation.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/lynx.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Otter: Playful and Curious" + id: fXswwp4qhC9zXrtZ + subType: totem + domain: otter + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Playful and curious, otters are highly social animals that enjoy engaging in group activities, often seen playing in water or using tools to crack open food.

+

Description: Highly social and inquisitive, this person thrives on interaction and enjoys playful activities. They engage actively with their environment and others, often bringing joy to those around them.

+
    +
  • Physical: Sleek, smooth build; playful and energetic movements.
  • +
  • Behavioral: Highly curious, playful, enjoys exploring new environments.
  • Positive: Social, curious, and engaging.
  • +
  • Negative: May be overly playful and less focused on serious tasks.
  • +
  • Minor Trait: Playful.
  • +
  • Major Disorder: Hyperactivity Disorder, linked to constant need for engagement and restlessness.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/otter.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Owl: Mysterious and Patient" + id: Y1YuK9tAyQoCO3Pd + subType: totem + domain: owl + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Mysterious and patient, owls are nocturnal predators that silently observe their surroundings, waiting for the perfect moment to strike.

+

Description: This individual is calm and observant, waiting for the right moment to act. They exude a sense of mystery and are often seen as wise due to their patience and thoughtful nature.

+
    +
  • Physical: Large, wide eyes; silent, smooth movements.
  • +
  • Behavioral: Patient, mysterious, often working silently behind the scenes.
  • Positive: Wise, patient, and observant.
  • +
  • Negative: Overly enigmatic, isolated, and may delay actions excessively waiting for the perfect moment.
  • +
  • Minor Trait: Enigmatic.
  • +
  • Major Disorder: Schizoid Personality Disorder (SPD), characterized by extreme introversion and emotional detachment.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/owl.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Ox: Strong and Dependable" + id: 5JA4yOkD0TqwsDMp + subType: totem + domain: ox + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Strong and dependable, oxen are resilient animals used in agriculture for their ability to carry heavy loads and work tirelessly in fields.

+

Description: Reliable and resilient, this person is often seen as the backbone in any group. They carry heavy responsibilities without complaint and are known for their unwavering strength.

+
    +
  • Physical: Extremely strong, robust frame; steady and solid stance.
  • +
  • Behavioral: Dependable, reliable under pressure, does not tire easily.
  • Positive: Reliable, strong, and hardworking.
  • +
  • Negative: Predictable, resistant to change, and may be overly burdensome.
  • +
  • Minor Trait: Resiliant.
  • +
  • Major Disorder: Dependent Personality Disorder, due to excessive reliability and dependence on routines.
  • +
+ macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/ox.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Parrot: Social and Vocal" + id: 8tXNzvMlIs7L5c7v + subType: totem + domain: parrot + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

Animal Ideal: Social and vocal, parrots are intelligent birds that thrive on interaction and are known for their ability to mimic sounds and engage with their environment.

+

Description: Outgoing and communicative, this individual thrives on interaction and enjoys engaging with others. They are articulate and often bring life to social settings with their vocal presence.

    +
      +
    • Physical: Bright, expressive appearance; social body language.
    • +
    • Behavioral: Highly social, vocal and communicative, enjoys interaction.
    • Positive: Communicative, social, and interactive.
    • +
    • Negative: Overly talkative, needs attention, and may not enjoy solitude.
    • +
    • Minor Trait: Expressive.
    • +
    • Major Disorder: Histrionic Personality Disorder (HPD), characterized by a constant need for attention and approval.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/parrot.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Pigeon: Loyal and Routine" + id: GOFYJG8SHFbxXoPh + subType: totem + domain: pigeon + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Loyal and routine-oriented, pigeons are known for their strong homing instincts, often returning to the same location repeatedly with remarkable accuracy.

    +

    Description: Routine-oriented and faithful, this person has strong homing instincts and a sense of loyalty to familiar places and people. They are dependable and consistent in their habits.

    +
      +
    • Physical: Compact, agile physique; soft and gentle demeanor.
    • +
    • Behavioral: Loyal, prefers routine and familiar environments.
    • Positive: Loyal, consistent, and routine-oriented.
    • +
    • Negative: May be overly predictable and resistant to breaking habits or exploring new experiences.
    • +
    • Minor Trait: Loyal.
    • +
    • Major Disorder: Obsessive-Compulsive Personality Disorder (OCPD), linked to rigid adherence to routines and loyalty.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/pigeon.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Rabbit: Nervous and Quick" + id: FflqdVjsjGPrZYY9 + subType: totem + domain: rabbit + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Nervous and quick, rabbits are prey animals that rely on their agility and rapid breeding to survive in environments filled with predators.

    +

    Description: Agile and easily startled, this individual relies on quick thinking and rapid actions to navigate their environment. They are often seen as cautious and quick to respond to threats.

    +
      +
    • Physical: Small, quick, agile; alert and reactive.
    • +
    • Behavioral: Nervous, extremely quick responses, always on alert.
    • Positive: Agile, quick-thinking, and responsive.
    • +
    • Negative: Easily startled and anxious, may struggle with calm environments.
    • +
    • Minor Trait: Nervous.
    • +
    • Major Disorder: Generalized Anxiety Disorder (GAD), characterized by persistent anxiety and quick to startle.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/rabbit.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Sea Bass: Stealthy and Opportunistic" + id: tGunwcnHgwsjE6Ht + subType: totem + domain: seabass + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Opportunistic and stealthy, sea bass lie in wait to ambush unsuspecting prey, capitalizing on their surroundings to strike with precision.

    +

    Description: Strategic and patient, this individual waits for the perfect moment to act. They are skilled at identifying opportunities and exploit them with precision and discretion.

    +
      +
    • Physical: Streamlined, smooth body; fluid and silent movements.
    • +
    • Behavioral: Stealthy, takes full advantage of opportunities that arise.
    • Positive: Strategic, patient, and precise.
    • +
    • Negative: Secretive, mistrustful, and opportunistic at the expense of others.
    • +
    • Minor Trait: Reticent.
    • +
    • Major Disorder: Predatory Stalking Disorder, characterized by a calculating and covert apporach to manipulating and exploiting others involving a distinct lack of empathy or remorse, with behavior driven by a desire for control, dominance, or personal gain and the expense of others.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/sea bass.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Shark: Relentless and Instinctive" + id: yKOy6VLXsYFHVggm + subType: totem + domain: shark + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Relentless and instinctive, sharks are apex predators that patrol the oceans with unyielding focus, driven by their powerful senses to hunt and survive.

    +

    Description: Highly driven by their instincts, this individual pursues their goals with unyielding focus. They are relentless in their endeavors and rely on their sharp senses to succeed.

    +
      +
    • Physical: Strong, sleek build; intense, penetrating gaze.
    • +
    • Behavioral: Relentless, driven by strong instincts, effective in pursuit.
    • Positive: Driven, focused, and effective.
    • +
    • Negative: Ruthless, overly aggressive, and may not consider others' feelings.
    • +
    • Minor Trait: Driven.
    • +
    • Major Disorder: Antisocial Personality Disorder, characterized by relentless pursuit of goals and lack of empathy.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/shark.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Sheep: Docile and Social" + id: WvNQBTaORsEATNRc + subType: totem + domain: sheep + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Docile and flock-minded, sheep are highly social animals that find safety in numbers, often following a leader and sticking closely to their herd.

    +

    Description: Mild-mannered and sociable, this person finds comfort in numbers and follows group dynamics. They are cooperative and thrive in community settings.

    +
      +
    • Physical: Soft appearance; docile body language.
    • +
    • Behavioral: Extremely social, follows group dynamics, generally docile.
    • Positive: Cooperative, social, and mild-mannered.
    • +
    • Negative: Overly dependent on group dynamics, lacking in individual initiative.
    • +
    • Minor Trait: Agreeable.
    • +
    • Major Disorder: Dependent Personality Disorder, linked to excessive reliance on social structures and leaders.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/sheep.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Snake: Silent and Patient" + id: An835dfH4ekHyiYC + subType: totem + domain: snake + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Silent and patient, snakes are stealthy hunters that rely on ambush tactics, waiting motionless for the perfect moment to strike their prey.

    +

    Description: This individual is stealthy and waits for the opportune moment to strike. They possess a calm exterior but can be decisive and effective when necessary.

    +
      +
    • Physical: Sinuous, fluid movements; steady gaze.
    • +
    • Behavioral: Silent, patient, strategic in timing and actions.
    • Positive: Stealthy, patient, and strategic.
    • +
    • Negative: Secretive, distant, and may be perceived as untrustworthy.
    • +
    • Minor Trait: Calm.
    • +
    • Major Disorder: Avoidant Personality Disorder, characterized by social withdrawal and passive-aggressiveness.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/snake.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Stag: Proud and Vigilant" + id: sb0q3xC4IjjufQgP + subType: totem + domain: stag + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Proud and vigilant, stags are territorial animals that display their strength and dominance during the rutting season to attract mates and fend off rivals.

    +

    Description: Proud and steadfast, this person is highly aware of their strengths and maintains a vigilant stance. They display their capabilities confidently and are protective of their territory.

    +
      +
    • Physical: Strong, proud stance; alert and watchful eyes.
    • +
    • Behavioral: Proud, vigilant, always aware of surroundings.
    • Positive: Strong, vigilant, and confident.
    • +
    • Negative: Can be overly proud, competitive, and confrontational.
    • +
    • Minor Trait: Confident.
    • +
    • Major Disorder: Narcissistic Personality Disorder (NPD), characterized by excessive pride and vigilance towards threats to self-esteem.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/stag.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Sturgeon: Steadfast and Reserved" + id: Ck1MuvxjKNQu79F4 + subType: totem + domain: sturgeon + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Resilient and steadfast, sturgeons thrive in diverse environments, moving slowly but purposefully, and enduring through various challenges with their strength and persistence.

    +

    Description: This person exhibits a composed and methodical approach to life, showing remarkable resilience and consistent reliability, often providing stability and wisdom in both personal and professional settings.

    +
      +
    • Physical: Strong build; steady and fluid in movement.
    • +
    • Behavioral: Steadfast, reserved, can endure a lot without complaint.
    • Positive: Reliable, composed, and insightful.
    • +
    • Negative: Aloof, resistant to change, and overly cautious.
    • +
    • Minor Trait: Patient.
    • +
    • Major Disorder: Avoidant Personality Disorder, due to social inhibition and a strong resistance to change.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/sturgeon.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Trout: Swift and Wary" + id: 7sSIfjhmqoOP3h0E + subType: totem + domain: trout + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Swift and wary, trout are agile fish that remain constantly alert, using their speed and awareness to evade predators in freshwater streams.

    +

    Description: This individual is quick and cautious, constantly on the lookout for potential dangers. They rely on their speed and awareness to navigate through life efficiently.

    +
      +
    • Physical: Sleek, smooth build; quick, darting movements.
    • +
    • Behavioral: Swift, wary, quick to react to threats.
    • Positive: Agile, quick, and vigilant.
    • +
    • Negative: Wary, easily stressed, and may struggle to relax.
    • +
    • Minor Trait: Perceptive.
    • +
    • Major Disorder: Generalized Anxiety Disorder (GAD), due to constant vigilance and wariness.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/trout.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Tuna: Driven and Enduring" + id: 1CsCdba2A5DtIurL + subType: totem + domain: tuna + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Driven and enduring, tuna are powerful swimmers that migrate vast distances across oceans, relentlessly pursuing schools of prey in their path.

    +

    Description: Highly motivated and resilient, this person embarks on long-term pursuits with unwavering determination. They are powerful and persistent in achieving their objectives.

    +
      +
    • Physical: Robust, powerful build; exceptional stamina.
    • +
    • Behavioral: Highly driven, endures through long challenges and pursuits.
    • Positive: Highly motivated, resilient, and enduring.
    • +
    • Negative: May overexert themselves and be overly single-minded.
    • +
    • Minor Trait: Driven.
    • +
    • Major Disorder: Obsessive-Compulsive Personality Disorder (OCPD), linked to obsessive drive and persistence.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/tuna.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Turkey: Proud and Cautious" + id: KkBgTFTb3CYb58uj + subType: totem + domain: turkey + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Proud and cautious, turkeys are ground-dwelling birds that display elaborate courtship rituals while remaining vigilant against predators.

    +

    Description: This individual balances pride with vigilance, displaying confidence while remaining alert to threats. They engage in social displays but are always mindful of their safety.

    +
      +
    • Physical: Large, rounded physique; keen, observant eyes.
    • +
    • Behavioral: Proud, cautious, always on the lookout for danger.
    • Positive: Confident, vigilant, and social.
    • +
    • Negative: May be overly cautious and stubbornly prideful.
    • +
    • Minor Trait: Vigilant.
    • +
    • Major Disorder: Paranoid Personality Disorder (PPD), characterized by cautious and overly proud behavior.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/turkey.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Whale: Majestic and Communicative" + id: qPI5hH1aPPOfpS35 + subType: totem + domain: whale + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Majestic and communicative, whales are highly social marine mammals that travel in pods, using complex vocalizations to coordinate and express themselves.

    +

    Description: Highly social and expressive, this person enjoys deep connections and uses communication to foster relationships. They navigate social settings with grace and clarity.

    +
      +
    • Physical: Large, commanding presence; graceful in movement.
    • +
    • Behavioral: Majestic, highly communicative, cooperative in social structures.
    • Positive: Social, expressive, and empathetic.
    • +
    • Negative: Can become overwhelmed by group dynamics and may struggle with solitary tasks.
    • +
    • Minor Trait: Sensitive.
    • +
    • Major Disorder: Avoidant Personality Disorder, due to heightened sensitivity to social dynamics and potential rejection.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/whale.svg + folderId: eJSuuML2ROg3V1W6 +- name: "Wolf: Cooperative and Strategic" + id: wYrQBhECXQGbEMw5 + subType: totem + domain: wolf + skills: [] + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + description: |- +

    Animal Ideal: Cooperative and strategic, wolves are pack animals that rely on teamwork and careful planning to hunt and protect their territory.

    +

    Description: Strongly valuing teamwork and planning, this individual operates effectively within a group. They rely on strategy and collaboration to achieve shared goals.

    +
      +
    • Physical: Lean, strong build; sharp, alert movements.
    • +
    • Behavioral: Highly cooperative, skilled in social strategies and teamwork.
    • Positive: Team player, strategic, and cooperative.
    • +
    • Negative: May be overly reliant on group decisions and struggle with independence.
    • +
    • Minor Trait: Team-oriented.
    • +
    • Major Disorder: Dependent Personality Disorder, characterized by over-reliance on group decision-making and lack of independence.
    • +
    + macros: [] + flags: {} + effects: [] + img: systems/sohl/assets/icons/wolf.svg + folderId: eJSuuML2ROg3V1W6 diff --git a/packs/generate/legendary/leg-mysteries/data/mysticalabilities.yaml b/packs/generate/legendary/leg-mysteries/data/mysticalabilities.yaml new file mode 100644 index 0000000..283cd93 --- /dev/null +++ b/packs/generate/legendary/leg-mysteries/data/mysticalabilities.yaml @@ -0,0 +1,3584 @@ +- name: Absorb + id: 4cklnUPcocTdOXWu + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Aegis + id: 4rWnT58B2YitcEfB + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Alarm + id: DeH9CgHtTradgQc2 + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Alchema + id: fHOhMqgMbewSXuXT + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Amplification + id: f2kNbG0MoglMLN31 + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: ampl + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Animus + id: CY6DBviTrF8kHSS3 + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Anvil + id: fxrQq44b4ADvahoY + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Armor + id: Zt3TZ2L5r7lS8Ow1 + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Aspect + id: 5NBX1wp4qSgXFLuU + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Assemble + id: Fxg6egfBMgjnNS0C + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Attune + id: 9cCLFKO2RETwPPuc + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Aural Blast + id: 915ZpuLQM6j7Lmpu + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Balm + id: NOsSmUI9oIcVWg3M + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Bane + id: KOpWN5lb4ia3cHo9 + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Basalm + id: DUdQb72xTCsBlYBo + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Beacon + id: SNZXHUNn7ZJuoyYR + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Beam + id: b5dYBcfSkfAO6skZ + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Beckon + id: IhZX7McIszH92nPQ + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Brand + id: lII4PIV0ubNeG74j + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Breath of Dhivu + id: 8SSaJWbQlr3LDRUM + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Bubble + id: 8Iy5mdmNztwkGPXg + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Burn + id: u8hT18FgSkLY19ez + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Call + id: PXULYbMmLbbrMg9w + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Calm + id: PeK6q0w3kEgsuizC + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Candor + id: 1nZ5JLdUKzxDC5J0 + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Caress + id: RaAWytgUhHcoTaQ0 + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Cecity + id: q20iSXHQBL1h42TY + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Chain + id: ZZV4FwkGo9IWvRBi + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Charge + id: jvYYWVvROqBNx4xx + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Charm + id: CI9E4FD108ZM2CnU + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Clairvoyance + id: N2SuuuRJq86wgYy6 + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: clrv + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Cloak + id: X9BIekcWvIEgvoJP + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Condensation + id: YZ8ZCQnQibeONXc5 + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Conflagration + id: HKWL5hJh4F4UKQGt + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Confusion + id: WsvBfMmG3Q2hgdeS + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Conjure + id: IXxyNHy1It9Og2VG + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Converse + id: MvTVrdynlQF2CqkE + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Convoke + id: vShtkIDWTbkjcZSk + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Cooling + id: 2M689o5LuNZUd2bE + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Counter + id: Dyw5wQ6omn2ar1sG + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Crystals + id: JFyKL4GouBLYOoza + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Curtain + id: LGmQXvPQtiaCyxSD + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Dart + id: oMwdl70b2uP8XE1y + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Decay + id: Rn5TkoHUjQzy8xsL + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Desiccation + id: rtiWd0bR7EyLXHfB + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Detect + id: w3gqLC16lNGXIkwm + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Diagnosis + id: yJA2ul6TSfeAABnf + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Disembodiment + id: q282j5zXN7yLMo70 + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: dsbd + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Dispel + id: t3WjLPazVJ2txXW2 + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Distort + id: 5N2iVqEOuPNILfeT + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Diversion + id: ZohkOV86vqtKoT7J + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Doom Curtain + id: MxDw4xt3jVBJQ7DX + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Doom Flame + id: v7FPUBi92oDck5UK + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Dowsing + id: A68qXZ5QfGVD3hix + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Earthwork + id: gjCry74FtWuhBGGY + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Elemental Bolt + id: gDV7D2Cmb3Ww5sBe + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: eblt + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Enervation + id: NNuUGcCZk1FgGUlb + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Enigma + id: 7rupfaG2Ozl1csPN + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Enrichment + id: y05pfQtRevRkvwUc + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Enthral + id: nDJ1yTJ6OYad1ZQM + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: enth + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Envelope + id: PJ2Z5nmj9flqfBnL + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Extratemporality + id: GRInCl46OtvsjWRe + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: xtratemp + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Eyes + id: 2EitMhTLIk7rUDav + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: False Soul + id: 06VXNQr0zZAkUDQj + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Feel + id: 2EEfVNZvBlhrvEu3 + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Fervor + id: GEPXDZDxV5P6bu0Y + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Fever + id: QUIc42B44yo3yuy0 + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Figure + id: r6Tsn2wZpjCV9BL7 + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Fire Fiend + id: i8TCVZ58VDyZHwoV + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Fireworks + id: XZTdBIZ4IvRSdYQ1 + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Fist + id: xblfM9oiHccCQ8I4 + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Flame + id: uxBGtKxkIMylgjDw + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Flash + id: T2b97OcmVQaPPvDU + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Floatation + id: ZP4o5LVcv9L5IJeA + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Floe + id: 1AL3MdbG3qboSQ9o + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Focus + id: KEjp3ERVc82yK72o + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Forge + id: L1TwJzKMsqdFmynJ + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Fount + id: D7AmEtkHmw6J82C7 + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Freeze + id: BH8BdFUkA6lWOdnu + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Gate + id: n5wh31TKs62PrALm + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Gauntlet + id: a9upgqjJgZVDy0b0 + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Gills + id: IH7J1jKh0ORTG9Fg + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Glamour + id: LDmZilHpqqFh1WZO + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Globe + id: NuNEPI3lHcrZkfrU + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Gloomweb + id: 54KaLINTGG19HNCU + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Growth + id: osBJntGxM8K2V9NP + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Guardian + id: atwfc9lM9OnT4lKv + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Hand + id: hcsvUzdZZErbPF1H + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Harmony + id: ZEv9oDErodUgzc0F + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Hastening + id: j2lXh9gJQAPcH7rU + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Healing + id: pePR5Mx28MLY4Kgv + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: heal + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Heat + id: 4LJHumuc2RoXuuzU + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Hex + id: Iz2Lf8bESdZVpPZJ + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: hex + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Host + id: QPBV1eStrVM4gUJq + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Hunger + id: MrVTPN0oeMh8XLWj + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Hush + id: I6Lu7Q89YzepDFge + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Icewalk + id: oIeafW1cWNh3rRza + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Image + id: 7vZBy2CoXLnkn6zL + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Imbue + id: jW93Z3QMGkU4Zzg7 + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Immolation + id: nomkk6fTJg8Iy4VX + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Inquiry + id: dA2o3DXEJpdvk1a8 + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Insight + id: fn4UG5yA494XzOMd + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Investment + id: HKLL5igfb4FumAtR + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Key + id: LNewH8bidhMygBXJ + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Lance + id: 9HMnaGx1T7bMTRos + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Lens + id: JnwmH3vGjqd2wudU + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Link + id: qUJbuBXZzC1nbovf + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Lustre + id: Sp97AeVclUVxJfSx + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Mantle + id: hHgnNsLcgLXjmioB + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Mask + id: BKyySEZ0VurkgFaW + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Medium + id: 1en6JNnWt9zGfQxn + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: medm + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Meld + id: U9f6mY1e1XyNjHRA + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Mend + id: 3QXOH70UQvBERPtC + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Mephitis + id: ZOmP9gt2NWEp1j02 + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Metal + id: 2o9BR3Yq5dIFaxYd + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Meteor + id: YIs3bURpEHC54DcM + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Mirror + id: vbqeHTlmObvyegWR + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Missive + id: IRMCs3JdVLYQCycF + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Mold + id: DHxJc5j9BztOJEzY + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Moniter + id: 7BlPspbVilTiVqyL + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Motes + id: U8Tfw6JUQZqF6P7Z + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Muffle + id: xM9jLJT7nDyy8dSl + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Natural Attunement + id: zM3QEMALDimIYvac + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: natn + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Negation + id: ABd6DgjjBbcN8FjE + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: negx + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Nightmare + id: R7yrj8szcqUFX8nv + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Nurture + id: jCURkbYXXmNa2JuE + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Obedience + id: kZ50t4Hak9jFKwEP + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Pall + id: 2PD424q1BTHukOyS + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Palm + id: 8hM5dok9IkReGrcF + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Panic + id: pnj7TncorSyRuvdL + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Passage + id: mkLoQdUZm8T0i841 + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Personality + id: tRiLtQ7C5EKYVZIu + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Perspective + id: oxRe09hrasyj8auL + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Persuasion + id: eo3Ea0xBMZmqBhBg + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Petrification + id: ylSLZHWmNiiO270N + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Physique + id: hfrErdURk7bVOstR + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Pocket + id: LOL0hO2nhoIXVKyH + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Pool + id: klV3yGAsX33EM2l2 + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Pox + id: UkIh8mL8MngvvBxZ + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Prescience + id: wFQGHGOjYdp98VlC + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: psnc + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Prism + id: GonumZZ1ih1BVGgW + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Protection + id: 7NvRLREmWG5n5IP3 + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Psychometry + id: nh4gsSvE5XhQEQ5X + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: phyc + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Pyre + id: cy1KEa0UjiRfqea3 + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Quenching + id: 5DFpPv4FTZ0jwB7r + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Quill + id: umSVwBGL3pIErzu8 + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Rampart + id: RLfQpp8hmujnbKf0 + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Recollection + id: YKkZRSkYU7mx5kcV + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Redoubt + id: o2f53g7hqpHCUAOH + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Regenisis + id: qQAh0uz82XptjugF + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Resolve + id: Zb4XmgAkGUClnt42 + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Rest + id: vkhu5G6CqNzMHHAO + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Restoration + id: KUGAAtAfER0lzBYy + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Resurge + id: UvR8MDjZlg8I3GEX + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Reveal + id: KMJWNFq4N9lyGhRS + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Revelation + id: BBQgaHvKfgWP0J91 + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Reverse + id: 0W8glgkZ21C9NvQM + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: River + id: UnOrHN4Lmfq26Cpn + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Rupture + id: TvEMzoTWZzhN8IBc + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Sanctum + id: wwA0PHaLfDFUwVMz + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Screen + id: jRy4NPaJyg9u3mJR + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Seeker + id: r6nslXZcWo7AUpGQ + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Sensation + id: qLBwbW8AQBquZWz9 + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Sensitivity + id: GvNrbskSwZjdAamV + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: snst + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Shadow + id: kRjDRbd8bDVcrTBv + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Shape + id: wBb4AKwG3sS8VuB5 + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Shatter + id: O0x7OTeI2EEon89p + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Shooting Star + id: sAuSt7Xy13syOFJz + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Shroud + id: 1cesq94m43S9eMQI + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Sight + id: uEnxf7vF4YmL2S58 + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Singing Sword + id: OpZ3MKsZQQncRe94 + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Skin + id: p5lbEKLL77uX7IjS + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Slumber + id: 51YJZfeaEUTUJ4k9 + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Snowball + id: c6yEvNaz2gvhCzSH + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Solace + id: PyuWTWox3Qo2oVfF + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Sound + id: fOewhoOAuZfGeDsP + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Sphere + id: kkFwQo9vfwEjpZqh + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Spirit + id: lKVbkvzIGDFCC3UI + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: sprt + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Sponge + id: ZMFOLOH2ycRK9sCj + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Spoon + id: BE88Hbv0bK1RfujF + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Stay + id: KL07NqGaYSDnzTtK + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Steel + id: bNuxM9BBWfGMcg9k + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Subvert + id: DOuooLC1vmHMC5By + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Succour + id: a9zpuSd4JBmB8rHI + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Suggestion + id: MKFGj6l9AyUHpb19 + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Survey + id: qyTJ6DQxlh2lYx83 + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Sweat + id: 9vcb21xBdKxEfT8j + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Swordbreaker + id: LEFwZkpUz9kdwQOA + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Syncope + id: HddpzPlLN7K5RU8v + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Tap + id: bTmEYm5rbRbjYt8r + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Telekinesis + id: NDRL0yD5OPELKNBM + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: telek + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Telepathy + id: 1yyCbhSjbki38JNd + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: telp + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Tempering + id: ftyx0YdxOBcXppkF + img: systems/sohl/assets/icons/anvil.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: jmorvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: 8iCp9ElYOPcPrE59 +- name: Thirst + id: rDBOa919PgsSBlUQ + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Thought + id: zLzo8ELZGI8qVdw0 + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Tide + id: eK3LH3Yeuc73HdIn + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Tone + id: R4lKLay2mZcbJ18A + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Transfer + id: bffz8KJRcllW5dnJ + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Transference + id: RPAfGBjZbNsYCfn8 + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: trnsf + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Transmutation + id: mW6pCO4zFiwfJFhA + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: xmut + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Tremor + id: SiEUZZSQnVGG44Dm + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Trigger + id: ZmUxLCHuzUPdPfrm + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Tube + id: ozT5yQWbnprGjLhe + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Tunnel + id: bNggK0zh2JHNu6KR + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Unveiling + id: MeDHn0pUNiYUxExG + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Vapour + id: ExmlUPLgGSJniuot + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Veil + id: M3bBlyF39MtzQPSD + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Vessel + id: QT3FEq9aroxJPaP8 + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Victual + id: DAD2bDrEe7pGrhew + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: View + id: XOlCvcR8a001X93n + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Vine + id: BJGJ2aitu2rIsbzb + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Visnomy + id: lPKkHezbjh7kymzb + img: systems/sohl/assets/icons/psionics.svg + subType: arcanetalent + abbrev: vsnm + skillBaseFormula: '@aur, @wil' + domain: "" + level: 0 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg +- name: Voice + id: Gkl82efMX2SCkGhF + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Vortex + id: RGeAyOdiU5RHLGfB + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Wall + id: Da3ERtYbqZrjaeov + img: systems/sohl/assets/icons/fire.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: peleahn + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: o4FdHOz6uN8hxo99 +- name: Ward + id: 7MdmH180C57trJ1m + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 2 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Warp + id: 4WSxiA5ySlf6jb1A + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Wasting + id: lsOd0Ta0cL0DoqOF + img: systems/sohl/assets/icons/tree.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: fyvria + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: OVnl7dt16e0W1noV +- name: Waterwalk + id: 9r3e5WaHU9WK97yX + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Wave + id: UhMOQxXesBtvqePa + img: systems/sohl/assets/icons/water.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: odivshe + level: 5 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: uPcOyKGtVi0qnGTR +- name: Well + id: XE7xdSOYuYse055V + img: systems/sohl/assets/icons/circle.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: neutral + level: 4 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: RpuF61QnMRyujYaM +- name: Whisper + id: vm5f8mrpSO1q3BbV + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 1 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Wind + id: bcss8Ae9ZrrgvDBU + img: systems/sohl/assets/icons/wind.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: lyahvi + level: 6 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: ODuFSQKM8KJTQ7wQ +- name: Wisdom + id: mqWpROliaDMNGjp9 + img: systems/sohl/assets/icons/divination.svg + subType: arcaneincantation + abbrev: "" + skillBaseFormula: "" + domain: savorya + level: 3 + usesCharges: false + chargesValue: 0 + chargesMax: 0 + macros: [] + flags: {} + effects: [] + description: "" + folderId: BXfH5cKFM0lUbyhg diff --git a/packs/generate/legendary/leg-mysteries/generate-leg-mysteries.py b/packs/generate/legendary/leg-mysteries/generate-leg-mysteries.py new file mode 100755 index 0000000..7f5e4e9 --- /dev/null +++ b/packs/generate/legendary/leg-mysteries/generate-leg-mysteries.py @@ -0,0 +1,171 @@ +#!./venv/bin/python3 + +import yaml +import json +import argparse +from unidecode import unidecode +import re + +parser = argparse.ArgumentParser() +parser.add_argument("outputDir", help="folder where generated files should be placed") +args = parser.parse_args() + +stats = { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M", +} + +with open("./data/domains.yaml", "r", encoding="utf8") as infile: + domainsData = yaml.safe_load(infile) + +for domain in domainsData: + print(f"Processing Domain {domain['name']}") + fname = domain["name"] + "_" + domain["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": domain["name"], + "type": "domain", + "img": domain["img"], + "_id": domain["id"], + "_key": "!items!" + domain["id"], + "system": { + "notes": "", + "textReference": "", + "description": domain["description"], + "macros": domain["macros"], + "nestedItems": [], + "transfer": False, + "categories": domain["categories"], + "abbrev": domain["abbrev"], + "philosophy": domain["philosophy"], + }, + "effects": domain["effects"], + "flags": domain["flags"], + "_stats": stats, + "folder": domain["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/mysticalabilities.yaml", "r", encoding="utf8") as infile: + mysticalabilitiesData = yaml.safe_load(infile) + +for mysticalability in mysticalabilitiesData: + print(f"Processing Mystical Ability {mysticalability['name']}") + fname = mysticalability["name"] + "_" + mysticalability["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": mysticalability["name"], + "type": "mysticalability", + "img": mysticalability["img"], + "_id": mysticalability["id"], + "_key": "!items!" + mysticalability["id"], + "system": { + "subType": mysticalability["subType"], + "notes": "", + "textReference": "", + "description": mysticalability["description"], + "macros": mysticalability["macros"], + "nestedItems": [], + "transfer": False, + "abbrev": mysticalability["abbrev"], + "skillBaseFormula": mysticalability["skillBaseFormula"], + "masteryLevelBase": 0, + "improveFlag": False, + "domain": mysticalability["domain"], + "levelBase": mysticalability["level"], + "charges": { + "usesCharges": mysticalability["usesCharges"], + "value": mysticalability["chargesValue"], + "max": mysticalability["chargesMax"], + }, + }, + "effects": mysticalability["effects"], + "flags": mysticalability["flags"], + "_stats": stats, + "folder": mysticalability["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/mysteries.yaml", "r", encoding="utf8") as infile: + mysteriesData = yaml.safe_load(infile) + +for mystery in mysteriesData: + print(f"Processing Mystery {mystery['name']}") + fname = mystery["name"] + "_" + mystery["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": mystery["name"], + "type": "mystery", + "img": mystery["img"], + "_id": mystery["id"], + "_key": "!items!" + mystery["id"], + "system": { + "subType": mystery["subType"], + "notes": "", + "textReference": "", + "description": mystery["description"], + "macros": mystery["macros"], + "nestedItems": [], + "transfer": False, + "domain": mystery["domain"], + "skills": mystery["skills"], + "levelBase": mystery["level"], + "charges": { + "usesCharges": mystery["usesCharges"], + "value": mystery["chargesValue"], + "max": mystery["chargesMax"], + }, + }, + "effects": mystery["effects"], + "flags": mystery["flags"], + "_stats": stats, + "folder": mystery["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/folders.yaml", "r", encoding="utf8") as infile: + foldersData = yaml.safe_load(infile) + +for folder in foldersData: + print(f"Processing Folder {folder['name']}") + fname = folder["name"] + "_" + folder["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": folder["name"], + "sorting": "a", + "folder": folder["parentFolderId"] or None, + "type": "Item", + "_id": folder["id"], + "sort": 0, + "color": folder["color"], + "flags": {}, + "_stats": stats, + "_key": "!folders!" + folder["id"], + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) diff --git a/packs/generate/legendary/leg-mysteries/pack.properties b/packs/generate/legendary/leg-mysteries/pack.properties new file mode 100644 index 0000000..d4f7578 --- /dev/null +++ b/packs/generate/legendary/leg-mysteries/pack.properties @@ -0,0 +1 @@ +type=Item diff --git a/packs/generate/legendary/leg-possessions/data/armorgear.yaml b/packs/generate/legendary/leg-possessions/data/armorgear.yaml new file mode 100644 index 0000000..1f6d8d1 --- /dev/null +++ b/packs/generate/legendary/leg-possessions/data/armorgear.yaml @@ -0,0 +1,10300 @@ +- armorType: 3/4-Helm + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/crested-helmet.svg + value: 35 + weight: 5.3 + encumbrance: 0 + perception: -5 + abbrev: K34Hlm + material: Kûrbúl + flexloc: [] + rigidloc: + - Skull + - Nose + - Right Cheek + - Left Cheek + - Right Ear + - Left Ear + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 35 + origWeight: 5.3 + name: Kûrbúl 3/4-Helm + id: YOZl5DpjLiTwIj0I + durability: 13 + encumbranceEffectId: om503NyxNTiro5AI + perceptionEffectId: 0I6fhc9Z3b2XqWQo + createdEventId: UDyXYQynbgumxkHX + description:

    The Kûrbúl 3/4-Helm offers a unique blend of protection and distinctive style. Made from treated leather known as Kûrbúl, this helm covers a significant portion of the head and face while remaining relatively lightweight. Its design includes reinforced ridges and elaborate embossing, catering to those who require both function and a touch of visual impact.

    + macros: [] + flags: {} + effects: [] +- armorType: 3/4-Helm + detailMaterial: Plate + img: systems/sohl/assets/icons/crested-helmet.svg + value: 140 + weight: 5.3 + encumbrance: 0 + perception: -5 + abbrev: Pl34Hlm + material: Plate + flexloc: [] + rigidloc: + - Skull + - Nose + - Right Cheek + - Left Cheek + - Right Ear + - Left Ear + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 140 + origWeight: 5.3 + name: Plate 3/4-Helm + id: rKuSn4P5aQVNWZ5y + durability: 14 + encumbranceEffectId: 4t92kOtS9H2l8NaD + perceptionEffectId: eZcoxuHeKwR4Tf9k + createdEventId: m4Hw3LL2HuQoXIc2 + description:

    The Plate 3/4-Helm is crafted from solid steel and covers the head and most of the face, leaving only a narrow slit for visibility. It is a mainstay for knights and heavily armored warriors, offering maximum protection. The helm is often adorned with simple engravings and a smooth, polished surface that reflects the sun on the battlefield, intimidating foes with its robust appearance.

    + macros: [] + flags: {} + effects: [] +- armorType: Ailettes + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/dorsal-scales.svg + value: 15 + weight: 1.1 + encumbrance: 1.67 + perception: 0 + abbrev: KAil + material: Kûrbúl + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 15 + origWeight: 1.1 + name: Kûrbúl Ailettes + id: 5HDZ9u3e0IXk2ECC + durability: 13 + encumbranceEffectId: 22zAdOvSF0jp5uB4 + perceptionEffectId: SCoNvEepBRNO2rqZ + createdEventId: UfGPOtM7L3wtGJAf + description:

    Kûrbúl Ailettes are lightweight leather shoulder guards treated for added durability. They are decorated with intricate patterns or the wearer's heraldic symbols, making them both protective and ornamental. These ailettes attach to the shoulders, providing an extra layer of defense without adding substantial weight, ideal for agile combatants.

    + macros: [] + flags: {} + effects: [] +- armorType: Ailettes + detailMaterial: Plate + img: systems/sohl/assets/icons/dorsal-scales.svg + value: 60 + weight: 1.1 + encumbrance: 1.67 + perception: 0 + abbrev: PlAil + material: Plate + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 60 + origWeight: 1.1 + name: Plate Ailettes + id: ushpz9bwNavj7xxt + durability: 14 + encumbranceEffectId: gQyloNZEMRRLErQZ + perceptionEffectId: SXQpRmmKGP8frOKA + createdEventId: l9yaQuGjxXwbv0SR + description:

    These Plate Ailettes are crafted from sturdy steel and designed to attach to the shoulders, offering robust protection against strikes. Their flat, broad surfaces make them perfect for displaying heraldic symbols or intricate etchings, blending functionality with a warrior's pride in their lineage.

    + macros: [] + flags: {} + effects: [] +- armorType: Apron + detailMaterial: Linen + img: systems/sohl/assets/icons/apron.svg + value: 5 + weight: 1.1 + encumbrance: 0 + perception: 0 + abbrev: LApn + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 10 + origWeight: 4.4 + name: Linen Apron + id: CkqXyPvUwTvplO4n + durability: 5 + encumbranceEffectId: xRr9adppOFwKtFu3 + perceptionEffectId: olNj9gxknBgaKZyR + createdEventId: ZhhAaEDOIg8W2G7U + description:

    A simple Linen Apron is light, breathable, and perfect for daily chores or cooking. It's made from high-quality linen that is both durable and easy to clean, making it a staple for households and artisans alike.

    + macros: [] + flags: {} + effects: [] +- armorType: Apron + detailMaterial: Serge + img: systems/sohl/assets/icons/apron.svg + value: 6 + weight: 2.2 + encumbrance: 0 + perception: 0 + abbrev: SgApn + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 10 + origWeight: 4.4 + name: Serge Apron + id: h5Iz2lzNMdfzQPhr + durability: 7 + encumbranceEffectId: diynHzIaRSNzo7Fm + perceptionEffectId: 1hEX4g4wNQH9ORLe + createdEventId: whIloTU7nesTkf3q + description:

    The Serge Apron is designed for tougher tasks, woven from a durable, diagonal-twilled fabric. This apron can withstand heavy wear and tear while remaining comfortable and functional for labor-intensive activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Apron + detailMaterial: Silk + img: systems/sohl/assets/icons/apron.svg + value: 90 + weight: 2.2 + encumbrance: 0 + perception: 0 + abbrev: SlApn + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 10 + origWeight: 4.4 + name: Silk Apron + id: pCjc87Ier1Gz0TUq + durability: 7 + encumbranceEffectId: 4BpsChKgFzWfjxBa + perceptionEffectId: 6lvRd6OBQ68vFYIg + createdEventId: xPQ9ti9vxykcBHes + description:

    A Silk Apron offers a touch of luxury to mundane tasks. While not particularly durable, its soft, smooth texture is perfect for formal settings or lightweight activities where appearance matters more than ruggedness.

    + macros: [] + flags: {} + effects: [] +- armorType: Apron + detailMaterial: Velvet + img: systems/sohl/assets/icons/apron.svg + value: 35 + weight: 4.4 + encumbrance: 0 + perception: 0 + abbrev: VApn + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 10 + origWeight: 4.4 + name: Velvet Apron + id: R45shVCeqZSqpozQ + durability: 10 + encumbranceEffectId: u3eKjQUJuMX80STr + perceptionEffectId: CWD2u8RpHJKZH6q1 + createdEventId: kWDyhWTAJ05yWE5A + description:

    The Velvet Apron exudes elegance and refinement, though it is more for show than practical use. Soft and plush, it’s an ideal accessory for high-status individuals partaking in light duties, adding a regal touch to their attire.

    + macros: [] + flags: {} + effects: [] +- armorType: Apron + detailMaterial: Worsted + img: systems/sohl/assets/icons/apron.svg + value: 24 + weight: 3.5 + encumbrance: 0 + perception: 0 + abbrev: WApn + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 10 + origWeight: 4.4 + name: Worsted Apron + id: dAj4NC7jP7jp08Xr + durability: 9 + encumbranceEffectId: cKF6WRji2rWLBny8 + perceptionEffectId: i63dB6v1bNnIze8h + createdEventId: cG01itSM701jItil + description:

    The Worsted Apron is crafted from tightly-spun wool fibers, offering durability and resistance to moisture. It's ideal for tasks that require both comfort and a bit more resilience than lighter fabrics can provide.

    + macros: [] + flags: {} + effects: [] +- armorType: Apron + detailMaterial: Leather + img: systems/sohl/assets/icons/apron.svg + value: 160 + weight: 3 + encumbrance: 0 + perception: 0 + abbrev: LtApn + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 80 + origWeight: 5 + name: Leather Apron + id: 7aLcPwvlr2FCWZ3V + durability: 9 + encumbranceEffectId: 98gcPcCdNIxrgSWB + perceptionEffectId: Yw9jyLfpywwhqJLY + createdEventId: 9K8ZlctvSfYAo7Gz + description:

    A Leather Apron combines style and a bit of practical protection for craftsmen and artisans. Soft and pliable, it's more about looking the part than offering significant defense against nicks and scrapes.

    + macros: [] + flags: {} + effects: [] +- armorType: Blacksmith Apron + detailMaterial: Rawhide + img: systems/sohl/assets/icons/apron.svg + value: 80 + weight: 5 + encumbrance: 0 + perception: 0 + abbrev: RhApr + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 80 + origWeight: 5 + name: Rawhide Blacksmith Apron + id: 8P1qXxWez6hM15T3 + durability: 11 + encumbranceEffectId: isLWhMvFtdJZ8E32 + perceptionEffectId: wcplHKIznnCkK7FJ + createdEventId: csp9wJs14YLb4LtN + description:

    The Rawhide Blacksmith Apron is built for heavy-duty protection. Thick and rugged, it guards against sparks, heat, and sharp objects, making it the go-to choice for blacksmiths and other metalworkers who need serious armor for their craft.

    + macros: [] + flags: {} + effects: [] +- armorType: Bracers + detailMaterial: Leather + img: systems/sohl/assets/icons/bracer.svg + value: 40 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: LtBrcr + material: Leather + flexloc: + - Left Forearm + - Right Forearm + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 20 + origWeight: 0.8 + name: Leather Bracers + id: nXyfzSfZiYDf1kbd + durability: 9 + encumbranceEffectId: AMN4sWAJyUi60tiS + perceptionEffectId: tu4ZKrC6QZusS6W2 + createdEventId: LFsqsWdDUnkLgS3s + description:

    Leather Bracers provide a stylish and functional choice for arm protection. Made from lightweight leather, they offer some defense against minor injuries while allowing for full flexibility and movement.

    + macros: [] + flags: {} + effects: [] +- armorType: Bracers + detailMaterial: Rawhide + img: systems/sohl/assets/icons/bracer.svg + value: 20 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: RhBrcr + material: Leather + flexloc: + - Left Forearm + - Right Forearm + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 20 + origWeight: 0.8 + name: Rawhide Bracers + id: 9VlsyPGnunjX7FAJ + durability: 11 + encumbranceEffectId: xdBkVJsQYIQzJZYY + perceptionEffectId: tfQA10soEKri1F7W + createdEventId: JpUZSBS9kWexN3mO + description:

    Rawhide Bracers are robust and sturdy, made from thick, untanned leather. They provide significant protection for the forearms, ideal for warriors who foresee close combat and need more durable defense.

    + macros: [] + flags: {} + effects: [] +- armorType: Breastplate + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/breastplate.svg + value: 60 + weight: 4.5 + encumbrance: 5 + perception: 0 + abbrev: KBrst + material: Kûrbúl + flexloc: [] + rigidloc: + - Thorax + - Abdomen + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 60 + origWeight: 4.5 + name: Kûrbúl Breastplate + id: 4zNNtqfDKrkWC4YJ + durability: 13 + encumbranceEffectId: K3DKo7tmYS0FThzt + perceptionEffectId: 01IJlQFKkrHi4oGH + createdEventId: slsmDjlSPQbrstlr + description:

    The Kûrbúl Breastplate is crafted from specially treated leather, offering moderate protection while maintaining a lightweight feel. Decorated with intricate designs, it serves those who need agility without sacrificing too much defense.

    + macros: [] + flags: {} + effects: [] +- armorType: Breastplate + detailMaterial: Plate + img: systems/sohl/assets/icons/breastplate.svg + value: 240 + weight: 4.5 + encumbrance: 5 + perception: 0 + abbrev: PlBreast + material: Plate + flexloc: [] + rigidloc: + - Thorax + - Abdomen + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 240 + origWeight: 4.5 + name: Plate Breastplate + id: uGYeMubD0j1coWa9 + durability: 14 + encumbranceEffectId: bBCPaGqUUveroDak + perceptionEffectId: UsKmxHK3bZWLBr3f + createdEventId: Jpl9ESimJ5rQEJLy + description:

    Made from solid steel, the Plate Breastplate provides maximum torso protection. It’s the cornerstone of knightly armor, designed to deflect blows and prevent penetration from weapons, though it sacrifices mobility for defense.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Homespun + img: systems/sohl/assets/icons/leggings.svg + value: 5 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: HsBrch + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 17 + origWeight: 0.9 + name: Homespun Breeches + id: KsaMy7oG2JlxQN3o + durability: 5 + encumbranceEffectId: tWqYoLVa11q5qnhi + perceptionEffectId: PY8WiY5t9ZAOXg5S + createdEventId: rk1jkUzrtZBKlMAC + description:

    Homespun Breeches are simple, utilitarian trousers made from rough, homemade fabric. They are comfortable and durable for everyday wear, especially practical for laborers and farmers.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Linen + img: systems/sohl/assets/icons/leggings.svg + value: 9 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: LnBrch + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 17 + origWeight: 0.9 + name: Linen Breeches + id: rIEAGMktathHSAeG + durability: 5 + encumbranceEffectId: tES8RIGGZDIfInDh + perceptionEffectId: N5V2Wv0fHjANh4PB + createdEventId: 61XbIKOM92oLQs6e + description:

    Linen Breeches are crafted from light, breathable linen, perfect for warm climates or strenuous activities. They offer comfort and ease of movement, suitable for both casual and more active pursuits.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Russet + img: systems/sohl/assets/icons/leggings.svg + value: 20 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: RBrch + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 17 + origWeight: 0.9 + name: Russet Breeches + id: rsRNAJUKs9S49Ve2 + durability: 7 + encumbranceEffectId: HTgREKFyuDnx3dzs + perceptionEffectId: Yoi83madQIJwECU1 + createdEventId: yb7tmkeNnKDVphK0 + description:

    Russet Breeches, dyed a reddish-brown color, are sturdy and practical. Made from coarse wool, they provide warmth and durability, making them ideal for colder weather and rougher environments.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Serge + img: systems/sohl/assets/icons/leggings.svg + value: 10 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: SgBrch + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 17 + origWeight: 0.9 + name: Serge Breeches + id: 0ULai2IUT2mXgHVX + durability: 7 + encumbranceEffectId: 4D0oVoQgp3IqJeA3 + perceptionEffectId: AxIQt4rfwWNCRgDX + createdEventId: brC24aEhk7QvtQi0 + description:

    These Serge Breeches are made from a durable, twilled fabric, offering both comfort and resilience. Suitable for a variety of activities, they are a common choice for those who need reliable, everyday attire.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Velvet + img: systems/sohl/assets/icons/leggings.svg + value: 60 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: VBrch + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 17 + origWeight: 0.9 + name: Velvet Breeches + id: sf0pFkfy2FqnYzEi + durability: 10 + encumbranceEffectId: 31E25DICEmZ75hSY + perceptionEffectId: AOtAbyMy7Vs3VTd4 + createdEventId: M9Rvy5BarPak3C4G + description:

    Velvet Breeches bring a touch of luxury to any outfit. Soft and smooth, they are perfect for high-status events or court appearances, where style and impressiveness are more important than durability.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Worsted + img: systems/sohl/assets/icons/leggings.svg + value: 41 + weight: 0.7 + encumbrance: 0 + perception: 0 + abbrev: WBrch + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 17 + origWeight: 0.9 + name: Worsted Breeches + id: D8wScWxxKsQbiwEc + durability: 9 + encumbranceEffectId: nYfQgn9tRzfDDmE4 + perceptionEffectId: 3GCNjuCtiWzxFcXE + createdEventId: aV7fe0df9wdQz3wt + description:

    Worsted Breeches are made from tightly-spun wool fibers, providing a durable yet comfortable garment. They are ideal for those in need of attire that looks good and holds up under regular wear and tear.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Leather + img: systems/sohl/assets/icons/leggings.svg + value: 192 + weight: 2.2 + encumbrance: 0 + perception: 0 + abbrev: LtBrch + material: Leather + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 96 + origWeight: 3.6 + name: Leather Breeches + id: GZjVef08RE8hsNzh + durability: 9 + encumbranceEffectId: oCyRWA4Ra6wnE29f + perceptionEffectId: vSBA5WiBPUWoD8pP + createdEventId: DXOaZS2McwFmQtHf + description:

    Leather Breeches are stylish and offer a touch of rugged flair. Lightweight and supple, they allow for a full range of motion while adding a bit of protective value for light adventuring or everyday wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Buckram + img: systems/sohl/assets/icons/leggings.svg + value: 17 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: BBrch + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 17 + origWeight: 0.9 + name: Buckram Breeches + id: 4E8BmnpoDJgDU2EC + durability: 10 + encumbranceEffectId: IRgrMSvYZOQR6ZpT + perceptionEffectId: 6c9WeXrKnAgL8Y68 + createdEventId: 7Iv4HSRSqKL9rYNR + description:

    Buckram Breeches are stiff and durable, made from a coarse cloth stiffened with glue. They offer a structured fit and are particularly useful for activities requiring some degree of rigidity and support.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Cloth + img: systems/sohl/assets/icons/leggings.svg + value: 17 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: CBrch + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 17 + origWeight: 0.9 + name: Cloth Breeches + id: WfHMXxEw2SLgXos2 + durability: 10 + encumbranceEffectId: mMjjCcuNIwQEctfb + perceptionEffectId: ooD1YycQTLMPb2Ll + createdEventId: t0oKVbLUhbXsFZWG + description:

    Simple and versatile, Cloth Breeches are made from a variety of softer fabrics for everyday comfort. They provide a basic, practical option for daily tasks, suitable for a wide range of wearers.

    + macros: [] + flags: {} + effects: [] +- armorType: Breeches + detailMaterial: Rawhide + img: systems/sohl/assets/icons/leggings.svg + value: 96 + weight: 3.6 + encumbrance: 0 + perception: 0 + abbrev: RhBrch + material: Leather + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 96 + origWeight: 3.6 + name: Rawhide Breeches + id: C7ybxR6fnljMNbrF + durability: 11 + encumbranceEffectId: WlvbIlu1d2j3OexM + perceptionEffectId: jUeLqWLw8NX4FrFF + createdEventId: H3YcPhjEPLEAKuT5 + description:

    Rawhide Breeches are thick, rugged, and highly protective. Ideal for harsh environments or combat scenarios, they are less about comfort and more about standing up to the rigors of tough tasks.

    + macros: [] + flags: {} + effects: [] +- armorType: Byrnie + detailMaterial: Mail + img: systems/sohl/assets/icons/chain-mail.svg + value: 495 + weight: 14.9 + encumbrance: 5 + perception: 0 + abbrev: MByr + material: Mail + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 495 + origWeight: 14.9 + name: Mail Byrnie + id: f4ski9pjXqiAYgFL + durability: 13 + encumbranceEffectId: ICPAgajd8CtmqTXX + perceptionEffectId: gTEiGP24MF8eAH9C + createdEventId: 95h8nolJVdq3BTtN + description:

    The Mail Byrnie is a chainmail shirt offering significant protection. Its interlinked metal rings provide excellent defense against slashes and stabbing attacks while maintaining flexibility.

    + macros: [] + flags: {} + effects: [] +- armorType: Byrnie + detailMaterial: Scale + img: systems/sohl/assets/icons/scale-mail.svg + value: 330 + weight: 18.2 + encumbrance: 10 + perception: 0 + abbrev: SByrn + material: Scale + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + blunt: 4 + edged: 8 + piercing: 5 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 330 + origWeight: 18.2 + name: Scale Byrnie + id: L3hWpDmw8jUWNkSe + durability: 14 + encumbranceEffectId: yiaH2xbHfIWQ7zNi + perceptionEffectId: AMAeOUQA9J09Dyvl + createdEventId: NKVNDfAUlFQAm76z + description:

    The Scale Byrnie consists of small, overlapping metal scales sewn onto a fabric or leather backing. It provides excellent protection and mobility, making it suitable for various combat situations.

    + macros: [] + flags: {} + effects: [] +- armorType: Calf Boots + detailMaterial: Worsted + img: systems/sohl/assets/icons/leather-boot.svg + value: 91 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: WCBoot + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 38 + origWeight: 1.2 + name: Worsted Calf Boots + id: XUPd8moTyonp9AQJ + durability: 9 + encumbranceEffectId: PheZsV1MiK8XsNjO + perceptionEffectId: WQty5yo5Dn6Au04G + createdEventId: wgSYivnnrDvH71YC + description:

    Worsted Calf Boots are fashioned from tightly-spun wool fabric, offering warmth and comfort. They are practical for cold weather, providing durable and reliable footwear.

    + macros: [] + flags: {} + effects: [] +- armorType: Calf Boots + detailMaterial: Leather + img: systems/sohl/assets/icons/leather-boot.svg + value: 152 + weight: 1.7 + encumbrance: 0 + perception: 0 + abbrev: LtCBoot + material: Leather + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 76 + origWeight: 2.9 + name: Leather Calf Boots + id: lTkXLYtgMgZqvmRs + durability: 9 + encumbranceEffectId: WGS2aU7tYDUaO7Jg + perceptionEffectId: i54sCGnjftvTIUpk + createdEventId: H5iN5y5d9wB8R5Yh + description:

    These Leather Calf Boots are made from lightweight, stylish leather, hugging your legs snugly just below the knee. A mix of modest protection and agile comfort, perfect for active adventurers.

    + macros: [] + flags: {} + effects: [] +- armorType: Calf Boots + detailMaterial: Cloth + img: systems/sohl/assets/icons/leather-boot.svg + value: 38 + weight: 1.2 + encumbrance: 0 + perception: 0 + abbrev: CCBoot + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 38 + origWeight: 1.2 + name: Cloth Calf Boots + id: cCSazzdnvGFl3tYJ + durability: 10 + encumbranceEffectId: DtncOtjIPPHQVDhE + perceptionEffectId: WXGJv8Hg0YkRQidw + createdEventId: Hk2GJ7qIe6QR8hKA + description:

    Cloth Calf Boots are light and breathable, made from various fabrics. They offer minimal protection but are extremely comfortable, ideal for casual wear or non-combat activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Calf Boots + detailMaterial: Rawhide + img: systems/sohl/assets/icons/leather-boot.svg + value: 76 + weight: 2.9 + encumbrance: 0 + perception: 0 + abbrev: LtCBoot + material: Leather + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 76 + origWeight: 2.9 + name: Rawhide Calf Boots + id: oOOMdsP9QBnFL6yp + durability: 11 + encumbranceEffectId: zl5fW6zXA1ml8ot3 + perceptionEffectId: sP1Yk3tq273q603P + createdEventId: 58mqFbPYMorbBbKc + description:

    Rawhide Calf Boots are rugged and durable, providing excellent protection against environmental hazards. They are heavier but great for those needing sturdy, reliable footwear for tough conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Homespun + img: systems/sohl/assets/icons/cap.svg + value: 1 + weight: 0.1 + encumbrance: 0 + perception: 0 + abbrev: HsCap + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 4 + origWeight: 0.2 + name: Homespun Cap + id: aaJpiVosRI1mXMTD + durability: 5 + encumbranceEffectId: KptyBRvf9SBzN38E + perceptionEffectId: 27b1rmNVk4TULCPs + createdEventId: qnGjn0IkpKOfzBqX + description:

    The Homespun Cap is a simple head covering made from homemade fabric. It provides basic warmth and protection from the elements, suitable for everyday wear by common folk.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Linen + img: systems/sohl/assets/icons/cap.svg + value: 2 + weight: 0.1 + encumbrance: 0 + perception: 0 + abbrev: LCap + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 4 + origWeight: 0.2 + name: Linen Cap + id: hB1N2rW7ZxOmC6kd + durability: 5 + encumbranceEffectId: Lucz9tMM1AK9TPYL + perceptionEffectId: UuNhuYMYkvI2Pp82 + createdEventId: x51jmW7eUYx91JrE + description:

    The Linen Cap is light and breathable, ideal for warmer weather. It offers modest protection from the sun and is perfect for casual or light-duty activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Russet + img: systems/sohl/assets/icons/cap.svg + value: 5 + weight: 0.1 + encumbrance: 0 + perception: 0 + abbrev: RCap + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 4 + origWeight: 0.2 + name: Russet Cap + id: 6Or3etIx6sOohX6W + durability: 7 + encumbranceEffectId: KXi2HcoSssIfSsBE + perceptionEffectId: zpze0duHKaGHixCg + createdEventId: 7YGYiagAruB809xN + description:

    A Russet Cap is made from coarse wool dyed reddish-brown. It offers warmth and durability, making it a practical choice for colder climates and rougher settings.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Serge + img: systems/sohl/assets/icons/cap.svg + value: 2 + weight: 0.1 + encumbrance: 0 + perception: 0 + abbrev: SgCap + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 4 + origWeight: 0.2 + name: Serge Cap + id: H8pD3qI2ZcXMeZLC + durability: 7 + encumbranceEffectId: Euw6VQ0VEGE0BsUb + perceptionEffectId: j33M840vggGxnVUy + createdEventId: v5Ek1HW58dzXO97A + description:

    The Serge Cap, made from durable twilled fabric, provides both comfort and resilience. It’s suitable for everyday use, offering a reliable head covering for various activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Velvet + img: systems/sohl/assets/icons/cap.svg + value: 14 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: VCap + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 4 + origWeight: 0.2 + name: Velvet Cap + id: mdr7FK9aysGCeN35 + durability: 10 + encumbranceEffectId: ecKWAgsVerKOsS1B + perceptionEffectId: ljXV8uYsa88LKmV9 + createdEventId: Hu7QkC6ePB0ey1ub + description:

    A Velvet Cap provides a touch of luxury with its soft, plush fabric. It is more of a status symbol than practical wear, perfect for formal settings and special occasions.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Worsted + img: systems/sohl/assets/icons/cap.svg + value: 10 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: WCap + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 4 + origWeight: 0.2 + name: Worsted Cap + id: Qwn5UsAO1F0EkDuG + durability: 9 + encumbranceEffectId: nudZNgeo6ajSFZOa + perceptionEffectId: 62tdbFiZ9JZA3QSf + createdEventId: OAdVeTIRkiielrXB + description:

    The Worsted Cap combines style and durability with its tight wool fabric. It’s a versatile choice, offering good protection and comfort for a range of activities and settings.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Beaver + img: systems/sohl/assets/icons/cap.svg + value: 48 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: BvCap + material: Leather + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 16 + origWeight: 0.6 + name: Beaver Cap + id: 11HXxzlylsxfNa2G + durability: 9 + encumbranceEffectId: WprTkNm886QKILEB + perceptionEffectId: ve9LqLPfpLWzSAiT + createdEventId: KAPI6nC2LhLFD7SC + description:

    The Beaver Cap is made from beaver fur, offering excellent warmth and a luxurious feel. It’s perfect for cold weather and high-status individuals looking for both comfort and style.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Ermine + img: systems/sohl/assets/icons/cap.svg + value: 96 + weight: 0.4 + encumbrance: 0 + perception: 0 + abbrev: ECap + material: Leather + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 16 + origWeight: 0.6 + name: Ermine Cap + id: seOVHUHCnS0Pal91 + durability: 7 + encumbranceEffectId: VGrQjI9n91gqIbS3 + perceptionEffectId: 57ebMoVBqcEo8KgX + createdEventId: 56zB1WgIMVK0njze + description:

    An Ermine Cap, made from the soft white fur of the ermine, signifies high status and wealth. It offers excellent warmth and a plush, luxurious texture, ideal for nobility.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Leather + img: systems/sohl/assets/icons/cap.svg + value: 32 + weight: 0.4 + encumbrance: 0 + perception: 0 + abbrev: LtCap + material: Leather + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 16 + origWeight: 0.6 + name: Leather Cap + id: WyI3frx1kYXVtbC3 + durability: 9 + encumbranceEffectId: sTRLLZCOCw66ELE1 + perceptionEffectId: b2zdCKprv4rOvfx3 + createdEventId: e5BACYboEbBjlzjk + description:

    A simple yet stylish Leather Cap, made from lightweight leather, provides basic protection from the elements. It’s suitable for everyday wear, offering both comfort and a touch of rugged charm.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Sealskin + img: systems/sohl/assets/icons/cap.svg + value: 48 + weight: 0.7 + encumbrance: 0 + perception: 0 + abbrev: SlCap + material: Leather + flexloc: + - Skull + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: gaC79vNjSo6VO6Ym + origValue: 16 + origWeight: 0.6 + name: Sealskin Cap + id: 3kemHP0L8lFHBIKZ + durability: 11 + encumbranceEffectId: tN8rJn4W7RofiuzI + perceptionEffectId: hS6fbwUX4cACM4DR + createdEventId: ykKcqsFIXdPTgEZ3 + description:

    The Sealskin Cap is waterproof and warm, made from treated seal fur. It’s perfect for harsh, wet conditions, providing excellent protection against wind and water.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Buckram + img: systems/sohl/assets/icons/cap.svg + value: 4 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: BCap + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 4 + origWeight: 0.2 + name: Buckram Cap + id: 8o8KhG0CfS49iKCF + durability: 10 + encumbranceEffectId: GA2qO57wZ8V5eJR2 + perceptionEffectId: 1aN7EVf60TvcATI3 + createdEventId: pVOya9SgiCbSEBKQ + description:

    The Buckram Cap is stiff and structured, made from coarse cloth stiffened with glue. It offers a durable, reliable head covering that holds its shape well.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Cloth + img: systems/sohl/assets/icons/cap.svg + value: 4 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: CCap + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 4 + origWeight: 0.2 + name: Cloth Cap + id: p7o5NPXPKcbUmV7U + durability: 10 + encumbranceEffectId: k2rWWF6f8uaRkXxp + perceptionEffectId: mP5XqAgdqG6wHgIu + createdEventId: e8puFzQ4af6IK806 + description:

    A Cloth Cap is simple and versatile, made from various soft fabrics. It offers basic comfort and protection, suitable for everyday activities and casual wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Rawhide + img: systems/sohl/assets/icons/cap.svg + value: 16 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: RhCap + material: Leather + flexloc: + - Skull + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 16 + origWeight: 0.6 + name: Rawhide Cap + id: Fa1kEtj1CenIKvzc + durability: 11 + encumbranceEffectId: kTbo90N4GlDORj8s + perceptionEffectId: aMD4CG53yLkLJRYz + createdEventId: eQhU2fzwKJbCCKfx + description:

    The Rawhide Cap is thick and rugged, providing substantial protection. It’s ideal for tough environments where a more durable head covering is necessary.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Padded + img: systems/sohl/assets/icons/cap.svg + value: 8 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: PCap + material: Padded + flexloc: + - Skull + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 8 + origWeight: 0.3 + name: Padded Cap + id: MzykBMvqECyB9AcH + durability: 10 + encumbranceEffectId: qMjIWFDhfQuXNLJC + perceptionEffectId: wREOPYiASQcU3uae + createdEventId: CGq6nDqTLXT5R5Fo + description:

    The Padded Cap provides cushioning and warmth. It’s ideal for wear under helmets or on its own, offering comfort and protection for both combat and daily use.

    + macros: [] + flags: {} + effects: [] +- armorType: Cap + detailMaterial: Quilted + img: systems/sohl/assets/icons/cap.svg + value: 16 + weight: 0.7 + encumbrance: 0 + perception: 0 + abbrev: QCap + material: Quilted + flexloc: + - Skull + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 16 + origWeight: 0.7 + name: Quilted Cap + id: S2ouH63cu5NZi7pw + durability: 11 + encumbranceEffectId: hqv4s2eRzgsjQ1IS + perceptionEffectId: 7ccNd6Xs0ne9nDcy + createdEventId: O94lT8hEMTHLEsWJ + description:

    A Quilted Cap, made with layers of fabric sewn together, offers excellent insulation. It’s perfect for cold weather, providing both warmth and comfort.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Homespun + img: systems/sohl/assets/icons/cloak.svg + value: 20 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: HsClk + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 66 + origWeight: 3.3 + name: Homespun Cloak + id: eRNAiiapC0nSyulD + durability: 5 + encumbranceEffectId: GuRdVIW0i24Ucsw2 + perceptionEffectId: DPIUnoTJzxDeZwII + createdEventId: TXKtcEYxifhm6OL1 + description:

    The Homespun Cloak is a practical and simple garment woven from homemade fabric. It provides basic protection against the elements, making it suitable for peasants and everyday wearers who need a reliable, no-frills outer layer.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Linen + img: systems/sohl/assets/icons/cloak.svg + value: 33 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: LClk + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 66 + origWeight: 3.3 + name: Linen Cloak + id: OtLxvuSKixlMiime + durability: 5 + encumbranceEffectId: 5gkx5kuljz3iqN1f + perceptionEffectId: vaLso9citSZ3H3Dc + createdEventId: ZM32O43GosQj4ZE4 + description:

    Light and breathable, the Linen Cloak is perfect for warmer climates. It offers a bit of sun protection without causing the wearer to overheat, making it ideal for casual strolls or outdoor work during mild weather.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Russet + img: systems/sohl/assets/icons/cloak.svg + value: 79 + weight: 1.7 + encumbrance: 0 + perception: 0 + abbrev: RClk + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 66 + origWeight: 3.3 + name: Russet Cloak + id: TPXTMxaLNZZYSsV6 + durability: 7 + encumbranceEffectId: Ud0ga1fVSS3oWtcB + perceptionEffectId: cdKRCq23j8b1C8Ij + createdEventId: Ojs0RcIOansneZCc + description:

    Crafted from coarse wool dyed reddish-brown, the Russet Cloak offers warmth and durability. It’s well-suited for colder weather and rougher outdoor environments, providing reliable protection for travelers and laborers alike.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Serge + img: systems/sohl/assets/icons/cloak.svg + value: 40 + weight: 1.7 + encumbrance: 0 + perception: 0 + abbrev: SgClk + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 66 + origWeight: 3.3 + name: Serge Cloak + id: 8c86eFn9CV8mGOwB + durability: 7 + encumbranceEffectId: 1MhjEgmwPOHfErtL + perceptionEffectId: 55zBcnDVIx8a9G2O + createdEventId: vsjbYNIT8OofQSw1 + description:

    The Serge Cloak is made from durable twilled fabric, making it both comfortable and resilient. It’s a versatile outer garment that provides good protection and can withstand the wear and tear of daily use.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Silk + img: systems/sohl/assets/icons/cloak.svg + value: 594 + weight: 1.7 + encumbrance: 0 + perception: 0 + abbrev: SlClk + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 66 + origWeight: 3.3 + name: Silk Cloak + id: XCy5hK6UksffdhVx + durability: 7 + encumbranceEffectId: 2ALFCKuypYGr4lLO + perceptionEffectId: rtdL3CuUwdVt1PBR + createdEventId: EQkpnWgKVzX01uvc + description:

    The Silk Cloak is a luxurious, lightweight garment designed for high-status individuals. While not particularly protective, its smooth texture and elegant drape make it perfect for formal events and special occasions.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Velvet + img: systems/sohl/assets/icons/cloak.svg + value: 231 + weight: 3.3 + encumbrance: 0 + perception: 0 + abbrev: VClk + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 66 + origWeight: 3.3 + name: Velvet Cloak + id: BkVQxeiABWCPXpxc + durability: 10 + encumbranceEffectId: oIpAqEruAhdZgCZG + perceptionEffectId: lH4gB0elL2djFczY + createdEventId: acLKTtkQyBb4qD8T + description:

    Soft and plush, the Velvet Cloak exudes opulence and refinement. It's designed more for show than for hardcore weather protection, perfect for nobility and high-status individuals making a grand impression.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Worsted + img: systems/sohl/assets/icons/cloak.svg + value: 158 + weight: 2.6 + encumbrance: 0 + perception: 0 + abbrev: WClk + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 66 + origWeight: 3.3 + name: Worsted Cloak + id: T0ZAzTBt45xyv6EW + durability: 9 + encumbranceEffectId: IgS34a91oYRvqeN4 + perceptionEffectId: X7do3Bl1AeAZHpx0 + createdEventId: Qn9EqFbD8zpSVINp + description:

    The Worsted Cloak, made from tightly-spun wool fibers, offers both style and durability. It's a practical, versatile choice that provides good insulation and resilience, suitable for a wide range of activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Beaver + img: systems/sohl/assets/icons/cloak.svg + value: 270 + weight: 3 + encumbrance: 0 + perception: 0 + abbrev: BvCloak + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 90 + origWeight: 3.8 + name: Beaver Cloak + id: OAbx7Ol3JomP8gsH + durability: 9 + encumbranceEffectId: JcrF0mkZhtgkm3V9 + perceptionEffectId: DPvRfGXF8UV4GZW4 + createdEventId: mbdRQyq1hbJpL4Ww + description:

    An excellent choice for cold weather, the Beaver Cloak is made from dense, luxurious beaver fur. It provides exceptional warmth and a touch of opulence, ideal for those in need of both function and high status.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Ermine + img: systems/sohl/assets/icons/cloak.svg + value: 540 + weight: 2.3 + encumbrance: 0 + perception: 0 + abbrev: ECloak + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 90 + origWeight: 3.8 + name: Ermine Cloak + id: gimEjGq6lMaDT3Nr + durability: 7 + encumbranceEffectId: XqkUmFJhtN67AQUT + perceptionEffectId: TUqcv6Kjr9bzrbSw + createdEventId: v5NoSgkFwyr3XJS3 + description:

    The Ermine Cloak, made from the soft white fur of the ermine, is a status symbol of nobility and wealth. Highly insulating and visually striking, it is perfect for the elite who require both warmth and a show of prestige.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Leather + img: systems/sohl/assets/icons/cloak.svg + value: 180 + weight: 2.3 + encumbrance: 0 + perception: 0 + abbrev: LtCloak + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 90 + origWeight: 3.8 + name: Leather Cloak + id: dggaeQTd2cu0mvkN + durability: 9 + encumbranceEffectId: DieuUqQwXVVd9wBx + perceptionEffectId: rDy0FWmhusMDPiZg + createdEventId: zNz4T93HqPsR6jmI + description:

    The Leather Cloak combines rugged style with practical protection against wind and light rain. This cloak is perfect for adventurers and travelers who need an outer garment that can withstand the elements.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Sealskin + img: systems/sohl/assets/icons/cloak.svg + value: 270 + weight: 4.6 + encumbrance: 0 + perception: 0 + abbrev: SlCloak + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: gaC79vNjSo6VO6Ym + origValue: 90 + origWeight: 3.8 + name: Sealskin Cloak + id: Am2OdM7ZD8wsJ077 + durability: 11 + encumbranceEffectId: 1Rzt9fDkvcXhdGAJ + perceptionEffectId: jK7X89EtYetHcQcP + createdEventId: AIRfOT2VSAPUrSrF + description:

    Water-resistant and extremely warm, the Sealskin Cloak is ideal for harsh, wet, and cold environments. It offers excellent protection against the elements, making it perfect for seafaring folk and those living in extreme conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Cloak + detailMaterial: Buckram + img: systems/sohl/assets/icons/cloak.svg + value: 66 + weight: 3.3 + encumbrance: 0 + perception: 0 + abbrev: BClk + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 66 + origWeight: 3.3 + name: Buckram Cloak + id: PicrlTatXdbwbD1u + durability: 10 + encumbranceEffectId: ktssNHLRyTaG2bLP + perceptionEffectId: zcK4x9KU1LDZp5bM + createdEventId: 7lyCxo0ta3jbaIoE + description:

    The Buckram Cloak is stiff and durable, made from coarse cloth stiffened with glue. It offers a structured fit and is suitable for activities requiring a more rigid, reliable garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Coat + detailMaterial: Homespun + img: systems/sohl/assets/icons/tunic.svg + value: 19 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: HsCoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 64 + origWeight: 3.2 + name: Homespun Coat + id: gWzRhzl7rCo8oIFL + durability: 5 + encumbranceEffectId: cMLohErYu9y4QtW3 + perceptionEffectId: DoczV7EIMi4CSBII + createdEventId: fXyhRDhsQK6hEWJb + description:

    A Homespun Coat is a basic, utilitarian outer garment woven from homemade fabric. It provides warmth and a simple layer of protection, ideal for everyday use by common folk.

    + macros: [] + flags: {} + effects: [] +- armorType: Coat + detailMaterial: Linen + img: systems/sohl/assets/icons/tunic.svg + value: 32 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: LCoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 64 + origWeight: 3.2 + name: Linen Coat + id: J3tbAIB2Te3Ac9Z3 + durability: 5 + encumbranceEffectId: f9E8iO3HWyLhkl9D + perceptionEffectId: BvlFeuP0WNtPklJu + createdEventId: Vka3RMvK0N01Qi7K + description:

    Light and breathable, the Linen Coat is suitable for warmer weather. It offers a bit of protection while remaining comfortable, perfect for casual or light-duty wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Coat + detailMaterial: Silk + img: systems/sohl/assets/icons/tunic.svg + value: 576 + weight: 1.6 + encumbrance: 0 + perception: 0 + abbrev: SlCoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 64 + origWeight: 3.2 + name: Silk Coat + id: flS3J1XGt1fcUrFa + durability: 7 + encumbranceEffectId: Hn9lHstp5Ocgj1wd + perceptionEffectId: GQmAnR27qh1UFOIe + createdEventId: 2MFXKUtpS5ywTNY3 + description:

    A Silk Coat offers a touch of elegance and luxury. While not very durable, it’s perfect for formal events and special occasions, where appearance trumps practical protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Coat + detailMaterial: Worsted + img: systems/sohl/assets/icons/tunic.svg + value: 154 + weight: 2.6 + encumbrance: 0 + perception: 0 + abbrev: WCoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 64 + origWeight: 3.2 + name: Worsted Coat + id: sweAj8dG7Nt3ePZp + durability: 9 + encumbranceEffectId: gQgsdGKr98KiEu2r + perceptionEffectId: NHxb9aT3A1GemDQI + createdEventId: 4KIItCQxtuLNvprZ + description:

    The Worsted Coat, made from tightly-spun wool, provides comfort and durability. It’s a versatile choice that offers good insulation and reliable protection for various activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Coat + detailMaterial: Buckram + img: systems/sohl/assets/icons/tunic.svg + value: 64 + weight: 3.2 + encumbrance: 0 + perception: 0 + abbrev: BCoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 64 + origWeight: 3.2 + name: Buckram Coat + id: EducFdpwgE7VFPuA + durability: 10 + encumbranceEffectId: mH2DKZNrM0EgoLiK + perceptionEffectId: tVqYibR2rZnyGG5U + createdEventId: VBPURkUMrOX19K1Z + description:

    The Buckram Coat is stiff and structured, offering a durable, reliable outer layer. Made from coarse cloth stiffened with glue, it’s suitable for activities requiring a more rigid garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Coat + detailMaterial: Cloth + img: systems/sohl/assets/icons/tunic.svg + value: 64 + weight: 3.2 + encumbrance: 0 + perception: 0 + abbrev: CCoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 64 + origWeight: 3.2 + name: Cloth Coat + id: hbyRqFz6JdivHn38 + durability: 10 + encumbranceEffectId: 14siOvAmmQerDWLX + perceptionEffectId: X1ZRLwQbw5nuwfLq + createdEventId: i6JiA3k0IEsqBoLC + description:

    A simple, versatile Cloth Coat made from various softer fabrics offers basic comfort and warmth. It’s suitable for everyday wear, perfect for a wide range of casual activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Coat + detailMaterial: Gambeson + img: systems/sohl/assets/icons/tunic.svg + value: 528 + weight: 18.5 + encumbrance: 10 + perception: 0 + abbrev: GCoat + material: Gambeson + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + rigidloc: + - Thorax + - Abdomen + - Pelvis + - Right Thigh + - Left Thigh + blunt: 6 + edged: 5 + piercing: 4 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 528 + origWeight: 18.5 + name: Gambeson Coat + id: iGdFOVKySxs8z56m + durability: 11 + encumbranceEffectId: d0qFHvGw9bRjLVbw + perceptionEffectId: QVQOvJuRQZn2syQY + createdEventId: RaUnRZ3kwrlFUZpT + description:

    The Gambeson Coat offers padded protection, often worn under armor or as standalone defense. It provides excellent insulation and cushioning, making it ideal for both combat and daily wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Coat + detailMaterial: Padded + img: systems/sohl/assets/icons/tunic.svg + value: 128 + weight: 5.1 + encumbrance: 0 + perception: 0 + abbrev: PCoat + material: Padded + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 128 + origWeight: 5.1 + name: Padded Coat + id: IUb0GI1P4v78tPBo + durability: 10 + encumbranceEffectId: 7vTH0ixauwOcaW3i + perceptionEffectId: yhbwZKSXqS2Uc70w + createdEventId: KtadD8e0ozucoTOR + description:

    The Padded Coat provides warmth and cushioning, perfect for cold weather or as additional under-armor padding. It offers comfort and a bit of extra protection where needed.

    + macros: [] + flags: {} + effects: [] +- armorType: Coat + detailMaterial: Quilted + img: systems/sohl/assets/icons/tunic.svg + value: 256 + weight: 11.5 + encumbrance: 0 + perception: 0 + abbrev: QCoat + material: Quilted + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 256 + origWeight: 11.5 + name: Quilted Coat + id: aOJoKqbfNQ4SPMZf + durability: 11 + encumbranceEffectId: eR9XXf1qdu8YrfFY + perceptionEffectId: kvpicc7nOK2dSgwY + createdEventId: me0A20gLceIGqyk1 + description:

    Layers of fabric stitched together create the Quilted Coat, providing excellent insulation and warmth. It’s suitable for colder climates, offering both comfort and protection from harsh weather.

    + macros: [] + flags: {} + effects: [] +- armorType: Coudes + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/elbow-pad.svg + value: 10 + weight: 0.8 + encumbrance: 1.67 + perception: 0 + abbrev: KCou + material: Kûrbúl + flexloc: [] + rigidloc: + - Left Elbow + - Right Elbow + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 10 + origWeight: 0.8 + name: Kûrbúl Coudes + id: 2hObspgnPFY2W0zS + durability: 13 + encumbranceEffectId: USRRFVMNcP7bonj6 + perceptionEffectId: d4aXHRPV5y5UUOvE + createdEventId: EQ9NWzq5wIGYdEFc + description:

    Kûrbúl Coudes are treated leather elbow guards offering moderate protection and flexibility. Decorated with intricate patterns, they provide both function and visual appeal for those in need of lightweight elbow protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Coudes + detailMaterial: Plate + img: systems/sohl/assets/icons/elbow-pad.svg + value: 40 + weight: 0.8 + encumbrance: 1.67 + perception: 0 + abbrev: PlCou + material: Plate + flexloc: [] + rigidloc: + - Left Elbow + - Right Elbow + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 40 + origWeight: 0.8 + name: Plate Coudes + id: efHQM4LRA4sCbAju + durability: 14 + encumbranceEffectId: gf1STEavBXMi6BQM + perceptionEffectId: HAFfaByH2SmeQEpT + createdEventId: RC5d5Oygis2292HD + description:

    Made from solid steel, Plate Coudes offer maximum elbow protection. They are essential components of knightly armor, designed to deflect and withstand powerful strikes while ensuring the joint remains mobile.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Homespun + img: systems/sohl/assets/icons/hood.svg + value: 2 + weight: 0.1 + encumbrance: 0 + perception: 0 + abbrev: HsCowl + material: Cloth + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 6 + origWeight: 0.3 + name: Homespun Cowl + id: CDaJfmyW8L6rIOfV + durability: 5 + encumbranceEffectId: cOieQNlLwC4jqWca + perceptionEffectId: QYW4G7EO7U8MjXs5 + createdEventId: K9PJoMNvxZ0WcvYs + description:

    The Homespun Cowl is a simple head and shoulder covering woven from homemade fabric. It offers basic warmth and protection, suitable for everyday use by common folk.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Linen + img: systems/sohl/assets/icons/hood.svg + value: 3 + weight: 0.1 + encumbrance: 0 + perception: 0 + abbrev: LCowl + material: Cloth + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 6 + origWeight: 0.3 + name: Linen Cowl + id: rXhtLzfWFDMclEie + durability: 5 + encumbranceEffectId: GzaTD9JXvf9lg10T + perceptionEffectId: 8y8LJHlq07AuYXQu + createdEventId: 6SdCYUAEj6zaBHqu + description:

    Light and breathable, the Linen Cowl is ideal for warmer weather. It provides sun protection without causing overheating, making it perfect for casual or light-duty wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Russet + img: systems/sohl/assets/icons/hood.svg + value: 7 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: RCowl + material: Cloth + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 6 + origWeight: 0.3 + name: Russet Cowl + id: RIWSLQPqSFWciJCe + durability: 7 + encumbranceEffectId: kc2zJtXej3z7X2vD + perceptionEffectId: BG3QF9Dn0qJ0mW7B + createdEventId: LytFWbbxgqfudLAp + description:

    A Russet Cowl, made from coarse wool dyed reddish-brown, offers warmth and durability. It’s practical for colder climates and rougher outdoor environments, providing reliable coverage.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Serge + img: systems/sohl/assets/icons/hood.svg + value: 4 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: SgCowl + material: Cloth + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 6 + origWeight: 0.3 + name: Serge Cowl + id: 2w0FL46AnXC7wdI8 + durability: 7 + encumbranceEffectId: nv1MRWb3vjtBPdth + perceptionEffectId: 9Oadtg4DSWAeHOSf + createdEventId: 33B3Un4l1sr3FtKP + description:

    The Serge Cowl is made from durable twilled fabric, offering comfort and resilience. It’s suitable for everyday wear, providing reliable protection and a bit of extra warmth.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Velvet + img: systems/sohl/assets/icons/hood.svg + value: 21 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: VCowl + material: Cloth + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 6 + origWeight: 0.3 + name: Velvet Cowl + id: dqDJCXynWrl0Ugdv + durability: 10 + encumbranceEffectId: i7AOYPv7MQIdKL6L + perceptionEffectId: Wm9sshKqWqqQJJtR + createdEventId: rigYHVc7v3mPYWMU + description:

    Soft and plush, the Velvet Cowl exudes elegance and luxury. While not exceptionally durable, it’s perfect for formal settings and individuals of high status looking for a touch of refinement.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Worsted + img: systems/sohl/assets/icons/hood.svg + value: 14 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: WCowl + material: Cloth + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 6 + origWeight: 0.3 + name: Worsted Cowl + id: HwAZqhOppRIqVbJs + durability: 9 + encumbranceEffectId: QciFfEjisUPtdlSt + perceptionEffectId: 3bxExVpuJywtRzKw + createdEventId: PNNCnFLK21bYNzsw + description:

    The Worsted Cowl, made from tightly-spun wool, provides both style and durability. It’s a versatile head covering offering good insulation and resilience, suitable for a wide range of activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Beaver + img: systems/sohl/assets/icons/hood.svg + value: 105 + weight: 1.3 + encumbrance: 0 + perception: 0 + abbrev: BvCowl + material: Leather + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 35 + origWeight: 1.6 + name: Beaver Cowl + id: Ssz3vVZodt4PgP1K + durability: 9 + encumbranceEffectId: OSpB7CTjhLq0XvB0 + perceptionEffectId: AWJfBkezRxq5w0Sg + createdEventId: BwYcN4I8ZjHmZ6LX + description:

    The Beaver Cowl, made from dense beaver fur, offers excellent warmth and a luxurious feel. Perfect for cold weather, it provides both comfort and a touch of opulence.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Ermine + img: systems/sohl/assets/icons/hood.svg + value: 210 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: ECowl + material: Leather + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 35 + origWeight: 1.6 + name: Ermine Cowl + id: EerjTNzJk31jSMyY + durability: 7 + encumbranceEffectId: WkGKJJlVg3nGjJyJ + perceptionEffectId: T4AMReorLq3IVhXq + createdEventId: Nl6WgZSf2FiiJpp0 + description:

    The Ermine Cowl is made from soft white ermine fur, signifying nobility and wealth. It offers excellent insulation and a plush texture, ideal for the elite needing both warmth and a show of prestige.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Leather + img: systems/sohl/assets/icons/hood.svg + value: 70 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: LtCowl + material: Leather + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 35 + origWeight: 1.6 + name: Leather Cowl + id: C7nKCau1YIm7TkqP + durability: 9 + encumbranceEffectId: hYc1qnUpDSe62BuO + perceptionEffectId: EHNfKHRagxhBYVmk + createdEventId: RHj3Qbxu0MzH7Pe4 + description:

    A simple yet stylish Leather Cowl provides basic head and shoulder protection. Lightweight and versatile, it’s suitable for everyday wear and offers a touch of rugged charm.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Sealskin + img: systems/sohl/assets/icons/hood.svg + value: 105 + weight: 1.9 + encumbrance: 0 + perception: 0 + abbrev: SlCowl + material: Leather + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: gaC79vNjSo6VO6Ym + origValue: 35 + origWeight: 1.6 + name: Sealskin Cowl + id: wDGMOcrCFmlFmBCu + durability: 11 + encumbranceEffectId: gg78w64mF954Z61M + perceptionEffectId: 0PrjZBreNMDlqseY + createdEventId: De1n07f1GXqaL8xt + description:

    Water-resistant and warm, the Sealskin Cowl is ideal for harsh, wet, and cold environments. It provides excellent protection against the elements, perfect for seafaring folk and those living in extreme conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Buckram + img: systems/sohl/assets/icons/hood.svg + value: 6 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: BCowl + material: Cloth + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 6 + origWeight: 0.3 + name: Buckram Cowl + id: NODwhSpUKB9OGWVi + durability: 10 + encumbranceEffectId: ZhSrgrrZoobcm8n4 + perceptionEffectId: qAzj5xKI5jqDoBmt + createdEventId: N2RL6QsAFXRf82jE + description:

    The Buckram Cowl is stiff and structured, made from coarse cloth stiffened with glue. It offers durability and reliable coverage, suitable for activities requiring a more rigid head and shoulder covering.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Cloth + img: systems/sohl/assets/icons/hood.svg + value: 6 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: CCowl + material: Cloth + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 6 + origWeight: 0.3 + name: Cloth Cowl + id: OASgkgSf3zqBWhpI + durability: 10 + encumbranceEffectId: 2tjz0GidjMgn3dLb + perceptionEffectId: nAmnccpFeEzkZb24 + createdEventId: FMBvCxkgbhUiiXCZ + description:

    A simple, versatile Cloth Cowl made from various softer fabrics offers basic comfort and warmth. It’s suitable for everyday use, perfect for a wide range of casual activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Rawhide + img: systems/sohl/assets/icons/hood.svg + value: 35 + weight: 1.6 + encumbrance: 0 + perception: -5 + abbrev: RhCowl + material: Leather + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 35 + origWeight: 1.6 + name: Rawhide Cowl + id: OTXIPEDtQ2Gqv3Sh + durability: 11 + encumbranceEffectId: qHOlMo1xQjvK5tEI + perceptionEffectId: zdRNrctlmnd6fQbJ + createdEventId: nDsjbNkWAQk6G0jb + description:

    The Rawhide Cowl is thick and rugged, providing substantial protection. It’s ideal for tough environments where a durable head and shoulder covering is necessary.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Mail + img: systems/sohl/assets/icons/hood.svg + value: 90 + weight: 2.7 + encumbrance: 0 + perception: -5 + abbrev: MCwl + material: Mail + flexloc: [] + rigidloc: + - Skull + - Neck + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 90 + origWeight: 2.7 + name: Mail Cowl + id: tzJbA7tfvNNzefZL + durability: 13 + encumbranceEffectId: 5OQy6XPEsrtn8C4s + perceptionEffectId: xGUOjaeC7UCnZAVn + createdEventId: eWtt193xlrdZKDmk + description:

    The Mail Cowl is made from interlinked metal rings, offering substantial protection for the head and neck. It’s an essential component of combat armor, providing flexibility and defense against slashes.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Padded + img: systems/sohl/assets/icons/hood.svg + value: 12 + weight: 0.5 + encumbrance: 0 + perception: -5 + abbrev: PCwl + material: Padded + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 12 + origWeight: 0.5 + name: Padded Cowl + id: bwHDcRYABJr1tUnM + durability: 10 + encumbranceEffectId: vJmqjqwXFDeG3EmE + perceptionEffectId: nzSYScwwaYdlx52p + createdEventId: g64CSliFhSpbOFNv + description:

    The Padded Cowl provides cushioning and warmth, perfect for wear under helmets or on its own. It offers comfort and protection in both combat and daily use.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Quilted + img: systems/sohl/assets/icons/hood.svg + value: 24 + weight: 1.1 + encumbrance: 0 + perception: -5 + abbrev: QCwl + material: Quilted + flexloc: + - Skull + - Neck + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 24 + origWeight: 1.1 + name: Quilted Cowl + id: s5ysRe2wp5xf1Jj5 + durability: 11 + encumbranceEffectId: VN7jFh9bziL7fdVK + perceptionEffectId: ssQu54Zl97ffHSS8 + createdEventId: xchOWC3OxsRjjF9i + description:

    A Quilted Cowl offers excellent insulation with its layers of fabric sewn together. Suitable for cold weather, it provides both warmth and comfort.

    + macros: [] + flags: {} + effects: [] +- armorType: Cowl + detailMaterial: Scale + img: systems/sohl/assets/icons/hood.svg + value: 60 + weight: 3.3 + encumbrance: 0 + perception: -5 + abbrev: SCwl + material: Scale + flexloc: [] + rigidloc: + - Skull + - Neck + blunt: 4 + edged: 8 + piercing: 5 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 60 + origWeight: 3.3 + name: Scale Cowl + id: sRAqQ1hPLPlzcfWf + durability: 14 + encumbranceEffectId: EiXwujtrqAJjzq6Q + perceptionEffectId: 1ZPUr7bXSIuky6Mk + createdEventId: 5hd3xcrtp9ktIjF2 + description:

    The Scale Cowl consists of overlapping metal scales sewn onto a fabric or leather backing. It provides excellent protection and mobility, making it suitable for various combat situations.

    + macros: [] + flags: {} + effects: [] +- armorType: Cuirass + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/breastplate.svg + value: 120 + weight: 9.1 + encumbrance: 5 + perception: 0 + abbrev: KCui + material: Kûrbúl + flexloc: [] + rigidloc: + - Thorax + - Abdomen + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 120 + origWeight: 9.1 + name: Kûrbúl Cuirass + id: bAB8AEi37QXTYapO + durability: 13 + encumbranceEffectId: M6EsbLEumjheEb3K + perceptionEffectId: iyG95i9w3CiBWcqB + createdEventId: TrCkNRX0zBDVf41w + description:

    The Kûrbúl Cuirass is a torso armor made from specially treated leather, offering moderate protection with a lighter weight. Decorated with intricate designs, it caters to those needing agility without sacrificing too much defense.

    + macros: [] + flags: {} + effects: [] +- armorType: Cuirass + detailMaterial: Plate + img: systems/sohl/assets/icons/breastplate.svg + value: 480 + weight: 9.1 + encumbrance: 5 + perception: 0 + abbrev: PlCui + material: Plate + flexloc: [] + rigidloc: + - Thorax + - Abdomen + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 480 + origWeight: 9.1 + name: Plate Cuirass + id: Dt6MOzT2pJXn6TDC + durability: 14 + encumbranceEffectId: Dw5xxCNwMzsL5cOm + perceptionEffectId: 1Sfn5MQb5PBumVVd + createdEventId: AHUMe7qGfsuW406z + description:

    A Plate Cuirass provides maximum protection for the torso, crafted from solid steel plates. Essential for knights and heavily armored warriors, it’s designed to deflect blows and prevent penetration from weapons, though it restricts mobility.

    + macros: [] + flags: {} + effects: [] +- armorType: Cuisse + detailMaterial: Mail + img: systems/sohl/assets/icons/chain-mail.svg + value: 255 + weight: 7.7 + encumbrance: 5 + perception: 0 + abbrev: MCui + material: Mail + flexloc: [] + rigidloc: + - Left Thigh + - Left Knee + - Right Thigh + - Right Knee + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 255 + origWeight: 7.7 + name: Mail Cuisse + id: GGNplYEL8PKUXCLM + durability: 13 + encumbranceEffectId: CNKaVgnxbg6PiCnr + perceptionEffectId: kfWr865enTlLibRF + createdEventId: RZt3PavFr5g50fKx + description:

    Mail Cuisse is made from interlinked metal rings to protect the thighs. This piece of armor provides flexibility and decent defense against slashes, essential for mounted and foot soldiers alike.

    + macros: [] + flags: {} + effects: [] +- armorType: Cuisse + detailMaterial: Padded + img: systems/sohl/assets/icons/leggings.svg + value: 34 + weight: 1.4 + encumbrance: 0 + perception: 0 + abbrev: PCuis + material: Padded + flexloc: + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 34 + origWeight: 1.4 + name: Padded Cuisse + id: ktY6kGOnimNFKr3U + durability: 10 + encumbranceEffectId: O69ibJZM48M1Vr5E + perceptionEffectId: J0Cvy6PVwU9vIHm0 + createdEventId: D2Ia2LUG5NlseV40 + description:

    The Padded Cuisse offers cushioning for the thighs, ideal for use under heavier armor or on its own. It provides comfort and protection, suitable for both combat and everyday wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Cuisse + detailMaterial: Quilted + img: systems/sohl/assets/icons/leggings.svg + value: 68 + weight: 3.1 + encumbrance: 0 + perception: 0 + abbrev: QCui + material: Quilted + flexloc: + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 68 + origWeight: 3.1 + name: Quilted Cuisse + id: K1TTvWqUH9rCkH5l + durability: 11 + encumbranceEffectId: zSoUNmVJoDnRhUuO + perceptionEffectId: hFZSbfy1SZY0wMpU + createdEventId: qq2TGJav87Ey0apU + description:

    Quilted Cuisse, featuring layers of fabric sewn together, offers excellent insulation and protection for the thighs. It’s suitable for colder climates or added cushioning beneath other armor.

    + macros: [] + flags: {} + effects: [] +- armorType: Cuisse + detailMaterial: Scale + img: systems/sohl/assets/icons/scale-mail.svg + value: 170 + weight: 9.4 + encumbrance: 5 + perception: 0 + abbrev: SCui + material: Scale + flexloc: [] + rigidloc: + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + blunt: 4 + edged: 8 + piercing: 5 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 170 + origWeight: 9.4 + name: Scale Cuisse + id: pjT7t0CF7OIWL0Vg + durability: 14 + encumbranceEffectId: rKtyxZuxmallRkvL + perceptionEffectId: 8QJt0z0PoEL5rC5N + createdEventId: Azpsom6IouVA3NAz + description:

    Scale Cuisse consists of small, overlapping metal scales sewn onto a fabric or leather backing. It offers strong protection while maintaining flexibility, suitable for various combat scenarios.

    + macros: [] + flags: {} + effects: [] +- armorType: Dress + detailMaterial: Homespun + img: systems/sohl/assets/icons/dress.svg + value: 24 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: HsDress + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Homespun Dress + id: PV4cC3CyB5a3FfI1 + durability: 5 + encumbranceEffectId: hSU5ZaxEJ9IRkJ6T + perceptionEffectId: c8w627oqi7lKXz3G + createdEventId: hy3kKmmQee5hEuus + description:

    A Homespun Dress is a simple, practical garment woven from homemade fabric. It provides basic coverage and comfort, ideal for everyday wear by common folk.

    + macros: [] + flags: {} + effects: [] +- armorType: Dress + detailMaterial: Linen + img: systems/sohl/assets/icons/dress.svg + value: 40 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: LDress + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Linen Dress + id: jZovMRwEqnUv4PuA + durability: 5 + encumbranceEffectId: 1ZaWQ2vTOocNj0G2 + perceptionEffectId: kQJNwJJnvpBWtap1 + createdEventId: p6oL6LShQ879gHXs + description:

    The Linen Dress is light and breathable, perfect for warm weather. It offers comfort and ease of movement, suitable for day-to-day activities or casual outings.

    + macros: [] + flags: {} + effects: [] +- armorType: Dress + detailMaterial: Serge + img: systems/sohl/assets/icons/dress.svg + value: 47 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: SgDress + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Serge Dress + id: 1PYKwPOQeJ9jVMMW + durability: 7 + encumbranceEffectId: Mw0OzcVmDC8WmDWI + perceptionEffectId: z29HMU2otujSBT3W + createdEventId: xmnEnhTT4GgrAymy + description:

    Made from durable, twilled fabric, the Serge Dress provides both comfort and resilience. It’s an everyday garment that can withstand wear and tear, ideal for a range of activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Dress + detailMaterial: Silk + img: systems/sohl/assets/icons/dress.svg + value: 711 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: SlDress + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Silk Dress + id: 8lMrtemPFdUFrhgU + durability: 7 + encumbranceEffectId: GAa2ClPW6c58JLSP + perceptionEffectId: P5nGYCgI5upkLHsr + createdEventId: dt6r16vK9mMjow18 + description:

    A Silk Dress exudes elegance and sophistication. Lightweight and flowing, it’s perfect for formal events and special occasions where appearance is paramount.

    + macros: [] + flags: {} + effects: [] +- armorType: Dress + detailMaterial: Velvet + img: systems/sohl/assets/icons/dress.svg + value: 277 + weight: 4 + encumbrance: 0 + perception: 0 + abbrev: VDress + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Velvet Dress + id: IJ7FgxIDYIwVOR8v + durability: 10 + encumbranceEffectId: WtQhyFuVvuajvrvi + perceptionEffectId: 156oW7ttgNOEF2bG + createdEventId: SVctcTBpB0VqTB91 + description:

    Soft and plush, the Velvet Dress is a symbol of luxury and status. While not particularly durable, its rich texture and appearance make it perfect for high-status gatherings.

    + macros: [] + flags: {} + effects: [] +- armorType: Dress + detailMaterial: Worsted + img: systems/sohl/assets/icons/dress.svg + value: 190 + weight: 3.2 + encumbrance: 0 + perception: 0 + abbrev: WDress + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Worsted Dress + id: wPcQ8ykyivZCyikd + durability: 9 + encumbranceEffectId: hicHaEb56ZYc3loA + perceptionEffectId: Gq2jIGfG9PogBIpg + createdEventId: tA3CjR3iOjgQHIeG + description:

    Made from tightly-spun wool fibers, the Worsted Dress offers both style and durability. It’s a versatile garment providing warmth and resilience, suitable for various activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Gauntlets + detailMaterial: Cloth + img: systems/sohl/assets/icons/gloves.svg + value: 20 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: CGntl + material: Cloth + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 20 + origWeight: 0.3 + name: Cloth Gauntlets + id: zkFsrpmOArwxO6Oi + durability: 10 + encumbranceEffectId: elzniILQSQuoqsdf + perceptionEffectId: qcuphtrSr37zadmP + createdEventId: zX7OjcUQAxPSgvtU + description:

    Cloth Gauntlets are simple hand coverings made from various soft fabrics. They offer basic comfort and protection, suitable for light activities and everyday use.

    + macros: [] + flags: {} + effects: [] +- armorType: Gauntlets + detailMaterial: Rawhide + img: systems/sohl/assets/icons/gauntlet.svg + value: 30 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: RhGntl + material: Leather + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 30 + origWeight: 0.8 + name: Rawhide Gauntlets + id: O1QZeXl5c7XGVQKp + durability: 11 + encumbranceEffectId: FQiJjVnLO4zYjcit + perceptionEffectId: oMkllnhTfepZFbP8 + createdEventId: aJcaQ14mPNR1u4Lg + description:

    Rawhide Gauntlets are thick and rugged, providing substantial hand protection. Ideal for heavy-duty tasks or combat situations, they offer excellent defense against abrasions and impacts.

    + macros: [] + flags: {} + effects: [] +- armorType: Gauntlets + detailMaterial: Scale + img: systems/sohl/assets/icons/gauntlet.svg + value: 50 + weight: 2.8 + encumbrance: 1.67 + perception: 0 + abbrev: SGntl + material: Scale + flexloc: [] + rigidloc: + - Left Hand + - Right Hand + blunt: 4 + edged: 8 + piercing: 5 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 50 + origWeight: 2.8 + name: Scale Gauntlets + id: ZLhl80C3v18V8bou + durability: 14 + encumbranceEffectId: WoeUWosFDTtKkFfa + perceptionEffectId: 91k8ReebZvRK5WR8 + createdEventId: z0e4QtQC1GDh7QaE + description:

    Scale Gauntlets consist of overlapping metal scales sewn onto a fabric or leather backing. They provide excellent protection and flexibility, suitable for various combat scenarios.

    + macros: [] + flags: {} + effects: [] +- armorType: Gloves + detailMaterial: Russet + img: systems/sohl/assets/icons/gloves.svg + value: 24 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: RGlv + material: Cloth + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 20 + origWeight: 0.3 + name: Russet Gloves + id: WNrm1UMM4JpiawVA + durability: 7 + encumbranceEffectId: BDDnDqgAKf6agAqY + perceptionEffectId: VDpkx2KBz6TbVkMW + createdEventId: IFlB8ODso0dbpNRO + description:

    Russet Gloves are made from coarse wool dyed reddish-brown, offering warmth and durability. They are practical for colder climates and outdoor activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Gloves + detailMaterial: Silk + img: systems/sohl/assets/icons/gloves.svg + value: 180 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: SlGlv + material: Cloth + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 20 + origWeight: 0.3 + name: Silk Gloves + id: TcusrbNwjxTWsUaq + durability: 7 + encumbranceEffectId: 660q009iHbOwSB0A + perceptionEffectId: GOMjxhPyxETfZ5yv + createdEventId: nm6dhtGFmmvUJ2Pe + description:

    Silk Gloves offer a touch of luxury and elegance. Soft and lightweight, they are perfect for formal events and special occasions, where style is more important than ruggedness.

    + macros: [] + flags: {} + effects: [] +- armorType: Gloves + detailMaterial: Velvet + img: systems/sohl/assets/icons/gloves.svg + value: 70 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: VGlv + material: Cloth + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 20 + origWeight: 0.3 + name: Velvet Gloves + id: iZy5aFcokB4JMepb + durability: 10 + encumbranceEffectId: RPdxE7KhUq2qzfZC + perceptionEffectId: kMs2GwIeBFsdUUoO + createdEventId: TsOY2IqBx9Vf2Baw + description:

    The Velvet Gloves are plush and opulent, ideal for high-status individuals. While not particularly durable, their rich texture and appearance make them perfect for formal settings.

    + macros: [] + flags: {} + effects: [] +- armorType: Gloves + detailMaterial: Beaver + img: systems/sohl/assets/icons/gloves.svg + value: 90 + weight: 0.4 + encumbrance: 0 + perception: 0 + abbrev: BvGlv + material: Leather + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 30 + origWeight: 0.5 + name: Beaver Gloves + id: P8ZAFk7ulnJktbyq + durability: 9 + encumbranceEffectId: bVAQmPJHD9yQI0tr + perceptionEffectId: QsbzDJD8YfHw7qnh + createdEventId: Cve1QsfTv0CBi9Re + description:

    Beaver Gloves, made from dense beaver fur, offer excellent warmth and a luxurious feel. They are perfect for cold weather, providing both comfort and a touch of opulence.

    + macros: [] + flags: {} + effects: [] +- armorType: Gloves + detailMaterial: Ermine + img: systems/sohl/assets/icons/gloves.svg + value: 180 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: EGlv + material: Leather + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 30 + origWeight: 0.5 + name: Ermine Gloves + id: 8T5Z4z3RemDKxvPH + durability: 7 + encumbranceEffectId: h9ngimuuxk6wB3oW + perceptionEffectId: ovN4lVjQHkUh8yHD + createdEventId: L9Xf7t1lGh8HGjmC + description:

    Ermine Gloves, made from the soft white fur of the ermine, signify high status and wealth. They provide excellent insulation and a plush texture, ideal for the elite.

    + macros: [] + flags: {} + effects: [] +- armorType: Gloves + detailMaterial: Leather + img: systems/sohl/assets/icons/gloves.svg + value: 60 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: LtGlove + material: Leather + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 30 + origWeight: 0.5 + name: Leather Gloves + id: FOxKjKieEAM3ZxRe + durability: 9 + encumbranceEffectId: qObCYr1oXCMtbnRf + perceptionEffectId: RvcW4WgKSIEL627R + createdEventId: VA9yJmSd6DCarkbj + description:

    Leather Gloves offer both style and practical protection. Lightweight and flexible, they are suitable for various activities, from light adventuring to everyday wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Gloves + detailMaterial: Buckram + img: systems/sohl/assets/icons/gloves.svg + value: 20 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: BGlv + material: Cloth + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 20 + origWeight: 0.3 + name: Buckram Gloves + id: v7RyWCh2YK0l6Ktq + durability: 10 + encumbranceEffectId: D9pqahvOVyrEse3g + perceptionEffectId: 7TJdUBS1rVDbgU3X + createdEventId: STDbOZapCUK7M7zr + description:

    Buckram Gloves, made from coarse cloth stiffened with glue, offer a stiff and structured fit. They are suitable for tasks requiring a more rigid hand covering.

    + macros: [] + flags: {} + effects: [] +- armorType: Gloves + detailMaterial: Cloth + img: systems/sohl/assets/icons/gloves.svg + value: 20 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: CGlv + material: Cloth + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 20 + origWeight: 0.3 + name: Cloth Gloves + id: mxkfoX03vAusWIxP + durability: 10 + encumbranceEffectId: 9yu93yo4Na0dm0lV + perceptionEffectId: OvKpV71kLvDSKM69 + createdEventId: 4MrZihT017CxU9lt + description:

    Simple and versatile, Cloth Gloves made from various softer fabrics offer basic comfort and protection, suitable for everyday activities and casual wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Great Helm + detailMaterial: Plate + img: systems/sohl/assets/icons/visored-helm.svg + value: 180 + weight: 6.8 + encumbrance: 1.67 + perception: -10 + abbrev: PlGtHlm + material: Plate + flexloc: [] + rigidloc: + - Skull + - Nose + - Right Cheek + - Left Cheek + - Right Ear + - Left Ear + - Mouth + - Jaw + - Neck + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 180 + origWeight: 6.8 + name: Plate Great Helm + id: 3IC8ydK0Ky7v7lY6 + durability: 14 + encumbranceEffectId: b8ZaWNOw8E7mMcnR + perceptionEffectId: SB4mcvbVVO5Dhtlg + createdEventId: F6e3bDJHvMoDdtV8 + description:

    The Plate Great Helm is a fully enclosed steel helmet, offering maximum protection for the head and face. It is a mainstay for knights, designed to deflect blows and withstand the rigors of battle, though it sacrifices visibility and comfort.

    + macros: [] + flags: {} + effects: [] +- armorType: Greaves + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/greaves.svg + value: 60 + weight: 4.6 + encumbrance: 5 + perception: 0 + abbrev: KGrvs + material: Kûrbúl + flexloc: [] + rigidloc: + - Left Calf + - Right Calf + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 60 + origWeight: 4.6 + name: Kûrbúl Greaves + id: OtxXAV2kqmFo1qsc + durability: 13 + encumbranceEffectId: nyc2GsGvUZFB9aSM + perceptionEffectId: LhfzmAeyeyxN2t0c + createdEventId: 5YXdg6A1TSpibsOe + description:

    Kûrbúl Greaves are lower leg armor made from specially treated leather, offering moderate protection and flexibility. Decorated with intricate patterns, they are suitable for those needing agility without sacrificing too much defense.

    + macros: [] + flags: {} + effects: [] +- armorType: Greaves + detailMaterial: Plate + img: systems/sohl/assets/icons/greaves.svg + value: 240 + weight: 4.6 + encumbrance: 5 + perception: 0 + abbrev: PlGrvs + material: Plate + flexloc: [] + rigidloc: + - Left Calf + - Right Calf + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 240 + origWeight: 4.6 + name: Plate Greaves + id: lT2DMid6ecSU5oX0 + durability: 14 + encumbranceEffectId: pSTmcCyL0s70D1j9 + perceptionEffectId: wfszGxjgzsg3crg2 + createdEventId: 3pysw3u9Ky3PCD68 + description:

    Made from solid steel, Plate Greaves provide maximum protection for the lower legs. They are essential for heavily armored warriors, designed to deflect blows and withstand impacts.

    + macros: [] + flags: {} + effects: [] +- armorType: Habergeon + detailMaterial: Mail + img: systems/sohl/assets/icons/chain-mail.svg + value: 675 + weight: 20.3 + encumbrance: 10 + perception: 0 + abbrev: MHbgn + material: Mail + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 675 + origWeight: 20.3 + name: Mail Habergeon + id: by89UOdBCjlBDocF + durability: 13 + encumbranceEffectId: SQzNceUqOEmDvKZA + perceptionEffectId: OD89RGpYVD98GBAH + createdEventId: Db87egquscZuSCLD + description:

    The Mail Habergeon is a mid-length chainmail shirt offering substantial protection. Its interlinked metal rings provide excellent defense against slashes and thrusts while maintaining flexibility.

    + macros: [] + flags: {} + effects: [] +- armorType: Habergeon + detailMaterial: Scale + img: systems/sohl/assets/icons/scale-mail.svg + value: 450 + weight: 24.8 + encumbrance: 15 + perception: 0 + abbrev: SHabg + material: Scale + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + blunt: 4 + edged: 8 + piercing: 5 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 450 + origWeight: 24.8 + name: Scale Habergeon + id: D48hsnXqcAkOvgAo + durability: 14 + encumbranceEffectId: F8Kvdwr5zaFms6vF + perceptionEffectId: U2W8pecqeX7XACEW + createdEventId: 7Mn9Sgq4yjE5BzcP + description:

    The Scale Habergeon consists of overlapping metal scales sewn onto a fabric or leather backing, providing strong protection and reasonable mobility, suitable for various combat situations.

    + macros: [] + flags: {} + effects: [] +- armorType: Halfhelm + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/helm.svg + value: 20 + weight: 3 + encumbrance: 0 + perception: 0 + abbrev: KHlfHelm + material: Kûrbúl + flexloc: [] + rigidloc: + - Skull + - Right Ear + - Left Ear + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 20 + origWeight: 3 + name: Kûrbúl Halfhelm + id: nFjmonyMqDP34iGn + durability: 13 + encumbranceEffectId: FBkUaiR2FK3OXGSX + perceptionEffectId: tOyk2y6I3jb3kWRJ + createdEventId: vwDYQmfklOWMNfGL + description:

    The Kûrbúl Halfhelm, made from treated leather, covers the top of the head and down to the jawline, offering moderate protection and reduced weight. It is decorated with intricate designs, combining function with a stylish appearance.

    + macros: [] + flags: {} + effects: [] +- armorType: Halfhelm + detailMaterial: Plate + img: systems/sohl/assets/icons/helm.svg + value: 80 + weight: 3 + encumbrance: 0 + perception: 0 + abbrev: PlHHelm + material: Plate + flexloc: [] + rigidloc: + - Skull + - Right Ear + - Left Ear + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 80 + origWeight: 3 + name: Plate Halfhelm + id: K4Em43ZVHFbyIXHk + durability: 14 + encumbranceEffectId: nvZmfNaPj9eWyyY7 + perceptionEffectId: FNN31dTJvVW540PY + createdEventId: BHE44gP1Ka8qngyf + description:

    The Plate Halfhelm is a steel helmet covering the top and sides of the head, leaving the face exposed. It offers moderate protection while allowing for better visibility and airflow compared to a full helm.

    + macros: [] + flags: {} + effects: [] +- armorType: Hat + detailMaterial: Linen + img: systems/sohl/assets/icons/hat.svg + value: 8 + weight: 0.1 + encumbrance: 0 + perception: 0 + abbrev: LHat + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 15 + origWeight: 0.3 + name: Linen Hat + id: pqyd3ontIl0ssElF + durability: 5 + encumbranceEffectId: yoYny1a2HRal27V7 + perceptionEffectId: BsDtvP5RqVVMfnpf + createdEventId: hzXgKUc2MC36t95i + description:

    A Linen Hat is light and breathable, perfect for warm climates. It provides sun protection and comfort, suitable for everyday wear or light-duty tasks.

    + macros: [] + flags: {} + effects: [] +- armorType: Hat + detailMaterial: Russet + img: systems/sohl/assets/icons/hat.svg + value: 18 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: RHat + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 15 + origWeight: 0.3 + name: Russet Hat + id: omlaBs9NL0jrxRgL + durability: 7 + encumbranceEffectId: vX5xmgtrvMKhwesT + perceptionEffectId: hw16HhyA0qHN4gWH + createdEventId: sV2tHC46ZbboQ66s + description:

    Made from coarse wool dyed reddish-brown, the Russet Hat offers warmth and durability. It is practical for colder climates and rougher outdoor environments.

    + macros: [] + flags: {} + effects: [] +- armorType: Hat + detailMaterial: Straw + img: systems/sohl/assets/icons/hat.svg + value: 5 + weight: 0.1 + encumbrance: 0 + perception: 0 + abbrev: StHat + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 15 + origWeight: 0.3 + name: Straw Hat + id: hHJYZG1UtjVEwYQ2 + durability: 5 + encumbranceEffectId: tkwcgMH3wP3Qfv1n + perceptionEffectId: BBvtWKQUTYGvcGpX + createdEventId: NJHzNPNSg9qKlSUH + description:

    The Straw Hat is lightweight and breathable, providing excellent sun protection. Perfect for farmers and outdoor laborers, it’s made from woven straw that keeps the head cool.

    + macros: [] + flags: {} + effects: [] +- armorType: Hat + detailMaterial: Velvet + img: systems/sohl/assets/icons/hat.svg + value: 53 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: VHat + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 15 + origWeight: 0.3 + name: Velvet Hat + id: 8EKReqqK3hGSqGD5 + durability: 10 + encumbranceEffectId: 7kRxkqMbk85zzJAr + perceptionEffectId: sKDF4lWTTsjkdyOj + createdEventId: 3xsnYtsTErrdZTKA + description:

    Soft and plush, the Velvet Hat exudes luxury. While not particularly durable, its rich texture and appearance make it perfect for formal settings and high-status individuals.

    + macros: [] + flags: {} + effects: [] +- armorType: Hat + detailMaterial: Worsted + img: systems/sohl/assets/icons/hat.svg + value: 36 + weight: 0.2 + encumbrance: 0 + perception: 0 + abbrev: WHat + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 15 + origWeight: 0.3 + name: Worsted Hat + id: sit4dijwTzgoq8cE + durability: 9 + encumbranceEffectId: 3Wv2lvzopt4cvAYM + perceptionEffectId: 6eLLWszhZUk45MM9 + createdEventId: uPiDlb22sMoq8qDh + description:

    The Worsted Hat, made from tightly-spun wool fibers, offers both style and resilience. It provides good insulation and durability, suitable for a wide range of activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Hat + detailMaterial: Beaver + img: systems/sohl/assets/icons/hat.svg + value: 75 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: BvHat + material: Leather + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 25 + origWeight: 0.8 + name: Beaver Hat + id: gWLA4r3GlnKR6Jvc + durability: 9 + encumbranceEffectId: fIOVlp3kUKClFwsx + perceptionEffectId: LKmTIHwzOclGYpv9 + createdEventId: rLDeSBna9rAKpoqV + description:

    The Beaver Hat, made from dense beaver fur, offers excellent warmth and a luxurious feel. It’s perfect for cold weather, providing both comfort and a touch of opulence.

    + macros: [] + flags: {} + effects: [] +- armorType: Hat + detailMaterial: Leather + img: systems/sohl/assets/icons/hat.svg + value: 50 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: LtHat + material: Leather + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 25 + origWeight: 0.8 + name: Leather Hat + id: Y4c1O31zGIzExv5g + durability: 9 + encumbranceEffectId: oQBX9EMcVJUSX8tB + perceptionEffectId: gLdNwUIn5ZLNHHDG + createdEventId: KRBcp8QXuQoWiJwR + description:

    The Leather Hat provides a rugged style and basic protection from the elements. Lightweight and versatile, it’s suitable for everyday wear and offers a touch of adventurer's charm.

    + macros: [] + flags: {} + effects: [] +- armorType: Hat + detailMaterial: Ermine + img: systems/sohl/assets/icons/hat.svg + value: 150 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: EHat + material: Leather + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 25 + origWeight: 0.8 + name: Ermine Hat + id: oEQam7EyCZsiIprH + durability: 7 + encumbranceEffectId: jSD9hkRPC4iBSeB8 + perceptionEffectId: WiVzP1XG9h9Bvrsp + createdEventId: L1GUDfLl9eO0DLFw + description:

    Made from soft white ermine fur, the Ermine Hat signifies high status and wealth. It offers excellent insulation and a plush texture, ideal for the elite needing both warmth and a show of prestige.

    + macros: [] + flags: {} + effects: [] +- armorType: Hat + detailMaterial: Buckram + img: systems/sohl/assets/icons/hat.svg + value: 15 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: BHat + material: Cloth + flexloc: + - Skull + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 15 + origWeight: 0.3 + name: Buckram Hat + id: ESqC4L6dMv1Tfryy + durability: 10 + encumbranceEffectId: DQEnf7dzMwcZKEX6 + perceptionEffectId: cGD0OfoPLmfw8vNr + createdEventId: HnTFEdkpNZMXKkgQ + description:

    The Buckram Hat is stiff and structured, crafted from coarse cloth stiffened with glue. It offers durability and a reliable fit, suitable for activities requiring a more rigid head covering.

    + macros: [] + flags: {} + effects: [] +- armorType: Hauberk + detailMaterial: Mail + img: systems/sohl/assets/icons/chain-mail.svg + value: 960 + weight: 28.8 + encumbrance: 15 + perception: 0 + abbrev: MHbk + material: Mail + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 960 + origWeight: 28.8 + name: Mail Hauberk + id: U87Bj2PE7Qmm6cH8 + durability: 13 + encumbranceEffectId: TxO3CjQy0FCAs10c + perceptionEffectId: 4jcrtN54G9p020xj + createdEventId: IYIoUXhdf6KT4uLM + description:

    A Mail Hauberk is a long chainmail shirt providing substantial protection. Its interlinked metal rings offer excellent defense against slashes and thrusts, making it essential for mounted and foot soldiers.

    + macros: [] + flags: {} + effects: [] +- armorType: Hauberk + detailMaterial: Scale + img: systems/sohl/assets/icons/scale-mail.svg + value: 640 + weight: 35.2 + encumbrance: 20 + perception: 0 + abbrev: SHaub + material: Scale + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + blunt: 4 + edged: 8 + piercing: 5 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 640 + origWeight: 35.2 + name: Scale Hauberk + id: us1CLQu0mK6L0juq + durability: 14 + encumbranceEffectId: HKeb82vKeRWkg7eg + perceptionEffectId: nsy3b9RfIDVU13vy + createdEventId: Ig0Nw1AsGfXouU3l + description:

    The Scale Hauberk, made from overlapping metal scales sewn onto a fabric or leather backing, provides strong protection and reasonable mobility, suitable for various combat situations.

    + macros: [] + flags: {} + effects: [] +- armorType: Knee Boots + detailMaterial: Leather + img: systems/sohl/assets/icons/leather-boot.svg + value: 240 + weight: 2.3 + encumbrance: 0 + perception: 0 + abbrev: LtKBoot + material: Leather + flexloc: + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 120 + origWeight: 3.8 + name: Leather Knee Boots + id: 8xbz25OyvJhPzQtB + durability: 9 + encumbranceEffectId: 0h95DwTLZSnNDGtM + perceptionEffectId: TQJwqZaw9EtlayE2 + createdEventId: T7gkut1wCqFMAZot + description:

    Leather Knee Boots, made from lightweight yet durable leather, extend up just past the knee. They offer a mix of style and modest protection, suitable for those needing flexible footwear for active pursuits.

    + macros: [] + flags: {} + effects: [] +- armorType: Knee Boots + detailMaterial: Buckram + img: systems/sohl/assets/icons/leather-boot.svg + value: 45 + weight: 1.5 + encumbrance: 0 + perception: 0 + abbrev: BBoot + material: Cloth + flexloc: + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 45 + origWeight: 1.5 + name: Buckram Knee Boots + id: f68hQecNxmsKRhBZ + durability: 10 + encumbranceEffectId: XpS6IfeqiKYqcWxj + perceptionEffectId: kXcElnEgjYQNxy9K + createdEventId: ihBWr6RFCvKsQ6CY + description:

    Buckram Knee Boots provide a stiff and structured fit, made from coarse cloth stiffened with glue. They offer durability and reliable protection for the legs, suitable for tasks requiring a more rigid boot.

    + macros: [] + flags: {} + effects: [] +- armorType: Knee Boots + detailMaterial: Cloth + img: systems/sohl/assets/icons/leather-boot.svg + value: 45 + weight: 1.5 + encumbrance: 0 + perception: 0 + abbrev: CKBoot + material: Cloth + flexloc: + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 45 + origWeight: 1.5 + name: Cloth Knee Boots + id: NR3KHGwtFP9qySy9 + durability: 10 + encumbranceEffectId: VQ5zYe3IG1SUmS9Z + perceptionEffectId: ZoMtMyeraIJbSEhX + createdEventId: t01pYOm7JEpCPJFa + description:

    Cloth Knee Boots, made from various soft and breathable fabrics, offer basic comfort and minimal protection. They are suitable for casual wear or light-duty activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Knee Boots + detailMaterial: Rawhide + img: systems/sohl/assets/icons/leather-boot.svg + value: 120 + weight: 3.8 + encumbrance: 0 + perception: 0 + abbrev: RhKBoot + material: Leather + flexloc: + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 120 + origWeight: 3.8 + name: Rawhide Knee Boots + id: sIfdA5eU8sTkwLHF + durability: 11 + encumbranceEffectId: EwBuQcp1m2k9w7oi + perceptionEffectId: vBVzAJzcLHubJz0c + createdEventId: vxz4cGFo4E78P7Q4 + description:

    Rawhide Knee Boots are thick and rugged, providing excellent leg protection. Ideal for harsh environments or combat scenarios, they offer a durable and reliable option for those needing sturdy footwear.

    + macros: [] + flags: {} + effects: [] +- armorType: Kneecops + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/knee-pad.svg + value: 15 + weight: 1.1 + encumbrance: 0 + perception: 0 + abbrev: KKnee + material: Kûrbúl + flexloc: [] + rigidloc: + - Left Knee + - Right Knee + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 15 + origWeight: 1.1 + name: Kûrbúl Kneecops + id: rxgBlijzGyuCLVnT + durability: 13 + encumbranceEffectId: NUSL8TjKI5T0iyDV + perceptionEffectId: Rkz7kXTyhjWxw4IH + createdEventId: a5VKOttcuARKFHj7 + description:

    Kûrbúl Kneecops, made from specially treated leather, offer moderate protection for the knees. They are decorated with intricate designs and provide both function and visual appeal for those needing lightweight knee armor.

    + macros: [] + flags: {} + effects: [] +- armorType: Kneecops + detailMaterial: Plate + img: systems/sohl/assets/icons/knee-pad.svg + value: 60 + weight: 1.1 + encumbrance: 0 + perception: 0 + abbrev: PlKncp + material: Plate + flexloc: [] + rigidloc: + - Left Knee + - Right Knee + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 60 + origWeight: 1.1 + name: Plate Kneecops + id: wOc6AioNe90azs1a + durability: 14 + encumbranceEffectId: C35PC8QsHX3DRNPH + perceptionEffectId: f9BuTte3v8WWIEgj + createdEventId: ZQd5TlENrS0CRKJl + description:

    Plate Kneecops are solid steel coverings for the knees, offering maximum protection. Essential for heavily armored warriors, they are designed to deflect and absorb impacts during combat.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Homespun + img: systems/sohl/assets/icons/leggings.svg + value: 11 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: HsLeg + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 36 + origWeight: 1.8 + name: Homespun Leggings + id: sZeOP4S45ExliUf3 + durability: 5 + encumbranceEffectId: VKQbzIhYP87CUBUL + perceptionEffectId: kYs2yZSQ3Cv7WnOA + createdEventId: 6Ik0ZS5Rw7xkRQjm + description:

    Homespun Leggings are simple, practical garments woven from homemade fabric. They provide basic coverage and warmth, ideal for everyday wear by common folk.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Linen + img: systems/sohl/assets/icons/leggings.svg + value: 18 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: LLeg + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 36 + origWeight: 1.8 + name: Linen Leggings + id: 4S6YNcPUtxiudy3v + durability: 5 + encumbranceEffectId: rh91VJasKCvSwIcs + perceptionEffectId: y67zE2K4FceefD2l + createdEventId: LrH54szRodBMsjoA + description:

    Linen Leggings are light and breathable, perfect for warmer climates. They offer comfort and ease of movement, suitable for casual or outdoor activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Russet + img: systems/sohl/assets/icons/leggings.svg + value: 43 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: RLeg + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 36 + origWeight: 1.8 + name: Russet Leggings + id: u7mERucQX4pzJLW1 + durability: 7 + encumbranceEffectId: CReCs58Gn8e2I8eV + perceptionEffectId: GbSPPMADv5onbYSm + createdEventId: L9vlEtWJkKIVUzjz + description:

    Crafted from coarse wool dyed reddish-brown, Russet Leggings offer warmth and durability. They are practical for colder climates and rougher environments.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Serge + img: systems/sohl/assets/icons/leggings.svg + value: 22 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: SgLeg + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 36 + origWeight: 1.8 + name: Serge Leggings + id: nsJ9hxNqyW6CC9i2 + durability: 7 + encumbranceEffectId: jHFKkhqP3Q3vMW22 + perceptionEffectId: mdfemxmfYlfGpKP8 + createdEventId: aEPyMPtEt37Mot4X + description:

    Made from durable, twilled fabric, Serge Leggings offer both comfort and resilience. They are suitable for everyday wear, providing reliable coverage and a bit of extra warmth.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Silk + img: systems/sohl/assets/icons/leggings.svg + value: 324 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: SlLeg + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 36 + origWeight: 1.8 + name: Silk Leggings + id: pt7suEF3VyFya7tj + durability: 7 + encumbranceEffectId: 3qS53qU3u8GEvtz0 + perceptionEffectId: tS1Wf3HwZuzRGThe + createdEventId: dAJNciH1BDVrL8v3 + description:

    Silk Leggings are luxurious, soft, and lightweight. Perfect for formal occasions or special events, they add a touch of elegance and refinement to any outfit.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Velvet + img: systems/sohl/assets/icons/leggings.svg + value: 126 + weight: 1.8 + encumbrance: 0 + perception: 0 + abbrev: VLeg + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 36 + origWeight: 1.8 + name: Velvet Leggings + id: IoMYWc6CAHK6VeWQ + durability: 10 + encumbranceEffectId: pqOMctGStExpOyhF + perceptionEffectId: nQTIF8aI1mH4oOBU + createdEventId: Kof0E6GbhzM486LL + description:

    The Velvet Leggings are plush and opulent, ideal for high-status individuals. While not exceptionally durable, their rich texture makes them perfect for formal settings.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Worsted + img: systems/sohl/assets/icons/leggings.svg + value: 86 + weight: 1.4 + encumbrance: 0 + perception: 0 + abbrev: WLeg + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 36 + origWeight: 1.8 + name: Worsted Leggings + id: xqqU1VZTRdHq4E5i + durability: 9 + encumbranceEffectId: eZC8UndwRAbF9rjo + perceptionEffectId: rkpr5Ude9Yt41lZs + createdEventId: hZnp9wT5H6CajGob + description:

    Worsted Leggings, made from tightly-spun wool fibers, offer both warmth and durability. They are versatile and suitable for various activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Buckram + img: systems/sohl/assets/icons/leggings.svg + value: 36 + weight: 1.8 + encumbrance: 0 + perception: 0 + abbrev: BLeg + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 36 + origWeight: 1.8 + name: Buckram Leggings + id: yLOvPrlBZ6ebnvjK + durability: 10 + encumbranceEffectId: 5wM1Z041XTaXxdZZ + perceptionEffectId: QQHQpajTaX4zKONO + createdEventId: oWyXaY92Ky3Xhgiv + description:

    Buckram Leggings are stiff and structured, offering durability and a reliable fit. Made from coarse cloth stiffened with glue, they are suitable for activities requiring a more rigid leg covering.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Cloth + img: systems/sohl/assets/icons/leggings.svg + value: 36 + weight: 1.8 + encumbrance: 0 + perception: 0 + abbrev: CLeg + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 36 + origWeight: 1.8 + name: Cloth Leggings + id: jab9WobC8tFnG38X + durability: 10 + encumbranceEffectId: dNomFmB13w6nIrwu + perceptionEffectId: xM2TeF81OaFfuaoQ + createdEventId: 7rpdnzIVNV1xDdz4 + description:

    Simple and versatile, Cloth Leggings are made from various softer fabrics, offering basic comfort and warmth. They are suitable for everyday activities and casual wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Mail + img: systems/sohl/assets/icons/leggings.svg + value: 540 + weight: 16.2 + encumbrance: 10 + perception: 0 + abbrev: MLeg + material: Mail + flexloc: [] + rigidloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 540 + origWeight: 16.2 + name: Mail Leggings + id: Ghkuoo4JeeEiCFwi + durability: 13 + encumbranceEffectId: QniaVuW1AxoNl8Ie + perceptionEffectId: 3ntUSvCo6vj7k1YF + createdEventId: 89Ehkb8TjukCW8KG + description:

    Mail Leggings, made from interlinked metal rings, provide substantial protection for the legs. They offer excellent defense against slashes while maintaining flexibility.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Padded + img: systems/sohl/assets/icons/leggings.svg + value: 72 + weight: 2.9 + encumbrance: 0 + perception: 0 + abbrev: PLeg + material: Padded + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 72 + origWeight: 2.9 + name: Padded Leggings + id: 53VZLZbt0dYNqcM3 + durability: 10 + encumbranceEffectId: odYtXbMXjw43PlNu + perceptionEffectId: jBvXVBCppcSDDfgh + createdEventId: iFXExI8Cjvgsi0gI + description:

    Padded Leggings offer cushioning and warmth, ideal for wear under heavier armor or on their own. They provide comfort and protection, suitable for both combat and daily wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Leggings + detailMaterial: Scale + img: systems/sohl/assets/icons/leggings.svg + value: 360 + weight: 19.8 + encumbrance: 10 + perception: 0 + abbrev: SLeg + material: Scale + flexloc: [] + rigidloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + - Left Foot + - Right Foot + blunt: 4 + edged: 8 + piercing: 5 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 360 + origWeight: 19.8 + name: Scale Leggings + id: U4tGAFCfCWktT9He + durability: 14 + encumbranceEffectId: PxptjrarxecPniiR + perceptionEffectId: oOG4DQRX6g9JaqQT + createdEventId: ZoYV0XkLPjBPQ6c2 + description:

    Scale Leggings, consisting of overlapping metal scales sewn onto a fabric or leather backing, offer strong protection and reasonable mobility. They are suitable for various combat scenarios.

    + macros: [] + flags: {} + effects: [] +- armorType: Loincloth + detailMaterial: Leather + img: systems/sohl/assets/icons/loincloth.svg + value: 40 + weight: 1.7 + encumbrance: 0 + perception: 0 + abbrev: LtLoin + material: Leather + flexloc: + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 20 + origWeight: 2.8 + name: Leather Loincloth + id: bRhKXEBwFP2IhIpN + durability: 9 + encumbranceEffectId: DVNSc8sRWBrUrEew + perceptionEffectId: c9XOR74ozY7LM79n + createdEventId: mTzvYvfzR9z84BKv + description:

    The Leather Loincloth is a simple yet stylish garment providing basic coverage. Made from lightweight leather, it offers a touch of rugged charm and minimal protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Loincloth + detailMaterial: Cloth + img: systems/sohl/assets/icons/loincloth.svg + value: 10 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: CLoin + material: Cloth + flexloc: + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 10 + origWeight: 0.8 + name: Cloth Loincloth + id: lBpr00sx1aovgJ2G + durability: 10 + encumbranceEffectId: 8EdYk1dH35BGBc68 + perceptionEffectId: LcqMDgd0YyCSBIlo + createdEventId: dNPIvPE3rhozOIOy + description:

    A Cloth Loincloth, made from various soft fabrics, offers basic coverage and comfort. It is suitable for casual wear or light-duty tasks, providing minimal protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Loincloth + detailMaterial: Rawhide + img: systems/sohl/assets/icons/loincloth.svg + value: 20 + weight: 2.8 + encumbrance: 0 + perception: 0 + abbrev: RhLoin + material: Leather + flexloc: + - Pelvis + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 20 + origWeight: 2.8 + name: Rawhide Loincloth + id: 72cG4cFQDyjU5Vhw + durability: 11 + encumbranceEffectId: 99sloO8OazNDWetQ + perceptionEffectId: PCVBdvBWMkItaNaG + createdEventId: Jb1mAgyvSl9EBqZS + description:

    The Rawhide Loincloth is thick and rugged, providing substantial coverage and durability. Ideal for harsh environments, it offers a more protective and sturdy option.

    + macros: [] + flags: {} + effects: [] +- armorType: Long Cowl + detailMaterial: Mail + img: systems/sohl/assets/icons/hood.svg + value: 120 + weight: 3.5 + encumbrance: 5 + perception: -5 + abbrev: MLCowl + material: Mail + flexloc: [] + rigidloc: + - Skull + - Neck + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 120 + origWeight: 3.5 + name: Mail Long Cowl + id: c8QFTgRPMcRvMzlG + durability: 13 + encumbranceEffectId: Ed7CAvHDSH4ZRTyY + perceptionEffectId: aJsTrnpXQScAf7Hh + createdEventId: iquOQrpkYS3bXN29 + description:

    The Mail Long Cowl is made from interlinked metal rings, providing substantial protection for the head, neck, and shoulders. It offers flexibility and defense against slashes, making it essential for combat.

    + macros: [] + flags: {} + effects: [] +- armorType: Long Hauberk + detailMaterial: Mail + img: systems/sohl/assets/icons/chain-mail.svg + value: 960 + weight: 28.8 + encumbrance: 20 + perception: 0 + abbrev: MLHbk + material: Mail + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 960 + origWeight: 28.8 + name: Mail Long Hauberk + id: bfin4kp0gM9ATN6o + durability: 13 + encumbranceEffectId: HIzoUAzVO23Rs3KK + perceptionEffectId: fMoLQE8ypXobbQR5 + createdEventId: Z5Hwy6jb1vsKp27k + description:

    The Mail Long Hauberk is a lengthy chainmail shirt offering significant protection for the torso and upper legs. Its interlinked metal rings provide excellent defense against slashes and thrusts while maintaining flexibility.

    + macros: [] + flags: {} + effects: [] +- armorType: Long Vest + detailMaterial: Leather + img: systems/sohl/assets/icons/leather-armor.svg + value: 296 + weight: 4.1 + encumbrance: 0 + perception: 0 + abbrev: LtLngVst + material: Leather + flexloc: + - Neck + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 148 + origWeight: 6.8 + name: Leather Long Vest + id: H5YLw7I9jUS3EFFD + durability: 9 + encumbranceEffectId: nLPoErgaGBvAEbiU + perceptionEffectId: jEOZlc5EqiMpX20n + createdEventId: 3qUPjjiEif9xGd4K + description:

    The Leather Long Vest provides a stylish outer layer with minimal protection. Lightweight and comfortable, it’s suitable for everyday wear or light adventuring.

    + macros: [] + flags: {} + effects: [] +- armorType: Long Vest + detailMaterial: Gambeson + img: systems/sohl/assets/icons/vest.svg + value: 312 + weight: 10.9 + encumbrance: 5 + perception: 0 + abbrev: GLngVest + material: Gambeson + flexloc: + - Neck + - Left Shoulder + - Right Shoulder + rigidloc: + - Thorax + - Abdomen + - Pelvis + blunt: 6 + edged: 5 + piercing: 4 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 312 + origWeight: 10.9 + name: Gambeson Long Vest + id: 4KmqYgK21xbn1xtr + durability: 11 + encumbranceEffectId: udhEMcFWpOk33N4h + perceptionEffectId: 5nN6uXhzEgqjwTLo + createdEventId: G6iPCKoQUwmq2U8c + description:

    Offering padded protection, the Gambeson Long Vest is ideal for use under armor or as standalone defense. It provides excellent insulation and cushioning, perfect for both combat and daily wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Long Vest + detailMaterial: Rawhide + img: systems/sohl/assets/icons/leather-armor.svg + value: 148 + weight: 6.8 + encumbrance: 5 + perception: 0 + abbrev: RhLngVst + material: Leather + flexloc: + - Neck + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 148 + origWeight: 6.8 + name: Rawhide Long Vest + id: 53XtDmQZDs9ve4ud + durability: 11 + encumbranceEffectId: ObxmwPGufqyhFQvU + perceptionEffectId: adZyigOO7sdCbiDV + createdEventId: tKLhh54TPhdfgjl1 + description:

    The Rawhide Long Vest is thick and rugged, providing substantial torso protection. Ideal for tough environments, it’s more about durability and defense than comfort.

    + macros: [] + flags: {} + effects: [] +- armorType: Longshirt + detailMaterial: Leather + img: systems/sohl/assets/icons/shirt.svg + value: 296 + weight: 4.1 + encumbrance: 0 + perception: 0 + abbrev: LtLgShirt + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 148 + origWeight: 6.8 + name: Leather Longshirt + id: wzjIBWDS7q3T51aP + durability: 9 + encumbranceEffectId: FEXpfbKl3JuN9GMz + perceptionEffectId: B34ADg0yCwSv3TzV + createdEventId: WiIBwVAqBWiwZTft + description:

    The Leather Longshirt is a stylish and practical garment offering minimal protection. It provides a bit more coverage than a standard shirt, suitable for light adventuring or everyday wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Longshirt + detailMaterial: Sealskin + img: systems/sohl/assets/icons/shirt.svg + value: 444 + weight: 8.2 + encumbrance: 0 + perception: 0 + abbrev: SlLgShirt + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: gaC79vNjSo6VO6Ym + origValue: 148 + origWeight: 6.8 + name: Sealskin Longshirt + id: NME5mBMEM08ffCnW + durability: 11 + encumbranceEffectId: 1SVSbOALeF5cwEYj + perceptionEffectId: 2lnW9kqZdyPfpvag + createdEventId: epjnvXDPNsDkQqpL + description:

    Water-resistant and warm, the Sealskin Longshirt is ideal for harsh, wet, and cold environments. It offers excellent protection against the elements while providing comfort.

    + macros: [] + flags: {} + effects: [] +- armorType: Longshirt + detailMaterial: Mail + img: systems/sohl/assets/icons/chain-mail.svg + value: 495 + weight: 14.9 + encumbrance: 5 + perception: 0 + abbrev: MLShirt + material: Mail + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Forearm + - Right Forearm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 495 + origWeight: 14.9 + name: Mail Longshirt + id: aq4ieddUXcVQEAIp + durability: 13 + encumbranceEffectId: YsIT235M0sFmpbHF + perceptionEffectId: CleMscQykbqdfZhc + createdEventId: RAQRxm3s6vgSQe3p + description:

    The Mail Longshirt features interlinked metal rings, providing substantial protection for the torso and upper arms. It offers excellent defense against slashes while maintaining flexibility.

    + macros: [] + flags: {} + effects: [] +- armorType: Longshirt + detailMaterial: Padded + img: systems/sohl/assets/icons/shirt.svg + value: 88 + weight: 3.3 + encumbrance: 0 + perception: 0 + abbrev: PLgSht + material: Padded + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Forearm + - Right Forearm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 88 + origWeight: 3.3 + name: Padded Longshirt + id: KEyHgAcwXIyakJYO + durability: 10 + encumbranceEffectId: 3KDfkOXAumbSQYd9 + perceptionEffectId: jPnQlzUkGMl3AZlr + createdEventId: v2ecPTVHiWovFggV + description:

    A Padded Longshirt offers cushioning and warmth, perfect for additional under-armor padding or as a standalone garment. It provides comfort and protection in both combat and everyday use.

    + macros: [] + flags: {} + effects: [] +- armorType: Longshirt + detailMaterial: Quilted + img: systems/sohl/assets/icons/shirt.svg + value: 150 + weight: 6.6 + encumbrance: 0 + perception: 0 + abbrev: QLgSht + material: Quilted + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Forearm + - Right Forearm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 150 + origWeight: 6.6 + name: Quilted Longshirt + id: 9gYCxdff46CNNtnS + durability: 11 + encumbranceEffectId: z5Ry096c5pb2U6ef + perceptionEffectId: R63wLrwELtwwtbZ2 + createdEventId: TiqiDmgMEa613SuU + description:

    The Quilted Longshirt, made with layers of fabric sewn together, offers excellent insulation and comfort. It’s suitable for colder climates, providing both warmth and a bit of extra protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Homespun + img: systems/sohl/assets/icons/mantle.svg + value: 6 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: HsMntl + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 21 + origWeight: 1.1 + name: Homespun Mantle + id: UZvf4NbfBZ3VhL3c + durability: 5 + encumbranceEffectId: JnkbNXofHhHdW2g2 + perceptionEffectId: hKv2EmY63CLNGMLl + createdEventId: b31NLo4vnsczuvDB + description:

    The Homespun Mantle is a simple and practical cloak woven from homemade fabric. It provides basic protection against the elements, ideal for everyday wear by common folk who need a reliable outer layer.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Linen + img: systems/sohl/assets/icons/mantle.svg + value: 11 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: LMntl + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 21 + origWeight: 1.1 + name: Linen Mantle + id: aigYVihLvZI82Lwo + durability: 5 + encumbranceEffectId: PYG0b4AmMwpWm8Wd + perceptionEffectId: k1FL8QXz3zJPmX8l + createdEventId: zGm1bS9DqyDa6auY + description:

    Light and breathable, the Linen Mantle is perfect for warmer climates. It offers a comfortable layer of sun protection without causing overheating, suitable for casual outdoor activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Russet + img: systems/sohl/assets/icons/mantle.svg + value: 25 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: RMntl + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 21 + origWeight: 1.1 + name: Russet Mantle + id: sPkj4Gps8NB383Al + durability: 7 + encumbranceEffectId: zNiiohlY0Th7zSnS + perceptionEffectId: gKwUBy3coBUmMOcF + createdEventId: trukPuFLIAJ7VqPG + description:

    Made from coarse wool dyed reddish-brown, the Russet Mantle offers warmth and durability. It's well-suited for colder weather and rougher outdoor environments, providing reliable coverage for travelers and laborers alike.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Serge + img: systems/sohl/assets/icons/mantle.svg + value: 13 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: SgMntl + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 21 + origWeight: 1.1 + name: Serge Mantle + id: Y71uixCkKEpN5PlX + durability: 7 + encumbranceEffectId: bq8ovvJyDtIzhcm2 + perceptionEffectId: VZS1umL1IEODLMCd + createdEventId: iezN273G5aFcnb72 + description:

    The Serge Mantle, crafted from durable twilled fabric, offers both comfort and resilience. It is a versatile garment providing good protection against the elements, making it suitable for everyday use.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Silk + img: systems/sohl/assets/icons/mantle.svg + value: 189 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: WMntl + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 21 + origWeight: 1.1 + name: Silk Mantle + id: 9BXkziR9UEkHUFH3 + durability: 7 + encumbranceEffectId: K4lrxXJ7QQmhu4fB + perceptionEffectId: OQl4iKB3SN48ry8J + createdEventId: GbhnXdcUxRmjgl0F + description:

    Exuding elegance and sophistication, the Silk Mantle is a luxurious, lightweight cloak designed for high-status occasions. While it offers minimal protection, its smooth texture and graceful drape make it ideal for formal events.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Velvet + img: systems/sohl/assets/icons/mantle.svg + value: 74 + weight: 1.1 + encumbrance: 0 + perception: 0 + abbrev: VMntl + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 21 + origWeight: 1.1 + name: Velvet Mantle + id: le43MXd8XEkymwFH + durability: 10 + encumbranceEffectId: C5TnhqttCPDY19kj + perceptionEffectId: IoDVqFMrxiKZoLv0 + createdEventId: 3jWoesJEr9ti7Mqf + description:

    Soft and plush, the Velvet Mantle is synonymous with opulence. Though it offers modest weather protection, its rich texture and appearance make it perfect for nobility wishing to make a grand impression.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Worsted + img: systems/sohl/assets/icons/mantle.svg + value: 50 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: WMntl + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 21 + origWeight: 1.1 + name: Worsted Mantle + id: VzcbygkPs5X83tbq + durability: 9 + encumbranceEffectId: 3KgG6xtrhMcWCEFO + perceptionEffectId: UkNtsQ3vvGlMG895 + createdEventId: ZienqXJ3C5drgFBt + description:

    The Worsted Mantle, made from tightly-spun wool fibers, offers both style and durability. It's a practical choice for those needing a cloak that provides good insulation and can withstand regular use.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Beaver + img: systems/sohl/assets/icons/mantle.svg + value: 222 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: BvMntl + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 74 + origWeight: 1.1 + name: Beaver Mantle + id: TzFwvfVq8JLC9dpA + durability: 9 + encumbranceEffectId: npJsIXtGjNox9aty + perceptionEffectId: wQmphvphYRjID0d7 + createdEventId: 5zXm4RCBM5efJKBb + description:

    Made from dense beaver fur, the Beaver Mantle offers exceptional warmth and a touch of luxury. It’s perfect for cold climates, combining function and status for those who require both comfort and elegance.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Ermine + img: systems/sohl/assets/icons/mantle.svg + value: 444 + weight: 0.7 + encumbrance: 0 + perception: 0 + abbrev: EMntl + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 74 + origWeight: 1.1 + name: Ermine Mantle + id: 4gHuf1fVjL3Psjp2 + durability: 7 + encumbranceEffectId: 8x0uBoNCx9LHKGl5 + perceptionEffectId: N5ZWUnToapdSJ7qS + createdEventId: MjdVAMPJcmRt9SNw + description:

    The Ermine Mantle, crafted from soft white ermine fur, signifies wealth and nobility. It provides excellent insulation and a plush texture, ideal for elite individuals needing both warmth and a show of prestige.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Leather + img: systems/sohl/assets/icons/mantle.svg + value: 148 + weight: 0.7 + encumbrance: 0 + perception: 0 + abbrev: LtMntl + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 74 + origWeight: 1.1 + name: Leather Mantle + id: IpCzuxpx6MCKvxqs + durability: 9 + encumbranceEffectId: iPSr5wiKbJaSxEqU + perceptionEffectId: AOQ3yJUUo2Nrj0Xg + createdEventId: eg7U1jO3YctOm8pj + description:

    A Leather Mantle combines rugged style with moderate protection against wind and light rain. It’s an excellent choice for adventurers and travelers who need an outer garment that can withstand the elements.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Buckram + img: systems/sohl/assets/icons/mantle.svg + value: 21 + weight: 1.1 + encumbrance: 0 + perception: 0 + abbrev: BMntl + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 21 + origWeight: 1.1 + name: Buckram Mantle + id: 33Uy6jSYB651BQ0F + durability: 10 + encumbranceEffectId: lTir3gFQv3i2xWJU + perceptionEffectId: gCFJ1LcbwJALwCLc + createdEventId: F2DRgqBuePKjI64l + description:

    The Buckram Mantle is stiff and structured, crafted from coarse cloth stiffened with glue. It offers durability and a reliable fit, suitable for tasks requiring a more rigid, dependable cloak.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Cloth + img: systems/sohl/assets/icons/mantle.svg + value: 21 + weight: 1.1 + encumbrance: 0 + perception: 0 + abbrev: CMntl + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 21 + origWeight: 1.1 + name: Cloth Mantle + id: U6NMQsGHbeg2hH9M + durability: 10 + encumbranceEffectId: Q2E4tvVByk07v1Zy + perceptionEffectId: QvWV1Hh0iTU8PrDw + createdEventId: 2dbmKcyFReJk1Kez + description:

    Simple and versatile, the Cloth Mantle is made from various soft fabrics. It offers basic comfort and warmth, suitable for everyday activities and casual wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Rawhide + img: systems/sohl/assets/icons/mantle.svg + value: 74 + weight: 1.1 + encumbrance: 0 + perception: 0 + abbrev: RhMntl + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 74 + origWeight: 1.1 + name: Rawhide Mantle + id: aB6yRchVrmiDnQj4 + durability: 11 + encumbranceEffectId: QjrQzom5CrYWalL6 + perceptionEffectId: 05UKctZDWlySKJNp + createdEventId: PzLLTvzaNZJrtDPp + description:

    The Rawhide Mantle is thick and rugged, providing substantial protection. Ideal for harsh environments, it offers durable coverage for those needing a reliable outer layer in tough conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Padded + img: systems/sohl/assets/icons/mantle.svg + value: 42 + weight: 1.7 + encumbrance: 0 + perception: 0 + abbrev: PMntl + material: Padded + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 42 + origWeight: 1.7 + name: Padded Mantle + id: YqcL93GXDZ0olH0b + durability: 10 + encumbranceEffectId: RhyumaICK2mWuRky + perceptionEffectId: iozzz5JvcIZY3bEF + createdEventId: xQ3HAGh4am0LyZ1m + description:

    A Padded Mantle offers excellent insulation and warmth, made with cushioning materials. It’s ideal for cold climates, providing both comfort and protection from harsh weather.

    + macros: [] + flags: {} + effects: [] +- armorType: Mantle + detailMaterial: Quilted + img: systems/sohl/assets/icons/mantle.svg + value: 84 + weight: 3.8 + encumbrance: 0 + perception: 0 + abbrev: QMntl + material: Quilted + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 84 + origWeight: 3.8 + name: Quilted Mantle + id: AOTxCBmXguJYUQ3B + durability: 11 + encumbranceEffectId: xTR8DEFozqBMmHc0 + perceptionEffectId: 3J4qhEsciFfE0zxK + createdEventId: rmHPr7hns7CDicAN + description:

    Featuring layers of fabric sewn together, the Quilted Mantle offers exceptional insulation and comfort. It's suitable for colder weather, providing both warmth and a bit of extra protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Mittens + detailMaterial: Beaver + img: systems/sohl/assets/icons/gloves.svg + value: 126 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: BvMitt + material: Leather + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 42 + origWeight: 1.2 + name: Beaver Mittens + id: hfuaWFcDNu2p52cN + durability: 9 + encumbranceEffectId: ccPGokxJyQafnF3c + perceptionEffectId: jRkEKLXLUsiguApv + createdEventId: oHAUWMnSn2SwEvdk + description:

    Beaver Mittens are crafted from dense beaver fur, providing excellent warmth. They’re perfect for cold weather, offering both comfort and a touch of luxury.

    + macros: [] + flags: {} + effects: [] +- armorType: Mittens + detailMaterial: Mail + img: systems/sohl/assets/icons/mailed-fist.svg + value: 75 + weight: 2.3 + encumbrance: 1.67 + perception: 0 + abbrev: MMtn + material: Mail + flexloc: [] + rigidloc: + - Left Hand + - Right Hand + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 75 + origWeight: 2.3 + name: Mail Mittens + id: avIWcFbEXA1n1q99 + durability: 13 + encumbranceEffectId: gzcURPSRno0ASZ2F + perceptionEffectId: gZg1ZKTC36ovqlNv + createdEventId: L12pI5Tgyt1BgrpE + description:

    Mail Mittens, composed of interlinked metal rings, offer substantial protection for the hands. They provide excellent defense against slashes and are essential for combat scenarios.

    + macros: [] + flags: {} + effects: [] +- armorType: Mittens + detailMaterial: Padded + img: systems/sohl/assets/icons/gauntlet.svg + value: 10 + weight: 0.4 + encumbrance: 0 + perception: 0 + abbrev: PMitn + material: Padded + flexloc: + - Left Hand + - Right Hand + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 10 + origWeight: 0.4 + name: Padded Mittens + id: fybBfDAuI4Y3VWFS + durability: 10 + encumbranceEffectId: OHxtKmMslyYash79 + perceptionEffectId: tjH1oCma9vNpeC2r + createdEventId: RaWje0q5V3W2gD4C + description:

    Padded Mittens provide cushioning and warmth, perfect for cold weather or as additional padding beneath other gear. They offer comfort and protection for both combat and daily wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Pants + detailMaterial: Padded + img: systems/sohl/assets/icons/leggings.svg + value: 78 + weight: 3.1 + encumbrance: 0 + perception: 0 + abbrev: PPant + material: Padded + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 78 + origWeight: 3.1 + name: Padded Pants + id: xP9cs4kYsLefFPoV + durability: 10 + encumbranceEffectId: liQf6jwH5mUpEEaD + perceptionEffectId: RURqUin6JiV7dhh5 + createdEventId: RRoB0WZHxwerc1ft + description:

    Padded Pants offer cushioning and warmth, ideal for wear under other armor or on their own. They provide comfort and added protection, suitable for both combat and everyday use.

    + macros: [] + flags: {} + effects: [] +- armorType: Rerebraces + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/dorsal-scales.svg + value: 40 + weight: 3 + encumbrance: 1.67 + perception: 0 + abbrev: KRebr + material: Kûrbúl + flexloc: [] + rigidloc: + - Left Upper Arm + - Right Upper Arm + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 40 + origWeight: 3 + name: Kûrbúl Rerebraces + id: NSpZnxECvhyHfnZd + durability: 13 + encumbranceEffectId: O12gLECLSE93fALk + perceptionEffectId: dO1Q3BghoUgAnxqd + createdEventId: aFTmSInxFTDePHyF + description:

    The Kûrbúl Rerebraces are treated leather upper arm guards offering moderate protection and flexibility. Decorated with intricate designs, they provide both function and visual appeal for those needing lightweight upper arm armor.

    + macros: [] + flags: {} + effects: [] +- armorType: Rerebraces + detailMaterial: Plate + img: systems/sohl/assets/icons/dorsal-scales.svg + value: 160 + weight: 3 + encumbrance: 1.67 + perception: 0 + abbrev: PlRebr + material: Plate + flexloc: [] + rigidloc: + - Left Upper Arm + - Right Upper Arm + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 160 + origWeight: 3 + name: Plate Rerebraces + id: rIqS3psEvVQAojtd + durability: 14 + encumbranceEffectId: htCFpd1yfhFJA4tN + perceptionEffectId: 5KGiMuzEb7DtEQtl + createdEventId: ogOxIorqYItkxD3D + description:

    Plate Rerebraces are solid steel guards for the upper arms, offering maximum protection. Essential for heavily armored warriors, they are designed to deflect and absorb impacts during combat.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Homespun + img: systems/sohl/assets/icons/robe.svg + value: 24 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: HsRobe + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Homespun Robe + id: PZLgToV7Oj7yzbmN + durability: 5 + encumbranceEffectId: UKd6yja50rVJNGnM + perceptionEffectId: b4ymzjV0dXabKMld + createdEventId: 4V47Cj603qJgxAhh + description:

    A simple, practical Homespun Robe made from homemade fabric, providing basic comfort and warmth. Suitable for everyday wear by common folk, it's perfect for those who need a reliable and no-frills garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Linen + img: systems/sohl/assets/icons/robe.svg + value: 40 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: LRobe + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Linen Robe + id: qaJaY0dW8plj1xkj + durability: 5 + encumbranceEffectId: xWcQyhvNKFO3OIuO + perceptionEffectId: aepU9KLAScm4bAvA + createdEventId: ZTxwI3zaPtDD1VZ6 + description:

    Light and breathable, the Linen Robe is perfect for warm weather. It offers comfort and ease of movement, ideal for casual or light-duty wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Russet + img: systems/sohl/assets/icons/robe.svg + value: 95 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: RRobe + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Russet Robe + id: KRWELeez1BO30i9K + durability: 7 + encumbranceEffectId: BJkBlbSYAfgmCb8g + perceptionEffectId: CMj5svdsSUpxXeXD + createdEventId: K6mi4p2VHFK2y624 + description:

    Made from coarse wool dyed reddish-brown, the Russet Robe offers warmth and durability. It's practical for colder climates and rougher environments, providing reliable coverage for various activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Serge + img: systems/sohl/assets/icons/robe.svg + value: 47 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: SgRobe + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Serge Robe + id: gYBqXJZ6kZyBZ7yD + durability: 7 + encumbranceEffectId: UwKTpLczKrsjlUDR + perceptionEffectId: WLhuR5Ai2TSYcF1V + createdEventId: GgNollHlLqrBzFXp + description:

    The Serge Robe is crafted from durable twilled fabric, offering both comfort and resilience. Suitable for everyday wear, it provides a practical and versatile garment perfect for a range of activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Silk + img: systems/sohl/assets/icons/robe.svg + value: 711 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: SlRobe + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Silk Robe + id: V5VTJfydYrwc0m3E + durability: 7 + encumbranceEffectId: 1zYWMJjhggS5UiWR + perceptionEffectId: hgGiX8CaSGQpBzxz + createdEventId: 4UGD58FbGXNmP2SI + description:

    A Silk Robe exudes elegance and sophistication, offering a luxurious, lightweight garment. While it’s not particularly durable, its smooth texture and graceful drape make it perfect for formal occasions and high-status appearances.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Velvet + img: systems/sohl/assets/icons/robe.svg + value: 277 + weight: 4 + encumbrance: 0 + perception: 0 + abbrev: VRobe + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Velvet Robe + id: 4f6sCk1LVGQdKiQE + durability: 10 + encumbranceEffectId: nZNpTAbDKKJw4Ixy + perceptionEffectId: OYbar00X5AkXsvo6 + createdEventId: Vj3nVbspWcIr4VAl + description:

    Soft and plush, the Velvet Robe is a symbol of opulence. It offers modest insulation and is perfect for formal settings, helping high-status individuals make a grand impression.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Worsted + img: systems/sohl/assets/icons/robe.svg + value: 190 + weight: 3.2 + encumbrance: 0 + perception: 0 + abbrev: WRobe + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 79 + origWeight: 4 + name: Worsted Robe + id: A0q2esETFwdkoFnC + durability: 9 + encumbranceEffectId: N6oYh6hpkbFdjZVq + perceptionEffectId: 3I56e5tksxenq0bD + createdEventId: RuSpULwHBj6PwZYO + description:

    The Worsted Robe, made from tightly-spun wool fibers, offers both style and durability. It’s a versatile garment providing good insulation and resilience, suitable for a wide range of activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Leather + img: systems/sohl/assets/icons/robe.svg + value: 450 + weight: 6.1 + encumbrance: 0 + perception: 0 + abbrev: LtRobe + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 225 + origWeight: 10.2 + name: Leather Robe + id: jOvADC4R2QNrbZ8g + durability: 9 + encumbranceEffectId: bhganPgillE12o99 + perceptionEffectId: yVI8PSNZaftRl54g + createdEventId: qxlIZH4IPm1YKwcg + description:

    A Leather Robe combines a touch of rugged style with moderate protection. It’s a unique choice for adventurers and free spirits who need an outer garment that can withstand the elements while making a statement.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Sealskin + img: systems/sohl/assets/icons/robe.svg + value: 675 + weight: 12.2 + encumbrance: 0 + perception: 0 + abbrev: SlRobe + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: gaC79vNjSo6VO6Ym + origValue: 225 + origWeight: 10.2 + name: Sealskin Robe + id: 6CGHNmCXlTfr3hnX + durability: 11 + encumbranceEffectId: Ix50VIg7rMTyOX17 + perceptionEffectId: usdkBsaU9GKZMUFV + createdEventId: hAj79tMvXpCZCxiJ + description:

    Water-resistant and warm, the Sealskin Robe is ideal for harsh, wet, and cold environments. It provides excellent protection against the elements, perfect for seafaring folk or those living in extreme conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Buckram + img: systems/sohl/assets/icons/robe.svg + value: 79 + weight: 4 + encumbrance: 0 + perception: 0 + abbrev: BRobe + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 79 + origWeight: 4 + name: Buckram Robe + id: uRrqN1cdZ6lfdKtp + durability: 10 + encumbranceEffectId: tclOSbf5upy3CdBh + perceptionEffectId: PvQkWpAo9xMAESGF + createdEventId: LXLrNFbjLeJHZ32p + description:

    The Buckram Robe is stiff and structured, made from coarse cloth stiffened with glue. It offers durability and reliable coverage, suitable for tasks requiring a more rigid and dependable garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Robe + detailMaterial: Cloth + img: systems/sohl/assets/icons/robe.svg + value: 79 + weight: 4 + encumbrance: 0 + perception: 0 + abbrev: CRobe + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 79 + origWeight: 4 + name: Cloth Robe + id: iJVAEAaH6MWRkLr3 + durability: 10 + encumbranceEffectId: LQc24Ugq7Ck2dh6O + perceptionEffectId: ticMrIM8c7ir1o4T + createdEventId: o1lanScztzgQ6Q1U + description:

    Simple and versatile, the Cloth Robe is made from various soft fabrics, providing basic comfort and warmth. Suitable for everyday activities and casual wear, it’s a practical and adaptable garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Sandals + detailMaterial: Straw + img: systems/sohl/assets/icons/sandals.svg + value: 5 + weight: 0.1 + encumbrance: 0 + perception: 0 + abbrev: StShoes + material: Cloth + flexloc: + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 15 + origWeight: 0.3 + name: Straw Sandals + id: IUAochbD7cnF5a32 + durability: 5 + encumbranceEffectId: 459Mss5gDqhP1713 + perceptionEffectId: M8M5BePdmLwd1pNs + createdEventId: o4ARBd5SMLO46h8E + description:

    Straw Sandals offer light and breathable footwear, perfect for hot climates. They provide minimal protection but ensure maximum comfort and airflow, making them ideal for everyday use.

    + macros: [] + flags: {} + effects: [] +- armorType: Sandals + detailMaterial: Leather + img: systems/sohl/assets/icons/sandals.svg + value: 50 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: LtSandles + material: Leather + flexloc: + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 25 + origWeight: 0.5 + name: Leather Sandals + id: B5LgQSAIwa3kcWcB + durability: 9 + encumbranceEffectId: MczbMtzhgEPc7DZX + perceptionEffectId: jz32cNBcE3kjHo6q + createdEventId: UU4Bq2TfIyt7HqDM + description:

    Leather Sandals combine style and moderate protection, providing lightweight and comfortable footwear. Suitable for casual outings or light adventuring, they offer a touch of rugged charm.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Linen + img: systems/sohl/assets/icons/shirt.svg + value: 17 + weight: 0.4 + encumbrance: 0 + perception: 0 + abbrev: LShirt + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 33 + origWeight: 1.7 + name: Linen Shirt + id: EX2tDSszdoC2fVUJ + durability: 5 + encumbranceEffectId: m8UllLKzOqwQz9wU + perceptionEffectId: XFEWv0N7AWbsZaRD + createdEventId: 5aabZtoUBk8iZbVj + description:

    A Linen Shirt is light and breathable, perfect for warm climates. It offers comfort and ease of movement, making it ideal for casual wear and everyday activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Russet + img: systems/sohl/assets/icons/shirt.svg + value: 40 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: RShirt + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 33 + origWeight: 1.7 + name: Russet Shirt + id: uDB8XN1vrnjvwKLk + durability: 7 + encumbranceEffectId: wHGQD5ThQzLihLgT + perceptionEffectId: hLHvkexCXtdybb8L + createdEventId: uykFZ8otDmPja4Iu + description:

    Made from coarse wool dyed reddish-brown, the Russet Shirt offers warmth and durability. It’s practical for colder weather and rough environments, providing reliable coverage.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Serge + img: systems/sohl/assets/icons/shirt.svg + value: 20 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: SgShirt + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 33 + origWeight: 1.7 + name: Serge Shirt + id: 6XYJh6c1xRgtfDKw + durability: 7 + encumbranceEffectId: PEQV89tVtSx78Fn9 + perceptionEffectId: GP9ap6vJAPLff8Rr + createdEventId: q9zzSS01ZETIrbKo + description:

    The Serge Shirt, made from durable twilled fabric, offers both comfort and resilience. Suitable for everyday wear, it provides a practical and versatile garment for various activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Silk + img: systems/sohl/assets/icons/shirt.svg + value: 297 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: SlShirt + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 33 + origWeight: 1.7 + name: Silk Shirt + id: Vh1VmLvbWJOSmjxy + durability: 7 + encumbranceEffectId: MBEWX8OuJBkaXitA + perceptionEffectId: wKfm7cownXk8prp6 + createdEventId: nQYCNqnjyBhaIiL5 + description:

    A Silk Shirt exudes elegance and sophistication, providing a luxurious, lightweight garment. Perfect for formal occasions and high-status appearances, it adds a touch of refinement to any outfit.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Velvet + img: systems/sohl/assets/icons/shirt.svg + value: 116 + weight: 1.7 + encumbrance: 0 + perception: 0 + abbrev: VShirt + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 33 + origWeight: 1.7 + name: Velvet Shirt + id: 7D4y2akbQuQ76r3U + durability: 10 + encumbranceEffectId: b5hALpBRlHE6TG2g + perceptionEffectId: aLKBNDfIXzQqS3p4 + createdEventId: pre8tEfVSMDmAv1R + description:

    Soft and plush, the Velvet Shirt symbolizes opulence. While it may not be particularly durable, its rich texture and appearance make it perfect for formal settings and high-status individuals.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Worsted + img: systems/sohl/assets/icons/shirt.svg + value: 79 + weight: 1.4 + encumbrance: 0 + perception: 0 + abbrev: WShirt + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 33 + origWeight: 1.7 + name: Worsted Shirt + id: msv34g3ueRmDyLm9 + durability: 9 + encumbranceEffectId: BWapyjuMoMN60oTo + perceptionEffectId: UVv3i3UEgftWhLgO + createdEventId: UUtgbc7x0VQvoXnB + description:

    The Worsted Shirt, made from tightly-spun wool fibers, offers both style and durability. It is a versatile garment providing good insulation and resilience, suitable for a wide range of activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Beaver + img: systems/sohl/assets/icons/shirt.svg + value: 165 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: BvShirt + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 55 + origWeight: 2.5 + name: Beaver Shirt + id: OnydVei9IlAs6oN2 + durability: 9 + encumbranceEffectId: OEYcArjdiAjz2OYi + perceptionEffectId: ei9HDz0vkuo8XWXF + createdEventId: mnfqJu7nCKb4jfli + description:

    A Beaver Shirt, made from dense beaver fur, offers exceptional warmth and a touch of luxury. Perfect for cold climates, it combines function and status, providing both comfort and elegance.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Ermine + img: systems/sohl/assets/icons/shirt.svg + value: 330 + weight: 1.5 + encumbrance: 0 + perception: 0 + abbrev: EShirt + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 55 + origWeight: 2.5 + name: Ermine Shirt + id: O6mKuiEtWdree6rU + durability: 7 + encumbranceEffectId: n6AGAXnKvIFQag1Y + perceptionEffectId: Q3gkEl34DYgFfdME + createdEventId: DZNaKIUIbjc6rotq + description:

    Made from soft white ermine fur, the Ermine Shirt signifies high status and wealth. It offers excellent insulation and a plush texture, ideal for elite individuals needing both warmth and a show of prestige.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Leather + img: systems/sohl/assets/icons/shirt.svg + value: 110 + weight: 1.5 + encumbrance: 0 + perception: 0 + abbrev: LtShirt + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 55 + origWeight: 2.5 + name: Leather Shirt + id: PZeYSQZJsOtyrcYg + durability: 9 + encumbranceEffectId: taj5U06UaCM6YL7h + perceptionEffectId: GOl9ZY6DJImU5r8M + createdEventId: Q7nF6YdljyVm219z + description:

    A Leather Shirt offers a stylish and practical garment, providing minimal protection. Lightweight and comfortable, it’s suitable for everyday wear or light adventuring.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Sealskin + img: systems/sohl/assets/icons/shirt.svg + value: 165 + weight: 3 + encumbrance: 0 + perception: 0 + abbrev: SlShirt + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: gaC79vNjSo6VO6Ym + origValue: 55 + origWeight: 2.5 + name: Sealskin Shirt + id: bjrIJQKkWbb5bHgQ + durability: 11 + encumbranceEffectId: mjOiorWpyo9ETx15 + perceptionEffectId: ChrDChRV1Yul6Bwu + createdEventId: JKZFsohyB7LhuKze + description:

    Water-resistant and warm, the Sealskin Shirt is ideal for harsh, wet, and cold environments. It offers excellent protection against the elements while providing comfort for seafaring folk or those living in extreme conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Buckram + img: systems/sohl/assets/icons/shirt.svg + value: 33 + weight: 1.7 + encumbrance: 0 + perception: 0 + abbrev: BShirt + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 33 + origWeight: 1.7 + name: Buckram Shirt + id: iKaBofexaEGYsBqs + durability: 10 + encumbranceEffectId: 7NjFnpuYNZUDxeqy + perceptionEffectId: AOWCIsWSU19Aai32 + createdEventId: sokAZP4goqjnja2T + description:

    The Buckram Shirt is stiff and structured, crafted from coarse cloth stiffened with glue. It offers durability and a reliable fit, suitable for tasks requiring a more rigid garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Cloth + img: systems/sohl/assets/icons/shirt.svg + value: 33 + weight: 1.7 + encumbrance: 0 + perception: 0 + abbrev: CShirt + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 33 + origWeight: 1.7 + name: Cloth Shirt + id: DAsK1fJAoyZ6zH2t + durability: 10 + encumbranceEffectId: vrvKzkA31KlS6LD3 + perceptionEffectId: 1EhnAdzCJ0a63Its + createdEventId: aNA5suanozvMUASQ + description:

    Simple and versatile, the Cloth Shirt is made from various soft fabrics. It offers basic comfort and coverage, suitable for everyday activities and casual wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Gambeson + img: systems/sohl/assets/icons/shirt.svg + value: 280 + weight: 9.8 + encumbrance: 0 + perception: 0 + abbrev: GSht + material: Gambeson + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: + - Thorax + - Abdomen + blunt: 6 + edged: 5 + piercing: 4 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 280 + origWeight: 9.8 + name: Gambeson Shirt + id: 9erXPNuxNyuNqgMj + durability: 11 + encumbranceEffectId: 0ecjr4p4oTLVfuSd + perceptionEffectId: dZxTdAuKqWTmgN3M + createdEventId: sTD0ZDOvVguKY1GU + description:

    The Gambeson Shirt is padded for protection, often worn under armor or as standalone defense. It provides excellent insulation and cushioning, perfect for both combat and daily use.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Mail + img: systems/sohl/assets/icons/mail-shirt.svg + value: 240 + weight: 13.2 + encumbrance: 1.67 + perception: 0 + abbrev: MShirt + material: Mail + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 240 + origWeight: 13.2 + name: Mail Shirt + id: 0S3xT8nBEex8PZJC + durability: 13 + encumbranceEffectId: 4mevkDZODRbFeZE9 + perceptionEffectId: vRZqPMzPcvz1j9dS + createdEventId: 6cfB3dyMByL2gv62 + description:

    A Mail Shirt, crafted from interlinked metal rings, provides substantial protection for the torso and upper arms. It offers excellent defense against slashes while maintaining flexibility.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Padded + img: systems/sohl/assets/icons/shirt.svg + value: 66 + weight: 2.6 + encumbrance: 0 + perception: 0 + abbrev: PSht + material: Padded + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 66 + origWeight: 2.6 + name: Padded Shirt + id: cHdatBhdqbwF9QOW + durability: 10 + encumbranceEffectId: invMmgv4X3qDbd5F + perceptionEffectId: S273ohbc1Nu71ssO + createdEventId: Sv2WahA9zx68AHOX + description:

    Padded for warmth and cushioning, the Padded Shirt is perfect for cold weather or additional under-armor padding. It offers both comfort and protection, making it suitable for both combat and everyday wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Shirt + detailMaterial: Quilted + img: systems/sohl/assets/icons/shirt.svg + value: 132 + weight: 5.9 + encumbrance: 0 + perception: 0 + abbrev: QSht + material: Quilted + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Thorax + - Abdomen + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 132 + origWeight: 5.9 + name: Quilted Shirt + id: 1PX2nWbi5SJprAL8 + durability: 11 + encumbranceEffectId: EYaOTKSHgBawg4q1 + perceptionEffectId: RG79N2oEAl1Rkc1C + createdEventId: SLfKYJ0XGQg22ynX + description:

    The Quilted Shirt, with layers of fabric sewn together, offers excellent insulation and comfort. Suitable for colder climates, it provides both warmth and a bit of extra protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Shoes + detailMaterial: Leather + img: systems/sohl/assets/icons/shoe.svg + value: 70 + weight: 0.9 + encumbrance: 0 + perception: 0 + abbrev: LtShoe + material: Leather + flexloc: + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 35 + origWeight: 1.5 + name: Leather Shoes + id: azbghyIOYFa5SZ9U + durability: 9 + encumbranceEffectId: ieEX60k3Jp51PJFD + perceptionEffectId: eoNILrZZINBPjLeZ + createdEventId: i5wglbz2FTLEl8jk + description:

    Leather Shoes provide lightweight and comfortable footwear, perfect for everyday wear. They offer a touch of rugged charm and minimal protection, suitable for casual activities and light adventuring.

    + macros: [] + flags: {} + effects: [] +- armorType: Shoes + detailMaterial: Cloth + img: systems/sohl/assets/icons/shoe.svg + value: 25 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: CShoe + material: Cloth + flexloc: + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 25 + origWeight: 1 + name: Cloth Shoes + id: PdjsDqu1IfqSbEeZ + durability: 10 + encumbranceEffectId: DMuojFUO6YH4oaqr + perceptionEffectId: SrJnDjbKISbYKefl + createdEventId: d1f9G6SE7fuq8AnO + description:

    Cloth Shoes, made from various soft and breathable fabrics, offer basic comfort and minimal protection. They are suitable for casual wear, ideal for light-duty activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Shoes + detailMaterial: Rawhide + img: systems/sohl/assets/icons/shoe.svg + value: 35 + weight: 1.5 + encumbrance: 0 + perception: 0 + abbrev: RhShoe + material: Leather + flexloc: + - Left Foot + - Right Foot + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 35 + origWeight: 1.5 + name: Rawhide Shoes + id: 60eXCKPwcOPZTzZi + durability: 11 + encumbranceEffectId: cFl3spq2V8U3C6GB + perceptionEffectId: gxokQLmwYcJxzLiZ + createdEventId: bnPafSNXXh24dDX5 + description:

    Rawhide Shoes are thick and rugged, providing substantial protection and durability. Ideal for tough environments, they offer reliable footwear for those needing sturdy and dependable shoes.

    + macros: [] + flags: {} + effects: [] +- armorType: Skirt + detailMaterial: Homespun + img: systems/sohl/assets/icons/skirt.svg + value: 12 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: HsSkirt + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 40 + origWeight: 3 + name: Homespun Skirt + id: IRqGCmpKWdH50HS7 + durability: 5 + encumbranceEffectId: 2J0cYhnZC1ovIyu0 + perceptionEffectId: MDS8yQjjEl4DPuvD + createdEventId: UnwAKKcTuWnvPDxu + description:

    A Homespun Skirt is a simple and practical garment woven from homemade fabric. It provides basic coverage and comfort, ideal for everyday wear by common folk.

    + macros: [] + flags: {} + effects: [] +- armorType: Skirt + detailMaterial: Linen + img: systems/sohl/assets/icons/skirt.svg + value: 20 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: LSkirt + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 40 + origWeight: 3 + name: Linen Skirt + id: Ap6kgcJrmy9vqhRb + durability: 5 + encumbranceEffectId: izUBX8aHk2YPrRlS + perceptionEffectId: t8Q2Vx0G9YjMJeGY + createdEventId: VpQzKFFWD2UUAI8f + description:

    Light and breathable, the Linen Skirt is perfect for warm weather. It offers comfort and ease of movement, suitable for casual outings and everyday activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Skirt + detailMaterial: Russet + img: systems/sohl/assets/icons/skirt.svg + value: 48 + weight: 1.5 + encumbrance: 0 + perception: 0 + abbrev: RSkirt + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 40 + origWeight: 3 + name: Russet Skirt + id: SW4OgVNdC0ukic4h + durability: 7 + encumbranceEffectId: 7UzVczMCyzpvyfTh + perceptionEffectId: gC5EbebcdCPnKvFh + createdEventId: qDpomAk6nQPxxv8W + description:

    Made from coarse wool dyed reddish-brown, the Russet Skirt offers warmth and durability. It is practical for colder climates and rougher environments, providing reliable coverage.

    + macros: [] + flags: {} + effects: [] +- armorType: Skirt + detailMaterial: Serge + img: systems/sohl/assets/icons/skirt.svg + value: 24 + weight: 1.5 + encumbrance: 0 + perception: 0 + abbrev: SgSkirt + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 40 + origWeight: 3 + name: Serge Skirt + id: 6tdOtAzqR0qCPvSu + durability: 7 + encumbranceEffectId: Y6rVsO1Y6AZUB3Mq + perceptionEffectId: oJhC2tu7dqCX321D + createdEventId: CwTCtKNwsuaKm96M + description:

    The Serge Skirt, crafted from durable twilled fabric, offers both comfort and resilience. Suitable for everyday wear, it provides a practical and versatile garment for various activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Skirt + detailMaterial: Straw + img: systems/sohl/assets/icons/skirt.svg + value: 12 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: StSkirt + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 40 + origWeight: 3 + name: Straw Skirt + id: C8kMQSCaj1AVj4Js + durability: 5 + encumbranceEffectId: bbJCALEwLYkr8OZv + perceptionEffectId: Zts7L6NzmMxHoyyR + createdEventId: XV82NvrKmKpraQui + description:

    The Straw Skirt is lightweight and breathable, providing a unique and airy garment. Ideal for hot climates, it offers minimal protection but ensures maximum comfort and airflow.

    + macros: [] + flags: {} + effects: [] +- armorType: Skirt + detailMaterial: Worsted + img: systems/sohl/assets/icons/skirt.svg + value: 96 + weight: 2.4 + encumbrance: 0 + perception: 0 + abbrev: WSkirt + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 40 + origWeight: 3 + name: Worsted Skirt + id: LpWVh6EWHfPEI7qh + durability: 9 + encumbranceEffectId: qVoB9xIGbK4qKSlu + perceptionEffectId: Z1kGcY3bs29IhGyQ + createdEventId: MIN4IlsYqodpyhLL + description:

    The Worsted Skirt, made from tightly-spun wool fibers, offers both style and durability. It is a versatile garment that provides good insulation and resilience, suitable for a wide range of activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Skirt + detailMaterial: Leather + img: systems/sohl/assets/icons/skirt.svg + value: 130 + weight: 2.4 + encumbrance: 0 + perception: 0 + abbrev: LtSkirt + material: Leather + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 65 + origWeight: 4 + name: Leather Skirt + id: Q8xeNnOi9oYG4mi4 + durability: 9 + encumbranceEffectId: nRdceqRRbpOrGSyj + perceptionEffectId: izn9Q7ynVXi1B4Sp + createdEventId: oTIJS76sg4z2zpzj + description:

    A Leather Skirt combines a touch of rugged style with minimal protection. Lightweight and comfortable, it’s suitable for everyday wear or light adventuring, adding a bit of edge to the wearer’s attire.

    + macros: [] + flags: {} + effects: [] +- armorType: Skirt + detailMaterial: Buckram + img: systems/sohl/assets/icons/skirt.svg + value: 40 + weight: 3 + encumbrance: 0 + perception: 0 + abbrev: BSkirt + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 40 + origWeight: 3 + name: Buckram Skirt + id: 6xB4GGdITq1pypDp + durability: 10 + encumbranceEffectId: nXMHin46w9apzlcu + perceptionEffectId: XEXea1gHwobF4sQ9 + createdEventId: VfOFmiM4BDpxoE3L + description:

    The Buckram Skirt is stiff and structured, crafted from coarse cloth stiffened with glue. It offers durability and a reliable fit, suitable for tasks requiring a more rigid and dependable garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Skirt + detailMaterial: Rawhide + img: systems/sohl/assets/icons/skirt.svg + value: 65 + weight: 4 + encumbrance: 0 + perception: 0 + abbrev: RhSkirt + material: Leather + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 65 + origWeight: 4 + name: Rawhide Skirt + id: m8Ti0cVygASSOrTQ + durability: 11 + encumbranceEffectId: ju3QDMDU55MkNWTt + perceptionEffectId: 8BwCpIGIltfKGVQB + createdEventId: YWyTlyymPfU4TZFt + description:

    The Rawhide Skirt is thick and rugged, offering substantial protection and durability. Ideal for harsh environments, it provides a sturdy and reliable garment for those needing extra toughness.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Byrnie + detailMaterial: Mail + img: systems/sohl/assets/icons/chain-mail.svg + value: 400 + weight: 22 + encumbrance: 10 + perception: 0 + abbrev: MSByr + material: Mail + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 400 + origWeight: 22 + name: Mail Sleeved Byrnie + id: ygNXuXwb1q7MqoUg + durability: 13 + encumbranceEffectId: 1MlIbg8YyxvjjAgE + perceptionEffectId: PgWAI3jymshHLrmM + createdEventId: 4H6Wp2JLnPFEaXtf + description:

    The Mail Sleeved Byrnie is a long chainmail shirt with sleeves, offering substantial protection for the torso and arms. Its interlinked metal rings provide excellent defense against slashes and thrusts, making it essential for combat.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Byrnie + detailMaterial: Scale + img: systems/sohl/assets/icons/scale-mail.svg + value: 400 + weight: 22 + encumbrance: 15 + perception: 0 + abbrev: SSlByrn + material: Scale + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Left Forearm + - Right Forearm + - Thorax + - Abdomen + - Pelvis + blunt: 4 + edged: 8 + piercing: 5 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 400 + origWeight: 22 + name: Scale Sleeved Byrnie + id: VhBCW3Mjk1txZTSD + durability: 14 + encumbranceEffectId: w64I5lIQwtEv7eHK + perceptionEffectId: S7rTbCZHYPHoXhUv + createdEventId: lPshuAI9H1150Owf + description:

    The Scale Sleeved Byrnie, consisting of overlapping metal scales sewn onto a fabric or leather backing, provides strong protection for the torso and arms. It maintains flexibility, suitable for various combat scenarios.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Homespun + img: systems/sohl/assets/icons/tunic.svg + value: 15 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: HsTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 50 + origWeight: 2.5 + name: Homespun Sleeved Tunic + id: Xkx1C1ujy1IJsnA8 + durability: 5 + encumbranceEffectId: 4uwSZtHfwbUzKJPo + perceptionEffectId: P75NNZArDeRykh2Q + createdEventId: TcyeIDlZ4A0H0HJD + description:

    A simple, practical Homespun Sleeved Tunic made from homemade fabric, providing basic comfort and warmth. It is suitable for everyday wear by common folk, offering a reliable and no-frills garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Linen + img: systems/sohl/assets/icons/tunic.svg + value: 25 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: LTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 50 + origWeight: 2.5 + name: Linen Sleeved Tunic + id: S4B3vbw6UUUlWFKB + durability: 5 + encumbranceEffectId: lmx4oviYfGwmcVUj + perceptionEffectId: xjRnc217iP2FWFy7 + createdEventId: uKMXhV3DQCy7rqva + description:

    Light and breathable, the Linen Sleeved Tunic is perfect for warm weather. It offers comfort and ease of movement, making it ideal for casual outings and everyday activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Russet + img: systems/sohl/assets/icons/tunic.svg + value: 60 + weight: 1.3 + encumbrance: 0 + perception: 0 + abbrev: RTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 50 + origWeight: 2.5 + name: Russet Sleeved Tunic + id: N68os63k3FdA8k8B + durability: 7 + encumbranceEffectId: EPRT4Yys2MN0SrlZ + perceptionEffectId: SQjgAFWVArDO25Lb + createdEventId: t9LEqHFQs7xlT3cS + description:

    Crafted from coarse wool dyed reddish-brown, the Russet Sleeved Tunic offers warmth and durability. It is practical for colder weather and rougher environments, providing reliable coverage.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Serge + img: systems/sohl/assets/icons/tunic.svg + value: 30 + weight: 1.3 + encumbrance: 0 + perception: 0 + abbrev: SgTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 50 + origWeight: 2.5 + name: Serge Sleeved Tunic + id: iVcjJBw0iJAltjIm + durability: 7 + encumbranceEffectId: dmaitbQQ2kE2dWRu + perceptionEffectId: IZqe3AvLox9Bc9SG + createdEventId: M7cA0NTrxDtqeL9R + description:

    The Serge Sleeved Tunic, made from durable twilled fabric, offers both comfort and resilience. Suitable for everyday wear, it provides a practical and versatile garment for various activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Silk + img: systems/sohl/assets/icons/tunic.svg + value: 450 + weight: 1.3 + encumbrance: 0 + perception: 0 + abbrev: SlSTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 50 + origWeight: 2.5 + name: Silk Sleeved Tunic + id: TH6f8H6eFKRCm3PD + durability: 7 + encumbranceEffectId: A0tg3k8ZGwXWa6bD + perceptionEffectId: avpKtbfDb7qPTpbv + createdEventId: 0H8gLr1HvlXQ15dr + description:

    A Silk Sleeved Tunic exudes elegance and sophistication. Lightweight and flowing, it is perfect for formal occasions or high-status events where appearance matters more than ruggedness.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Velvet + img: systems/sohl/assets/icons/tunic.svg + value: 175 + weight: 2.5 + encumbrance: 0 + perception: 0 + abbrev: VTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 50 + origWeight: 2.5 + name: Velvet Sleeved Tunic + id: 2vB89YZyoq71qUf4 + durability: 10 + encumbranceEffectId: NCj9GUY9IEJgp4pE + perceptionEffectId: xtbBKQQSSgD9qtYx + createdEventId: BD8tned0IuFCUV1J + description:

    Soft and plush, the Velvet Sleeved Tunic is a luxurious garment. While it may not be highly durable, its rich texture and appearance make it perfect for formal settings and high-status individuals.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Worsted + img: systems/sohl/assets/icons/tunic.svg + value: 120 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: WTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 50 + origWeight: 2.5 + name: Worsted Sleeved Tunic + id: 3qQ4AfCkhXOjyWxZ + durability: 9 + encumbranceEffectId: 9z48sS44SXKoV2VG + perceptionEffectId: oHIvuon5WRxT4Ii1 + createdEventId: xcFq5mGqJJf0xHRo + description:

    The Worsted Sleeved Tunic, made from tightly-spun wool fibers, offers both style and durability. It provides good insulation and resilience, making it suitable for a wide range of activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Beaver + img: systems/sohl/assets/icons/tunic.svg + value: 450 + weight: 5.4 + encumbrance: 0 + perception: 0 + abbrev: BvTunic + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 150 + origWeight: 6.8 + name: Beaver Sleeved Tunic + id: EqcWLJ3uKuYLEtEd + durability: 9 + encumbranceEffectId: pQqQnIJclM6Y2Ee5 + perceptionEffectId: XWzib4Uex4cezypm + createdEventId: eCZgxNDLMke00vq2 + description:

    A Beaver Sleeved Tunic, made from dense beaver fur, offers exceptional warmth and a touch of luxury. It’s perfect for cold climates, providing both comfort and elegance.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Leather + img: systems/sohl/assets/icons/tunic.svg + value: 300 + weight: 4.1 + encumbrance: 0 + perception: 0 + abbrev: LtSTunic + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 150 + origWeight: 6.8 + name: Leather Sleeved Tunic + id: ove1Vam9zHfh1C0J + durability: 9 + encumbranceEffectId: oSIAqP0sn8V7Nt2u + perceptionEffectId: uo3TGfmqdXwySamT + createdEventId: A8m2er6tPUcp0tUR + description:

    A Leather Sleeved Tunic combines a rugged look with minimal protection. Lightweight and comfortable, it’s suitable for everyday wear or light adventuring, adding a bit of edge to the wearer’s attire.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Sealskin + img: systems/sohl/assets/icons/tunic.svg + value: 450 + weight: 8.2 + encumbrance: 0 + perception: 0 + abbrev: SlTunic + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: gaC79vNjSo6VO6Ym + origValue: 150 + origWeight: 6.8 + name: Sealskin Sleeved Tunic + id: 0eFyFxbSfwhfWIqs + durability: 11 + encumbranceEffectId: 5P3BmCml2lQR9Ger + perceptionEffectId: qqAd2iZPSLEOnr1u + createdEventId: kYPIayPX1A7OHbWc + description:

    Water-resistant and warm, the Sealskin Sleeved Tunic is ideal for harsh, wet, and cold environments. It offers excellent protection against the elements while providing comfort for seafaring folk or those in extreme conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Buckram + img: systems/sohl/assets/icons/tunic.svg + value: 50 + weight: 2.5 + encumbrance: 0 + perception: 0 + abbrev: BTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 50 + origWeight: 2.5 + name: Buckram Sleeved Tunic + id: Ug3TVOaTkHYlkjYv + durability: 10 + encumbranceEffectId: CM8gYjN1vDBXg6Zi + perceptionEffectId: XFFSMkn3dLOhgJOX + createdEventId: unchBLjRBNp4rX99 + description:

    The Buckram Sleeved Tunic is stiff and structured, offering a durable and reliable fit. Made from coarse cloth stiffened with glue, it’s suitable for tasks requiring a more rigid garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Cloth + img: systems/sohl/assets/icons/tunic.svg + value: 50 + weight: 2.5 + encumbrance: 0 + perception: 0 + abbrev: CTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 50 + origWeight: 2.5 + name: Cloth Sleeved Tunic + id: HfjbHk4FvSO1N2yr + durability: 10 + encumbranceEffectId: JmDU3GrEUYnlze9W + perceptionEffectId: z7uHnEuUlftexhtv + createdEventId: wqPaBYsYU8mIXYJI + description:

    Simple and versatile, the Cloth Sleeved Tunic is made from various soft fabrics, offering basic comfort and coverage. It’s suitable for everyday activities and casual wear, providing a practical and adaptable garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Gambeson + img: systems/sohl/assets/icons/tunic.svg + value: 416 + weight: 14.6 + encumbrance: 10 + perception: 0 + abbrev: GSTnc + material: Gambeson + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + rigidloc: + - Thorax + - Abdomen + - Pelvis + blunt: 6 + edged: 5 + piercing: 4 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 416 + origWeight: 14.6 + name: Gambeson Sleeved Tunic + id: NYauy93nzKmTr2nz + durability: 11 + encumbranceEffectId: 4b2HkCBzp5kEEt6W + perceptionEffectId: Xi6IgiVB3dQucPOE + createdEventId: fJiDiewbMEGHwn3n + description:

    The Gambeson Sleeved Tunic offers padded protection, ideal for use under armor or as standalone defense. It provides excellent insulation and cushioning, perfect for both combat and daily wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Rawhide + img: systems/sohl/assets/icons/tunic.svg + value: 150 + weight: 6.8 + encumbrance: 0 + perception: 0 + abbrev: RhSTunic + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 150 + origWeight: 6.8 + name: Rawhide Sleeved Tunic + id: iGq4R9CH2A7xvsEJ + durability: 11 + encumbranceEffectId: ysmeUXnl6gVzY07g + perceptionEffectId: o2nujTlTgFcPMJ0z + createdEventId: TLRBlWnrTsf1jF01 + description:

    The Rawhide Sleeved Tunic is thick and rugged, providing substantial protection and durability. Ideal for harsh environments, it offers a sturdy and reliable garment for those needing extra toughness.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Padded + img: systems/sohl/assets/icons/tunic.svg + value: 100 + weight: 4 + encumbrance: 0 + perception: 0 + abbrev: PTnc + material: Padded + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 100 + origWeight: 4 + name: Padded Sleeved Tunic + id: M38qbDS0Der82um6 + durability: 10 + encumbranceEffectId: pNDbLcdv77fNdiMl + perceptionEffectId: PtnN6WroocnihapR + createdEventId: j90F2LTOzMWS87uU + description:

    The Padded Sleeved Tunic offers warmth and cushioning, perfect for cold weather or added under-armor protection. It provides both comfort and defense, suitable for a variety of activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Sleeved Tunic + detailMaterial: Quilted + img: systems/sohl/assets/icons/tunic.svg + value: 200 + weight: 9 + encumbrance: 0 + perception: 0 + abbrev: QTnc + material: Quilted + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 200 + origWeight: 9 + name: Quilted Sleeved Tunic + id: 1oS8DKc2S1KAEFh4 + durability: 11 + encumbranceEffectId: pRMkcissmZ4oKYuy + perceptionEffectId: upzXuppxszNZFSQl + createdEventId: glfitwLP7DrAwqn3 + description:

    Featuring layers of fabric stitched together, the Quilted Sleeved Tunic offers excellent insulation and comfort. It's suitable for colder climates and provides a bit of extra protection and warmth.

    + macros: [] + flags: {} + effects: [] +- armorType: Spaulders + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/dorsal-scales.svg + value: 15 + weight: 1.1 + encumbrance: 1.67 + perception: 0 + abbrev: KSpld + material: Kûrbúl + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 15 + origWeight: 1.1 + name: Kûrbúl Spaulders + id: Qes3YkvBf7F5WUIC + durability: 13 + encumbranceEffectId: DRB6ug9YTMpmbJs5 + perceptionEffectId: PKqqlIQqSViQefbO + createdEventId: X0oaortGR1u58zOA + description:

    Kûrbúl Spaulders are shoulder guards made from specially treated leather, offering moderate protection with reduced weight. Decorated with elaborate patterns, they combine functionality with a stylish appearance.

    + macros: [] + flags: {} + effects: [] +- armorType: Spaulders + detailMaterial: Plate + img: systems/sohl/assets/icons/dorsal-scales.svg + value: 60 + weight: 1.1 + encumbrance: 1.67 + perception: 0 + abbrev: PlSpld + material: Plate + flexloc: [] + rigidloc: + - Left Shoulder + - Right Shoulder + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 60 + origWeight: 1.1 + name: Plate Spaulders + id: dgIfKZKmMT6MAWHP + durability: 14 + encumbranceEffectId: cqJODDnY4oMcXph7 + perceptionEffectId: TwZp1VB6MtvH8bQo + createdEventId: 8Ej3Pvxevk2OSv8K + description:

    Plate Spaulders are solid steel shoulder guards offering maximum protection. Essential for heavily armored warriors, they are designed to deflect and absorb impacts during combat.

    + macros: [] + flags: {} + effects: [] +- armorType: Surcoat + detailMaterial: Homespun + img: systems/sohl/assets/icons/tunic.svg + value: 16 + weight: 0.7 + encumbrance: 0 + perception: 0 + abbrev: HsScoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 54 + origWeight: 2.7 + name: Homespun Surcoat + id: KO2z2lfxO4XDeDgQ + durability: 5 + encumbranceEffectId: fXxMsm6IuUdZ8Fsn + perceptionEffectId: BBFuZfdJNkKlKWVl + createdEventId: e1z24fYb28SkwvxJ + description:

    A simple, practical Homespun Surcoat made from homemade fabric, providing basic comfort and coverage. Suitable for everyday wear by common folk, it’s an effective and no-frills outer garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Surcoat + detailMaterial: Linen + img: systems/sohl/assets/icons/tunic.svg + value: 27 + weight: 0.7 + encumbrance: 0 + perception: 0 + abbrev: LScoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 54 + origWeight: 2.7 + name: Linen Surcoat + id: Z2NTw3baAcxU6HVZ + durability: 5 + encumbranceEffectId: 22bRFDCMUxYuQ6tb + perceptionEffectId: uHFAgxUJuWQrW9YY + createdEventId: gHNZw4X4SfZnE9HZ + description:

    Light and breathable, the Linen Surcoat is perfect for warm weather. It offers comfort and ease of movement, suitable for casual wear and outdoor activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Surcoat + detailMaterial: Silk + img: systems/sohl/assets/icons/tunic.svg + value: 486 + weight: 1.4 + encumbrance: 0 + perception: 0 + abbrev: SlScoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 54 + origWeight: 2.7 + name: Silk Surcoat + id: x4xkaTPqlpDkUTD3 + durability: 7 + encumbranceEffectId: TS5y1EWagwPkMfNz + perceptionEffectId: QEWJx0pGKXYMLCMC + createdEventId: HZuD5fjjxSpiOoZw + description:

    Exuding elegance and sophistication, the Silk Surcoat is a luxurious, lightweight garment. While not particularly durable, its smooth texture and graceful drape make it perfect for high-status events and formal occasions.

    + macros: [] + flags: {} + effects: [] +- armorType: Surcoat + detailMaterial: Worsted + img: systems/sohl/assets/icons/tunic.svg + value: 130 + weight: 2.2 + encumbrance: 0 + perception: 0 + abbrev: WScoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 54 + origWeight: 2.7 + name: Worsted Surcoat + id: lOAsiifk2n008r55 + durability: 9 + encumbranceEffectId: xQIrHLenQbDOWWoS + perceptionEffectId: IxW5zNhtUdBlwyKD + createdEventId: mqzTU6uB9xVLjinN + description:

    The Worsted Surcoat, made from tightly-spun wool fibers, offers both style and durability. It provides good insulation and resilience, making it suitable for various activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Surcoat + detailMaterial: Leather + img: systems/sohl/assets/icons/tunic.svg + value: 300 + weight: 4.1 + encumbrance: 0 + perception: 0 + abbrev: LtScoat + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 150 + origWeight: 6.8 + name: Leather Surcoat + id: 3bgdmzalF11m0cP3 + durability: 9 + encumbranceEffectId: ahXB0mnMu0By78qF + perceptionEffectId: ASonQ52QyRTbn66g + createdEventId: nHbpLOkQtokl41NM + description:

    A Leather Surcoat combines rugged style with minimal protection. Lightweight and comfortable, it’s suitable for everyday wear or light adventuring, adding a touch of edge to the wearer’s attire.

    + macros: [] + flags: {} + effects: [] +- armorType: Surcoat + detailMaterial: Buckram + img: systems/sohl/assets/icons/tunic.svg + value: 54 + weight: 2.7 + encumbrance: 0 + perception: 0 + abbrev: BScoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 54 + origWeight: 2.7 + name: Buckram Surcoat + id: kStWc5SBum4uRVel + durability: 10 + encumbranceEffectId: KNLu4mNKs3VQIevR + perceptionEffectId: 6168YBfYCGkCTO8K + createdEventId: UgR0A2U6TkHFEW8A + description:

    The Buckram Surcoat is stiff and structured, made from coarse cloth stiffened with glue. It offers durability and a reliable fit, suitable for tasks requiring a more rigid garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Surcoat + detailMaterial: Cloth + img: systems/sohl/assets/icons/tunic.svg + value: 54 + weight: 2.7 + encumbrance: 0 + perception: 0 + abbrev: CScoat + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 54 + origWeight: 2.7 + name: Cloth Surcoat + id: 1Vw2ZOHjOVbT3SAw + durability: 10 + encumbranceEffectId: XgVens8a3sFAGU3z + perceptionEffectId: IE6XxBYm6aijs890 + createdEventId: 0QOuktT2iWvMuMYi + description:

    Simple and versatile, the Cloth Surcoat is made from various soft fabrics, offering basic comfort and coverage. Suitable for everyday activities and casual wear, it provides a practical and adaptable outer garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Surcoat + detailMaterial: Padded + img: systems/sohl/assets/icons/tunic.svg + value: 108 + weight: 4.3 + encumbrance: 0 + perception: 0 + abbrev: PScoat + material: Padded + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 108 + origWeight: 4.3 + name: Padded Surcoat + id: eIvSqeeeWUSThk7A + durability: 10 + encumbranceEffectId: HCXPtolFLsaNwe4k + perceptionEffectId: qfz7ZDs3Mz0ihShE + createdEventId: 667VyyHxxkcLVLHW + description:

    The Padded Surcoat offers warmth and cushioning, perfect for cold weather or as additional under-armor padding. Providing both comfort and protection, it's suitable for a variety of activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Surcoat + detailMaterial: Quilted + img: systems/sohl/assets/icons/tunic.svg + value: 216 + weight: 9.7 + encumbrance: 0 + perception: 0 + abbrev: QScoat + material: Quilted + flexloc: + - Left Shoulder + - Right Shoulder + - Thorax + - Abdomen + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 216 + origWeight: 9.7 + name: Quilted Surcoat + id: AjtDJo7DKZJ6ZZiQ + durability: 11 + encumbranceEffectId: NU3S7DXfZV7FDCsv + perceptionEffectId: 8ErWIeJjnOgms8rI + createdEventId: 5eDAkT35cgjqHdFI + description:

    The Quilted Surcoat, featuring layers of fabric sewn together, offers excellent insulation and comfort. Suitable for colder climates, it provides warmth and a bit of extra protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Swaddle + detailMaterial: Homespun + img: systems/sohl/assets/icons/leggings.svg + value: 6 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: HsSwd + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 19 + origWeight: 1 + name: Homespun Swaddle + id: uaxz0zjNXPKvbKgq + durability: 5 + encumbranceEffectId: ZAr1cOBZhx0GFGLA + perceptionEffectId: rCS4OIGtjlzCo1ZR + createdEventId: sUxIsIIhdOeaLQwm + description:

    A simple and practical Homespun Swaddle woven from homemade fabric, offering basic comfort and warmth for infants. It provides a reliable and no-frills garment, ideal for everyday use.

    + macros: [] + flags: {} + effects: [] +- armorType: Swaddle + detailMaterial: Linen + img: systems/sohl/assets/icons/leggings.svg + value: 10 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: LnSwd + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 19 + origWeight: 1 + name: Linen Swaddle + id: 0BtXUp0cKZHV5zOJ + durability: 5 + encumbranceEffectId: 18EYvmAXJDDCzLKR + perceptionEffectId: QX0ARkCg2W42D9Gq + createdEventId: 1sBPO380gmu7Zgdb + description:

    Light and breathable, the Linen Swaddle is perfect for warm weather. It offers comfort and ease of movement, making it ideal for infants in hot climates.

    + macros: [] + flags: {} + effects: [] +- armorType: Swaddle + detailMaterial: Russet + img: systems/sohl/assets/icons/leggings.svg + value: 23 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: RSwd + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 19 + origWeight: 1 + name: Russet Swaddle + id: KKOnREJGWQgdgQrf + durability: 7 + encumbranceEffectId: WByGqGkUEgvld6hK + perceptionEffectId: zpsF6DryeUOObWTJ + createdEventId: dWg6zf2TZNiifMJ7 + description:

    Crafted from coarse wool dyed reddish-brown, the Russet Swaddle offers warmth and durability. It’s practical for cooler climates, providing reliable coverage and coziness for infants.

    + macros: [] + flags: {} + effects: [] +- armorType: Swaddle + detailMaterial: Serge + img: systems/sohl/assets/icons/leggings.svg + value: 11 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: SgSwd + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 19 + origWeight: 1 + name: Serge Swaddle + id: HERatr4RrnlU9cW1 + durability: 7 + encumbranceEffectId: Lx0qVtco0rrTGUhe + perceptionEffectId: hPJXEEG68u5y72Jg + createdEventId: vnpDogRl8EkVnhy0 + description:

    The Serge Swaddle is made from durable, twilled fabric, offering excellent comfort and resilience for infants. It provides a practical and reliable garment that can withstand daily use while keeping babies warm and secure.

    + macros: [] + flags: {} + effects: [] +- armorType: Swaddle + detailMaterial: Silk + img: systems/sohl/assets/icons/leggings.svg + value: 171 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: SlSwd + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 19 + origWeight: 1 + name: Silk Swaddle + id: QODYMRoNIoH1Yf0U + durability: 7 + encumbranceEffectId: O08iDQ37Xz6pKqoE + perceptionEffectId: ifUxqCU5aZWJmKJ5 + createdEventId: fWRz7HqxXDVS02A5 + description:

    A Silk Swaddle is the epitome of luxury for infants, providing a soft and lightweight fabric that’s perfect for special occasions. Though it offers less warmth and durability, its smooth texture makes it ideal for formal events where appearance is key.

    + macros: [] + flags: {} + effects: [] +- armorType: Swaddle + detailMaterial: Worsted + img: systems/sohl/assets/icons/leggings.svg + value: 46 + weight: 0.8 + encumbrance: 0 + perception: 0 + abbrev: WSwd + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 19 + origWeight: 1 + name: Worsted Swaddle + id: jyRw6Eak0pvOYHj3 + durability: 9 + encumbranceEffectId: xSWtZP1t7fMbRXOX + perceptionEffectId: JbpwklJs7Eq8fqpy + createdEventId: T7ym2PDYhVtLbDYh + description:

    Crafted from tightly-spun wool fibers, the Worsted Swaddle offers both warmth and durability. Perfect for cooler climates, it provides excellent insulation and comfort for infants, making it a versatile and practical choice.

    + macros: [] + flags: {} + effects: [] +- armorType: Swaddle + detailMaterial: Buckram + img: systems/sohl/assets/icons/leggings.svg + value: 19 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: BSwd + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 19 + origWeight: 1 + name: Buckram Swaddle + id: tOkKHoPnNCRMPwNX + durability: 10 + encumbranceEffectId: mQuY00WGxj2hYyBU + perceptionEffectId: fkZxENgzfAiChZ4Q + createdEventId: Bowp6DRqptB95xRH + description:

    The Buckram Swaddle is stiff and structured, made from coarse cloth stiffened with glue. It offers a more rigid and durable option for infant wear, suitable for those needing a reliable and sturdy garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Swaddle + detailMaterial: Cloth + img: systems/sohl/assets/icons/leggings.svg + value: 19 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: CSwd + material: Cloth + flexloc: + - Left Calf + - Right Calf + - Left Foot + - Right Foot + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 19 + origWeight: 1 + name: Cloth Swaddle + id: Oog2ucPLSX1DNS5r + durability: 10 + encumbranceEffectId: fOl5ljYbjxHSYKys + perceptionEffectId: Tteiy1psFGehLyla + createdEventId: nxP6bhejHc38W3a0 + description:

    Simple and versatile, the Cloth Swaddle is made from a variety of soft fabrics. It offers basic comfort and warmth, making it suitable for everyday use and providing a reliable, adaptable garment for infants.

    + macros: [] + flags: {} + effects: [] +- armorType: Trousers + detailMaterial: Homespun + img: systems/sohl/assets/icons/leggings.svg + value: 12 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: HsTrsr + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 39 + origWeight: 2 + name: Homespun Trousers + id: 0vXYcWGVOgZ0dluZ + durability: 5 + encumbranceEffectId: 2yIrTKncD8IRakUR + perceptionEffectId: tApfvoT6vxMZUNlO + createdEventId: YNiFVHnxcI6PUdtw + description:

    Homespun Trousers are basic, practical legwear woven from homemade fabric. They offer comfort and durability, perfect for laborers and common folk needing reliable, everyday attire.

    + macros: [] + flags: {} + effects: [] +- armorType: Trousers + detailMaterial: Linen + img: systems/sohl/assets/icons/leggings.svg + value: 20 + weight: 0.5 + encumbrance: 0 + perception: 0 + abbrev: LTrsr + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 39 + origWeight: 2 + name: Linen Trousers + id: 34c3qjUvU7GpqMLC + durability: 5 + encumbranceEffectId: 3uYU50epMimxvjrB + perceptionEffectId: YlgcSLORnCuOKj7C + createdEventId: wWt4y2Y1xNIVlVR5 + description:

    Light and breathable, Linen Trousers are ideal for warm weather. They provide comfort and ease of movement, making them suitable for casual wear or light-duty activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Trousers + detailMaterial: Russet + img: systems/sohl/assets/icons/leggings.svg + value: 47 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: RTrsr + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 39 + origWeight: 2 + name: Russet Trousers + id: 2wkYHffHXqavNLuc + durability: 7 + encumbranceEffectId: 0DiJCyVLCFZAqg1m + perceptionEffectId: BzHxV0UT1JfD7uoL + createdEventId: wqcyZnRtqcRGyzKE + description:

    Made from coarse wool dyed reddish-brown, Russet Trousers offer warmth and durability. They are practical for colder climates and outdoor work, providing reliable legwear for various activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Trousers + detailMaterial: Serge + img: systems/sohl/assets/icons/leggings.svg + value: 23 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: SgTrsr + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 39 + origWeight: 2 + name: Serge Trousers + id: 7PUBxAvkFCrBdiyZ + durability: 7 + encumbranceEffectId: VGVwzrKe0JQOsq45 + perceptionEffectId: CLP8AQPBbLRaWP0j + createdEventId: 3hIM17ggjkxtVS5B + description:

    The Serge Trousers are crafted from durable twilled fabric, offering both comfort and resilience. Suitable for everyday wear, they provide a versatile and practical option for a wide range of activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Trousers + detailMaterial: Velvet + img: systems/sohl/assets/icons/leggings.svg + value: 137 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: VTrsr + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 39 + origWeight: 2 + name: Velvet Trousers + id: MfIOArfg0ULNueSB + durability: 10 + encumbranceEffectId: GA88y0a63pYo9N7h + perceptionEffectId: RnUUkoKrdpS4X6ng + createdEventId: B7yfSUYWMTdboBCm + description:

    Velvet Trousers bring a touch of luxury and sophistication to any outfit. Soft and plush, they are perfect for high-status events or formal occasions where style and impressiveness are paramount.

    + macros: [] + flags: {} + effects: [] +- armorType: Trousers + detailMaterial: Worsted + img: systems/sohl/assets/icons/leggings.svg + value: 94 + weight: 1.6 + encumbrance: 0 + perception: 0 + abbrev: WTrsr + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 39 + origWeight: 2 + name: Worsted Trousers + id: JK2jkjV7EPZXyLxJ + durability: 9 + encumbranceEffectId: QbgHUo5iTUtCbHX1 + perceptionEffectId: 2W67w4JIOj4e3lKj + createdEventId: MAtalLUHn4M0uf3K + description:

    Made from tightly-spun wool fibers, Worsted Trousers offer warmth and durability. They are versatile and suitable for various activities and weather conditions, providing a reliable and stylish option.

    + macros: [] + flags: {} + effects: [] +- armorType: Trousers + detailMaterial: Buckram + img: systems/sohl/assets/icons/leggings.svg + value: 39 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: BTrsr + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 39 + origWeight: 2 + name: Buckram Trousers + id: XB38UDLulxgQYJlz + durability: 10 + encumbranceEffectId: ZsDk2851IzGOu1hQ + perceptionEffectId: bzVDxivx8B4wW87r + createdEventId: MdDmkLcLYHsKqONK + description:

    The Buckram Trousers are stiff and structured, crafted from coarse cloth stiffened with glue. They offer durability and a reliable fit, suitable for tasks requiring a more rigid and dependable garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Trousers + detailMaterial: Cloth + img: systems/sohl/assets/icons/leggings.svg + value: 39 + weight: 2 + encumbrance: 0 + perception: 0 + abbrev: CTrsr + material: Cloth + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 39 + origWeight: 2 + name: Cloth Trousers + id: fzL4qWkf0Paapldb + durability: 10 + encumbranceEffectId: MO82ZHQV2Y9LbJzh + perceptionEffectId: f2IFhgSFdwwePqi1 + createdEventId: K1blacY7AtJvwB0s + description:

    Simple and versatile, Cloth Trousers are made from softer fabrics, offering basic comfort and warmth. They are ideal for everyday activities and casual wear, providing a practical and adaptable garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Trousers + detailMaterial: Padded + img: systems/sohl/assets/icons/leggings.svg + value: 78 + weight: 3.1 + encumbrance: 0 + perception: 0 + abbrev: PTrsr + material: Padded + flexloc: + - Pelvis + - Left Thigh + - Right Thigh + - Left Knee + - Right Knee + - Left Calf + - Right Calf + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 78 + origWeight: 3.1 + name: Padded Trousers + id: 1e1c5ihWenaCKRRi + durability: 10 + encumbranceEffectId: Nu3EwkPtLMGGx1id + perceptionEffectId: xTRvE99d43vWLtxe + createdEventId: p5jquGjBBJ1bHLjT + description:

    Padded Trousers offer cushioning and warmth, ideal for wear under other armor or on their own. They provide comfort and added protection, making them suitable for both combat and daily use.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Homespun + img: systems/sohl/assets/icons/tunic.svg + value: 14 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: HsTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 45 + origWeight: 2.3 + name: Homespun Tunic + id: OE8jL0Sf9tCtFK8y + durability: 5 + encumbranceEffectId: 8DlWy7CNhsbK4Qjm + perceptionEffectId: oQ0QaKZXrbwC22Cc + createdEventId: 4jfNK1YgxOYEWs6N + description:

    A simple, practical Homespun Tunic woven from homemade fabric, offering basic comfort and warmth. Suitable for everyday wear by common folk, it’s a reliable and no-frills garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Linen + img: systems/sohl/assets/icons/tunic.svg + value: 23 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: LTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 45 + origWeight: 2.3 + name: Linen Tunic + id: YdLXC8LGyA5fw6v8 + durability: 5 + encumbranceEffectId: uFWlDhh53QmmY4ET + perceptionEffectId: htVePjfKL58eY8m6 + createdEventId: mFYsHuFNFMArY2mP + description:

    Light and breathable, the Linen Tunic is perfect for warm weather. It offers comfort and ease of movement, making it ideal for casual wear and outdoor activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Russet + img: systems/sohl/assets/icons/tunic.svg + value: 54 + weight: 1.2 + encumbrance: 0 + perception: 0 + abbrev: RTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 45 + origWeight: 2.3 + name: Russet Tunic + id: b4hEjLolJgQBubCt + durability: 7 + encumbranceEffectId: Y7FFxRoMQjleTOpQ + perceptionEffectId: EHH9TnmZlmmUDngF + createdEventId: YIcfxCeVJKcz01K7 + description:

    Crafted from coarse wool dyed reddish-brown, the Russet Tunic provides warmth and durability. Practical for colder weather and rougher environments, it offers reliable coverage and comfort.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Serge + img: systems/sohl/assets/icons/tunic.svg + value: 27 + weight: 1.2 + encumbrance: 0 + perception: 0 + abbrev: SgTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 45 + origWeight: 2.3 + name: Serge Tunic + id: x5Y5iaWkvVi1OJZE + durability: 7 + encumbranceEffectId: 1LqrmbjQi7NETmLl + perceptionEffectId: HR6fBBU10YdCaeFO + createdEventId: vO6Tc63GHdDjmCHS + description:

    The Serge Tunic, made from durable twilled fabric, offers both comfort and resilience. Suitable for everyday wear, it provides a practical and versatile garment for various activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Silk + img: systems/sohl/assets/icons/tunic.svg + value: 405 + weight: 1.2 + encumbrance: 0 + perception: 0 + abbrev: SlTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 45 + origWeight: 2.3 + name: Silk Tunic + id: KSqTNpaxI8pbswSW + durability: 7 + encumbranceEffectId: DPtV4Gxqf2JHNNVT + perceptionEffectId: bYqq1jhQwyYbzs62 + createdEventId: p18YWQKKi3vgEmJH + description:

    Exuding elegance and sophistication, the Silk Tunic is a luxurious, lightweight garment. Perfect for formal occasions and high-status events, it adds a touch of refinement to any outfit.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Velvet + img: systems/sohl/assets/icons/tunic.svg + value: 158 + weight: 2.3 + encumbrance: 0 + perception: 0 + abbrev: VTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 45 + origWeight: 2.3 + name: Velvet Tunic + id: dzS7aMyJEuPtWEa7 + durability: 10 + encumbranceEffectId: O7xzqSL3Q8608FIb + perceptionEffectId: rqzLo3entg6m20JB + createdEventId: S2xBVK0bLR6y3APU + description:

    Soft and plush, the Velvet Tunic symbolizes opulence. While not exceptionally durable, its rich texture and appearance make it perfect for formal settings and high-status individuals.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Worsted + img: systems/sohl/assets/icons/tunic.svg + value: 108 + weight: 1.8 + encumbrance: 0 + perception: 0 + abbrev: WTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 45 + origWeight: 2.3 + name: Worsted Tunic + id: M2grH5TbNDo6aj9q + durability: 9 + encumbranceEffectId: 119MsOOaNC6ygEAZ + perceptionEffectId: XbPYvZvRr1NnbLTz + createdEventId: t5THPPU6Jex5wB0n + description:

    The Worsted Tunic, made from tightly-spun wool fibers, offers both style and durability. It provides good insulation and resilience, making it suitable for a wide range of activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Beaver + img: systems/sohl/assets/icons/tunic.svg + value: 444 + weight: 5.4 + encumbrance: 0 + perception: 0 + abbrev: BvTunic + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 148 + origWeight: 6.8 + name: Beaver Tunic + id: Yld391rxNPeVRbFL + durability: 9 + encumbranceEffectId: 9Aa0TcEfmuOx4gn4 + perceptionEffectId: 9aXK0sCy1LxF17Qx + createdEventId: LTNQ1VLXRX2EDpPp + description:

    A Beaver Tunic, made from dense beaver fur, offers exceptional warmth and a touch of luxury. Perfect for cold climates, it combines function and status, providing both comfort and elegance.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Leather + img: systems/sohl/assets/icons/tunic.svg + value: 296 + weight: 4.1 + encumbrance: 0 + perception: 0 + abbrev: LtTunic + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 148 + origWeight: 6.8 + name: Leather Tunic + id: qNXhPkHSOYiSXf4B + durability: 9 + encumbranceEffectId: h58pRDoPrQjK7vXe + perceptionEffectId: WpjDyyslvBKOI1q7 + createdEventId: EEpdvfvUnFfHg5AI + description:

    A Leather Tunic offers a rugged look with minimal protection. Lightweight and comfortable, it’s suitable for everyday wear or light adventuring, adding a bit of edge to the wearer’s attire.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Sealskin + img: systems/sohl/assets/icons/tunic.svg + value: 444 + weight: 8.2 + encumbrance: 0 + perception: 0 + abbrev: SlTunic + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: gaC79vNjSo6VO6Ym + origValue: 148 + origWeight: 6.8 + name: Sealskin Tunic + id: QGipKynUqrosINd6 + durability: 11 + encumbranceEffectId: p3FL7UoV5m7RUaZ5 + perceptionEffectId: tGGFFCpkYbnDnE9g + createdEventId: TgZgOsNosNYIFlXg + description:

    Water-resistant and warm, the Sealskin Tunic is ideal for harsh, wet, and cold environments. It offers excellent protection against the elements while providing comfort for seafaring folk or those in extreme conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Buckram + img: systems/sohl/assets/icons/tunic.svg + value: 45 + weight: 2.3 + encumbrance: 0 + perception: 0 + abbrev: BTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 45 + origWeight: 2.3 + name: Buckram Tunic + id: dnu16hAs7livrm10 + durability: 10 + encumbranceEffectId: kU3ohbJYWSAN5yvS + perceptionEffectId: uZ1gC3cpLTss2aeG + createdEventId: D3AFjuUvC1JIigaK + description:

    The Buckram Tunic is stiff and structured, crafted from coarse cloth stiffened with glue. It offers durability and a reliable fit, suitable for tasks requiring a more rigid garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Cloth + img: systems/sohl/assets/icons/tunic.svg + value: 45 + weight: 2.3 + encumbrance: 0 + perception: 0 + abbrev: CTunic + material: Cloth + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 45 + origWeight: 2.3 + name: Cloth Tunic + id: yw5Ra6kjm6ELBEak + durability: 10 + encumbranceEffectId: wXD8zMAucsNNYEyp + perceptionEffectId: GgefeZu5tF1zsyCL + createdEventId: bvePHX5zCse15PRI + description:

    Simple and versatile, the Cloth Tunic is made from various soft fabrics. It offers basic comfort and warmth, suitable for everyday activities and casual wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Gambeson + img: systems/sohl/assets/icons/tunic.svg + value: 376 + weight: 13.2 + encumbrance: 5 + perception: 0 + abbrev: GTnc + material: Gambeson + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + rigidloc: + - Thorax + - Abdomen + - Pelvis + blunt: 6 + edged: 5 + piercing: 4 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 376 + origWeight: 13.2 + name: Gambeson Tunic + id: hiKPWXNoSNvJxQhD + durability: 11 + encumbranceEffectId: 68qCxZQwO75nzvnr + perceptionEffectId: VnIs4sytitpEYcsP + createdEventId: KCZMyRercOl0pxyf + description:

    The Gambeson Tunic provides padded protection, often worn under armor or as standalone defense. It offers excellent insulation and cushioning, making it perfect for both combat and daily use.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Rawhide + img: systems/sohl/assets/icons/tunic.svg + value: 148 + weight: 6.8 + encumbrance: 0 + perception: 0 + abbrev: RhTunic + material: Leather + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 148 + origWeight: 6.8 + name: Rawhide Tunic + id: 07BmRahdwlzvUpTr + durability: 11 + encumbranceEffectId: 5ytMLh458FC65Pux + perceptionEffectId: qvPRUlI2XoZgo8ZK + createdEventId: 2yoMbj2xXlYMY03q + description:

    The Rawhide Tunic is thick and rugged, providing substantial protection and durability. Ideal for harsh environments, it offers a sturdy and reliable garment for those needing extra toughness.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Padded + img: systems/sohl/assets/icons/tunic.svg + value: 90 + weight: 3.6 + encumbrance: 0 + perception: 0 + abbrev: PTnc + material: Padded + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 90 + origWeight: 3.6 + name: Padded Tunic + id: zuP8Z6W2NIK9Cjlm + durability: 10 + encumbranceEffectId: skUEkEwFfSo3BPmv + perceptionEffectId: QS9Ic0gAtBBKsAUj + createdEventId: KPuOhLpYytN9CaSF + description:

    The Padded Tunic offers warmth and cushioning, perfect for cold weather or added under-armor protection. It provides both comfort and defense, suitable for various activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Tunic + detailMaterial: Quilted + img: systems/sohl/assets/icons/tunic.svg + value: 180 + weight: 8.1 + encumbrance: 0 + perception: 0 + abbrev: QTnc + material: Quilted + flexloc: + - Left Shoulder + - Right Shoulder + - Left Upper Arm + - Right Upper Arm + - Left Elbow + - Right Elbow + - Thorax + - Abdomen + - Pelvis + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 180 + origWeight: 8.1 + name: Quilted Tunic + id: B0TcLdRaWwL3kDyj + durability: 11 + encumbranceEffectId: AMetSr1LgMfInU4y + perceptionEffectId: IXlTNnHfAykurnlU + createdEventId: OwpVhc4npBN8MuzJ + description:

    Featuring layers of fabric stitched together, the Quilted Tunic offers excellent insulation and warmth. It's suitable for colder climates, providing both comfort and a bit of extra protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Vambraces + detailMaterial: Kûrbúl + img: systems/sohl/assets/icons/bracer.svg + value: 25 + weight: 1.9 + encumbrance: 1.67 + perception: 0 + abbrev: KVamb + material: Kûrbúl + flexloc: [] + rigidloc: + - Left Forearm + - Right Forearm + blunt: 4 + edged: 6 + piercing: 5 + fire: 4 + folderId: M4nHcUWOatfVGuh3 + origValue: 25 + origWeight: 1.9 + name: Kûrbúl Vambraces + id: YNgC9RhtXT9UGqBk + durability: 13 + encumbranceEffectId: tZ3xPbmgBQ7ZQvcR + perceptionEffectId: 3xnhbGy6GVoMDRMI + createdEventId: uURtN1GG6aAbOJ34 + description:

    The Kûrbúl Vambraces are treated leather forearm guards offering moderate protection and flexibility. Decorated with intricate designs, they provide both function and visual appeal for those needing lightweight arm armor.

    + macros: [] + flags: {} + effects: [] +- armorType: Vambraces + detailMaterial: Plate + img: systems/sohl/assets/icons/bracer.svg + value: 100 + weight: 1.9 + encumbrance: 1.67 + perception: 0 + abbrev: PlVamb + material: Plate + flexloc: [] + rigidloc: + - Left Forearm + - Right Forearm + blunt: 6 + edged: 11 + piercing: 9 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 100 + origWeight: 1.9 + name: Plate Vambraces + id: pdjZX817oAp0T2ON + durability: 14 + encumbranceEffectId: r8WpzD3Ez4kdOOPl + perceptionEffectId: a4pduvoBqoLXZ2gp + createdEventId: J0Avint2Ze8pWuG5 + description:

    Plate Vambraces are solid steel guards for the forearms, offering maximum protection. Essential for heavily armored warriors, they are designed to deflect and absorb impacts during combat.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Homespun + img: systems/sohl/assets/icons/vest.svg + value: 7 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: HsVest + material: Cloth + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 24 + origWeight: 1.2 + name: Homespun Vest + id: P6dfmPZVLvNajPTj + durability: 5 + encumbranceEffectId: L7N9szYjHRAkB3Qe + perceptionEffectId: 1lCB9HrajF244hQm + createdEventId: AmHtUrJsV4d6jbIp + description:

    A simple, practical Homespun Vest woven from homemade fabric, offering basic comfort and warmth. Suitable for everyday wear by common folk, it’s a reliable and no-frills garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Linen + img: systems/sohl/assets/icons/vest.svg + value: 12 + weight: 0.3 + encumbrance: 0 + perception: 0 + abbrev: LVest + material: Cloth + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 24 + origWeight: 1.2 + name: Linen Vest + id: 0tUaUcWZD1HoQ7rK + durability: 5 + encumbranceEffectId: VkPIRRoqO7DWIrjk + perceptionEffectId: 39VaAwcVvDfbr0YX + createdEventId: VDFf9ALyurlI9VGg + description:

    Light and breathable, the Linen Vest is perfect for warm weather. It offers comfort and ease of movement, making it ideal for casual wear and outdoor activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Russet + img: systems/sohl/assets/icons/vest.svg + value: 29 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: RVest + material: Cloth + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 24 + origWeight: 1.2 + name: Russet Vest + id: qYPlaKSvAdvwOA4h + durability: 7 + encumbranceEffectId: WCqPwtgCRM5miCGq + perceptionEffectId: HmflQRgtgs7JW4QI + createdEventId: tZVbJBT67TctNexc + description:

    Crafted from coarse wool dyed reddish-brown, the Russet Vest offers warmth and durability. Practical for colder climates and outdoor work, it provides reliable coverage and comfort.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Serge + img: systems/sohl/assets/icons/vest.svg + value: 14 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: SgVest + material: Cloth + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 24 + origWeight: 1.2 + name: Serge Vest + id: Q58S1d6YbmYfGSEd + durability: 7 + encumbranceEffectId: S5wRf3nq9o5bgju7 + perceptionEffectId: GvAuMceIDC5XUV4f + createdEventId: 7wkMDCp1o4Uo5Uki + description:

    The Serge Vest is made from durable, twilled fabric, offering both comfort and resilience. Suitable for everyday wear, it provides a practical and versatile garment for a range of activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Silk + img: systems/sohl/assets/icons/vest.svg + value: 216 + weight: 0.6 + encumbrance: 0 + perception: 0 + abbrev: SlVest + material: Cloth + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 0 + piercing: 0 + fire: 0 + folderId: gaC79vNjSo6VO6Ym + origValue: 24 + origWeight: 1.2 + name: Silk Vest + id: w18YsaJWa7kA7e0N + durability: 7 + encumbranceEffectId: BzSEtgsb2vsYLFZb + perceptionEffectId: Ds5M2UmjNUvqzMha + createdEventId: JDFxlMhiuR7QTi9V + description:

    Exuding elegance and sophistication, the Silk Vest is a luxurious, lightweight garment. Perfect for formal occasions and high-status events, it adds a touch of refinement to any outfit.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Velvet + img: systems/sohl/assets/icons/vest.svg + value: 84 + weight: 1.2 + encumbrance: 0 + perception: 0 + abbrev: VVest + material: Cloth + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 24 + origWeight: 1.2 + name: Velvet Vest + id: 4N12Ing5xUwLtw8Z + durability: 10 + encumbranceEffectId: eFQX5NFFVDgSnIE0 + perceptionEffectId: EIgqJ5ANkYXeohCW + createdEventId: I9Pnmn2A9k81WOaC + description:

    Soft and plush, the Velvet Vest symbolizes opulence. While it may not be particularly durable, its rich texture and appearance make it a perfect choice for formal settings and high-status individuals.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Worsted + img: systems/sohl/assets/icons/vest.svg + value: 58 + weight: 1 + encumbrance: 0 + perception: 0 + abbrev: WVest + material: Cloth + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 24 + origWeight: 1.2 + name: Worsted Vest + id: 8XMvH9YELdut0Q5o + durability: 9 + encumbranceEffectId: gZYjy9OGn9WAhBjD + perceptionEffectId: dPgCYNI4eRqqO3Pi + createdEventId: vtRokYa0yEZChHf3 + description:

    The Worsted Vest, made from tightly-spun wool fibers, offers both style and durability. It provides good insulation and resilience, making it suitable for various activities and weather conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Beaver + img: systems/sohl/assets/icons/vest.svg + value: 288 + weight: 2.9 + encumbrance: 0 + perception: 0 + abbrev: BvVest + material: Leather + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 96 + origWeight: 3.6 + name: Beaver Vest + id: fBJGtPOqEWW12Lxs + durability: 9 + encumbranceEffectId: BwwolvUrgP9csJTM + perceptionEffectId: fCLeyCw3C6393ACX + createdEventId: W50svw2Z7rovdx7N + description:

    A Beaver Vest, made from dense beaver fur, offers exceptional warmth and a touch of luxury. Ideal for cold climates, it combines function and status, providing both comfort and elegance.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Ermine + img: systems/sohl/assets/icons/vest.svg + value: 576 + weight: 2.2 + encumbrance: 0 + perception: 0 + abbrev: EVest + material: Leather + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 96 + origWeight: 3.6 + name: Ermine Vest + id: xcV3S0BjsDA6oGC4 + durability: 7 + encumbranceEffectId: rgPXJDzj91Y3SBCD + perceptionEffectId: C9VK0QulxBb3QrNq + createdEventId: gPTvNVGsluWOdLLP + description:

    Made from soft white ermine fur, the Ermine Vest signifies high status and wealth. It provides excellent insulation and a plush texture, ideal for elite individuals needing both warmth and a show of prestige.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Leather + img: systems/sohl/assets/icons/leather-vest.svg + value: 192 + weight: 2.2 + encumbrance: 0 + perception: 0 + abbrev: LtVest + material: Leather + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: gaC79vNjSo6VO6Ym + origValue: 96 + origWeight: 3.6 + name: Leather Vest + id: CHsIB6hHkU4WzpMG + durability: 9 + encumbranceEffectId: KuekwdChdRtisGzX + perceptionEffectId: aPWXI5eQOHLcIeQS + createdEventId: PDSea7Irrk2vWnxV + description:

    A Leather Vest combines rugged style with minimal protection. Lightweight and comfortable, it’s suitable for everyday wear or light adventuring, adding a bit of edge to the wearer’s attire.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Sealskin + img: systems/sohl/assets/icons/vest.svg + value: 288 + weight: 4.3 + encumbrance: 0 + perception: 0 + abbrev: SlVest + material: Leather + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: gaC79vNjSo6VO6Ym + origValue: 96 + origWeight: 3.6 + name: Sealskin Vest + id: bHd6JMlG7sxplB53 + durability: 11 + encumbranceEffectId: 7WyScqDwsupPhNre + perceptionEffectId: DfS7gkrvwTbdEAZT + createdEventId: 1dChhBswVXMaq0oQ + description:

    Water-resistant and warm, the Sealskin Vest is ideal for harsh, wet, and cold environments. It offers excellent protection against the elements while providing comfort for seafaring folk or those in extreme conditions.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Buckram + img: systems/sohl/assets/icons/vest.svg + value: 24 + weight: 1.2 + encumbrance: 0 + perception: 0 + abbrev: BVest + material: Cloth + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 24 + origWeight: 1.2 + name: Buckram Vest + id: tA6c2cLWEbw5Cnzu + durability: 10 + encumbranceEffectId: LFrBJQQGjNkoLGXj + perceptionEffectId: khR986alUHXF8a0K + createdEventId: f1pH0zxhy07dzfCk + description:

    The Buckram Vest is stiff and structured, offering a durable and reliable fit. Made from coarse cloth stiffened with glue, it’s suitable for activities requiring a more rigid garment.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Cloth + img: systems/sohl/assets/icons/vest.svg + value: 24 + weight: 1.2 + encumbrance: 0 + perception: 0 + abbrev: CVest + material: Cloth + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 0 + edged: 1 + piercing: 0 + fire: 1 + folderId: M4nHcUWOatfVGuh3 + origValue: 24 + origWeight: 1.2 + name: Cloth Vest + id: vEsjIoSy71xpeaZk + durability: 10 + encumbranceEffectId: JzmFKTg4MgRswe41 + perceptionEffectId: oI0IEK4oancC6sA8 + createdEventId: W5uKtQdS9zbA0M53 + description:

    Simple and versatile, the Cloth Vest is made from various soft fabrics. It offers basic comfort and warmth, suitable for everyday activities and casual wear.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Gambeson + img: systems/sohl/assets/icons/vest.svg + value: 208 + weight: 7.3 + encumbrance: 0 + perception: 0 + abbrev: GVest + material: Gambeson + flexloc: [] + rigidloc: + - Thorax + - Abdomen + blunt: 6 + edged: 5 + piercing: 4 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 208 + origWeight: 7.3 + name: Gambeson Vest + id: jd45JXEJMuH3Q38y + durability: 11 + encumbranceEffectId: 7qhs0YGI4YO3rPg0 + perceptionEffectId: 0IFQmOw2sZuuzV8Z + createdEventId: 8ahSTUlqvdCbxcFZ + description:

    The Gambeson Vest provides padded protection, often worn under armor or as standalone defense. It offers excellent insulation and cushioning, making it perfect for both combat and daily use.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Rawhide + img: systems/sohl/assets/icons/leather-vest.svg + value: 96 + weight: 3.6 + encumbrance: 0 + perception: 0 + abbrev: RhVest + material: Leather + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 1 + edged: 2 + piercing: 1 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 96 + origWeight: 3.6 + name: Rawhide Vest + id: BsWuJSS6uRUw9gHL + durability: 11 + encumbranceEffectId: wPIiO2gPQnFk1Hy2 + perceptionEffectId: PGwFW4T28eBVUuoP + createdEventId: P1GEXtWeOhgBw9Nb + description:

    The Rawhide Vest is thick and rugged, providing substantial protection and durability. Ideal for harsh environments, it offers a sturdy and reliable garment for those needing extra toughness.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Mail + img: systems/sohl/assets/icons/vest.svg + value: 240 + weight: 13.2 + encumbrance: 0 + perception: 0 + abbrev: MVest + material: Mail + flexloc: [] + rigidloc: + - Thorax + - Abdomen + blunt: 2 + edged: 8 + piercing: 7 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 240 + origWeight: 13.2 + name: Mail Vest + id: RByGW7pB2rHNoC09 + durability: 13 + encumbranceEffectId: EP3yrLwFZ3TWqqzj + perceptionEffectId: FebnGZ9ATLT3XKBe + createdEventId: DyAH5Uyhk8NHr7FF + description:

    A Mail Vest, crafted from interlinked metal rings, covers the torso, offering substantial protection. It provides excellent defense against slashes while maintaining flexibility, essential for combat scenarios.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Padded + img: systems/sohl/assets/icons/vest.svg + value: 48 + weight: 1.9 + encumbrance: 0 + perception: 0 + abbrev: PVest + material: Padded + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 2 + edged: 2 + piercing: 1 + fire: 2 + folderId: M4nHcUWOatfVGuh3 + origValue: 48 + origWeight: 1.9 + name: Padded Vest + id: fkUiSbRIrID4ejeZ + durability: 10 + encumbranceEffectId: p8a94LtmOFaCUtwx + perceptionEffectId: WTngARW0T46VZMVP + createdEventId: zkXbwEvbgGLI6Hyi + description:

    The Padded Vest offers warmth and cushioning, perfect for cold weather or additional under-armor padding. Providing both comfort and protection, it’s suitable for various activities.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Quilted + img: systems/sohl/assets/icons/vest.svg + value: 96 + weight: 4.3 + encumbrance: 0 + perception: 0 + abbrev: QVest + material: Quilted + flexloc: + - Thorax + - Abdomen + rigidloc: [] + blunt: 4 + edged: 3 + piercing: 2 + fire: 3 + folderId: M4nHcUWOatfVGuh3 + origValue: 96 + origWeight: 4.3 + name: Quilted Vest + id: oWopiGVtjg4Lpmnp + durability: 11 + encumbranceEffectId: zFffibab9oeviYdx + perceptionEffectId: WvYf97SflkqUHnSf + createdEventId: zJUGl3JevvwN40ID + description:

    The Quilted Vest, featuring layers of fabric sewn together, offers excellent insulation and warmth. Suitable for cooler climates, it provides both comfort and a bit of extra protection.

    + macros: [] + flags: {} + effects: [] +- armorType: Vest + detailMaterial: Scale + img: systems/sohl/assets/icons/scale-mail.svg + value: 240 + weight: 13.2 + encumbrance: 5 + perception: 0 + abbrev: SVest + material: Scale + flexloc: [] + rigidloc: + - Thorax + - Abdomen + blunt: 4 + edged: 8 + piercing: 5 + fire: 5 + folderId: M4nHcUWOatfVGuh3 + origValue: 240 + origWeight: 13.2 + name: Scale Vest + id: s2DrZY0PUl3CpvJr + durability: 14 + encumbranceEffectId: lZ1HxY4jlgF8VAga + perceptionEffectId: xOm0eWufFgcQm6uJ + createdEventId: oRVN8UrRQi4bCOIH + description:

    The Scale Vest consists of overlapping metal scales sewn onto a fabric or leather backing, offering strong protection for the torso. It maintains flexibility, making it suitable for various combat situations.

    + macros: [] + flags: {} + effects: [] diff --git a/packs/generate/legendary/leg-possessions/data/concoctiongear.yaml b/packs/generate/legendary/leg-possessions/data/concoctiongear.yaml new file mode 100644 index 0000000..11e7863 --- /dev/null +++ b/packs/generate/legendary/leg-possessions/data/concoctiongear.yaml @@ -0,0 +1,1095 @@ +- name: Oil, 1 pt. + id: bZPE9aQfpWlNUubL + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 0 + subType: mundane + potency: na + strength: 0 + value: 48 + weight: 1 + description: "" + macros: [] + flags: {} + effects: [] + folderId: s31qGPQHe3ceDuJD +- name: Acid Elixir + id: NYcehkE9TyvBfg4V + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Airtap Elixir + id: YQrYKIk6leOgrBiB + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Aqua Elixir + id: 6rkUJkGJRMTNNHi3 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Darkvision Elixir + id: r97Obcn4wh7dmG1q + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Dreamwalk Elixir + id: grSNWnJsaVYUOGCF + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Egosight Elixir + id: JQDt6HP0On6xrJff + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Equipose Elixir + id: Q7wtWxOGrhCZk4Ff + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Erudition Elixir + id: fEaPvY2PTbu1NQvE + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Eruption Elixir + id: LZrv6AMtU8FYNz0a + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Exsiccation Elixir + id: zktEEQXqH0QhdIB4 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Fireshield Elixir + id: fhPyd9yfLe9dAfAk + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Footpad Elixir + id: kYI6tH1HPTGjx5o5 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Formfix Elixir + id: 5GS04AFm56zdfMuc + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Fumebomb Elixir + id: QwGwUELQTlJz3h5K + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Ghostsight Elixir + id: l0Cm1TQuXKmIqFzh + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Healing Elixir + id: mUiePF4uSAZdqx4G + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Iceshield Elixir + id: lMN12tVDOPq4J03D + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Mending Elixir + id: LLjvmVSra9Qv1cS5 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Might Elixir + id: P8UN93F6iLZAIRea + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Mindslave Elixir + id: 3w3WMWqiVvFThQw3 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Object Aegis Elixir + id: kn3xjYrgETCcRNi5 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Passion Elixir + id: Kvqr0hGoh5WzPWyl + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Physic Elixir + id: mZcMrCVzFnniXTgw + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Poison Elixir + id: 4cAZscDHyV0Qhqu5 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: DD6TjOQNq8uvEcrM +- name: Potion, Antivenin, Great + id: nwpq4z5Pcn4zlXBh + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Antivenin, Mild + id: txsSlqA70AkoRlkz + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Antivenin, Strong + id: rFLmI5alMTqEDqZK + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Aphrodisiac, Great + id: A1kANF6k6kODQukp + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Aphrodisiac, Mild + id: RZcHrlLqqe83AHQv + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Aphrodisiac, Strong + id: OGlA20m0jBh9rwem + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Aromatic, Great + id: 3jFX2atGugv0lmZI + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Aromatic, Mild + id: 8UWsJrzvrGC0lQ2J + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Aromatic, Strong + id: N1DoLTSuLw0GkaLo + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Coagulant, Great + id: 5YXyHgTm6Iv7oaNb + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Coagulant, Mild + id: ghYSJ2lqjafk1xMm + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Coagulant, Strong + id: ChZAI7oyvqJyr2QF + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Curative, Great + id: VTEjy0vsSe8zxFKf + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Curative, Mild + id: 2L7Kg5rnHoZpLqsV + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Curative, Strong + id: 7HYw8avHqoAzg86T + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Emetic, Great + id: ZuKD3w7pu6UqitnI + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Emetic, Mild + id: eHOHiXOzHn5XECke + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Emetic, Strong + id: GTgiXU3yKS7Qp123 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Hallucinogenic, Great + id: Xlz4nTG9iSGWYdI1 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Hallucinogenic, Mild + id: rgtGf2j1b1iHKf5B + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Hallucinogenic, Strong + id: YlRWVPAvNSoXcsny + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Narcotic, Great + id: dZ529OqHqstIkaGq + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Narcotic, Mild + id: SCVeb39e3sMpBuO9 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Narcotic, Strong + id: Tk7qaHGEEdhSRXgI + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Paralytic, Great + id: nVVQFI4kX4Fy9Nmx + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Paralytic, Mild + id: TqYjcdkX2R1lKsa9 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Paralytic, Strong + id: qpPv1TBB1CTEkx2E + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Poison, Great + id: g5VnRwceA1ZqqmyK + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Poison, Mild + id: jty6QjDuYhrNLgil + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Poison, Strong + id: Ob1hM3Fa0wSEfjvH + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Soporific, Great + id: GmVXGsRGPGtEY2XQ + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Soporific, Mild + id: RsLDLFggVpacJjPd + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Soporific, Strong + id: wEfpBZJqk7i8G0jt + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Stimulant, Great + id: 4rKkDmfnWN2wgC3e + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: great + strength: 0 + value: 480 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Stimulant, Mild + id: RaeSbz0jbSI6SD0G + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: mild + strength: 0 + value: 16 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Potion, Stimulant, Strong + id: 7lZkmESvYYIRhGzG + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: exotic + potency: strong + strength: 0 + value: 48 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Quiescence Elixir + id: nXTfYmeZBJuveJq7 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Shadowbreath Elixir + id: LCrEKe78M9YoIeiu + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Shout Elixir + id: FPsOSsG0JX7uhLBy + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Soulbuffer Elixir + id: 81QbjoBKTPWcTgx7 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Soulcloak Elixir + id: DeJTmnplDZpNZUJh + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Sustenance Elixir + id: iD2UGuuDxQ55badI + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Traumashield Elixir + id: QXXKigA7sGsbwVAv + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Verity Elixir + id: RqN6hzMRMoWW8lM8 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Verve Elixir + id: 5vcmmhrakAyt8cF6 + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Warmth Elixir + id: a6WYdhwUWVUf1hgn + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Water, 1pt. + id: QrVx5mD4WSidHTTV + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 0 + subType: mundane + potency: na + strength: 0 + value: 0 + weight: 1 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh +- name: Weakness Elixir + id: jU3fo4ux6mvQa1vS + img: systems/sohl/assets/icons/potion.svg + quality: 0 + durability: 5 + subType: elixir + potency: na + strength: 0 + value: 0 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: V5r4IpV8f1gO3fBh diff --git a/packs/generate/legendary/leg-possessions/data/containergear.yaml b/packs/generate/legendary/leg-possessions/data/containergear.yaml new file mode 100644 index 0000000..bbe4266 --- /dev/null +++ b/packs/generate/legendary/leg-possessions/data/containergear.yaml @@ -0,0 +1,351 @@ +- name: Arrow Bag + id: 8vlivFbijzC7mfTa + img: systems/sohl/assets/icons/quiver.svg + quality: 0 + durability: 7 + maxCapacity: 6 + value: 32 + weight: 4 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Backpack + id: rMnbWzyue0vPuDdS + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 30 + value: 30 + weight: 2 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Bag, lg, canvas + id: wqfE3unujfDW90un + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 20 + value: 8 + weight: 1 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Bag, lg, leather + id: HX504M5iZ2ssHBto + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 30 + value: 12 + weight: 2 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Bag, sm, canvas + id: DZVw51vpCgNHX7Qt + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 10 + value: 5 + weight: 0.5 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Basket, large + id: VbXV36kl3FRBIAwy + img: systems/sohl/assets/icons/basket.svg + quality: 0 + durability: 8 + maxCapacity: 25 + value: 5 + weight: 3.5 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Basket, small + id: yzy8iDgsPu3bBkH2 + img: systems/sohl/assets/icons/basket.svg + quality: 0 + durability: 8 + maxCapacity: 10 + value: 2 + weight: 2 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Belt Pouch, buckram + id: 7Kh8C5GgQZLOyTR8 + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 5 + value: 5 + weight: 0.5 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Belt pouch, leather, lg + id: w56MDdmyCKDDEVAY + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 5 + value: 8 + weight: 1 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Belt pouch, leather, med + id: JMXUmoqI6uWt5LN4 + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 3 + value: 4 + weight: 0.5 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Belt pouch, silk + id: A5VXGf6OXbXKNwkT + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 5 + value: 35 + weight: 0.5 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Flask, glass, 1pt. + id: 4jbaN2veD9azYYmS + img: systems/sohl/assets/icons/round-bottom-flask.svg + quality: 0 + durability: 7 + maxCapacity: 1 + value: 6 + weight: 1 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Flask, metal, 1pt. + id: y5HvmlesSZHm2pqq + img: systems/sohl/assets/icons/round-bottom-flask.svg + quality: 0 + durability: 7 + maxCapacity: 1 + value: 5 + weight: 0 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Paper case, leather + id: uSuJu5ksF849t5EM + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + maxCapacity: 3 + value: 180 + weight: 0.9 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Purse, buckram + id: 9bqJ6ZJ79NPxumVJ + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 1 + value: 9 + weight: 0.75 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Purse, leather + id: shEjHWvNGFd5XIRt + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 1.5 + value: 2 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Purse, silk + id: axp8GF5VsTGj4MBq + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 1.5 + value: 60 + weight: 0.75 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Sack, buckram, large + id: GF5xJdiFcFYWrj1U + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 75 + value: 4 + weight: 3 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Sack, buckram, medium + id: ugH7Jr3DSZPAVIQn + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 50 + value: 2 + weight: 2 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Sack, buckram, small + id: 2ApXkt2V43gUPfGm + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 20 + value: 1 + weight: 1 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Sack, linen, large + id: JbrsyealH71CPHof + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 60 + value: 2 + weight: 3 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Sack, linen, medium + id: Ji9zGc4nJXCP07hY + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 40 + value: 1 + weight: 2 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Sack, linen, small + id: jBgR9hoMMPtR6d4X + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 20 + value: 0.5 + weight: 1 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Saddle Bags + id: Q2E7PMDQChqw3Z7h + img: systems/sohl/assets/icons/sack.svg + quality: 0 + durability: 8 + maxCapacity: 15 + value: 36 + weight: 3 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Vial, ceramic + id: xiTYFtkjnHF52cEk + img: systems/sohl/assets/icons/round-bottom-flask.svg + quality: 0 + durability: 9 + maxCapacity: 0.25 + value: 4 + weight: 0.5 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Vial, glass + id: aNBW3hpBgl9VIDUv + img: systems/sohl/assets/icons/round-bottom-flask.svg + quality: 0 + durability: 4 + maxCapacity: 0.25 + value: 6 + weight: 0.25 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt +- name: Waterskin, 2qt. + id: DdlmMVb2ldCpGzkk + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + maxCapacity: 4 + value: 24 + weight: 1 + description: "" + macros: [] + flags: {} + effects: [] + folderId: dl8lJ729W1mFlDvt diff --git a/packs/generate/legendary/leg-possessions/data/folders.yaml b/packs/generate/legendary/leg-possessions/data/folders.yaml new file mode 100644 index 0000000..7988a29 --- /dev/null +++ b/packs/generate/legendary/leg-possessions/data/folders.yaml @@ -0,0 +1,40 @@ +- name: Armor + id: M4nHcUWOatfVGuh3 + parentFolderId: "" + color: '#c70000' +- name: Clothing + id: gaC79vNjSo6VO6Ym + parentFolderId: "" + color: '#008080' +- name: Containers + id: dl8lJ729W1mFlDvt + parentFolderId: "" + color: '#800080' +- name: Expedition + id: s31qGPQHe3ceDuJD + parentFolderId: "" + color: '#008000' +- name: Miscellaneous + id: TV3IMHs8SLZ1L1vv + parentFolderId: "" + color: '#808000' +- name: Musical Instruments + id: 9x39BJgm46uJMSer + parentFolderId: "" + color: '#000080' +- name: Projectiles + id: ADQPHjgKsdWsJhyy + parentFolderId: "" + color: '#800000' +- name: Weapons + id: c0GXEU9oCZ1N3mSl + parentFolderId: "" + color: '#ff0000' +- name: Alchemical Elixirs + id: DD6TjOQNq8uvEcrM + parentFolderId: "" + color: '#0000ff' +- name: Herbalist Potions + id: V5r4IpV8f1gO3fBh + parentFolderId: "" + color: '#000080' diff --git a/packs/generate/legendary/leg-possessions/data/miscgear.yaml b/packs/generate/legendary/leg-possessions/data/miscgear.yaml new file mode 100644 index 0000000..6e2e79f --- /dev/null +++ b/packs/generate/legendary/leg-possessions/data/miscgear.yaml @@ -0,0 +1,832 @@ +- name: Baldric, Shoulder + id: 0IAIZldwWPnF8V7F + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 10 + weight: 1.75 + abbrev: "ShBldrc" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Bandage + id: 28T0XYglrvCALMTy + img: systems/sohl/assets/icons/bandage-roll.svg + quality: 0 + durability: 7 + value: 0.75 + weight: 0.1 + abbrev: "Bandg" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Bedroll, heavy + id: I6gNf8y6ZgxFgxdI + img: systems/sohl/assets/icons/sleeping-bag.svg + quality: 0 + durability: 7 + value: 100 + weight: 10 + abbrev: "HvyBdrl" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Bedroll, light + id: v7ORmy6v4zX4DOSG + img: systems/sohl/assets/icons/sleeping-bag.svg + quality: 0 + durability: 7 + value: 30 + weight: 4 + abbrev: "LiteBdrl" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Belt, Leather + id: zHepFo4rYo7Sa7t1 + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 8 + weight: 0.75 + abbrev: "LBelt" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Blanket, heavy + id: SZtXaMgdPUcKmB21 + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 20 + weight: 8 + abbrev: "HvyBlkt" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Blanket, light + id: Jtg9nPvOVYYCQXpe + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 10 + weight: 3 + abbrev: "LiteBlkt" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Bowstring + id: lXxSp6O7oqXDubHs + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 2 + weight: 0.05 + abbrev: "BowSt" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Candle, Calibrated + id: kx7nl04BeCCVAgZM + img: systems/sohl/assets/icons/candle.svg + quality: 0 + durability: 7 + value: 10 + weight: 0.5 + abbrev: "CbCndl" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Candles, Beeswax + id: Wo3s4zcwqXcQQwzn + img: systems/sohl/assets/icons/candle.svg + quality: 0 + durability: 7 + value: 24 + weight: 1 + abbrev: "BzwxCndl" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Candles, Tallow + id: PvW6nuBFE3L6RRj5 + img: systems/sohl/assets/icons/candle.svg + quality: 0 + durability: 7 + value: 8 + weight: 1 + abbrev: "TlwCndl" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Cooking Kit, portable + id: 9wAMVPkDXhuA56lg + img: systems/sohl/assets/icons/cookery.svg + quality: 0 + durability: 7 + value: 24 + weight: 5 + abbrev: "CookKit" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Drum, hand + id: Id5cePq7Sa0qWy0e + img: systems/sohl/assets/icons/drum.svg + quality: 0 + durability: 7 + value: 36 + weight: 4 + abbrev: "HndDrum" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "9x39BJgm46uJMSer" +- name: Dulcimer + id: 6VHECTJykEAktXrp + img: systems/sohl/assets/icons/dulcimer.svg + quality: 0 + durability: 7 + value: 240 + weight: 15 + abbrev: "dulcimer" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "9x39BJgm46uJMSer" +- name: Farthing + id: X9srzy864vlUYb44 + img: systems/sohl/assets/icons/coins.svg + quality: 0 + durability: 7 + value: 0.25 + weight: 0.001 + abbrev: "farthing" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Fishhooks + id: ZXUpNuTmpyO375lh + img: systems/sohl/assets/icons/fishing.svg + quality: 0 + durability: 7 + value: 0.125 + weight: 0 + abbrev: "fishhook" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Fishing Line, 10 ft. + id: k407L8fW4BeIJ77o + img: systems/sohl/assets/icons/string.svg + quality: 0 + durability: 7 + value: 2 + weight: 0.1 + abbrev: "fishline" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Flute, wooden + id: 9VRGDGWG1l9E9D9m + img: systems/sohl/assets/icons/flute.svg + quality: 0 + durability: 7 + value: 3 + weight: 0.5 + abbrev: "WFlute" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "9x39BJgm46uJMSer" +- name: Gold Crown + id: dTnBQ2PphwVNdSsu + img: systems/sohl/assets/icons/coins.svg + quality: 0 + durability: 7 + value: 240 + weight: 0.0625 + abbrev: "goldcrown" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Grappling Hook, Heavy + id: 9I5mdnAmLy269JeC + img: systems/sohl/assets/icons/grappling-hook.svg + quality: 0 + durability: 7 + value: 35 + weight: 2 + abbrev: "HvyGplHook" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Grappling Hook, Light + id: q3pqT6Vq1AjGsIAc + img: systems/sohl/assets/icons/grappling-hook.svg + quality: 0 + durability: 7 + value: 10 + weight: 2 + abbrev: "LiteGplHook" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Harness, Horse + id: yYD2p0tJJkJ30fKt + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 18 + weight: 8 + abbrev: "horseharness" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Harp, Aeolian (small) + id: bl5ufFnv5nxdCzqX + img: systems/sohl/assets/icons/harp.svg + quality: 0 + durability: 7 + value: 42 + weight: 6 + abbrev: "AeolianHarp" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "9x39BJgm46uJMSer" +- name: Hay + id: x75CSpJqdm6uUhpd + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 1 + weight: 1 + abbrev: "hay" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Horn, Hunting + id: IqwHjKSUcVkqqDfP + img: systems/sohl/assets/icons/horn.svg + quality: 0 + durability: 7 + value: 20 + weight: 1 + abbrev: "HuntHorn" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Inkwell, copper + id: 7A8sJobEHzgFxJNm + img: systems/sohl/assets/icons/quill-ink.svg + quality: 0 + durability: 7 + value: 12 + weight: 1 + abbrev: "CuInkwl" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Inkwell, glass + id: u4YhQGUMKPO2od0M + img: systems/sohl/assets/icons/quill-ink.svg + quality: 0 + durability: 3 + value: 30 + weight: 1 + abbrev: "GlInkwl" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Lantern, metal + id: 4VCs5I0nb1T0xEnE + img: systems/sohl/assets/icons/lantern.svg + quality: 0 + durability: 7 + value: 12 + weight: 1 + abbrev: "MtlLntn" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Lockpicks + id: 6oMFhz4zlSZnbSEM + img: systems/sohl/assets/icons/lockpicks.svg + quality: 0 + durability: 3 + value: 15 + weight: 1 + abbrev: "lockpicks" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Lute + id: WWgPKR7eyEbsftWV + img: systems/sohl/assets/icons/lute.svg + quality: 0 + durability: 7 + value: 200 + weight: 3 + abbrev: "lute" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "9x39BJgm46uJMSer" +- name: Lyre + id: ShVX00JJ1b1Dq3vL + img: systems/sohl/assets/icons/harp.svg + quality: 0 + durability: 7 + value: 120 + weight: 3 + abbrev: "lyre" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "9x39BJgm46uJMSer" +- name: Mirror, iron, silver-coated + id: FLWmUYiiubhaccv9 + img: systems/sohl/assets/icons/mirror.svg + quality: 0 + durability: 5 + value: 20 + weight: 2 + abbrev: "FeMirror" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Nails, pack of 24 + id: CTGbkfRuWzJGUaLI + img: systems/sohl/assets/icons/nails.svg + quality: 0 + durability: 7 + value: 2 + weight: 1 + abbrev: "nails" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Needles, sewing + id: tFwJMmn0JA4Jex6D + img: systems/sohl/assets/icons/sewing-needle.svg + quality: 0 + durability: 3 + value: 9 + weight: 0.1 + abbrev: "needles" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Pack Harness + id: w7EcYYWzIYJgd171 + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 24 + weight: 9 + abbrev: "PkHnss" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Parchment, page + id: dubXe1ZpU8re5Nzr + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 2 + weight: 0.1 + abbrev: "parch" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Pen, quill + id: 9I6ToE2RAZPebbZD + img: systems/sohl/assets/icons/quill.svg + quality: 0 + durability: 7 + value: 1 + weight: 0.05 + abbrev: "QulPen" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Pen, wood + id: vpRpqmF5IW3jjFjE + img: systems/sohl/assets/icons/wood-pen.svg + quality: 0 + durability: 7 + value: 1 + weight: 0.1 + abbrev: "WdnPen" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Pence + id: cIPNCrBR04BqbtqJ + img: systems/sohl/assets/icons/coins.svg + quality: 0 + durability: 10 + value: 1 + weight: 0.004 + abbrev: "pence" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Pipes + id: 5TUoE4QBqOxdepW3 + img: systems/sohl/assets/icons/pan-flute.svg + quality: 0 + durability: 7 + value: 60 + weight: 2 + abbrev: "pipes" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "9x39BJgm46uJMSer" +- name: Piton, iron, looped + id: I5fto3QDNTHxrFmj + img: systems/sohl/assets/icons/piton.svg + quality: 0 + durability: 7 + value: 1 + weight: 0.333 + abbrev: "piton" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Quiver + id: CZVTEmWErDD7b8tV + img: systems/sohl/assets/icons/quiver.svg + quality: 0 + durability: 7 + value: 8 + weight: 3 + abbrev: "quiver" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Rations, Iron + id: YFl2U3mTvoV1nzPy + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 3 + weight: 3 + abbrev: "FeRations" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Rations, Standard + id: 0jGZS74JTgQ4lTrA + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 2 + weight: 3 + abbrev: "StdRations" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Rope, 1” hemp, per ft (1,125 lb cap. *) + id: f0Y9auDtv80324eY + img: systems/sohl/assets/icons/rope.svg + quality: 0 + durability: 7 + value: 2 + weight: 0.27 + abbrev: "HempRope1" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Rope, ½” hemp, per ft (330 lb cap.*) + id: gC9TL6Scq5sfR6t4 + img: systems/sohl/assets/icons/rope.svg + quality: 0 + durability: 7 + value: 1 + weight: 0.08 + abbrev: "HempRope.5" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Rope, ½” silk, per ft (1000 lb cap. *) + id: KumwqPs0XEkQwSYd + img: systems/sohl/assets/icons/rope.svg + quality: 0 + durability: 7 + value: 32 + weight: 0.08 + abbrev: "SilkRope.5" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Rope, ¼” silk, per ft (225 lb cap. *) + id: Uynpc0MlW4MyzGkP + img: systems/sohl/assets/icons/rope.svg + quality: 0 + durability: 7 + value: 16 + weight: 0.02 + abbrev: "SilkRope.25" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Saddle, Riding + id: XebK0DqmYbxx8tT0 + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 80 + weight: 10 + abbrev: "saddle" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Saddle, War + id: V1zS3zV10j6NzMhh + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 250 + weight: 20 + abbrev: "warsaddle" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Scabbard + id: q2QhzsiMvTVS6t9l + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 48 + weight: 0 + abbrev: "scabbard" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Scales & Weights + id: gpifKmureYGX0hA1 + img: systems/sohl/assets/icons/scales.svg + quality: 0 + durability: 7 + value: 144 + weight: 7.5 + abbrev: "scales" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Seal, Signature + id: BAtdFCSiDDrprRwi + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 36 + weight: 0.25 + abbrev: "signseal" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Surgical Tools + id: b2eXoudRP1pXDDZS + img: systems/sohl/assets/icons/surgical-instruments.svg + quality: 0 + durability: 4 + value: 96 + weight: 6 + abbrev: "surgtools" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Tarpaulin + id: h0Dk2N20Dy6AnfmU + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 45 + weight: 18 + abbrev: "tarp" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Tent, Conical + id: GjKPQOsXT3HVOIyH + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 216 + weight: 50 + abbrev: "ConicTent" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Tent, Ridged, large + id: j4pLN27DKaq0z6YY + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 144 + weight: 35 + abbrev: "LgRidgTent" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Tent, Ridged, small + id: 1u1Q5nmVmeUaHey6 + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 96 + weight: 25 + abbrev: "SmRidgTent" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Tinderbox + id: 2Z8JHWVAqPG8QrqW + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 6 + weight: 2 + abbrev: "tinderbox" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Torch + id: vfbK9f0EtAmmrVlc + img: systems/sohl/assets/icons/torch.svg + quality: 0 + durability: 7 + value: 1 + weight: 1 + abbrev: "torch" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Twine, per 10 yards (5 lb. cap.) + id: J9Z8pQJpyGdlgwbm + img: systems/sohl/assets/icons/string.svg + quality: 0 + durability: 7 + value: 4 + weight: 0.2 + abbrev: "twine" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Vellum, per page + id: x7mSifcqWwEjTpOT + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 3 + value: 1 + weight: 0.2 + abbrev: "vellum" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" +- name: Wedge, staying + id: IRCSYp5bxdm2qudW + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 225 + weight: 1 + abbrev: "wedge" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "s31qGPQHe3ceDuJD" +- name: Whetstone + id: oiqhKUjV6WpOdyvi + img: systems/sohl/assets/icons/miscgear.svg + quality: 0 + durability: 7 + value: 36 + weight: 3 + abbrev: "whetstone" + macros: [] + flags: {} + effects: [] + description: "" + folderId: "TV3IMHs8SLZ1L1vv" diff --git a/packs/generate/legendary/leg-possessions/data/projectilegear.yaml b/packs/generate/legendary/leg-possessions/data/projectilegear.yaml new file mode 100644 index 0000000..373f770 --- /dev/null +++ b/packs/generate/legendary/leg-possessions/data/projectilegear.yaml @@ -0,0 +1,330 @@ +- id: ZBYxuZe1wl5mKs6V + name: Arrow, Heavy Bodkin + easyname: Heavy Bodkin + img: systems/sohl/assets/icons/arrow.svg + weight: 1.25 + value: 0.22 + durability: 10 + type: arrow + impactDie: 12 + impactMod: -1 + aspect: piercing + AEID: 7viaJDaTYHQmdIc1 + ARvalue: 4 + bleed: false + abbrev: ArwHBod + createdEventId: HTcDKE0hcAoSMqds + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: rlUtsnS0uTXB5u64 + name: Arrow, Heavy Broad + easyname: Heavy Broad + img: systems/sohl/assets/icons/arrow.svg + weight: 1.25 + value: 0.22 + durability: 10 + type: arrow + impactDie: 12 + impactMod: -1 + aspect: piercing + AEID: wD0YOXSSVnz163Di + ARvalue: 4 + bleed: true + abbrev: ArwHBrd + createdEventId: l0xpFFE6iYqf4wV9 + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: 6cX5CVlVICDX5Gbg + name: Arrow, Heavy Blunt + easyname: Heavy Blunt + img: systems/sohl/assets/icons/arrow.svg + weight: 1.25 + value: 0.22 + durability: 10 + type: arrow + impactDie: 6 + impactMod: -1 + aspect: piercing + AEID: 3ujHKFd13NXz0gZ8 + ARvalue: 4 + bleed: true + abbrev: ArwHBlt + createdEventId: g2mveWjElBfiuqGC + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: YlmDsy5FfOTKSyP7 + name: Arrow, Light Bodkin + easyname: Light Bodkin + img: systems/sohl/assets/icons/arrow.svg + weight: 1 + value: 0.125 + durability: 10 + type: arrow + impactDie: 8 + impactMod: -1 + aspect: piercing + AEID: CBdsbWmQPTCj0UQW + ARvalue: 4 + bleed: false + abbrev: ArwLBod + createdEventId: j8Ltxqs9ZUbX9qJc + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: ieM136tC1ImtHpUG + name: Arrow, Light Broad + easyname: Light Broad + img: systems/sohl/assets/icons/arrow.svg + weight: 1 + value: 0.125 + durability: 10 + type: arrow + impactDie: 8 + impactMod: -1 + aspect: piercing + AEID: hIIRfHoO4Bg2qpy6 + ARvalue: 4 + bleed: true + abbrev: ArwLBrd + createdEventId: bBMb1YO0XaqhjJO2 + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: c3Q60hAJyQyriuH1 + name: Arrow, Light Blunt + easyname: Light Blunt + img: systems/sohl/assets/icons/arrow.svg + weight: 1 + value: 0.125 + durability: 10 + type: arrow + impactDie: 4 + impactMod: -1 + aspect: piercing + AEID: GfAZI7VCjPPZ2EXB + ARvalue: 4 + bleed: true + abbrev: ArwLBlt + createdEventId: RwiVcEaac7CPeP4Q + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: e2XFpYY6yL6mRSGH + name: Bolt, Heavy Bodkin + easyname: Heavy Bodkin + img: systems/sohl/assets/icons/arrow.svg + weight: 1.25 + value: 0.22 + durability: 10 + type: bolt + impactDie: 12 + impactMod: -1 + aspect: piercing + AEID: a2JMRbK5BZZrS24V + ARvalue: 4 + bleed: false + abbrev: BltHBod + createdEventId: OLDp5eXC65JuiFKB + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: Sg9I9zNKTSADf3NY + name: Bolt, Heavy Broad + easyname: Heavy Broad + img: systems/sohl/assets/icons/arrow.svg + weight: 1.25 + value: 0.22 + durability: 10 + type: bolt + impactDie: 12 + impactMod: -1 + aspect: piercing + AEID: UgpUwMpVWMFAAg8z + ARvalue: 4 + bleed: true + abbrev: BltHBrd + createdEventId: hoacrfTVgPwkjV86 + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: 0Yheq0hOLbFgMaJN + name: Bolt, Heavy Blunt + easyname: Heavy Blunt + img: systems/sohl/assets/icons/arrow.svg + weight: 1.25 + value: 0.22 + durability: 10 + type: bolt + impactDie: 6 + impactMod: -1 + aspect: piercing + AEID: MwfdugqZnIw4tOTv + ARvalue: 4 + bleed: true + abbrev: BltHBlt + createdEventId: 2qF8oh8iIKvRvzOS + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: hirca00MJKT3lqA9 + name: Bolt, Light Bodkin + easyname: Light Bodkin + img: systems/sohl/assets/icons/arrow.svg + weight: 1 + value: 0.125 + durability: 10 + type: bolt + impactDie: 8 + impactMod: -1 + aspect: piercing + AEID: fRsvceBtsvwcY0hZ + ARvalue: 4 + bleed: false + abbrev: BltLBod + createdEventId: zB4r2Byae3HKjXbE + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: VByJ7QzzIbtR7ifP + name: Bolt, Light Broad + easyname: Light Broad + img: systems/sohl/assets/icons/arrow.svg + weight: 1 + value: 0.125 + durability: 10 + type: bolt + impactDie: 8 + impactMod: -1 + aspect: piercing + AEID: 41G9o7MulS7xPSWc + ARvalue: 4 + bleed: true + abbrev: BltLBrd + createdEventId: soydP40LD5wPQxx0 + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: 4iPZDQANoovzZgdR + name: Bolt, Light Blunt + easyname: Light Blunt + img: systems/sohl/assets/icons/arrow.svg + weight: 1 + value: 0.125 + durability: 10 + type: bolt + impactDie: 4 + impactMod: -1 + aspect: piercing + AEID: ef0XTsMJ59b7CWQ8 + ARvalue: 4 + bleed: true + abbrev: BltLBlt + createdEventId: wcdozC8J5nmMLV4O + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: JAN0qB1YhGssl643 + name: Lead Bullet + easyname: Lead Bullet + img: systems/sohl/assets/icons/stones.svg + weight: 0.17 + value: 1 + durability: 10 + type: bullet + impactDie: 10 + impactMod: -1 + aspect: blunt + AEID: "" + ARvalue: "" + bleed: false + abbrev: LBul + createdEventId: Ieqqkm7bzQadrRBO + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: wcGLixhHX1SMV0MA + name: Stone, Sling + easyname: Stone + img: systems/sohl/assets/icons/stones.svg + weight: 1 + value: 0.16 + durability: 10 + type: bullet + impactDie: 10 + impactMod: -1 + aspect: blunt + AEID: "" + ARvalue: "" + bleed: false + abbrev: SSton + createdEventId: Aq8pi803048KRubh + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy +- id: eojOHhPOD5kx5v2W + name: Dart, Blowgun + easyname: Dart + img: systems/sohl/assets/icons/needle.svg + weight: 2 + value: 0.1 + durability: 10 + type: dart + impactDie: 4 + impactMod: -1 + aspect: piercing + AEID: "" + ARvalue: "" + bleed: false + abbrev: BDrt + createdEventId: c4PJXfkDcb6QDGg5 + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} + folderId: ADQPHjgKsdWsJhyy diff --git a/packs/generate/legendary/leg-possessions/data/weapongear.yaml b/packs/generate/legendary/leg-possessions/data/weapongear.yaml new file mode 100644 index 0000000..280a7e5 --- /dev/null +++ b/packs/generate/legendary/leg-possessions/data/weapongear.yaml @@ -0,0 +1,2454 @@ +- id: PeH3MPvcfb0Z0eS7 + name: Battleaxe + type: Axe + img: systems/sohl/assets/icons/battle-axe.svg + durability: 12 + weight: 6 + value: 108 + heft: 17 + length: 6 + noblock: false + abbrev: BAxe + createdEventId: QeHHpdmYojnZ5jMc + description: |- +

    The battleaxe is a formidable weapon featuring a heavy, broad blade mounted on a long handle. It is designed for powerful, cleaving strikes used to split shields, armor, and bones. In the heat of battle, warriors wield the battleaxe in sweeping motions, leveraging the momentum of its weight to deliver devastating blows. Its considerable reach and impact make it effective for both infantry and cavalry.

    +

    Common variants of the battleaxe include the Danish axe, known for its elongated, crescent-shaped blade ideal for slashing and hooking movements, and the pollaxe, which features a hammer or spike on the reverse side, adding versatility in combat against armored foes.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: RtCK7eRRsiCFr7Qi + name: Handaxe + type: Axe + img: systems/sohl/assets/icons/axe.svg + durability: 11 + weight: 4 + value: 84 + heft: 13 + length: 5 + noblock: false + abbrev: HAxe + createdEventId: 0Rj159TO1fNSDvvX + description: |- +

    The handaxe is a small, one-handed weapon perfect for close-quarter combat and utility tasks. It features a short handle and a single blade, offering the balance and versatility needed for fast, precise strikes. In medieval warfare, the handaxe is often paired with a shield for defense while delivering quick, chopping blows to opponents.

    +

    Variants of the handaxe include the tomahawk, known for its straight handle and lightweight construction, and the francisca, a throwing axe used by the Franks, designed for both melee and ranged combat applications.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: ZiZtg2TWwtkDoeHJ + name: Hatchet + type: Axe + img: systems/sohl/assets/icons/axe.svg + durability: 9 + weight: 2 + value: 6 + heft: 10 + length: 4 + noblock: false + abbrev: Hcht + createdEventId: V4TqEHsxBkKWxcIt + description: |- +

    The hatchet is a compact, versatile tool that also serves as a weapon. With a short handle and a sturdy, sharp blade, the hatchet is perfect for close combat and general utility tasks such as chopping wood or crafting. In battle, it is used for quick, forceful strikes at close range, making it a reliable secondary weapon.

    +

    Specialized variants include throwing hatchets, designed for balanced flight and accuracy, and heavy-duty versions, which are more robust for splitting wood and performing other demanding tasks.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: iZCrSuwiRH2wjWgg + name: Pickaxe + type: Axe + img: systems/sohl/assets/icons/pickaxe.svg + durability: 9 + weight: 7 + value: 18 + heft: 18 + length: 5 + noblock: false + abbrev: PkAxe + createdEventId: 3CRGVcwguOFYzYgo + description: |- +

    The pickaxe features a dual-ended head: one side with a pointed pick and the other with a flat adze. Originally a tool for mining, in combat, it is repurposed for its ability to penetrate armor and fortifications. The weapon is swung in powerful arcs to leverage the pointed end for piercing and the adze for chopping or tearing.

    +

    Variants include the miner's pickaxe, which is heavier and designed primarily for breaking through hard materials, and lighter versions optimized for faster, efficient strikes in combat scenarios.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 151T3dMzXMoMtwZc + name: Sickle + type: Axe + img: systems/sohl/assets/icons/sickle.svg + durability: 9 + weight: 1 + value: 10 + heft: 9 + length: 3 + noblock: false + abbrev: Skl + createdEventId: pWj5mKKziEnCdLuH + description: |- +

    The sickle is originally an agricultural tool repurposed as a weapon for its sharp, curved blade. It is primarily used for slashing motions, making it effective in close combat against unarmored or lightly armored foes. Peasants and irregular troops often wield sickles as impromptu weapons during uprisings.

    +

    Variants include the billhook, which has a longer handle and a more robust blade, providing additional reach and cutting power. The kama, a similar weapon from Japan, is also used in martial arts and has both combat and gardening applications.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: rnhIdHoRpWS9hipo + name: Throwing Axe + type: Axe + img: systems/sohl/assets/icons/axe.svg + durability: 10 + weight: 2 + value: 48 + heft: 10 + length: 5 + noblock: false + abbrev: Shkn + createdEventId: L2MvnBIaxFATIOsY + description: |- +

    A throwing axe is a specialized weapon designed for being hurled at targets with precision and force. Typically featuring a weighted head and a balanced handle, the throwing axe utilizes the momentum and rotation generated by the thrower to ensure the blade strikes the target effectively. Characterized by their distinctive curved blade, the throwing axe creates a tumbling motion that increases the likelihood of inflicting damage upon impact, regardless of which part of the axe hits the target.

    +

    In combat, the throwing axe is used to disrupt enemy lines just before engaging in melee fighting. Warriors would throw their axes at advancing foes to break shields, injure soldiers, and create chaos among ranks. This tactic weakens the enemy's front line, making them vulnerable to subsequent close-quarters attacks. The throwing axe thus plays a crucial role in both offensive and defensive military strategies, serving as a precursor to direct combat by maximizing initial damage and disarray.

    +

    For further information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 9arQDGIipaW8T5ul + name: Warhammer + type: Axe + img: systems/sohl/assets/icons/warhammer.svg + durability: 11 + weight: 4 + value: 84 + heft: 13 + length: 5 + noblock: false + abbrev: Whmr + createdEventId: KdfQBRhbH51T3rbN + description: |- +

    The warhammer is a weapon designed to deliver blunt force trauma, featuring a heavy, hammer-like head on one side and often a piercing spike on the other. It is used to hammer and crush armor, delivering powerful, concussive strikes that can incapacitate an opponent even if the armor is not penetrated. The spike is useful for piercing armor's weaker points.

    +

    Common variants include the maul, which features a larger, heavier hammerhead, and the lucerne hammer, which incorporates additional spikes and flanges for increased utility in combat.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: sVa6nVcQxN6bqf0L + name: Wood Axe + type: Axe + img: systems/sohl/assets/icons/axe.svg + durability: 9 + weight: 5 + value: 12 + heft: 16 + length: 5 + noblock: false + abbrev: WAxe + createdEventId: iXUtbVVHHrVCcuHN + description: |- +

    The wood axe is primarily a tool for chopping wood but can be adapted for use in combat. It features a longer handle and a broad, heavy blade for powerful, cleaving strokes. In battle, it is less common due to its primary function, but it can deliver substantial, sweeping blows when needed.

    +

    Variants include the felling axe, designed for cutting down trees with its finely honed blade, and the splitting axe, which has a thicker head for splitting logs.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: QRiORm95BTr4XREA + name: Blowgun + type: Blowgun + img: systems/sohl/assets/icons/blowgun.svg + durability: 8 + weight: 1 + value: 30 + heft: 10 + length: 0 + noblock: false + abbrev: BGun + createdEventId: UkDID4khRhre9mWO + description: |- +

    The blowgun is a simple ranged weapon consisting of a long, narrow tube through which projectiles such as darts are blown. It relies on the user’s lung capacity to expel the dart with sufficient force. While not commonly associated with medieval European warfare, it sees use in various cultures around the world, particularly in hunting and assassination.

    +

    Variants include the Japanese fukiya, which is used in traditional Japanese martial arts, and the South American blowgun, which often employs poison-tipped darts for increased lethality.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: SKuhS0wEblXOmOlt + name: Composite Bow 100 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 12 + weight: 3 + value: 540 + heft: 12 + length: 4 + noblock: false + abbrev: CBw100 + createdEventId: yKTiBLnsWErN5qFI + description: |- +

    The composite bow is a highly efficient and powerful bow made from multiple materials such as wood, horn, and sinew. These materials are layered to create a bow with superior strength and elasticity. In combat, it excels in both mounted and foot archery, providing excellent range, power, and accuracy.

    +

    Variants include the Mongolian composite bow, which is shorter and designed for use on horseback, and the Persian composite bow, known for its exceptional craftsmanship and performance.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: eVIPrpvF4wOv9asM + name: Composite Bow 120 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 12 + weight: 4 + value: 600 + heft: 13 + length: 4 + noblock: false + abbrev: CBw120 + createdEventId: 5kh0dMspJ3oCtvoR + description: |- +

    The composite bow is a highly efficient and powerful bow made from multiple materials such as wood, horn, and sinew. These materials are layered to create a bow with superior strength and elasticity. In combat, it excels in both mounted and foot archery, providing excellent range, power, and accuracy.

    +

    Variants include the Mongolian composite bow, which is shorter and designed for use on horseback, and the Persian composite bow, known for its exceptional craftsmanship and performance.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: y8trdeWcTIxJch7W + name: Composite Bow 140 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 12 + weight: 4 + value: 660 + heft: 13 + length: 4 + noblock: false + abbrev: CBw140 + createdEventId: e7VSUJXI1ZHoFtG8 + description: |- +

    The composite bow is a highly efficient and powerful bow made from multiple materials such as wood, horn, and sinew. These materials are layered to create a bow with superior strength and elasticity. In combat, it excels in both mounted and foot archery, providing excellent range, power, and accuracy.

    +

    Variants include the Mongolian composite bow, which is shorter and designed for use on horseback, and the Persian composite bow, known for its exceptional craftsmanship and performance.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 1XHE433lMCMaDjvu + name: Composite Bow 40 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 11 + weight: 2 + value: 360 + heft: 11 + length: 4 + noblock: false + abbrev: CBw40 + createdEventId: 1pIyHJWYe2XcotTa + description: |- +

    The composite bow is a highly efficient and powerful bow made from multiple materials such as wood, horn, and sinew. These materials are layered to create a bow with superior strength and elasticity. In combat, it excels in both mounted and foot archery, providing excellent range, power, and accuracy.

    +

    Variants include the Mongolian composite bow, which is shorter and designed for use on horseback, and the Persian composite bow, known for its exceptional craftsmanship and performance.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: wqQirtSicsibG8ip + name: Composite Bow 60 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 11 + weight: 2 + value: 420 + heft: 11 + length: 4 + noblock: false + abbrev: CBw60 + createdEventId: KaYBVbMXWjc6mfhW + description: |- +

    The composite bow is a highly efficient and powerful bow made from multiple materials such as wood, horn, and sinew. These materials are layered to create a bow with superior strength and elasticity. In combat, it excels in both mounted and foot archery, providing excellent range, power, and accuracy.

    +

    Variants include the Mongolian composite bow, which is shorter and designed for use on horseback, and the Persian composite bow, known for its exceptional craftsmanship and performance.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: qkDtym8AHiF4DrMt + name: Composite Bow 80 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 11 + weight: 3 + value: 480 + heft: 12 + length: 4 + noblock: false + abbrev: CBw80 + createdEventId: F5bHoAhoyitalhrD + description: |- +

    The composite bow is a highly efficient and powerful bow made from multiple materials such as wood, horn, and sinew. These materials are layered to create a bow with superior strength and elasticity. In combat, it excels in both mounted and foot archery, providing excellent range, power, and accuracy.

    +

    Variants include the Mongolian composite bow, which is shorter and designed for use on horseback, and the Persian composite bow, known for its exceptional craftsmanship and performance.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: DaJiW4RWuvOYLB9T + name: Longbow 100 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 10 + weight: 3 + value: 54 + heft: 13 + length: 6 + noblock: false + abbrev: LBw100 + createdEventId: K1SDVAXZU69Y6nj1 + description: |- +

    The longbow is a powerful and long-ranged bow used predominantly by English archers. It features a tall, narrow stave that allows for a long draw length, maximizing the potential energy stored in the bow. Archers use the longbow to launch arrows over great distances with remarkable accuracy, making it effective for both battlefield engagements and sieges.

    +

    Common variants include the English longbow, renowned for its use during battles like Agincourt, and the Welsh longbow, which has similar design features but adapted to local materials and techniques.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 2D8bccD7IaGE81m7 + name: Longbow 125 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 11 + weight: 3 + value: 63 + heft: 13 + length: 6 + noblock: false + abbrev: LBw125 + createdEventId: OScR0kzjhFzy7x3J + description: |- +

    The longbow is a powerful and long-ranged bow used predominantly by English archers. It features a tall, narrow stave that allows for a long draw length, maximizing the potential energy stored in the bow. Archers use the longbow to launch arrows over great distances with remarkable accuracy, making it effective for both battlefield engagements and sieges.

    +

    Common variants include the English longbow, renowned for its use during battles like Agincourt, and the Welsh longbow, which has similar design features but adapted to local materials and techniques.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: Po5sBJKLMr2pgC0N + name: Longbow 150 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 11 + weight: 4 + value: 72 + heft: 14 + length: 7 + noblock: false + abbrev: LBw150 + createdEventId: zO2VUp1RxMt9peR0 + description: |- +

    The longbow is a powerful and long-ranged bow used predominantly by English archers. It features a tall, narrow stave that allows for a long draw length, maximizing the potential energy stored in the bow. Archers use the longbow to launch arrows over great distances with remarkable accuracy, making it effective for both battlefield engagements and sieges.

    +

    Common variants include the English longbow, renowned for its use during battles like Agincourt, and the Welsh longbow, which has similar design features but adapted to local materials and techniques.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 4Y0zPMrFAwBMsgPt + name: Longbow 175 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 11 + weight: 4 + value: 81 + heft: 14 + length: 7 + noblock: false + abbrev: LBw175 + createdEventId: GGM444AUOdaeqBQ4 + description: |- +

    The longbow is a powerful and long-ranged bow used predominantly by English archers. It features a tall, narrow stave that allows for a long draw length, maximizing the potential energy stored in the bow. Archers use the longbow to launch arrows over great distances with remarkable accuracy, making it effective for both battlefield engagements and sieges.

    +

    Common variants include the English longbow, renowned for its use during battles like Agincourt, and the Welsh longbow, which has similar design features but adapted to local materials and techniques.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 2ukbTddPtKvHuMjj + name: Longbow 50 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 10 + weight: 2 + value: 36 + heft: 12 + length: 5 + noblock: false + abbrev: LBw50 + createdEventId: tJVnv8I6H2GVxC3O + description: |- +

    The longbow is a powerful and long-ranged bow used predominantly by English archers. It features a tall, narrow stave that allows for a long draw length, maximizing the potential energy stored in the bow. Archers use the longbow to launch arrows over great distances with remarkable accuracy, making it effective for both battlefield engagements and sieges.

    +

    Common variants include the English longbow, renowned for its use during battles like Agincourt, and the Welsh longbow, which has similar design features but adapted to local materials and techniques.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: stIt7vogUhgZtDTE + name: Longbow 75 + type: Bow + img: systems/sohl/assets/icons/longbow.svg + durability: 10 + weight: 2 + value: 45 + heft: 12 + length: 5 + noblock: false + abbrev: LBw75 + createdEventId: gdkvGoIXTR7WzGnU + description: |- +

    The longbow is a powerful and long-ranged bow used predominantly by English archers. It features a tall, narrow stave that allows for a long draw length, maximizing the potential energy stored in the bow. Archers use the longbow to launch arrows over great distances with remarkable accuracy, making it effective for both battlefield engagements and sieges.

    +

    Common variants include the English longbow, renowned for its use during battles like Agincourt, and the Welsh longbow, which has similar design features but adapted to local materials and techniques.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: pX3qKPrPcgPMjsX5 + name: Boomerang + type: Club + img: systems/sohl/assets/icons/boomerang.svg + durability: 11 + weight: 1 + value: 15 + heft: 8 + length: 3 + noblock: false + abbrev: Bmrg + createdEventId: CaQ6kgC5074cLgeZ + description: |- +

    The boomerang is a curved throwing tool that returns to the thrower when thrown correctly. Used primarily for hunting, it also finds application as a weapon in some cultures. Its flight path is stable and predictable, making it useful for striking targets at a distance.

    +

    Variants include the returning boomerang, which is designed to come back to the thrower, and the non-returning boomerang, which is heavier and used like a throwing stick to hit targets directly.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: CsKoW7OcMvIoyZN5 + name: Club + type: Club + img: systems/sohl/assets/icons/club.svg + durability: 9 + weight: 3 + value: 12 + heft: 11 + length: 4 + noblock: false + abbrev: Clb + createdEventId: cCrckRsYcTf07tIa + description: |- +

    The club is one of the simplest and oldest weapons, consisting of a heavy, blunt head affixed to a handle. It delivers powerful, concussive blows to incapacitate or kill an opponent. Clubs are easy to make and highly effective, making them a popular choice for peasant armies and irregular troops.

    +

    Variants include the mace, which features a more refined design with additional weight and sometimes spikes or flanges for increased damage, and the cudgel, a shorter, heavier club used for close combat.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: C4KPc3hjFv6KfIbP + name: Club, Improvised + type: Club + img: systems/sohl/assets/icons/club.svg + durability: 8 + weight: 3 + value: 0 + heft: 12 + length: 4 + noblock: false + abbrev: ClbImp + createdEventId: zBCU5CjhX8urzxb0 + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 5MB9HLkTUNScCTDW + name: Club, Large + type: Club + img: systems/sohl/assets/icons/club.svg + durability: 9 + weight: 5 + value: 18 + heft: 14 + length: 5 + noblock: false + abbrev: ClbLg + createdEventId: 09Wlifffe8GqBThb + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 14K5PZes1RJUsm7H + name: Crowbar + type: Club + img: systems/sohl/assets/icons/club.svg + durability: 11 + weight: 6 + value: 9 + heft: 16 + length: 4 + noblock: false + abbrev: Crwbr + createdEventId: cdswWKFKy6SJyUtv + description: |- +

    The crowbar, while primarily a tool for prying and levering, can serve as a weapon. It features a long metal shaft with one end curved into a claw for prying and the other tapered to a point. In combat, it is used for powerful, blunt attacks and leveraging techniques.

    +

    While not designed as a weapon, its versatility and availability make it a practical choice for armed conflicts when conventional weapons are not accessible.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: HSggjzbSPU2MvMvG + name: Cudgel + type: Club + img: systems/sohl/assets/icons/club.svg + durability: 9 + weight: 3 + value: 12 + heft: 11 + length: 4 + noblock: false + abbrev: Cdgl + createdEventId: O0xR0gYSS5iXLE0m + description: |- +

    The cudgel is a short, thick club designed for close-quarters combat. It is a simple weapon, easy to wield and effective at delivering blunt force trauma. In battle, the cudgel is swung with one or both hands to incapacitate opponents with its heavy strikes.

    +

    This weapon is often used by peasants and lower-class fighters, as it can be made from any solid piece of wood or metal, making it a readily available and efficient tool for self-defense.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: Jfu4nHF79lOF9R7g + name: Gada + type: Club + img: systems/sohl/assets/icons/club.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Gada + createdEventId: R3U0065NC30U6LoP + description: |- +

    The gada is a traditional Indian mace with a long handle and a heavy, often spiked, bulbous head designed for delivering powerful, crushing blows. It is a symbol of strength and valor in Indian mythology, famously associated with the deity Hanuman. In combat, the gada is used to break through shields and armor with its sheer weight and impact force.

    +

    Variants include the heavy war gada, designed for maximum damage, and ceremonial versions, which are often decorated and used in rituals.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: Ql08V4MDq3SgEWjH + name: Mace, Steel Handle + type: Club + img: systems/sohl/assets/icons/flanged-mace.svg + durability: 12 + weight: 4 + value: 108 + heft: 13 + length: 4 + noblock: false + abbrev: StlMce + createdEventId: 2twoboYhVT1ESZ0S + description: |- +

    The steel handle mace is a blunt weapon with a heavy head, often spiked or flanged, mounted on a sturdy handle. Designed to break through armor and cause significant blunt force trauma, it is a preferred weapon for fighting heavily armored opponents. The steel handle makes it more durable and less susceptible to damage.

    +

    Common variants include the flanged mace, which features multiple protrusions to concentrate the force of a blow, and the spiked mace, which adds piercing capabilities to its blunt force impact.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: bm9SbGIuZs3AH5f4 + name: Mace, Wood Handle + type: Club + img: systems/sohl/assets/icons/flanged-mace.svg + durability: 11 + weight: 3 + value: 84 + heft: 11 + length: 4 + noblock: false + abbrev: WdMce + createdEventId: PuJWGUiAMAI20hAB + description: |- +

    The wood handle mace features a heavy, blunt head, often spiked or flanged, mounted on a wooden handle. This makes it lighter and easier to wield compared to its steel-handled counterpart. In combat, it delivers powerful, armor-crushing blows that can incapacitate or kill an opponent.

    +

    Variants include the flanged head, designed to focus the impact force and break through armor plate, and the ball and chain variant, which adds flexibility to the weapon, allowing for dynamic striking patterns.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: r9NZxajV7MkTZUxW + name: Maul + type: Club + img: systems/sohl/assets/icons/hammer.svg + durability: 12 + weight: 7 + value: 96 + heft: 18 + length: 5 + noblock: false + abbrev: Maul + createdEventId: rTSTxbH20l00tD0J + description: |- +

    The maul is a large, heavy hammer-like weapon designed for delivering powerful, crushing blows. It features a long handle and a broad, massive head, which can be swung with great force to break shields, armor, and bones. The maul is particularly effective in siege warfare for breaking down doors and fortifications.

    +

    Common variants include the splitting maul, primarily used for splitting wood but effective against fortified doors in combat, and the medieval war maul, which is specifically designed for battlefield use with a reinforced head and handle.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: c8FbFCrF09XPfy5w + name: Morningstar + type: Club + img: systems/sohl/assets/icons/mace.svg + durability: 11 + weight: 5 + value: 48 + heft: 15 + length: 5 + noblock: false + abbrev: MgStr + createdEventId: ZyBo0gbZrzvw6xii + description: |- +

    The morningstar is a spiked club or mace designed to deliver both blunt and piercing damage. It features a heavy, rounded head adorned with spikes, making it highly effective against both armor and flesh. In battle, it is used to deliver powerful, crushing strikes that can pierce through armor or cause severe blunt force injuries.

    +

    Variants include the flail morningstar, which has the spiked head attached to a chain, allowing for flexible striking, and the fixed-head morningstar, which provides more control and impact force.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: SEpQZB9ufqHIt0IJ + name: Sledgehammer + type: Club + img: systems/sohl/assets/icons/hammer.svg + durability: 10 + weight: 6 + value: 24 + heft: 18 + length: 5 + noblock: false + abbrev: SlgHmr + createdEventId: SnobhW12zPAKDS9U + description: |- +

    The sledgehammer is a large, heavy hammer used primarily as a tool for construction but also adapted for combat in certain situations. It features a long handle and a massive head designed for delivering powerful, crushing blows. In siege warfare, it is used to break down fortifications, doors, and other structures.

    +

    While not typically a primary weapon, the sledgehammer's sheer force makes it a formidable tool in close combat situations, particularly in breaking through defensive structures or armor.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: qYFSh2Fr38UHKT5f + name: Stick + type: Club + img: systems/sohl/assets/icons/club.svg + durability: 8 + weight: 1 + value: 6 + heft: 9 + length: 3 + noblock: false + abbrev: Stk + createdEventId: uNb1tOuk5SPmRpyO + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: D4bOi6ZeH9IatTsy + name: Truncheon + type: Club + img: systems/sohl/assets/icons/club.svg + durability: 9 + weight: 3 + value: 12 + heft: 11 + length: 4 + noblock: false + abbrev: Trunch + createdEventId: vRx5dFMxWZ3B60nY + description: |- +

    The truncheon is a short, stout club used primarily by law enforcement and security personnel. It features a handle designed for easy gripping and a weighted head to deliver blunt force trauma. In medieval times, it serves as a tool for crowd control and subdue without lethal force.

    +

    Variants include the baton, which is lighter and easier to maneuver, and the nightstick, which features an additional handle for a more secure grip and greater control during striking.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: OxkcJeJalqCCxNI7 + name: Composite Crossbow 200 + type: Crossbow + img: systems/sohl/assets/icons/crossbow.svg + durability: 11 + weight: 7 + value: 144 + heft: 0 + length: 0 + noblock: false + abbrev: CCxBw200 + createdEventId: pnWj4oryWGBJ4zEM + description: |- +

    The composite crossbow integrates materials such as wood, horn, and sinew into its design, making it more powerful and effective than simple wooden crossbows. Used in both siege warfare and on the battlefield, it provides high-powered, accurate shots over long distances. The mechanical advantage allows soldiers of varying strength to use it effectively.

    +

    Variants include the repeating crossbow, which features a mechanism for rapid firing, and the Chinese composite crossbow, known for its innovative design and effectiveness in battle.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: TcKGyr36ZsQg10xl + name: Composite Crossbow 300 + type: Crossbow + img: systems/sohl/assets/icons/crossbow.svg + durability: 12 + weight: 9 + value: 204 + heft: 0 + length: 0 + noblock: false + abbrev: CCxBw300 + createdEventId: rLfCqKzaWMtppr4L + description: |- +

    The composite crossbow integrates materials such as wood, horn, and sinew into its design, making it more powerful and effective than simple wooden crossbows. Used in both siege warfare and on the battlefield, it provides high-powered, accurate shots over long distances. The mechanical advantage allows soldiers of varying strength to use it effectively.

    +

    Variants include the repeating crossbow, which features a mechanism for rapid firing, and the Chinese composite crossbow, known for its innovative design and effectiveness in battle.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: o9uvddcjqpyIAFdW + name: Kúzan Steelbow + type: Crossbow + img: systems/sohl/assets/icons/crossbow.svg + durability: 14 + weight: 12 + value: 288 + heft: 0 + length: 0 + noblock: false + abbrev: KznStlbw + createdEventId: SDy88OAeDW8UjEd6 + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: WfPlINJLt2stPJbx + name: Wooden Crossbow 120 + type: Crossbow + img: systems/sohl/assets/icons/crossbow.svg + durability: 10 + weight: 4 + value: 84 + heft: 0 + length: 0 + noblock: false + abbrev: WCxBw120 + createdEventId: cd3gI2coEuHKdGeM + description: |- +

    The wooden crossbow is a simpler variant of the crossbow, made entirely from wood and string. It is one of the earliest forms of this weapon, providing a mechanical advantage over traditional bows. Archers use it to deliver powerful, accurate bolts over medium to long distances, suitable for both sieges and battlefield engagements.

    +

    Common variants include the arbalest, a larger and more powerful wooden crossbow, and the hand crossbow, which is smaller and easily maneuverable.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: d0WpYxGlFA3a33q3 + name: Wooden Crossbow 160 + type: Crossbow + img: systems/sohl/assets/icons/crossbow.svg + durability: 10 + weight: 5 + value: 96 + heft: 0 + length: 0 + noblock: false + abbrev: WCxBw160 + createdEventId: QYCjpBPxG4OXgDcA + description: |- +

    The wooden crossbow is a simpler variant of the crossbow, made entirely from wood and string. It is one of the earliest forms of this weapon, providing a mechanical advantage over traditional bows. Archers use it to deliver powerful, accurate bolts over medium to long distances, suitable for both sieges and battlefield engagements.

    +

    Common variants include the arbalest, a larger and more powerful wooden crossbow, and the hand crossbow, which is smaller and easily maneuverable.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: jGe6fjplOSPfQ32V + name: Wooden Crossbow 80 + type: Crossbow + img: systems/sohl/assets/icons/crossbow.svg + durability: 10 + weight: 3 + value: 60 + heft: 0 + length: 0 + noblock: false + abbrev: WCxBw80 + createdEventId: k8aRRDmzTLCXR3n8 + description: |- +

    The wooden crossbow is a simpler variant of the crossbow, made entirely from wood and string. It is one of the earliest forms of this weapon, providing a mechanical advantage over traditional bows. Archers use it to deliver powerful, accurate bolts over medium to long distances, suitable for both sieges and battlefield engagements.

    +

    Common variants include the arbalest, a larger and more powerful wooden crossbow, and the hand crossbow, which is smaller and easily maneuverable.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: lU0DRdXtAk6K7BUt + name: Ball & Chain Flail + type: Flail + img: systems/sohl/assets/icons/flail.svg + durability: 12 + weight: 4 + value: 72 + heft: 14 + length: 5 + noblock: false + abbrev: B&CFl + createdEventId: Chme5lIrjeYySuYD + description: |- +

    The ball-and-chain flail consists of a heavy metal ball attached to a handle via a chain. This design allows for dynamic, sweeping attacks capable of overcoming shields and armor. The flexibility of the chain makes the weapon difficult to block and easy to entangle enemies' defenses.

    +

    Variants include the single-ball flail, which offers better control and impact focus, and the multi-ball flail, which increases the chances of a successful strike with multiple swinging heads.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: PZ928gsyeidvMtuo + name: Grainflail + type: Flail + img: systems/sohl/assets/icons/grainflail.svg + durability: 9 + weight: 3 + value: 16 + heft: 11 + length: 5 + noblock: false + abbrev: GrnFl + createdEventId: 372ToY8vmbFPtyFE + description: |- +

    The grainflail, primarily an agricultural tool for threshing grain, is occasionally adapted as a weapon. It consists of two wooden sticks connected by a short chain or leather thong. In combat, it is swung to deliver rapid, consecutive strikes. It is favored for its reach and the unpredictability of its attacks.

    +

    Common variants include the nunchaku, derived from similar agricultural tools and now used in martial arts, and the warflail, specifically adapted for combat with more robust construction.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 8XkM69WwCDD6to7G + name: Meteor Dart + type: Flail + img: systems/sohl/assets/icons/flail.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Biao + createdEventId: 2BcMPebYqhlpvLBG + description:

    The sheng biao, also known as a meteoric dart, is a small, pointed weapon attached to a rope designed for throwing. It often features a weighted end to stabilize its flight and enhance its penetrating power. In combat, it is used to disrupt and injure opponents from a distance, complementing close-range weapons by providing a ranged attack option.

    + notes: "" + textReference: "" + macros: [] + flags: {} +- id: Df8gMsCyX334UUNT + name: Net + type: Flail + img: systems/sohl/assets/icons/net.svg + durability: 9 + weight: 4 + value: 48 + heft: 12 + length: 2 + noblock: true + abbrev: Net + createdEventId: pwLK8UswiTKlxIgr + description: |- +

    The net is a versatile tool used in both hunting and combat. It is thrown to entangle and immobilize an opponent, making them an easy target for follow-up attacks. In gladiatorial combat, the retarius uses the net alongside a trident for flexible offensive and defensive maneuvers. The weight and design of the net allow it to spread wide and capture adversaries effectively.

    +

    Variants of the net include the weighted net, which has metal weights to ensure better entanglement, and the fishing net, which can be adapted for combat with added weights or hooks. The design and construction depend largely on the intended use, whether for capturing prey or opponents in battle.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: yJgrGmh3iAdZFuvx + name: Warflail + type: Flail + img: systems/sohl/assets/icons/grainflail.svg + durability: 11 + weight: 5 + value: 60 + heft: 17 + length: 6 + noblock: false + abbrev: WFl + createdEventId: xLGa0AvyUdukVCA3 + description: |- +

    The warflail is a sophisticated combat weapon derived from agricultural flails used for threshing grain. It comprises a wooden handle connected to a heavy, spiked head via a chain. The chain allows the weapon to swing freely, making it challenging for an opponent to block or predict its trajectory. The warflail is particularly effective at bypassing shields and causing significant damage even through armor.

    +

    Variants of the warflail include the single-head warflail, optimized for control, and the double-head warflail, which increases the chances of landing a blow with its unpredictable swinging motion. These adaptations make the warflail versatile and deadly on the battlefield.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: gmEBhQV7Zjnv99FM + name: Whip + type: Flail + img: systems/sohl/assets/icons/whip.svg + durability: 9 + weight: 2 + value: 12 + heft: 9 + length: 10 + noblock: false + abbrev: Whp + createdEventId: ZCGeRCtw0rjXf31t + description: |- +

    The whip is a flexible, elongated strip of leather or cord used primarily for inflicting pain through lashes. It is swung to generate high velocity at its tip, delivering stinging pain and sometimes cutting the skin. In combat, the whip serves both as a weapon and a tool for intimidation. Warriors often use it to disarm or entangle their opponents.

    +

    Variants include the bullwhip, known for its powerful, single-strand design, and the cat-o'-nine-tails, which has multiple strands designed to increase the inflicted pain and damage. Each variant offers a unique approach to combat and control.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: C5LbX1fHZVwrb6nV + name: Whip, Reksyni + type: Flail + img: systems/sohl/assets/icons/whip.svg + durability: 10 + weight: 3 + value: 24 + heft: 10 + length: 10 + noblock: false + abbrev: RWhp + createdEventId: 3ivVkGHdiORgkZsD + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: t5T8WtrQ3MljAU1c + name: Whip, Teamster + type: Flail + img: systems/sohl/assets/icons/whip.svg + durability: 9 + weight: 1 + value: 6 + heft: 9 + length: 4 + noblock: false + abbrev: TWhp + createdEventId: zXG9i888N38OoOJI + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: LDxnrcyhRCyVyGQK + name: Bagh Nakh + type: Knife + img: systems/sohl/assets/icons/broad-dagger.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: BghNkh + createdEventId: Mubu4CXDUE37Uk7d + description: |- +

    The bagh nakh, or "tiger claw," is a traditional Indian weapon consisting of a claw-like metal device worn on the hands. It is used for slashing and ripping, designed to mimic the claws of a tiger. In combat, the bagh nakh is utilized in close-quarters fighting for surprise attacks, capable of inflicting severe wounds.

    +

    Variants include the miniaturized bagh nakh for easy concealment and the larger versions designed for more aggressive attacks.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: po0MtDrMbBIcNdyH + name: Bodkin + type: Knife + img: systems/sohl/assets/icons/broad-dagger.svg + durability: 12 + weight: 2 + value: 36 + heft: 7 + length: 3 + noblock: false + abbrev: Kel + createdEventId: o2txm0qGTKlUoNI1 + description: |- +

    The Bodkin is a type of throwing knife, distinguished by its thin, pointed blade designed to penetrate armor and other protective coverings. The bodkin typically features a narrow, tapering design that allows it to focus the kinetic energy of a throw into a small surface area, making it particularly effective at piercing chainmail and lightly armored targets. The blade’s simplicity and lack of ornamental detailing are a testament to its utilitarian purpose on the battlefield, emphasizing function over form.

    +

    In combat, bodkin throwing knives are used to weaken and injure opponents from a distance before closing for melee engagements. Soldiers and specialized throwers employ bodkins to disrupt enemy formations, specifically targeting the gaps and weaker points in an opponent’s armor. This capability makes bodkins an invaluable asset in both open battle and during sieges, where the ability to inflict damage through armor can considerably shift the advantage. Apart from their battlefield use, bodkins also serve practical purposes in everyday tasks, further emphasizing their versatility and utility.

    +

    For further information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 2F1GQNY7FtnuzueG + name: Chakram + type: Knife + img: systems/sohl/assets/icons/circle.svg + durability: 11 + weight: 0.5 + value: 3 + heft: 7 + length: 3 + noblock: false + abbrev: Chak + createdEventId: jaEd1so4fYYdybHx + description: |- +

    The chakram is a circular, flat metal disc with a sharpened outer edge, used primarily by South Asian warriors. It is thrown like a frisbee to cut through enemies at a distance. The chakram can also be used in close combat, held in the hand for slashing movements. Its aerodynamic design allows it to travel long distances with speed and precision.

    +

    Variants include the smaller, concealed chakram, which can be hidden on the body for surprise attacks, and larger versions designed for greater reach and penetration. The weapon demands skill and practice to use effectively, making it a specialized tool for trained warriors.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 9ijT9drcTK805O5F + name: Dagger + type: Knife + img: systems/sohl/assets/icons/broad-dagger.svg + durability: 11 + weight: 1 + value: 24 + heft: 7 + length: 3 + noblock: false + abbrev: Dgr + createdEventId: Dg48dBTIwNaJ52JK + description: |- +

    The dagger is a short, pointed weapon designed for stabbing and thrusting. It typically features a double-edged blade and a sturdy hilt, making it ideal for close combat and self-defense. Daggers are often carried as a secondary weapon, providing a reliable option for quick, lethal strikes when a larger weapon is impractical.

    +

    Variants include the rondel dagger, characterized by its round handle and straight, narrow blade, and the misericorde, a narrow-bladed dagger used to deliver a mercy stroke to a severely wounded opponent.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: QbOkvwNX1cWioyyn + name: Katar + type: Knife + img: systems/sohl/assets/icons/broad-dagger.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Katr + createdEventId: 3hhuVzTCFcizTYsA + description: |- +

    The katar is an Indian punch dagger characterized by its H-shaped handle, which allows the user to make thrusts with a straight, punching motion. The blade is often wide at the base and tapers to a point, optimized for piercing armor. In combat, the katar is used for close-quarters fighting, delivering fast, powerful thrusts that can penetrate chain mail and plate armor.

    +

    Variants include the bichwa katar, which incorporates a curved blade resembling a scorpion's sting, and the gauntlet katar, which features an extended hand guard for additional protection and stability in combat.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: ZLDPpPDbHPfTLE2Y + name: Knife + type: Knife + img: systems/sohl/assets/icons/dagger.svg + durability: 10 + weight: 1 + value: 6 + heft: 6 + length: 2 + noblock: false + abbrev: Kni + createdEventId: lPoEsHZKcifl71qC + description: |- +

    The knife, a fundamental tool and weapon, features a single-edged blade and a straightforward hilt. Knives are used for cutting and slicing in various contexts, from daily tasks to close-quarters combat. In battle, knives serve as secondary weapons, easily accessible for rapid strikes or for finishing incapacitated enemies.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: gdtGtzLTi8A8f6D1 + name: Longknife + type: Knife + img: systems/sohl/assets/icons/sword.svg + durability: 13 + weight: 2 + value: 96 + heft: 7 + length: 4 + noblock: false + abbrev: LKni + createdEventId: GsWRxi7cpIo9fhJe + description: |- +

    The longknife, also known as a "long dagger" or "dirk," features an elongated blade that bridges the gap between a dagger and a short sword. This weapon is ideal for thrusting and slashing, providing the reach to engage opponents at a slightly greater distance than shorter blades. In combat, the longknife is typically used as a secondary weapon, complementing a primary weapon.

    +

    Variants include the dirk, characterized by its long, straight blade and sturdy hilt, and the stiletto, a slender, elongated dagger optimized for thrusting through gaps in armor.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 03itZtd4heviT9Qv + name: Shuriken + type: Knife + img: systems/sohl/assets/icons/shuriken.svg + durability: 11 + weight: 0.3 + value: 5 + heft: 6 + length: 3 + noblock: false + abbrev: Shrkn + createdEventId: hMn0dLKg9fUAyney + description: |- +

    Shuriken, or "throwing stars," are known for their distinctive star-shaped designs. Used primarily for throwing, shuriken are intended to distract or injure opponents from a distance. They are lightweight and easily concealed, making them ideal for surprise attacks.

    +

    Variants include the hira-shuriken, which are flat and star-shaped, and the bo-shuriken, which are straight and resemble small darts or spikes. Each variant offers different dynamics in terms of flight and impact.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 7IYD91ExpmoJb0nz + name: Tabûri + type: Knife + img: systems/sohl/assets/icons/broad-dagger.svg + durability: 10 + weight: 1 + value: 20 + heft: 7 + length: 2 + noblock: false + abbrev: Tabri + createdEventId: 8Wx39gdbQc1PoFN6 + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: ff5sR8h7GpNK89G5 + name: Falcastra + type: Polearm + img: systems/sohl/assets/icons/polearm.svg + durability: 9 + weight: 7 + value: 42 + heft: 18 + length: 7 + noblock: false + abbrev: Falcstra + createdEventId: df91MNo95iHoEDQG + description: |- +

    The falcastra is a type of curved sword. Its design features a single-edged, curved blade optimized for slashing. Warriors use the falcastra for sweeping attacks that can easily cut through flesh and lightly armored opponents.

    +

    Variants include the shorter falx, which is more compact and easier to maneuver, and the kopis, sharing the falcastra’s curved blade but incorporating a more pronounced forward curve for heavier chopping power.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: xqWeqWccSXOa9bDD + name: Glaive + type: Polearm + img: systems/sohl/assets/icons/polearm.svg + durability: 11 + weight: 7 + value: 60 + heft: 18 + length: 7 + noblock: false + abbrev: Glv + createdEventId: 8EFJ6C5eBeFhv3sZ + description: |- +

    The glaive is a polearm with a single-edged blade affixed to a long shaft, combining the reach of a spear with the slashing capability of a sword. Warriors use the glaive for sweeping strikes to keep opponents at a distance while delivering powerful cuts. It is effective both against infantry and mounted combatants.

    +

    Variants include the fauchard, featuring a more pronounced curve in the blade, and the naginata, similar in design but with unique style and execution in martial arts.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 7qGCDLyqpA1ejoyQ + name: Green Dragon Crescent Blade + type: Polearm + img: systems/sohl/assets/icons/polearm.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: GunDao + createdEventId: gHhn3M0VwDA9sqWV + description: |- +

    The Green Dragon Crescent Blade is a polearm with a long, curved blade mounted on a substantial shaft. In combat, the weapon is effective for slashing, chopping, and thrusting, providing both reach and cutting power. The weapon's design allows for sweeping strikes that can cut through multiple opponents, making it a formidable tool in the hands of a trained warrior.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: bSh8evwiMWMAqaqn + name: Javelin, Barbed + type: Polearm + img: systems/sohl/assets/icons/spear.svg + durability: 10 + weight: 3 + value: 36 + heft: 11 + length: 5 + noblock: false + abbrev: BarJav + createdEventId: VE4juIVR1SFOWxFm + description: |- +

    The barbed javelin is a light spear designed for throwing with a barbed end to increase damage and make removal far more difficult. It is used to engage enemies at a distance with the intent to disrupt formations, injure key targets, or initiate combat. Javelins are often carried in bundles, allowing warriors to throw multiple projectiles before closing in for melee combat.

    +

    Variants include the pilum, designed to bend upon impact to prevent the enemy from throwing it back, and the assegai, a variant optimized for both throwing and close combat.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: r43xJwDBphGaIcDe + name: Javelin, Bodkin + type: Polearm + img: systems/sohl/assets/icons/spear.svg + durability: 10 + weight: 3 + value: 36 + heft: 11 + length: 5 + noblock: false + abbrev: BodJav + createdEventId: pITwD4ODQtv8tjxk + description: |- +

    The bodkin javelin is a light spear designed for throwing with a barbed end to increase damage and make removal far more difficult. It is used to engage enemies at a distance with the intent to disrupt formations, injure key targets, or initiate combat. Javelins are often carried in bundles, allowing warriors to throw multiple projectiles before closing in for melee combat.

    +

    Variants include the pilum, designed to bend upon impact to prevent the enemy from throwing it back, and the assegai, a variant optimized for both throwing and close combat.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: ZpTxK5WRmlI6Jc3C + name: Jousting Pole + type: Polearm + img: systems/sohl/assets/icons/lance.svg + durability: 8 + weight: 6 + value: 40 + heft: 16 + length: 8 + noblock: false + abbrev: JPole + createdEventId: yUGTNFzUx8W4T6lJ + description: |- +

    The jousting pole, or lance, is a long, sturdy pole used in medieval tournaments and cavalry charges. It features a blunt or decorated tip designed to strike an opponent off their horse without causing serious injury. In jousting, knights use the lance to display their skill and bravery in a controlled environment.

    +

    Variants include the tournament lance, which is designed specifically for sport and is often hollowed to reduce weight, and the war lance, which is sturdier and equipped with a sharp tip for battlefield engagements.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: DyI7VXcT6l3URR02 + name: Lance + type: Polearm + img: systems/sohl/assets/icons/lance.svg + durability: 11 + weight: 7 + value: 120 + heft: 17 + length: 8 + noblock: false + abbrev: Lnc + createdEventId: XYt3jBIPDjEnJFIB + description: |- +

    The lance is a long, spear-like weapon used primarily by cavalry for charging into enemy ranks. It provides the reach and impact needed to penetrate armor and disrupt formations. Lances are typically used in conjunction with a shield, allowing the rider to maximize their offensive and defensive capabilities.

    +

    Variants include the lighter, more maneuverable lance used by light cavalry and the heavier, impact-focused couched lance designed for the initial charge.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: sZZxQiawzxKh52Ml + name: Pike + type: Polearm + img: systems/sohl/assets/icons/spear.svg + durability: 12 + weight: 10 + value: 96 + heft: 19 + length: 9 + noblock: false + abbrev: Pike + createdEventId: oPGwxfJBLXFM6d5H + description: |- +

    The pike is a long pole weapon used primarily by infantry to counter cavalry charges. It features a spear-like tip and can reach lengths of 20 feet or more, allowing formations of pikemen to create a defensive wall. In combat, pikemen use coordinated thrusting to disrupt and repel mounted attackers.

    +

    Variants include the shorter, more flexible partisan, which can be used for both thrusting and slashing, and the halberd, which combines the pike’s reach with an axe head for increased versatility in combat.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: uTBEpEn7heFX071U + name: Pitchfork + type: Polearm + img: systems/sohl/assets/icons/pitchfork.svg + durability: 9 + weight: 4 + value: 9 + heft: 12 + length: 5 + noblock: false + abbrev: Pfrk + createdEventId: wcXjZokTfuX2Ai3k + description: |- +

    The pitchfork is primarily an agricultural tool used for lifting and throwing hay but can be adapted for use as a weapon in times of need. It features a long handle and multiple prongs, making it effective for thrusting and holding opponents at bay. Peasant levies often use pitchforks as impromptu weapons during uprisings.

    +

    Common variants include the trident, which is similar in design but features three prongs and is often used in combat, and military forks, specifically made for defensive purposes with reinforced prongs.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: Gdm2jEz0I0iyzDpu + name: Poleaxe + type: Polearm + img: systems/sohl/assets/icons/polearm.svg + durability: 11 + weight: 7 + value: 96 + heft: 18 + length: 6 + noblock: false + abbrev: PAxe + createdEventId: 3E37XhcKAvtZZDiw + description: |- +

    The poleaxe is a versatile weapon combining an axe head, a hammer, and a spike on a long shaft, making it highly effective for both cutting and penetrating armor. Warriors use it for delivering powerful, multifaceted attacks in close combat. The poleaxe is a favored weapon for dismounted knights and infantry due to its versatility.

    +

    Variants include the halberd, which features a longer pole and an additional hook for dismounting riders, and the bec de corbin, emphasizing the hammer and spike for armor-piercing capabilities.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: M8YvZgWiTMJHd31Q + name: Qiang + type: Polearm + img: systems/sohl/assets/icons/polearm.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Qing + createdEventId: 1DR6dR4sUAdh9S68 + description: |- +

    The qiang is a Chinese spear featuring a long shaft and a leaf-shaped blade, used for thrusting and slashing. It is a versatile weapon, offering substantial reach and flexibility in combat. The qiang is also equipped with a tassel near the blade, serving to distract opponents and prevent blood from running down the shaft.

    +

    Variants include the tiger spear, with a larger and more elaborate blade, and the lighter, faster versions used in traditional Chinese martial arts.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: UwGWi1DMuYtyN8X8 + name: Spear + type: Polearm + img: systems/sohl/assets/icons/spear.svg + durability: 11 + weight: 4 + value: 60 + heft: 13 + length: 7 + noblock: false + abbrev: Spr + createdEventId: YCdFis5887vUBmvZ + description: |- +

    The spear is one of the most ancient and versatile weapons, featuring a long shaft with a pointed tip, used for thrusting and throwing. In combat, it serves as both a primary and auxiliary weapon, effective for both melee and ranged engagements. Spearmen often form defensive lines to repel cavalry and infantry attacks.

    +

    Variants include the javelin, a lighter, shorter spear designed for throwing, and the pike, a longer spear used primarily for defensive formations against cavalry.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: MHe30MVgUd2B7AXS + name: Staff + type: Polearm + img: systems/sohl/assets/icons/staff.svg + durability: 11 + weight: 4 + value: 24 + heft: 12 + length: 6 + noblock: false + abbrev: Stf + createdEventId: fdhqKmvKtyuxh8nz + description: |- +

    The staff is a simple, long stick used as both a weapon and a tool. In combat, it provides reach and versatility, allowing for strikes, blocks, and parries. Staffs are often used in martial arts, demonstrating techniques that exploit the weapon’s length and flexibility.

    +

    Variants include the quarterstaff, favored in martial traditions for its balance and length, and the bo staff, used in traditional eastern martial arts.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 7FUayLoMMfw8tewq + name: Staff, Long + type: Polearm + img: systems/sohl/assets/icons/polearm.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: LStf + createdEventId: ieHiRsXqJ0kidpQE + description: |- +

    The long staff is made of wood or metal, used in martial arts and self-defense. It is longer than a standard staff, providing extended reach and leverage for striking, blocking, and sweeping maneuvers. The bang's versatility makes it a staple weapon in both training and practical combat.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: PoMZUG3IInE8wSqz + name: Trident + type: Polearm + img: systems/sohl/assets/icons/trident.svg + durability: 12 + weight: 6 + value: 72 + heft: 14 + length: 6 + noblock: false + abbrev: Tri + createdEventId: 2mnXHISZ8UCAQxRJ + description: |- +

    The trident is a three-pronged spear traditionally associated with fishing but also adapted for combat. It offers superior control and versatility in both thrusting and slashing movements. Gladiators, particularly the retiarius, famously use the trident paired with a net for versatile attack and defense.

    +

    Variants include the military fork, which has reinforced prongs for combat durability, and ceremonial tridents, which are more ornate and used in rituals or as symbols of power.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 7AH7gKN6gGBqKbdb + name: Trishula + type: Polearm + img: systems/sohl/assets/icons/polearm.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Trsha + createdEventId: 4nKSQQkaJm8iJnBI + description: |- +

    The trishula is a trident used in Hindu mythology and traditional Indian warfare, characterized by its three prongs and associated with the deity Shiva. In combat, the trishula is used for thrusting and impaling, offering a combination of reach and piercing power. It is also a symbol of divine power and balance.

    +

    Variants include the ceremonial trishula, which is often smaller and highly decorated, and the standard combat trishula, designed for practical use in battle.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: keOzxtWCsMbPxhuV + name: Buckler + type: Shield + img: systems/sohl/assets/icons/round-shield.svg + durability: 9 + weight: 3 + value: 30 + heft: 8 + length: 1 + noblock: false + abbrev: Bklr + createdEventId: ZnwbJWl8Q0Ud2RP6 + description: |- +

    The buckler is a small, round shield held by a handle or worn on the forearm, used for both offense and defense. It is lightweight and easy to maneuver, allowing users to parry, block, and deliver strikes with its weighted edge. The buckler is commonly paired with swords or other melee weapons.

    +

    Variants include the target, a larger buckler used for more substantial protection, and specialized pugil sticks used in training for close-quarters combat.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: T1SviWWVvq2RfB5V + name: Dhal + type: Shield + img: systems/sohl/assets/icons/round-shield.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Dhal + createdEventId: TZLnuFsofDaZKnHC + description: |- +

    The dhal is a traditional Indian shield, usually made from steel, leather, or brass and often elaborately decorated. It is circular and features multiple bosses for deflecting blows. In combat, the dhal is used to block and parry attacks while enabling counterstrikes with a companion weapon. It is both a practical defensive tool and a piece of art, showcasing intricate designs and craftsmanship.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: vpPLk8Ou4UsXQdTy + name: Kite Shield + type: Shield + img: systems/sohl/assets/icons/shield.svg + durability: 11 + weight: 7 + value: 72 + heft: 11 + length: 1 + noblock: false + abbrev: KiSh + createdEventId: AkNY3pbni7GayOXQ + description: |- +

    The kite shield is a large, elongated shield shaped like an inverted tear drop, providing extensive body coverage. It is used by knights and infantry for defense and tactics involving shield walls. The shape aids in deflecting blows while offering protection from head to shin.

    +

    Variants include the heater shield, a smaller, more maneuverable descendant.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: nbt1PW1YgQTNvm8n + name: Knight's Shield + type: Shield + img: systems/sohl/assets/icons/shield.svg + durability: 11 + weight: 5 + value: 60 + heft: 10 + length: 1 + noblock: false + abbrev: KnSh + createdEventId: xo2aKOuV3yiLm23G + description: |- +

    The knight's shield covers a range of shield types used by knights, including the heater shield and the kite shield. These shields are designed for mounted and unmounted combat, offering both protection and heraldic display. Knights use them to block enemy strikes and perform shield bashes in close combat.

    +

    Variants include the heater shield, which is smaller and pointed at the bottom for increased maneuverability, and the larger kite shield used for comprehensive protection.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 31mlq3ytO8jnkS3n + name: Roundshield + type: Shield + img: systems/sohl/assets/icons/round-shield.svg + durability: 10 + weight: 6 + value: 48 + heft: 10 + length: 1 + noblock: false + abbrev: RndSh + createdEventId: OtqqBUaxInK1bd8L + description: |- +

    The roundshield is a circular shield used by various medieval cultures, providing a balance of protection and versatility. It is held with a central grip and used for both blocking and offensive maneuvers. The round shape allows for agile movements, making it popular among infantry and cavalry alike.

    +

    Variants feature a central boss for punching attacks.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: Qr2D5btkRJF3S8cs + name: Tower Shield + type: Shield + img: systems/sohl/assets/icons/shield.svg + durability: 11 + weight: 8 + value: 96 + heft: 12 + length: 1 + noblock: false + abbrev: TwrSh + createdEventId: w9V6EBuv6uUjVEf9 + description: |- +

    The tower shield is a large, rectangular shield offering extensive coverage, used primarily in siege warfare and defensive formations. It provides protection from head to toe and is designed to create shield walls to repel projectiles and enemy advances. This makes it a crucial tool for infantry defending strategic positions.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: tzNkaxyefuOoAjoy + name: Sling + type: Sling + img: systems/sohl/assets/icons/sling.svg + durability: 9 + weight: 0.1 + value: 6 + heft: 0 + length: 0 + noblock: true + abbrev: Slng + createdEventId: dg2vPDFX1e7FIHLd + description: |- +

    The sling is a simple ranged weapon used for launching small projectiles, such as stones, at high speeds. It consists of a pouch attached to two cords, with one cord released to propel the projectile. Slings are effective for both hunting and combat, offering significant range and impact with minimal materials.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: uawJUZQxVDGe7Lzo + name: Sling Staff + type: Sling + img: systems/sohl/assets/icons/staffsling.webp + durability: 9 + weight: 0.1 + value: 6 + heft: 11 + length: 5 + noblock: false + abbrev: SlngStf + createdEventId: UTjjHqPOZfGF4nvH + description: |- +

    The sling staff is an enhanced version of the traditional sling, incorporating a staff for increased leverage and distance. Users place the projectile in a pouch at the end of the staff, swing it around, and release one end to propel the projectile. This design enhances the sling's range and impact.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: Jklt5Jr7EF4036th + name: Slingshot + type: Sling + img: systems/sohl/assets/icons/slingshot.svg + durability: 9 + weight: 0.7 + value: 12 + heft: 7 + length: 1 + noblock: false + abbrev: SlngSht + createdEventId: dhBwYA2SjQSOb7qw + description: |- +

    The slingshot has ancient roots as a small hand-powered projectile weapon. It consists of a Y-shaped frame with elastic bands attached to the upper arms, allowing users to launch small stones or pellets at high velocity. Its ease of construction and use makes it a practical tool for hunting small game and for self-defense.

    +

    Variants include the pocket slingshot, designed for portability and concealment, and the wrist-braced slingshot, which provides additional support for increased accuracy and power.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: uKACEmvIkemys7f9 + name: Bastard Sword + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 12 + weight: 5 + value: 184 + heft: 14 + length: 6 + noblock: false + abbrev: BstdSwd + createdEventId: L2HTFAg7I4Yw1LbR + description: |- +

    The bastard sword, also known as a "hand-and-a-half" sword, features a longer handle that can be used with either one or two hands. This versatile design allows for powerful two-handed strikes or quick one-handed maneuvers with a shield. The blade is typically straight and double-edged, ideal for both cutting and thrusting.

    +

    Common variants include swords with different pommel shapes for balance and customization of hilt length to suit various fighting styles.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: JTvhpBBj87XuIMXi + name: Battlesword + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 13 + weight: 7 + value: 240 + heft: 18 + length: 6 + noblock: false + abbrev: BatlSwd + createdEventId: bZ8QRsz8hWwwD7xN + description: |- +

    The battlesword is a broad category covering various types of swords used in medieval warfare. Typically characterized by their long, double-edged blades, battleswords are designed for both cutting and thrusting. The size and weight of these swords make them effective for delivering powerful blows capable of cutting through armor and shields. In battle, they are used with either one or both hands, allowing for versatile combat techniques.

    +

    Variants include the longsword, which has a longer blade and hilt for extended reach and leverage, and the arming sword, a shorter, more maneuverable version preferred for one-handed use, often paired with a shield.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: wjTLAt0dcAyim60L + name: Broadsword + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 12 + weight: 3 + value: 156 + heft: 10 + length: 5 + noblock: false + abbrev: BrdSwd + createdEventId: cSi2sZ2MSICYUdN1 + description: |- +

    The broadsword is a type of heavy, wide-bladed sword designed for powerful, sweeping strikes. It features a broad, double-edged blade and a crossguard for hand protection. In combat, the broadsword is used for slashing and chopping, effective against both armored and unarmored opponents. Its weight and balance allow for forceful, decisive blows.

    +

    Common variants of the broadsword include the basket-hilted broadsword, which offers additional hand protection with a metal guard, and the claymore with a larger, two-handed grip.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: UYYIc4v2vhufWMCR + name: Dao + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Dao + createdEventId: PKVAF1bztlB3iUmI + description: |- +

    The dao is a Chinese single-edged sword often referred to as a "broadsword." It features a slightly curved blade optimized for chopping and slashing. In combat, the dao is a versatile weapon used in both offensive strikes and defensive maneuvers, making it popular among Chinese soldiers and martial artists.

    +

    Variants include the dadao, a larger version with a broad blade used for cutting and chopping, and the niuweidao, known for its upward-curving blade, which enhances its cutting power.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: J0H2XxUf1n4RtHRh + name: Estoc + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 12 + weight: 3 + value: 168 + heft: 14 + length: 5 + noblock: false + abbrev: Estc + createdEventId: Oksks0phZ3qC31RI + description: |- +

    The estoc is a thrusting sword designed specifically to counter plate armor. It features a long, straight blade with a tapered point but often no sharp edges, focusing entirely on piercing capability. In combat, the estoc is used with powerful thrusts aimed at the gaps and joints in an opponent's armor, making it a specialized and highly effective weapon for dismounted knights and soldiers.

    +

    Variants include the longsword estoc, which has a longer blade and can be wielded with two hands for increased force, and shorter versions suitable for use in confined spaces or as a secondary weapon.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: YYQ9TSVo6RSRkyub + name: Falchion + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 12 + weight: 3 + value: 120 + heft: 12 + length: 4 + noblock: false + abbrev: Falcn + createdEventId: QxJSquW2l5ePvwpj + description: |- +

    The falchion is a single-edged sword with a curved blade, combining elements of a sword and an axe. Its design allows for powerful chopping and slashing strikes, making it effective against lightly armored opponents. The falchion is easier to use than other swords, due to its weight distribution and the curvature of the blade, which aids in cutting.

    +

    Variants include the early medieval falchion, which tends to have a more pronounced curve and is heavier, and the later period falchion, which is lighter and more refined, often featuring elaborate decorations on the hilt and blade.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: i3K0H86rBH3rx3b3 + name: Jian + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Jian + createdEventId: gDWSmibiWZX2jyRR + description: |- +

    The jian is a double-edged straight sword known as the "gentleman of weapons" in Chinese martial arts. It features a narrow, flexible blade suitable for both cutting and thrusting. The jian is used for precise, fluid movements in combat, emphasizing technique and control over brute force.

    +

    Variants include the taijijian, a lighter sword adapted for Taiji practice, and the long jian, which offers extended reach for increased versatility in combat.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: hjBDJ8jqOrBCEkMh + name: Katana + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Ktna + createdEventId: VpO5ruTjroYVyUfk + description: |- +

    The katana is a traditional Japanese sword characterized by its curved, single-edged blade, circular or squared guard, and long grip that accommodates two hands. Renowned for its craftsmanship, the katana’s blade is typically crafted through a meticulous process of folding and tempering steel, which results in a sharp, resilient edge capable of cleanly slicing through targets. The process also creates a visible pattern, known as the "hamon," along the blade, which is both functional and aesthetically pleasing. Samurai warriors primarily use the katana for swift, precise cutting techniques, emphasizing fluid motion and the weapon's natural curve to maximize its efficiency in both offense and defense.

    +

    Common variants of the katana include the tachi, which is worn edge-down and has a more pronounced curve, and the uchigatana, which is distinguishable by its slightly less curved blade and shorter handle, making it more suitable for close-quarters combat. The daisho pair, consisting of a katana and a shorter wakizashi or tantō, represents the dual-wielding tradition of samurai, symbolizing their social status and martial prowess. Additionally, the shinogi-zukuri katana is a subtype noted for its distinctive blade geometry that enhances its cutting ability without sacrificing durability.

    +

    For further detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: Ql3gc9dMj0EAofaN + name: Khanda + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Knda + createdEventId: Pg9iUGzYGV4mS3fm + description: |- +

    The khanda is a straight, double-edged sword from India, known for its broad blade and heavy construction, making it highly effective for chopping and hacking in battle. The khanda has a distinctive hilt with a protective guard and a disk-shaped pommel, which helps balance the weapon and allows for powerful strikes. Used by Indian warriors, it is a symbol of valor and martial prowess.

    +

    Variants include the Rajput khanda, often elaborately decorated, and the Maratha khanda, which sometimes incorporates a reinforced spine known as a mahi mark.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 3JX3cIkIDdIeC8jx + name: Kiliji + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Kiliji + createdEventId: 1Kl0sf4UkOk93ozx + description: |- +

    The kiliji, or kilij, is a Turkish sword with a curved, single-edged blade that is wider towards the tip, making it effective for powerful slashing attacks. The blade's curvature and the widened tip, or "yelman," concentrate the force of the cut, enabling it to slice through armor and flesh with ease. In battle, it is used for fast, devastating strikes that leverage the momentum of mounted combat.

    +

    Common variants of the kiliji include the Ottoman kilij, which has a pronounced curve and decorative elements reflecting its ceremonial as well as practical uses, and the Mongol-influenced versions that incorporate design features optimized for different combat scenarios.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: tjOwyBFL3S3h7NHY + name: Máng + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 10 + weight: 3 + value: 108 + heft: 11 + length: 5 + noblock: false + abbrev: Mang + createdEventId: HxpxcwYApaVeHrOJ + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: EiVXkncfZSMlqEu8 + name: Mankar + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 11 + weight: 2 + value: 84 + heft: 9 + length: 3 + noblock: false + abbrev: Mank + createdEventId: VCtRcCDgcbKjIYWc + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: IPeTvMjwjUsy4hw2 + name: Pata + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Pata + createdEventId: 7gRtiuRY5gdGZGZX + description: |- +

    The pata is an Indian gauntlet-sword, combining a sword blade with a forearm-length gauntlet that extends to protect the arm. This unique design allows for powerful thrusting and slashing while providing substantial protection. In combat, the pata enables warriors to deliver swift and powerful strikes, taking advantage of the gauntlet for both offense and defense.

    +

    Variants include the straight-bladed pata for thrusting and the curved-bladed pata for cutting and slashing.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 6lTEELsRUiGbqSNw + name: Scimitar + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 12 + weight: 3 + value: 184 + heft: 10 + length: 5 + noblock: false + abbrev: Scmtr + createdEventId: QvZrCMqtlfWMGYIv + description: |- +

    The scimitar is a curved, single-edged sword associated with Middle Eastern and South Asian cultures. It is designed for slashing and cutting, making it highly effective in mounted combat where sweeping strikes are more practical. The scimitar's curvature allows for greater cutting surface contact during a swing, enhancing its lethality.

    +

    Variants include the shamshir, a Persian design with an elegant, deeply curved blade, and the kilij, a Turkish sword with a pronounced curve and a wider tip, optimized for powerful slashing attacks.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 0wzqmCGrAebJzR13 + name: Shamshir + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Shmshr + createdEventId: 9rWhET2NuxreoRA2 + description: |- +

    The shamshir is a Persian sword with a deeply curved, slender blade designed for swift, powerful slashing attacks. Its name means "lion's claw," reflecting the weapon's sharpness and agility. In combat, the shamshir allows for quick, sweeping strikes, making it ideal for mounted troops and skilled swordsmen. Its design emphasizes speed and precision.

    +

    Variants include the Indo-Persian shamshir, which incorporates design elements from Indian and Persian metallurgy, and the Qajar shamshir, known for its intricate hilt and blade ornamentation.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: N4Q0mUchOQ9OPB9Z + name: Shortsword + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 12 + weight: 2 + value: 96 + heft: 8 + length: 4 + noblock: false + abbrev: ShrtSwd + createdEventId: mHsCxIgeoDNpSNXX + description: "" + notes: "" + textReference: "" + macros: [] + flags: {} +- id: OTitFZ13JLsumTLp + name: Talwar + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Tlwr + createdEventId: oYvLq767ft4sAjWN + description: |- +

    The talwar is a traditional Indian curved sword known for its sharp, broad blade and distinctive hilt with a disk-shaped pommel. Designed for efficient cutting and slashing, the talwar is effective in both mounted and foot combat. The blade's curvature enhances cutting potential, while the unique hilt design provides a firm grip and allows for powerful, controlled strikes.

    +

    Variants include the Rajput talwar, which often features intricate designs and gold inlay, and the Mughal talwar, known for its ornate craftsmanship and sometimes jeweled hilts.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: nyibb1NL4ZONuZIf + name: Urumi + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Urumi + createdEventId: kZ8D2jGaIcX7YqhO + description: |- +

    The urumi is an Indian flexible sword with multiple thin, flexible blades, often made of steel or iron. It is wielded like a whip, providing a combination of slashing and bludgeoning damage. The weapon requires significant skill to wield without self-injury, as the flexible blades can strike the wielder if not handled correctly. In combat, the urumi allows for dynamic, sweeping attacks that can disable multiple opponents.

    +

    Variants include single-bladed urumis and multi-bladed versions, with the latter increasing the weapon's coverage and unpredictability in battle.

    +

    For more detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: XQAoPtRgy7VDeNDj + name: Wakizashi + type: Sword + img: systems/sohl/assets/icons/sword.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Waki + createdEventId: h66r8tIgWGW7giPG + description: |- +

    The wakizashi is a traditional Japanese short sword, often ranging between 12 to 24 inches (30 to 60 centimeters) in length. It is typically worn alongside the katana by samurai, forming the daisho pair, which symbolizes the warrior's social status and right to bear arms. The wakizashi is designed for versatility, being effective in both close-quarters combat and as a backup weapon when the katana is impractical. Its shorter blade allows for swift, precise strikes in confined spaces, making it ideal for indoor fighting. Additionally, the wakizashi is used for seppuku, the ritual suicide performed by samurai to restore or uphold their honor.

    +

    Common variants of the wakizashi include the hira-zukuri, which has a flat, straight blade optimized for cutting, and the shobu-zukuri, featuring a blade shape that lacks a defined yokote but emphasizes a strong, pointed tip for better penetration capability. The kaishaku-wakizashi is specially designed for assisting another samurai in performing seppuku, featuring intricate craftsmanship. The blade's design and length can sometimes blur the lines between a long tantō (dagger) and a short wakizashi, adding to its multifaceted utility in the samurai armory.

    +

    For further detailed information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: kreKZTbXQBV0FiBY + name: Bolas + type: Thrown + img: systems/sohl/assets/icons/bolas.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: "" + createdEventId: RpWPU4RkLDbdd9Rs + description: |- +

    The bolas is a traditional throwing weapon used largely by indigenous peoples. It consists of two or more weighted balls connected by a length of cord. When thrown, the weights spread out and the cords wrap around the target, entangling the limbs to incapacitate them. The bola is usually used for hunting, efficiently capturing prey such as birds and small game without causing significant injury, thus preserving the meat and hide.

    +

    In tactical or combat situations, the bola can be used to disable opponents by tangling their legs, causing them to trip and fall. This non-lethal approach can be particularly useful for capturing enemies or preventing their escape. The simplicity of the bola's design allows for easy construction from readily available materials, making it an accessible and effective tool for hunters and warriors alike. Its effectiveness relies heavily on the user's skill in accurately judging distance and timing the throw to ensure maximum entanglement.

    +

    For further information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: cP2IsborvdaO0J6q + name: Fléchette + type: Thrown + img: systems/sohl/assets/icons/dart.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: Flch + createdEventId: hymtUsemCaGtZkGG + description: |- + The flechette is a small, pointed throwing dart designed for precision and penetration. Characterized by its slender, aerodynamic shape, the flechette is crafted to maintain stability and speed while airborne. Unlike broader-bladed throwing knives, flechettes are often more akin to mini javelins or large darts, designed to be thrown in volleys to maximize their disruptive effect on the battlefield. Typically forged from iron or steel, flechettes maximize their piercing capability, making them effective against lightly armored targets or exposed flesh. + + In medieval combat, flechettes are used primarily by specialized troops or archers to harass and injure enemy soldiers before close-quarters engagement. When thrown, often in large numbers, these small projectiles can cause significant confusion and damage among enemy ranks, disrupting their formations and reducing their combat effectiveness. Flechettes are particularly useful in siege warfare and skirmishes where the ability to destabilize an opponent from a distance can provide a critical tactical advantage. Their lightweight and compact design also allow soldiers to carry multiple flechettes, enabling sustained use throughout the battle. + + For further information, you can visit: + - [History of Flechettes on HistoryNet](https://www.historynet.com/history-of-flechettes) + - [Overview of Medieval Weapons on Medieval Warfare](https://www.medievalwarfare.info/weapons.htm#throwingknives) + notes: "" + textReference: "" + macros: [] + flags: {} +- id: PvD8SLaG28Nude2X + name: Meteor Hammer + type: Special + img: systems/sohl/assets/icons/bolas.svg + durability: 0 + weight: 0 + value: 0 + heft: 0 + length: 0 + noblock: false + abbrev: "" + createdEventId: xqaAnJFwJjQOwa3j + description: |- +

    The meteor hammer is a long rope or chain with a heavy metal weight attached to the end. This flexible weapon is utilized by swinging it around the body to generate momentum, then releasing it to strike the opponent with significant force. The meteor hammer's weight and speed can deliver devastating blows capable of breaking bones and inflicting serious injuries. Its design also allows for wrapping around an opponent's limbs or weapon, entangling and disarming them in the process.

    +

    In combat, the meteor hammer is prized for its versatility and unpredictability. Skilled practitioners can use it to execute a wide range of offensive and defensive maneuvers, from rapid, successive strikes to complex entangling tactics. Its reach allows the wielder to maintain a safer distance from opponents while still delivering powerful attacks. However, it requires extensive training to master, as improper handling can endanger the user themselves. The meteor hammer is often employed in martial arts demonstrations and traditional Chinese combat techniques, showcasing both its lethal potential and the skill required to wield it effectively.

    +

    For further information, you can visit:

    + + notes: "" + textReference: "" + macros: [] + flags: {} +- id: 9fUBzprkjX25L734 + name: Knuckledusters + type: Special + img: systems/sohl/assets/icons/knuckledusters.svg + durability: 0 + weight: 0.5 + value: 30 + heft: 8 + length: 0 + noblock: false + abbrev: "kncldstr" + createdEventId: yNYwKbYyAJdgbSRt + description: |- +

    Knuckledusters, also known as iron fists, are small but potent melee weapons designed to fit over a character’s fingers, transforming their bare-handed strikes into devastating blows. Crafted from sturdy metals like iron, bronze, these weapons fit snugly around the knuckles, concentrating the force of a punch and turning a simple strike into an attack capable of dealing serious damage.

    +

    Knuckledusters are often used in close-quarters combat where swords or axes may be too unwieldy, making them ideal for brawlers, rogues, or warriors caught in tight spaces. Some versions may feature sharp studs or ridges to cause additional injury, perfect for characters looking to inflict extra pain on their foes. These weapons are easy to conceal, allowing players to surprise enemies with unexpected ferocity.

    + notes: "" + textReference: "" + macros: [] + flags: {} diff --git a/packs/generate/legendary/leg-possessions/data/weapons-strike-modes.yaml b/packs/generate/legendary/leg-possessions/data/weapons-strike-modes.yaml new file mode 100644 index 0000000..6d3187d --- /dev/null +++ b/packs/generate/legendary/leg-possessions/data/weapons-strike-modes.yaml @@ -0,0 +1,9898 @@ +- weaponId: lU0DRdXtAk6K7BUt + strikeModeNum: 1 + name: Ball & Chain Flail + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 5 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: -10 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: JNJ8GvVbCbEQ62sl + smId: hJc8S26awwY0ahZj + createdEventId: wkuOO8XwV1wwc1IN + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: lU0DRdXtAk6K7BUt + strikeModeNum: 2 + name: Ball & Chain Flail + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: -10 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: k3gBd6i6yGyKaACa + smId: 90AJnxcL6V6OMDR8 + createdEventId: bk27jpKirSnkXYLP + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uKACEmvIkemys7f9 + strikeModeNum: 1 + name: Bastard Sword + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 10 + modifier: 4 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: -1 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: xhW752uL4ESu70He + smId: qr5QvYXGvesWnvXv + createdEventId: hW9YZdV4ARlWXL6e + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uKACEmvIkemys7f9 + strikeModeNum: 2 + name: Bastard Sword + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 2 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: -1 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: xLJxrE7xs2TNsnw0 + smId: uVG6kd9FreRcsmQH + createdEventId: iXFMdGK1y6WFFiLt + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uKACEmvIkemys7f9 + strikeModeNum: 3 + name: Bastard Sword + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 9WlH2UfA7JY9KWOC + smId: Lk9LwdmoOE3E5vLY + createdEventId: yfHk2CifxuL41lIA + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uKACEmvIkemys7f9 + strikeModeNum: 4 + name: Bastard Sword + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 2 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: fSBLxOhCbqhhdPny + smId: tzx6aXvHt9s09mMD + createdEventId: RqbebHju5gmk88Vk + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PeH3MPvcfb0Z0eS7 + strikeModeNum: 1 + name: Battleaxe + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 7 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 93qxKYyj9TIjtpbP + smId: tRYW4xX1WhlYdGwU + createdEventId: FAqyS59oTIgntgSs + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PeH3MPvcfb0Z0eS7 + strikeModeNum: 2 + name: Battleaxe + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: TNRKCjYdcRKKmGX8 + smId: 5PxJcHXWhf9JjqP7 + createdEventId: Iw2Mb1ywHLolWtrU + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: JTvhpBBj87XuIMXi + strikeModeNum: 1 + name: Battlesword + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 10 + modifier: 5 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ZhesUHi6z0FYKK0K + smId: pmXanUiJdnXzc6u5 + createdEventId: Y5dIhkdi4EpWwG3g + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: JTvhpBBj87XuIMXi + strikeModeNum: 2 + name: Battlesword + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 2 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: jJqKb1zblDpQPLmu + smId: 0Gw7IkRBNNnpWTCe + createdEventId: egwoJRVgZS3cDLSN + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: JTvhpBBj87XuIMXi + strikeModeNum: 3 + name: Battlesword + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: uTzdWwPCAx54zgkj + smId: VXl54ENpB4wVjy41 + createdEventId: DmNUstm5NuskAySC + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: JTvhpBBj87XuIMXi + strikeModeNum: 4 + name: Battlesword + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 2 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 3bEOEqz2V2VnE2WC + smId: O90sxwC0yJpAthhy + createdEventId: qEqvlSKAFqerevlk + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: QRiORm95BTr4XREA + strikeModeNum: 1 + name: Blowgun + subDesc: Ranged + assocSkill: Blowgun + draw: 0 + baseRange: 40 + zoneDie: 0 + die: 4 + modifier: 0 + aspect: piercing + projtype: dart + maxVM: 3 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: lNKC18ecQplVa3KC + smId: i0JYjC0zrqNjquIX + createdEventId: sarrMdrqjoMfgjFy + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: pX3qKPrPcgPMjsX5 + strikeModeNum: 1 + name: Boomerang + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: UhzMVARIzfXvGsas + smId: NeZCMLoSsejLk7II + createdEventId: RBe70F8G5lm43F2X + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: pX3qKPrPcgPMjsX5 + strikeModeNum: 2 + name: Boomerang + subDesc: Ranged + assocSkill: Boomerang + draw: 0 + baseRange: 240 + zoneDie: 0 + die: 6 + modifier: 3 + aspect: edged + projtype: none + maxVM: 3 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 6Y9LWYOYHglFIn4J + smId: A4s0zsOsCdHrQA7E + createdEventId: fJOuHpwiTvvm9JkU + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: wjTLAt0dcAyim60L + strikeModeNum: 1 + name: Broadsword + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 10 + modifier: 3 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: C0EVykhYEfy1RRC3 + smId: hFyrrqlwVjfHA1Ji + createdEventId: Hr3610PQoI3R0joF + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: wjTLAt0dcAyim60L + strikeModeNum: 2 + name: Broadsword + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 1 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: qeB15WHn3LD5WKl1 + smId: kHfEo2Ew2s1c7Dhy + createdEventId: Ol2qISm08bJ7pyJJ + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: wjTLAt0dcAyim60L + strikeModeNum: 3 + name: Broadsword + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: kGs7u1uH1kb3PKsm + smId: pnw3OgT6Er72uYZr + createdEventId: EdTJMNU2R3bpC1F8 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: wjTLAt0dcAyim60L + strikeModeNum: 4 + name: Broadsword + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 1 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: LlE0613WzWsFNIU3 + smId: F95rKQBqJYNF6Fnk + createdEventId: eR5UrWB4hr26TuIO + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: keOzxtWCsMbPxhuV + strikeModeNum: 1 + name: Buckler + subDesc: Bash + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 1 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 5 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: IqWi6W6RITBcPEJb + smId: 5fmqo5l04oywTVo3 + createdEventId: YW234EqZkc3gzpEz + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 2F1GQNY7FtnuzueG + strikeModeNum: 1 + name: Chakram + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 2 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: bDQA6obKm7oG06d5 + smId: fiwYZ9MpM3xqqO5W + createdEventId: gD9XCPj8Ba77gpCp + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 2F1GQNY7FtnuzueG + strikeModeNum: 2 + name: Chakram + subDesc: Thrown + assocSkill: Throwing + draw: 0 + baseRange: 80 + zoneDie: 4 + die: 8 + modifier: 2 + aspect: edged + projtype: none + maxVM: 2 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: pDKtQPDuh7k5QK3V + smId: uC1p2NEfo5Hgb1pO + createdEventId: mUk54gFVKBygsqgc + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: CsKoW7OcMvIoyZN5 + strikeModeNum: 1 + name: Club + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 7MlLKTaz57A9LyQc + smId: UIVTxC5hkNhdIq5x + createdEventId: LN2RBVpwV8aclexX + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: CsKoW7OcMvIoyZN5 + strikeModeNum: 2 + name: Club + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: V4LKqxNaM1T0LVIC + smId: 5NimvwOjxbwUFGzV + createdEventId: mnUceAJ7hVhYdvVG + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: C4KPc3hjFv6KfIbP + strikeModeNum: 1 + name: Club, Improvised + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: Qzpgx1ISGwlnH7N0 + smId: 1UxYo2F3hnFU8vn1 + createdEventId: pDPCg9yZ4NZfwrnS + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: C4KPc3hjFv6KfIbP + strikeModeNum: 2 + name: Club, Improvised + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: Yx9Q1wbNq3ZLdCgA + smId: HKpAXbDdtqQFesIb + createdEventId: fRiVCLyy3Y5clFpR + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 5MB9HLkTUNScCTDW + strikeModeNum: 1 + name: Club, Large + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 2 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 5pgcjPIBB8n1MYz2 + smId: HNcQ9aJ8uouDgjf3 + createdEventId: 0tDkfwB0abdOYcZV + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 5MB9HLkTUNScCTDW + strikeModeNum: 2 + name: Club, Large + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 1bR7F2vOlNiokCVa + smId: 5d1cCJalUq3JsAA6 + createdEventId: EJmE25all35QRSJS + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: SKuhS0wEblXOmOlt + strikeModeNum: 1 + name: Composite Bow 100 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: CP46Dd4Tc9xGGaIc + smId: x8AgDyUNUSXvTm7Z + createdEventId: pAmVrr6We9ktO3vc + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: SKuhS0wEblXOmOlt + strikeModeNum: 2 + name: Composite Bow 100 + subDesc: Ranged + assocSkill: Archery + draw: 100 + baseRange: 240 + zoneDie: 0 + die: 0 + modifier: 4 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: UKsRx4WLE1wt9MK4 + smId: 7AHmU5jU0rqFwkk2 + createdEventId: xPQ6cMOC5RHB2LVC + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: eVIPrpvF4wOv9asM + strikeModeNum: 1 + name: Composite Bow 120 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: 8kTjwuo28K9oWLSn + smId: 2zspvratTNwpLeAR + createdEventId: Lzb1q74Rm4cM0Vrp + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: eVIPrpvF4wOv9asM + strikeModeNum: 2 + name: Composite Bow 120 + subDesc: Ranged + assocSkill: Archery + draw: 120 + baseRange: 270 + zoneDie: 0 + die: 0 + modifier: 5 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: H5CSjXkVUxZwvR33 + smId: M5YunkaLM723Uq4O + createdEventId: GgbpP9TIfbJd57oH + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: y8trdeWcTIxJch7W + strikeModeNum: 1 + name: Composite Bow 140 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: QzuHLJpXpWWG862M + smId: UIK2nAR0QeqGAwaB + createdEventId: ZyzjIYIepPIpWULA + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: y8trdeWcTIxJch7W + strikeModeNum: 2 + name: Composite Bow 140 + subDesc: Ranged + assocSkill: Archery + draw: 140 + baseRange: 300 + zoneDie: 0 + die: 0 + modifier: 6 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: PUMiEpdkPplvB3oO + smId: gNkhXLgcLtzQ9RYU + createdEventId: U2CfDgpZa7hz4ocx + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 1XHE433lMCMaDjvu + strikeModeNum: 1 + name: Composite Bow 40 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: IclPQ7IiBhqPSIrM + smId: 9amCZFCBR2QeSzZ2 + createdEventId: mx8pyF9qTqNH8doE + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 1XHE433lMCMaDjvu + strikeModeNum: 2 + name: Composite Bow 40 + subDesc: Ranged + assocSkill: Archery + draw: 40 + baseRange: 150 + zoneDie: 0 + die: 0 + modifier: 1 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: fM0M7PYjXZdVop5X + smId: AF1ni0z7XR640Jki + createdEventId: A9t3zUamYI1enhpX + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: wqQirtSicsibG8ip + strikeModeNum: 1 + name: Composite Bow 60 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: dkWJ9b8blFBiUdM0 + smId: FB9xcvu05YEjpH8p + createdEventId: BNDeWHgUaYiTKdEj + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: wqQirtSicsibG8ip + strikeModeNum: 2 + name: Composite Bow 60 + subDesc: Ranged + assocSkill: Archery + draw: 60 + baseRange: 180 + zoneDie: 0 + die: 0 + modifier: 2 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: asvLHrbc7C75UFFB + smId: R5Y1DwlVXrRK0qdW + createdEventId: fHqKNtwq3OdheTaz + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: qkDtym8AHiF4DrMt + strikeModeNum: 1 + name: Composite Bow 80 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: 6xEVjn1fhKixng0c + smId: MRFav4zEwfajcZIg + createdEventId: NdKfFt755zFrsd7P + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: qkDtym8AHiF4DrMt + strikeModeNum: 2 + name: Composite Bow 80 + subDesc: Ranged + assocSkill: Archery + draw: 80 + baseRange: 210 + zoneDie: 0 + die: 0 + modifier: 3 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: znOv8oBlNF66JZbS + smId: uU7xl0X4FnSgXYA3 + createdEventId: pM4oxaDDvxjeQk1k + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: OxkcJeJalqCCxNI7 + strikeModeNum: 1 + name: Composite Crossbow 200 + subDesc: Ranged + assocSkill: Archery + draw: 200 + baseRange: 270 + zoneDie: 0 + die: 0 + modifier: 4 + aspect: piercing + projtype: bolt + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: CLz2QMJeSTWznZ6l + smId: q295NIe1BT8v4mr5 + createdEventId: CdEqqAB5GiFqfAbx + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: TcKGyr36ZsQg10xl + strikeModeNum: 1 + name: Composite Crossbow 300 + subDesc: Ranged + assocSkill: Archery + draw: 300 + baseRange: 300 + zoneDie: 0 + die: 0 + modifier: 6 + aspect: piercing + projtype: bolt + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: eOJYINXh1Wl4R9Bs + smId: bwmYWu7jkKhJC6uX + createdEventId: AefwgFXus5KuLUNd + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 14K5PZes1RJUsm7H + strikeModeNum: 1 + name: Crowbar + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 3 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: PKUcLXtVxyqYZvzN + smId: V7qkxgrdYgzcVcKP + createdEventId: esvEtLXRZk2f653A + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 14K5PZes1RJUsm7H + strikeModeNum: 2 + name: Crowbar + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: lnvO6kO9FAaVN08b + smId: M1KsZMXWdg07XP4O + createdEventId: bUdmcWQBygKJEYaN + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: HSggjzbSPU2MvMvG + strikeModeNum: 1 + name: Cudgel + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: V2kQ6xtD3eSkdq2w + smId: eQTGAXqMTpDQqaj4 + createdEventId: 27fhnreTRrUJNBBO + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: HSggjzbSPU2MvMvG + strikeModeNum: 2 + name: Cudgel + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 7nYEFSvoH1uAPg1C + smId: 2qoJQywyOcHUZcia + createdEventId: YW5vFoztk88tGbnX + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 9ijT9drcTK805O5F + strikeModeNum: 1 + name: Dagger + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 2 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ztnzpqYPv62ih6hY + smId: D1K2tze7iNK1plqh + createdEventId: np2MyTkRBNMbgMBj + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 9ijT9drcTK805O5F + strikeModeNum: 2 + name: Dagger + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 10 + modifier: 1 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: BXDhjA70TRFAJMWC + smId: B0FtAea9Dop60ajy + createdEventId: 3NT6hKQ08Db4IBa8 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 9ijT9drcTK805O5F + strikeModeNum: 3 + name: Dagger + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: MgdVLXEemfrSq1BN + smId: 6nxQJIEFijtyiYN7 + createdEventId: 5dQFTqEtuekUTOBP + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: J0H2XxUf1n4RtHRh + strikeModeNum: 1 + name: Estoc + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: sLS9pYXN022wSlcY + smId: mEAP33jTw6PF580O + createdEventId: EMVIQkCEv1tOwIrQ + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: J0H2XxUf1n4RtHRh + strikeModeNum: 2 + name: Estoc + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: k19Fd6mkJzMAUcON + smId: D4Cs7O4XluEmMrTw + createdEventId: vO7KiZZDh6Yvz186 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: J0H2XxUf1n4RtHRh + strikeModeNum: 3 + name: Estoc + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 3A88odO6CeVdQIba + smId: abEH6gwBdR8ssjwp + createdEventId: Ap1gZoqa26zHZpov + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ff5sR8h7GpNK89G5 + strikeModeNum: 1 + name: Falcastra + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 4 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: mdIvArGuF2iKKl7i + smId: kLafeHx1MS05PUDa + createdEventId: e7wGX0A88UadQBrL + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ff5sR8h7GpNK89G5 + strikeModeNum: 2 + name: Falcastra + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: XCQpHE0zFdIBsOKa + smId: w9ILwSMYzvZ5OnIw + createdEventId: 9d6tR09bkd6CpHR9 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ff5sR8h7GpNK89G5 + strikeModeNum: 3 + name: Falcastra + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: fVR3WrxHMdKhlSqG + smId: 1kiERlazXpB6zFfN + createdEventId: DSIrsEnd9JHSZTzG + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ff5sR8h7GpNK89G5 + strikeModeNum: 4 + name: Falcastra + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 4 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: TMt6jBklsdHJOZEs + smId: t9isqgveMcVWR578 + createdEventId: 2H6G7SzZUueahs68 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: YYQ9TSVo6RSRkyub + strikeModeNum: 1 + name: Falchion + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 4 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: S3HO9MzOMej8RZri + smId: mvpMgpMtDI9OPjp2 + createdEventId: LAmk5TnCJrWVd4QB + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: YYQ9TSVo6RSRkyub + strikeModeNum: 2 + name: Falchion + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 1ZJK1XaTqNKjgwUo + smId: 452JJ0wZQzBLzD0m + createdEventId: ecfjvcV6tkBgkY16 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: xqWeqWccSXOa9bDD + strikeModeNum: 1 + name: Glaive + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 10 + modifier: 4 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: dFoV5To8v6UH0aES + smId: IzhkQ7DH989b0NhH + createdEventId: 0DAYdfhgudpYwI4V + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: xqWeqWccSXOa9bDD + strikeModeNum: 2 + name: Glaive + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: zX6W5ancoM64z3yX + smId: 0Jm2Hvh0x7OGWRu7 + createdEventId: lkwuivhzk20hVlnM + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: xqWeqWccSXOa9bDD + strikeModeNum: 3 + name: Glaive + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: w4eUHi27J63P5LBP + smId: NIYzvjCYFPa8copH + createdEventId: 7tonAXrevDcKQmoV + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: xqWeqWccSXOa9bDD + strikeModeNum: 4 + name: Glaive + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: Dx4sSLybOgAGo0fm + smId: 1TMK2QMfExu1BW5d + createdEventId: 3z3g7cGiXI8exyOO + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: xqWeqWccSXOa9bDD + strikeModeNum: 5 + name: Glaive + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: Dvirx5ko8aT4kUBH + smId: CS8NPOE2vMnMKCnT + createdEventId: 80f2fA2nwx2XRyOh + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PZ928gsyeidvMtuo + strikeModeNum: 1 + name: Grainflail + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 2 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: aVhULSzZ5aNW95zT + smId: KGgUmYROhKEAIN4T + createdEventId: fuRmIoABGDPizPws + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PZ928gsyeidvMtuo + strikeModeNum: 2 + name: Grainflail + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: u1k8WtBiCxZmO6Am + smId: q2wPStzSMSrhXjP2 + createdEventId: XRKI18T50pC7Wetj + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: RtCK7eRRsiCFr7Qi + strikeModeNum: 1 + name: Handaxe + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 5 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 8vSU71hal04Gpz6v + smId: FsFFASOZCVDpw6fb + createdEventId: u6wIf6iVNueeNbJY + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: RtCK7eRRsiCFr7Qi + strikeModeNum: 2 + name: Handaxe + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 9rPwBIEa5wGZiKjm + smId: 6oFzOs8z0Ej96l3a + createdEventId: 4nlP1PPBUll5r5yz + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ZiZtg2TWwtkDoeHJ + strikeModeNum: 1 + name: Hatchet + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 4 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: aKgeU7j4ftuMik3r + smId: Rtq4CzXGVzcKrlYt + createdEventId: bWiYIAgpO1dhL7nc + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ZiZtg2TWwtkDoeHJ + strikeModeNum: 2 + name: Hatchet + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: TOI98GcrzpJF2f06 + smId: xsu6rCHTBWmOyLKF + createdEventId: nQ70cqL7VtKOD8pm + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: bSh8evwiMWMAqaqn + strikeModeNum: 1 + name: Javelin, Barbed + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 4 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: true + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: CqUeJ2p4gAO7DLp5 + smId: 5o2x9ud3ZnQ3hJQM + createdEventId: xIJXsxuKXPdMy190 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: bSh8evwiMWMAqaqn + strikeModeNum: 2 + name: Javelin, Barbed + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ZfQ6SAxqdoHvvhT2 + smId: IaaSAdUroheUCCGD + createdEventId: zKjVPNu0l7XtzxGS + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: bSh8evwiMWMAqaqn + strikeModeNum: 3 + name: Javelin, Barbed + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 4J1JxjGeVn8d2qAJ + smId: ZuVhTtxdWFAXBiq0 + createdEventId: Al4gfMHQ7trjQBwS + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: bSh8evwiMWMAqaqn + strikeModeNum: 4 + name: Javelin, Barbed + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 4 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: true + bleed: true + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: AZUZZlmd8A0Rju2M + smId: wzFfyTXduRfTD8jJ + createdEventId: Gb8Jcu7OQ7LpYbu2 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: bSh8evwiMWMAqaqn + strikeModeNum: 5 + name: Javelin, Barbed + subDesc: Thrown + assocSkill: Throwing + draw: 0 + baseRange: 60 + zoneDie: 4 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 2 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: true + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: o3c2OAYUSPMzJjPe + smId: EKx9V0hT5I5aJ89T + createdEventId: jbauO6PJTQhNftnt + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: r43xJwDBphGaIcDe + strikeModeNum: 1 + name: Javelin, Bodkin + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: SUFbVFA8deZGOW5J + smId: 7lsD5sJHjWeltCFR + createdEventId: 4M8O140HCYm8Afbo + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: r43xJwDBphGaIcDe + strikeModeNum: 2 + name: Javelin, Bodkin + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: myau7C3TXYRH2iRQ + smId: Y3qhVM5LKqkW08lt + createdEventId: oGETY0zy8MOA9PEE + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: r43xJwDBphGaIcDe + strikeModeNum: 3 + name: Javelin, Bodkin + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ebjbPBOpmrVkyVgg + smId: seNhzJYTUfVinv0m + createdEventId: Rjds9S1vXg9PZxIY + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: r43xJwDBphGaIcDe + strikeModeNum: 4 + name: Javelin, Bodkin + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 0uZjFkTpxHyESjIZ + smId: zUYxvkEQT3hWrDEV + createdEventId: GbTXMRfBE5auvmp8 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: r43xJwDBphGaIcDe + strikeModeNum: 5 + name: Javelin, Bodkin + subDesc: Thrown + assocSkill: Throwing + draw: 0 + baseRange: 60 + zoneDie: 4 + die: 8 + modifier: 2 + aspect: piercing + projtype: "" + maxVM: 2 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: agEk0NOqf76lm1WT + smId: VMUXT55xPO6CaufP + createdEventId: OjpJuW5ggZ10eZJ8 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ZpTxK5WRmlI6Jc3C + strikeModeNum: 1 + name: Jousting Pole + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 2 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ciJkzooCAufdfbDc + smId: FQsiskvJeuFTrlrg + createdEventId: bD0vc0RoAG1E6d1N + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ZpTxK5WRmlI6Jc3C + strikeModeNum: 2 + name: Jousting Pole + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: u7qhmGDTI7zUqDY2 + smId: HPwyMFTjqSMGVegH + createdEventId: 1HGiempTHSoQ5a4p + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ZpTxK5WRmlI6Jc3C + strikeModeNum: 3 + name: Jousting Pole + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ZyTYPAQg6uj8zZrg + smId: xKiyj0LqUajQiYWm + createdEventId: LiYAPX6zgy0oxub3 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: po0MtDrMbBIcNdyH + strikeModeNum: 1 + name: Kéltan + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 1 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: AekIogGGoYjLJWPx + smId: sw0M5zlbmbsQv5cV + createdEventId: Ee5jYOOCeTMtqNpE + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: po0MtDrMbBIcNdyH + strikeModeNum: 2 + name: Kéltan + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 10 + modifier: 0 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: VXdQLSyJCnfk74aY + smId: xUupSVxKZ3NMmdMP + createdEventId: eL7Zt2XEK5CPx8E3 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: po0MtDrMbBIcNdyH + strikeModeNum: 3 + name: Kéltan + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 0MaDZlmWtOmQe9DE + smId: V98MpGGnjZdKOLCI + createdEventId: qMEQPW9mfD5XxIpG + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: vpPLk8Ou4UsXQdTy + strikeModeNum: 1 + name: Kite Shield + subDesc: Bash + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 4 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 15 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: V3YId7ZRON5f97GB + smId: 1hSiWUTqgEc3A6FF + createdEventId: MGkyQAOA73V7L4Mn + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ZLDPpPDbHPfTLE2Y + strikeModeNum: 1 + name: Knife + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 2 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: VKTHyXEuQxR5xTTN + smId: UGYCgf7FDaxEYZUv + createdEventId: BUU8U3BjbYbMn1w2 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ZLDPpPDbHPfTLE2Y + strikeModeNum: 2 + name: Knife + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 10 + modifier: 0 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: jfgZB5GDPzRCkdG1 + smId: uf6304TBOkTIp4C0 + createdEventId: c501t7qz0tDVRgRZ + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: ZLDPpPDbHPfTLE2Y + strikeModeNum: 3 + name: Knife + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: GYtvx2bcOcByvajT + smId: nTVPGaR27gMFQdev + createdEventId: bK86gpzDWb9hTynY + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: nbt1PW1YgQTNvm8n + strikeModeNum: 1 + name: Knight's Shield + subDesc: Bash + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 3 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 10 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: WPvW8YYc9B5vCI7b + smId: mnc1WcLvDnm86z1F + createdEventId: Xd1HRVRC8JqehBPP + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: o9uvddcjqpyIAFdW + strikeModeNum: 1 + name: Kúzan Steelbow + subDesc: Ranged + assocSkill: Archery + draw: 500 + baseRange: 360 + zoneDie: 0 + die: 4 + modifier: 10 + aspect: piercing + projtype: bolt + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 8YjIpxIraObAVML5 + smId: D06WGhYskYkucpBp + createdEventId: C2h9mjM9kVjBzmYr + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: DyI7VXcT6l3URR02 + strikeModeNum: 1 + name: Lance + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 6 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: UcRjTwLlLls0tcJ4 + smId: Opp6xTNRgoxvcfBZ + createdEventId: XNVTruoS7r6d33f4 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: DyI7VXcT6l3URR02 + strikeModeNum: 2 + name: Lance + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: U7zh0SHhirpXjIrN + smId: 44L6j7I5vdyJJMPJ + createdEventId: l6MpJXWtibGVymNO + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: DyI7VXcT6l3URR02 + strikeModeNum: 3 + name: Lance + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 47Ot4XeYSMObFzow + smId: 7d6djvOntdJ3uczU + createdEventId: 37g4bMAVco1J0SMR + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: DyI7VXcT6l3URR02 + strikeModeNum: 4 + name: Lance + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 6 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: S1obFkuc63vSoxVG + smId: qzpANI9I2a1wiqzi + createdEventId: mDBRvxg9drwmkAas + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: DaJiW4RWuvOYLB9T + strikeModeNum: 1 + name: Longbow 100 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: Bv3Qk3kVShdWOXDp + smId: oe2oX576wwOXKq1h + createdEventId: 6j86DJLRXaSWDAcV + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: DaJiW4RWuvOYLB9T + strikeModeNum: 2 + name: Longbow 100 + subDesc: Ranged + assocSkill: Archery + draw: 100 + baseRange: 210 + zoneDie: 0 + die: 0 + modifier: 3 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: kU2GBRq1lWm0eqUz + smId: B7wGpA01vYRNyMg0 + createdEventId: gO5ur3EPC4Cq8fbB + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 2D8bccD7IaGE81m7 + strikeModeNum: 1 + name: Longbow 125 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: 6pdGtTmWlu7ZOoqP + smId: YitUujw2BKVnvTz7 + createdEventId: b0Y2fpfNrqJq6QrO + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 2D8bccD7IaGE81m7 + strikeModeNum: 2 + name: Longbow 125 + subDesc: Ranged + assocSkill: Archery + draw: 125 + baseRange: 240 + zoneDie: 0 + die: 0 + modifier: 4 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: BdC1bJxwss7OCkoB + smId: cNPvxxTNvWBJGGs8 + createdEventId: 795WGdaP7SfK1VpO + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Po5sBJKLMr2pgC0N + strikeModeNum: 1 + name: Longbow 150 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: DsN3iV3xLAtPGMGN + smId: NNyROGHWgDovZMLT + createdEventId: dUJTs1qFUGH1yxEv + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Po5sBJKLMr2pgC0N + strikeModeNum: 2 + name: Longbow 150 + subDesc: Ranged + assocSkill: Archery + draw: 150 + baseRange: 270 + zoneDie: 0 + die: 0 + modifier: 5 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: jHPep1nTYs1raUYx + smId: jEVhRI3SBV4CxGNM + createdEventId: nX8CRrcTdzUW7a9b + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 4Y0zPMrFAwBMsgPt + strikeModeNum: 1 + name: Longbow 175 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: DFJlTO6RR3sCcUfm + smId: leobfLY4EKKqg5CN + createdEventId: a1PMBR9VeBlV5Kav + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 4Y0zPMrFAwBMsgPt + strikeModeNum: 2 + name: Longbow 175 + subDesc: Ranged + assocSkill: Archery + draw: 175 + baseRange: 300 + zoneDie: 0 + die: 0 + modifier: 6 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: n7HeB9VqXgZG8Sl5 + smId: amKhC7BHVqzVnsVn + createdEventId: pAV56ZHpWPBa7di9 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 2ukbTddPtKvHuMjj + strikeModeNum: 1 + name: Longbow 50 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: jlukgee8kA2mUAYm + smId: QF6XixCUM5XN8J7H + createdEventId: Tf4VU0WU0iBIieI4 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 2ukbTddPtKvHuMjj + strikeModeNum: 2 + name: Longbow 50 + subDesc: Ranged + assocSkill: Archery + draw: 50 + baseRange: 150 + zoneDie: 0 + die: 0 + modifier: 1 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: zsIIGPwwv7UiNk9Z + smId: HdOmMH5OoQw3XBuP + createdEventId: odzUuBem2HmOJ93s + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: stIt7vogUhgZtDTE + strikeModeNum: 1 + name: Longbow 75 + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: -5 + AEID: YNQVbieE5tpa4F7i + smId: YGPTCP47nL2Tx2cd + createdEventId: 19GvTjxJPerGtYjS + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: stIt7vogUhgZtDTE + strikeModeNum: 2 + name: Longbow 75 + subDesc: Ranged + assocSkill: Archery + draw: 75 + baseRange: 180 + zoneDie: 0 + die: 0 + modifier: 2 + aspect: piercing + projtype: arrow + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: VpmjIxOuArfO6H5U + smId: 1sz1CAi6queJcSvT + createdEventId: 9HkJHDGCV7ThYQ4I + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: gdtGtzLTi8A8f6D1 + strikeModeNum: 1 + name: Longknife + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: HpRjHNVcJGVxNrAA + smId: p7F7ewKBmFWC3czu + createdEventId: Z8YU5zS74V8KrWau + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: gdtGtzLTi8A8f6D1 + strikeModeNum: 2 + name: Longknife + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 10 + modifier: 2 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: Kc2cMaRD4At7rDcm + smId: RW0RfFVK1dzPtUr5 + createdEventId: I1PweTiN7NXl91Mi + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: gdtGtzLTi8A8f6D1 + strikeModeNum: 3 + name: Longknife + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: jpB0HP9IOY7Jjnqv + smId: rqXYIW6jry0OhSwc + createdEventId: YBlV5TyMuz2PPbW3 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Ql08V4MDq3SgEWjH + strikeModeNum: 1 + name: Mace, Steel Handle + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 4 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 5LUTToefY1wwoJWQ + smId: mUfZu57PifFW6lkd + createdEventId: m2jsONBXeweIhq4A + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Ql08V4MDq3SgEWjH + strikeModeNum: 2 + name: Mace, Steel Handle + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: yBcphXRQ1evh8vDc + smId: 8gS1BCiZC8ulr7jt + createdEventId: Wdlqoe0FPObDCnlB + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: bm9SbGIuZs3AH5f4 + strikeModeNum: 1 + name: Mace, Wood Handle + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 3 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: EDwt1aopcEswE4Cd + smId: 89fSbCiujJyjCkmH + createdEventId: fj4TpdY3YcJ7u5ZX + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: bm9SbGIuZs3AH5f4 + strikeModeNum: 2 + name: Mace, Wood Handle + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: iFyYw87f2VstaBxL + smId: Xm7gWBrjO5XVTk4t + createdEventId: tAFu8LhWmOfYGR7O + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: tjOwyBFL3S3h7NHY + strikeModeNum: 1 + name: Máng + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 4 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: yAcPSvDl92x41Q9h + smId: jJd8kYl55xo6rV6H + createdEventId: DKkInFfoikMCMr7b + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: tjOwyBFL3S3h7NHY + strikeModeNum: 2 + name: Máng + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: PFx0UMlrfbGpZDuL + smId: h3k8wTqs8pJqsd1a + createdEventId: e0SIsxGPRxZRdUQh + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: EiVXkncfZSMlqEu8 + strikeModeNum: 1 + name: Mankar + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 3 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: Hlgl1ftXHpn3BtN1 + smId: gYSX7KtTMuOSlbro + createdEventId: MyC060EHKhAAV7CE + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: EiVXkncfZSMlqEu8 + strikeModeNum: 2 + name: Mankar + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: E6FFMxTLfmalJtfV + smId: ZXXq9eAUsCOE1PDo + createdEventId: 2mw0ikFZ2qU6yVVc + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: r9NZxajV7MkTZUxW + strikeModeNum: 1 + name: Maul + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 6 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 9V3SkXeP1MlOn8E0 + smId: n07YTijDVnJYxpWl + createdEventId: dZlZaFa7XUxgFgGR + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: r9NZxajV7MkTZUxW + strikeModeNum: 2 + name: Maul + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: NxPNFvzaNnTClRSn + smId: 5hNFa6e71yH9EQRj + createdEventId: smh6r5P1nmsfHOjH + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: c8FbFCrF09XPfy5w + strikeModeNum: 1 + name: Morningstar + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 4 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 1 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 49hZRMh7gtDJAs5m + smId: A0vV9UfeAI1erNHQ + createdEventId: N03BjUBe8s1dbFfi + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: c8FbFCrF09XPfy5w + strikeModeNum: 2 + name: Morningstar + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 1 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 7gY45DN4u24Aalpb + smId: rU3ZP8UmrRM2qB8j + createdEventId: ElO5VqnrIeLQ754r + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Df8gMsCyX334UUNT + strikeModeNum: 1 + name: Net + subDesc: Envelop + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 0 + die: 0 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: true + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: P7sMWXSTkiU6wzYp + smId: xPB3pCOBMozsuyrY + createdEventId: e3yeHoj1f9O7g8Pe + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Df8gMsCyX334UUNT + strikeModeNum: 2 + name: Net + subDesc: Thrown + assocSkill: Throwing + draw: 0 + baseRange: 10 + zoneDie: 8 + die: 0 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 2 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: true + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: JmZJtX0vdNXQnDUD + smId: tKlhgw2fTDcHXMNg + createdEventId: VEJILq84wTWM8EQL + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: iZCrSuwiRH2wjWgg + strikeModeNum: 1 + name: Pickaxe + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 5 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 3 + blockMod: -15 + counterMod: -15 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: Sjomtvm7ICfIaclq + smId: vm5XVXJaneS4IvDc + createdEventId: KMX2GEnJM4XkMAPg + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: iZCrSuwiRH2wjWgg + strikeModeNum: 2 + name: Pickaxe + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 3 + blockMod: -15 + counterMod: -15 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: pUYH13NUViVS7TM0 + smId: Nk2atxIFma2RKzln + createdEventId: 2GqtAvjZgcnimMIw + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: sZZxQiawzxKh52Ml + strikeModeNum: 1 + name: Pike + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 6 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: HOICl04mNXj9K47i + smId: QrfbmoFHRhYl48uX + createdEventId: Hg1swpwbdEkWjqJ9 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: sZZxQiawzxKh52Ml + strikeModeNum: 2 + name: Pike + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: zd9Apt0fuyMTDYuX + smId: 2E1FhauyeV8vOPW4 + createdEventId: fUYhlFdEoYY6c81O + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: sZZxQiawzxKh52Ml + strikeModeNum: 3 + name: Pike + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ipCq3MBNAxN6bANg + smId: hrpLY7nPGb6oAiyi + createdEventId: nuOkJiilVgTSUOwH + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: sZZxQiawzxKh52Ml + strikeModeNum: 4 + name: Pike + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 6 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: E5AdZCj4K6gWRt8W + smId: bS7aoOzpUWSBj4uY + createdEventId: BCfA19cw8UESSUGn + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uTBEpEn7heFX071U + strikeModeNum: 1 + name: Pitchfork + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: iKC9HBmdUQ0g81E9 + smId: 7DVx2yj2UtT27aw7 + createdEventId: ymHptdfRYqfs7mLn + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uTBEpEn7heFX071U + strikeModeNum: 2 + name: Pitchfork + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: jMzAkfIaJiXSu6mJ + smId: 5PEwkD6rqWKypAxT + createdEventId: bufmwaJVpPHMTPh3 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uTBEpEn7heFX071U + strikeModeNum: 3 + name: Pitchfork + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: yfjvkGhXlyMElTmZ + smId: XvZUQE1m4XtZqfhn + createdEventId: QzDUE5XKTLpgMfiU + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uTBEpEn7heFX071U + strikeModeNum: 4 + name: Pitchfork + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: o3wEY0adfWbBaJHW + smId: 7eGcON1KN964mEWS + createdEventId: k2Nh1aK9wedy58zs + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Gdm2jEz0I0iyzDpu + strikeModeNum: 1 + name: Poleaxe + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 7 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: VovLIpm1ndMzfJcf + smId: jo3LsNTrhQ3wV4cB + createdEventId: KuYtpVuk93bl0Zqn + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Gdm2jEz0I0iyzDpu + strikeModeNum: 2 + name: Poleaxe + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 4 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: mz8sHDlcWnkaIv9I + smId: IPIGH0uywj7ME8dQ + createdEventId: 1WcBwEWVUaC1poYf + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Gdm2jEz0I0iyzDpu + strikeModeNum: 3 + name: Poleaxe + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 5 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: BFoQicXnum6wMbcA + smId: g7JFivJtIN9A78bR + createdEventId: NA5pSPQ0j0mIpSdO + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Gdm2jEz0I0iyzDpu + strikeModeNum: 4 + name: Poleaxe + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: juu6y6MSFqvIqpll + smId: JPrLnFMqurvF8Dpk + createdEventId: 4Sti9Zj42CDEZrTA + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Gdm2jEz0I0iyzDpu + strikeModeNum: 5 + name: Poleaxe + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ZiDrXLdPmhP8MScV + smId: h7TPbHa6N5BrXpsU + createdEventId: 2Lq54BwCqmzyfFoJ + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Gdm2jEz0I0iyzDpu + strikeModeNum: 6 + name: Poleaxe + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 4 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: btM8Y1E1wZQQ7CCn + smId: wlvxqwwvv8jqw3TX + createdEventId: coE3DpHHdME9gWzm + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 31mlq3ytO8jnkS3n + strikeModeNum: 1 + name: Roundshield + subDesc: Bash + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 3 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 10 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: P7fVl4CMvmqKObLJ + smId: aXoS3Mb9VJTEScNr + createdEventId: sQezmekkgo6EpRo8 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 6lTEELsRUiGbqSNw + strikeModeNum: 1 + name: Scimitar + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 10 + modifier: 2 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: RQgYC2wooIsHLCqN + smId: KHljkWv9U1RS9MGI + createdEventId: WYAsMp3B5vwiYeWR + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 6lTEELsRUiGbqSNw + strikeModeNum: 2 + name: Scimitar + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 1 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: jRoy6ZIjBYQ3sq4U + smId: dFP4i92Z8QlpEe86 + createdEventId: ZcmiTfGPzGdyPgYt + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 6lTEELsRUiGbqSNw + strikeModeNum: 3 + name: Scimitar + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 79VvRYNtaDx5D8Si + smId: CRvRfLHMLNQQuClY + createdEventId: W3EY0zhzOFcc0CzG + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 6lTEELsRUiGbqSNw + strikeModeNum: 4 + name: Scimitar + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 1 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 6c8PDNTL8SKD3zsF + smId: VPsxFjajKUkY2Am8 + createdEventId: 9KS1rMLVLqxi235h + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: rnhIdHoRpWS9hipo + strikeModeNum: 1 + name: Shorkana + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 4 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: AD7n0s6JK6XYHJ57 + smId: PjL7rz2orCKPZOp3 + createdEventId: KINXNHBYLilFCXc6 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: rnhIdHoRpWS9hipo + strikeModeNum: 2 + name: Shorkana + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: Q24khgrBz1kSyBMO + smId: DbIz02V7vhonpeH2 + createdEventId: TWvDoWoL8HUNMPO2 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: rnhIdHoRpWS9hipo + strikeModeNum: 3 + name: Shorkana + subDesc: Thrown + assocSkill: Throwing + draw: 0 + baseRange: 40 + zoneDie: 4 + die: 8 + modifier: 4 + aspect: edged + projtype: "" + maxVM: 2 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: vpIxkI07dHXCZLlB + smId: Q5KEFPJbWO9Ayq51 + createdEventId: UAJCXEB4dwJgdEnm + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: N4Q0mUchOQ9OPB9Z + strikeModeNum: 1 + name: Shortsword + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 10 + modifier: 2 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: poMFO27Ww04Wi4go + smId: 9NlNQAd6BtchUha7 + createdEventId: eGYOseodishsFLQU + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: N4Q0mUchOQ9OPB9Z + strikeModeNum: 2 + name: Shortsword + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 1 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 81OU3YtdlLGekaYZ + smId: MOUpCK1MkZlUEPug + createdEventId: K8tLPjDB60GIesP5 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: N4Q0mUchOQ9OPB9Z + strikeModeNum: 3 + name: Shortsword + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: U37ZIKJrzU3esD85 + smId: 4mqdXGK0tJ5kSdIh + createdEventId: hPqUImDghH59XHai + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: N4Q0mUchOQ9OPB9Z + strikeModeNum: 4 + name: Shortsword + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 1 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: tmpwUo6YFMq86yqU + smId: wxAzCxvO6ok2a2A9 + createdEventId: XImy0r8W7AcnGym2 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 03itZtd4heviT9Qv + strikeModeNum: 1 + name: Shuriken + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 2 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 8TQKxopOVqaErspz + smId: Zhu33GLvyQJRtMcv + createdEventId: kH48MhNnPjt6wnG7 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 03itZtd4heviT9Qv + strikeModeNum: 2 + name: Shuriken + subDesc: Thrown + assocSkill: Throwing + draw: 0 + baseRange: 25 + zoneDie: 4 + die: 6 + modifier: 2 + aspect: edged + projtype: none + maxVM: 2 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: hHhwEw3RDwjSP8az + smId: 7bHNB3j3ycF37yHl + createdEventId: csLund5FGjCbXLFX + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 151T3dMzXMoMtwZc + strikeModeNum: 1 + name: Sickle + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 10 + modifier: 2 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 5 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: w01od1sO9lBvLYQz + smId: yKKLmsaOgYiBxdab + createdEventId: 6xbm75xepiRwwGtx + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 151T3dMzXMoMtwZc + strikeModeNum: 2 + name: Sickle + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -5 + counterMod: -5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: xvfrhHn3ZsaVhlMo + smId: tY8nMkkZNlbVnzo8 + createdEventId: gReylnG452gEzKOC + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: SEpQZB9ufqHIt0IJ + strikeModeNum: 1 + name: Sledgehammer + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 5 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: fhmEcAMKRJhWAi8F + smId: gROH6wg1ZCqHNO4r + createdEventId: DIGzCyMOMdhr3UHv + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: SEpQZB9ufqHIt0IJ + strikeModeNum: 2 + name: Sledgehammer + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: w0bAMKHItOqchkUb + smId: oZ8HSFf0pVL3Uc3w + createdEventId: sKm4IEppfRXbL5Ya + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: tzNkaxyefuOoAjoy + strikeModeNum: 1 + name: Sling + subDesc: Ranged + assocSkill: Sling + draw: 0 + baseRange: 180 + zoneDie: 0 + die: 10 + modifier: 0 + aspect: blunt + projtype: bullet + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: jA83Y7JLVso3Pd92 + smId: WqgnGNiqdrIGkWTG + createdEventId: 59r3nV6ydr5JthY8 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uawJUZQxVDGe7Lzo + strikeModeNum: 1 + name: Sling Staff + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: qoWG4tg1NTGD1Wxm + smId: Iy57pcCJES6jykCL + createdEventId: 16KkFkKc6z69MCFr + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: uawJUZQxVDGe7Lzo + strikeModeNum: 2 + name: Sling Staff + subDesc: Ranged + assocSkill: Sling + draw: 0 + baseRange: 240 + zoneDie: 0 + die: 10 + modifier: 0 + aspect: blunt + projtype: bullet + maxVM: 3 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 4UfUgO2gJ2dTGcDx + smId: NpB4Rzgt9WooK3kg + createdEventId: QXlsiMxfF227YGNT + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Jklt5Jr7EF4036th + strikeModeNum: 1 + name: Slingshot + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 4 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: XytKeS8DfIJ8aqOl + smId: pA63bYCjz2kWcU9b + createdEventId: sV3KAGqtUsDdJuGi + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Jklt5Jr7EF4036th + strikeModeNum: 2 + name: Slingshot + subDesc: Ranged + assocSkill: Archery + draw: 60 + baseRange: 120 + zoneDie: 0 + die: 6 + modifier: 0 + aspect: blunt + projtype: bullet + maxVM: 3 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: cTsrvaouKooqCxHq + smId: sBp6rf0tbzgycU9z + createdEventId: xH79aspCSzmdxjeB + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: UwGWi1DMuYtyN8X8 + strikeModeNum: 1 + name: Spear + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 5 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: W5lzmNSmzylxqeaG + smId: sqV2zh9H2DGaLP0o + createdEventId: W5aOVDbsnvb2TWho + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: UwGWi1DMuYtyN8X8 + strikeModeNum: 2 + name: Spear + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: t9k5WrOgKXSj1Fyk + smId: ORAEdrCamboFoaGi + createdEventId: OLl4BfJsLdINKEi6 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: UwGWi1DMuYtyN8X8 + strikeModeNum: 3 + name: Spear + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: YmGBaw5uu05gLtB8 + smId: ja82rixhoiFTRqTJ + createdEventId: BB0bG5YsKQKxwVDc + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: UwGWi1DMuYtyN8X8 + strikeModeNum: 4 + name: Spear + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 5 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: true + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: KWyf0BnfXn4ynnC7 + smId: UvS750IUolIJqFk9 + createdEventId: XUlsziTeVH5ENQCH + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: UwGWi1DMuYtyN8X8 + strikeModeNum: 5 + name: Spear + subDesc: Thrown + assocSkill: Throwing + draw: 0 + baseRange: 40 + zoneDie: 4 + die: 8 + modifier: 5 + aspect: piercing + projtype: "" + maxVM: 2 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: kwdVBs3T5ehZFdpY + smId: R803nZdDwzz2i7Zn + createdEventId: Djv6K7vptGFP2pZT + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: MHe30MVgUd2B7AXS + strikeModeNum: 1 + name: Staff + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 3 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: -1 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: QS2jZpQvHVm4edTR + smId: jWw9oGraqYYwdZOz + createdEventId: mwDskfmDIJXLjvJh + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: MHe30MVgUd2B7AXS + strikeModeNum: 2 + name: Staff + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 13eLz7S95RYMYUJ6 + smId: GmxhLs1EFGlzZg6H + createdEventId: 2u3dfsy6YzKrlD3h + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: MHe30MVgUd2B7AXS + strikeModeNum: 3 + name: Staff + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: shz8RgTQ5B7Nii09 + smId: 3wvWWmndeimjciMF + createdEventId: 2fKd0ASqgHvae1TP + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: qYFSh2Fr38UHKT5f + strikeModeNum: 1 + name: Stick + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: -10 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: lLelDOeVqhOhbQ11 + smId: SNyslmVBVqcdKbHi + createdEventId: aWzZlkK5M1YxR2oZ + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: qYFSh2Fr38UHKT5f + strikeModeNum: 2 + name: Stick + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: -10 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ZhJLIJxOIKpsIoxw + smId: 21yw4pUPFzEEm0nT + createdEventId: P4C1ZXpqGFOOcZzk + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 7IYD91ExpmoJb0nz + strikeModeNum: 1 + name: Tabûri + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 8 + modifier: 2 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: KX4UJgjLElu3V9ZL + smId: LR5WHGjfx2g1GIDb + createdEventId: 0EYOGL9gfhs9IbgS + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 7IYD91ExpmoJb0nz + strikeModeNum: 2 + name: Tabûri + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: yb09OJn7pBFkZ8AZ + smId: EsHiTF4J8CDvv4oh + createdEventId: bNDTytEEYOMR9jsz + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 7IYD91ExpmoJb0nz + strikeModeNum: 3 + name: Tabûri + subDesc: Thrown + assocSkill: Throwing + draw: 0 + baseRange: 30 + zoneDie: 4 + die: 8 + modifier: 2 + aspect: piercing + projtype: "" + maxVM: 2 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 328WjtTNAqC4sc86 + smId: 7XGPIvD6N2tustbE + createdEventId: hPIOwjYtMHlFXc9T + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: Qr2D5btkRJF3S8cs + strikeModeNum: 1 + name: Tower Shield + subDesc: Bash + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 5 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 20 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: jUBAg7pHz9JrRfSE + smId: 3FOeJClyuk49dghu + createdEventId: jbVEOzlt5pBGN7M2 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PoMZUG3IInE8wSqz + strikeModeNum: 1 + name: Trident + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 5 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: WX9dRaIt7KQXBKEN + smId: bq5rvE4WifBTl6Qd + createdEventId: rOmwPGx0yUzBGwC1 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PoMZUG3IInE8wSqz + strikeModeNum: 2 + name: Trident + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: xdomnPtrXfAiGkhi + smId: DCtZYRuro62BoviN + createdEventId: kuzHdzj3PePqKmv7 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PoMZUG3IInE8wSqz + strikeModeNum: 3 + name: Trident + subDesc: Half-Sword Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: false + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: tkT1G4iasxl59LxZ + smId: IyydsfSzdQsJclen + createdEventId: 8IA5xt86IqWB86UT + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PoMZUG3IInE8wSqz + strikeModeNum: 4 + name: Trident + subDesc: Half-Sword Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 8 + modifier: 5 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 5 + counterMod: 5 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: true + thrust: true + swung: false + halfSword: true + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: eUSDZjpslYyGLI0J + smId: YH717fdGU7riKHWW + createdEventId: DTwIAGIlJWnQEzyx + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: D4bOi6ZeH9IatTsy + strikeModeNum: 1 + name: Truncheon + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: kaMNYosBGeNvNLkw + smId: W0NdFKGF2xJHD5RC + createdEventId: RKbRrP0NEOjqlawW + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: D4bOi6ZeH9IatTsy + strikeModeNum: 2 + name: Truncheon + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: NVSs1oM4dSWPLczA + smId: zPIYipoQQ0IuJH3r + createdEventId: PtlJGPmVaG1piAQJ + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: yJgrGmh3iAdZFuvx + strikeModeNum: 1 + name: Warflail + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 6 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: hU3Zb7QLGpO4G919 + smId: CS9ncmglGVBfhAQd + createdEventId: usWfKLUsSBMugryt + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: yJgrGmh3iAdZFuvx + strikeModeNum: 2 + name: Warflail + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: enBPVTaYAQ199AFa + smId: MMnKAPfXN1OcQnGx + createdEventId: KvEllcSnUDrPLh0T + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 9arQDGIipaW8T5ul + strikeModeNum: 1 + name: Warhammer + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 4 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: mCDyTlxs8Sm69JAf + smId: jxEgLWuWFl8sa9C9 + createdEventId: x5CSeyoGxRsDli43 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 9arQDGIipaW8T5ul + strikeModeNum: 2 + name: Warhammer + subDesc: Impale + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 3 + aspect: piercing + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 4 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: NQFBFnCZhKtyj9gT + smId: aQA3s0J96tLW2VHH + createdEventId: KAZ20dzb7gNJf2UE + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 9arQDGIipaW8T5ul + strikeModeNum: 3 + name: Warhammer + subDesc: Shaft + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: true + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: pAS031xxQwBEYQfI + smId: KgWkXzbYgX7R8hXr + createdEventId: ABKMW9dpHMOJDHfV + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: gmEBhQV7Zjnv99FM + strikeModeNum: 1 + name: Whip + subDesc: Lash + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 10 + die: 6 + modifier: 0 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -20 + counterMod: -20 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: true + envelop: false + couched: false + impTA: 2 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: J8tC1wIicJwIMPzZ + smId: qUTAcAo6THaDBJGJ + createdEventId: GG0H7LSbJiuX28uI + entagle: true + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: gmEBhQV7Zjnv99FM + strikeModeNum: 2 + name: Whip + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -20 + counterMod: -20 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: true + envelop: false + couched: false + impTA: 2 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ZFwQ5G1i6slPsQIQ + smId: CjZeBjeHpfSE1xRk + createdEventId: Fj2p6D2bESOLarOI + entagle: true + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: C5LbX1fHZVwrb6nV + strikeModeNum: 1 + name: Whip, Reksyni + subDesc: Lash + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 10 + die: 8 + modifier: 1 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -20 + counterMod: -20 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: true + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: Y747iT61SlRZy0V1 + smId: NTUUGWibAlWMzN5O + createdEventId: 6b5w0j826WcG4VWe + entagle: true + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: C5LbX1fHZVwrb6nV + strikeModeNum: 2 + name: Whip, Reksyni + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -20 + counterMod: -20 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: true + envelop: false + couched: false + impTA: 4 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: ftxbcCK3xHvARwE0 + smId: zf74ulAo2Orzqr9j + createdEventId: a8i8H1xp4uBLALgK + entagle: true + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: t5T8WtrQ3MljAU1c + strikeModeNum: 1 + name: Whip, Teamster + subDesc: Lash + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 0 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -20 + counterMod: -20 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: true + envelop: false + couched: false + impTA: 2 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: KfjiQilgnl9810r4 + smId: sw9hjPuDEF65ePA0 + createdEventId: pMcHLgyj0hO2K9ZY + entagle: true + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: t5T8WtrQ3MljAU1c + strikeModeNum: 2 + name: Whip, Teamster + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -20 + counterMod: -20 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: true + envelop: false + couched: false + impTA: 2 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: lwLMng5NwwUGqQvd + smId: dFOwKuIS0TPZljNq + createdEventId: yMtvHZRjlG012X7l + entagle: true + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: sVa6nVcQxN6bqf0L + strikeModeNum: 1 + name: Wood Axe + subDesc: Cut + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 8 + modifier: 6 + aspect: edged + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 2I2AEpNjJcB4b4ui + smId: GH46xE1aDls4JGgc + createdEventId: 5vBWIh9AtYtmLgvO + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: sVa6nVcQxN6bqf0L + strikeModeNum: 2 + name: Wood Axe + subDesc: Pommel + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 8 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: -10 + counterMod: -10 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 6 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: true + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: gnSdbfWXc5jecLit + smId: Cj5qYHPP1ZRny7sG + createdEventId: ikv9Kzcu9oktwhYa + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: WfPlINJLt2stPJbx + strikeModeNum: 1 + name: Wooden Crossbow 120 + subDesc: Ranged + assocSkill: Archery + draw: 120 + baseRange: 210 + zoneDie: 0 + die: 0 + modifier: 2 + aspect: piercing + projtype: bolt + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: IAeOr5614u8trlCg + smId: Y68jVfIXT5RtuL7G + createdEventId: igiCpKezrniPvPRg + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: d0WpYxGlFA3a33q3 + strikeModeNum: 1 + name: Wooden Crossbow 160 + subDesc: Ranged + assocSkill: Archery + draw: 160 + baseRange: 240 + zoneDie: 0 + die: 0 + modifier: 3 + aspect: piercing + projtype: bolt + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: FnMJikFo21yK0ZJj + smId: Yaut2pNiVVYUf6yx + createdEventId: jwEvULyZdqCGhQZJ + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: jGe6fjplOSPfQ32V + strikeModeNum: 1 + name: Wooden Crossbow 80 + subDesc: Ranged + assocSkill: Archery + draw: 80 + baseRange: 180 + zoneDie: 0 + die: 0 + modifier: 1 + aspect: piercing + projtype: bolt + maxVM: 4 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 0 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: 9aTqo3XqQqnUai9J + smId: N8oKMlXqU8iCDOlJ + createdEventId: SzjGXh7djVPyayw1 + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: 9fUBzprkjX25L734 + strikeModeNum: 1 + name: Knuckledusters + subDesc: Crush + assocSkill: Melee + draw: 0 + baseRange: 0 + zoneDie: 4 + die: 6 + modifier: 0 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: false + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: true + shieldMod: 0 + slow: false + thrust: false + swung: false + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: FxmDEGM6FuuM44uP + smId: d0uqOpG7bp4HYQrB + createdEventId: H7nW0NiXLSe2obWN + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PvD8SLaG28Nude2X + strikeModeNum: 1 + name: Meteor Hammer + subDesc: Thrown + assocSkill: Meteor Hammer + draw: 0 + baseRange: 10 + zoneDie: 6 + die: 6 + modifier: 5 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: true + envelop: false + couched: false + impTA: 3 + long: true + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 2 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: FxmDEGM6FuuM44uP + smId: d0uqOpG7bp4HYQrB + createdEventId: H7nW0NiXLSe2obWN + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false +- weaponId: PvD8SLaG28Nude2X + strikeModeNum: 2 + name: Meteor Hammer + subDesc: Crush + assocSkill: Meteor Hammer + draw: 0 + baseRange: 0 + zoneDie: 6 + die: 6 + modifier: 1 + aspect: blunt + projtype: "" + maxVM: 0 + AR: 0 + blockMod: 0 + counterMod: 0 + meleeMod: 0 + oppDef: 0 + deflectTN: 0 + entangle: true + envelop: false + couched: false + impTA: 3 + long: false + onlyInClose: false + shieldMod: 0 + slow: false + thrust: false + swung: true + halfSword: false + bleed: false + 2hLength: 0 + shaft: false + pommel: false + minParts: 1 + noStrMod: false + halfImpact: false + durabilityMod: 0 + AEID: MBIAHU1GjNa9m2gR + smId: fBOEyqJor7EbT6oz + createdEventId: mA06wsb5AEn9epsl + entagle: false + macros: [] + flags: {} + blockSLMod: 0 + cxSLMod: 0 + noAttack: false + noBlock: false + lowAim: false diff --git a/packs/generate/legendary/leg-possessions/generate-leg-possessions.py b/packs/generate/legendary/leg-possessions/generate-leg-possessions.py new file mode 100755 index 0000000..64d4608 --- /dev/null +++ b/packs/generate/legendary/leg-possessions/generate-leg-possessions.py @@ -0,0 +1,872 @@ +#!./venv/bin/python3 + +import yaml +import json +import argparse +from unidecode import unidecode +from mergedeep import merge +import re + +parser = argparse.ArgumentParser() +parser.add_argument("outputDir", help="folder where generated files should be placed") +args = parser.parse_args() + +stats = { + "systemId": "sohl", + "systemVersion": "0.9.0", + "coreVersion": "12.330", + "createdTime": 0, + "modifiedTime": 0, + "lastModifiedBy": "TMJsvJWT6ytpHZ0M", +} + +with open("./data/miscgear.yaml", "r", encoding="utf8") as infile: + miscgearData = yaml.safe_load(infile) + +for miscgear in miscgearData: + print(f"Processing Misc Gear {miscgear['name']}") + fname = miscgear["name"] + "_" + miscgear["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": miscgear["name"], + "type": "miscgear", + "img": miscgear["img"], + "_id": miscgear["id"], + "_key": "!items!" + miscgear["id"], + "system": { + "notes": "", + "textReference": "", + "description": miscgear["description"], + "macros": miscgear["macros"], + "nestedItems": [], + "transfer": False, + "abbrev": miscgear["abbrev"], + "quantity": 1, + "weightBase": miscgear["weight"], + "valueBase": miscgear["value"], + "isCarried": True, + "isEquipped": False, + "qualityBase": miscgear["quality"], + "durabilityBase": miscgear["durability"], + }, + "effects": miscgear["effects"], + "flags": miscgear["flags"], + "_stats": stats, + "folder": miscgear["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/containergear.yaml", "r", encoding="utf8") as infile: + containergearData = yaml.safe_load(infile) + +for containergear in containergearData: + print(f"Processing Container Gear {containergear['name']}") + fname = containergear["name"] + "_" + containergear["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": containergear["name"], + "type": "containergear", + "img": containergear["img"], + "_id": containergear["id"], + "_key": "!items!" + containergear["id"], + "system": { + "notes": "", + "textReference": "", + "description": containergear["description"], + "macros": containergear["macros"], + "nestedItems": [], + "transfer": False, + "abbrev": "", + "quantity": 1, + "weightBase": containergear["weight"], + "valueBase": containergear["value"], + "isCarried": True, + "isEquipped": False, + "qualityBase": containergear["quality"], + "durabilityBase": containergear["durability"], + "maxCapacityBase": containergear["maxCapacity"], + }, + "effects": containergear["effects"], + "flags": containergear["flags"], + "_stats": stats, + "folder": "dl8lJ729W1mFlDvt", + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/concoctiongear.yaml", "r", encoding="utf8") as infile: + concoctiongearData = yaml.safe_load(infile) + +for concoctiongear in concoctiongearData: + print(f"Processing Concoction Gear {concoctiongear['name']}") + fname = concoctiongear["name"] + "_" + concoctiongear["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": concoctiongear["name"], + "type": "concoctiongear", + "img": concoctiongear["img"], + "_id": concoctiongear["id"], + "_key": "!items!" + concoctiongear["id"], + "system": { + "notes": "", + "textReference": "", + "description": concoctiongear["description"], + "macros": concoctiongear["macros"], + "nestedItems": [], + "transfer": False, + "subType": concoctiongear["subType"], + "abbrev": "", + "quantity": 1, + "weightBase": concoctiongear["weight"], + "valueBase": concoctiongear["value"], + "isCarried": True, + "isEquipped": False, + "qualityBase": concoctiongear["quality"], + "durabilityBase": concoctiongear["durability"], + "potency": concoctiongear["potency"], + "strength": concoctiongear["strength"], + }, + "effects": concoctiongear["effects"], + "flags": concoctiongear["flags"], + "_stats": stats, + "folder": concoctiongear["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/folders.yaml", "r", encoding="utf8") as infile: + foldersData = yaml.safe_load(infile) + +for folder in foldersData: + print(f"Processing Folder {folder['name']}") + fname = folder["name"] + "_" + folder["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": folder["name"], + "sorting": "a", + "folder": folder["parentFolderId"] or None, + "type": "Item", + "_id": folder["id"], + "sort": 0, + "color": folder["color"], + "flags": {}, + "_stats": stats, + "_key": "!folders!" + folder["id"], + } + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/armorgear.yaml", "r", encoding="utf8") as infile: + armorgearData = yaml.safe_load(infile) + +for armorgear in armorgearData: + print(f"Processing Armor Gear {armorgear['name']}") + fname = armorgear["name"] + "_" + armorgear["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + merge( + armorgear["flags"], + { + "sohl": { + "legendary": { + "encumbrance": armorgear["encumbrance"], + }, + }, + }, + ) + out = { + "name": armorgear["name"], + "type": "armorgear", + "img": armorgear["img"], + "_id": armorgear["id"], + "_key": "!items!" + armorgear["id"], + "system": { + "notes": "", + "textReference": "", + "description": armorgear["description"], + "macros": armorgear["macros"], + "nestedItems": [], + "transfer": False, + "abbrev": armorgear["abbrev"], + "quantity": 1, + "weightBase": armorgear["weight"], + "valueBase": armorgear["value"], + "isCarried": True, + "isEquipped": False, + "qualityBase": 0, + "durabilityBase": armorgear["durability"], + "material": armorgear["material"], + "locations": { + "flexible": armorgear["flexloc"], + "rigid": armorgear["rigidloc"], + }, + "protectionBase": { + "blunt": armorgear["blunt"], + "edged": armorgear["edged"], + "piercing": armorgear["piercing"], + "fire": armorgear["fire"], + }, + }, + "effects": [], + "flags": armorgear["flags"], + "_stats": stats, + "folder": armorgear["folderId"], + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + + if armorgear["perception"] != 0: + out["effects"].append( + { + "name": armorgear["name"] + " Perception", + "icon": "icons/svg/aura.svg", + "changes": [ + { + "key": "mod:system.$masteryLevel", + "mode": 2, + "value": str(armorgear["perception"]), + "priority": None, + } + ], + "flags": {}, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "", + }, + "_id": armorgear["perceptionEffectId"], + "disabled": False, + "duration": { + "startTime": None, + "seconds": None, + "combat": None, + "rounds": None, + "turns": None, + "startRound": None, + "startTurn": None, + }, + "origin": "", + "tint": None, + "transfer": False, + "description": "", + "statuses": [], + "_key": "!items.effects!" + + armorgear["id"] + + "." + + armorgear["perceptionEffectId"], + } + ) + + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/projectilegear.yaml", "r", encoding="utf8") as infile: + projectilegearData = yaml.safe_load(infile) + +for projectilegear in projectilegearData: + print(f"Processing Projectile Gear {projectilegear['name']}") + fname = projectilegear["name"] + "_" + projectilegear["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + out = { + "name": projectilegear["name"], + "type": "projectilegear", + "img": projectilegear["img"], + "_id": projectilegear["id"], + "_key": "!items!" + projectilegear["id"], + "system": { + "notes": projectilegear["notes"], + "textReference": projectilegear["textReference"], + "description": projectilegear["description"], + "macros": projectilegear["macros"], + "nestedItems": [], + "transfer": False, + "subType": projectilegear["type"], + "abbrev": projectilegear["abbrev"], + "quantity": 1, + "weightBase": projectilegear["weight"], + "valueBase": projectilegear["value"], + "isCarried": True, + "isEquipped": False, + "qualityBase": 0, + "durabilityBase": projectilegear["durability"], + "shortName": projectilegear["easyname"], + "impactBase": { + "numDice": 1 if projectilegear["impactDie"] > 0 else 0, + "die": projectilegear["impactDie"], + "modifier": projectilegear["impactMod"], + "aspect": projectilegear["aspect"], + }, + }, + "effects": [], + "flags": projectilegear["flags"], + "_stats": stats, + "folder": "ADQPHjgKsdWsJhyy", + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + + if projectilegear["AEID"]: + effect = { + "name": f"{projectilegear['easyname']} {projectilegear['type']} Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "", + }, + "_id": projectilegear["AEID"], + "disabled": False, + "duration": { + "startTime": None, + "seconds": None, + "combat": None, + "rounds": None, + "turns": None, + "startRound": None, + "startTurn": None, + }, + "origin": "", + "tint": None, + "transfer": False, + "description": "", + "statuses": [], + "_key": "!items.effects!" + + projectilegear["id"] + + "." + + projectilegear["AEID"], + } + + if projectilegear["ARvalue"] > 0: + effect["changes"].append( + { + "key": "mod:system.$impact.armorReduction", + "mode": 2, + "value": projectilegear["ARvalue"], + "priority": None, + } + ) + + if projectilegear["bleed"]: + effect["changes"].append( + { + "key": "mod:system.$impact.armorReduction", + "mode": 5, + "value": str(projectilegear["bleed"]), + "priority": None, + } + ) + + out["effects"].append(effect) + + with open(pname, "w", encoding="utf8") as outfile: + json.dump(out, outfile, indent=2, ensure_ascii=False) + +with open("./data/weapongear.yaml", "r", encoding="utf8") as infile: + weapongearData = yaml.safe_load(infile) + +weapons = {} + +for weapongear in weapongearData: + weaponname = weapongear["name"] + weaponid = weapongear["id"] + print(f"Processing Weapon Gear {weaponname}") + fname = weapongear["name"] + "_" + weapongear["id"] + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + merge( + weapongear["flags"], + { + "sohl": { + "legendary": { + "heftBase": weapongear["heft"], + "lengthBase": weapongear["length"], + }, + }, + }, + ) + weapons[weaponid] = { + "name": weaponname, + "type": "weapongear", + "img": weapongear["img"], + "_id": weaponid, + "_key": "!items!" + weaponid, + "system": { + "notes": weapongear["notes"], + "textReference": weapongear["textReference"], + "description": weapongear["description"], + "macros": weapongear["macros"], + "nestedItems": [], + "transfer": False, + "abbrev": weapongear["abbrev"], + "quantity": 1, + "weightBase": weapongear["weight"], + "valueBase": weapongear["value"], + "isCarried": True, + "isEquipped": False, + "qualityBase": 0, + "durabilityBase": weapongear["durability"], + }, + "effects": [], + "flags": weapongear["flags"], + "_stats": stats, + "folder": "c0GXEU9oCZ1N3mSl", + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + weapons[weaponid]["flags"].get("legendary", {}) + + +with open("./data/weapons-strike-modes.yaml", "r", encoding="utf8") as infile: + weaponsmData = yaml.safe_load(infile) + +for weaponsm in weaponsmData: + smname = f"{weaponsm['name']} ({weaponsm['subDesc']})" + print(f"Processing StrikeMode {smname}") + weapon = weapons[weaponsm["weaponId"]] + subdesc = weaponsm["subDesc"] + + traits = { + "armorReduction": weaponsm["AR"], + "blockMod": weaponsm["blockMod"], + "counterMod": weaponsm["counterMod"], + "meleeMod": weaponsm["meleeMod"], + "opponentDef": weaponsm["oppDef"], + "deflectTN": weaponsm["deflectTN"], + "entangle": weaponsm["entangle"], + "envelop": weaponsm["envelop"], + "couched": weaponsm["couched"], + "blockSLMod": weaponsm["blockSLMod"], + "cxSLMod": weaponsm["cxSLMod"], + "noAttack": weaponsm["noAttack"], + "noBlock": weaponsm["noBlock"], + "lowAim": weaponsm["lowAim"], + "impactTA": weaponsm["impTA"], + "long": weaponsm["long"], + "onlyInClose": weaponsm["onlyInClose"], + "shieldMod": weaponsm["shieldMod"], + "slow": weaponsm["slow"], + "thrust": weaponsm["thrust"], + "swung": weaponsm["swung"], + "halfSword": weaponsm["halfSword"], + "bleed": weaponsm["bleed"], + "twoHandLen": weaponsm["2hLength"], + "noStrMod": weaponsm["noStrMod"], + "halfImpact": weaponsm["halfImpact"], + "durMod": weaponsm["durabilityMod"], + } + + merge( + weaponsm["flags"], + { + "sohl": { + "legendary": {"zoneDie": weaponsm["zoneDie"]}, + }, + }, + ) + + sm = { + "name": subdesc, + "type": "meleestrikemode", + "img": weapon["img"], + "_id": weaponsm["smId"], + "system": { + "notes": "", + "textReference": "", + "description": "", + "macros": weaponsm["macros"], + "nestedItems": [], + "transfer": True, + "mode": subdesc, + "minParts": weaponsm["minParts"], + "assocSkillName": weaponsm["assocSkill"], + "impactBase": { + "numDice": 1 if weaponsm["die"] > 0 else 1, + "die": weaponsm["die"] if weaponsm["die"] > 0 else 0, + "modifier": weaponsm["modifier"], + "aspect": weaponsm["aspect"], + }, + }, + "effects": [], + "flags": weaponsm["flags"], + "_stats": stats, + "folder": None, + "sort": 0, + "ownership": {"default": 0, "TMJsvJWT6ytpHZ0M": 3}, + } + if subdesc == "Ranged" or subdesc == "Thrown": + projtype = weaponsm["projtype"] + if projtype == "arrow": + sm["img"] = "systems/sohl/assets/icons/arrow.svg" + elif projtype == "bolt": + sm["img"] = "systems/sohl/assets/icons/arrow.svg" + elif projtype == "bullet": + sm["img"] = "systems/sohl/assets/icons/stones.svg" + elif projtype == "dart": + sm["img"] = "systems/sohl/assets/icons/arrow.svg" + else: + sm["img"] = "systems/sohl/assets/icons/throw.svg" + sm["type"] = "missilestrikemode" + sm["system"]["projectileType"] = projtype + merge( + sm["flags"], + { + "sohl": { + "legendary": { + "maxVolleyMult": weaponsm["maxVM"], + "baseRangeBase": weaponsm["baseRange"], + "drawBase": weaponsm["draw"], + "zoneDie": weaponsm["zoneDie"], + }, + }, + }, + ) + + eid = weaponsm["AEID"] + effect = { + "name": f"{subdesc} Traits", + "icon": "icons/svg/aura.svg", + "changes": [], + "flags": {}, + "type": "sohlactiveeffect", + "system": { + "targetType": "this", + "targetName": "", + }, + "_id": eid, + "disabled": False, + "duration": { + "startTime": None, + "seconds": None, + "combat": None, + "rounds": None, + "turns": None, + "startRound": None, + "startTurn": None, + }, + "origin": "", + "tint": None, + "transfer": False, + "description": "", + "statuses": [], + "_key": "!items.effects!" + sm["_id"] + "." + eid, + } + + if weaponsm["shaft"]: + if not "sohl" in sm["flags"]: + sm["flags"] = {"sohl": {"legendary": {}}} + sm["flags"]["sohl"]["legendary"]["zoneDie"] = 8 + sm["system"]["impactBase"]["die"] = 6 + sm["system"]["impactBase"]["modifier"] = 1 + sm["system"]["impactBase"]["aspect"] = "blunt" + traits["slow"] = False + traits["thrust"] = False + effect["changes"].append( + {"key": "mod:system.$length", "mode": 2, "value": -2, "priority": None} + ) + if weaponsm["pommel"]: + if not "sohl" in sm["flags"]: + sm["flags"] = {"sohl": {"legendary": {}}} + sm["flags"]["sohl"]["legendary"]["zoneDie"] = 4 + sm["system"]["impactBase"]["die"] = 6 + sm["system"]["impactBase"]["modifier"] = 0 + sm["system"]["impactBase"]["aspect"] = "blunt" + effect["changes"].append( + {"key": "mod:system.$length", "mode": 5, "value": 1, "priority": None} + ) + if weaponsm["halfSword"]: + if sm["system"]["impactBase"]["aspect"] == "blunt": + sm["system"]["impactBase"]["modifier"] = 0 + sm["system"]["impactBase"]["die"] = 6 + if not "sohl" in sm["flags"]: + sm["flags"] = {"sohl": {"legendary": {}}} + if sm["flags"]["sohl"]["legendary"].get("zoneDie", 0) > 4: + sm["flags"]["sohl"]["legendary"]["zoneDie"] = ( + sm["flags"]["sohl"]["legendary"]["zoneDie"] - 2 + ) + traits["thrust"] = True + effect["changes"].append( + {"key": "mod:system.$length", "mode": 2, "value": -2, "priority": None} + ) + effect["changes"].append( + {"key": "mod:system.$length", "mode": 4, "value": 3, "priority": None} + ) + effect["changes"].append( + { + "key": "system.$traits.halfSword", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["armorReduction"] > 0: + effect["changes"].append( + { + "key": "mod:system.$impact.armorReduction", + "mode": 2, + "value": traits["armorReduction"], + "priority": None, + } + ) + if traits["blockMod"]: + effect["changes"].append( + { + "key": "mod:system.$defense.block", + "mode": 2, + "value": traits["blockMod"], + "priority": None, + } + ) + if traits["counterMod"]: + effect["changes"].append( + { + "key": "mod:system.$defense.counterstrike", + "mode": 2, + "value": traits["counterMod"], + "priority": None, + } + ) + if traits["meleeMod"]: + effect["changes"].append( + { + "key": "mod:system.$attack.block", + "mode": 2, + "value": traits["meleeMod"], + "priority": None, + } + ) + if traits["opponentDef"]: + effect["changes"].append( + { + "key": "mod:system.$traits.opponentDef", + "mode": 2, + "value": traits["opponentDef"], + "priority": None, + } + ) + if traits["deflectTN"]: + effect["changes"].append( + { + "key": "system.$traits.deflectTN", + "mode": 5, + "value": traits["deflectTN"], + "priority": None, + } + ) + if traits["entangle"]: + effect["changes"].append( + { + "key": "system.$traits.entangle", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["envelop"]: + effect["changes"].append( + { + "key": "system.$traits.envelop", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["couched"]: + effect["changes"].append( + { + "key": "system.$traits.couched", + "mode": 5, + "value": traits["couched"], + "priority": None, + } + ) + if traits["impactTA"]: + effect["changes"].append( + { + "key": "system.$traits.impactTA", + "mode": 5, + "value": traits["impactTA"], + "priority": None, + } + ) + if traits["long"]: + effect["changes"].append( + { + "key": "system.$traits.long", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["onlyInClose"]: + effect["changes"].append( + { + "key": "system.$traits.onlyInClose", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["shieldMod"]: + effect["changes"].append( + { + "key": "system.$traits.shieldMod", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["slow"]: + effect["changes"].append( + {"key": "system.$traits.slow", "mode": 5, "value": "true", "priority": None} + ) + if traits["thrust"]: + effect["changes"].append( + { + "key": "system.$traits.thrust", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["swung"]: + effect["changes"].append( + { + "key": "system.$traits.swung", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["bleed"]: + effect["changes"].append( + { + "key": "system.$traits.extraBleedRisk", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["twoHandLen"]: + effect["changes"].append( + { + "key": "system.$traits.twoHandLen", + "mode": 2, + "value": traits["twoHandLen"], + "priority": None, + } + ) + if traits["noStrMod"]: + effect["changes"].append( + { + "key": "system.$traits.noStrMod", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["halfImpact"]: + effect["changes"].append( + { + "key": "system.$traits.halfImpact", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["durMod"]: + effect["changes"].append( + { + "key": "mod:system.$durability", + "mode": 2, + "value": traits["durMod"], + "priority": None, + } + ) + if traits["blockSLMod"]: + effect["changes"].append( + { + "key": "system.$defense.block.successLevelMod", + "mode": 2, + "value": traits["blockSLMod"], + "priority": None, + } + ) + if traits["cxSLMod"]: + effect["changes"].append( + { + "key": "system.$defense.counterstrike.successLevelMod", + "mode": 2, + "value": traits["cxSLMod"], + "priority": None, + } + ) + if traits["noAttack"]: + effect["changes"].append( + { + "key": "system.$traits.noAttack", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["noBlock"]: + effect["changes"].append( + { + "key": "system.$traits.noBlock", + "mode": 5, + "value": "true", + "priority": None, + } + ) + if traits["lowAim"]: + effect["changes"].append( + { + "key": "system.$traits.lowAim", + "mode": 5, + "value": "true", + "priority": None, + } + ) + + sm["effects"].append(effect) + sm["sort"] = (len(weapon["system"]["nestedItems"]) + 1) * 100000 + weapon["system"]["nestedItems"].append(sm) + +for weaponid in weapons.keys(): + if weaponid == None: + continue + fname = weapons[weaponid]["name"] + "_" + weaponid + fname = unidecode(fname) + fname = re.sub(r"[^0-9a-zA-Z]+", "_", fname) + ".json" + pname = args.outputDir + "/" + fname + + with open(pname, "w", encoding="utf8") as outfile: + json.dump(weapons[weaponid], outfile, indent=2, ensure_ascii=False) diff --git a/packs/generate/legendary/leg-possessions/pack.properties b/packs/generate/legendary/leg-possessions/pack.properties new file mode 100644 index 0000000..d4f7578 --- /dev/null +++ b/packs/generate/legendary/leg-possessions/pack.properties @@ -0,0 +1 @@ +type=Item diff --git a/packs/generate/requirements.txt b/packs/generate/requirements.txt new file mode 100644 index 0000000..d41ebe7 --- /dev/null +++ b/packs/generate/requirements.txt @@ -0,0 +1,7 @@ +distro==1.9.0 +mergedeep==1.3.4 +PyYAML==6.0.2 +ruamel.yaml==0.18.6 +ruyaml==0.91.0 +setuptools==75.6.0 +Unidecode==1.3.8 diff --git a/scss/components/_bodyloc.scss b/scss/components/_bodyloc.scss new file mode 100644 index 0000000..75625c8 --- /dev/null +++ b/scss/components/_bodyloc.scss @@ -0,0 +1,156 @@ +.bodylocations { + + .zone-list { + list-style: none; + margin: 7px 0px; + padding: 0; + overflow-y: hidden; + line-height: normal; + + .body-drop { + flex: 0 0 10px; + font-weight: bold; + text-align: center; + } + + .full-location-name { + flex: 0 0 150px; + text-overflow: ellipsis; + white-space: nowrap; +// overflow: hidden; + } + + .bodylocation-header { + font-weight: bold; + } + + .bodylocation { + border-bottom: 1px solid #bbb; + align-items: center; + line-height: normal; + + .bodylocation-image { + flex: 0 0 24px; + margin-right: 5px; + } + + img { + display: block; + } + } + + .bodylocation-name { + flex: 0 0 120px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding-left: 5px; + } + + .bodylocation-layers { + flex: 0 0 120px; + text-align: left; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .bodylocation-part { + flex: 0 0 80px; + } + + .bodylocation-ele { + flex: 0 0 40px; + text-align: center; + } + + .bodylocation-notes { + flex: 1 0 100px; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .zone-header { + font-weight: bold; + background: rgba(0, 0, 0, 0.10); + border-bottom: 1px solid #bbb; + + .zone-image { + flex: 0 0 24px; + margin-right: 5px; + } + + img { + display: block; + } + + .zone-name { + flex: 0 0 140px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding-left: 5px; + + h4 { + font-weight: bold; + } + } + + .zone-zonenumbers { + flex: 0 0 100px; + text-align: left; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .zone-notes { + flex: 1 0 100px; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + + .bodypart-header { + font-weight: bold; + background: rgba(0, 0, 0, 0.05); + border-bottom: 1px solid #bbb; + + .bodypart-image { + flex: 0 0 24px; + margin-right: 5px; + } + + img { + display: block; + } + + .bodypart-name { + flex: 0 0 130px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding-left: 5px; + border-right: 1px solid #c9c7b8; + + h4 { + font-weight: bold; + } + } + + .bodypart-notes { + flex: 1 0 100px; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + } +} diff --git a/scss/components/_effects.scss b/scss/components/_effects.scss new file mode 100644 index 0000000..7184656 --- /dev/null +++ b/scss/components/_effects.scss @@ -0,0 +1,164 @@ +.effects { + h2 { + flex: 1; + margin: 0; + line-height: 36px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + color: #4b4a44; + background-color: #bbb; + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; + padding: 5px; + } + + .danger { + color: red; + } + + .disabled { + color: #9a998f; + } + + .effects-list { + list-style: none; + margin: 7px 0; + padding: 0; + overflow-y: hidden; + + .effects-header { + margin: 2px 0; + padding: 0; + align-items: center; + background: rgba(0, 0, 0, 0.15); + border: 2px groove #eeede0; + font-weight: bold; + line-height: 24px; + + h3 { + margin: 0; + padding-left: 5px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + font-size: 16px; + } + + .name { + color: #191813; + flex: 0 0 150px; + border-right: 1px solid #c9c7b8; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + i { + font-size: 12px; + padding-left: 5px; + } + } + + .effect-controls { + flex: 0 0 45px; + text-align: right; + padding-right: 5px; + color: #191813; + } + } + + .effect-list { + list-style: none; + margin: 0; + padding: 0; + } + + .effect { + border-bottom: 1px solid #c9c7b8; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + .image { + flex: 0 0 30px; + background-size: 30px; + margin-right: 5px; + } + + img { + display: block; + } + + .name { + flex: 0 0 150px; + max-height: 30px; + border-right: 1px solid #c9c7b8; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + h4 { + margin: 0; + } + } + } + + .effect:last-child { + border-bottom: none; + } + + .detail { + font-size: 12px; + border-right: 1px solid #c9c7b8; + } + + .ele { + flex: 0 0 40px; + text-align: center; + } + + .duration { + flex: 0 0 100px; + text-align: center; + } + + .source { + flex: 0 0 150px; + text-align: center; + padding-left: 5px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .target { + flex: 0 0 150px; + text-align: center; + padding-left: 5px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .changes { + flex: 1 0 60px; + text-align: left; + padding-left: 5px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .effect-controls { + flex: 0 0 45px; + text-align: right; + padding-right: 5px; + font-size: 12px; + color: #191813; + + .effect-control { + flex: 0 0 22px; + } + } + } +} diff --git a/scss/components/_facade.scss b/scss/components/_facade.scss new file mode 100644 index 0000000..f2ac2ca --- /dev/null +++ b/scss/components/_facade.scss @@ -0,0 +1,11 @@ +.facade { + img.facade-image { + flex: 0 0 200px; + object-fit: contain; + background: white; + } + + .facade-description { + margin-left: 5px; + } +} diff --git a/scss/components/_forms.scss b/scss/components/_forms.scss new file mode 100644 index 0000000..c5fbe89 --- /dev/null +++ b/scss/components/_forms.scss @@ -0,0 +1,366 @@ +@use "../utils/typography"; + +.item-form { + font-family: typography.$font-primary; +} + +form .form-group .form-fields { + justify-content: flex-start; +} + +.sheet .sheet-header-entity { + flex: 0 0 120px; + overflow: hidden; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + margin-bottom: 10px; + border-bottom: 2px groove #eeede0; + + .profile-img { + flex: 0 0 120px; + height: 120px; + margin-right: 10px; + object-fit: contain; + } + + .header-fields { + .name-attribute { + border-bottom: 2px groove #eeede0; + + h1.charname { + height: 40px; + padding: 0px; + margin: 5px 0; + border-bottom: 0; + flex: 1 0 200px; + input { + width: 100%; + height: 100%; + margin: 0; + } + } + + .healtharea { + flex: 0 0 110px; + } + + .health { + text-align: center; + padding: 5px 0 0; + + .label { + font-size: 14px; + text-transform: uppercase; + font-weight: bold; + } + } + + .healthbar { + width: 100%; + margin-bottom: 5px; + background: #7a7971; + border: 1px solid #000; + border-radius: 3px; + + .bar { + height: 4px; + margin: 1px; + display: block; + background: #afebff; + border: 1px solid #000; + border-radius: 2px; + } + } + + .empty { + height: 100%; + } + } + + .header-stat-block { + flex: 0 0 140px; + + .penalties { + padding: 0 0 5px; + font-size: 12px; + font-weight: bold; + align-items: center; + + .capacity-value { + font-size: 14px; + } + + .capacity-label { + text-transform: uppercase; + font-size: 14px; + flex: 0 0 100px; + } + } + } + + .header-attributes { + font-size: 10px; + + textarea.description { + resize: none; + font-family: "Signika", sans-serif; + font-size: 13px; + border: none; + background: transparent; + } + + .attribute { + min-height: 40px; + margin: 2px; + + .label { + font-size: 10px; + text-transform: uppercase; + font-weight: bold; + } + + .value { + font-size: 18px; + height: calc(100% - 6px); + } + } + } + + .effect-buttons { + flex: 0 0 300px; + + .effect-button { + border: 1px; + color: black; + padding: 0px; + text-align: center; + text-decoration: none; + display: inline-block; + margin: 4px 2px; + border-radius: 16px; + border-style: solid; + height: 30px; + width: 40px; + } + + .active { + color: white; + background-color: blue; + } + } + + .bodypart-statuses { + margin: 0; + gap: 2px; + + .bodypart-status { + border: 1px; + color: black; + padding-top: 3px; + text-align: center; + text-decoration: none; + display: inline-block; + margin: 4px 2px; + border-radius: 16px; + border-style: solid; + height: 25px; + } + .none { + background-color: #ddd; + } + + .impaired { + background-color: rgb(212, 208, 12); + } + + .unusable { + background-color: rgb(245, 75, 75); + } + } + } +} + +.sheet-header-object { + flex: 0 0 120px; + overflow: hidden; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + margin-bottom: 10px; + border-bottom: 2px groove #eeede0; + + .profile-img { + flex: 0 0 120px; + height: 120px; + margin-right: 10px; + object-fit: contain; + } + + .header-fields { + .name-attribute { + border-bottom: 2px groove #eeede0; + + h1.charname { + height: 40px; + padding: 0px; + margin: 5px 0; + border-bottom: 0; + flex: 1 0 350px; + input { + width: 100%; + height: 100%; + margin: 0; + } + } + } + + .header-stat-block { + flex: 0 0 140px; + + .penalties { + padding: 0 0 5px; + font-size: 12px; + font-weight: bold; + align-items: center; + + .capacity-value { + font-size: 14px; + } + + .capacity-label { + text-transform: uppercase; + font-size: 14px; + flex: 0 0 100px; + } + } + + .endurance { + text-align: center; + padding: 5px 0 0; + + .label { + font-size: 14px; + text-transform: uppercase; + font-weight: bold; + } + } + + .endbar { + flex: 0 0 8px; + width: 100%; + margin-bottom: 5px; + background: #7a7971; + border: 1px solid #000; + border-radius: 3px; + + .bar { + height: 4px; + margin: 1px; + display: block; + background: #afebff; + border: 1px solid #000; + border-radius: 2px; + } + } + } + + .header-attributes { + font-size: 10px; + + textarea.description { + resize: none; + font-family: "Signika", sans-serif; + font-size: 13px; + border: none; + background: transparent; + } + + .attribute { + min-height: 40px; + margin: 2px; + + .label { + font-size: 10px; + text-transform: uppercase; + font-weight: bold; + } + + .value { + font-size: 18px; + height: calc(100% - 6px); + } + } + } + + .effect-buttons { + flex: 1 0 300px; + + .effect-button { + border: 1px; + color: black; + padding: 0px; + text-align: center; + text-decoration: none; + display: inline-block; + margin: 4px 2px; + border-radius: 16px; + border-style: solid; + height: 30px; + width: 40px; + } + + .active { + color: white; + background-color: blue; + } + } + + .zone-statuses { + margin: 0; + gap: 2px; + + .bodyzone-status { + border: 1px; + color: black; + padding-top: 3px; + text-align: center; + text-decoration: none; + display: inline-block; + margin: 4px 2px; + border-radius: 16px; + border-style: solid; + height: 25px; + } + .none { + background-color: #ddd; + } + + .impaired { + background-color: rgb(212, 208, 12); + } + + .unusable { + background-color: rgb(245, 75, 75); + } + } + } +} + +.sheet-tabs { + flex: 0; +} + +.sheet-body, +.sheet-body .tab, +.sheet-body .tab .editor { + height: 100%; +} + +.tox { + .tox-edit-area { + padding: 0 8px; + } +} diff --git a/scss/components/_items.scss b/scss/components/_items.scss new file mode 100644 index 0000000..9bd9c2d --- /dev/null +++ b/scss/components/_items.scss @@ -0,0 +1,240 @@ +.items { + + h2 { + flex: 1; + margin: 0; + line-height: 36px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + color: #4b4a44; + background-color: #bbb; + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; + padding: 5px; + } + + .danger { + color: red; + } + + .disabled { + color: #9a998f; + } + + .nocarry { + color: #9a998f; + } + + .items-list { + list-style: none; + margin: 7px 0; + padding: 0; + overflow-y: hidden; + + .items-header { + margin: 2px 0; + padding: 0; + align-items: center; + background: rgba(0, 0, 0, 0.15); + border: 2px groove #eeede0; + font-weight: bold; + line-height: 24px; + + h3 { + margin: 0; + padding-left: 5px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + font-size: 16px; + + .fas { + padding-right: 5px; + } + } + + .item-name { + color: #191813; + border-right: 1px solid #c9c7b8; + + i { + font-size: 12px; + padding-left: 5px; + } + } + + .capacity { + flex: 0 0 140px; + text-align: right; + padding-right: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .overmaxcap { + color: red; + font-weight: bold; + } + + .overencumberedcap { + color: #c18c00; + font-weight: bold; + } + } + + .item-list { + list-style: none; + margin: 0; + padding: 0; + } + + .name { + flex: 0 0 200px; + cursor: pointer; + max-height: 30px; + overflow: hidden; + border-right: 1px solid #c9c7b8; + + h4 { + margin: 0; + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; + } + } + + .short-name { + flex: 0 0 120px; + cursor: pointer; + max-height: 30px; + overflow: hidden; + border-right: 1px solid #c9c7b8; + + h4 { + margin: 0; + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + .detail { + font-size: 12px; + border-right: 1px solid #c9c7b8; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .notes { + flex: 1 0 25px; + text-align: left; + padding-left: 5px; + } + + .type { + flex: 0 0 60px; + text-align: center; + } + + .subtype { + flex: 0 0 90px; + text-align: center; + } + + .impact { + flex: 0 0 60px; + text-align: center; + } + + .ele { + flex: 0 0 40px; + text-align: center; + } + + .duration { + flex: 0 0 100px; + text-align: center; + padding-left: 1px; + padding-right: 1px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + .value { + padding-left: 3px; + } + } + + .source { + flex: 0 0 120px; + text-align: left; + padding-left: 5px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .aspect { + flex: 0 0 60px; + text-align: center; + } + + .item-controls { + flex: 0 0 45px; + text-align: right; + padding-right: 5px; + font-size: 12px; + + .item-control { + flex: 0 0 22px; + } + } + + .item-controls-wide { + flex: 0 0 65px; + text-align: right; + padding-right: 5px; + font-size: 12px; + + .item-control { + flex: 0 0 22px; + } + } + + .item { + line-height: 24px; + padding: 0 2px; + border-bottom: 1px solid #c9c7b8; + + .item-image { + flex: 0 0 30px; + background-size: 24px 24px; + background-repeat: no-repeat; + margin-right: 5px; + } + + .print-item-image { + flex: 0 0 30px; + margin-right: 5px; + } + + img { + display: block; + } + } + + .item:last-child { + border-bottom: none; + } + } +} + +.items-block + .items-block { + margin-top: 10px; +} diff --git a/scss/components/_profile.scss b/scss/components/_profile.scss new file mode 100644 index 0000000..fad8412 --- /dev/null +++ b/scss/components/_profile.scss @@ -0,0 +1,237 @@ +.attribute-scores { + flex: 0 0 80px; + gap: 0; + margin: 0; + justify-content: center; + + .attribute { + display: block; + align-items: center; + text-align: center; + padding: 3px 0 0 0; + flex: 0 0 80px; + border: 2px groove #eeede0; + + .name { + margin: 0 0 2px; + font-size: 13px; + } + + .value { + font-size: 25px; + font-weight: bold; + margin: 0 0 2px; + border-bottom: none; + } + + .label { + margin: 0 0 2px; + font-size: 13px; + border-bottom: 1px solid black; + } + + .attribute-box { + border-top: 1px solid black; + } + + .secmod { + font-size: 13px; + text-align: center; + } + + .test { + font-size: 13px; + text-align: center; + + &:hover { + background-image: url("../../../icons/svg/d20-grey.svg") !important; + background-size: 27px; + background-repeat: no-repeat; + background-position: center; + color: black; + } + } + } +} + +.traits { + h2 { + flex: 1; + margin: 0; + line-height: 36px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + color: #4b4a44; + background-color: #bbb; + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; + padding: 5px; + } + + .traits-list { + list-style: none; + margin: 7px 2px; + padding: 0; + overflow-y: hidden; + + .trait { + .trait-name { + flex: 0 0 150px; + } + + .trait-notes { + flex: 1 0 50px; + text-align: left; + padding-left: 5px; + border-right: 1px solid #c9c7b8; + } + + .trait-type { + flex: 0 0 80px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; + } + + .trait-intensity { + flex: 0 0 80px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; + } + + .trait-value { + flex: 0 0 120px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; + } + } + } +} + +.affiliations { + h2 { + padding: 5px; + } + + .affiliation-list { + list-style: none; + margin: 7px 0; + padding: 0; + overflow-y: hidden; + + .affiliation { + border-bottom: 1px solid #bbb; + + .image { + flex: 0 0 24px; + margin-right: 5px; + } + + img { + display: block; + } + } + + .name { + flex: 0 0 150px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; + } + + .ele { + flex: 0 0 40px; + text-align: center; + border-right: 1px solid #c9c7b8; + } + + .notes { + flex: 1 0 50px; + text-align: left; + padding-left: 5px; + border-right: 1px solid #c9c7b8; + } + + .wideele { + flex: 0 0 120px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; + } + } +} + +.profile-params { + margin-top: 5px; + align-items: center; + flex: 0 1 10px; + + .profile-item { + align-items: center; + border-top: 2px groove #eeede0; + border-bottom: 2px groove #eeede0; + margin-top: 12px; + padding: 5px 0; + + .attribute { + align-items: center; + + .label { + flex: 0 0 60px; + font-weight: bold; + text-transform: uppercase; + text-align: right; + padding-right: 4px; + } + + .value { + flex: 0 0 150px; + } + } + } +} + +.profile-desc { + margin-top: 5px; + + .label { + padding-left: 5px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 16px; + margin: 2px 0; + align-items: center; + background: rgba(0, 0, 0, 0.05); + border: 2px groove #eeede0; + font-weight: bold; + line-height: 24px; + + i { + font-size: 12px; + padding-left: 5px; + } + } + + .description { + margin-left: 5px; + } +} + +.profile { + img.bio-image { + flex: 0 0 200px; + object-fit: contain; + background: white; + } +} diff --git a/scss/components/_resource.scss b/scss/components/_resource.scss new file mode 100644 index 0000000..3cac4cc --- /dev/null +++ b/scss/components/_resource.scss @@ -0,0 +1,34 @@ +.resource { + display: flex; + flex: 1; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; + + .time-label { + flex: 0 0 100px; + } + + .time-control { + flex: 0 0 60px; + } +} + +.resource-label { + font-weight: bold; + text-transform: uppercase; +} + +.artifact { + padding-top: 5px; + align-items: center; +} + +.text-field { + align-items: top; + + label { + font-weight: bold; + text-transform: uppercase; + } +} \ No newline at end of file diff --git a/scss/components/_tabs.scss b/scss/components/_tabs.scss new file mode 100644 index 0000000..deead1d --- /dev/null +++ b/scss/components/_tabs.scss @@ -0,0 +1,43 @@ +// .tabs { +// .item { +// background: rgba(0, 0, 0, 0.125); +// border: 1px solid; +// border-radius: 4px; +// margin: 0 10px 0; +// padding: 8px 4px; + +// &:hover, +// &:focus { +// background: rgba(0, 0, 0, 0.125); +// } + +// &.active { +// background: transparent; +// } +// } +// } + +.tabs { + flex: 0 0 30px; + margin-bottom: 5px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + + .item { + height: 30px; + line-height: 32px; + margin: 0 24px; + border-bottom: 3px solid #b5b3a4; + } + + .item.active { + text-shadow: none; + border-bottom: 3px solid black; + font-size: 25px; + } +} + +.sheet-body .tab { + margin-right: 5px; +} diff --git a/scss/components/_top.scss b/scss/components/_top.scss new file mode 100644 index 0000000..f9ca3b1 --- /dev/null +++ b/scss/components/_top.scss @@ -0,0 +1,293 @@ +.window-content { + background: url("../ui/parchment.jpg") repeat; + font-size: 13px; + color: #191813; +} + +.print-window-content { + font-size: 13px; + color: #191813; + background: white; +} + +input[type="text"], +input[type="number"], +select { + height: calc(100% - 2px); + border: 1px solid #7a7971; + background: rgba(0, 0, 0, 0.05); + color: #191813; +} + +input[type="text"]:hover, +input[type="number"]:hover, +input[type="text"]:focus, +input[type="number"]:focus { + border: 1px solid #111; + box-shadow: 0 0 8px red; +} + +input:disabled, +select:disabled, +textarea:disabled { + color: #4b4a44; +} + +input:disabled:hover, +select:disabled:hover, +textarea:disabled:hover, +input:disabled:focus, +select:disabled:focus, +textarea:disabled:focus { + box-shadow: none !important; + border: 1px solid transparent !important; + outline: none !important; +} + +button { + background: rgba(0, 0, 0, 0.1); + border: 2px groove #eeede0; +} + +label.checkbox { + flex: auto; + padding: 0; + margin: 0; + height: 22px; + line-height: 22px; + font-size: 11px; +} + +label.checkbox > input[type="checkbox"] { + width: 16px; + height: 16px; + margin: 0 2px 0 0; + position: relative; + top: 4px; +} + +label.checkbox.right > input[type="checkbox"] { + margin: 0 0 0 2px; +} + +label.init-checkbox { + flex: auto; + padding: 0; + margin: 0 0 0 2px; + height: 22px; + line-height: 22px; +} +.sheet { + .window-content { + overflow-y: hidden; + padding: 5px; + background: url("../ui/parchment.jpg") repeat; + font-size: 13px; + color: #191813; + } + + .window-content form { + height: 100%; + overflow: hidden; + } + + .window-content .tab { + height: 100%; + overflow-y: hidden; + align-content: flex-start; + } + + input[type="text"], + input[type="number"] { + background: none; + border: 1px solid transparent; + } + + input[type="text"]:hover, + input[type="number"]:hover, + input[type="text"]:focus, + input[type="number"]:focus { + border: 1px solid #111; + } + + select { + flex: 1; + font-size: 12px; + height: 22px; + background: transparent; + } + + .editable .rollable:hover { + color: #000; + text-shadow: 0 0 10px red; + cursor: pointer; + } + + span.sep { + flex: none; + margin: 0 1px; + display: inline; + position: relative; + color: #7a7971; + font-weight: normal; + } + + .editor { + height: 100%; + } + + .editor .tox-toolbar-overlord, + .editor .tox-toolbar__primary { + background: none; + } + + .sheet-header { + .header-details { + font-size: 20px; + font-weight: 700; + } + + h1 { + flex: 1; + border-bottom: none; + height: 60px; + margin: 0; + padding: 5px; + + input { + display: block; + height: 50px; + font-size: 32px; + margin: 0; + } + } + + img.profile { + flex: 0 0 100px; + max-width: 100px; + height: 100px; + object-fit: contain; + border: none; + border-right: 2px groove #eeede0; + } + + .summary { + flex: 0 0 100%; + height: 40px; + margin: 0; + padding: 0; + list-style: none; + border-top: 2px groove #eeede0; + border-bottom: none; + + li { + height: calc(100% - 6px); + float: left; + margin: 2px 0; + padding: 0; + border-right: 2px groove #eeede0; + line-height: 34px; + color: #4b4a44; + + :last-child { + border-right: none; + } + } + } + + .subtype { + font-size: 16px; + font-weight: 700; + } + } + + .sheet-navigation { + flex: 0 0 30px; + margin-bottom: 5px; + font-size: 20px; + font-weight: 700; + + .item { + height: 30px; + line-height: 32px; + margin: 0 24px; + border-bottom: 3px solid #b5b3a4; + + .active { + border-bottom: 3px solid #44191a; + } + } + } +} + +.sheet-body .macro .command { + height: calc(100% - 80px); + + textarea { + width: 100%; + height: 100%; + box-sizing: border-box; + } +} + +.search-bar { + align-items: center; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + padding-bottom: 5px; +} + +img.token-image { + flex: 0 0 120px; + height: 120px; + margin-right: 10px; + object-fit: contain; + background: white; +} + +img.bio-image { + flex: 0 0 200px; + margin-right: 10px; + object-fit: contain; + background: white; +} + +label.header { + font-weight: bold; + text-transform: uppercase; + text-align: left; + padding-left: 4px; +} + +.search-items { + display: flex; + padding-bottom: 2px; + + .search-criteria { + flex: 1 0 100px; + text-align: left; + padding-left: 5px; + } + + .search-controls { + flex: 0 0 25px; + text-align: right; + line-height: var(--form-field-height); + + .search-control { + flex: 0 0 22px; + font-size: 16px; + vertical-align: -.125em; + text-align: right; + color: #4b4a44; + padding-right: 5px; + } + + .disabled { + color: #9a998f; + } + } + +} diff --git a/scss/global/_chat.scss b/scss/global/_chat.scss new file mode 100644 index 0000000..94f6662 --- /dev/null +++ b/scss/global/_chat.scss @@ -0,0 +1,153 @@ +.chat-card { + font-style: normal; + font-size: 15px; + + .card-header { + text-align: center; + padding: 3px 0; + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; + background-color: #bbb; + color: #111; + + h3 { + flex: 1; + margin: 0; + line-height: 25px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + color: #4b4a44; + } + + h4 { + flex: 1; + margin: 0; + line-height: 20px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 16px; + font-weight: 700; + color: #4b4a44; + } + + h3:hover { + color: #111; + text-shadow: 0 0 10px red; + } + } + + .mingap { + gap: 3px; + } + + .header { + text-align: center; + font-weight: bold; + } + + .center { + text-align: center; + } + + .result-desc { + color: blue; + font-weight: bold; + } + + .weapon-broke { + text-align: center; + color: red; + font-weight: bold; + } + + .card-content { + margin: 5px 0; + + h3 { + font-size: 12px; + margin: 0; + font-weight: bold; + } + + .label { + font-weight: bold; + padding-right: 5px; + text-align: right; + } + + .value { + text-align: left; + } + + .adjustment { + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; + } + + .adj-name { + text-align: left; + flex: 1 0 10px; + } + + .adj-value { + text-align: left; + padding-left: 10px; + flex: 0 0 80px; + } + } + + .card-footer { + padding: 3px 0 0; + border-top: 2px groove #fff; + text-align: center; + font-size: 16px; + } + + .critical-success-block { + background-color: green; + color: white; + } + + .critical-failure-block { + background-color: red; + color: white; + } + + .critical-success-text { + color: green; + font-weight: bold; + } + + .critical-failure-text { + color: red; + font-weight: bold; + } + + .note { + font-style: italic; + } + + .notice-header { + border-top: 2px groove; + color: red; + text-align: center; + font-weight: bold; + } + + .notice-body { + color: red; + text-align: center; + } + + .success-text { + color: green; + } + + .failure-text { + color: red; + } + + .emphasize-text { + font-style: italic; + } +} diff --git a/scss/global/_editor.scss b/scss/global/_editor.scss new file mode 100644 index 0000000..3a43103 --- /dev/null +++ b/scss/global/_editor.scss @@ -0,0 +1,5 @@ +section.highlight { + padding: 0 5px; + background: rgba(247, 230, 2, 0.05); + border: 1px solid #666; +} diff --git a/scss/global/_flex.scss b/scss/global/_flex.scss new file mode 100644 index 0000000..6b07aa6 --- /dev/null +++ b/scss/global/_flex.scss @@ -0,0 +1,9 @@ +.flex-center { + align-items: center; + justify-content: center; + text-align: center; +} + +.flex-between { + justify-content: space-between; +} diff --git a/scss/global/_grid.scss b/scss/global/_grid.scss new file mode 100644 index 0000000..7efd7f0 --- /dev/null +++ b/scss/global/_grid.scss @@ -0,0 +1,84 @@ +.grid, +.grid-2col { + display: grid; + grid-column: span 2 / span 2; + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-auto-rows: minmax(40px, auto); + gap: 0 10px; + margin: 0; + padding: 0; +} + +.grid-fixed-row { + grid-template-rows: 40px; +} + +.grid-3col { + grid-column: span 3 / span 3; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-4col { + grid-column: span 4 / span 4; + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.grid-5col { + grid-column: span 5 / span 5; + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.grid-6col { + grid-column: span 6 / span 6; + grid-template-columns: repeat(6, minmax(0, 1fr)); +} + +.grid-7col { + grid-column: span 7 / span 7; + grid-template-columns: repeat(7, minmax(0, 1fr)); +} + +.grid-8col { + grid-column: span 8 / span 8; + grid-template-columns: repeat(8, minmax(0, 1fr)); +} + +.grid-9col { + grid-column: span 9 / span 9; + grid-template-columns: repeat(9, minmax(0, 1fr)); +} + +.grid-10col { + grid-column: span 10 / span 10; + grid-template-columns: repeat(10, minmax(0, 1fr)); +} + +.grid-11col { + grid-column: span 11 / span 11; + grid-template-columns: repeat(11, minmax(0, 1fr)); +} + +.grid-12col { + grid-column: span 12 / span 12; + grid-template-columns: repeat(12, minmax(0, 1fr)); +} + +.flex-group-center, +.flex-group-left, +.flex-group-right { + justify-content: center; + align-items: center; + text-align: center; + // padding: 5px; + // border: 1px solid #999; +} + +.flex-group-left { + justify-content: flex-start; + text-align: left; +} + +.flex-group-right { + justify-content: flex-end; + text-align: right; +} diff --git a/scss/global/_hotbar.scss b/scss/global/_hotbar.scss new file mode 100644 index 0000000..6cdef69 --- /dev/null +++ b/scss/global/_hotbar.scss @@ -0,0 +1,4 @@ +#hotbar li.macro { + background: url("../ui/parchment.jpg"); + // background: rgba(0, 0, 0, 0) +} diff --git a/scss/global/_nav.scss b/scss/global/_nav.scss new file mode 100644 index 0000000..4519f9e --- /dev/null +++ b/scss/global/_nav.scss @@ -0,0 +1,11 @@ +.sheet nav.sheet-tabs { + height: 32px; + flex: 0 0 32px; + margin: 4px 0; + line-height: 32px; + border: none; + + .item { + padding: 0; + } +} diff --git a/scss/global/_tooltip.scss b/scss/global/_tooltip.scss new file mode 100644 index 0000000..b93087b --- /dev/null +++ b/scss/global/_tooltip.scss @@ -0,0 +1,37 @@ +.tooltip { + position: relative; + display: inline-block; +} + +.tooltiptext { + text-transform: none; + font-size: 12px; + visibility: hidden; + width: 240px; + background-color: rgb(216, 189, 36); + color: #111; + text-align: left; + border-radius: 6px; + padding: 5px 5px; + + /* Position the tooltip */ + position: absolute; + bottom: 150%; + left: 50%; + margin-left: -60px; +} + +.tooltiptext::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: rgb(216, 189, 36) transparent transparent transparent; +} + +.tooltip:hover .tooltiptext { + visibility: visible; +} diff --git a/scss/global/_window.scss b/scss/global/_window.scss new file mode 100644 index 0000000..3482eaa --- /dev/null +++ b/scss/global/_window.scss @@ -0,0 +1,12 @@ +/*.window-app { + font-family: $font-primary; +}*/ + +.rollable { + &:hover, + &:focus { + color: #000; + text-shadow: 0 0 10px red; + cursor: pointer; + } +} diff --git a/scss/sohl.scss b/scss/sohl.scss new file mode 100644 index 0000000..fe22460 --- /dev/null +++ b/scss/sohl.scss @@ -0,0 +1,29 @@ +// Import utilities. +@use "sass:meta"; +@use "utils/typography"; +@use "utils/colors"; +@use "utils/mixins"; +@use "utils/variables"; + +/* Global styles */ +@use "global/window"; +@use "global/editor"; +@use "global/grid"; +@use "global/flex"; +@use "global/chat"; +@use "global/tooltip"; +@use "global/nav"; +@use "global/hotbar"; + +/* Styles limited to sohl sheets */ +.sohl { + @include meta.load-css("components/top"); + @include meta.load-css("components/facade"); + @include meta.load-css("components/forms"); + @include meta.load-css("components/resource"); + @include meta.load-css("components/tabs"); + @include meta.load-css("components/items"); + @include meta.load-css("components/profile"); + @include meta.load-css("components/bodyloc"); + @include meta.load-css("components/effects"); +} diff --git a/scss/utils/_colors.scss b/scss/utils/_colors.scss new file mode 100644 index 0000000..4d053be --- /dev/null +++ b/scss/utils/_colors.scss @@ -0,0 +1,2 @@ +$c-white: #fff; +$c-black: #000; diff --git a/scss/utils/_mixins.scss b/scss/utils/_mixins.scss new file mode 100644 index 0000000..46d3032 --- /dev/null +++ b/scss/utils/_mixins.scss @@ -0,0 +1,16 @@ +@mixin element-invisible { + position: absolute; + + width: 1px; + height: 1px; + margin: -1px; + border: 0; + padding: 0; + + clip: rect(0 0 0 0); + overflow: hidden; +} + +@mixin hide { + display: none; +} diff --git a/scss/utils/_typography.scss b/scss/utils/_typography.scss new file mode 100644 index 0000000..11bf185 --- /dev/null +++ b/scss/utils/_typography.scss @@ -0,0 +1,7 @@ +@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap"); + +//$font-primary: 'Roboto', sans-serif; +//$font-secondary: 'Roboto', sans-serif; + +$font-primary: "Signika", sans-serif; +$font-secondary: "Signika", sans-serif; diff --git a/scss/utils/_variables.scss b/scss/utils/_variables.scss new file mode 100644 index 0000000..deee5de --- /dev/null +++ b/scss/utils/_variables.scss @@ -0,0 +1,3 @@ +$padding-sm: 5px; +$padding-md: 10px; +$padding-lg: 20px; diff --git a/system.json b/system.json new file mode 100644 index 0000000..1045fda --- /dev/null +++ b/system.json @@ -0,0 +1,106 @@ +{ + "id": "sohl", + "title": "Song of Heroic Lands", + "description": "Song of Heroic Lands", + "version": "0.4.0", + "authors": [ + { + "name": "Toasty", + "discord": "toasty#8538", + "flags": {} + } + ], + "url": "https://github.com/toastygm/HarnMaster-Kethira-FoundryVTT/", + "license": "LICENSE", + "readme": "README.md", + "bugs": "https://github.com/toastygm/HarnMaster-Kethira-FoundryVTT/issues", + "flags": { + "allowBugReporter": true, + "needsMigrationVersion": "0.3.5", + "compatibleMigrationVersion": "0.3.0" + }, + "compatibility": { + "minimum": "12", + "verified": "12.323" + }, + "esmodules": ["module/sohl.js"], + "styles": ["css/sohl.css"], + "languages": [ + { + "lang": "en", + "name": "English", + "path": "lang/en.json" + } + ], + "packFolders": [ + { + "name": "Song of Heroic Lands", + "sorting": "m", + "color": "#094fcb", + "folders": [ + { + "name": "Legendary", + "sorting": "m", + "color": "#ac09cb", + "packs": [ + "leg-characters", + "leg-creatures", + "leg-characteristics", + "leg-mysteries", + "leg-possessions" + ] + } + ] + } + ], + "packs": [ + { + "label": "Characters", + "type": "Actor", + "name": "leg-characters", + "system": "sohl", + "path": "packs/leg-characters", + "private": false + }, + { + "label": "Creatures", + "type": "Actor", + "name": "leg-creatures", + "system": "sohl", + "path": "packs/leg-creatures", + "private": false + }, + { + "label": "Characteristics", + "type": "Item", + "name": "leg-characteristics", + "system": "sohl", + "path": "packs/leg-characteristics", + "private": false + }, + { + "label": "Mysteries", + "type": "Item", + "name": "leg-mysteries", + "system": "sohl", + "path": "packs/leg-mysteries", + "private": false + }, + { + "label": "Possessions", + "type": "Item", + "name": "leg-possessions", + "system": "sohl", + "path": "packs/leg-possessions", + "private": false + } + ], + "socket": true, + "manifest": "https://www.dropbox.com/s/510urlhupyh0zkm/system.json?dl=1", + "download": "https://www.dropbox.com/s/4pzfv5koxwbr276/system.zip?dl=1", + "grid": { + "distance": 5, + "units": "ft" + }, + "primaryTokenAttribute": "health" +} diff --git a/template.json b/template.json new file mode 100644 index 0000000..d22bba9 --- /dev/null +++ b/template.json @@ -0,0 +1,40 @@ +{ + "Actor": { + "types": ["entity", "object"], + "htmlFields": ["description", "biography"] + }, + "Item": { + "types": [ + "armorgear", + "weapongear", + "miscgear", + "projectilegear", + "containergear", + "concoctiongear", + "mysticaldevice", + "skill", + "trait", + "affiliation", + "injury", + "affliction", + "anatomy", + "bodylocation", + "bodypart", + "bodyzone", + "domain", + "event", + "meleestrikemode", + "combattechniquestrikemode", + "missilestrikemode", + "combatmaneuver", + "mystery", + "mysticalability" + ], + "htmlFields": ["notes", "description", "textReference"] + }, + "ActiveEffect": { + "types": [ + "sohlactiveeffect" + ] + } +} diff --git a/templates/actor/actor-sheet.html b/templates/actor/actor-sheet.html new file mode 100644 index 0000000..7fd2a72 --- /dev/null +++ b/templates/actor/actor-sheet.html @@ -0,0 +1,1390 @@ +{{#if printable}} + + + + +
    + + + {{!-- Sheet Body --}} + + +{{/unless}} diff --git a/templates/chat/attack-card.html b/templates/chat/attack-card.html new file mode 100644 index 0000000..6521f1e --- /dev/null +++ b/templates/chat/attack-card.html @@ -0,0 +1,162 @@ +
    +
    +

    {{title}}

    +

    {{attacker}} vs. {{defender}}

    +
    + + {{#if notes}} +
    + {{notes}} +
    + {{/if}} {{#if isMissile}} +
    + Missile: + {{missile}} +
    + + {{#if projectile}} +
    + Projectile: + {{projectile}} +
    + {{/if}} {{/if}} + +
    +
    + Zone Die + Offset: + d{{zoneDie}} + {{zoneOffset}} +
    +
    + +
    + +
    +
    + Adjustment + Value +
    + {{#each impactMods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    + +
    +
    + Distance{{#if isMissile}} (range){{/if}}: + {{distance}}ft{{#if isMissile}} ({{range}}){{/if}} +
    + +
    + Impact: + {{impactLabel}} +
    +
    + +
    + +
    +
    + Adjustment + Value +
    + {{#each attackMods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    + +
    + Effective AML: + {{baseML}} {{amSign}} {{attackModAbs}} = + {{effAML}} +
    + + {{#if successLevelMod}} +
    + Success Level Modifier: + {{successLevelMod}} +
    + {{/if}} {{#if (or hasDodge hasCounterstrike hasBlock hasIgnore)}} +
    +
    + {{#if hasDodge}} + + {{/if}} {{#if hasCounterstrike}} + + {{/if}} {{#if hasBlock}} + + {{/if}} {{#if hasIgnore}} + + {{/if}} +
    +
    + {{/if}} +
    diff --git a/templates/chat/attack-result-card.html b/templates/chat/attack-result-card.html new file mode 100644 index 0000000..100aa91 --- /dev/null +++ b/templates/chat/attack-result-card.html @@ -0,0 +1,244 @@ +
    +
    +

    {{title}}

    +

    {{attacker}} vs. {{defender}}

    +
    + + {{#if notes}} +
    + {{notes}} +
    + {{/if}} {{#if outnumbered}} +
    + Outnumbered {{outnumbered}}:1 +
    + {{/if}} + +
    + Attacker +
    +
    +
    + Adjustment + Value +
    + {{#each attackMods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    +
    + + {{#if defendMods.length}} +
    + Defender +
    +
    +
    + Adjustment + Value +
    + {{#each defendMods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    +
    + {{/if}} + +
    + Attack + Defend + {{attackWeapon}} + {{#if defense}}{{defense}}{{else}}—{{/if}} + Eff. AML: {{effAML}} + {{#if effDML}}Eff. DML: {{effDML}}{{else}}—{{/if}} + Roll: {{attackRoll}} + {{#if defenseRoll}}Roll: + {{defenseRoll}}{{else}}—{{/if}} + {{#if atkIsSuccess}} + {{atkRollResult}} + {{else}} + {{atkRollResult}} + {{/if}} {{#if defenseRoll}} {{#if defIsSuccess}} + {{defRollResult}} + {{else}} + {{defRollResult}} + {{/if}} {{else}} + + {{/if}} +
    + +
    + Victory Stars: + {{#if vsText}}{{vsText}}{{else}}None{{/if}} +
    + +
    + {{resultDesc}} +
    + + {{#if numAtkTA}} +
    + Attacker TAs: + {{numAtkTA}} +
    + {{/if}} {{#if numDefTA}} +
    + Defender TAs: + {{numDefTA}} +
    + {{/if}} {{#if atkWeaponBroke}} +
    + {{attacker}}'s {{attackWeapon}} broke! +
    + {{/if}} {{#if defWeaponBroke}} +
    + {{defender}}'s {{defendWeapon}} broke! +
    + {{/if}} {{#if hasAttackHit}} +
    + Attack Impact: + {{impactFormula}} +
    + {{/if}} {{#if isAtkFumbleTest}} +
    + {{attacker}} must make Fumble test! +
    + {{/if}} {{#if isDefFumbleTest}} +
    + {{defender}} must make Fumble test! +
    + {{/if}} {{#if isAtkStumbleTest}} +
    + {{attacker}} must make Stumble test! +
    + {{/if}} {{#if isDefStumbleTest}} +
    + {{defender}} must make Stumble test! +
    + {{/if}} {{#if nextSuccessLevelMod}} +
    + {{attacker}} may increase by {{nextSuccessLevelMod}}
    + success level(s) a test made within the
    + next round
    +
    + {{/if}} {{#if (or atkImpactJson defImpactJson numAtkTA numDefTA + isAtkStumbleTest isDefStumbleTest isAtkFumbleTest isDefFumbleTest)}} +
    + {{#if isAtkStumbleTest}} + + {{/if}} {{#if isDefStumbleTest}} + + {{/if}} {{#if isAtkFumbleTest}} + + {{/if}} {{#if isDefFumbleTest}} + + {{/if}} {{#if atkImpactJson}} + + {{/if}} {{#if defImpactJson}} + + {{/if}} {{#if numAtkTA}} + + {{/if}} {{#if numDefTA}} + + {{/if}} +
    + {{/if}} +
    diff --git a/templates/chat/damage-card.html b/templates/chat/damage-card.html new file mode 100644 index 0000000..8740165 --- /dev/null +++ b/templates/chat/damage-card.html @@ -0,0 +1,95 @@ +
    +
    +

    {{title}}

    +
    + + {{#if notes}} +
    + {{notes}} +
    + {{/if}} + +
    + Impact Modifier +
    +
    +
    + Adjustment + Value +
    + {{#each impact.mods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    +
    + +
    +
    +
    + Formula: + {{impactFormula}} +
    +
    + +
    +
    + Roll: + {{rolledResult}} = {{rolledTotal}} +
    +
    +
    + + {{#if isBlunt}} +
    + Missile is blunted, so actual damage will be halved. +
    + {{/if}} + +
    +
    + Final Impact: + {{totalImpact}} +
    +
    + + {{#if impact.armorReduction.effective}} +
    + Armor Reduction +
    {{genModHtml impact.mods}}
    + +
    +
    + Armor Reduction: + {{impact.armorReduction.effective}} +
    +
    +
    + {{/if}} + +
    + {{#if (and targetToken totalImpact)}} + + {{/if}} +
    +
    diff --git a/templates/chat/fate-roll-card.html b/templates/chat/fate-roll-card.html new file mode 100644 index 0000000..e0739e7 --- /dev/null +++ b/templates/chat/fate-roll-card.html @@ -0,0 +1,81 @@ +
    +
    +

    {{title}}

    +
    + +
    +
    +
    + Adjustment + Value +
    + {{#each mods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    + +
    + Target: + {{effTarget}} +
    + +
    + Roll: + {{#if isSuccess}} + {{#if showResult}}{{rollResult}} = {{/if}}{{rollValue}} + {{else}} + {{#if showResult}}{{rollResult}} = {{/if}}{{rollValue}} + {{/if}} +
    + +
    + +
    + {{#if isSuccess}} {{#if isCritical}} + +1 success level to Fated Test and
    + no FP loss, or +2 success level to
    + Fated Test and loss of one FP.
    + {{else}} + +1 success level to Fated Test and
    + character loses one FP.
    + {{/if}} {{else}} {{#if isCritical}} + No effect and character loses one FP. + {{else}} + No effect. + {{/if}} {{/if}} +
    + + {{#if isSuccess}} {{#if isCritical}} +
    + {{description}} +
    + {{else}} +
    + {{description}} +
    + {{/if}} {{else}} {{#if isCritical}} +
    + {{description}} +
    + {{else}} +
    + {{description}} +
    + {{/if}} {{/if}} +
    diff --git a/templates/chat/injury-card.html b/templates/chat/injury-card.html new file mode 100644 index 0000000..56a2d21 --- /dev/null +++ b/templates/chat/injury-card.html @@ -0,0 +1,157 @@ +
    +
    +

    {{bodyZoneName}} Injury

    +

    {{name}}

    +
    + + {{#unless isRandom}} +
    + Location Not Random! +
    + {{/unless}} + +
    +
    + Zone Die Formula: + {{zoneDieFormula}} +
    +
    + +
    +
    + Zone: + {{#if outsideZone}} + None ({{zoneNum}}) + {{else}} + {{bodyZoneName}} ({{zoneNum}}) + {{/if}} +
    + {{#if outsideZone}} +
    + Hit outside allowed zones
    Max zone {{maxZones}}, hit zone + {{zoneNum}}
    No effect
    +
    + {{/if}} +
    + + {{#unless outsideZone}} +
    +
    + Body Part: + {{bodyPartName}} +
    +
    + {{/unless}} + +
    +
    + Aspect: + {{aspect}} +
    +
    + + {{#if armorReduction}} +
    +
    + Armor Reduction: + {{armorReduction}} + Armor value has been reduced by
    Armor Reduction + value
    +
    +
    + {{/if}} + +
    +
    + Armor Layers (prot): + {{armorType}} ({{armorValue}}) +
    +
    + +
    +
    + Impact: + {{impactVal}} +
    +
    + + {{#if isGlancingBlow}} +
    +
    + Rigid armor minimizes impact.
    Glancing Blow!
    +
    +
    + {{/if}} {{#unless isInjured}} +
    +
    + Injury Level: + No Injury +
    +
    + {{else}} +
    +
    + Injury Level: + {{injuryLevelText}} +
    +
    + +
    +
    + Shock Index: + {{shockIndex}} +
    +
    + {{#if (gt shockIndex 4)}} + Make a Shock roll! + {{else}} + Shock roll not needed + {{/if}} +
    +
    + + {{#if isBleeder}} +
    + NOTE: Injury is a bleeder +
    + {{/if}} {{#if isFumble}} +
    + Grevious Mishap: Fumbles +
    + {{/if}} {{#if isStumble}} +
    + Grevious Mishap: Stumbles +
    + {{/if}} {{#if isAmputate}} +
    + NOTE: Perform Strength test
    + {{#if amputatePenalty}} with a -{{amputatePenalty}} penalty
    + {{/if}} to determine if limb is amputated
    + (you will have to make this roll manually).
    +
    + {{/if}} {{#if addToCharSheet}} +
    + Injury recorded on character sheet +
    + {{/if}} + +
    + {{#if (gt shockIndex 4)}} + + {{/if}} +
    + {{/unless}} +
    diff --git a/templates/chat/item-desc-card.html b/templates/chat/item-desc-card.html new file mode 100644 index 0000000..fbf99fa --- /dev/null +++ b/templates/chat/item-desc-card.html @@ -0,0 +1,26 @@ +
    +
    +

    {{name}}

    +

    {{subtitle}}

    +
    + + {{#if notes}} +
    + Notes: + {{notes}} +
    + {{/if}} + {{#if textRef}} +
    + Text Ref: + {{textRef}} +
    + {{/if}} + {{#if charges}} +
    + Charges: + {{charges}} +
    + {{/if}} +
    {{{desc}}}
    +
    diff --git a/templates/chat/missile-damage-card.html b/templates/chat/missile-damage-card.html new file mode 100644 index 0000000..604b6e2 --- /dev/null +++ b/templates/chat/missile-damage-card.html @@ -0,0 +1,49 @@ +
    +
    +

    {{title}}

    +
    + + {{#if notes}} +
    + {{notes}} +
    + {{/if}} + +
    + Num. Damage Dice: + {{damageDice}} +
    + +
    + Aspect: + {{aspect}} +
    + +
    + Range (+ Impact): + {{range}} ({{rangeImpact}}) +
    + + {{#if (ne addlImpact 0)}} +
    + Additional Damage: + {{addlImpact}} +
    + +
    + Impact (Range + Addl + Roll): + {{rangeImpact}} + {{addlImpact}} + {{rollValue}} = + {{totalImpact}} +
    + {{else}} +
    + Impact (Range + Roll): + {{rangeImpact}} + {{rollValue}} = + {{totalImpact}} +
    + {{/if}} +
    diff --git a/templates/chat/opposed-request-card.html b/templates/chat/opposed-request-card.html new file mode 100644 index 0000000..e64cbfa --- /dev/null +++ b/templates/chat/opposed-request-card.html @@ -0,0 +1,34 @@ +
    +
    +

    Opposed Test Offer

    +

    {{sourceToken.name}} vs. {{targetToken.name}}

    +
    + +
    + Source: + {{sourceToken.name}} +
    +
    + Test: + {{testItem.name}} +
    +
    + Target: + {{targetToken.name}} +
    +
    + Target must now choose + a test to respond with +
    +
    + +
    +
    diff --git a/templates/chat/opposed-result-card.html b/templates/chat/opposed-result-card.html new file mode 100644 index 0000000..06cccee --- /dev/null +++ b/templates/chat/opposed-result-card.html @@ -0,0 +1,101 @@ +
    +
    +

    Opposed Action Result

    +

    {{atkToken.name}} vs. {{defToken.name}}

    +
    + +
    + {{atkToken.name}} +
    + {{{prevAtkResult.mlMod.chatHtml}}} +
    +
    + +
    + {{defToken.name}} +
    + {{{prevDefResult.mlMod.chatHtml}}} +
    +
    + +
    + {{defToken.name}} Success Level Mod: + {{prevDefResult.successLevelMod}} +
    + +
    + Attack + Defend + {{atkToken.name}} + {{defToken.name}} + {{atkItem.name}} + {{defItem.name}} + EML: {{prevAtkResult.effTarget}} + EML: {{prevDefResult.effTarget}} + Roll: {{prevAtkResult.rollTotal}} + Roll: {{prevDefResult.rollTotal}} + {{prevAtkResult.description}} + {{prevDefResult.description}} +
    + +
    + {{#if (vsIsTied)}} + Opposed Roll is a Tie! + {{else}} + {{#if atkVictory}} + {{atkToken.name}} Wins! + {{else}} {{#if defVictory}} + {{defToken.name}} Wins! + {{/if}} {{/if}} + {{/if}} +
    + +
    + {{#if (not (or atkVictory defVictory vsIsTied))}} + Both Fail! + {{else}} {{#if (or atkVictory defVictory)}} + Victory Stars: {{vsText}} + {{/if}} {{/if}} +
    + + {{#if (or prevAtkResult.askFate prevDefResult.askFate)}} +
    + {{#if prevAtkResult.askFate}} + + {{/if}} + {{#if prevAtkResult.askFate}} + + {{/if}} +
    + {{/if}} +
    diff --git a/templates/chat/shock-card.html b/templates/chat/shock-card.html new file mode 100644 index 0000000..77f4da1 --- /dev/null +++ b/templates/chat/shock-card.html @@ -0,0 +1,85 @@ +
    +
    +

    {{title}}

    +
    + + {{#if (gt shockTestMod 0)}} +
    +
    + Target: + {{origShockML}} +
    + +
    + Modifier: + {{stPlusMinus}}{{shockTestMod}} +
    +
    + +
    + Shock Test Eff Target: + {{origShockML}} {{stPlusMinus}} {{shockTestMod}} = + {{shockML}} +
    + {{else}} +
    + Target: + {{shockML}} +
    + {{/if}} {{#if successLevelMod}} +
    + Success Level Modifier: + {{successLevelMod}} +
    + {{/if}} + +
    + Roll: + {{stRollValue}} +
    + + {{#if origShockIndex}} +
    + Shock Index: + {{origShockIndex}} {{siPlusMinus}} {{shockRollMod}} = + {{finalShockIndex}} +
    + {{/if}} {{#if shockText}} {{#if shockUpgradeText}} +
    + {{shockUpgradeText}} +
    + {{/if}} + +
    + Shock State: + {{shockText}} +
    + +
    + NOTE: Shock state must be manually modified. +
    + {{/if}} {{#if isSuccess}} {{#if isCritical}} +
    + {{description}} +
    + {{else}} +
    + {{description}} +
    + {{/if}} {{else}} {{#if isCritical}} +
    + {{description}} +
    + {{else}} +
    + {{description}} +
    + {{/if}} {{/if}} +
    diff --git a/templates/chat/skillvalue-result-card.html b/templates/chat/skillvalue-result-card.html new file mode 100644 index 0000000..b2c8215 --- /dev/null +++ b/templates/chat/skillvalue-result-card.html @@ -0,0 +1,21 @@ +
    +
    +

    {{title}}

    +
    + +
    + Skill Value: + {{skillValue}} +
    + + {{#if victoryStars}} +
    + Victory Stars: + {{victoryStarsText}} +
    + {{/if}} {{#if isCritFail}} +
    + NOTE: Critical Failure +
    + {{/if}} +
    diff --git a/templates/chat/standard-test-card.html b/templates/chat/standard-test-card.html new file mode 100644 index 0000000..16bcb93 --- /dev/null +++ b/templates/chat/standard-test-card.html @@ -0,0 +1,103 @@ +
    +
    +

    {{title}}

    + {{#if isOpposedTest}} +

    {{initTokenName}} vs. {{targetTokenName}}

    + {{/if}} +
    + + {{#if modHtml}} +
    + {{{modHtml}}} +
    + {{/if}} + +
    + Target: + {{effTarget}} +
    + + {{#if successLevelMod}} +
    + Success Level Modifier: + {{successLevelMod}} +
    + {{/if}} + + {{#unless isOpposedTest}} +
    + Roll: + {{rollTotal}} +
    + {{/unless}} + + + {{#if isSuccessValue}} +
    + Success Value: + {{successValueExpr}} = {{successValue}} +
    + {{/if}} + + {{#if resultText}} +
    + Result: + {{resultText}} +
    + + {{#if resultDesc}} +
    + {{resultDesc}} +
    + {{/if}} + {{/if}} + {{#if testResult.askFate}} +
    + +
    + {{/if}} + + {{#if isSuccess}} + {{#if isCritical}} +
    + {{description}} +
    + {{else}} +
    + {{description}} +
    + {{/if}} + {{else}} + {{#if isCritical}} +
    + {{description}} +
    + {{else}} +
    + {{description}} +
    + {{/if}} + {{/if}} +
    diff --git a/templates/chat/timer-expired-card.html b/templates/chat/timer-expired-card.html new file mode 100644 index 0000000..25c00d6 --- /dev/null +++ b/templates/chat/timer-expired-card.html @@ -0,0 +1,20 @@ +
    +
    +

    {{title}}

    +

    {{subtitle}}

    +
    + +
    + Time Expired: + {{timeExpiredText}} + {{#if worldTimeExpiredText}} + {{worldTimeExpiredText}} + {{/if}} +
    + + {{#if message}} +
    + {{message}} +
    + {{/if}} +
    diff --git a/templates/chat/treatment-result-card.html b/templates/chat/treatment-result-card.html new file mode 100644 index 0000000..a89a181 --- /dev/null +++ b/templates/chat/treatment-result-card.html @@ -0,0 +1,48 @@ +
    +
    +

    Treatment Result

    +
    + +
    +
    + Aspect: + {{aspect}} +
    + +
    + Severity: + {{severity}} +
    +
    + +
    + Treatment: + {{treatment}} +
    + +
    + Heal Rate: + {{#if (lt hr 0)}}Healed{{else}}H{{hr}}{{/if}} +
    + + {{#if infect}} +
    + NOTE: Infection risk. +
    + {{/if}} {{#if impair}} +
    + NOTE: Permanent impairment risk. +
    + {{/if}} {{#if bleed}} +
    + Treatment results in a bleeder. +
    + {{/if}} {{#if (gt newInj 0)}} +
    + Amputation results in a new {{newSev}}{{newInj}} edged + injury. +
    + {{/if}} +
    diff --git a/templates/chat/weapon-break-card.html b/templates/chat/weapon-break-card.html new file mode 100644 index 0000000..19c37cc --- /dev/null +++ b/templates/chat/weapon-break-card.html @@ -0,0 +1,25 @@ +
    +
    +

    {{title}}

    +

    {{tokenName}}'s {{weaponName}}

    +
    + +
    +
    +
    + Weapon Quality / Roll: + {{quality}} / {{rollValue}} +
    +
    +
    + + {{#if weaponBroke}} +
    + {{tokenName}}'s {{weaponName}} broke! +
    + {{else}} +
    + {{tokenName}}'s {{weaponName}} OK +
    + {{/if}} +
    diff --git a/templates/dialog/active-effect-start.html b/templates/dialog/active-effect-start.html new file mode 100644 index 0000000..a6d29cb --- /dev/null +++ b/templates/dialog/active-effect-start.html @@ -0,0 +1,103 @@ +
    +

    Effect Start

    + +
    +
    + + {{displayWorldTime startTime}} +
    + + {{#if combatId}} +
    + + Round {{combatRound}}, Turn {{combatTurn}} +
    + {{/if}} +
    + +
    + +
    + {{textInput effectName name="effectName" required=true}} +
    +
    + +
    +
    + +
    + +
    +
    + +
    + +
    + {{textInput targetName name="targetName"}} +
    +
    +
    + + +
    + +
    + {{radioBoxes "startType" startChoices checked=startType}} +
    +
    + +
    + World Time +
    +
    + + Change +
    + {{displayWorldTime startTime}} +
    +
    + +
    + {{numberInput duration name="duration" required=true}} +
    +
    +
    + {{else}} +
    + Combat Time +
    +
    + +
    + {{numberInput combatRound name="combatRound" required=true}} +
    +
    +
    + +
    + {{numberInput combatTurn name="combatTurn" required=true}} +
    +
    +
    +
    +
    + +
    + {{numberInput durationRounds name="durationRounds" required=true}} +
    +
    +
    + +
    + {{numberInput durationTurns name="durationTurns" required=true}} +
    +
    +
    +
    + {{/if}} + +
    diff --git a/templates/dialog/attack-dialog.html b/templates/dialog/attack-dialog.html new file mode 100644 index 0000000..c134e57 --- /dev/null +++ b/templates/dialog/attack-dialog.html @@ -0,0 +1,112 @@ +
    +
    + + {{distance}} ft. +
    + + {{#if isMissile}} +
    + + +
    + +
    + + +
    + {{else}} + + {{/if}} + +
    + + +
    + +
    + + +
    + +
    + Attack Modifiers +
    +
    +
    + Adjustment + Value +
    + {{#each attackMods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    + +
    + + +
    + +
    + + +
    +
    + +
    + Impact Modifiers +
    + Impact: + {{impactLabel}} +
    + +
    +
    +
    + Adjustment + Value +
    + {{#each impactMods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    + +
    + + +
    +
    +
    diff --git a/templates/dialog/container-size.html b/templates/dialog/container-size.html new file mode 100644 index 0000000..9e217a0 --- /dev/null +++ b/templates/dialog/container-size.html @@ -0,0 +1,6 @@ +
    +
    + + +
    +
    diff --git a/templates/dialog/create-item.html b/templates/dialog/create-item.html new file mode 100644 index 0000000..27a1109 --- /dev/null +++ b/templates/dialog/create-item.html @@ -0,0 +1,47 @@ +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + + {{#if hasFolders}} +
    + +
    + +
    +
    + {{/if}} + +
    + + +
    +
    diff --git a/templates/dialog/damage-dialog.html b/templates/dialog/damage-dialog.html new file mode 100644 index 0000000..4f0163c --- /dev/null +++ b/templates/dialog/damage-dialog.html @@ -0,0 +1,120 @@ +
    + {{#if askImpact}} +
    + Impact +
    +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    + {{else}} +
    + + {{impactFormula}} +
    + +
    + Impact Modifiers +
    +
    +
    + Adjustment + Value +
    + {{#each impact.mods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    +
    + {{/if}} + +
    + + +
    + +
    + + +
    + +
    + + +
    + + {{#if impact.armorReduction.effective}} +
    + Armor Reduction Modifiers +
    +
    +
    + Adjustment + Value +
    + {{#each impact.armorReduction.mods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    +
    + {{/if}} + +
    + + +
    +
    diff --git a/templates/dialog/embedded-item-dialog.html b/templates/dialog/embedded-item-dialog.html new file mode 100644 index 0000000..1967168 --- /dev/null +++ b/templates/dialog/embedded-item-dialog.html @@ -0,0 +1,21 @@ +
    +
    + + +
    + {{#if typeChoices}} +
    + + +
    + {{else}} + + {{/if}} +
    diff --git a/templates/dialog/injury-dialog.html b/templates/dialog/injury-dialog.html new file mode 100644 index 0000000..ce1c229 --- /dev/null +++ b/templates/dialog/injury-dialog.html @@ -0,0 +1,121 @@ +
    +
    + + +
    + + {{#if zoneDieFormula}} +
    + + {{zoneDieFormula}} +
    + {{else}} +
    + Zone +
    +
    + + +
    + +
    + + {{numberInput zoneOffset name="zoneOffset" step="1"}} +
    +
    +
    + {{/if}} + +
    +
    + + {{#if aspect}} + {{aspect}} + + {{else}} + + {{/if}} +
    + +
    + + {{#if impactVal}} + {{impactVal}} + + {{else}} + + {{/if}} +
    + +
    + + +
    + +
    + + +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + + {{#if askRecordInjury}} +
    + + +
    + {{/if}} +
    diff --git a/templates/dialog/keyvalue-dialog.html b/templates/dialog/keyvalue-dialog.html new file mode 100644 index 0000000..0daafa5 --- /dev/null +++ b/templates/dialog/keyvalue-dialog.html @@ -0,0 +1,10 @@ +
    +
    + + {{textInput newKey name="newKey"}} +
    +
    + + {{textInput newValue name="newValue"}} +
    +
    diff --git a/templates/dialog/macro-config.html b/templates/dialog/macro-config.html new file mode 100644 index 0000000..32c92a9 --- /dev/null +++ b/templates/dialog/macro-config.html @@ -0,0 +1,94 @@ +
    +
    + +

    + +

    +
    + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    +
    + {{!-- Script Tab --}} +
    +
    +
    + + +
    + + {{#unless flags.sohl.isIntrinsicAction}} +
    + + +
    + {{/unless}} +
    + +
    + + +
    + + {{#unless flags.sohl.isIntrinsicAction}} +
    + + +
    + {{/unless}} +
    + +
    +
    + {{#if flags.sohl.isIntrinsicAction}} +
    + + {{textInput data.functionName name="flags.sohl.functionName"}} +
    + {{/if}} + +
    + + {{textInput flags.sohl.contextIconClass name="flags.sohl.contextIconClass"}} +
    + +
    + + +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    diff --git a/templates/dialog/missile-damage-dialog.html b/templates/dialog/missile-damage-dialog.html new file mode 100644 index 0000000..31239d1 --- /dev/null +++ b/templates/dialog/missile-damage-dialog.html @@ -0,0 +1,21 @@ +
    +
    +

    Missile Name: {{name}}

    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    diff --git a/templates/dialog/opposed-response-dialog.html b/templates/dialog/opposed-response-dialog.html new file mode 100644 index 0000000..408d687 --- /dev/null +++ b/templates/dialog/opposed-response-dialog.html @@ -0,0 +1,47 @@ +
    +

    {{prompt}}

    + +
    + + +
    + +
    +
    +
    + Adjustment + Value +
    + {{#each mods}} +
    + {{this.name}} + {{numberFormat this.value sign=true}} +
    + {{/each}} +
    +
    + +
    + + +
    + +
    + + +
    +
    diff --git a/templates/dialog/query-injuries-dialog.html b/templates/dialog/query-injuries-dialog.html new file mode 100644 index 0000000..af46fde --- /dev/null +++ b/templates/dialog/query-injuries-dialog.html @@ -0,0 +1,10 @@ +
    +
    + + +
    +
    diff --git a/templates/dialog/query-tactical-advantage-dialog.html b/templates/dialog/query-tactical-advantage-dialog.html new file mode 100644 index 0000000..24e9794 --- /dev/null +++ b/templates/dialog/query-tactical-advantage-dialog.html @@ -0,0 +1,14 @@ +
    +

    {{prompt}}

    + + {{#each taList as |idx|}} +
    + + +
    + {{/each}} +
    diff --git a/templates/dialog/query-weapon-dialog.html b/templates/dialog/query-weapon-dialog.html new file mode 100644 index 0000000..a219a5d --- /dev/null +++ b/templates/dialog/query-weapon-dialog.html @@ -0,0 +1,12 @@ +
    +

    {{prompt}}

    + +
    + + +
    +
    diff --git a/templates/dialog/shock-test-dialog.html b/templates/dialog/shock-test-dialog.html new file mode 100644 index 0000000..f7a5dcd --- /dev/null +++ b/templates/dialog/shock-test-dialog.html @@ -0,0 +1,45 @@ +
    +
    + + +
    +
    + + +
    + {{#if mods}} +
    +
    +
    + Adjustment + Value +
    + {{#each mods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    + {{/if}} +
    + + +
    +
    + + +
    +
    diff --git a/templates/dialog/standard-test-dialog.html b/templates/dialog/standard-test-dialog.html new file mode 100644 index 0000000..2a11f6a --- /dev/null +++ b/templates/dialog/standard-test-dialog.html @@ -0,0 +1,37 @@ +
    +
    + + +
    + + {{#if mods}} +
    +
    +
    + Adjustment + Value +
    + {{#each mods}} +
    + {{this.name}} + {{#if (gt this.value 0)}}+{{/if}}{{this.value}} +
    + {{/each}} +
    +
    + {{/if}} + +
    + + +
    +
    + + +
    +
    diff --git a/templates/dialog/strike-mode-dialog.html b/templates/dialog/strike-mode-dialog.html new file mode 100644 index 0000000..d819613 --- /dev/null +++ b/templates/dialog/strike-mode-dialog.html @@ -0,0 +1,104 @@ +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + Missile Properties +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + Impact +
    +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    +
    diff --git a/templates/dialog/time-dialog.html b/templates/dialog/time-dialog.html new file mode 100644 index 0000000..39960eb --- /dev/null +++ b/templates/dialog/time-dialog.html @@ -0,0 +1,42 @@ +
    +
    + + {{displayWorldTime setTime}} +
    + +
    + + +
    + +
    + + +
    + +
    + Time Setting +
    +
    + + {{numberInput days name="days" step=1 min=0}} +
    +
    + + {{numberInput hours name="hours" step=1 min=0}} +
    +
    + + {{numberInput mins name="mins" step=1 min=0}} +
    +
    + + {{numberInput secs name="secs" step=1 min=0}} +
    +
    +
    +
    diff --git a/templates/dialog/welcome.html b/templates/dialog/welcome.html new file mode 100644 index 0000000..476818c --- /dev/null +++ b/templates/dialog/welcome.html @@ -0,0 +1,13 @@ +
    +

    Welcome to Song of Heroic Lands for Foundry VTT

    +

    + This system assists players and GMs in playing Song of Heroic Lands + as well as other compatible RPG systems by + taking over much of the bookkeeping and mundane tasks, and speeding up + the flow of combat through automation. +

    +
    + + +
    +
    diff --git a/templates/effect/active-effect-config.html b/templates/effect/active-effect-config.html new file mode 100644 index 0000000..05e8aa1 --- /dev/null +++ b/templates/effect/active-effect-config.html @@ -0,0 +1,153 @@ +
    + + +
    + +

    + +

    +
    + + + + + +
    +
    + +
    + +
    +
    + +
    + + {{editor descriptionHTML target="description" button=false editable=editable engine="prosemirror" collaborate=false}} +
    + +
    + + +
    + + {{#if isActorEffect}} +
    + +
    + +
    +
    + {{/if}} + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + {{#each statuses as |status|}} + + {{/each}} + +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + + + + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + + + + +
    +
    +
    + + +
    +
    +
    {{ localize "EFFECT.ChangeKey" }}
    +
    {{ localize "EFFECT.ChangeMode" }}
    +
    {{ localize "EFFECT.ChangeValue" }}
    +
    + +
    +
    +
      + {{#each data.changes as |change i|}} +
    1. +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
    2. + {{/each}} +
    +
    + +
    + +
    +
    diff --git a/templates/item/affiliation-sheet.html b/templates/item/affiliation-sheet.html new file mode 100644 index 0000000..ab3acaf --- /dev/null +++ b/templates/item/affiliation-sheet.html @@ -0,0 +1,53 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{formField fields.society rootId="aff-soc" classes="text-field" stacked=true value=system.society}} + {{formField fields.office rootId="aff-off" classes="text-field" stacked=true value=system.office}} + {{formField fields.title rootId="aff-title" classes="text-field" stacked=true value=system.title}} + {{formField fields.level rootId="aff-lvl" classes="text-field" stacked=true value=system.level}} +
    +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/affliction-sheet.html b/templates/item/affliction-sheet.html new file mode 100644 index 0000000..4ffb01c --- /dev/null +++ b/templates/item/affliction-sheet.html @@ -0,0 +1,58 @@ +
    + {{> "sohl.item-header"}} + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{formField fields.levelBase rootId="ail-level" classes="text-field" stacked=true value=system.levelBase}} + {{formField fields.healingRateBase rootId="ail-hr" classes="text-field" stacked=true value=system.healingRateBase}} + {{formField fields.diagnosisBonusBase rootId="ail-level" classes="text-field" stacked=true value=system.diagnosisBonusBase}} + {{formField fields.isDormant rootId="ail-dormt" classes="text-field" stacked=true value=system.isDormant}} + {{formField fields.isTreated rootId="ail-cont" classes="text-field" stacked=true value=system.isTreated}} + {{formField fields.sourceUuid rootId="afl-suuid" classes="text-field" stacked=true value=system.sourceUuid}} + {{formField fields.contagionIndexBase rootId="ail-contidx" classes="text-field" stacked=true value=system.contagionIndexBase}} + {{formField fields.transmission rootId="ail-trx" classes="text-field" stacked=true value=system.transmission}} +
    + + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/anatomy-sheet.html b/templates/item/anatomy-sheet.html new file mode 100644 index 0000000..0aebd9b --- /dev/null +++ b/templates/item/anatomy-sheet.html @@ -0,0 +1,52 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{formField fields.defaultAim rootId="ana-aim" classes="text-field" stacked=true value=system.defaultAim}} +
    + + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/armorgear-sheet.html b/templates/item/armorgear-sheet.html new file mode 100644 index 0000000..2d8d47a --- /dev/null +++ b/templates/item/armorgear-sheet.html @@ -0,0 +1,116 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{> "sohl.item-gear"}} + {{formField fields.material rootId="arm-mat" classes="text-field" stacked=true value=system.material}} + {{formField fields.abbrev rootId="ail-abbr" classes="text-field" stacked=true value=system.abbrev}} +
    + +
    + {{numberInput flags.sohl.legendary.encumbrance name="flags.sohl.legendary.encumbrance" step=0.01 min=0}} +
    +
    +
    +
    + Protection +
    + {{formField fields.protectionBase.fields.blunt rootId="arm-prot-b" classes="text-field" stacked=true value=system.protectionBase.blunt}} + {{formField fields.protectionBase.fields.edged rootId="arm-prot-e" classes="text-field" stacked=true value=system.protectionBase.edged}} + {{formField fields.protectionBase.fields.piercing rootId="arm-prot-p" classes="text-field" stacked=true value=system.protectionBase.piercing}} + {{formField fields.protectionBase.fields.fire rootId="arm-prot-f" classes="text-field" stacked=true value=system.protectionBase.fire}} +
    +
    +
    + Body Armor Locations + +
      + {{#each idata.locations.flexible}} +
    1. + {{this}} + +
    2. + {{/each}} +
    + +
      + {{#each idata.locations.rigid}} +
    1. + {{this}} + +
    2. + {{/each}} +
    +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/bodylocation-sheet.html b/templates/item/bodylocation-sheet.html new file mode 100644 index 0000000..504d3a1 --- /dev/null +++ b/templates/item/bodylocation-sheet.html @@ -0,0 +1,121 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    +
    +
    + Basic Armor Settings +
    + {{formField fields.abbrev rootId="bodyloc-abbrev" classes="text-field" hint="" stacked=true value=system.abbrev}} + {{formField fields.layers rootId="bodyloc-layers" classes="text-field" hint="" stacked=true value=system.layers}} +
    +
    + {{formField fields.armorBase.fields.blunt rootId="arm-prot-b" + classes="text-field" stacked=true value=system.armorBase.blunt}} + {{formField fields.armorBase.fields.edged rootId="arm-prot-e" + classes="text-field" stacked=true value=system.armorBase.edged}} + {{formField fields.armorBase.fields.piercing rootId="arm-prot-p" + classes="text-field" stacked=true value=system.armorBase.piercing}} + {{formField fields.armorBase.fields.fire rootId="arm-prot-f" + classes="text-field" stacked=true value=system.armorBase.fire}} +
    +
    +
    + Body Location Settings +
    +
    +
    + {{formInput fields.isStumble rootId="bodyloc-is-stumble" classes="form-fields" value=system.isStumble}} + +
    +
    + {{formInput fields.isFumble rootId="bodyloc-is-fumble" classes="form-fields" value=system.isFumble}} + +
    +
    + + +
    +
    + +
    + {{numberInput flags.sohl.legendary.amputatePenalty name="flags.sohl.legendary.amputatePenalty" step=1 min=0}} +
    +
    +
    + +
    + {{numberInput flags.sohl.legendary.bleedingSevThreshold name="flags.sohl.legendary.bleedingSevThreshold" step=1 min=0}} +
    +
    +
    + +
    + {{numberInput flags.sohl.legendary.shockValue name="flags.sohl.legendary.shockValue" step=1 min=0}} +
    +
    +
    +
    +
    +
    +
    +
    +

    Area Name

    +
    Ratio
    +
    + Add +
    +
    +
      + {{#each idata.aim}} +
    1. +
      {{name}}
      +
      {{probWeightBase}}:{{lookup (lookup ../item.embedItem.system.$aim name) "max"}}
      +
      + + +
      +
    2. + {{/each}} +
    +
    +
    + + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/bodypart-sheet.html b/templates/item/bodypart-sheet.html new file mode 100644 index 0000000..fcfa43f --- /dev/null +++ b/templates/item/bodypart-sheet.html @@ -0,0 +1,89 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{formField fields.abbrev rootId="bodypart-abbrev" classes="text-field" stacked=true value=system.abbrev}} + {{formField fields.healthBase rootId="bodypart-health" classes="text-field" stacked=true value=system.healthBase}} + {{formField fields.isSubordinate rootId="bodypart-subordinate" classes="text-field" stacked=true value=system.isSubordinate}} + {{formField fields.canHoldItem rootId="bodypart-canholditem" classes="text-field" stacked=true value=system.canHoldItem}} + {{#if (and system.canHoldItem hasActor)}} +
    + + +
    + {{/if}} +
    + +
    +
    +
    +

    Area Name

    +
    Ratio
    +
    + Add +
    +
    +
      + {{#each idata.aim}} +
    1. +
      {{name}}
      +
      {{probWeightBase}}:{{lookup (lookup ../item.embedItem.system.$aim name) "max"}}
      +
      + + +
      +
    2. + {{/each}} +
    +
    +
    + + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/bodyzone-sheet.html b/templates/item/bodyzone-sheet.html new file mode 100644 index 0000000..15562cb --- /dev/null +++ b/templates/item/bodyzone-sheet.html @@ -0,0 +1,130 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{formField fields.abbrev rootId="bodyzone-abbrev" classes="text-field" stacked=true value=system.abbrev}} +
    + + +
    +
    +
    + Zone Numbers + +
      + {{#each flags.sohl.legendary.zones}} +
    1. +

      {{this}}

      + +
    2. + {{/each}} +
    +
    +
    + Affected Attributes + +
      + {{#each flags.sohl.legendary.affectedAttributes}} +
    1. + {{this}} + +
    2. + {{/each}} +
    +
    +
    + Affected Skills + +
      + {{#each flags.sohl.legendary.affectedSkills}} +
    1. + {{this}} + +
    2. + {{/each}} +
    +
    + +
    +
    +
    +

    Area Name

    +
    Ratio
    +
    + Add +
    +
    +
      + {{#each item.system.$aim as | aim |}} +
    1. +
      {{aim.name}}
      +
      {{formatNumber aim.probWeight.pct decimals=2}}%
      +
      + + +
      +
    2. + {{/each}} +
    +
    +
    + + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/combattechniquestrikemode-sheet.html b/templates/item/combattechniquestrikemode-sheet.html new file mode 100644 index 0000000..9701da4 --- /dev/null +++ b/templates/item/combattechniquestrikemode-sheet.html @@ -0,0 +1,70 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    + {{#> "sohl.item-strikemode"}} +
    + +
    + {{#if combatSkills}} + + {{else}} + {{formInput fields.assocSkillName value=system.assocSkillName}} + {{/if}} +
    +

    +
    +
    + +
    + {{numberInput flags.sohl.legendary.reachBase name="flags.sohl.legendary.reachBase" step=1 min=0}} +
    +

    +
    + {{/ "sohl.item-strikemode"}} + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/concoctiongear-sheet.html b/templates/item/concoctiongear-sheet.html new file mode 100644 index 0000000..69de866 --- /dev/null +++ b/templates/item/concoctiongear-sheet.html @@ -0,0 +1,52 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{> "sohl.item-gear"}} + {{formField fields.potency rootId="conc-potency" classes="text-field" stacked=true value=system.potency}} + {{formField fields.strength rootId="conc-strength" classes="text-field" stacked=true value=system.strength}} +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/containergear-sheet.html b/templates/item/containergear-sheet.html new file mode 100644 index 0000000..b789da5 --- /dev/null +++ b/templates/item/containergear-sheet.html @@ -0,0 +1,58 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{> "sohl.item-gear"}} + {{formField fields.maxCapacityBase rootId="contgear-max" classes="text-field" stacked=true value=system.maxCapacityBase}} +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Contained Gear Tab --}} +
    + {{> "sohl.item-gear-list"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/domain-sheet.html b/templates/item/domain-sheet.html new file mode 100644 index 0000000..8fd9bce --- /dev/null +++ b/templates/item/domain-sheet.html @@ -0,0 +1,77 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{formField fields.categories rootId="dom-cat" classes="text-field" stacked=true value=system.categories}} + {{formField fields.abbrev rootId="dom-abbr" classes="text-field" stacked=true value=system.abbrev}} +
    + {{#if (setHas system.categories "divine")}} +
    + Divine Aspects + +
      + {{#each flags.sohl.aspects}} +
    1. + {{this}} + +
    2. + {{/each}} +
    +
    + {{/if}} + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/event-sheet.html b/templates/item/event-sheet.html new file mode 100644 index 0000000..7f26dfe --- /dev/null +++ b/templates/item/event-sheet.html @@ -0,0 +1,66 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{formField fields.tag rootId="event-tag" classes="text-field" stacked=true value=system.tag}} + {{formField fields.action rootId="event-action" classes="text-field" stacked=true value=system.action}} + {{formField fields.activation.fields.scope rootId="event-scope" classes="text-field" stacked=true value=system.activation.scope}} + {{formField fields.activation.fields.targetUuid rootId="event-targetuuid" classes="text-field" stacked=true value=system.activation.targetUuid}} + {{formField fields.activation.fields.duration rootId="event-duration" classes="text-field" stacked=true value=system.activation.duration}} + {{formField fields.activation.fields.oper rootId="event-oper" classes="text-field" stacked=true value=system.activation.oper}} + {{formField fields.activation.fields.autoStart rootId="event-autoStart" classes="text-field" stacked=true value=system.activation.autoStart}} +
    +
    +
    + + Change +
    + {{displayWorldTime system.activation.initTime}} +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/injury-sheet.html b/templates/item/injury-sheet.html new file mode 100644 index 0000000..ca3a4c4 --- /dev/null +++ b/templates/item/injury-sheet.html @@ -0,0 +1,73 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{formField fields.healingRateBase rootId="inj-hb" classes="text-field" stacked=true value=system.healingRateBase}} + {{formField fields.injuryLevelBase rootId="inj-il" classes="text-field" stacked=true value=system.injuryLevelBase}} + {{formField fields.aspect rootId="inj-asp" classes="text-field" stacked=true value=system.aspect}} +
    + {{formInput fields.isBleeding rootId="inj-is-bleeding" classes="form-fields" value=system.isBleeding}} + +
    +
    + {{formInput fields.isTreated rootId="inj-is-treated" classes="form-fields" value=system.isTreated}} + +
    +
    + +
    + {{#if hasActor}} + + {{else}} + {{formInput fields.bodyLocation rootId="inj-bodyloc" classes="text-field" stacked=true value=system.bodyLocation}} + {{/if}} +
    +
    +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/meleestrikemode-sheet.html b/templates/item/meleestrikemode-sheet.html new file mode 100644 index 0000000..00a031e --- /dev/null +++ b/templates/item/meleestrikemode-sheet.html @@ -0,0 +1,63 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    + {{#> "sohl.item-strikemode"}} +
    + +
    + {{#if combatSkills}} + + {{else}} + {{formInput fields.assocSkillName value=system.assocSkillName}} + {{/if}} +
    +

    +
    + {{/ "sohl.item-strikemode"}} + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/miscgear-sheet.html b/templates/item/miscgear-sheet.html new file mode 100644 index 0000000..3c0ad42 --- /dev/null +++ b/templates/item/miscgear-sheet.html @@ -0,0 +1,50 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{> "sohl.item-gear"}} +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/missilestrikemode-sheet.html b/templates/item/missilestrikemode-sheet.html new file mode 100644 index 0000000..bbbec33 --- /dev/null +++ b/templates/item/missilestrikemode-sheet.html @@ -0,0 +1,71 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    + {{#> "sohl.item-strikemode"}} +
    + +
    + {{#if combatSkills}} + + {{else}} + {{formInput fields.assocSkillName value=system.assocSkillName}} + {{/if}} +
    +

    +
    +
    + +
    + +
    +
    + {{/ "sohl.item-strikemode"}} + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/mystery-sheet.html b/templates/item/mystery-sheet.html new file mode 100644 index 0000000..a93b5c1 --- /dev/null +++ b/templates/item/mystery-sheet.html @@ -0,0 +1,144 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{#if (or (eq idata.subType "grace") (eq idata.subType "piety"))}} + {{#if hasActor}} +
    + +
    + +
    +
    + {{else}} + {{formField fields.domain rootId="mystery-domain" classes="text-field" stacked=true value=system.domain}} + {{/if}} + {{else}} {{#if (eq idata.subType "totem")}} + {{#if hasActor}} +
    + +
    + +
    +
    + {{else}} + {{formField fields.domain rootId="mystery-domain" label="Totem" classes="text-field" stacked=true value=system.domain}} + {{/if}} + {{/if}} {{/if}} + + {{#if (or (eq idata.subType "blessing") (eq idata.subType "ancestor"))}} + {{formField fields.levelBase rootId="mystery-modifier" label="Skill Bonus" classes="text-field" stacked=true value=system.levelBase}} + {{/if}} + {{#if (eq idata.subType "fateBonus")}} + {{formField fields.levelBase rootId="mystery-modifier" label="Fate Test Bonus" classes="text-field" stacked=true value=system.levelBase}} +
    + + +

    If checked, bonus is a pool from which specific bonus amounts can be used as desired

    +
    + {{/if}} + {{#if (eq idata.subType "fatePointIncreaseBonus")}} + {{formField fields.levelBase rootId="mystery-modifier" label="Fate Point Increase Test Bonus" + hint="Bonus to the fate point increase test" classes="text-field" stacked=true value=system.levelBase}} + {{/if}} +
    +
    + {{#if (eq idata.subType "grace")}} + + {{formField fields.charges.fields.value rootId="mystery-grace-val" label="Current Grace" hint="Current amount of Grace available" classes="text-field" stacked=true value=system.charges.value}} + {{formField fields.charges.fields.max rootId="mystery-grace-max" label="Total Grace" hint="Total amount of Grace ever awarded" classes="text-field" stacked=true value=system.charges.max}} + {{else}} {{#if (eq idata.subType "fate")}} + + + {{formField fields.charges.fields.value rootId="mystery-fate-val" label="Current Fate" hint="Current amount of Fate available" classes="text-field" stacked=true value=system.charges.value}} + {{else}} {{#if (eq idata.subType "piety")}} + + {{formField fields.charges.fields.value rootId="mystery-piety-val" label="Current Piety" hint="Current amount of Piety available" classes="text-field" stacked=true value=system.charges.value}} + {{formField fields.charges.fields.max rootId="mystery-piety-max" label="Max Piety" hint="Maximum amount of piety attainable" classes="text-field" stacked=true value=system.charges.max}} + {{else}} + {{formField fields.charges.fields.usesCharges rootId="mystery-charges-usesCharges" classes="text-field" stacked=true value=system.charges.usesCharges}} + {{#if system.charges.usesCharges}} + {{formField fields.charges.fields.value rootId="mystery-charges-val" classes="text-field" stacked=true value=system.charges.value}} + {{formField fields.charges.fields.max rootId="mystery-charges-max" classes="text-field" stacked=true value=system.charges.max}} + {{/if}} + {{/if}} {{/if}} {{/if}} +
    + {{#if (or (eq idata.subType "fate") (eq idata.subType "fateBonus") (eq idata.subType "blessing") (eq idata.subType "ancestor"))}} +
    + Affected Skills (all if none specified) + +
      + {{#each flags.sohl.skills}} +
    1. + {{this}} + +
    2. + {{/each}} +
    +
    + {{/if}} + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/mysticalability-sheet.html b/templates/item/mysticalability-sheet.html new file mode 100644 index 0000000..ff7a201 --- /dev/null +++ b/templates/item/mysticalability-sheet.html @@ -0,0 +1,119 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{#if (eq idata.subType "ancestor")}} + {{formField fields.domain rootId="mysticalability-domain" label="Skill" classes="text-field" stacked=true value=system.domain}} + {{formField fields.levelBase rootId="mysticalability-level" label="Anima" classes="text-field" stacked=true value=system.levelBase}} + {{/if}} + {{#if (eq idata.subType "totem")}} + {{formField fields.levelBase rootId="mysticalability-level" label="Anima" classes="text-field" stacked=true value=system.levelBase}} + {{/if}} + {{#if (eq idata.subType "energy")}} +
    + +
    + +
    +
    + {{formField fields.levelBase rootId="mysticalability-level" label="Anima" classes="text-field" stacked=true value=system.levelBase}} + {{/if}} + {{#if (or (eq idata.subType "benediction") (eq idata.subType "devotion") (eq idata.subType "faith"))}} + {{formField fields.domain rootId="mysticalability-domain" label="Ritual" classes="text-field" stacked=true value=system.domain}} + {{/if}} + {{#if (eq idata.subType "grace")}} + {{formField fields.domain rootId="mysticalability-domain" label="Divinity" classes="text-field" stacked=true value=system.domain}} + {{/if}} + {{#if (eq idata.subType "arcaneincanting")}} + {{formField fields.domain rootId="mysticalability-domain" label="Convocation" classes="text-field" stacked=true value=system.domain}} + {{/if}} + {{#if (eq idata.subType "arcaneinvocation")}} + {{formField fields.domain rootId="mysticalability-domain" label="Convocation" classes="text-field" stacked=true value=system.domain}} + {{formField fields.levelBase rootId="mysticalability-level" classes="text-field" stacked=true value=system.levelBase}} + {{formField fields.masteryLevelBase rootId="mysticalability-ml" label="Mastery Level" classes="text-field" stacked=true value=system.masteryLevelBase}} + {{/if}} + {{#if (eq idata.subType "divineincantation")}} + {{formField fields.domain rootId="mysticalability-domain" label="Ritual" classes="text-field" stacked=true value=system.domain}} + {{formField fields.levelBase rootId="mysticalability-level" label="Circle" classes="text-field" stacked=true value=system.levelBase}} + {{formField fields.masteryLevelBase rootId="mysticalability-ml" label="Mastery Level" classes="text-field" stacked=true value=system.masteryLevelBase}} + {{/if}} + {{#if (eq idata.subType "arcanetalent")}} + {{formField fields.masteryLevelBase rootId="mysticalability-ml" label="Mastery Level" classes="text-field" stacked=true value=system.masteryLevelBase}} + {{/if}} +
    + {{#if (eq idata.subType "totem")}} +
    + Totem Instincts + +
      + {{#each flags.sohl.instincts}} +
    1. + {{this}} + +
    2. + {{/each}} +
    +
    + {{/if}} {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/mysticaldevice-sheet.html b/templates/item/mysticaldevice-sheet.html new file mode 100644 index 0000000..c911121 --- /dev/null +++ b/templates/item/mysticaldevice-sheet.html @@ -0,0 +1,75 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    + {{#if (eq system.subType "artifact")}} +
    + {{formField fields.isAttuned rootId="mystdev-attuned" classes="text-field" stacked=true value=system.isAttuned}} + {{formField fields.requiresAttunement rootId="mystdev-reqattune" classes="text-field" stacked=true value=system.requiresAttunement}} +
    + {{/if}} + {{#if (eq system.subType "remnant")}} +
    + {{formField fields.isAttuned rootId="mystdev-concurred" classes="text-field" + stacked=true label="Concurred" hint="User has concurrence with device" + value=system.isAttuned}} + {{formField fields.requiresAttunement rootId="mystdev-reqconcurrence" classes="text-field" + stacked=true label="Requires Concurrence" hint="Device requires concurrence" disabled=true + value=true}} +
    + {{/if}} + {{#if (ne system.subType "talisman")}} +
    + Volition +
    + {{formField fields.volition.fields.ego rootId="mystdev-ego" classes="text-field" stacked=true value=system.volition.ego}} + {{formField fields.volition.fields.morality rootId="mystdev-morality" classes="text-field" stacked=true value=system.volition.morality}} +
    + {{formField fields.volition.fields.purpose rootId="mystdev-purpose" classes="text-field" stacked=true value=system.volition.purpose}} +
    + {{/if}} + + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/parts/item-actions-list.hbs b/templates/item/parts/item-actions-list.hbs new file mode 100644 index 0000000..0fa3caf --- /dev/null +++ b/templates/item/parts/item-actions-list.hbs @@ -0,0 +1,65 @@ +
    +
    +
    +

    Custom Actions

    +
    Type
    +
    Notes
    +
    + Add +
    +
    +
      + {{#each system.actions as |action|}} + {{#unless flags.sohl.isIntrinsicAction}} +
    1. +
      +
      +

      {{ action.name }}

      +
      +
      {{ action.type }}
      +
      {{ action.flags.sohl.notes }}
      +
      + {{#unless flags.sohl.isIntrinsicAction}} + + {{/unless}} +
      +
    2. + {{/unless}} + {{/each}} +
    +
    + +
    +
    +

    Intrinsic Actions

    +
    Type
    +
    Notes
    +
    +
    +
      + {{#each system.actions as |action|}} + {{#if flags.sohl.isIntrinsicAction}} +
    1. +
      +
      +

      {{ action.name }}

      +
      +
      {{ action.type }}
      +
      {{ action.flags.sohl.notes }}
      +
      + {{#if action.canExecute}} + + {{/if}} +
      +
    2. + {{/if}} + {{/each}} +
    +
    +
    diff --git a/templates/item/parts/item-active-effects.hbs b/templates/item/parts/item-active-effects.hbs new file mode 100644 index 0000000..1015eb1 --- /dev/null +++ b/templates/item/parts/item-active-effects.hbs @@ -0,0 +1,68 @@ +
      +
    1. +

      Effect

      +
      Target
      +
      Remaining
      +
      Changes
      + Add +
    2. +
        + {{#each effects as |effect id|}} +
      1. +
        +

        {{ effect.name }}

        +
        +
        + {{ effect.system.targetLabel }} +
        +
        + {{#if (eq effect.duration.type "none")}} + Indefinite + {{else}} + {{{effect.duration.endTimeHtml}}} + {{/if}} +
        +
        + {{ effect._aeChanges }} +
        +
        + +
        +
      2. + {{/each}} +
      +
    + +
      +
    1. +

      Transferred Effect

      +
      Source
      +
      Remaining
      +
      Changes
      +
    2. +
        + {{#each transferredEffects as |effect id|}} +
      1. +
        +

        {{ effect.name }}

        +
        +
        + {{ effect.sourceName }} +
        +
        + {{optionalString (eq effect.duration.label "None") "Indefinite" effect.duration.label}} +
        +
        + {{ effect.changes }} +
        +
      2. + {{/each}} +
      +
    diff --git a/templates/item/parts/item-description.hbs b/templates/item/parts/item-description.hbs new file mode 100644 index 0000000..e69de29 diff --git a/templates/item/parts/item-gear-list.hbs b/templates/item/parts/item-gear-list.hbs new file mode 100644 index 0000000..a071896 --- /dev/null +++ b/templates/item/parts/item-gear-list.hbs @@ -0,0 +1,58 @@ +
    +
    + +
    + +
    +
    + + {{#each containers as |citem cid|}} +
    +
    +

    {{citem.name}}

    +
    Type
    +
    Qty
    +
    Weight
    +
    Qual
    +
    Dur
    +
    Notes
    +
    Capacity: {{system.totalWeight.modifier}}/{{system.$capacity.max.effective}}
    +
    +
      + {{#each citem.items as | item |}} +
    1. +
      +
      +

      {{item.name}}

      +
      +
      + {{lookup config.Item.typeLabels item.type}} +
      +
      {{system.quantity}}
      +
      {{system.totalWeight.effective}}
      +
      {{numberFormat system.$quality.effective sign=true}}
      +
      {{system.$durability.effective}}
      +
      {{system.notes}}
      + {{#unless printable}} +
      + + +
      + {{/unless}} +
    2. + {{/each}} +
    +
    + {{/each}} +
    \ No newline at end of file diff --git a/templates/item/parts/item-gear.hbs b/templates/item/parts/item-gear.hbs new file mode 100644 index 0000000..63940d1 --- /dev/null +++ b/templates/item/parts/item-gear.hbs @@ -0,0 +1,5 @@ +{{formField fields.quantity rootId="gear-quant" classes="text-field" stacked=true value=system.quantity}} +{{formField fields.weightBase rootId="gear-wt" classes="text-field" stacked=true value=system.weightBase}} +{{formField fields.valueBase rootId="gear-val" classes="text-field" stacked=true value=system.valueBase}} +{{formField fields.qualityBase rootId="gear-qual" classes="text-field" stacked=true value=system.qualityBase}} +{{formField fields.durabilityBase rootId="gear-dur" classes="text-field" stacked=true value=system.durabilityBase}} diff --git a/templates/item/parts/item-header.hbs b/templates/item/parts/item-header.hbs new file mode 100644 index 0000000..4738ab1 --- /dev/null +++ b/templates/item/parts/item-header.hbs @@ -0,0 +1,27 @@ +
    + +
    +

    + +

    + {{#if system.subType}} +
    + {{lookup (lookup (lookup config.Item.dataModels item.type) "subTypes") system.subType}} +
    + {{/if}} + {{#if inContainer}} +
    + {{inContainer.name}} +
    + {{/if}} +
    +
    diff --git a/templates/item/parts/item-masterylevel.hbs b/templates/item/parts/item-masterylevel.hbs new file mode 100644 index 0000000..8d8b406 --- /dev/null +++ b/templates/item/parts/item-masterylevel.hbs @@ -0,0 +1,20 @@ +
    + + {{formInput fields.skillBaseFormula value=system.skillBaseFormula}} +
    +{{#if hasActor}} +
    + + {{#if (not item.system.masteryLevel.valid)}} + Invalid Formula + {{else}} + {{ item.system.masteryLevel.skillBaseValue }} + {{/if}} +
    +{{else}} +
    +{{/if}} +
    + + {{formInput fields.masteryLevelBase value=system.masteryLevelBase}} +
    diff --git a/templates/item/parts/item-nesteditems-list.hbs b/templates/item/parts/item-nesteditems-list.hbs new file mode 100644 index 0000000..e75119b --- /dev/null +++ b/templates/item/parts/item-nesteditems-list.hbs @@ -0,0 +1,38 @@ +
    +
    +
    +

    Items

    +
    Type
    +
    Sub-Type
    +
    Notes
    +
    + Add +
    +
    +
      + {{#each system.items as |item|}} +
    1. +
      +
      +

      {{ item.name }}

      +
      +
      + {{ lookup ../config.Item.typeLabels item.type }} +
      +
      + {{lookup (lookup (lookup ../config.Item.dataModels item.type) "subTypes") system.subType}} +
      +
      + {{ system.notes }} +
      +
      + +
      +
    2. + {{/each}} +
    +
    +
    diff --git a/templates/item/parts/item-refnote.hbs b/templates/item/parts/item-refnote.hbs new file mode 100644 index 0000000..de2ab79 --- /dev/null +++ b/templates/item/parts/item-refnote.hbs @@ -0,0 +1,44 @@ +{{#if item.nestedIn}} +
    + {{formInput fields.transfer rootId="transf" classes="form-fields" value=system.transfer}} + +
    +{{/if}} +{{formField fields.textReference rootId="textref" classes="text-field" stacked=true value=system.textReference}} +{{formField fields.notes rootId="itemnote" classes="text-field" stacked=true value=system.notes}} +
    +
    +
    +

    Active Events

    +
    When
    +
    Oper
    +
    Source
    +
    Target
    +
    Action
    +
    +
      + {{#each system.events as |event|}} +
    1. +
      +

      {{ name }}

      +
      +
      + {{ remaining }} +
      +
      + {{oper}} +
      +
      + {{ sourceName }} +
      +
      + {{ targetName }} +
      +
      + {{ actionName }} +
      +
    2. + {{/each}} +
    +
    +
    diff --git a/templates/item/parts/item-strikemode.hbs b/templates/item/parts/item-strikemode.hbs new file mode 100644 index 0000000..da70c3d --- /dev/null +++ b/templates/item/parts/item-strikemode.hbs @@ -0,0 +1,20 @@ +
    + {{formField fields.mode rootId="meleestrikemode-mode" classes="text-field" stacked=true value=system.mode}} + {{formField fields.minParts rootId="meleestrikemode-minparts" classes="text-field" stacked=true value=system.minParts}} +
    + +
    + {{numberInput flags.sohl.legendary.zoneDie name="flags.sohl.legendary.zoneDie" step=1 min=0}} +
    +

    +
    + {{> @partial-block}} +
    +
    + Impact +
    + {{formField fields.impactBase.fields.die rootId="strikemode-imp-die" classes="text-field" stacked=true value=system.impactBase.die}} + {{formField fields.impactBase.fields.modifier rootId="strikemode-imp-mod" classes="text-field" stacked=true value=system.impactBase.modifier}} + {{formField fields.impactBase.fields.aspect rootId="strikemode-imp-asp" classes="text-field" stacked=true value=system.impactBase.aspect}} +
    +
    diff --git a/templates/item/philosophy-sheet.html b/templates/item/philosophy-sheet.html new file mode 100644 index 0000000..7525b07 --- /dev/null +++ b/templates/item/philosophy-sheet.html @@ -0,0 +1,47 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/projectilegear-sheet.html b/templates/item/projectilegear-sheet.html new file mode 100644 index 0000000..344572e --- /dev/null +++ b/templates/item/projectilegear-sheet.html @@ -0,0 +1,60 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{> "sohl.item-gear"}} + {{formField fields.shortName rootId="projgear-shortname" classes="text-field" stacked=true value=system.shortName}} +
    +
    + Impact +
    + {{formField fields.impactBase.fields.die rootId="projgear-die" classes="text-field" stacked=true value=system.impactBase.die}} + {{formField fields.impactBase.fields.modifier rootId="projgear-mod" classes="text-field" stacked=true value=system.impactBase.modifier}} + {{formField fields.impactBase.fields.aspect rootId="projgear-aspect" classes="text-field" stacked=true value=system.impactBase.aspect}} +
    +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/skill-sheet.html b/templates/item/skill-sheet.html new file mode 100644 index 0000000..4e09e67 --- /dev/null +++ b/templates/item/skill-sheet.html @@ -0,0 +1,100 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{> "sohl.item-masterylevel"}} + {{#if (eq system.subType config.Item.dataModels.skill.subTypes.Combat)}} + {{formField fields.weaponGroup rootId="skill-wpngrp" classes="text-field" stacked=true value=system.weaponGroup}} + {{/if}} +
    + +
    + {{numberInput flags.sohl.legendary.initSkillMult name="flags.sohl.legendary.initSkillMult" step=1 min=0}} +
    +

    SM to use during character creation

    +
    +
    + +
    + {{#if hasActor}} + + {{else}} + + {{/if}} +
    +

    Parent skill if an expertise, blank otherwise

    +
    +
    +
    + Action Body Parts + +
      + {{#each flags.sohl.actionBodyParts}} +
    1. + {{this}} + +
    2. + {{/each}} +
    +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/stereotype-sheet.html b/templates/item/stereotype-sheet.html new file mode 100644 index 0000000..0b72e3d --- /dev/null +++ b/templates/item/stereotype-sheet.html @@ -0,0 +1,69 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + Façade +
    + +
    + {{{editor idata.actorInfo.description target="system.actorInfo.description" button=true owner=owner editable=editable}}} +
    +
    +
    + +
    + Biography +
    + +
    + {{{editor idata.actorInfo.biography target="system.actorInfo.biography" button=true owner=owner editable=editable}}} +
    +
    +
    + + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/trait-sheet.html b/templates/item/trait-sheet.html new file mode 100644 index 0000000..e313779 --- /dev/null +++ b/templates/item/trait-sheet.html @@ -0,0 +1,148 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{formField fields.isNumeric rootId="trait-num" classes="text-field" stacked=true value=system.isNumeric}} + {{#if hasTraitChoices}} +
    + +
    + +
    +
    + {{else}} + {{formField fields.textValue rootId="trait-value" classes="text-field" stacked=true value=system.textValue}} + {{/if}} + {{#if system.isNumeric}} + {{formField fields.max rootId="trait-max" classes="text-field" stacked=true value=system.max}} + {{/if}} +
    + +
    + {{formField fields.intensity rootId="trait-int" classes="text-field" stacked=true value=system.intensity}} + {{formField fields.abbrev rootId="trait-abbr" classes="text-field" stacked=true value=system.abbrev}} +
    +
    + Action Body Parts + +
      + {{#each flags.sohl.actionBodyParts}} +
    1. + {{this}} + +
    2. + {{/each}} +
    +
    + +
    +
    +
    +

    Value Desc

    +
    Max
    +
    + Add +
    +
    +
      + {{#each idata.aim}} +
    1. +
      {{label}}
      +
      {{maxValue}}
      +
      + +
      +
    2. + {{/each}} +
    +
    +
    + +
    +
    +
    +

    Choice Label

    +
    Key
    +
    + Add +
    +
    +
      + {{#each idata.choices}} +
    1. +
      {{this}}
      +
      {{@key}}
      +
      + +
      +
    2. + {{/each}} +
    +
    +
    + + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/templates/item/weapongear-sheet.html b/templates/item/weapongear-sheet.html new file mode 100644 index 0000000..4508b57 --- /dev/null +++ b/templates/item/weapongear-sheet.html @@ -0,0 +1,63 @@ +
    + {{> "sohl.item-header"}} + + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
    + {{!-- Properties Tab --}} +
    +
    + {{> "sohl.item-gear"}} +
    + +
    + {{numberInput flags.sohl.legendary.lengthBase name="flags.sohl.legendary.lengthBase" step=1 min=0}} +
    +
    +
    + +
    + {{numberInput flags.sohl.legendary.heftBase name="flags.sohl.legendary.heftBase" step=1 min=0}} +
    +
    +
    + {{> "sohl.item-refnote"}} +
    + + {{!-- Description Tab --}} +
    + {{editor idata.description target="system.description" button=true + owner=owner editable=editable}} +
    + + {{!-- Actions Tab --}} +
    + {{> "sohl.item-actions-list"}} +
    + + {{!-- Embedded Items Tab --}} +
    + {{> "sohl.item-nesteditems-list"}} +
    + + {{!-- Effects Tab --}} +
    + {{> "sohl.item-active-effects"}} +
    +
    +
    diff --git a/ui/parchment.jpg b/ui/parchment.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e276c4e910579f7c8c1245142b38c056d0bdf56 GIT binary patch literal 112260 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

    k>kAw;kE(B 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 z

=EZ%E-ZFs%Kq}}F3ix?!eHr<(4^mG&pi%a&4H*VE3=~;M1^gSGT zRoZOFAsx>2N~Lhoc<{QzsZF7<=N8u9DX`a#O}z_JZP?zMSt2XFckj%Rl*8+5Ygvwd zIUtO*lx2s_`-t`MX3^F@)X2-f>~kd4VpmuU(ByNHz(whTca&ZmRv!Aic;ADKMi-ZG=e$tFUG!NEceYe; zLp-P%NxqZrCeqfFLgDOPl=2V{Smf7h1*T=#`}7`bDr#1px|^wQt>QIU#n=4JTmII& z+08YyR(w~DbxpH)k6QM%g$S}N={8GGDA(0t4C(vCfbfIiDACHJBln>wU`@lsce=n!+ z>YSoi%Rx~VOCMDs`Om#A6RYMyJ;`s3X*4TeYz(>ehqR8Q{imqvUb|pv8hc_<&t+~p zr#@4-u*D@e=f#0L$@fQ9sjr?t81Ve<$Z4{qNRKCtk@;q6QqsRnnwhl}EN?zG9LV8f zW8N>~BAbw~7!^Cr$~ktnTG1mqy+1?Z0rir}9**fwSk~Nk}&u?Ag7g^B0+#qxN zzfRHO9DS$tmy}I5l0E_@u|0|&JYl7QLo$KFllyuqS##@oNKB^>o2vBX`0L3pGttfN(eg@8 zU;ZNQO(UG&Z{kz*0tUNMvSFxk)P6cL$y$3w^cOR{-D{$6JXmw&*7m=i&rF5Atv_T@ zoS|Z8KQ>S1SF*XIe|6YsO@MjRwAyh;b9hH*j{QDb@&!xx3-Na@LomAM)aqCMxEC3m z%{-sS+SKV~8X~+)nveb|`%K%TLq~)BI}V zv4!AAWbZnF*_7InqXA?lGc2u1gGo#`|sZi zw*n4Y+Y_fr(=Qo=MaVMPoueAwnhrF*5n~9*$n1IYpMT)50{QA~jqis84xM;?x0u6} z?BkBBGjI1MU7NpluB)ayuW@7qhrr8^%G#RA~U)Tb;7W4z!*ps8RSq;->9^91Q zHOxeH!10WfUNF~ATLBMy#SbATPP>@gc%H)$aqC5e?Po=gy@`VNZFP*<&dG|hzEB`* z{B-nv!k2Z8+1!SLs>YXH`>vXE%nz7L-zR6O{&Q?s8HeXwtTy9ArI7<76zqlR&L!f-U*EOV{qgW|=VRHW>bCnKUZ)&@HNwz5d;5p1{qd}8V(U8cS<@X4>g u^uGKPCzkaHg~daguO9tj3>7)~Z;Q0CKJw^6_}Mcg{G+a-tz4>P6ZSurdT#~* literal 0 HcmV?d00001 diff --git a/assets/icons/half-body-crawling.svg b/assets/icons/half-body-crawling.svg new file mode 100644 index 0000000..fc3f228 --- /dev/null +++ b/assets/icons/half-body-crawling.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/hammer.svg b/assets/icons/hammer.svg new file mode 100644 index 0000000..e27b9ca --- /dev/null +++ b/assets/icons/hammer.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/hamster.svg b/assets/icons/hamster.svg new file mode 100644 index 0000000..3934e94 --- /dev/null +++ b/assets/icons/hamster.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/hand-sparkles.svg b/assets/icons/hand-sparkles.svg new file mode 100644 index 0000000..ff3f229 --- /dev/null +++ b/assets/icons/hand-sparkles.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/hand.svg b/assets/icons/hand.svg new file mode 100644 index 0000000..7f11ee6 --- /dev/null +++ b/assets/icons/hand.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/hands.svg b/assets/icons/hands.svg new file mode 100644 index 0000000..def8f73 --- /dev/null +++ b/assets/icons/hands.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/harp.svg b/assets/icons/harp.svg new file mode 100644 index 0000000..6d4d4e4 --- /dev/null +++ b/assets/icons/harp.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/hat.svg b/assets/icons/hat.svg new file mode 100644 index 0000000..a9630e1 --- /dev/null +++ b/assets/icons/hat.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/hawk.svg b/assets/icons/hawk.svg new file mode 100644 index 0000000..adac53e --- /dev/null +++ b/assets/icons/hawk.svg @@ -0,0 +1,2 @@ + + diff --git a/assets/icons/head-gear.svg b/assets/icons/head-gear.svg new file mode 100644 index 0000000..4fc5b9d --- /dev/null +++ b/assets/icons/head-gear.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/headbutt.svg b/assets/icons/headbutt.svg new file mode 100644 index 0000000..1fe56f1 --- /dev/null +++ b/assets/icons/headbutt.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/headshot.svg b/assets/icons/headshot.svg new file mode 100644 index 0000000..493cc47 --- /dev/null +++ b/assets/icons/headshot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/heart-inside.svg b/assets/icons/heart-inside.svg new file mode 100644 index 0000000..7a600db --- /dev/null +++ b/assets/icons/heart-inside.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/heart-organ.svg b/assets/icons/heart-organ.svg new file mode 100644 index 0000000..c05509a --- /dev/null +++ b/assets/icons/heart-organ.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/heavy-helm.svg b/assets/icons/heavy-helm.svg new file mode 100644 index 0000000..fb9766d --- /dev/null +++ b/assets/icons/heavy-helm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/hedgehog.svg b/assets/icons/hedgehog.svg new file mode 100644 index 0000000..01454f3 --- /dev/null +++ b/assets/icons/hedgehog.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/hel.svg b/assets/icons/hel.svg new file mode 100644 index 0000000..587bb1e --- /dev/null +++ b/assets/icons/hel.svg @@ -0,0 +1,1316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/helm.svg b/assets/icons/helm.svg new file mode 100644 index 0000000..8f7bd22 --- /dev/null +++ b/assets/icons/helm.svg @@ -0,0 +1,43 @@ + +image/svg+xml diff --git a/assets/icons/heraldry.svg b/assets/icons/heraldry.svg new file mode 100644 index 0000000..18e4439 --- /dev/null +++ b/assets/icons/heraldry.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/herblore.svg b/assets/icons/herblore.svg new file mode 100644 index 0000000..6a40dbb --- /dev/null +++ b/assets/icons/herblore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/hidework.svg b/assets/icons/hidework.svg new file mode 100644 index 0000000..200f0c3 --- /dev/null +++ b/assets/icons/hidework.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/high-kick.svg b/assets/icons/high-kick.svg new file mode 100644 index 0000000..8a833c5 --- /dev/null +++ b/assets/icons/high-kick.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/high-punch.svg b/assets/icons/high-punch.svg new file mode 100644 index 0000000..bf0b6bb --- /dev/null +++ b/assets/icons/high-punch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/hood.svg b/assets/icons/hood.svg new file mode 100644 index 0000000..3effb3c --- /dev/null +++ b/assets/icons/hood.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/hooded-assassin.svg b/assets/icons/hooded-assassin.svg new file mode 100644 index 0000000..185a80c --- /dev/null +++ b/assets/icons/hooded-assassin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/hooded-figure.svg b/assets/icons/hooded-figure.svg new file mode 100644 index 0000000..5bc18f6 --- /dev/null +++ b/assets/icons/hooded-figure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/hoof.svg b/assets/icons/hoof.svg new file mode 100644 index 0000000..cf89089 --- /dev/null +++ b/assets/icons/hoof.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/horn.svg b/assets/icons/horn.svg new file mode 100644 index 0000000..2be8454 --- /dev/null +++ b/assets/icons/horn.svg @@ -0,0 +1,18 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/horns.svg b/assets/icons/horns.svg new file mode 100644 index 0000000..8021c35 --- /dev/null +++ b/assets/icons/horns.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/horse-riding.svg b/assets/icons/horse-riding.svg new file mode 100644 index 0000000..f03ec5f --- /dev/null +++ b/assets/icons/horse-riding.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/horse.svg b/assets/icons/horse.svg new file mode 100644 index 0000000..a86589d --- /dev/null +++ b/assets/icons/horse.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/human-pyramid.svg b/assets/icons/human-pyramid.svg new file mode 100644 index 0000000..5b7f620 --- /dev/null +++ b/assets/icons/human-pyramid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/hunting.svg b/assets/icons/hunting.svg new file mode 100644 index 0000000..cebd8bc --- /dev/null +++ b/assets/icons/hunting.svg @@ -0,0 +1 @@ +Artboard 28 diff --git a/assets/icons/icicles-aura.svg b/assets/icons/icicles-aura.svg new file mode 100644 index 0000000..037b599 --- /dev/null +++ b/assets/icons/icicles-aura.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/ilvir.png b/assets/icons/ilvir.png new file mode 100644 index 0000000000000000000000000000000000000000..a322b4f93271c80fd79e40a304fbc74dac0ad0ab GIT binary patch literal 11499 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 z \ No newline at end of file diff --git a/assets/icons/initiative.svg b/assets/icons/initiative.svg new file mode 100644 index 0000000..6f0f27a --- /dev/null +++ b/assets/icons/initiative.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/injury.svg b/assets/icons/injury.svg new file mode 100644 index 0000000..c9d262f --- /dev/null +++ b/assets/icons/injury.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/ink.svg b/assets/icons/ink.svg new file mode 100644 index 0000000..8f539e0 --- /dev/null +++ b/assets/icons/ink.svg @@ -0,0 +1 @@ +15-ink \ No newline at end of file diff --git a/assets/icons/inner-self.svg b/assets/icons/inner-self.svg new file mode 100644 index 0000000..ed24778 --- /dev/null +++ b/assets/icons/inner-self.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/internal-injury.svg b/assets/icons/internal-injury.svg new file mode 100644 index 0000000..401be91 --- /dev/null +++ b/assets/icons/internal-injury.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/invisible.svg b/assets/icons/invisible.svg new file mode 100644 index 0000000..21194cc --- /dev/null +++ b/assets/icons/invisible.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/jaguar.svg b/assets/icons/jaguar.svg new file mode 100644 index 0000000..8a7db40 --- /dev/null +++ b/assets/icons/jaguar.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/jewel.svg b/assets/icons/jewel.svg new file mode 100644 index 0000000..affe3f3 --- /dev/null +++ b/assets/icons/jewel.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/assets/icons/jeweled-chalice.svg b/assets/icons/jeweled-chalice.svg new file mode 100644 index 0000000..13cca19 --- /dev/null +++ b/assets/icons/jeweled-chalice.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/juggler.svg b/assets/icons/juggler.svg new file mode 100644 index 0000000..83b8d4a --- /dev/null +++ b/assets/icons/juggler.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/jump-across.svg b/assets/icons/jump-across.svg new file mode 100644 index 0000000..309ff90 --- /dev/null +++ b/assets/icons/jump-across.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/jump.svg b/assets/icons/jump.svg new file mode 100644 index 0000000..04eac94 --- /dev/null +++ b/assets/icons/jump.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/jumping-rope.svg b/assets/icons/jumping-rope.svg new file mode 100644 index 0000000..0ca3565 --- /dev/null +++ b/assets/icons/jumping-rope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/key.svg b/assets/icons/key.svg new file mode 100644 index 0000000..f26d2ba --- /dev/null +++ b/assets/icons/key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/king.svg b/assets/icons/king.svg new file mode 100644 index 0000000..15de5ff --- /dev/null +++ b/assets/icons/king.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/knapsack.svg b/assets/icons/knapsack.svg new file mode 100644 index 0000000..304cd08 --- /dev/null +++ b/assets/icons/knapsack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/knee-bandage.svg b/assets/icons/knee-bandage.svg new file mode 100644 index 0000000..9513234 --- /dev/null +++ b/assets/icons/knee-bandage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/knee-pad.svg b/assets/icons/knee-pad.svg new file mode 100644 index 0000000..ead1260 --- /dev/null +++ b/assets/icons/knee-pad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/kneeling.svg b/assets/icons/kneeling.svg new file mode 100644 index 0000000..9a933db --- /dev/null +++ b/assets/icons/kneeling.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/knockout.svg b/assets/icons/knockout.svg new file mode 100644 index 0000000..e0cf2c3 --- /dev/null +++ b/assets/icons/knockout.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/knuckledusters.svg b/assets/icons/knuckledusters.svg new file mode 100644 index 0000000..eaa8097 --- /dev/null +++ b/assets/icons/knuckledusters.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/lamellar.svg b/assets/icons/lamellar.svg new file mode 100644 index 0000000..cb53a68 --- /dev/null +++ b/assets/icons/lamellar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/lance.svg b/assets/icons/lance.svg new file mode 100644 index 0000000..9eace25 --- /dev/null +++ b/assets/icons/lance.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/lantern-flame.svg b/assets/icons/lantern-flame.svg new file mode 100644 index 0000000..ef3058d --- /dev/null +++ b/assets/icons/lantern-flame.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/lantern.svg b/assets/icons/lantern.svg new file mode 100644 index 0000000..60b68d1 --- /dev/null +++ b/assets/icons/lantern.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/larani.png b/assets/icons/larani.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1db1e997beaf3d5e53a071aaf0056f6d26d435 GIT binary patch literal 14375 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 literal 0 HcmV?d00001 diff --git a/assets/icons/law.svg b/assets/icons/law.svg new file mode 100644 index 0000000..0c7803b --- /dev/null +++ b/assets/icons/law.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/leather-armor.svg b/assets/icons/leather-armor.svg new file mode 100644 index 0000000..497c058 --- /dev/null +++ b/assets/icons/leather-armor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/leather-boot.svg b/assets/icons/leather-boot.svg new file mode 100644 index 0000000..efc8979 --- /dev/null +++ b/assets/icons/leather-boot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/leather-vest.svg b/assets/icons/leather-vest.svg new file mode 100644 index 0000000..f77378b --- /dev/null +++ b/assets/icons/leather-vest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/leg-armor.svg b/assets/icons/leg-armor.svg new file mode 100644 index 0000000..6ec9cf3 --- /dev/null +++ b/assets/icons/leg-armor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/leggings.svg b/assets/icons/leggings.svg new file mode 100644 index 0000000..344cbea --- /dev/null +++ b/assets/icons/leggings.svg @@ -0,0 +1 @@ +legging, sport, clothes, yoga, stocking diff --git a/assets/icons/leo.svg b/assets/icons/leo.svg new file mode 100644 index 0000000..8eaf6a6 --- /dev/null +++ b/assets/icons/leo.svg @@ -0,0 +1,639 @@ + + + + + + diff --git a/assets/icons/leopard.svg b/assets/icons/leopard.svg new file mode 100644 index 0000000..d85e0b2 --- /dev/null +++ b/assets/icons/leopard.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/libra.svg b/assets/icons/libra.svg new file mode 100644 index 0000000..ed00bf0 --- /dev/null +++ b/assets/icons/libra.svg @@ -0,0 +1,379 @@ + + + + + + diff --git a/assets/icons/light-helm.svg b/assets/icons/light-helm.svg new file mode 100644 index 0000000..adbf001 --- /dev/null +++ b/assets/icons/light-helm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/lion.svg b/assets/icons/lion.svg new file mode 100644 index 0000000..487dc20 --- /dev/null +++ b/assets/icons/lion.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/lock.svg b/assets/icons/lock.svg new file mode 100644 index 0000000..d738bff --- /dev/null +++ b/assets/icons/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/locked-chest.svg b/assets/icons/locked-chest.svg new file mode 100644 index 0000000..8e9a2ce --- /dev/null +++ b/assets/icons/locked-chest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/lockpicks.svg b/assets/icons/lockpicks.svg new file mode 100644 index 0000000..60e2517 --- /dev/null +++ b/assets/icons/lockpicks.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/loincloth.svg b/assets/icons/loincloth.svg new file mode 100644 index 0000000..cf39526 --- /dev/null +++ b/assets/icons/loincloth.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/icons/loki.svg b/assets/icons/loki.svg new file mode 100644 index 0000000..0a711db --- /dev/null +++ b/assets/icons/loki.svg @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/longbow.svg b/assets/icons/longbow.svg new file mode 100644 index 0000000..2e13359 --- /dev/null +++ b/assets/icons/longbow.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/lore.svg b/assets/icons/lore.svg new file mode 100644 index 0000000..71c5e9c --- /dev/null +++ b/assets/icons/lore.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/love.svg b/assets/icons/love.svg new file mode 100644 index 0000000..4c88799 --- /dev/null +++ b/assets/icons/love.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/lovers.svg b/assets/icons/lovers.svg new file mode 100644 index 0000000..92ddc88 --- /dev/null +++ b/assets/icons/lovers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/lute.svg b/assets/icons/lute.svg new file mode 100644 index 0000000..1716ce0 --- /dev/null +++ b/assets/icons/lute.svg @@ -0,0 +1,21 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/lynx.svg b/assets/icons/lynx.svg new file mode 100644 index 0000000..7aa28bd --- /dev/null +++ b/assets/icons/lynx.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/lyre.svg b/assets/icons/lyre.svg new file mode 100644 index 0000000..155051a --- /dev/null +++ b/assets/icons/lyre.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/mace.svg b/assets/icons/mace.svg new file mode 100644 index 0000000..0e93a49 --- /dev/null +++ b/assets/icons/mace.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/magic-portal.svg b/assets/icons/magic-portal.svg new file mode 100644 index 0000000..0eaf547 --- /dev/null +++ b/assets/icons/magic-portal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/magic-shield.svg b/assets/icons/magic-shield.svg new file mode 100644 index 0000000..dee40d4 --- /dev/null +++ b/assets/icons/magic-shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/magic-wand.svg b/assets/icons/magic-wand.svg new file mode 100644 index 0000000..8ea2fd3 --- /dev/null +++ b/assets/icons/magic-wand.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/magnifying-glass.svg b/assets/icons/magnifying-glass.svg new file mode 100644 index 0000000..b8dbfa8 --- /dev/null +++ b/assets/icons/magnifying-glass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/mail-shirt.svg b/assets/icons/mail-shirt.svg new file mode 100644 index 0000000..4f178c9 --- /dev/null +++ b/assets/icons/mail-shirt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/mailed-fist.svg b/assets/icons/mailed-fist.svg new file mode 100644 index 0000000..f344b58 --- /dev/null +++ b/assets/icons/mailed-fist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/manacles.svg b/assets/icons/manacles.svg new file mode 100644 index 0000000..9acebf0 --- /dev/null +++ b/assets/icons/manacles.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/mantle.svg b/assets/icons/mantle.svg new file mode 100644 index 0000000..858672a --- /dev/null +++ b/assets/icons/mantle.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/assets/icons/masonry.svg b/assets/icons/masonry.svg new file mode 100644 index 0000000..ea2369e --- /dev/null +++ b/assets/icons/masonry.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/master-of-arms.svg b/assets/icons/master-of-arms.svg new file mode 100644 index 0000000..6d5720e --- /dev/null +++ b/assets/icons/master-of-arms.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/mathematics.svg b/assets/icons/mathematics.svg new file mode 100644 index 0000000..14813d7 --- /dev/null +++ b/assets/icons/mathematics.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/assets/icons/medallist.svg b/assets/icons/medallist.svg new file mode 100644 index 0000000..e1ee2e5 --- /dev/null +++ b/assets/icons/medallist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/meditation.svg b/assets/icons/meditation.svg new file mode 100644 index 0000000..4896c00 --- /dev/null +++ b/assets/icons/meditation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/meeple.svg b/assets/icons/meeple.svg new file mode 100644 index 0000000..8296cc1 --- /dev/null +++ b/assets/icons/meeple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/mental.svg b/assets/icons/mental.svg new file mode 100644 index 0000000..f9f3a63 --- /dev/null +++ b/assets/icons/mental.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/metal-bar.svg b/assets/icons/metal-bar.svg new file mode 100644 index 0000000..3cf1908 --- /dev/null +++ b/assets/icons/metal-bar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/metal-skirt.svg b/assets/icons/metal-skirt.svg new file mode 100644 index 0000000..81b68b2 --- /dev/null +++ b/assets/icons/metal-skirt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/mighty-force.svg b/assets/icons/mighty-force.svg new file mode 100644 index 0000000..ca58e2c --- /dev/null +++ b/assets/icons/mighty-force.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/miner.svg b/assets/icons/miner.svg new file mode 100644 index 0000000..93fcfdc --- /dev/null +++ b/assets/icons/miner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/mining.svg b/assets/icons/mining.svg new file mode 100644 index 0000000..4f8f183 --- /dev/null +++ b/assets/icons/mining.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/minions.svg b/assets/icons/minions.svg new file mode 100644 index 0000000..c2a0cd5 --- /dev/null +++ b/assets/icons/minions.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/mirror.svg b/assets/icons/mirror.svg new file mode 100644 index 0000000..4d00c6c --- /dev/null +++ b/assets/icons/mirror.svg @@ -0,0 +1,18 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/miscgear.svg b/assets/icons/miscgear.svg new file mode 100644 index 0000000..1353cc9 --- /dev/null +++ b/assets/icons/miscgear.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/mischevous.svg b/assets/icons/mischevous.svg new file mode 100644 index 0000000..184fb53 --- /dev/null +++ b/assets/icons/mischevous.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/morality.svg b/assets/icons/morality.svg new file mode 100644 index 0000000..2340a6a --- /dev/null +++ b/assets/icons/morality.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/morgath.png b/assets/icons/morgath.png new file mode 100644 index 0000000000000000000000000000000000000000..1b544bbb7f465f692d8e2fc742b805716705ff33 GIT binary patch literal 10625 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 literal 0 HcmV?d00001 diff --git a/assets/icons/mounted-knight.svg b/assets/icons/mounted-knight.svg new file mode 100644 index 0000000..cb6ba61 --- /dev/null +++ b/assets/icons/mounted-knight.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/muscle-fat.svg b/assets/icons/muscle-fat.svg new file mode 100644 index 0000000..fa637d2 --- /dev/null +++ b/assets/icons/muscle-fat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/muscle-up.svg b/assets/icons/muscle-up.svg new file mode 100644 index 0000000..3189cd1 --- /dev/null +++ b/assets/icons/muscle-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/muscle.svg b/assets/icons/muscle.svg new file mode 100644 index 0000000..4db3c60 --- /dev/null +++ b/assets/icons/muscle.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/muscular-torso.svg b/assets/icons/muscular-torso.svg new file mode 100644 index 0000000..3c3efe6 --- /dev/null +++ b/assets/icons/muscular-torso.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/musical-notes.svg b/assets/icons/musical-notes.svg new file mode 100644 index 0000000..b7a892c --- /dev/null +++ b/assets/icons/musical-notes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/musician-singing.svg b/assets/icons/musician-singing.svg new file mode 100644 index 0000000..06df4ba --- /dev/null +++ b/assets/icons/musician-singing.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/nails.svg b/assets/icons/nails.svg new file mode 100644 index 0000000..1fa1e59 --- /dev/null +++ b/assets/icons/nails.svg @@ -0,0 +1,39 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/naveh.png b/assets/icons/naveh.png new file mode 100644 index 0000000000000000000000000000000000000000..98c8d782df4322b39aac78d3d2265397eb3e042a GIT binary patch literal 12456 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 m`ROmT{kQnVkM6Au3I7KrXH|-=S#D + diff --git a/assets/icons/net.svg b/assets/icons/net.svg new file mode 100644 index 0000000..1d608c9 --- /dev/null +++ b/assets/icons/net.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/ninja-heroic-stance.svg b/assets/icons/ninja-heroic-stance.svg new file mode 100644 index 0000000..e1a4083 --- /dev/null +++ b/assets/icons/ninja-heroic-stance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/nunchaku.svg b/assets/icons/nunchaku.svg new file mode 100644 index 0000000..7827729 --- /dev/null +++ b/assets/icons/nunchaku.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/odin.svg b/assets/icons/odin.svg new file mode 100644 index 0000000..0862646 --- /dev/null +++ b/assets/icons/odin.svg @@ -0,0 +1,1625 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/old-lantern.svg b/assets/icons/old-lantern.svg new file mode 100644 index 0000000..66dcb00 --- /dev/null +++ b/assets/icons/old-lantern.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/oppression.svg b/assets/icons/oppression.svg new file mode 100644 index 0000000..0bef23f --- /dev/null +++ b/assets/icons/oppression.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/oratory.svg b/assets/icons/oratory.svg new file mode 100644 index 0000000..4852397 --- /dev/null +++ b/assets/icons/oratory.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/otter.svg b/assets/icons/otter.svg new file mode 100644 index 0000000..eebfd50 --- /dev/null +++ b/assets/icons/otter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/overexertion.svg b/assets/icons/overexertion.svg new file mode 100644 index 0000000..40d35b3 --- /dev/null +++ b/assets/icons/overexertion.svg @@ -0,0 +1,37 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/owl.svg b/assets/icons/owl.svg new file mode 100644 index 0000000..d996472 --- /dev/null +++ b/assets/icons/owl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/ox.svg b/assets/icons/ox.svg new file mode 100644 index 0000000..ff95e89 --- /dev/null +++ b/assets/icons/ox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/padlock-open.svg b/assets/icons/padlock-open.svg new file mode 100644 index 0000000..2ed07c1 --- /dev/null +++ b/assets/icons/padlock-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/pan-flute.svg b/assets/icons/pan-flute.svg new file mode 100644 index 0000000..7b253ac --- /dev/null +++ b/assets/icons/pan-flute.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/parrot.svg b/assets/icons/parrot.svg new file mode 100644 index 0000000..b85dc4d --- /dev/null +++ b/assets/icons/parrot.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/pauldrons.svg b/assets/icons/pauldrons.svg new file mode 100644 index 0000000..bbb7583 --- /dev/null +++ b/assets/icons/pauldrons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/pegasus.svg b/assets/icons/pegasus.svg new file mode 100644 index 0000000..9d11bb8 --- /dev/null +++ b/assets/icons/pegasus.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/pentacle.svg b/assets/icons/pentacle.svg new file mode 100644 index 0000000..9fa59ad --- /dev/null +++ b/assets/icons/pentacle.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/peoni.png b/assets/icons/peoni.png new file mode 100644 index 0000000000000000000000000000000000000000..00e814b5e0f4a409f4cee769aa28ad9c173d1591 GIT binary patch literal 22760 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 literal 0 HcmV?d00001 diff --git a/assets/icons/people-group.svg b/assets/icons/people-group.svg new file mode 100644 index 0000000..474a356 --- /dev/null +++ b/assets/icons/people-group.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/perfume-bottle.svg b/assets/icons/perfume-bottle.svg new file mode 100644 index 0000000..98c096c --- /dev/null +++ b/assets/icons/perfume-bottle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/perfume.svg b/assets/icons/perfume.svg new file mode 100644 index 0000000..697861f --- /dev/null +++ b/assets/icons/perfume.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/person.svg b/assets/icons/person.svg new file mode 100644 index 0000000..161b139 --- /dev/null +++ b/assets/icons/person.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/pickaxe.svg b/assets/icons/pickaxe.svg new file mode 100644 index 0000000..12a2f53 --- /dev/null +++ b/assets/icons/pickaxe.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/pierced-body.svg b/assets/icons/pierced-body.svg new file mode 100644 index 0000000..d1466de --- /dev/null +++ b/assets/icons/pierced-body.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/piety.svg b/assets/icons/piety.svg new file mode 100644 index 0000000..583a77c --- /dev/null +++ b/assets/icons/piety.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/pigeon.svg b/assets/icons/pigeon.svg new file mode 100644 index 0000000..9ffd5fd --- /dev/null +++ b/assets/icons/pigeon.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/icons/pikeman.svg b/assets/icons/pikeman.svg new file mode 100644 index 0000000..eb58be7 --- /dev/null +++ b/assets/icons/pikeman.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/piloting.svg b/assets/icons/piloting.svg new file mode 100644 index 0000000..5fd1512 --- /dev/null +++ b/assets/icons/piloting.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/pisces.svg b/assets/icons/pisces.svg new file mode 100644 index 0000000..ba1c99b --- /dev/null +++ b/assets/icons/pisces.svg @@ -0,0 +1,461 @@ + + + + + + diff --git a/assets/icons/pitchfork.svg b/assets/icons/pitchfork.svg new file mode 100644 index 0000000..f83fccc --- /dev/null +++ b/assets/icons/pitchfork.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/piton.svg b/assets/icons/piton.svg new file mode 100644 index 0000000..c85bf54 --- /dev/null +++ b/assets/icons/piton.svg @@ -0,0 +1,18 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/poison-bottle.svg b/assets/icons/poison-bottle.svg new file mode 100644 index 0000000..5c274a8 --- /dev/null +++ b/assets/icons/poison-bottle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/polearm.svg b/assets/icons/polearm.svg new file mode 100644 index 0000000..2c065c0 --- /dev/null +++ b/assets/icons/polearm.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/potion-ball.svg b/assets/icons/potion-ball.svg new file mode 100644 index 0000000..e66e070 --- /dev/null +++ b/assets/icons/potion-ball.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/potion.svg b/assets/icons/potion.svg new file mode 100644 index 0000000..5c9131f --- /dev/null +++ b/assets/icons/potion.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/prayer.svg b/assets/icons/prayer.svg new file mode 100644 index 0000000..458a833 --- /dev/null +++ b/assets/icons/prayer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/prisoner.svg b/assets/icons/prisoner.svg new file mode 100644 index 0000000..3c1e31d --- /dev/null +++ b/assets/icons/prisoner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/psionics.svg b/assets/icons/psionics.svg new file mode 100644 index 0000000..528b4ca --- /dev/null +++ b/assets/icons/psionics.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/psychic-waves.svg b/assets/icons/psychic-waves.svg new file mode 100644 index 0000000..a05bdde --- /dev/null +++ b/assets/icons/psychic-waves.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/public-speaker.svg b/assets/icons/public-speaker.svg new file mode 100644 index 0000000..cbb36e9 --- /dev/null +++ b/assets/icons/public-speaker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/pull.svg b/assets/icons/pull.svg new file mode 100644 index 0000000..a6d2bef --- /dev/null +++ b/assets/icons/pull.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/punch-blast.svg b/assets/icons/punch-blast.svg new file mode 100644 index 0000000..410256a --- /dev/null +++ b/assets/icons/punch-blast.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/punch.svg b/assets/icons/punch.svg new file mode 100644 index 0000000..049c490 --- /dev/null +++ b/assets/icons/punch.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/push.svg b/assets/icons/push.svg new file mode 100644 index 0000000..bfb8c76 --- /dev/null +++ b/assets/icons/push.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/pvarism.svg b/assets/icons/pvarism.svg new file mode 100644 index 0000000..11f15b6 --- /dev/null +++ b/assets/icons/pvarism.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/quill-ink.svg b/assets/icons/quill-ink.svg new file mode 100644 index 0000000..1146eb0 --- /dev/null +++ b/assets/icons/quill-ink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/quill.svg b/assets/icons/quill.svg new file mode 100644 index 0000000..72ad6db --- /dev/null +++ b/assets/icons/quill.svg @@ -0,0 +1,18 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/quiver.svg b/assets/icons/quiver.svg new file mode 100644 index 0000000..81cfd98 --- /dev/null +++ b/assets/icons/quiver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/rabbit.svg b/assets/icons/rabbit.svg new file mode 100644 index 0000000..21e82be --- /dev/null +++ b/assets/icons/rabbit.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/icons/reasoning.svg b/assets/icons/reasoning.svg new file mode 100644 index 0000000..7864a2e --- /dev/null +++ b/assets/icons/reasoning.svg @@ -0,0 +1,28 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/rhetoric.svg b/assets/icons/rhetoric.svg new file mode 100644 index 0000000..2454738 --- /dev/null +++ b/assets/icons/rhetoric.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/ribcage.svg b/assets/icons/ribcage.svg new file mode 100644 index 0000000..a8837a1 --- /dev/null +++ b/assets/icons/ribcage.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/robber.svg b/assets/icons/robber.svg new file mode 100644 index 0000000..0c39aca --- /dev/null +++ b/assets/icons/robber.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/robe.svg b/assets/icons/robe.svg new file mode 100644 index 0000000..2a3930a --- /dev/null +++ b/assets/icons/robe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/rogue.svg b/assets/icons/rogue.svg new file mode 100644 index 0000000..0aa53b3 --- /dev/null +++ b/assets/icons/rogue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/rope.svg b/assets/icons/rope.svg new file mode 100644 index 0000000..5c80b97 --- /dev/null +++ b/assets/icons/rope.svg @@ -0,0 +1,18 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/round-bottom-flask.svg b/assets/icons/round-bottom-flask.svg new file mode 100644 index 0000000..f2f340c --- /dev/null +++ b/assets/icons/round-bottom-flask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/round-shield.svg b/assets/icons/round-shield.svg new file mode 100644 index 0000000..3a4f9ae --- /dev/null +++ b/assets/icons/round-shield.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/run.svg b/assets/icons/run.svg new file mode 100644 index 0000000..b9a35c8 --- /dev/null +++ b/assets/icons/run.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/runecraft.svg b/assets/icons/runecraft.svg new file mode 100644 index 0000000..338c82d --- /dev/null +++ b/assets/icons/runecraft.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/running-ninja.svg b/assets/icons/running-ninja.svg new file mode 100644 index 0000000..0c15f7a --- /dev/null +++ b/assets/icons/running-ninja.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sack.svg b/assets/icons/sack.svg new file mode 100644 index 0000000..42a75c0 --- /dev/null +++ b/assets/icons/sack.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/assets/icons/sagittarius.svg b/assets/icons/sagittarius.svg new file mode 100644 index 0000000..590ad52 --- /dev/null +++ b/assets/icons/sagittarius.svg @@ -0,0 +1,403 @@ + + + + + + diff --git a/assets/icons/sai.svg b/assets/icons/sai.svg new file mode 100644 index 0000000..1849d24 --- /dev/null +++ b/assets/icons/sai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sandals.svg b/assets/icons/sandals.svg new file mode 100644 index 0000000..98ff6cf --- /dev/null +++ b/assets/icons/sandals.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/sarajin.png b/assets/icons/sarajin.png new file mode 100644 index 0000000000000000000000000000000000000000..262bf2c2943017fee992eeaf40071f986cf0d651 GIT binary patch literal 12891 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 FV1kGrG?@SZ literal 0 HcmV?d00001 diff --git a/assets/icons/saveknor.png b/assets/icons/saveknor.png new file mode 100644 index 0000000000000000000000000000000000000000..1545922b2858127ce3b25cb69e7ecf84fb8dc75e GIT binary patch literal 11107 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 literal 0 HcmV?d00001 diff --git a/assets/icons/scale-mail.svg b/assets/icons/scale-mail.svg new file mode 100644 index 0000000..4ff43ab --- /dev/null +++ b/assets/icons/scale-mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/scales.svg b/assets/icons/scales.svg new file mode 100644 index 0000000..e557027 --- /dev/null +++ b/assets/icons/scales.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/scorpio.svg b/assets/icons/scorpio.svg new file mode 100644 index 0000000..933881c --- /dev/null +++ b/assets/icons/scorpio.svg @@ -0,0 +1,642 @@ + + + + + + diff --git a/assets/icons/screaming.svg b/assets/icons/screaming.svg new file mode 100644 index 0000000..3228590 --- /dev/null +++ b/assets/icons/screaming.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/scroll-unfurled.svg b/assets/icons/scroll-unfurled.svg new file mode 100644 index 0000000..3be0257 --- /dev/null +++ b/assets/icons/scroll-unfurled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/scroll.svg b/assets/icons/scroll.svg new file mode 100644 index 0000000..d622569 --- /dev/null +++ b/assets/icons/scroll.svg @@ -0,0 +1,8 @@ + diff --git a/assets/icons/scythe.svg b/assets/icons/scythe.svg new file mode 100644 index 0000000..bea3456 --- /dev/null +++ b/assets/icons/scythe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/seabass.svg b/assets/icons/seabass.svg new file mode 100644 index 0000000..2eadb28 --- /dev/null +++ b/assets/icons/seabass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sensuousness.svg b/assets/icons/sensuousness.svg new file mode 100644 index 0000000..440c8e1 --- /dev/null +++ b/assets/icons/sensuousness.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sewing-needle.svg b/assets/icons/sewing-needle.svg new file mode 100644 index 0000000..7a68c63 --- /dev/null +++ b/assets/icons/sewing-needle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/shark.svg b/assets/icons/shark.svg new file mode 100644 index 0000000..17e9652 --- /dev/null +++ b/assets/icons/shark.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/icons/shattered-glass.svg b/assets/icons/shattered-glass.svg new file mode 100644 index 0000000..e9e50a8 --- /dev/null +++ b/assets/icons/shattered-glass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sheep.svg b/assets/icons/sheep.svg new file mode 100644 index 0000000..218a64f --- /dev/null +++ b/assets/icons/sheep.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/shield-bash.svg b/assets/icons/shield-bash.svg new file mode 100644 index 0000000..c14dc2c --- /dev/null +++ b/assets/icons/shield-bash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/shield-reflect.svg b/assets/icons/shield-reflect.svg new file mode 100644 index 0000000..0fe7710 --- /dev/null +++ b/assets/icons/shield-reflect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/shield.svg b/assets/icons/shield.svg new file mode 100644 index 0000000..e324aea --- /dev/null +++ b/assets/icons/shield.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/ship.svg b/assets/icons/ship.svg new file mode 100644 index 0000000..c8f3403 --- /dev/null +++ b/assets/icons/ship.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/shirt.svg b/assets/icons/shirt.svg new file mode 100644 index 0000000..2666b19 --- /dev/null +++ b/assets/icons/shirt.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/shock.svg b/assets/icons/shock.svg new file mode 100644 index 0000000..a500b0a --- /dev/null +++ b/assets/icons/shock.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/shoe.svg b/assets/icons/shoe.svg new file mode 100644 index 0000000..8ccb098 --- /dev/null +++ b/assets/icons/shoe.svg @@ -0,0 +1 @@ +update 5 mei diff --git a/assets/icons/shoulder-scales.svg b/assets/icons/shoulder-scales.svg new file mode 100644 index 0000000..ec220fd --- /dev/null +++ b/assets/icons/shoulder-scales.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/shouting.svg b/assets/icons/shouting.svg new file mode 100644 index 0000000..319520f --- /dev/null +++ b/assets/icons/shouting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/shrug.svg b/assets/icons/shrug.svg new file mode 100644 index 0000000..659cd72 --- /dev/null +++ b/assets/icons/shrug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/shuriken.svg b/assets/icons/shuriken.svg new file mode 100644 index 0000000..5640056 --- /dev/null +++ b/assets/icons/shuriken.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/sick.svg b/assets/icons/sick.svg new file mode 100644 index 0000000..b413d4f --- /dev/null +++ b/assets/icons/sick.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/sickle.svg b/assets/icons/sickle.svg new file mode 100644 index 0000000..0834148 --- /dev/null +++ b/assets/icons/sickle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/siem.png b/assets/icons/siem.png new file mode 100644 index 0000000000000000000000000000000000000000..8405a4d558c61468b92c48fc3fc0339175823e5f GIT binary patch literal 11845 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 literal 0 HcmV?d00001 diff --git a/assets/icons/sing.svg b/assets/icons/sing.svg new file mode 100644 index 0000000..2d4a4f4 --- /dev/null +++ b/assets/icons/sing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skeleton.svg b/assets/icons/skeleton.svg new file mode 100644 index 0000000..5c5c7c9 --- /dev/null +++ b/assets/icons/skeleton.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/ski.svg b/assets/icons/ski.svg new file mode 100644 index 0000000..313a93b --- /dev/null +++ b/assets/icons/ski.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/skier.svg b/assets/icons/skier.svg new file mode 100644 index 0000000..9f177b0 --- /dev/null +++ b/assets/icons/skier.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/skills.svg b/assets/icons/skills.svg new file mode 100644 index 0000000..c7d3ff9 --- /dev/null +++ b/assets/icons/skills.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/skirt.svg b/assets/icons/skirt.svg new file mode 100644 index 0000000..512f82a --- /dev/null +++ b/assets/icons/skirt.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/icons/slavery-whip.svg b/assets/icons/slavery-whip.svg new file mode 100644 index 0000000..53ce0f0 --- /dev/null +++ b/assets/icons/slavery-whip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sleeping-bag.svg b/assets/icons/sleeping-bag.svg new file mode 100644 index 0000000..47b3340 --- /dev/null +++ b/assets/icons/sleeping-bag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sleepy.svg b/assets/icons/sleepy.svg new file mode 100644 index 0000000..0846796 --- /dev/null +++ b/assets/icons/sleepy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sling.svg b/assets/icons/sling.svg new file mode 100644 index 0000000..493659e --- /dev/null +++ b/assets/icons/sling.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/slingshot.svg b/assets/icons/slingshot.svg new file mode 100644 index 0000000..a877fda --- /dev/null +++ b/assets/icons/slingshot.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/icons/sly.svg b/assets/icons/sly.svg new file mode 100644 index 0000000..886ee2c --- /dev/null +++ b/assets/icons/sly.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/small-fire.svg b/assets/icons/small-fire.svg new file mode 100644 index 0000000..40d780c --- /dev/null +++ b/assets/icons/small-fire.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/smart.svg b/assets/icons/smart.svg new file mode 100644 index 0000000..06506aa --- /dev/null +++ b/assets/icons/smart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/smitten.svg b/assets/icons/smitten.svg new file mode 100644 index 0000000..c99b79e --- /dev/null +++ b/assets/icons/smitten.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/snake.svg b/assets/icons/snake.svg new file mode 100644 index 0000000..5eb2d91 --- /dev/null +++ b/assets/icons/snake.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sparkle.svg b/assets/icons/sparkle.svg new file mode 100644 index 0000000..a468b19 --- /dev/null +++ b/assets/icons/sparkle.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/sparkles.svg b/assets/icons/sparkles.svg new file mode 100644 index 0000000..c42698d --- /dev/null +++ b/assets/icons/sparkles.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/speaking.svg b/assets/icons/speaking.svg new file mode 100644 index 0000000..d21b4cb --- /dev/null +++ b/assets/icons/speaking.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/spear.svg b/assets/icons/spear.svg new file mode 100644 index 0000000..185b153 --- /dev/null +++ b/assets/icons/spear.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/spell-book.svg b/assets/icons/spell-book.svg new file mode 100644 index 0000000..f9ea19e --- /dev/null +++ b/assets/icons/spell-book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/spider-web.svg b/assets/icons/spider-web.svg new file mode 100644 index 0000000..faf4399 --- /dev/null +++ b/assets/icons/spider-web.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/spiked-mace.svg b/assets/icons/spiked-mace.svg new file mode 100644 index 0000000..cf73b9a --- /dev/null +++ b/assets/icons/spiked-mace.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/spiked-wall.svg b/assets/icons/spiked-wall.svg new file mode 100644 index 0000000..33b20be --- /dev/null +++ b/assets/icons/spiked-wall.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/spiral-bottle.svg b/assets/icons/spiral-bottle.svg new file mode 100644 index 0000000..1a7741f --- /dev/null +++ b/assets/icons/spiral-bottle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/spirit.svg b/assets/icons/spirit.svg new file mode 100644 index 0000000..4fd0d18 --- /dev/null +++ b/assets/icons/spirit.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/sprint.svg b/assets/icons/sprint.svg new file mode 100644 index 0000000..1946a76 --- /dev/null +++ b/assets/icons/sprint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/staff.svg b/assets/icons/staff.svg new file mode 100644 index 0000000..402231b --- /dev/null +++ b/assets/icons/staff.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/staffsling.webp b/assets/icons/staffsling.webp new file mode 100644 index 0000000000000000000000000000000000000000..2da055a5f722a69decb90bd9755e9c467031b583 GIT binary patch literal 4174 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 Yk^@6#Rfd!ig3O7?tDq8u000000IeB2#{d8T literal 0 HcmV?d00001 diff --git a/assets/icons/stag.svg b/assets/icons/stag.svg new file mode 100644 index 0000000..be2737e --- /dev/null +++ b/assets/icons/stag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/standing-potion.svg b/assets/icons/standing-potion.svg new file mode 100644 index 0000000..87da150 --- /dev/null +++ b/assets/icons/standing-potion.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/star.svg b/assets/icons/star.svg new file mode 100644 index 0000000..80251f4 --- /dev/null +++ b/assets/icons/star.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/stealth.svg b/assets/icons/stealth.svg new file mode 100644 index 0000000..d285f3c --- /dev/null +++ b/assets/icons/stealth.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/steeltoe-boots.svg b/assets/icons/steeltoe-boots.svg new file mode 100644 index 0000000..fb5966f --- /dev/null +++ b/assets/icons/steeltoe-boots.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/stiletto.svg b/assets/icons/stiletto.svg new file mode 100644 index 0000000..7acaae1 --- /dev/null +++ b/assets/icons/stiletto.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/stone-axe.svg b/assets/icons/stone-axe.svg new file mode 100644 index 0000000..e958730 --- /dev/null +++ b/assets/icons/stone-axe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/stone-bust.svg b/assets/icons/stone-bust.svg new file mode 100644 index 0000000..c30e1dc --- /dev/null +++ b/assets/icons/stone-bust.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/stone-spear.svg b/assets/icons/stone-spear.svg new file mode 100644 index 0000000..37ee875 --- /dev/null +++ b/assets/icons/stone-spear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/stones.svg b/assets/icons/stones.svg new file mode 100644 index 0000000..8b6429c --- /dev/null +++ b/assets/icons/stones.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/strike.svg b/assets/icons/strike.svg new file mode 100644 index 0000000..9f891b2 --- /dev/null +++ b/assets/icons/strike.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/striking-arrows.svg b/assets/icons/striking-arrows.svg new file mode 100644 index 0000000..0133b43 --- /dev/null +++ b/assets/icons/striking-arrows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/striking-balls.svg b/assets/icons/striking-balls.svg new file mode 100644 index 0000000..9b456da --- /dev/null +++ b/assets/icons/striking-balls.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/striking-splinter.svg b/assets/icons/striking-splinter.svg new file mode 100644 index 0000000..1abe84f --- /dev/null +++ b/assets/icons/striking-splinter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/string.svg b/assets/icons/string.svg new file mode 100644 index 0000000..067b5df --- /dev/null +++ b/assets/icons/string.svg @@ -0,0 +1,42 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/strong-man.svg b/assets/icons/strong-man.svg new file mode 100644 index 0000000..90ba305 --- /dev/null +++ b/assets/icons/strong-man.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/strong.svg b/assets/icons/strong.svg new file mode 100644 index 0000000..ea0b2c7 --- /dev/null +++ b/assets/icons/strong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sun-priest.svg b/assets/icons/sun-priest.svg new file mode 100644 index 0000000..7069b3f --- /dev/null +++ b/assets/icons/sun-priest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/surgical-instruments.svg b/assets/icons/surgical-instruments.svg new file mode 100644 index 0000000..b0399a8 --- /dev/null +++ b/assets/icons/surgical-instruments.svg @@ -0,0 +1,30 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/surprised.svg b/assets/icons/surprised.svg new file mode 100644 index 0000000..5933db8 --- /dev/null +++ b/assets/icons/surprised.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/surrender.svg b/assets/icons/surrender.svg new file mode 100644 index 0000000..5862aa3 --- /dev/null +++ b/assets/icons/surrender.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/surrounded-shield.svg b/assets/icons/surrounded-shield.svg new file mode 100644 index 0000000..18a99e3 --- /dev/null +++ b/assets/icons/surrounded-shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/surtr.svg b/assets/icons/surtr.svg new file mode 100644 index 0000000..26cab05 --- /dev/null +++ b/assets/icons/surtr.svg @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/icons/survival.svg b/assets/icons/survival.svg new file mode 100644 index 0000000..265b0ff --- /dev/null +++ b/assets/icons/survival.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/suspicious.svg b/assets/icons/suspicious.svg new file mode 100644 index 0000000..ceda3dd --- /dev/null +++ b/assets/icons/suspicious.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/swimming.svg b/assets/icons/swimming.svg new file mode 100644 index 0000000..035c60f --- /dev/null +++ b/assets/icons/swimming.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/sword-smithing.svg b/assets/icons/sword-smithing.svg new file mode 100644 index 0000000..5484edd --- /dev/null +++ b/assets/icons/sword-smithing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/sword.svg b/assets/icons/sword.svg new file mode 100644 index 0000000..21685ed --- /dev/null +++ b/assets/icons/sword.svg @@ -0,0 +1 @@ +Artboard 70 diff --git a/assets/icons/swordman.svg b/assets/icons/swordman.svg new file mode 100644 index 0000000..1d13055 --- /dev/null +++ b/assets/icons/swordman.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/swordwoman.svg b/assets/icons/swordwoman.svg new file mode 100644 index 0000000..cb478f4 --- /dev/null +++ b/assets/icons/swordwoman.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/tarot-card.svg b/assets/icons/tarot-card.svg new file mode 100644 index 0000000..c8102eb --- /dev/null +++ b/assets/icons/tarot-card.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/icons/tarotry.svg b/assets/icons/tarotry.svg new file mode 100644 index 0000000..935d6f7 --- /dev/null +++ b/assets/icons/tarotry.svg @@ -0,0 +1 @@ +tarot icontarot icon for website, application, printing, document, poster design, etc. \ No newline at end of file diff --git a/assets/icons/taurus.svg b/assets/icons/taurus.svg new file mode 100644 index 0000000..97c7b57 --- /dev/null +++ b/assets/icons/taurus.svg @@ -0,0 +1,799 @@ + + + + + + diff --git a/assets/icons/teacher.svg b/assets/icons/teacher.svg new file mode 100644 index 0000000..a4697d4 --- /dev/null +++ b/assets/icons/teacher.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/team-downgrade.svg b/assets/icons/team-downgrade.svg new file mode 100644 index 0000000..94033e8 --- /dev/null +++ b/assets/icons/team-downgrade.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/team-upgrade.svg b/assets/icons/team-upgrade.svg new file mode 100644 index 0000000..54f8346 --- /dev/null +++ b/assets/icons/team-upgrade.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/telepathy.svg b/assets/icons/telepathy.svg new file mode 100644 index 0000000..72446c0 --- /dev/null +++ b/assets/icons/telepathy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/teleport.svg b/assets/icons/teleport.svg new file mode 100644 index 0000000..7f66ce7 --- /dev/null +++ b/assets/icons/teleport.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/terror.svg b/assets/icons/terror.svg new file mode 100644 index 0000000..2ec9a86 --- /dev/null +++ b/assets/icons/terror.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/textilecraft.svg b/assets/icons/textilecraft.svg new file mode 100644 index 0000000..7d17c1b --- /dev/null +++ b/assets/icons/textilecraft.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/third-eye.svg b/assets/icons/third-eye.svg new file mode 100644 index 0000000..ee80ff2 --- /dev/null +++ b/assets/icons/third-eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/thor.svg b/assets/icons/thor.svg new file mode 100644 index 0000000..339a772 --- /dev/null +++ b/assets/icons/thor.svg @@ -0,0 +1,809 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/three-friends.svg b/assets/icons/three-friends.svg new file mode 100644 index 0000000..18524ba --- /dev/null +++ b/assets/icons/three-friends.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/throne-king.svg b/assets/icons/throne-king.svg new file mode 100644 index 0000000..a4bf141 --- /dev/null +++ b/assets/icons/throne-king.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/throw.svg b/assets/icons/throw.svg new file mode 100644 index 0000000..5f640f7 --- /dev/null +++ b/assets/icons/throw.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/tied-scroll.svg b/assets/icons/tied-scroll.svg new file mode 100644 index 0000000..762c471 --- /dev/null +++ b/assets/icons/tied-scroll.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/tightrope.svg b/assets/icons/tightrope.svg new file mode 100644 index 0000000..fa30b0f --- /dev/null +++ b/assets/icons/tightrope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/timber.svg b/assets/icons/timber.svg new file mode 100644 index 0000000..fcd76ea --- /dev/null +++ b/assets/icons/timber.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/assets/icons/tired.svg b/assets/icons/tired.svg new file mode 100644 index 0000000..3f0ef26 --- /dev/null +++ b/assets/icons/tired.svg @@ -0,0 +1,103 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/torch.svg b/assets/icons/torch.svg new file mode 100644 index 0000000..4ca6d4d --- /dev/null +++ b/assets/icons/torch.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/tornado.svg b/assets/icons/tornado.svg new file mode 100644 index 0000000..e17948b --- /dev/null +++ b/assets/icons/tornado.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/tracking.svg b/assets/icons/tracking.svg new file mode 100644 index 0000000..b1062cd --- /dev/null +++ b/assets/icons/tracking.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/treasure-map.svg b/assets/icons/treasure-map.svg new file mode 100644 index 0000000..6cc90d2 --- /dev/null +++ b/assets/icons/treasure-map.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/tree-branch.svg b/assets/icons/tree-branch.svg new file mode 100644 index 0000000..f4d961e --- /dev/null +++ b/assets/icons/tree-branch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/tree.svg b/assets/icons/tree.svg new file mode 100644 index 0000000..b627e89 --- /dev/null +++ b/assets/icons/tree.svg @@ -0,0 +1,182 @@ + +image/svg+xml diff --git a/assets/icons/tribunal-jury.svg b/assets/icons/tribunal-jury.svg new file mode 100644 index 0000000..8796e70 --- /dev/null +++ b/assets/icons/tribunal-jury.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/trident.svg b/assets/icons/trident.svg new file mode 100644 index 0000000..c7be481 --- /dev/null +++ b/assets/icons/trident.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/trip.svg b/assets/icons/trip.svg new file mode 100644 index 0000000..20f74c2 --- /dev/null +++ b/assets/icons/trip.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/icons/trousers.svg b/assets/icons/trousers.svg new file mode 100644 index 0000000..b208a07 --- /dev/null +++ b/assets/icons/trousers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/trout.svg b/assets/icons/trout.svg new file mode 100644 index 0000000..245628f --- /dev/null +++ b/assets/icons/trout.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/icons/tuna.svg b/assets/icons/tuna.svg new file mode 100644 index 0000000..d64f8c5 --- /dev/null +++ b/assets/icons/tuna.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/assets/icons/tunic.svg b/assets/icons/tunic.svg new file mode 100644 index 0000000..7453275 --- /dev/null +++ b/assets/icons/tunic.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/turkey.svg b/assets/icons/turkey.svg new file mode 100644 index 0000000..5a069ae --- /dev/null +++ b/assets/icons/turkey.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/icons/two-shadows.svg b/assets/icons/two-shadows.svg new file mode 100644 index 0000000..461b442 --- /dev/null +++ b/assets/icons/two-shadows.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/tyr.svg b/assets/icons/tyr.svg new file mode 100644 index 0000000..399f6ce --- /dev/null +++ b/assets/icons/tyr.svg @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/uncertainty.svg b/assets/icons/uncertainty.svg new file mode 100644 index 0000000..81faa79 --- /dev/null +++ b/assets/icons/uncertainty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/unicorn.svg b/assets/icons/unicorn.svg new file mode 100644 index 0000000..71c5e9c --- /dev/null +++ b/assets/icons/unicorn.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/uprising.svg b/assets/icons/uprising.svg new file mode 100644 index 0000000..3f1b5e2 --- /dev/null +++ b/assets/icons/uprising.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/user-gear.svg b/assets/icons/user-gear.svg new file mode 100644 index 0000000..c06bd31 --- /dev/null +++ b/assets/icons/user-gear.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/vampire-cape.svg b/assets/icons/vampire-cape.svg new file mode 100644 index 0000000..dc41097 --- /dev/null +++ b/assets/icons/vampire-cape.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/venus-of-willendorf.svg b/assets/icons/venus-of-willendorf.svg new file mode 100644 index 0000000..f45f914 --- /dev/null +++ b/assets/icons/venus-of-willendorf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/vest.svg b/assets/icons/vest.svg new file mode 100644 index 0000000..decbfee --- /dev/null +++ b/assets/icons/vest.svg @@ -0,0 +1 @@ +Artboard 1 diff --git a/assets/icons/virgo.svg b/assets/icons/virgo.svg new file mode 100644 index 0000000..7951cb5 --- /dev/null +++ b/assets/icons/virgo.svg @@ -0,0 +1,583 @@ + + + + + + diff --git a/assets/icons/visored-helm.svg b/assets/icons/visored-helm.svg new file mode 100644 index 0000000..85db45b --- /dev/null +++ b/assets/icons/visored-helm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/vortex.svg b/assets/icons/vortex.svg new file mode 100644 index 0000000..5eddc1e --- /dev/null +++ b/assets/icons/vortex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/walk.svg b/assets/icons/walk.svg new file mode 100644 index 0000000..375c8a8 --- /dev/null +++ b/assets/icons/walk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/warhammer.svg b/assets/icons/warhammer.svg new file mode 100644 index 0000000..b709549 --- /dev/null +++ b/assets/icons/warhammer.svg @@ -0,0 +1 @@ +Layer 1 diff --git a/assets/icons/water-mill.svg b/assets/icons/water-mill.svg new file mode 100644 index 0000000..37edfcf --- /dev/null +++ b/assets/icons/water-mill.svg @@ -0,0 +1 @@ +009 - Water Mill Created with Sketch. \ No newline at end of file diff --git a/assets/icons/water.svg b/assets/icons/water.svg new file mode 100644 index 0000000..657fde3 --- /dev/null +++ b/assets/icons/water.svg @@ -0,0 +1 @@ +Artboard 1 diff --git a/assets/icons/wave-crest.svg b/assets/icons/wave-crest.svg new file mode 100644 index 0000000..6abf0e4 --- /dev/null +++ b/assets/icons/wave-crest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/waves.svg b/assets/icons/waves.svg new file mode 100644 index 0000000..c53a94f --- /dev/null +++ b/assets/icons/waves.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/weakness.svg b/assets/icons/weakness.svg new file mode 100644 index 0000000..1660883 --- /dev/null +++ b/assets/icons/weakness.svg @@ -0,0 +1,15 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/weather.svg b/assets/icons/weather.svg new file mode 100644 index 0000000..097de61 --- /dev/null +++ b/assets/icons/weather.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/weight-lifting-up.svg b/assets/icons/weight-lifting-up.svg new file mode 100644 index 0000000..8dd4046 --- /dev/null +++ b/assets/icons/weight-lifting-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/weight.svg b/assets/icons/weight.svg new file mode 100644 index 0000000..3d4b6b8 --- /dev/null +++ b/assets/icons/weight.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/whale.svg b/assets/icons/whale.svg new file mode 100644 index 0000000..e965366 --- /dev/null +++ b/assets/icons/whale.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/icons/whip.svg b/assets/icons/whip.svg new file mode 100644 index 0000000..d0c8b24 --- /dev/null +++ b/assets/icons/whip.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/whirlwind.svg b/assets/icons/whirlwind.svg new file mode 100644 index 0000000..9387775 --- /dev/null +++ b/assets/icons/whirlwind.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/will.svg b/assets/icons/will.svg new file mode 100644 index 0000000..b354f19 --- /dev/null +++ b/assets/icons/will.svg @@ -0,0 +1,31 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/wind.svg b/assets/icons/wind.svg new file mode 100644 index 0000000..4720b36 --- /dev/null +++ b/assets/icons/wind.svg @@ -0,0 +1 @@ +54- wind -air-windy- weather diff --git a/assets/icons/wisdom.svg b/assets/icons/wisdom.svg new file mode 100644 index 0000000..ba06dda --- /dev/null +++ b/assets/icons/wisdom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/wizard-staff.svg b/assets/icons/wizard-staff.svg new file mode 100644 index 0000000..5125e88 --- /dev/null +++ b/assets/icons/wizard-staff.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/wolf-head.svg b/assets/icons/wolf-head.svg new file mode 100644 index 0000000..7dbd1c0 --- /dev/null +++ b/assets/icons/wolf-head.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/wolf.svg b/assets/icons/wolf.svg new file mode 100644 index 0000000..7bdcbdb --- /dev/null +++ b/assets/icons/wolf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/wood-pen.svg b/assets/icons/wood-pen.svg new file mode 100644 index 0000000..7536d29 --- /dev/null +++ b/assets/icons/wood-pen.svg @@ -0,0 +1,18 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/woodcraft.svg b/assets/icons/woodcraft.svg new file mode 100644 index 0000000..d009e82 --- /dev/null +++ b/assets/icons/woodcraft.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/ymir.svg b/assets/icons/ymir.svg new file mode 100644 index 0000000..79755ae --- /dev/null +++ b/assets/icons/ymir.svg @@ -0,0 +1,1241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/silhouette/character-bioimage.webp b/assets/silhouette/character-bioimage.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2d8d181f6eb05c3b37e1cdb6150b34067282cee GIT binary patch literal 1738 zcmV;*1~vIoNk&G(1^@t8MM6+kP&gpA1^@uiF94kZD#!pV0X~sPo=T;pqamoYSRk+x z32AQOaWNb7jq%s{-pT*AWElxh#D2_v%lnTL{|EH~{BQbR>$m{^*SMEcj{f9ut zI{Rt+=FEq-^jU{;yUf$oi(TPP2oR6^x4KhY-ZJ@!oRm3dsEZ#ij!U~P@>HF;` zjGzGi{)_Q3FCjLs$)&tXgNf||emuO{SG{yFd|XXntIxBg)UIGgP$-F z?L6haE+`jwcNJnCleL9D63WSR9*;NOAw-9M8y`G!uJF`L^WP0edvA#K?4uN_iW34A zLA2`YtRUaI#BhXjZiN(&7A3r=TA^7&_F;`PQH|2T4c}8x-l8j)W;$sbr?lax(c09j z)Emb%d^6sj9?1*QF|HGu_A1IoIBm*Ze-!jIv)nEsoeWBW^jFbNL4mt_c|V_yrLnkO z)$yD-CZc2UmKPtKY1Z2V3T|Zqa5|+CKi&7;se7bq+eXDwpFa{*p48jtxJl_bmSP__ zTH$TN!jUm;=n&C&2>e57oAMea^z#?WcvM@LASaFw+@uOVCYnYv;XPIN;)jj906fe8 zP1)b=^VXsDt5w&Kb6ibW9seRV1iMuIuR;eC56He%h3}-S6khO^)JJv!j8l~CF163R z64{eW)|Q%lpJzZOWsf9pxDpb2T599-BcVckB&;9Waf7+yw1ZFsgY@yGD z$@je*fR1~*P5vfDqlTB1;D&U%y?!}&!aLUdX;!Usi81+zxcEPv6vHN!n;R{ zicX#VX%f;#JoX^AaA2>%CiSo$**X^nzm8&5m)uR+IV<7sN))?VZEUtFHaTxDRSOpG z_R*&Driw1Nb(83@ew}_+f@^H7UKvA!bj_hlpeE?o0zn)6W>EY%@wg0I57{_rYN0_O zD@4Qs5!h&bxcu2&9qD_yJ>9f|>6qW0Ob1+zeL0D4vZ=gBx=mmkhz!c;7it43*Ae3S z(B`l^Qqy0E?C1VQgLvgb{_V@521XQc@P(KHH0uDtr;PWIiP*}DTj}FKKgl9cHE!OV z`2%BNfH!?V?C>jg{KnKh5&dp*{4GbaE6n$IiJ~bdOa0~JZoUj0k}ixE{U9{F@J`dv zWPmmal*a;&?7$i6ph+3MXZJ^3d=2;GbbJ&}tsruH1$%@yM4@9>le{ouY5s1te~=_F zyM95kcvKcov?%ke0X^I{=b3!i5O=5|MJtY~m9DlUpJD*v-TJu9_eib$yG&g8!?c;z zcoXozTe@6su+bZx8dREhf5kr%j_9xzZvcHV6{O&wnQF%VjRPRm)VK*qP!2m>2M>l` ziFSEXGP_s7%Jz(MJumCf7G~`56S@M(eIe^t2IcVDc)L|7Lp2?SKLm6GYg-X9I%a zSif<^@ffDx)1=fw9g55V^sHC&)ffN(0C_QOhX4Qo literal 0 HcmV?d00001 diff --git a/assets/silhouette/character-headshot.webp b/assets/silhouette/character-headshot.webp new file mode 100644 index 0000000000000000000000000000000000000000..a4efe00fd87abe60176540f8cc72ce58628ce5e2 GIT binary patch literal 568 zcmV-80>}MQNk&F60ssJ4MM6+kP&gnY0ssI|5CEM4Dr5j;06vjGm`Nq1A|Wpl$e^$i z326Wo=bd(ckgqR%89>7YGoL75O7G?-fox#0T_>3eFI*}(dA#JU@=pK`fI`XSYeL_n z($9E^dQ>hWeiRoyByKiG04bk5-yL`?FEnVZnA1)Quy6K}Vo^^2sBV^R^~#0*4XOZt zHtHZk^x#T4)Bphf`LPZqDruf=J)3_Cet5;53(mT`>V?+;+;y`1(4*P(w8nm=%za|X zkb}gjio+d9qT!$~I3ecNlez-+JV-Pm0VKapFMAS~{Egb*xJcMpgJO%aV((nd&8u)d zs-gJuyJP2kn7JXuR?Kg`WI}f)Ex52pA`={Bvh9x1B&zjqL?@{GWCara{q>#3h+^0a zq1Os@ycRvyDf;B{A0Jd<7YU&i87o6a+TAq|B{Wv3K5T5Ld8Nqb8!HRgDCCjHgH!YU zEWPa!yb=Gk8?dP>p1!@oxA2B*1aJ(`;=@8U&mZ7!tbQKT@ GU;qHXL<_$F literal 0 HcmV?d00001 diff --git a/assets/silhouette/character-token.svg b/assets/silhouette/character-token.svg new file mode 100644 index 0000000..c6f4f52 --- /dev/null +++ b/assets/silhouette/character-token.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/assets/silhouette/creature-bioimage.webp b/assets/silhouette/creature-bioimage.webp new file mode 100644 index 0000000000000000000000000000000000000000..c157b90f152bf236f525985f9c062da6d40a02a6 GIT binary patch literal 2656 zcmV-m3ZL~-Nk&Fk3IG6CMM6+kP&gn=3IG6bIslykDyjf10X~sNolB*oqM@L)3y821 z32AQpS9qrDP|E#0{^!}>_V4O_LVjEI^27bT#YkM8^ZX|cixCtrz80KZk!`TB>VhJG#wM?AMgqx9d}>c!1P z{iPd+6G`Ceh@8YcC#&G5n3fChrnEXxErq=lg%SHvcT^4JGwU}F(N^O_UNB?(BTu4{ z$8l9hX|4xk--(t6sy6C3-l1JnPxvd*uT*>@ZQJj$fU00~F98QyL3Ye5i97@f*Pi2h zt)lTZ&B=Y<|D%$p@G4xUjPLeKlPK*=sxrUgQ0Hn9V~ z1F$g8W3A+UvHiy)=6u2_^-GDQE}xq`20Vv=d@Zm}Sts*zzFzOO0H3#!*~b<@gfua2 ztfeTZ@8PU=`a#Dmf&8?^4%9t)V{O-QV)+3VhtCg-S0+$C0UN!r3 z(f~#ITMvQRH&7+DuA#kE=kY~NeWa|r&lpjK*=?LT{YTGdq;dhmnIR(}7(Ac>*}m+j zV+&1gAcjYus14Q-jj@Pzc;hG$N0OtJwE7EOZ2|*p1gNfq`oof*9i%CN-PZ6&FygS?oYuzq?)3h>T-Mp$O+B|Uk-KK*-)SHY&? z?dPxP)p@F%XAtg_BI2-)Abt`u&wl$`jv-1~a4W`DVUF@+Ix^SXN!~%CiNZo(ML51( z!Bn~C&CJv#{wIs3Lp47MM!y6M%R#f%fReuc=h|pW&#R;`Vs8w?g^;(qif9hAKO(WQ zWU2v1&8|*JO z+Y^Y?ZCMhKj156&a~$CKS$#d)v?H$-$-Q-y>=EDUCe8fF?71hw%}i6seyvyF`mS_d znmZ57fA?>_MP$(?7iMs^xUGIwcRFZ^ieQJ33CiOYD;mFr1u z0}kM%jN-o8oksM-;+%P3mRY>0=IOY=wR%ji+JY==Ivb|L@tY48RQ;H0K^af36Xz_P zPY(KsyBSxo274w0(n;35!|Ji5N>+L(r*UKC$T%0$1zfIjt+Ao=Kp?gz$ZK(juHyN@ zdbOk*k(OcrM(869$Afp0HZvfZ&@fH`MGk8rdb%|&Y(5jo3S`aX2M~< z9cb5i?q1d&@>hEBJD$pe+Vio-^haJzJ40m+-+C}QiBCU}NR>RL(%8jrv zP0}p+;BucVmY{VFA!3*P6T+GJrEWT-x83rZ)B!w$--n-Mq_E>YIdlErmSnMe6d;=E zS7~uEb1cnjO)Foys%pZd3kW}PvXd15b%QYUQH`Bl1+z0FaXLe9?Omp>Oagk4|LEG+3kyAmDS;=J8u=m$U z{Ssbaq6F`a_wB%IktJeB;PpUWd5c3NmeZ609rf9SQzJHBx;4$u+{he&tb( z4Km^E(xIbRhOP7p6by`-XLWCuZD>a#E}7!;A=rjdkuAd+6p$ZSb=d%KAKuGWG@PV# zuKNYTyswCxm&_f033z6!ld3D5hpDf5`|)|{%>^Uez4(f@R$O;_6`k_;)tpx!ixVmI z)K+dJ{7ZwRliblFt903YZOFRd88!<({2>Ob1JYV4B@R_N$-NcOCzs$QGfgcv1m!+{ zZRs7_WDgO9E3HJMi!vSb8k#!8t?q+KJkZ5NWG4ENF?2@Mu@)bI|74I@JVH~g3GU3B zk9*mrsb`b<(?IvJ|06~Q8+!Kc>g?AY-U+k5)aaqO`+gQj-pLNbHwlj@D`#d|8(6GZ zJhXx^C*?>HV*sk~-#8sR8m}dGZFlhcDi62ekMfDWR_xL@Z1NAlr%8KfEH_!3*Z({7 zv>*_^$tQKgoc9o}x37PtpE0s(2Lal+bA@#8wObk#EtKFCb1zZMuSIWxWRz_1L_F;? zX6^fB>eaU}Ze8&sn{+Yaur`=Osmjh(?Z3r5- zE)bFOGhdwQ&c{+9UrYGA_TQ&-oetr%gD*uV5g#?ch3na|W4q8=j1`?@_WO Or{+CV{az3NKmY(-MLbLZ literal 0 HcmV?d00001 diff --git a/assets/silhouette/creature-headshot.webp b/assets/silhouette/creature-headshot.webp new file mode 100644 index 0000000000000000000000000000000000000000..11a37ab8d7140837ac97d4f926bf36fa274f2182 GIT binary patch literal 1448 zcmV;Z1y}k~Nk&GX1pok7MM6+kP&goz1pok0DFB@TDgXfh0X~sPo=YX9qM@bLI3TbR z32AQOa*-SJb@PY#4$i;Pa+*mh!yja#1#8{b&PV-U{m&S@Zuf(Iul?^pfBgPZzL)j| z{dwy3`%&zT`)VQC;@@yy;Jv|nelpW!MvbzxT>;RBGft7jwShU0wwK!eeW;dq^qwRw zJ+5Qi-L8jxLhvtWNFX6^L*uYs-=&s}pH^RT-)Rv%;A1+nG5^&E-;IHoC?IDK<#*xz<23;(z5E00u5JW^pj(CU~}ABEH;jtCZJ4;J{75H{!Dy)IxB zSNpxb;Ji8`bhQwuAoS!_Yjo~|nlpXe<0_&a5dGWs0|R%@^ESw$9uWPiKL}E9`l4Cl z-*8^h+m$$pL_8t^XNzf5WP)6gL_8t^X1W0bWTF4n5b%fvcjNyArfrc#JRzt%7`@?k z4nP3@{@pP|9J_^|*#`f<=U7cJcaZRO-!gNx0MRBhjj;t$7tOK6kAg&Lf743rz|l0T z9|UVRv)$ST?wAl;>Gp2UUEQcGz}r&TN~L5;a_;Jh9)7_`lE<&-qajcXCrNbvm1ggq zBE1Nxr49RJ*lExOW*32eJk+8*GYj;Q$dnduqXFeCp(7y?5ce#6<~{;C1!IH6Lp*NL z(#=rQs*PQ`EDli1_X_X%)dw%Z95h9RPGeJ202n({O(aA>8&)HgT6VEFL(N;xzJ6!R9DgXKRYFAvI zL3i+jx>Tnzd~i{xvK}WUmYM7P=|VuEedBjZL`#)J&^7vRI9NE=wwn1BRRA`q<55A) z73ndy#~5ecNBr-{6wWC@m`zIuSSXd3{<-PtFf$6LnE&l?=v&KZLxCjvdp~3^Lc6ZE zpS*UMBGwvGDGD9h0Hsv0nC3*bi*LGwwRdwky&bs)N&hF-NKd}8mTyrxRj49r{6cK0nw$LLF)TJO-5q~snOT0Kdyz^VDukmpXsTct^XI5(^_5#iF_Awu%QwI!88 z&DgJCxp;x*m9BzZN6zk8d#+OSac)^=XY{v!+MJOJn&%+`;*eabdNvh=SzU!{Zt7%5 zbZ+*@YT=kTt3G@D5$E`B;M-i%v86R5$oeYtWp%vZDsKDh7~e5o@967A`el-=EiD%G zvn>*pmvYiK+ReH7WpA1hc3T)il~lV4Ts4HFR6rvp&!E9#J8J@i^l0Fj~FXI&?e ze+D|%?VlO8lQgHQj8OFaax*58te3sJmW$lO*_cQ}I(2h7Pid-FLA4L~oU7ipCpvHT z%YY2<#`xu#FQ`XSY*{QdIPX*!X@Rs7yEVmp^F%XaQtuaGV00J+C&Ck}#1AZaJvg~{ z)k|+c2@OXsh6#I7<~+LqlC%_?W23EB&tVg7n&U`HLgQjp!`QJ6V-oiQdM16UoCRSJ zc)TcoZ>BkC84El!q3|_OR*WdDF1Wv!bWYfW{y_@c`&X^&RWV+CFFqAeOi@03fB*n$ Csl^8X literal 0 HcmV?d00001 diff --git a/assets/silhouette/creature-token.svg b/assets/silhouette/creature-token.svg new file mode 100644 index 0000000..963b591 --- /dev/null +++ b/assets/silhouette/creature-token.svg @@ -0,0 +1,252 @@ + + + + +Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + diff --git a/assets/silhouette/legendary/folk-basic-bioimage.webp b/assets/silhouette/legendary/folk-basic-bioimage.webp new file mode 100644 index 0000000000000000000000000000000000000000..8176c1752c3983772fe7b4bee9dadeb3db199e5e GIT binary patch literal 31530 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≧fS18D!X9r+D(^(N3?o$*U0Vm@5dmRojUL?CmA^ z*x_bZcf=2SZiWCcyX(^FhW5*>o*OZ~Xm7}ik;c&UhNN`Hmj*RD%M*N9E}z$0TN2^2 zLvolsJE@4noxlI74FCR%1F<3Lqv7@!D_d8&8oFNhMt`S@fsk~hHrRQZTKpb`KM7(WqxDIskuQ6Az)PUzxi zkN}E>=7#nEQ<6hxfLYaxIb#8%-2X4rG0YhXue#GQ7yiLC8R{eig>Wa3h9!I}|MM;X zs07|KH{Xc)hE@{dB@OxtQyDw4n5-@@+Vu$6k_J$%5HAkH`kVQjaJYBJY2lQg+({SN zkE=+Bv!rcpplf#hG6w7!XgYjSam)J*Ij*$9;!)L$qp7f;K$d6XdGkx%I$I;6g$-P5 zOD+w!|2{}vG+N900c^j>LaqBt;}`(>vGi$YD<1$a-rodbT5t0rs312)Vl1OP-l4&M z+=I?hj{FPxI9JGJk~DgNGy2;JN&lFTp?@WFopUc*lIu9xq!90zozSUv-oD)xXcjFu zUk!dD;J~$<3_+@QBF_|N%?z~ME@%0e&mbu3MaYlmc4O77>~}#?mXlp$P}y;eUO6V| z^>HdPwYw4;k9d?DtV4DtqQdt67p=o5A`7;|A}7H)LvFg$^P>}#4xN#Zmh)4-6c2N3 zDwY&y4vr-fOG}I9bHW*9MLV&P4rks&4Tj6qZlPW&qlw^GT?kxauPnwh!1$NzJgUhF zpj7NT$yHO2FoDoe$G2s%N*&@~#N54U2+jU0&o);*?rJ5R00&QdNv}4{kd3JLJE#|4 zH1u{$QggVcnH6Kvds;QbHr^y|O5Vtd>XzLMp1?u_D{?|N-koRCr66*ADs=ndNrC{m z?Y&cXCQj78`NX!9C$??dwmVkGwr$(!blkCR+qOD3r)TDU=YKYz;J0hls=I34Yad)^ zRkdrC(YLT79InX~BwkWrt~U-$^Jp;m3C0*w5&OBQn4plLprG=5Yx0UM@k_@DzL6S1 zZ8n^)U1=FMY@e%UaA^%*7E7UpO(@iY;NIK?T`mntIgi8NFdrsCay-@Tz+p}O8O-F% zuSR&Z_yYZ0WN4EsDzaX+4Tr>JPKyiZH4i22`A* zse=wD&)|_c9ea3oCoA3|4DiX5Y%BiD#9-^ym}Rx%R&%SH)pkQ^S)-4H`a$pasMnP6 zP8D%anmOGK+hZ_)*s)r|$9P*P6$&=;jL4o#zl&qEN^oM+!JKT%9r(E08b}QP3Bz3% z{7?Bot(w=7_Cnvx93N$&1G^rH9%nvZxVMXDKP0ytl_^0{WX#B5eCxFpY9C`MwuSwg z{+@iMI(;0}G^J!y9U~AzMz5L^Yf>%qHzTN|SZ;B+&`sH76JD6*N7q)=aztI!GlJdm zos_i1WjcW-I|UDa+NQ>_%WqaRxi`iukb6NYBn5$eg!bpSF{488`R|cm(Nk^@M}aXz zilQkOYgUl#5EhsD>6#(fqZT70`3ME%A}8r#@{*IOC^WFp%@nP@ILhQIt>W}lYMD`> zIEY_Nc{3k>J;t$+SGr$X{%u<=O1NnhD0b_G>*XaIbzmsZ=yjLkcsecZ$)eI2&}Fq1 zjJjP-$IS8zxhO;&!HyQMGGFAWp(beNcJY2zSA;16NVO-0CBg=!*eZ?N;PM^paJ`!; zicBG=w(soJni(6D&2ueQVAmcB83rmc zf@+B|s|u}cKgmU1$j+)!C+tH_lF4V6d}=j);U3<=F1fIXzZ7Ttz@|E zSxk8VL&$e`=G?8xFEhe`Yf#fs13OrXwso22T09?>9AUAt`t)fA;*eZ*`VN}Z6IMM- z-d9SwYe`U_ZGMQgdE^y$nkNWPEtSewC0UYoF}Oe|BFAOL^-sl_41b6%z;J{8EkBwL z6Kg#*Z08J#$U~8GFGE4TMEWlKO_|Rx{!QM{4^xN?1j!w=vzSeov+DWB`sTZJ@26ao zj(6Qa%`yvWIaZQSorqW31GTEV@oR)b16FvZSod*FG>|5dfARQ_JaOr} zY*;e+mvJF<+$>Q!BY#E3i1?d~iA5mDM3vVvTzr6Yc}@$FA%K`{fS$CXjHqz zPX2>09ycOZqRfOB2_sthFuK{Zy7Xx^#7p3)THZbXeuC|_>gV;#^iC2nWf95eGp`a0 zBAuIO4`UQU$=Pf&YocTwQ@EwLq~gO@eds~1au_2GpiSW$^p*CPex@$Vg^knOl_qZ+ zg;J{XT-|^e$8|du$iDUkhDGl9r%3nQwbBrqQfJyM#Vp3!PcTp1JAuzsDA1iMU7q3d zm(8okcc&@j@OtlW4wwEN{;2qLTa}V)hH$hey35g#2c(f7Y$Modl_;N(CHe9?%Y^?P z{Wc>`l0b+im6ddHmhSnk1u6yG>CWXdfLWGtiJV4fK@S}0&-jI>urB~KeJM}8oX33L zqbH)Gv%W(kdDaPDduudcRZVBdxbXgVxrGYsIFadIV7=5v*P|9F4sw#1L+O%`4oF=t zJn+=$KC);ugopvPH;n~kWQV8Byvf{@t96Z!%^RlaTro^DDA z56-G1tkc3je3^+Mnnf558&|x(^WNzFI<2;N! zwMVw<_S3Vo^^GZ2?d=GXKp;gdC?t0kB5=Zb=Hba zdgay;k+bisbZSPcNHhS;Dhnejp|!4{XP>w!o1>EkjUvbkdSuI2F2mCfet)E=^hK^x zLH)rck&tB^@(?T6Mgh{QwkzMV55V57VpAq!H(XC*6Ct>Tnmnt#a?aQ- z!~Ncp*EvAdk z%1~B~ie*D(c*?V|rS3i@s;>ByUquepFsfL=viu0Izw<}3Qm(;7d3VcQN3|s_c=MDK zKAz26<*s0(bsltj>_*!^EHy{F@bT-h&Y#XHT@oMACap#%Og=8v$t@j&oaJeuc&M1( zq;k(bWMK!u`V#M+9AJ@X8C$~OG>Lxc%d_Bm=W=?^1CbiQmDN@Wcw@Y!(YR~3@>pE8 z*{@QdXcSXN9b-*zJm|MT)|mv_Hy(e%`Qo?-ZZJhV$<0onhO#h#De{U!DAC|q8Rhfj zKJG{ds)46br4XPoqUl>1Qkdm16TvMJRn~Ig96*w9Oo+VX0l4LSLR=7klp8v-?X*6~ zK)?683M6+UbLC&LNhiC(^;P@rcb7pYyZpBGR(Zmxe9#@Dr#AIayB$ah!;`XOZaJn5a5wKI(B+ z@?+G>z^cKq+O~4-Z&O3T^z}6f_~23-=-L;yUYW)rdn7+I}qriXgu= zAoYCkWx5!O{t($(XCJe!Cmjk?=yjZo0a?>J4ICs}dVT*UU<`-s zSKn!C+<>Y!To%L;66Q6(=i-M~Q$*1&Ar?X4sG8~s0-&c%6u!u7q}5eymq^jQbB`?Z zBBr){Pu8WKk`X`>XNWl7M2{c7mN$rvn0O*I@O-I|83JbVf!<{Y!CWtb)Uxue{)f`a zTNzRbF!W7?uAXd}SyEi!IsEA^RlDssk+^wC|eI)5POoM=eTbLqw*Cct-e?SX?3JR}l) z7!1&Uz-#l3;uL9Ud3rK@H`Z$Br2d+&tQxiDJ=7(GF1w<;`$UCp%sOU1#Emx^g|no! z^sK(uw58Anx%{=Z2++_v1IHiUP=gLS+5k>h#i31~`Xg zQ{>(aASW7(gV!JtY~nntT_PPmYc`m0;9QIFs3d>OJTYitl@{ucF6f=Z#0lI391g3! z%+5s5o&hK97^zXsg|lFo^CBHaR@w8rI!U6xpsf|c_0Mx#wsm9O*>2yCBOj87Ec{Zc z#iUanB=5i5hRTduhASK+jpG9^%V&Q}mYJG-OFK76GOh!ZZI@D_yAuHPkN_#X2+QkQ zZ~%&C4VY_{l?>(M^{857{HJgFoAIT8eFB|TsXhS{I89cCMSho7r;1ayr^G^b_C)&h zEH%dM8ZNmGYZ4}Uj&Tk@EA2{w9%8kx(bGnM6<^lCN+5pPHt70~4pZ7PQWBSD05+fqjlOm;<9sY6yokj2M1O zG2L4l$HgNhVuiD{I>vt+=~G~Pxu(+sttuT5saVw!H9s|}zOR;MayAc+SlV=sUSGob zoCya;2i|Sz+2|*3*35#4ObiRj1BBiDI|n7EqCtk9XmkOd8_Nmjdtb&1;T|{;G#Kuu z@r{9sef+$}p1$iMZpDi134%^}JqTznl5W0`)$~vI7`v7P_iRX;e)O*+em@#vD8<-$8LP&urv-i`@<8$3H*W|!Nt$Elz&T>mjab0YeiO?q7B z*u=wYSLB~Wh09N-aQ10?#8kvp9xW!SDInXYFLv=qGVJ`DmRc2PQd9X@0^~hKSFwk{ zs(vvz&w%Hpp)@0(!6hKCgF}d~GTpqf>DyHAnM0IKNq?fkD<5V;WPTUeG>G*T(0nl}mo=7a2Sbrbz(mq+dsVLnwot~t3J)i?HQmFc5`+AN-{nwF~*X8cYckg zaSM@THi@Uy3eRxic2}V@CtrP@^LuWqcV%S-?{k3ux(X}hrO%$Q=FcZ}lYXvv#eM76 z%4uW4z%SPci{^Vgedt}ar5YrCm#)Y`($UUGlduvwxR-t`XT#!dG5X9SXSgJ@CRZ=KYqn3E%WGF)D$wJg&DCC>YxH=kUA0D5_%3IMA1v8k1QuciLB9-?oTEe# z96yl2;;uVa$g9fw>bM+IHK)Tb>pP&!GF}pO3c;x*Kpp`uO<;tCLYeuDeP6=69s^Mw z=(-g6Q@Rpwx;pI)3X<1KU+9|2()Cq4eK{{mXm)Z;vb9~+WKTPLyfNxWr`|GQ4hGBy| z|9mm+FC_vtD~g}tIbdu0HbX}?%D->WYaxMKS#PnZ zn>{my`rN+TIOICx8WY+f6`F2cgh#zXToYQ`Q!}P~Ee0=vS!jn&%KE=EG>8o2dU=0bVR&OcZY z&Z}P<=Sl@WP@%~7%g>F%2UCAljCgXNWS(h9=+v3RB|(3V3qw@nhYLu0Z9iuzP}wQ_z@ZH9iAcc6#foD$ zOnBhb1Y)1HrJ+00JB&;7Rv53X<<*uXFBPk5A`bCI#Uu`TJU^{9RXGDU6_;Q8yU|e+ zlG9^IbQgeuqr<;GuZ52RUninV>xojo9gn}?UdF%(GUD`cgU*CHn(Vob0q{vt(jqqR z^UFLzNupmr-Gc*0y59uf5XRK~&hUOerI1HY(4k;`)nF>4fJ#?z$ItpR>P(Q}M2C{p z>lsw@#t7l*&6aHRo9OAd++NXhKyVyKvBn@?1^Qke_Xx@HO)g|-Jxq>x z@NAV-!HpHZMa3Fg0n2Zzye;KS(2eGfCOf;w;;cgx`Da+gUz=?5%~7?i;}YFrron>`s=_{mgIQN(lu%)oJAjfpaRhMFBB4?N(1?%geM$yh+MjdkU)`#heh6&c%M%4=@e{{X!UK%H zl7<@#v?3Ybr4k(erJDaP>Mqhemq`bsOtnY(~B9xP_rb=cU4?N7xr zoA!BdG%z^0*8o3#VFqsoW{yn}-iW83F2$SxjNQFQo4555wrjIjR{jrlZS4dSbXsUd zKD36Cy5QU|-DKlZ+EGv^a$LhX6rpE9{e!^Jn;#?Exi}hvjct zOQ#Q%xBjAt`+wJwjw&7(P}~C5IwEF2!z=AvUcojAAopV^oSgrRJspuKblh(YhvpW< z;V=D0tUMaTI5ueV&_FQ}8@UID88x(TC_nSwR#kgkWAhcp$}|yn1p)pYc4ltk1MU9e zt)DGuBc>41wP-_4_xVl%Z;00T9{_FZ5-crGbFL!h^&#r9U5Bf1i`}YujFhXZXphnv zlF$U;tS!IX%FDq=J4zojpc!HSxv+dnn9L6-p!=y5#ZP%%XE^ktiy=>6oRE(_o~IsE zyDqgp@?xc6Gm+BQDGX-V-J2CVv8 zx-UnYg`s@fb47OrKm^e^97S6Oy&W7_raj)oAmj7jqtL)jngFQ49*1x|4-so=hs**{ zn#U5vGZV*Kk7fLIJ~*#|Yn&)LnUJ$kJXV_;7Kd8>G0qLHR`q$uyOx|L=FjozyVMZV z#4fPDK5E;$J0*oIeIdPAO^4r_*0fGtl<>RFB^6+MoI}H(RZ>d)AxVWCJv~fgzLU}IQ4lof5q4Hl zwsesEIFQ#xJXedx<~lnxQ0$ExfNyw{x6W_A_#WF`yE8oTYWopuHGsV@ucMHo*l4HgXl5y za*($P>?X=VH)7l@hHm>eTFZ|^uJ#LG7G!%R{T!|nyRcyhPMXdQmsJ5Z{4{G0?BsM* zfjd;feeeAK!FLDs@91a83;yMKtgjN2l+Um*?0#zH(?ov`%k6J z_sy=3q-vfofACeo0xCYAs}@apqrUVfo$I61?|*>D7#G0;Pwgt8}w98p3V*i_$_?%j~C<`V< z{KUI=pDW}7F6Wigts3?v<0lv;xU48`gXx8lXa-CgH7=ykTy=cH7N_ii-+qW!e_kRO zAHCaL;h`-k*JD;*394?S$sUJ%_eOIb1GEP3MPbx0QZGV`yd#s;F{FtRGpfVUo`3t$ zt{@m3J4mb0%ajK+tH4Gg>fgc@2xvD8&!z@%j7c4wOQ@<~?g0Ph^H+{7Ekt^+f zEX*fB20R{bVj9Fp{J>G+qn*-B1}g~L^5I$wH6B7Mn=I7=VEHR2TXZz|o9*SlKbtMO z5&zNk{_EeWIhDzgXl1W&oTN&sI5U0gz*6t@4A=D`{Yw>sP=SmwwsGvD+NbX%o{)bE zT8qg@s;^6{V0=dqvwSfQWw7|S8Mt80mcW2#P3U>P^JHqJ(l1l{%lNt+SkkggXmAz= z);7##xlE|mjkyNx6Hz-rf!B}~TBP#ZafnIyZn39?fAA4S9d}K^9XVk6wg~*nn#0jC z3x`n*@pSH#hDlFsMjVe)wzo>>D(^utc$#f{c; zP*0C1H&Bi8UMa(1F>u&A{zC6D0^aisfmc&d?74nQS;RN{3cYC?F(4C}6 zv;!}4i!%L@?bSY{c6?j?SUe8ww!(H|fzk`0z8(EW8g;&X2JYoB{a-g^PQLQno9k5u zJ2?5)&daBg8vxBc_UkWQyU!Bi-Hz+Y7b%X`z=?#HC3l}(g!?~XIa6qI#M49zJP3-J za^k)iO4I6_h;2b(0}A4lng_5pUN5KY2?&BP&k=-QjO@;3`q(nIeNq1RpScDItSL-U zD)x#omc9{n!mSMTtx#R$_)@|l62T)##l5?-4XR7W+8Zy{VqZnb+A`ZivA=e0(&fxF z9A5hd<82Q|erR#AKat4%tp6H`w(Lg9$mJc-5PTMm>|e#TITgY;frm!ReFk$ z5Aj77WSLpO0#WJTpNCs#&%w~(;FiaMx zweH_{`?Z!C<%`(H3$&lm9k|4s$1ijkom*cgCr(c{t3`bwYUt=dq};L`zWKYi3brY7 z@Qj*AgJHrR|3#12hGJ~Mp>@3(>>eQp-4r%b5OQj@Hkm_ADVoI>>#uMa7`v7d$Ap)< zz4l;KYALKRjMH!kmt;#hfQ?5F-4+-F4!+=z9LGDPI$eaF5~MGoe3F;?diNFuQu!i% zSqx?h=Fqs)3e#R3tCsY>v#KPpHR5{Ea_E~>w9+ExE9=hIa15$jDD0Owmq5=aMS}VI zb0z9ZY_wcPD2Ti`U0e1iNnKUzMb-~Gd+({&Hz|z6QBiVE{*_;XIs0|ONZ_qWS_ZYt zTXq6YJ`$sUU(WKaRe5M6MH_(x2HU;PzFLS}WLct%t(h0upO9WB`j_<2H6qx?mv#&^lj;h{8l_P~YSz1-+ zsB`M5q1}0nuZx&hBgg0zAB7GYA~booS9`TPq$sMb0N>18swdgg*}dB_-E_;r&lVFS z?nKe28-{u+2h=c*g@RwUYn2Hw7Kk|dbZ-Bk*JSIQrO<+r`qvQ5-xH(@`qTd`c)!oI z@TR^ZEKJHmjz`-4`+QxfPr>%hohN>-9nl?*_AOn14Br57eHg%SIqgEcyliGb* zt`eR68%-bRVs>T1*h=c_IOkPEbvne@MtO=s?UJciwm^^19Zb(on+~tY8PyFY7Vi-% zq=#Il&$qU?#j8~XQ^E)|Msx!CE1EYMOeAx>sTlokPe(5@4>m(F-n50oc5xey`0}ho zf??_DbU4iyJ>Yorw7CCiGwxO{LFJow0#~Or9=ST-G7svVu-F+yCok+bGU)YXY!KW% zEaAVP@VJs+udr)DIplOpQ$SimDBvC{1eCm0m^c_`1lNc9I!iwvRYE^~A%*%)`cx(~ z>yf~J17fDsfl4CiQ}mgMb|Kdgdetz9-`J~IKVmvVu8mNEqC#VEMnLSBAazR@%(ZjW zZN9!_DJn}ebc)eU_tp^z`>GOVqZ(Q}i;{L?1;m;D#a6AI98mftqKu8yBmgT0=><}) z9un()-Eh-_%={%deND#Hou(O%&JlUg$xpp%2P(U`-S<%_UA?X1L!F2|FL1qL96Nn1 z>Duqd*?1=#BvN42&nHNhDE|`_B`lS(@$nbIm@7~vb9J^aa23*xpG1EM#YTGNY^M?o z{${wkDHrp-c8@#7ptAE)u>5x?*>CD2c1Iv3fEo^UbE?kmp6dBqxJZ?CDg;!zyvhnI zg@o6V*r~>!GInLA$#~SKgO&!V`%WYpN~^eepOxYrb#(|}&0egm9|JUi3pgkMF^*24 z7yEQm^tw5zKG*DincFzoevwiU(WX{!oZ#r^ZftXY^fWz@MG4;1|D!rD#1PHz`2dtV zU}CYoTXbBvxywz2czVM~)&5`yxWJ zUmFs1r|`YFjt#nyYz13-UDom>L4m4szV^48nZz6@pHogSqXRhmf{T2d{AdEG+T%S5 z(37_!NOyBeEf1bh?~JFAL}QP1faIclvG+`8z8(@Malau1{h4o2dl1F$qtq}?3+6pU z@z6VzM`|4;JSHcZi*8Q0_DFz|W`1XgY zbo5wM=}d!gOhX$YX#i_QVIzP zW8b~*kD}`NHLeY}lox{j(YLPg$K^v9IxsJym`2bF#6jEf=1?a$BQQANAYoGarOFR7 z{m1ql7Z=$mB}wgSCz}9p2i#nopoi^KeM%9t)LVYPI+&X)i{$T(QZCEROec%5R0O=H zdyoUyJeuZDk)&09j2`vHIMDHvAvz!Os9NOESl^uqHwccfyP=3i1{yYii|!CETUdly z7Ti3N9N)|Z%1cXJXYyuKYq7tcxYzOp@Z-JUfg3(!!w>)QkjZY?Ls(Q8aB%&m;=vfN zr#Nuf(rY3jU7kvXKKfh8m}mxrhvXrZB(qcVh#BL(I>#K`pg$ALFG4i#D#|HEf|YF1 z@l8uz9)~SmN{=xRo`x%EAF%q`$t|swA^^XQmfaPtI-tM%VzwcqXK`wQQr$x!qB@H# zQL^EM;bn!0w_0rF1g7@KXbgb>qR0@}gM!(HQd)w!05{J$9vX&ie}zp&H}~oJFa?b+ ze8){oO~+4F6AQn#Wj<~abwG^MG(5C&MnaS_7HND)=7&i_w z`_193PxpZ<;3YbdAXu}b@++(LHSQW5K3Nyzdxxa1r77~Dx%F#ui<6~?pJ&BeYWq2d z=D%P*;;h=rF;q&WF;1?nb#nR29#djVWIwKF_6mu zeFNKWDZ*}U`GZv^3l<^4;W*ABkOY#`s2-aBSpIe3$GF8|{8hm@1W~>=y^&z;r_w`2 zuxN%)bUA07ZZ9GYhizq93`#^AXXv(2EQ(fbT)->YTi}l!2F3ZKi}P99Y}*|r=o|sj z4pgRfr;rV?jgPM5oW^xSBF_p#i^lI~1d%SMdp4O^oabPgaB3Q>mUuW(oiEW0+_*NX z6zxhlc-RD07V?!7r<_@B>_fI)6nFTT2>Ou=`Gb- zxi{XvC(>E9WBO!|kyF`|S6&ZCGDok~9hmSqUTEZfi-NC+ z-fq<6K^$4mLEMYd4;dm;ekR6oNlOminM6NVcFP)`v%Y;SpZX?TnR;<{K7hvYq|3p5!H3~fV@0_=HC<=011K$0Q;vv{xtvyE&$^H(Exx32;Tpv4M3>=#{&ugfTH~$f4CI@ z{D1uB|Hl72r2h4Pnf_;lN&o<${>{LdSXh`7LH=J20tyBw_}_JACZ+eIjKLY;|_>aJU1pXuNAA$b}{72wF0{?#m F{x58sfu8^X literal 0 HcmV?d00001 diff --git a/assets/silhouette/legendary/folk-basic-headshot.webp b/assets/silhouette/legendary/folk-basic-headshot.webp new file mode 100644 index 0000000000000000000000000000000000000000..f61d57db7277e67df33c63214705897955d9cbd6 GIT binary patch literal 2810 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 M{>%8d90t+=04IZZr~m)} literal 0 HcmV?d00001 diff --git a/assets/silhouette/legendary/folk-basic-token.svg b/assets/silhouette/legendary/folk-basic-token.svg new file mode 100644 index 0000000..21c30fe --- /dev/null +++ b/assets/silhouette/legendary/folk-basic-token.svg @@ -0,0 +1,4 @@ + + + + diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..ea7ef45 --- /dev/null +++ b/biome.json @@ -0,0 +1,279 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json", + "formatter": { + "enabled": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 4, + "lineEnding": "lf", + "lineWidth": 80, + "attributePosition": "auto", + "ignore": [ + "**/audio", + "**/css", + "**/fonts", + "**/images", + "**/lang", + "**/nogit", + "**/packs", + "**/system.json", + "**/template.json", + "**/package-lock.json", + "**/*.json", + "**/*.html", + "**/*.hbs" + ] + }, + "organizeImports": { "enabled": true }, + "linter": { + "enabled": true, + "rules": { + "recommended": false, + "complexity": { + "noExtraBooleanCast": "error", + "noMultipleSpacesInRegularExpressionLiterals": "error", + "noUselessCatch": "error", + "noWith": "error" + }, + "correctness": { + "noConstAssign": "error", + "noConstantCondition": "error", + "noEmptyCharacterClassInRegex": "error", + "noEmptyPattern": "error", + "noGlobalObjectCalls": "error", + "noInvalidConstructorSuper": "error", + "noInvalidNewBuiltin": "error", + "noNonoctalDecimalEscape": "error", + "noPrecisionLoss": "error", + "noSelfAssign": "error", + "noSetterReturn": "error", + "noSwitchDeclarations": "error", + "noUndeclaredVariables": "error", + "noUnreachable": "error", + "noUnreachableSuper": "error", + "noUnsafeFinally": "error", + "noUnsafeOptionalChaining": "error", + "noUnusedLabels": "error", + "noUnusedPrivateClassMembers": "error", + "noUnusedVariables": "error", + "useIsNan": "error", + "useValidForDirection": "error", + "useYield": "error" + }, + "style": { "useBlockStatements": "off" }, + "suspicious": { + "noAsyncPromiseExecutor": "error", + "noCatchAssign": "error", + "noClassAssign": "error", + "noCompareNegZero": "error", + "noControlCharactersInRegex": "error", + "noDebugger": "error", + "noDuplicateCase": "error", + "noDuplicateClassMembers": "error", + "noDuplicateObjectKeys": "error", + "noDuplicateParameters": "error", + "noEmptyBlockStatements": "error", + "noFallthroughSwitchClause": "error", + "noFunctionAssign": "error", + "noGlobalAssign": "error", + "noImportAssign": "error", + "noMisleadingCharacterClass": "error", + "noPrototypeBuiltins": "error", + "noRedeclare": "error", + "noShadowRestrictedNames": "error", + "noUnsafeNegation": "error", + "useGetterReturn": "error", + "useValidTypeof": "error" + } + } + }, + "javascript": { + "formatter": { + "jsxQuoteStyle": "double", + "indentStyle": "space", + "indentWidth": 4, + "quoteProperties": "asNeeded", + "trailingCommas": "all", + "semicolons": "always", + "arrowParentheses": "always", + "bracketSpacing": true, + "bracketSameLine": false, + "quoteStyle": "double", + "attributePosition": "auto" + }, + "globals": [ + "$", + "ActiveEffect", + "ActiveEffects", + "ActiveEffectConfig", + "Actor", + "Actors", + "ActorSheet", + "AudioHelper", + "BaseItem", + "canvas", + "ChatMessage", + "Collection", + "CONFIG", + "CONST", + "ContextMenu", + "Dialog", + "DocumentSheet", + "DocumentSheetConfig", + "Folder", + "FormDataExtended", + "foundry", + "fromUuid", + "fromUuidSync", + "game", + "Handlebars", + "HandlebarsHelpers", + "Hooks", + "Item", + "Items", + "ItemSheet", + "jQuery", + "loadTemplates", + "location", + "Macro", + "MacroConfig", + "Macros", + "MersenneTwister", + "onabort", + "onafterprint", + "onanimationcancel", + "onanimationend", + "onanimationiteration", + "onanimationstart", + "onappinstalled", + "onauxclick", + "onbeforeinput", + "onbeforeinstallprompt", + "onbeforematch", + "onbeforeprint", + "onbeforetoggle", + "onbeforeunload", + "onbeforexrselect", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontentvisibilityautostatechange", + "oncontextlost", + "oncontextmenu", + "oncontextrestored", + "oncopy", + "oncuechange", + "oncut", + "ondblclick", + "ondevicemotion", + "ondeviceorientation", + "ondeviceorientationabsolute", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "onformdata", + "ongamepadconnected", + "ongamepaddisconnected", + "ongotpointercapture", + "onhashchange", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onlanguagechange", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onlostpointercapture", + "onmessage", + "onmessageerror", + "onmousedown", + "onmouseenter", + "onmouseleave", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onoffline", + "ononline", + "onpagehide", + "onpagereveal", + "onpageshow", + "onpageswap", + "onpaste", + "onpause", + "onplay", + "onplaying", + "onpointercancel", + "onpointerdown", + "onpointerenter", + "onpointerleave", + "onpointermove", + "onpointerout", + "onpointerover", + "onpointerrawupdate", + "onpointerup", + "onpopstate", + "onprogress", + "onratechange", + "onrejectionhandled", + "onreset", + "onresize", + "onscroll", + "onscrollend", + "onsearch", + "onsecuritypolicyviolation", + "onseeked", + "onseeking", + "onselect", + "onselectionchange", + "onselectstart", + "onslotchange", + "onstalled", + "onstorage", + "onsubmit", + "onsuspend", + "ontimeupdate", + "ontoggle", + "ontransitioncancel", + "ontransitionend", + "ontransitionrun", + "ontransitionstart", + "onunhandledrejection", + "onunload", + "onvolumechange", + "onwaiting", + "onwheel", + "Ray", + "renderTemplate", + "Roll", + "ROUTE_PREFIX", + "SearchFilter", + "SettingsConfig", + "SimpleCalendar", + "SortingHelpers", + "TextEditor", + "Token", + "TokenDocument", + "Tour", + "ui" + ] + }, + "overrides": [{ "include": ["**/*.hbs"] }] +} diff --git a/css/sohl.css b/css/sohl.css new file mode 100644 index 0000000..4ba9cc9 --- /dev/null +++ b/css/sohl.css @@ -0,0 +1,1565 @@ +@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap"); +/* Global styles */ +/*.window-app { + font-family: $font-primary; +}*/ +.rollable:hover, .rollable:focus { + color: #000; + text-shadow: 0 0 10px red; + cursor: pointer; +} + +section.highlight { + padding: 0 5px; + background: rgba(247, 230, 2, 0.05); + border: 1px solid #666; +} + +.grid, +.grid-2col { + display: grid; + grid-column: span 2/span 2; + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-auto-rows: minmax(40px, auto); + gap: 0 10px; + margin: 0; + padding: 0; +} + +.grid-fixed-row { + grid-template-rows: 40px; +} + +.grid-3col { + grid-column: span 3/span 3; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-4col { + grid-column: span 4/span 4; + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.grid-5col { + grid-column: span 5/span 5; + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.grid-6col { + grid-column: span 6/span 6; + grid-template-columns: repeat(6, minmax(0, 1fr)); +} + +.grid-7col { + grid-column: span 7/span 7; + grid-template-columns: repeat(7, minmax(0, 1fr)); +} + +.grid-8col { + grid-column: span 8/span 8; + grid-template-columns: repeat(8, minmax(0, 1fr)); +} + +.grid-9col { + grid-column: span 9/span 9; + grid-template-columns: repeat(9, minmax(0, 1fr)); +} + +.grid-10col { + grid-column: span 10/span 10; + grid-template-columns: repeat(10, minmax(0, 1fr)); +} + +.grid-11col { + grid-column: span 11/span 11; + grid-template-columns: repeat(11, minmax(0, 1fr)); +} + +.grid-12col { + grid-column: span 12/span 12; + grid-template-columns: repeat(12, minmax(0, 1fr)); +} + +.flex-group-center, +.flex-group-left, +.flex-group-right { + justify-content: center; + align-items: center; + text-align: center; +} + +.flex-group-left { + justify-content: flex-start; + text-align: left; +} + +.flex-group-right { + justify-content: flex-end; + text-align: right; +} + +.flex-center { + align-items: center; + justify-content: center; + text-align: center; +} + +.flex-between { + justify-content: space-between; +} + +.chat-card { + font-style: normal; + font-size: 15px; +} +.chat-card .card-header { + text-align: center; + padding: 3px 0; + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; + background-color: #bbb; + color: #111; +} +.chat-card .card-header h3 { + flex: 1; + margin: 0; + line-height: 25px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + color: #4b4a44; +} +.chat-card .card-header h4 { + flex: 1; + margin: 0; + line-height: 20px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 16px; + font-weight: 700; + color: #4b4a44; +} +.chat-card .card-header h3:hover { + color: #111; + text-shadow: 0 0 10px red; +} +.chat-card .mingap { + gap: 3px; +} +.chat-card .header { + text-align: center; + font-weight: bold; +} +.chat-card .center { + text-align: center; +} +.chat-card .result-desc { + color: blue; + font-weight: bold; +} +.chat-card .weapon-broke { + text-align: center; + color: red; + font-weight: bold; +} +.chat-card .card-content { + margin: 5px 0; +} +.chat-card .card-content h3 { + font-size: 12px; + margin: 0; + font-weight: bold; +} +.chat-card .card-content .label { + font-weight: bold; + padding-right: 5px; + text-align: right; +} +.chat-card .card-content .value { + text-align: left; +} +.chat-card .card-content .adjustment { + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; +} +.chat-card .card-content .adj-name { + text-align: left; + flex: 1 0 10px; +} +.chat-card .card-content .adj-value { + text-align: left; + padding-left: 10px; + flex: 0 0 80px; +} +.chat-card .card-footer { + padding: 3px 0 0; + border-top: 2px groove #fff; + text-align: center; + font-size: 16px; +} +.chat-card .critical-success-block { + background-color: green; + color: white; +} +.chat-card .critical-failure-block { + background-color: red; + color: white; +} +.chat-card .critical-success-text { + color: green; + font-weight: bold; +} +.chat-card .critical-failure-text { + color: red; + font-weight: bold; +} +.chat-card .note { + font-style: italic; +} +.chat-card .notice-header { + border-top: 2px groove; + color: red; + text-align: center; + font-weight: bold; +} +.chat-card .notice-body { + color: red; + text-align: center; +} +.chat-card .success-text { + color: green; +} +.chat-card .failure-text { + color: red; +} +.chat-card .emphasize-text { + font-style: italic; +} + +.tooltip { + position: relative; + display: inline-block; +} + +.tooltiptext { + text-transform: none; + font-size: 12px; + visibility: hidden; + width: 240px; + background-color: rgb(216, 189, 36); + color: #111; + text-align: left; + border-radius: 6px; + padding: 5px 5px; + /* Position the tooltip */ + position: absolute; + bottom: 150%; + left: 50%; + margin-left: -60px; +} + +.tooltiptext::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: rgb(216, 189, 36) transparent transparent transparent; +} + +.tooltip:hover .tooltiptext { + visibility: visible; +} + +.sheet nav.sheet-tabs { + height: 32px; + flex: 0 0 32px; + margin: 4px 0; + line-height: 32px; + border: none; +} +.sheet nav.sheet-tabs .item { + padding: 0; +} + +#hotbar li.macro { + background: url("../ui/parchment.jpg"); +} + +/* Styles limited to sohl sheets */ +.sohl { + @import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap"); +} +.sohl .window-content { + background: url("../ui/parchment.jpg") repeat; + font-size: 13px; + color: #191813; +} +.sohl .print-window-content { + font-size: 13px; + color: #191813; + background: white; +} +.sohl input[type=text], +.sohl input[type=number], +.sohl select { + height: calc(100% - 2px); + border: 1px solid #7a7971; + background: rgba(0, 0, 0, 0.05); + color: #191813; +} +.sohl input[type=text]:hover, +.sohl input[type=number]:hover, +.sohl input[type=text]:focus, +.sohl input[type=number]:focus { + border: 1px solid #111; + box-shadow: 0 0 8px red; +} +.sohl input:disabled, +.sohl select:disabled, +.sohl textarea:disabled { + color: #4b4a44; +} +.sohl input:disabled:hover, +.sohl select:disabled:hover, +.sohl textarea:disabled:hover, +.sohl input:disabled:focus, +.sohl select:disabled:focus, +.sohl textarea:disabled:focus { + box-shadow: none !important; + border: 1px solid transparent !important; + outline: none !important; +} +.sohl button { + background: rgba(0, 0, 0, 0.1); + border: 2px groove #eeede0; +} +.sohl label.checkbox { + flex: auto; + padding: 0; + margin: 0; + height: 22px; + line-height: 22px; + font-size: 11px; +} +.sohl label.checkbox > input[type=checkbox] { + width: 16px; + height: 16px; + margin: 0 2px 0 0; + position: relative; + top: 4px; +} +.sohl label.checkbox.right > input[type=checkbox] { + margin: 0 0 0 2px; +} +.sohl label.init-checkbox { + flex: auto; + padding: 0; + margin: 0 0 0 2px; + height: 22px; + line-height: 22px; +} +.sohl .sheet .window-content { + overflow-y: hidden; + padding: 5px; + background: url("../ui/parchment.jpg") repeat; + font-size: 13px; + color: #191813; +} +.sohl .sheet .window-content form { + height: 100%; + overflow: hidden; +} +.sohl .sheet .window-content .tab { + height: 100%; + overflow-y: hidden; + align-content: flex-start; +} +.sohl .sheet input[type=text], +.sohl .sheet input[type=number] { + background: none; + border: 1px solid transparent; +} +.sohl .sheet input[type=text]:hover, +.sohl .sheet input[type=number]:hover, +.sohl .sheet input[type=text]:focus, +.sohl .sheet input[type=number]:focus { + border: 1px solid #111; +} +.sohl .sheet select { + flex: 1; + font-size: 12px; + height: 22px; + background: transparent; +} +.sohl .sheet .editable .rollable:hover { + color: #000; + text-shadow: 0 0 10px red; + cursor: pointer; +} +.sohl .sheet span.sep { + flex: none; + margin: 0 1px; + display: inline; + position: relative; + color: #7a7971; + font-weight: normal; +} +.sohl .sheet .editor { + height: 100%; +} +.sohl .sheet .editor .tox-toolbar-overlord, +.sohl .sheet .editor .tox-toolbar__primary { + background: none; +} +.sohl .sheet .sheet-header .header-details { + font-size: 20px; + font-weight: 700; +} +.sohl .sheet .sheet-header h1 { + flex: 1; + border-bottom: none; + height: 60px; + margin: 0; + padding: 5px; +} +.sohl .sheet .sheet-header h1 input { + display: block; + height: 50px; + font-size: 32px; + margin: 0; +} +.sohl .sheet .sheet-header img.profile { + flex: 0 0 100px; + max-width: 100px; + height: 100px; + object-fit: contain; + border: none; + border-right: 2px groove #eeede0; +} +.sohl .sheet .sheet-header .summary { + flex: 0 0 100%; + height: 40px; + margin: 0; + padding: 0; + list-style: none; + border-top: 2px groove #eeede0; + border-bottom: none; +} +.sohl .sheet .sheet-header .summary li { + height: calc(100% - 6px); + float: left; + margin: 2px 0; + padding: 0; + border-right: 2px groove #eeede0; + line-height: 34px; + color: #4b4a44; +} +.sohl .sheet .sheet-header .summary li :last-child { + border-right: none; +} +.sohl .sheet .sheet-header .subtype { + font-size: 16px; + font-weight: 700; +} +.sohl .sheet .sheet-navigation { + flex: 0 0 30px; + margin-bottom: 5px; + font-size: 20px; + font-weight: 700; +} +.sohl .sheet .sheet-navigation .item { + height: 30px; + line-height: 32px; + margin: 0 24px; + border-bottom: 3px solid #b5b3a4; +} +.sohl .sheet .sheet-navigation .item .active { + border-bottom: 3px solid #44191a; +} +.sohl .sheet-body .macro .command { + height: calc(100% - 80px); +} +.sohl .sheet-body .macro .command textarea { + width: 100%; + height: 100%; + box-sizing: border-box; +} +.sohl .search-bar { + align-items: center; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + padding-bottom: 5px; +} +.sohl img.token-image { + flex: 0 0 120px; + height: 120px; + margin-right: 10px; + object-fit: contain; + background: white; +} +.sohl img.bio-image { + flex: 0 0 200px; + margin-right: 10px; + object-fit: contain; + background: white; +} +.sohl label.header { + font-weight: bold; + text-transform: uppercase; + text-align: left; + padding-left: 4px; +} +.sohl .search-items { + display: flex; + padding-bottom: 2px; +} +.sohl .search-items .search-criteria { + flex: 1 0 100px; + text-align: left; + padding-left: 5px; +} +.sohl .search-items .search-controls { + flex: 0 0 25px; + text-align: right; + line-height: var(--form-field-height); +} +.sohl .search-items .search-controls .search-control { + flex: 0 0 22px; + font-size: 16px; + vertical-align: -0.125em; + text-align: right; + color: #4b4a44; + padding-right: 5px; +} +.sohl .search-items .search-controls .disabled { + color: #9a998f; +} +.sohl .facade img.facade-image { + flex: 0 0 200px; + object-fit: contain; + background: white; +} +.sohl .facade .facade-description { + margin-left: 5px; +} +.sohl .item-form { + font-family: "Signika", sans-serif; +} +.sohl form .form-group .form-fields { + justify-content: flex-start; +} +.sohl .sheet .sheet-header-entity { + flex: 0 0 120px; + overflow: hidden; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + margin-bottom: 10px; + border-bottom: 2px groove #eeede0; +} +.sohl .sheet .sheet-header-entity .profile-img { + flex: 0 0 120px; + height: 120px; + margin-right: 10px; + object-fit: contain; +} +.sohl .sheet .sheet-header-entity .header-fields .name-attribute { + border-bottom: 2px groove #eeede0; +} +.sohl .sheet .sheet-header-entity .header-fields .name-attribute h1.charname { + height: 40px; + padding: 0px; + margin: 5px 0; + border-bottom: 0; + flex: 1 0 200px; +} +.sohl .sheet .sheet-header-entity .header-fields .name-attribute h1.charname input { + width: 100%; + height: 100%; + margin: 0; +} +.sohl .sheet .sheet-header-entity .header-fields .name-attribute .healtharea { + flex: 0 0 110px; +} +.sohl .sheet .sheet-header-entity .header-fields .name-attribute .health { + text-align: center; + padding: 5px 0 0; +} +.sohl .sheet .sheet-header-entity .header-fields .name-attribute .health .label { + font-size: 14px; + text-transform: uppercase; + font-weight: bold; +} +.sohl .sheet .sheet-header-entity .header-fields .name-attribute .healthbar { + width: 100%; + margin-bottom: 5px; + background: #7a7971; + border: 1px solid #000; + border-radius: 3px; +} +.sohl .sheet .sheet-header-entity .header-fields .name-attribute .healthbar .bar { + height: 4px; + margin: 1px; + display: block; + background: #afebff; + border: 1px solid #000; + border-radius: 2px; +} +.sohl .sheet .sheet-header-entity .header-fields .name-attribute .empty { + height: 100%; +} +.sohl .sheet .sheet-header-entity .header-fields .header-stat-block { + flex: 0 0 140px; +} +.sohl .sheet .sheet-header-entity .header-fields .header-stat-block .penalties { + padding: 0 0 5px; + font-size: 12px; + font-weight: bold; + align-items: center; +} +.sohl .sheet .sheet-header-entity .header-fields .header-stat-block .penalties .capacity-value { + font-size: 14px; +} +.sohl .sheet .sheet-header-entity .header-fields .header-stat-block .penalties .capacity-label { + text-transform: uppercase; + font-size: 14px; + flex: 0 0 100px; +} +.sohl .sheet .sheet-header-entity .header-fields .header-attributes { + font-size: 10px; +} +.sohl .sheet .sheet-header-entity .header-fields .header-attributes textarea.description { + resize: none; + font-family: "Signika", sans-serif; + font-size: 13px; + border: none; + background: transparent; +} +.sohl .sheet .sheet-header-entity .header-fields .header-attributes .attribute { + min-height: 40px; + margin: 2px; +} +.sohl .sheet .sheet-header-entity .header-fields .header-attributes .attribute .label { + font-size: 10px; + text-transform: uppercase; + font-weight: bold; +} +.sohl .sheet .sheet-header-entity .header-fields .header-attributes .attribute .value { + font-size: 18px; + height: calc(100% - 6px); +} +.sohl .sheet .sheet-header-entity .header-fields .effect-buttons { + flex: 0 0 300px; +} +.sohl .sheet .sheet-header-entity .header-fields .effect-buttons .effect-button { + border: 1px; + color: black; + padding: 0px; + text-align: center; + text-decoration: none; + display: inline-block; + margin: 4px 2px; + border-radius: 16px; + border-style: solid; + height: 30px; + width: 40px; +} +.sohl .sheet .sheet-header-entity .header-fields .effect-buttons .active { + color: white; + background-color: blue; +} +.sohl .sheet .sheet-header-entity .header-fields .bodypart-statuses { + margin: 0; + gap: 2px; +} +.sohl .sheet .sheet-header-entity .header-fields .bodypart-statuses .bodypart-status { + border: 1px; + color: black; + padding-top: 3px; + text-align: center; + text-decoration: none; + display: inline-block; + margin: 4px 2px; + border-radius: 16px; + border-style: solid; + height: 25px; +} +.sohl .sheet .sheet-header-entity .header-fields .bodypart-statuses .none { + background-color: #ddd; +} +.sohl .sheet .sheet-header-entity .header-fields .bodypart-statuses .impaired { + background-color: rgb(212, 208, 12); +} +.sohl .sheet .sheet-header-entity .header-fields .bodypart-statuses .unusable { + background-color: rgb(245, 75, 75); +} +.sohl .sheet-header-object { + flex: 0 0 120px; + overflow: hidden; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + margin-bottom: 10px; + border-bottom: 2px groove #eeede0; +} +.sohl .sheet-header-object .profile-img { + flex: 0 0 120px; + height: 120px; + margin-right: 10px; + object-fit: contain; +} +.sohl .sheet-header-object .header-fields .name-attribute { + border-bottom: 2px groove #eeede0; +} +.sohl .sheet-header-object .header-fields .name-attribute h1.charname { + height: 40px; + padding: 0px; + margin: 5px 0; + border-bottom: 0; + flex: 1 0 350px; +} +.sohl .sheet-header-object .header-fields .name-attribute h1.charname input { + width: 100%; + height: 100%; + margin: 0; +} +.sohl .sheet-header-object .header-fields .header-stat-block { + flex: 0 0 140px; +} +.sohl .sheet-header-object .header-fields .header-stat-block .penalties { + padding: 0 0 5px; + font-size: 12px; + font-weight: bold; + align-items: center; +} +.sohl .sheet-header-object .header-fields .header-stat-block .penalties .capacity-value { + font-size: 14px; +} +.sohl .sheet-header-object .header-fields .header-stat-block .penalties .capacity-label { + text-transform: uppercase; + font-size: 14px; + flex: 0 0 100px; +} +.sohl .sheet-header-object .header-fields .header-stat-block .endurance { + text-align: center; + padding: 5px 0 0; +} +.sohl .sheet-header-object .header-fields .header-stat-block .endurance .label { + font-size: 14px; + text-transform: uppercase; + font-weight: bold; +} +.sohl .sheet-header-object .header-fields .header-stat-block .endbar { + flex: 0 0 8px; + width: 100%; + margin-bottom: 5px; + background: #7a7971; + border: 1px solid #000; + border-radius: 3px; +} +.sohl .sheet-header-object .header-fields .header-stat-block .endbar .bar { + height: 4px; + margin: 1px; + display: block; + background: #afebff; + border: 1px solid #000; + border-radius: 2px; +} +.sohl .sheet-header-object .header-fields .header-attributes { + font-size: 10px; +} +.sohl .sheet-header-object .header-fields .header-attributes textarea.description { + resize: none; + font-family: "Signika", sans-serif; + font-size: 13px; + border: none; + background: transparent; +} +.sohl .sheet-header-object .header-fields .header-attributes .attribute { + min-height: 40px; + margin: 2px; +} +.sohl .sheet-header-object .header-fields .header-attributes .attribute .label { + font-size: 10px; + text-transform: uppercase; + font-weight: bold; +} +.sohl .sheet-header-object .header-fields .header-attributes .attribute .value { + font-size: 18px; + height: calc(100% - 6px); +} +.sohl .sheet-header-object .header-fields .effect-buttons { + flex: 1 0 300px; +} +.sohl .sheet-header-object .header-fields .effect-buttons .effect-button { + border: 1px; + color: black; + padding: 0px; + text-align: center; + text-decoration: none; + display: inline-block; + margin: 4px 2px; + border-radius: 16px; + border-style: solid; + height: 30px; + width: 40px; +} +.sohl .sheet-header-object .header-fields .effect-buttons .active { + color: white; + background-color: blue; +} +.sohl .sheet-header-object .header-fields .zone-statuses { + margin: 0; + gap: 2px; +} +.sohl .sheet-header-object .header-fields .zone-statuses .bodyzone-status { + border: 1px; + color: black; + padding-top: 3px; + text-align: center; + text-decoration: none; + display: inline-block; + margin: 4px 2px; + border-radius: 16px; + border-style: solid; + height: 25px; +} +.sohl .sheet-header-object .header-fields .zone-statuses .none { + background-color: #ddd; +} +.sohl .sheet-header-object .header-fields .zone-statuses .impaired { + background-color: rgb(212, 208, 12); +} +.sohl .sheet-header-object .header-fields .zone-statuses .unusable { + background-color: rgb(245, 75, 75); +} +.sohl .sheet-tabs { + flex: 0; +} +.sohl .sheet-body, +.sohl .sheet-body .tab, +.sohl .sheet-body .tab .editor { + height: 100%; +} +.sohl .tox .tox-edit-area { + padding: 0 8px; +} +.sohl .resource { + display: flex; + flex: 1; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; +} +.sohl .resource .time-label { + flex: 0 0 100px; +} +.sohl .resource .time-control { + flex: 0 0 60px; +} +.sohl .resource-label { + font-weight: bold; + text-transform: uppercase; +} +.sohl .artifact { + padding-top: 5px; + align-items: center; +} +.sohl .text-field { + align-items: top; +} +.sohl .text-field label { + font-weight: bold; + text-transform: uppercase; +} +.sohl .tabs { + flex: 0 0 30px; + margin-bottom: 5px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; +} +.sohl .tabs .item { + height: 30px; + line-height: 32px; + margin: 0 24px; + border-bottom: 3px solid #b5b3a4; +} +.sohl .tabs .item.active { + text-shadow: none; + border-bottom: 3px solid black; + font-size: 25px; +} +.sohl .sheet-body .tab { + margin-right: 5px; +} +.sohl .items h2 { + flex: 1; + margin: 0; + line-height: 36px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + color: #4b4a44; + background-color: #bbb; + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; + padding: 5px; +} +.sohl .items .danger { + color: red; +} +.sohl .items .disabled { + color: #9a998f; +} +.sohl .items .nocarry { + color: #9a998f; +} +.sohl .items .items-list { + list-style: none; + margin: 7px 0; + padding: 0; + overflow-y: hidden; +} +.sohl .items .items-list .items-header { + margin: 2px 0; + padding: 0; + align-items: center; + background: rgba(0, 0, 0, 0.15); + border: 2px groove #eeede0; + font-weight: bold; + line-height: 24px; +} +.sohl .items .items-list .items-header h3 { + margin: 0; + padding-left: 5px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + font-size: 16px; +} +.sohl .items .items-list .items-header h3 .fas { + padding-right: 5px; +} +.sohl .items .items-list .items-header .item-name { + color: #191813; + border-right: 1px solid #c9c7b8; +} +.sohl .items .items-list .items-header .item-name i { + font-size: 12px; + padding-left: 5px; +} +.sohl .items .items-list .items-header .capacity { + flex: 0 0 140px; + text-align: right; + padding-right: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .items .items-list .items-header .overmaxcap { + color: red; + font-weight: bold; +} +.sohl .items .items-list .items-header .overencumberedcap { + color: #c18c00; + font-weight: bold; +} +.sohl .items .items-list .item-list { + list-style: none; + margin: 0; + padding: 0; +} +.sohl .items .items-list .name { + flex: 0 0 200px; + cursor: pointer; + max-height: 30px; + overflow: hidden; + border-right: 1px solid #c9c7b8; +} +.sohl .items .items-list .name h4 { + margin: 0; + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; +} +.sohl .items .items-list .short-name { + flex: 0 0 120px; + cursor: pointer; + max-height: 30px; + overflow: hidden; + border-right: 1px solid #c9c7b8; +} +.sohl .items .items-list .short-name h4 { + margin: 0; + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.sohl .items .items-list .detail { + font-size: 12px; + border-right: 1px solid #c9c7b8; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .items .items-list .notes { + flex: 1 0 25px; + text-align: left; + padding-left: 5px; +} +.sohl .items .items-list .type { + flex: 0 0 60px; + text-align: center; +} +.sohl .items .items-list .subtype { + flex: 0 0 90px; + text-align: center; +} +.sohl .items .items-list .impact { + flex: 0 0 60px; + text-align: center; +} +.sohl .items .items-list .ele { + flex: 0 0 40px; + text-align: center; +} +.sohl .items .items-list .duration { + flex: 0 0 100px; + text-align: center; + padding-left: 1px; + padding-right: 1px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .items .items-list .duration .value { + padding-left: 3px; +} +.sohl .items .items-list .source { + flex: 0 0 120px; + text-align: left; + padding-left: 5px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .items .items-list .aspect { + flex: 0 0 60px; + text-align: center; +} +.sohl .items .items-list .item-controls { + flex: 0 0 45px; + text-align: right; + padding-right: 5px; + font-size: 12px; +} +.sohl .items .items-list .item-controls .item-control { + flex: 0 0 22px; +} +.sohl .items .items-list .item-controls-wide { + flex: 0 0 65px; + text-align: right; + padding-right: 5px; + font-size: 12px; +} +.sohl .items .items-list .item-controls-wide .item-control { + flex: 0 0 22px; +} +.sohl .items .items-list .item { + line-height: 24px; + padding: 0 2px; + border-bottom: 1px solid #c9c7b8; +} +.sohl .items .items-list .item .item-image { + flex: 0 0 30px; + background-size: 24px 24px; + background-repeat: no-repeat; + margin-right: 5px; +} +.sohl .items .items-list .item .print-item-image { + flex: 0 0 30px; + margin-right: 5px; +} +.sohl .items .items-list .item img { + display: block; +} +.sohl .items .items-list .item:last-child { + border-bottom: none; +} +.sohl .items-block + .items-block { + margin-top: 10px; +} +.sohl .attribute-scores { + flex: 0 0 80px; + gap: 0; + margin: 0; + justify-content: center; +} +.sohl .attribute-scores .attribute { + display: block; + align-items: center; + text-align: center; + padding: 3px 0 0 0; + flex: 0 0 80px; + border: 2px groove #eeede0; +} +.sohl .attribute-scores .attribute .name { + margin: 0 0 2px; + font-size: 13px; +} +.sohl .attribute-scores .attribute .value { + font-size: 25px; + font-weight: bold; + margin: 0 0 2px; + border-bottom: none; +} +.sohl .attribute-scores .attribute .label { + margin: 0 0 2px; + font-size: 13px; + border-bottom: 1px solid black; +} +.sohl .attribute-scores .attribute .attribute-box { + border-top: 1px solid black; +} +.sohl .attribute-scores .attribute .secmod { + font-size: 13px; + text-align: center; +} +.sohl .attribute-scores .attribute .test { + font-size: 13px; + text-align: center; +} +.sohl .attribute-scores .attribute .test:hover { + background-image: url("../../../icons/svg/d20-grey.svg") !important; + background-size: 27px; + background-repeat: no-repeat; + background-position: center; + color: black; +} +.sohl .traits h2 { + flex: 1; + margin: 0; + line-height: 36px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + color: #4b4a44; + background-color: #bbb; + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; + padding: 5px; +} +.sohl .traits .traits-list { + list-style: none; + margin: 7px 2px; + padding: 0; + overflow-y: hidden; +} +.sohl .traits .traits-list .trait .trait-name { + flex: 0 0 150px; +} +.sohl .traits .traits-list .trait .trait-notes { + flex: 1 0 50px; + text-align: left; + padding-left: 5px; + border-right: 1px solid #c9c7b8; +} +.sohl .traits .traits-list .trait .trait-type { + flex: 0 0 80px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; +} +.sohl .traits .traits-list .trait .trait-intensity { + flex: 0 0 80px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; +} +.sohl .traits .traits-list .trait .trait-value { + flex: 0 0 120px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; +} +.sohl .affiliations h2 { + padding: 5px; +} +.sohl .affiliations .affiliation-list { + list-style: none; + margin: 7px 0; + padding: 0; + overflow-y: hidden; +} +.sohl .affiliations .affiliation-list .affiliation { + border-bottom: 1px solid #bbb; +} +.sohl .affiliations .affiliation-list .affiliation .image { + flex: 0 0 24px; + margin-right: 5px; +} +.sohl .affiliations .affiliation-list .affiliation img { + display: block; +} +.sohl .affiliations .affiliation-list .name { + flex: 0 0 150px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; +} +.sohl .affiliations .affiliation-list .ele { + flex: 0 0 40px; + text-align: center; + border-right: 1px solid #c9c7b8; +} +.sohl .affiliations .affiliation-list .notes { + flex: 1 0 50px; + text-align: left; + padding-left: 5px; + border-right: 1px solid #c9c7b8; +} +.sohl .affiliations .affiliation-list .wideele { + flex: 0 0 120px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + border-right: 1px solid #c9c7b8; +} +.sohl .profile-params { + margin-top: 5px; + align-items: center; + flex: 0 1 10px; +} +.sohl .profile-params .profile-item { + align-items: center; + border-top: 2px groove #eeede0; + border-bottom: 2px groove #eeede0; + margin-top: 12px; + padding: 5px 0; +} +.sohl .profile-params .profile-item .attribute { + align-items: center; +} +.sohl .profile-params .profile-item .attribute .label { + flex: 0 0 60px; + font-weight: bold; + text-transform: uppercase; + text-align: right; + padding-right: 4px; +} +.sohl .profile-params .profile-item .attribute .value { + flex: 0 0 150px; +} +.sohl .profile-desc { + margin-top: 5px; +} +.sohl .profile-desc .label { + padding-left: 5px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 16px; + margin: 2px 0; + align-items: center; + background: rgba(0, 0, 0, 0.05); + border: 2px groove #eeede0; + font-weight: bold; + line-height: 24px; +} +.sohl .profile-desc .label i { + font-size: 12px; + padding-left: 5px; +} +.sohl .profile-desc .description { + margin-left: 5px; +} +.sohl .profile img.bio-image { + flex: 0 0 200px; + object-fit: contain; + background: white; +} +.sohl .bodylocations .zone-list { + list-style: none; + margin: 7px 0px; + padding: 0; + overflow-y: hidden; + line-height: normal; +} +.sohl .bodylocations .zone-list .body-drop { + flex: 0 0 10px; + font-weight: bold; + text-align: center; +} +.sohl .bodylocations .zone-list .full-location-name { + flex: 0 0 150px; + text-overflow: ellipsis; + white-space: nowrap; +} +.sohl .bodylocations .zone-list .bodylocation-header { + font-weight: bold; +} +.sohl .bodylocations .zone-list .bodylocation { + border-bottom: 1px solid #bbb; + align-items: center; + line-height: normal; +} +.sohl .bodylocations .zone-list .bodylocation .bodylocation-image { + flex: 0 0 24px; + margin-right: 5px; +} +.sohl .bodylocations .zone-list .bodylocation img { + display: block; +} +.sohl .bodylocations .zone-list .bodylocation-name { + flex: 0 0 120px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding-left: 5px; +} +.sohl .bodylocations .zone-list .bodylocation-layers { + flex: 0 0 120px; + text-align: left; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .bodylocations .zone-list .bodylocation-part { + flex: 0 0 80px; +} +.sohl .bodylocations .zone-list .bodylocation-ele { + flex: 0 0 40px; + text-align: center; +} +.sohl .bodylocations .zone-list .bodylocation-notes { + flex: 1 0 100px; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .bodylocations .zone-list .zone-header { + font-weight: bold; + background: rgba(0, 0, 0, 0.1); + border-bottom: 1px solid #bbb; +} +.sohl .bodylocations .zone-list .zone-header .zone-image { + flex: 0 0 24px; + margin-right: 5px; +} +.sohl .bodylocations .zone-list .zone-header img { + display: block; +} +.sohl .bodylocations .zone-list .zone-header .zone-name { + flex: 0 0 140px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding-left: 5px; +} +.sohl .bodylocations .zone-list .zone-header .zone-name h4 { + font-weight: bold; +} +.sohl .bodylocations .zone-list .zone-header .zone-zonenumbers { + flex: 0 0 100px; + text-align: left; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .bodylocations .zone-list .zone-header .zone-notes { + flex: 1 0 100px; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .bodylocations .zone-list .bodypart-header { + font-weight: bold; + background: rgba(0, 0, 0, 0.05); + border-bottom: 1px solid #bbb; +} +.sohl .bodylocations .zone-list .bodypart-header .bodypart-image { + flex: 0 0 24px; + margin-right: 5px; +} +.sohl .bodylocations .zone-list .bodypart-header img { + display: block; +} +.sohl .bodylocations .zone-list .bodypart-header .bodypart-name { + flex: 0 0 130px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding-left: 5px; + border-right: 1px solid #c9c7b8; +} +.sohl .bodylocations .zone-list .bodypart-header .bodypart-name h4 { + font-weight: bold; +} +.sohl .bodylocations .zone-list .bodypart-header .bodypart-notes { + flex: 1 0 100px; + padding-left: 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .effects h2 { + flex: 1; + margin: 0; + line-height: 36px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + color: #4b4a44; + background-color: #bbb; + border-top: 2px groove #fff; + border-bottom: 2px groove #fff; + padding: 5px; +} +.sohl .effects .danger { + color: red; +} +.sohl .effects .disabled { + color: #9a998f; +} +.sohl .effects .effects-list { + list-style: none; + margin: 7px 0; + padding: 0; + overflow-y: hidden; +} +.sohl .effects .effects-list .effects-header { + margin: 2px 0; + padding: 0; + align-items: center; + background: rgba(0, 0, 0, 0.15); + border: 2px groove #eeede0; + font-weight: bold; + line-height: 24px; +} +.sohl .effects .effects-list .effects-header h3 { + margin: 0; + padding-left: 5px; + font-family: "Modesto Condensed", "Palatino Linotype", serif; + font-size: 20px; + font-weight: 700; + font-size: 16px; +} +.sohl .effects .effects-list .effects-header .name { + color: #191813; + flex: 0 0 150px; + border-right: 1px solid #c9c7b8; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .effects .effects-list .effects-header .name i { + font-size: 12px; + padding-left: 5px; +} +.sohl .effects .effects-list .effects-header .effect-controls { + flex: 0 0 45px; + text-align: right; + padding-right: 5px; + color: #191813; +} +.sohl .effects .effects-list .effect-list { + list-style: none; + margin: 0; + padding: 0; +} +.sohl .effects .effects-list .effect { + border-bottom: 1px solid #c9c7b8; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .effects .effects-list .effect .image { + flex: 0 0 30px; + background-size: 30px; + margin-right: 5px; +} +.sohl .effects .effects-list .effect img { + display: block; +} +.sohl .effects .effects-list .effect .name { + flex: 0 0 150px; + max-height: 30px; + border-right: 1px solid #c9c7b8; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .effects .effects-list .effect .name h4 { + margin: 0; +} +.sohl .effects .effects-list .effect:last-child { + border-bottom: none; +} +.sohl .effects .effects-list .detail { + font-size: 12px; + border-right: 1px solid #c9c7b8; +} +.sohl .effects .effects-list .ele { + flex: 0 0 40px; + text-align: center; +} +.sohl .effects .effects-list .duration { + flex: 0 0 100px; + text-align: center; +} +.sohl .effects .effects-list .source { + flex: 0 0 150px; + text-align: center; + padding-left: 5px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .effects .effects-list .target { + flex: 0 0 150px; + text-align: center; + padding-left: 5px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .effects .effects-list .changes { + flex: 1 0 60px; + text-align: left; + padding-left: 5px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.sohl .effects .effects-list .effect-controls { + flex: 0 0 45px; + text-align: right; + padding-right: 5px; + font-size: 12px; + color: #191813; +} +.sohl .effects .effects-list .effect-controls .effect-control { + flex: 0 0 22px; +} + +/*# sourceMappingURL=sohl.css.map */ diff --git a/css/sohl.css.map b/css/sohl.css.map new file mode 100644 index 0000000..7f38e81 --- /dev/null +++ b/css/sohl.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../scss/utils/_typography.scss","../scss/sohl.scss","../scss/global/_window.scss","../scss/global/_editor.scss","../scss/global/_grid.scss","../scss/global/_flex.scss","../scss/global/_chat.scss","../scss/global/_tooltip.scss","../scss/global/_nav.scss","../scss/global/_hotbar.scss","../scss/components/_top.scss","../scss/components/_facade.scss","../scss/components/_forms.scss","../scss/components/_resource.scss","../scss/components/_tabs.scss","../scss/components/_items.scss","../scss/components/_profile.scss","../scss/components/_bodyloc.scss","../scss/components/_effects.scss"],"names":[],"mappings":"AAAQ;ACOR;ACPA;AAAA;AAAA;AAKI;EAEI;EACA;EACA;;;ACTR;EACI;EACA;EACA;;;ACHJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAAA;EAGI;EACA;EACA;;;AAKJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AClFJ;EACI;EACA;EACA;;;AAGJ;EACI;;;ACPJ;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAIR;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;;ACtJR;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;ACnCJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;;ACRR;EACI;;;ARgBJ;AACA;EDlBQ;;AUAR;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;AAAA;AAAA;EAGI;EACA;EACA;EACA;;AAGJ;AAAA;AAAA;AAAA;EAII;EACA;;AAGJ;AAAA;AAAA;EAGI;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EAMI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;AAAA;EAEI;EACA;;AAGJ;AAAA;AAAA;AAAA;EAII;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;AAAA;EAEI;;AAIA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAKZ;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAMhB;EACI;;AAEA;EACI;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AC/RR;EACI;EACA;EACA;;AAGJ;EACI;;ACNR;EACI,aZEW;;AYCf;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAIA;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;;AAIR;EACI;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;;AAIR;EACI;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;;AAKZ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAKZ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAIR;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAMhB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAIA;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;;AAKZ;EACI;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;;AAIR;EACI;EACA;;AAEA;EACI;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAKZ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAKZ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAIR;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAMhB;EACI;;AAGJ;AAAA;AAAA;EAGI;;AAIA;EACI;;AC3WR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;ACZR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAIR;EACI;;ACvCA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAIR;EACI;EACA;;AAEA;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAIR;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAIR;EACI;;AAKZ;EACI;;AC9OJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAOZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGI;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAOZ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAKZ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAMhB;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAKJ;EACI;EACA;EACA;;ACxOJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAIJ;EACI;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;;ACtJZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAKZ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI","file":"sohl.css"} \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..905410b --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,66 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import eslintConfigPrettier from "eslint-config-prettier"; + +export default [ + pluginJs.configs.recommended, + eslintConfigPrettier, + { + languageOptions: { + ecmaVersion: 2022, + sourceType: "module", + globals: { + ...globals.browser, + $: "readonly", + ActiveEffect: "readonly", + ActiveEffects: "readonly", + ActiveEffectConfig: "readonly", + Actor: "readonly", + Actors: "readonly", + ActorSheet: "readonly", + AudioHelper: "readonly", + BaseItem: "readonly", + ChatMessage: "readonly", + Collection: "readonly", + ContextMenu: "readonly", + Dialog: "readonly", + DocumentSheet: "readonly", + DocumentSheetConfig: "readonly", + Folder: "readonly", + FormDataExtended: "readonly", + Handlebars: "readonly", + HandlebarsHelpers: "readonly", + Hooks: "readonly", + Item: "readonly", + Items: "readonly", + ItemSheet: "readonly", + jQuery: "readonly", + Macro: "readonly", + Macros: "readonly", + MacroConfig: "readonly", + MersenneTwister: "readonly", + Ray: "readonly", + Roll: "readonly", + SearchFilter: "readonly", + SettingsConfig: "readonly", + SortingHelpers: "readonly", + TextEditor: "readonly", + Token: "readonly", + TokenDocument: "readonly", + Tour: "readonly", + CONFIG: "readonly", + CONST: "readonly", + foundry: "readonly", + game: "readonly", + canvas: "readonly", + ui: "readonly", + fromUuid: "readonly", + fromUuidSync: "readonly", + renderTemplate: "readonly", + loadTemplates: "readonly", + SimpleCalendar: "readonly", + ROUTE_PREFIX: "readonly", + }, + }, + }, +]; diff --git a/fonts/Harn-Lakise-Normal.otf b/fonts/Harn-Lakise-Normal.otf new file mode 100644 index 0000000000000000000000000000000000000000..ec235361e4ae90785ad9365a8fc1dc9a6751e7cc GIT binary patch literal 45740 zcmeI537nqO+5hjEWF~ip4#E>lkVveLwN%ws)mp2z>NDDUy`*_lG?o$(OErlYS#A*{ zMnoEsS|ZO=CB>_hs-kKy?O03fDwd-3nehzw|NHx$Gs#%1t@qXU^Dm#AxtDXFbDis4 z*Y8@+x$kH1Z+v6#WSL}q(kI#ME4%D6WWelIo=%d6KP5?J?k>B0W6y0L9r0w6EW9*H zlGS(JY3E&%^^z}fKAH11_ug;Q%};%HpI;?O-H;?n4jysD@b5Rgao8$J(x;nicN{u$ z_UEX>c&5*m@6c!8wYYx`)T*W4|80{b&_S8>sh?DL zX3~(<)n8vfmGkN0Z{4lQ=5>8~Kl0w=9S=WtG`t#;{I$=J1bX{yS+^Z^+*92hbq{bS zj9~fXH%t02CN1%}j#-%%kL#0u$<^_=PqJe2Y&`CptXQ{JJZ?z()NLP+8@X5 zN#EpB{;mrX`X-IZTFC|wyA89qbFw=u-a9EJ-)3INCMPC8OddcY|C;C2ACj!^LG76A zzclkZ}o%!wgZ}Z>ezs|4Ef019C|95^+zHh!`q=zQ| z)_--4QK>$nVqMhyK7CaQQSO)aZ(3&A&onQ$e0XYwBpI+GhhR$~8Mtzitg`BAgLG^4 zaDR<82M<|m=&-fdS$DnlHz;nnQL^zSn{M{m&68vc?td=S5ytS}=fj^^ZuPFS|G|@p zMfph@!~6fMOZxUr>gwuNc%K}>o4REC&NY(GHS0PD*LM!-(^=?S8@6npxy$yg)oQG~coO;uVLixXr4Y zud)5m&DPtcxZWoJwfW>Pd~w_HUp(~7o9=Su9%J|F|Mf4G9{Bde13M1>{fHwEdG&i| z9J%K)#~!=W@t6FdGGV3GRi^Yi{d3dzoZd41ptH|wpEv8S3--O}0hUD&mHVMx>7TNGX#w#8OkJl)WlK3{lxy-nBK z;m-}b>{?i>skyfQ`|4Cj@8CO|Rd@8$)gNs5o@ahp-JkYmn#>aa&Df#Rw`wA{-(><^>Amoa*{9S`O9kjFDm|8u8g7D6Xi-aE>G%o z=?#jcUQd{i<#qJ5t_{-N2TLsr^ZZVo57nJ}b+oGPJX~s-?V9O@2js`a%Y($-M_6n&APMnDDR-JWyUAd@+8&mf#u3gYKW_Amn#?M$%;DExDxuApC?T^ zT(4A`k8Sx+ z%-<=sw7G%w!C4TujVeO&&*8f`q}s{)y12TEbybKX$!3s!YnCUgl`E5(y>hwLRnq2a z|E^s-)56fE=9jv@+StEJMUajui+FX-`iR4jt5wDwZtj#-}nP8X0tL|qRcm+83iwDzhl zA=9y;7ep8GP@$CA2Jw88jyzTBD4lm1ykS0P=1Ko@<*YUa)l36n8dnpe5InOdORFz6 z=E=^`an0H0@tpL$+7R*Mukhn{9E8(&@%64<(aTSRNnco09q>L%=QeyQq*NQ{Us)S8 zVt%c0-A{b#Dq-q8f1bWP=~u3_O`El3`j|*hA6m-v4c_XbXgF!?MC6T%JtAWq)8mL5 zav;SP8m3oW(=biE?2#zspMIpX5~QBKC1t()9(MSM>d-4k{pI~r)BJST_MeiZlp5zm z{a@aYX3-ynTDioB!G{ooOwV;5d9Xpc>w!{z-q$4(gwsoQ}W z?}M^~7gdM6PjS!tbew_1v)!vJ13ws1ds*WR>^(7uU_5$tIA$Ea0w}dk%kd0BL0jIN zhkWg$5cVH(059n6MYP+4u%-EMFCx2UtJ*prMaSQR^nbr6aZGk^ZAG9Mn|N~jsd=(2 zY?_ndk%Hc!HUSEyofY}b9F+s$>stEtYTd2x6Nl#KJHOVoZXr0@A^7-{Jf1qaSgKCvg4CHe_eO!FPom7i&s>x%yS$V%4o)x zQ|mNrgO*mu*Y^5UEXgMxQOw0#h@N1upmq;!qdy!rKP0lK9asC$LbT#)CVx|mUB07q z+$G0dLQtc#&xqlK?`Vw5AHsc@Do-}Vj7yHj{~)wv^KZ{VM?|HLfj20Xrd%B*MS*#6 zEePtSr=OmKI(pH>#=Ent&z?i5^{HUi=%w*XZNHx5##-ZyetG_DO^9RD2c=^Q5<>6^ zaQ(yaDAMEbxxGF3UWD*HQgcb~fa2_}W;E{2lq>#!e<=Jvia=*C31#++M~#1(*e^~~ z?OWFuYWpp!?$_8{d!o8Ad90T=+;r0o7d1Rz+o$m74cFUr(?t!<4|c8Hbzy*B*krXZB9UK- z*yN)DQk54h+O4P9BOqx91}8CI@@lC+Jku0B2iO$$a=f;+t9ex(*XW%4rV z3AJw)hBaN=-C4+#TvAv4J0KQ&#T05@dLKc1zaq5zn$SQ=HlD-vCYj(4NW`?}$+=SH zWOS+2_Anm*%I=ib#sa=L?Rrq488RnGU#b)u=T3+Gq0~YUtK^#c89Rl`I(8ol5R~$; zW|KrBAPBKju(Wwz(FFy)`L6}d1`s#>Y^ijR4Z(4HV2%-c%0H+fY|YWmB&8?J3v-qX zQ6uI>Q7zd7F;g~I$|;p+=gAPAD~MBKZ7zv5=2Se6kxYLbDe*;k2iF|fa1ExAfy;gr z@k&||vRz=5kIs&FR5y(sxUB|tMM`QgO@N}OQI<**+D17wM@a*tGD}rvQd4uINy=l%> zGv}l1n_$r-f@LO156{TXnL2CAtSLNGDoqVZ1}8t`jG*W{EO?dj3A z!G$P=8VgzOh*oNmb`cB8zY6rxTr@=T9?PXyLoMc=x^K$l)T=Ho94Y@${&FMh4;Y%pj7$S9W5Y879uwVN9?Q`Jat??!@wkmRd@2nl{pyn8cey)gZ;B z&ji4rqLjWpPd3(tf~u~qVlAgX5ibxzqUFV#z=F)G{EVaQ6CuVN8ptV}es*NAd(ffP-Jf;t}j)@kQ z^+$$)(V_flxiUV_Z^d985@qE9k^Ot|8nN4B(t74BT-#LsWHM4WkTm<;Mh8|yn{+-% zthM|M))9*ca<^NUW+XcW`32{pg7ik~BiXDhTnS+)ZkgqG2DY69hK)!COLvavK2*)x zxQPn^DYQ50U2YpVK{W6_zs=%*@@V;NwEwaS#&{CrH99R4F$Qhi6F_vd$lRTa`3(Z` zOs7bU1;tWxtH1&zwQj7dr`OPJV@I=2zXB02V@;wjr;JBXgH^=xkh4dpkaa_q%u4`c zj?Sfm7m2MmOONFKF10?BdVIZe%VlJ9yr*)pt^2>-y^rng^*At19WA&jtd}5hp==tT zaD_SQnGH!wjN{C4;fiN3=)y9Rl)4V209ij1ZPOnM3#||~$^%1&PCEt50`@Z3Ij&-kDBkGggV%n%MFQhF^_0?)M_vRIWQg!(Zvb( zyrK?l_+L@8(3VblVMeu2gMGM%RpNYnPWS9NFpTu9>Ol+?Bw}=AB+j0~#wr;aTpYEg zm`^wkct5H`x;i|-ipJkMoIC{ChgP$iYy}K+ohjo(7rpX1W|G%}-Yh}@F4!sPz5akp z-7;5rfH*cQIkVz`(-VU{#t_UdkJ#*>J~&=5JPV#bu?52;R$ypp_VsC_8P+u-hoJH6 z3SRJnaNaye_RO=dF;!C)n#348gj^68@&&@yUPoQrNa~6NWG7_=L!=a#p_kyi!4uIT zRb>URX$nJgCQ7JI-6CjB|!M++{Mdw7K*1Z=G2^z7X$X zYA0UnL|UG#qm)syIZx()RBP~l)fuKbi}Wbt_AbznOHzuOy@H5mRKGWs zIg%}lH0e&D4%bDl5EqoIQ4OcR@;8h0MEWbJSg)hykjSu3hCogvTZ$MlljREji=z!w zhDaW5b@@)VUp8X0B@AW27f4V0VZ$gh=`fG)5W2lm{UEXOnn0V7)D)jit#&kUu3KTw zoonU}u@9wt%;Xx%lUF4?Le85sJd#3ZO*T_Q$smi$M@)L8b6hrN%u`!@3#?s8+> z)-4^ZZfaH&p2Wf%QAJ#!nAr)3(?xEo1un^>M)Zd29`i>9aa+(6ut|y}Qxtt`Kxiftd)}m3 zDhY@`a#4xLoHoakp$Wi@5YmcVL^~vL5?9x*WSOlq*k?C7;R7-znnUe zHMHgiEf}C_MJs#_hGIM@hp7jo<~B>smBDdPIvFwDT=x(g7Mt>917AYa2@$!Ce=`K+ zm`f8&Y`_OBJXz>8?qI9BdNL1{DYIu}bCh6GPC;c0V8(IUyr3)Tno-zy`-U+=%JNq= znAc=-Y*0~u6kG5ToFe=k-y!eC9FaGu;s@dz(O%yURgz1Ga*&Y-rFWQkO$H?nEd}LJ zo5`xGK2Q`7EtRfCZuJL!FLH$uLow<~i8mDNoR-rxC(*#8_s9c$PETYDP{aYdJxX(H zGN&wg;Ef_v@|K8vkq+}WRV+PvMK`#6GWBH-*ze-8+NXw99C#v6K@~EckeSE2?E_5c&kP9#~|I%)~_&pirV|VhEliV-6yNv`m@~Ac0Ql z&%19aya%}RjK%52% z7W3>s4%GG=#xmMu_fl!s>Y4#mmOyf}@+*}!to6&41%5*W+rA5fdrevzG)1>r2Z`b$ z*CW^f@dGCU-o%E@A4I)(aMA41_fk2Fl#uE@$X%-sO(~6y1pgbg|1Y3+we79G*A@1^ zasT~q-n*gu;m#o;39@TL*GAnJ7P8qB&K`@`@RUSC!jY3AIHNUs5CC?t@7`4)sG2kz zH{L2@H_BiKZp=uhbzZ0!DAu#+vEDgpdfL5G;~2!m#@8;KO#}K8&Fn$64hNCiImK}8 zyT0>X(gc5sK78~P9a(~oC?tm70SNvO0?4keM|#v$ueQZN_E$@e9v6HJRiEJRz33}M z%svyd*<^GvreIXgYmcgA^SnE($lLK5w`3fZ(S$W!%)i~)0xibUKlc0M=&)K1G~21 zS+u|y0$XS%u++lzt*UeRDw;^k8kr>va+6uUVUP66t_nj}qm$;nI`8UKUd1Tt0!2BC zyMT8n@i+Q)lv>YfJ&S$P1j7@xO<_ta*7S~YV=I_vFGN1^hj+xki)ceSH*&N9;j62O1wqG_E z`{&80?HRp{dV93kMbSSDbxih9w=R$dAq|_6yF_a0}t|zh& zg_N21_NC|n;z*lH7AoELqUrQ19kORg#@&&ZnyjJ%*)Tgvi{J@)0Jwt+_vAv7aA5pJ z*jVe}$|hXac8uOfL*w0f8F0kpWIx86psNKW5P#eGlY$#VqyJKB`H9{9+u{bf!D>t% ze=?W_Zn`j1B6P6PazHSFf9nn>2VcLZL=Ls52+ILeC>hQadjAHL8%xYdcZbHUCcGJL>5&zptE2Q@VoXb| z$%O0&5!LOxzftJrJ)f7&{jePr%pCwnDHze#Lr~5sk5){RSmapf{ppTBQC(rteQ`$0dwaC-ox{R#dA*#Y8IglxqzX<%~iQ3 z_*ek*QH#rdq%;RNt)u;&EwX%J=V7giCgxO26oyoXt>9u5bsmUn=d9zBv`6r$H6%YC zHP#Qm%cK4$Qy(9^$HL+Z;TUYk{-i!0(GWKfvG?m}YvhL4yd?IWKj!=%*=P!S2 zlZ^@nO`I4E#l$uL-ld`m3QWO9GTF>G$H+mXyb1OMY35pbMrR9DF$Qj107xJ~wCS=K z3Ynm-M^%w@oK2OAoq@h7X|2%cRdFl^`<|zIB)ovXu5!|F#XMf(L@F_8h;+Mc8grug zyjt|p;Ye72Q|PiZA~*qI1MD-bsvk1W9g&E*hw6gT@5hw`g!Asuk;W@y4#A%(QVCT% z7j4lWd@Zb|7X^ZN(cetatbYejSX-3lv3+vFCmi+ZV6GgfQsS(U{Aen*j18C_g+T-x zrV$t+=pPXSDL9{P$~V59_fAQ)N0E$lc&@UgwG&Y+@ax2#iQji617>p^wQn|L`$axIDl%+jaM>9v z;t?_9by2Veqnw$|nl^j-2aj&);H+Q>JQCeLea>V%=}a+Wg#-_bLm74hyM`Bxf|P?J zM*ntE<0zFT_mtjc=#9KGY|;~1F>MBpjNFdKPp|He;%&R++F&(hPZrIXl(yA!rWLVf zz{vUk!s2xL_PU+Z3g5cxt6#lq?}p~IRbEP`?uod)(yUe$eTp_ezH{gioffd-L`CGdG) zE)C9?dkAC>q5wavBZ-8*kJEceWC|{WMilG?_5pf9f-%B29(jq;8_Fnu^0zh=vHE4^ z-o}%PBLU;#JrsC34sk&5R#DNUK37*^&>Nzol?sxfXEQKPIZrIz4B zGTZ(EV|(}RO0%7M?g%~Lke(<71>r&OyXC>QQAS5fY{w|+FL?J)?Y4{vYeqn>yn&Vl zydxpTtS6S-&qcpFBX8i*z-Sf@KOLotaa_ z$Si^cPvCCm;*zQ^A*!v^i zo*`#~67l9HNTHAo@S}WM!^KY+5dy6Mt;XyC(qf0;ma3W*8>R8t7!F?5lhze!_doyU zOz*{vYvV#jh*I1QJZ>siK439JNe~CRpX4^m^*Xn{w@^E|u_xO?e&$B+FU*s#Yuv*$ z2ytC|D#jL`#YPiBbF@W(gd zXl$hG>#JC|T)sTSCCXBz)xS2*Z4cdqPhQai>p!5%34^N-oY60Wg-mlubgZf)6~PKF zOPez7gGVzjJQaHNj4YW zy2Pxa=uy)=Jra6>7pQGx#39kF;AC`63oHV{LVRDl3+MI~Jpio#@aXUfF6ml~Zs~aN znYE778pn*s$JHpAqQO~sMik>q7+WDHZN8vu)y_Tz1KX8|4z2KsE%HmEpNjZal=xZ` zysz|+>g8Fr>EaHI0f7e6L&-oW9j zQKwT5-+g+6C38OP0Su?jMnYiy>53SGg)q>IfA$8|?acI|ex!0N68NQq)bIdR@Wk0? zT#=r&d0*2T45Jx_sfUsPS$@;X0{)sRy~rk;Ll_W4M!p}@CAuOOV1kCXZp-YzKY|(U zClZIrZ!BV9J1NFs`YfvK{R_YkxKFzei615g1lLu*NznJtNc81wg_TIi$J1qo+C*?L zZg3z9tCxKdR>%(J>pU0|6DAwMfVAgJCDd12Z1jd686l7z{$mn6TT!OESRRT}_?!*L z!=fAh?w{^IwPDibQ}q&sRCF8e-pAjaRZHK|v0?g!W(3le5(+loDr$a9z~m+B^#FKI zX)OaG;1gUoGsn5aDbl%VLk~`X{HI7}v6}w4$c0FA7S6x4g#4Q%TjH`@lS#F{7M47} zTost5_!==26r(((QlO;iJ`7THUCaq0&6ivyr+I>As{$S4G-)($(mt=SjD#5J zcFDPSb=Y1i3QJGDj3`}jMgX@OJt2ySH(UY{uAhBF2o3^JNcd=rcOld*(TtfUx~#~m z1f#(*YhV=HPJa@P2`20HUI0NT(_{OY(n+n8J!&ci*=66O8 zo7|PGonmezFO?*k83tj)rqsqO&b;qjnKqw>ArWUl0bL0eG z%sOF42>ux!6FJVD88_u9v*Kh$Nk|PP9gE|1`i91bB?>cq)i`1vjXt>Ml3R(%%!v!l zJ}(()Uk7sTw8<}30bJJGHaxVbT>e%ROiSxMx^uPeJf`9vh2`NJiFfJFP2nPU9xAmQ zV5;z+EXYP`N1aUmT*iX&aR;aH&spDedgc-1F>OpZdz%I2R`z|C%QxrAm*l4gcwI+NZ0Ulv z1&RA=I$2*$7F3`R^S8b1fGbZ5Z;{({B}MLt*sF2NC4zLODVD+@f=p!3zLUW$i_B?{ zeOVv}srfa?I9|K7gJ_ephz1iw63eZmV~!LiGND+&Yd z#1I||BVPf8*o+c(b;1t_q3HmXy^a`3Kvc+d%5g&x@C6k%El0z>*0*;kyeB-aZk|<} z{(->wV|-TPp9+qDjVK*F+ggqr6tV*Lb`gAg3)h$hSOaGM!kP0^+{nSD5{dF9ZyQGO zwM$?%AT0J?K%Vy=c?9phVK6R5h5(3b=rxDvG$sDslDD=-y(|7TzW$TpFRkbKSk3Hi zrIuauWQq=vv#{_IjC_^297!A6Zd+^5tU{k$? z+zqd+i%5#sn|pjD&H=b9{37+)-ez{Z+Wkl4-(Ykks3W64^hAh%PIS*o$`T zf4GBNc3~->7d7uVQj*Jdd%p-6vi@qrp~RX76Kb=_G2U+3m~`eBi7RAFf)T>0`5~d< z%g}$u-FPt2bK!WlP7sLj++xZJJjvBD>Djerj>JN;qf{jyHJP$VUu?I?rc61x?bKOb zk;A-(4H+O5M*K1xG83ptfH*~BcIz*NB|0q9(Zd-Q7Q0HnI6h*hrYgAM)*aMp94dmb zbu^Oa_tBIzYE<}qLYSx9b@2ti$>Dk9epE|sx6zwW9y+CFO9M3{Pt1CIL7Fs-D~@dN z?xshJ$NZ5Ikc>Ib(0oRh&|5tGbtd~nw$=il;HC`F6U@!L*0w2aQ;P{cgO9;E^$&Hj~@V)lv(=1<1%|7_Q%TDKFt~ zPr@**?$W{BeTDAA8sa+gVm}XOLJnd#`fc8#^PK8W3K01vc`(Um%jMzG!2_i1i19Sb zPX7LOb{L$)3vadWJ}!oYmN0)Ss7ePRd(@^0@*scC{%iKaN}ZP`SApyW07eMIy+gp(ekG!d%NL$62T6XclvUn4PKE0b zaq!H>U`_3f?zIYEeQdk!AN)!~^ERDZbbh-K^eiX^)zA_srkxPpL!FuI16O;cEdw@&Y0Dz#jb zC!zbF9OVe5=};cAh5 zG4(d12?^HEf>1fUS#T*z?V0JTyJCU-H-F=rcCj$z5zrU}DwM%+g>CCXhcIYL(FeqU zLl*1b>s=ek(7_XWX67F4MPq>-9$3{mN0~ABdn>f#aW3%8!vt0n6!&VrjX=Q=yuyhOb(Kk^<$+aXF4vB)iVkXTP5^VR$F1?)o7=L-VF zgvqqovKtB<#7`MOuex>%P@Y)|KRED;E?s;H3lO#mcu*q;D-VeikClcAPpeTg1#$Nr z{wIT1UH<@vkt*4!R66zsGY0mT)DB~~l~_~OApB6q>N;9m1tD3U>?8}4{FmsAi`(VO z1(sh2XR-q%TS!!HOXg|PwsBJ1^t|FV@7pKWfjh`6D`3Hdk6LsLIo;rhy`)F1+wU6 zvs=$;ZENKo+DP95@cLrq>@(A|^$i!DHWn)o2rbzRvH@*rb8Vf@mg;SV$p0o<@|%BQ z3gMx@Z?=f$Lb!XsD!>vvIZ$W(spE{N=`Z_5#N3id;mUw{0asTjm3}e*QcGBS94)dC zlmG)P5rY$yEBn90lH&-N)p)9Fo}l1}3}i8EW+RkH3c_xPU#kYEwdK>=zWwBv+K$T_ z2Zb|eTJ?OS?7b2*vW=L-9GUzpam>&N(R7de_FW#T=pCt;s{ zhmst{%2L(oYI?!+go!MW{tSiTI8kRBBpp1DU!$}$>p8$)zu zy2nJx7?m#$wf$hA4Ta${j!-l&?3OmhwWYP+b#GSq&tHDy+c)po&|KTI+TJ;*Fl$o9 zn#NK|Q9tyglAXw_L&L0$USN3y9Z!SVVP?^p90>(O>HyVl13Q6}-~i{3cW|H6@Aj0^ z^ZYp+*^?EoB8HX(!hH#agPH0^-TM}z{I06|-j9Y4kMY+AMT~xjQ?XIe7*uyox+|dD>&L zqczEJYU(KvM59w61u(_oMs86^aw<3u^c_&myHxr0a^=vdyi8$CTP-eEz7w6`TRpGO zc+mXx9Yf;@ppGdGrZ&*)9n!uA*X3q14`>GA2^<)vHsnm;QVg-@u_EuISs)jjOYA93 z3!5T*gkZ>rMffN!W+b?9I{qYj#pwKpI+EMt&rjxjz#+@?2}m}7z@3P)i$o%be~67o zWT#UBd~6|rp)!FBxxcM-5dosdy{4XLr?Id<28|tbt3k0^D zwWn>Qa@>Nk33a#5r;D|xonejrF?`oWX_@oEf)G4aM4vnetRR{YLln~k1rMqkbA*tF z@(D-`@yYLX%hRqgJLXr4g@=4D)D0i`0iPAD5HU&0!ox2L5yZBmcuVJDRW)btby5wC zV6qYY_LJ~d;T9>Z*Kh+tE|AWkwbZ69-SeFm#RR^M!hb$6&SzF!!hv|59gLSw?sRXwXF%SXg*0>t|S1F3#D~y1E zW?eErtp1Qc=85xeffQzucYy}JbsRsrl!fZvnnWM)Ns_1aqNA<}X+3>5I;x@FAXD$D zLQ*G%>|!X{!3+1p+g46SGCcfZgWXzUASijU7>sMc>^qXgt_jbyNeM^lY27j>o^X_P zpWQK5=dlsY?g>%ppHgFsRXjj{>E8I7xyEd&@*?!p#?)z3g-!8nX^ph@qs}Ja1GJ_` z;9>eW-bVN~Z6F+(<{c(jiqxhJ{z=_w)^=9bQ2T-jtqlh9%HciDlr#3XNReiE+*FxZ)Ss0K8-$g;Nd((9RGr z1}Zs4ucb(#@YIp3rbRAh6X!4;PETObV$R4%hNHJ|(qYjGnr_PxzBMp6Si{38U*0~a z-8ohZrj4DyVdkn_ORG)m6oLh@zG^o~WaKX_zl0c};k*N?M@BgnT_+-;i;OyA zq4FW~f|z`QLqW5b1cGP7k558xf(~jtESunCS&u}Npex)CU%KJRt9jA){Hb%M7|AG+ zx+&A9Ty_-TtOp)fD@`I(E`aXZSDgM`qq{c*(V-{f9#xg(qI*o$XL=qFt~BhRO;h%$ zWn{5O@}TDVDHXSrO8fMb4;AT#tNNPv{nX>huqj3~fMkpb=%b`#esM0MJ|GfCC|T4_ zN>8Lo<|AgoU6SmAJgOSDg}tFWp5Rw?tx0W2$HVS31X%(=8}216Ensel0xk13JbXdL_` zE4F|EwnrJ+(cuyVwtL;t2w=+ewI8dKPyvf^d*@w+wVSFdb&oB0F4`l9mB4hulM&AI z*vAs{>7|K*J$rvO#X-R}Gdqm%c zigEO$GPjOmaf@15tio-hQ^RQ-a1T4af^^=*!Qs#n2)I`wZ}^|s9&PN!|1GsO|XO{<`Dz{_X~aA7@zEQ z;$FCZck2x6Gh!m11v9<$jfq!a`;oYRc%Vy?l{7n<#?=jVgWUmR=>;*PG^P;qlKhen zEDGkL3oCl%MK~aI8L9!BDO-u?CY`RQBTYlHaR=nfU)KVrAq0N+9I}B=x0lf)$Xrjd z5=jfTOzi4OR(8a%cmjWxE6Gy+P6urUfm)u2q+jQ#q)|HooVz7}2n36thq9CgFNwjL z&b0aB&gZ)}ESTp^CyddiwlL3m&Ao`TjSH@2mF?9nh{II91Q`6|}| zl02(=U(Rmb(h?2u${6zx32>WoEA_lVx$=CT?1y%atsMff0{*~ojY(MR8POETQiLgx z)x`bBnoz#3#Rtvn1o8}j)<7g_9!=b>2plu>-pgpg2sTv)QN2kn5tMkxuofgwPr#rke?ko3&mkmkAeqA7zTkSdCdMKJBnzYo&hE zzsrDOGkKerM3iQccnr2$G8uaK3~OMf^w!R16g;g;h^}$^y(1A4JRQxYPu#Ti3q8fn7uF0$x;5nFcIoM*^U>)h)p8{_?6 zdu`mki&l{Y7G|uY3WN9#`$7k!I7Ocm_x+o`ZppFrmEmirihp4j*aq21500FpzmV6G zhDgY8etX%1H{h~dy{QHw4s-R^dfNfpra9|A93la_7n`mb73CiTb zi{;AIaAqUl-I6Urw@;tNBVcqSGz9O#jqn-;NRy>{`}<86aV)B1;yYxgir(wx3b^>C zPJs$On}m$*LXPnv`G~;}p~GmN*R<*h&%;`lgip{XF>JXy2%{Ys>F?$9W7Y{XghnX1 zAt^Pq)WU!~oo2(@tlM4@2kWaw1K$$Jffdqr&NC2+@to5$5lC=`kyS8hGzxBrq*jVU zZf5B>oH$PbfCqI?@m&6Rv2xt^k7IX-1BAszZTmz`({)Bpy{sXQ8lmNgf_FJu5E4Mq zwm9TDf|X$>i6ld~fWoL{`$wk9lq@|W1wTI86*LXBmg^J(OKt859tCKew%49-P;2TL zBTMTY$iEokJw&~abhlQlXys)fBwSAWdg`+(%*Lfhu-SLzCVfR>${YQ$*^v83(BqQ~ zlnGf)53Iswg0!|y$)R8X%x|u)(KY->j8?O4 zRtJBQiT1+3&45FtejP9$86=q&N|r3(gJdAkCi&Do1vE4k%#TdAsP^f}!QRKYM~I?) z*tX)zWHXh^0|t~*M`qg6*6P3pL~%n<>puP-tkytYG=rB~(2N&&D3s&Jxv|k${xdCZ zzu?x@SCYC9M-E0QrDivrxNINrWGf=ra9amjd zR7rwF4N7j|LnM7PR|*AhmWw@kj?(P@wjVcm=+j+mI-e<~LAr~^c5xhBTC1C^uY=NZ zgea%Wd`g6sPO3FFOglOb=_NfxJQ1195eYoA|7GLZ%U2+~9Y z;oTX95xtJksCH%?L8L@FVTY<(=osoWQhJ^)p-PxS2^s2fpK1Q12xFyfw9}k1{(Lqz zqurhlPNqpX$7SWc9O ze8V%U3Tz#5V07(%qYIM1WCyj!Elgsu(t2jvO6FFsS@;dTrK&~-)Cml(L=aheWDP|~ z={0C2>H}4aOD&g&{yuOaq;&$;kyVCqA=PX^9&yYFJ28}|`43+1d_;XRWut;K>fg-4 zaFsb&G;P}=IAwDyW9K-VyUYk=Ih{=9QkzQkFc_`5N5|BgoQOCn}hRXR)sD)JES%VxAc=MvigoQ8L=?pV|xEwx-6?HCdZp7tZ|*7A(3 z5N91!?BmV!+zz{EZ5x)Z;9#bB3|DmAj03}NEV(CFL^Z$>O7(ghq8{^o%Zolqv}V*Z zMct=#n_(Vi0+2kND@IZrzO*kV{Rx9ZEeFZb7gv3!O8T)CqKA6Jjr3yQt9=TuOH>N9Pjl1xg%D4|nYfyTKL&WObcC6($$pv^85^uwxLFOo0#-SR%dLGNxDFulG0P_soXR9s`|-tnmZ<9wNG7!L`Oi7Txi1>|3?lS=RUB zRYk~iLBJeA95>|vh9Fo@VO-8ZDl*l@$MD?a=oks!{jL~4NOu<5hc-bI+s-tj{?#SP zRNShlp*`WDEvEe2pC10m{N7j*$hX~h&69~bWcGS}5T4L&u&zqRZBB4oq5IzK&$9nS zkN681cOg8kPe@AyA^i*{kk~&_#xspKc) zhDL{XPw0mI5Bvd{4(`fxu#wW%nt3FSR#zqSW|*|yKD>fTA~b&zQ5;kpX&P1!$>!}Ve&9N^1Nn`(E0@jNE-@y14@;euV|@#xs2dRF(m;`5Mt zKp$~~QM3b~rh{9Lbd-MTy^VR61oE{6cXCX4KkxAK4?mv?j%Q;OIU&Z`q0wo5SVMYBdxV^ZS1Hf> zRjLGG3Mq2A-=YVl`aG~YaeZGFrZY%6|`!`EB@6k}* z?2y7uriALyyyXb5=*1N(S9+vc)wR5fU<>Q_mO^pRBU6oyGg15m|hN5bQ5u^7XAYc zRSfxIwVf)%*uNJ@iRb?BERgaiebJ;^JE|uar>onN8GYQAM+=`WAN{&YqxiOl><0vq1AvF+iJMRO(61W2Vqw_ z&h$HjkT?=LLIh^>5j_~5;GX2gs}W&OkAfI2aydke0^z_e!6RlN0xvYJ#Fx zfUA?E9P-?UZMsm4+9IT=l?*Dju!>wC zN@ixqS&}j<$;x1iRm@uKI2?7zT~HkcGp?uPOBc|f0ZG|K6MS+0Xnmc-r=GQBMgpT( zm$ujntfpH`HG>?gL(R8SF1YpdWH=qB?hr7?F%Zw!xT7>k08|HH4Lh$9T?j`uDLI}# zaT-Z$*OE{N>cR}hIT9faMQ9YDD)3?6dk!OSmMK<<+X+Dk;Lo;jWyT=N<@6*Byuc5I zlHus;TOAC9Ax;e??Dy7|AZURLE30#_moKl*89H3R(e*fEYGwuaH5Y&Nrmin(tKR1i zrmQvJqT}Pc#})onz0$2Mzx&u5J>)%}C>J$>zhcZ`+37~jB1x2x;#P9b*G zZ8ka!9hUUGfz170ZySJQv*=(Cr>6#NVB=zDv`=Gx%qu60-HTCq?&r#ij! zlIrP=Yc?f2e)o`k+5XwGO{*t^S43}S`jrN&^Pt^wikG3KPpMD)jJ{Q-;f zbQwpo^vIu((Bb2~&yy{k|MVf8_R>O)pj+oT8SRKiS+D#(On*-F=O!%3XcSd!o#&k;2rnc>lR*tN6d0I zISkYmOva16FEP^L2>072j$tzuN}GIA&ua z-V5yJ{yHvK;VV!xFHS=~PTPTas-3${_SKOsr6-x_>{Q0f2#6?D9?jVwxH^`*Pjx_= zTp_)!M`AgYPZfzfe04GP;2CC*%8%nAIWp81r7*TY{HCb$PlGQU1YmbYtm(g7I~U;p zHe%$u<;u+_olom*$d`F;h)*#7_PBcvUB3~Tq9%f)Hda&7L@*1uudS<_sn{X3NyFdP z=}vHUnFIh$l4bcfkbi>Hx@2qq_4OGA|EWgu$bPe4)!!>_ex|eMZ`~Wo4*W~%cS^Re zyPkhfC*P_oCEM2Tm26!9MzUS~6UkQfi~08)#}6i(bG&)|ll*&>`<&Npk?c@^XZ~9K z(a9$DSL9FCFUTLSAD^t*cdfiwe@Xsg{ha){K0ioSt^abeR{dGYDt*pN*029*{%rlA zd~p5QwDHP2k5K2ay0?>+>(@&L)Nhgusvn!*RQF1f D1twM# literal 0 HcmV?d00001 diff --git a/fonts/Harn-Runic-Normal.otf b/fonts/Harn-Runic-Normal.otf new file mode 100644 index 0000000000000000000000000000000000000000..d045e17f67a1af802a76a669d6aced4f6bd9a14d GIT binary patch literal 15440 zcmeI3dz@9(mFM@pRYe_cL4m+UQH0{9co7f~A5nwGXJV9e@KiKrnh+prB5!D-s8GQY z;edcpAmbR@5F0%=Ch?WDdHL#S$46`@Rvwy%iW|EV7&Q1Q|Ip6T zwci~4Jv4o)rlV#U&w6+7t9x(_t&A+WC(?p@Y)Z*C+Ks)bA6|1fJ^loJ-4h4*FS+Kd zo^u7aHLK@cy}K`~*SLP}<*Z)o`sD^?^*UFRJ3g!TaD8$YXZ3nl%xy-xx!Rs=e33S{ zdJaCeWc9pjbYIWvHEyK)epaug{(e@kb3Jm$X7wI!NbaPpUhhh|%iVcyhFj?7a-vVW zCH%g^&7?k!av}BkZZS_^a92^D;pWh?klNYqN=nWA0zZq~<<>vJoy`Bq4lO!w#=^Nx zpI$QeikVH*W-h#9{^F)DT-9{OoGTVKoqc7~c{9E+W6|YTHBC7AUfB!Q$(~wz`ByEFTE%Z2aL6*`39*n~XK8y6OPE*?Tdw44&Jqr!JdN=mzdq_Xme?W2Ip@$7R z{0Kj2@R37?HVqp-V&tf!jvjqXX^cB|?6~pAO_(_8_->2*r&cq3NS6t-{^P%#tF3jp zT(0kj#hlB-(g~F#U1dnFGBjUls;Lxft0Q{V+}^7;4)<@|_h8*%_eh_?&h;If8+*uL zcf{b@pY?M+G_8jl=mxnnUFfEdo4e%7E9cIeJ7>niFJCeDvW2r3FIhMjwdrxNCjh1=Vb~vWr?`(n z-dULcIqqB(?&Izg?tJ%2cL4@E6@~jdVB;dlZ+4$?7rRSPz)N$hayPmYb-ID>Q1`rh z(Y@*RxWDG=a|3fjbI0T+!wS{@wZjXI z3XRpR$+Ug*i={&2Q!Ko_IHu5e&HMXi6^|`6{yN!LnN=KHXdIag zPxcqb6_SC;cZ=f-)q%+~#p76{U-Iz2iNy(p>IDb##fgQ=S*s`;ldo1zue?{B#M(WR z36+V(;|nL%PA)W_|K`3^iYF8rU#L7=8C^WF(0EVMuD6;HKI~W#*t5Y{vt#sX%x}5B! zJ`C5VF0TPRZ%kcJ8Dvj&9iqZ|YP0Ut)y6T##xrH0rK;-c(T@ElVYs2Q+^a?MD_olH z!QL^y{hEj2}!aBS)(h2fd0n;bS@lDZSa&{MSW`kRd4 zs0G@@qqIXLbCByhOC2vw+J#vRpzP4<&c+Io#6#aE9;Lh0+e2-8<9L%DWLuiPFFJxS zTCJxwj+pws4{66HN-^PPZBZ-_X$G)(&-oKprNCTwPTFUfb<%W7g=lz zDyP@Kl%`K>jT7SXmowakpnD-#6M^MrsT)95XAT-Fz3RQp(!Z$N0RN9+c>97U)AXS* z{C=7~6*k|KrZ0*7XH`5OhO>Fr3U9>a1+YX5r*Eq7Jrz7I4;oTegBGp3(L{k(e@cT^ zh2hI-`nYzw#ArviqwGj73^#eXnFV+ra4I7&x|Ly4Eh*?`lXRxtQVOr<#@yO4Y>9$P zBHT$_z9mh68-{nL>Fb;*O?PVOu(&+ORL(Rxb*QK5{#MZeHElN|jWFD1GTG{vb`7?P zXhE}~QfzX)^*q3exP0f1;LaWYXq>$@>oQ5oWW03yv-s`NMsM}9&on)t$*?JNh-O|p zCG{b4jqU0!XW z=lv?WYM=l%vBEJB&IZwe`7bT1Ymi++42!1j=u-KvZ=`NyT=pe^CH+1J<$OQb@IAmn zw&!}pU^e$HJ)-k77X+)5Z`Oe$SlZ2L`j$pu9N8)&NiaX8V^@7-Dv1(k$eR*{;L7ht zZJ7>$?EkDr@yhpb>{c6jeI$SZ{$O7_D^yCH7DTwdvouH%MoLqoZBeF+0zB7?^;E!> zL-lM$L)iSNA%5yEqN{;)NPPq2@}k=^U6P{vkc~C31Ia}fCzaQDTYbhMDWrn4p&jqm zM@!b&jMc_!d#ci6n$+)Rd=(l38zX_h?_7>Cd(Nv2l4W-ax%(Sz`>|N5|!r z_p+_1>BLmg?>!9QPdov}byC+K>O4rL9i=i{7ljq|o73v5?Nu)>ZFv;TiTWDWWgn_m52oy8pHEC;9AUbl7#%E9jDC@9aSM?$D}|Y&O5=4Dg!iVNF>4?|Ci}J?0hUFkCg?nY$^4a<1Zz9KbmQ2%r3Qdz zHW`4SIhcpRjKPZG+a7}_*;eM`3?viTvoY0V(OJVvyu3_)v~oxceceXHiwfh1hC-Nm zIKj1X%3BPaDc~OQswnbqa}u0}J#}0nE9tV%V)`8EP8JnHnP1W;b zbi0!@=I3!tyzm+#tB$ER6j;t4C3#d5X9_9(L7&cE)#CM~`x5rOJy^H(DnGxllb>;i;W+a-T(;*1Q`1GbjAKx(g~W zqQ`!kx|y0eE-wGlpzjZ+LWx6(pD0y+M=$Fi~X5h>quD(;0Ctra9a>mSZs>1YuMD*H6m9UqtR zxh0*zLiI`N!CZ7+3h+c<-2^Epyf0z4Kn>9dWp}}N10vfGSfpX)m@CutC!uKI zDQJl909duC{HnLn0`1A&NZ594!mr)orEUJw%VL10$bGtgB-)r@z3NuTm~e6O4N&Jx zs8v6$nJR0f8IjFFML6I=D>My)a*NqC(VH7k0!yJfD+m!6B7~h5#hFza*uNqfm_w0D ziWesXADZ>gahX*gH!*%o4ajeLHr6J*r^c7G;Z7~`Ymxg4wf$0UUA14SS4o4pT;X-l z+J+qp?7U9lam;I20KujLm(BxeL5=i8cGc{p-dI|VVoIoQ4Q{^-r3T}c8Kzls0Wc$- z``aG+r-#4y@b^d`w6k2j@Y-}eb!Uj^2h?#C=R{-hiVs<)nOztdY#at#74?zjxRzaz0CDFalFV$g38_O5zNQm?5Sy~(6!2?x3t%?mm<)wf=e z&9@ZBf)EVd7;h%XB+UdbBWtAGMT23LWs8ctIYOu12zhig`7m#H0xTVTGrrI8kS_eG zHIqP4wFwkRlk<~mE3Z(r!n&*;tgSqTHYs*=L$$0)8=h_57Bt-HPvwqK1o1K%>8J1d zG)hr|=AX5DIcH{IQiip=OIP`z`Hz^fQ053nKXOv$*^q zERyd_pVKji=~$0z^^t0WrT1V^I*?4jM@$CMChS8s5Ylc%CG1#@8id5MbM>-Bjz$z` zKwMs7Y*>=rP7x%0vf6LRnvSh?*o8SfyC5{f#$k4M^}#e+VjdQ%JO#_eE?IMib%@>eTC z0AVVp$)dKMVMzRGPR?+U=T?$1Bs$+fb&h|_WC^pt`OB$x_XsVYoF#F#fRtNpEkW`i zJgU*{l*@Qy4QG=+0zy9i+LR0va>kmhJu}Zi8M>)Zfdy^3Jta`>oJ_ihPR>< zD6NkxygR@&f;H7A>dq(4U~#=(yf~ACnTQ26SrK2Ol$t@9FBf8f_sXS_U4Kx@q`lSb zRsd>V(4yfIQ>t1!8iN z+B0amxh|5+GRIYr0{9baJhf&PGY(iWOtUD;-^`3vaY1!W{X8Rt3n$#&5Zj9#%_$iW zvaIcpxv~qJ<;~6r&)Knn&3panM6+7jX4-qvPZ3)(=$cHTt-EgT#}~Wjmt-; z>FxN(hI>c_)ZUf_3i2Udt%ru;tRJN54;WQFzS_60!I082Ed-&h4%gBH<1$W)!9Nh_ zu_5>esF{i*7~QNYfHK zkQoM{0!CnxFnRqv41Z4A7dHRcoYLJ2PA||YegSd ztO_bW&b(pvnrN5yGKrEd-9J5Ea)(GW0vkDut1Dq@@~ggN-%^?9c4iqxRveUuk)09e zMW=ii*RBBDproq`YKbLy9U~axfn_V3aUs;9n-W>M9;VqHyYATcDqa)hqskY^@}Y^<&CT8lB^h@`6Aqw zqLdG?)ZX7SqV`vrnlIV1qEm0MtLVRS6FA6TjQ2GY?IRnO`uo>(Ov4lbh_BO#(G+PjH+a!2q`=F!I9t_U_w$tb3s(_XthxNFCEkB7EDJSOXbDHMRrB*%RSnFNRefB z8C98?$Y7x2;N6mBDhtC);z90QcbCBm>>tiP{@TEFfxBTtnQgZR$vKsw$+C_$S>ojN zP9Is=Su%v`2E9N|TLwXcEL65P^#)#M`zR1dj8r{P8611EL~KwhUw`xUz;e=#Xf4PR zU%;wsT9z*5I`iwm(I>=|pKugz*ifc_lfZ|l4QtK9S+lvP_1GTAQ_}PqQ(L!GlP=WZ zKB?lPx{cS3Vy1e~W{kOo%jDi>P=jgFH87*J*n?sCw3)TxgPcWp*GzMSh})cqG|XRt z2^LUHl+a{*-GZS9W_{3QWg!$63Ihl**o@RdX|4x*BZmTh!Ql0qBOB;T#3+8%w>L|; z{`ycmRZ7~QLZBXbtx~EASwhE5`wtvipP||ZQi&{JWuqj@;n!Ry^5zwrA$+X%|XKDoKv0F`#1V*G`Ed&7ADsCU3 z1D3#qrCPQb=JwZVGHsLgnd>x`TWH^{W&sfQz}x_cfj(Wpz*legY;a>lh5WNm7cgu5 zqQNN&dt&MqsQ)4LPm`KI$)lTWIC+v9Eeo84^Lr>u3r|q%X<_)yr#ugI{gK6Cib{Q& zTEKg3>Uxw%zcS%r5Ro4PzMyJE511 z>BCy*Bccu*DbEYaBsNFVo4%qUN2ufX8Uh5*BoKL3t>yrP9Nq!Y|5+UyPTi{UWrR3t z0z!ONPhy_Gn#l3gwhZI5E=xejr4$1lqi+41|{>VMoEJgD&CEo z5jhGPgmAw^e6V^*t1iUQ4pcq98Ld(-ZPh&BU>HfkRi# z-lrXeOHVo@<2ZYZA2jUyBHu=NB{AHtmpVw|cE8lErgymdTE>FW$i8dS^@FS%MSX>@ zvFzKcFE3r>b=ij}cDu(*8=@s0VQue4t?@Ju9!h8*6LS{Bo)uU-l|=^rJAVm3H+ z=Z4`0y4Yv^7u91>jk;y%x66;F_Z@M_d?vAVQ2j>ra(K%z@jV9J9<*qHyUZdgc*fX4F{1K&}S_-~w}tjZ9}1HNk5YR+A%;^+jz;a9-xS2|^_G z_OVxXrZLZm)Z^mv?1LYA=rS1JZ-@Loae@XkaT$F3ompDdUoEDgy`in4dP4mYdcqJW z1_Opz0%YH7ps*W*Z*NDR!HzbsDOteND=tTw_~pkG^?58b$|YPo!%BZTQ@qv)!{)UX zB~yZy*696YQ*zCJp0zYozC-8^q#NG&WJ8%YUo9w+5{!Y9252%FA#G6oZpWoj<+pVa zeo-c7AZ=f67`n~fROdZY2JQG8J1vX7WjX>9E{_xofOKT~Jl@tC+_WY-a29%npF~|L z?8;X!1h_*&MsS*tGvmJr4tWI0cPp1h9V3_rJBfn!;}2Kz8`?9sBokvRe;9A|THL!N zjk1tH9>&+Cd4eZtCeffu`s8SFOTce-^Hxx;uMC4E*oU-=TYY$JGtHGr0d&m+s*oiu ztnNh8hA>!&R0oAIs zDMx+BWSoT4PY1QGL34S@H(lg7fBN?V~3<`D`Dv!aEbTcRmbbL1-l!#6ra%B*jG)BcJs@zfSngL}Gx05(kVOy_BvY$DtuC(af&$YfE2{M3?1asb zN{NvAG|)&*c8%#^#r~3HgiMDfwTzQ*wzLm4CyX&R@2U&Y$i|`OR+V M|BF3zMxE*30hIR|7XSbN literal 0 HcmV?d00001 diff --git a/fonts/Lankorian-Blackhand.otf b/fonts/Lankorian-Blackhand.otf new file mode 100644 index 0000000000000000000000000000000000000000..54e335dfbc2652be86e800bbb0babc57a30ef95d GIT binary patch literal 112040 zcmc${3A|lpdGEgtWLN|UQx0Q74nYx-K~d|_+SUo$Dn$$X^j5D!3?amj1QJ3(h=&jk zC;P1IoP=-^VvI3GF0vz1sz?>>^;-RFTW!@kAToqOh5(8{^}VsvTU#0v#!m1oN~&Ur>)w% z=M`Dk=Rcig+2m8-_V!bb@~}^I(_J?S=W}y^cg($jM`h?cHui0 zQU5gcJ*S^>(#ie%{m~Dztm{vC{@{$c)6YBRjs1*2p8j2ToHKL!S%-e)wzbr0ygxXH zf^m0reUrLLJip|exffh?#T)jV%KTsF`GL99FFG%K^*-R^&TneB4vKycq0#c?r~w)s%&hQ?J>B=m$Q?y75ZEL z&#tZ6tGcT3s-A+U_1{}&FE|TYX4!AkTvM|j_hi|c@4St%-UQY?{L=`Bcl~i|{_gDf zl<&$8%08U(dt~FYl_|d`<^P!SW5_?1@?*2TyN*fuaoIs#?@9SQJD}^Tl;11cx9h7Z zKOy_-p6^QeeX=QIPD}ZHv+gnLQhs7~_?Y{VoUSo@0q1f2Kk{AKG1*&EevfQo_R*Bz zlk&AGKZgAGQ+{lAaM#3?AD11|b#lt**|e^CDZdwV_*BYI=(?=y-%@^`?2Tg%NcnxU z=UveA&e=0&&Rar!&!{|*HGp{=IhDcMyfeyF=uw>If#AFUr)bq zX3yJZE}T7!qSL6m0BW8?yL0*1lbvd6L;TZbUohjGndhF{bL#vBJjVD7X>oRoi?bQK zC;JeyiHn+fKDB43zdeksaeJ~qqs0Pa-R}ErTzALY_Jn^u9%hq8+)?}0CiXdA6g zh&~HViJ-^=+Eox~PH}m<=f22od$QMJKYA!@(_^urI@gpFJoB=T7(zi6IG&7*yfS+Y zn237|d(M`A@b^R07tTDZXa3n|^Z%X;&Y9WsXVVwVi`w02!|^?f&zU{r9Ce&M&&}UC zea`HKGkX@!STOs%3r_4glM&`Gm^FLe^mBX8o<3t{&*JF|d(N_qFwKW9?&*2wq8SvO zHhtE-MGF@quV>F+;DOFOXa2nD=ghol(ZZhB9^W(Fa4ep`;M}tqXWmC<&zq?kPk!Yq zUjqi`K%fg?%tDO!N&FMJLS#=c6C|=HjAFxykbQnOm#!CFaNfc>tQFQZ_jolgURO2bafW6UgnG9hJSD;oq3OIeWXU=IL22dk>^qj6{4i`%(6@ z?6+k}OSSFEj-~A@Y5O*}{Yz}!dyt+5quO?rzbWr8?<#*%-d=vc{BHT3@?Xn;DZf>I zz5K`WE9GtFKa|tUGs?Fn*gW(LCtc(0pxX_1^|I9L8IC?1OIxCiEZ=Lw-uvu3alic! zI57Ghlx35;$sU|#hh&EyhLb&F@)T7a8TC_pj+%D#OI~`+%Z`2daj!W3gcGxqUiqq% zU;Ua41tL(1Hm{363Psxgy`i1`znc?h`LDc4@y@gV>&nKA$-26_Cbd+t!%!2LbY<_} zJ|)|JWY_kodu;F7b9?ugoqO-I=V$jBbL50uFnXwjJnhikPiypldnv?2+w--0qhhkR3>rGb!t4URcT8hi6A*)3TQmUmS-j zpM;dY8te61*!G8bvbQ3!Z%1`b#UuQA_7~YZP@>bazeJthmAxA!J`<_$#e4ma?7i6s zvae*{&hE(G2(i%`#Dq9^YKEqCeJR`H;cQHAHs+tR30>LV_hf= zEYD6}lD&Rm_LlM4TYiDk!}2OcJ1cu#sjl| z_)_+@L$h!FI{S~$WOrVZJvcslVrBN5-fYJ=yY^h&wfAvd2afGJ;>@mTXLlX@MAxhL z?|S2`uD5h|z2n%fGvD9!KfAgNf-}%(`JG-CRZ~KWm_8UL(>EG&qvnIZLWUuXGyKlYa)?3DwJDXcRP?kSyHa}dJKW}bXRA$Gh_$Rg6r_1s_H9M$QTbz%)Y~&BSKlhcf zWwtNOl&rp#m~$#sz!bGt@W;tmIAlTj?-ucd1|w{xXdQ$ z*&wL8e4x2y-o<74m_~Yus@&;_W^-Pd9jIq&@{yxQURuEbk{?S*?pLdAC^J%{uF_^R z!9%N=W%dfqaKGw%(omZ_Xj_)|s2=(n{e0riE8)yICW5#d8JL;YturmlY;TQX{6TvC z`svVitBQ8dxLWPQ7cVNamuY+>G^N%HLX4XbdfCVundg97Z8HGZdYO$0pxXonUk4`4 zw4p42jBvDh2=U-w{<>GdZ&MX+0s5|-(j*$$2zYdGV02PO_t0cp{48%*Vd4_xgG-4W zyK+h>gs_MwqSn6Kw{&kb2BMc>A4RBIZ(w5fjK&7(O`?8BbIWu|B9wukh{CoGNmQxv z1D1vPWjpVLXuk)3w@3nwTL_dT`*)YZX(Q8^KNG#WMBl90T#=qT3%9tC>0C&%9x0vJ zW{CPDw7W0OU-NUU!mj!cwSPP^dE~1V`qGT-ASDOZYMVClFLFs|{zWw>la#mDYB!%> zW`~K8|E7X}R?h18BS<>G%w8!|gX+QcyVdPbwR!|OoA}4u`$qnuyDUqAj&3eb&7M*- z>*~&0?WVGPrq-LD-SVaMEp8}o0u7$8rC#k1X>J)v_UCCo3y$q#%7Jt*f2}g9S4r(q zS^lC{TRFEeHwazcTdS==Jk&-sEq^A6$X!6HKFDK{&mC80d$@DiY&JYlQI`Knl|TSJ zL8sweSeCz4?wMNcva;MM5PqfV9ktrhe(Ic81Gl2Ioum3GwWq6kk}!vpL8aA16y|A8 z*O%(^pK1;q_0gTG(jtljDYX@n^>ts!}!D+(45pihBbBIT&F>MOmKI zT?EVaim{q&f`HkP%`FX?;wC(q(A=`r-AKnZw=8bVg?Lbu@r2i7;*sXCB_4YB*cMmr zO8_SG&O~!pl2_?iwYSmVQ@O`gwr8z(fl{8gYIJy2@l<8^Hk(jIeagF{IfXyfBb1w& zD2**0z-+7Z>00f4vlA-gL=tCzE@;PTyzO{Er{N*g{u4#moKQ>?3KfQgrV(~M5!1QM z#H`pUD&^lB&j5CzrP>}Mj#}hZmQB&D5{m3dvsz82)@pQ#^l%jb8upS2m=$8fndX+O z%WS;50TBElU1js!z@!>5lguIrC6<^HIe$RuB+e3ZH(_+_KDOV#y+RLy4#^`ttht)n)llXm445 zt=3zV<^Q4hG&JLDmin(*9c=-ar=Fw$BIYZLRex%_NzXqU7tZy$Wu6 z?4!*;OS4%nkTmydAU{rdsdgAoO5r?wn7HFlw*O(b{aA3Ld{9zkn_=;$<=ns^ltq#j z$^uC)Nz8jf10$Vf`AZEfK`2uhY!3?|ioX|T$goGrchnZe`kO@9f9E-D6tO~Iz69lY zvR1poEL*x{X`e0K(q!9g8YRHMO0uKY3yUQ++&rfI4svdWND=z!5CbkU_-e z$m>L$^alv?H>{SCmf7nxmg)2w?9a_1YT2Tef-OkV&Iv))qCg%Ag8_Jl%c9B4kpmTj z-;u*JUS}NgTM|8?BHhrNB%M|6^9f>B5=0C32mtQ@5rS!!gER~9qa6F&EKO)O8A`1J zB1@qa0m-B$p4E#S5@BZy#sxN6e-h#7fs_iTmcP7Wc@jDt=p|)2!a_r0#&Sd+f)pVx z%ZKdu9iY26&uN^80;XPi?OG##2}bo6AU{l<-Y@!4hbAO9^gTh&L?1K&1WS0oHdtt$ z)bH2oBX=k-MzwsI;7u_L-SMF&gd~UIDw0{SOgvRzg`Sw^NN~RWH-FUa{{6|S?zAmO z;IQSSq4Y={Q%mUs$NN>GNiZ9Tkd4E=lm)HGHO@zEr0e;N20~u148}BoiUpA6Tatt&LB7W- znV?6ThAKCV12$_&^3ldabhgQnZnkqa3Sa|zCi{Yf5Pzz8_x4?}=y*s7^v+?=GTQvA@~${6Htu8(agzbUIkD&L{;EE=rs5`k8( z()OQNogLphiZ>_G_R#UgtVGfB%M1o02qEjlG&X(~D^V7&#~(*>m3oUF+wa_YZFk#{ zNT&q=mIL5qKf+!-PNDi=+#pJWbnXGjGA&BI6ss0+0OB7`saUG zA3Ggw4}+)ievoE}vKaHn>SwH4FDY1 zsye>e#CDv>b4+kjn&1mbl%M4e)w3n_A^WMRq6!Vd`qV@a?|D{~YYDP#u5z6oF28Q% z%x*`7SkDv<()B(86$V{7joFF_=bDHwCK_}|XYBg`q|@NnYE>Lq8T|J=cQj}tZ^`H* z6)4X#_L3Z;!sPy_j`$F@z)r768BP}Mk`0GTu=g7SyAS^I=ZXGWhWu!tXc=;Zs4~LC zEi1%yVai+4pEm4VR0V$RZjpmkVwklZts-3iqmg@`hdKX!p?cn5T%i@3WoJK8*r6cX zj4s=d*KcD1^iovk?~*XTMD&#Yt2E_~uJz)tj%ty{p39mwQ4L#?Ys!Uo+36K_O}5n% zIjQJ!=unAk#P@dk9ids zp@cT1V@*IM1{;9|AmDOZSyIDJk}ofcVsM=pp~P>pyK`;`2fw?#bP`} z>+*|n9|VnyS!$stF}+pYfK<6&ERz5Wkq{G=Ta}1G4Wq%Jr7%aM#O4)~q@2s3NFPR@ z2raMo4HCu~27`Z zUn~Bpfi5v!pHh(jwZ=BLM88&U1rFX07Fy`F?4a#uqAyIQ^Pa$&7^wn2$B z(abBwdjtd?e3zwmhhbfc4?z4vmdmHqzO~dQ0EeGU2-;d}M@wYgm?7&nZIa;ZcqJBn zJld+SxXV}SU-sYI3>>{5&^!(j9zat};8dm&J8BWN`8lf*2lTcHPpO09bXhA0xthy6 z7ljsJvuSK?v_Mxit6*3q+==vNm>Cm#&;08OZ+l_f4q(NfZ`#Bz%!KBa{?r2oHQ2%N zo}?f$3&SOt9+oexYU6rWk=k%hkrHWNCTwQN*fdFmC&tB4Jx$ea-UD5HlU3)WFKz;k{gN*`EBF9uVRV#ETysxCW16XJ1&X5N2$UxH`U$kY{b?$KVsK; z6CoP>iX$F1T?;*JxlGWYvLZ849*Inh=XrGCgydW7sBcA1u=$c@-WO=?2y7Ln#Bc8n zU}QC(P74_N7Zq3a{DL(Gq}vUfTRsWUlb}`nNwUE9cp?K;vGE&1$Hp%W4^dyseLIJt z0*_{My}3Lb`lN$Iq*`;S(`LfieU!KI8W*z{qcOxnKuh8{4xuXV!!u&hfkPw9stbht zJe&=JQ4pV31TZY@h+BZRX%H_u@X830ZMbK7f~akgC5+UvCCkVh$<{_w2Emnk{~@_@ z+ISO$=_*$q45k#`v6e7oX9exFl~T+|`JZZn5lwKnkN~0tkQr`SZ!f!kzYP{>(&<-l zLRDDwtj#$%$NGEFYj1OpmX$-XOi0{AOxq46_NAi~v0w~~1lq&`!G=S-(BzPqss4T& zJ2P?&h{ns@Frg#3_oJYS~|#N0J$`; z&mCK6!Ro~^u-e1Q&njQ^U7XNnb<2X#t6jK5sZ(KmaUDm)P?ubexLO(>6lTu-T4JIk zlpIVVps24P0AK>`B@qo)PatESg@IudwJGv7Ll``pDXABSE?6g=+WsI<9o+t6kc1DC{?gYVZY7A*B>E%!u$PHkiwA(754FRGJ1VJn; zkrallh@60DaU*wQ3$jlO#e>w6Nv;F(!#tOg!xB!{rCSgH{TV=4ucLrJztJ#3aoiqW zbD}EnS&R{zW*P%OocutQ>)bRm&XcK`68=*s3UE_obSMo}YaTGinK*2sXEoKi{fb1BYHe z>2;(`vg9DYyturzxD$~m>|N`s0NVm2LJo?Y$=d4q=7O~_Kr7|R=}lL|6}#2SjMbKLw))v^_5|d(2OJKBB%tl@2ba>jNoxyK$F564pwv1t7j z|6wW3Mqx(|)7x5pd3k1XRSPj%;xDbq8j>8sXnCNFp1*d=w*KYD=iCD+7<6kk%80-AX@xdyM8}yT9E~v%e zH)a{1bVI{9+k3k0-LgCOqxT9fJ8wI7+xz54Yl|;#9a3ll0V8G(q=7XOD%W{Pp>0ga zb=69g&l*+9+_QXV5;FTw6K2?{y)9zh_MGjURUc!sx(GRtn0}nRg_~I+E!pDZ!KV-v ziv#lH!)tKnAUotM*3y!+D%Vkqf4W-@>HT3?bB|h?g6-T^QP9gYQxKU?u{L}o_GTR) z4wZoBS$;J|RzAkXw|bGcw7mi5TW`?$)^%T6^_5*5DA1Sbd9R1Nf5?K8lrI#1rbG>T?!e(ojz_0%X2>g zgOPtqbyhOVymP8xuGXT|_*LpEiEb@QpSLC-;{Fg0wZPJPiw&{dxCvuxuRB4M)10<* zVkd@1x){%{vDh*(o^wyNjJRq)f#)#9xi0n5l_!zMi-H@mrPC^$TdOeiVp^I`L#e|Q zjpRWp1vRKZtubwSaSU3JG4oo>YwT15s_$so5}J;pL{OC6Xm4P`+Ge2+bp)IiIe*L> zYm7n%Efb1Xs3*Xzm9UY?9Q1+mrEO{z`TJtYk_LJLkb}uu#^l9Nv1)8#I}*kA?;*4x zn_tg*^(fOwQ;9I@d=ov6HphBIA2Z5CB8Kt4?vJ|T-m9$z8}H&_t#@vM;XXZ^68C9T zsDtl+ANxirWLNbrPM+HjT1&$^t)*EK7uA|NZd(S#<`F;w-ZZhsoEFgGB-^>C;z(CS+4V-_pc&c@IJ6?T&w(8VG^cqH*D zb~i*1m=j-X+D^3xjaBc%s^m zpdX%r4a6ur8YoHGH1#MT@E-)0a ziUhl_Y;jSQfqxq^GNTM z7xV`2Jp$wxN{n^*7d^Jt<7w4zo9xiT3<0<2izjyPP1@r9-yK&(BnsTR5?f%hB^ck- z1~8dRScS6bktm{|DJT*-A&V`7HV&umQbRiJe*LY+cZ-^B8QCRp7#%ktoNzfMwyRo{ z6Q|HiA-NaiOf5I|to8T_+*rGfdk`mk(feu(&Z}5G+(rjPagkE^_=w<DweMm*QNR?8rCA#Bbgt@K~9z_!2KiZK4O`qdAtlI z_QCN{IJ9Op|Fr7Xbw)@0*fp}_Wu&VWKngV#aYt+orPx-8y$gaFH1CO8?{eGk0zy7& z0e)1?;m_j4PD`VaBm9QZVvOpE97#jUBND$4=F}yRh`uU zW$O~^T;%|-{gJ5n!#bXOg@tuLUs2$gAWkCKQA~1UOb{n@00E`!n4la79mZE?Xg4=f zhV2W6(>1ngd2jddB3HZl#F1ZZ|9-cpK|#kkC}IF?PNb9oo`_HZvVM526%+n=Cd2C7 z1VPE_dp(peU11#yEnlvMK0zfj?@AU$5^oI(t6<8ob#B#S)^fQ0Z3qp%#2SFaJVbUe`6@jR!zzD_0A{{ze(rrrwj~3Z=Jd#TdgS71b-Tj-iWI_-V0&F4xIV2~wuq!Sj zr@%^(MwxO}kkR1*Y=Y9pt`#3pzCmMdO68$gzS_Q8T*47k*k09YAd5qIAtPrdNv$wqI`cJ~ zE#g#jj>O&bw6t*9>A5qn!I+oxn294$<= zb}nqmvp4b7*JjOZ!tA6?mheh(_Uh~ISnmAky?4&+20fXJ0sdNcO)khFOCbW&Fl`Q@ zt~ff(1!0v`Jm3*qhUuGt#I!K=E@l!@wD49}y&xCfCux}~C0aNFNnLD}$_R0RymE*{ zgjDaVLbvhNa?DVt6=mkJ6~G!AC`E))t6OrQBIZWf{VF@GR=en$ws*^y78hA8=3DPr z>b!nrYj-+1L3b8u07iLGgIWy8)z6o5Q1G(^8&ug}&o&!+bIwYe%G8G1!H>rPv0bC) zftBAegf<(7HlS^e;~fro?&SSlcKVqxfBf7kWNqM22$-w|cyvjG|9LaXT1mN5eGoi$q zAsZR?BISDf(lb7I^i>h2mS2uY$=5{eJX97-XJ+FK4~q|j(Hv`JdFd?0oZ~!-%hNc5 zDKI8S7wu@p3{_1L2lF9;M+$IpR~&fmn!H$1tRS*Svfv8)EUOwr4J@4Q9JenAc%UE+ zLt-EtE4Ky6MAKxUC`ODjpoANwgr3PEJ)}lnB9XIuq(<0>ouX6DQrFazr7O3or$?6f zh4wjzV_J~t!HPB4ixhD0VNd$7a2Ez~YH#*EqDSYpA?P?olROx$s%P&5(gyi96GnMR z^HOF2Wk?}IQe#;iiDKubAJ)#QOWm{9X|UyYKReB@DXytbMq-r(GcHX;LgMrK`^LsW zJ}F>cOccnDgHty3lppwSKkb}MOn5_>SYJ5}vo;m-rJN{(^M|7_6OV({1eUG9HLE@= z>EHuuVXRt=6KVr!o~Wday3`dj(Tfvj$%;2x41SO|?R{ z3|$|}o?aw_q^$njz!8Dp4G^t#HUosBwzA}uFy=bU8-JMK#U8_sUNLGwNWz*&gh^4= z=&P?gS1svoU+Yj#40udEZ8JJ@8iExQn@@p+O$7J1Vquk*^%iI^xxBa{#-X{%LyZ?- zFf8{_n!}Ny`$SF^93Rt%=X^NP&u7W4#afgqC6=S5R6)RkyW2=M*A=W-5j>@;hU!Fv z&v6T|kElTYF)+r)!VJOW5YuBSU@QjmkB(1lrZ2PR$kb?Y2=T$ z|5>*+f~{S@XXvoWTz4pCrjx5a+CWXmM;kQ3qk{in4gAwuZ8~Zs@3K`jk1N^M@v6KU z-6=ipR?WjuaM{i;cO!J3gHrPAfSZR z=873=+A|fSMf!{eQB_PyA?8gw8u1U+gVA4u^j9XOUGJR-Lt9yIY`yzaNPAl!)~96c zg%!ee zMUCT7jRT{wP02{uQYd=V%~@ze-=YD`$RIEp2?=!o&fTAE3-J%;LRb}3GK~PlPx%FQ^+&pkj5PcZ82DbEbZ)Tr$e~BrgJOHo%Q6GL0#U} z&Ifgo-NNiXtPGLRmT(icVBe4rP@#OA`Vo{}iu#&YZb+`5hTcZ^@DB<_gzkJ&^|;Ue z@gC5agFW3Un00$xH;O%}56o>K6<9 zc2sm*4{@=J+L)Fnh@{O(reGp%poI6AB3c{u2!C|UV9^PtndK4!ek?cY@9+`sGmwfr}A7CE)wn4dR3SQ5Ho zzd7O<(7H{J)b?Km6VRQ}IHU32!5NUjYUgn|b6Gyuu4L{2dq^x(7o|b*V;cuQVPrOe zf%R{aMuNx`8(VxB>{b@YRi!zhKVHFH;92#8+OrvS)x_h|uFxZsVV@$6Qjgg}!J8H0 zP_-MRJzeZIJjQy2>5e^SJhd+FFw_8c&s{tsTOnj;N_h1Vy-MnwwcxiyH#s} zdN-h!`!irW2P<^M6s$0{jhPkQn-SJ_%GmdH4Mtal1Abx#mTcS9qZJ@Wv?fxPi*u!7*GSFMx0|gOafp}OaB#^N!S`GSv70ll3;S% z{GqEke#WM*28ao%OcF<9tS{1HBA6yhv;`7KmVzWEmf6?A&d?J< zEO+M|MJxF}_fnDJ65E&mLTCn-W z(UG;gqZka0wmlsL?q?b2UG5_V5{B)DjT<&JSYcU14pkwobO}K-Oth$b9_@;Uwd;l# z*8{e=X9>AsN@DwueVwH1lxP)Bifwol{2++Hp~L zQUWtZCmv8;p*9qbG}ZgYv=9#25ETR$u2&1QIN`uHfTXR37vnxeHc?>jy5ZP%AjN-^ z;<=$A*bi-}gqNZ#afi}1RS?ia5mH9$8_KVY@UPG^P@z1_&`TEi&(e=}@cfchY%BvQ zQe-IQBakYrqJm2a0*C%^0?`m5W%?Nsd?U3TA>g+yAgIm1e^hs3wS-g=B%5arL2UKf zIWWDNNrit)ff&ed*ATn`u@KXIS5%(BR41gR&i6PyDGgHG-Ofd@>*cS+I>o_cfm{HE z&yf^{)}W2xCm~GuStBH5T0>vKu`F%`;yI}F3a}kVpi)H=IuvCvbU+vlUChdc1q1sf zS_G|I8n>}FCBc>yhKT!~x2Z!J%7A6D)#vgqEH+n%^O1|5es6c8lmXu^*Ws{BE>3V` z;DH+hk6;eq)J+~6c+reacK%$_N7L%QZ0kCQW@%XtDKXSA_Cbd1X~$&W<5!)hk**665n-Ib1DP$Y$RytDGb7K5W5Ms`%bt3{6quOTCSk~7P3Jsxh&0qA z0v~w2EU!<8EI)7n_I-Jok~GcoeNlo&?<ShZ*ctPQF~JdOT9=qWKd-=!{V0