Compare commits

..

2 commits

1752 changed files with 69443 additions and 82293 deletions

View file

@ -3,5 +3,6 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
/dist /dist
client /.pnp.cjs
common /.pnp.loader.mjs
/.yarn/

View file

@ -4,12 +4,38 @@
module.exports = { module.exports = {
parser: "@typescript-eslint/parser", parser: "@typescript-eslint/parser",
parserOptions: { ecmaVersion: 2020, sourceType: "module" },
env: { browser: true }, parserOptions: {
extends: ["plugin:@typescript-eslint/recommended", "prettier"], ecmaVersion: 2020,
plugins: ["@typescript-eslint"], sourceType: "module",
},
env: {
browser: true,
},
extends: ["plugin:@typescript-eslint/recommended", "plugin:jest/recommended", "plugin:prettier/recommended"],
plugins: ["@typescript-eslint", "jest"],
rules: {
// Specify any specific ESLint rules.
},
overrides: [ overrides: [
{ files: ["./*.cjs"], rules: { "@typescript-eslint/no-var-requires": "off" } }, {
{ files: ["./spec/**/*"], env: { browser: false } }, files: ["./*.cjs", "./*.js"],
rules: {
"@typescript-eslint/no-var-requires": "off",
},
},
{
files: ["./spec/**/*"],
env: {
browser: false,
},
extends: ["plugin:jest/recommended"],
plugins: ["jest"],
},
], ],
}; };

View file

@ -1,99 +0,0 @@
# SPDX-FileCopyrightText: 2023 Johannes Loher
#
# SPDX-License-Identifier: MIT
name: Bug Report
about: File a bug report
labels: ["bug", "to be confirmed"]
body:
- type: markdown
attributes:
value: |
Your issue may already have been reported! Please search on the [issue tracker](https://git.f3l.de/dungeonslayers/ds4/issues) before submitting a new one.
Thanks for taking the time to fill out this bug report! In order to make it effective, please provide the following information.
- type: markdown
attributes:
value: |
## Issue Description
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: What is the behavior that you expected?
validations:
required: true
- type: textarea
id: current
attributes:
label: Current Behavior
description: What is the current behavior, i.e., what happens actually?
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: What are the steps to reproduce the problem?
placeholder: |
1.
2.
3.
4.
validations:
required: true
- type: textarea
id: context
attributes:
label: Context
description: Please provide any additional context that might be helpful, e.g. log messages, screenshots, videos, or exports of problematic scenes or worlds.
validations:
required: false
- type: markdown
attributes:
value: |
## Environment Details
- type: input
id: version
attributes:
label: Version
description: Which version(s) of DS4 are you seeing the problem on?
validations:
required: true
- type: input
id: foundry-version
attributes:
label: Foundry VTT Version
description: Which version(s) and build of Foundry VTT are you seeing the problem on?
validations:
required: true
- type: input
id: os
attributes:
label: Operating System
description: Which operating system are you using? (Windows, OS X, Linux (which distro))
placeholder: Windows
validations:
required: true
- type: dropdown
id: browser
attributes:
label: Browser / App
description: Are you using a Browser or the native Electron application? (Select all that apply)
multiple: true
options:
- Native Electron App
- Chrome
- Firefox
- Microsoft Edge
- Safari
- Other
validations:
required: true
- type: input
id: modules
attributes:
label: Relevant Modules
description: Please list any other active modules (including their versions) that you think might be relevant.
validations:
required: false

View file

@ -1,5 +0,0 @@
# SPDX-FileCopyrightText: 2023 Johannes Loher
#
# SPDX-License-Identifier: MIT
blank_issues_enabled: false

View file

@ -1,28 +0,0 @@
# SPDX-FileCopyrightText: 2023 Johannes Loher
#
# SPDX-License-Identifier: MIT
name: Feature Request
description: Submit a feature request
labels: ["feature"]
body:
- type: markdown
attributes:
value: |
Your issue may already have been reported! Please search on the [issue tracker](https://git.f3l.de/dungeonslayers/ds4/issues) before submitting a new one.
In order to submit an effective feature request, please provide the following information.
- type: textarea
id: description
attributes:
label: Description
description: Please describe the proposal in as much detail as you feel is necessary.
validations:
required: true
- type: textarea
id: context
attributes:
label: Context
description: Is there anything else you can add about the proposal? You might want to link to related issues here if you haven't already.
validations:
required: false

12
.gitignore vendored
View file

@ -25,8 +25,10 @@ dist
results.xml results.xml
junit.xml junit.xml
# foundry # yarn
/client .yarn/*
/common !.yarn/releases
!.yarn/plugins
.pnpm-store/ !.yarn/sdks
!.yarn/versions
.pnp.*

184
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,184 @@
# SPDX-FileCopyrightText: 2021 Johannes Loher
# SPDX-FileCopyrightText: 2021 Oliver Rümpelein
#
# SPDX-License-Identifier: MIT
image: node:lts
stages:
- check
- build
- prepare-release
- release
- publish
cache: &global_cache
paths:
- .yarn/cache
lint:
stage: check
before_script:
- yarn install --immutable
script:
- yarn lint
cache:
<<: *global_cache
typecheck:
stage: check
before_script:
- yarn install --immutable
script:
- yarn typecheck
cache:
<<: *global_cache
test:
stage: check
before_script:
- yarn install --immutable
script:
- yarn test:ci
cache:
<<: *global_cache
artifacts:
when: always
reports:
junit:
- junit.xml
reuse:
stage: check
image:
name: fsfe/reuse:latest
entrypoint: [""]
script:
- reuse lint
build:
stage: build
before_script:
- yarn install --immutable
- if [[ ! -z ${CI_COMMIT_TAG+x} ]]; then export NODE_ENV=production; fi
script:
- yarn build
- mv dist ds4
cache:
<<: *global_cache
artifacts:
paths:
- ds4
expire_in: 1 week
publish-artifacts:
stage: prepare-release
image: alpine:latest
before_script:
- apk update
- apk add zip curl
script: |
zip -r ds4.zip ds4/*
curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ds4.zip "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/$CI_COMMIT_TAG/ds4.zip"
curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ds4/system.json "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/$CI_COMMIT_TAG/system.json"
rules:
- if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'
changelog:
stage: prepare-release
before_script:
- yarn install --immutable
script:
- yarn changelog
cache:
<<: *global_cache
artifacts:
paths:
- CHANGELOG.md
rules:
- if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'
.release-template: &release-template
stage: release
before_script:
- yarn install
- apt update
- apt install --yes jq
- REPOSITORY_URL=$(echo "${CI_REPOSITORY_URL}" | sed -e "s|gitlab-ci-token:.*@|${RELEASE_TOKEN}:${RELEASE_TOKEN_SECRET}@|g")
- git remote set-url origin $REPOSITORY_URL
- git config user.name $GITLAB_USER_LOGIN
- git config user.email $GITLAB_USER_EMAIL
- git branch -D ci-processing || true
- git checkout -b ci-processing
cache:
<<: *global_cache
script: |
yarn bump-version --release=${RELEASE_TYPE}
RELEASE_VERSION=$(jq -r '.version' < package.json)
git add package.json system.json
git --no-pager diff
git commit -m "chore(release): ${RELEASE_VERSION}"
git tag -f ${RELEASE_VERSION}
git push origin ci-processing:${CI_BUILD_REF_NAME} -o ci.skip
git push origin ${RELEASE_VERSION}
only:
- master
when: manual
release-patch:
variables:
RELEASE_TYPE: patch
<<: *release-template
release-minor:
variables:
RELEASE_TYPE: minor
<<: *release-template
release-major:
variables:
RELEASE_TYPE: major
<<: *release-template
release:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
script:
- echo 'release job'
rules:
- if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'
release:
tag_name: $CI_COMMIT_TAG
description: "./CHANGELOG.md"
assets:
links:
- name: "ds4.zip"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/$CI_COMMIT_TAG/ds4.zip"
filepath: /ds4.zip
link_type: package
- name: "system.json"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/$CI_COMMIT_TAG/system.json"
filepath: /system.json
link_type: other
publish-latest-manifest:
stage: publish
image: alpine:latest
before_script:
- apk update
- apk add zip curl
script: |
curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ds4/system.json "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/ds4/latest/system.json"
rules:
- if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'
publish-to-foundry-admin:
stage: publish
image: johannesloher/foundry-publish
variables:
FVTT_MANIFEST_PATH: ds4/system.json
FVTT_MANIFEST_URL: ${CI_PROJECT_URL}/-/releases/${CI_COMMIT_TAG}/downloads/system.json
FVTT_DELETE_OBSOLETE_VERSIONS: "true"
script: foundry-publish
rules:
- if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'

View file

@ -0,0 +1,48 @@
Your issue may already have been reported! Please search on the issue tracker (https://git.f3l.de/dungeonslayers/ds4/-/issues) before submitting a new one.
Thanks for taking the time to fill out this bug report! In order to make it effective, please provide the following information.
# Issue Description
## Expected Behavior
(What is the behavior that you expected?)
## Current Behavior
(What is the current behavior, i.e., what happens actually?)
## Steps to Reproduce
(What are the steps to reproduce the problem?)
1. ...
2. ...
3. ...
## Context
(Please provide any additional context that might be helpful, e.g. log messages,
screenshots, videos, or exports of problematic scenes or worlds.)
# Environment Details
## Version
(Which version(s) of DS4 are you seeing the problem on?)
## Foundry VTT Version
(Which version(s) and build of Foundry VTT are you seeing the problem on?)
## Operating System
(Which operating system are you using? (Windows, OS X, Linux (which distro)))
## Browser / App
(Are you using a Browser or the native Electron application?)
## Relevant Modules
(Please list any active modules (including their versions) that you think might be relevant.)

View file

@ -0,0 +1,11 @@
Your issue may already have been reported! Please search on the issue tracker (https://git.f3l.de/dungeonslayers/ds4/-/issues) before submitting a new one.
In order to submit an effective feature request, please provide the following information.
# Description
(Please describe the proposal in as much detail as you feel is necessary.)
# Context
(Is there anything else you can add about the proposal? You might want to link to related issues here if you haven't already.)

View file

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2022 Johannes Loher
SPDX-License-Identifier: MIT

1
.husky/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
_

9
.husky/commit-msg Executable file
View file

@ -0,0 +1,9 @@
#!/bin/sh
# SPDX-FileCopyrightText: 2021 Johannes Loher
#
# SPDX-License-Identifier: MIT
. "$(dirname "$0")/_/husky.sh"
yarn run commitlint --edit "$1"

9
.husky/pre-commit Executable file
View file

@ -0,0 +1,9 @@
#!/bin/sh
# SPDX-FileCopyrightText: 2021 Johannes Loher
#
# SPDX-License-Identifier: MIT
. "$(dirname "$0")/_/husky.sh"
yarn run lint-staged

View file

@ -4,8 +4,7 @@
/dist /dist
/package-lock.json /package-lock.json
/node_modules/ /.pnp.cjs
/.pnp.loader.mjs
/.yarn/
/.vscode/ /.vscode/
client
common
pnpm-lock.yaml

11
.prettierrc.cjs Normal file
View file

@ -0,0 +1,11 @@
// SPDX-FileCopyrightText: 2021 Johannes Loher
//
// SPDX-License-Identifier: MIT
module.exports = {
semi: true,
trailingComma: "all",
singleQuote: false,
printWidth: 120,
tabWidth: 4,
};

View file

@ -1,11 +0,0 @@
// SPDX-FileCopyrightText: 2021 Johannes Loher
//
// SPDX-License-Identifier: MIT
export default {
semi: true,
trailingComma: "all",
singleQuote: false,
printWidth: 120,
tabWidth: 2,
};

View file

@ -3,6 +3,10 @@ Upstream-Name: ds4
Upstream-Contact: Johannes Loher <johannes.loher@fg4f.de> Upstream-Contact: Johannes Loher <johannes.loher@fg4f.de>
Source: https://git.f3l.de/dungeonslayers/ds4 Source: https://git.f3l.de/dungeonslayers/ds4
Files: .yarn/**
Copyright: Copyright (c) 2016-present, Yarn Contributors. All rights reserved.
License: BSD-2-Clause
Files: assets/icons/official/* Files: assets/icons/official/*
Copyright: 2021 Johannes Loher Copyright: 2021 Johannes Loher
License: CC-BY-NC-SA-4.0 License: CC-BY-NC-SA-4.0
@ -46,32 +50,3 @@ License: CC-BY-3.0
Files: assets/tokens/devin-night/* Files: assets/tokens/devin-night/*
Copyright: Devin Night, https://immortalnights.com/ Copyright: Devin Night, https://immortalnights.com/
License: LicenseRef-DevinNightTokenUsageRights License: LicenseRef-DevinNightTokenUsageRights
Files: packs/creatures/*
Copyright: 2021 Sascha Martens
2021 Johannes Loher
License: CC-BY-NC-SA-4.0
Files: packs/items/*
Copyright: 2021 Johannes Loher
License: CC-BY-NC-SA-4.0
Files: packs/languages-and-scripts/*
Copyright: 2021 Johannes Loher
License: CC-BY-NC-SA-4.0
Files: packs/racial-abilities/*
Copyright: 2021 Johannes Loher
License: CC-BY-NC-SA-4.0
Files: packs/special-creature-abilities/*
Copyright: 2021 Johannes Loher
License: CC-BY-NC-SA-4.0
Files: packs/spells/*
Copyright: 2021 Sascha Martens
License: CC-BY-NC-SA-4.0
Files: packs/talents/*
Copyright: 2022 Johannes Loher
License: CC-BY-NC-SA-4.0

6
.vscode/launch.json vendored
View file

@ -5,14 +5,12 @@
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"type": "chrome", "type": "pwa-chrome",
"request": "launch", "request": "launch",
"runtimeExecutable": "/usr/bin/chromium", "runtimeExecutable": "/usr/bin/chromium",
"name": "Launch Chrome against localhost", "name": "Launch Chrome against localhost",
"url": "http://localhost:30000/game", "url": "http://localhost:30000/game",
"pathMapping": { "webRoot": "${workspaceFolder}/dist"
"/systems/ds4": "${workspaceFolder}/dist"
}
} }
] ]
} }

14
.vscode/settings.json vendored
View file

@ -1,4 +1,16 @@
{ {
"typescript.tsdk": "node_modules/typescript/lib", "search.exclude": {
"**/.yarn": true,
"**/.pnp.*": true
},
"eslint.nodePath": ".yarn/sdks",
"prettier.prettierPath": ".yarn/sdks/prettier/index.js",
"typescript.tsdk": ".yarn/sdks/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true, "typescript.enablePromptUseWorkspaceTsdk": true,
"importSorter.generalConfiguration.sortOnBeforeSave": true,
"importSorter.importStringConfiguration.maximumNumberOfImportExpressionsPerLine.type": "newLineEachExpressionAfterCountLimitExceptIfOnlyOne",
"importSorter.importStringConfiguration.maximumNumberOfImportExpressionsPerLine.count": 120,
"importSorter.importStringConfiguration.tabSize": 4,
"importSorter.importStringConfiguration.quoteMark": "double",
"importSorter.importStringConfiguration.trailingComma": "multiLine"
} }

View file

@ -1,70 +0,0 @@
# SPDX-FileCopyrightText: 2023 Johannes Loher
#
# SPDX-License-Identifier: MIT
$schema: https://raw.githubusercontent.com/woodpecker-ci/woodpecker/master/pipeline/schema/schema.json
variables:
- &node_image node:lts
- &enable_pnpm
- corepack enable
- corepack prepare pnpm@latest --activate
when:
- event: push
branch: ${CI_REPO_DEFAULT_BRANCH}
- event: pull_request
- event: tag
- event: manual
steps:
install:
image: *node_image
commands:
- <<: *enable_pnpm
- pnpm install --frozen-lockfile
lint:
group: check
image: *node_image
commands:
- <<: *enable_pnpm
- pnpm lint
formatcheck:
group: check
image: *node_image
commands:
- <<: *enable_pnpm
- pnpm format:check
typecheck:
group: check
image: *node_image
commands:
- <<: *enable_pnpm
- pnpm typecheck
test:
group: check
image: *node_image
commands:
- <<: *enable_pnpm
- pnpm test
reuse:
group: check
image: fsfe/reuse:latest
commands:
- reuse lint
commitlint:
group: check
image: *node_image
commands:
- <<: *enable_pnpm
- git fetch origin ${CI_COMMIT_TARGET_BRANCH}
- pnpm exec commitlint --from origin/${CI_COMMIT_TARGET_BRANCH}
when:
event: pull_request
build:
group: build
image: *node_image
commands:
- export APPDATA=$(pwd)
- <<: *enable_pnpm
- pnpm build

View file

