Compare commits

..

No commits in common. "94c2b3e9dd892b65279ecfc94039cb3c814c9919" and "ff9e59078f9547a5ddc0fbb0d27b17df4dd1d625" have entirely different histories.

220 changed files with 841 additions and 2832 deletions

1
.gitignore vendored
View File

@ -1,3 +1,2 @@
dist
node_modules
src/packs/__source

View File

@ -5,10 +5,8 @@
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
<excludeFolder url="file://$MODULE_DIR$/src/packs/__source" />
<excludeFolder url="file://$MODULE_DIR$/src/packs/__source" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
</module>

View File

@ -1,70 +1,23 @@
import {dest, series, src} from 'gulp';
import process from 'node:process';
import replace from 'gulp-replace';
import {getRandomValues} from 'node:crypto';
import * as dartSass from 'sass';
import gulpSass from 'gulp-sass';
import {deleteAsync} from 'del';
import {readdirSync, readFileSync, writeFileSync, rmdirSync, existsSync, mkdirSync} from "fs";
import {readdirSync} from 'node:fs';
import {join} from 'node:path';
import {compilePack} from '@foundryvtt/foundryvtt-cli';
const sass = gulpSass(dartSass);
/**
* Generate a random alphanumeric string ID of a given requested length using `crypto.getRandomValues()`.
* @param {number} length The length of the random string to generate, which must be at most 16384.
* @returns {string} A string containing random letters (A-Z, a-z) and numbers (0-9).
*/
function randomID(length = 16) {
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
const cutoff = 0x100000000 - (0x100000000 % chars.length);
const random = new Uint32Array(length);
do {
getRandomValues(random);
} while (random.some(x => x >= cutoff));
let id = "";
for (let i = 0; i < length; i++) id += chars[random[i] % chars.length];
return id;
}
const convert = function (from, to, ofType) {
const SOURCE = from;
const DEST = to;
const TYPE = ofType;
try {
rmdirSync(DEST, {force: true, recursive: true})
} catch (e) {
}
mkdirSync(DEST)
readdirSync(SOURCE).forEach(file => {
let originalSource = JSON.parse(readFileSync(join(SOURCE, file), {encoding: "utf8"}));
let id = randomID();
let targetSource = {
_id: id,
_key: "!items!" + id,
type: TYPE,
img: originalSource.image,
name: originalSource.name.trim(),
system: {...originalSource}
}
delete targetSource.system.image;
let target = JSON.stringify(targetSource, null, 2);
let newFileName = "./" + join(DEST, id + ".json");
writeFileSync(newFileName, target, {encoding: "utf8"});
});
}
function cleanDist() {
return deleteAsync(['dist/**']);
}
function buildStyles() {
return src('src/style/**/*.scss')
.pipe(sass().on('error', sass.logError))
@ -87,27 +40,6 @@ function updateManifestFile() {
.pipe(dest('dist/'))
}
async function prepareDB() {
try {
if (!existsSync("./src/packs/__source")) {
mkdirSync("./src/packs/__source");
}
convert("./src/packs/_source/talente", "./src/packs/__source/talente", "Skill");
convert("./src/packs/_source/zauber", "./src/packs/__source/zauber", "Spell");
convert("./src/packs/_source/vorteile", "./src/packs/__source/vorteile", "Advantage");
convert("./src/packs/_source/waffen", "./src/packs/__source/waffen", "Equipment");
convert("./src/packs/_source/munition", "./src/packs/__source/munition", "Equipment");
convert("./src/packs/_source/ruestzeug", "./src/packs/__source/ruestzeug", "Equipment");
convert("./src/packs/_source/liturgien-und-segnungen", "./src/packs/__source/liturgien", "Liturgy");
} catch (err) {
console.error(err);
}
}
function buildDB() {
// Determine which source folders to process
@ -123,7 +55,7 @@ function buildDB() {
const src = join(PACK_SRC, folder.name);
const dest = join(PACK_DEST, folder.name);
console.info(`Compiling pack ${folder.name}`);
await compilePack(src, dest, {recursive: true, nedb: false});
await compilePack(src, dest, {recursive: true, log: true, nedb: false});
}
resolve()
@ -136,7 +68,6 @@ export default series(
copySource,
copyAssets,
buildStyles,
prepareDB,
buildDB,
updateManifestFile
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

View File

@ -13,9 +13,6 @@ import {EquipmentDataModel} from "./module/data/equipment.mjs";
import {AusruestungSheet} from "./module/sheets/equipmentSheet.mjs";
import {CreatureDataModel} from "./module/data/creature.mjs";
import {CreatureSheet} from "./module/sheets/creatureSheet.mjs";
import {LiturgySheet} from "./module/sheets/liturgySheet.mjs";
import {LiturgyDataModel} from "./module/data/liturgy.mjs";
import {BlessingDataModel} from "./module/data/blessing.mjs";
async function preloadHandlebarsTemplates() {
return loadTemplates([
@ -29,8 +26,7 @@ async function preloadHandlebarsTemplates() {
'systems/DSA_4-1/templates/ui/partial-action-button.hbs',
'systems/DSA_4-1/templates/ui/partial-equipment-button.hbs',
'systems/DSA_4-1/templates/ui/partial-equipment-group-button.hbs',
'systems/DSA_4-1/templates/ui/partial-array-editor.hbs',
'systems/DSA_4-1/templates/dialog/modify-liturgy.hbs'
'systems/DSA_4-1/templates/ui/partial-array-editor.hbs'
]);
}
@ -55,8 +51,6 @@ Hooks.once("init", () => {
Spell: SpellDataModel,
Advantage: VornachteileDataModel,
Equipment: EquipmentDataModel,
Liturgy: LiturgyDataModel,
Blessing: BlessingDataModel
}
CONFIG.Combat.initiative = {
@ -103,11 +97,6 @@ Hooks.once("init", () => {
makeDefault: true,
label: 'DSA41.AusruestungLabels.Item'
})
Items.registerSheet('dsa41.liturgy', LiturgySheet, {
types: ["Liturgy"],
makeDefault: true,
label: 'DSA41.LiturgyLabels.Item'
})
return preloadHandlebarsTemplates();
})

View File

@ -1,13 +0,0 @@
const {
SchemaField, NumberField, StringField, EmbeddedDocumentField, DocumentIdField, ArrayField, ForeignDocumentField
} = foundry.data.fields;
export class BlessingDataModel extends foundry.abstract.TypeDataModel {
static defineSchema() {
return {
gottheit: new StringField(),
wert: new NumberField({min: 0, integer: true}),
}
}
}

View File

@ -107,7 +107,23 @@ export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
}),
gilde: new StringField(),
}),
vornachteile: new ArrayField(new SchemaField({
vornachteil: new DocumentIdField(Item),
wert: new NumberField({required: false, integer: true}),
})),
sonderfertigkeiten: new ArrayField(new SchemaField({
name: new StringField(),
auswahlen: new ArrayField(new StringField()),
})),
talente: new ArrayField(new DocumentIdField(Item)),
zauber: new ArrayField(new SchemaField({
talent: new DocumentIdField(),
zfw: new NumberField({integer: true, required: true}),
})),
liturgien: new ArrayField(new SchemaField({
name: new StringField(),
})),
kampfwerte: new ArrayField(new SchemaField({
name: new StringField(),
at: new NumberField({required: true, integer: true}),

View File

@ -1,31 +0,0 @@
const {
SchemaField, NumberField, StringField, HTMLField, ArrayField
} = foundry.data.fields;
export class CreatureDataModel extends foundry.abstract.TypeDataModel {
static defineSchema() {
return {
ini: new SchemaField({
aktuell: new NumberField(),
wuerfel: new NumberField(),
}),
lep: new SchemaField({
max: new NumberField(),
aktuell: new NumberField(),
}),
mr: new NumberField(),
rs: new NumberField(),
attacks: new ArrayField(
new SchemaField({
at: new NumberField(),
pa: new NumberField(),
tp: new StringField(),
name: new StringField(),
}), {min: 0}),
description: new HTMLField()
}
}
}

View File

@ -1,49 +0,0 @@
import BaseItem from "./base-item.mjs";
const {BooleanField, NumberField, SchemaField, ArrayField, StringField, HTMLField} = foundry.data.fields;
export class LiturgyDataModel extends BaseItem {
static defineSchema() {
return {
herkunft: new ArrayField(new SchemaField({
name: new StringField(),
grad: new NumberField(),
})),
grad: new NumberField({min: 1, max: 5}),
reichweite: new StringField(),
ziel: new StringField(),
wirkungsdauer: new StringField(),
auswirkung: new SchemaField({
I: new StringField(),
II: new StringField(),
III: new StringField(),
IV: new StringField(),
V: new StringField(),
VI: new StringField(),
VII: new StringField(),
VIII: new StringField(),
})
}
}
prepareData() {
}
/**
* Prepare a data object which is passed to any Roll formulas which are created related to this Item
* @private
*/
getRollData() {
}
/**
* Handle clickable rolls.
* @param {Event} event The originating click event
* @private
*/
async roll() {
}
}

View File

@ -1,115 +0,0 @@
export class LiturgyData {
static ranks = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII"]
static #ranks = [
{index: 0, name: "O", lkp: 3, mod: 2, costKaP: 2, costKaPPermant: 0, duration: "{*} KR", strength: "{*}/2"},
{index: 1, name: "I", lkp: 3, mod: 0, costKaP: 5, costKaPPermant: 0, duration: "{*} KR", strength: "{*}/2"},
{
index: 2,
name: "II",
lkp: 6,
mod: -2,
costKaP: 10,
costKaPPermant: 0,
duration: "{*}*10 KR",
strength: "{*}/2+5"
},
{index: 3, name: "III", lkp: 9, mod: -4, costKaP: 15, costKaPPermant: 0, duration: "{*} SR", strength: "{*}+5"},
{
index: 4,
name: "IV",
lkp: 12,
mod: -6,
costKaP: 20,
costKaPPermant: 0,
duration: "{*} Stunden",
strength: "{*}+10"
},
{
index: 5,
name: "V",
lkp: 15,
mod: -8,
costKaP: 25,
costKaPPermant: 1,
duration: "{*} Tage",
strength: "{*}+15"
},
{
index: 6,
name: "VI",
lkp: 18,
mod: -10,
costKaP: 30,
costKaPPermant: 3,
duration: "{*} Wochen",
strength: "{*}+20"
},
{
index: 7,
name: "VII",
lkp: 21,
mod: -12,
costKaP: 35,
costKaPPermant: 5,
duration: "{*} Monate",
strength: "{*}+25"
},
{
index: 8,
name: "VIII",
lkp: 24,
mod: -14,
costKaP: 40,
costKaPPermant: 7,
duration: "{*} Jahre oder permanent",
casttime: "",
strength: "{*}+30"
},
];
static alverans = [
"Praios",
"Rondra",
"Efferd",
"Travia",
"Boron",
"Hesinde",
"Firun",
"Tsa",
"Phex",
"Peraine",
"Ingerimm",
"Rahja"
]
static #aliases = [
{
"originalName": "Handwerkssegen",
"aliases": ["Cereborns Handreichung", "Hauch der Leidenschaft"]
},
{
"originalName": "Heiliger Befehl",
"aliases": ["Wort der Wahrheit"],
},
{
"originalName": "Eidsegen",
"aliases": ["Lehnseid"],
}
]
static getRankOfLiturgy(liturgy, deity) {
const lookupData = liturgy.herkunft.find(p => p.name === deity)
const rank = lookupData?.grad;
return LiturgyData.#ranks[rank];
}
static lookupAlias(alias) {
return LiturgyData.#aliases.find((entry) => {
console.log(alias, entry.aliases.indexOf(alias) !== -1)
return entry.aliases.indexOf(alias) !== -1
})?.originalName ?? alias; // cant determine thus simply return the original query name
}
}

