this repo has no description

setup for astral power page

- assets
- lexicons
- power tree
- power values
- lexgen

vielle.dev 1567a67b 379ab65d

verified
+956 -1
+6
lex.config.ts
··· 1 + import { defineLexiconConfig } from "@atcute/lex-cli"; 2 + 3 + export default defineLexiconConfig({ 4 + files: ["lexicons/**/*.json"], 5 + outdir: "src/lexicons", 6 + });
+51
lexicons/dev/vielle/dnd/astral.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "dev.vielle.dnd.astral", 4 + "description": "Schema for storing astral powers. Used for dnd.vielle.dev", 5 + "defs": { 6 + "main": { 7 + "type": "record", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": ["points", "powers"], 12 + "properties": { 13 + "points": { 14 + "type": "integer", 15 + "minimum": 0, 16 + "default": 0 17 + }, 18 + "powers": { 19 + "type": "array", 20 + "items": { 21 + "type": "ref", 22 + "ref": "#power" 23 + } 24 + } 25 + } 26 + } 27 + }, 28 + "power": { 29 + "type": "string", 30 + "knownValues": [ 31 + "dev.vielle.dnd.power#eldritchAdaptability", 32 + "dev.vielle.dnd.power#eldritchAssault", 33 + "dev.vielle.dnd.power#runeSeeker", 34 + "dev.vielle.dnd.power#fateScriber", 35 + "dev.vielle.dnd.power#faceless", 36 + "dev.vielle.dnd.power#bind", 37 + "dev.vielle.dnd.power#spray", 38 + "dev.vielle.dnd.power#acursed", 39 + "dev.vielle.dnd.power#darksight", 40 + "dev.vielle.dnd.power#eldritchVisage", 41 + "dev.vielle.dnd.power#regenerate", 42 + "dev.vielle.dnd.power#instil", 43 + "dev.vielle.dnd.power#eldritchEnchantment", 44 + "dev.vielle.dnd.power#whisper", 45 + "dev.vielle.dnd.power#bond", 46 + "dev.vielle.dnd.power#claw", 47 + "dev.vielle.dnd.power#invalid" 48 + ] 49 + } 50 + } 51 + }
+62
lexicons/dev/vielle/dnd/power.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "dev.vielle.dnd.power", 4 + "description": "Tokens for all dev.vielle.dnd.astral powers", 5 + "defs": { 6 + "eldritchAdaptability": { 7 + "type": "token" 8 + }, 9 + "eldritchAssault": { 10 + "type": "token" 11 + }, 12 + "runeSeeker": { 13 + "type": "token" 14 + }, 15 + "fateScriber": { 16 + "type": "token" 17 + }, 18 + "faceless": { 19 + "type": "token" 20 + }, 21 + "bind": { 22 + "type": "token" 23 + }, 24 + "spray": { 25 + "type": "token" 26 + }, 27 + "acursed": { 28 + "type": "token" 29 + }, 30 + "darksight": { 31 + "type": "token" 32 + }, 33 + "eldritchVisage": { 34 + "type": "token" 35 + }, 36 + "regenerate": { 37 + "type": "token" 38 + }, 39 + "instil": { 40 + "type": "token" 41 + }, 42 + "eldritchEnchantment": { 43 + "type": "token" 44 + }, 45 + "whisper": { 46 + "type": "token" 47 + }, 48 + "bond": { 49 + "type": "token" 50 + }, 51 + "claw": { 52 + "type": "token" 53 + }, 54 + "invalid": { 55 + "type": "token" 56 + }, 57 + "locked": { 58 + "type": "token", 59 + "description": "This power should not be obtainable as an astral power." 60 + } 61 + } 62 + }
+6 -1
package.json
··· 6 6 "dev": "astro dev", 7 7 "build": "astro build", 8 8 "preview": "astro preview", 9 - "astro": "astro" 9 + "astro": "astro", 10 + "lexgen": "lex-cli generate" 10 11 }, 11 12 "dependencies": { 12 13 "@atcute/client": "^4.2.1", 13 14 "@atcute/identity-resolver": "^1.2.2", 15 + "@atcute/lexicons": "^1.2.6", 14 16 "@atcute/oauth-browser-client": "^2.0.3", 15 17 "actor-typeahead": "^0.1.2", 16 18 "astro": "^5.16.6" 19 + }, 20 + "devDependencies": { 21 + "@atcute/lex-cli": "^2.5.2" 17 22 } 18 23 }
+141
pnpm-lock.yaml
··· 14 14 '@atcute/identity-resolver': 15 15 specifier: ^1.2.2 16 16 version: 1.2.2(@atcute/identity@1.1.3) 17 + '@atcute/lexicons': 18 + specifier: ^1.2.6 19 + version: 1.2.6 17 20 '@atcute/oauth-browser-client': 18 21 specifier: ^2.0.3 19 22 version: 2.0.3(@atcute/identity@1.1.3) ··· 23 26 astro: 24 27 specifier: ^5.16.6 25 28 version: 5.16.6(@types/node@25.0.3)(rollup@4.55.1)(typescript@5.9.3) 29 + devDependencies: 30 + '@atcute/lex-cli': 31 + specifier: ^2.5.2 32 + version: 2.5.2 26 33 27 34 packages: 28 35 ··· 43 50 resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} 44 51 engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} 45 52 53 + '@atcute/car@5.0.0': 54 + resolution: {integrity: sha512-OIY2xTXv8lSpZsDSn/UYQtJSMvDw5Hi4Q+uyvmiqSM+fht08QRAEq/nxa5YFciPZ3nfDFnZ3//EgJw7QhkSXLQ==} 55 + 56 + '@atcute/cbor@2.2.8': 57 + resolution: {integrity: sha512-UzOAN9BuN6JCXgn0ryV8qZuRJUDrNqrbLd6EFM8jc6RYssjRyGRxNy6RZ1NU/07Hd8Tq/0pz8+nQiMu5Zai5uw==} 58 + 59 + '@atcute/cid@2.3.0': 60 + resolution: {integrity: sha512-1SRdkTuMs/l5arQ+7Ag0F7JAueZqtzYE0d2gmbkuzi8EPweNU1kYlQs0CE4dSd81YF8PMDTOQty0K2ATq9CW9g==} 61 + 46 62 '@atcute/client@4.2.1': 47 63 resolution: {integrity: sha512-ZBFM2pW075JtgGFu5g7HHZBecrClhlcNH8GVP9Zz1aViWR+cjjBsTpeE63rJs+FCOHFYlirUyo5L8SGZ4kMINw==} 48 64 65 + '@atcute/crypto@2.3.0': 66 + resolution: {integrity: sha512-w5pkJKCjbNMQu+F4JRHbR3ROQyhi1wbn+GSC6WDQamcYHkZmEZk1/eoI354bIQOOfkEM6aFLv718iskrkon4GQ==} 67 + 49 68 '@atcute/identity-resolver@1.2.2': 50 69 resolution: {integrity: sha512-eUh/UH4bFvuXS0X7epYCeJC/kj4rbBXfSRumLEH4smMVwNOgTo7cL/0Srty+P/qVPoZEyXdfEbS0PHJyzoXmHw==} 51 70 peerDependencies: ··· 54 73 '@atcute/identity@1.1.3': 55 74 resolution: {integrity: sha512-oIqPoI8TwWeQxvcLmFEZLdN2XdWcaLVtlm8pNk0E72As9HNzzD9pwKPrLr3rmTLRIoULPPFmq9iFNsTeCIU9ng==} 56 75 76 + '@atcute/lex-cli@2.5.2': 77 + resolution: {integrity: sha512-u3xeu7uF7mAgAErYpXvdUaH2bxpthGWLg+vUf20cejWZHBH/dAzL4ixLRjw/39WwoVmmCQDTde79WTPoBjuhpg==} 78 + hasBin: true 79 + 80 + '@atcute/lexicon-doc@2.0.6': 81 + resolution: {integrity: sha512-iDYJkuom+tIw3zIvU1ggCEVFfReXKfOUtIhpY2kEg2kQeSfMB75F+8k1QOpeAQBetyWYmjsHqBuSUX9oQS6L1Q==} 82 + 83 + '@atcute/lexicon-resolver@0.1.6': 84 + resolution: {integrity: sha512-wJC/ChmpP7k+ywpOd07CMvioXjIGaFpF3bDwXLi/086LYjSWHOvtW6pyC+mqP5wLhjyH2hn4wmi77Buew1l1aw==} 85 + peerDependencies: 86 + '@atcute/identity': ^1.1.0 87 + '@atcute/identity-resolver': ^1.1.3 88 + 57 89 '@atcute/lexicons@1.2.6': 58 90 resolution: {integrity: sha512-s76UQd8D+XmHIzrjD9CJ9SOOeeLPHc+sMmcj7UFakAW/dDFXc579fcRdRfuUKvXBL5v1Gs2VgDdlh/IvvQZAwA==} 59 91 92 + '@atcute/mst@0.1.1': 93 + resolution: {integrity: sha512-NZ/lZ68GOjmAgBSeGf6WHyKM5wo1Hhc7PNt9uwsViswGPMNEEKNj9cw+0YGziXee/Qbnvc+CKqbRSPwruhXFQg==} 94 + 60 95 '@atcute/multibase@1.1.6': 61 96 resolution: {integrity: sha512-HBxuCgYLKPPxETV0Rot4VP9e24vKl8JdzGCZOVsDaOXJgbRZoRIF67Lp0H/OgnJeH/Xpva8Z5ReoTNJE5dn3kg==} 62 97 63 98 '@atcute/oauth-browser-client@2.0.3': 64 99 resolution: {integrity: sha512-rzUjwhjE4LRRKdQnCFQag/zXRZMEAB1hhBoLfnoQuHwWbmDUCL7fzwC3jRhDPp3om8XaYNDj8a/iqRip0wRqoQ==} 65 100 101 + '@atcute/repo@0.1.1': 102 + resolution: {integrity: sha512-P5aWjt3bvcquUkUmGPslF0naAfLGRHse5Qdz9/RJYrFuoH0iiEMyRnW6M+3ksOe20GPsMnbq71WbzzFkRFPBtg==} 103 + 66 104 '@atcute/uint8array@1.0.6': 67 105 resolution: {integrity: sha512-ucfRBQc7BFT8n9eCyGOzDHEMKF/nZwhS2pPao4Xtab1ML3HdFYcX2DM1tadCzas85QTGxHe5urnUAAcNKGRi9A==} 68 106 ··· 71 109 72 110 '@atcute/util-text@0.0.1': 73 111 resolution: {integrity: sha512-t1KZqvn0AYy+h2KcJyHnKF9aEqfRfMUmyY8j1ELtAEIgqN9CxINAjxnoRCJIFUlvWzb+oY3uElQL/Vyk3yss0g==} 112 + 113 + '@atcute/varint@1.0.3': 114 + resolution: {integrity: sha512-fdvMPyBB+McDT+Ai5e9RwEbwYV4yjZ60S2Dn5PTjGqUyxvoCH1z42viuheDZRUDkmfQehXJTZ5az7dSozVNtog==} 74 115 75 116 '@babel/helper-string-parser@7.27.1': 76 117 resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} ··· 395 436 396 437 '@jridgewell/sourcemap-codec@1.5.5': 397 438 resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 439 + 440 + '@noble/secp256k1@3.0.0': 441 + resolution: {integrity: sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg==} 442 + 443 + '@optique/core@0.6.11': 444 + resolution: {integrity: sha512-GVLFihzBA1j78NFlkU5N1Lu0jRqET0k6Z66WK8VQKG/a3cxmCInVGSKMIdQG8i6pgC8wD5OizF6Y3QMztmhAxg==} 445 + engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} 446 + 447 + '@optique/run@0.6.11': 448 + resolution: {integrity: sha512-tsXBEygGSzNpFK2gjsRlXBn7FiScUeLFWIZNpoAZ8iG85Km0/3K9xgqlQAXoQ+uEZBe4XplnzyCDvmEgbyNT8w==} 449 + engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} 398 450 399 451 '@oslojs/encoding@1.1.0': 400 452 resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} ··· 1190 1242 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1191 1243 engines: {node: ^10 || ^12 || >=14} 1192 1244 1245 + prettier@3.7.4: 1246 + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} 1247 + engines: {node: '>=14'} 1248 + hasBin: true 1249 + 1193 1250 prismjs@1.30.0: 1194 1251 resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} 1195 1252 engines: {node: '>=6'} ··· 1629 1686 transitivePeerDependencies: 1630 1687 - supports-color 1631 1688 1689 + '@atcute/car@5.0.0': 1690 + dependencies: 1691 + '@atcute/cbor': 2.2.8 1692 + '@atcute/cid': 2.3.0 1693 + '@atcute/uint8array': 1.0.6 1694 + '@atcute/varint': 1.0.3 1695 + 1696 + '@atcute/cbor@2.2.8': 1697 + dependencies: 1698 + '@atcute/cid': 2.3.0 1699 + '@atcute/multibase': 1.1.6 1700 + '@atcute/uint8array': 1.0.6 1701 + 1702 + '@atcute/cid@2.3.0': 1703 + dependencies: 1704 + '@atcute/multibase': 1.1.6 1705 + '@atcute/uint8array': 1.0.6 1706 + 1632 1707 '@atcute/client@4.2.1': 1633 1708 dependencies: 1634 1709 '@atcute/identity': 1.1.3 1635 1710 '@atcute/lexicons': 1.2.6 1636 1711 1712 + '@atcute/crypto@2.3.0': 1713 + dependencies: 1714 + '@atcute/multibase': 1.1.6 1715 + '@atcute/uint8array': 1.0.6 1716 + '@noble/secp256k1': 3.0.0 1717 + 1637 1718 '@atcute/identity-resolver@1.2.2(@atcute/identity@1.1.3)': 1638 1719 dependencies: 1639 1720 '@atcute/identity': 1.1.3 ··· 1646 1727 '@atcute/lexicons': 1.2.6 1647 1728 '@badrap/valita': 0.4.6 1648 1729 1730 + '@atcute/lex-cli@2.5.2': 1731 + dependencies: 1732 + '@atcute/identity': 1.1.3 1733 + '@atcute/identity-resolver': 1.2.2(@atcute/identity@1.1.3) 1734 + '@atcute/lexicon-doc': 2.0.6 1735 + '@atcute/lexicon-resolver': 0.1.6(@atcute/identity-resolver@1.2.2(@atcute/identity@1.1.3))(@atcute/identity@1.1.3) 1736 + '@atcute/lexicons': 1.2.6 1737 + '@badrap/valita': 0.4.6 1738 + '@optique/core': 0.6.11 1739 + '@optique/run': 0.6.11 1740 + picocolors: 1.1.1 1741 + prettier: 3.7.4 1742 + 1743 + '@atcute/lexicon-doc@2.0.6': 1744 + dependencies: 1745 + '@atcute/identity': 1.1.3 1746 + '@atcute/lexicons': 1.2.6 1747 + '@atcute/uint8array': 1.0.6 1748 + '@atcute/util-text': 0.0.1 1749 + '@badrap/valita': 0.4.6 1750 + 1751 + '@atcute/lexicon-resolver@0.1.6(@atcute/identity-resolver@1.2.2(@atcute/identity@1.1.3))(@atcute/identity@1.1.3)': 1752 + dependencies: 1753 + '@atcute/crypto': 2.3.0 1754 + '@atcute/identity': 1.1.3 1755 + '@atcute/identity-resolver': 1.2.2(@atcute/identity@1.1.3) 1756 + '@atcute/lexicon-doc': 2.0.6 1757 + '@atcute/lexicons': 1.2.6 1758 + '@atcute/repo': 0.1.1 1759 + '@atcute/util-fetch': 1.0.5 1760 + '@badrap/valita': 0.4.6 1761 + 1649 1762 '@atcute/lexicons@1.2.6': 1650 1763 dependencies: 1651 1764 '@atcute/uint8array': 1.0.6 ··· 1653 1766 '@standard-schema/spec': 1.1.0 1654 1767 esm-env: 1.2.2 1655 1768 1769 + '@atcute/mst@0.1.1': 1770 + dependencies: 1771 + '@atcute/cbor': 2.2.8 1772 + '@atcute/cid': 2.3.0 1773 + '@atcute/uint8array': 1.0.6 1774 + 1656 1775 '@atcute/multibase@1.1.6': 1657 1776 dependencies: 1658 1777 '@atcute/uint8array': 1.0.6 ··· 1668 1787 transitivePeerDependencies: 1669 1788 - '@atcute/identity' 1670 1789 1790 + '@atcute/repo@0.1.1': 1791 + dependencies: 1792 + '@atcute/car': 5.0.0 1793 + '@atcute/cbor': 2.2.8 1794 + '@atcute/cid': 2.3.0 1795 + '@atcute/crypto': 2.3.0 1796 + '@atcute/lexicons': 1.2.6 1797 + '@atcute/mst': 0.1.1 1798 + '@atcute/uint8array': 1.0.6 1799 + 1671 1800 '@atcute/uint8array@1.0.6': {} 1672 1801 1673 1802 '@atcute/util-fetch@1.0.5': ··· 1677 1806 '@atcute/util-text@0.0.1': 1678 1807 dependencies: 1679 1808 unicode-segmenter: 0.14.5 1809 + 1810 + '@atcute/varint@1.0.3': {} 1680 1811 1681 1812 '@babel/helper-string-parser@7.27.1': {} 1682 1813 ··· 1878 2009 optional: true 1879 2010 1880 2011 '@jridgewell/sourcemap-codec@1.5.5': {} 2012 + 2013 + '@noble/secp256k1@3.0.0': {} 2014 + 2015 + '@optique/core@0.6.11': {} 2016 + 2017 + '@optique/run@0.6.11': 2018 + dependencies: 2019 + '@optique/core': 0.6.11 1881 2020 1882 2021 '@oslojs/encoding@1.1.0': {} 1883 2022 ··· 2930 3069 nanoid: 3.3.11 2931 3070 picocolors: 1.1.1 2932 3071 source-map-js: 1.2.1 3072 + 3073 + prettier@3.7.4: {} 2933 3074 2934 3075 prismjs@1.30.0: {} 2935 3076
public/astral/acursed.webp

This is a binary file and will not be displayed.

public/astral/bind.webp

This is a binary file and will not be displayed.

public/astral/bond.webp

This is a binary file and will not be displayed.

public/astral/claw.webp

This is a binary file and will not be displayed.

public/astral/darksight.webp

This is a binary file and will not be displayed.

public/astral/eldritch_adaptability.webp

This is a binary file and will not be displayed.

public/astral/eldritch_assault.webp

This is a binary file and will not be displayed.

public/astral/eldritch_enchantment.webp

This is a binary file and will not be displayed.

public/astral/eldritch_visage.webp

This is a binary file and will not be displayed.

public/astral/faceless.webp

This is a binary file and will not be displayed.

public/astral/fate_scriber.webp

This is a binary file and will not be displayed.

public/astral/instill.webp

This is a binary file and will not be displayed.

public/astral/locked.webp

This is a binary file and will not be displayed.

public/astral/regenerate.webp

This is a binary file and will not be displayed.

public/astral/rune_seeker.webp

This is a binary file and will not be displayed.

public/astral/spray.webp

This is a binary file and will not be displayed.

public/astral/whisperer.webp

This is a binary file and will not be displayed.

+509
src/consts/astral.ts
··· 1 + import { DevVielleDndPower } from "../lexicons"; 2 + 3 + export const powers = { 4 + ELDRITCHADAPTABILITY: DevVielleDndPower.eldritchAdaptabilitySchema.expected, 5 + ELDRITCHASSAULT: DevVielleDndPower.eldritchAssaultSchema.expected, 6 + RUNESEEKER: DevVielleDndPower.runeSeekerSchema.expected, 7 + FATESCRIBER: DevVielleDndPower.fateScriberSchema.expected, 8 + FACELESS: DevVielleDndPower.facelessSchema.expected, 9 + BIND: DevVielleDndPower.bindSchema.expected, 10 + SPRAY: DevVielleDndPower.spraySchema.expected, 11 + ACURSED: DevVielleDndPower.acursedSchema.expected, 12 + DARKSIGHT: DevVielleDndPower.darksightSchema.expected, 13 + ELDRITCHVISAGE: DevVielleDndPower.eldritchVisageSchema.expected, 14 + REGENERATE: DevVielleDndPower.regenerateSchema.expected, 15 + INSTIL: DevVielleDndPower.instilSchema.expected, 16 + ELDRITCHENCHANTMENT: DevVielleDndPower.eldritchEnchantmentSchema.expected, 17 + WHISPER: DevVielleDndPower.whisperSchema.expected, 18 + BOND: DevVielleDndPower.bondSchema.expected, 19 + CLAW: DevVielleDndPower.clawSchema.expected, 20 + INVALID: DevVielleDndPower.invalidSchema.expected, 21 + LOCKED: DevVielleDndPower.lockedSchema.expected, 22 + } as const; 23 + 24 + export const normalPowers = [ 25 + powers.ELDRITCHADAPTABILITY, 26 + powers.ELDRITCHASSAULT, 27 + powers.RUNESEEKER, 28 + powers.FATESCRIBER, 29 + powers.FACELESS, 30 + powers.BIND, 31 + powers.SPRAY, 32 + powers.ACURSED, 33 + powers.DARKSIGHT, 34 + powers.ELDRITCHVISAGE, 35 + powers.REGENERATE, 36 + powers.INSTIL, 37 + powers.ELDRITCHENCHANTMENT, 38 + powers.WHISPER, 39 + powers.BOND, 40 + powers.CLAW, 41 + ] as const; 42 + 43 + export type powerId = (typeof powers)[keyof typeof powers]; 44 + 45 + export interface Power { 46 + name: string; 47 + forceSelect?: boolean; 48 + description: string; 49 + image: { 50 + src: string; 51 + alt: string; 52 + }; 53 + meta: { 54 + name: string; 55 + value: string; 56 + }[]; 57 + } 58 + 59 + export const powerData: Record<powerId, Power> = { 60 + [powers.ELDRITCHADAPTABILITY]: { 61 + name: "Eldritch Adaptability", 62 + forceSelect: true, 63 + description: 64 + "You become more adaptable to other envirmonents. When entering another world your body automatically adjusts to endure there better. This can include new languages, gills, cultural understanding, and more.", 65 + image: { 66 + src: "/astral/eldritch_adaptability.webp", 67 + alt: "", 68 + }, 69 + meta: [], 70 + }, 71 + [powers.ELDRITCHASSAULT]: { 72 + name: "Eldritch Assault", 73 + description: 74 + "Use your action to cause your attacks to deal an additional 1d4 Force damage for the next 10 turns, but you take 1d4 Force damage for the next 10 turns. To determine damage, roll 2 dice. Use the lower result for damage dealt to yourself, and the higher for the damage dealt to the target. This dice increases to a d6 at 5th level, d8 at 11th level, and d10 at 17th level. Additionally, you take 1 less damage from this at 7th level, 2 less at 15th level, and 3 less at 19th level. (This cannot reduce damage below 1.)", 75 + image: { 76 + src: "/astral/eldritch_assault.webp", 77 + alt: "", 78 + }, 79 + meta: [], 80 + }, 81 + [powers.RUNESEEKER]: { 82 + name: "Rune Seeker", 83 + description: 84 + "You may cast Comprehend Languages. This does not cost V, S, or M components. If you use all 3 uses you may cast it using spell slots as a normal spell.", 85 + image: { 86 + src: "rune_seeker.webp", 87 + alt: "", 88 + }, 89 + meta: [ 90 + { 91 + name: "Charges", 92 + value: "3x long rest", 93 + }, 94 + ], 95 + }, 96 + [powers.FATESCRIBER]: { 97 + name: "Fate Scriber", 98 + description: 99 + "You may make an attack hit if it was a miss, a miss if it was a hit, a critical hit if it was a hit, or a normal hit if it was a critical hit. This costs a reaction and may be performed on any attack roll.", 100 + image: { 101 + src: "/astral/fate_scriber.webp", 102 + alt: "", 103 + }, 104 + meta: [ 105 + { 106 + name: "Charges", 107 + value: "1x long rest", 108 + }, 109 + { 110 + name: "Range", 111 + value: "60ft", 112 + }, 113 + ], 114 + }, 115 + [powers.FACELESS]: { 116 + name: "Faceless", 117 + description: 118 + "You may cast disguise self as an action without expending a spell slot. It takes an action to dispell the illusion created this way, and you must pass a DC10 sanity save or choose a different apperance instead of dropping the illusion.", 119 + image: { 120 + src: "/astral/faceless.webp", 121 + alt: "", 122 + }, 123 + meta: [], 124 + }, 125 + [powers.BIND]: { 126 + name: "Bind", 127 + description: 128 + "As an action, target 2 creatures you can see that are within 15ft of each other. The creatures must make a dex save (DC equals 9 + half your proficieny bonus + any ability modifier of your choosing) or they are tied together. If one creature passes the save, the other creature is dragged to the creature who saved, otherwise they are both moved to a tile between them. If either creature moves, the other creature moves with it and they stay in the same position relative to each other. They are both considered grappled, with the exception of the advantage/disadvantage, which is replaced to a +2 and -2 respectivley. This requires concentration and lasts up to 5 turns.", 129 + image: { 130 + src: "/astral/bind.webp", 131 + alt: "", 132 + }, 133 + meta: [ 134 + { 135 + name: "Duration", 136 + value: "30 seconds, concentration", 137 + }, 138 + { 139 + name: "Charges", 140 + value: "prof bonus x per short rest", 141 + }, 142 + { 143 + name: "Range", 144 + value: "120ft", 145 + }, 146 + ], 147 + }, 148 + [powers.SPRAY]: { 149 + name: "Spray", 150 + description: 151 + "Choose one damaging cantrip you have access to which gains additional damage dice at 5th, 11th, and 17th level. The cantrip no longer gains aditional damage dice in this way, but can instead target 2 different creatures at level 5, 3 at level 11, and 4 at level 17. You must make an attack roll for each target. The effect can target the same creature multiple times.", 152 + image: { 153 + src: "/astral/spray.webp", 154 + alt: "", 155 + }, 156 + meta: [], 157 + }, 158 + [powers.ACURSED]: { 159 + name: "Acursed", 160 + description: 161 + "As an action, choose 1 creature. The creature takes 1d8 force damage whenever you attack it or deal damage (even if the attack misses or it saves). It takes an additional d8 of damage for every extra unique damage type in the attack (ie: 1d6 piercing gets 1d8, 1d6 piercing and 5d6 cold and 2d4 radiant and 1d8 piercing gets 3d8. The creature also gets disadvantage on any d20 test using an ability you choose when you select the creature. This can be cast while raging", 162 + image: { 163 + src: "/astral/acursed.webp", 164 + alt: "", 165 + }, 166 + meta: [ 167 + { 168 + name: "Charges", 169 + value: "1x short rest, concentration", 170 + }, 171 + { 172 + name: "Range", 173 + value: "120ft", 174 + }, 175 + ], 176 + }, 177 + [powers.DARKSIGHT]: { 178 + name: "Darksight", 179 + description: 180 + "You gain darkvision and can see through any magical darkness created by your spells or powers. You can allow any creature to see through darkness made by your spells at any point at no cost. If you already have darkvision of 120ft or greater, your darkvision increases by 120ft. This does not affect your ability to see through magical darkness.", 181 + image: { 182 + src: "/astral/darksight.webp", 183 + alt: "", 184 + }, 185 + meta: [ 186 + { 187 + name: "Duration", 188 + value: "passive", 189 + }, 190 + { 191 + name: "Range", 192 + value: "120ft", 193 + }, 194 + ], 195 + }, 196 + [powers.ELDRITCHVISAGE]: { 197 + name: "Eldritch Visage", 198 + description: 199 + "You gain Truesight for the next round. This requires concentration but do not gain the ability to see into the ethereal plane.", 200 + image: { 201 + src: "/astral/eldritch_visage.webp", 202 + alt: "", 203 + }, 204 + meta: [ 205 + { 206 + name: "Charges", 207 + value: "1x long rest", 208 + }, 209 + { 210 + name: "Range", 211 + value: "15ft", 212 + }, 213 + ], 214 + }, 215 + [powers.REGENERATE]: { 216 + name: "Regenerate", 217 + description: 218 + "As an action you may target yourself or someone else with access to Astral Powers. You choose an astral power they have access to which recharges on a short or long rest and has been used. The ability can be used. If it can be used multiple times it regains half its uses. If you do not know what abilities they have then an ability is choosen at random by the DM. This cannot be recharged using this same ability.", 219 + image: { 220 + src: "/astral/regenerate.webp", 221 + alt: "", 222 + }, 223 + meta: [ 224 + { 225 + name: "Charges", 226 + value: "1x long rest", 227 + }, 228 + { 229 + name: "Range", 230 + value: "touch", 231 + }, 232 + ], 233 + }, 234 + [powers.INSTIL]: { 235 + name: "Instill", 236 + description: 237 + "Use your action to allow a creature to take any one of their actions or bonus actions as a free action.", 238 + image: { 239 + src: "/astral/instill.webp", 240 + alt: "", 241 + }, 242 + meta: [ 243 + { 244 + name: "Charges", 245 + value: "proficiency x short rest", 246 + }, 247 + { 248 + name: "Range", 249 + value: "120ft", 250 + }, 251 + ], 252 + }, 253 + [powers.ELDRITCHENCHANTMENT]: { 254 + name: "Eldritch Enchantment", 255 + description: 256 + "You may cast Friends or Minor Illusion at will as an action. You may also cast Animal Friendship, Charm Person, or Illusiory Script.", 257 + image: { 258 + src: "/astral/eldritch_enchantment.webp", 259 + alt: "", 260 + }, 261 + meta: [ 262 + { 263 + name: "Charges", 264 + value: "prof bonus x per day (af, cp, is)", 265 + }, 266 + ], 267 + }, 268 + [powers.WHISPER]: { 269 + name: "Whisperer", 270 + description: 271 + "Choose 3 charisma based skills or 2 charisma based skill and 3 musical instruments. You gain proficiency in those skills and instruments.", 272 + image: { 273 + src: "/astral/whisperer.webp", 274 + alt: "", 275 + }, 276 + meta: [ 277 + { 278 + name: "Duration", 279 + value: "passive", 280 + }, 281 + ], 282 + }, 283 + [powers.BOND]: { 284 + name: "Bond", 285 + description: 286 + "You may bond to a willing creature once after gaining this power. This creature becomes your familiar and gains all the boons of find familiar and none of the drawbacks. This creature must be in the small pocket dimension while another creature from Find Familiar and other similar effects are in the world. The bonded creature cannot die and gains an ability score improvement when you reach levels 4, 8, 12, 16, 19, and 20. You do not gain ASIs retroactivley upon bonding. If you choose to bond to a familiar, the creature gains the additional boons listed and you may negotiate new powers, abilities, or improvements with your DM. If the creature you bond to chooses to end your bond, you loose this feature and gain one extra astral power point. Regaining this feature after loosing it allows you to choose a new creature. When a creature chooses to break its bond with you it will gain the ability to return to any point it knows in its home reality once, in order to leave.", 287 + image: { 288 + src: "/astral/bond.webp", 289 + alt: "", 290 + }, 291 + meta: [ 292 + { 293 + name: "Charges", 294 + value: "1x unlocked (bond), 1x short rest (revive)", 295 + }, 296 + { 297 + name: "Range", 298 + value: "touch", 299 + }, 300 + ], 301 + }, 302 + [powers.CLAW]: { 303 + name: "Claw", 304 + description: 305 + "Touch a severed hand which has similar atributes to a crawling claw. The hand becomes a crawling claw which you control for the duration. You can cast spells with a range of touch through it, and control it in ititiative. It takes its turn immediatley after yours, and casting a spell through it takes its action. After the duration of the power, the claw gains sentience and you loose control. It gains the consciencness if the owner of the original owner and can understand your words but not other peoples. You may only have one claw at a time. <br /> <b>Changes from statblock:</b> <br /> The claw shares an alignment with its original owner. It can understand any language, but only when spoken by the animator. The damage type from its attack is determined based on which would deal more damage to the target (accounting for immunity and resistance and bonus damage)", 306 + image: { 307 + src: "/astral/claw.webp", 308 + alt: "", 309 + }, 310 + meta: [ 311 + { 312 + name: "Duration", 313 + value: "24 hours", 314 + }, 315 + { 316 + name: "Charges", 317 + value: "1x long rest", 318 + }, 319 + ], 320 + }, 321 + [powers.INVALID]: { 322 + name: "", 323 + description: "", 324 + image: { 325 + src: "", 326 + alt: "", 327 + }, 328 + meta: [], 329 + }, 330 + [powers.LOCKED]: { 331 + name: "", 332 + description: "", 333 + image: { 334 + src: "", 335 + alt: "", 336 + }, 337 + meta: [], 338 + }, 339 + }; 340 + 341 + export const powerTree: { id: powerId; children: (typeof powerTree)[] } = { 342 + id: powers.ELDRITCHADAPTABILITY, 343 + children: [ 344 + { 345 + id: powers.ELDRITCHASSAULT, 346 + children: [ 347 + { 348 + id: powers.SPRAY, 349 + children: [ 350 + { 351 + id: powers.LOCKED, 352 + children: [ 353 + { id: powers.LOCKED, children: [] }, 354 + { id: powers.LOCKED, children: [] }, 355 + ], 356 + }, 357 + ], 358 + }, 359 + { 360 + id: powers.ACURSED, 361 + children: [ 362 + { 363 + id: powers.LOCKED, 364 + children: [ 365 + { id: powers.LOCKED, children: [] }, 366 + { id: powers.LOCKED, children: [] }, 367 + ], 368 + }, 369 + ], 370 + }, 371 + ], 372 + }, 373 + { 374 + id: powers.RUNESEEKER, 375 + children: [ 376 + { 377 + id: powers.DARKSIGHT, 378 + children: [ 379 + { 380 + id: powers.LOCKED, 381 + children: [ 382 + { id: powers.LOCKED, children: [] }, 383 + { id: powers.LOCKED, children: [] }, 384 + ], 385 + }, 386 + ], 387 + }, 388 + { 389 + id: powers.ELDRITCHVISAGE, 390 + children: [ 391 + { 392 + id: powers.LOCKED, 393 + children: [ 394 + { id: powers.LOCKED, children: [] }, 395 + { id: powers.LOCKED, children: [] }, 396 + ], 397 + }, 398 + ], 399 + }, 400 + ], 401 + }, 402 + { 403 + id: powers.FATESCRIBER, 404 + children: [ 405 + { 406 + id: powers.REGENERATE, 407 + children: [ 408 + { 409 + id: powers.LOCKED, 410 + children: [ 411 + { id: powers.LOCKED, children: [] }, 412 + { id: powers.LOCKED, children: [] }, 413 + ], 414 + }, 415 + ], 416 + }, 417 + { 418 + id: powers.INSTIL, 419 + children: [ 420 + { 421 + id: powers.LOCKED, 422 + children: [ 423 + { id: powers.LOCKED, children: [] }, 424 + { id: powers.LOCKED, children: [] }, 425 + ], 426 + }, 427 + ], 428 + }, 429 + ], 430 + }, 431 + { 432 + id: powers.FACELESS, 433 + children: [ 434 + { 435 + id: powers.ELDRITCHENCHANTMENT, 436 + children: [ 437 + { 438 + id: powers.LOCKED, 439 + children: [ 440 + { id: powers.LOCKED, children: [] }, 441 + { id: powers.LOCKED, children: [] }, 442 + ], 443 + }, 444 + ], 445 + }, 446 + { 447 + id: powers.WHISPER, 448 + children: [ 449 + { 450 + id: powers.LOCKED, 451 + children: [ 452 + { id: powers.LOCKED, children: [] }, 453 + { id: powers.LOCKED, children: [] }, 454 + ], 455 + }, 456 + ], 457 + }, 458 + ], 459 + }, 460 + { 461 + id: powers.BIND, 462 + children: [ 463 + { 464 + id: powers.BOND, 465 + children: [ 466 + { 467 + id: powers.LOCKED, 468 + children: [ 469 + { id: powers.LOCKED, children: [] }, 470 + { id: powers.LOCKED, children: [] }, 471 + ], 472 + }, 473 + ], 474 + }, 475 + { 476 + id: powers.CLAW, 477 + children: [ 478 + { 479 + id: powers.LOCKED, 480 + children: [ 481 + { id: powers.LOCKED, children: [] }, 482 + { id: powers.LOCKED, children: [] }, 483 + ], 484 + }, 485 + ], 486 + }, 487 + ], 488 + }, 489 + ], 490 + } as const; 491 + 492 + type flatPower = { id: powerId; parents: powerId[] }; 493 + 494 + const flatten = (power: typeof powerTree): flatPower[] => 495 + power.children.length === 0 496 + ? [ 497 + { 498 + id: power.id, 499 + parents: [], 500 + }, 501 + ] 502 + : power.children 503 + .map((x) => [...flatten(x), { id: power.id, parents: [] }]) 504 + .flat() 505 + .map((x) => ({ id: x.id, parents: [power.id, ...x.parents] })); 506 + 507 + export const parentPowers = Object.fromEntries( 508 + flatten(powerTree).map((x) => [x.id, x.parents]) 509 + );
+2
src/lexicons/index.ts
··· 1 + export * as DevVielleDndAstral from "./types/dev/vielle/dnd/astral.js"; 2 + export * as DevVielleDndPower from "./types/dev/vielle/dnd/power.js";
+56
src/lexicons/types/dev/vielle/dnd/astral.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.literal("self"), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("dev.vielle.dnd.astral"), 9 + /** 10 + * @minimum 0 11 + * @default 0 12 + */ 13 + points: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer(), 0), 14 + get powers() { 15 + return /*#__PURE__*/ v.array(powerSchema); 16 + }, 17 + }), 18 + ); 19 + const _powerSchema = /*#__PURE__*/ v.string< 20 + | "dev.vielle.dnd.power#acursed" 21 + | "dev.vielle.dnd.power#bind" 22 + | "dev.vielle.dnd.power#bond" 23 + | "dev.vielle.dnd.power#claw" 24 + | "dev.vielle.dnd.power#darksight" 25 + | "dev.vielle.dnd.power#eldritchAdaptability" 26 + | "dev.vielle.dnd.power#eldritchAssault" 27 + | "dev.vielle.dnd.power#eldritchEnchantment" 28 + | "dev.vielle.dnd.power#eldritchVisage" 29 + | "dev.vielle.dnd.power#faceless" 30 + | "dev.vielle.dnd.power#fateScriber" 31 + | "dev.vielle.dnd.power#instil" 32 + | "dev.vielle.dnd.power#invalid" 33 + | "dev.vielle.dnd.power#regenerate" 34 + | "dev.vielle.dnd.power#runeSeeker" 35 + | "dev.vielle.dnd.power#spray" 36 + | "dev.vielle.dnd.power#whisper" 37 + | (string & {}) 38 + >(); 39 + 40 + type main$schematype = typeof _mainSchema; 41 + type power$schematype = typeof _powerSchema; 42 + 43 + export interface mainSchema extends main$schematype {} 44 + export interface powerSchema extends power$schematype {} 45 + 46 + export const mainSchema = _mainSchema as mainSchema; 47 + export const powerSchema = _powerSchema as powerSchema; 48 + 49 + export interface Main extends v.InferInput<typeof mainSchema> {} 50 + export type Power = v.InferInput<typeof powerSchema>; 51 + 52 + declare module "@atcute/lexicons/ambient" { 53 + interface Records { 54 + "dev.vielle.dnd.astral": mainSchema; 55 + } 56 + }
+123
src/lexicons/types/dev/vielle/dnd/power.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + 4 + const _acursedSchema = /*#__PURE__*/ v.literal("dev.vielle.dnd.power#acursed"); 5 + const _bindSchema = /*#__PURE__*/ v.literal("dev.vielle.dnd.power#bind"); 6 + const _bondSchema = /*#__PURE__*/ v.literal("dev.vielle.dnd.power#bond"); 7 + const _clawSchema = /*#__PURE__*/ v.literal("dev.vielle.dnd.power#claw"); 8 + const _darksightSchema = /*#__PURE__*/ v.literal( 9 + "dev.vielle.dnd.power#darksight", 10 + ); 11 + const _eldritchAdaptabilitySchema = /*#__PURE__*/ v.literal( 12 + "dev.vielle.dnd.power#eldritchAdaptability", 13 + ); 14 + const _eldritchAssaultSchema = /*#__PURE__*/ v.literal( 15 + "dev.vielle.dnd.power#eldritchAssault", 16 + ); 17 + const _eldritchEnchantmentSchema = /*#__PURE__*/ v.literal( 18 + "dev.vielle.dnd.power#eldritchEnchantment", 19 + ); 20 + const _eldritchVisageSchema = /*#__PURE__*/ v.literal( 21 + "dev.vielle.dnd.power#eldritchVisage", 22 + ); 23 + const _facelessSchema = /*#__PURE__*/ v.literal( 24 + "dev.vielle.dnd.power#faceless", 25 + ); 26 + const _fateScriberSchema = /*#__PURE__*/ v.literal( 27 + "dev.vielle.dnd.power#fateScriber", 28 + ); 29 + const _instilSchema = /*#__PURE__*/ v.literal("dev.vielle.dnd.power#instil"); 30 + const _invalidSchema = /*#__PURE__*/ v.literal("dev.vielle.dnd.power#invalid"); 31 + const _lockedSchema = /*#__PURE__*/ v.literal("dev.vielle.dnd.power#locked"); 32 + const _regenerateSchema = /*#__PURE__*/ v.literal( 33 + "dev.vielle.dnd.power#regenerate", 34 + ); 35 + const _runeSeekerSchema = /*#__PURE__*/ v.literal( 36 + "dev.vielle.dnd.power#runeSeeker", 37 + ); 38 + const _spraySchema = /*#__PURE__*/ v.literal("dev.vielle.dnd.power#spray"); 39 + const _whisperSchema = /*#__PURE__*/ v.literal("dev.vielle.dnd.power#whisper"); 40 + 41 + type acursed$schematype = typeof _acursedSchema; 42 + type bind$schematype = typeof _bindSchema; 43 + type bond$schematype = typeof _bondSchema; 44 + type claw$schematype = typeof _clawSchema; 45 + type darksight$schematype = typeof _darksightSchema; 46 + type eldritchAdaptability$schematype = typeof _eldritchAdaptabilitySchema; 47 + type eldritchAssault$schematype = typeof _eldritchAssaultSchema; 48 + type eldritchEnchantment$schematype = typeof _eldritchEnchantmentSchema; 49 + type eldritchVisage$schematype = typeof _eldritchVisageSchema; 50 + type faceless$schematype = typeof _facelessSchema; 51 + type fateScriber$schematype = typeof _fateScriberSchema; 52 + type instil$schematype = typeof _instilSchema; 53 + type invalid$schematype = typeof _invalidSchema; 54 + type locked$schematype = typeof _lockedSchema; 55 + type regenerate$schematype = typeof _regenerateSchema; 56 + type runeSeeker$schematype = typeof _runeSeekerSchema; 57 + type spray$schematype = typeof _spraySchema; 58 + type whisper$schematype = typeof _whisperSchema; 59 + 60 + export interface acursedSchema extends acursed$schematype {} 61 + export interface bindSchema extends bind$schematype {} 62 + export interface bondSchema extends bond$schematype {} 63 + export interface clawSchema extends claw$schematype {} 64 + export interface darksightSchema extends darksight$schematype {} 65 + export interface eldritchAdaptabilitySchema extends eldritchAdaptability$schematype {} 66 + export interface eldritchAssaultSchema extends eldritchAssault$schematype {} 67 + export interface eldritchEnchantmentSchema extends eldritchEnchantment$schematype {} 68 + export interface eldritchVisageSchema extends eldritchVisage$schematype {} 69 + export interface facelessSchema extends faceless$schematype {} 70 + export interface fateScriberSchema extends fateScriber$schematype {} 71 + export interface instilSchema extends instil$schematype {} 72 + export interface invalidSchema extends invalid$schematype {} 73 + export interface lockedSchema extends locked$schematype {} 74 + export interface regenerateSchema extends regenerate$schematype {} 75 + export interface runeSeekerSchema extends runeSeeker$schematype {} 76 + export interface spraySchema extends spray$schematype {} 77 + export interface whisperSchema extends whisper$schematype {} 78 + 79 + export const acursedSchema = _acursedSchema as acursedSchema; 80 + export const bindSchema = _bindSchema as bindSchema; 81 + export const bondSchema = _bondSchema as bondSchema; 82 + export const clawSchema = _clawSchema as clawSchema; 83 + export const darksightSchema = _darksightSchema as darksightSchema; 84 + export const eldritchAdaptabilitySchema = 85 + _eldritchAdaptabilitySchema as eldritchAdaptabilitySchema; 86 + export const eldritchAssaultSchema = 87 + _eldritchAssaultSchema as eldritchAssaultSchema; 88 + export const eldritchEnchantmentSchema = 89 + _eldritchEnchantmentSchema as eldritchEnchantmentSchema; 90 + export const eldritchVisageSchema = 91 + _eldritchVisageSchema as eldritchVisageSchema; 92 + export const facelessSchema = _facelessSchema as facelessSchema; 93 + export const fateScriberSchema = _fateScriberSchema as fateScriberSchema; 94 + export const instilSchema = _instilSchema as instilSchema; 95 + export const invalidSchema = _invalidSchema as invalidSchema; 96 + export const lockedSchema = _lockedSchema as lockedSchema; 97 + export const regenerateSchema = _regenerateSchema as regenerateSchema; 98 + export const runeSeekerSchema = _runeSeekerSchema as runeSeekerSchema; 99 + export const spraySchema = _spraySchema as spraySchema; 100 + export const whisperSchema = _whisperSchema as whisperSchema; 101 + 102 + export type Acursed = v.InferInput<typeof acursedSchema>; 103 + export type Bind = v.InferInput<typeof bindSchema>; 104 + export type Bond = v.InferInput<typeof bondSchema>; 105 + export type Claw = v.InferInput<typeof clawSchema>; 106 + export type Darksight = v.InferInput<typeof darksightSchema>; 107 + export type EldritchAdaptability = v.InferInput< 108 + typeof eldritchAdaptabilitySchema 109 + >; 110 + export type EldritchAssault = v.InferInput<typeof eldritchAssaultSchema>; 111 + export type EldritchEnchantment = v.InferInput< 112 + typeof eldritchEnchantmentSchema 113 + >; 114 + export type EldritchVisage = v.InferInput<typeof eldritchVisageSchema>; 115 + export type Faceless = v.InferInput<typeof facelessSchema>; 116 + export type FateScriber = v.InferInput<typeof fateScriberSchema>; 117 + export type Instil = v.InferInput<typeof instilSchema>; 118 + export type Invalid = v.InferInput<typeof invalidSchema>; 119 + export type Locked = v.InferInput<typeof lockedSchema>; 120 + export type Regenerate = v.InferInput<typeof regenerateSchema>; 121 + export type RuneSeeker = v.InferInput<typeof runeSeekerSchema>; 122 + export type Spray = v.InferInput<typeof spraySchema>; 123 + export type Whisper = v.InferInput<typeof whisperSchema>;