rpg-engine 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +99 -2
- package/dist/campaign/create-campaign.d.ts +6 -0
- package/dist/campaign/create-campaign.js +71 -0
- package/dist/campaign/find-campaign.d.ts +8 -0
- package/dist/campaign/find-campaign.js +28 -0
- package/dist/campaign/host-files.d.ts +16 -0
- package/dist/campaign/host-files.js +131 -0
- package/dist/campaign/index.d.ts +5 -0
- package/dist/campaign/index.js +6 -0
- package/dist/campaign/settings.d.ts +185 -0
- package/dist/campaign/settings.js +399 -0
- package/dist/campaign/state.d.ts +15 -0
- package/dist/campaign/state.js +52 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +19 -0
- package/dist/command-line.d.ts +7 -0
- package/dist/command-line.js +140 -0
- package/dist/commands/advance.d.ts +7 -0
- package/dist/commands/advance.js +80 -0
- package/dist/commands/ask.d.ts +33 -0
- package/dist/commands/ask.js +280 -0
- package/dist/commands/change.d.ts +69 -0
- package/dist/commands/change.js +604 -0
- package/dist/commands/config.d.ts +59 -0
- package/dist/commands/config.js +512 -0
- package/dist/commands/effect-layer.d.ts +22 -0
- package/dist/commands/effect-layer.js +84 -0
- package/dist/commands/effect.d.ts +27 -0
- package/dist/commands/effect.js +369 -0
- package/dist/commands/find.d.ts +34 -0
- package/dist/commands/find.js +64 -0
- package/dist/commands/game-advance.d.ts +50 -0
- package/dist/commands/game-advance.js +103 -0
- package/dist/commands/game-effects.d.ts +68 -0
- package/dist/commands/game-effects.js +196 -0
- package/dist/commands/game-environment.d.ts +16 -0
- package/dist/commands/game-environment.js +24 -0
- package/dist/commands/game-events.d.ts +84 -0
- package/dist/commands/game-events.js +325 -0
- package/dist/commands/game-experience.d.ts +57 -0
- package/dist/commands/game-experience.js +119 -0
- package/dist/commands/game-grid-moves.d.ts +33 -0
- package/dist/commands/game-grid-moves.js +94 -0
- package/dist/commands/game-grids.d.ts +52 -0
- package/dist/commands/game-grids.js +162 -0
- package/dist/commands/game-here.d.ts +40 -0
- package/dist/commands/game-here.js +100 -0
- package/dist/commands/game-images.d.ts +31 -0
- package/dist/commands/game-images.js +87 -0
- package/dist/commands/game-journey.d.ts +62 -0
- package/dist/commands/game-journey.js +163 -0
- package/dist/commands/game-knowledge.d.ts +32 -0
- package/dist/commands/game-knowledge.js +120 -0
- package/dist/commands/game-maps.d.ts +20 -0
- package/dist/commands/game-maps.js +51 -0
- package/dist/commands/game-mode.d.ts +31 -0
- package/dist/commands/game-mode.js +128 -0
- package/dist/commands/game-money.d.ts +17 -0
- package/dist/commands/game-money.js +55 -0
- package/dist/commands/game-moods.d.ts +22 -0
- package/dist/commands/game-moods.js +32 -0
- package/dist/commands/game-moves.d.ts +14 -0
- package/dist/commands/game-moves.js +43 -0
- package/dist/commands/game-open.d.ts +18 -0
- package/dist/commands/game-open.js +47 -0
- package/dist/commands/game-outside.d.ts +14 -0
- package/dist/commands/game-outside.js +151 -0
- package/dist/commands/game-positions.d.ts +52 -0
- package/dist/commands/game-positions.js +244 -0
- package/dist/commands/game-quests.d.ts +46 -0
- package/dist/commands/game-quests.js +97 -0
- package/dist/commands/game-recipes.d.ts +34 -0
- package/dist/commands/game-recipes.js +109 -0
- package/dist/commands/game-reminders.d.ts +22 -0
- package/dist/commands/game-reminders.js +74 -0
- package/dist/commands/game-roads.d.ts +90 -0
- package/dist/commands/game-roads.js +284 -0
- package/dist/commands/game-rules.d.ts +17 -0
- package/dist/commands/game-rules.js +30 -0
- package/dist/commands/game-saves.d.ts +59 -0
- package/dist/commands/game-saves.js +249 -0
- package/dist/commands/game-scene.d.ts +69 -0
- package/dist/commands/game-scene.js +285 -0
- package/dist/commands/game-thresholds.d.ts +13 -0
- package/dist/commands/game-thresholds.js +41 -0
- package/dist/commands/game-time.d.ts +17 -0
- package/dist/commands/game-time.js +42 -0
- package/dist/commands/game-view-journal.d.ts +145 -0
- package/dist/commands/game-view-journal.js +129 -0
- package/dist/commands/game-view-map.d.ts +78 -0
- package/dist/commands/game-view-map.js +266 -0
- package/dist/commands/game-view-place.d.ts +160 -0
- package/dist/commands/game-view-place.js +388 -0
- package/dist/commands/game-world.d.ts +60 -0
- package/dist/commands/game-world.js +204 -0
- package/dist/commands/image.d.ts +19 -0
- package/dist/commands/image.js +185 -0
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.js +57 -0
- package/dist/commands/init.d.ts +23 -0
- package/dist/commands/init.js +44 -0
- package/dist/commands/install.d.ts +23 -0
- package/dist/commands/install.js +68 -0
- package/dist/commands/instructions.d.ts +4 -0
- package/dist/commands/instructions.js +97 -0
- package/dist/commands/mode.d.ts +23 -0
- package/dist/commands/mode.js +84 -0
- package/dist/commands/mood.d.ts +34 -0
- package/dist/commands/mood.js +113 -0
- package/dist/commands/move.d.ts +34 -0
- package/dist/commands/move.js +274 -0
- package/dist/commands/notes.d.ts +10 -0
- package/dist/commands/notes.js +37 -0
- package/dist/commands/page-counters.d.ts +24 -0
- package/dist/commands/page-counters.js +84 -0
- package/dist/commands/parts.d.ts +16 -0
- package/dist/commands/parts.js +49 -0
- package/dist/commands/problems.d.ts +5 -0
- package/dist/commands/problems.js +47 -0
- package/dist/commands/progression.d.ts +68 -0
- package/dist/commands/progression.js +206 -0
- package/dist/commands/rename.d.ts +16 -0
- package/dist/commands/rename.js +116 -0
- package/dist/commands/reveal.d.ts +25 -0
- package/dist/commands/reveal.js +193 -0
- package/dist/commands/roll.d.ts +56 -0
- package/dist/commands/roll.js +302 -0
- package/dist/commands/route.d.ts +19 -0
- package/dist/commands/route.js +110 -0
- package/dist/commands/rules.d.ts +48 -0
- package/dist/commands/rules.js +194 -0
- package/dist/commands/save.d.ts +68 -0
- package/dist/commands/save.js +141 -0
- package/dist/commands/scene.d.ts +105 -0
- package/dist/commands/scene.js +741 -0
- package/dist/commands/sheet.d.ts +136 -0
- package/dist/commands/sheet.js +445 -0
- package/dist/commands/show.d.ts +76 -0
- package/dist/commands/show.js +216 -0
- package/dist/commands/status.d.ts +54 -0
- package/dist/commands/status.js +291 -0
- package/dist/commands/translate.d.ts +23 -0
- package/dist/commands/translate.js +108 -0
- package/dist/commands/travel.d.ts +47 -0
- package/dist/commands/travel.js +457 -0
- package/dist/commands/validate.d.ts +4 -0
- package/dist/commands/validate.js +25 -0
- package/dist/commands/view.d.ts +272 -0
- package/dist/commands/view.js +623 -0
- package/dist/commands/worked-out.d.ts +116 -0
- package/dist/commands/worked-out.js +704 -0
- package/dist/commands/write.d.ts +51 -0
- package/dist/commands/write.js +1017 -0
- package/dist/core/command-reference.d.ts +6 -0
- package/dist/core/command-reference.js +47 -0
- package/dist/core/context.d.ts +140 -0
- package/dist/core/context.js +28 -0
- package/dist/core/field-kind.d.ts +6 -0
- package/dist/core/field-kind.js +5 -0
- package/dist/core/files.d.ts +4 -0
- package/dist/core/files.js +30 -0
- package/dist/core/formula.d.ts +164 -0
- package/dist/core/formula.js +590 -0
- package/dist/core/frozen.d.ts +2 -0
- package/dist/core/frozen.js +11 -0
- package/dist/core/length.d.ts +27 -0
- package/dist/core/length.js +49 -0
- package/dist/core/log.d.ts +27 -0
- package/dist/core/log.js +38 -0
- package/dist/core/memo.d.ts +2 -0
- package/dist/core/memo.js +17 -0
- package/dist/core/mood.d.ts +6 -0
- package/dist/core/mood.js +11 -0
- package/dist/core/problem.d.ts +6 -0
- package/dist/core/problem.js +1 -0
- package/dist/core/progression-rule.d.ts +21 -0
- package/dist/core/progression-rule.js +2 -0
- package/dist/core/registry.d.ts +31 -0
- package/dist/core/registry.js +25 -0
- package/dist/core/session-store.d.ts +90 -0
- package/dist/core/session-store.js +289 -0
- package/dist/core/store.d.ts +83 -0
- package/dist/core/store.js +224 -0
- package/dist/core/text.d.ts +12 -0
- package/dist/core/text.js +32 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.js +6 -0
- package/dist/core/yaml-file.d.ts +10 -0
- package/dist/core/yaml-file.js +42 -0
- package/dist/counters/counter.d.ts +36 -0
- package/dist/counters/counter.js +59 -0
- package/dist/counters/index.d.ts +1 -0
- package/dist/counters/index.js +2 -0
- package/dist/dashboard/address.js +43 -0
- package/dist/dashboard/api.js +185 -0
- package/dist/dashboard/app.js +217 -0
- package/dist/dashboard/asked.js +132 -0
- package/dist/dashboard/assets/dice/dice-sharp.glb +0 -0
- package/dist/dashboard/assets/dice/dice.glb +0 -0
- package/dist/dashboard/assets/dice/dice.json +1 -0
- package/dist/dashboard/assets/dice/textures/ash.jpg +0 -0
- package/dist/dashboard/assets/dice/textures/granite.jpg +0 -0
- package/dist/dashboard/assets/dice/textures/marble.jpg +0 -0
- package/dist/dashboard/assets/dice/textures/onyx.jpg +0 -0
- package/dist/dashboard/assets/dice/textures/walnut.jpg +0 -0
- package/dist/dashboard/assets/favicon.svg +7 -0
- package/dist/dashboard/assets/icon-180.png +0 -0
- package/dist/dashboard/assets/icon-32.png +0 -0
- package/dist/dashboard/assets/master.svg +71 -0
- package/dist/dashboard/assets/sounds/dice-collision.wav +0 -0
- package/dist/dashboard/assets/sounds/dice-touch.wav +0 -0
- package/dist/dashboard/card.js +61 -0
- package/dist/dashboard/columns.js +37 -0
- package/dist/dashboard/combat.js +72 -0
- package/dist/dashboard/data.js +3 -0
- package/dist/dashboard/dice/burn.js +200 -0
- package/dist/dashboard/dice/celebration.js +199 -0
- package/dist/dashboard/dice/floor-cracks.js +149 -0
- package/dist/dashboard/dice/frost.js +51 -0
- package/dist/dashboard/dice/load.js +66 -0
- package/dist/dashboard/dice/models.js +138 -0
- package/dist/dashboard/dice/pool.js +49 -0
- package/dist/dashboard/dice/roller.js +101 -0
- package/dist/dashboard/dice/sets.js +49 -0
- package/dist/dashboard/dice/sounds.js +102 -0
- package/dist/dashboard/dice/stage.js +355 -0
- package/dist/dashboard/dice/throw.js +242 -0
- package/dist/dashboard/dice/tray.js +365 -0
- package/dist/dashboard/faces.js +16 -0
- package/dist/dashboard/footer.js +17 -0
- package/dist/dashboard/free-rolls.js +41 -0
- package/dist/dashboard/game-words.js +164 -0
- package/dist/dashboard/glass.js +12 -0
- package/dist/dashboard/guide/ar.md +306 -0
- package/dist/dashboard/guide/cs.md +306 -0
- package/dist/dashboard/guide/da.md +306 -0
- package/dist/dashboard/guide/de.md +306 -0
- package/dist/dashboard/guide/el.md +306 -0
- package/dist/dashboard/guide/en.md +305 -0
- package/dist/dashboard/guide/es.md +306 -0
- package/dist/dashboard/guide/fi.md +306 -0
- package/dist/dashboard/guide/fr.md +306 -0
- package/dist/dashboard/guide/he.md +306 -0
- package/dist/dashboard/guide/hi.md +306 -0
- package/dist/dashboard/guide/hu.md +306 -0
- package/dist/dashboard/guide/is.md +306 -0
- package/dist/dashboard/guide/it.md +306 -0
- package/dist/dashboard/guide/ja.md +306 -0
- package/dist/dashboard/guide/ko.md +306 -0
- package/dist/dashboard/guide/nb.md +306 -0
- package/dist/dashboard/guide/nl.md +306 -0
- package/dist/dashboard/guide/pl.md +306 -0
- package/dist/dashboard/guide/pt.md +306 -0
- package/dist/dashboard/guide/ro.md +306 -0
- package/dist/dashboard/guide/ru.md +306 -0
- package/dist/dashboard/guide/sv.md +306 -0
- package/dist/dashboard/guide/tr.md +306 -0
- package/dist/dashboard/guide/uk.md +306 -0
- package/dist/dashboard/guide/zh.md +306 -0
- package/dist/dashboard/guide-blocks.js +72 -0
- package/dist/dashboard/guide-markdown.js +63 -0
- package/dist/dashboard/help.js +92 -0
- package/dist/dashboard/i18n/ar.json +670 -0
- package/dist/dashboard/i18n/cs.json +670 -0
- package/dist/dashboard/i18n/da.json +670 -0
- package/dist/dashboard/i18n/de.json +670 -0
- package/dist/dashboard/i18n/el.json +670 -0
- package/dist/dashboard/i18n/es.json +670 -0
- package/dist/dashboard/i18n/fi.json +670 -0
- package/dist/dashboard/i18n/fr.json +670 -0
- package/dist/dashboard/i18n/he.json +670 -0
- package/dist/dashboard/i18n/hi.json +670 -0
- package/dist/dashboard/i18n/hu.json +670 -0
- package/dist/dashboard/i18n/is.json +670 -0
- package/dist/dashboard/i18n/it.json +670 -0
- package/dist/dashboard/i18n/ja.json +670 -0
- package/dist/dashboard/i18n/ko.json +670 -0
- package/dist/dashboard/i18n/nb.json +670 -0
- package/dist/dashboard/i18n/nl.json +670 -0
- package/dist/dashboard/i18n/pl.json +670 -0
- package/dist/dashboard/i18n/pt.json +670 -0
- package/dist/dashboard/i18n/ro.json +670 -0
- package/dist/dashboard/i18n/ru.json +670 -0
- package/dist/dashboard/i18n/sv.json +670 -0
- package/dist/dashboard/i18n/tr.json +670 -0
- package/dist/dashboard/i18n/uk.json +670 -0
- package/dist/dashboard/i18n/zh.json +670 -0
- package/dist/dashboard/icons.js +123 -0
- package/dist/dashboard/journal.js +188 -0
- package/dist/dashboard/labels.js +226 -0
- package/dist/dashboard/language-choice.js +83 -0
- package/dist/dashboard/languages.js +144 -0
- package/dist/dashboard/layout.js +93 -0
- package/dist/dashboard/map-sheet.js +32 -0
- package/dist/dashboard/map-symbols.js +79 -0
- package/dist/dashboard/markdown.js +72 -0
- package/dist/dashboard/master.js +69 -0
- package/dist/dashboard/mood-faces.js +16 -0
- package/dist/dashboard/mood.js +27 -0
- package/dist/dashboard/notes.js +203 -0
- package/dist/dashboard/notices.js +24 -0
- package/dist/dashboard/pages.js +32 -0
- package/dist/dashboard/party.js +65 -0
- package/dist/dashboard/place-map-view.js +362 -0
- package/dist/dashboard/place-map.js +204 -0
- package/dist/dashboard/prefs.js +97 -0
- package/dist/dashboard/reactions.js +28 -0
- package/dist/dashboard/requested.js +32 -0
- package/dist/dashboard/rolls.js +240 -0
- package/dist/dashboard/saves.js +154 -0
- package/dist/dashboard/scene.js +63 -0
- package/dist/dashboard/settings.js +362 -0
- package/dist/dashboard/setup.js +195 -0
- package/dist/dashboard/sheet.js +180 -0
- package/dist/dashboard/status.js +42 -0
- package/dist/dashboard/story.js +51 -0
- package/dist/dashboard/style.css +9355 -0
- package/dist/dashboard/text.js +158 -0
- package/dist/dashboard/theme.js +32 -0
- package/dist/dashboard/top.js +156 -0
- package/dist/dashboard/widgets.js +69 -0
- package/dist/dashboard/world-map.js +523 -0
- package/dist/dashboard/world.js +357 -0
- package/dist/dashboard-server.d.ts +38 -0
- package/dist/dashboard-server.js +818 -0
- package/dist/dice/evaluate.d.ts +30 -0
- package/dist/dice/evaluate.js +90 -0
- package/dist/dice/format.d.ts +3 -0
- package/dist/dice/format.js +26 -0
- package/dist/dice/index.d.ts +4 -0
- package/dist/dice/index.js +5 -0
- package/dist/dice/notation.d.ts +43 -0
- package/dist/dice/notation.js +132 -0
- package/dist/dice/proof.d.ts +4 -0
- package/dist/dice/proof.js +12 -0
- package/dist/dice/roll-dice.d.ts +29 -0
- package/dist/dice/roll-dice.js +43 -0
- package/dist/dice/words.d.ts +12 -0
- package/dist/dice/words.js +21 -0
- package/dist/effects/effect.d.ts +57 -0
- package/dist/effects/effect.js +123 -0
- package/dist/effects/index.d.ts +1 -0
- package/dist/effects/index.js +2 -0
- package/dist/grid/grid.d.ts +53 -0
- package/dist/grid/grid.js +151 -0
- package/dist/grid/index.d.ts +2 -0
- package/dist/grid/index.js +2 -0
- package/dist/grid/paths.d.ts +27 -0
- package/dist/grid/paths.js +128 -0
- package/dist/images/images.d.ts +26 -0
- package/dist/images/images.js +74 -0
- package/dist/images/index.d.ts +1 -0
- package/dist/images/index.js +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/instructions/index.d.ts +17 -0
- package/dist/instructions/index.js +48 -0
- package/dist/map/geometry.d.ts +22 -0
- package/dist/map/geometry.js +66 -0
- package/dist/map/index.d.ts +3 -0
- package/dist/map/index.js +5 -0
- package/dist/map/looks.d.ts +9 -0
- package/dist/map/looks.js +57 -0
- package/dist/map/ways.d.ts +36 -0
- package/dist/map/ways.js +78 -0
- package/dist/mcp-server.d.ts +22 -0
- package/dist/mcp-server.js +289 -0
- package/dist/money/index.d.ts +1 -0
- package/dist/money/index.js +2 -0
- package/dist/money/money.d.ts +48 -0
- package/dist/money/money.js +218 -0
- package/dist/page-words.d.ts +46 -0
- package/dist/page-words.js +221 -0
- package/dist/pages/check.d.ts +9 -0
- package/dist/pages/check.js +345 -0
- package/dist/pages/containers.d.ts +34 -0
- package/dist/pages/containers.js +181 -0
- package/dist/pages/environment.d.ts +26 -0
- package/dist/pages/environment.js +118 -0
- package/dist/pages/index.d.ts +15 -0
- package/dist/pages/index.js +16 -0
- package/dist/pages/inheritance.d.ts +80 -0
- package/dist/pages/inheritance.js +260 -0
- package/dist/pages/maps.d.ts +11 -0
- package/dist/pages/maps.js +14 -0
- package/dist/pages/markdown.d.ts +59 -0
- package/dist/pages/markdown.js +271 -0
- package/dist/pages/page-file.d.ts +26 -0
- package/dist/pages/page-file.js +166 -0
- package/dist/pages/page-types.d.ts +17 -0
- package/dist/pages/page-types.js +18 -0
- package/dist/pages/positions.d.ts +11 -0
- package/dist/pages/positions.js +23 -0
- package/dist/pages/rename-page.d.ts +39 -0
- package/dist/pages/rename-page.js +109 -0
- package/dist/pages/roads.d.ts +11 -0
- package/dist/pages/roads.js +40 -0
- package/dist/pages/standard-fields.d.ts +31 -0
- package/dist/pages/standard-fields.js +142 -0
- package/dist/pages/system-pages.d.ts +35 -0
- package/dist/pages/system-pages.js +98 -0
- package/dist/pages/world.d.ts +174 -0
- package/dist/pages/world.js +349 -0
- package/dist/pages/write-page.d.ts +27 -0
- package/dist/pages/write-page.js +311 -0
- package/dist/pictures/briefs.d.ts +25 -0
- package/dist/pictures/briefs.js +145 -0
- package/dist/pictures/chosen.d.ts +5 -0
- package/dist/pictures/chosen.js +21 -0
- package/dist/pictures/claude.d.ts +14 -0
- package/dist/pictures/claude.js +129 -0
- package/dist/pictures/codex.d.ts +20 -0
- package/dist/pictures/codex.js +154 -0
- package/dist/pictures/helpers.d.ts +26 -0
- package/dist/pictures/helpers.js +219 -0
- package/dist/pictures/index.d.ts +6 -0
- package/dist/pictures/index.js +8 -0
- package/dist/pictures/stop.d.ts +3 -0
- package/dist/pictures/stop.js +10 -0
- package/dist/pictures/svg.d.ts +4 -0
- package/dist/pictures/svg.js +129 -0
- package/dist/player-notes/index.d.ts +1 -0
- package/dist/player-notes/index.js +2 -0
- package/dist/player-notes/notes.d.ts +21 -0
- package/dist/player-notes/notes.js +50 -0
- package/dist/progression/index.d.ts +1 -0
- package/dist/progression/index.js +1 -0
- package/dist/progression/level-table.d.ts +41 -0
- package/dist/progression/level-table.js +123 -0
- package/dist/rules/index.d.ts +3 -0
- package/dist/rules/index.js +4 -0
- package/dist/rules/rule-book.d.ts +31 -0
- package/dist/rules/rule-book.js +157 -0
- package/dist/rules/search.d.ts +18 -0
- package/dist/rules/search.js +101 -0
- package/dist/rules/shown.d.ts +19 -0
- package/dist/rules/shown.js +44 -0
- package/dist/saves/index.d.ts +1 -0
- package/dist/saves/index.js +2 -0
- package/dist/saves/saves.d.ts +14 -0
- package/dist/saves/saves.js +27 -0
- package/dist/scene/index.d.ts +1 -0
- package/dist/scene/index.js +2 -0
- package/dist/scene/scene.d.ts +46 -0
- package/dist/scene/scene.js +44 -0
- package/dist/systems/game-system.d.ts +236 -0
- package/dist/systems/game-system.js +593 -0
- package/dist/systems/index.d.ts +2 -0
- package/dist/systems/index.js +3 -0
- package/dist/systems/words.d.ts +9 -0
- package/dist/systems/words.js +23 -0
- package/dist/time/game-date.d.ts +20 -0
- package/dist/time/game-date.js +59 -0
- package/dist/time/index.d.ts +1 -0
- package/dist/time/index.js +2 -0
- package/dist/triggers/index.d.ts +1 -0
- package/dist/triggers/index.js +2 -0
- package/dist/triggers/trigger.d.ts +43 -0
- package/dist/triggers/trigger.js +98 -0
- package/instructions/author.md +1 -0
- package/instructions/buttons-physical-dice.md +1 -0
- package/instructions/buttons.md +1 -0
- package/instructions/combat.md +3 -0
- package/instructions/core.md +54 -0
- package/instructions/dashboard.md +7 -0
- package/instructions/mentor-hints.md +1 -0
- package/instructions/mentor-tutorial.md +1 -0
- package/instructions/new-day.md +1 -0
- package/instructions/play.md +23 -0
- package/instructions/prose-literary.md +1 -0
- package/instructions/prose-pulp.md +1 -0
- package/instructions/prose-wry.md +1 -0
- package/instructions/session-zero.md +3 -0
- package/instructions/setup.md +3 -0
- package/instructions/start.md +1 -0
- package/instructions/story-arcs.md +1 -0
- package/instructions/story-episodes.md +1 -0
- package/instructions/story-mystery.md +1 -0
- package/instructions/style.md +1 -0
- package/package.json +85 -4
- package/systems/5e/LICENSE.md +25 -0
- package/systems/5e/images/acid-blob.svg +1 -0
- package/systems/5e/images/angel-outfit.svg +1 -0
- package/systems/5e/images/angler-fish.svg +1 -0
- package/systems/5e/images/angular-spider.svg +1 -0
- package/systems/5e/images/animal-skull.svg +1 -0
- package/systems/5e/images/bad-gnome.svg +1 -0
- package/systems/5e/images/badger.svg +1 -0
- package/systems/5e/images/bandit.svg +1 -0
- package/systems/5e/images/barn-owl.svg +1 -0
- package/systems/5e/images/basset-hound-head.svg +1 -0
- package/systems/5e/images/bat.svg +1 -0
- package/systems/5e/images/bear-face.svg +1 -0
- package/systems/5e/images/bear-head.svg +1 -0
- package/systems/5e/images/beetle-shell.svg +1 -0
- package/systems/5e/images/berry-bush.svg +1 -0
- package/systems/5e/images/bestial-fangs.svg +1 -0
- package/systems/5e/images/big-wave.svg +1 -0
- package/systems/5e/images/black-knight-helm.svg +1 -0
- package/systems/5e/images/boar-tusks.svg +1 -0
- package/systems/5e/images/boar.svg +1 -0
- package/systems/5e/images/bone-gnawer.svg +1 -0
- package/systems/5e/images/breastplate.svg +1 -0
- package/systems/5e/images/brute.svg +1 -0
- package/systems/5e/images/camel-head.svg +1 -0
- package/systems/5e/images/carnivore-mouth.svg +1 -0
- package/systems/5e/images/cassowary-head.svg +1 -0
- package/systems/5e/images/cat.svg +1 -0
- package/systems/5e/images/centaur.svg +1 -0
- package/systems/5e/images/centipede.svg +1 -0
- package/systems/5e/images/charging-bull.svg +1 -0
- package/systems/5e/images/closed-barbute.svg +1 -0
- package/systems/5e/images/cobra.svg +1 -0
- package/systems/5e/images/condor-emblem.svg +1 -0
- package/systems/5e/images/cowled.svg +1 -0
- package/systems/5e/images/crab-claw.svg +1 -0
- package/systems/5e/images/crab.svg +1 -0
- package/systems/5e/images/croc-jaws.svg +1 -0
- package/systems/5e/images/crow-dive.svg +1 -0
- package/systems/5e/images/crown.svg +1 -0
- package/systems/5e/images/crowned-skull.svg +1 -0
- package/systems/5e/images/cube.svg +1 -0
- package/systems/5e/images/cultist-lorc.svg +1 -0
- package/systems/5e/images/cultist-skoll.svg +1 -0
- package/systems/5e/images/curled-tentacle.svg +1 -0
- package/systems/5e/images/daemon-skull.svg +1 -0
- package/systems/5e/images/deer-head.svg +1 -0
- package/systems/5e/images/desert-skull.svg +1 -0
- package/systems/5e/images/devil-mask.svg +1 -0
- package/systems/5e/images/diablo-skull.svg +1 -0
- package/systems/5e/images/dinosaur-rex.svg +1 -0
- package/systems/5e/images/direwolf.svg +1 -0
- package/systems/5e/images/djinn.svg +1 -0
- package/systems/5e/images/donkey.svg +1 -0
- package/systems/5e/images/dragon-head-faithtoken.svg +1 -0
- package/systems/5e/images/dragon-head-lorc.svg +1 -0
- package/systems/5e/images/dragon-shield.svg +1 -0
- package/systems/5e/images/dragon-spiral.svg +1 -0
- package/systems/5e/images/dread-skull.svg +1 -0
- package/systems/5e/images/duality-mask.svg +1 -0
- package/systems/5e/images/dust-cloud.svg +1 -0
- package/systems/5e/images/dwarf-face.svg +1 -0
- package/systems/5e/images/dwarf-helmet.svg +1 -0
- package/systems/5e/images/eagle-emblem.svg +1 -0
- package/systems/5e/images/eagle-head.svg +1 -0
- package/systems/5e/images/egyptian-sphinx.svg +1 -0
- package/systems/5e/images/elephant-head.svg +1 -0
- package/systems/5e/images/elf-ear.svg +1 -0
- package/systems/5e/images/elf-helmet.svg +1 -0
- package/systems/5e/images/ent-mouth.svg +1 -0
- package/systems/5e/images/ermine.svg +1 -0
- package/systems/5e/images/eruption.svg +1 -0
- package/systems/5e/images/evil-bat.svg +1 -0
- package/systems/5e/images/evil-minion.svg +1 -0
- package/systems/5e/images/evil-tree.svg +1 -0
- package/systems/5e/images/evil-wings.svg +1 -0
- package/systems/5e/images/eyestalk.svg +1 -0
- package/systems/5e/images/fairy.svg +1 -0
- package/systems/5e/images/farmer.svg +1 -0
- package/systems/5e/images/feline.svg +1 -0
- package/systems/5e/images/fire-silhouette.svg +1 -0
- package/systems/5e/images/fish-monster.svg +1 -0
- package/systems/5e/images/fleshy-mass.svg +1 -0
- package/systems/5e/images/fluffy-flame.svg +1 -0
- package/systems/5e/images/fly.svg +1 -0
- package/systems/5e/images/fox-head.svg +1 -0
- package/systems/5e/images/frankenstein-creature.svg +1 -0
- package/systems/5e/images/frog.svg +1 -0
- package/systems/5e/images/gargoyle.svg +1 -0
- package/systems/5e/images/gecko.svg +1 -0
- package/systems/5e/images/ghost.svg +1 -0
- package/systems/5e/images/giant.svg +1 -0
- package/systems/5e/images/goat.svg +1 -0
- package/systems/5e/images/goblin-head.svg +1 -0
- package/systems/5e/images/goblin.svg +1 -0
- package/systems/5e/images/golem-head.svg +1 -0
- package/systems/5e/images/gooey-daemon.svg +1 -0
- package/systems/5e/images/gorilla.svg +1 -0
- package/systems/5e/images/greek-sphinx.svg +1 -0
- package/systems/5e/images/griffin-symbol.svg +1 -0
- package/systems/5e/images/grim-reaper.svg +1 -0
- package/systems/5e/images/hanging-spider.svg +1 -0
- package/systems/5e/images/harpy.svg +1 -0
- package/systems/5e/images/hawk-emblem.svg +1 -0
- package/systems/5e/images/hooded-assassin.svg +1 -0
- package/systems/5e/images/horned-reptile.svg +1 -0
- package/systems/5e/images/horse-head-delapouite.svg +1 -0
- package/systems/5e/images/horse-head-lorc.svg +1 -0
- package/systems/5e/images/hound.svg +1 -0
- package/systems/5e/images/hydra.svg +1 -0
- package/systems/5e/images/hyena-head.svg +1 -0
- package/systems/5e/images/icicles-aura.svg +1 -0
- package/systems/5e/images/ifrit.svg +1 -0
- package/systems/5e/images/imp-laugh.svg +1 -0
- package/systems/5e/images/imp.svg +1 -0
- package/systems/5e/images/insect-jaws.svg +1 -0
- package/systems/5e/images/invisible-face.svg +1 -0
- package/systems/5e/images/jumping-dog.svg +1 -0
- package/systems/5e/images/kraken-tentacle.svg +1 -0
- package/systems/5e/images/labrador-head.svg +1 -0
- package/systems/5e/images/lion.svg +1 -0
- package/systems/5e/images/lizard-tongue.svg +1 -0
- package/systems/5e/images/lizardman.svg +1 -0
- package/systems/5e/images/long-antennae-bug.svg +1 -0
- package/systems/5e/images/long-legged-spider.svg +1 -0
- package/systems/5e/images/mammoth.svg +1 -0
- package/systems/5e/images/mandrill-head.svg +1 -0
- package/systems/5e/images/manta-ray.svg +1 -0
- package/systems/5e/images/masked-spider.svg +1 -0
- package/systems/5e/images/medusa-head.svg +1 -0
- package/systems/5e/images/mermaid.svg +1 -0
- package/systems/5e/images/metal-golem-head.svg +1 -0
- package/systems/5e/images/mimic-chest.svg +1 -0
- package/systems/5e/images/minotaur.svg +1 -0
- package/systems/5e/images/monk-face.svg +1 -0
- package/systems/5e/images/moon-bats.svg +1 -0
- package/systems/5e/images/mucous-pillar.svg +1 -0
- package/systems/5e/images/mummy-head.svg +1 -0
- package/systems/5e/images/mushrooms-cluster.svg +1 -0
- package/systems/5e/images/octopus.svg +1 -0
- package/systems/5e/images/ogre.svg +1 -0
- package/systems/5e/images/oni.svg +1 -0
- package/systems/5e/images/orc-head.svg +1 -0
- package/systems/5e/images/owl.svg +1 -0
- package/systems/5e/images/pan-flute.svg +1 -0
- package/systems/5e/images/pegasus.svg +1 -0
- package/systems/5e/images/person.svg +1 -0
- package/systems/5e/images/piranha.svg +1 -0
- package/systems/5e/images/plesiosaurus.svg +1 -0
- package/systems/5e/images/pointy-hat.svg +1 -0
- package/systems/5e/images/polar-bear.svg +1 -0
- package/systems/5e/images/rat.svg +1 -0
- package/systems/5e/images/rattlesnake.svg +1 -0
- package/systems/5e/images/raven.svg +1 -0
- package/systems/5e/images/rhinoceros-horn.svg +1 -0
- package/systems/5e/images/robber.svg +1 -0
- package/systems/5e/images/robin-hood-hat.svg +1 -0
- package/systems/5e/images/robot-golem.svg +1 -0
- package/systems/5e/images/rock-golem.svg +1 -0
- package/systems/5e/images/rolled-cloth.svg +1 -0
- package/systems/5e/images/rooster.svg +1 -0
- package/systems/5e/images/saber-toothed-cat-head.svg +1 -0
- package/systems/5e/images/salamander.svg +1 -0
- package/systems/5e/images/school-of-fish.svg +1 -0
- package/systems/5e/images/scorpion.svg +1 -0
- package/systems/5e/images/sea-serpent.svg +1 -0
- package/systems/5e/images/seahorse.svg +1 -0
- package/systems/5e/images/seated-mouse.svg +1 -0
- package/systems/5e/images/sensuousness.svg +1 -0
- package/systems/5e/images/shadow-follower.svg +1 -0
- package/systems/5e/images/shambling-mound.svg +1 -0
- package/systems/5e/images/shambling-zombie.svg +1 -0
- package/systems/5e/images/shark-fin.svg +1 -0
- package/systems/5e/images/shark-jaws.svg +1 -0
- package/systems/5e/images/skeleton.svg +1 -0
- package/systems/5e/images/slime.svg +1 -0
- package/systems/5e/images/small-fire.svg +1 -0
- package/systems/5e/images/snake-spiral.svg +1 -0
- package/systems/5e/images/snake-tongue.svg +1 -0
- package/systems/5e/images/snake-totem.svg +1 -0
- package/systems/5e/images/snake.svg +1 -0
- package/systems/5e/images/spark-spirit.svg +1 -0
- package/systems/5e/images/spartan.svg +1 -0
- package/systems/5e/images/spectre.svg +1 -0
- package/systems/5e/images/sperm-whale.svg +1 -0
- package/systems/5e/images/spider-alt.svg +1 -0
- package/systems/5e/images/spiked-dragon-head.svg +1 -0
- package/systems/5e/images/spiked-tail.svg +1 -0
- package/systems/5e/images/spotted-mushroom.svg +1 -0
- package/systems/5e/images/spy.svg +1 -0
- package/systems/5e/images/squid.svg +1 -0
- package/systems/5e/images/stag-head.svg +1 -0
- package/systems/5e/images/steam.svg +1 -0
- package/systems/5e/images/sun-priest.svg +1 -0
- package/systems/5e/images/tick.svg +1 -0
- package/systems/5e/images/tiger-head.svg +1 -0
- package/systems/5e/images/tiger.svg +1 -0
- package/systems/5e/images/toad-teeth.svg +1 -0
- package/systems/5e/images/tornado.svg +1 -0
- package/systems/5e/images/transparent-slime.svg +1 -0
- package/systems/5e/images/tree-face.svg +1 -0
- package/systems/5e/images/tribal-mask.svg +1 -0
- package/systems/5e/images/triceratops-head.svg +1 -0
- package/systems/5e/images/triton-head.svg +1 -0
- package/systems/5e/images/troglodyte.svg +1 -0
- package/systems/5e/images/troll.svg +1 -0
- package/systems/5e/images/turtle.svg +1 -0
- package/systems/5e/images/unicorn.svg +1 -0
- package/systems/5e/images/vampire-dracula.svg +1 -0
- package/systems/5e/images/viking-head.svg +1 -0
- package/systems/5e/images/visored-helm.svg +1 -0
- package/systems/5e/images/vulture.svg +1 -0
- package/systems/5e/images/warlord-helmet.svg +1 -0
- package/systems/5e/images/wasp-sting.svg +1 -0
- package/systems/5e/images/werewolf.svg +1 -0
- package/systems/5e/images/winged-sword.svg +1 -0
- package/systems/5e/images/witch-face.svg +1 -0
- package/systems/5e/images/wizard-face.svg +1 -0
- package/systems/5e/images/wolf-head.svg +1 -0
- package/systems/5e/images/wolf-howl.svg +1 -0
- package/systems/5e/images/woman-elf-face.svg +1 -0
- package/systems/5e/images/worm-mouth.svg +1 -0
- package/systems/5e/images/wyvern.svg +1 -0
- package/systems/5e/instructions/level-up.md +1 -0
- package/systems/5e/instructions/mentor-tutorial.md +1 -0
- package/systems/5e/instructions/play.md +5 -0
- package/systems/5e/instructions/quest-ends.md +1 -0
- package/systems/5e/instructions/session-zero.md +1 -0
- package/systems/5e/rules/Adventuring.md +228 -0
- package/systems/5e/rules/Beyond 1st Level.md +241 -0
- package/systems/5e/rules/Combat.md +504 -0
- package/systems/5e/rules/Conditions.md +110 -0
- package/systems/5e/rules/Diseases.md +41 -0
- package/systems/5e/rules/Equipment.md +731 -0
- package/systems/5e/rules/Fantasy-Historical Pantheons.md +112 -0
- package/systems/5e/rules/Madness.md +72 -0
- package/systems/5e/rules/Magic Items.md +142 -0
- package/systems/5e/rules/Monsters.md +403 -0
- package/systems/5e/rules/Nonplayer Characters.md +15 -0
- package/systems/5e/rules/Objects.md +40 -0
- package/systems/5e/rules/Poisons.md +64 -0
- package/systems/5e/rules/Races.md +33 -0
- package/systems/5e/rules/Spellcasting.md +225 -0
- package/systems/5e/rules/The Planes of Existence.md +59 -0
- package/systems/5e/rules/Traps.md +170 -0
- package/systems/5e/rules/Using Ability Scores.md +394 -0
- package/systems/5e/system.yaml +602 -0
- package/systems/5e/words/ar.yaml +421 -0
- package/systems/5e/words/cs.yaml +421 -0
- package/systems/5e/words/da.yaml +421 -0
- package/systems/5e/words/de.yaml +421 -0
- package/systems/5e/words/el.yaml +421 -0
- package/systems/5e/words/es.yaml +421 -0
- package/systems/5e/words/fi.yaml +421 -0
- package/systems/5e/words/fr.yaml +421 -0
- package/systems/5e/words/he.yaml +421 -0
- package/systems/5e/words/hi.yaml +421 -0
- package/systems/5e/words/hu.yaml +421 -0
- package/systems/5e/words/is.yaml +421 -0
- package/systems/5e/words/it.yaml +453 -0
- package/systems/5e/words/ja.yaml +421 -0
- package/systems/5e/words/ko.yaml +421 -0
- package/systems/5e/words/nb.yaml +421 -0
- package/systems/5e/words/nl.yaml +421 -0
- package/systems/5e/words/pl.yaml +421 -0
- package/systems/5e/words/pt.yaml +421 -0
- package/systems/5e/words/ro.yaml +421 -0
- package/systems/5e/words/ru.yaml +421 -0
- package/systems/5e/words/sv.yaml +421 -0
- package/systems/5e/words/tr.yaml +421 -0
- package/systems/5e/words/uk.yaml +421 -0
- package/systems/5e/words/zh.yaml +421 -0
- package/systems/5e/world/creatures/Aboleth.md +65 -0
- package/systems/5e/world/creatures/Acolyte.md +37 -0
- package/systems/5e/world/creatures/Adult Black Dragon.md +69 -0
- package/systems/5e/world/creatures/Adult Blue Dragon.md +66 -0
- package/systems/5e/world/creatures/Adult Brass Dragon.md +70 -0
- package/systems/5e/world/creatures/Adult Bronze Dragon.md +78 -0
- package/systems/5e/world/creatures/Adult Copper Dragon.md +70 -0
- package/systems/5e/world/creatures/Adult Gold Dragon.md +78 -0
- package/systems/5e/world/creatures/Adult Green Dragon.md +70 -0
- package/systems/5e/world/creatures/Adult Red Dragon.md +66 -0
- package/systems/5e/world/creatures/Adult Silver Dragon.md +74 -0
- package/systems/5e/world/creatures/Adult White Dragon.md +70 -0
- package/systems/5e/world/creatures/Air Elemental.md +43 -0
- package/systems/5e/world/creatures/Ancient Black Dragon.md +69 -0
- package/systems/5e/world/creatures/Ancient Blue Dragon.md +66 -0
- package/systems/5e/world/creatures/Ancient Brass Dragon.md +75 -0
- package/systems/5e/world/creatures/Ancient Bronze Dragon.md +78 -0
- package/systems/5e/world/creatures/Ancient Copper Dragon.md +75 -0
- package/systems/5e/world/creatures/Ancient Gold Dragon.md +78 -0
- package/systems/5e/world/creatures/Ancient Green Dragon.md +70 -0
- package/systems/5e/world/creatures/Ancient Red Dragon.md +66 -0
- package/systems/5e/world/creatures/Ancient Silver Dragon.md +74 -0
- package/systems/5e/world/creatures/Ancient White Dragon.md +70 -0
- package/systems/5e/world/creatures/Androsphinx.md +82 -0
- package/systems/5e/world/creatures/Animated Armor.md +39 -0
- package/systems/5e/world/creatures/Ankheg.md +31 -0
- package/systems/5e/world/creatures/Ape.md +32 -0
- package/systems/5e/world/creatures/Archmage.md +63 -0
- package/systems/5e/world/creatures/Assassin.md +48 -0
- package/systems/5e/world/creatures/Awakened Shrub.md +34 -0
- package/systems/5e/world/creatures/Awakened Tree.md +35 -0
- package/systems/5e/world/creatures/Axe Beak.md +26 -0
- package/systems/5e/world/creatures/Azer.md +40 -0
- package/systems/5e/world/creatures/Baboon.md +30 -0
- package/systems/5e/world/creatures/Badger.md +31 -0
- package/systems/5e/world/creatures/Balor.md +55 -0
- package/systems/5e/world/creatures/Bandit Captain.md +45 -0
- package/systems/5e/world/creatures/Bandit.md +33 -0
- package/systems/5e/world/creatures/Barbed Devil.md +52 -0
- package/systems/5e/world/creatures/Basilisk.md +35 -0
- package/systems/5e/world/creatures/Bat.md +34 -0
- package/systems/5e/world/creatures/Bearded Devil.md +48 -0
- package/systems/5e/world/creatures/Behir.md +44 -0
- package/systems/5e/world/creatures/Berserker.md +33 -0
- package/systems/5e/world/creatures/Black Bear.md +38 -0
- package/systems/5e/world/creatures/Black Dragon Wyrmling.md +41 -0
- package/systems/5e/world/creatures/Black Pudding.md +46 -0
- package/systems/5e/world/creatures/Blink Dog.md +36 -0
- package/systems/5e/world/creatures/Blood Hawk.md +36 -0
- package/systems/5e/world/creatures/Blue Dragon Wyrmling.md +36 -0
- package/systems/5e/world/creatures/Boar.md +33 -0
- package/systems/5e/world/creatures/Bone Devil.md +47 -0
- package/systems/5e/world/creatures/Brass Dragon Wyrmling.md +40 -0
- package/systems/5e/world/creatures/Bronze Dragon Wyrmling.md +45 -0
- package/systems/5e/world/creatures/Brown Bear.md +38 -0
- package/systems/5e/world/creatures/Bugbear.md +39 -0
- package/systems/5e/world/creatures/Bulette.md +37 -0
- package/systems/5e/world/creatures/Camel.md +24 -0
- package/systems/5e/world/creatures/Cat.md +31 -0
- package/systems/5e/world/creatures/Centaur.md +40 -0
- package/systems/5e/world/creatures/Chain Devil.md +52 -0
- package/systems/5e/world/creatures/Chimera.md +41 -0
- package/systems/5e/world/creatures/Chuul.md +45 -0
- package/systems/5e/world/creatures/Clay Golem.md +52 -0
- package/systems/5e/world/creatures/Cloaker.md +56 -0
- package/systems/5e/world/creatures/Cloud Giant.md +46 -0
- package/systems/5e/world/creatures/Cockatrice.md +26 -0
- package/systems/5e/world/creatures/Commoner.md +27 -0
- package/systems/5e/world/creatures/Constrictor Snake.md +29 -0
- package/systems/5e/world/creatures/Copper Dragon Wyrmling.md +40 -0
- package/systems/5e/world/creatures/Couatl.md +54 -0
- package/systems/5e/world/creatures/Crab.md +33 -0
- package/systems/5e/world/creatures/Crocodile.md +32 -0
- package/systems/5e/world/creatures/Cult Fanatic.md +46 -0
- package/systems/5e/world/creatures/Cultist.md +34 -0
- package/systems/5e/world/creatures/Darkmantle.md +42 -0
- package/systems/5e/world/creatures/Death Dog.md +36 -0
- package/systems/5e/world/creatures/Deep Gnome (Svirfneblin).md +46 -0
- package/systems/5e/world/creatures/Deer.md +24 -0
- package/systems/5e/world/creatures/Deva.md +57 -0
- package/systems/5e/world/creatures/Dire Wolf.md +34 -0
- package/systems/5e/world/creatures/Djinni.md +50 -0
- package/systems/5e/world/creatures/Doppelganger.md +45 -0
- package/systems/5e/world/creatures/Draft Horse.md +24 -0
- package/systems/5e/world/creatures/Dragon Turtle.md +47 -0
- package/systems/5e/world/creatures/Dragonborn.md +58 -0
- package/systems/5e/world/creatures/Dretch.md +39 -0
- package/systems/5e/world/creatures/Drider.md +58 -0
- package/systems/5e/world/creatures/Drow Elf.md +46 -0
- package/systems/5e/world/creatures/Druid (creature).md +41 -0
- package/systems/5e/world/creatures/Dryad.md +53 -0
- package/systems/5e/world/creatures/Duergar.md +45 -0
- package/systems/5e/world/creatures/Dust Mephit.md +42 -0
- package/systems/5e/world/creatures/Dwarf.md +48 -0
- package/systems/5e/world/creatures/Eagle.md +31 -0
- package/systems/5e/world/creatures/Earth Elemental.md +44 -0
- package/systems/5e/world/creatures/Efreeti.md +48 -0
- package/systems/5e/world/creatures/Elephant.md +33 -0
- package/systems/5e/world/creatures/Elf.md +44 -0
- package/systems/5e/world/creatures/Elk.md +32 -0
- package/systems/5e/world/creatures/Erinyes.md +51 -0
- package/systems/5e/world/creatures/Ettercap.md +48 -0
- package/systems/5e/world/creatures/Ettin.md +42 -0
- package/systems/5e/world/creatures/Fire Elemental.md +43 -0
- package/systems/5e/world/creatures/Fire Giant.md +35 -0
- package/systems/5e/world/creatures/Flesh Golem.md +53 -0
- package/systems/5e/world/creatures/Flying Snake.md +34 -0
- package/systems/5e/world/creatures/Flying Sword.md +38 -0
- package/systems/5e/world/creatures/Frog.md +32 -0
- package/systems/5e/world/creatures/Frost Giant.md +35 -0
- package/systems/5e/world/creatures/Gargoyle.md +42 -0
- package/systems/5e/world/creatures/Gelatinous Cube.md +49 -0
- package/systems/5e/world/creatures/Ghast.md +40 -0
- package/systems/5e/world/creatures/Ghost.md +49 -0
- package/systems/5e/world/creatures/Ghoul.md +31 -0
- package/systems/5e/world/creatures/Giant Ape.md +32 -0
- package/systems/5e/world/creatures/Giant Badger.md +37 -0
- package/systems/5e/world/creatures/Giant Bat.md +34 -0
- package/systems/5e/world/creatures/Giant Boar.md +33 -0
- package/systems/5e/world/creatures/Giant Centipede.md +27 -0
- package/systems/5e/world/creatures/Giant Constrictor Snake.md +30 -0
- package/systems/5e/world/creatures/Giant Crab.md +33 -0
- package/systems/5e/world/creatures/Giant Crocodile.md +38 -0
- package/systems/5e/world/creatures/Giant Eagle.md +40 -0
- package/systems/5e/world/creatures/Giant Elk.md +37 -0
- package/systems/5e/world/creatures/Giant Fire Beetle.md +33 -0
- package/systems/5e/world/creatures/Giant Frog.md +40 -0
- package/systems/5e/world/creatures/Giant Goat.md +33 -0
- package/systems/5e/world/creatures/Giant Hyena.md +30 -0
- package/systems/5e/world/creatures/Giant Lizard.md +29 -0
- package/systems/5e/world/creatures/Giant Octopus.md +41 -0
- package/systems/5e/world/creatures/Giant Owl.md +38 -0
- package/systems/5e/world/creatures/Giant Poisonous Snake.md +27 -0
- package/systems/5e/world/creatures/Giant Rat.md +39 -0
- package/systems/5e/world/creatures/Giant Scorpion.md +32 -0
- package/systems/5e/world/creatures/Giant Sea Horse.md +36 -0
- package/systems/5e/world/creatures/Giant Shark.md +38 -0
- package/systems/5e/world/creatures/Giant Spider.md +45 -0
- package/systems/5e/world/creatures/Giant Toad.md +39 -0
- package/systems/5e/world/creatures/Giant Vulture.md +43 -0
- package/systems/5e/world/creatures/Giant Wasp.md +25 -0
- package/systems/5e/world/creatures/Giant Weasel.md +31 -0
- package/systems/5e/world/creatures/Giant Wolf Spider.md +41 -0
- package/systems/5e/world/creatures/Gibbering Mouther.md +41 -0
- package/systems/5e/world/creatures/Glabrezu.md +48 -0
- package/systems/5e/world/creatures/Gladiator.md +49 -0
- package/systems/5e/world/creatures/Gnoll.md +38 -0
- package/systems/5e/world/creatures/Gnome.md +37 -0
- package/systems/5e/world/creatures/Goat.md +32 -0
- package/systems/5e/world/creatures/Goblin.md +36 -0
- package/systems/5e/world/creatures/Gold Dragon Wyrmling.md +45 -0
- package/systems/5e/world/creatures/Gorgon.md +39 -0
- package/systems/5e/world/creatures/Gray Ooze.md +42 -0
- package/systems/5e/world/creatures/Green Dragon Wyrmling.md +42 -0
- package/systems/5e/world/creatures/Green Hag.md +49 -0
- package/systems/5e/world/creatures/Grick.md +39 -0
- package/systems/5e/world/creatures/Griffon.md +38 -0
- package/systems/5e/world/creatures/Grimlock.md +39 -0
- package/systems/5e/world/creatures/Guard.md +29 -0
- package/systems/5e/world/creatures/Guardian Naga.md +55 -0
- package/systems/5e/world/creatures/Gynosphinx.md +71 -0
- package/systems/5e/world/creatures/Half-Elf.md +40 -0
- package/systems/5e/world/creatures/Half-Orc.md +44 -0
- package/systems/5e/world/creatures/Half-Red Dragon Veteran.md +42 -0
- package/systems/5e/world/creatures/Halfling.md +39 -0
- package/systems/5e/world/creatures/Harpy.md +39 -0
- package/systems/5e/world/creatures/Hawk.md +31 -0
- package/systems/5e/world/creatures/Hell Hound.md +40 -0
- package/systems/5e/world/creatures/Hezrou.md +45 -0
- package/systems/5e/world/creatures/High Elf.md +22 -0
- package/systems/5e/world/creatures/Hill Dwarf.md +16 -0
- package/systems/5e/world/creatures/Hill Giant.md +33 -0
- package/systems/5e/world/creatures/Hippogriff.md +37 -0
- package/systems/5e/world/creatures/Hobgoblin.md +35 -0
- package/systems/5e/world/creatures/Homunculus.md +35 -0
- package/systems/5e/world/creatures/Horned Devil.md +49 -0
- package/systems/5e/world/creatures/Human.md +29 -0
- package/systems/5e/world/creatures/Hunter Shark.md +38 -0
- package/systems/5e/world/creatures/Hydra.md +49 -0
- package/systems/5e/world/creatures/Hyena.md +30 -0
- package/systems/5e/world/creatures/Ice Devil.md +56 -0
- package/systems/5e/world/creatures/Ice Mephit.md +45 -0
- package/systems/5e/world/creatures/Imp.md +45 -0
- package/systems/5e/world/creatures/Invisible Stalker.md +42 -0
- package/systems/5e/world/creatures/Iron Golem.md +52 -0
- package/systems/5e/world/creatures/Jackal.md +33 -0
- package/systems/5e/world/creatures/Killer Whale.md +39 -0
- package/systems/5e/world/creatures/Knight.md +48 -0
- package/systems/5e/world/creatures/Kobold.md +37 -0
- package/systems/5e/world/creatures/Kraken.md +69 -0
- package/systems/5e/world/creatures/Lamia.md +46 -0
- package/systems/5e/world/creatures/Lemure.md +37 -0
- package/systems/5e/world/creatures/Lich.md +82 -0
- package/systems/5e/world/creatures/Lightfoot Halfling.md +18 -0
- package/systems/5e/world/creatures/Lion.md +42 -0
- package/systems/5e/world/creatures/Lizard.md +26 -0
- package/systems/5e/world/creatures/Lizardfolk.md +45 -0
- package/systems/5e/world/creatures/Mage.md +47 -0
- package/systems/5e/world/creatures/Magma Mephit.md +45 -0
- package/systems/5e/world/creatures/Magmin.md +37 -0
- package/systems/5e/world/creatures/Mammoth.md +35 -0
- package/systems/5e/world/creatures/Manticore.md +42 -0
- package/systems/5e/world/creatures/Marilith.md +56 -0
- package/systems/5e/world/creatures/Mastiff.md +32 -0
- package/systems/5e/world/creatures/Medusa.md +46 -0
- package/systems/5e/world/creatures/Merfolk.md +32 -0
- package/systems/5e/world/creatures/Merrow.md +42 -0
- package/systems/5e/world/creatures/Mimic.md +46 -0
- package/systems/5e/world/creatures/Minotaur Skeleton.md +38 -0
- package/systems/5e/world/creatures/Minotaur.md +42 -0
- package/systems/5e/world/creatures/Mule.md +32 -0
- package/systems/5e/world/creatures/Mummy Lord.md +82 -0
- package/systems/5e/world/creatures/Mummy.md +38 -0
- package/systems/5e/world/creatures/Nalfeshnee.md +49 -0
- package/systems/5e/world/creatures/Night Hag.md +50 -0
- package/systems/5e/world/creatures/Nightmare.md +39 -0
- package/systems/5e/world/creatures/Noble.md +36 -0
- package/systems/5e/world/creatures/Ochre Jelly.md +42 -0
- package/systems/5e/world/creatures/Octopus.md +41 -0
- package/systems/5e/world/creatures/Ogre Zombie.md +34 -0
- package/systems/5e/world/creatures/Ogre.md +30 -0
- package/systems/5e/world/creatures/Oni.md +53 -0
- package/systems/5e/world/creatures/Orc.md +36 -0
- package/systems/5e/world/creatures/Otyugh.md +42 -0
- package/systems/5e/world/creatures/Owl.md +35 -0
- package/systems/5e/world/creatures/Owlbear.md +38 -0
- package/systems/5e/world/creatures/Panther.md +37 -0
- package/systems/5e/world/creatures/Pegasus.md +28 -0
- package/systems/5e/world/creatures/Phase Spider.md +41 -0
- package/systems/5e/world/creatures/Pit Fiend.md +61 -0
- package/systems/5e/world/creatures/Planetar.md +56 -0
- package/systems/5e/world/creatures/Plesiosaurus.md +32 -0
- package/systems/5e/world/creatures/Poisonous Snake.md +26 -0
- package/systems/5e/world/creatures/Polar Bear.md +38 -0
- package/systems/5e/world/creatures/Pony.md +24 -0
- package/systems/5e/world/creatures/Priest.md +47 -0
- package/systems/5e/world/creatures/Pseudodragon.md +44 -0
- package/systems/5e/world/creatures/Purple Worm.md +42 -0
- package/systems/5e/world/creatures/Quasit.md +44 -0
- package/systems/5e/world/creatures/Quipper.md +36 -0
- package/systems/5e/world/creatures/Rakshasa.md +45 -0
- package/systems/5e/world/creatures/Rat.md +30 -0
- package/systems/5e/world/creatures/Raven.md +31 -0
- package/systems/5e/world/creatures/Red Dragon Wyrmling.md +36 -0
- package/systems/5e/world/creatures/Reef Shark.md +38 -0
- package/systems/5e/world/creatures/Remorhaz.md +39 -0
- package/systems/5e/world/creatures/Rhinoceros.md +30 -0
- package/systems/5e/world/creatures/Riding Horse.md +24 -0
- package/systems/5e/world/creatures/Roc.md +39 -0
- package/systems/5e/world/creatures/Rock Gnome.md +27 -0
- package/systems/5e/world/creatures/Roper.md +48 -0
- package/systems/5e/world/creatures/Rug of Smothering.md +38 -0
- package/systems/5e/world/creatures/Rust Monster.md +39 -0
- package/systems/5e/world/creatures/Saber-Toothed Tiger.md +36 -0
- package/systems/5e/world/creatures/Sahuagin.md +49 -0
- package/systems/5e/world/creatures/Salamander.md +44 -0
- package/systems/5e/world/creatures/Satyr.md +38 -0
- package/systems/5e/world/creatures/Scorpion.md +26 -0
- package/systems/5e/world/creatures/Scout.md +40 -0
- package/systems/5e/world/creatures/Sea Hag.md +46 -0
- package/systems/5e/world/creatures/Sea Horse.md +25 -0
- package/systems/5e/world/creatures/Shadow.md +45 -0
- package/systems/5e/world/creatures/Shambling Mound.md +42 -0
- package/systems/5e/world/creatures/Shield Guardian.md +49 -0
- package/systems/5e/world/creatures/Shrieker.md +31 -0
- package/systems/5e/world/creatures/Silver Dragon Wyrmling.md +39 -0
- package/systems/5e/world/creatures/Skeleton.md +33 -0
- package/systems/5e/world/creatures/Solar.md +76 -0
- package/systems/5e/world/creatures/Specter.md +38 -0
- package/systems/5e/world/creatures/Spider.md +38 -0
- package/systems/5e/world/creatures/Spirit Naga.md +50 -0
- package/systems/5e/world/creatures/Sprite.md +37 -0
- package/systems/5e/world/creatures/Spy.md +42 -0
- package/systems/5e/world/creatures/Steam Mephit.md +40 -0
- package/systems/5e/world/creatures/Stirge.md +29 -0
- package/systems/5e/world/creatures/Stone Giant.md +45 -0
- package/systems/5e/world/creatures/Stone Golem.md +46 -0
- package/systems/5e/world/creatures/Storm Giant.md +51 -0
- package/systems/5e/world/creatures/Succubus-Incubus.md +50 -0
- package/systems/5e/world/creatures/Swarm of Bats.md +39 -0
- package/systems/5e/world/creatures/Swarm of Insects.md +52 -0
- package/systems/5e/world/creatures/Swarm of Poisonous Snakes.md +33 -0
- package/systems/5e/world/creatures/Swarm of Quippers.md +39 -0
- package/systems/5e/world/creatures/Swarm of Rats.md +35 -0
- package/systems/5e/world/creatures/Swarm of Ravens.md +33 -0
- package/systems/5e/world/creatures/Tarrasque.md +76 -0
- package/systems/5e/world/creatures/Thug.md +40 -0
- package/systems/5e/world/creatures/Tiefling.md +40 -0
- package/systems/5e/world/creatures/Tiger.md +37 -0
- package/systems/5e/world/creatures/Treant.md +45 -0
- package/systems/5e/world/creatures/Tribal Warrior.md +33 -0
- package/systems/5e/world/creatures/Triceratops.md +33 -0
- package/systems/5e/world/creatures/Troll.md +42 -0
- package/systems/5e/world/creatures/Tyrannosaurus Rex.md +32 -0
- package/systems/5e/world/creatures/Unicorn.md +70 -0
- package/systems/5e/world/creatures/Vampire Spawn.md +55 -0
- package/systems/5e/world/creatures/Vampire.md +91 -0
- package/systems/5e/world/creatures/Veteran.md +38 -0
- package/systems/5e/world/creatures/Violet Fungus.md +34 -0
- package/systems/5e/world/creatures/Vrock.md +49 -0
- package/systems/5e/world/creatures/Vulture.md +34 -0
- package/systems/5e/world/creatures/Warhorse Skeleton.md +29 -0
- package/systems/5e/world/creatures/Warhorse.md +29 -0
- package/systems/5e/world/creatures/Water Elemental.md +47 -0
- package/systems/5e/world/creatures/Weasel.md +30 -0
- package/systems/5e/world/creatures/Werebear.md +45 -0
- package/systems/5e/world/creatures/Wereboar.md +45 -0
- package/systems/5e/world/creatures/Wererat.md +45 -0
- package/systems/5e/world/creatures/Weretiger.md +51 -0
- package/systems/5e/world/creatures/Werewolf.md +45 -0
- package/systems/5e/world/creatures/White Dragon Wyrmling.md +37 -0
- package/systems/5e/world/creatures/Wight.md +47 -0
- package/systems/5e/world/creatures/Will-o'-Wisp.md +47 -0
- package/systems/5e/world/creatures/Winter Wolf.md +44 -0
- package/systems/5e/world/creatures/Wolf.md +34 -0
- package/systems/5e/world/creatures/Worg.md +35 -0
- package/systems/5e/world/creatures/Wraith.md +41 -0
- package/systems/5e/world/creatures/Wyvern.md +37 -0
- package/systems/5e/world/creatures/Xorn.md +48 -0
- package/systems/5e/world/creatures/Young Black Dragon.md +47 -0
- package/systems/5e/world/creatures/Young Blue Dragon.md +42 -0
- package/systems/5e/world/creatures/Young Brass Dragon.md +46 -0
- package/systems/5e/world/creatures/Young Bronze Dragon.md +51 -0
- package/systems/5e/world/creatures/Young Copper Dragon.md +46 -0
- package/systems/5e/world/creatures/Young Gold Dragon.md +51 -0
- package/systems/5e/world/creatures/Young Green Dragon.md +48 -0
- package/systems/5e/world/creatures/Young Red Dragon.md +42 -0
- package/systems/5e/world/creatures/Young Silver Dragon.md +45 -0
- package/systems/5e/world/creatures/Young White Dragon.md +48 -0
- package/systems/5e/world/creatures/Zombie.md +34 -0
- package/systems/5e/world/items/Abacus.md +5 -0
- package/systems/5e/world/items/Acid.md +8 -0
- package/systems/5e/world/items/Adamantine Armor.md +6 -0
- package/systems/5e/world/items/Alchemist's Fire.md +8 -0
- package/systems/5e/world/items/Alchemist's Supplies.md +7 -0
- package/systems/5e/world/items/Ammunition, +1, +2, or +3.md +6 -0
- package/systems/5e/world/items/Amulet of Health.md +7 -0
- package/systems/5e/world/items/Amulet of Proof against Detection and Location.md +7 -0
- package/systems/5e/world/items/Amulet of the Planes.md +7 -0
- package/systems/5e/world/items/Amulet.md +7 -0
- package/systems/5e/world/items/Animated Shield.md +7 -0
- package/systems/5e/world/items/Antitoxin.md +7 -0
- package/systems/5e/world/items/Apparatus of the Crab.md +37 -0
- package/systems/5e/world/items/Armor of Invulnerability.md +7 -0
- package/systems/5e/world/items/Armor of Resistance.md +15 -0
- package/systems/5e/world/items/Armor of Vulnerability.md +9 -0
- package/systems/5e/world/items/Armor, +1, +2, or +3.md +6 -0
- package/systems/5e/world/items/Arrow of Slaying.md +10 -0
- package/systems/5e/world/items/Arrow-Catching Shield.md +7 -0
- package/systems/5e/world/items/Arrows.md +6 -0
- package/systems/5e/world/items/Backpack.md +5 -0
- package/systems/5e/world/items/Bag of Beans.md +25 -0
- package/systems/5e/world/items/Bag of Devouring.md +12 -0
- package/systems/5e/world/items/Bag of Holding.md +10 -0
- package/systems/5e/world/items/Bag of Tricks.md +51 -0
- package/systems/5e/world/items/Bagpipes.md +7 -0
- package/systems/5e/world/items/Ball Bearings.md +8 -0
- package/systems/5e/world/items/Barding.md +7 -0
- package/systems/5e/world/items/Barrel.md +5 -0
- package/systems/5e/world/items/Basic Poison.md +7 -0
- package/systems/5e/world/items/Basket.md +5 -0
- package/systems/5e/world/items/Battleaxe.md +10 -0
- package/systems/5e/world/items/Bead of Force.md +10 -0
- package/systems/5e/world/items/Bedroll.md +5 -0
- package/systems/5e/world/items/Bell.md +4 -0
- package/systems/5e/world/items/Belt of Dwarvenkind.md +18 -0
- package/systems/5e/world/items/Belt of Giant Strength.md +17 -0
- package/systems/5e/world/items/Berserker Axe.md +11 -0
- package/systems/5e/world/items/Bit and Bridle.md +5 -0
- package/systems/5e/world/items/Blanket.md +5 -0
- package/systems/5e/world/items/Block and Tackle.md +7 -0
- package/systems/5e/world/items/Blowgun Needles.md +6 -0
- package/systems/5e/world/items/Blowgun.md +10 -0
- package/systems/5e/world/items/Book.md +7 -0
- package/systems/5e/world/items/Boots of Elvenkind.md +6 -0
- package/systems/5e/world/items/Boots of Levitation.md +7 -0
- package/systems/5e/world/items/Boots of Speed.md +9 -0
- package/systems/5e/world/items/Boots of Striding and Springing.md +7 -0
- package/systems/5e/world/items/Boots of the Winterlands.md +11 -0
- package/systems/5e/world/items/Bowl of Commanding Water Elementals.md +8 -0
- package/systems/5e/world/items/Bracers of Archery.md +7 -0
- package/systems/5e/world/items/Bracers of Defense.md +7 -0
- package/systems/5e/world/items/Brazier of Commanding Fire Elementals.md +8 -0
- package/systems/5e/world/items/Breastplate.md +9 -0
- package/systems/5e/world/items/Brewer's Supplies.md +7 -0
- package/systems/5e/world/items/Brooch of Shielding.md +7 -0
- package/systems/5e/world/items/Broom of Flying.md +8 -0
- package/systems/5e/world/items/Bucket.md +5 -0
- package/systems/5e/world/items/Bullseye Lantern.md +8 -0
- package/systems/5e/world/items/Burglar's Pack.md +6 -0
- package/systems/5e/world/items/Calligrapher's Supplies.md +7 -0
- package/systems/5e/world/items/Caltrops.md +8 -0
- package/systems/5e/world/items/Candle of Invocation.md +25 -0
- package/systems/5e/world/items/Candle.md +6 -0
- package/systems/5e/world/items/Cape of the Mountebank.md +8 -0
- package/systems/5e/world/items/Carpenter's Tools.md +7 -0
- package/systems/5e/world/items/Carpet of Flying.md +17 -0
- package/systems/5e/world/items/Carriage.md +5 -0
- package/systems/5e/world/items/Cart.md +5 -0
- package/systems/5e/world/items/Cartographer's Tools.md +7 -0
- package/systems/5e/world/items/Censer of Controlling Air Elementals.md +8 -0
- package/systems/5e/world/items/Chain Mail.md +11 -0
- package/systems/5e/world/items/Chain Shirt.md +9 -0
- package/systems/5e/world/items/Chain.md +9 -0
- package/systems/5e/world/items/Chalk.md +5 -0
- package/systems/5e/world/items/Chariot.md +5 -0
- package/systems/5e/world/items/Chest.md +5 -0
- package/systems/5e/world/items/Chime of Opening.md +8 -0
- package/systems/5e/world/items/Circlet of Blasting.md +6 -0
- package/systems/5e/world/items/Climber's Kit.md +7 -0
- package/systems/5e/world/items/Cloak of Arachnida.md +13 -0
- package/systems/5e/world/items/Cloak of Displacement.md +7 -0
- package/systems/5e/world/items/Cloak of Elvenkind.md +7 -0
- package/systems/5e/world/items/Cloak of Protection.md +7 -0
- package/systems/5e/world/items/Cloak of the Bat.md +9 -0
- package/systems/5e/world/items/Cloak of the Manta Ray.md +6 -0
- package/systems/5e/world/items/Club.md +10 -0
- package/systems/5e/world/items/Cobbler's Tools.md +7 -0
- package/systems/5e/world/items/Common Clothes.md +6 -0
- package/systems/5e/world/items/Component Pouch.md +7 -0
- package/systems/5e/world/items/Cook's Utensils.md +7 -0
- package/systems/5e/world/items/Costume Clothes.md +6 -0
- package/systems/5e/world/items/Crossbow Bolt Case.md +8 -0
- package/systems/5e/world/items/Crossbow Bolts.md +6 -0
- package/systems/5e/world/items/Crowbar.md +7 -0
- package/systems/5e/world/items/Crystal Ball.md +15 -0
- package/systems/5e/world/items/Crystal.md +7 -0
- package/systems/5e/world/items/Cube of Force.md +32 -0
- package/systems/5e/world/items/Cubic Gate.md +10 -0
- package/systems/5e/world/items/Dagger of Venom.md +8 -0
- package/systems/5e/world/items/Dagger.md +10 -0
- package/systems/5e/world/items/Dancing Sword.md +11 -0
- package/systems/5e/world/items/Dart.md +10 -0
- package/systems/5e/world/items/Decanter of Endless Water.md +12 -0
- package/systems/5e/world/items/Deck of Illusions.md +48 -0
- package/systems/5e/world/items/Deck of Many Things.md +113 -0
- package/systems/5e/world/items/Defender.md +9 -0
- package/systems/5e/world/items/Demon Armor.md +9 -0
- package/systems/5e/world/items/Dice Set.md +6 -0
- package/systems/5e/world/items/Dimensional Shackles.md +8 -0
- package/systems/5e/world/items/Diplomat's Pack.md +6 -0
- package/systems/5e/world/items/Disguise Kit.md +7 -0
- package/systems/5e/world/items/Dragon Scale Mail.md +19 -0
- package/systems/5e/world/items/Dragon Slayer.md +8 -0
- package/systems/5e/world/items/Drum.md +7 -0
- package/systems/5e/world/items/Dulcimer.md +7 -0
- package/systems/5e/world/items/Dungeoneer's Pack.md +6 -0
- package/systems/5e/world/items/Dust of Disappearance.md +6 -0
- package/systems/5e/world/items/Dust of Dryness.md +10 -0
- package/systems/5e/world/items/Dust of Sneezing and Choking.md +8 -0
- package/systems/5e/world/items/Dwarven Plate.md +6 -0
- package/systems/5e/world/items/Dwarven Thrower.md +7 -0
- package/systems/5e/world/items/Efficient Quiver.md +8 -0
- package/systems/5e/world/items/Efreeti Bottle.md +14 -0
- package/systems/5e/world/items/Elemental Gem.md +13 -0
- package/systems/5e/world/items/Elven Chain.md +6 -0
- package/systems/5e/world/items/Emblem.md +6 -0
- package/systems/5e/world/items/Entertainer's Pack.md +6 -0
- package/systems/5e/world/items/Eversmoking Bottle.md +8 -0
- package/systems/5e/world/items/Exotic Saddle.md +7 -0
- package/systems/5e/world/items/Explorer's Pack.md +6 -0
- package/systems/5e/world/items/Eyes of Charming.md +7 -0
- package/systems/5e/world/items/Eyes of Minute Seeing.md +6 -0
- package/systems/5e/world/items/Eyes of the Eagle.md +7 -0
- package/systems/5e/world/items/Feather Token.md +26 -0
- package/systems/5e/world/items/Feed.md +6 -0
- package/systems/5e/world/items/Figurine of Wondrous Power.md +52 -0
- package/systems/5e/world/items/Fine Clothes.md +6 -0
- package/systems/5e/world/items/Fishing Tackle.md +7 -0
- package/systems/5e/world/items/Flail.md +9 -0
- package/systems/5e/world/items/Flame Tongue.md +7 -0
- package/systems/5e/world/items/Flask or Tankard.md +5 -0
- package/systems/5e/world/items/Flute.md +7 -0
- package/systems/5e/world/items/Folding Boat.md +14 -0
- package/systems/5e/world/items/Forgery Kit.md +7 -0
- package/systems/5e/world/items/Frost Brand.md +11 -0
- package/systems/5e/world/items/Galley.md +5 -0
- package/systems/5e/world/items/Gauntlets of Ogre Power.md +7 -0
- package/systems/5e/world/items/Gem of Brightness.md +12 -0
- package/systems/5e/world/items/Gem of Seeing.md +9 -0
- package/systems/5e/world/items/Giant Slayer.md +8 -0
- package/systems/5e/world/items/Glaive.md +10 -0
- package/systems/5e/world/items/Glamoured Studded Leather.md +6 -0
- package/systems/5e/world/items/Glass Bottle.md +6 -0
- package/systems/5e/world/items/Glassblower's Tools.md +7 -0
- package/systems/5e/world/items/Gloves of Missile Snaring.md +7 -0
- package/systems/5e/world/items/Gloves of Swimming and Climbing.md +7 -0
- package/systems/5e/world/items/Goggles of Night.md +6 -0
- package/systems/5e/world/items/Grappling Hook.md +5 -0
- package/systems/5e/world/items/Greataxe.md +10 -0
- package/systems/5e/world/items/Greatclub.md +10 -0
- package/systems/5e/world/items/Greatsword.md +10 -0
- package/systems/5e/world/items/Halberd.md +10 -0
- package/systems/5e/world/items/Half Plate Armor.md +11 -0
- package/systems/5e/world/items/Hammer of Thunderbolts.md +10 -0
- package/systems/5e/world/items/Hammer.md +5 -0
- package/systems/5e/world/items/Hand Crossbow.md +11 -0
- package/systems/5e/world/items/Handaxe.md +10 -0
- package/systems/5e/world/items/Handy Haversack.md +12 -0
- package/systems/5e/world/items/Hat of Disguise.md +7 -0
- package/systems/5e/world/items/Headband of Intellect.md +7 -0
- package/systems/5e/world/items/Healer's Kit.md +8 -0
- package/systems/5e/world/items/Heavy Crossbow.md +11 -0
- package/systems/5e/world/items/Helm of Brilliance.md +16 -0
- package/systems/5e/world/items/Helm of Comprehending Languages.md +6 -0
- package/systems/5e/world/items/Helm of Telepathy.md +9 -0
- package/systems/5e/world/items/Helm of Teleportation.md +7 -0
- package/systems/5e/world/items/Hempen Rope.md +9 -0
- package/systems/5e/world/items/Herbalism Kit.md +7 -0
- package/systems/5e/world/items/Hide Armor.md +10 -0
- package/systems/5e/world/items/Holy Avenger.md +9 -0
- package/systems/5e/world/items/Holy Water.md +10 -0
- package/systems/5e/world/items/Hooded Lantern.md +8 -0
- package/systems/5e/world/items/Horn of Blasting.md +8 -0
- package/systems/5e/world/items/Horn of Valhalla.md +17 -0
- package/systems/5e/world/items/Horn.md +7 -0
- package/systems/5e/world/items/Horseshoes of Speed.md +6 -0
- package/systems/5e/world/items/Horseshoes of a Zephyr.md +6 -0
- package/systems/5e/world/items/Hourglass.md +5 -0
- package/systems/5e/world/items/Hunting Trap.md +7 -0
- package/systems/5e/world/items/Immovable Rod.md +6 -0
- package/systems/5e/world/items/Ink Pen.md +4 -0
- package/systems/5e/world/items/Ink.md +5 -0
- package/systems/5e/world/items/Instant Fortress.md +12 -0
- package/systems/5e/world/items/Ioun Stone.md +47 -0
- package/systems/5e/world/items/Iron Bands of Binding.md +12 -0
- package/systems/5e/world/items/Iron Flask.md +33 -0
- package/systems/5e/world/items/Iron Pot.md +6 -0
- package/systems/5e/world/items/Iron Spikes.md +6 -0
- package/systems/5e/world/items/Javelin of Lightning.md +8 -0
- package/systems/5e/world/items/Javelin.md +10 -0
- package/systems/5e/world/items/Jeweler's Tools.md +7 -0
- package/systems/5e/world/items/Jug or Pitcher.md +5 -0
- package/systems/5e/world/items/Keelboat.md +7 -0
- package/systems/5e/world/items/Ladder.md +7 -0
- package/systems/5e/world/items/Lamp.md +7 -0
- package/systems/5e/world/items/Lance.md +12 -0
- package/systems/5e/world/items/Lantern of Revealing.md +6 -0
- package/systems/5e/world/items/Leather Armor.md +10 -0
- package/systems/5e/world/items/Leatherworker's Tools.md +7 -0
- package/systems/5e/world/items/Light Crossbow.md +11 -0
- package/systems/5e/world/items/Light Hammer.md +10 -0
- package/systems/5e/world/items/Lock.md +7 -0
- package/systems/5e/world/items/Longbow.md +10 -0
- package/systems/5e/world/items/Longship.md +5 -0
- package/systems/5e/world/items/Longsword.md +10 -0
- package/systems/5e/world/items/Luck Blade.md +11 -0
- package/systems/5e/world/items/Lute.md +7 -0
- package/systems/5e/world/items/Lyre.md +7 -0
- package/systems/5e/world/items/Mace of Disruption.md +9 -0
- package/systems/5e/world/items/Mace of Smiting.md +8 -0
- package/systems/5e/world/items/Mace of Terror.md +9 -0
- package/systems/5e/world/items/Mace.md +9 -0
- package/systems/5e/world/items/Magnifying Glass.md +6 -0
- package/systems/5e/world/items/Manacles.md +7 -0
- package/systems/5e/world/items/Mantle of Spell Resistance.md +7 -0
- package/systems/5e/world/items/Manual of Bodily Health.md +6 -0
- package/systems/5e/world/items/Manual of Gainful Exercise.md +6 -0
- package/systems/5e/world/items/Manual of Golems.md +17 -0
- package/systems/5e/world/items/Manual of Quickness of Action.md +6 -0
- package/systems/5e/world/items/Map or Scroll Case.md +8 -0
- package/systems/5e/world/items/Marvelous Pigments.md +14 -0
- package/systems/5e/world/items/Mason's Tools.md +7 -0
- package/systems/5e/world/items/Maul.md +10 -0
- package/systems/5e/world/items/Medallion of Thoughts.md +7 -0
- package/systems/5e/world/items/Merchant's Scale.md +8 -0
- package/systems/5e/world/items/Mess Kit.md +7 -0
- package/systems/5e/world/items/Military Saddle.md +7 -0
- package/systems/5e/world/items/Miner's Pick.md +6 -0
- package/systems/5e/world/items/Mirror of Life Trapping.md +18 -0
- package/systems/5e/world/items/Mithral Armor.md +6 -0
- package/systems/5e/world/items/Morningstar.md +9 -0
- package/systems/5e/world/items/Navigator's Tools.md +7 -0
- package/systems/5e/world/items/Necklace of Adaptation.md +7 -0
- package/systems/5e/world/items/Necklace of Fireballs.md +8 -0
- package/systems/5e/world/items/Necklace of Prayer Beads.md +18 -0
- package/systems/5e/world/items/Net.md +12 -0
- package/systems/5e/world/items/Nine Lives Stealer.md +9 -0
- package/systems/5e/world/items/Oathbow.md +11 -0
- package/systems/5e/world/items/Oil of Etherealness.md +6 -0
- package/systems/5e/world/items/Oil of Sharpness.md +6 -0
- package/systems/5e/world/items/Oil of Slipperiness.md +8 -0
- package/systems/5e/world/items/Oil.md +8 -0
- package/systems/5e/world/items/Orb of Dragonkind.md +31 -0
- package/systems/5e/world/items/Orb.md +7 -0
- package/systems/5e/world/items/Pack Saddle.md +7 -0
- package/systems/5e/world/items/Padded Armor.md +11 -0
- package/systems/5e/world/items/Painter's Supplies.md +7 -0
- package/systems/5e/world/items/Pan Flute.md +7 -0
- package/systems/5e/world/items/Paper.md +5 -0
- package/systems/5e/world/items/Parchment.md +5 -0
- package/systems/5e/world/items/Pearl of Power.md +7 -0
- package/systems/5e/world/items/Perfume.md +5 -0
- package/systems/5e/world/items/Periapt of Health.md +6 -0
- package/systems/5e/world/items/Periapt of Proof against Poison.md +6 -0
- package/systems/5e/world/items/Periapt of Wound Closure.md +7 -0
- package/systems/5e/world/items/Philter of Love.md +6 -0
- package/systems/5e/world/items/Pike.md +10 -0
- package/systems/5e/world/items/Pipes of Haunting.md +6 -0
- package/systems/5e/world/items/Pipes of the Sewers.md +11 -0
- package/systems/5e/world/items/Piton.md +5 -0
- package/systems/5e/world/items/Plate Armor of Etherealness.md +7 -0
- package/systems/5e/world/items/Plate Armor.md +12 -0
- package/systems/5e/world/items/Playing Card Set.md +6 -0
- package/systems/5e/world/items/Poisoner's Kit.md +7 -0
- package/systems/5e/world/items/Pole.md +7 -0
- package/systems/5e/world/items/Portable Hole.md +14 -0
- package/systems/5e/world/items/Portable Ram.md +8 -0
- package/systems/5e/world/items/Potion of Animal Friendship.md +6 -0
- package/systems/5e/world/items/Potion of Clairvoyance.md +6 -0
- package/systems/5e/world/items/Potion of Climbing.md +6 -0
- package/systems/5e/world/items/Potion of Diminution.md +6 -0
- package/systems/5e/world/items/Potion of Flying.md +6 -0
- package/systems/5e/world/items/Potion of Gaseous Form.md +6 -0
- package/systems/5e/world/items/Potion of Giant Strength.md +16 -0
- package/systems/5e/world/items/Potion of Growth.md +6 -0
- package/systems/5e/world/items/Potion of Healing.md +19 -0
- package/systems/5e/world/items/Potion of Heroism.md +6 -0
- package/systems/5e/world/items/Potion of Invisibility.md +6 -0
- package/systems/5e/world/items/Potion of Mind Reading.md +6 -0
- package/systems/5e/world/items/Potion of Poison.md +8 -0
- package/systems/5e/world/items/Potion of Resistance.md +14 -0
- package/systems/5e/world/items/Potion of Speed.md +6 -0
- package/systems/5e/world/items/Potion of Water Breathing.md +6 -0
- package/systems/5e/world/items/Potter's Tools.md +7 -0
- package/systems/5e/world/items/Pouch.md +7 -0
- package/systems/5e/world/items/Priest's Pack.md +6 -0
- package/systems/5e/world/items/Quarterstaff.md +10 -0
- package/systems/5e/world/items/Quiver.md +7 -0
- package/systems/5e/world/items/Rapier.md +10 -0
- package/systems/5e/world/items/Rations.md +8 -0
- package/systems/5e/world/items/Reliquary.md +7 -0
- package/systems/5e/world/items/Restorative Ointment.md +8 -0
- package/systems/5e/world/items/Riding Saddle.md +7 -0
- package/systems/5e/world/items/Ring Mail.md +10 -0
- package/systems/5e/world/items/Ring of Animal Influence.md +10 -0
- package/systems/5e/world/items/Ring of Djinni Summoning.md +11 -0
- package/systems/5e/world/items/Ring of Elemental Command.md +41 -0
- package/systems/5e/world/items/Ring of Evasion.md +7 -0
- package/systems/5e/world/items/Ring of Feather Falling.md +7 -0
- package/systems/5e/world/items/Ring of Free Action.md +7 -0
- package/systems/5e/world/items/Ring of Invisibility.md +7 -0
- package/systems/5e/world/items/Ring of Jumping.md +7 -0
- package/systems/5e/world/items/Ring of Mind Shielding.md +11 -0
- package/systems/5e/world/items/Ring of Protection.md +7 -0
- package/systems/5e/world/items/Ring of Regeneration.md +7 -0
- package/systems/5e/world/items/Ring of Resistance.md +20 -0
- package/systems/5e/world/items/Ring of Shooting Stars.md +26 -0
- package/systems/5e/world/items/Ring of Spell Storing.md +11 -0
- package/systems/5e/world/items/Ring of Spell Turning.md +7 -0
- package/systems/5e/world/items/Ring of Swimming.md +6 -0
- package/systems/5e/world/items/Ring of Telekinesis.md +7 -0
- package/systems/5e/world/items/Ring of Three Wishes.md +6 -0
- package/systems/5e/world/items/Ring of Warmth.md +7 -0
- package/systems/5e/world/items/Ring of Water Walking.md +6 -0
- package/systems/5e/world/items/Ring of X-ray Vision.md +9 -0
- package/systems/5e/world/items/Ring of the Ram.md +9 -0
- package/systems/5e/world/items/Robe of Eyes.md +15 -0
- package/systems/5e/world/items/Robe of Scintillating Colors.md +7 -0
- package/systems/5e/world/items/Robe of Stars.md +11 -0
- package/systems/5e/world/items/Robe of Useful Items.md +33 -0
- package/systems/5e/world/items/Robe of the Archmagi.md +13 -0
- package/systems/5e/world/items/Robes.md +5 -0
- package/systems/5e/world/items/Rod of Absorption.md +13 -0
- package/systems/5e/world/items/Rod of Alertness.md +15 -0
- package/systems/5e/world/items/Rod of Lordly Might.md +27 -0
- package/systems/5e/world/items/Rod of Rulership.md +7 -0
- package/systems/5e/world/items/Rod of Security.md +10 -0
- package/systems/5e/world/items/Rod.md +7 -0
- package/systems/5e/world/items/Rope of Climbing.md +10 -0
- package/systems/5e/world/items/Rope of Entanglement.md +10 -0
- package/systems/5e/world/items/Rowboat.md +7 -0
- package/systems/5e/world/items/Sack.md +5 -0
- package/systems/5e/world/items/Saddlebags.md +5 -0
- package/systems/5e/world/items/Sailing Ship.md +5 -0
- package/systems/5e/world/items/Scale Mail.md +10 -0
- package/systems/5e/world/items/Scarab of Protection.md +10 -0
- package/systems/5e/world/items/Scholar's Pack.md +6 -0
- package/systems/5e/world/items/Scimitar of Speed.md +7 -0
- package/systems/5e/world/items/Scimitar.md +10 -0
- package/systems/5e/world/items/Sealing Wax.md +4 -0
- package/systems/5e/world/items/Shawm.md +7 -0
- package/systems/5e/world/items/Shield of Missile Attraction.md +9 -0
- package/systems/5e/world/items/Shield, +1, +2, or +3.md +6 -0
- package/systems/5e/world/items/Shield.md +9 -0
- package/systems/5e/world/items/Shortbow.md +10 -0
- package/systems/5e/world/items/Shortsword.md +10 -0
- package/systems/5e/world/items/Shovel.md +5 -0
- package/systems/5e/world/items/Sickle.md +10 -0
- package/systems/5e/world/items/Signal Whistle.md +4 -0
- package/systems/5e/world/items/Signet Ring.md +4 -0
- package/systems/5e/world/items/Silk Rope.md +9 -0
- package/systems/5e/world/items/Sled.md +5 -0
- package/systems/5e/world/items/Sledgehammer.md +6 -0
- package/systems/5e/world/items/Sling Bullets.md +6 -0
- package/systems/5e/world/items/Sling.md +9 -0
- package/systems/5e/world/items/Slippers of Spider Climbing.md +7 -0
- package/systems/5e/world/items/Smith's Tools.md +7 -0
- package/systems/5e/world/items/Soap.md +4 -0
- package/systems/5e/world/items/Sovereign Glue.md +8 -0
- package/systems/5e/world/items/Spear.md +10 -0
- package/systems/5e/world/items/Spell Scroll.md +27 -0
- package/systems/5e/world/items/Spellbook.md +7 -0
- package/systems/5e/world/items/Spellguard Shield.md +7 -0
- package/systems/5e/world/items/Sphere of Annihilation.md +20 -0
- package/systems/5e/world/items/Splint Armor.md +12 -0
- package/systems/5e/world/items/Sprig of Mistletoe.md +6 -0
- package/systems/5e/world/items/Spyglass.md +7 -0
- package/systems/5e/world/items/Staff of Charming.md +11 -0
- package/systems/5e/world/items/Staff of Fire.md +11 -0
- package/systems/5e/world/items/Staff of Frost.md +11 -0
- package/systems/5e/world/items/Staff of Healing.md +9 -0
- package/systems/5e/world/items/Staff of Power.md +23 -0
- package/systems/5e/world/items/Staff of Striking.md +9 -0
- package/systems/5e/world/items/Staff of Swarming Insects.md +11 -0
- package/systems/5e/world/items/Staff of Thunder and Lightning.md +17 -0
- package/systems/5e/world/items/Staff of Withering.md +9 -0
- package/systems/5e/world/items/Staff of the Magi.md +25 -0
- package/systems/5e/world/items/Staff of the Python.md +11 -0
- package/systems/5e/world/items/Staff of the Woodlands.md +15 -0
- package/systems/5e/world/items/Staff.md +7 -0
- package/systems/5e/world/items/Steel Mirror.md +6 -0
- package/systems/5e/world/items/Stone of Controlling Earth Elementals.md +6 -0
- package/systems/5e/world/items/Stone of Good Luck.md +8 -0
- package/systems/5e/world/items/Studded Leather Armor.md +10 -0
- package/systems/5e/world/items/Sun Blade.md +11 -0
- package/systems/5e/world/items/Sword of Life Stealing.md +7 -0
- package/systems/5e/world/items/Sword of Sharpness.md +11 -0
- package/systems/5e/world/items/Sword of Wounding.md +9 -0
- package/systems/5e/world/items/Talisman of Pure Good.md +11 -0
- package/systems/5e/world/items/Talisman of Ultimate Evil.md +11 -0
- package/systems/5e/world/items/Talisman of the Sphere.md +7 -0
- package/systems/5e/world/items/Thieves' Tools.md +7 -0
- package/systems/5e/world/items/Tinderbox.md +7 -0
- package/systems/5e/world/items/Tinker's Tools.md +7 -0
- package/systems/5e/world/items/Tome of Clear Thought.md +6 -0
- package/systems/5e/world/items/Tome of Leadership and Influence.md +6 -0
- package/systems/5e/world/items/Tome of Understanding.md +6 -0
- package/systems/5e/world/items/Torch.md +7 -0
- package/systems/5e/world/items/Totem.md +6 -0
- package/systems/5e/world/items/Traveler's Clothes.md +6 -0
- package/systems/5e/world/items/Trident of Fish Command.md +7 -0
- package/systems/5e/world/items/Trident.md +10 -0
- package/systems/5e/world/items/Two-Person Tent.md +8 -0
- package/systems/5e/world/items/Unarmed Strike.md +7 -0
- package/systems/5e/world/items/Universal Solvent.md +6 -0
- package/systems/5e/world/items/Vial.md +4 -0
- package/systems/5e/world/items/Vicious Weapon.md +6 -0
- package/systems/5e/world/items/Viol.md +7 -0
- package/systems/5e/world/items/Vorpal Sword.md +9 -0
- package/systems/5e/world/items/Wagon.md +5 -0
- package/systems/5e/world/items/Wand of Binding.md +11 -0
- package/systems/5e/world/items/Wand of Enemy Detection.md +9 -0
- package/systems/5e/world/items/Wand of Fear.md +11 -0
- package/systems/5e/world/items/Wand of Fireballs.md +9 -0
- package/systems/5e/world/items/Wand of Lightning Bolts.md +9 -0
- package/systems/5e/world/items/Wand of Magic Detection.md +6 -0
- package/systems/5e/world/items/Wand of Magic Missiles.md +8 -0
- package/systems/5e/world/items/Wand of Paralysis.md +9 -0
- package/systems/5e/world/items/Wand of Polymorph.md +9 -0
- package/systems/5e/world/items/Wand of Secrets.md +6 -0
- package/systems/5e/world/items/Wand of Web.md +9 -0
- package/systems/5e/world/items/Wand of Wonder.md +38 -0
- package/systems/5e/world/items/Wand of the War Mage, +1, +2, or +3.md +7 -0
- package/systems/5e/world/items/Wand.md +7 -0
- package/systems/5e/world/items/War Pick.md +9 -0
- package/systems/5e/world/items/Warhammer.md +10 -0
- package/systems/5e/world/items/Warship.md +5 -0
- package/systems/5e/world/items/Waterskin.md +5 -0
- package/systems/5e/world/items/Weapon, +1, +2, or +3.md +6 -0
- package/systems/5e/world/items/Weaver's Tools.md +7 -0
- package/systems/5e/world/items/Well of Many Worlds.md +8 -0
- package/systems/5e/world/items/Whetstone.md +5 -0
- package/systems/5e/world/items/Whip.md +10 -0
- package/systems/5e/world/items/Wind Fan.md +6 -0
- package/systems/5e/world/items/Winged Boots.md +9 -0
- package/systems/5e/world/items/Wings of Flying.md +7 -0
- package/systems/5e/world/items/Woodcarver's Tools.md +7 -0
- package/systems/5e/world/items/Wooden Staff.md +7 -0
- package/systems/5e/world/items/Yew Wand.md +7 -0
- package/systems/5e/world/topics/Acid Arrow.md +14 -0
- package/systems/5e/world/topics/Acid Splash.md +14 -0
- package/systems/5e/world/topics/Acolyte (background).md +103 -0
- package/systems/5e/world/topics/Aid.md +14 -0
- package/systems/5e/world/topics/Alarm.md +17 -0
- package/systems/5e/world/topics/Alter Self.md +19 -0
- package/systems/5e/world/topics/Animal Friendship.md +14 -0
- package/systems/5e/world/topics/Animal Messenger.md +17 -0
- package/systems/5e/world/topics/Animal Shapes.md +17 -0
- package/systems/5e/world/topics/Animate Dead.md +18 -0
- package/systems/5e/world/topics/Animate Objects.md +31 -0
- package/systems/5e/world/topics/Antilife Shell.md +17 -0
- package/systems/5e/world/topics/Antimagic Field.md +31 -0
- package/systems/5e/world/topics/Antipathy-Sympathy.md +23 -0
- package/systems/5e/world/topics/Arcane Eye.md +17 -0
- package/systems/5e/world/topics/Arcane Hand.md +27 -0
- package/systems/5e/world/topics/Arcane Lock.md +14 -0
- package/systems/5e/world/topics/Arcane Sword.md +15 -0
- package/systems/5e/world/topics/Arcanist's Magic Aura.md +18 -0
- package/systems/5e/world/topics/Astral Projection.md +22 -0
- package/systems/5e/world/topics/Augury.md +22 -0
- package/systems/5e/world/topics/Awaken.md +14 -0
- package/systems/5e/world/topics/Bane.md +15 -0
- package/systems/5e/world/topics/Banishment.md +19 -0
- package/systems/5e/world/topics/Barbarian.md +123 -0
- package/systems/5e/world/topics/Bard Spells.md +147 -0
- package/systems/5e/world/topics/Bard.md +139 -0
- package/systems/5e/world/topics/Barkskin.md +13 -0
- package/systems/5e/world/topics/Beacon of Hope.md +13 -0
- package/systems/5e/world/topics/Bestow Curse.md +22 -0
- package/systems/5e/world/topics/Black Tentacles.md +17 -0
- package/systems/5e/world/topics/Blade Barrier.md +15 -0
- package/systems/5e/world/topics/Bless.md +15 -0
- package/systems/5e/world/topics/Blight.md +18 -0
- package/systems/5e/world/topics/Blindness-Deafness.md +15 -0
- package/systems/5e/world/topics/Blink.md +14 -0
- package/systems/5e/world/topics/Blur.md +13 -0
- package/systems/5e/world/topics/Branding Smite.md +15 -0
- package/systems/5e/world/topics/Burning Hands.md +16 -0
- package/systems/5e/world/topics/Call Lightning.md +19 -0
- package/systems/5e/world/topics/Calm Emotions.md +17 -0
- package/systems/5e/world/topics/Chain Lightning.md +16 -0
- package/systems/5e/world/topics/Champion.md +24 -0
- package/systems/5e/world/topics/Charm Person.md +14 -0
- package/systems/5e/world/topics/Chill Touch.md +16 -0
- package/systems/5e/world/topics/Circle of Death.md +14 -0
- package/systems/5e/world/topics/Circle of the Land.md +96 -0
- package/systems/5e/world/topics/Clairvoyance.md +17 -0
- package/systems/5e/world/topics/Cleric Spells.md +140 -0
- package/systems/5e/world/topics/Cleric.md +141 -0
- package/systems/5e/world/topics/Clone.md +14 -0
- package/systems/5e/world/topics/Cloudkill.md +19 -0
- package/systems/5e/world/topics/College of Lore.md +23 -0
- package/systems/5e/world/topics/Color Spray.md +16 -0
- package/systems/5e/world/topics/Command.md +26 -0
- package/systems/5e/world/topics/Commune with Nature.md +23 -0
- package/systems/5e/world/topics/Commune.md +17 -0
- package/systems/5e/world/topics/Comprehend Languages.md +15 -0
- package/systems/5e/world/topics/Compulsion.md +15 -0
- package/systems/5e/world/topics/Cone of Cold.md +16 -0
- package/systems/5e/world/topics/Confusion.md +26 -0
- package/systems/5e/world/topics/Conjure Animals.md +26 -0
- package/systems/5e/world/topics/Conjure Celestial.md +19 -0
- package/systems/5e/world/topics/Conjure Elemental.md +21 -0
- package/systems/5e/world/topics/Conjure Fey.md +21 -0
- package/systems/5e/world/topics/Conjure Minor Elementals.md +26 -0
- package/systems/5e/world/topics/Conjure Woodland Beings.md +26 -0
- package/systems/5e/world/topics/Contact Other Plane.md +15 -0
- package/systems/5e/world/topics/Contagion.md +28 -0
- package/systems/5e/world/topics/Contingency.md +16 -0
- package/systems/5e/world/topics/Continual Flame.md +12 -0
- package/systems/5e/world/topics/Control Water.md +29 -0
- package/systems/5e/world/topics/Control Weather.md +48 -0
- package/systems/5e/world/topics/Counterspell.md +14 -0
- package/systems/5e/world/topics/Create Food and Water.md +12 -0
- package/systems/5e/world/topics/Create Undead.md +18 -0
- package/systems/5e/world/topics/Create or Destroy Water.md +18 -0
- package/systems/5e/world/topics/Creation.md +26 -0
- package/systems/5e/world/topics/Cure Wounds.md +14 -0
- package/systems/5e/world/topics/Dancing Lights.md +15 -0
- package/systems/5e/world/topics/Darkness.md +17 -0
- package/systems/5e/world/topics/Darkvision.md +12 -0
- package/systems/5e/world/topics/Daylight.md +16 -0
- package/systems/5e/world/topics/Death Ward.md +16 -0
- package/systems/5e/world/topics/Delayed Blast Fireball.md +21 -0
- package/systems/5e/world/topics/Demiplane.md +14 -0
- package/systems/5e/world/topics/Detect Evil and Good.md +15 -0
- package/systems/5e/world/topics/Detect Magic.md +16 -0
- package/systems/5e/world/topics/Detect Poison and Disease.md +16 -0
- package/systems/5e/world/topics/Detect Thoughts.md +21 -0
- package/systems/5e/world/topics/Dimension Door.md +16 -0
- package/systems/5e/world/topics/Disguise Self.md +16 -0
- package/systems/5e/world/topics/Disintegrate.md +20 -0
- package/systems/5e/world/topics/Dispel Evil and Good.md +19 -0
- package/systems/5e/world/topics/Dispel Magic.md +14 -0
- package/systems/5e/world/topics/Divination.md +17 -0
- package/systems/5e/world/topics/Divine Favor.md +13 -0
- package/systems/5e/world/topics/Divine Word.md +19 -0
- package/systems/5e/world/topics/Dominate Beast.md +21 -0
- package/systems/5e/world/topics/Dominate Monster.md +21 -0
- package/systems/5e/world/topics/Dominate Person.md +21 -0
- package/systems/5e/world/topics/Draconic Bloodline.md +43 -0
- package/systems/5e/world/topics/Dream.md +18 -0
- package/systems/5e/world/topics/Druid Spells.md +140 -0
- package/systems/5e/world/topics/Druid.md +146 -0
- package/systems/5e/world/topics/Druidcraft.md +17 -0
- package/systems/5e/world/topics/Earthquake.md +25 -0
- package/systems/5e/world/topics/Eldritch Blast.md +14 -0
- package/systems/5e/world/topics/Enhance Ability.md +27 -0
- package/systems/5e/world/topics/Enlarge-Reduce.md +20 -0
- package/systems/5e/world/topics/Entangle.md +17 -0
- package/systems/5e/world/topics/Enthrall.md +12 -0
- package/systems/5e/world/topics/Etherealness.md +22 -0
- package/systems/5e/world/topics/Expeditious Retreat.md +13 -0
- package/systems/5e/world/topics/Eyebite.md +19 -0
- package/systems/5e/world/topics/Fabricate.md +16 -0
- package/systems/5e/world/topics/Faerie Fire.md +15 -0
- package/systems/5e/world/topics/Faithful Hound.md +16 -0
- package/systems/5e/world/topics/False Life.md +14 -0
- package/systems/5e/world/topics/Fear.md +15 -0
- package/systems/5e/world/topics/Feather Fall.md +12 -0
- package/systems/5e/world/topics/Feeblemind.md +18 -0
- package/systems/5e/world/topics/Fighter.md +109 -0
- package/systems/5e/world/topics/Find Familiar.md +25 -0
- package/systems/5e/world/topics/Find Steed.md +20 -0
- package/systems/5e/world/topics/Find Traps.md +14 -0
- package/systems/5e/world/topics/Find the Path.md +15 -0
- package/systems/5e/world/topics/Finger of Death.md +14 -0
- package/systems/5e/world/topics/Fire Bolt.md +14 -0
- package/systems/5e/world/topics/Fire Shield.md +16 -0
- package/systems/5e/world/topics/Fire Storm.md +14 -0
- package/systems/5e/world/topics/Fireball.md +16 -0
- package/systems/5e/world/topics/Flame Blade.md +19 -0
- package/systems/5e/world/topics/Flame Strike.md +14 -0
- package/systems/5e/world/topics/Flaming Sphere.md +19 -0
- package/systems/5e/world/topics/Flesh to Stone.md +19 -0
- package/systems/5e/world/topics/Floating Disk.md +17 -0
- package/systems/5e/world/topics/Fly.md +15 -0
- package/systems/5e/world/topics/Fog Cloud.md +15 -0
- package/systems/5e/world/topics/Forbiddance.md +19 -0
- package/systems/5e/world/topics/Forcecage.md +22 -0
- package/systems/5e/world/topics/Foresight.md +14 -0
- package/systems/5e/world/topics/Freedom of Movement.md +14 -0
- package/systems/5e/world/topics/Freezing Sphere.md +18 -0
- package/systems/5e/world/topics/Gaseous Form.md +17 -0
- package/systems/5e/world/topics/Gate.md +19 -0
- package/systems/5e/world/topics/Geas.md +18 -0
- package/systems/5e/world/topics/Gentle Repose.md +15 -0
- package/systems/5e/world/topics/Giant Insect.md +19 -0
- package/systems/5e/world/topics/Glibness.md +12 -0
- package/systems/5e/world/topics/Globe of Invulnerability.md +17 -0
- package/systems/5e/world/topics/Glyph of Warding.md +26 -0
- package/systems/5e/world/topics/Goodberry.md +14 -0
- package/systems/5e/world/topics/Grappler.md +17 -0
- package/systems/5e/world/topics/Grease.md +14 -0
- package/systems/5e/world/topics/Greater Invisibility.md +13 -0
- package/systems/5e/world/topics/Greater Restoration.md +17 -0
- package/systems/5e/world/topics/Guardian of Faith.md +14 -0
- package/systems/5e/world/topics/Guards and Wards.md +34 -0
- package/systems/5e/world/topics/Guidance.md +13 -0
- package/systems/5e/world/topics/Guiding Bolt.md +14 -0
- package/systems/5e/world/topics/Gust of Wind.md +19 -0
- package/systems/5e/world/topics/Hallow.md +36 -0
- package/systems/5e/world/topics/Hallucinatory Terrain.md +14 -0
- package/systems/5e/world/topics/Harm.md +12 -0
- package/systems/5e/world/topics/Haste.md +15 -0
- package/systems/5e/world/topics/Heal.md +14 -0
- package/systems/5e/world/topics/Healing Word.md +14 -0
- package/systems/5e/world/topics/Heat Metal.md +17 -0
- package/systems/5e/world/topics/Hellish Rebuke.md +14 -0
- package/systems/5e/world/topics/Heroes' Feast.md +14 -0
- package/systems/5e/world/topics/Heroism.md +15 -0
- package/systems/5e/world/topics/Hideous Laughter.md +15 -0
- package/systems/5e/world/topics/Hold Monster.md +15 -0
- package/systems/5e/world/topics/Hold Person.md +15 -0
- package/systems/5e/world/topics/Holy Aura.md +13 -0
- package/systems/5e/world/topics/Hunter's Mark.md +15 -0
- package/systems/5e/world/topics/Hunter.md +41 -0
- package/systems/5e/world/topics/Hypnotic Pattern.md +15 -0
- package/systems/5e/world/topics/Ice Storm.md +16 -0
- package/systems/5e/world/topics/Identify.md +15 -0
- package/systems/5e/world/topics/Illusory Script.md +19 -0
- package/systems/5e/world/topics/Imprisonment.md +38 -0
- package/systems/5e/world/topics/Incendiary Cloud.md +17 -0
- package/systems/5e/world/topics/Inflict Wounds.md +14 -0
- package/systems/5e/world/topics/Insect Plague.md +17 -0
- package/systems/5e/world/topics/Instant Summons.md +19 -0
- package/systems/5e/world/topics/Invisibility.md +15 -0
- package/systems/5e/world/topics/Irresistible Dance.md +15 -0
- package/systems/5e/world/topics/Jump.md +12 -0
- package/systems/5e/world/topics/Knock.md +18 -0
- package/systems/5e/world/topics/Legend Lore.md +14 -0
- package/systems/5e/world/topics/Lesser Restoration.md +12 -0
- package/systems/5e/world/topics/Levitate.md +17 -0
- package/systems/5e/world/topics/Life Domain.md +38 -0
- package/systems/5e/world/topics/Light.md +14 -0
- package/systems/5e/world/topics/Lightning Bolt.md +16 -0
- package/systems/5e/world/topics/Locate Animals or Plants.md +13 -0
- package/systems/5e/world/topics/Locate Creature.md +17 -0
- package/systems/5e/world/topics/Locate Object.md +17 -0
- package/systems/5e/world/topics/Longstrider.md +14 -0
- package/systems/5e/world/topics/Mage Armor.md +12 -0
- package/systems/5e/world/topics/Mage Hand.md +16 -0
- package/systems/5e/world/topics/Magic Circle.md +22 -0
- package/systems/5e/world/topics/Magic Jar.md +24 -0
- package/systems/5e/world/topics/Magic Missile.md +14 -0
- package/systems/5e/world/topics/Magic Mouth.md +17 -0
- package/systems/5e/world/topics/Magic Weapon.md +15 -0
- package/systems/5e/world/topics/Magnificent Mansion.md +16 -0
- package/systems/5e/world/topics/Major Image.md +19 -0
- package/systems/5e/world/topics/Mass Cure Wounds.md +14 -0
- package/systems/5e/world/topics/Mass Heal.md +12 -0
- package/systems/5e/world/topics/Mass Healing Word.md +14 -0
- package/systems/5e/world/topics/Mass Suggestion.md +20 -0
- package/systems/5e/world/topics/Maze.md +17 -0
- package/systems/5e/world/topics/Meld into Stone.md +17 -0
- package/systems/5e/world/topics/Mending.md +14 -0
- package/systems/5e/world/topics/Message.md +14 -0
- package/systems/5e/world/topics/Meteor Swarm.md +14 -0
- package/systems/5e/world/topics/Mind Blank.md +12 -0
- package/systems/5e/world/topics/Minor Illusion.md +18 -0
- package/systems/5e/world/topics/Mirage Arcane.md +18 -0
- package/systems/5e/world/topics/Mirror Image.md +20 -0
- package/systems/5e/world/topics/Mislead.md +17 -0
- package/systems/5e/world/topics/Misty Step.md +12 -0
- package/systems/5e/world/topics/Modify Memory.md +23 -0
- package/systems/5e/world/topics/Monk.md +153 -0
- package/systems/5e/world/topics/Moonbeam.md +21 -0
- package/systems/5e/world/topics/Move Earth.md +21 -0
- package/systems/5e/world/topics/Nondetection.md +12 -0
- package/systems/5e/world/topics/Oath of Devotion.md +62 -0
- package/systems/5e/world/topics/Paladin Spells.md +51 -0
- package/systems/5e/world/topics/Paladin.md +173 -0
- package/systems/5e/world/topics/Pass without Trace.md +13 -0
- package/systems/5e/world/topics/Passwall.md +14 -0
- package/systems/5e/world/topics/Path of the Berserker.md +21 -0
- package/systems/5e/world/topics/Phantasmal Killer.md +15 -0
- package/systems/5e/world/topics/Phantom Steed.md +15 -0
- package/systems/5e/world/topics/Planar Ally.md +22 -0
- package/systems/5e/world/topics/Planar Binding.md +16 -0
- package/systems/5e/world/topics/Plane Shift.md +16 -0
- package/systems/5e/world/topics/Plant Growth.md +18 -0
- package/systems/5e/world/topics/Poison Spray.md +14 -0
- package/systems/5e/world/topics/Polymorph.md +21 -0
- package/systems/5e/world/topics/Power Word Kill.md +12 -0
- package/systems/5e/world/topics/Power Word Stun.md +14 -0
- package/systems/5e/world/topics/Prayer of Healing.md +14 -0
- package/systems/5e/world/topics/Prestidigitation.md +21 -0
- package/systems/5e/world/topics/Prismatic Spray.md +28 -0
- package/systems/5e/world/topics/Prismatic Wall.md +34 -0
- package/systems/5e/world/topics/Private Sanctum.md +25 -0
- package/systems/5e/world/topics/Produce Flame.md +16 -0
- package/systems/5e/world/topics/Programmed Illusion.md +18 -0
- package/systems/5e/world/topics/Project Image.md +19 -0
- package/systems/5e/world/topics/Protection from Energy.md +13 -0
- package/systems/5e/world/topics/Protection from Evil and Good.md +15 -0
- package/systems/5e/world/topics/Protection from Poison.md +14 -0
- package/systems/5e/world/topics/Purify Food and Drink.md +13 -0
- package/systems/5e/world/topics/Raise Dead.md +18 -0
- package/systems/5e/world/topics/Ranger Spells.md +57 -0
- package/systems/5e/world/topics/Ranger.md +162 -0
- package/systems/5e/world/topics/Ray of Enfeeblement.md +15 -0
- package/systems/5e/world/topics/Ray of Frost.md +14 -0
- package/systems/5e/world/topics/Regenerate.md +14 -0
- package/systems/5e/world/topics/Reincarnate.md +33 -0
- package/systems/5e/world/topics/Remove Curse.md +12 -0
- package/systems/5e/world/topics/Resilient Sphere.md +19 -0
- package/systems/5e/world/topics/Resistance.md +13 -0
- package/systems/5e/world/topics/Resurrection.md +20 -0
- package/systems/5e/world/topics/Reverse Gravity.md +17 -0
- package/systems/5e/world/topics/Revivify.md +12 -0
- package/systems/5e/world/topics/Rogue.md +114 -0
- package/systems/5e/world/topics/Rope Trick.md +18 -0
- package/systems/5e/world/topics/Sacred Flame.md +14 -0
- package/systems/5e/world/topics/Sanctuary.md +14 -0
- package/systems/5e/world/topics/School of Evocation.md +24 -0
- package/systems/5e/world/topics/Scorching Ray.md +16 -0
- package/systems/5e/world/topics/Scrying.md +31 -0
- package/systems/5e/world/topics/Secret Chest.md +16 -0
- package/systems/5e/world/topics/See Invisibility.md +12 -0
- package/systems/5e/world/topics/Seeming.md +18 -0
- package/systems/5e/world/topics/Sending.md +14 -0
- package/systems/5e/world/topics/Sequester.md +16 -0
- package/systems/5e/world/topics/Shapechange.md +23 -0
- package/systems/5e/world/topics/Shatter.md +16 -0
- package/systems/5e/world/topics/Shield (spell).md +13 -0
- package/systems/5e/world/topics/Shield of Faith.md +13 -0
- package/systems/5e/world/topics/Shillelagh.md +12 -0
- package/systems/5e/world/topics/Shocking Grasp.md +14 -0
- package/systems/5e/world/topics/Silence.md +14 -0
- package/systems/5e/world/topics/Silent Image.md +17 -0
- package/systems/5e/world/topics/Simulacrum.md +18 -0
- package/systems/5e/world/topics/Sleep.md +18 -0
- package/systems/5e/world/topics/Sleet Storm.md +17 -0
- package/systems/5e/world/topics/Slow.md +19 -0
- package/systems/5e/world/topics/Sorcerer Spells.md +155 -0
- package/systems/5e/world/topics/Sorcerer.md +166 -0
- package/systems/5e/world/topics/Spare the Dying.md +12 -0
- package/systems/5e/world/topics/Speak with Animals.md +13 -0
- package/systems/5e/world/topics/Speak with Dead.md +14 -0
- package/systems/5e/world/topics/Speak with Plants.md +20 -0
- package/systems/5e/world/topics/Spider Climb.md +13 -0
- package/systems/5e/world/topics/Spike Growth.md +15 -0
- package/systems/5e/world/topics/Spirit Guardians.md +17 -0
- package/systems/5e/world/topics/Spiritual Weapon.md +18 -0
- package/systems/5e/world/topics/Stinking Cloud.md +17 -0
- package/systems/5e/world/topics/Stone Shape.md +12 -0
- package/systems/5e/world/topics/Stoneskin.md +13 -0
- package/systems/5e/world/topics/Storm of Vengeance.md +23 -0
- package/systems/5e/world/topics/Suggestion.md +19 -0
- package/systems/5e/world/topics/Sunbeam.md +17 -0
- package/systems/5e/world/topics/Sunburst.md +16 -0
- package/systems/5e/world/topics/Symbol.md +36 -0
- package/systems/5e/world/topics/Telekinesis.md +23 -0
- package/systems/5e/world/topics/Telepathic Bond.md +15 -0
- package/systems/5e/world/topics/Teleport.md +38 -0
- package/systems/5e/world/topics/Teleportation Circle.md +16 -0
- package/systems/5e/world/topics/Thaumaturgy.md +21 -0
- package/systems/5e/world/topics/The Fiend.md +47 -0
- package/systems/5e/world/topics/Thief.md +24 -0
- package/systems/5e/world/topics/Thunderwave.md +16 -0
- package/systems/5e/world/topics/Time Stop.md +14 -0
- package/systems/5e/world/topics/Tiny Hut.md +17 -0
- package/systems/5e/world/topics/Tongues.md +12 -0
- package/systems/5e/world/topics/Transport via Plants.md +12 -0
- package/systems/5e/world/topics/Tree Stride.md +15 -0
- package/systems/5e/world/topics/True Polymorph.md +29 -0
- package/systems/5e/world/topics/True Resurrection.md +16 -0
- package/systems/5e/world/topics/True Seeing.md +12 -0
- package/systems/5e/world/topics/True Strike.md +13 -0
- package/systems/5e/world/topics/Unseen Servant.md +17 -0
- package/systems/5e/world/topics/Vampiric Touch.md +15 -0
- package/systems/5e/world/topics/Vicious Mockery.md +14 -0
- package/systems/5e/world/topics/Wall of Fire.md +19 -0
- package/systems/5e/world/topics/Wall of Force.md +15 -0
- package/systems/5e/world/topics/Wall of Ice.md +19 -0
- package/systems/5e/world/topics/Wall of Stone.md +23 -0
- package/systems/5e/world/topics/Wall of Thorns.md +19 -0
- package/systems/5e/world/topics/Warding Bond.md +14 -0
- package/systems/5e/world/topics/Warlock Spells.md +99 -0
- package/systems/5e/world/topics/Warlock.md +283 -0
- package/systems/5e/world/topics/Water Breathing.md +13 -0
- package/systems/5e/world/topics/Water Walk.md +15 -0
- package/systems/5e/world/topics/Way of the Open Hand.md +25 -0
- package/systems/5e/world/topics/Web.md +21 -0
- package/systems/5e/world/topics/Weird.md +13 -0
- package/systems/5e/world/topics/Wind Walk.md +14 -0
- package/systems/5e/world/topics/Wind Wall.md +17 -0
- package/systems/5e/world/topics/Wish.md +26 -0
- package/systems/5e/world/topics/Wizard Spells.md +239 -0
- package/systems/5e/world/topics/Wizard.md +141 -0
- package/systems/5e/world/topics/Word of Recall.md +14 -0
- package/systems/5e/world/topics/Zone of Truth.md +14 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Term } from "./notation.ts";
|
|
2
|
+
export interface Die {
|
|
3
|
+
/** Final value; with compounding explosions, the sum of its faces. */
|
|
4
|
+
value: number;
|
|
5
|
+
/** Faces that make up the value: more than one only with compounding explosions. */
|
|
6
|
+
faces: number[];
|
|
7
|
+
/** The face this die showed before its reroll. */
|
|
8
|
+
rerolledFrom?: number;
|
|
9
|
+
dropped?: boolean;
|
|
10
|
+
success?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface TermResult {
|
|
13
|
+
term: Term;
|
|
14
|
+
dice: Die[];
|
|
15
|
+
total: number;
|
|
16
|
+
}
|
|
17
|
+
export interface RollBreakdown {
|
|
18
|
+
total: number;
|
|
19
|
+
terms: TermResult[];
|
|
20
|
+
}
|
|
21
|
+
/** Returns the next face of a die with the given sides. */
|
|
22
|
+
export type NextFace = (sides: number | "F") => number;
|
|
23
|
+
export declare function evaluateTerms(terms: Term[], nextFace: NextFace): RollBreakdown;
|
|
24
|
+
export declare function digitalFaces(random: (sides: number) => number): NextFace;
|
|
25
|
+
/** Faces from the values the player rolled, used in order: impossible or missing values are errors. */
|
|
26
|
+
export declare function physicalFaces(values: number[]): {
|
|
27
|
+
nextFace: NextFace;
|
|
28
|
+
unusedCount(): number;
|
|
29
|
+
};
|
|
30
|
+
export declare function dieName(sides: number | "F"): string;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { DiceError, matches } from "./notation.js";
|
|
2
|
+
const maxExplosions = 100;
|
|
3
|
+
export function evaluateTerms(terms, nextFace) {
|
|
4
|
+
const results = terms.map((term) => {
|
|
5
|
+
return term.kind === "constant" ? { term, dice: [], total: term.sign * term.value } : rollDiceTerm(term, nextFace);
|
|
6
|
+
});
|
|
7
|
+
return { total: results.reduce((sum, result) => sum + result.total, 0), terms: results };
|
|
8
|
+
}
|
|
9
|
+
export function digitalFaces(random) {
|
|
10
|
+
return (sides) => (sides === "F" ? random(3) - 2 : random(sides));
|
|
11
|
+
}
|
|
12
|
+
/** Faces from the values the player rolled, used in order: impossible or missing values are errors. */
|
|
13
|
+
export function physicalFaces(values) {
|
|
14
|
+
let usedCount = 0;
|
|
15
|
+
return {
|
|
16
|
+
nextFace(sides) {
|
|
17
|
+
if (usedCount >= values.length) {
|
|
18
|
+
throw new DiceError(`The roll needs one more ${dieName(sides)}, for a reroll or an explosion: ask the player to roll it.`);
|
|
19
|
+
}
|
|
20
|
+
const value = values[usedCount++];
|
|
21
|
+
const [lowest, highest] = sides === "F" ? [-1, 1] : [1, sides];
|
|
22
|
+
if (!Number.isInteger(value) || value < lowest || value > highest) {
|
|
23
|
+
throw new DiceError(`Impossible value ${value} on a ${dieName(sides)}: ask the player to roll it again.`);
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
},
|
|
27
|
+
unusedCount: () => values.length - usedCount,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function dieName(sides) {
|
|
31
|
+
return sides === "F" ? "Fudge die" : `d${sides}`;
|
|
32
|
+
}
|
|
33
|
+
function rollDiceTerm(term, nextFace) {
|
|
34
|
+
const dice = [];
|
|
35
|
+
let explosionCount = 0;
|
|
36
|
+
for (let index = 0; index < term.count; index++) {
|
|
37
|
+
const firstFace = nextFace(term.sides);
|
|
38
|
+
const die = { value: firstFace, faces: [firstFace] };
|
|
39
|
+
if (term.rerollOnce && matches(term.rerollOnce, firstFace)) {
|
|
40
|
+
const rerolledFace = nextFace(term.sides);
|
|
41
|
+
die.value = rerolledFace;
|
|
42
|
+
die.faces = [rerolledFace];
|
|
43
|
+
die.rerolledFrom = firstFace;
|
|
44
|
+
}
|
|
45
|
+
dice.push(die);
|
|
46
|
+
if (!term.explode) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
let lastFace = die.value;
|
|
50
|
+
while (matches(term.explode.condition, lastFace)) {
|
|
51
|
+
if (++explosionCount > maxExplosions) {
|
|
52
|
+
throw new DiceError("Too many explosions in a single roll.");
|
|
53
|
+
}
|
|
54
|
+
lastFace = nextFace(term.sides);
|
|
55
|
+
if (term.explode.compound) {
|
|
56
|
+
die.faces.push(lastFace);
|
|
57
|
+
die.value += lastFace;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
dice.push({ value: lastFace, faces: [lastFace] });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (term.keep || term.drop) {
|
|
65
|
+
markDropped(dice, term);
|
|
66
|
+
}
|
|
67
|
+
const keptDice = dice.filter((die) => !die.dropped);
|
|
68
|
+
if (term.success) {
|
|
69
|
+
for (const die of keptDice) {
|
|
70
|
+
die.success = matches(term.success, die.value);
|
|
71
|
+
}
|
|
72
|
+
return { term, dice, total: term.sign * keptDice.filter((die) => die.success).length };
|
|
73
|
+
}
|
|
74
|
+
return { term, dice, total: term.sign * keptDice.reduce((sum, die) => sum + die.value, 0) };
|
|
75
|
+
}
|
|
76
|
+
function markDropped(dice, term) {
|
|
77
|
+
const indexesByValue = dice.map((_, index) => index).sort((left, right) => dice[left].value - dice[right].value || left - right);
|
|
78
|
+
let droppedIndexes;
|
|
79
|
+
if (term.keep) {
|
|
80
|
+
const keepCount = Math.min(term.keep.count, dice.length);
|
|
81
|
+
droppedIndexes = term.keep.which === "highest" ? indexesByValue.slice(0, dice.length - keepCount) : indexesByValue.slice(keepCount);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const dropCount = Math.min(term.drop.count, dice.length);
|
|
85
|
+
droppedIndexes = term.drop.which === "lowest" ? indexesByValue.slice(0, dropCount) : indexesByValue.slice(dice.length - dropCount);
|
|
86
|
+
}
|
|
87
|
+
for (const index of droppedIndexes) {
|
|
88
|
+
dice[index].dropped = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** One line such as `2d20kh1+5 = 19 [14, (7)] + 5`: dropped dice in parentheses, rerolls `1->6`, successes `8*`. */
|
|
2
|
+
export function formatRoll(notation, breakdown) {
|
|
3
|
+
const termTexts = breakdown.terms.map((termResult, index) => {
|
|
4
|
+
const sign = termResult.term.sign < 0 ? "- " : index === 0 ? "" : "+ ";
|
|
5
|
+
if (termResult.term.kind === "constant") {
|
|
6
|
+
return sign + termResult.term.value;
|
|
7
|
+
}
|
|
8
|
+
const isFudge = termResult.term.sides === "F";
|
|
9
|
+
return sign + "[" + termResult.dice.map((die) => formatDie(die, isFudge)).join(", ") + "]";
|
|
10
|
+
});
|
|
11
|
+
const countsSuccesses = breakdown.terms.some((termResult) => termResult.term.kind === "dice" && termResult.term.success);
|
|
12
|
+
return `${notation} = ${breakdown.total}${countsSuccesses ? " successes" : ""} ${termTexts.join(" ")}`;
|
|
13
|
+
}
|
|
14
|
+
function formatDie(die, isFudge) {
|
|
15
|
+
let dieText = isFudge ? fudgeSymbol(die.value) : die.faces.join("+");
|
|
16
|
+
if (die.rerolledFrom !== undefined) {
|
|
17
|
+
dieText = `${isFudge ? fudgeSymbol(die.rerolledFrom) : die.rerolledFrom}->${dieText}`;
|
|
18
|
+
}
|
|
19
|
+
if (die.success) {
|
|
20
|
+
dieText += "*";
|
|
21
|
+
}
|
|
22
|
+
return die.dropped ? `(${dieText})` : dieText;
|
|
23
|
+
}
|
|
24
|
+
function fudgeSymbol(value) {
|
|
25
|
+
return value > 0 ? "+" : value < 0 ? "-" : "0";
|
|
26
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { DiceError, parseNotation } from "./notation.ts";
|
|
2
|
+
export { createProof, fingerprint, sha256 } from "./proof.ts";
|
|
3
|
+
export { type DiceRoll, type FaceSource, rollDice, type ThrownDie } from "./roll-dice.ts";
|
|
4
|
+
export { type NotationPart, notationParts } from "./words.ts";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Dice for any game: notation, digital or physical faces, proofs for hidden rolls. Depends on nothing else in rpg-engine.
|
|
2
|
+
export { DiceError, parseNotation } from "./notation.js";
|
|
3
|
+
export { createProof, fingerprint, sha256 } from "./proof.js";
|
|
4
|
+
export { rollDice } from "./roll-dice.js";
|
|
5
|
+
export { notationParts } from "./words.js";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** A comparison against a die face, such as `>=8` or `=1`. */
|
|
2
|
+
export interface Condition {
|
|
3
|
+
operator: "=" | "<" | "<=" | ">" | ">=";
|
|
4
|
+
value: number;
|
|
5
|
+
}
|
|
6
|
+
export interface DiceTerm {
|
|
7
|
+
kind: "dice";
|
|
8
|
+
sign: 1 | -1;
|
|
9
|
+
count: number;
|
|
10
|
+
/** Number of faces, or "F" for Fudge dice (-1, 0, +1). */
|
|
11
|
+
sides: number | "F";
|
|
12
|
+
/** Reroll a die once when it matches (`ro<=2`). */
|
|
13
|
+
rerollOnce?: Condition;
|
|
14
|
+
/** Roll an extra die when a die matches (`!`), or add it to the same die (`!!`). */
|
|
15
|
+
explode?: {
|
|
16
|
+
condition: Condition;
|
|
17
|
+
compound: boolean;
|
|
18
|
+
};
|
|
19
|
+
keep?: {
|
|
20
|
+
which: "highest" | "lowest";
|
|
21
|
+
count: number;
|
|
22
|
+
};
|
|
23
|
+
drop?: {
|
|
24
|
+
which: "highest" | "lowest";
|
|
25
|
+
count: number;
|
|
26
|
+
};
|
|
27
|
+
/** Count the dice that match instead of adding them up (`>=8`). */
|
|
28
|
+
success?: Condition;
|
|
29
|
+
}
|
|
30
|
+
export interface ConstantTerm {
|
|
31
|
+
kind: "constant";
|
|
32
|
+
sign: 1 | -1;
|
|
33
|
+
value: number;
|
|
34
|
+
}
|
|
35
|
+
export type Term = DiceTerm | ConstantTerm;
|
|
36
|
+
/** A dice error the user or the AI can fix: its message says how. */
|
|
37
|
+
export declare class DiceError extends Error {
|
|
38
|
+
}
|
|
39
|
+
/** Reads a notation valid for any game, such as `1d20+5`, `2d20kh1`, `4d6dl1`, `2d6ro<=2`, `1d6!`, `6d10>=8`, `4dF`, `d%`. */
|
|
40
|
+
export declare function parseNotation(notation: string): Term[];
|
|
41
|
+
/** How many dice the roll needs at least, before rerolls and explosions. */
|
|
42
|
+
export declare function minimumDice(terms: Term[]): number;
|
|
43
|
+
export declare function matches(condition: Condition, face: number): boolean;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/** A dice error the user or the AI can fix: its message says how. */
|
|
2
|
+
export class DiceError extends Error {
|
|
3
|
+
}
|
|
4
|
+
const maxTerms = 20;
|
|
5
|
+
const maxDice = 100;
|
|
6
|
+
const maxSides = 1000;
|
|
7
|
+
const conditionPattern = /^(<=|>=|<|>|=)(\d+)/;
|
|
8
|
+
/** Reads a notation valid for any game, such as `1d20+5`, `2d20kh1`, `4d6dl1`, `2d6ro<=2`, `1d6!`, `6d10>=8`, `4dF`, `d%`. */
|
|
9
|
+
export function parseNotation(notation) {
|
|
10
|
+
const compact = notation.replace(/\s+/g, "");
|
|
11
|
+
if (compact === "") {
|
|
12
|
+
throw new DiceError("The dice notation is empty.");
|
|
13
|
+
}
|
|
14
|
+
const signedTerms = compact.match(/[+-]?[^+-]+/g) ?? [];
|
|
15
|
+
if (signedTerms.join("") !== compact) {
|
|
16
|
+
throw new DiceError(`Cannot read "${notation}".`);
|
|
17
|
+
}
|
|
18
|
+
if (signedTerms.length > maxTerms) {
|
|
19
|
+
throw new DiceError(`Too many terms in "${notation}" (at most ${maxTerms}).`);
|
|
20
|
+
}
|
|
21
|
+
return signedTerms.map((signedTerm) => parseTerm(signedTerm, notation));
|
|
22
|
+
}
|
|
23
|
+
/** How many dice the roll needs at least, before rerolls and explosions. */
|
|
24
|
+
export function minimumDice(terms) {
|
|
25
|
+
return terms.reduce((sum, term) => sum + (term.kind === "dice" ? term.count : 0), 0);
|
|
26
|
+
}
|
|
27
|
+
export function matches(condition, face) {
|
|
28
|
+
switch (condition.operator) {
|
|
29
|
+
case "=":
|
|
30
|
+
return face === condition.value;
|
|
31
|
+
case "<":
|
|
32
|
+
return face < condition.value;
|
|
33
|
+
case "<=":
|
|
34
|
+
return face <= condition.value;
|
|
35
|
+
case ">":
|
|
36
|
+
return face > condition.value;
|
|
37
|
+
case ">=":
|
|
38
|
+
return face >= condition.value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function parseTerm(signedTerm, notation) {
|
|
42
|
+
const sign = signedTerm.startsWith("-") ? -1 : 1;
|
|
43
|
+
const termText = signedTerm.replace(/^[+-]/, "");
|
|
44
|
+
if (/^\d+$/.test(termText)) {
|
|
45
|
+
return { kind: "constant", sign, value: Number(termText) };
|
|
46
|
+
}
|
|
47
|
+
const match = /^(\d*)d(\d+|%|F)(.*)$/i.exec(termText);
|
|
48
|
+
if (!match) {
|
|
49
|
+
throw new DiceError(`Cannot read "${termText}" in "${notation}".`);
|
|
50
|
+
}
|
|
51
|
+
const [, countText, sidesText, modifiers] = match;
|
|
52
|
+
const count = countText === "" ? 1 : Number(countText);
|
|
53
|
+
const sides = sidesText.toUpperCase() === "F" ? "F" : sidesText === "%" ? 100 : Number(sidesText);
|
|
54
|
+
if (count < 1 || count > maxDice) {
|
|
55
|
+
throw new DiceError(`"${termText}": roll between 1 and ${maxDice} dice.`);
|
|
56
|
+
}
|
|
57
|
+
if (sides !== "F" && (sides < 2 || sides > maxSides)) {
|
|
58
|
+
throw new DiceError(`"${termText}": a die has between 2 and ${maxSides} faces.`);
|
|
59
|
+
}
|
|
60
|
+
const term = { kind: "dice", sign, count, sides };
|
|
61
|
+
if (modifiers !== "") {
|
|
62
|
+
if (sides === "F") {
|
|
63
|
+
throw new DiceError(`"${termText}": Fudge dice take no modifiers.`);
|
|
64
|
+
}
|
|
65
|
+
parseModifiers(modifiers, term, termText);
|
|
66
|
+
}
|
|
67
|
+
return term;
|
|
68
|
+
}
|
|
69
|
+
function parseModifiers(modifiers, term, termText) {
|
|
70
|
+
let remaining = modifiers;
|
|
71
|
+
while (remaining !== "") {
|
|
72
|
+
let match;
|
|
73
|
+
if ((match = /^ro(<=|>=|<|>|=)?(\d+)/i.exec(remaining))) {
|
|
74
|
+
if (term.rerollOnce) {
|
|
75
|
+
throw duplicateModifier(termText, "reroll");
|
|
76
|
+
}
|
|
77
|
+
term.rerollOnce = toCondition(match[1] ?? "=", match[2]);
|
|
78
|
+
}
|
|
79
|
+
else if ((match = /^(!!?)(?:(<=|>=|<|>|=)(\d+))?/.exec(remaining))) {
|
|
80
|
+
if (term.explode) {
|
|
81
|
+
throw duplicateModifier(termText, "explosion");
|
|
82
|
+
}
|
|
83
|
+
const explodeOn = match[2] ? toCondition(match[2], match[3]) : { operator: "=", value: term.sides };
|
|
84
|
+
if (everyFaceMatches(explodeOn, term.sides)) {
|
|
85
|
+
throw new DiceError(`"${termText}": the dice would explode forever.`);
|
|
86
|
+
}
|
|
87
|
+
term.explode = { condition: explodeOn, compound: match[1] === "!!" };
|
|
88
|
+
}
|
|
89
|
+
else if ((match = /^k([hl]?)(\d*)/i.exec(remaining))) {
|
|
90
|
+
if (term.keep || term.drop) {
|
|
91
|
+
throw duplicateModifier(termText, "keep or drop");
|
|
92
|
+
}
|
|
93
|
+
term.keep = { which: match[1].toLowerCase() === "l" ? "lowest" : "highest", count: match[2] === "" ? 1 : Number(match[2]) };
|
|
94
|
+
if (term.keep.count < 1 || term.keep.count > term.count) {
|
|
95
|
+
throw new DiceError(`"${termText}": keep between 1 and ${term.count} dice.`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if ((match = /^d([hl])(\d*)/i.exec(remaining))) {
|
|
99
|
+
if (term.keep || term.drop) {
|
|
100
|
+
throw duplicateModifier(termText, "keep or drop");
|
|
101
|
+
}
|
|
102
|
+
term.drop = { which: match[1].toLowerCase() === "l" ? "lowest" : "highest", count: match[2] === "" ? 1 : Number(match[2]) };
|
|
103
|
+
if (term.drop.count < 1 || term.drop.count >= term.count) {
|
|
104
|
+
throw new DiceError(`"${termText}": drop between 1 and ${term.count - 1} dice.`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if ((match = conditionPattern.exec(remaining))) {
|
|
108
|
+
if (term.success) {
|
|
109
|
+
throw duplicateModifier(termText, "success");
|
|
110
|
+
}
|
|
111
|
+
term.success = toCondition(match[1], match[2]);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
throw new DiceError(`"${termText}": unknown modifier "${remaining}".`);
|
|
115
|
+
}
|
|
116
|
+
remaining = remaining.slice(match[0].length);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function toCondition(operator, value) {
|
|
120
|
+
return { operator: operator, value: Number(value) };
|
|
121
|
+
}
|
|
122
|
+
function everyFaceMatches(condition, sides) {
|
|
123
|
+
for (let face = 1; face <= sides; face++) {
|
|
124
|
+
if (!matches(condition, face)) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
function duplicateModifier(termText, modifier) {
|
|
131
|
+
return new DiceError(`"${termText}": only one ${modifier} modifier per die.`);
|
|
132
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** The text a hidden roll commits to: once revealed, its SHA-256 must start with the fingerprint shown before. */
|
|
2
|
+
export declare function createProof(rollId: string, rollText: string, salt: string): string;
|
|
3
|
+
export declare function sha256(text: string): string;
|
|
4
|
+
export declare function fingerprint(proof: string): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
const fingerprintLength = 16;
|
|
3
|
+
/** The text a hidden roll commits to: once revealed, its SHA-256 must start with the fingerprint shown before. */
|
|
4
|
+
export function createProof(rollId, rollText, salt) {
|
|
5
|
+
return `${rollId}|${rollText}|${salt}`;
|
|
6
|
+
}
|
|
7
|
+
export function sha256(text) {
|
|
8
|
+
return createHash("sha256").update(text, "utf8").digest("hex");
|
|
9
|
+
}
|
|
10
|
+
export function fingerprint(proof) {
|
|
11
|
+
return sha256(proof).slice(0, fingerprintLength);
|
|
12
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Where the faces come from: the digital generator, or the faces the player rolled with physical dice. */
|
|
2
|
+
export type FaceSource = {
|
|
3
|
+
random(sides: number): number;
|
|
4
|
+
} | {
|
|
5
|
+
values: number[];
|
|
6
|
+
};
|
|
7
|
+
export interface DiceRoll {
|
|
8
|
+
notation: string;
|
|
9
|
+
total: number;
|
|
10
|
+
/** One line such as `2d20kh1+5 = 19 [14, (7)] + 5`. */
|
|
11
|
+
text: string;
|
|
12
|
+
/** The value of each die, in order, dropped ones included: what a roll kept for later holds (KEP-2). */
|
|
13
|
+
faces: number[];
|
|
14
|
+
/** Each die as it was thrown, for who shows the throw (D-279). */
|
|
15
|
+
dice: ThrownDie[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A die as it was thrown: its sides, the face it shows, the faces that add up on it with explosions, the face it showed before a reroll, and whether it was
|
|
19
|
+
* dropped or is a success.
|
|
20
|
+
*/
|
|
21
|
+
export interface ThrownDie {
|
|
22
|
+
sides: number | "F";
|
|
23
|
+
value: number;
|
|
24
|
+
faces?: number[];
|
|
25
|
+
rerolledFrom?: number;
|
|
26
|
+
dropped?: boolean;
|
|
27
|
+
success?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function rollDice(notation: string, source: FaceSource): DiceRoll;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { dieName, digitalFaces, evaluateTerms, physicalFaces } from "./evaluate.js";
|
|
2
|
+
import { formatRoll } from "./format.js";
|
|
3
|
+
import { DiceError, minimumDice, parseNotation } from "./notation.js";
|
|
4
|
+
export function rollDice(notation, source) {
|
|
5
|
+
const terms = parseNotation(notation);
|
|
6
|
+
const breakdown = "values" in source ? rollPhysical(terms, source.values) : evaluateTerms(terms, digitalFaces(source.random));
|
|
7
|
+
return {
|
|
8
|
+
notation,
|
|
9
|
+
total: breakdown.total,
|
|
10
|
+
text: formatRoll(notation, breakdown),
|
|
11
|
+
faces: breakdown.terms.flatMap((term) => term.dice.map((die) => die.value)),
|
|
12
|
+
dice: breakdown.terms.flatMap((result) => {
|
|
13
|
+
const term = result.term;
|
|
14
|
+
return term.kind === "dice" ? result.dice.map((die) => thrownDie(term.sides, die)) : [];
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function rollPhysical(terms, values) {
|
|
19
|
+
const neededCount = minimumDice(terms);
|
|
20
|
+
if (values.length < neededCount) {
|
|
21
|
+
throw new DiceError(`This roll needs at least ${neededCount} values (${describeDice(terms)}), but ${values.length} were given.`);
|
|
22
|
+
}
|
|
23
|
+
const faces = physicalFaces(values);
|
|
24
|
+
const breakdown = evaluateTerms(terms, faces.nextFace);
|
|
25
|
+
const unusedCount = faces.unusedCount();
|
|
26
|
+
if (unusedCount > 0) {
|
|
27
|
+
throw new DiceError(`Too many values: ${values.length} given, but the roll used ${values.length - unusedCount}.`);
|
|
28
|
+
}
|
|
29
|
+
return breakdown;
|
|
30
|
+
}
|
|
31
|
+
function describeDice(terms) {
|
|
32
|
+
return terms.flatMap((term) => (term.kind === "dice" ? [`${term.count} ${dieName(term.sides)}`] : [])).join(", ");
|
|
33
|
+
}
|
|
34
|
+
function thrownDie(sides, die) {
|
|
35
|
+
return {
|
|
36
|
+
sides,
|
|
37
|
+
value: die.value,
|
|
38
|
+
...(die.faces.length > 1 ? { faces: die.faces } : {}),
|
|
39
|
+
...(die.rerolledFrom === undefined ? {} : { rerolledFrom: die.rerolledFrom }),
|
|
40
|
+
...(die.dropped === true ? { dropped: true } : {}),
|
|
41
|
+
...(die.success === undefined ? {} : { success: die.success }),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type DiceTerm } from "./notation.ts";
|
|
2
|
+
/** A part of a notation as the dashboard writes it in words: dice with what they do past rolling, as 2d20 keeping the highest, or a number added, as +5. */
|
|
3
|
+
export type NotationPart = ({
|
|
4
|
+
dice: string;
|
|
5
|
+
} & Pick<DiceTerm, "keep" | "drop" | "rerollOnce" | "explode" | "success">) | {
|
|
6
|
+
add: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* A notation in parts, for the dashboard to say in words to a player who does not read it (D-292): 2d20kh1+5 is 2d20 keeping the highest, and +5; undefined for
|
|
10
|
+
* a notation that says nothing more than its dice and numbers, as 1d20+2, or that cannot be read.
|
|
11
|
+
*/
|
|
12
|
+
export declare function notationParts(notation: string): NotationPart[] | undefined;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { parseNotation } from "./notation.js";
|
|
2
|
+
/**
|
|
3
|
+
* A notation in parts, for the dashboard to say in words to a player who does not read it (D-292): 2d20kh1+5 is 2d20 keeping the highest, and +5; undefined for
|
|
4
|
+
* a notation that says nothing more than its dice and numbers, as 1d20+2, or that cannot be read.
|
|
5
|
+
*/
|
|
6
|
+
export function notationParts(notation) {
|
|
7
|
+
try {
|
|
8
|
+
const terms = parseNotation(notation);
|
|
9
|
+
const ruled = terms.some((term) => term.kind === "dice" && rules(term).length > 0);
|
|
10
|
+
return ruled
|
|
11
|
+
? terms.map((term) => (term.kind === "constant" ? { add: `${term.sign < 0 ? "−" : "+"}${term.value}` } : { dice: `${term.sign < 0 ? "−" : ""}${term.count}d${term.sides}`, ...Object.fromEntries(rules(term)) }))
|
|
12
|
+
: undefined;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** What a term of dice does past rolling them: keep, drop, reroll, explode, count successes. */
|
|
19
|
+
function rules(term) {
|
|
20
|
+
return ["keep", "drop", "rerollOnce", "explode", "success"].flatMap((rule) => (term[rule] === undefined ? [] : [[rule, term[rule]]]));
|
|
21
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* When an effect ends (EFF-2): at a game date, written as the time module reads it; at the start of someone's turn in a round of the scene;
|
|
3
|
+
* when the scene ends; or at an occasion of the game system, such as long rest, which only its recipe brings (DAT-5).
|
|
4
|
+
*/
|
|
5
|
+
export type EffectEnd = {
|
|
6
|
+
date: string;
|
|
7
|
+
} | {
|
|
8
|
+
round: number;
|
|
9
|
+
turn: string;
|
|
10
|
+
} | {
|
|
11
|
+
scene: true;
|
|
12
|
+
} | {
|
|
13
|
+
occasion: string;
|
|
14
|
+
};
|
|
15
|
+
/** An effect on whoever has it (D-123, D-132): its name, who keeps it alive (D-138), the values it gives for a while, and when it ends, if it does. */
|
|
16
|
+
export interface Effect {
|
|
17
|
+
name: string;
|
|
18
|
+
/** Who keeps it alive, such as a character concentrating on it, as written: a link to a page, or the name of a copy. */
|
|
19
|
+
by?: string;
|
|
20
|
+
/** Temporary values, by field, as written: [["ac", "15"]]. */
|
|
21
|
+
values: [string, string][];
|
|
22
|
+
end?: EffectEnd;
|
|
23
|
+
}
|
|
24
|
+
/** The effect a line of the effects field writes (EFF-1); or why it is not one. */
|
|
25
|
+
export declare function readEffect(line: string): {
|
|
26
|
+
effect: Effect;
|
|
27
|
+
} | {
|
|
28
|
+
problem: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* The effects a field holds: one line, or a list of lines; an empty field holds none. Names are unique on a page (EFF-1).
|
|
32
|
+
* A line written in Obsidian without quotes, which YAML reads as "name (field": "value) until …", is read as the line it was.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readEffects(value: unknown): {
|
|
35
|
+
effects: Effect[];
|
|
36
|
+
} | {
|
|
37
|
+
problem: string;
|
|
38
|
+
};
|
|
39
|
+
/** An effect as its line is written (EFF-1), with who keeps it first among its values. */
|
|
40
|
+
export declare function formatEffect(effect: Effect): string;
|
|
41
|
+
/** An end as written: day 2, 14:20, round 12, Ennio, scene end, or long rest. */
|
|
42
|
+
export declare function formatEnd(end: EffectEnd): string;
|
|
43
|
+
/** How many rounds a duration such as 3 rounds or 1 round gives; undefined for anything else. */
|
|
44
|
+
export declare function readRounds(text: string): number | undefined;
|
|
45
|
+
/** Whether a duration is the scene itself: the effect ends when the scene does. */
|
|
46
|
+
export declare function isSceneDuration(text: string): boolean;
|
|
47
|
+
/** The effects with one added, as the newest: an effect with the same name is replaced (EFF-3, EFF-4). */
|
|
48
|
+
export declare function withEffect(effects: Effect[], effect: Effect): Effect[];
|
|
49
|
+
/** Who keeps an effect alive, by name: [[Lena]] and Lena are the same; undefined when no one does. */
|
|
50
|
+
export declare function keeperOf(effect: Effect): string | undefined;
|
|
51
|
+
/** The effect with this name, ignoring case and how accents are written. */
|
|
52
|
+
export declare function effectNamed(effects: Effect[], name: string): Effect | undefined;
|
|
53
|
+
/** Whether an effect counted in rounds has ended when the turn passes to `turn` in `round` (EFF-9): at its turn in its round, at the start of its round when that one is no longer in the order, a round later anyway. */
|
|
54
|
+
export declare function endsAtTurn(end: {
|
|
55
|
+
round: number;
|
|
56
|
+
turn: string;
|
|
57
|
+
}, round: number, turn: string, order: string[]): boolean;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { comparableText } from "../core/text.js";
|
|
2
|
+
// "Scudo della fede (by: [[Lena]], ac: 15) until day 2, 14:20": a name, values in brackets, an end; the brackets and the end may be missing.
|
|
3
|
+
const linePattern = /^(.+?)(?:\s+\(([^()]*)\))?(?:\s+until\s+(.+))?$/i;
|
|
4
|
+
const roundPattern = /^round\s+(\d{1,9})\s*,\s*(.+)$/i;
|
|
5
|
+
const roundsPattern = /^(\d{1,4})\s*rounds?$/i;
|
|
6
|
+
const sceneEnd = "scene end";
|
|
7
|
+
/** The effect a line of the effects field writes (EFF-1); or why it is not one. */
|
|
8
|
+
export function readEffect(line) {
|
|
9
|
+
const match = linePattern.exec(line.trim());
|
|
10
|
+
if (match === null) {
|
|
11
|
+
return { problem: `"${line}" is not an effect: write its name, then its values in brackets and its end, such as Scudo della fede (ac: 15) until day 2, 14:20.` };
|
|
12
|
+
}
|
|
13
|
+
const [, written, valuesText, endText] = match;
|
|
14
|
+
const values = valuesText === undefined ? [] : readValues(valuesText);
|
|
15
|
+
// Brackets without values belong to the name, as in Forma (orso).
|
|
16
|
+
const name = values === undefined ? `${written} (${valuesText})` : written;
|
|
17
|
+
if (/\buntil\b/i.test(name)) {
|
|
18
|
+
return { problem: `"${line}" has "until" in its name: write the end after the name and the values, such as ${name.replace(/\s*\(?\s*\buntil\b.*$/i, "")} until day 2, 14:20.` };
|
|
19
|
+
}
|
|
20
|
+
const pairs = values ?? [];
|
|
21
|
+
const keeper = pairs.find(([field]) => comparableText(field) === "by");
|
|
22
|
+
const effect = { name, ...(keeper === undefined ? {} : { by: keeper[1] }), values: pairs.filter((pair) => pair !== keeper) };
|
|
23
|
+
return endText === undefined ? { effect } : withEnd(effect, endText);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The effects a field holds: one line, or a list of lines; an empty field holds none. Names are unique on a page (EFF-1).
|
|
27
|
+
* A line written in Obsidian without quotes, which YAML reads as "name (field": "value) until …", is read as the line it was.
|
|
28
|
+
*/
|
|
29
|
+
export function readEffects(value) {
|
|
30
|
+
if (value === undefined || value === null || (typeof value === "string" && value.trim() === "")) {
|
|
31
|
+
return { effects: [] };
|
|
32
|
+
}
|
|
33
|
+
const lines = (Array.isArray(value) ? value : [value]).map(asLine);
|
|
34
|
+
if (lines.some((line) => line === undefined)) {
|
|
35
|
+
return { problem: "effects must be a list of lines of text, such as Scudo della fede (ac: 15) until day 2, 14:20." };
|
|
36
|
+
}
|
|
37
|
+
const effects = [];
|
|
38
|
+
for (const line of lines.filter((text) => text.trim() !== "")) {
|
|
39
|
+
const read = readEffect(line);
|
|
40
|
+
if ("problem" in read) {
|
|
41
|
+
return read;
|
|
42
|
+
}
|
|
43
|
+
if (effects.some((effect) => sameName(effect.name, read.effect.name))) {
|
|
44
|
+
return { problem: `The effect ${read.effect.name} is written twice: keep one.` };
|
|
45
|
+
}
|
|
46
|
+
effects.push(read.effect);
|
|
47
|
+
}
|
|
48
|
+
return { effects };
|
|
49
|
+
}
|
|
50
|
+
/** An effect as its line is written (EFF-1), with who keeps it first among its values. */
|
|
51
|
+
export function formatEffect(effect) {
|
|
52
|
+
const pairs = [...(effect.by === undefined ? [] : [["by", effect.by]]), ...effect.values];
|
|
53
|
+
const values = pairs.length === 0 ? "" : ` (${pairs.map(([field, value]) => `${field}: ${value}`).join(", ")})`;
|
|
54
|
+
return `${effect.name}${values}${effect.end === undefined ? "" : ` until ${formatEnd(effect.end)}`}`;
|
|
55
|
+
}
|
|
56
|
+
/** An end as written: day 2, 14:20, round 12, Ennio, scene end, or long rest. */
|
|
57
|
+
export function formatEnd(end) {
|
|
58
|
+
return "date" in end ? end.date : "round" in end ? `round ${end.round}, ${end.turn}` : "occasion" in end ? end.occasion : sceneEnd;
|
|
59
|
+
}
|
|
60
|
+
/** How many rounds a duration such as 3 rounds or 1 round gives; undefined for anything else. */
|
|
61
|
+
export function readRounds(text) {
|
|
62
|
+
const match = roundsPattern.exec(text.trim());
|
|
63
|
+
const rounds = match === null ? 0 : Number(match[1]);
|
|
64
|
+
return rounds > 0 ? rounds : undefined;
|
|
65
|
+
}
|
|
66
|
+
/** Whether a duration is the scene itself: the effect ends when the scene does. */
|
|
67
|
+
export function isSceneDuration(text) {
|
|
68
|
+
return comparableText(text.trim()) === "scene";
|
|
69
|
+
}
|
|
70
|
+
/** The effects with one added, as the newest: an effect with the same name is replaced (EFF-3, EFF-4). */
|
|
71
|
+
export function withEffect(effects, effect) {
|
|
72
|
+
return [...effects.filter((other) => !sameName(other.name, effect.name)), effect];
|
|
73
|
+
}
|
|
74
|
+
/** Who keeps an effect alive, by name: [[Lena]] and Lena are the same; undefined when no one does. */
|
|
75
|
+
export function keeperOf(effect) {
|
|
76
|
+
return effect.by === undefined ? undefined : pageName(effect.by);
|
|
77
|
+
}
|
|
78
|
+
/** The effect with this name, ignoring case and how accents are written. */
|
|
79
|
+
export function effectNamed(effects, name) {
|
|
80
|
+
return effects.find((effect) => sameName(effect.name, name));
|
|
81
|
+
}
|
|
82
|
+
/** Whether an effect counted in rounds has ended when the turn passes to `turn` in `round` (EFF-9): at its turn in its round, at the start of its round when that one is no longer in the order, a round later anyway. */
|
|
83
|
+
export function endsAtTurn(end, round, turn, order) {
|
|
84
|
+
if (round !== end.round) {
|
|
85
|
+
return round > end.round;
|
|
86
|
+
}
|
|
87
|
+
return sameName(turn, end.turn) || !order.some((name) => sameName(name, end.turn));
|
|
88
|
+
}
|
|
89
|
+
function withEnd(effect, endText) {
|
|
90
|
+
const text = endText.trim();
|
|
91
|
+
if (comparableText(text) === sceneEnd) {
|
|
92
|
+
return { effect: { ...effect, end: { scene: true } } };
|
|
93
|
+
}
|
|
94
|
+
const round = roundPattern.exec(text);
|
|
95
|
+
if (round === null) {
|
|
96
|
+
// A date always has a number in it; an end without one is an occasion, such as long rest (DAT-5).
|
|
97
|
+
return { effect: { ...effect, end: /\d/.test(text) ? { date: text } : { occasion: text } } };
|
|
98
|
+
}
|
|
99
|
+
return Number(round[1]) < 1 ? { problem: `"${endText}" is not an end: rounds start from 1.` } : { effect: { ...effect, end: { round: Number(round[1]), turn: pageName(round[2]) } } };
|
|
100
|
+
}
|
|
101
|
+
/** "ac: 15, speed: 40 ft" as pairs; undefined when the text is not written as values. */
|
|
102
|
+
function readValues(text) {
|
|
103
|
+
const pairs = text.split(/\s*,\s*(?=[^,:]+:)/).map((part) => {
|
|
104
|
+
const separator = part.indexOf(":");
|
|
105
|
+
return separator <= 0 ? undefined : [part.slice(0, separator).trim(), part.slice(separator + 1).trim()];
|
|
106
|
+
});
|
|
107
|
+
return pairs.length === 0 || pairs.some((pair) => pair === undefined || pair[0] === "" || pair[1] === "") ? undefined : pairs;
|
|
108
|
+
}
|
|
109
|
+
/** An item of the effects field as a line: text, or the map YAML makes of a line written without quotes. */
|
|
110
|
+
function asLine(item) {
|
|
111
|
+
if (typeof item === "string") {
|
|
112
|
+
return item;
|
|
113
|
+
}
|
|
114
|
+
const entries = item !== null && typeof item === "object" && !Array.isArray(item) ? Object.entries(item) : [];
|
|
115
|
+
return entries.length === 1 && typeof entries[0][1] !== "object" ? `${entries[0][0]}: ${String(entries[0][1])}` : undefined;
|
|
116
|
+
}
|
|
117
|
+
/** A name as a link or a turn writes it: [[Annegato 1]] and Annegato 1 are the same. */
|
|
118
|
+
function pageName(text) {
|
|
119
|
+
return text.trim().replace(/^\[\[(.*?)(?:\|.*)?\]\]$/, "$1").trim();
|
|
120
|
+
}
|
|
121
|
+
function sameName(first, second) {
|
|
122
|
+
return comparableText(first.trim()) === comparableText(second.trim());
|
|
123
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { type Effect, type EffectEnd, effectNamed, endsAtTurn, formatEffect, formatEnd, isSceneDuration, keeperOf, readEffect, readEffects, readRounds, withEffect } from "./effect.ts";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// Conditions and effects on whoever has them (D-123, D-132): a line of text each, with temporary values and an end in game time or in rounds. It knows no game.
|
|
2
|
+
export { effectNamed, endsAtTurn, formatEffect, formatEnd, isSceneDuration, keeperOf, readEffect, readEffects, readRounds, withEffect } from "./effect.js";
|