View File

@ -1,89 +0,0 @@
import {LiturgyData} from "../data/miracle/liturgydata.mjs";
export class ModifyLiturgy {
static data = {}
static naming = {
"range": "Reichweite",
"strength": "Wirkung",
"target": "Ziele",
"castduration": "Wirkzeit",
"duration": "Wirkdauer"
}
constructor(data) {
ModifyLiturgy.data = data;
ModifyLiturgy.data.maxmods = Math.round(data.lkp / 3);
ModifyLiturgy.data.variation = null;
console.log("ModifyLiturgy constructed", data)
}
static renderMods(html) {
let result = '';
ModifyLiturgy.data.mods.forEach(((mod, index) => {
result += `<tr><td>${LiturgyData.ranks[mod.rank]}</td><td>${ModifyLiturgy.naming[mod.mod]}</td><td><button class="remove-mod" data-index="${index}"><i class="fa-solid fa-xmark"></i></button></td></tr>`
}))
return result;
}
handleRender(html) {
html.off('click', 'input[name="data.variation"]')
html.on('click', 'input[name="data.variation"]', (evt) => {
if (evt.currentTarget.checked) {
ModifyLiturgy.data.variation = evt.currentTarget.dataset['rank'];
ModifyLiturgy.data.mods = [];
}
this.render(html)
})
html.off('click', 'button[class="remove-mod"]')
html.on('click', 'button[class="remove-mod"]', (evt) => {
const {index} = evt.currentTarget.dataset;
ModifyLiturgy.data.mods.splice(index, 1);
this.render(html)
})
html.off('change', 'select[name="mod"]')
html.on('change', 'select[name="mod"]', (evt) => {
const value = evt.currentTarget.value;
if (value === '') return;
const currentRank = ModifyLiturgy.data.mods.length + Number(ModifyLiturgy.data.rank);
ModifyLiturgy.data.mods.push({
rank: currentRank,
mod: value,
});
evt.currentTarget.value = "";
this.render(html)
})
// render state
$('#mods', html).html(ModifyLiturgy.renderMods(html))
// state handling
if (ModifyLiturgy.data.mods.length === ModifyLiturgy.data.maxmods) {
$(".editor, .editor *", html).attr('disabled', 'disabled');
$(".editor select", html).hide();
$('span#info', html).text('LkW lässt keine weitere Modifikationen zu')
$("#mod_rank", html).text(LiturgyData.ranks[ModifyLiturgy.data.mods.length + Number(ModifyLiturgy.data.rank)]);
} else if (ModifyLiturgy.data.variation == null) {
$(".editor select *", html).attr('disabled', 'disabled');
$(".editor select", html).hide();
$('span#info', html).text('Keine Variante ausgewählt')
$("#mod_rank", html).text('');
} else {
$(".editor, .editor *", html).removeAttr('disabled');
$(".editor select", html).show();
$('span#info', html).text('')
$("#mod_rank", html).text('');
}
}
}

View File

@ -1,9 +0,0 @@
export class Blessing extends Item {
/**
* Augment the basic Item data model with additional dynamic data.
*/
prepareData() {
super.prepareData();
}
}

View File