@ -1,114 +0,0 @@
# SPDX-FileCopyrightText: 2023 Johannes Loher
#
# SPDX-License-Identifier: MIT
$schema: https://raw.githubusercontent.com/woodpecker-ci/woodpecker/master/pipeline/schema/schema.json
variables:
- &node_image node:lts
- &enable_pnpm
- corepack enable
- corepack prepare pnpm@latest --activate
- &is_latest_channel
evaluate: CI_COMMIT_TAG matches "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+$"
- &is_beta_channel
evaluate: CI_COMMIT_TAG matches "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+-[0-9]+$"
- &release_plugin woodpeckerci/plugin-gitea-release
- &release_base_settings
base_url: ${CI_FORGE_URL}
title: ${CI_COMMIT_TAG}
note: CHANGELOG.md
files:
- ${CI_REPO_NAME}.zip
- ${CI_REPO_NAME}/system.json
api_key:
from_secret: forge_token
when:
event: tag
evaluate: CI_COMMIT_TAG matches "^[0-9]+\\\\.[0-9]+\\\\.[0-9]+(-[0-9]+)?$"
depends_on:
- checks
steps:
install:
image: *node_image
commands:
- <<: *enable_pnpm
- pnpm install --frozen-lockfile
build:
image: *node_image
environment:
NODE_ENV: production
commands:
- export APPDATA=$(pwd)
- <<: *enable_pnpm
- pnpm build
package:
group: prepare-release
image: alpine:latest
commands:
- apk update
- apk add zip curl
- mv dist ${CI_REPO_NAME}
- zip -r ${CI_REPO_NAME}.zip ${CI_REPO_NAME}/*
changelog:
group: prepare-release
image: *node_image
commands:
- <<: *enable_pnpm
- pnpm changelog
choose-latest-channel:
group: prepare-release
image: alpine:latest
commands:
- echo latest > .RELEASE_CHANNEL
when:
<<: *is_latest_channel
choose-beta-channel:
group: prepare-release
image: alpine:latest
commands:
- echo beta > .RELEASE_CHANNEL
when:
<<: *is_beta_channel
release-latest:
image: *release_plugin
settings:
<<: *release_base_settings
when:
<<: *is_latest_channel
release-beta:
image: *release_plugin
settings:
<<: *release_base_settings
prerelease: true
when:
<<: *is_beta_channel
publish-manifest:
group: publish
image: alpine:latest
commands:
- apk update
- apk add curl
- export RELEASE_CHANNEL=$(cat .RELEASE_CHANNEL)
- 'curl --header "Authorization: token $${FORGE_TOKEN}" -X "DELETE" "${CI_FORGE_URL}/api/packages/${CI_REPO_OWNER}/generic/${CI_REPO_NAME}/$${RELEASE_CHANNEL}/system.json"'
- 'curl --fail --header "Authorization: token $${FORGE_TOKEN}" --upload-file ${CI_REPO_NAME}/system.json "${CI_FORGE_URL}/api/packages/${CI_REPO_OWNER}/generic/${CI_REPO_NAME}/$${RELEASE_CHANNEL}/system.json"'
secrets:
- forge_token
publish-to-foundry-admin:
group: publish
image: johannesloher/foundry-publish
environment:
FVTT_DELETE_OBSOLETE_VERSIONS: "true"
commands:
- export FVTT_MANIFEST_PATH=${CI_REPO_NAME}/system.json
- export FVTT_MANIFEST_URL=${CI_REPO_URL}/releases/download/${CI_COMMIT_TAG}/system.json
- foundry-publish
secrets:
- fvtt_package_id
- fvtt_username
- fvtt_password
when:
<<: *is_latest_channel

View file

@ -1,47 +0,0 @@
# SPDX-FileCopyrightText: 2023 Johannes Loher
#
# SPDX-License-Identifier: MIT
$schema: https://raw.githubusercontent.com/woodpecker-ci/woodpecker/master/pipeline/schema/schema.json
variables:
- &node_image node:lts
- &enable_pnpm
- corepack enable
- corepack prepare pnpm@latest --activate
when:
event: manual
branch: ${CI_REPO_DEFAULT_BRANCH}
depends_on:
- checks
steps:
install:
image: *node_image
commands:
- <<: *enable_pnpm
- pnpm install --frozen-lockfile
release:
image: *node_image
commands:
- <<: *enable_pnpm
- apt-get update
- apt-get install --yes jq
- export REPOSITORY_URL=$(echo "${CI_REPO_CLONE_URL}" | sed -e "s|://|://$${FORGE_TOKEN_NAME}:$${FORGE_TOKEN}@|g")
- git remote set-url origin $${REPOSITORY_URL}
- git config user.name woodpecker[bot]
- git config user.email woodpecker[bot]@${CI_SYSTEM_HOST}
- pnpm bump-version --release=${RELEASE_TYPE}
- pnpm exec prettier --write package.json system.json
- export RELEASE_VERSION=$(jq -r '.version' < package.json)
- git --no-pager diff
- git add package.json system.json
- 'git commit -m "chore(release): $${RELEASE_VERSION}"'
- git tag -f $${RELEASE_VERSION}
- git push origin ${CI_COMMIT_BRANCH}
- git push origin $${RELEASE_VERSION}
secrets:
- forge_token_name
- forge_token

File diff suppressed because one or more lines are too long

768
.yarn/releases/yarn-3.1.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

20
.yarn/sdks/eslint/bin/eslint.js vendored Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/bin/eslint.js
require(absPnpApiPath).setup();
}
}
// Defer to the real eslint/bin/eslint.js your application uses
module.exports = absRequire(`eslint/bin/eslint.js`);

20
.yarn/sdks/eslint/lib/api.js vendored Normal file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require eslint/lib/api.js
require(absPnpApiPath).setup();
}
}
// Defer to the real eslint/lib/api.js your application uses
module.exports = absRequire(`eslint/lib/api.js`);

6
.yarn/sdks/eslint/package.json vendored Normal file
View file

@ -0,0 +1,6 @@
{
"name": "eslint",
"version": "8.1.0-sdk",
"main": "./lib/api.js",
"type": "commonjs"
}

5
.yarn/sdks/integrations.yml vendored Normal file
View file

@ -0,0 +1,5 @@
# This file is automatically generated by @yarnpkg/sdks.
# Manual changes might be lost!
integrations:
- vscode

20
.yarn/sdks/prettier/index.js vendored Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require prettier/index.js
require(absPnpApiPath).setup();
}
}
// Defer to the real prettier/index.js your application uses
module.exports = absRequire(`prettier/index.js`);

6
.yarn/sdks/prettier/package.json vendored Normal file
View file

@ -0,0 +1,6 @@
{
"name": "prettier",
"version": "2.4.1-sdk",
"main": "./index.js",
"type": "commonjs"
}

20
.yarn/sdks/typescript/bin/tsc vendored Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require typescript/bin/tsc
require(absPnpApiPath).setup();
}
}
// Defer to the real typescript/bin/tsc your application uses
module.exports = absRequire(`typescript/bin/tsc`);

20
.yarn/sdks/typescript/bin/tsserver vendored Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require typescript/bin/tsserver
require(absPnpApiPath).setup();
}
}
// Defer to the real typescript/bin/tsserver your application uses
module.exports = absRequire(`typescript/bin/tsserver`);

20
.yarn/sdks/typescript/lib/tsc.js vendored Normal file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require typescript/lib/tsc.js
require(absPnpApiPath).setup();
}
}
// Defer to the real typescript/lib/tsc.js your application uses
module.exports = absRequire(`typescript/lib/tsc.js`);

184
.yarn/sdks/typescript/lib/tsserver.js vendored Normal file
View file

@ -0,0 +1,184 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
const moduleWrapper = tsserver => {
if (!process.versions.pnp) {
return tsserver;
}
const {isAbsolute} = require(`path`);
const pnpApi = require(`pnpapi`);
const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//);
const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`);
const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => {
return `${locator.name}@${locator.reference}`;
}));
// VSCode sends the zip paths to TS using the "zip://" prefix, that TS
// doesn't understand. This layer makes sure to remove the protocol
// before forwarding it to TS, and to add it back on all returned paths.
function toEditorPath(str) {
// We add the `zip:` prefix to both `.zip/` paths and virtual paths
if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) {
// We also take the opportunity to turn virtual paths into physical ones;
// this makes it much easier to work with workspaces that list peer
// dependencies, since otherwise Ctrl+Click would bring us to the virtual
// file instances instead of the real ones.
//
// We only do this to modules owned by the the dependency tree roots.
// This avoids breaking the resolution when jumping inside a vendor
// with peer dep (otherwise jumping into react-dom would show resolution
// errors on react).
//
const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str;
if (resolved) {
const locator = pnpApi.findPackageLocator(resolved);
if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) {
str = resolved;
}
}
str = normalize(str);
if (str.match(/\.zip\//)) {
switch (hostInfo) {
// Absolute VSCode `Uri.fsPath`s need to start with a slash.
// VSCode only adds it automatically for supported schemes,
// so we have to do it manually for the `zip` scheme.
// The path needs to start with a caret otherwise VSCode doesn't handle the protocol
//
// Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910
//
// Update Oct 8 2021: VSCode changed their format in 1.61.
// Before | ^zip:/c:/foo/bar.zip/package.json
// After | ^/zip//c:/foo/bar.zip/package.json
//
case `vscode <1.61`: {
str = `^zip:${str}`;
} break;
case `vscode`: {
str = `^/zip/${str}`;
} break;
// To make "go to definition" work,
// We have to resolve the actual file system path from virtual path
// and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip)
case `coc-nvim`: {
str = normalize(resolved).replace(/\.zip\//, `.zip::`);
str = resolve(`zipfile:${str}`);
} break;
// Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server)
// We have to resolve the actual file system path from virtual path,
// everything else is up to neovim
case `neovim`: {
str = normalize(resolved).replace(/\.zip\//, `.zip::`);
str = `zipfile:${str}`;
} break;
default: {
str = `zip:${str}`;
} break;
}
}
}
return str;
}
function fromEditorPath(str) {
switch (hostInfo) {
case `coc-nvim`:
case `neovim`: {
str = str.replace(/\.zip::/, `.zip/`);
// The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/...
// So in order to convert it back, we use .* to match all the thing
// before `zipfile:`
return process.platform === `win32`
? str.replace(/^.*zipfile:\//, ``)
: str.replace(/^.*zipfile:/, ``);
} break;
case `vscode`:
default: {
return process.platform === `win32`
? str.replace(/^\^?(zip:|\/zip)\/+/, ``)
: str.replace(/^\^?(zip:|\/zip)\/+/, `/`);
} break;
}
}
// Force enable 'allowLocalPluginLoads'
// TypeScript tries to resolve plugins using a path relative to itself
// which doesn't work when using the global cache
// https://github.com/microsoft/TypeScript/blob/1b57a0395e0bff191581c9606aab92832001de62/src/server/project.ts#L2238
// VSCode doesn't want to enable 'allowLocalPluginLoads' due to security concerns but
// TypeScript already does local loads and if this code is running the user trusts the workspace
// https://github.com/microsoft/vscode/issues/45856
const ConfiguredProject = tsserver.server.ConfiguredProject;
const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype;
ConfiguredProject.prototype.enablePluginsWithOptions = function() {
this.projectService.allowLocalPluginLoads = true;
return originalEnablePluginsWithOptions.apply(this, arguments);
};
// And here is the point where we hijack the VSCode <-> TS communications
// by adding ourselves in the middle. We locate everything that looks
// like an absolute path of ours and normalize it.
const Session = tsserver.server.Session;
const {onMessage: originalOnMessage, send: originalSend} = Session.prototype;
let hostInfo = `unknown`;
Object.assign(Session.prototype, {
onMessage(/** @type {string} */ message) {
const parsedMessage = JSON.parse(message)
if (
parsedMessage != null &&
typeof parsedMessage === `object` &&
parsedMessage.arguments &&
typeof parsedMessage.arguments.hostInfo === `string`
) {
hostInfo = parsedMessage.arguments.hostInfo;
if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK && process.env.VSCODE_IPC_HOOK.match(/Code\/1\.([1-5][0-9]|60)\./)) {
hostInfo += ` <1.61`;
}
}
return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => {
return typeof value === `string` ? fromEditorPath(value) : value;
}));
},
send(/** @type {any} */ msg) {
return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => {
return typeof value === `string` ? toEditorPath(value) : value;
})));
}
});
return tsserver;
};
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require typescript/lib/tsserver.js
require(absPnpApiPath).setup();
}
}
// Defer to the real typescript/lib/tsserver.js your application uses
module.exports = moduleWrapper(absRequire(`typescript/lib/tsserver.js`));

View file

