Initial commit

This commit is contained in:
Jesse James Isler 2024-03-18 08:41:23 +01:00
commit e8e46fa07e
45 changed files with 81475 additions and 0 deletions

View File

@ -0,0 +1,129 @@
# Spiel Informationen
Willkommen zum open Beta-Spieltest für die neue PNP Framework - Daggerheart! Bevor wir beginnen, gebe ich euch noch kurz einige Worte des Rates mit!
## Das Spiel befindet sich noch in der aktiven Entwicklung.
Ihr könnt euch das wie bei einem Early Access Game vorstellen, da einige Spells noch ein wenig zu viel Schaden austeilen oder gewisse sachen noch unfair wirken. Genau das Selbe auch mit den Gegnern, welche euch heute entgegenstehen.
## Auch wenn das Spiel noch in der Beta ist; Streams sind erlaubt und sogar erwünscht!
Die Entwickler bitten einfach darum, dass WENN gestreamt wird, dass angemerkt wird, dass sich das Spiel noch in der BETA befindet. Dies ist wichtig, da sich die Spielmechaniken weiterentwickeln werden und die entwickler keine Verwirrung wollen, wenn das endgültige Spiel erscheint.
# James Tutorialomatik
Hier findet ihr eine kurze Übersicht WIE Daggerheart überhaupt funktioniert! Wenn euch Lesen anödet, und ihr Proficency in Englisch habt; so könnt ihr euch auch eine kleine Zusammenfassung von den Entwicklern hier ansehen: https://youtu.be/nYVrzqTPHRA
## Was ist Daggerheart?
Daggerheart versucht ein modernes Pen & Paper zu sein, welches die Narration, Kopfkino, Gameplaymechanik und Taktik in einen grossen Topf wirft. Ebenfalls versucht Daggerfall die Spieler in die Story zu integrieren und den Spielern erlaubt, Gegenstände der Welt hinzuzdenken. (Kann von GM zu GM variieren)
## Wie mache ich nun meine Aktionen?
In der Basis, basieren jegliche Aktionen die ihr macht auf den sogenannten "**DUALITY DICE**". Die **Duality Dice** sind an sich 2d12 welche sich in den Farben nicht ähneln.
![[Pasted image 20240316101811.png]]![[Pasted image 20240316101816.png]]
Einer der beiden Würfel ist der **HOPE** (Hoffnung) Würfel, der andere der **FEAR** (Angst) Würfel. Sobald vom GM eine Aktion gewünscht wird, werden beide Würfel geworfen. Danach werden beide Würfel zusammengezählt und die Modifier hinzugefügt. Ist der **HOPE** würfel höher, so sagst du dein Resultat mit **HOPE** (Hoffnung) an. Ist der **FEAR** würfel höher, so sagst du dein Resultat mit **FEAR** an.
Der Erfolg hängt jeh nach dem von dem GM festgelegten schwierigkeitswert ab. (Wie in 5E das DC system)
| Sehr einfach | Einfach | Mittel | Schwer | Sehr schwer | Fast unmöglich |
| :----------: | :-----: | :----: | :----: | :---------: | :------------: |
| 5 | 10 | 15 | 20 | 25 | 30 |
Dies sind die möglichen Auskommen der Würfel
> [!Tip] Kritischer Erfolg
> Beide Würfel, **HOPE** und **FEAR** Zeigen die gleiche Zahl
> *(Egal welche, auch 2x1)*
> - Du bekommst das, was du gewünscht hast, und ein wenig Mehr.
> - Füge dir eine **HOPE** und entferne einen Stress (Falls forhanden, wird später erklärt.)
> [!check] Erfolg mit Hope
> Die Summe beider Würfel PLUS modifier übertreffen die DC. (Der **HOPE** Würfel ist höher als der **FEAR** Würfel)
> - Du bekommst das, was du gewünscht hast.
> - Füge deinem Character einen **HOPE-Point** hinzu
> [!check] Erfolg mit Angst
> Bei einem Erfolg mit Angst bekommst du, was du willst, aber es ist mit Kosten oder Konsequenzen verbunden. Du könntest angegriffen werden, begrenzte Informationen erhalten, Gefahren anziehen usw.
> - Der GM erhält einen **FEAR-Point**.
> [!failure] Bei einem Misserfolg mit Hope
> Die Dinge werden nicht nach Plan verlaufen. Du bekommst wahrscheinlich nicht, was du willst und musst die Konsequenzen tragen.
> - Füge deinem Character einen **HOPE-Point** hinzu
> [!failure] Bei einem Misserfolg mit Angst
> Die Dinge laufen wirklich schlecht. Du bekommst wahrscheinlich nicht, was du willst, und es gibt eine große Konsequenz oder Komplikation deswegen.
> - Der GM erhält einen **FEAR-Point**.
Ebenfalls kann vor dem Roll noch durch Nutzen von einem **FEAR-Point** eine **Experience** von deinem Charactersheet der Bonus davon genutzt werden.
Nehmen wir an, ich der Spieler Möchte sich in einem Dungeon umsehen und ein Gefühl für den Raum erhalten. Der GM könnte dich dann fragen:
> Mach mir bitte einen **Action Throw** (Aktions Wurf) auf **Instinct** (Instinkt).
Der Spieler könnte noch Fragen, ob er seine **Experience** (Erfahrung) als Architekt hinzufügen draft, wenn er einen **HOPE-Point** ausgibt.!
![[Pasted image 20240316102648.png]]
Der Spieler wirft nun seine 2 Würfel, und diese landen wie folgend:
| Hope Würfel | Fear Würfel | Instinkt Bonus | Experience | Resultat: |
| ----------- | ----------- | -------------- | ---------- | ------------- |
| 10 | 6 | +2 | +1 | 19 *mit Hope* |
Wie ihr oben Seht, hat der Spieler eine 18 *mit **HOPE*** gewürfelt, seinen Instinkt hinzugefügt und die Experience als Architekt hinzugefügt.
Als GM könnte ich nun dem Spieler erklären:
> Du siehst, dass der Dungeon ausgehöhlt und dann mit Steinen verstärkt wurde. Würde hier eine grössere Explosion oder Erschütterung passieren, könnte es sein, dass ein Raum oder sogar der ganze Dungeon zusammenbricht!
Neben den Action Rolls gibt es noch die **Reaction Rolls** (Reaktions Würfe). Reaction Rolls werden oft von Gegnern gefordert und agieren an sich wie **Action Rolls**. Der Unterschied ist, dass dieser Roll beim nicht bestehen dem GM keine Angriffstmöglichkeit gibt. Auch kanndir niemand mit Hope bei dem Wurf helfen,es passiert alles so schnell, dass du das alleine schaffen musst!
## Character
Die Erstellung des Character selbst werden wir in der RUNDE 0 machen.
Aber ich werde auf das Charactersheet eingehen!
![[Pasted image 20240316141356.png]]
Das ist das Charactersheet auf [Daggerhearts Website](https://app.demiplane.com/nexus/daggerheart) Funktioniert an sich wie DND Beyond, nur anders :)
## Evasion, Armor und HP
Diese Punkte vom Charactersheet werden vor allem in Kampfsituationen gebraucht.
Wird dein Character angegriffen, wird, so ist die Evasion die Nummer, welche vom Gamemaster überbieten werden muss. (In DND Terminologie kann man diese als ArmorClass ansehen)
![[Evasion.png]]
Geht ein Angriff druch, So rolle den Schaden, welcher bei deiner Waffe steht. Nehmen wir an, dass der Schaden auf einer 13 Gelandet ist.
Dieser Schaden liegt nun zwischen 9 und 14, also eine **Major** wunde.
![[Pasted image 20240317150930.png]]
Dies würde 2 HP Schadenspunkte machen.
![[Pasted image 20240317162016.png]]
**AAAABER**!! Errinnert ihr euch, vor 3 Bildern dass da ein "Armor" Slot war?
![[Pasted image 20240317162230.png]]
Wenn einer der Armor slots markiert wird, so kann der Wert der Armor (5) von dem einkommenden Schaden (13) entfernt werden. Dies setzt den Rest der Einkommenden Schaden auf 8, welches im "Minor" Bereich landet, und somit nur 1 HP Schaden nimmt.
![[Pasted image 20240317162625.png]]
Sollte ein weiterer Armor Slot verwendet werden, um den Schaden unter 4 Damage gesetzt werden. So nimmt der Character anstelle von einem HP einen Stress! (Ist das Stress-Meter voll, so nimmt der Character trotzdem 1 HP Schaden)
![[Pasted image 20240317164536.png]]
Stress wird oftmals auch für verschiedenste Aktivitäten oder Aktionen wie gewisse Spells oder Domain-Aktionen verwendet.
Kommen wir noch kurz zu den Waffen selber, diese sind an sich ziemlich einfach abzuklären.
Möchte jemand ein Monster angreifen So wirft jemand einen Attack Throw. Der Attack throw ist ein simpler Wurf mit dem Duality Dice, welcher dann mit dem benötigten Check dazugibt.
Fast jede Waffe hat ein spezielles Feature; beispielsweise das von einem Unarmed Strike -Mein Beispiel ist, dass du jemanden mit Worten verletzen kannst und dann den Knowledge modifier für den Angriff dazuzählen kannst.
![[Weapons.png]]
Waffen sind ganz cool, aber es gibt noch etwas anderes schönes. Features und Domain Effects (Domänen Effekte)!
## Features
Die Features formen euren Character tiefer.
### Class Feature
Das Klassenfeature ist einzigartig pro klasse und kann
***
![[Pasted image 20240316142325.png]]!
***
![[School.png]]
***
Diejenigen, die dämonische Vorfahren haben, sind die humanoiden Nachkommen der gefallenen Götter, die scharfe Eckzähne, spitze Ohren und Hörner besitzen, die es in einer Vielzahl von Stilen gibt.
Furchtlos: Wenn du mit Furcht würfelst, kannst du dich dafür entscheiden, einen Stress zu markieren, anstatt dass die Spielleiterin Furcht erhält.
Schreckensgesicht: Du hast einen Vorteil bei Würfen, um andere Nicht-Dämonen-Kreaturen einzuschüchtern.
Diejenigen, die dämonische Vorfahren haben, sind die humanoiden Nachkommen der gefallenen Götter, die scharfe Eckzähne, spitze Ohren und Hörner besitzen, die es in einer Vielzahl von Stilen gibt.
Während einige Dämonenhörner denen einer Ziege oder eines Widders ähneln, haben andere die Form eines durchdringenden Stachels. Es gibt keine Standardanzahl von Hörnern für Dämonen obwohl zwei oder vier durchaus üblich sind und einige haben Kronen aus vielen Hörnern oder nur einem. Sie können auch asymmetrisch wachsen und einzigartige Formen bilden, die Dämonen bekanntermaßen durch Schnitzereien und Ornamente verbessern. Ihre Haut, Haare und Hörner sind in einer Auswahl an kräftigen und lebendigen Farben wie rosigem Scharlachrot, tiefem Violett und pechschwarz erhältlich. Im Durchschnitt sind Dämonen zwischen 5 und 7 Fuß groß und haben bekanntermaßen lange Finger und spitze Nägel.

3
.obsidian/app.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"alwaysUpdateLinks": true
}