@ -1,5 +1,4 @@
import {importCharacter} from "../xml-import/xml-import.mjs";
import {LiturgyData} from "../data/miracle/liturgydata.mjs";
export class Character extends Actor {
@ -28,44 +27,27 @@ export class Character extends Actor {
const actorData = this;
const systemData = actorData.system;
const mu = systemData.attribute.mu.aktuell + systemData.attribute.mu.mod;
const kl = systemData.attribute.kl.aktuell + systemData.attribute.kl.mod;
const _in = systemData.attribute.in.aktuell + systemData.attribute.in.mod;
const ch = systemData.attribute.ch.aktuell + systemData.attribute.ch.mod;
const mu = systemData.attribute.mu.aktuell;
const kl = systemData.attribute.kl.aktuell;
const _in = systemData.attribute.in.aktuell;
const ch = systemData.attribute.ch.aktuell;
const ff = systemData.attribute.ff.aktuell + systemData.attribute.ff.mod;
const ge = systemData.attribute.ge.aktuell + systemData.attribute.ge.mod;
const ko = systemData.attribute.kk.aktuell + systemData.attribute.ko.mod;
const kk = systemData.attribute.kk.aktuell + systemData.attribute.kk.mod;
const ff = systemData.attribute.ff.aktuell;
const ge = systemData.attribute.ge.aktuell;
const ko = systemData.attribute.kk.aktuell;
const kk = systemData.attribute.kk.aktuell;
systemData.lep.max = Math.round((ko + ko + kk) / 2) + systemData.lep.mod;
systemData.aup.max = Math.round((mu + ko + ge) / 2) + systemData.aup.mod;
systemData.asp.max = Math.round((mu + _in + ch) / 2) + systemData.asp.mod;
systemData.at = Math.round((mu + ge + kk) / 5);
systemData.pa = Math.round((_in + ge + kk) / 5);
systemData.fk = Math.round((_in + ff + kk) / 5);
systemData.ini.aktuell = Math.round((mu + mu + _in + ge) / 5) + systemData.ini.mod;
systemData.mr.aktuell = Math.round((mu + kl + ko) / 5) + systemData.mr.mod;
// evaluate deities for KaP
systemData.rs = 0;
systemData.kap.max = 0;
const deities = systemData.parent.items.filter(p => p.type === "Blessing")
deities?.forEach((deity) => {
if (LiturgyData.alverans.includes(deity.system.gottheit)) {
systemData.kap.max = 24;
} else if (systemData.kap.max === 0) {
systemData.kap.max += 12;
}
}, 0)
}

View File

@ -1,28 +0,0 @@
export class Creature extends Actor {
/**
* Augment the basic Item data model with additional dynamic data.
*/
prepareData() {
super.prepareData();
this.prepareEmbeddedDocuments();
}
getRollData() {
const data = super.getRollData();
console.log(this.type)
if (this.type !== 'character' && this.type !== 'creature') return;
// Copy the ability scores to the top level, so that rolls can use
// formulas like `@str.mod + 4`.
if (data.attribute) {
for (let [k, v] of Object.entries(data.attribute)) {
data[k] = foundry.utils.deepClone(v);
}
}
return data;
}
}

View File

@ -1,9 +0,0 @@
export class Liturgy extends Item {
/**
* Augment the basic Item data model with additional dynamic data.
*/
prepareData() {
super.prepareData();
}
}

View File

@ -202,11 +202,11 @@ export class ActionManager {
]
#hatSonderfertigkeitBeginnendMit(name) {
return this.actor.system.sonderfertigkeiten?.find(p => p.name.startsWith(name)) != null
return this.actor.system.sonderfertigkeiten.find(p => p.name.startsWith(name)) != null
}
#hatSonderfertigkeit(name) {
return this.actor.system.sonderfertigkeiten?.find(p => p.name === name) != null
return this.actor.system.sonderfertigkeiten.find(p => p.name === name) != null
}
evaluate() {

View File

@ -1,7 +1,5 @@
import {PlayerCharacterDataModel} from "../data/character.mjs";
import {ActionManager} from "./actions/action-manager.mjs";
import {LiturgyData} from "../data/miracle/liturgydata.mjs";
import {ModifyLiturgy} from "../dialog/modify-liturgy.mjs";
export class CharacterSheet extends ActorSheet {
/**@override */
@ -25,28 +23,26 @@ export class CharacterSheet extends ActorSheet {
return `systems/DSA_4-1/templates/actor/actor-character-sheet.hbs`;
}
static onDroppedData(actor, characterSheet, data) {
const uuid = foundry.utils.parseUuid(data.uuid);
const collection = uuid.collection.index ?? uuid.collection;
const document = CharacterSheet.getElementByName(collection, uuid.id);
const {
name,
type
} = document
console.log(name, type)
switch (type) {
case "Skill":
return characterSheet.#handleDroppedSkill(actor, document); // on false cancel this whole operation
case "Advantage":
return characterSheet.#handleDroppedAdvantage(actor, document);
case "Equipment":
return characterSheet.#handleDroppedEquipment(actor, document);
case "Liturgy":
return characterSheet.#handleDroppedLiturgy(actor, document);
default:
return false;
}
/** @override */
async getData() {
const context = super.getData();
// Use a safe clone of the actor data for further operations.
const actorData = context.data;
// Add the actor's data to context.data for easier access, as well as flags.
context.system = actorData.system;
context.flags = actorData.flags;
this.#addSkillsToContext(context)
this.#addAdvantagesToContext(context)
this.#addAttributesToContext(context)
this.#addEquipmentsToContext(context)
await this.#addCombatStatistics(context)
this.#addActionsToContext(context)
this.#addSpellsToContext(context)
return context;
}
static getElementByName(collection, id) {
@ -105,30 +101,6 @@ export class CharacterSheet extends ActorSheet {
return merkmale.split(",").map((merkmal) => merkmal.trim())
}
/** @override */
async getData() {
const context = super.getData();
// Use a safe clone of the actor data for further operations.
const actorData = context.data;
// Add the actor's data to context.data for easier access, as well as flags.
context.system = actorData.system;
context.flags = actorData.flags;
context.derived = context.document.system;
this.#addSkillsToContext(context)
this.#addAdvantagesToContext(context)
this.#addAttributesToContext(context)
this.#addEquipmentsToContext(context)
await this.#addCombatStatistics(context)
this.#addActionsToContext(context)
this.#addSpellsToContext(context)
this.#addLiturgiesToContext(context)
return context;
}
#addSpellsToContext(context) {
const actorData = context.data;
context.spells = [];
@ -155,7 +127,6 @@ export class CharacterSheet extends ActorSheet {
})
}
})
context.hasSpells = context.spells.length > 0;
}
#addAttributesToContext(context) {
@ -595,116 +566,6 @@ export class CharacterSheet extends ActorSheet {
}
#addLiturgiesToContext(context) {
const actorData = context.data;
context.liturgies = [];
context.blessings = [];
Object.values(actorData.items).forEach((item, index) => {
if (item.type === "Blessing") {
context.blessings.push({
deity: item.system.gottheit,
value: item.system.wert
})
}
})
Object.values(actorData.items).forEach((item, index) => {
if (item.type === "Liturgy") {
context.blessings.forEach(({deity, value}) => {
let insertObject = context.liturgies.find(p => p.deity === deity);
if (!insertObject) {
insertObject = {
deity: deity,
lkp: value,
O: [],
I: [],
II: [],
III: [],
IV: [],
V: [],
VI: [],
VII: [],
VIII: [],
"NA": [],
countO: 1,
countI: 1,
countII: 1,
countIII: 1,
countIV: 1,
countV: 1,
countVI: 1,
countVII: 1,
countVIII: 1,
countNA: 0,
total: 3,
}
context.liturgies.push(insertObject);
}
// sort by rank
const rankData = LiturgyData.getRankOfLiturgy(item.system, deity)
if (rankData) {
let {index, name, lkp, mod, costKaP} = rankData;
insertObject["count" + name] = insertObject["count" + name] + 1;
insertObject[name].push({
id: item._id,
name: item.name,
lkpReq: lkp,
lkpMod: mod,
costKaP,
rank: index, // get effective liturgy rank based on deity
liturgiekenntnis: deity,
})
insertObject.total = insertObject.total + 1;
}
})
}
})
// clean up counter
Object.values(context.liturgies).forEach((litObject) => {
if (litObject.O.length === 0) litObject.countO = false;
if (litObject.I.length === 0) litObject.countI = false;
if (litObject.II.length === 0) litObject.countII = false;
if (litObject.III.length === 0) litObject.countIII = false;
if (litObject.IV.length === 0) litObject.countIV = false;
if (litObject.V.length === 0) litObject.countV = false;
if (litObject.VI.length === 0) litObject.countVI = false;
if (litObject.VII.length === 0) litObject.countVII = false;
if (litObject.VIII.length === 0) litObject.countVIII = false;
if (litObject.NA.length === 0) litObject.countNA = false;
})
context.hasLiturgies = context.blessings.length > 0;
}
#handleDroppedSkill(actor, skill) {
const array = Array.from(actor.items);
for (let i = 0; i < array.length; i++) {
if (array[i].name === skill.name) {
return false;
}
}
}
#handleDroppedAdvantage(actor, advantage) {
const array = Array.from(actor.items);
for (let i = 0; i < array.length; i++) {
if (array[i].name === advantage.name) { // TODO: adjust for uniqueness
return false;
}
}
}
activateListeners(html) {
super.activateListeners(html);
@ -837,77 +698,57 @@ export class CharacterSheet extends ActorSheet {
}
]);
html.on('click', '.liturgy.rollable', async (evt) => {
}
evt.stopPropagation();
const {id, rank, lkp, deity} = evt.currentTarget.dataset;
const document = await this.object.items.get(id)
const data = {};
data.rank = rank;
data.lkp = lkp;
data.deity = deity;
data.variations = [];
const ranks = LiturgyData.ranks
ranks.forEach(rank => {
if (document.system.auswirkung[rank]) {
data.variations.push({
rank,
effect: document.system.auswirkung[rank]
})
}
})
data.mods = [];
const htmlContent = await renderTemplate('systems/DSA_4-1/templates/dialog/modify-liturgy.hbs', data);
const dialogData = {
title: document.name,
content: htmlContent,
data: {},
buttons: {
submit: {
label: "Wirken",
icon: '<i class="fas fa-die"></i>',
callback: (html) => {
},
},
},
#handleDroppedSkill(actor, skill) {
const array = Array.from(actor.items);
for (let i = 0; i < array.length; i++) {
if (array[i].name === skill.name) {
return false;
}
dialogData.render = new ModifyLiturgy(data).handleRender
const dialog = new Dialog(dialogData, {
classes: ['dsa41', 'dialog', 'liturgy'],
height: 480
})
dialog.render(true);
return false;
})
}
}
#handleDroppedAdvantage(actor, advantage) {
const array = Array.from(actor.items);
for (let i = 0; i < array.length; i++) {
if (array[i].name === advantage.name) { // TODO: adjust for uniqueness
return false;
}
}
}
#handleDroppedEquipment(actor, equipment) {
const array = Array.from(actor.items);
for (let i = 0; i < array.length; i++) {
if (array[i].name === equipment.name) { // TODO: adjust item quantity if item is the same
console.log(equipment);
return false;
}
}
}
#handleDroppedLiturgy(actor, liturgy) {
const array = Array.from(actor.items);
for (let i = 0; i < array.length; i++) {
if (array[i].name === liturgy.name) { // TODO: allow multiple miracles with the same name
static onDroppedData(actor, characterSheet, data) {
const uuid = foundry.utils.parseUuid(data.uuid);
const collection = uuid.collection.index ?? uuid.collection;
const document = CharacterSheet.getElementByName(collection, uuid.id);
const {
name,
type
} = document
console.log(name, type)
switch (type) {
case "Skill":
return characterSheet.#handleDroppedSkill(actor, document); // on false cancel this whole operation
case "Advantage":
return characterSheet.#handleDroppedAdvantage(actor, document);
case "Equipment":
return characterSheet.#handleDroppedEquipment(actor, document);
default:
return false;
}
}
}
}

View File

@ -1,97 +0,0 @@
export class CreatureSheet extends foundry.appv1.sheets.ActorSheet {
/**@override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ['dsa41', 'sheet', 'actor', 'creature'],
width: 520,
height: 480,
tabs: [
{
navSelector: '.sheet-tabs',
contentSelector: '.sheet-body',
initial: 'meta',
},
],
});
}
/** @override */
get template() {
return `systems/DSA_4-1/templates/actor/actor-creature-sheet.hbs`;
}
/** @override */
getData() {
const context = super.getData();
const actorData = context.data;
context.attacks = [];
actorData.system.attacks.forEach((attack, index) => {
context.attacks.push({
namepath: `system.attacks.${index}.name`,
name: attack.name,
atpath: `system.attacks.${index}.at`,
at: attack.at,
papath: `system.attacks.${index}.pa`,
pa: attack.pa,
tppath: `system.attacks.${index}.tp`,
tp: attack.tp,
index: index,
})
})
return context;
}
activateListeners(html) {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.isEditable) return;
html.on('click', '.remove-attack', async (evt) => {
const {index} = evt.target.dataset;
let sans = Array.from(this.object.system.attacks);
sans.splice(index, 1);
await this.object.update({'system.attacks': sans})
})
html.on('click', '.attacks-die.die', async (evt) => {
const {rollType, rollName, roll} = evt.currentTarget.dataset;
let r = new Roll(roll, this.actor.getRollData());
const label = `${rollType} (${rollName})`
await r.toMessage({
speaker: ChatMessage.getSpeaker({actor: this.object}),
flavor: label,
rollMode: game.settings.get('core', 'rollMode'),
});
})
html.on('click', '.editor .add-attack', async (evt) => {
const name = evt.target.parentElement.querySelector('#attack_name').value
const at = evt.target.parentElement.querySelector('#attack_at').value
const pa = evt.target.parentElement.querySelector('#attack_pa').value
const tp = evt.target.parentElement.querySelector('#attack_tp').value
const newAttack = {
name,
at,
pa,
tp
}
await this.object.update({'system.attacks': [...this.object.system.attacks, newAttack]})
evt.target.parentElement.querySelector('#attack_name').value = ""
evt.target.parentElement.querySelector('#attack_at').value = ""
evt.target.parentElement.querySelector('#attack_pa').value = ""
evt.target.parentElement.querySelector('#attack_tp').value = ""
})
}
}

