Compare commits

..

4 Commits

Author SHA1 Message Date
macniel ea436f3e4a refactoring module structure 2025-09-27 11:41:36 +02:00
macniel db1b60fb19 adds example data 2025-09-27 11:40:56 +02:00
macniel 8d41c82ccd cicd: adds additional task for cleanup 2025-09-27 11:40:15 +02:00
macniel 42f6c7121d moves example into assets 2025-09-27 11:38:51 +02:00
22 changed files with 450 additions and 141 deletions

View File

@ -6,11 +6,17 @@ import * as dartSass from 'sass';
import gulpSass from 'gulp-sass';
const sass = gulpSass(dartSass);
import { deleteAsync } from 'del';
import { readdirSync } from 'node:fs';
import { join } from 'node:path';
import { compilePack } from '@foundryvtt/foundryvtt-cli';
function cleanDist() {
return deleteAsync(['dist/**']);
}
function buildStyles() {
return src('src/style/**/*.scss')
@ -44,7 +50,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, log: true });
await compilePack(src, dest, { recursive: true, log: true, nedb: false });
}
resolve()
@ -53,6 +59,7 @@ function buildDB() {
export default series(
cleanDist,
copySource,
buildStyles,
buildDB,

242
package-lock.json generated
View File

@ -13,6 +13,7 @@
"devDependencies": {
"@foundryvtt/foundryvtt-cli": "^3.0.0",
"cb": "^0.1.1",
"del": "^8.0.1",
"gulp": "^5.0.1",
"gulp-replace": "^1.1.4",
"gulp-sass": "^6.0.1",
@ -189,6 +190,41 @@
"lodash.merge": "^4.6.2"
}
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@npmcli/fs": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz",
@ -531,6 +567,18 @@
"util": "^0.12.5"
}
},
"node_modules/@sindresorhus/merge-streams": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
"integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
"dev": true,
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@tootallnate/once": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
@ -1533,6 +1581,39 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/del": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/del/-/del-8.0.1.tgz",
"integrity": "sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==",
"dev": true,
"dependencies": {
"globby": "^14.0.2",
"is-glob": "^4.0.3",
"is-path-cwd": "^3.0.0",
"is-path-inside": "^4.0.0",
"p-map": "^7.0.2",
"presentable-error": "^0.0.1",
"slash": "^5.1.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/del/node_modules/p-map": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz",
"integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==",
"dev": true,
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@ -1746,6 +1827,34 @@
"integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
"dev": true
},
"node_modules/fast-glob": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.8"
},
"engines": {
"node": ">=8.6.0"
}
},
"node_modules/fast-glob/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fast-levenshtein": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz",
@ -2178,6 +2287,26 @@
"which": "bin/which"
}
},
"node_modules/globby": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz",
"integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==",
"dev": true,
"dependencies": {
"@sindresorhus/merge-streams": "^2.1.0",
"fast-glob": "^3.3.3",
"ignore": "^7.0.3",
"path-type": "^6.0.0",
"slash": "^5.1.0",
"unicorn-magic": "^0.3.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/globule": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz",
@ -2569,6 +2698,15 @@
}
]
},
"node_modules/ignore": {
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
@ -2837,6 +2975,30 @@
"node": ">=0.12.0"
}
},
"node_modules/is-path-cwd": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz",
"integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==",
"dev": true,
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-path-inside": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz",
"integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==",
"dev": true,
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
@ -3219,6 +3381,15 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
@ -4048,6 +4219,18 @@
"node": ">=0.10.0"
}
},
"node_modules/path-type": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz",
"integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==",
"dev": true,
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@ -4156,6 +4339,18 @@
"dev": true,
"peer": true
},
"node_modules/presentable-error": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/presentable-error/-/presentable-error-0.0.1.tgz",
"integrity": "sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==",
"dev": true,
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@ -4492,6 +4687,29 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/rxjs": {
"version": "7.8.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
@ -5113,6 +5331,18 @@
"dev": true,
"peer": true
},
"node_modules/slash": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
"integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
"dev": true,
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
@ -5573,6 +5803,18 @@
"integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==",
"dev": true
},
"node_modules/unicorn-magic": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
"integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
"dev": true,
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/unique-filename": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz",

View File