5
.obsidian/appearance.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"accentColor": "",
"baseFontSize": 22,
"cssTheme": "Atom"
}

4
.obsidian/community-plugins.json vendored Normal file
View File

@ -0,0 +1,4 @@
[
"language-translator",
"obsidian-local-rest-api"
]

30
.obsidian/core-plugins-migration.json vendored Normal file
View File

@ -0,0 +1,30 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"properties": false,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": false
}

20
.obsidian/core-plugins.json vendored Normal file
View File

@ -0,0 +1,20 @@
[
"file-explorer",
"global-search",
"switcher",
"graph",
"backlink",
"canvas",
"outgoing-link",
"tag-pane",
"page-preview",
"daily-notes",
"templates",
"note-composer",
"command-palette",
"editor-status",
"bookmarks",
"outline",
"word-count",
"file-recovery"
]

22
.obsidian/graph.json vendored Normal file
View File

@ -0,0 +1,22 @@
{
"collapse-filter": true,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": true,
"colorGroups": [],
"collapse-display": true,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1,
"close": true
}

View File

@ -0,0 +1,17 @@
{
"targetLanguage": {
"text": "German",
"code": "de"
},
"apiType": {
"text": "Builtin",
"value": "0"
},
"translateApiUrl": "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0",
"maxCharacters": 2000,
"token": "",
"region": {
"text": "Global",
"code": "global"
}
}

View File