View File

@ -1,48 +0,0 @@
export class LiturgySheet extends ItemSheet {
/**@override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ['dsa41', 'sheet', 'item', 'liturgy'],
width: 520,
height: 480,
tabs: [
{
navSelector: '.sheet-tabs',
contentSelector: '.sheet-body',
initial: 'description',
},
],
});
}
/** @override */
get template() {
return `systems/DSA_4-1/templates/item/item-liturgy-sheet.hbs`;
}
/** @override */
getData() {
// Retrieve the data structure from the base sheet. You can inspect or log
// the context variable to see the structure, but some key properties for
// sheets are the actor object, the data object, whether or not it's
// editable, the items array, and the effects array.
const context = super.getData();
// Use a safe clone of the actor data for further operations.
const liturgyData = context.data;
// Add the actor's data to context.data for easier access, as well as flags.
context.system = liturgyData.system;
context.flags = liturgyData.flags;
context.json = JSON.stringify(liturgyData);
return context;
}
activateListeners(html) {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.isEditable)
}
}

View File

@ -1,7 +1,3 @@
import {LiturgyData} from "../data/miracle/liturgydata.mjs";
import {BlessingDataModel} from "../data/blessing.mjs";
import {Blessing} from "../documents/blessing.mjs";
let months = [
"Praios",
"Rondra",
@ -75,7 +71,7 @@ function getJsonFromXML(dom) {
}
async function addSkillFromCompendiumByNameToActor(talentName, taw, actor) {
const compendiumOfSkills = game.packs.get('DSA_4-1.talente');
const compendiumOfSkills = game.packs.get('DSA_4-1.talente-brw');
const talentId = compendiumOfSkills.index.find(skill => skill.name === talentName)
if (talentId) {
@ -123,23 +119,6 @@ async function addSpellsFromCompendiumByNameToActor(spellName, zfw, representati
}
}
async function addLiturgiesFromCompendiumByNameToActor(liturgyName, actor) {
const compendiumOfLiturgies = game.packs.get('DSA_4-1.liturgien');
const liturgyId = compendiumOfLiturgies.index.find(liturgy => {
return liturgy.name === LiturgyData.lookupAlias(liturgyName.split(" (")[0])
})
if (liturgyId) {
const liturgy = await compendiumOfLiturgies.getDocument(liturgyId._id);
try {
await actor.createEmbeddedDocuments('Item', [liturgy])
} catch (error) {
console.error(`${liturgy} not found in items`, error)
}
}
}
/**
* gets the text content of a file
* @param file the file with the desired content
@ -174,25 +153,7 @@ function calculateBirthdate(json) {
function mapSkills(actor, held) {
for (let talent in held.talentliste.talent) {
talent = held.talentliste.talent[talent]
// hook liturgy
if (talent.name.startsWith("Liturgiekenntnis")) {
actor.createEmbeddedDocuments('Item', [
new Blessing({
name: talent.name,
type: "Blessing",
system: {
gottheit: new RegExp("\\((.+)\\)").exec(talent.name)[1],
wert: talent.value
}
})
])
} else {
// proceed
addSkillFromCompendiumByNameToActor(talent.name, talent.value, actor)
}
addSkillFromCompendiumByNameToActor(talent.name, talent.value, actor)
}
}
@ -210,13 +171,6 @@ function mapSpells(actor, held) {
}
}
function mapMiracles(actor, liturgies) {
for (let liturgy in liturgies) {
liturgy = liturgies[liturgy]
addLiturgiesFromCompendiumByNameToActor(liturgy.name, actor)
}
}
/**
* parses a json into a fitting character-json
* @param rawJson the json parsed from the Helden-Software XML
@ -337,8 +291,6 @@ function mapRawJson(actor, rawJson) {
mapSkills(actor, held)
mapSpells(actor, held)
mapMiracles(actor, liturgies)
let combatValues = []
for (let combatValue in held.kampf.kampfwerte) {
combatValue = held.kampf.kampfwerte[combatValue]

View File

@ -1,5 +1,9 @@
{
"_id": "oMOnOMtQmZJBRney",
"_key": "!items!oMOnOMtQmZJBRney",
"type": "Skill",
"name": "Betören",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"IN",
@ -14,4 +18,5 @@
],
"behinderung": "-2",
"talent": "Die Ausstrahlung auf das andere Geschlecht der eigenen Spezies wird durch dieses Talent bewertet. Eine gelungene Talentprobe besagt, dass das Opfer der Annäherungsversuche dem Helden gewogen ist. Was die betörte Persen harten Nüssen beiderlei Geschlechts kann der Meister die Betören-Probe mit Zuschlägen versehen. Will ein Held versuchen, ein Mitglied einer anderen Art (speziell zwischen Elfen und Zwergen) zu betören, dann sollte der Meister deutliche Probenzuschläge verlangen; weniger heftige Zuschläge sind für Betörungsversuche gegenüber dem eigenen Geschlecht erforderlich."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "wSQAMG9yqfjdjrP9",
"_key": "!items!wSQAMG9yqfjdjrP9",
"type": "Skill",
"name": "Etikette",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "-2",
"talent": "So mancher Held kann unversehens in feine Gesellschaft geraten sei es, weil er als Belohnung für eine besondere Tat zu einem Hofball oder einer Audienz eingeladen wird, sei es, weil er am Herzogenhof einem Schurken nachspioniert. Wie aber lautet die korrekte Anredeform für die Tochter des Markgrafen, welcher Anwesende wird zuerst gegrüßt, welches Wappen trägt das Haus Sturmfels-Mersingen? Aber auch: Welche Weine gelten momentan als schick? Welche Mode trägt man am Horashof? Ist es geschmacklos, süße Pastetchen nach Hammelaufläufen zu reichen? Da der Spieler all diese Dinge unmöglich im Kopf behalten kann, sollte sein Held sich möglichst auf dem Feld der Etikette auskennen. Etikette-Proben können vom Meister verdeckt gewürfelt werden."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "Msv0BWdwlNlF2ETu",
"_key": "!items!Msv0BWdwlNlF2ETu",
"type": "Skill",
"name": "Gassenwissen",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "-4",
"talent": "Dieses Talent ermöglicht eine rasche Orientierung in einer fremden Stadt. Erfolgreiche Pro­ben veranlassen den Meis­ter zu Antworten auf Fragen wie die folgenden: Wo treffe ich voraussichtlich auf Gardisten? Wo finde ich einen preiswerten Unterschlupf? Wo kann ich hier am leichtesten meinem Steckenpferd (der Beutelschneiderei) nachgehen? In welchem Tempel hat man am ehesten ein Herz für eine arme Seele, die sich für eine kräftige Mahlzeit zu jedem beliebigen Gott bekennt? Auch städtebauliche Fragen können mit diesem Talent beantwortet werden: Wie erkenne ich einen Eingang zu einem für Menschen passend großen Kanalisationsschacht? Ist in dieser Stadt mit Sackgassen oder abgeschlossenen Hinterhöfen zu rechnen? Ebenfalls hilfreich ist in diesem Zusammenhang die Sonderfertigkeit Ortskenntnis, aber auch die Vorteile Innerer Kompass bzw. Richtungssinn. Proben auf Gassenwissen können vom Meister verdeckt gewürfelt werden."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "HWN1FkoCA2nz4Upu",
"_key": "!items!HWN1FkoCA2nz4Upu",
"type": "Skill",
"name": "Lehren",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"KL",
@ -9,4 +13,5 @@
"voraussetzung": [
],
"talent": "Nicht jedem ist es gegeben, eigenes Wissen und eigene Fertigkeiten so an andere weiterzugeben, dass diese tatsächlich Lehren für sich selber daraus ziehen können. Da vermutlich nur wenige Helden sich ernsthaft für eine Lehrmeister-Tätigkeit interessieren, wird die Pflege dieses Talentes wohl hauptsächlich Meisterpersonen vorbehalten bleiben."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "FQutitgTp9Lcko9C",
"_key": "!items!FQutitgTp9Lcko9C",
"type": "Skill",
"name": "Menschenkenntnis",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"KL",
@ -7,4 +11,5 @@
"CH"
],
"talent": "Eine Talentprobe hilft dem Helden, die wahren Absichten einer Meisterperson zu durchschauen. Die Zuverlässigkeit eines Bergführers kann auf diese Art ebenso über prüft werden wie die Ehrlichkeit eines Rosshändlers. Menschenkenntnis-Proben werden prinzipiell vom Meister verdeckt ausgeführt. Je nach Gelingen teilt der Meister dem Spieler mit, welche Gefühle die Person bei dem Helden auslöst &ndash; dies kann bei einer misslungenen Probe auch durchaus eine Fehleinschätzung sein. Um zu verhindern, dass der Held mit Hilfe einer einfachen Menschenkenntnis-Probe den zentralen Bösewicht eines Abenteuers schon bei der ersten Begegnung entlarvt, kann der Meister die Talentprobe mit einem geheimen Zuschlag belegen, der sich üblicherweise aus der Erfahrung der Meisterperson ergibt. Eine andere Möglichkeit ist eine vergleichende Probe gegen den Überreden-Wert desjenigen, der durchschaut werden soll. <br/> Um die Absichten eines Wesens aus einer fremden Spezies einzuschätzen, ist auf jeden Fall eine erschwerte Probe erforderlich; bei Personen aus anderen Kulturen (also solchen, zu denen man über kein passendes Kulturwissen verfügt) sind Zuschläge zumindest empfehlenswert."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "NgnteXT2iTyRjNZp",
"_key": "!items!NgnteXT2iTyRjNZp",
"type": "Skill",
"name": "Sich Verkleiden",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"MU",
@ -10,4 +14,5 @@
],
"behinderung": "*2",
"talent": "Der Spielleiter legt die Zuschläge auf die Probe nach Art der gewünschten Verkleidung fest, auch die hervorstechenden Körpermerkmale des Helden sind zu berücksichtigen. (Ein hünenhafter Thorwaler hat gewisse Schwierigkeiten, als zierliches Mohamädel aufzutreten.) Eine gelungene Sich Verkleiden-Probe bewirkt, dass einem Helden seine Verkleidung von der Umgebung zunächst einmal abgenommen wird, die Kleidung also ebenso überzeugend ist wie die Bewegungen und das Verhalten. Doch auch ein gut verkleideter Held muss sein Gegenüber überreden, wenn er mit ihm ins Gespräch kommt. Hohe TaP* aus der Sich Verkleiden-Probe mögen die Überreden-Probe erleichtern, wer­­den sie aber kaum überflüssig machen. Ebenfalls in diesem Talent enthalten ist eine grundlegende Kenntnis der Mode und des Schminkens."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "WOVcxACW8cFeBqTC",
"_key": "!items!WOVcxACW8cFeBqTC",
"type": "Skill",
"name": "Überreden",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"MU",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Mit diesem Talent ist ein Held in der Lage, sein Gegenüber mit einem Wortgewitter so zu verwirren, dass sich dieses zumindest kurzfristig vom Helden zu bestimmten Handlungen bewegen lässt. Anwendungsgebiete dieses Talents sind:<ul><li><b>Feilschen:</b> Neben anderen gehört auch das Feilschen zu den Fertigkeiten, die nach Möglichkeit nicht durch Proben, sondern durch reale Spieleraktionen dargestellt werden können. In diesem Fall lässt sich der Meister je nach Talentwert des Helden leichter, schwieriger oder gar nicht herunterhandeln. Im Interesse einer zügigen Spielabwicklung kann aber auch eine Feilschen-Probe gewürfelt werden. Der Spieler kann sich selbst Zuschläge auf die Probe auferlegen je höher der Zuschlag, desto höher der Prozentsatz, um den er den Verkäufer herunterhandeln kann: +0 = 5 %, +1 = 10 %, +2 = 15 % usw. bis zu einem Maximum von +9 = 50 %. Hier ist durchaus auch eine vergleichende Probe möglich. Auch das Anpreisen, also die Fertigkeit, eine beliebige Ware so lautstark und wortgewandt zu präsentieren, dass sich zumindest potentielle Käufer einfinden, die die Ware begutachten, fällt unter diesen Bereich.</li><li><b>Betteln:</b> Dies umfasst sowohl die Kenntnis der richtigen Verkleidung als auch der entsprechenden herzerweichenden Sprüche, um mitleidigen Seelen einige Heller aus der Tasche zu ziehen. Betteln ist in den Städten nicht nur unumgänglicher Zwang für die Ärmsten der Armen, nein, es hat sich über die Jahre zu einer Art Lehrberuf entwickelt, wie ja auch die Bettler in den großen Städten Aventuriens oftmals regelrechte Gilden gegründet haben.</li><li><b>Lügen:</b> Eigentlich sollte man denken, dass jeder Held dieses Talent besitzt, doch es gibt einige Typen, die so gründlich zur Ehrlichkeit erzogen wurden, dass sie auch dann Probleme mit dem Lügen haben, wenn es um ihr Leben geht. Eine Lüge kann nur dann erfolgreich sein, wenn das Opfer im Augenblick keine Möglichkeit hat, den Wahrheitsgehalt einer Aussage zu überprüfen. Eine gelungene Probe kann das Opfer dazu bringen, auf die Überprüfung einer unwahren Aussage zu verzichten. Lügen-Proben können je nach Situation vom Meister verdeckt gewürfelt werden. Eine Lüge lässt sich unter Umständen durch eine erfolgreiche Menschenkenntnis-Probe durchschauen. Die Fertigkeit, vor Gardisten, Richtern und gehörnten Ehegatten eigene Verfehlungen als klein und unwichtig erscheinen zu lassen und schnell zu anderen Themen überzugehen, nennt man üblicherweise nicht Lügen, sondern Herausreden, sie wird aber trotzdem genauso behandelt.</li></ul>"
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "zybPhpBCTeJZNX2C",
"_key": "!items!zybPhpBCTeJZNX2C",
"type": "Skill",
"name": "Überzeugen",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"KL",
@ -14,4 +18,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Dieses Talent bewirkt bei richtiger Anwendung eine mindestens einige Tage andauernde Bewusstseinsänderung, ganz im Gegensatz zum eher kurzfristigen Überreden. Der Meister legt die Zuschläge auf die entsprechende Probe fest, die von der Klugheit und der Lebenseinstellung des Opfers abhängen. Wer eine Karriere als Geweihter oder Demagoge anstrebt, wird um dieses Talent nicht herumkommen."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "XxPXNovZd9AX2sHM",
"_key": "!items!XxPXNovZd9AX2sHM",
"type": "Skill",
"name": "Abrichten",
"system": {
"gruppe": "Handwerk",
"probe": [
"MU",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Wann immer ein Held seinem Tier ein Kunststück (einem Pferd den stummen Alarm, einem Hund das Apportieren oder Männchen machen) beibringen will, ist eine Probe auf Abrichten fällig. Zuschläge auf die Probe entstehen durch Fehlversuche (+2 für jede gescheiterte Probe), durch die Schwierigkeit des Kunststücks und die grundsätzliche Lernfähigkeit und potentielle Loyalität des Tieres. Übungen, die einem Tier wegen körperlicher oder geistiger Beschränkungen nicht möglich sind, kann ihm auch ein meisterlicher Abrichter nicht beibringen."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "w3wHyimJXv6EjnMw",
"_key": "!items!w3wHyimJXv6EjnMw",
"type": "Skill",
"name": "Ackerbau",
"system": {
"gruppe": "Handwerk",
"probe": [
"IN",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Dies ist die grundlegende Kenntnis von Bodenverhältnissen, Aussaat und Ernte, Feldbestellungs- und Lagerungsmethoden. Mit dem Talent kann man Nutzpflanzen erkennen und unterscheiden und auf diese Art und Weise z.B. eine auf einer einsamen Insel gestrandete Heldengruppe vor dem Verhungern bewahren. Zudem erkennt ein Ackerbau-Kundiger leicht Wert und Haltbarkeit von Nahrungsmitteln. Auf der aktiven Seite heißt dies auch, dass ein entsprechend ausgebildeter Held mit Pflug, Hacke und Dreschflegel umzugehen weiß."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "oHnVR4rpCZes1MBk",
"_key": "!items!oHnVR4rpCZes1MBk",
"type": "Skill",
"name": "Alchimie",
"system": {
"gruppe": "Handwerk",
"probe": [
"MU",
@ -18,4 +22,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Dieses Talent regelt die Herstellung normaler Chemikalien und wundertätiger Mittel. Der Spieler teilt dem Meister mit, welches alchimistische Gemisch sein Held herstellen will, und der Spielleiter legt den Zuschlag (oder Abzug) auf die erforderliche Probe fest. Bevor es zur Probe kommt, muss der Held natürlich erst einmal in den Besitz der benötigten Zutaten und auch der Rezeptur kommen. Eine gescheiterte Probe auf diesem gefährlichen Gebiet kann mancherlei bewirken: ein harmloses, aber bestialisch stinkendes, grünes Wölkchen zum Beispiel, oder aber einen Urknall, der ein halbes Stadtviertel in Schutt und Asche legt. Der Meister sollte so fair sein, seinen Helden in etwa anzudeuten, was eine gescheiterte Probe für sie bedeuten könnte. Talentproben in Alchimie können auch zur Analyse unbekannter Mixturen dienen aber auch auf diesem Gebiet kann ein Irrtum verhängnisvolle Folgen haben (und hier sollte der Meister auch ruhig verdeckt würfeln)."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "LIxUN4SY7uqj716y",
"_key": "!items!LIxUN4SY7uqj716y",
"type": "Skill",
"name": "Bergbau",
"system": {
"gruppe": "Handwerk",
"probe": [
"IN",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Diese Talent umfasst das sachgerechte Anlegen von Tunneln und Schächten und deren Luftversorgung und Wasserentsorgung. Außerdem ermöglichen Kenntnisse im Bergbau die Beurteilung von unterirdischen Anlagen: Welche Wesen haben sie geschaffen? Wo wurden bauliche Veränderungen vorgenommen? Solche und ähnliche Fragen müssen vom Meister nach einer gelungener Bergbau-Probe des Helden beantwortet werden. Dass sich die meisten aventurischen Zwerge fast von Natur aus auf solche Kenntnisse verstehen, verwundert nicht."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "FfCHnaMJj7yVr04i",
"_key": "!items!FfCHnaMJj7yVr04i",
"type": "Skill",
"name": "Bogenbau",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -14,4 +18,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Bogenbauer und Armbruster beschäftigen sich mit der Herstellung von Schusswaffen und sind die einzigen, die auf Spannung basierende, Projektile verschießende Fernwaffen (und die dazugehörigen Projektile) bauen können. Natürlich können sie auch die Qualität solcher Waffen einschätzen. Im Band Wege des Schwerts stellen wir Ihnen ein detailliertes System zum Bau von Schusswaffen vor; im Rahmen dieser Basisregeln gilt folgende Vorgehensweise: Um einen Bogen oder eine Armbrust herzustellen, benötigt man die richtigen Materialien für Bogen und Sehne (zusätzlich bei der Armbrust für Schaft und Abzug) und muss eine bestimmte Anzahl von Talentproben ablegen. Jede Probe dauert einen halben Tag; bei Misslingen einer Probe kann man versuchen zu retten, was noch zu retten ist, und eine Probe ablegen, die um den doppelten Betrag erschwert ist. Misslingt auch diese, ist die gesamte Waffe missraten und das Material verdorben.<br/>Um Pfeile oder Bolzen herzustellen, ist neben geeignetem Holz und vorhandenen Spitzen noch eine Bogenbau-Probe nötig, um die Spitze und vorallem die Befiederung korrekt anzubringen. Der Zuschlag auf der Probe ist der Tabelle zu entnehmen. Jede Probe zum Herstellen eines Geschosses dauert eine halbe Stunde.<table><tr><th>Typ</th><th>Herstellen</th><th>Geschoss</th></tr><tr><td>Kurzbogen</td><td>4 Proben</td><td>Probe</td></tr><tr><td>Langbogen</td><td>6 Proben</td><td>Probe +1</td></tr><tr><td>Kriegsbogen</td><td>7 Proben</td><td>2 Proben + 3</td></tr><tr><td>Leichte Armbrust</td><td>4 Proben</td><td>2 Proben -1</td></tr><tr><td>Schwere Armbrust</td><td>12 Proben</td><td>2 Proben +1</td></tr><table>"
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "usmU8Ig2qragLaNd",
"_key": "!items!usmU8Ig2qragLaNd",
"type": "Skill",
"name": "Boote Fahren",
"system": {
"gruppe": "Handwerk",
"probe": [
"GE",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Alle Talente, die zur Fortbewegung eines kleinen Wasserfahrzeuges dienen - Rudern, Segeln, Paddeln, Staken - sind hier zusammengefasst. Der Meister sollte es den Helden gestatten, ohne Probe gemächlich über einen stillen Teich zu rudern - irgendwie wird der Held schon ans andere Ufer gelangen. Segeln, Wildwasserfahrten und ähnliche Aktionen sind nur mit gelungener Probe möglich. Für die Handhabung größerer Segel- oder Ruderschiffe sind das Talent SEEFAHRT und eine gröere Anzahl von Matrosen nötig."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "LbFLcgogaKsaMyAZ",
"_key": "!items!LbFLcgogaKsaMyAZ",
"type": "Skill",
"name": "Fahrzeug Lenken",
"system": {
"gruppe": "Handwerk",
"probe": [
"IN",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Die Art des Fahrzeugs und vor allem die Anzahl der Zugtiere bestimmen die Schwierigkeiten einer Probe. Um z.B. eine vierspänige Rennkutsche auch bei geringem Tempo einigermaßen auf der Straße zu halten, muss eine Probe +4 gelingen, ein von einem geduldigen Maultier gezogener Lastkarren fährt sich da schon bedeutend gemütlicher. Verschärfte Proben werden fällig, wenn gewagte Manöver ausgeführt werden sollen: im scharfen Galopp ein Stadttor passieren oder ein von sechs durchgehend Darpatrindern gezogenes Brauereigespann einbremsen. Ebenfalls erschwert ist das Steuern ungewohnter Fahrzeuge wie Hundeschlitten für solche Helden, die bislang nur Erfahrung mit Pferdekutschen haben."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "rCpbo6Hwvu3Poxp9",
"_key": "!items!rCpbo6Hwvu3Poxp9",
"type": "Skill",
"name": "Falschspiel",
"system": {
"gruppe": "Handwerk",
"probe": [
"MU",
@ -14,4 +18,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Je nach Erfolg der Probe kann der Held entweder sein eingesetztes Geld vervielfachen oder (bei einem ausgespielten Glücksspiel) Würfelergebnisse zu seinen Gunsten ändern, neue Karten ziehen und dergleichen. Das Scheitern einer Probe kann den Helden in arge Bedrängnis bringen (notorische Falschspieler genießen überall in Aventurien eine extrem kurze Lebenserwartung). In Kombination mit einer Sinnenschärfe-Probe kann ein hohes Falschspiel-Talent auch dazu dienen, eventuelle Mogeleien zu enttarnen. (Aber auch hier ist absolute Vorsicht angeraten: Aus oben genannten Gründen ist eine falsche Bezichtigung meist Grund genug für eine Duellforderung.) Falschspiel-Proben können natürlich auch vom Meister verdeckt gewürfelt werden."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "aTCyxWYkNfnI7XGi",
"_key": "!items!aTCyxWYkNfnI7XGi",
"type": "Skill",
"name": "Feinmechanik",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -14,4 +18,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Grundlage dieser Tätigkeit ist die Fein- oder Goldschmiedekunst, mit der man Schmuck und andere filigrane Arbeiten aus Gold, Silber, Mondsilber und anderen Edelmetallen herstellen kann. DAss sich Feinmechaniker daher auch mit Wert und Qualität von Schmuckwaren auskennen, verstehen sich von selbst. Der nächste Schritt sind Gravuren in verschiedenen Metallen (für Schilder und Medaillen bis hin zum künstlerischen Kupferstich), der Guss von kleinen und kleinsten Formen (für Siegel- oder Prägestöcke und auch für deren Fälschung) und schließlich der Zusammenbau all dieser Teile zu Uhrwerken, kleinsten Schlössern, winzigen Armbrustmechanismen oder Spieluhren. Feinmechaniker arbeiten meist eng mit Steinscheidern und Juwelieren zusammen, wenn sie diese Kunst nicht gar selbst beherrschen."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "e2rEB8x4gSiZ90f6",
"_key": "!items!e2rEB8x4gSiZ90f6",
"type": "Skill",
"name": "Fleischer",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Ein Schlachter, Fleischer oder Metzger weiß, wie man Nutztiere sinnvoll tötet, möglichst viele verwertbare Materialien erhält und daraus haltbare Schinken, Wurstwaren und Bratenstücke herstellt. Er kann beurteilen, wie lang Fleisch noch haltbar ist und welchen Preis es auf dem Markt erzielt. Zudem kennt er sich ähnlich wie der Anatom mit verwundbaren Punkten aus und richtet deswegen im Kampf gegen Wesen, die seinem üblichen Schlachtvieh auch nur grob ähneln, 1 TP mehr an als ein unkundiger Kämpfer, wenn er über einen Fleischer-TaW von 10 oder mehr verfügt (Die Zusatzpunkte von Anatomie und Fleische werden nicht aufaddiert: Auch ein Anatomie-beschlagener Fleischer erhält keine 2 zusätzlichen TP im waffenlosen Kampf.)"
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "0oad2z7EgAiwKrLM",
"_key": "!items!0oad2z7EgAiwKrLM",
"type": "Skill",
"name": "Gerber/Kürschner",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Dieses Talent dient dazu, die Haut oder auch das Fell von Tieren haltbar und dabei ansehnlich zu machen und zu Lederwaren oder Pelzen weiterzuvearbeiten, was oft eine ziemlich unappetitliche Angelegenheit ist, die einen starken Magen und eine Art intuitiver Alchimie erfordert. Gerber und Kürschner sind in der Lage, Pelz- und Lederwaren nach Wert und Qualität zu beurteilen. Eine bisweilen ausgeübte Spezialisierung ist die Präparation von Trophäen aus Tieren aller Art."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "zpXltR1dnEv9h9nY",
"_key": "!items!zpXltR1dnEv9h9nY",
"type": "Skill",
"name": "Grobschmied",
"system": {
"gruppe": "Handwerk",
"probe": [
"FF",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "<b>Schwarzschmiede</b> (die trotz des Namens auch mit Messing und Bronze umzugehen wissen) beschäftigen sich vor allem mit der Herstellung von landwirtschaftlichem Gerät, dem Beschlagen von Reittieren oder der Produktion von Kleineisenteilen wie Nägel, Bolzen, Ketten und Scharniere. Sie sind zudem in der Lage, Waffen zu reparieren.<br/>Ein <b>Waffenschmied</b> ist zwar auch in der Lage, Harken, Türbeschläge oder Truhenbänder herzustellen, seine Spezialität sind jedoch Metallwaffen aller Art, die er sowohl herstellen und reparieren als auch beurteilen kann.<br/>Der <b>Plättner</b> und Harnischmacher hat das Grobschmiedehandwerk bis zum Äußersten verfeinert und stellt nur noch metallene Rüstungen aller Art her; er ist der einzige, der Harnische, Lamellare und auch Kettenhemden herstellen und reparieren kann.<br/><b>Spengler</b> oder Blechwerker schließlich befassen sich mit der Weiterverarbeitung von Metallblechen (vor allem zu Rohren) und deren Einsatz, wozu auch Kenntnisse im Nieten und Löten gehören; sie sind ebenfalls in der Lage, Rüstungen zu reparieren."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "ZMCP3q6ZMcehR30p",
"_key": "!items!ZMCP3q6ZMcehR30p",
"type": "Skill",
"name": "Heilkunde: Gift",
"system": {
"gruppe": "Handwerk",
"probe": [
"MU",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Eine gelungene erste Probe (Erkennungsprobe) auf das Heilen von Vergiftungen bedeutet, dass das Gift richtig identifiziert wurde. (Einige besonders tückische Gifte erfordern einen Zuschlag in Höhe ihrer halben Stufe.) Der Meister benennt die Art des Giftes und teilt mit, wie die Vergiftung zu behandeln ist möglicherweise muss der Heiler zunächst bestimmte Kräuter oder andere Zutaten beschaffen. Sind diese Voraussetzungen erfüllt, kann der Heiler eine zweite Probe (Behandlungsprobe) ablegen, die mit einem Zuschlag in Höhe der gesamten Stufe des Giftes zu belegen ist. Gelingt auch diese Probe, so ist die Wirkung des Gifts gestoppt und der Heiler kann dem Vergifteten Lebenspunkte zurückgeben, die er durch diese Vergiftung verloren hatte: 1 LeP pro übrig behaltenem Talentpunkt bei der zweiten Probe. Eine dritte Probe regelt die Nachbehandlung; auch hier können dem Patienten LeP je nach übrig behaltenen Talentpunkten zurückgegeben werden; der Zuschlag beträgt hierbei wieder die halbe Stufe des Giftes.<br/>Das Scheitern der Erkennungsprobe bedeutet, dass der Heiler das Gift offensichtlich nicht kennt und keine Heilmethode weiß; das Scheitern der Behandlungsprobe bedeutet, dass keine Heilung einsetzt (bei einem Patzer sogar, dass der Vergiftete 1d6 zusätzliche SP erleidet); das Scheitern der Nach behandlungsprobe bedeutet ebenfalls, dass der Patient zusätzlichen Schaden erleidet (1d6 SP).<br/>Zum Ablegen der Erkennungsprobe wer­den mindestens 5 Kampfrunden benöigt, zum Ablegen der Behandlungs- und der Nachbehandlungs-Probe jeweils mindestens 1 SR, die NachbehandlungsProbe kann zudem erst zwölf Stunden nach der Behandlungs-Probe (und nur einmal) abgelegt werden. Bei Misslingen der Proben kann der Heiler in diesem speziellen Fall keinen zweiten Versuch unternehmen."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "MpS719GhrrI2p9BB",
"_key": "!items!MpS719GhrrI2p9BB",
"type": "Skill",
"name": "Heilkunde: Krankheiten",
"system": {
"gruppe": "Handwerk",
"probe": [
"MU",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Alle Arten von Krankheiten - auch das gefährliche Wundfieber können mit Hilfe dieses Talentes behandelt werden. Der Heilkundige legt eine erste Talentprobe ab, die zur Diagnose und zum Bestimmen der benötigten Salben oder Arzneien dient: die Erkennungsprobe. (Eventuell ist diese Probe um die halbe Stufe der Krankheit erschwert, wenn es sich um eine schleichende Krankheit ohne eindeutige Symptome handelt.) Anschließend kann durch eine zweite Probe, die um die Stufe der Krankheit erschwert ist, die Heilung eingeleitet werden, wobei der Heiler dem Patienten so viele Lebenspunkte zurückgibt, wie er Talentpunkte übrig behalten hat (maximal natürlich so viele, wie durch die Krankheit verloren gegangen sind).<br/>Einen Tag später (und dann folgend jeden weiteren Tag) ist eine Nachbehandlungs-Probe möglich, die um die halbe Stufe der Krankheit erschwert ist; die übrig behaltenen TaP kommen dem Patienten als LeP zugute (auch hier natürlich nur, um den Schaden zu reduzieren, der aus einer Krankheit herrührt). Beim Scheitern der ersten Probe kommt es nicht zu einer Heilung; beim Scheitern einer der anschließenden Proben wird die Heilung gestoppt und der Patient erleidet 1d6 zusätzliche Schadenspunkte.<br/>Zum Ablegen der Erkennungs-Probe wird mindestens 1 Spielrunde benötigt, zum Ablegen der Behandlungs-Probe und der Nach-behandlungs-Proben mindestens 6 SR. Die Nachbehandlungs-Proben können erst einen Tag nach der Behandlungs-Probe abgelegt werden (und dann jeweils am nächsten Tag); bei Misslingen dieser Proben kann der Heiler keinen zweiten Versuch unternehmen."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "iVeiTvzkpV6a1HYX",
"_key": "!items!iVeiTvzkpV6a1HYX",
"type": "Skill",
"name": "Heilkunde: Wunden",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Brüche, Schnitte, Stiche und andere Verletzungen, die im Kampf oder durch Unfälle entstehen, sind durch dieses Talent zu kurieren.<br/> <b>Erste Hilfe:</b> Ein lebensbedrohlich Verletzter (0 oder weniger LeP) kann dadurch gerettet werden, dass einem behandelnden Gefährten eine Heilkunde Wunden-Probe gelingt, die um doppelt so viele Punkte erschwert ist, wie die LeP des Patienten unter 0 liegen. Diese Probe dauert doppelt so viele KR, wie die LeP des Patienten unter 0 liegen, abzüglich der übrig behaltenen TaP aus der Heilkunde-Probe. Misslingt die Probe, so erleidet der Patient 1d6 weitere SP; die Probe kann jedoch wiederholt werden, wenn der Verletzte noch lebt. Bei Gelingen der Probe ist die akute Todesgefahr gebannt, der Patient hat nun genau 1 LeP.<br/><b>Heilung fördern:</b> Der Heilkundige legt eine erste Probe ab, die der allgemeinen Versorgung der Wunde dient und das Ausbrechen von Wundfieber verhindert, und anschließend eine zweite Probe, die der Einleitung der Heilung dient. Der Kranke erhält halb so viele LeP zurück, wie der Punktüberschuss aus der zweiten Probe beträgt. Diese LeP gelten zusätzlich zu den LeP, die der Verletzte aus der normalen Heilung (der nächtlichen Regneration) gewinnt, und werden auch nur während dieser Regenerationsphase zurückgewonnen. Am nächsten Tag (und den folgenden) kann jeweils eine Nachbehandlungs-Probe durchgeführt werden, die die allgemeine Regenerationsfähigkeit des Patienten verbessert: Pro 3 übrig behaltener Punkte aus dieser Probe erhält der Patient einen Punkt zu seiner folgenden nächtlichen Regeneration hinzu (bei 5 übrig behaltenen Punkten also 1 zusätzlichen LeP).<br/>Beim Scheitern der ersten Probe kommt es nicht zu einer Heilung, der Patient erkrankt mit einer erhöhten Wahrscheinlichkeit an Wundfieber (KO-Wurf um 3 erschwert). Beim Scheitern der zweiten Heilprobe und der Nachbehandlungs-Proben wird die normale Heilung für 24 Stunden unterbrochen und der Verletzte erleidet 1W6 zusätzliche Schadenspunkte. Die erste Probe dauert 4 Spielrunden, die zweite Probe und die Nachbehandlungsproben dauern jeweils 6 SR. Auch hier gilt insgesamt, dass nur solche LeP-Verluste mit diesem Talent zu heilen sind, die durch Verletzungen verursacht wurden.<br/><b>Wunden</b>: Um die Heilung einer Wunde (sie­ he im Kapitel zum Kampf auf Seite 138) zu beschleunigen, ist zuallererst eine reguläre Probe zur Erstversorgung (s.o.) nötig, die um je 2 Punkte pro erlittener Wunde erschwert ist. (Wenn Sie überhaupt mit Wunden spielen, ist diese Probe generell die Erstversor gungs-Probe, Sie müssen also nicht einmal gegen Schaden und einmal gegen Wunden würfeln.) Die zweite Probe, die der Einleitung der Heilung dient, ist um 3 Punkte pro Wunde des Patienten erschwert.<br/>Misslingt diese Probe, tritt keine Heilung ein; bei einem Patzer erleidet der Patient 1d6 weitere Schadenspunkte. Gelingt sie jedoch, so ist die KO-Probe des Patienten, mit der die Heilung eingeleitet wird, um so viele Punkte erleichtert, wie bei der Heilkunde-Probe übrig behalten wurden."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "2X8vXmUi5DTQAMaC",
"_key": "!items!2X8vXmUi5DTQAMaC",
"type": "Skill",
"name": "Holzbearbeitung",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Dieses Talent hat viele Anwendungsmöglichkeiten im täglichen Heldenleben: Eine morsche Bootsplanke ist auszutauschen, eine improvisierte Waffe oder ein Werkzeug soll hergestellt, auf die Schnelle ein Kinderspielzeug geschnitzt werden. Eine gelungene Probe auf dieses Talent kann die erfolgreiche Herstellung oder Reparatur eines hölzernen Gegenstandes bedeuten. Für die Fertigstellung komplizierter Holzgeräte oder besonders kunstfertiger Schnitzereien sollte die Probe mit einem Zuschlag belegt werden; beim Erstellen hölzerner Skulpturen zählen natürlich die TaP* für den künstlerischen Eindruck."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "hR8i8jzmOR5v4HmR",
"_key": "!items!hR8i8jzmOR5v4HmR",
"type": "Skill",
"name": "Kartographie",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -14,4 +18,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Ein Kartograph befasst sich mit dem Erstellen von Karten und Plänen, sowohl von Gebäuden als auch von Landschaften. Im Spiel bedeutet dieses Talent, dass dem Helden Orientierungs-Proben erleichtert werden, wenn er sich in einer Landschaft oder einem Höhlensystem befindet, das er bereits erkundet und kartiert hat. Er erhält vom Meister Hinweise zum korrekten Aufzeichnen von Höhlensystemen, Gebäuden etc. und kann auch leichter Reiseentfernungen abschätzen. Das Lesen von Landkarten ohne dieses Talent fällt schwer und kann leicht zu Fehlinterpretationen führen."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "IUW5qqSD1Imgtm5u",
"_key": "!items!IUW5qqSD1Imgtm5u",
"type": "Skill",
"name": "Kochen",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Ein Held, der seine Gäste (daheim oder am Lagerfeuer) durch ein gelungenes Essen beeindrucken will, muss eine erfolgreiche Probe evtl. mit Zuschlägen ablegen. Eine knapp gelungene Probe bedeutet, dass es dem Helden gelungen ist, etwas Essbares zu kochen um etwas Genießbares zu produzieren, sollte er mindestens 3 Talentpunkte übrig behalten; schmackhafte Kost beginnt bei 6 verbleibenden Punkten. Gerade in den Küchen des Hochadels ist diese Kunst nicht nur angesehen, sondern auch oft weiter unterteilt - Spezialisten für süßes Backwerk oder Bratensoßen sind keine Seltenheit."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "X132JNfT8ct2YnDl",
"_key": "!items!X132JNfT8ct2YnDl",
"type": "Skill",
"name": "Lederverarbeitung",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Zu den täglichen Aufgaben einer Reisegruppe gehört sicherlich auch, sich hin und wieder Gedanken über den Zustand ihres Schuhwerks oder ihrer Garderobe machen. Wenn ein Held mit TaW 0 erklärt, er werde um Geld zu sparen die abgerissene Sohle selbst unter seinen Stiefel nageln, sollte ihn der Spielleiter beim Marsch zum nächsten Einsatzort diese Entscheidung bereuen lassen. Viele Berufe haben das Lederhandwerk deutlich spezialisiert: Die Berufsgruppen der Schuster und Sattler befassen sich mit Lederarbeiten aller Art, vor allem, wie der Name schon sagt, mit Schuhwerk und Sätteln, aber auch mit lederner Kleidung, Polstermöbeln und Lederharnischen. Zudem sind Schuster als einzige in der Lage, eine Lederrüstung nicht nur provisorisch zu flicken, sondern vollständig wiederherzustellen."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "T6qKEG9D1k8qmBL8",
"_key": "!items!T6qKEG9D1k8qmBL8",
"type": "Skill",
"name": "Malen/Zeichnen",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Natürlich kann alles, was es am Spieltisch zu zeichnen gibt, von den Spielern real zu Papier gebracht werden, aber im Interesse des Spielflusses (und der Belastung des Sehzentrums des Spielleiterhirns) sollte man auch hier mit Talentproben arbeiten. Ein an einem Luxusleben interessierter Held kann darüber nachdenken, ob er nicht diesen Talentwert steigert und seine Brötchen als Hofmaler verdient. Beim Zusammentreffen mit primitiven Stämmen hat übrigens schon der eine oder andere begabte Abenteurer durch die schmeichelhafte Porträtierung des Häuptlings sein Leben beträchtlich verlängert und sich außerdem einen (ungerechtfertigten) Ruf als mächtiger Zauberer erworben."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "AuKFFtckKctQ29vk",
"_key": "!items!AuKFFtckKctQ29vk",
"type": "Skill",
"name": "Musizieren",
"system": {
"gruppe": "Handwerk",
"probe": [
"IN",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Zwar kann auch dieses Talent real von den Spielern ausgeführt werden, aber die Praxis hat gezeigt, dass der Verzicht auf solche Versuche enorm zum Frieden am Spieltisch beitragen kann. Eine gelungene Musizieren-Probe kann an einem Fürstenhof ein paar Dukaten in den Heldenbeutel bringen, die Unterkunft in einer Herberge sichern, aber auch einen aufgebrachten Bären besänftigen. Ein Held kann sich auf ein Instrument spezialisieren oder danach trachten, mehrere zu beherrschen. Um einen einigermaßen hörbaren Vortrag zustande zu bekommen, ist zumindest eine einfach gelungene Probe vonnöten; um damit Geld zu verdienen, sollten wenigstens 4 TaP übrig bleiben."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "rm4h47HAV7UDSBew",
"_key": "!items!rm4h47HAV7UDSBew",
"type": "Skill",
"name": "Schlösser Knacken",
"system": {
"gruppe": "Handwerk",
"probe": [
"IN",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Dies ist die Grundlage des Einbrecherhand- werks. Um ein Schloss ohne den passenden Schlüssel (d.h., mit Dietrichen, Haarnadeln, Messern o.ä.) zu öffnen, kann der Meister Proben auf Schlösser Knacken verlangen, die je nach den Umständen mit deftigen Zuschlägen versehen sind. Ein Misslingen der Probe bedeutet in den meisten Fällen, dass der Dietrich oder das improvisierte Einbruchswerkzeug im Schloss abgebrochen ist und weitere Öffnungsversuche nur unter nochmals erschwerten Bedingungen durchgeführt werden können. Mit diesem Talent können auch bestimmte Arten mechanischer Fallen entschärft werden. Hierbei bedeutet ein Scheitern der Probe allerdings stets, dass der Held die Falle ausgelöst hat und ihre volle Schadenswirkung erleidet.<br/>Ein Held, der ohne Kenntnis dieses Talents versucht, ein Schloss zu öffnen, muss eine FF-Probe ablegen, die um mindestens 7 Punkte erschwert ist, je nach Schloss auch deutlich mehr; ein improvisiertes Werkzeug erleichtert diese Probe um 1 Punkt, ein regelrechter Dietrich um 2 Punkte."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "SOwhkPX2rU1LQaOM",
"_key": "!items!SOwhkPX2rU1LQaOM",
"type": "Skill",
"name": "Schneidern",
"system": {
"gruppe": "Handwerk",
"probe": [
"KL",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Das Schneidern-Talent umfasst in erster Linie Flickschneidereien wie das Annähen abgerissener Knöpfe und Bänder, das Aufnähen von Flicken oder das Stopfen von Löchern. Wer aber hier einen hohen Talentwert vorweisen kann, der ist auch in der Lage, Änderungen an ungeliebter Garderobe vorzunehmen oder gar von Grund auf neue Kleidung herzustellen. Ein professioneller Schneider stellt aus Tuchen verschiedenster Art Kleidungsstücke her, ja, man kann sagen, er veredelt die Stoffe. Schneider sind in der Lage, aus schlichtem Stoff wahre Wunderwerke entstehen zu lassen, und natürlich können sie auch getragene und verschlissene Kleidung wieder in einen annehmbaren Zustand versetzen. Ein Held mit diesem Beruf kann selbstverständlich Wert und Qualität von Kleidungsstücken einschätzen."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "YNyOmvZWCVbBCEhw",
"_key": "!items!YNyOmvZWCVbBCEhw",
"type": "Skill",
"name": "Seefahrt",
"system": {
"gruppe": "Handwerk",
"probe": [
"FF",
@ -10,4 +14,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Kleinere Wasserfahrzeuge können mit dem Talent Boote Fahren gesteuert werden. Seefahrer sind jedoch die einzigen, die ein mehrmastiges Schiff bedienen und instand halten können. Vor allem das Setzen der Takelage, das Tiefenloten, die Wartung der Ruderanlage, die Überwachung der Ladung, aber auch das Abdichten kleinerer Leckagen und das korrekte Aufrollen von Tauen und Ketten gehören in den Aufgabenbereich des Seefahrers."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "aKw9Q6KkgN9fERcx",
"_key": "!items!aKw9Q6KkgN9fERcx",
"type": "Skill",
"name": "Steinmetz",
"system": {
"gruppe": "Handwerk",
"probe": [
"FF",
@ -14,4 +18,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Ein Steinmetz ist nicht nur in der Lage, Skulpturen aus Stein zu erschaffen, im Hoch- oder Flachrelief zu meißeln und verschiedene Gesteinsarten für seine Kunst zu bewerten, sondern kann auch kann mit einer Talentprobe die Sicherheit eines Gebäudes oder einer Steinbrücke (nicht aber eines Tunnels oder Stollens) feststellen und bestimmen, aus welchen Baumaterialien ein Bauwerk besteht oder wie viele Steine und Mörtel benötigt werden, um ein bestimmtes Gebäude zu errichten."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "mRYlHIF23eXtnU7B",
"_key": "!items!mRYlHIF23eXtnU7B",
"type": "Skill",
"name": "Steinschneider/Juwelier",
"system": {
"gruppe": "Handwerk",
"probe": [
"IN",
@ -14,4 +18,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Diese Berufe beschäftigen sich mit dem Zuschneiden, Schleifen, Polieren und Einpassen von Edelsteinen und Kristallen aller Art, in erster Linie zu Schmuck-, aber auch zu magischen Zwecken."
}
}

View File

@ -1,5 +1,9 @@
{
"_id": "DzBx1QsSdcdeOmpu",
"_key": "!items!DzBx1QsSdcdeOmpu",
"type": "Skill",
"name": "Tätowieren",
"system": {
"gruppe": "Handwerk",
"probe": [
"IN",
@ -14,4 +18,5 @@
],
"behinderung": "situationsbedingt",
"talent": "Die Verzierung der Haut mit Bildern ist vor allem bei den Thorwalern sehr beliebt, die diese Kunst auch in den Hafenstädten Aventuriens verbreitet haben. Ein Tätowierer muss wissen, wo er ein bestimmtes Motiv am besten anbringt, wie viel Farbe er bei welchem Hauttyp verwendet und er muss die Stechernadel zu führen wissen. Tätowierer sind als einzige in der Lage, dauerhafte Hautbilder anzufertigen."
}
}

Some files were not shown because too many files have changed in this diff Show More