@ -15,6 +15,7 @@
"devDependencies": {
"@foundryvtt/foundryvtt-cli": "^3.0.0",
"cb": "^0.1.1",
"del": "^8.0.1",
"gulp": "^5.0.1",
"gulp-replace": "^1.1.4",
"gulp-sass": "^6.0.1",

View File

@ -1,18 +0,0 @@
import { compilePack } from '@foundryvtt/foundryvtt-cli';
import { promises as fs } from 'fs';
const MODULE_ID = process.cwd();
const yaml = true;
const log = true;
const folders = true;
const packs = await fs.readdir('./src/packs/_source');
for (const pack of packs) {
if (pack === '.gitattributes') continue;
console.log('Packing ' + pack);
await compilePack(
`${MODULE_ID}/src/packs/${pack}`,
`${MODULE_ID}/dist/packs/${pack}`,
{ yaml, log, recursive: folders }
);
}

View File

@ -1,14 +1,14 @@
import { PlayerCharacterDataModel } from "./module/character/character.mjs";
import { DsaActor } from "./module/Actors/dsa-actor.mjs";
import { Skill } from "./module/Items/skill.mjs"
import { SkillSheet } from "./module/Items/skillSheet.mjs";
import { Spell } from "./module/Items/spell.mjs";
import { SpellSheet } from "./module/Items/spellSheet.mjs";
import { SkillSheet } from "./module/sheets/skillSheet.mjs";
import { SpellSheet } from "./module/sheets/spellSheet.mjs";
import { SkillDataModel } from "./module/data/skill.mjs";
import { SpellDataModel } from "./module/data/spell.mjs";
import { Character } from "./module/documents/character.mjs";
Hooks.once("init", () => {
// Configure custom Document implementations.
CONFIG.Actor.documentClass = DsaActor;
CONFIG.Actor.documentClass = Character;
// Configure System Data Models.
CONFIG.Actor.dataModels = {
@ -16,8 +16,8 @@ Hooks.once("init", () => {
};
CONFIG.Item.dataModels = {
skills: Skill,
spells: Spell
skill: SkillDataModel,
spell: SpellDataModel
}
console.log("DSA 4.1 is ready for development!")

View File

@ -1,3 +0,0 @@
export class DsaActor extends Actor {
}

View File

@ -0,0 +1,21 @@
export default class BaseItem extends foundry.abstract.TypeDataModel {
/** @inheritDoc */
async importFromCompendium(pack, id, updateData={}, options={}) {
console.log(`called ${pack} ${id} `);
const created = await super.importFromCompendium(pack, id, updateData, options);
const item = await pack.getDocument(id);
const contents = await item.system.contents;
if ( contents ) {
const fromOptions = foundry.utils.mergeObject({ clearSort: false }, options);
const toCreate = await BaseItem.createWithContents(contents, {
container: created, keepId: options.keepId, transformAll: item => this.fromCompendium(item, fromOptions)
});
await BaseItem.createDocuments(toCreate, {fromCompendium: true, keepId: true});
}
return created;
}
}

View File

@ -1,11 +1,11 @@
import { Skill } from "../Items/skill.mjs";
import { Spell } from "../Items/spell.mjs";
import { Skill } from "./Items/skill.mjs";
import { Spell } from "./Items/spell.mjs";
const {
SchemaField, NumberField, StringField, ArrayField, BooleanField, EmbeddedCollectionField,
} = foundry.data.fields;
export class PlayerCharacterDataModel extends Actor {
export class PlayerCharacterDataModel extends foundry.abstract.TypeDataModel {
static defineSchema() {
return {

View File

@ -1,6 +1,8 @@
import BaseItem from "./base-item.mjs";
const { BooleanField, ArrayField, NumberField, SchemaField, StringField, HTMLField } = foundry.data.fields;
export class Skill extends Item {
export class SkillDataModel extends BaseItem {
static defineSchema() {
return {
@ -8,12 +10,12 @@ export class Skill extends Item {
gruppe: new StringField({ required: true }),
probe: new ArrayField(new StringField(), { exact: 3 }), // References one of the eight attributes by name
voraussetzung: new SchemaField({
talent: new StringField({ model: Skill }),
wert: new NumberField(),
talent: new StringField({ model: SkillDataModel }),
wert: new NumberField({}),
}), // Required skills at a given level
talent: new HTMLField(),
behinderung: new NumberField(), // BE-X
komplexität: new NumberField(), // In case of languages
talent: new HTMLField({ required: true }),
behinderung: new NumberField({ required: false}), // BE-X
komplexität: new NumberField({ required: false }), // In case of languages
}
}
/**
@ -33,4 +35,5 @@ export class Skill extends Item {
* @private
*/
async roll() { }
}

View File

@ -1,17 +1,20 @@
import BaseItem from "./base-item.mjs";
const { BooleanField, NumberField, SchemaField, ArrayField, StringField, HTMLField } = foundry.data.fields;
export class Spell extends Item {
export class SpellDataModel extends BaseItem {
static defineSchema() {
return {
seite: new NumberField(),
name: new StringField({ required: true }),
probe: new ArrayField({ required: true, exact: 3 }),
probe: new ArrayField( new StringField(), { required: true, exact: 3 }),
probeMod: new StringField(),
technik: new StringField(),
zauberdauer: new StringField(),
wirkung: new StringField(),
kosten: new StringField(),
zielobjekt: new StringField(),
reichweite: new StringField({ required: true }),
wirkungsdauer: new StringField({ required: true }),
modifikationen: new StringField({ required: true }),
@ -42,4 +45,5 @@ export class Spell extends Item {
* @private
*/
async roll() { }
}

View File

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

View File

@ -0,0 +1,11 @@
import { BaseItem } from "./base-item.mjs";
export class Skill extends BaseItem {
/**
* Augment the basic Item data model with additional dynamic data.
*/
prepareData() {
super.prepareData();
}
}

View File

@ -0,0 +1,11 @@
import { BaseItem } from "./base-item.mjs";
export class Spell extends BaseItem {
/**
* Augment the basic Item data model with additional dynamic data.
*/
prepareData() {
super.prepareData();
}
}

View File

@ -1,4 +1,4 @@
export class SkillSheet extends ItemSheet {
export class SkillSheet extends foundry.appv1.sheets.ItemSheet {
/**@override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {

View File

@ -1,4 +1,4 @@
export class SpellSheet extends ItemSheet {
export class SpellSheet extends foundry.appv1.sheets.ItemSheet {
/**@override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {

View File

@ -1,7 +1,9 @@
{
"_id": "oMOnOMtQmZJBRney",
"_key": "'!talents!oMOnOMtQmZJBRney'",
"_key": "!items!oMOnOMtQmZJBRney",
"type": "Skill",
"name": "Betören",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"IN",
@ -17,3 +19,4 @@
"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

@ -0,0 +1,15 @@
{
"_id": "FQutitgTp9Lcko9C",
"_key": "!items!FQutitgTp9Lcko9C",
"type": "Skill",
"name": "Menschenkenntnis",
"system": {
"gruppe": "Gesellschaft",
"probe": [
"KL",
"IN",
"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,8 +0,0 @@
{
"_id": "FQutitgTp9Lcko9C",
"_key": "!talents!FQutitgTp9Lcko9C",
"name": "Menschenkenntniss",
"gruppe": "Gesellschaft",
"probe": ["KL", "IN", "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,8 +1,10 @@
{
"_id": "sP8CV5VNEcY1Yh1Q",
"_key": "!spells!sP8CV5VNEcY1Yh1Q",
"seite": 11,
"_key": "!items!sP8CV5VNEcY1Yh1Q",
"type":"Spell",
"name": "ABVENENUM REINE SPEISE",
"system": {
"seite": 11,
"probe": ["KL", "KL", "FF"],
"probenMod": "+Mod.",
"technik": "Der Elf spricht bhasama venya bhaza yalza über die zu reinigende Nahrung.",
@ -48,3 +50,4 @@
"repräsentation": "Dru, Elf, Hex, Mag je 6; Geo5; Ach, Sch je 4",
"info": "Dieser ursprünglich von den W aldelfen stammende Spruch ist bei fast allen Zauberkundigen weit verbreitet. An allen Orten, an denen die lokalen Potentaten in ständiger Furcht vor Meuchlern und Giftmi-schern leben, werden Meisterinnen und Meister des ABVENENUM mit Kusshand in den Hofstaat aufgenommen (wenn sie nach einem Demonstrationszaubern den Genuss der vorher präparierten Narung überlebt haben)."
}
}

View File

@ -1,8 +1,10 @@
{
"_id": "rLMflzmxpe8JGTOA",
"_key": "!spells!rLMflzmxpe8JGTOA",
"seite": null,
"_key": "!items!rLMflzmxpe8JGTOA",
"type":"Spell",
"name": "IGNISPHAERO",
"system": {
"seite": null,
"probe": ["MU", "IN", "KO"],
"probenMod": null,
"technik": "Die Magierin hält beide Hände schalenförmig geöffnet in Armsänge von sich und spricht die Formel.",
@ -21,3 +23,4 @@
"repräsentationen": "Mag 3; Ach 2; Geo 1",
"info": null
}
}

View File

@ -26,7 +26,7 @@
],
"packs": [
{
"name": "Skill",
"name": "skills",
"label": "Basistalente",
"system": "DSA_4-1",
"type": "Item",
@ -34,7 +34,7 @@
"private": false
},
{
"name": "Spells",
"name": "spells",
"label": "Basiszauber",
"system": "DSA_4-1",
"type": "Item",
@ -60,7 +60,7 @@
"color": "#801020",
"sorting": "m",
"packs": [
"Spells"
"spells"
]
}
],
@ -79,18 +79,19 @@
"Skill": {
"stringFields": [
"name",
"gruppe",
"probe",
"voraussetzung"
"gruppe"
],
"arrayFields": [
"probe"
],
"numberFields": [
"handicapValue",
"complexity"
"behinderung",
"komplexität"
],
"htmlFields": [
"text"
"talent"
],
"foreignDocumentField": [
"schemaFields": [
"voraussetzung"
]
},
@ -102,6 +103,7 @@
"zauberdauer",
"wirkung",
"kosten",
"zielobjekt",
"reichweite",
"wirkungsdauer",
"modifikationen",
@ -115,6 +117,9 @@
"numberFields": [
"seite"
],
"schemaFields": [
"varianten"
],
"arrayFields": [
"probe"
]