@ -0,0 +1,490 @@
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/main.ts
__export(exports, {
default: () => LanguageTranslator
});
var import_obsidian3 = __toModule(require("obsidian"));
// src/settingsTab.ts
var import_obsidian = __toModule(require("obsidian"));
// src/apiTypes.ts
var API_TYPES;
(function(API_TYPES2) {
API_TYPES2[API_TYPES2["Builtin"] = 0] = "Builtin";
API_TYPES2[API_TYPES2["Azure"] = 1] = "Azure";
API_TYPES2[API_TYPES2["LibreTranslate"] = 2] = "LibreTranslate";
})(API_TYPES || (API_TYPES = {}));
var apiTypes_default = API_TYPES;
// src/apiUrls.ts
var API_URLS = {
AZURE_TRANSLATE_API_URL: "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0",
LIBRE_TRANSLATE_API_URL: "https://libretranslate.com/translate"
};
var apiUrls_default = API_URLS;
// src/langCodes.ts
var langCodes = [
{ text: "Afrikaans", code: "af" },
{ text: "Albanian", code: "sq" },
{ text: "Amharic", code: "am" },
{ text: "Arabic", code: "ar" },
{ text: "Armenian", code: "hy" },
{ text: "Assamese", code: "as" },
{ text: "Azerbaijani", code: "" },
{ text: "Bangla", code: "bn" },
{ text: "Bashkir", code: "ba" },
{ text: "Bosnian (Latin)", code: "bs" },
{ text: "Bulgarian", code: "bg" },
{ text: "Cantonese (Traditional)", code: "yue" },
{ text: "Catalan", code: "ca" },
{ text: "Chinese (Literary)", code: "lzh" },
{ text: "Chinese Simplified", code: "zh-Hans" },
{ text: "Chinese Traditional", code: "zh-Hant" },
{ text: "Croatian", code: "hr" },
{ text: "Czech", code: "cs" },
{ text: "Danish", code: "da" },
{ text: "Dari", code: "prs" },
{ text: "Divehi", code: "dv" },
{ text: "Dutch", code: "nl" },
{ text: "English", code: "en" },
{ text: "Estonian", code: "et" },
{ text: "Fijian", code: "fj" },
{ text: "Filipino", code: "fil" },
{ text: "Finnish", code: "fi" },
{ text: "French", code: "fr" },
{ text: "French (Canada)", code: "fr-ca" },
{ text: "Georgian", code: "ka" },
{ text: "German", code: "de" },
{ text: "Greek", code: "el" },
{ text: "Gujarati", code: "gu" },
{ text: "Haitian Creole", code: "ht" },
{ text: "Hebrew", code: "he" },
{ text: "Hindi", code: "hi" },
{ text: "Hmong Daw", code: "mww" },
{ text: "Hungarian", code: "hu" },
{ text: "Icelandic", code: "is" },
{ text: "Indonesian", code: "id" },
{ text: "Inuktitut", code: "iu" },
{ text: "Irish", code: "ga" },
{ text: "Italian", code: "it" },
{ text: "Japanese", code: "ja" },
{ text: "Kannada", code: "kn" },
{ text: "Kazakh", code: "kk" },
{ text: "Khmer", code: "km" },
{ text: "Klingon", code: "tlh-Latn" },
{ text: "Klingon (plqaD)", code: "tlh-Piqd" },
{ text: "Korean", code: "ko" },
{ text: "Kurdish (Central)", code: "ku" },
{ text: "Kurdish (Northern)", code: "kmr" },
{ text: "Kyrgyz", code: "ky" },
{ text: "Lao", code: "lo" },
{ text: "Latvian", code: "lv" },
{ text: "Lithuanian", code: "lt" },
{ text: "Macedonian", code: "mk" },
{ text: "Malagasy", code: "mg" },
{ text: "Malay", code: "ms" },
{ text: "Malayalam", code: "ml" },
{ text: "Maltese", code: "mt" },
{ text: "Maori", code: "mi" },
{ text: "Marathi", code: "mr" },
{ text: "Mongolian (Cyrillic)", code: "mn-Cyrl" },
{ text: "Mongolian (Traditional)", code: "mn-Mong" },
{ text: "Myanmar", code: "my" },
{ text: "Nepali", code: "ne" },
{ text: "Norwegian", code: "nb" },
{ text: "Odia", code: "or" },
{ text: "Pashto", code: "ps" },
{ text: "Persian", code: "fa" },
{ text: "Polish", code: "pl" },
{ text: "Portuguese (Brazil)", code: "pt" },
{ text: "Portuguese (Portugal)", code: "pt-pt" },
{ text: "Punjabi", code: "pa" },
{ text: "Queretaro Otomi", code: "otq" },
{ text: "Romanian", code: "ro" },
{ text: "Russian", code: "ru" },
{ text: "Samoan", code: "sm" },
{ text: "Serbian (Cyrillic)", code: "sr-Cyrl" },
{ text: "Serbian (Latin)", code: "sr-Latn" },
{ text: "Slovak", code: "sk" },
{ text: "Slovenian", code: "sl" },
{ text: "Spanish", code: "es" },
{ text: "Swahili", code: "sw" },
{ text: "Swedish", code: "sv" },
{ text: "Tahitian", code: "ty" },
{ text: "Tamil", code: "ta" },
{ text: "Tatar", code: "tt" },
{ text: "Telugu", code: "te" },
{ text: "Thai", code: "th" },
{ text: "Tibetan", code: "bo" },
{ text: "Tigrinya", code: "ti" },
{ text: "Tongan", code: "to" },
{ text: "Turkish", code: "tr" },
{ text: "Turkmen", code: "tk" },
{ text: "Ukrainian", code: "uk" },
{ text: "Urdu", code: "ur" },
{ text: "Uyghur", code: "ug" },
{ text: "Uzbek (Latin)", code: "uz" },
{ text: "Vietnamese", code: "vi" },
{ text: "Welsh", code: "cy" },
{ text: "Yucatec Maya", code: "yua" }
];
var langCodes_default = langCodes;
// src/regions.ts
var regions = [
{ text: "Global", code: "global" },
{ text: "East Asia", code: "eastasia" },
{ text: "Southeast Asia", code: "southeastasia" },
{ text: "Central US", code: "centralus" },
{ text: "East US", code: "eastus" },
{ text: "East US 2", code: "eastus2" },
{ text: "West US", code: "westus" },
{ text: "North Central US", code: "northcentralus" },
{ text: "South Central US", code: "southcentralus" },
{ text: "North Europe", code: "northeurope" },
{ text: "West Europe", code: "westeurope" },
{ text: "Japan West", code: "japanwest" },
{ text: "Japan East", code: "japaneast" },
{ text: "Brazil South", code: "brazilsouth" },
{ text: "Australia East", code: "australiaeast" },
{ text: "Australia Southeast", code: "australiasoutheast" },
{ text: "South India", code: "southindia" },
{ text: "Central India", code: "centralindia" },
{ text: "West India", code: "westindia" },
{ text: "Canada Central", code: "canadacentral" },
{ text: "Canada East", code: "canadaeast" },
{ text: "UK South", code: "uksouth" },
{ text: "UK West", code: "ukwest" },
{ text: "West Central US", code: "westcentralus" },
{ text: "West US 2", code: "westus2" },
{ text: "Korea Central", code: "koreacentral" },
{ text: "Korea South", code: "koreasouth" },
{ text: "France Central", code: "francecentral" },
{ text: "France South", code: "francesouth" },
{ text: "Australia Central", code: "australiacentral" },
{ text: "Australia Central 2", code: "australiacentral2" },
{ text: "UAE Central", code: "uaecentral" },
{ text: "UAE North", code: "uaenorth" },
{ text: "South Africa North", code: "southafricanorth" },
{ text: "South Africa West", code: "southafricawest" },
{ text: "Switzerland North", code: "switzerlandnorth" },
{ text: "Switzerland West", code: "switzerlandwest" },
{ text: "Germany North", code: "germanynorth" },
{ text: "Germany West Central", code: "germanywestcentral" },
{ text: "Norway West", code: "norwaywest" },
{ text: "Norway East", code: "norwayeast" }
];
var regions_default = regions;
// src/settingsTab.ts
var apiEntries = [
{
text: "Builtin",
value: "0"
},
{
text: "Azure",
value: "1"
},
{
text: "LibreTranslate",
value: "2"
}
];
var LanguageTranslatorSettingsTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: "Language Translator Settings" });
new import_obsidian.Setting(containerEl).setName("Target Language").setDesc("Set the translation target language (automatically detects source language)").addDropdown((dropDown) => {
langCodes_default.forEach((el) => {
dropDown.addOption(el.code, el.text);
});
dropDown.onChange((value) => __async(this, null, function* () {
this.plugin.settings.targetLanguage = langCodes_default.find((l) => l.code == value);
yield this.plugin.saveSettings();
}));
dropDown.setValue(this.plugin.settings.targetLanguage.code);
});
new import_obsidian.Setting(containerEl).setName("Translator API Type").setDesc("Set preferred API").addDropdown((dropDown) => {
apiEntries.forEach((el) => {
dropDown.addOption(el.value, el.text);
});
dropDown.onChange((value) => __async(this, null, function* () {
this.plugin.settings.apiType = apiEntries.find((a) => a.value == value);
switch (Number(value)) {
case apiTypes_default.Builtin:
case apiTypes_default.Azure:
this.plugin.settings.translateApiUrl = apiUrls_default.AZURE_TRANSLATE_API_URL;
this.apiUrlTextSetting.setValue(apiUrls_default.AZURE_TRANSLATE_API_URL);
this.plugin.settings.region = {
text: "Global",
code: "global"
};
break;
case apiTypes_default.LibreTranslate:
this.plugin.settings.translateApiUrl = apiUrls_default.LIBRE_TRANSLATE_API_URL;
this.apiUrlTextSetting.setValue(apiUrls_default.LIBRE_TRANSLATE_API_URL);
break;
default:
this.plugin.settings.translateApiUrl = apiUrls_default.AZURE_TRANSLATE_API_URL;
this.apiUrlTextSetting.setValue(apiUrls_default.AZURE_TRANSLATE_API_URL);
break;
}
yield this.plugin.saveSettings();
}));
dropDown.setValue(this.plugin.settings.apiType.value);
});
new import_obsidian.Setting(containerEl).setName("Azure Translator Region").setDesc("Set regions").addDropdown((dropDown) => {
regions_default.forEach((el) => {
dropDown.addOption(el.code, el.text);
});
dropDown.onChange((value) => __async(this, null, function* () {
this.plugin.settings.region = regions_default.find((l) => l.code == value);
yield this.plugin.saveSettings();
}));
dropDown.setValue(this.plugin.settings.region.code);
});
new import_obsidian.Setting(containerEl).setName("API Url").addTextArea((text) => {
text.setPlaceholder("Enter url").setValue(this.plugin.settings.translateApiUrl).onChange((value) => __async(this, null, function* () {
console.log("New api url: " + value);
this.plugin.settings.translateApiUrl = value;
yield this.plugin.saveSettings();
}));
text.setValue(this.plugin.settings.translateApiUrl);
text.inputEl.setAttr("rows", 4);
text.inputEl.addClass("settings_area");
this.apiUrlTextSetting = text;
});
new import_obsidian.Setting(containerEl).setName("API Token").addText((text) => {
text.setPlaceholder("Enter token").setValue(this.plugin.settings.token).onChange((value) => __async(this, null, function* () {
this.plugin.settings.token = value;
yield this.plugin.saveSettings();
}));
text.setValue(this.plugin.settings.token);
});
}
};
// src/translationServiceImplementation.ts
var import_obsidian2 = __toModule(require("obsidian"));
// src/translation.ts
function getTextLibreTranslate(text, lang, token, translateApiUrl) {
return __async(this, null, function* () {
let res = "";
const payload = JSON.stringify({
q: text,
source: "auto",
target: lang,
format: "text",
api_key: token
});
const myHeaders = new Headers({
"Content-type": "application/json"
});
try {
const response = yield fetch(translateApiUrl, {
method: "POST",
body: payload,
headers: myHeaders
});
let jsonResponse = yield response.json();
res = jsonResponse.translatedText || jsonResponse.error;
} catch (err) {
console.error(err);
}
return res;
});
}
function getTextAzure(text, lang, region, token, translateApiUrl) {
return __async(this, null, function* () {
let res = "";
const payload = JSON.stringify([{ text }]);
const myHeaders = new Headers({
"Ocp-Apim-Subscription-Key": token,
"Ocp-Apim-Subscription-Region": region,
"Content-type": "application/json"
});
try {
const response = yield fetch(`${translateApiUrl}&to=${lang}`, {
method: "POST",
body: payload,
headers: myHeaders
});
const json = yield response.json();
if (json.error) {
res = json.error.message;
} else {
res = json[0].translations[0].text;
}
} catch (err) {
console.error(err);
}
return res;
});
}
// src/translationServiceImplementation.ts
var AZURE_BUILTIN_KEY = "0bb27e8d40864db0a9854d8793e4fbb7";
var TranslationServiceImplementation = class {
constructor(plugin) {
this.getBuiltinAzureToken = () => __async(this, null, function* () {
try {
return AZURE_BUILTIN_KEY;
} catch (err) {
console.log(err);
new import_obsidian2.Notice(err.message);
}
});
this.plugin = plugin;
}
translate(lang, text) {
return __async(this, null, function* () {
let result = "";
switch (Number(this.plugin.settings.apiType.value)) {
case apiTypes_default.Builtin:
let token = yield this.getBuiltinAzureToken();
result = yield getTextAzure(text, lang, "westeurope", token, this.plugin.settings.translateApiUrl);
break;
case apiTypes_default.Azure:
result = yield getTextAzure(text, lang, this.plugin.settings.region.code, this.plugin.settings.token, this.plugin.settings.translateApiUrl);
break;
case apiTypes_default.LibreTranslate:
result = yield getTextLibreTranslate(text, lang, this.plugin.settings.token, this.plugin.settings.translateApiUrl);
break;
}
return result;
});
}
};
// src/main.ts
var MAX_CHARACTERS = 2e3;
var DEFAULT_SETTINGS = {
targetLanguage: {
text: "English",
code: "en"
},
apiType: {
text: "Builtin",
value: "0"
},
translateApiUrl: apiUrls_default.AZURE_TRANSLATE_API_URL,
maxCharacters: MAX_CHARACTERS,
token: "",
region: {
text: "Global",
code: "global"
}
};
var LanguageTranslator = class extends import_obsidian3.Plugin {
constructor() {
super(...arguments);
this.onEditorCallback = (editor) => __async(this, null, function* () {
let res = "[translation error]";
try {
const selection = editor.getSelection();
if (selection.length > this.settings.maxCharacters) {
new import_obsidian3.Notice(`Exceeded ${this.settings.maxCharacters} max characters!`);
return;
}
let textForTranslation = selection;
let targetLang = this.settings.targetLanguage.code;
let firstSemicolonIndex = textForTranslation.indexOf(":");
if (firstSemicolonIndex != -1) {
let potentialLangCode = textForTranslation.substring(0, firstSemicolonIndex);
if (potentialLangCode) {
let lc = langCodes_default.find((l) => l.code == potentialLangCode);
if (lc) {
targetLang = lc.code;
textForTranslation = textForTranslation.substring(firstSemicolonIndex + 1);
}
}
}
res = yield this.translationService.translate(targetLang, textForTranslation);
} catch (err) {
console.log(err);
new import_obsidian3.Notice(err.message);
}
editor.replaceSelection(res);
});
}
onload() {
return __async(this, null, function* () {
this.translationService = new TranslationServiceImplementation(this);
yield this.loadSettings();
this.addCommand({
id: "language-translator-editor-command",
name: "Insert translation",
editorCallback: this.onEditorCallback,
hotkeys: [
{
modifiers: ["Ctrl", "Shift"],
key: "R"
}
]
});
this.addSettingTab(new LanguageTranslatorSettingsTab(this.app, this));
});
}
loadSettings() {
return __async(this, null, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.saveData(this.settings);
});
}
};

