diff --git a/CAWS/.obsidian/workspace.json b/CAWS/.obsidian/workspace.json index b8dee9a..0ff1425 100644 --- a/CAWS/.obsidian/workspace.json +++ b/CAWS/.obsidian/workspace.json @@ -27,12 +27,24 @@ "state": { "type": "markdown", "state": { - "file": "characters/katharina_geschichte.md", + "file": "regions/enwinmar.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "katharina_geschichte" + "title": "enwinmar" + } + }, + { + "id": "5288f18d64189eaf", + "type": "leaf", + "state": { + "type": "image", + "state": { + "file": "images/enwinmar.webp" + }, + "icon": "lucide-image", + "title": "enwinmar" } } ], @@ -209,15 +221,16 @@ "obsidian-git:Open Git source control": false } }, - "active": "b2fff9b504dd14c5", + "active": "17ebb9590096feb3", "lastOpenFiles": [ + "characters/katharina_geschichte.md", + "regions/enwinmar.md", + "images/enwinmar.webp", + "{continent}.md", + "characters/player_characters/katharina_lavalié.md", "characters/character_overview.md", "characters/player_characters/quelana_aralar.md", - "characters/player_characters/katharina_lavalié.md", - "regions/enwinmar.md", - "characters/katharina_geschichte.md", "regions/fonsunor.md", - "{continent}.md", "regions/the_archipel.md", "regions/rpg_checklist 1.typ", "regions/rpg_checklist.typ", @@ -241,7 +254,6 @@ "images/the_ladies_of_house_lavalié_3.webp", "images/the_ladies_of_house_lavalié_3.webp.0.pdnSave", "images/the_ladies_of_house_lavalié_3.png", - "images/the_ladies_of_house_lavalié_2.png", "Charaktere/Dungeons and Dragons Charaktere/images/katharina_lavalie_full_ph.webp.0.pdnSave", "Charaktere/Dungeons and Dragons Charaktere/images/schwester_vampir_katharina_ph.webp.0.pdnSave", "Charaktere/Dungeons and Dragons Charaktere/Unbenannt.canvas", diff --git a/CAWS/characters/katharina_geschichte.md b/CAWS/characters/katharina_geschichte.md index 6dbd7fa..267ec77 100644 --- a/CAWS/characters/katharina_geschichte.md +++ b/CAWS/characters/katharina_geschichte.md @@ -27,7 +27,7 @@ Katharina blickte hinaus in die Nacht. „Weil es kein Schauspiel ist.“ Katharina sah sie an. Coralie stand langsam auf und trat neben sie ans Fenster. Ihr Brockatkleid säuselte sanft über den Boden. Jede Bewegung kontrolliert. Sie wirkte bereits wie ein Teil des Hofes, dem Katharina noch entkommen wollte. -„Das hier ist unsere Welt“, meinte Coralie. „Andere bekommen Felder oder Hunger. Wir +„Das hier ist unsere Welt“, meinte Coralie. „Andere bekommen Felder oder Hunger. Wir bekommen Regeln.“ „Und goldene Käfige.“ „Käfige bleiben stabil, solange man versteht, wo die Gitter verlaufen.“ @@ -36,8 +36,8 @@ Katharina schüttelte den Kopf. „Nein.“ Coralie verschränkte die Arme. „Mutter glaubt an Ordnung. Ich glaube an Überleben.“ Die Worte trafen härter, als Katharina erwartet hatte. Coralie musterte sie einige Sekunden schweigend, dann sprach sie leiser weiter. -„Du denkst, draußen wartet Freiheit auf dich. Abenteuer. Ein eigenes Leben.“ Sie sah -hinaus auf die Stadt. „Aber diese Welt frisst naive Vampire. Besonders solche unseres +„Du denkst, draußen wartet Freiheit auf dich. Abenteuer. Ein eigenes Leben.“ Sie sah +hinaus auf die Stadt. „Aber diese Welt frisst naive Vampire. Besonders solche unseres Blutes.“ Katharina schwieg. „Und trotzdem willst du gehen“, sagte Coralie. @@ -54,7 +54,7 @@ Coralie trat an ihr vorbei zur Tür und blieb kurz stehen. „Katharina.“ „Hm?“ „Wenn sie dich finden, werden sie nicht wütend sein.“ Ihre Stimme war ruhig. „Sie werden höflich sein. Das ist deutlich gefährlicher.“ -Dann verließ sie den Raum und ließ Katharina allein mit dem Klang der Musik und der +Dann verließ sie den Raum und ließ Katharina allein mit dem Klang der Musik und der offenen Nacht hinter dem Fenster zurück. --- @@ -62,13 +62,13 @@ offenen Nacht hinter dem Fenster zurück. Katharina stand vor dem hohen Obsidianspiegel ihres Gemachs und betrachtete sich schweigend. Das dunkle Kleid ihres Hauses saß perfekt. Rote Stickereien zogen sich über den Stoff, elegant und kühl zugleich. Sie sah aus wie eine Lavalié. Sie fühlte sich nur nicht wie eine. Die Tür öffnete sich leise hinter ihr. -„Du wirkst angespannt.“ +„Du wirkst angespannt.“ Die Stimme ihrer Mutter war ruhig wie immer. Katharina wandte den Blick nicht sofort ab. „Ganz Zorngrad wartet unten auf mich. Ich glaube, Anspannung wäre nicht angemessen.“ Ihre Mutter trat näher. Jeder Schritt wirkte kontrolliert, beinahe lautlos. Lady Lavalié musste nie Autorität einfordern. Sie war einfach da. „Heute Abend“, sagte sie, „wird man sich an jedes Detail erinnern. Wie du sprichst. Wie du dich bewegst. Selbst daran, wen du zuerst begrüßt.“ -Katharina ließ den Blick sinken. +Katharina ließ den Blick sinken. „Das klingt anstrengend.“ „Das ist es auch.“ Die Antwort kam ohne Härte. Fast sachlich. @@ -180,7 +180,7 @@ Welche Gerüchte entstehen würden. Wer davon profitieren könnte. Eléonore blickte langsam in den Ballsaal. „Die Musik“, sagte sie, „wird selbstverständlich fortgesetzt.“ -Der Dirigent hob zögerlich den Taktstock. Wenige Sekunden später erklangen erneut Geigen. +Der Dirigent hob zögerlich den Taktstock. Wenige Sekunden später erklangen erneut Geigen. Und während der Hof von Zorngrad weitertanzte, verschwand irgendwo außerhalb der Residenz eine junge Vampirin in der Dunkelheit der Nacht. --- diff --git a/CAWS/regions/enwinmar.md b/CAWS/regions/enwinmar.md index f663a59..1eec098 100644 --- a/CAWS/regions/enwinmar.md +++ b/CAWS/regions/enwinmar.md @@ -86,7 +86,7 @@ Menschen stellen, aufgrund ihrer hohen Anpassungsfähigkeit, eine der am meisten #### Vampire als Volk - haben keinen Schatten -- können Holzpflocken von Bäumen die das Leben symbolisieren an Ort und Stelle gepinnt werden (bereits tote Bäume, sei es durch Magie, Krankheit etc., sowie Eiben ausgenommen) +- können durch Holzpflocken von Bäumen die das Leben symbolisieren an Ort und Stelle gepinnt werden (bereits tote Bäume, sei es durch Magie, Krankheit etc., sowie Eiben ausgenommen) - Spiegel aus einem speziellen Obsidian aus dem Nachtschiefergebirge - Möbel etc. aus Eiben, als Symbol - Vampirgöttin, besitzt Seelen jedes Vampirs @@ -104,9 +104,16 @@ Doch die Damen der adligen Häuser sind die stillen Herzen der Macht. Sie verweb Ihr Werkzeug ist nicht das Schwert, sondern Verstand, Etikette und Einfluss. Und wo diese nicht genügen, flüstert man von subtileren Mitteln: von Gefälligkeiten, Versprechen und Intrigen, die niemals offen ausgesprochen werden, aber stets Wirkung zeigen. So sagt man hinter vorgehaltener Hand, dass in Wahrheit nicht die Krone die Familie trägt, sondern jene, die sie zum Wanken bringen könnten, ohne je das Licht der Öffentlichkeit zu suchen. -#### Schloss {} -#### Zorngrad -#### Schwarzhof +#### Das Adelssystem + +In Enwinmar besteht das Vampirkönigreich aus 5 Herzogtümern, welche ihrem König unterstellt sind. Jedes Herzogtum wird dabei von einer Familie regiert und geleitet. +##### Herzogtum Zorngrad +Familie: von Sangrast (Lavalié mütterlicherseits) +Städte und Dörfer im Herzogtum: +- Zorngrad +- Stillbrunn +- ... + ### Untergrundorganisationen .. ### Piraten diff --git a/typst/assets/dnd_background.jpeg b/typst/assets/dnd_background.jpeg new file mode 100644 index 0000000..5dfdedd Binary files /dev/null and b/typst/assets/dnd_background.jpeg differ diff --git a/typst/assets/unicorn.json b/typst/assets/unicorn.json new file mode 100644 index 0000000..d72c193 --- /dev/null +++ b/typst/assets/unicorn.json @@ -0,0 +1,161 @@ +{ + "name": "Unicorn", + "size": [ + "L" + ], + "type": "celestial", + "source": "MM", + "alignment": [ + "L", + "G" + ], + "ac": [ + 12 + ], + "hp": { + "average": 67, + "formula": "9d10 + 18" + }, + "speed": { + "walk": 50 + }, + "str": 18, + "dex": 14, + "con": 15, + "int": 11, + "wis": 17, + "cha": 16, + "immune": [ + "poison" + ], + "conditionImmune": [ + "charmed", + "paralyzed", + "poisoned" + ], + "senses": [ + "darkvision 60 ft." + ], + "passive": 13, + "languages": [ + "Celestial", + "Elvish", + "Sylvan", + "telepathy 60 ft." + ], + "cr": "5", + "trait": [ + { + "name": "Charge", + "entries": [ + "If the unicorn moves at least 20 ft. straight toward a target and then hits it with a horn attack on the same turn, the target takes an extra 9 ({@dice 2d8}) piercing damage. If the target is a creature, it must succeed on a {@dc 15} Strength saving throw or be knocked prone." + ] + }, + { + "name": "Magic Resistance", + "entries": [ + "The unicorn has advantage on saving throws against spells and other magical effects." + ] + }, + { + "name": "Magic Weapons", + "entries": [ + "The unicorn's weapon attacks are magical." + ] + } + ], + "action": [ + { + "name": "Multiattack", + "entries": [ + "The unicorn makes two attacks: one with its hooves and one with its horn." + ] + }, + { + "name": "Hooves", + "entries": [ + "{@atk mw} {@hit 7} to hit, reach 5 ft., one target. Hit: 11 ({@damage 2d6 + 4}) bludgeoning damage." + ] + }, + { + "name": "Horn", + "entries": [ + "{@atk mw} {@hit 7} to hit, reach 5 ft., one target. Hit: 8 ({@damage 1d8 + 4}) piercing damage." + ] + }, + { + "name": "Healing Touch (3/Day)", + "entries": [ + "The unicorn touches another creature with its horn. The target magically regains 11 ({@dice 2d8 + 2}) hit points. In addition, the touch removes all diseases and neutralizes all poisons afflicting the target." + ] + }, + { + "name": "Teleport (1/Day)", + "entries": [ + "The unicorn magically teleports itself and up to three willing creatures it can see within 5 feet of it, along with any equipment they are wearing or carrying, to a location the unicorn is familiar with, up to 1 mile away." + ] + } + ], + "legendaryGroup": { + "name": "Unicorn", + "source": "MM" + }, + "legendary": [ + { + "name": "Hooves", + "entries": [ + "The unicorn makes one attack with its hooves." + ] + }, + { + "name": "Shimmering Shield (Costs 2 Actions)", + "entries": [ + "The unicorn creates a shimmering, magical field around itself or another creature it can see within 60 feet of it. The target gains a +2 bonus to AC until the end of the unicorn's next turn." + ] + }, + { + "name": "Heal Self (Costs 3 Actions)", + "entries": [ + "The unicorn magically regains 11 ({@dice 2d8 + 2}) hit points." + ] + } + ], + "page": 294, + "spellcasting": [ + { + "name": "Innate Spellcasting", + "type": "spellcasting", + "headerEntries": [ + "The unicorn's innate spellcasting ability is Charisma (spell save {@dc 14}). The unicorn can innately cast the following spells, requiring no components:" + ], + "will": [ + "{@spell detect evil and good}", + "{@spell druidcraft}", + "{@spell pass without trace}" + ], + "daily": { + "1e": [ + "{@spell calm emotions}", + "{@spell dispel evil and good}", + "{@spell entangle}" + ] + }, + "ability": "cha" + } + ], + "environment": [ + "forest" + ], + "soundClip": { + "type": "internal", + "path": "bestiary/unicorn.mp3" + }, + "traitTags": [ + "Charge", + "Magic Resistance", + "Magic Weapons" + ], + "actionTags": [ + "Multiattack" + ] +} \ No newline at end of file diff --git a/typst/dnd_template.typ b/typst/dnd_template.typ new file mode 100644 index 0000000..08bec33 --- /dev/null +++ b/typst/dnd_template.typ @@ -0,0 +1,207 @@ +#import "@preview/mythographer-5e:0.0.2": * + +#show: dnd-template.with( + default-config(lang: "en"), +) + +#title-page( + title: [The Dark Typst], + authors: ( + (name: [Sa1g], organization: [#link("github.com/sa1g/dnd-typst-template")]), + ), + date: datetime.today().display(), +) + +#show-outline() + += Layout + +== #flex-heading[Chapters (`==`)][Chapters] + +#columns(2)[ + #dnd-dropcap[T][his package is heavily inspired][ by the excellent work of the #link("https://github.com/rpgtex")[*rpgTex*] team and their #link("https://github.com/rpgtex/DND-5e-LaTeX-Template")[*LaTeX D&D template*]. Like its predecessor, this template is designed to help you create beautifully typeset documents for the fifth edition of the world's greatest roleplaying game. It begins by adjusting Typst's default section formatting to a style more familiar to readers. The chapter formatting is displayed above.] + + === Section (`===`) + Sections divide chapters into major thematic groups. + + ==== Subsection (`====`) + Subsections further organize content for clarity. + + ===== Subsubsection (`====`) + Subsubsections represent the deepest level of division that still uses a block header. Deeper levels display headers inline. + + ====== Paragraph + The paragraph format is rarely used in the core rulebooks but remains available as an alternative to the "normal" style. It can be set with `======` or the `dnd-par` function. + // Example: #dnd-par[Paragraph] + + ======= Subparagraph + The subparagraph format, which includes a paragraph indent, will likely feel more familiar to readers. It can be set with `=======` or `dnd-subpar`. + // Example: #dnd-subpar[Subparagraph] + + === Special Sections + This module also provides dedicated functions for multi-line section headers commonly found in rulebooks: `dnd-feat` for feats, `dnd-item` for magic items and traps, and `dnd-spell` for spells. + + #dnd-feat[ + = Typesetting Savant + == Typst + You have acquired a package that aids in typesetting source material for one of your favorite games. You have advantage on Intelligence checks to typeset new content. On a failed check, you can seek assistance online at the package's website. + ] + + #dnd-item[ + = Foo's Quill + == Wondrous item, rare + The quill has 3 charges. While holding it, you can use an action to expend 1 charge, causing the quill to leap from your hand and draft a contract suited to your situation. The quill regains 1d3 expended charges daily at dawn. + ] + + #dnd-spell[Beautiful Typesetting][4th level illusion][1 action][5 feet][S, M][Until dispelled][ + You transform a written message of any length into an exquisite scroll. Each creature within range that can see the scroll must succeed on a Wisdom saving throw or be charmed by you for the spell's duration. + + While charmed in this way, a creature cannot look away from the scroll or willingly move farther from it. A charmed creature can repeat the Wisdom saving throw at the end of each of its turns, ending the effect on itself on a success. + ] + + === Map Regions + The `dnd-area` function formats map regions. Numbering is automatic and resets with each new `dnd-area` block. + + #dnd-area[ + = Village of Hommlet + A small, welcoming village. + + == Inn of the Welcome Wench + The village's central gathering place. + + == Blacksmith's Forge + The local blacksmith's workshop. + + = Foo's Castle + Foo's modest residence, constructed of mud and sticks. + + == Moat + A shallow ditch crossed by a single plank. + + == Entrance + A five-foot opening leads to a dirt floor, dimly lit by a hole in the roof above. + ] +] + + +== Text Boxes +#columns(2)[ + This module provides three distinct environments to visually set apart text and draw the reader’s attention. The `dnd-readaloud` environment is used for passages meant to be read aloud by the Game Master. + + + #dnd-readaloud[ + As you approach this module, you sense that the blood and tears of generations have gone into its making. A welcoming warmth embraces you as you type your first words. + ] + + #dnd-sidebar()[ + Behold the DndSidebar! + ][ + The `dnd-sidebar` is designed for supplementary content, such as sidebars. It does not break across columns and works best when used with a figure environment to float it to a page corner, allowing surrounding text to wrap around it. + ] + + === As an Aside + The other two environments are `dnd-comment` and `dnd-sidebar`. The `dnd-comment` environment is breakable and can be safely used inline within the main text flow. + + #dnd-comment[This is a Comment Box!][ + A `dnd-comment` provides minimal visual highlighting for text. While it lacks the ornamentation of `dnd-sidebar`, it can be cleanly broken across columns. + ] + In contrast, the `dnd-sidebar` is not breakable and is ideally positioned as a floated element, as shown below. + + === Tables + The `DndTable` style automatically colors even-numbered rows and defaults to the width of a text line. + + #figure( + table( + columns: (auto, 1fr), + table.header[Table head][Table head], + [January], [The Great Gatsby], + [February], [To Kill a Mockingbird], + [March], [1984], + [April], [The Catcher in the Rye], + ), + caption: [Nice Table], + ) + // To make a table span the full page width, define its columns using `fr` units. +] + +== Monsters and NPCs +#columns(2)[ + The dnd-monster environment is used to format monster and NPC stat blocks. The module provides a variety of helper functions to simplify populating these stat blocks. + + While creating monster stat blocks is one of the more complex aspects of this template, we have strived to make the process as straightforward as possible. + + Monster sheets can be configured as either single-column or multi-column layouts, depending on your preference. + + The layout generally works well up to three columns, though occasional overshoot in the final column may occur. +] +#v(1fr) +#dnd-monster(json("assets/unicorn.json"), correction-factor: 1.06) + +== Style and Colors +#columns(2)[ + #dnd-dropcap[S][tyle and color settings can be adjusted dynamically][ to suit your needs. You can apply custom configurations directly within functions like `dnd-area`, `dnd-comment`, `dnd-dropcap`, `dnd-feat`, `dnd-item`, `dnd-readaloud`, `dnd-sidebar`, `dnd-spell`, `dnd-monster`, and others.] + This is accomplished by passing a configuration object to the function, similar to how you would configure the template using `dnd-template.with`. If you wish to define custom styles or colors, examine `config.typ` in the template and start with `default-config` and `easy-colors`—these will assist you in creating your own unique theme. + + #show: dnd-template.with( + is-first: false, + easy-colors(primary: rgb(100, 160, 40), secondary: rgb(140, 180, 20), tertiary: colors.PhbTan), + ) + === Color Example + As shown above, the color scheme has been thematically altered. This was achieved by modifying the `easy-colors` configuration within `dnd-template` for this section. + + #dnd-comment[This is a Comment Box!][ + A `dnd-comment` is a box for minimal highlighting of text. It lacks the ornamentation of `dnd-sidebar`, but it can be broken across columns. + ] + + #dnd-readaloud[ + As you approach this module, you sense that the blood and tears of generations have gone into its making. A welcoming warmth embraces you as you type your first words. + ] + + #dnd-sidebar()[ + Behold the DndSidebar! + ][ + The `dnd-sidebar` is used as a sidebar. It does not break across columns and is best paired with a figure environment to float it to a page corner, allowing surrounding text to wrap around it. + ] + + Colors can also be applied inline. Below is an example: + #dnd-sidebar( + config: easy-colors(text-fill: white, tertiary: rgb(100, 0, 60)), + )[ + Behold the DndSidebar! + ][ + + The `dnd-sidebar` is used as a sidebar. It does not break across columns and is best paired with a figure environment to float it to a page corner, allowing surrounding text to wrap around it. + ] + A future release will introduce more streamlined inline support for text color injection, making the process cleaner and more intuitive. +] + +#show: dnd-template.with( + is-first: false, +) + +#dnd-image-heading-part( + rect(fill: orange, height: 100%, width: 100%), + [Stylized\ Level 1 Heading\ #text(size: 0.5em)[The orange background simulates an image #footnote[It's not a real image to reduce the size of the template.]]#v(7em)], + title-unstyled: [Custom Images], +) +// #dnd-image-heading-part(image("/img/behind-header-example.jpg"), [Stylized\ Level 1 Heading #v(7em)], title-unstyled: [Custom Images]) + +#columns(2)[ + #dnd-dropcap[U][sing functions like `dnd-image-heading-section`][ and `dnd-image-heading-part`, you can easily overlay or place images behind your `level-1` (=) and `level-2` (==) headings. + + Due to Typst's internal layout behavior, a full-page image requires its own dedicated page. Therefore, the template only supports full-page images for level-1 headings. + ] +] +#dnd-image-heading-section(rect(fill: red, height: 20em, width: 62em), 2, [A New Beginning']) +// #dnd-image-heading-section(image(""), 2, [A New Beginning'], ) +// #dnd-image-heading-section(image("/img/over-header-example.png", height: 39em), 2, [A New Beginning'], ) +#columns(2)[ + // Currently, Typst has a #link("https://github.com/typst/typst/issues/4763")[*known bug*] where image heights are not measured correctly. As a result, when placing an image above a heading, you must explicitly specify its dimensions, as shown in the commented example above. + + *The red rectangle simulates an image.* + + Note that the chapter counter resets between parts, following the convention used in official D&D publications. + + === Image Credits + The sample background image is sourced from #link("https://lostandtaken.com/")[Lost and Taken]. +] diff --git a/web/rpg_checklist.typ b/typst/rpg_checklist.typ similarity index 96% rename from web/rpg_checklist.typ rename to typst/rpg_checklist.typ index f04f1e5..0e06124 100644 --- a/web/rpg_checklist.typ +++ b/typst/rpg_checklist.typ @@ -1,4 +1,4 @@ -#set page(paper: "a4", fill: tiling(image("image1.jpeg")), margin: (x:4em , y:3em)) +#set page(paper: "a4", fill: tiling(image("assets/dnd_background.jpeg")), margin: (x:4em , y:3em)) #place( top + center, float: true, @@ -34,7 +34,7 @@ Wenn das Ganze ein Film wäre, was wäre die Altersfreigabe? (0, 6, 12, 16, 18): Kreuze die Farbe an, bezogen auf Setting und Story. #box(width: 1em, height: 1em, stroke: green) -#text(fill: green)[*Grün*]: Find ich gut, bitte inkludieren. +#text(fill: green)[*Grün*]: Damit kann ich umgehen. Inkludierbar. #box(width: 1em, height: 1em, stroke: yellow) #text(fill: yellow)[*Gelb*]: Ok, wenn es genannt wird. Im Spiel möglich, aber bitte abklären. Unsicher.