@ -0,0 +1,184 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
const moduleWrapper = tsserver => {
if (!process.versions.pnp) {
return tsserver;
}
const {isAbsolute} = require(`path`);
const pnpApi = require(`pnpapi`);
const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//);
const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`);
const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => {
return `${locator.name}@${locator.reference}`;
}));
// VSCode sends the zip paths to TS using the "zip://" prefix, that TS
// doesn't understand. This layer makes sure to remove the protocol
// before forwarding it to TS, and to add it back on all returned paths.
function toEditorPath(str) {
// We add the `zip:` prefix to both `.zip/` paths and virtual paths
if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) {
// We also take the opportunity to turn virtual paths into physical ones;
// this makes it much easier to work with workspaces that list peer
// dependencies, since otherwise Ctrl+Click would bring us to the virtual
// file instances instead of the real ones.
//
// We only do this to modules owned by the the dependency tree roots.
// This avoids breaking the resolution when jumping inside a vendor
// with peer dep (otherwise jumping into react-dom would show resolution
// errors on react).
//
const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str;
if (resolved) {
const locator = pnpApi.findPackageLocator(resolved);
if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) {
str = resolved;
}
}
str = normalize(str);
if (str.match(/\.zip\//)) {
switch (hostInfo) {
// Absolute VSCode `Uri.fsPath`s need to start with a slash.
// VSCode only adds it automatically for supported schemes,
// so we have to do it manually for the `zip` scheme.
// The path needs to start with a caret otherwise VSCode doesn't handle the protocol
//
// Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910
//
// Update Oct 8 2021: VSCode changed their format in 1.61.
// Before | ^zip:/c:/foo/bar.zip/package.json
// After | ^/zip//c:/foo/bar.zip/package.json
//
case `vscode <1.61`: {
str = `^zip:${str}`;
} break;
case `vscode`: {
str = `^/zip/${str}`;
} break;
// To make "go to definition" work,
// We have to resolve the actual file system path from virtual path
// and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip)
case `coc-nvim`: {
str = normalize(resolved).replace(/\.zip\//, `.zip::`);
str = resolve(`zipfile:${str}`);
} break;
// Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server)
// We have to resolve the actual file system path from virtual path,
// everything else is up to neovim
case `neovim`: {
str = normalize(resolved).replace(/\.zip\//, `.zip::`);
str = `zipfile:${str}`;
} break;
default: {
str = `zip:${str}`;
} break;
}
}
}
return str;
}
function fromEditorPath(str) {
switch (hostInfo) {
case `coc-nvim`:
case `neovim`: {
str = str.replace(/\.zip::/, `.zip/`);
// The path for coc-nvim is in format of /<pwd>/zipfile:/<pwd>/.yarn/...
// So in order to convert it back, we use .* to match all the thing
// before `zipfile:`
return process.platform === `win32`
? str.replace(/^.*zipfile:\//, ``)
: str.replace(/^.*zipfile:/, ``);
} break;
case `vscode`:
default: {
return process.platform === `win32`
? str.replace(/^\^?(zip:|\/zip)\/+/, ``)
: str.replace(/^\^?(zip:|\/zip)\/+/, `/`);
} break;
}
}
// Force enable 'allowLocalPluginLoads'
// TypeScript tries to resolve plugins using a path relative to itself
// which doesn't work when using the global cache
// https://github.com/microsoft/TypeScript/blob/1b57a0395e0bff191581c9606aab92832001de62/src/server/project.ts#L2238
// VSCode doesn't want to enable 'allowLocalPluginLoads' due to security concerns but
// TypeScript already does local loads and if this code is running the user trusts the workspace
// https://github.com/microsoft/vscode/issues/45856
const ConfiguredProject = tsserver.server.ConfiguredProject;
const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype;
ConfiguredProject.prototype.enablePluginsWithOptions = function() {
this.projectService.allowLocalPluginLoads = true;
return originalEnablePluginsWithOptions.apply(this, arguments);
};
// And here is the point where we hijack the VSCode <-> TS communications
// by adding ourselves in the middle. We locate everything that looks
// like an absolute path of ours and normalize it.
const Session = tsserver.server.Session;
const {onMessage: originalOnMessage, send: originalSend} = Session.prototype;
let hostInfo = `unknown`;
Object.assign(Session.prototype, {
onMessage(/** @type {string} */ message) {
const parsedMessage = JSON.parse(message)
if (
parsedMessage != null &&
typeof parsedMessage === `object` &&
parsedMessage.arguments &&
typeof parsedMessage.arguments.hostInfo === `string`
) {
hostInfo = parsedMessage.arguments.hostInfo;
if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK && process.env.VSCODE_IPC_HOOK.match(/Code\/1\.([1-5][0-9]|60)\./)) {
hostInfo += ` <1.61`;
}
}
return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => {
return typeof value === `string` ? fromEditorPath(value) : value;
}));
},
send(/** @type {any} */ msg) {
return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => {
return typeof value === `string` ? toEditorPath(value) : value;
})));
}
});
return tsserver;
};
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require typescript/lib/tsserverlibrary.js
require(absPnpApiPath).setup();
}
}
// Defer to the real typescript/lib/tsserverlibrary.js your application uses
module.exports = moduleWrapper(absRequire(`typescript/lib/tsserverlibrary.js`));

20
.yarn/sdks/typescript/lib/typescript.js vendored Normal file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env node
const {existsSync} = require(`fs`);
const {createRequire, createRequireFromPath} = require(`module`);
const {resolve} = require(`path`);
const relPnpApiPath = "../../../../.pnp.cjs";
const absPnpApiPath = resolve(__dirname, relPnpApiPath);
const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath);
if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) {
// Setup the environment to be able to require typescript/lib/typescript.js
require(absPnpApiPath).setup();
}
}
// Defer to the real typescript/lib/typescript.js your application uses
module.exports = absRequire(`typescript/lib/typescript.js`);

6
.yarn/sdks/typescript/package.json vendored Normal file
View file

@ -0,0 +1,6 @@
{
"name": "typescript",
"version": "4.4.4-sdk",
"main": "./lib/typescript.js",
"type": "commonjs"
}

7
.yarnrc.yml Normal file
View file

@ -0,0 +1,7 @@
nodeLinker: pnp
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools"
yarnPath: .yarn/releases/yarn-3.1.1.cjs

3
.yarnrc.yml.license Normal file
View file

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-License-Identifier: MIT

View file

@ -0,0 +1,9 @@
Copyright (c) <year> <owner> All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -7,13 +7,6 @@ SPDX-License-Identifier: MIT
# DS4 # DS4
[![status-badge](https://ci.f3l.de/api/badges/5/status.svg)](https://ci.f3l.de/repos/5)
[![REUSE status](https://api.reuse.software/badge/git.f3l.de/dungeonslayers/ds4)](https://api.reuse.software/info/git.f3l.de/dungeonslayers/ds4)
[![Forge installs](https://img.shields.io/badge/dynamic/json?label=Forge%20Installs&query=package.installs&suffix=%25&url=https%3A%2F%2Fforge-vtt.com%2Fapi%2Fbazaar%2Fpackage%2Fds4&colorB=4aa94a)](https://forge-vtt.com/bazaar#package=ds4)
[![Supported foundry versions](https://img.shields.io/endpoint?url=https://foundryshields.com/version?url=https%3A%2F%2Fgit.f3l.de%2Fapi%2Fpackages%2Fdungeonslayers%2Fgeneric%2Fds4%2Flatest%2Fsystem.json)](https://git.f3l.de/dungeonslayers/ds4)
[![Matrix](https://img.shields.io/matrix/ds4%3Aim.f3l.de?server_fqdn=im.f3l.de&logo=matrix&color=0DBD8B)](https://matrix.to/#/#ds4:im.f3l.de)
[![Ko-fi](https://img.shields.io/badge/Ko--fi-ghostfvtt-00B9FE?logo=kofi)](https://ko-fi.com/ghostfvtt)
An implementation of the [Dungeonslayers] 4 game system for [Foundry Virtual An implementation of the [Dungeonslayers] 4 game system for [Foundry Virtual
Tabletop]. Tabletop].
@ -26,16 +19,16 @@ To install and use the Dungeonslayers 4 system for Foundry Virtual Tabletop,
find it in the list in the **Install System** dialog on the Setup menu of the find it in the list in the **Install System** dialog on the Setup menu of the
application. Alternatively, paste the following Manifest URL in that dialog: application. Alternatively, paste the following Manifest URL in that dialog:
https://git.f3l.de/api/packages/dungeonslayers/generic/ds4/latest/system.json https://git.f3l.de/api/v4/projects/dungeonslayers%2Fds4/packages/generic/ds4/latest/system.json
## Development ## Development
### Prerequisites ### Prerequisites
In order to build this system, recent versions of `node` and `pnpm` are In order to build this system, recent versions of `node` and `yarn` are
required. Most likely using `npm` or `yarn` also works but only `pnpm` is required. Most likely using `npm` also works but only `yarn` is officially
officially supported. We recommend using the latest lts version of `node`. If supported. We recommend using the latest lts version of `node`. If you use `nvm`
you use `nvm` to manage your `node` versions, you can simply run to manage your `node` versions, you can simply run
``` ```
nvm install nvm install
@ -46,7 +39,7 @@ in the project's root directory.
You also need to install the project's dependencies. To do so, run You also need to install the project's dependencies. To do so, run
``` ```
pnpm install yarn install
``` ```
### Building ### Building
@ -54,13 +47,13 @@ pnpm install
You can build the project by running You can build the project by running
``` ```
pnpm build yarn build
``` ```
Alternatively, you can run Alternatively, you can run
``` ```
pnpm watch yarn watch
``` ```
to watch for changes and automatically build as necessary. to watch for changes and automatically build as necessary.
@ -83,7 +76,7 @@ On platforms other than Linux you need to adjust the path accordingly.
Then run Then run
``` ```
pnpm link-package yarn link-package
``` ```
### Running the tests ### Running the tests
@ -91,12 +84,14 @@ pnpm link-package
You can run the tests with the following command: You can run the tests with the following command:
``` ```
pnpm test yarn test
``` ```
## Contributing ## Contributing
Code and content contributions are accepted. To report issues, please contact us in [Matrix](https://matrix.to/#/#ds4:im.f3l.de). Code and content contributions are accepted. Please feel free to submit issues
to the issue tracker or submit merge requests for code changes. To create an
issue, send a mail to [git+dungeonslayers-ds4-155-issue-@git.f3l.de].
## Licensing ## Licensing
@ -112,6 +107,7 @@ author(s). You can find these attributions in [ATTRIBUTION.md](ATTRIBUTION.md).
[Dungeonslayers]: https://www.dungeonslayers.net/ [Dungeonslayers]: https://www.dungeonslayers.net/
[Foundry Virtual Tabletop]: http://foundryvtt.com/ [Foundry Virtual Tabletop]: http://foundryvtt.com/
[git+dungeonslayers-ds4-155-issue-@git.f3l.de]: mailto:git+dungeonslayers-ds4-155-issue-@git.f3l.de
[LIMITED LICENSE AGREEMENT FOR MODULE DEVELOPMENT]: https://foundryvtt.com/article/license/ [LIMITED LICENSE AGREEMENT FOR MODULE DEVELOPMENT]: https://foundryvtt.com/article/license/
[REUSE]: https://reuse.software/ [REUSE]: https://reuse.software/
[.reuse/dep5]: .reuse/dep5 [.reuse/dep5]: .reuse/dep5

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

16
jest.config.js Normal file
View file

@ -0,0 +1,16 @@
// SPDX-FileCopyrightText: 2021 Johannes Loher
//
// SPDX-License-Identifier: MIT
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
const config = {
preset: "ts-jest",
globals: {
"ts-jest": {
tsconfig: "<rootDir>/spec/tsconfig.json",
},
},
setupFiles: ["<rootDir>/spec/setup.ts"],
};
export default config;

View file

@ -1,8 +0,0 @@
{
"compilerOptions": {
"module": "es2022",
"target": "ES2022"
},
"exclude": ["node_modules", "dist"],
"include": ["src", "client", "common"]
}

View file

@ -28,8 +28,6 @@
"DS4.OpponentDefense": "Gegnerabwehr", "DS4.OpponentDefense": "Gegnerabwehr",
"DS4.OpponentDefenseAbbr": "GA", "DS4.OpponentDefenseAbbr": "GA",
"DS4.SortByOpponentDefense": "Nach Gegnerabwehr sortieren", "DS4.SortByOpponentDefense": "Nach Gegnerabwehr sortieren",
"DS4.OpponentDefenseMelee": "Gegnerabwehr für Schlagen",
"DS4.OpponentDefenseRanged": "Gegnerabwehr für Schießen",
"DS4.AttackTypeMelee": "Schlagen", "DS4.AttackTypeMelee": "Schlagen",
"DS4.AttackTypeRanged": "Schießen", "DS4.AttackTypeRanged": "Schießen",
"DS4.AttackTypeMeleeRanged": "Schlagen + Schießen", "DS4.AttackTypeMeleeRanged": "Schlagen + Schießen",
@ -76,9 +74,7 @@
"DS4.ItemTypeSpecialCreatureAbility": "Besondere Kreaturenfähigkeit", "DS4.ItemTypeSpecialCreatureAbility": "Besondere Kreaturenfähigkeit",
"DS4.ItemTypeSpecialCreatureAbilityPlural": "Besondere Kreaturenfähigkeiten", "DS4.ItemTypeSpecialCreatureAbilityPlural": "Besondere Kreaturenfähigkeiten",
"DS4.ItemWeaponCheckFlavor": "{actor} greift mit {weapon} an.", "DS4.ItemWeaponCheckFlavor": "{actor} greift mit {weapon} an.",
"DS4.ItemWeaponCheckFlavorWithOpponentDefense": "{actor} greift mit {weapon} an.<br>Gegnerabwehr: {opponentDefense}",
"DS4.ItemSpellCheckFlavor": "{actor} wirkt {spell}.", "DS4.ItemSpellCheckFlavor": "{actor} wirkt {spell}.",
"DS4.ItemSpellCheckFlavorWithOpponentDefense": "{actor} wirkt {spell}.<br>Gegnerabwehr: {opponentDefense}",
"DS4.ItemPropertiesArmor": "Panzerungseigenschaften", "DS4.ItemPropertiesArmor": "Panzerungseigenschaften",
"DS4.ItemPropertiesEquipable": "Ausrüstungseigenschaften", "DS4.ItemPropertiesEquipable": "Ausrüstungseigenschaften",
"DS4.ItemPropertiesPhysical": "Physische Eigenschaften", "DS4.ItemPropertiesPhysical": "Physische Eigenschaften",
@ -122,31 +118,20 @@
"DS4.SortBySpellType": "Nach Zauberspruchtyp sortieren", "DS4.SortBySpellType": "Nach Zauberspruchtyp sortieren",
"DS4.SpellTypeSpellcasting": "Zaubern", "DS4.SpellTypeSpellcasting": "Zaubern",
"DS4.SpellTypeTargetedSpellcasting": "Zielzaubern", "DS4.SpellTypeTargetedSpellcasting": "Zielzaubern",
"DS4.SpellGroups": "Zaubergruppen", "DS4.SpellCategory": "Kategorie",
"DS4.SpellGroupsDescription": "Zaubergruppen, denen der Zauberspruch zugehörig ist.", "DS4.SpellCategoryDescription": "Eine Kategorie, der der Zauberspruch zugehörig ist.",
"DS4.SpellGroupLightning": "Blitz", "DS4.SpellCategoryHealing": "Heilung",
"DS4.SpellGroupEarth": "Erde, Fels, Stein", "DS4.SpellCategoryFire": "Feuer",
"DS4.SpellGroupWater": "Wasser", "DS4.SpellCategoryIce": "Eis",
"DS4.SpellGroupIce": "Eis, Frost", "DS4.SpellCategoryLight": "Licht",
"DS4.SpellGroupFire": "Feuer", "DS4.SpellCategoryDarkness": "Schatten",
"DS4.SpellGroupHealing": "Heilung", "DS4.SpellCategoryMindAffecting": "Geistesbeeinflussend",
"DS4.SpellGroupLight": "Licht", "DS4.SpellCategoryElectricity": "Elektrizität",
"DS4.SpellGroupAir": "Luft", "DS4.SpellCategoryNone": "Keine",
"DS4.SpellGroupTransport": "Transport", "DS4.SpellCategoryUnset": "Nicht gesetzt",
"DS4.SpellGroupDamage": "Schaden",
"DS4.SpellGroupShadow": "Schatten",
"DS4.SpellGroupProtection": "Schutz",
"DS4.SpellGroupMindAffecting": "Geistesbeeinflussend",
"DS4.SpellGroupDemonology": "Dämonologie",
"DS4.SpellGroupNecromancy": "Nekromantie",
"DS4.SpellGroupTransmutation": "Verwandlung",
"DS4.SpellGroupArea": "Fläche",
"DS4.SpellModifier": "Zauberbonus", "DS4.SpellModifier": "Zauberbonus",
"DS4.SpellModifierNumerical": "Zauberbonus (numerisch)",
"DS4.SpellModifierComplex": "Zauberbonus (komplex)",
"DS4.SpellModifierAbbr": "ZB", "DS4.SpellModifierAbbr": "ZB",
"DS4.SpellModifierNumericalDescription": "Der numerische Zauberbonus auf die Probe.", "DS4.SpellModifierDescription": "Der Zauberbonus auf die Probe.",
"DS4.SpellModifierComplexDescription": "Ein komplexer Zauberbonus auf die Probe (zum Beispiel abhängig von Werten des Ziels). Wenn diese Art von Zauberbonus angegeben ist, wird der numerische ignoriert.",
"DS4.SortBySpellModifier": "Nach Zauberbonus sortieren", "DS4.SortBySpellModifier": "Nach Zauberbonus sortieren",
"DS4.SpellDistance": "Distanz", "DS4.SpellDistance": "Distanz",
"DS4.SpellDistanceDescription": "Die maximale Entfernung zum Ziel. „Selbst“ bedeutet, dass nur der Zauberwirker selbst das Ziel des Zaubers sein kann.", "DS4.SpellDistanceDescription": "Die maximale Entfernung zum Ziel. „Selbst“ bedeutet, dass nur der Zauberwirker selbst das Ziel des Zaubers sein kann.",
@ -164,8 +149,10 @@
"DS4.CooldownDuration100R": "100 Kampfrunden", "DS4.CooldownDuration100R": "100 Kampfrunden",
"DS4.CooldownDuration1D": "1 Tag", "DS4.CooldownDuration1D": "1 Tag",
"DS4.CooldownDurationD20D": "W20 Tage", "DS4.CooldownDurationD20D": "W20 Tage",
"DS4.SpellAllowsDefense": "Erlaubt Abwehr", "DS4.ManaCost": "Manakosten",
"DS4.SpellAllowsDefenseDescription": "Ist eine Abwehren-Probe gegen diesen Zauber erlaubt?", "DS4.ManaCostDescription": "The Anzahl an Manapunkten, die es kostet, den Zauber zu wirken.",
"DS4.CalculateManaCost": "Manakosten Automatisch Berechnen",
"DS4.CalculateManaCostConfirmationQuestion": "<p>Die Manakosten des Zaubers werden automatisch an Hand der Tabelle auf Seite 19 der <a href=\"http://dungeonslayers.net/download/Slay05.pdf\">5. Ausgabe der Slay!</a> berechnet.</p><p><strong>Achtung:</strong> Dieser Vorgang überschreibt die bestehenden Werte und kann nicht automatisch rückgängig gemacht werden.</p>",
"DS4.SpellMinimumLevel": "Zugangsstufe", "DS4.SpellMinimumLevel": "Zugangsstufe",
"DS4.SpellMinimumLevelDescription": "Die minimale Stufe, ab der ein Zauberwirker den Zauberspruch erlernen kann.", "DS4.SpellMinimumLevelDescription": "Die minimale Stufe, ab der ein Zauberwirker den Zauberspruch erlernen kann.",
"DS4.SpellCasterClassHealer": "Heiler", "DS4.SpellCasterClassHealer": "Heiler",
@ -173,11 +160,11 @@
"DS4.SpellCasterClassWizard": "Zauberer", "DS4.SpellCasterClassWizard": "Zauberer",
"DS4.SpellPrice": "Preis (Gold)", "DS4.SpellPrice": "Preis (Gold)",
"DS4.SpellPriceDescription": "Der Kaufpreis des Zauberspruchs.", "DS4.SpellPriceDescription": "Der Kaufpreis des Zauberspruchs.",
"DS4.EffectEnabled": "Eingeschaltet", "DS4.EffectEnabled": "Aktiv",
"DS4.EffectEnabledAbbr": "E", "DS4.EffectEnabledAbbr": "A",
"DS4.EffectActive": "Aktiv (unter Betrachtung, ob ein eventuelles Quellen-Item ausgerüstet ist usw.)", "DS4.EffectEffectivelyEnabled": "Effektiv Aktiv (unter Betrachtung, ob ein eventuelles Quellen-Item ausgerüstet ist usw.)",
"DS4.EffectActiveAbbr": "A", "DS4.EffectEffectivelyEnabledAbbr": "E",
"DS4.EffectName": "Name", "DS4.EffectLabel": "Bezeichnung",
"DS4.EffectSourceName": "Quelle", "DS4.EffectSourceName": "Quelle",
"DS4.EffectFactor": "Faktor (wie oft der Effekt angewendet wird)", "DS4.EffectFactor": "Faktor (wie oft der Effekt angewendet wird)",
"DS4.EffectFactorAbbr": "F", "DS4.EffectFactorAbbr": "F",
@ -206,6 +193,9 @@
"DS4.CombatValuesRangedAttack": "Schießen", "DS4.CombatValuesRangedAttack": "Schießen",
"DS4.CombatValuesSpellcasting": "Zaubern", "DS4.CombatValuesSpellcasting": "Zaubern",
"DS4.CombatValuesTargetedSpellcasting": "Zielzaubern", "DS4.CombatValuesTargetedSpellcasting": "Zielzaubern",
"DS4.CombatValuesMana": "Mana",
"DS4.CombatValuesManaCurrent": "Aktuelles Mana",
"DS4.CombatValuesManaCurrentAbbr": "MP",
"DS4.CombatValuesHitPointsSheet": "Lebenskraft", "DS4.CombatValuesHitPointsSheet": "Lebenskraft",
"DS4.CombatValuesDefenseSheet": "Abwehr", "DS4.CombatValuesDefenseSheet": "Abwehr",
"DS4.CombatValuesInitiativeSheet": "Initiative", "DS4.CombatValuesInitiativeSheet": "Initiative",
@ -214,6 +204,7 @@
"DS4.CombatValuesRangedAttackSheet": "Schießen", "DS4.CombatValuesRangedAttackSheet": "Schießen",
"DS4.CombatValuesSpellcastingSheet": "Zaubern", "DS4.CombatValuesSpellcastingSheet": "Zaubern",
"DS4.CombatValuesTargetedSpellcastingSheet": "Zielzaubern", "DS4.CombatValuesTargetedSpellcastingSheet": "Zielzaubern",
"DS4.CombatValuesManaSheet": "Mana",
"DS4.CharacterBaseInfoRace": "Volk", "DS4.CharacterBaseInfoRace": "Volk",
"DS4.CharacterBaseInfoClass": "Klasse", "DS4.CharacterBaseInfoClass": "Klasse",
"DS4.CharacterBaseInfoHeroClass": "Heldenklasse", "DS4.CharacterBaseInfoHeroClass": "Heldenklasse",
@ -232,6 +223,7 @@
"DS4.TalentRankMax": "Maximum", "DS4.TalentRankMax": "Maximum",
"DS4.TalentRankMod": "Zusätzlich", "DS4.TalentRankMod": "Zusätzlich",
"DS4.TalentRankTotal": "Gesamt", "DS4.TalentRankTotal": "Gesamt",
"DS4.TalentRankOf": "von",
"DS4.CharacterLanguageLanguages": "Sprachen", "DS4.CharacterLanguageLanguages": "Sprachen",
"DS4.CharacterLanguageAlphabets": "Schriftzeichen", "DS4.CharacterLanguageAlphabets": "Schriftzeichen",
"DS4.SpecialCreatureAbilityExperiencePoints": "Erfahrungspunkte", "DS4.SpecialCreatureAbilityExperiencePoints": "Erfahrungspunkte",
@ -267,6 +259,7 @@
"DS4.CreatureBaseInfoSizeCategory": "Größenkategorie", "DS4.CreatureBaseInfoSizeCategory": "Größenkategorie",
"DS4.CreatureBaseInfoExperiencePoints": "Erfahrungspunkte", "DS4.CreatureBaseInfoExperiencePoints": "Erfahrungspunkte",
"DS4.CreatureBaseInfoDescription": "Beschreibung", "DS4.CreatureBaseInfoDescription": "Beschreibung",
"DS4.WarningManageActiveEffectOnOwnedItem": "Das Verwalten von aktiven Effekten innerhalb eines besessen Items wird derzeit nicht unterstützt und wird in einem nachfolgenden Update hinzugefügt. Falls Sie eigentlich den auf den Aktor übertragenen Effekt verwalten wollen, können Sie dies im 'Effekte'-Tab des Aktorbogens tun.",
"DS4.WarningActorCannotOwnItem": "Der Aktor '{actorName}' vom Typ '{actorType}' kann das Item '{itemName}' vom Typ '{itemType}' nicht besitzen.", "DS4.WarningActorCannotOwnItem": "Der Aktor '{actorName}' vom Typ '{actorType}' kann das Item '{itemName}' vom Typ '{itemType}' nicht besitzen.",
"DS4.ErrorDiceCoupFumbleOverlap": "Es gibt eine Überlappung zwischen Patzern und Immersiegen.", "DS4.ErrorDiceCoupFumbleOverlap": "Es gibt eine Überlappung zwischen Patzern und Immersiegen.",
"DS4.ErrorSlayingDiceRecursionLimitExceeded": "Die maximale Rekursionstiefe für slayende Würfelwürfe wurde überschritten.", "DS4.ErrorSlayingDiceRecursionLimitExceeded": "Die maximale Rekursionstiefe für slayende Würfelwürfe wurde überschritten.",
@ -289,10 +282,9 @@
"DS4.WarningItemIsNotRollable": "Für das Item '{name}' ({id}) vom Typ '{type}' kann nicht gewürfelt werden.", "DS4.WarningItemIsNotRollable": "Für das Item '{name}' ({id}) vom Typ '{type}' kann nicht gewürfelt werden.",
"DS4.WarningMacrosCanOnlyBeCreatedForOwnedItems": "Makros können nur für besessene Items angelegt werden.", "DS4.WarningMacrosCanOnlyBeCreatedForOwnedItems": "Makros können nur für besessene Items angelegt werden.",
"DS4.WarningInvalidCheckDropped": "Eine ungültige Probe wurde auf die Hotbar gezogen.", "DS4.WarningInvalidCheckDropped": "Eine ungültige Probe wurde auf die Hotbar gezogen.",
"DS4.WarningSystemUpdateCompletedWithErrors": "Aktualisierung des DS4 Systems von Migrationsversion {currentVersion} auf {targetVersion} abgeschlossen, aber es sind Fehler aufgetreten. Bitte prüfen Sie in der Entwicklerkonsole, ob es sich um relevante Fehler handelt, oder ob sie ignoriert werden können. Insbesondere kann https://github.com/foundryvtt/foundryvtt/issues/9672 zu Fehlern führen, die ignoriert werden können.",
"DS4.InfoManuallyEnterSpellModifier": "Der korrekte Wert für den Zauberbonus '{spellModifier}' des Zaubers '{name}' muss manuell angegeben werden.", "DS4.InfoManuallyEnterSpellModifier": "Der korrekte Wert für den Zauberbonus '{spellModifier}' des Zaubers '{name}' muss manuell angegeben werden.",
"DS4.InfoSystemUpdateStart": "Aktualisiere DS4 System von Migrationsversion {currentVersion} auf {targetVersion}. Bitte haben Sie etwas Geduld, schließen Sie nicht das Spiel und fahren Sie nicht den Server herunter.", "DS4.InfoSystemUpdateStart": "Aktualisiere DS4 System von Migrationsversion {currentVersion} auf {targetVersion}. Bitte haben Sie etwas Geduld, schließen Sie nicht das Spiel und fahren Sie nicht den Server herunter.",
"DS4.InfoSystemUpdateCompletedSuccessfully": "Aktualisierung des DS4 Systems von Migrationsversion {currentVersion} auf {targetVersion} erfolgreich!", "DS4.InfoSystemUpdateCompleted": "Aktualisierung des DS4 Systems von Migrationsversion {currentVersion} auf {targetVersion} erfolgreich!",
"DS4.InfoCompendiumMigrationStart": "Aktualisiere Kompendium '{pack}' für DS4 von Migrationsversion {currentVersion} auf {targetVersion}. Bitte haben Sie etwas Geduld, schließen Sie nicht das Spiel und fahren Sie nicht den Server herunter.", "DS4.InfoCompendiumMigrationStart": "Aktualisiere Kompendium '{pack}' für DS4 von Migrationsversion {currentVersion} auf {targetVersion}. Bitte haben Sie etwas Geduld, schließen Sie nicht das Spiel und fahren Sie nicht den Server herunter.",
"DS4.InfoCompendiumMigrationCompleted": "Aktualisierung des Kompendiums '{pack}' für DS4 von Migrationsversion {currentVersion} auf {targetVersion} erfolgreich!", "DS4.InfoCompendiumMigrationCompleted": "Aktualisierung des Kompendiums '{pack}' für DS4 von Migrationsversion {currentVersion} auf {targetVersion} erfolgreich!",
"DS4.UnitRounds": "Runden", "DS4.UnitRounds": "Runden",
@ -314,31 +306,24 @@
"DS4.DialogRollOptionsDefaultTitle": "Proben-Optionen", "DS4.DialogRollOptionsDefaultTitle": "Proben-Optionen",
"DS4.ErrorUnexpectedHtmlType": "Typfehler: Erwartet wurde '{exType}', tatsächlich erhalten wurde '{realType}'.", "DS4.ErrorUnexpectedHtmlType": "Typfehler: Erwartet wurde '{exType}', tatsächlich erhalten wurde '{realType}'.",
"DS4.ErrorCouldNotFindForm": "Konnte HTML Element '{htmlElement}' nicht finden.", "DS4.ErrorCouldNotFindForm": "Konnte HTML Element '{htmlElement}' nicht finden.",
"DS4.ErrorActorDoesNotHaveItem": "Der Aktor '{actor}' hat kein Item mit der UUID '{uuid}'.", "DS4.ErrorActorDoesNotHaveItem": "Der Aktor '{actor}' hat kein Item mit der ID '{id}'.",
"DS4.ErrorUnexpectedError": "Es gab einen unerwarteten Fehler im Dungeonslayers 4 System. Für mehr Details schauen Sie bitte in die Konsole (F12).", "DS4.ErrorUnexpectedError": "Es gab einen unerwarteten Fehler im Dungeonslayers 4 System. Für mehr Details schauen Sie bitte in die Konsole (F12).",
"DS4.ErrorItemDoesNotHaveEffect": "Das Item '{item}' hat keinen Effekt mit der ID '{id}'.", "DS4.ErrorItemDoesNotHaveEffect": "Das Item '{item}' hat keinen Effekt mit der ID '{id}'.",
"DS4.ErrorActorDoesNotHaveEffect": "Der Aktor '{actor}' hat keinen Effekt mit der UUID '{uuid}'.", "DS4.ErrorActorDoesNotHaveEffect": "Der Aktor '{actor}' hat keinen Effekt mit der ID '{id}'.",
"DS4.DialogRollOptionsCheckTargetNumberLabel": "Probenwert", "DS4.DialogRollOptionsCheckTargetNumberLabel": "Probenwert",
"DS4.DialogRollOptionsCheckModifierLabel": "Modifikator", "DS4.DialogRollOptionsGMModifierLabel": "SL-Modifikator",
"DS4.DialogRollOptionsCheckModifierCustomLabel": "Individueller Modifikator",
"DS4.DialogRollOptionsMaximumCoupResultLabel": "Immersieg bis", "DS4.DialogRollOptionsMaximumCoupResultLabel": "Immersieg bis",
"DS4.DialogRollOptionsMinimumFumbleResultLabel": "Patzer ab", "DS4.DialogRollOptionsMinimumFumbleResultLabel": "Patzer ab",
"DS4.DialogRollOptionsRollModeLabel": "Sichtbarkeit", "DS4.DialogRollOptionsRollModeLabel": "Sichtbarkeit",
"DS4.CheckModifierRoutine": "Routine",
"DS4.CheckModifierVeryEasy": "Sehr Leicht",
"DS4.CheckModifierEasy": "Leicht",
"DS4.CheckModifierMormal": "Normal",
"DS4.CheckModifierDifficult": "Schwer",
"DS4.CheckModifierVeryDifficult": "Sehr Schwer",
"DS4.CheckModifierExtremelyDifficult": "Äußerst Schwer",
"DS4.CheckModifierCustom": "Individuell",
"DS4.TooltipBaseValue": "Basiswert", "DS4.TooltipBaseValue": "Basiswert",
"DS4.TooltipModifier": "Modifikator", "DS4.TooltipModifier": "Modifikator",
"DS4.TooltipEffects": "Effekte", "DS4.TooltipEffects": "Effekte",
"DS4.SettingUseSlayingDiceForAutomatedChecksName": "Slayende Würfel", "DS4.SettingUseSlayingDiceForAutomatedChecksName": "Slayende Würfel",
"DS4.SettingUseSlayingDiceForAutomatedChecksHint": "Benutze Slayende Würfel bei automatisierten Proben.", "DS4.SettingUseSlayingDiceForAutomatedChecksHint": "Verwende Slayende Würfel bei automatisierten Proben.",
"DS4.SettingShowSlayerPointsName": "Slayerpunkte", "DS4.SettingShowSlayerPointsName": "Slayerpunkte",
"DS4.SettingShowSlayerPointsHint": "Zeige Slayerpunkte im Charakterbogen an.", "DS4.SettingShowSlayerPointsHint": "Zeige Slayerpunkte im Charakterbogen an.",
"DS4.SettingUseManaSystemName": "Manasystem",
"DS4.SettingUseManaSystemHint": "Verwende das Manasystem für Zauber.",
"DS4.Checks": "Proben", "DS4.Checks": "Proben",
"DS4.ChecksAppraise": "Schätzen", "DS4.ChecksAppraise": "Schätzen",
"DS4.ChecksChangeSpell": "Zauber Wechseln", "DS4.ChecksChangeSpell": "Zauber Wechseln",
@ -382,10 +367,5 @@
"DS4.NewLanguageName": "Neue Sprache", "DS4.NewLanguageName": "Neue Sprache",
"DS4.NewAlphabetName": "Neue Schriftzeichen", "DS4.NewAlphabetName": "Neue Schriftzeichen",
"DS4.NewSpecialCreatureAbilityName": "Neue Besondere Kreaturenfähigkeit", "DS4.NewSpecialCreatureAbilityName": "Neue Besondere Kreaturenfähigkeit",
"DS4.NewEffectName": "Neuer Effekt", "DS4.NewEffectLabel": "Neuer Effekt"
"DS4.ActiveEffectApplyToItems": "Auf Items Anwenden",
"DS4.ActiveEffectItemName": "Itemname",
"DS4.ActiveEffectItemCondition": "Bedingung",
"DS4.TooltipNotEditableDueToEffects": "Feld nicht bearbeitbar, weil von Aktiven Effekten beeinflusst"
} }

View file

@ -28,8 +28,6 @@
"DS4.OpponentDefense": "Opponent Defense", "DS4.OpponentDefense": "Opponent Defense",
"DS4.OpponentDefenseAbbr": "OD", "DS4.OpponentDefenseAbbr": "OD",
"DS4.SortByOpponentDefense": "Sort by Opponent Defense", "DS4.SortByOpponentDefense": "Sort by Opponent Defense",
"DS4.OpponentDefenseMelee": "Opponent Defense for melee attacks",
"DS4.OpponentDefenseRanged": "Opponent Defense for ranged attacks",
"DS4.AttackTypeMelee": "Melee", "DS4.AttackTypeMelee": "Melee",
"DS4.AttackTypeRanged": "Ranged", "DS4.AttackTypeRanged": "Ranged",
"DS4.AttackTypeMeleeRanged": "Melee / Ranged", "DS4.AttackTypeMeleeRanged": "Melee / Ranged",
@ -76,9 +74,7 @@
"DS4.ItemTypeSpecialCreatureAbility": "Special Creature Ability", "DS4.ItemTypeSpecialCreatureAbility": "Special Creature Ability",
"DS4.ItemTypeSpecialCreatureAbilityPlural": "Special Creature Abilities", "DS4.ItemTypeSpecialCreatureAbilityPlural": "Special Creature Abilities",
"DS4.ItemWeaponCheckFlavor": "{actor} attacks with {weapon}.", "DS4.ItemWeaponCheckFlavor": "{actor} attacks with {weapon}.",
"DS4.ItemWeaponCheckFlavorWithOpponentDefense": "{actor} attacks with {weapon}<br>Opponent defense: {opponentDefense}",
"DS4.ItemSpellCheckFlavor": "{actor} casts {spell}.", "DS4.ItemSpellCheckFlavor": "{actor} casts {spell}.",
"DS4.ItemSpellCheckFlavorWithOpponentDefense": "{actor} casts {spell}.<br>Opponent Defense: {opponentDefense}",
"DS4.ItemPropertiesArmor": "Armor Properties", "DS4.ItemPropertiesArmor": "Armor Properties",
"DS4.ItemPropertiesEquipable": "Equipment Properties", "DS4.ItemPropertiesEquipable": "Equipment Properties",
"DS4.ItemPropertiesPhysical": "Physical Properties", "DS4.ItemPropertiesPhysical": "Physical Properties",
@ -122,31 +118,20 @@
"DS4.SortBySpellType": "Sort by Spell Type", "DS4.SortBySpellType": "Sort by Spell Type",
"DS4.SpellTypeSpellcasting": "Spellcasting", "DS4.SpellTypeSpellcasting": "Spellcasting",
"DS4.SpellTypeTargetedSpellcasting": "Targeted Spellcasting", "DS4.SpellTypeTargetedSpellcasting": "Targeted Spellcasting",
"DS4.SpellGroups": "Spell Groups", "DS4.SpellCategory": "Category",
"DS4.SpellGroupsDescription": "Spell groups which the spell belongs to.", "DS4.SpellCategoryDescription": "A category which the spell belongs to.",
"DS4.SpellGroupLightning": "Lightning", "DS4.SpellCategoryHealing": "Healing",
"DS4.SpellGroupEarth": "Earth, Rock, Stone", "DS4.SpellCategoryFire": "Fire",
"DS4.SpellGroupWater": "Water", "DS4.SpellCategoryIce": "Ice",
"DS4.SpellGroupIce": "Ice, Frost", "DS4.SpellCategoryLight": "Light",
"DS4.SpellGroupFire": "Fire", "DS4.SpellCategoryDarkness": "Darkness",
"DS4.SpellGroupHealing": "Healing", "DS4.SpellCategoryMindAffecting": "Mind Affecting",
"DS4.SpellGroupLight": "Light", "DS4.SpellCategoryElectricity": "Electricity",
"DS4.SpellGroupAir": "Air", "DS4.SpellCategoryNone": "None",
"DS4.SpellGroupTransport": "Transport", "DS4.SpellCategoryUnset": "Unset",
"DS4.SpellGroupDamage": "Damage",
"DS4.SpellGroupShadow": "Shadow",
"DS4.SpellGroupProtection": "Protection",
"DS4.SpellGroupMindAffecting": "Mind Affecting",
"DS4.SpellGroupDemonology": "Demonologie",
"DS4.SpellGroupNecromancy": "Necromancy",
"DS4.SpellGroupTransmutation": "Transmutation",
"DS4.SpellGroupArea": "Area",
"DS4.SpellModifier": "Spell Modifier", "DS4.SpellModifier": "Spell Modifier",
"DS4.SpellModifierNumerical": "Spell Modifier (numerical)",
"DS4.SpellModifierComplex": "Spell Modifier (complex)",
"DS4.SpellModifierAbbr": "SM", "DS4.SpellModifierAbbr": "SM",
"DS4.SpellModifierNumericalDescription": "The numerical spell modifier for the corresponding check.", "DS4.SpellModifierDescription": "The spell modifier for the corresponding check.",
"DS4.SpellModifierComplexDescription": "A complex spell modifier for the corresponding check (for example, dependent on the targets values). If given, the numerical spell bonus is ignored.",
"DS4.SortBySpellModifier": "Sort by Spell Modifier", "DS4.SortBySpellModifier": "Sort by Spell Modifier",
"DS4.SpellDistance": "Distance", "DS4.SpellDistance": "Distance",
"DS4.SpellDistanceDescription": "The maximum distance to the target, “Self” meaning that only the caster can be the target of this spell.", "DS4.SpellDistanceDescription": "The maximum distance to the target, “Self” meaning that only the caster can be the target of this spell.",
@ -164,8 +149,10 @@
"DS4.CooldownDuration100R": "100 Rounds", "DS4.CooldownDuration100R": "100 Rounds",
"DS4.CooldownDuration1D": "1 Day", "DS4.CooldownDuration1D": "1 Day",
"DS4.CooldownDurationD20D": "D20 Days", "DS4.CooldownDurationD20D": "D20 Days",
"DS4.SpellAllowsDefense": "Allows Defense", "DS4.ManaCost": "Mana Cost",
"DS4.SpellAllowsDefenseDescription": "Is it alowed to perform a defense check against this spell?", "DS4.ManaCostDescription": "The amount of mana points casting the spell costs.",
"DS4.CalculateManaCost": "Automatically Calculate Mana Cost",
"DS4.CalculateManaCostConfirmationQuestion": "<p>The mana cost of the spell is automatically calculated using the table on page 19 of the <a href=\"http://dungeonslayers.net/download/Slay05.pdf\">5th edition of the Slay!</a>.</p><p><strong>Warning:</strong> This process overwrites the existing values and connot be reverted automatically.</p>",
"DS4.SpellMinimumLevel": "Minimum Level", "DS4.SpellMinimumLevel": "Minimum Level",
"DS4.SpellMinimumLevelDescription": "The minimum level at which a spell caster may learn the spell.", "DS4.SpellMinimumLevelDescription": "The minimum level at which a spell caster may learn the spell.",
"DS4.SpellCasterClassHealer": "Healer", "DS4.SpellCasterClassHealer": "Healer",
@ -175,9 +162,9 @@
"DS4.SpellPriceDescription": "The price to purchase the spell.", "DS4.SpellPriceDescription": "The price to purchase the spell.",
"DS4.EffectEnabled": "Enabled", "DS4.EffectEnabled": "Enabled",
"DS4.EffectEnabledAbbr": "E", "DS4.EffectEnabledAbbr": "E",
"DS4.EffectActive": "Active (taking into account whether a potential source item is equipped etc.)", "DS4.EffectEffectivelyEnabled": "Effectively Enabled (taking into account whether a potential source item is equipped etc.)",
"DS4.EffectActiveAbbr": "A", "DS4.EffectEffectivelyEnabledAbbr": "EE",
"DS4.EffectName": "Name", "DS4.EffectLabel": "Label",
"DS4.EffectSourceName": "Source", "DS4.EffectSourceName": "Source",
"DS4.EffectFactor": "Factor (the number of times the effect is being applied)", "DS4.EffectFactor": "Factor (the number of times the effect is being applied)",
"DS4.EffectFactorAbbr": "F", "DS4.EffectFactorAbbr": "F",
@ -206,6 +193,9 @@
"DS4.CombatValuesRangedAttack": "Ranged Attack", "DS4.CombatValuesRangedAttack": "Ranged Attack",
"DS4.CombatValuesSpellcasting": "Spellcasting", "DS4.CombatValuesSpellcasting": "Spellcasting",
"DS4.CombatValuesTargetedSpellcasting": "Targeted Spellcasting", "DS4.CombatValuesTargetedSpellcasting": "Targeted Spellcasting",
"DS4.CombatValuesMana": "Mana",
"DS4.CombatValuesManaCurrent": "Current Mana",
"DS4.CombatValuesManaCurrentAbbr": "MP",
"DS4.CombatValuesHitPointsSheet": "Hit Points", "DS4.CombatValuesHitPointsSheet": "Hit Points",
"DS4.CombatValuesDefenseSheet": "Defense", "DS4.CombatValuesDefenseSheet": "Defense",
"DS4.CombatValuesInitiativeSheet": "Initiative", "DS4.CombatValuesInitiativeSheet": "Initiative",
@ -214,6 +204,7 @@
"DS4.CombatValuesRangedAttackSheet": "RAT", "DS4.CombatValuesRangedAttackSheet": "RAT",
"DS4.CombatValuesSpellcastingSheet": "Spellcasting", "DS4.CombatValuesSpellcastingSheet": "Spellcasting",
"DS4.CombatValuesTargetedSpellcastingSheet": "TSC", "DS4.CombatValuesTargetedSpellcastingSheet": "TSC",
"DS4.CombatValuesManaSheet": "Mana",
"DS4.CharacterBaseInfoRace": "Race", "DS4.CharacterBaseInfoRace": "Race",
"DS4.CharacterBaseInfoClass": "Class", "DS4.CharacterBaseInfoClass": "Class",
"DS4.CharacterBaseInfoHeroClass": "Hero Class", "DS4.CharacterBaseInfoHeroClass": "Hero Class",
@ -232,6 +223,7 @@
"DS4.TalentRankMax": "Maximum", "DS4.TalentRankMax": "Maximum",
"DS4.TalentRankMod": "Additional", "DS4.TalentRankMod": "Additional",
"DS4.TalentRankTotal": "Total", "DS4.TalentRankTotal": "Total",
"DS4.TalentRankOf": "of",
"DS4.CharacterLanguageLanguages": "Languages", "DS4.CharacterLanguageLanguages": "Languages",
"DS4.CharacterLanguageAlphabets": "Alphabets", "DS4.CharacterLanguageAlphabets": "Alphabets",
"DS4.SpecialCreatureAbilityExperiencePoints": "Experience Points", "DS4.SpecialCreatureAbilityExperiencePoints": "Experience Points",
@ -267,6 +259,7 @@
"DS4.CreatureBaseInfoSizeCategory": "Size Category", "DS4.CreatureBaseInfoSizeCategory": "Size Category",
"DS4.CreatureBaseInfoExperiencePoints": "Experience Points", "DS4.CreatureBaseInfoExperiencePoints": "Experience Points",
"DS4.CreatureBaseInfoDescription": "Description", "DS4.CreatureBaseInfoDescription": "Description",
"DS4.WarningManageActiveEffectOnOwnedItem": "Managing Active Effects within an Owned Item is not currently supported and will be added in a subsequent update. If you actually want to manage the effect that has been transferred to the actor, you can do so in the 'Effects' tab in the actor sheet.",
"DS4.WarningActorCannotOwnItem": "The actor '{actorName}' of type '{actorType}' cannot own the item '{itemName}' of type '{itemType}'.", "DS4.WarningActorCannotOwnItem": "The actor '{actorName}' of type '{actorType}' cannot own the item '{itemName}' of type '{itemType}'.",
"DS4.ErrorDiceCoupFumbleOverlap": "There is an overlap between Fumbles and Coups.", "DS4.ErrorDiceCoupFumbleOverlap": "There is an overlap between Fumbles and Coups.",
"DS4.ErrorSlayingDiceRecursionLimitExceeded": "Maximum recursion depth for slaying dice roll exceeded.", "DS4.ErrorSlayingDiceRecursionLimitExceeded": "Maximum recursion depth for slaying dice roll exceeded.",
@ -289,10 +282,9 @@
"DS4.WarningItemIsNotRollable": "Item '{name}' ({id}) of type '{type}' is not rollable.", "DS4.WarningItemIsNotRollable": "Item '{name}' ({id}) of type '{type}' is not rollable.",
"DS4.WarningMacrosCanOnlyBeCreatedForOwnedItems": "Macros can only be created for owned items.", "DS4.WarningMacrosCanOnlyBeCreatedForOwnedItems": "Macros can only be created for owned items.",
"DS4.WarningInvalidCheckDropped": "An invalid check was dropped on the Hotbar.", "DS4.WarningInvalidCheckDropped": "An invalid check was dropped on the Hotbar.",
"DS4.WarningSystemUpdateCompletedWithErrors": "Migration of DS4 system from migration version {currentVersion} to {targetVersion} completed with errors. Please check the development console (F12) to see whether the errors have significant impact or can be ignored. In particular, https://github.com/foundryvtt/foundryvtt/issues/9672 may cause issues that simply can be ignored.",
"DS4.InfoManuallyEnterSpellModifier": "The correct value of the spell modifier '{spellModifier}' of the spell '{name}' needs to be entered by manually.", "DS4.InfoManuallyEnterSpellModifier": "The correct value of the spell modifier '{spellModifier}' of the spell '{name}' needs to be entered by manually.",
"DS4.InfoSystemUpdateStart": "Migrating DS4 system from migration version {currentVersion} to {targetVersion}. Please be patient and do not close your game or shut down your server.", "DS4.InfoSystemUpdateStart": "Migrating DS4 system from migration version {currentVersion} to {targetVersion}. Please be patient and do not close your game or shut down your server.",
"DS4.InfoSystemUpdateCompletedSuccessfully": "Migration of DS4 system from migration version {currentVersion} to {targetVersion} successful!", "DS4.InfoSystemUpdateCompleted": "Migration of DS4 system from migration version {currentVersion} to {targetVersion} successful!",
"DS4.InfoCompendiumMigrationStart": "Migrating compendium '{pack}' for DS4 from migration version {currentVersion} to {targetVersion}. Please be patient and do not close your game or shut down your server.", "DS4.InfoCompendiumMigrationStart": "Migrating compendium '{pack}' for DS4 from migration version {currentVersion} to {targetVersion}. Please be patient and do not close your game or shut down your server.",
"DS4.InfoCompendiumMigrationCompleted": "Migration of compendium '{pack}' for DS4 from migration version {currentVersion} to {targetVersion} successful!", "DS4.InfoCompendiumMigrationCompleted": "Migration of compendium '{pack}' for DS4 from migration version {currentVersion} to {targetVersion} successful!",
"DS4.UnitRounds": "Rounds", "DS4.UnitRounds": "Rounds",
@ -314,24 +306,15 @@
"DS4.DialogRollOptionsDefaultTitle": "Roll Options", "DS4.DialogRollOptionsDefaultTitle": "Roll Options",
"DS4.ErrorUnexpectedHtmlType": "Type Error: Expected '{exType}' but got '{realType}'.", "DS4.ErrorUnexpectedHtmlType": "Type Error: Expected '{exType}' but got '{realType}'.",
"DS4.ErrorCouldNotFindForm": "Could not find HTML element '{htmlElement}'.", "DS4.ErrorCouldNotFindForm": "Could not find HTML element '{htmlElement}'.",
"DS4.ErrorActorDoesNotHaveItem": "The actor '{actor}' does not have any item with the UUID '{uuid}'.", "DS4.ErrorActorDoesNotHaveItem": "The actor '{actor}' does not have any item with the id '{id}'.",
"DS4.ErrorUnexpectedError": "There was an unexpected error in the Dungeonslayers 4 system. For more details, please take a look at the console (F12).", "DS4.ErrorUnexpectedError": "There was an unexpected error in the Dungeonslayers 4 system. For more details, please take a look at the console (F12).",
"DS4.ErrorItemDoesNotHaveEffect": "The item '{item}' does not have any effect with the ID '{id}'.", "DS4.ErrorItemDoesNotHaveEffect": "The item '{item}' does not have any effect with the id '{id}'.",
"DS4.ErrorActorDoesNotHaveEffect": "The actor '{actor}' does not have any effect with the UUID '{uuid}'.", "DS4.ErrorActorDoesNotHaveEffect": "The actor '{actor}' does not have any effect with the id '{id}'.",
"DS4.DialogRollOptionsCheckTargetNumberLabel": "Check Target Number", "DS4.DialogRollOptionsCheckTargetNumberLabel": "Check Target Number",
"DS4.DialogRollOptionsCheckModifierLabel": "Modifier", "DS4.DialogRollOptionsGMModifierLabel": "Game Master Modifier",
"DS4.DialogRollOptionsCheckModifierCustomLabel": "Custom Modifier",
"DS4.DialogRollOptionsMaximumCoupResultLabel": "Coup to", "DS4.DialogRollOptionsMaximumCoupResultLabel": "Coup to",
"DS4.DialogRollOptionsMinimumFumbleResultLabel": "Fumble from", "DS4.DialogRollOptionsMinimumFumbleResultLabel": "Fumble from",
"DS4.DialogRollOptionsRollModeLabel": "Visibility", "DS4.DialogRollOptionsRollModeLabel": "Visibility",
"DS4.CheckModifierRoutine": "Routine",
"DS4.CheckModifierVeryEasy": "Very Easy",
"DS4.CheckModifierEasy": "Easy",
"DS4.CheckModifierMormal": "Normal",
"DS4.CheckModifierDifficult": "Difficult",
"DS4.CheckModifierVeryDifficult": "Very Difficult",
"DS4.CheckModifierExtremelyDifficult": "Extremely Difficult",
"DS4.CheckModifierCustom": "Custom",
"DS4.TooltipBaseValue": "Base Value", "DS4.TooltipBaseValue": "Base Value",
"DS4.TooltipModifier": "Modifier", "DS4.TooltipModifier": "Modifier",
"DS4.TooltipEffects": "Effects", "DS4.TooltipEffects": "Effects",
@ -339,6 +322,8 @@
"DS4.SettingUseSlayingDiceForAutomatedChecksHint": "Use Slaying Dice for automated checks.", "DS4.SettingUseSlayingDiceForAutomatedChecksHint": "Use Slaying Dice for automated checks.",
"DS4.SettingShowSlayerPointsName": "Slayer Points", "DS4.SettingShowSlayerPointsName": "Slayer Points",
"DS4.SettingShowSlayerPointsHint": "Show Slayer Points in the character sheet.", "DS4.SettingShowSlayerPointsHint": "Show Slayer Points in the character sheet.",
"DS4.SettingUseManaSystemName": "Mana System",
"DS4.SettingUseManaSystemHint": "Use the Mana System for spells.",
"DS4.Checks": "Checks", "DS4.Checks": "Checks",
"DS4.ChecksAppraise": "Appraise", "DS4.ChecksAppraise": "Appraise",
"DS4.ChecksChangeSpell": "Change Spell", "DS4.ChecksChangeSpell": "Change Spell",
@ -382,10 +367,5 @@
"DS4.NewLanguageName": "New Language", "DS4.NewLanguageName": "New Language",
"DS4.NewAlphabetName": "New Alphabet", "DS4.NewAlphabetName": "New Alphabet",
"DS4.NewSpecialCreatureAbilityName": "New Special Creature Ability", "DS4.NewSpecialCreatureAbilityName": "New Special Creature Ability",
"DS4.NewEffectName": "New Effect", "DS4.NewEffectLabel": "New Effect"
"DS4.ActiveEffectApplyToItems": "Apply to Items",
"DS4.ActiveEffectItemName": "Item Name",
"DS4.ActiveEffectItemCondition": "Condition",
"DS4.TooltipNotEditableDueToEffects": "field not editable, because affected by Active Effects"
} }

View file

@ -2,7 +2,7 @@
"private": true, "private": true,
"name": "dungeonslayers4", "name": "dungeonslayers4",
"description": "An implementation of the Dungeonslayers 4 game system for Foundry Virtual Tabletop.", "description": "An implementation of the Dungeonslayers 4 game system for Foundry Virtual Tabletop.",
"version": "1.21.1", "version": "1.12.6",
"license": "https://git.f3l.de/dungeonslayers/ds4#licensing", "license": "https://git.f3l.de/dungeonslayers/ds4#licensing",
"homepage": "https://git.f3l.de/dungeonslayers/ds4", "homepage": "https://git.f3l.de/dungeonslayers/ds4",
"repository": { "repository": {
@ -10,7 +10,7 @@
"url": "https://git.f3l.de/dungeonslayers/ds4" "url": "https://git.f3l.de/dungeonslayers/ds4"
}, },
"bugs": { "bugs": {
"url": "https://git.f3l.de/dungeonslayers/ds4/issues" "url": "https://git.f3l.de/dungeonslayers/ds4/-/issues"
}, },
"contributors": [ "contributors": [
{ {
@ -39,59 +39,61 @@
"type": "module", "type": "module",
"scripts": { "scripts": {
"build": "run-s clean:files build:files", "build": "run-s clean:files build:files",
"build:files": "run-p build:rollup build:packs", "build:files": "rollup -c",
"build:rollup": "rollup -c",
"build:packs": "./tools/packs.sh pack",
"watch": "rollup -c -w", "watch": "rollup -c -w",
"link-package": "node ./tools/link-package.js", "link-package": "node ./tools/link-package.js",
"clean": "run-p clean:files clean:link", "clean": "run-p clean:files clean:link",
"clean:files": "rimraf dist", "clean:files": "rimraf dist",
"clean:link": "node ./tools/link-package.js --clean", "clean:link": "node ./tools/link-package.js --clean",
"lint": "pnpm eslint", "lint": "eslint --ext .ts,.js,.cjs,.mjs .",
"lint:fix": "pnpm eslint --fix", "lint:fix": "eslint --ext .ts,.js,.cjs,.mjs --fix .",
"eslint": "eslint --ext .ts,.js,.cjs,.mjs .", "test": "jest",
"format": "pnpm prettier --write", "test:watch": "jest --watch",
"format:check": "pnpm prettier --check", "test:ci": "jest --ci --reporters=default --reporters=jest-junit",
"prettier": "prettier './**/*.(ts|js|cjs|mjs|json|scss|yml|yaml)'", "format": "prettier --write \"./**/*.(ts|js|cjs|mjs|json|scss|yml)\"",
"test": "run-p test:vitest test:typecheck",
"test:vitest": "vitest run",
"test:typecheck": "tsc --noEmit --project spec/tsconfig.json",
"test:watch": "vitest",
"typecheck": "tsc --noEmit", "typecheck": "tsc --noEmit",
"typecheck:watch": "tsc --noEmit --watch",
"bump-version": "node ./tools/bump-version.js", "bump-version": "node ./tools/bump-version.js",
"convert-packs-to-json": "node ./tools/convert-packs-to-json.js",
"postinstall": "husky install",
"changelog": "conventional-changelog -p conventionalcommits -o CHANGELOG.md -r 2" "changelog": "conventional-changelog -p conventionalcommits -o CHANGELOG.md -r 2"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "19.5.0", "@commitlint/cli": "16.2.1",
"@commitlint/config-conventional": "19.5.0", "@commitlint/config-conventional": "16.2.1",
"@foundryvtt/foundryvtt-cli": "0.0.9", "@guanghechen/rollup-plugin-copy": "1.8.6",
"@guanghechen/rollup-plugin-copy": "6.0.2", "@league-of-foundry-developers/foundry-vtt-types": "9.249.4",
"@ironkinoko/rollup-plugin-styles": "4.0.3", "@rollup/plugin-typescript": "8.3.0",
"@swc/core": "1.7.39", "@seald-io/nedb": "2.2.1",
"@types/fs-extra": "11.0.4", "@types/fs-extra": "9.0.13",
"@types/jquery": "3.5.31", "@types/jest": "27.4.0",
"@types/node": "18.19.3", "@typescript-eslint/eslint-plugin": "5.12.0",
"@typescript-eslint/eslint-plugin": "7.18.0", "@typescript-eslint/parser": "5.12.0",
"@typescript-eslint/parser": "7.18.0", "conventional-changelog-cli": "2.2.2",
"conventional-changelog-cli": "5.0.0", "conventional-changelog-conventionalcommits": "4.6.3",
"conventional-changelog-conventionalcommits": "8.0.0", "eslint": "8.9.0",
"eslint": "8.57.1", "eslint-config-prettier": "8.3.0",
"eslint-config-prettier": "9.1.0", "eslint-plugin-jest": "26.1.1",
"fs-extra": "11.2.0", "eslint-plugin-prettier": "4.0.0",
"handlebars": "4.7.8", "fs-extra": "10.0.0",
"husky": "7.0.4",
"jest": "27.5.1",
"jest-junit": "13.0.0",
"lint-staged": "12.3.4",
"npm-run-all": "4.1.5", "npm-run-all": "4.1.5",
"prettier": "3.3.3", "prettier": "2.5.1",
"rimraf": "6.0.1", "rimraf": "3.0.2",
"rollup": "4.24.0", "rollup": "2.67.2",
"rollup-plugin-swc3": "0.12.1", "rollup-plugin-styles": "4.0.0",
"sass": "1.80.3", "rollup-plugin-terser": "7.0.2",
"semver": "7.6.3", "sass": "1.49.7",
"tslib": "2.8.0", "semver": "7.3.5",
"typescript": "5.5.4", "ts-jest": "27.1.3",
"vite": "4.5.5", "tslib": "2.3.1",
"vitest": "0.34.6", "typescript": "4.4.4",
"yargs": "17.7.2" "yargs": "17.3.1"
}, },
"packageManager": "pnpm@9.12.2" "lint-staged": {
"*.(ts|js|cjs|mjs)": "eslint --cache --fix",
"*.(json|scss|yml)": "prettier --write"
}
} }

32355
packs/creatures.json Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,4 @@
SPDX-FileCopyrightText: 2021 Sascha Martens
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-License-Identifier: CC-BY-NC-SA-4.0

View file

@ -1,166 +0,0 @@
{
"_id": "HjpxMlpyjPr3hd3r",
"name": "Adler",
"type": "creature",
"img": "systems/ds4/assets/tokens/devin-night/eagle.png",
"items": ["9vJL3lyC4RTQCZ7e", "zYQAanmjVsNytqBl", "ysyoJA3dYTu4XXvt", "k9Ng7RdfvSRN5JVW", "zUXT2ZkY12TAu5CU"],
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"system": {
"attributes": {
"body": {
"base": 3,
"mod": 0
},
"mobility": {
"base": 8,
"mod": 0
},
"mind": {
"base": 1,
"mod": 0
}
},
"traits": {
"strength": {
"base": 1,
"mod": 0
},
"constitution": {
"base": 0,
"mod": 0
},
"agility": {
"base": 3,
"mod": 0
},
"dexterity": {
"base": 1,
"mod": 0
},
"intellect": {
"base": 0,
"mod": 0
},
"aura": {
"base": 1,
"mod": 0
}
},
"combatValues": {
"hitPoints": {
"mod": -6,
"value": 7
},
"defense": {
"mod": 0
},
"initiative": {
"mod": 0
},
"movement": {
"mod": 0
},
"meleeAttack": {
"mod": 0
},
"rangedAttack": {
"mod": 0
},
"spellcasting": {
"mod": 0
},
"targetedSpellcasting": {
"mod": 0
}
},
"baseInfo": {
"loot": "Trophäe (BW 1A:11)",
"foeFactor": 1,
"creatureType": "animal",
"sizeCategory": "small",
"experiencePoints": 52,
"description": ""
}
},
"ownership": {
"default": 0
},
"prototypeToken": {
"flags": {},
"name": "Adler",
"displayName": 20,
"width": 1,
"height": 1,
"lockRotation": false,
"rotation": 0,
"actorLink": false,
"disposition": -1,
"displayBars": 40,
"bar1": {
"attribute": "combatValues.hitPoints"
},
"bar2": {
"attribute": null
},
"randomImg": false,
"alpha": 1,
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"speed": 5,
"intensity": 5,
"reverse": false,
"type": null
},
"darkness": {
"min": 0,
"max": 1
},
"attenuation": 0.5,
"color": null
},
"texture": {
"src": "systems/ds4/assets/tokens/devin-night/eagle.png",
"scaleX": 0.7,
"scaleY": 0.7,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"tint": null
},
"sight": {
"angle": 360,
"enabled": false,
"range": 0,
"brightness": 1,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"appendNumber": false,
"prependAdjective": false
},
"_stats": {
"systemId": "ds4",
"systemVersion": "1.19.4",
"coreVersion": "11.305",
"createdTime": 1668995346489,
"modifiedTime": 1688934880952,
"lastModifiedBy": "DS4BuildSystem00"
},
"_key": "!actors!HjpxMlpyjPr3hd3r"
}

View file

@ -1,166 +0,0 @@
{
"_id": "ttzlBKtMWz981WF3",
"name": "Alligator",
"type": "creature",
"img": "systems/ds4/assets/tokens/devin-night/alligator-green.png",
"items": ["Z4ZEuB2l0vo2dJcK", "ACGvtQk97Udg1rih", "Buv9Nzqx0hpPPsew", "ree4HN3j8tv7b18k", "8Aq23UcNNFecGbk9"],
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"system": {
"attributes": {
"body": {
"base": 12,
"mod": 0
},
"mobility": {
"base": 10,
"mod": 0
},
"mind": {
"base": 1,
"mod": 0
}
},
"traits": {
"strength": {
"base": 2,
"mod": 0
},
"constitution": {
"base": 4,
"mod": 0
},
"agility": {
"base": 5,
"mod": 0
},
"dexterity": {
"base": 0,
"mod": 0
},
"intellect": {
"base": 0,
"mod": 0
},
"aura": {
"base": 0,
"mod": 0
}
},
"combatValues": {
"hitPoints": {
"mod": 52,
"value": 78
},
"defense": {
"mod": 0
},
"initiative": {
"mod": 0
},
"movement": {
"mod": 3
},
"meleeAttack": {
"mod": 0
},
"rangedAttack": {
"mod": 0
},
"spellcasting": {
"mod": 0
},
"targetedSpellcasting": {
"mod": 0
}
},
"baseInfo": {
"loot": "Trophäe (BW 1A:14)",
"foeFactor": 10,
"creatureType": "animal",
"sizeCategory": "large",
"experiencePoints": 151,
"description": ""
}
},
"ownership": {
"default": 0
},
"prototypeToken": {
"flags": {},
"name": "Alligator",
"displayName": 20,
"width": 2,
"height": 2,
"lockRotation": false,
"rotation": 0,
"actorLink": false,
"disposition": -1,
"displayBars": 40,
"bar1": {
"attribute": "combatValues.hitPoints"
},
"bar2": {
"attribute": null
},
"randomImg": true,
"alpha": 1,
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"speed": 5,
"intensity": 5,
"reverse": false,
"type": null
},
"darkness": {
"min": 0,
"max": 1
},
"attenuation": 0.5,
"color": null
},
"texture": {
"src": "systems/ds4/assets/tokens/devin-night/alligator*.png",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"tint": null
},
"sight": {
"angle": 360,
"enabled": false,
"range": 0,
"brightness": 1,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"appendNumber": false,
"prependAdjective": false
},
"_stats": {
"systemId": "ds4",
"systemVersion": "1.19.4",
"coreVersion": "11.305",
"createdTime": 1668995347112,
"modifiedTime": 1688934881499,
"lastModifiedBy": "DS4BuildSystem00"
},
"_key": "!actors!ttzlBKtMWz981WF3"
}

View file

@ -1,30 +0,0 @@
{
"_id": "U6mQ5sQwMjdLgUww",
"name": "Alterung (1 Jahr pro Schadenspunkt)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.mVs6A48mWnfV9hcL"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/aging.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Bei einem Treffer altert das Ziel pro erlittenen Schadenspunkt um 1 Jahr.</p>",
"experiencePoints": -1
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!6KmAeL9lVxWXIeU6.U6mQ5sQwMjdLgUww"
}

View file

@ -1,30 +0,0 @@
{
"_id": "U95WXWQaKfIPiJZK",
"name": "Alterung (1 Jahr pro Schadenspunkt)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.mVs6A48mWnfV9hcL"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/aging.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Bei einem Treffer altert das Ziel pro erlittenen Schadenspunkt um 1 Jahr.</p>",
"experiencePoints": -1
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!cE5kI3uqXWQrCaI5.U95WXWQaKfIPiJZK"
}

View file

@ -1,30 +0,0 @@
{
"_id": "gfZuHfJiCyZUskwn",
"name": "Alterung (1 Jahr pro Treffer)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.e9F812racwKeZPgR"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/aging.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Bei einem Treffer altert das Ziel um 1 Jahr.</p>",
"experiencePoints": 1
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!T9YRYe0vnR4Qg4UM.gfZuHfJiCyZUskwn"
}

View file

@ -1,30 +0,0 @@
{
"_id": "wqzMhcBGP8qbClRW",
"name": "Anfällig (Erde)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.mAWyVCfTFH6JiEIu"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/susceptible.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Erh&auml;lt doppelten Schaden durch Erd-, Fels- und Steinangriffe.</p>",
"experiencePoints": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!wYVw1a5UjPS09YxS.wqzMhcBGP8qbClRW"
}

View file

@ -1,30 +0,0 @@
{
"_id": "Kf2kAdMidDaK1SVD",
"name": "Anfällig (Feuer)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.XhAfEVVoSADC880C"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/susceptible.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Erh&auml;lt doppelten Schaden durch Feuerangriffe.</p>",
"experiencePoints": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!P3mlpN2JrbnDtLwJ.Kf2kAdMidDaK1SVD"
}

View file

@ -1,30 +0,0 @@
{
"_id": "NKUKD1KfNTpKZygj",
"name": "Anfällig (Feuer)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.XhAfEVVoSADC880C"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/susceptible.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Erh&auml;lt doppelten Schaden durch Feuerangriffe.</p>",
"experiencePoints": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!dlrDPQ3is4NkzZJB.NKUKD1KfNTpKZygj"
}

View file

@ -1,30 +0,0 @@
{
"_id": "X9jyAzrnyxuikyg3",
"name": "Anfällig (Feuer)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.XhAfEVVoSADC880C"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/susceptible.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Erh&auml;lt doppelten Schaden durch Feuerangriffe.</p>",
"experiencePoints": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!WboyONCY2UZildi9.X9jyAzrnyxuikyg3"
}

View file

@ -1,30 +0,0 @@
{
"_id": "XBYL6p6Lh2di3cL0",
"name": "Anfällig (Licht)",
"type": "specialCreatureAbility",
"sort": 400000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.aOsmsf7jIK7hU9U8"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/susceptible.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Erh&auml;lt doppelten Schaden durch Lichtangriffe.</p>",
"experiencePoints": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!EItxqEiDUOmJdy4n.XBYL6p6Lh2di3cL0"
}

View file

@ -1,30 +0,0 @@
{
"_id": "23wk4FP7dNTkLgB5",
"name": "Anfällig (Luft)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.ImVvi7XqDvf6D2vY"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/susceptible.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Erh&auml;lt doppelten Schaden durch Blitz-, Sturm- und Windangriffe.</p>",
"experiencePoints": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!mOQ21HFNisTfu7ve.23wk4FP7dNTkLgB5"
}

View file

@ -1,30 +0,0 @@
{
"_id": "ur7rgX6JTOwscpm5",
"name": "Anfällig (Luft)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.ImVvi7XqDvf6D2vY"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/susceptible.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Erh&auml;lt doppelten Schaden durch Blitz-, Sturm- und Windangriffe.</p>",
"experiencePoints": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!GnW2ELzTtLoJmUQ1.ur7rgX6JTOwscpm5"
}

View file

@ -1,30 +0,0 @@
{
"_id": "MPb5ZrTIutJ291XD",
"name": "Anfällig (Wasser)",
"type": "specialCreatureAbility",
"sort": 400000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.E5WqX3Em2HOAkP2e"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/susceptible.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Erh&auml;lt doppelten Schaden durch Eis-, Frost- und Wasserangriffe.</p>",
"experiencePoints": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!O2maANGDJHPLX8aE.MPb5ZrTIutJ291XD"
}

View file

@ -1,30 +0,0 @@
{
"_id": "c95cnrJtMG20InKV",
"name": "Anfällig (Wasser)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.E5WqX3Em2HOAkP2e"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/susceptible.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Erh&auml;lt doppelten Schaden durch Eis-, Frost- und Wasserangriffe.</p>",
"experiencePoints": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!tYcKw69Feoy3B6hG.c95cnrJtMG20InKV"
}

View file

@ -1,30 +0,0 @@
{
"_id": "4JCW7iKb2e9I2ZSj",
"name": "Angst (1)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.rUA7XVCeDkREYfi8"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -1 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 10
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!wqgUDJc7Qb28hBBo.4JCW7iKb2e9I2ZSj"
}

View file

@ -1,30 +0,0 @@
{
"_id": "J2eP8hBIWtgayfhH",
"name": "Angst (1)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.rUA7XVCeDkREYfi8"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -1 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 10
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!oVKL6zJ2kYMmBuYx.J2eP8hBIWtgayfhH"
}

View file

@ -1,30 +0,0 @@
{
"_id": "k4syi7gvtjmG6yVt",
"name": "Angst (1)",
"type": "specialCreatureAbility",
"sort": 200000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.rUA7XVCeDkREYfi8"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -1 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 10
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!SQv63FQBjA5jW5xv.k4syi7gvtjmG6yVt"
}

View file

@ -1,30 +0,0 @@
{
"_id": "yUtiK9PSMcNcvXfr",
"name": "Angst (1)",
"type": "specialCreatureAbility",
"sort": 400000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.rUA7XVCeDkREYfi8"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -1 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 10
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!P3mlpN2JrbnDtLwJ.yUtiK9PSMcNcvXfr"
}

View file

@ -1,30 +0,0 @@
{
"_id": "IolX9qsFGSxYN38o",
"name": "Angst (2)",
"type": "specialCreatureAbility",
"sort": 400000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.3LGUHTPC3tbVC13X"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -2 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 20
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!6KmAeL9lVxWXIeU6.IolX9qsFGSxYN38o"
}

View file

@ -1,30 +0,0 @@
{
"_id": "QkZT7930qdhuLFxw",
"name": "Angst (2)",
"type": "specialCreatureAbility",
"sort": 400000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.3LGUHTPC3tbVC13X"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -2 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 20
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!cE5kI3uqXWQrCaI5.QkZT7930qdhuLFxw"
}

View file

@ -1,30 +0,0 @@
{
"_id": "tWwaC91MGIR4k3Uy",
"name": "Angst (2)",
"type": "specialCreatureAbility",
"sort": 200000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.3LGUHTPC3tbVC13X"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -2 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 20
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!vsIywRHMnJM7u4ts.tWwaC91MGIR4k3Uy"
}

View file

@ -1,30 +0,0 @@
{
"_id": "pX6BSfPqftBLxuhf",
"name": "Angst (3)",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.blDuh7uVVhaNSUVU"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -3 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 30
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!e1oy4levSO4VOQx8.pX6BSfPqftBLxuhf"
}

View file

@ -1,30 +0,0 @@
{
"_id": "z3o1FUNSKhEWkcpX",
"name": "Antimagie (10 Meter)",
"type": "specialCreatureAbility",
"sort": 200000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.oUR6JglLxmJZduZz"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/anti-magic.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>S&auml;mtliche Magie in einem Radius von 10 Metern um die Kreatur herum ist wirkungslos. Dies gilt nicht f&uuml;r die eigene Magie der Kreatur oder deren Zauber.</p>",
"experiencePoints": 50
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!8E7Mm0LsiqFm6syY.z3o1FUNSKhEWkcpX"
}

View file

@ -1,73 +0,0 @@
{
"_id": "quDuDAGeMVUvF3WD",
"name": "Arkanes Schwert",
"type": "spell",
"img": "systems/ds4/assets/icons/game-icons/lorc/sword-wound.svg",
"effects": [],
"folder": null,
"sort": 0,
"flags": {
"core": {
"sourceId": "Compendium.ds4.spells.VjvrapwDmBvGYmfj"
}
},
"system": {
"description": "<p>Ein Schwert aus hellem (oder je nach Belieben auch dunklem) Licht erscheint innerhalb eines Radius von VE in Metern um den Zauberwirker herum.</p>\n<p>Innerhalb dieses Wirkungsbereiches k&auml;mpft es v&ouml;llig selbstst&auml;ndig, h&ouml;rt jedoch auf gedankliche Kampfkommandos seines Beschw&ouml;reres wie &bdquo;Greif den gro&szlig;en Troll an&ldquo; oder &bdquo;Sch&uuml;tze mich&ldquo;.</p>\n<p>Bewegt sich der Zauberwirker, wandert der Wirkungsbereich des Schwertes mit ihm mit, so dass die magische Klinge niemals mehr als VE in Metern von ihm getrennt sein kann.</p>\n<p>Das Schwert l&ouml;st sich in seine arkanen Bestandteile auf, sobald seine (nicht heilbaren) LK auf Null oder niedriger sinken bzw. die Zauberdauer verstrichen ist.</p>\n<p>S&auml;mtliche Kampfwerte des Schwertes entsprechen der Stufe des Zauberwirkers +10.</p>\n<p>Die einzige Ausnahme bildet der Laufen-Wert, der dem doppelten Laufen-Wert des Zauberwirkers entspricht.</p>",
"equipped": false,
"spellType": "spellcasting",
"spellModifier": {
"numerical": 0,
"complex": ""
},
"allowsDefense": false,
"spellGroups": {
"lightning": false,
"earth": false,
"water": false,
"ice": false,
"fire": false,
"healing": false,
"light": true,
"air": false,
"transport": false,
"damage": false,
"shadow": false,
"protection": false,
"mindAffecting": false,
"demonology": false,
"necromancy": false,
"transmutation": false,
"area": false
},
"maxDistance": {
"value": "",
"unit": "meter"
},
"effectRadius": {
"value": "VE",
"unit": "meter"
},
"duration": {
"value": "VE x 2",
"unit": "rounds"
},
"cooldownDuration": "1d",
"minimumLevels": {
"healer": null,
"wizard": 10,
"sorcerer": 8
}
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!oVKL6zJ2kYMmBuYx.quDuDAGeMVUvF3WD"
}

View file

@ -1,33 +0,0 @@
{
"_id": "joNh3JSsqfqXk4lU",
"name": "Ast",
"type": "weapon",
"sort": 100000,
"flags": {},
"effects": [],
"img": "icons/svg/item-bag.svg",
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": false,
"attackType": "melee",
"weaponBonus": 0,
"opponentDefense": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!vXmTcBUKZkB2UBD7.joNh3JSsqfqXk4lU"
}

View file

@ -1,33 +0,0 @@
{
"_id": "CM1yKVLm6mhG2eQE",
"name": "Asthiebe",
"type": "weapon",
"sort": 100000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"attackType": "melee",
"weaponBonus": 2,
"opponentDefense": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!WboyONCY2UZildi9.CM1yKVLm6mhG2eQE"
}

View file

@ -1,184 +0,0 @@
{
"_id": "8E7Mm0LsiqFm6syY",
"name": "Augenball",
"type": "creature",
"img": "icons/svg/mystery-man.svg",
"items": [
"V7Qw97Fk5MJgijNs",
"z3o1FUNSKhEWkcpX",
"tKiwh730ZOGMICdg",
"SZ8rvHDbY67EqjDN",
"v6ojDNs7V5QqwKgT",
"coIsPp1V166g8IAm",
"kY4uQF3t99ANzx5T",
"JMp5LjImHvoKsbGo",
"K3QPHlqz66xolbzw",
"16dN0fMIjJwdhvGF",
"u3CLqxahFyF7kVpa",
"BkokuzUTP9U6LtBp",
"lIchGK1m7Y7fMcKG",
"f0MedvERq1s8hy4z",
"cnl7AuqByHHjW1zd",
"D3McezCJz6afqzmR",
"bKyT6b0j4wLXbL7O"
],
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"system": {
"attributes": {
"body": {
"base": 8,
"mod": 0
},
"mobility": {
"base": 4,
"mod": 0
},
"mind": {
"base": 10,
"mod": 0
}
},
"traits": {
"strength": {
"base": 0,
"mod": 0
},
"constitution": {
"base": 4,
"mod": 0
},
"agility": {
"base": 0,
"mod": 0
},
"dexterity": {
"base": 2,
"mod": 0
},
"intellect": {
"base": 2,
"mod": 0
},
"aura": {
"base": 3,
"mod": 0
}
},
"combatValues": {
"hitPoints": {
"mod": 66,
"value": 88
},
"defense": {
"mod": 0
},
"initiative": {
"mod": 0
},
"movement": {
"mod": 0
},
"meleeAttack": {
"mod": 0
},
"rangedAttack": {
"mod": 0
},
"spellcasting": {
"mod": 0
},
"targetedSpellcasting": {
"mod": 0
}
},
"baseInfo": {
"loot": "BW #5A:20, #5M:20",
"foeFactor": 23,
"creatureType": "magicalEntity",
"sizeCategory": "large",
"experiencePoints": 255,
"description": ""
}
},
"ownership": {
"default": 0
},
"prototypeToken": {
"flags": {},
"name": "Augenball",
"displayName": 20,
"width": 2,
"height": 2,
"lockRotation": false,
"rotation": 0,
"actorLink": false,
"disposition": -1,
"displayBars": 40,
"bar1": {
"attribute": "combatValues.hitPoints"
},
"bar2": {
"attribute": null
},
"randomImg": false,
"alpha": 1,
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"speed": 5,
"intensity": 5,
"reverse": false,
"type": null
},
"darkness": {
"min": 0,
"max": 1
},
"attenuation": 0.5,
"color": null
},
"texture": {
"src": "icons/svg/mystery-man.svg",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"tint": null
},
"sight": {
"angle": 360,
"enabled": false,
"range": 0,
"brightness": 1,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"appendNumber": false,
"prependAdjective": false
},
"_stats": {
"systemId": "ds4",
"systemVersion": "1.19.4",
"coreVersion": "11.305",
"createdTime": 1668995346257,
"modifiedTime": 1688934880746,
"lastModifiedBy": "DS4BuildSystem00"
},
"_key": "!actors!8E7Mm0LsiqFm6syY"
}

View file

@ -1,166 +0,0 @@
{
"_id": "InLjj4RGxfkDrtXr",
"name": "Bär",
"type": "creature",
"img": "systems/ds4/assets/tokens/devin-night/bear-1.png",
"items": ["qZayWokGcZreHpfI", "ayDGYJevUkbQ3N0c", "PKewYpkEmAWTc1j5", "WbEsNLQpzoWJlJyj"],
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"system": {
"attributes": {
"body": {
"base": 12,
"mod": 0
},
"mobility": {
"base": 8,
"mod": 0
},
"mind": {
"base": 1,
"mod": 0
}
},
"traits": {
"strength": {
"base": 3,
"mod": 0
},
"constitution": {
"base": 3,
"mod": 0
},
"agility": {
"base": 4,
"mod": 0
},
"dexterity": {
"base": 0,
"mod": 0
},
"intellect": {
"base": 0,
"mod": 0
},
"aura": {
"base": 0,
"mod": 0
}
},
"combatValues": {
"hitPoints": {
"mod": 50,
"value": 75
},
"defense": {
"mod": 0
},
"initiative": {
"mod": 0
},
"movement": {
"mod": 3
},
"meleeAttack": {
"mod": 0
},
"rangedAttack": {
"mod": 0
},
"spellcasting": {
"mod": 0
},
"targetedSpellcasting": {
"mod": 0
}
},
"baseInfo": {
"loot": "Trophäe (BW 1A:16)",
"foeFactor": 9,
"creatureType": "animal",
"sizeCategory": "large",
"experiencePoints": 139,
"description": ""
}
},
"ownership": {
"default": 0
},
"prototypeToken": {
"flags": {},
"name": "Bär",
"displayName": 20,
"width": 2,
"height": 2,
"lockRotation": false,
"rotation": 0,
"actorLink": false,
"disposition": -1,
"displayBars": 40,
"bar1": {
"attribute": "combatValues.hitPoints"
},
"bar2": {
"attribute": null
},
"randomImg": true,
"alpha": 1,
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"speed": 5,
"intensity": 5,
"reverse": false,
"type": null
},
"darkness": {
"min": 0,
"max": 1
},
"attenuation": 0.5,
"color": null
},
"texture": {
"src": "systems/ds4/assets/tokens/devin-night/bear*.png",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"tint": null
},
"sight": {
"angle": 360,
"enabled": false,
"range": 0,
"brightness": 1,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"appendNumber": false,
"prependAdjective": false
},
"_stats": {
"systemId": "ds4",
"systemVersion": "1.19.4",
"coreVersion": "11.305",
"createdTime": 1668995346499,
"modifiedTime": 1688934880959,
"lastModifiedBy": "DS4BuildSystem00"
},
"_key": "!actors!InLjj4RGxfkDrtXr"
}

View file

@ -1,33 +0,0 @@
{
"_id": "Icq7W8YrjXTIlb7C",
"name": "Bandagen",
"type": "armor",
"sort": 200000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"armorValue": 1,
"armorMaterialType": "cloth",
"armorType": "body"
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!P3mlpN2JrbnDtLwJ.Icq7W8YrjXTIlb7C"
}

View file

@ -1,173 +0,0 @@
{
"_id": "GVLSLNSoMybeWhBP",
"name": "Basilisk",
"type": "creature",
"img": "systems/ds4/assets/tokens/devin-night/basilisk-green.png",
"items": [
"y5i2zrZBp74DKQrQ",
"3CFakJA3eQJYSFN7",
"x7vdeybwnlRnlqTu",
"kQZnCtDlaCaKc38S",
"cZa7Ms69DWYg8Pgz",
"Hn8EIElYWelAKxiD"
],
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"system": {
"attributes": {
"body": {
"base": 14,
"mod": 0
},
"mobility": {
"base": 7,
"mod": 0
},
"mind": {
"base": 1,
"mod": 0
}
},
"traits": {
"strength": {
"base": 3,
"mod": 0
},
"constitution": {
"base": 4,
"mod": 0
},
"agility": {
"base": 3,
"mod": 0
},
"dexterity": {
"base": 0,
"mod": 0
},
"intellect": {
"base": 0,
"mod": 0
},
"aura": {
"base": 1,
"mod": 0
}
},
"combatValues": {
"hitPoints": {
"mod": 140,
"value": 168
},
"defense": {
"mod": 0
},
"initiative": {
"mod": 0
},
"movement": {
"mod": 2.5
},
"meleeAttack": {
"mod": 0
},
"rangedAttack": {
"mod": 0
},
"spellcasting": {
"mod": 0
},
"targetedSpellcasting": {
"mod": 0
}
},
"baseInfo": {
"loot": "Trophäe (BW 2A:20)",
"foeFactor": 18,
"creatureType": "magicalEntity",
"sizeCategory": "large",
"experiencePoints": 206,
"description": ""
}
},
"ownership": {
"default": 0
},
"prototypeToken": {
"flags": {},
"name": "Basilisk",
"displayName": 20,
"width": 2,
"height": 2,
"lockRotation": false,
"rotation": 0,
"actorLink": false,
"disposition": -1,
"displayBars": 40,
"bar1": {
"attribute": "combatValues.hitPoints"
},
"bar2": {
"attribute": null
},
"randomImg": true,
"alpha": 1,
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"speed": 5,
"intensity": 5,
"reverse": false,
"type": null
},
"darkness": {
"min": 0,
"max": 1
},
"attenuation": 0.5,
"color": null
},
"texture": {
"src": "systems/ds4/assets/tokens/devin-night/basilisk*.png",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"tint": null
},
"sight": {
"angle": 360,
"enabled": false,
"range": 0,
"brightness": 1,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"appendNumber": false,
"prependAdjective": false
},
"_stats": {
"systemId": "ds4",
"systemVersion": "1.19.4",
"coreVersion": "11.305",
"createdTime": 1668995346388,
"modifiedTime": 1688934880889,
"lastModifiedBy": "DS4BuildSystem00"
},
"_key": "!actors!GVLSLNSoMybeWhBP"
}

View file

@ -1,174 +0,0 @@
{
"_id": "WboyONCY2UZildi9",
"name": "Baumherr",
"type": "creature",
"img": "icons/svg/mystery-man.svg",
"items": [
"CM1yKVLm6mhG2eQE",
"sZw8glq3cnPHu6yq",
"X9jyAzrnyxuikyg3",
"B1Sw09kZopPZB8ys",
"x0mAm5abWWHlKJLz",
"2bA1MnqkTTwKtMoS",
"fKCcOlyaebvj1HuL"
],
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"system": {
"attributes": {
"body": {
"base": 20,
"mod": 0
},
"mobility": {
"base": 1,
"mod": 0
},
"mind": {
"base": 1,
"mod": 0
}
},
"traits": {
"strength": {
"base": 5,
"mod": 0
},
"constitution": {
"base": 5,
"mod": 0
},
"agility": {
"base": 0,
"mod": 0
},
"dexterity": {
"base": 0,
"mod": 0
},
"intellect": {
"base": 0,
"mod": 0
},
"aura": {
"base": 0,
"mod": 0
}
},
"combatValues": {
"hitPoints": {
"mod": 35,
"value": 70
},
"defense": {
"mod": 0
},
"initiative": {
"mod": 0
},
"movement": {
"mod": 2
},
"meleeAttack": {
"mod": 0
},
"rangedAttack": {
"mod": 0
},
"spellcasting": {
"mod": 0
},
"targetedSpellcasting": {
"mod": 0
}
},
"baseInfo": {
"loot": "Lediglich Brennholz",
"foeFactor": 23,
"creatureType": "plantBeing",
"sizeCategory": "large",
"experiencePoints": 158,
"description": ""
}
},
"ownership": {
"default": 0
},
"prototypeToken": {
"flags": {},
"name": "Baumherr",
"displayName": 20,
"width": 2,
"height": 2,
"lockRotation": false,
"rotation": 0,
"actorLink": false,
"disposition": -1,
"displayBars": 40,
"bar1": {
"attribute": "combatValues.hitPoints"
},
"bar2": {
"attribute": null
},
"randomImg": false,
"alpha": 1,
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"speed": 5,
"intensity": 5,
"reverse": false,
"type": null
},
"darkness": {
"min": 0,
"max": 1
},
"attenuation": 0.5,
"color": null
},
"texture": {
"src": "icons/svg/mystery-man.svg",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"tint": null
},
"sight": {
"angle": 360,
"enabled": false,
"range": 0,
"brightness": 1,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"appendNumber": false,
"prependAdjective": false
},
"_stats": {
"systemId": "ds4",
"systemVersion": "1.19.4",
"coreVersion": "11.305",
"createdTime": 1668995346710,
"modifiedTime": 1688934881181,
"lastModifiedBy": "DS4BuildSystem00"
},
"_key": "!actors!WboyONCY2UZildi9"
}

View file

@ -1,33 +0,0 @@
{
"_id": "ndjWMSfPfmPY9AUY",
"name": "Baumstamm",
"type": "weapon",
"sort": 100000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"attackType": "melee",
"weaponBonus": 4,
"opponentDefense": -4
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!rULL0cHbyACJsHDC.ndjWMSfPfmPY9AUY"
}

View file

@ -1,30 +0,0 @@
{
"_id": "VXyznv68DT2Guc0A",
"name": "Bezaubern",
"type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/charm.png",
"effects": [],
"folder": null,
"sort": 0,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.HMCFkxVzU2b3KkSA"
}
},
"system": {
"description": "<p>Kann Gegner mit einem &bdquo;Lockruf&ldquo; bezaubern. Dieser Zauber funktioniert wie der Zauberspruch @Compendium[ds4.spells.wZYElRaDmhqgzUvQ]{Gehorche}. Abklingzeit des <em>Lockrufs</em>: 10 Kampfrunden</p>",
"experiencePoints": 25
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!s56U2LeRInrje3xh.VXyznv68DT2Guc0A"
}

View file

@ -1,33 +0,0 @@
{
"_id": "8Um85s0Ayigqse3B",
"name": "Biss",
"type": "weapon",
"sort": 200000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"attackType": "melee",
"weaponBonus": 2,
"opponentDefense": -1
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!PVuNoFILDAHpqGsa.8Um85s0Ayigqse3B"
}

View file

@ -1,33 +0,0 @@
{
"_id": "9olbXmWVzPkmPhvu",
"name": "Biss",
"type": "weapon",
"sort": 100000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"attackType": "melee",
"weaponBonus": 1,
"opponentDefense": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!O2maANGDJHPLX8aE.9olbXmWVzPkmPhvu"
}

View file

@ -1,33 +0,0 @@
{
"_id": "j0NbwyhdJPipL7Rl",
"name": "Biss",
"type": "weapon",
"sort": 100000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"attackType": "melee",
"weaponBonus": 1,
"opponentDefense": 0
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!Qm2toXbf6EVmvRS1.j0NbwyhdJPipL7Rl"
}

View file

@ -1,73 +0,0 @@
{
"_id": "16dN0fMIjJwdhvGF",
"name": "Blenden",
"type": "spell",
"img": "systems/ds4/assets/icons/game-icons/lorc/laser-sparks.svg",
"effects": [],
"folder": null,
"sort": 100000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.spells.JldAx8a91vVO2wUf"
}
},
"system": {
"description": "<p>Ein glei&szlig;ender Lichtstrahl schie&szlig;t aus der Hand des Zauberwirkers und blendet bei Erfolg das Ziel (welches dagegen keine Abwehr w&uuml;rfeln darf).</p><p>Ein geblendetes Ziel hat -8 auf alle Handlungen, bei denen es sehen k&ouml;nnen sollte.</p><p>Selbst augenlose Untote, wie beispielsweise Skelette, werden durch das magische Licht geblendet. Blinde Lebewesen sind dagegen nicht betroffen.</p>",
"equipped": true,
"spellType": "targetedSpellcasting",
"spellModifier": {
"numerical": 0,
"complex": "-(AGI+AU)/2 des Ziels"
},
"allowsDefense": false,
"spellGroups": {
"lightning": false,
"earth": false,
"water": false,
"ice": false,
"fire": false,
"healing": false,
"light": true,
"air": false,
"transport": false,
"damage": false,
"shadow": false,
"protection": false,
"mindAffecting": false,
"demonology": false,
"necromancy": false,
"transmutation": false,
"area": false
},
"maxDistance": {
"value": "VE x 5",
"unit": "meter"
},
"effectRadius": {
"value": "",
"unit": "meter"
},
"duration": {
"value": "Prb.",
"unit": "rounds"
},
"cooldownDuration": "5r",
"minimumLevels": {
"healer": 1,
"wizard": 5,
"sorcerer": null
}
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!8E7Mm0LsiqFm6syY.16dN0fMIjJwdhvGF"
}

View file

@ -1,30 +0,0 @@
{
"_id": "MuXvP2TjwvevxLpo",
"name": "Blickangriff",
"type": "specialCreatureAbility",
"sort": 400000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.l4ewILWP2zbiSM97"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/gaze-attack.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Greift mit seinem Blick aktionsfrei jeden an, dem GEI+AU misslingt. Wer gegen die Kreatur vorgeht, ohne ihr in die Augen zu sehen, erh&auml;lt -4 auf alle Proben, ist aber nicht mehr Ziel ihrer Blickangriffe.</p>",
"experiencePoints": 10
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!F3zJ4xbHwN9syuK8.MuXvP2TjwvevxLpo"
}

View file

@ -1,30 +0,0 @@
{
"_id": "x7vdeybwnlRnlqTu",
"name": "Blickangriff",
"type": "specialCreatureAbility",
"sort": 300000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.l4ewILWP2zbiSM97"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/gaze-attack.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Greift mit seinem Blick aktionsfrei jeden an, dem GEI+AU misslingt. Wer gegen die Kreatur vorgeht, ohne ihr in die Augen zu sehen, erh&auml;lt -4 auf alle Proben, ist aber nicht mehr Ziel ihrer Blickangriffe.</p>",
"experiencePoints": 10
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!GVLSLNSoMybeWhBP.x7vdeybwnlRnlqTu"
}

View file

@ -1,30 +0,0 @@
{
"_id": "yjkoipelFXEzcy1x",
"name": "Blitz-Odem",
"type": "specialCreatureAbility",
"sort": 800000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.special-creature-abilities.sDffbUUXg88Vn2Pq"
}
},
"img": "systems/ds4/assets/icons/official/special-creature-abilities/breath-weapon.png",
"effects": [],
"folder": null,
"system": {
"description": "<p>Nur alle W20 Runden einsetzbar. Erzeugt nicht abwehrbaren Schaden (Schie&szlig;en-Angriff) &ndash; nur f&uuml;r magische Abwehrboni wird gew&uuml;rfelt (PW: Bonush&ouml;he). GE x 5 m langer Kegel (am Ende GE x 3 m breit).</p>",
"experiencePoints": -1
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!nDRdljcZzkonbU0s.yjkoipelFXEzcy1x"
}

View file

@ -1,73 +0,0 @@
{
"_id": "aa8a89EaVy8fjgLn",
"name": "Blitz",
"type": "spell",
"sort": 900000,
"flags": {
"core": {
"sourceId": "Compendium.ds4.spells.Senq5ub2Cx0agJgi"
}
},
"img": "systems/ds4/assets/icons/game-icons/delapouite/bolt-spell-cast.svg",
"effects": [],
"folder": null,
"system": {
"description": "<p>Der Zauberwirker schie&szlig;t einen Blitz auf einen Feind. Gegner in Metallr&uuml;stung d&uuml;rfen keine Abwehr gegen Blitze w&uuml;rfeln.</p>",
"equipped": false,
"spellType": "targetedSpellcasting",
"spellModifier": {
"numerical": 3,
"complex": ""
},
"allowsDefense": true,
"spellGroups": {
"lightning": true,
"earth": false,
"water": false,
"ice": false,
"fire": false,
"healing": false,
"light": false,
"air": false,
"transport": false,
"damage": true,
"shadow": false,
"protection": false,
"mindAffecting": false,
"demonology": false,
"necromancy": false,
"transmutation": false,
"area": false
},
"maxDistance": {
"value": "VE x 10",
"unit": "meter"
},
"effectRadius": {
"value": "",
"unit": "meter"
},
"duration": {
"value": "Sofort",
"unit": "custom"
},
"cooldownDuration": "1r",
"minimumLevels": {
"healer": 10,
"wizard": 7,
"sorcerer": 7
}
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!sCBrVIDh2umWr63g.aa8a89EaVy8fjgLn"
}

View file

@ -1,33 +0,0 @@
{
"_id": "hcB5LcidhVSW5rI7",
"name": "Brennendes Fell",
"type": "armor",
"sort": 300000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"armorValue": 1,
"armorMaterialType": "natural",
"armorType": "body"
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!O2maANGDJHPLX8aE.hcB5LcidhVSW5rI7"
}

View file

@ -1,33 +0,0 @@
{
"_id": "b1YoPObYAlp0qgLo",
"name": "Chitinpanzer",
"type": "armor",
"sort": 200000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"armorValue": 3,
"armorMaterialType": "natural",
"armorType": "body"
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!WYvb8G0z5GuNi7kO.b1YoPObYAlp0qgLo"
}

View file

@ -1,173 +0,0 @@
{
"_id": "PKPmkOMLDGwS9QZJ",
"name": "Dämonenfürst",
"type": "creature",
"img": "icons/svg/mystery-man.svg",
"items": [
"bXEiQJc7aJmLW1K4",
"N6MfjihlDL9hfse6",
"BDsxMEuEKfjEgFk3",
"AHJhJgRCvw2dKx78",
"DURD01IkVxPAwlxf",
"hvOFruV5fmieLXnk"
],
"effects": [],
"folder": null,
"sort": 0,
"flags": {},
"system": {
"attributes": {
"body": {
"base": 20,
"mod": 0
},
"mobility": {
"base": 20,
"mod": 0
},
"mind": {
"base": 10,
"mod": 0
}
},
"traits": {
"strength": {
"base": 10,
"mod": 0
},
"constitution": {
"base": 10,
"mod": 0
},
"agility": {
"base": 10,
"mod": 0
},
"dexterity": {
"base": 10,
"mod": 0
},
"intellect": {
"base": 5,
"mod": 0
},
"aura": {
"base": 5,
"mod": 0
}
},
"combatValues": {
"hitPoints": {
"mod": 360,
"value": 400
},
"defense": {
"mod": 0
},
"initiative": {
"mod": 0
},
"movement": {
"mod": 5
},
"meleeAttack": {
"mod": 0
},
"rangedAttack": {
"mod": 0
},
"spellcasting": {
"mod": 0
},
"targetedSpellcasting": {
"mod": 0
}
},
"baseInfo": {
"loot": "-",
"foeFactor": 42,
"creatureType": "magicalEntity",
"sizeCategory": "colossal",
"experiencePoints": 579,
"description": ""
}
},
"ownership": {
"default": 0
},
"prototypeToken": {
"flags": {},
"name": "Dämonenfürst",
"displayName": 20,
"width": 4,
"height": 4,
"lockRotation": false,
"rotation": 0,
"actorLink": false,
"disposition": -1,
"displayBars": 40,
"bar1": {
"attribute": "combatValues.hitPoints"
},
"bar2": {
"attribute": null
},
"randomImg": false,
"alpha": 1,
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"coloration": 1,
"dim": 0,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"speed": 5,
"intensity": 5,
"reverse": false,
"type": null
},
"darkness": {
"min": 0,
"max": 1
},
"attenuation": 0.5,
"color": null
},
"texture": {
"src": "icons/svg/mystery-man.svg",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"tint": null
},
"sight": {
"angle": 360,
"enabled": false,
"range": 0,
"brightness": 1,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"appendNumber": false,
"prependAdjective": false
},
"_stats": {
"systemId": "ds4",
"systemVersion": "1.19.4",
"coreVersion": "11.305",
"createdTime": 1668995346629,
"modifiedTime": 1688934881055,
"lastModifiedBy": "DS4BuildSystem00"
},
"_key": "!actors!PKPmkOMLDGwS9QZJ"
}

View file

@ -1,33 +0,0 @@
{
"_id": "N6MfjihlDL9hfse6",
"name": "Dämonenhaut",
"type": "armor",
"sort": 200000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"armorValue": 2,
"armorMaterialType": "natural",
"armorType": "body"
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!RxSUSzQBSTFYHOlV.N6MfjihlDL9hfse6"
}

View file

@ -1,33 +0,0 @@
{
"_id": "DDaq3xgZrGuEl4Dc",
"name": "Dicke Borstenhaut",
"type": "armor",
"sort": 200000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"armorValue": 2,
"armorMaterialType": "natural",
"armorType": "body"
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!FxGhbznQbwd0jRUT.DDaq3xgZrGuEl4Dc"
}

View file

@ -1,33 +0,0 @@
{
"_id": "pSQjVkwbjngPoEPZ",
"name": "Dicke Borstenhaut",
"type": "armor",
"sort": 200000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"armorValue": 2,
"armorMaterialType": "natural",
"armorType": "body"
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!GWNFUkgxocfKchIQ.pSQjVkwbjngPoEPZ"
}

View file

@ -1,33 +0,0 @@
{
"_id": "sZw8glq3cnPHu6yq",
"name": "Dicke Rinde",
"type": "armor",
"sort": 200000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"armorValue": 2,
"armorMaterialType": "natural",
"armorType": "body"
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!WboyONCY2UZildi9.sZw8glq3cnPHu6yq"
}

View file

@ -1,33 +0,0 @@
{
"_id": "b80BR5n1f6WvGavG",
"name": "Dicke Spinnenhaut",
"type": "armor",
"sort": 300000,
"flags": {},
"img": "icons/svg/mystery-man.svg",
"effects": [],
"folder": null,
"system": {
"description": "",
"quantity": 1,
"price": 0,
"availability": "unset",
"storageLocation": "-",
"equipped": true,
"armorValue": 1,
"armorMaterialType": "natural",
"armorType": "body"
},
"ownership": {
"default": 0
},
"_stats": {
"systemId": null,
"systemVersion": null,
"coreVersion": null,
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
},
"_key": "!actors.items!4276kgAddflo3bwN.b80BR5n1f6WvGavG"
}

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