View File

@ -0,0 +1,10 @@
{
"id": "language-translator",
"name": "Language Translator",
"version": "1.0.4",
"minAppVersion": "0.9.12",
"description": "Translates given text to desired language",
"author": "Florin Bobis",
"authorUrl": "https://florin.page",
"isDesktopOnly": false
}

View File

@ -0,0 +1,6 @@
.settings_area {
margin-left: 5px;
margin-right: 5px;
font-size: 14px;
width: 100%;
}

View File

@ -0,0 +1,11 @@
{
"port": 27124,
"insecurePort": 27123,
"enableInsecureServer": true,
"apiKey": "7dfa68161c914feb2f61f920b644009bf4a54e0fbea290e9046ec3edcba8cc60",
"crypto": {
"cert": "-----BEGIN CERTIFICATE-----\r\nMIIDRTCCAi2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDExdPYnNp\r\nZGlhbiBMb2NhbCBSRVNUIEFQSTAeFw0yNDAzMTUxOTEwMjNaFw0yNTAzMTUxOTEw\r\nMjNaMCIxIDAeBgNVBAMTF09ic2lkaWFuIExvY2FsIFJFU1QgQVBJMIIBIjANBgkq\r\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs0vDDqInqHY56y0f2SRXXCWTDAzTZVfR\r\nDyX0dQC1rVP2AH4dkX06twKtq3qRLayUleeO/eXlgp+lFlB27Urkhk9OJ5swiCEl\r\nmPQyi6tgdrnpR9fY+B1353ouJiZOgo6W5WmfVjxzgXV6gVb2KR4UlyvaPpxvktPE\r\nj9kqTawtDEUvqUS5EAOGa3LR2XLwjqzeEVWCnZ7+bIZqcspwbo8Du+bNsLJZ0sQR\r\nbQpfb+fCF3cqsLHvDJ4ItSKsHAfnhSD/Eeu7IWZtA2pfg8NjTdqG2cjbsFxmTPKv\r\nXVB0a/SCDab333kV61Q08bXXw/G4eq83VHk3bkXbqAmW6yaVMxOnqQIDAQABo4GF\r\nMIGCMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgLEMDsGA1UdJQQ0MDIG\r\nCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcD\r\nCDARBglghkgBhvhCAQEEBAMCAPcwDwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0B\r\nAQsFAAOCAQEAS6pVrh7UFj0z9Jx3fxlpIYMftGdKMtcERn9l97lBVXGerlQpVt1n\r\nO3Y5bFdRlhxAjLNQqJxGofXcRzpIgakuQWUXfsvXjzYEycZ7OjJDjJzPC8OpvCvP\r\ndROJNGuN7VJNQiCTj+chy0CWcCW43kHhtB0x+doz960AFLn3FjYVKWOfzYnRkyvi\r\nEVSvYVd25QZHtVo+F0XnCWfGveBHauZV6pcxY2e6EIvLtUbIcFqnwi9E/Giier82\r\nCs3KKp3BVRRaFwa4gkMUrPtnkytOWRCmuBjjeM1fYFlaAdwNGK4Xn35Op9npx44i\r\nseZUDhjkgjR4n49xb4ukAV8gbvivDkiTaw==\r\n-----END CERTIFICATE-----\r\n",
"privateKey": "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEpQIBAAKCAQEAs0vDDqInqHY56y0f2SRXXCWTDAzTZVfRDyX0dQC1rVP2AH4d\r\nkX06twKtq3qRLayUleeO/eXlgp+lFlB27Urkhk9OJ5swiCElmPQyi6tgdrnpR9fY\r\n+B1353ouJiZOgo6W5WmfVjxzgXV6gVb2KR4UlyvaPpxvktPEj9kqTawtDEUvqUS5\r\nEAOGa3LR2XLwjqzeEVWCnZ7+bIZqcspwbo8Du+bNsLJZ0sQRbQpfb+fCF3cqsLHv\r\nDJ4ItSKsHAfnhSD/Eeu7IWZtA2pfg8NjTdqG2cjbsFxmTPKvXVB0a/SCDab333kV\r\n61Q08bXXw/G4eq83VHk3bkXbqAmW6yaVMxOnqQIDAQABAoIBAA5sJPnfndiNgA20\r\noMf3Bib1p80zl+qiRIEXMMGbp8GUTCjQfEDohalUiBNP5e86X25qhMRUMqDOBjnU\r\nCaj/WgAaz4LclywQHIXf+NPm2njabhM3H+8fcbZ3S9CKSszyOt2j4CsP7Euo30yZ\r\nqe33Szk40BKywz/YlIpssdwzIiGHKbYZUA1HK782JdndBJXAZyqoO7if12/QkW4Y\r\nv2Wsk2I2iLl4b9dMgkTv3O4KJ9hlbxXO0kUzefrUYAyYSzhGEvCsu9zzmaM/D4Er\r\n0P7M8JU1fSlnD3TzPJ4xB26CGFSBUIq7htvqA9cJNmTK8fGTWYfWy3qz6OevBA/R\r\nX2j8gZ0CgYEA3x9pGlcujGzYrPpgxS/MCLNRIO6ejNX7j0oXrGxw6QRmnr73IGJm\r\nHyctm/utjXDvtVJg7SRXOLWwbDjkYdV0j1os+mBH8MmPSsJRs2PLjNJ5/Y6BpCeO\r\nJAsWBlJChRWZVfVblm7RfImeLRoqKS5gUZKl8+TjMp8rl6zeGZNY350CgYEAzbcg\r\noS6a68WfCJJy0eWDcWoKbuxeB4Yat61n+GWerZ+NWKt6/NkVVShFMyX97FEY5hQJ\r\nAys3vNy4Y6dYBn2CGvebLi1NUVeaC8wNGQGTwm5ylAiqPawBfTrdB5lZFNHN/coD\r\nZGRxWPhdItzlw+NqOEn/fLePVLdvR2BNmFFq2H0CgYEAyOa9ekw5y5NOXiJr8+Ef\r\ntE3RpPd2p5UdF149hrF10Tp3NET6u5weG7rpJGQvVwXzsK5mO+DW8GcYXbm0Wisa\r\n8uDdUuxSmorCjSv+6KnY5Am4cghYzvgW0nlw8WwsHSzfjjiIqSFLWvmHBVFj2QS7\r\nEXgcGUllEXWkiMPMj/bOtTkCgYEAyaDjV3ghmlPRY4p/BeHKKqB/52a/Zup3R26s\r\nSFf55j1LQgyZeDih4xycbtye/EAkgmZCyxtR/0frZql/6qSboCjurZzzenW9ZDC0\r\n6byVAe5VWWkAy3/K2d6XA7q3CGP3XffhyUV1n3mXd/NBNPWyh8dnpesYjjVY2YG3\r\nrEKo0dUCgYEA17HvI6nyzMVgxn8PAc8GM792WPSBa2z4BOl2XTV53l/b9mb0W8u4\r\nAOh+mVXrtHjhHEzpATcnNRpGq6cH7zlA8HzCHfxPN8Hb1krA11YGV82rOBy+01tr\r\nLlAdYiJ4osEBLO4Jh0eQTUlKbU40EDmYLaBiB72jLvtlsK3briBmSJw=\r\n-----END RSA PRIVATE KEY-----\r\n",
"publicKey": "-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs0vDDqInqHY56y0f2SRX\r\nXCWTDAzTZVfRDyX0dQC1rVP2AH4dkX06twKtq3qRLayUleeO/eXlgp+lFlB27Urk\r\nhk9OJ5swiCElmPQyi6tgdrnpR9fY+B1353ouJiZOgo6W5WmfVjxzgXV6gVb2KR4U\r\nlyvaPpxvktPEj9kqTawtDEUvqUS5EAOGa3LR2XLwjqzeEVWCnZ7+bIZqcspwbo8D\r\nu+bNsLJZ0sQRbQpfb+fCF3cqsLHvDJ4ItSKsHAfnhSD/Eeu7IWZtA2pfg8NjTdqG\r\n2cjbsFxmTPKvXVB0a/SCDab333kV61Q08bXXw/G4eq83VHk3bkXbqAmW6yaVMxOn\r\nqQIDAQAB\r\n-----END PUBLIC KEY-----\r\n"
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
{
"id": "obsidian-local-rest-api",
"name": "Local REST API",
"version": "2.3.0",
"minAppVersion": "0.12.0",
"description": "Get, change or otherwise interact with your notes in Obsidian via a REST API.",
"author": "Adam Coddington",
"authorUrl": "https://coddingtonbear.net/",
"isDesktopOnly": true
}

View File

@ -0,0 +1,35 @@
/* Sets all the text color to red! */
div.obsidian-local-rest-api-settings div.api-key-display {
margin-bottom: 20px;
}
div.obsidian-local-rest-api-settings div.api-key-display pre {
font-size: 0.8em;
padding: 10px 20px;
background-color: var(--background-modifier-cover);
font-family: monospace;
user-select: all;
}
div.obsidian-local-rest-api-settings div.setting-item-control {
min-width: 50%;
}
div.obsidian-local-rest-api-settings textarea {
width: 100%;
}
div.obsidian-local-rest-api-settings div.certificate-expired {
padding: 10px 20px;
border: 2px solid #ff0000;
}
div.obsidian-local-rest-api-settings div.certificate-expiring-soon {
padding: 10px 20px;
border: 2px solid #ffff00;
}
div.obsidian-local-rest-api-settings div.certificate-regeneration-recommended {
padding: 10px 20px;
border: 2px solid #ffff00;
}

6
.obsidian/themes/Atom/manifest.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"name": "Atom",
"version": "0.0.0",
"minAppVersion": "0.16.0",
"author": "kognise"
}

339
.obsidian/themes/Atom/theme.css vendored Normal file
View File

@ -0,0 +1,339 @@
/* Base colors - TODO: are grey 1 and grey 2 used? */
.theme-dark {
--accent-h: 219;
--accent-s: 56%;
--accent-l: 55%;
--background-primary: #272b34;
--background-primary-alt: #20242b;
--background-secondary: #20242b;
--background-secondary-alt: #1a1e24;
--background-accent: #000;
--background-modifier-border: #424958;
--background-modifier-form-field: rgba(0, 0, 0, 0.3);
--background-modifier-form-field-highlighted: rgba(0, 0, 0, 0.22);
--background-modifier-box-shadow: rgba(0, 0, 0, 0.3);
--background-modifier-success: #539126;
--background-modifier-error: #3d0000;
--background-modifier-error-rgb: 61, 0, 0;
--background-modifier-error-hover: #470000;
--background-modifier-cover: rgba(0, 0, 0, 0.6);
--text-accent: #61afef;
--text-accent-hover: #70bdfc;
--text-normal: #dcddde;
--text-muted: #888;
--text-faint: rgb(81, 86, 99);
--text-error: #e16d76;
--text-error-hover: #c9626a;
--text-highlight-bg: rgba(255, 255, 0, 0.4);
--text-selection: rgba(0, 122, 255, 0.2);
--text-on-accent: #dcddde;
--interactive-normal: #20242b;
--interactive-hover: #353b47;
--interactive-accent-hover: hsl(var(--accent-h), calc(var(--accent-s) + 5%), calc(var(--accent-l) - 10%));
--scrollbar-active-thumb-bg: rgba(255, 255, 255, 0.2);
--scrollbar-bg: rgba(255, 255, 255, 0.05);
--scrollbar-thumb-bg: rgba(255, 255, 255, 0.1);
--panel-border-color: #18191e;
--gray-1: #5C6370;
--gray-2: #abb2bf;
--red: #e06c75;
--orange: #d19a66;
--green: #98c379;
--aqua: #56b6c2;
--purple: #c678dd;
--blue: #61afef;
--yellow: #e5c07b;
--background-modifier-hover: hsla(var(--accent-h), calc(var(--accent-s) - 35%), var(--accent-l), 0.06);
--divider-color-hover: #404754;
}
.theme-light {
--accent-h: 230;
--accent-s: 83%;
--accent-l: 64%;
--background-primary: #fafafa;
--background-primary-alt: #eaeaeb;
--background-secondary: #eaeaeb;
--background-secondary-alt: #dbdbdc;
--background-accent: #fff;
--background-modifier-border: #dbdbdc;
--background-modifier-form-field: #fff;
--background-modifier-form-field-highlighted: #fff;
--background-modifier-box-shadow: rgba(0, 0, 0, 0.1);
--background-modifier-success: #A4E7C3;
--background-modifier-error: #e68787;
--background-modifier-error-rgb: 230, 135, 135;
--background-modifier-error-hover: #FF9494;
--background-modifier-cover: rgba(0, 0, 0, 0.8);
--text-accent: #1592ff;
--text-accent-hover: #097add;
--text-normal: #383a42;
--text-muted: #8e8e90;
--text-faint: #999999;
--text-error: #e75545;
--text-error-hover: #f86959;
--text-highlight-bg: rgba(255, 255, 0, 0.4);
--text-selection: rgba(0, 122, 255, 0.15);
--text-on-accent: #f2f2f2;
--interactive-normal: #eaeaeb;
--interactive-hover: #dbdbdc;
--interactive-accent-rgb: 21, 146, 255;
--interactive-accent-hover: hsl(var(--accent-h), calc(var(--accent-s) - 10%), calc(var(--accent-l) - 4%));
--scrollbar-active-thumb-bg: rgba(0, 0, 0, 0.2);
--scrollbar-bg: rgba(0, 0, 0, 0.05);
--scrollbar-thumb-bg: rgba(0, 0, 0, 0.1);
--panel-border-color: #dbdbdc;
--gray-1: #383a42;
--gray-2: #383a42;
--red: #e75545;
--green: #4ea24c;
--blue: #3d74f6;
--purple: #a625a4;
--aqua: #0084bc;
--yellow: #e35649;
--orange: #986800;
}
.theme-dark, .theme-light {
--ribbon-background: var(--background-primary);
--drag-ghost-background: var(--background-secondary-alt);
--background-modifier-message: var(--background-secondary-alt);
--tab-outline-color: transparent;
--divider-color: transparent;
--prompt-border-color: var(--panel-border-color);
--modal-border-color: var(--panel-border-color);
--background-modifier-border-hover: var(--interactive-hover);
--background-modifier-border-focus: var(--interactive-hover);
--checkbox-color: var(--text-accent);
--checkbox-color-hover: var(--text-accent-hover);
--nav-item-background-active: var(--interactive-accent);
--nav-item-color-active: #ffffff;
--tag-color: var(--yellow);
--tag-background: var(--background-primary-alt);
--tag-color-hover: var(--yellow);
--tag-background-hover: var(--background-primary-alt);
--tag-padding-x: 4px;
--tag-padding-y: 2px;
--tag-radius: 4px;
--inline-title-weight: var(--bold-weight);
--link-decoration: none;
--link-external-decoration: none;
--embed-padding: 0 0 0 var(--size-4-4);
}
/* Search */
.search-result .search-result-file-title {
cursor: pointer;
}
.search-result .collapse-icon {
cursor: var(--cursor);
}
.search-result:not(.is-collapsed) .search-result-file-title {
color: var(--blue);
}
/* File tab separators */
.workspace .mod-root .workspace-tab-header-inner::after {
right: unset;
left: -0.5px;
}
.workspace .mod-root .workspace-tab-header:last-child .workspace-tab-header-inner::before {
position: absolute;
right: -0.5px;
width: 1px;
background-color: var(--tab-divider-color);
content: '';
height: 20px;
}
.workspace .mod-root .workspace-tab-header.is-active .workspace-tab-header-inner::after,
.workspace .mod-root .workspace-tab-header.is-active .workspace-tab-header-inner::before,
.workspace .mod-root .workspace-tab-header:first-child .workspace-tab-header-inner::after,
.workspace .mod-root .workspace-tab-header.is-active + .workspace-tab-header .workspace-tab-header-inner::after {
opacity: 0;
}
/* Editor and output */
.markdown-rendered blockquote {
padding: var(--embed-padding);
}
mjx-container {
text-align: left !important;
}
.math-block {
font-size: 1.3em;
}
.theme-light :not(pre)>code,
.theme-light pre {
background: var(--background-primary);
box-shadow: inset 0 0 0 1px var(--background-primary-alt);
border-radius: 4px;
}
.markdown-preview-section > div h1,
.markdown-preview-section > div h2,
.markdown-preview-section > div h3,
.markdown-preview-section > div h4,
.markdown-preview-section > div h5,
.markdown-preview-section > div h6 {
margin-top: 40px;
}
.mod-header + div h1,
.mod-header + div h2,
.mod-header + div h3,
.mod-header + div h4,
.mod-header + div h5,
.mod-header + div h6 {
margin-top: 30px;
}
.cm-sizer > .inline-title {
margin-bottom: 20px;
}
/* Miscellaneous */
.theme-dark .dropdown:hover {
background-color: var(--background-modifier-form-field);
}
.tooltip {
color: var(--text-muted);
}
.nav-file, .nav-folder {
padding: 1px 2px;
}
body:not(.is-grabbing) .nav-file-title.is-being-dragged,
body:not(.is-grabbing) .nav-folder-title.is-being-dragged,
.nav-file-title.is-being-dragged,
.nav-folder-title.is-being-dragged {
background-color: var(--background-primary-alt);
color: var(--nav-item-color);
}
.view-header-title {
text-decoration: underline;
text-decoration-color: var(--text-muted);
text-underline-offset: 1.5px;
}
.status-bar {
border-color: var(--panel-border-color);
border-width: 1px;
padding: 4px 8px;
}
.theme-dark button.mod-warning {
--background-modifier-error: #d42020;
--background-modifier-error-hover: #b01515;
}
.theme-light button.mod-warning {
--background-modifier-error: #f23f3f;
--background-modifier-error-hover: #d72020;
}
/* Code syntax highlighting */
code[class*='language-'], pre[class*='language-'] {
text-align: left !important;
white-space: pre !important;
word-spacing: normal !important;
word-break: normal !important;
word-wrap: normal !important;
line-height: 1.5 !important;
tab-size: 4 !important;
hyphens: none !important;
}
pre[class*='language-'] {
/* Code blocks */
padding: 1em !important;
margin: .5em 0 !important;
overflow: auto !important;
}
:not(pre)>code[class*='language-'] {
/* Inline code */
padding: .1em !important;
border-radius: .3em !important;
white-space: normal !important;
}
.token.comment, .token.prolog, .token.doctype, .token.cdata,
.HyperMD-codeblock .cm-comment {
color: var(--gray-1) !important;
}
.token.punctuation,
.HyperMD-codeblock .cm-hmd-codeblock, .HyperMD-codeblock .cm-bracket {
color: var(--gray-2) !important;
}
.token.selector, .token.tag,
.HyperMD-codeblock .cm-tag, .HyperMD-codeblock .cm-property, .HyperMD-codeblock .cm-meta, .HyperMD-codeblock .cm-qualifier, .HyperMD-codeblock .cm-header, .HyperMD-codeblock .cm-quote, .HyperMD-codeblock .cm-hr, .HyperMD-codeblock .cm-link {
color: var(--red) !important;
}
.token.property, .token.boolean, .token.number, .token.constant, .token.symbol, .token.attr-name, .token.deleted,
.HyperMD-codeblock .cm-number, .HyperMD-codeblock .cm-atom, .HyperMD-codeblock .cm-attribute {
color: var(--orange) !important;
}
.token.string, .token.char, .token.attr-value, .token.builtin, .token.inserted,
.HyperMD-codeblock .cm-string, .HyperMD-codeblock .cm-builtin {
color: var(--green) !important;
}
.token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string,
.HyperMD-codeblock .cm-string-2, .HyperMD-codeblock .cm-operator {
color: var(--aqua) !important;
}
.token.atrule, .token.keyword,
.HyperMD-codeblock .cm-keyword {
color: var(--purple) !important;
}
.token.function, .token.macro.property,
.HyperMD-codeblock .cm-def, .HyperMD-codeblock .cm-variable {
color: var(--blue) !important;
}
.token.class-name,
.HyperMD-codeblock .cm-variable-2, .HyperMD-codeblock .cm-variable-3 {
color: var(--yellow) !important;
}
.token.regex, .token.important, .token.variable {
color: var(--purple) !important;
}
.token.important, .token.bold {
font-weight: bold !important;
}
.token.italic {
font-style: italic !important;
}
.token.entity {
cursor: help !important;
}

View File

@ -0,0 +1,7 @@
{
"name": "Blue Topaz",
"version": "2023112601",
"minAppVersion": "1.0.0",
"author": "WhyI & Pkmer",
"authorUrl": "https://github.com/whyt-byte"
}

28558
.obsidian/themes/Blue Topaz/theme.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,8 @@
{
"name": "Minimal",
"version": "7.5.2",
"minAppVersion": "1.5.4",
"author": "@kepano",
"authorUrl": "https://twitter.com/kepano",
"fundingUrl": "https://www.buymeacoffee.com/kepano"
}

2150
.obsidian/themes/Minimal/theme.css vendored Normal file

File diff suppressed because one or more lines are too long

7
.obsidian/themes/Things/manifest.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"name": "Things",
"version": "2.1.20",
"minAppVersion": "1.0.0",
"author": "@colineckert",
"authorUrl": "https://twitter.com/colineckert"
}

1611
.obsidian/themes/Things/theme.css vendored Normal file

File diff suppressed because it is too large Load Diff

167
.obsidian/workspace.json vendored Normal file
View File

@ -0,0 +1,167 @@
{
"main": {
"id": "318381ba6697d90a",
"type": "split",
"children": [
{
"id": "dd2b91766b5fe0d5",
"type": "tabs",
"children": [
{
"id": "825e481f881b6659",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "!!!INFO!!! Daggerheart Open Beta Playtest.md",
"mode": "source",
"source": false
}
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "f18fb07327a637d2",
"type": "split",
"children": [
{
"id": "bf67d48604ac442d",
"type": "tabs",
"children": [
{
"id": "55b37dbc4b1a4cf2",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical"
}
}
},
{
"id": "50c4a3dfb5da8794",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
}
}
},
{
"id": "42a85a41a7d82aeb",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {}
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "f99f6c65bb86ca98",
"type": "split",
"children": [
{
"id": "568febb72e5ed204",
"type": "tabs",
"children": [
{
"id": "1c2feb8cb736ca18",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "!!!INFO!!! Daggerheart Open Beta Playtest.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
}
}
},
{
"id": "88e0040922b29902",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "!!!INFO!!! Daggerheart Open Beta Playtest.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
}
}
},
{
"id": "ae1b117aec55e814",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
}
}
},
{
"id": "9464f52c95ae20cb",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "!!!INFO!!! Daggerheart Open Beta Playtest.md"
}
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false
}
},
"active": "825e481f881b6659",
"lastOpenFiles": [
"!!!INFO!!! Daggerheart Open Beta Playtest.md",
"Pasted image 20240317164536.png",
"Pasted image 20240317162625.png",
"Pasted image 20240317162230.png",
"Pasted image 20240317162016.png",
"Pasted image 20240317150930.png",
"Pasted image 20240317150924.png",
"Pasted image 20240317143057.png",
"Health.png",
"Evasion.png",
"Dodging.png",
"Das Abenteuer/Quick Start Adventure - Digital Reader - Daggerheart Nexus.md",
"1. Character Erstellung.md",
"Das Abenteuer",
"Welcome.md"
]
}

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

View File

@ -0,0 +1,103 @@
---
page-title: "Quick Start Adventure - Digital Reader - Daggerheart Nexus"
url: https://app.demiplane.com/nexus/daggerheart/sources/open-beta-adventure/the-sablewood-messengers#themerchantcart
date: "2024-03-15 20:12:30"
---
# Der Händlerwagen
## Der Anfang
Read the following aloud to your players:
> Heute Abend hat es eure Gruppe endlich in den Zobelwald geschafft, einen weitläufigen Wald mit kolossalen Bäumen, von denen einige sagen, dass sie sogar älter sind als die Vergessenen Götter. Es ist ein Ort, der für zwei Dinge bekannt ist: seine versunkenen Pfade, die die Handelsrouten für viele reisende Händler bieten, und seine einzigartigen Hybridtiere. Noch jetzt hört man aus dem Wagen heraus seltsame Geräusche: die Vogelstimmen der Lerchenmotten, das Quaken der Lemurenkröten, das Fiepen einer Familie von Fuchsfledermäusen im Unterholz. Einer von euch fährt die Kutsche. Wer ist das?
Wenn ein Spieler seinen Charakter freiwillig als Kutscher anbietet, kannst du ihm eine Frage stellen wie:
> Ihr habt etwas Einzigartiges am Aussehen der Bäume hier im Zobelwald bemerkt. Was ist es?
Beschreiben Sie auf der Grundlage ihrer Antwort die Bäume, an denen die Spieler vorbeikommen, als solche mit diesen Merkmalen.
> Während deine Rösser die Kutsche um eine enge Kurve ziehen und ein Rad nur für einen Moment vom Boden abhebt, siehst du einen umgestürzten Kaufmannskarren, der seitlich vor dir auf dem Weg liegt und dir den Weg versperrt. Eine Vereinzelung von Obst und Gemüse säumt den Weg. Von der Seite des Wagens tritt ein Strix-Wolf; Eine große Kreatur mit dem Körper eines Wolfes, dem Gesicht einer Eule und großen Flügeln, die ihren Rücken schmücken. Er kaut seine Mahlzeit, die Hand des toten Händlers, zu Ende, während er dich neugierig anstarrt und versucht zu beurteilen, ob du Freund oder Feind bist. Dann siehst du, unbeholfen hinter dir her, zwei kleine Welpen, die ihre Mutter vorsichtig beobachten.
>Innerlich spürt der Rest von euch, wie eure Kutsche zum Stillstand kommt. Was möchten Sie tun?
Allow the PCs to roleplay for a little bit if theyd like. When somebody approaches the merchant cart, that will trigger the first action roll.
![](https://app.demiplane.com/_next/image?url=https%3A%2F%2Fimages.demiplane.com%2Fcompendium%2Fdaggerheart%2Fopen-beta-adventure%2FQjnB6MSjROOmBVS0%2F00-41-Quickstart-pg29.png&w=1920&q=90)
## The First Action Roll
Read the following aloud:
> Der Strix-Wolf ist misstrauisch gegenüber deiner Bewegung. Wirf mir bitte einen Duality Dice und füge deine Presence hinzu. Du kannst auch eine Hoffnung vor dem Wurf ausgeben, um eine Erfahrung hinzuzufügen, falls dies zutrifft. Dann sag mir, wie hoch die Summe ist und welcher Würfel höher gewürfelt wurde!
### ERFOLG
Wenn sie eine 10 oder höher gewürfelt haben, ist es ein Erfolg!
> *Beschreiben Sie die Strix-Wölfin, die ruhig versucht, ihre Welpen aus der Gefahr zu halten.*
==Wenn der Wurf mit Hoffnung war, sag dem Spieler, dass er eine Hoffnung markieren soll.==
==Wenn der Wurf mit Furcht war, nimm einen Furcht-Spielstein für später.==
Du hast auch die Möglichkeit, einen GM-Zug zu machen. Das ist deine Chance, eine Konsequenz in die Szene zu bringen. Es sollte den Erfolg nicht untergraben, sondern die Erzählung auf spannende Weise vorantreiben. Man könnte sagen:
>Die Mutter heult, als ob sie einen anderen Strix-Wolf zwischen den Bäumen rufen wollte. Du weißt, dass du vielleicht nicht lange allein bist.
### FEHLSCHLAG
Wenn sie eine 9 oder weniger gewürfelt haben, ist es ein Misserfolg.
>*Beschreiben Sie, wie der Strix-Wolf knurrt und schnappt, wütend darüber, dass sich der SC nähert.*
==Wenn der Wurf mit Hoffnung war, sag dem Spieler, dass er eine Hoffnung markieren soll.==
Du kannst immer noch einen GM-Zug machen, aber weil es mit Hope ist, sollte es nicht so schlimm sein, wie es sein könnte. Man könnte sagen:
Wenn der Wurf mit Angst war, laufen die Dinge schlecht. Beschreiben Sie den Strix-Wolf, der den PC anknurrt. Sagen Sie ihnen, dass sie einen Stress markieren sollen.
> Mit einem letzten Knurren beugt sie sich herunter, damit ihre Welpen auf ihren Rücken klettern können, bevor sie in die Luft abhebt und auf einem Ast in der Nähe landet. Sie beobachtet jede deiner Bewegungen.
### KRITISCHER ERFOLG
Wenn beide Würfel die gleiche Zahl würfeln, ist das ein kritischer Erfolg! ==Sag dem PC, dass er eine Hoffnung markieren soll.== Ebenfalls kann dieser auch einen Stress löschen, wenn er einen hat.
> *Beschreiben Sie dann den Strix-Wolf, der sich mit gesenktem Kopf und wedelndem Schwanz auf den PC zubewegt. Er schnüffelt an ihrer Hand und setzt sich vor sie.*
## Die Folgen
Lassen Sie die Ereignisse des vorherigen Aktes ablaufen, so dass die Spieler Rollenspiele spielen und andere Aktionen ausführen können. Verwenden Sie die folgenden Szenarien als Anleitung.
### SCENARIOS
**Wenn sie den Händlerwagen durchsuchen,** kann man darüber sprechen, dass der Wagen aller Wertsachen beraubt wurde, und den toten Fahrer mit einem verstümmelten Arm zeigen, welcher von der Familie Strix-Wolf als Futter angeknabbert wurde. Wenn die PCs die Leiche weiter untersuchen, könnten sie feststellen, dass dem Fahrer der Hals aufgeschlitzt wurde.
**Wenn sie den Strixwolf angreifen**, lass sie einen Angriffswurf auf der Schwierigkeitsstufe 10 gegen ihn machen. Bei Erfolg verursachen sie mit ihrer Waffe Schaden. Die Welpen werden fliehen.
**Wenn sie es nicht schaffen, mit dem Strixwolf zu interagieren, zieht er seine Welpen auf den Rücken und fliegt in einen nahe gelegenen Baum, wobei er die Abenteurer von oben beobachtet.
**Wenn sie versuchen, Anzeichen für etwas Seltsames zu finden**, sehen sie die Überreste von dornigem Brombeergestrüpp, die sich um das Rad der Kutsche verheddert haben und auf der Strasse verstreut sind.
**Wenn sie den Händlerwagen aus dem Weg räumen wollen, Schritte unternehmen, um ihre Kutsche wieder in Bewegung zu setzen, oder versuchen, die Spur zu verlassen**, gehen zu [[Quick Start Adventure - Digital Reader - Daggerheart Nexus#The Ambush]]
## Der Hinterhalt
Wenn sich der Moment richtig anfühlt oder eines der oben genannten Szenarien ihn auslöst, bitte einen PC, der auf seine Umgebung zu achten scheint, einen **Instinct** mit einem Schwierigkeitsgrad von 14 auszuführen.
> *Bei einem Erfolg bemerken sie, dass Augen sie aus der Dunkelheit jenseits des Weges beobachten. Wenn es mit FEAR war, markiert der PC einen Stress. Verwenden Sie die Aufforderungen "[[Quick Start Adventure - Digital Reader - Daggerheart Nexus#Ich sehe sie!|Ich sehe Sie!]]".*
> *Bei einem Fehlschlag geraten sie sofort in einen Hinterhalt. Wenn es mit FEAR war, markiert der PC einen Stress. Verwenden Sie die Eingabeaufforderungen "Aus dem Hinterhalt!".*
### Ich sehe sie!
Read the following aloud:
> Du hörst das Knacken eines Astes und drehst dich um, um vier _Thistlefolk_ zu sehen, die sich durch das Unterholz schleichen und versuchen, auf deine Gruppe zu springen. Der umgekippte Wagen war eine Ablenkung, aber ihr Plan ging nicht auf.
### Aus dem Hinterhalt!
Lesen Sie folgendes vor:
> In einem Wirbelsturm aus knackenden Ästen und ausgezogenen Halmen springt eine Gruppe von vier _Thistlefolk_ aus dem Gebüsch am Straßenrand. Der umgekippte Wagen war ein Hinterhalt! Sie stehen mit gezogenen Waffen vor euch und blockieren die Straße.
# Mapaufbau
Geb den Spielern einige Bäume und Steine, dass sie mit dir eine Map erbauen und stelle schlussendlich den Karren auf. Frage dann deine Spieler, dass sie einen Characterstein aufstellen sollen, wo sie ungefähr wären. Stelle **DANACH** die Gegner auf.
Unten findest du die Stat-Blöcke für die Ambushers und Thief. Du wirst diese Werteblöcke verwenden, um den Rest dieser Begegnung zu spielen. Vergiss nicht, den Kampf zu deinem eigenen zu machen. Entscheide, wie das _Thistlefolk_ im Detail aussieht
![](https://preview.redd.it/no-spoilers-daggerheart-tabletop-miniatures-sculpt-v0-522elpg6zioc1.png?width=375&format=png&auto=webp&s=f405d0f80f94175e5c9827ab733202c4333b77d6)
> *Beschreiben Sie die Szene, als würden die Spieler einen Film sehen oder ein Buch lesen, und wenn Sie sich damit wohlfühlen, bitten Sie sie, sich auch am Aufbau der Szene zu beteiligen.
Das kann so einfach sein, wie sie zu bitten, ihren Angriff oder ihr Ausweichen im Detail zu beschreiben, aber du könntest sie auch weiter einbeziehen frag sie, welches einzigartige Kleidungsstück die Ambusher alle tragen oder welchen interessanten Kampfstil sie zu verwenden scheinen.

BIN
Dodging.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
Evasion.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
Health.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
School.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
Weapons.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB