Automate project with gulp and transition to TypeScript.
Expand character data and sheet.
This commit is contained in:
parent
6a7d402395
commit
e952dcb67a
|
|
@ -0,0 +1,7 @@
|
||||||
|
node_modules/
|
||||||
|
package-lock.json
|
||||||
|
*.lock
|
||||||
|
.idea/
|
||||||
|
source/packs/
|
||||||
|
source/generators/
|
||||||
|
dist
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 Michael Stein
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"moduleName": "Midgard 5. Edition",
|
||||||
|
"repository": "https://github.com/Lazrius/FoundryVTT-Typescript-Module-Template",
|
||||||
|
"rawURL": "https://raw.githubusercontent.com/Lazrius/FoundryVTT-Typescript-Module-Template"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,553 @@
|
||||||
|
import * as gulp from "gulp"
|
||||||
|
import fs from "fs-extra"
|
||||||
|
import * as path from "path"
|
||||||
|
import archiver from "archiver"
|
||||||
|
import stringify from "json-stringify-pretty-compact"
|
||||||
|
|
||||||
|
const sourcemaps = require('gulp-sourcemaps')
|
||||||
|
const uglify = require('gulp-uglify')
|
||||||
|
const concat = require("gulp-concat")
|
||||||
|
const buffer = require('vinyl-buffer')
|
||||||
|
const source = require('vinyl-source-stream')
|
||||||
|
const through = require('through2')
|
||||||
|
const jsonminify = require('gulp-jsonminify')
|
||||||
|
const merge2 = require('merge2')
|
||||||
|
|
||||||
|
const git = require('gulp-git-streamed')
|
||||||
|
|
||||||
|
const loadJson = (path: string): any => {
|
||||||
|
try {
|
||||||
|
let str = fs.readFileSync(path).toString()
|
||||||
|
return JSON.parse(str)
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
throw Error("Unable to load " + path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
import {
|
||||||
|
createLiteral,
|
||||||
|
factory,
|
||||||
|
isExportDeclaration,
|
||||||
|
isImportDeclaration,
|
||||||
|
isStringLiteral,
|
||||||
|
LiteralExpression,
|
||||||
|
Node,
|
||||||
|
TransformationContext,
|
||||||
|
Transformer as TSTransformer,
|
||||||
|
TransformerFactory,
|
||||||
|
visitEachChild,
|
||||||
|
visitNode,
|
||||||
|
} from "typescript"
|
||||||
|
import less from "gulp-less"
|
||||||
|
|
||||||
|
import Logger from "./source/utils/Logger"
|
||||||
|
import {ModuleData} from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/packages.mjs"
|
||||||
|
import browserify from "browserify"
|
||||||
|
const tsify = require("tsify")
|
||||||
|
|
||||||
|
const ts = require("gulp-typescript")
|
||||||
|
|
||||||
|
const argv = require("yargs").argv
|
||||||
|
|
||||||
|
let distPath = "dist"
|
||||||
|
|
||||||
|
function getConfig() {
|
||||||
|
const configPath = path.resolve(process.cwd(), "foundryconfig.json")
|
||||||
|
let config
|
||||||
|
|
||||||
|
if (fs.existsSync(configPath)) {
|
||||||
|
config = loadJson(configPath)
|
||||||
|
return config
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Manifest {
|
||||||
|
root: string
|
||||||
|
file: ModuleData
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const getManifest = (): Manifest | null => {
|
||||||
|
const json: Manifest = {
|
||||||
|
root: "",
|
||||||
|
// @ts-ignore
|
||||||
|
file: {},
|
||||||
|
name: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fs.existsSync("source")) {
|
||||||
|
json.root = "source"
|
||||||
|
} else {
|
||||||
|
json.root = distPath
|
||||||
|
}
|
||||||
|
|
||||||
|
const modulePath = path.join(json.root, "module.json")
|
||||||
|
const systemPath = path.join(json.root, "system.json")
|
||||||
|
|
||||||
|
if (fs.existsSync(modulePath)) {
|
||||||
|
json.file = loadJson(modulePath) as ModuleData
|
||||||
|
json.name = "module.json"
|
||||||
|
} else if (fs.existsSync(systemPath)) {
|
||||||
|
json.file = loadJson(systemPath) as ModuleData
|
||||||
|
json.name = "system.json"
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return json
|
||||||
|
}
|
||||||
|
|
||||||
|
const createTransformer = (): TransformerFactory<any> => {
|
||||||
|
/**
|
||||||
|
* @param {typescript.Node} node
|
||||||
|
*/
|
||||||
|
const shouldMutateModuleSpecifier = (node: Node): boolean => {
|
||||||
|
if (!isImportDeclaration(node) && !isExportDeclaration(node))
|
||||||
|
return false
|
||||||
|
if (node.moduleSpecifier === undefined)
|
||||||
|
return false
|
||||||
|
if (!isStringLiteral(node.moduleSpecifier))
|
||||||
|
return false
|
||||||
|
if (!node.moduleSpecifier.text.startsWith("./") && !node.moduleSpecifier.text.startsWith("../"))
|
||||||
|
return false
|
||||||
|
|
||||||
|
return path.extname(node.moduleSpecifier.text) === ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return (context: TransformationContext): TSTransformer<any> => {
|
||||||
|
return (node: Node) => {
|
||||||
|
function visitor(node: Node): Node {
|
||||||
|
if (shouldMutateModuleSpecifier(node)) {
|
||||||
|
if (isImportDeclaration(node)) {
|
||||||
|
const newModuleSpecifier = createLiteral(`${(node.moduleSpecifier as LiteralExpression).text}.js`)
|
||||||
|
return factory.updateImportDeclaration(node, node.decorators, node.modifiers, node.importClause, newModuleSpecifier, undefined)
|
||||||
|
} else if (isExportDeclaration(node)) {
|
||||||
|
const newModuleSpecifier = createLiteral(`${(node.moduleSpecifier as LiteralExpression).text}.js`)
|
||||||
|
return factory.updateExportDeclaration(node, node.decorators, node.modifiers, false, node.exportClause, newModuleSpecifier, undefined)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return visitEachChild(node, visitor, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
return visitNode(node, visitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const tsConfig = ts.createProject("tsconfig.json", {
|
||||||
|
getCustomTransformers: (_program: any) => ({
|
||||||
|
after: [createTransformer()],
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
function buildTS() {
|
||||||
|
const debug = process.env.npm_lifecycle_event !== "package"
|
||||||
|
let res = tsConfig.src()
|
||||||
|
.pipe(sourcemaps.init())
|
||||||
|
.pipe(tsConfig())
|
||||||
|
|
||||||
|
return res.js
|
||||||
|
.pipe(sourcemaps.write('', { debug: debug, includeContent: true, sourceRoot: './ts/source' }))
|
||||||
|
.pipe(gulp.dest(distPath))
|
||||||
|
}
|
||||||
|
|
||||||
|
const bundleModule = () => {
|
||||||
|
const debug = argv.dbg || argv.debug
|
||||||
|
const bsfy = browserify(path.join(__dirname, "source/index.ts"), { debug: debug })
|
||||||
|
return bsfy.on('error', Logger.Err)
|
||||||
|
.plugin(tsify)
|
||||||
|
.bundle()
|
||||||
|
.pipe(source(path.join(distPath, "bundle.js")))
|
||||||
|
.pipe(buffer())
|
||||||
|
.pipe(sourcemaps.init({loadMaps: true}))
|
||||||
|
.pipe(uglify())
|
||||||
|
.pipe(sourcemaps.write('./'))
|
||||||
|
.pipe(gulp.dest('./'))
|
||||||
|
}
|
||||||
|
|
||||||
|
const buildLess = () => {
|
||||||
|
return gulp.src("source/style/*.less")
|
||||||
|
.pipe(less())
|
||||||
|
.pipe(concat("bundle.css"))
|
||||||
|
.pipe(gulp.dest(distPath))
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Pack {
|
||||||
|
root: string,
|
||||||
|
type: string,
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const buildPack = (pack: Pack): NodeJS.ReadWriteStream => {
|
||||||
|
return gulp.src(pack.root + "/" + pack.type + "/" + pack.name + "/*.json")
|
||||||
|
.pipe(jsonminify())
|
||||||
|
.pipe(concat(pack.name + ".db"))
|
||||||
|
.pipe(gulp.dest(distPath + "/" + pack.root + "/" + pack.type))
|
||||||
|
}
|
||||||
|
|
||||||
|
const buildPacks = () => {
|
||||||
|
let packs: Pack[] = []
|
||||||
|
|
||||||
|
const rootDir = "packs"
|
||||||
|
const packTypes = fs.readdirSync(rootDir).filter(p => fs.statSync(path.join(rootDir, p)).isDirectory())
|
||||||
|
packTypes.forEach(packType => {
|
||||||
|
const packDir = path.join(rootDir, packType)
|
||||||
|
const packNames = fs.readdirSync(packDir).filter(p => fs.statSync(path.join(packDir, p)).isDirectory())
|
||||||
|
packNames.forEach(packName => {
|
||||||
|
packs.push({
|
||||||
|
name: packName,
|
||||||
|
type: packType,
|
||||||
|
root: rootDir
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
return merge2(packs.map(p => buildPack(p)))
|
||||||
|
}
|
||||||
|
|
||||||
|
const copyFiles = async() => {
|
||||||
|
const recursiveFileSearch = (dir: string, callback: (err: NodeJS.ErrnoException | null, res: Array<string>) => void) => {
|
||||||
|
let results: Array<string> = []
|
||||||
|
fs.readdir(dir, (err, list) => {
|
||||||
|
if (err)
|
||||||
|
return callback(err, results)
|
||||||
|
|
||||||
|
let pending = list.length
|
||||||
|
if (!pending)
|
||||||
|
return callback(null, results)
|
||||||
|
|
||||||
|
for (let file of list) {
|
||||||
|
file = path.resolve(dir, file)
|
||||||
|
fs.stat(file, (err, stat) => {
|
||||||
|
if (stat && stat.isDirectory()) {
|
||||||
|
recursiveFileSearch(file, (err, res) => {
|
||||||
|
results = results.concat(res)
|
||||||
|
if (!--pending)
|
||||||
|
callback(null, results)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
results.push(file)
|
||||||
|
if (!--pending)
|
||||||
|
callback(null, results)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
|
||||||
|
const modulePath = path.join("source", "module.json")
|
||||||
|
if (fs.existsSync(modulePath))
|
||||||
|
await fs.copyFile(modulePath, path.join(distPath, "module.json"))
|
||||||
|
|
||||||
|
const systemPath = path.join("source/system.json")
|
||||||
|
if (fs.existsSync(systemPath))
|
||||||
|
await fs.copyFile(systemPath, path.join(distPath, "system.json"))
|
||||||
|
|
||||||
|
if (!fs.existsSync(path.resolve(__dirname, "assets")))
|
||||||
|
return Promise.resolve()
|
||||||
|
|
||||||
|
const filter = (src: string, dest: string): boolean => {
|
||||||
|
Logger.Ok("Copying file: " + dest)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
await fs.copyFile(path.join("source", "template.json"), path.join(distPath, "template.json"))
|
||||||
|
|
||||||
|
fs.copySync(path.resolve(__dirname, "assets"), path.resolve(__dirname, distPath + "/assets"), { overwrite: true, filter })
|
||||||
|
fs.copySync(path.resolve(__dirname, "lang"), path.resolve(__dirname, distPath + "/lang"), { overwrite: true, filter })
|
||||||
|
//fs.copySync(path.resolve(__dirname, "packs"), path.resolve(__dirname, distPath + "/packs"), { overwrite: true, filter })
|
||||||
|
fs.copySync(path.resolve(__dirname, "templates"), path.resolve(__dirname, distPath + "/templates"), { overwrite: true, filter })
|
||||||
|
return Promise.resolve()
|
||||||
|
} catch (err) {
|
||||||
|
await Promise.reject(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const cleanDist = async () => {
|
||||||
|
if (argv.dbg || argv.debug)
|
||||||
|
return
|
||||||
|
Logger.log("Cleaning dist file clutter")
|
||||||
|
|
||||||
|
const files: string[] = []
|
||||||
|
const getFiles = async (dir: string) => {
|
||||||
|
const arr = await fs.promises.readdir(dir)
|
||||||
|
for(const entry of arr)
|
||||||
|
{
|
||||||
|
const fullPath = path.join(dir, entry)
|
||||||
|
const stat = await fs.promises.stat(fullPath)
|
||||||
|
if (stat.isDirectory())
|
||||||
|
await getFiles(fullPath)
|
||||||
|
else
|
||||||
|
files.push(fullPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await getFiles(path.resolve(distPath))
|
||||||
|
for(const file of files) {
|
||||||
|
if (file.endsWith("bundle.js") || file.endsWith(".css") || file.endsWith("module.json"))
|
||||||
|
continue
|
||||||
|
|
||||||
|
Logger.Warn("Cleaning " + path.relative(process.cwd(), file))
|
||||||
|
await fs.promises.unlink(file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Watch for changes for each build step
|
||||||
|
*/
|
||||||
|
const buildWatch = () => {
|
||||||
|
gulp.watch("source/**/*.ts", { ignoreInitial: false }, gulp.series(buildTS, bundleModule))
|
||||||
|
gulp.watch("source/**/*.less", { ignoreInitial: false }, buildLess)
|
||||||
|
gulp.watch("packs", { ignoreInitial: false }, buildPacks)
|
||||||
|
gulp.watch(["assets", "lang", "templates", "source/*.json"], { ignoreInitial: false }, copyFiles)
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************/
|
||||||
|
/* CLEAN */
|
||||||
|
/********************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove built files from `dist` folder
|
||||||
|
* while ignoring source files
|
||||||
|
*/
|
||||||
|
const clean = async () => {
|
||||||
|
if (!fs.existsSync(distPath))
|
||||||
|
fs.mkdirSync(distPath)
|
||||||
|
else {
|
||||||
|
// Attempt to remove the files
|
||||||
|
try {
|
||||||
|
fs.rmSync(distPath, { recursive: true, force: true })
|
||||||
|
fs.mkdirSync(distPath)
|
||||||
|
return Promise.resolve()
|
||||||
|
} catch (err) {
|
||||||
|
await Promise.reject(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const setTargetDir = async () => {
|
||||||
|
const dp = process.env.FOUNDRY_PATH
|
||||||
|
if (!dp)
|
||||||
|
throw Error("FOUNDRY_PATH not defined in environment")
|
||||||
|
|
||||||
|
const name = getManifest()!.file.name ?? "midgard5"
|
||||||
|
distPath = path.join(dp, "Data", "systems", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
const linkUserData = async () => {
|
||||||
|
const name = getManifest()!.file.name
|
||||||
|
|
||||||
|
let destDir
|
||||||
|
try {
|
||||||
|
if (fs.existsSync(path.resolve(".", distPath, "module.json")) || fs.existsSync(path.resolve(".", "source", "module.json"))) {
|
||||||
|
destDir = "modules"
|
||||||
|
} else if (fs.existsSync(path.resolve(".", distPath, "system.json")) || fs.existsSync(path.resolve(".", "source", "system.json"))) {
|
||||||
|
destDir = "systems"
|
||||||
|
} else {
|
||||||
|
throw Error(`Could not find module.json or system.json`)
|
||||||
|
}
|
||||||
|
|
||||||
|
let linkDir
|
||||||
|
const dataPath = process.env.FOUNDRY_PATH
|
||||||
|
if (dataPath) {
|
||||||
|
if (!fs.existsSync(path.join(dataPath, "Data")))
|
||||||
|
throw Error("User Data path invalid, no Data directory found")
|
||||||
|
|
||||||
|
linkDir = path.join(dataPath, "Data", destDir, name as string)
|
||||||
|
} else {
|
||||||
|
throw Error("FOUNDRY_PATH not defined in environment")
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (argv.clean || argv.c) {
|
||||||
|
Logger.Warn(`Removing build in ${linkDir}`)
|
||||||
|
fs.rmSync(linkDir, { recursive: true, force: true })
|
||||||
|
fs.mkdirSync(linkDir)
|
||||||
|
//}
|
||||||
|
|
||||||
|
Logger.Ok(`Copying build to ${linkDir}`)
|
||||||
|
fs.copySync(path.resolve(distPath), linkDir, { overwrite: true })
|
||||||
|
|
||||||
|
return Promise.resolve()
|
||||||
|
} catch (err) {
|
||||||
|
await Promise.reject(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************/
|
||||||
|
/* PACKAGE */
|
||||||
|
/*********************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Package build
|
||||||
|
*/
|
||||||
|
async function packageBuild() {
|
||||||
|
const manifest = getManifest()
|
||||||
|
if (manifest === null) {
|
||||||
|
Logger.Err("Manifest file could not be loaded.")
|
||||||
|
throw Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
// Remove the package dir without doing anything else
|
||||||
|
if (argv.clean || argv.c) {
|
||||||
|
Logger.Warn("Removing all packaged files")
|
||||||
|
fs.rmSync(distPath, { force: true, recursive: true })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure there is a directory to hold all the packaged versions
|
||||||
|
if(!fs.existsSync(distPath))
|
||||||
|
fs.mkdirSync(distPath)
|
||||||
|
|
||||||
|
// Initialize the zip file
|
||||||
|
const zipName = `${manifest.file.name}-v${manifest.file.version}.zip`
|
||||||
|
const zipFile = fs.createWriteStream(path.join(distPath, zipName))
|
||||||
|
const zip = archiver("zip", { zlib: { level: 9 } })
|
||||||
|
|
||||||
|
zipFile.on("close", () => {
|
||||||
|
Logger.Ok(zip.pointer() + " total bytes")
|
||||||
|
Logger.Ok(`Zip file ${zipName} has been written`)
|
||||||
|
return resolve(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
zip.on("error", (err) => {
|
||||||
|
throw err
|
||||||
|
})
|
||||||
|
|
||||||
|
zip.pipe(zipFile)
|
||||||
|
|
||||||
|
zip.directory(path.join(process.cwd(), distPath), false)
|
||||||
|
return zip.finalize()
|
||||||
|
} catch (err) {
|
||||||
|
return reject(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************/
|
||||||
|
/* PACKAGE */
|
||||||
|
/*********************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update version and URLs in the manifest JSON
|
||||||
|
*/
|
||||||
|
const updateManifest = (cb: any) => {
|
||||||
|
const packageJson = loadJson("package.json")
|
||||||
|
const config = getConfig(),
|
||||||
|
manifest = getManifest(),
|
||||||
|
rawURL = config.rawURL,
|
||||||
|
repoURL = config.repository,
|
||||||
|
manifestRoot = manifest!.root
|
||||||
|
|
||||||
|
if (!config)
|
||||||
|
cb(Error("foundryconfig.json not found"))
|
||||||
|
if (manifest === null) {
|
||||||
|
cb(Error("Manifest JSON not found"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!rawURL || !repoURL)
|
||||||
|
cb(Error("Repository URLs not configured in foundryconfig.json"))
|
||||||
|
|
||||||
|
try {
|
||||||
|
const version = argv.update || argv.u
|
||||||
|
|
||||||
|
/* Update version */
|
||||||
|
|
||||||
|
const versionMatch = /^(\d{1,}).(\d{1,}).(\d{1,})$/
|
||||||
|
const currentVersion = manifest!.file.version
|
||||||
|
let targetVersion = ""
|
||||||
|
|
||||||
|
if (!version) {
|
||||||
|
cb(Error("Missing version number"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (versionMatch.test(version)) {
|
||||||
|
targetVersion = version
|
||||||
|
} else {
|
||||||
|
targetVersion = currentVersion.replace(versionMatch, (substring: string, major: string, minor: string, patch: string) => {
|
||||||
|
console.log(substring, Number(major) + 1, Number(minor) + 1, Number(patch) + 1)
|
||||||
|
if (version === "major") {
|
||||||
|
return `${Number(major) + 1}.0.0`
|
||||||
|
} else if (version === "minor") {
|
||||||
|
return `${major}.${Number(minor) + 1}.0`
|
||||||
|
} else if (version === "patch") {
|
||||||
|
return `${major}.${minor}.${Number(patch) + 1}`
|
||||||
|
} else {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetVersion === "") {
|
||||||
|
return cb(Error("Error: Incorrect version arguments."))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetVersion === currentVersion) {
|
||||||
|
return cb(Error("Error: Target version is identical to current version."))
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.Ok(`Updating version number to '${targetVersion}'`)
|
||||||
|
|
||||||
|
packageJson.version = targetVersion
|
||||||
|
manifest.file.version = targetVersion
|
||||||
|
|
||||||
|
/* Update URLs */
|
||||||
|
|
||||||
|
const result = `${rawURL}/v${manifest.file.version}/${distPath}/${manifest.file.name}-v${manifest.file.version}.zip`
|
||||||
|
|
||||||
|
manifest.file.url = repoURL
|
||||||
|
manifest.file.manifest = `${rawURL}/master/${manifestRoot}/${manifest.name}`
|
||||||
|
manifest.file.download = result
|
||||||
|
|
||||||
|
const prettyProjectJson = stringify(manifest.file, {
|
||||||
|
maxLength: 35,
|
||||||
|
indent: "\t",
|
||||||
|
})
|
||||||
|
|
||||||
|
fs.writeFileSync("package.json", JSON.stringify(packageJson, null, '\t'))
|
||||||
|
fs.writeFileSync(path.join(manifest.root, manifest.name), prettyProjectJson, "utf8")
|
||||||
|
|
||||||
|
return cb()
|
||||||
|
} catch (err) {
|
||||||
|
return cb(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const gitTaskManifest = (cb: gulp.TaskFunctionCallback) => {
|
||||||
|
const manifest = getManifest()
|
||||||
|
if (!manifest)
|
||||||
|
return cb(Error("could not load manifest."))
|
||||||
|
|
||||||
|
return gulp.src([`package.json`, `source/module.json`])
|
||||||
|
.pipe(git.add({ args: "--no-all -f" }))
|
||||||
|
.pipe(git.commit(`v${manifest.file.version}`, { args: "-a", disableAppendPaths: true }))
|
||||||
|
}
|
||||||
|
|
||||||
|
const gitTaskBuild = (cb: gulp.TaskFunctionCallback) => {
|
||||||
|
const manifest = getManifest()
|
||||||
|
if (!manifest)
|
||||||
|
return cb(Error("could not load manifest."))
|
||||||
|
|
||||||
|
return gulp.src(`${distPath}/${manifest.file.name}-v${manifest.file.version}.zip`)
|
||||||
|
.pipe(git.checkout(`v${manifest.file.version}`, { args: '-b' }))
|
||||||
|
.pipe(git.add({ args: "--no-all -f" }))
|
||||||
|
.pipe(git.commit(`v${manifest.file.version}`, { args: "-a", disableAppendPaths: true }))
|
||||||
|
}
|
||||||
|
|
||||||
|
const execBuild = gulp.parallel(buildTS, buildLess, buildPacks, copyFiles)
|
||||||
|
|
||||||
|
exports.build = gulp.series(clean, execBuild, bundleModule)
|
||||||
|
exports.buildTarget = gulp.series(setTargetDir, clean, execBuild, bundleModule)
|
||||||
|
exports.watch = buildWatch
|
||||||
|
exports.watchTarget = gulp.series(setTargetDir, buildWatch)
|
||||||
|
exports.clean = clean
|
||||||
|
exports.link = linkUserData
|
||||||
|
exports.package = packageBuild
|
||||||
|
exports.update = updateManifest
|
||||||
|
//exports.publish = gulp.series(clean, updateManifest, execBuild, bundleModule, packageBuild, gitTaskManifest, gitTaskBuild)
|
||||||
99
lang/de.json
99
lang/de.json
|
|
@ -2,12 +2,19 @@
|
||||||
"ACTOR.TypeCharacter": "Spielfigur",
|
"ACTOR.TypeCharacter": "Spielfigur",
|
||||||
"ACTOR.TypeNpc": "Kreatur / Nichtspielerfigur",
|
"ACTOR.TypeNpc": "Kreatur / Nichtspielerfigur",
|
||||||
"ACTOR.TypeVehicle": "Transportmittel / Pferd etc.",
|
"ACTOR.TypeVehicle": "Transportmittel / Pferd etc.",
|
||||||
|
|
||||||
"ITEM.TypeItem": "Gegenstand",
|
"ITEM.TypeItem": "Gegenstand",
|
||||||
|
"ITEM.TypeWeapon": "Waffe",
|
||||||
|
"ITEM.TypeArmor": "Rüstung",
|
||||||
|
"ITEM.TypeSpell": "Zauber",
|
||||||
|
|
||||||
"midgard5.description": "Beschreibung",
|
"midgard5.description": "Beschreibung",
|
||||||
|
|
||||||
"midgard5.item-value": "Wert",
|
"midgard5.item-value": "Wert",
|
||||||
"midgard5.item-quantity": "Menge",
|
"midgard5.item-quantity": "Menge",
|
||||||
"midgard5.item-onbody": "Am Körper",
|
"midgard5.item-onbody": "Am Körper",
|
||||||
"midgard5.item-ismagic": "Ist Magisch",
|
"midgard5.item-ismagic": "Ist Magisch",
|
||||||
|
|
||||||
"midgard5.actor-lp": "Lebenspunkte",
|
"midgard5.actor-lp": "Lebenspunkte",
|
||||||
"midgard5.actor-ap": "Ausdauerpunkte",
|
"midgard5.actor-ap": "Ausdauerpunkte",
|
||||||
"midgard5.actor-st": "St",
|
"midgard5.actor-st": "St",
|
||||||
|
|
@ -28,8 +35,98 @@
|
||||||
"midgard5.actor-zt-long": "Zaubertalent",
|
"midgard5.actor-zt-long": "Zaubertalent",
|
||||||
"midgard5.actor-wk": "Wk",
|
"midgard5.actor-wk": "Wk",
|
||||||
"midgard5.actor-wk-long": "Willenskraft",
|
"midgard5.actor-wk-long": "Willenskraft",
|
||||||
|
|
||||||
"midgard5.bonus": "Bonus",
|
"midgard5.bonus": "Bonus",
|
||||||
"midgard5.aktuell": "Akt.",
|
"midgard5.aktuell": "Akt.",
|
||||||
"midgard5.maximum": "Max.",
|
"midgard5.maximum": "Max.",
|
||||||
"midgard5.attrvalue": "Wert"
|
"midgard5.attrvalue": "Wert",
|
||||||
|
|
||||||
|
"midgard5.base_values": "Grundwerte",
|
||||||
|
"midgard5.skills": "Fertigkeiten",
|
||||||
|
"midgard5.gear": "Ausrüstung",
|
||||||
|
"midgard5.spells": "Zauber",
|
||||||
|
|
||||||
|
"midgard5.class": "Klasse",
|
||||||
|
"midgard5.race": "Rasse",
|
||||||
|
"midgard5.magic_using": "zauberkundig",
|
||||||
|
"midgard5.gender": "Geschlecht",
|
||||||
|
"midgard5.weight": "Gewicht",
|
||||||
|
"midgard5.height": "Größe",
|
||||||
|
"midgard5.shape": "Gestalt",
|
||||||
|
"midgard5.age": "Alter",
|
||||||
|
"midgard5.caste": "Stand",
|
||||||
|
"midgard5.occupation": "Beruf",
|
||||||
|
"midgard5.origin": "Heimat",
|
||||||
|
"midgard5.faith": "Glaube",
|
||||||
|
|
||||||
|
"midgard5.exp-overall": "Erfahrungsschatz",
|
||||||
|
"midgard5.exp-available": "Erfahrungspunkte",
|
||||||
|
"midgard5.grace": "Göttliche Gnade",
|
||||||
|
"midgard5.destiny": "Schicksalsgunst",
|
||||||
|
|
||||||
|
"midgard5.akrobatik": "Akrobatik",
|
||||||
|
"midgard5.alchimie": "Alchimie",
|
||||||
|
"midgard5.anfuehren": "Anführen",
|
||||||
|
"midgard5.athletik": "Athletik",
|
||||||
|
"midgard5.balancieren": "Balancieren",
|
||||||
|
"midgard5.beidhaendigerKampf": "Beidhändiger Kampf",
|
||||||
|
"midgard5.beredsamkeit": "Beredsamkeit",
|
||||||
|
"midgard5.betaeuben": "Betäuben",
|
||||||
|
"midgard5.bootfahren": "Bootfahren",
|
||||||
|
"midgard5.ersteHilfe": "Erste Hilfe",
|
||||||
|
"midgard5.etikette": "Etikette",
|
||||||
|
"midgard5.fallenEntdecken": "Fallen entdecken",
|
||||||
|
"midgard5.fallenmechanik": "Fallenmechanik",
|
||||||
|
"midgard5.faelschen": "Fälschen",
|
||||||
|
"midgard5.fechten": "Fechten",
|
||||||
|
"midgard5.gassenwissen": "Gassenwissen",
|
||||||
|
"midgard5.gaukeln": "Gaukeln",
|
||||||
|
"midgard5.gelaendelauf": "Geländelauf",
|
||||||
|
"midgard5.geraetekunde": "Gerätekunde",
|
||||||
|
"midgard5.geschaeftssinn": "Geschäftssinn",
|
||||||
|
"midgard5.gluecksspiel": "Glücksspiel",
|
||||||
|
"midgard5.heilkunde": "Heilkunde",
|
||||||
|
"midgard5.kampfInVollruestung": "Kampf in Vollrüstung",
|
||||||
|
"midgard5.klettern": "Klettern",
|
||||||
|
"midgard5.landeskunde": "Landeskunde",
|
||||||
|
"midgard5.laufen": "Laufen",
|
||||||
|
"midgard5.lesenVonZauberschrift": "Lesen von Zauberschrift",
|
||||||
|
"midgard5.meditieren": "Meditieren",
|
||||||
|
"midgard5.menschenkenntnis": "Menschenkenntnis",
|
||||||
|
"midgard5.meucheln": "Meucheln",
|
||||||
|
"midgard5.musizieren": "Musizieren",
|
||||||
|
"midgard5.naturkunde": "Naturkunde",
|
||||||
|
"midgard5.pflanzenkunde": "Pflanzenkunde",
|
||||||
|
"midgard5.reiten": "Reiten",
|
||||||
|
"midgard5.reiterkampf": "Reiterkampf",
|
||||||
|
"midgard5.scharfschiessen": "Scharfschießen",
|
||||||
|
"midgard5.schleichen": "Schleichen",
|
||||||
|
"midgard5.schloesserOeffnen": "Schlösser öffnen",
|
||||||
|
"midgard5.schwimmen": "Schwimmen",
|
||||||
|
"midgard5.seilkunst": "Seilkunst",
|
||||||
|
"midgard5.spurensuche": "Spurensuche",
|
||||||
|
"midgard5.stehlen": "Stehlen",
|
||||||
|
"midgard5.tarnen": "Tarnen",
|
||||||
|
"midgard5.tauchen": "Tauchen",
|
||||||
|
"midgard5.tierkunde": "Tierkunde",
|
||||||
|
"midgard5.ueberleben": "Überleben",
|
||||||
|
"midgard5.verfuehren": "Verführen",
|
||||||
|
"midgard5.verhoeren": "Verhören",
|
||||||
|
"midgard5.verstellen": "Verstellen",
|
||||||
|
"midgard5.wagenlenken": "Wagenlenken",
|
||||||
|
"midgard5.zauberkunde": "Zauberkunde",
|
||||||
|
|
||||||
|
"midgard5.armor": "Rüstung",
|
||||||
|
"midgard5.defense": "Abwehr",
|
||||||
|
"midgard5.damageBonus": "Schadensbonus",
|
||||||
|
"midgard5.attackBonus": "Angriffsbonus",
|
||||||
|
"midgard5.defenseBonus": "Abwehrbonus",
|
||||||
|
"midgard5.movementBonus": "Bewegunsbonus",
|
||||||
|
"midgard5.resistanceMind": "Resistenz Geist",
|
||||||
|
"midgard5.resistanceBody": "Resistenz Körper",
|
||||||
|
"midgard5.spellCasting": "Zaubern",
|
||||||
|
"midgard5.spellBonus": "Zauberbonus",
|
||||||
|
"midgard5.brawl": "Raufen",
|
||||||
|
"midgard5.poisonResistance": "Giftresistenz",
|
||||||
|
"midgard5.enduranceBonus": "Ausdauerbonus"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
// main: midgard5.less
|
|
||||||
|
|
||||||
.midgard5.sheet.character {
|
|
||||||
form {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.sheet-content {
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
.editor {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.profile-img {
|
|
||||||
height: 64px;
|
|
||||||
width: 64px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
//out: ../midgard5.css
|
|
||||||
|
|
||||||
@import "./Item-sheet.less";
|
|
||||||
@import "./Character-sheet.less";
|
|
||||||
32
midgard5.css
32
midgard5.css
|
|
@ -1,32 +0,0 @@
|
||||||
.midgard5.sheet.item form {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.midgard5.sheet.item .sheet-content {
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.midgard5.sheet.item .sheet-content .editor {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.midgard5.sheet.item .item-img {
|
|
||||||
height: 64px;
|
|
||||||
width: 64px;
|
|
||||||
}
|
|
||||||
.midgard5.sheet.character form {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.midgard5.sheet.character .sheet-content {
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.midgard5.sheet.character .sheet-content .editor {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.midgard5.sheet.character .profile-img {
|
|
||||||
height: 64px;
|
|
||||||
width: 64px;
|
|
||||||
}
|
|
||||||
16
midgard5.js
16
midgard5.js
|
|
@ -1,16 +0,0 @@
|
||||||
import m5ItemSheet from "./module/sheets/m5ItemSheet.js";
|
|
||||||
import m5CharacterSheet from "./module/sheets/m5CharacterSheet.js";
|
|
||||||
|
|
||||||
Hooks.once("init", function () {
|
|
||||||
console.log("M5 | Initialisierung Midgard 5");
|
|
||||||
|
|
||||||
// Default Sheet für Items definieren und das Standardsheet deaktivieren
|
|
||||||
|
|
||||||
Items.unregisterSheet("core", ItemSheet);
|
|
||||||
Items.registerSheet("midgard5", m5ItemSheet, { makeDefault: true });
|
|
||||||
|
|
||||||
// Default Sheet für Actors definieren und das Standardsheet deaktivieren
|
|
||||||
|
|
||||||
Actors.unregisterSheet("core", ActorSheet);
|
|
||||||
Actors.registerSheet("midgard5", m5CharacterSheet, { makeDefault: true });
|
|
||||||
});
|
|
||||||
Binary file not shown.
|
|
@ -1,15 +0,0 @@
|
||||||
export default class m5CharacterSheet extends ActorSheet {
|
|
||||||
|
|
||||||
static get defaultOptions() {
|
|
||||||
return mergeObject(super.defaultOptions, {
|
|
||||||
template: "systems/midgard5/templates/sheets/m5Character-Sheet.hbs",
|
|
||||||
width: 530,
|
|
||||||
height: 400,
|
|
||||||
classes: ["midgard5", "sheet", "character"]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// get template() {
|
|
||||||
// return 'systems/midgard5/templates/sheets/m5Character-Sheet.hbs';
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
export default class m5ItemSheet extends ItemSheet {
|
|
||||||
|
|
||||||
static get defaultOptions() {
|
|
||||||
return mergeObject(super.defaultOptions, {
|
|
||||||
width: 530,
|
|
||||||
height: 340,
|
|
||||||
classes: ["midgard5", "sheet", "item"]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
get template() {
|
|
||||||
return 'systems/midgard5/templates/sheets/m5Item-Sheet.hbs';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
"name": "foundry-system-midgard5",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"package": "gulp publish --update",
|
||||||
|
"build": "gulp build --dbg",
|
||||||
|
"build:target": "gulp buildTarget --dbg",
|
||||||
|
"build:link": "gulp build --dbg && gulp link",
|
||||||
|
"build:prod": "gulp build && gulp link",
|
||||||
|
"build:watch": "gulp watch",
|
||||||
|
"build:watch:target": "gulp watchTarget",
|
||||||
|
"clean": "gulp clean && gulp link --clean"
|
||||||
|
},
|
||||||
|
"author": "Michael Stein",
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.15.0",
|
||||||
|
"@league-of-foundry-developers/foundry-vtt-types": "^9.269.0",
|
||||||
|
"@types/archiver": "^5.1.1",
|
||||||
|
"@types/browserify": "^12.0.37",
|
||||||
|
"@types/color": "^3.0.2",
|
||||||
|
"@types/fs-extra": "^9.0.13",
|
||||||
|
"@types/gulp": "^4.0.9",
|
||||||
|
"@types/gulp-less": "^0.0.32",
|
||||||
|
"@types/jquery": "^3.5.6",
|
||||||
|
"@types/node": "^16.9.1",
|
||||||
|
"@types/yargs": "^17.0.2",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^4.30.0",
|
||||||
|
"@typescript-eslint/parser": "^4.30.0",
|
||||||
|
"archiver": "^5.3.0",
|
||||||
|
"babelify": "^10.0.0",
|
||||||
|
"browserify": "^17.0.0",
|
||||||
|
"color": "3.2.1",
|
||||||
|
"eslint": "^7.32.0",
|
||||||
|
"fs-extra": "^10.0.1",
|
||||||
|
"gulp": "^4.0.2",
|
||||||
|
"gulp-bro": "^2.0.0",
|
||||||
|
"gulp-concat": "^2.6.1",
|
||||||
|
"gulp-git": "^2.10.1",
|
||||||
|
"gulp-git-streamed": "^2.10.1",
|
||||||
|
"gulp-jsonminify": "^1.1.0",
|
||||||
|
"gulp-less": "^5.0.0",
|
||||||
|
"gulp-sourcemaps": "^3.0.0",
|
||||||
|
"gulp-typescript": "^6.0.0-alpha.1",
|
||||||
|
"gulp-uglify": "^3.0.2",
|
||||||
|
"json-stringify-pretty-compact": "^3.0.0",
|
||||||
|
"merge2": "^1.4.1",
|
||||||
|
"ts-node": "^10.2.1",
|
||||||
|
"tsify": "^5.0.4",
|
||||||
|
"typescript": "^4.4.2",
|
||||||
|
"uglifyify": "^5.0.2",
|
||||||
|
"vinyl-buffer": "^1.0.1",
|
||||||
|
"vinyl-source-stream": "^2.0.0",
|
||||||
|
"yargs": "^17.1.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
|
@ -1,3 +0,0 @@
|
||||||
{"_id":"R41aDRCMdLzXuTwY","name":"Blaupause Spielerfigur","permission":{"default":0,"CBq5YXAqbO7HoJ03":3},"type":"character","data":{"lp":{"value":15,"min":0,"max":15},"ap":{"value":20,"min":0,"max":20},"st":{"value":50,"bonus":0},"ge":{"value":50,"bonus":0},"gw":{"value":50,"bonus":0},"ko":{"value":50,"bonus":0},"in":{"value":50,"bonus":0},"zt":{"value":50,"bonus":0},"au":{"value":50,"bonus":0},"pa":{"value":50,"bonus":0},"wk":{"value":50,"bonus":0},"description":" ","es":0,"ep":0,"gg":0,"sg":0,"gp":2},"sort":100001,"flags":{"core":{"sourceId":"Compendium.world.blaupause-spielfiguren.t9eB2RdE1n9wV8eq"}},"img":"icons/svg/aura.svg","token":{"flags":{},"name":"Blaupause Spielfigur","displayName":30,"img":"icons/svg/aura.svg","tint":"","width":1,"height":1,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":true,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"R41aDRCMdLzXuTwY","actorLink":true,"disposition":1,"displayBars":50,"bar1":{"attribute":"lp"},"bar2":{"attribute":"ap"},"randomImg":false},"items":[],"effects":[]}
|
|
||||||
{"_id":"bqttz8gtZyKV7t30","name":"Blaupause NSpF - verbunden","permission":{"default":0,"CBq5YXAqbO7HoJ03":3},"type":"npc","data":{"lp":{"value":15,"min":0,"max":15},"ap":{"value":20,"min":0,"max":20},"st":{"value":50,"bonus":0},"ge":{"value":50,"bonus":0},"gw":{"value":50,"bonus":0},"ko":{"value":50,"bonus":0},"in":{"value":50,"bonus":0},"zt":{"value":50,"bonus":0},"au":{"value":50,"bonus":0},"pa":{"value":50,"bonus":0},"wk":{"value":50,"bonus":0},"description":" "},"sort":100001,"flags":{"core":{"sourceId":"Compendium.midgard5.blaupause-spielfiguren.UZ24J3Izksd0gNfR"}},"img":"icons/svg/wing.svg","token":{"flags":{},"name":"Blaupause NSpF - verbunden","displayName":30,"img":"icons/svg/wing.svg","tint":"","width":1,"height":1,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":true,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"bqttz8gtZyKV7t30","actorLink":true,"disposition":-1,"displayBars":50,"bar1":{"attribute":"lp"},"bar2":{"attribute":"ap"},"randomImg":false},"items":[],"effects":[]}
|
|
||||||
{"_id":"d9fKKyYxVSnUOsE4","name":"Blaupause NSpF - nicht verbunden","permission":{"default":0,"CBq5YXAqbO7HoJ03":3},"type":"npc","data":{"lp":{"value":15,"min":0,"max":15},"ap":{"value":20,"min":0,"max":20},"st":{"value":50,"bonus":0},"ge":{"value":50,"bonus":0},"gw":{"value":50,"bonus":0},"ko":{"value":50,"bonus":0},"in":{"value":50,"bonus":0},"zt":{"value":50,"bonus":0},"au":{"value":50,"bonus":0},"pa":{"value":50,"bonus":0},"wk":{"value":50,"bonus":0},"description":" "},"sort":100001,"flags":{"core":{"sourceId":"Compendium.midgard5.blaupause-spielfiguren.UZ24J3Izksd0gNfR"}},"img":"icons/svg/wing.svg","token":{"flags":{},"name":"Blaupause NSpF - nicht verbunden","displayName":30,"img":"icons/svg/wing.svg","tint":"","width":1,"height":1,"scale":1,"mirrorX":false,"mirrorY":false,"lockRotation":false,"rotation":0,"vision":true,"dimSight":0,"brightSight":0,"dimLight":0,"brightLight":0,"sightAngle":360,"lightAngle":360,"lightColor":"","lightAlpha":1,"lightAnimation":{"type":"","speed":5,"intensity":5},"actorId":"d9fKKyYxVSnUOsE4","actorLink":false,"disposition":-1,"displayBars":50,"bar1":{"attribute":"lp"},"bar2":{"attribute":"ap"},"randomImg":false},"items":[],"effects":[]}
|
|
||||||
|
|
@ -0,0 +1,106 @@
|
||||||
|
{
|
||||||
|
"_id": "d9fKKyYxVSnUOsE4",
|
||||||
|
"name": "Blaupause NSpF - nicht verbunden",
|
||||||
|
"permission": {
|
||||||
|
"default": 0,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "npc",
|
||||||
|
"data": {
|
||||||
|
"lp": {
|
||||||
|
"value": 15,
|
||||||
|
"min": 0,
|
||||||
|
"max": 15
|
||||||
|
},
|
||||||
|
"ap": {
|
||||||
|
"value": 20,
|
||||||
|
"min": 0,
|
||||||
|
"max": 20
|
||||||
|
},
|
||||||
|
"st": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"ge": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"gw": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"ko": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"in": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"zt": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"au": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"pa": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"wk": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"description": " "
|
||||||
|
},
|
||||||
|
"sort": 100001,
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Compendium.midgard5.blaupause-spielfiguren.UZ24J3Izksd0gNfR"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"img": "icons/svg/wing.svg",
|
||||||
|
"token": {
|
||||||
|
"flags": {},
|
||||||
|
"name": "Blaupause NSpF - nicht verbunden",
|
||||||
|
"displayName": 30,
|
||||||
|
"img": "icons/svg/wing.svg",
|
||||||
|
"tint": "",
|
||||||
|
"width": 1,
|
||||||
|
"height": 1,
|
||||||
|
"scale": 1,
|
||||||
|
"mirrorX": false,
|
||||||
|
"mirrorY": false,
|
||||||
|
"lockRotation": false,
|
||||||
|
"rotation": 0,
|
||||||
|
"vision": true,
|
||||||
|
"dimSight": 0,
|
||||||
|
"brightSight": 0,
|
||||||
|
"dimLight": 0,
|
||||||
|
"brightLight": 0,
|
||||||
|
"sightAngle": 360,
|
||||||
|
"lightAngle": 360,
|
||||||
|
"lightColor": "",
|
||||||
|
"lightAlpha": 1,
|
||||||
|
"lightAnimation": {
|
||||||
|
"type": "",
|
||||||
|
"speed": 5,
|
||||||
|
"intensity": 5
|
||||||
|
},
|
||||||
|
"actorId": "d9fKKyYxVSnUOsE4",
|
||||||
|
"actorLink": false,
|
||||||
|
"disposition": -1,
|
||||||
|
"displayBars": 50,
|
||||||
|
"bar1": {
|
||||||
|
"attribute": "lp"
|
||||||
|
},
|
||||||
|
"bar2": {
|
||||||
|
"attribute": "ap"
|
||||||
|
},
|
||||||
|
"randomImg": false
|
||||||
|
},
|
||||||
|
"items": [],
|
||||||
|
"effects": []
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,106 @@
|
||||||
|
{
|
||||||
|
"_id": "bqttz8gtZyKV7t30",
|
||||||
|
"name": "Blaupause NSpF - verbunden",
|
||||||
|
"permission": {
|
||||||
|
"default": 0,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "npc",
|
||||||
|
"data": {
|
||||||
|
"lp": {
|
||||||
|
"value": 15,
|
||||||
|
"min": 0,
|
||||||
|
"max": 15
|
||||||
|
},
|
||||||
|
"ap": {
|
||||||
|
"value": 20,
|
||||||
|
"min": 0,
|
||||||
|
"max": 20
|
||||||
|
},
|
||||||
|
"st": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"ge": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"gw": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"ko": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"in": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"zt": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"au": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"pa": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"wk": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"description": " "
|
||||||
|
},
|
||||||
|
"sort": 100001,
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Compendium.midgard5.blaupause-spielfiguren.UZ24J3Izksd0gNfR"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"img": "icons/svg/wing.svg",
|
||||||
|
"token": {
|
||||||
|
"flags": {},
|
||||||
|
"name": "Blaupause NSpF - verbunden",
|
||||||
|
"displayName": 30,
|
||||||
|
"img": "icons/svg/wing.svg",
|
||||||
|
"tint": "",
|
||||||
|
"width": 1,
|
||||||
|
"height": 1,
|
||||||
|
"scale": 1,
|
||||||
|
"mirrorX": false,
|
||||||
|
"mirrorY": false,
|
||||||
|
"lockRotation": false,
|
||||||
|
"rotation": 0,
|
||||||
|
"vision": true,
|
||||||
|
"dimSight": 0,
|
||||||
|
"brightSight": 0,
|
||||||
|
"dimLight": 0,
|
||||||
|
"brightLight": 0,
|
||||||
|
"sightAngle": 360,
|
||||||
|
"lightAngle": 360,
|
||||||
|
"lightColor": "",
|
||||||
|
"lightAlpha": 1,
|
||||||
|
"lightAnimation": {
|
||||||
|
"type": "",
|
||||||
|
"speed": 5,
|
||||||
|
"intensity": 5
|
||||||
|
},
|
||||||
|
"actorId": "bqttz8gtZyKV7t30",
|
||||||
|
"actorLink": true,
|
||||||
|
"disposition": -1,
|
||||||
|
"displayBars": 50,
|
||||||
|
"bar1": {
|
||||||
|
"attribute": "lp"
|
||||||
|
},
|
||||||
|
"bar2": {
|
||||||
|
"attribute": "ap"
|
||||||
|
},
|
||||||
|
"randomImg": false
|
||||||
|
},
|
||||||
|
"items": [],
|
||||||
|
"effects": []
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
{
|
||||||
|
"_id": "R41aDRCMdLzXuTwY",
|
||||||
|
"name": "Blaupause Spielerfigur",
|
||||||
|
"permission": {
|
||||||
|
"default": 0,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "character",
|
||||||
|
"data": {
|
||||||
|
"lp": {
|
||||||
|
"value": 15,
|
||||||
|
"min": 0,
|
||||||
|
"max": 15
|
||||||
|
},
|
||||||
|
"ap": {
|
||||||
|
"value": 20,
|
||||||
|
"min": 0,
|
||||||
|
"max": 20
|
||||||
|
},
|
||||||
|
"st": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"ge": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"gw": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"ko": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"in": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"zt": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"au": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"pa": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"wk": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"description": " ",
|
||||||
|
"es": 0,
|
||||||
|
"ep": 0,
|
||||||
|
"gg": 0,
|
||||||
|
"sg": 0,
|
||||||
|
"gp": 2
|
||||||
|
},
|
||||||
|
"sort": 100001,
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Compendium.world.blaupause-spielfiguren.t9eB2RdE1n9wV8eq"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"img": "icons/svg/aura.svg",
|
||||||
|
"token": {
|
||||||
|
"flags": {},
|
||||||
|
"name": "Blaupause Spielfigur",
|
||||||
|
"displayName": 30,
|
||||||
|
"img": "icons/svg/aura.svg",
|
||||||
|
"tint": "",
|
||||||
|
"width": 1,
|
||||||
|
"height": 1,
|
||||||
|
"scale": 1,
|
||||||
|
"mirrorX": false,
|
||||||
|
"mirrorY": false,
|
||||||
|
"lockRotation": false,
|
||||||
|
"rotation": 0,
|
||||||
|
"vision": true,
|
||||||
|
"dimSight": 0,
|
||||||
|
"brightSight": 0,
|
||||||
|
"dimLight": 0,
|
||||||
|
"brightLight": 0,
|
||||||
|
"sightAngle": 360,
|
||||||
|
"lightAngle": 360,
|
||||||
|
"lightColor": "",
|
||||||
|
"lightAlpha": 1,
|
||||||
|
"lightAnimation": {
|
||||||
|
"type": "",
|
||||||
|
"speed": 5,
|
||||||
|
"intensity": 5
|
||||||
|
},
|
||||||
|
"actorId": "R41aDRCMdLzXuTwY",
|
||||||
|
"actorLink": true,
|
||||||
|
"disposition": 1,
|
||||||
|
"displayBars": 50,
|
||||||
|
"bar1": {
|
||||||
|
"attribute": "lp"
|
||||||
|
},
|
||||||
|
"bar2": {
|
||||||
|
"attribute": "ap"
|
||||||
|
},
|
||||||
|
"randomImg": false
|
||||||
|
},
|
||||||
|
"items": [],
|
||||||
|
"effects": []
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"_id": "WH2b4Tv630iuyAGJ",
|
||||||
|
"name": "Blaupause Schwert",
|
||||||
|
"permission": {
|
||||||
|
"default": 0,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "weapon",
|
||||||
|
"img": "icons/svg/item-bag.svg",
|
||||||
|
"data": {
|
||||||
|
"description": "Ein langes Stück Metall mit einem spitzen Ende.",
|
||||||
|
"damageBonus": 0,
|
||||||
|
"attackBonus": 0,
|
||||||
|
"defenseBonus": 0,
|
||||||
|
"movementBonus": 0,
|
||||||
|
"resistanceMind": 0,
|
||||||
|
"resistanceBody": 0,
|
||||||
|
"spellBonus": 0,
|
||||||
|
"skill": "",
|
||||||
|
"quantity": 1,
|
||||||
|
"value": 100,
|
||||||
|
"onbody": false,
|
||||||
|
"magic": false
|
||||||
|
},
|
||||||
|
"effects": [],
|
||||||
|
"flags": {}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
{"name":"Kritischer Schaden","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.QZlbT0tgD2aYW5YJ"}},"scope":"global","command":"main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritischer Schaden\");\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5/assets/icons/macro/kriterfolgangriff.svg","actorIds":[],"_id":"48DUqxdpHDCGKOHp"}
|
|
||||||
{"name":"Kritischer Fehler bei Angriffen","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.FZUermrYHSbrEluS"}},"scope":"global","command":"main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritischer Fehler bei Angriffen\");\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5/assets/icons/macro/kritfehlerangriff.svg","actorIds":[],"_id":"798kmgnTkpfP89Z9"}
|
|
||||||
{"name":"Kritischer Fehler bei der Abwehr","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.k1tLp8Q2NY9twiZ6"}},"scope":"global","command":"main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritischer Fehler bei der Abwehr\");\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5/assets/icons/macro/kritfehlerabwehr.svg","actorIds":[],"_id":"W7rYb00B6rtabV05"}
|
|
||||||
{"name":"Kritische Fehler beim Zaubern","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.e4KLlTBq8Z4Pt7In"}},"scope":"global","command":"main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritische Fehler beim Zaubern\");\n\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5/assets/icons/macro/kritfehlerzauber.svg","actorIds":[],"_id":"XtzGuyYRyX8wVi1e"}
|
|
||||||
{"name":"Kritischer Erfolg bei der Abwehr","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.P6jQGko7PdG6Xlhe"}},"scope":"global","command":"main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritischer Erfolg bei der Abwehr\");\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5/assets/icons/macro/kriterfolgabwehr.svg","actorIds":[],"_id":"qWyrwvh7g9CbTKg9"}
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "Kritische Fehler beim Zaubern",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "script",
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Macro.e4KLlTBq8Z4Pt7In"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": "global",
|
||||||
|
"command": "main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritische Fehler beim Zaubern\");\n\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}",
|
||||||
|
"author": "CBq5YXAqbO7HoJ03",
|
||||||
|
"img": "systems/midgard5/assets/icons/macro/kritfehlerzauber.svg",
|
||||||
|
"actorIds": [],
|
||||||
|
"_id": "XtzGuyYRyX8wVi1e"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "Kritischer Erfolg bei der Abwehr",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "script",
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Macro.P6jQGko7PdG6Xlhe"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": "global",
|
||||||
|
"command": "main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritischer Erfolg bei der Abwehr\");\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}",
|
||||||
|
"author": "CBq5YXAqbO7HoJ03",
|
||||||
|
"img": "systems/midgard5/assets/icons/macro/kriterfolgabwehr.svg",
|
||||||
|
"actorIds": [],
|
||||||
|
"_id": "qWyrwvh7g9CbTKg9"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "Kritischer Fehler bei Angriffen",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "script",
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Macro.FZUermrYHSbrEluS"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": "global",
|
||||||
|
"command": "main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritischer Fehler bei Angriffen\");\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}",
|
||||||
|
"author": "CBq5YXAqbO7HoJ03",
|
||||||
|
"img": "systems/midgard5/assets/icons/macro/kritfehlerangriff.svg",
|
||||||
|
"actorIds": [],
|
||||||
|
"_id": "798kmgnTkpfP89Z9"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "Kritischer Fehler bei der Abwehr",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "script",
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Macro.k1tLp8Q2NY9twiZ6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": "global",
|
||||||
|
"command": "main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritischer Fehler bei der Abwehr\");\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}",
|
||||||
|
"author": "CBq5YXAqbO7HoJ03",
|
||||||
|
"img": "systems/midgard5/assets/icons/macro/kritfehlerabwehr.svg",
|
||||||
|
"actorIds": [],
|
||||||
|
"_id": "W7rYb00B6rtabV05"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "Kritischer Schaden",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "script",
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Macro.QZlbT0tgD2aYW5YJ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": "global",
|
||||||
|
"command": "main()\nasync function main() {\n\n//Das richtige Pack (Kompendium) holen\n\nconst pack = game.packs.get(\"midgard5.tabellen-kritische-ereignisse\");\n\nawait pack.getIndex();\n\n// Richtige Tabelle aus dem Pack holen\n\nlet entry = pack.index.find(e => e.name === \"Kritischer Schaden\");\n\n// Zum Schluss drauf würfeln\n\npack.getEntity(entry._id).then(table => table.draw());\n\n}",
|
||||||
|
"author": "CBq5YXAqbO7HoJ03",
|
||||||
|
"img": "systems/midgard5/assets/icons/macro/kriterfolgangriff.svg",
|
||||||
|
"actorIds": [],
|
||||||
|
"_id": "48DUqxdpHDCGKOHp"
|
||||||
|
}
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
{"name":"1W6","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.QBhV6De80g1wH6ot"}},"scope":"global","command":"/r 1d6","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5/assets/icons/wurfel/w6.svg","actorIds":[],"_id":"5tpfRgbM5sTL9gur"}
|
|
||||||
{"name":"1W10","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.TqmUKpMpY4GhiTML"}},"scope":"global","command":"/r 1d10","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5/assets/icons/wurfel/w10.svg","actorIds":[],"_id":"YWsPRUpZpgLBKIB3"}
|
|
||||||
{"name":"1W100","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.S01PfXnvLPeuKOH8"}},"scope":"global","command":"/r 1d100","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5/assets/icons/wurfel/w100.svg","actorIds":[],"_id":"pXZIfqDIX9VKYonr"}
|
|
||||||
{"name":"1W20","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.mj9nIEgk0UDz8tbH"}},"scope":"global","command":"/r 1d20","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5/assets/icons/wurfel/w20.svg","actorIds":[],"_id":"qBoxslCQXxR22xKc"}
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "1W10",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "chat",
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Macro.TqmUKpMpY4GhiTML"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": "global",
|
||||||
|
"command": "/r 1d10",
|
||||||
|
"author": "CBq5YXAqbO7HoJ03",
|
||||||
|
"img": "systems/midgard5/assets/icons/wurfel/w10.svg",
|
||||||
|
"actorIds": [],
|
||||||
|
"_id": "YWsPRUpZpgLBKIB3"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "1W100",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "chat",
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Macro.S01PfXnvLPeuKOH8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": "global",
|
||||||
|
"command": "/r 1d100",
|
||||||
|
"author": "CBq5YXAqbO7HoJ03",
|
||||||
|
"img": "systems/midgard5/assets/icons/wurfel/w100.svg",
|
||||||
|
"actorIds": [],
|
||||||
|
"_id": "pXZIfqDIX9VKYonr"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "1W20",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "chat",
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Macro.mj9nIEgk0UDz8tbH"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": "global",
|
||||||
|
"command": "/r 1d20",
|
||||||
|
"author": "CBq5YXAqbO7HoJ03",
|
||||||
|
"img": "systems/midgard5/assets/icons/wurfel/w20.svg",
|
||||||
|
"actorIds": [],
|
||||||
|
"_id": "qBoxslCQXxR22xKc"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "1W6",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"type": "chat",
|
||||||
|
"flags": {
|
||||||
|
"core": {
|
||||||
|
"sourceId": "Macro.QBhV6De80g1wH6ot"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scope": "global",
|
||||||
|
"command": "/r 1d6",
|
||||||
|
"author": "CBq5YXAqbO7HoJ03",
|
||||||
|
"img": "systems/midgard5/assets/icons/wurfel/w6.svg",
|
||||||
|
"actorIds": [],
|
||||||
|
"_id": "5tpfRgbM5sTL9gur"
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,163 @@
|
||||||
|
{
|
||||||
|
"name": "Kritische Fehler beim Zaubern",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"flags": {
|
||||||
|
"exportSource": {
|
||||||
|
"world": "midgard-test",
|
||||||
|
"system": "midgard5",
|
||||||
|
"coreVersion": "0.7.9",
|
||||||
|
"systemVersion": 0.02
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"description": "<h2>Tabelle 1: Kritische Fehler Beim Zaubern</h2><h3><b>*</b>: Die Magie wirkt auf ein falsches Ziel oder hat einen unerwünschten Effekt. Werden dabei Wesen betroffen, die nicht verzaubert werden wollen, steht ihnen ein WW:Resistenz oder ein WW:Abwehr zu. Dabei zählt allerdings nicht das Würfelergebnis von 1, das zu dem kritischen Fehler geführt hat, sondern der ungeschickte Zauberer wiederholt in diesen Fällen den EW:Zaubern. Diesem neuen Gesamtergebnis müssen die Opfer \ndes kritischen Fehlers widerstehen, um der magischen Wirkung \nzu entgehen - auch wenn es unter 20 liegt. Fällt bei diesem wiederholten EW:Zaubern eine 1 oder eine 20, so hat dies keine besonderen Folgen.</br>Wird ein kritischer Fehler erwürfelt, der für einen Spruch sinnlos ist, wird stattdessen der Zauberer geschwächt. Er kann [[1d6]] Runden nicht zaubern.</h3>",
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"_id": "LW9UnEaonREGKzTy",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Keine besonderen Auswirkungen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
1,
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "G7GgXxFcsfsbUcwi",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3><b>*</b> Der Zauberer verspricht sich oder kann seine Gedanken nicht zusammenhalten.</h3>Es kommt zu einer Entladung magischer Energie, die wirkungslos verpufft, dem Zauberer aber einen leichten thaumatischen Schock versetzt. Er kann [[1d6]] Runden (*10 sec) lang nicht zaubern.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 20,
|
||||||
|
"range": [
|
||||||
|
11,
|
||||||
|
30
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "7vVkIs4duqhpJaKq",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Zauberer unterschätzt das Ausmaß des Flusses arkaner Energie.</h3>Der Zauberer setzt mehr Magan in Bewegung als nötig. Der Überfluss entzieht sich seiner Kontrolle und breitet sich schlagartig in seinem Astralleib aus. Diese Störung lässt den Spruch fehlschlagen. Der Zauberer verliert dadurch doppelt so viele AP wie üblich.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 20,
|
||||||
|
"range": [
|
||||||
|
31,
|
||||||
|
50
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "S5d86WFP7bCmatNp",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3><b>*</b> Der Zauberer irrt sich bei der Festlegung des Effekts.</h3>Das Opfer wird gestärkt statt geschwächt, verwundet statt geheilt, es wird wärmer statt kühler usw. Soweit möglich, geschieht das Gegenteil dessen, was der Zauberer erreichen wollte.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
51,
|
||||||
|
60
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "I3XXLhTRCdE19Vmd",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3><b>*</b> Der Zauberer irrt sich bei der Auswahl des Opfers/ des Wirkungsbereichs.</h3>Der Spruch wirkt auf ein zufällig bestimmtes Wesen oder Objekt innerhalb der Reichweite. Bei räumlichen Wirkungsbereichen breitet sich die Magie in die genau entgegengesetzte Richtung (Kegel oder Strahl) aus bzw. liegt das Zentrum der Wirkung in entgegengesetzter Richtung vom Zauberer aus gesehen (Umkreis).",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
61,
|
||||||
|
70
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "ciB0pGZyV4KjV5iO",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Zauberer wird geschwächt.</h3>Der Spruch misslingt, aber die bereits freigesetzte Energie schwächt Körper und Geist des Zauberers. Er verliert [[1d6]] AP und kann [[1d6*10]] min lang nicht zaubern.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
71,
|
||||||
|
80
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "xx6BVgf3NbpFJLaQ",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Es kommt zu einer magischen Stauung.</h3>Die falsche Ausführung des Zaubers verhindert die Weiterleitung der erzeugten arkanen Energie. Die starke Ansammlung von Magan im Argyriston des Zauberers zieht dieses in Mitleidenschaft. Sein Zaubertalent sinkt für [[1d6]] Tage auf die Hälfte des normalen Wertes - mit entsprechenden Folgen für seinen persönlichen Zauberbonus. Dieser negative Effekt kann mit Allheilung vorzeitig aufgehoben werden.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
81,
|
||||||
|
90
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "Q3QjCiHYzLVtrXz3",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Zauberer erleidet eine schwere Bewusstseinsstörung.</h3>Die Entladung magischer Energie beim Scheitern des Spruches versetzt dem Zauberer einen schweren thaumatischen Schock. Er verliert dadurch [[1d6]] LP und AP und kann in der nächsten Stunde nicht zaubern. Übersteigen die LP-Verluste ein Drittel des LP Maximums, so fällt der Zauberer in ein Koma, aus dem er nach [[1d6]] Tagen erwacht. Mit Allheilung kann er vorher aufgeweckt werden.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 5,
|
||||||
|
"range": [
|
||||||
|
91,
|
||||||
|
95
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "QICP7DgbyTmp1Nns",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3><b>*</b>Der Zauberer verzaubert sich selbst.</h3>Bei einem Geistes- oder Körperzauber trifft die volle Wirkung der Magie den Zauberer selbst, wenn ihm ein WW:Resistenz misslingt. Schützende Zauber funktionieren also gegebenenfalls ganz normal (Glück im Unglück). Kontrollzauber wie Macht über Menschen führen zur vorübergehenden Handlungsunfähigkeit des Zauberers; sein Geist versucht, die Kontrolle über sich selbst zu übernehmen, so dass er völlig mit sich selbst beschäftigt ist, bis ihm ein alle 2 min erlaubter EW:Resistenz gelingt. Sprü- che, die wie Macht über die belebte Natur nur auf Tiere wirken, haben keinen Effekt. Bei Umgebungszaubern tritt stattdessen der unter 91-95 beschriebene Effekt ein.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 4,
|
||||||
|
"range": [
|
||||||
|
96,
|
||||||
|
99
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "qY2J5MqMZvNzspnt",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Zauberwerk wird in Mitleidenschaft gezogen.</h3>Der Spruch misslingt; die dabei freigesetzte Energie stört die Magie von Zauberwerk, das der Zauberer mit sich führt. Jeder magische Gegenstand in bis zu 1 m Entfernung ist mit einer Chance von 10%+Stufe des misslungenen Zaubers betroffen: Zaubermittel (Trünke, Kräuter usw.) verlieren ihre Eigenschaften, Amulette werden wirkungslos, Spruchrollen leeren sich. Bei verzauberten Waffen oder Rüstungen gehen [[1d6–3]] von allen magischen Zuschlägen verloren. Bei Artefakten mit mehreren Wirkungen wird für jede einzeln gewürfelt, ob sie betroffen ist.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 1,
|
||||||
|
"range": [
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"formula": "1d100",
|
||||||
|
"replacement": true,
|
||||||
|
"displayRoll": true,
|
||||||
|
"_id": "PRovcPRqdrvFRpFN"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,142 @@
|
||||||
|
{
|
||||||
|
"name": "Kritischer Erfolg bei der Abwehr",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"flags": {},
|
||||||
|
"img": "icons/svg/holy-shield.svg",
|
||||||
|
"description": "<h2>Tabelle 6: Kritischer Erfolg bei der Abwehr</h2>",
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"_id": "ImLGlzC3AuyT5VMl",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Keine besonderen Auswirkungen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
1,
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "PPQUPOo5JGRkKPXQ",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Die Waffenhand des Angreifers wird geprellt. In der folgenden Runde kann er mit dieser Hand nicht angreifen. Tiere verlieren einen Angriff mit Pranke, Zähnen, Stachel usw.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 20,
|
||||||
|
"range": [
|
||||||
|
11,
|
||||||
|
30
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "IpRVlty1p1it0eMm",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Der Angreifer wird entwaffnet. Die Waffe fliegt vom Angreifer aus gesehen geradlinig um [[1d6–1]] m nach links. Bei waffenlosen Angriffen gibt es keine besonderen Auswirkungen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
31,
|
||||||
|
40
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "fh01DVN6rFKrTdcg",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Der Angreifer wird entwaffnet. Die Waffe fliegt nach rechts (s. 31-40).",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
41,
|
||||||
|
50
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "k1rD7t7YnayTcV9P",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Der Angreifer wird entwaffnet. Die Waffe fliegt nach hinten (s. 31-40).",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
51,
|
||||||
|
60
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "9WFBq8PAy1fFxe4I",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Der Angreifer stürzt zu Boden. Er ist vom Abwehrenden umgestoßen worden oder gestolpert. In einem Handgemenge treten keine besonderen Folgen auf.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 20,
|
||||||
|
"range": [
|
||||||
|
61,
|
||||||
|
80
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "u5kKsW1vnvWvF79s",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Der Angreifer wird leicht verwundet. Er verliert [[1d6]] AP.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 15,
|
||||||
|
"range": [
|
||||||
|
81,
|
||||||
|
95
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "gTvVtavg5GElh0pg",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Der Angreifer wird schwer verwundet. Er erleidet [[1d6]] schweren Schaden.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 4,
|
||||||
|
"range": [
|
||||||
|
96,
|
||||||
|
99
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "507Nvm6dWIlN8Ip1",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "Der Angreifer verliert das Bewusstsein. Er stürzt zu Boden und kommt erst [[1d6]] Runden später wieder zu sich.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 1,
|
||||||
|
"range": [
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"formula": "1d100",
|
||||||
|
"replacement": true,
|
||||||
|
"displayRoll": true,
|
||||||
|
"_id": "JOQf46Cj29MwcKsY"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,163 @@
|
||||||
|
{
|
||||||
|
"name": "Kritischer Fehler bei Angriffen",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"flags": {
|
||||||
|
"exportSource": {
|
||||||
|
"world": "midgard-test",
|
||||||
|
"system": "midgard5",
|
||||||
|
"coreVersion": "0.7.9",
|
||||||
|
"systemVersion": 0.02
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"img": "icons/svg/d20-grey.svg",
|
||||||
|
"description": "<h2>Tabelle 4: Kritische Fehler bei Angriffen</h2>",
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"_id": "dIX62PrnwNTY929l",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Keine besonderen Auswirkungen.</h3>",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
1,
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "IgEkc7L4KlW745gH",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angreifer verliert kurz das Gleichgewicht.</h3>Er braucht etwas Zeit, um wieder kampfbereit zu sein, und kann in der folgenden Runde nicht angreifen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
11,
|
||||||
|
20
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "lXeIddddllhBc5aj",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angreifer lässt seine Waffe fallen.</h3>Sie fällt auf das Feld, auf dem er sich befi ndet. Fäuste, Pranken usw. werden leicht geprellt und können in der folgenden Runde nicht eingesetzt werden.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 15,
|
||||||
|
"range": [
|
||||||
|
21,
|
||||||
|
35
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "hNjE2KIIGCvgcBjf",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Die Angriffswaffe wird zerstört.</h3>Bei magischen Waffen wird 1W6–1 ([[1d6-1]])gewürfelt; die Waffe wird nur zerstört, wenn das Ergebnis über dem höheren der beiden magischen Bonuswerte für Angriff und Schaden liegt. Bei Angriffen mit Fäusten, Zähnen usw. wird der betreffende Körperteil geprellt und kann 10 min lang nicht eingesetzt werden.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 15,
|
||||||
|
"range": [
|
||||||
|
36,
|
||||||
|
50
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "2mW1vM6xy0emVwDM",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angreifer verletzt sich selbst.</h3>Im Nahkampf und Handgemenge mit einer Waffe erleidet er durch seine Ungeschicklichkeit [[1d6–1]] schweren Schaden. Bei Angriffen mit der bloßen Hand und anderen natürlichen Waffen oder mit Wurfwaffen verliert der Angreifer [[1d6–1]] AP durch eine Muskel zerrung und kann eine Runde lang nicht angreifen. Bei einem Bogen- oder Armbrustschuss reißt die Sehne und verletzt den Schützen leicht ([[1d6–1]] AP Verlust). Sie kann in [[1d6+3]] Runden durch eine neue ersetzt werden.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 5,
|
||||||
|
"range": [
|
||||||
|
51,
|
||||||
|
55
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "bd5AxyNFZ2RQ7Aq0",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angreifer trifft aus Versehen die nächststehende befreundete Person.</h3>Er fügt ihr [[1d6–1]] schweren Schaden zu. Befi ndet sich kein Gefährte in Reichweite, hat der Fehler keine Folgen. Kommen mehrere Personen als Opfer in Frage, wird eine von ihnen ausgewürfelt.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 5,
|
||||||
|
"range": [
|
||||||
|
56,
|
||||||
|
60
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "CY9a5ajPDQGns8CN",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angreifer läuft in die Waffe des Gegners hinein.</h3>Der Angegriffene darf sofort außer der Reihe einen zusätzlichen EW:Angriff machen, der nicht abgewehrt werden darf.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
61,
|
||||||
|
70
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "pVHTa2JuXutMDar7",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angreifer verstaucht sich den Fuß.</h3>Seine Bewegungsweite verringert sich für [[2d6]] Runden um ein Drittel. Bei einem Schuss mit Bogen oder Armbrust schlägt die Sehne gegen den Arm des Abenteurers, der dadurch [[1d6–1]] AP verliert und eine Runde lang nicht schießen kann.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 20,
|
||||||
|
"range": [
|
||||||
|
71,
|
||||||
|
90
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "q4hhhMPXWJlmFMY7",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angreifer stolpert und stürzt zu Boden.</h3>Bei Armbrust- oder Bogenschuss reißt stattdessen die Sehne und verletzt den Schützen leicht [[1d6–1]] AP Verlust - s. 51-55). Im Handgemenge hat dieser Wurf dieselben Folgen wie 71-90.<p>51-55</p><p>Der Angreifer trifft aus Versehen die nächststehende befreundete Person. Er fügt ihr [[1d6–1]] schweren Schaden zu. Befi ndet sich kein Gefährte in Reichweite, hat der Fehler keine Folgen. Kommen mehrere Personen als Opfer in Frage, wird eine von ihnen ausgewürfelt. </p><p>71-90</p><p>Der Angreifer verstaucht sich den Fuß.Seine Bewegungsweite verringert sich für [[2d6]] Runden um ein Drittel. Bei einem Schuss mit Bogen oder Armbrust schlägt die Sehne gegen den Arm des Abenteurers, der dadurch [[1d6–1]] AP verliert und eine Runde lang nicht schießen kann.</p>",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 9,
|
||||||
|
"range": [
|
||||||
|
91,
|
||||||
|
99
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "huSeP6mv8OeNYJDj",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angreifer stürzt zu Boden und zerstört dabei seine Waffe</h3>. Bei einem Angriff mit natürlichen Waffen kann der betreffende Körperteil wie bei 36-50 10 min lang nicht eingesetzt werden. Bei einem Angriff mit Schusswaffen fällt der Abenteurer nicht hin.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 1,
|
||||||
|
"range": [
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"formula": "1d100",
|
||||||
|
"replacement": true,
|
||||||
|
"displayRoll": true,
|
||||||
|
"_id": "sVgHbAxseIoeIMz8"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,177 @@
|
||||||
|
{
|
||||||
|
"name": "Kritischer Fehler bei der Abwehr",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"flags": {
|
||||||
|
"exportSource": {
|
||||||
|
"world": "midgard-test",
|
||||||
|
"system": "midgard5",
|
||||||
|
"coreVersion": "0.7.9",
|
||||||
|
"systemVersion": 0.02
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"img": "icons/svg/fire-shield.svg",
|
||||||
|
"description": "<h2>Tabelle 5: Kritischer Fehler bei der Abwehr</h2>",
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"_id": "Xdzk7cvwwnI2i18M",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Keine besonderen Auswirkungen.</h3>",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
1,
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "8xuz2YsB90Z0KbLs",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angegriffene verliert kurz das Gleichgewicht.</h3>Er braucht etwas Zeit, um wieder kampfbereit zu sein, und kann in der folgenden Runde nicht angreifen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
11,
|
||||||
|
20
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "gpzhwQyLX429zUz0",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Die Verteidigungswaffe ist zerstört.</h3>Benutzt der Abenteurer weder Schild noch Parierwaffe, hat dieser Wurf dieselben Folgen wie 81 - 90. Bei magischen Waffen wird 1W6–1 ([[1d6-1]]) gewürfelt; die Waffe wird nur zerstört, wenn das Ergebnis größer als ihr magischer Abwehrbonus ist.<p>81-90</p>Der Verteidiger prallt unglücklich mit seinem Gegner zusammen (Nahkampf und Handgemenge) oder gegen ein Hindernis (Fernkampf) und ist kurzzeitig benommen. Im Nahkampf oder Handgemenge kann er in der folgenden Runde weder angreifen noch abwehren. Sein Gegner leidet unter denselben Folgen - aber nur, wenn ihm ein PW:Gewandtheit misslingt. Im Fernkampf kann der Angegriffene wie bei 61-70 dem nächsten Schuss nicht ausweichen und darf außerdem in dieser und der folgenden Runde nicht mehr angreifen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
21,
|
||||||
|
30
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "Znrv6r6SHSBEclYd",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angegriffene lässt seine Verteidigungswaffe fallen.</h3>Die Waffe fällt ihm zu Füßen. Benutzt er weder Schild noch Parierwaffe, hat dieser Wurf dieselben Folgen wie 41-50.<p>41-50</p>Der Verteidiger wird nach hinten gedrängt (Nahkampf), oder der Schwung seiner Ausweichbewegung reißt ihn mit (Fernkampf). Im Nahkampf bewegt sich der Angegriffene 1 m geradlinig vom Gegner weg, wenn ihn kein massives Hindernis daran hindert - selbst wenn er dadurch in ein Lagerfeuer oder einen Abgrund hineingerät. Der Angreifer kann sofort folgen und den Kontakt aufrechterhalten, wenn er will. Im Fernkampf bewegt sich der Angegriffene von seinem Standort aus um 1 m nach links (bei 1-2 mit [[1d6]]), nach rechts (bei 3-4), nach vorne (5) bzw. nach hinten (6), wenn ihn kein Hindernis daran hindert. Im Handgemenge hat der Wurf dieselben Folgen wie 51-60.<p>51-60</p>Die Sicht des Angegriffenen wird behindert. Er kann in der folgenden Runde nicht angreifen, da er Blut oder Schweiß aus den Augen wischen oder eine verrutschte Kopfbedeckung zurechtrücken muss.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
31,
|
||||||
|
40
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "wLeOWz8B21WCkEwK",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Verteidiger wird nach hinten gedrängt (Nahkampf), oder der Schwung seiner Ausweichbewegung reißt ihn mit (Fernkampf).</h3>Im Nahkampf bewegt sich der Angegriffene 1 m geradlinig vom Gegner weg, wenn ihn kein massives Hindernis daran hindert - selbst wenn er dadurch in ein Lagerfeuer oder einen Abgrund hineingerät. Der Angreifer kann sofort folgen und den Kontakt aufrechterhalten, wenn er will. Im Fernkampf bewegt sich der Angegriffene von seinem Standort aus um 1 m nach links (bei 1-2 mit [[1d6]]), nach rechts (bei 3-4), nach vorne (5) bzw. nach hinten (6), wenn ihn kein Hindernis daran hindert. Im Handgemenge hat der Wurf dieselben Folgen wie 51-60.<p>51-60</p>Die Sicht des Angegriffenen wird behindert. Er kann in der folgenden Runde nicht angreifen, da er Blut oder Schweiß aus den Augen wischen oder eine verrutschte Kopfbedeckung zurechtrücken muss.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
41,
|
||||||
|
50
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "OK1TzYWgPDqvBF6K",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Die Sicht des Angegriffenen wird behindert.</h3>Er kann in der folgenden Runde nicht angreifen, da er Blut oder Schweiß aus den Augen wischen oder eine verrutschte Kopfbedeckung zurechtrücken muss.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
51,
|
||||||
|
60
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "jmWy6vH4NYiGghPE",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Verteidiger gibt sich eine Blöße.</h3>Im Nahkampf oder Handgemenge darf der Angreifer sofort außer der Reihe einen zusätzlichen EW:Angriff machen, der nicht abgewehrt werden darf. Im Fernkampf kann der Angegriffene dem nächsten Schuss oder Wurf (in der laufenden oder folgenden Runde, nicht aber später) nicht ausweichen und daher keinen WW:Abwehr würfeln.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
61,
|
||||||
|
70
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "o6r0hJ0iufMsINa1",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angegriffene verstaucht sich den Fuß.</h3>Die Bewegungsweite verringert sich für [[2d6]] Runden um ein Drittel.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
71,
|
||||||
|
80
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "azc8c9daJPxkmg1P",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Verteidiger prallt unglücklich mit seinem Gegner zusammen (Nahkampf und Handgemenge) oder gegen ein Hindernis (Fernkampf) und ist kurzzeitig benommen.</h3>Im Nahkampf oder Handgemenge kann er in der folgenden Runde weder angreifen noch abwehren. Sein Gegner leidet unter denselben Folgen - aber nur, wenn ihm ein PW:Gewandtheit misslingt. Im Fernkampf kann der Angegriffene wie bei 61-70 dem nächsten Schuss nicht ausweichen und darf außerdem in dieser und der folgenden Runde nicht mehr angreifen.<p>61-70</p>Im Fernkampf kann der Angegriffene dem nächsten Schuss oder Wurf (in der laufenden oder folgenden Runde, nicht aber später) nicht ausweichen und daher keinen WW:Abwehr würfeln.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
81,
|
||||||
|
90
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "fT5NKtySSqN8Yzlu",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angegriffene rutscht aus und stürzt zu Boden.</h3>Im Handgemenge hat dieser Wurf dieselben Folgen wie 61-70.<p>61-70</p>Im Nahkampf oder Handgemenge darf der Angreifer sofort außer der Reihe einen zusätzlichen EW:Angriff machen, der nicht abgewehrt werden darf.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 9,
|
||||||
|
"range": [
|
||||||
|
91,
|
||||||
|
99
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "gxzElw6oBZTjj15Z",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Der Angegriffene stürzt und verliert das Bewusstsein.</h3>Er kommt nach [[1d6]] Runden wieder zu sich.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 1,
|
||||||
|
"range": [
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"formula": "1d100",
|
||||||
|
"replacement": true,
|
||||||
|
"displayRoll": true,
|
||||||
|
"_id": "XKbuKI8F08WdFfWV"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,261 @@
|
||||||
|
{
|
||||||
|
"name": "Kritischer Schaden",
|
||||||
|
"permission": {
|
||||||
|
"default": 2,
|
||||||
|
"CBq5YXAqbO7HoJ03": 3
|
||||||
|
},
|
||||||
|
"flags": {
|
||||||
|
"exportSource": {
|
||||||
|
"world": "midgard-test",
|
||||||
|
"system": "midgard5",
|
||||||
|
"coreVersion": "0.7.9",
|
||||||
|
"systemVersion": 0.02
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"img": "icons/svg/d20-highlight.svg",
|
||||||
|
"description": "<h2>Tabelle 7: Kritischer Schaden</h2><h3>Die Folgen schwerer Verletzungen werden auf S. 63 (Kodex) beschrieben.\nEin Treffer hat besonders schwerwiegende Folgen (mit * markiert), wenn die Lebenspunkteverluste ein Drittel des LP-Maximums übersteigen. \nKostet ein kritischer Treffer das Opfer einschließlich der Zusatzschäden keine LP, richtet er keine längerfristigen Schädenan. Gliedmaßen (+) sind nur geprellt und nach 30 min wieder einsatzbereit. Ein Kopf- oder Wirbelsäulentreffer (++) macht nur wegen Schmerzen 30 min lang handlungsunfähig. Treffer im Gesicht/am Auge haben keine besonderen Auswirkungen.</h3>",
|
||||||
|
"results": [
|
||||||
|
{
|
||||||
|
"_id": "YXyhoVz5EAMuc05m",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>normaler schwerer Schaden</h3>",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
1,
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "jwBN8gCTqMgaPuc4",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>kurzer SchockDas Opfer kann durch den Schock der Verwundung eine Runde lang nicht angreifen.</h3>",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
11,
|
||||||
|
20
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "g1zQk3AHDdlq3sqH",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Rumpftreffer mit Rippenbrüchen</h3>[[1d3]] Rippen des Opfers brechen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 10,
|
||||||
|
"range": [
|
||||||
|
21,
|
||||||
|
30
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "XdF7xn83ChS4Qrzf",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Rumpftreffer mit Gefahr innerer Verletzungen</h3>Das Opfer verliert zusätzlich zum normalen Schaden [[1d6]] LP und AP.<br /><b>*</b>: Schwere innere Verletzungen",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 5,
|
||||||
|
"range": [
|
||||||
|
31,
|
||||||
|
35
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "UjqhkUyUaBZ7n6CC",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>schwere Verletzung der Wirbelsäule <b>++</b></h3>Nur ein wuchtiger Hieb, z.B. mit einer Schlagwaffe, einer zweihändigen Hiebwaffe, einem Morgenstern, einem Kampfstab oder mit einer Pranke, richtet diese Art von kritischem Schaden an. Treffer mit anderen Waffen verursachen normalen schweren Schaden.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 5,
|
||||||
|
"range": [
|
||||||
|
36,
|
||||||
|
40
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "W7yzr5lC0z5NDt77",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>schwere Verletzung am rechten Arm <b>+</b></h3><b>*</b>: Mit 20% wird der Arm abgetrennt (bei einer Waffe mit Schneide) oder dauerhaft verkrüppelt. Mit Armschutz führt auch der Treffer mit einer scharfen Waffe nicht zum Abtrennen, sondern nur zur Verkrüppelung des Armes. Treffer mit Stich-, Wurf- oder Schusswaffen haben keine derart schwerwiegenden Auswirkungen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 7,
|
||||||
|
"range": [
|
||||||
|
41,
|
||||||
|
47
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "1dFkXxy7VhtSbahw",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>schwere Verletzung am linken Arm <b>+</b></h3><b>*</b>: Mit 20% wird der Arm abgetrennt (bei einer Waffe mit Schneide) oder dauerhaft verkrüppelt. Mit Armschutz führt auch der Treffer mit einer scharfen Waffe nicht zum Abtrennen, sondern nur zur Verkrüppelung des Armes. Treffer mit Stich-, Wurf- oder Schusswaffen haben keine derart schwerwiegenden Auswirkungen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 8,
|
||||||
|
"range": [
|
||||||
|
48,
|
||||||
|
55
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "CiAwKT1ZhOGKplBr",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>schwere Verletzung am rechten Bein <b>+</b></h3><b>*</b>: Mit 20% wird das Bein abgetrennt (ohne Beinschutz bei einer Waffe mit Schneide) oder dauerhaft verkrüppelt. Treffer mit Stich-, Wurf- oder Schusswaffen haben keine derart schwerwiegenden Auswirkungen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 9,
|
||||||
|
"range": [
|
||||||
|
56,
|
||||||
|
64
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "PZa6plWsSiQFmu5c",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>schwere Verletzung am linken Bein <b>+</b></h3><b>*</b>: Mit 20% wird das Bein abgetrennt (ohne Beinschutz bei einer Waffe mit Schneide) oder dauerhaft verkrüppelt. Treffer mit Stich-, Wurf- oder Schusswaffen haben keine derart schwerwiegenden Auswirkungen.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 9,
|
||||||
|
"range": [
|
||||||
|
65,
|
||||||
|
73
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "5xXKfpkaOap9WV0o",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>schwerer Kopftreffer <b>++</b></h3>Helmlose Opfer verlieren zusätzlich zum normalen Schaden [[1d3]] LP und AP.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 7,
|
||||||
|
"range": [
|
||||||
|
74,
|
||||||
|
80
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "5OTWkWQxchPs6SQI",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Treffer im Gesicht</h3>Das Aussehen des Getroffenen sinkt durch eine entstellende Narbe dauerhaft um ein Zehntel (mindestens aber um 1). Der Träger eines Helms mit Visier ist vor dieser Art von Schaden sicher.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 5,
|
||||||
|
"range": [
|
||||||
|
81,
|
||||||
|
85
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "GaZZENfKk81MI1IK",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Kopftreffer mit Hörschaden <b><++></b></h3>Helmlose Opfer verlieren zusätzlich zum normalen Schaden [[1d3]] LP und AP. Zusätzlich schwere Verletzung am Ohr. Helmträger sind vor dieser Art von Schaden sicher.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 4,
|
||||||
|
"range": [
|
||||||
|
86,
|
||||||
|
89
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "OsfxiUi4dg0RM9XV",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Augenverletzung</h3>Der Träger eines Helms mit Visier ist vor dieser Art von Schaden sicher.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 4,
|
||||||
|
"range": [
|
||||||
|
90,
|
||||||
|
93
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "TGtUlGPANVjZLgZH",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Halstreffer</h3><b>*</b>: Eine spitze oder scharfe Waffe verletzt die Halsschlagader. Eine stumpfe Waffe verursacht eine schwere Halswirbelverletzung.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 3,
|
||||||
|
"range": [
|
||||||
|
94,
|
||||||
|
96
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "98WnvS1A35Vr0rOv",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>schwere Schädelverletzung <b>++</b></h3>Helmlose Opfer verlieren zusätzlich zum normalen Schaden [[1d6]] LP und AP. Fällt das Opfer ins Koma, sinkt seine Intelligenz durch Hirnschäden dauerhaft um ein Zehntel (mindestens aber um 1).",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 1,
|
||||||
|
"range": [
|
||||||
|
97,
|
||||||
|
97
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "8g1FJIsxKFVWvyxe",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>Augenverlust</h3>Bei einem Treffer mit einer scharfen oder spitzen Waffe oder einer Schusswaffe verliert das Opfer ein Auge. Der Träger eines Helms mit Visier ist vor dieser Art von Schaden sicher.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 2,
|
||||||
|
"range": [
|
||||||
|
98,
|
||||||
|
99
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "U1SXJI4yzfzcQM01",
|
||||||
|
"flags": {},
|
||||||
|
"type": 0,
|
||||||
|
"text": "<h3>tödlicher Treffer</h3>Ein Treffer ins Herz, an der Kehle usw. tötet den Getroffenen augenblicklich.",
|
||||||
|
"img": "icons/svg/d20-black.svg",
|
||||||
|
"resultId": "",
|
||||||
|
"weight": 1,
|
||||||
|
"range": [
|
||||||
|
100,
|
||||||
|
100
|
||||||
|
],
|
||||||
|
"drawn": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"formula": "1d100",
|
||||||
|
"replacement": true,
|
||||||
|
"displayRoll": true,
|
||||||
|
"_id": "cQX6GAYWErokE8ks"
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,10 @@
|
||||||
|
import assert from "assert"
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "midgard5",
|
||||||
|
isModule: false, // If you are developing a system rather than a module, change this to false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pop some fairly universal types that we might use
|
||||||
|
|
||||||
|
export type Pair<T> = [string, T];
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
import Globals from "./Globals"
|
||||||
|
|
||||||
|
const preloadTemplates = async (): Promise<Handlebars.TemplateDelegate<any>[]> => {
|
||||||
|
const rootPath = `${Globals.isModule ? "modules" : "systems"}/${Globals.name}/templates/`
|
||||||
|
// Place relative paths in array below, e.g.:
|
||||||
|
// const templates = [ rootPath + "actor/actor-sheet.hbs" ]
|
||||||
|
// This would map to our local folder of /Assets/Templates/Actor/actor-sheet.hbs
|
||||||
|
const templates: Array<string> = [
|
||||||
|
"sheets/character/base_values.hbs",
|
||||||
|
"sheets/character/skills.hbs"
|
||||||
|
]
|
||||||
|
return loadTemplates(templates.map(s => rootPath + s))
|
||||||
|
}
|
||||||
|
|
||||||
|
export default preloadTemplates
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
import Logger from "./utils/Logger"
|
||||||
|
import M5ItemSheet from "./module/sheets/M5ItemSheet"
|
||||||
|
import M5CharacterSheet from "./module/sheets/M5CharacterSheet"
|
||||||
|
import preloadTemplates from "./PreloadTemplates"
|
||||||
|
import M5Character from "./module/actors/M5Character"
|
||||||
|
|
||||||
|
Hooks.once("init", async () => {
|
||||||
|
Logger.log("M5 | Initialisierung Midgard 5")
|
||||||
|
|
||||||
|
Handlebars.registerHelper("localizeMidgard", (str: string) => {
|
||||||
|
const template = Handlebars.compile("{{localize value}}")
|
||||||
|
return template({
|
||||||
|
value: "midgard5." + str
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// Default Sheet für Items definieren und das Standardsheet deaktivieren
|
||||||
|
Items.unregisterSheet("core", ItemSheet)
|
||||||
|
Items.registerSheet("midgard5", M5ItemSheet, { makeDefault: true })
|
||||||
|
|
||||||
|
// Default Sheet für Actors definieren und das Standardsheet deaktivieren
|
||||||
|
Actors.unregisterSheet("core", ActorSheet)
|
||||||
|
Actors.registerSheet("midgard5", M5CharacterSheet, { makeDefault: true })
|
||||||
|
|
||||||
|
CONFIG.Actor.documentClass = M5Character
|
||||||
|
|
||||||
|
//RegisterSettings();
|
||||||
|
await preloadTemplates()
|
||||||
|
})
|
||||||
|
|
||||||
|
Hooks.once("setup", () => {
|
||||||
|
Logger.log("Template module is being setup.")
|
||||||
|
})
|
||||||
|
|
||||||
|
Hooks.once("ready", () => {
|
||||||
|
Logger.Ok("Template module is now ready.")
|
||||||
|
})
|
||||||
|
|
@ -0,0 +1,188 @@
|
||||||
|
|
||||||
|
export interface M5Skill {
|
||||||
|
label: string
|
||||||
|
skill: string
|
||||||
|
attribute: string
|
||||||
|
fw: number
|
||||||
|
ew: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface M5Attribute {
|
||||||
|
value: number
|
||||||
|
bonus: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface M5CharacterCalculatedData {
|
||||||
|
level: number,
|
||||||
|
stats: {
|
||||||
|
armor: number,
|
||||||
|
defense: number,
|
||||||
|
damageBonus: number,
|
||||||
|
attackBonus: number,
|
||||||
|
defenseBonus: number,
|
||||||
|
movementBonus: number,
|
||||||
|
resistanceMind: number,
|
||||||
|
resistanceBody: number,
|
||||||
|
spellCasting: number,
|
||||||
|
brawl: number,
|
||||||
|
poisonResistance: number,
|
||||||
|
enduranceBonus: number
|
||||||
|
},
|
||||||
|
skills: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class M5Character extends Actor {
|
||||||
|
|
||||||
|
// constructor(
|
||||||
|
// data: ConstructorParameters<typeof foundry.documents.BaseActor>[0],
|
||||||
|
// context?: ConstructorParameters<typeof foundry.documents.BaseActor>[1]
|
||||||
|
// ) {
|
||||||
|
// super(data, context)
|
||||||
|
// this.prepareDerivedData()
|
||||||
|
// }
|
||||||
|
|
||||||
|
static attributeMinMax(attribute: M5Attribute) {
|
||||||
|
return Math.min(100, Math.max(0, attribute.value + attribute.bonus))
|
||||||
|
}
|
||||||
|
|
||||||
|
static attributeBonus(attribute: M5Attribute) {
|
||||||
|
const value = this.attributeMinMax(attribute)
|
||||||
|
if (value > 95)
|
||||||
|
return 2
|
||||||
|
if (value > 80)
|
||||||
|
return 1
|
||||||
|
if (value > 20)
|
||||||
|
return 0
|
||||||
|
if (value > 5)
|
||||||
|
return -1
|
||||||
|
return -2
|
||||||
|
}
|
||||||
|
|
||||||
|
prepareDerivedData() {
|
||||||
|
const context = (this as any).data;
|
||||||
|
//console.log(context)
|
||||||
|
|
||||||
|
context.data.calc = {
|
||||||
|
level: 0,
|
||||||
|
stats: {
|
||||||
|
armor: 0,
|
||||||
|
defense: 0,
|
||||||
|
damageBonus: 0,
|
||||||
|
attackBonus: 0,
|
||||||
|
defenseBonus: 0,
|
||||||
|
movementBonus: 0,
|
||||||
|
resistanceMind: 0,
|
||||||
|
resistanceBody: 0,
|
||||||
|
spellCasting: 0,
|
||||||
|
brawl: 0,
|
||||||
|
poisonResistance: 0,
|
||||||
|
enduranceBonus: 0
|
||||||
|
},
|
||||||
|
skills: {}
|
||||||
|
} as M5CharacterCalculatedData
|
||||||
|
|
||||||
|
const data = context.data
|
||||||
|
const st = M5Character.attributeMinMax(data.attributes.st)
|
||||||
|
const gs = M5Character.attributeMinMax(data.attributes.gs)
|
||||||
|
const gw = M5Character.attributeMinMax(data.attributes.gw)
|
||||||
|
const ko = M5Character.attributeMinMax(data.attributes.ko)
|
||||||
|
|
||||||
|
const calc = context.data.calc as M5CharacterCalculatedData
|
||||||
|
calc.level = M5Character.levelFromExp(data.es)
|
||||||
|
calc.stats.armor = 0
|
||||||
|
calc.stats.defense = M5Character.defenseFromLevel(calc.level)
|
||||||
|
calc.stats.damageBonus = Math.floor(st/20) + Math.floor(gs/30) - 3
|
||||||
|
calc.stats.attackBonus = M5Character.attributeBonus(data.attributes.gs)
|
||||||
|
calc.stats.defenseBonus = M5Character.attributeBonus(data.attributes.gw)
|
||||||
|
calc.stats.movementBonus = 0
|
||||||
|
calc.stats.resistanceMind = calc.stats.defense
|
||||||
|
calc.stats.resistanceBody = calc.stats.defense + 1
|
||||||
|
calc.stats.spellCasting = M5Character.spellCastingFromLevel(calc.level) + M5Character.attributeBonus(data.attributes.zt)
|
||||||
|
calc.stats.brawl = Math.floor((st + gw) / 20)
|
||||||
|
calc.stats.poisonResistance = 30 + Math.floor(ko / 2)
|
||||||
|
calc.stats.enduranceBonus = Math.floor(ko/10) + Math.floor(st/20)
|
||||||
|
}
|
||||||
|
|
||||||
|
static readonly levelThreshold: Array<number> = [0, 100, 250, 500, 750, 1000, 1250, 1500, 1750, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 6000, 7000, 8000, 9000, 10000, 12500, 15000, 17500, 20000, 22500, 25000, 30000, 35000, 40000, 45000, 50000, 55000, 60000, 65000, 70000, 75000, 80000, 85000, 90000, 95000, 100000, 105000, 110000, 115000, 120000, 125000, 130000, 135000, 140000, 145000, 150000, 155000, 160000, 165000, 170000, 175000, 180000, 185000, 190000, 195000, 200000, 205000, 210000, 215000, 220000, 225000, 230000, 235000, 240000, 245000, 250000, 255000, 260000, 265000, 270000, 275000, 280000]
|
||||||
|
static levelFromExp(exp: number): number {
|
||||||
|
const ret = M5Character.levelThreshold.findIndex(val => val > exp)
|
||||||
|
return ret === -1 ? M5Character.levelThreshold.length : ret
|
||||||
|
}
|
||||||
|
|
||||||
|
static readonly defenseThreshold: Array<[number, number]> = [
|
||||||
|
[1, 11],
|
||||||
|
[2, 12],
|
||||||
|
[5, 13],
|
||||||
|
[10, 14],
|
||||||
|
[15, 15],
|
||||||
|
[20, 16],
|
||||||
|
[25, 17],
|
||||||
|
[30, 18]
|
||||||
|
]
|
||||||
|
static defenseFromLevel(lvl: number): number {
|
||||||
|
const ret = M5Character.defenseThreshold.find(val => val[0] >= lvl)
|
||||||
|
return ret ? ret[1] : M5Character.defenseThreshold[M5Character.defenseThreshold.length - 1][1]
|
||||||
|
}
|
||||||
|
|
||||||
|
static readonly spellCastingThreshold: Array<[number, number]> = [
|
||||||
|
[1, 11],
|
||||||
|
[2, 12],
|
||||||
|
[4, 13],
|
||||||
|
[6, 14],
|
||||||
|
[8, 15],
|
||||||
|
[10, 16],
|
||||||
|
[15, 17],
|
||||||
|
[20, 18]
|
||||||
|
]
|
||||||
|
static spellCastingFromLevel(lvl: number): number {
|
||||||
|
const ret = M5Character.spellCastingThreshold.find(val => val[0] >= lvl)
|
||||||
|
return ret ? ret[1] : M5Character.spellCastingThreshold[M5Character.spellCastingThreshold.length - 1][1]
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeStrength() {
|
||||||
|
const data = (this as any).data.data
|
||||||
|
return M5Character.attributeMinMax(data.data.attributes.st)
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeDexterity() {
|
||||||
|
const data = (this as any).data.data
|
||||||
|
return M5Character.attributeMinMax(data.data.attributes.gs)
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeAgility() {
|
||||||
|
const data = (this as any).data.data
|
||||||
|
return M5Character.attributeMinMax(data.data.attributes.gw)
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeConstitution() {
|
||||||
|
const data = (this as any).data.data
|
||||||
|
return M5Character.attributeMinMax(data.data.attributes.ko)
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeIntelligence() {
|
||||||
|
const data = (this as any).data.data
|
||||||
|
return M5Character.attributeMinMax(data.data.attributes.in)
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeMagic() {
|
||||||
|
const data = (this as any).data.data
|
||||||
|
return M5Character.attributeMinMax(data.data.attributes.zt)
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeBeauty() {
|
||||||
|
const data = (this as any).data.data
|
||||||
|
return M5Character.attributeMinMax(data.data.attributes.au)
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeCharisma() {
|
||||||
|
const data = (this as any).data.data
|
||||||
|
return M5Character.attributeMinMax(data.data.attributes.pa)
|
||||||
|
}
|
||||||
|
|
||||||
|
attributeWillpower() {
|
||||||
|
const data = (this as any).data.data
|
||||||
|
return M5Character.attributeMinMax(data.data.attributes.wk)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
import Logger from "../../utils/Logger"
|
||||||
|
import M5Character, { M5Attribute } from "../actors/M5Character"
|
||||||
|
|
||||||
|
export default class M5CharacterSheet extends ActorSheet {
|
||||||
|
|
||||||
|
static get defaultOptions() {
|
||||||
|
return mergeObject(super.defaultOptions, {
|
||||||
|
template: "systems/midgard5/templates/sheets/character/main.hbs",
|
||||||
|
width: 600,
|
||||||
|
height: 400,
|
||||||
|
classes: ["midgard5", "sheet", "character"],
|
||||||
|
tabs: [{ navSelector: ".sheet-navigation", contentSelector: ".sheet-content", initial: "base_values" }]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// get template() {
|
||||||
|
// return "systems/midgard5/templates/character_sheet/main.hbs"
|
||||||
|
// }Options extends ActorSheet.Options = ActorSheet.Options, Data extends object = ActorSheet.Data<Options>
|
||||||
|
|
||||||
|
override getData(options?: Partial<ActorSheet.Options>): ActorSheet.Data<ActorSheet.Options> | Promise<ActorSheet.Data<ActorSheet.Options>> {
|
||||||
|
const actor = this.actor as M5Character
|
||||||
|
//console.log("Sheet getData", (actor as any).data)
|
||||||
|
return Promise.resolve(super.getData(options)).then(context => {
|
||||||
|
actor.prepareDerivedData()
|
||||||
|
|
||||||
|
const actorData = (actor as any).data.toObject(false)
|
||||||
|
context.actor = actorData;
|
||||||
|
context.data = actorData.data;
|
||||||
|
|
||||||
|
//console.log("Sheet Promise", context)
|
||||||
|
return context
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
override activateListeners(html: JQuery) {
|
||||||
|
super.activateListeners(html)
|
||||||
|
|
||||||
|
html.find(".roll-button").on("click", async (event) => {
|
||||||
|
const row = event.target.parentElement
|
||||||
|
let skillName = row.dataset["skill"]
|
||||||
|
|
||||||
|
const actor = this.actor as M5Character
|
||||||
|
const context = this.actor.data
|
||||||
|
const data = context.data
|
||||||
|
|
||||||
|
const skill = data.skills.general[skillName]
|
||||||
|
const attribute = data.attributes[skill.attribute]
|
||||||
|
console.log(skill, attribute)
|
||||||
|
|
||||||
|
const r = new Roll("1d20 + @fw + @bonus", {
|
||||||
|
fw: skill.fw + 12,
|
||||||
|
bonus: M5Character.attributeBonus(attribute)
|
||||||
|
})
|
||||||
|
await r.evaluate().then(value => {
|
||||||
|
const skillLocalized = (game as Game).i18n.localize("midgard5." + skillName)
|
||||||
|
const chatString = skillLocalized + ": " + value.result + " = " + value.total
|
||||||
|
//console.log(chatString)
|
||||||
|
|
||||||
|
const speaker = ChatMessage.getSpeaker({actor: actor})
|
||||||
|
let chatData = { content: (game as Game).i18n.format(chatString, {name: (actor as any).name}), speaker }
|
||||||
|
ChatMessage.applyRollMode(chatData, (r.options as any).rollMode)
|
||||||
|
return ChatMessage.create(chatData)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
export default class M5ItemSheet extends ItemSheet {
|
||||||
|
|
||||||
|
static get defaultOptions() {
|
||||||
|
return mergeObject(super.defaultOptions, {
|
||||||
|
width: 530,
|
||||||
|
height: 340,
|
||||||
|
classes: ["midgard5", "sheet", "item"]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
get template() {
|
||||||
|
return 'systems/midgard5/templates/sheets/m5Item-Sheet.hbs';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
// main: midgard5.less
|
||||||
|
|
||||||
|
.midgard5 {
|
||||||
|
.flexrow {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sheet.character {
|
||||||
|
form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sheet-content {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.editor {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-img {
|
||||||
|
height: 64px;
|
||||||
|
width: 64px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
flex: 0 0 100%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.level-display {
|
||||||
|
text-align: right;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"name": "midgard5",
|
||||||
|
"title": "Midgard 5. Edition",
|
||||||
|
"description": "The German RPG Midgard 5. Edition",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"minimumCoreVersion": "0.8.9",
|
||||||
|
"compatibleCoreVersion": "9",
|
||||||
|
"templateVersion": 3,
|
||||||
|
"author": "Hans-Joachim Maier, Michael Stein",
|
||||||
|
"scripts": ["bundle.js"],
|
||||||
|
"styles": ["bundle.css"],
|
||||||
|
"packs": [
|
||||||
|
{
|
||||||
|
"name": "blaupause-spielfiguren",
|
||||||
|
"label": "Blaupausen für Spielfiguren",
|
||||||
|
"path": "./packs/actors/blaupause-spielfiguren.db",
|
||||||
|
"type": "Actor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blaupause-gegenstaende",
|
||||||
|
"label": "Blaupausen für Gegenstände",
|
||||||
|
"path": "./packs/actors/blaupause-gegenstaende.db",
|
||||||
|
"type": "Item"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tabellen-kritische-ereignisse",
|
||||||
|
"label": "Tabellen Kritische Ereignisse",
|
||||||
|
"path": "./packs/rolltables/tabellen-kritische-ereignisse.db",
|
||||||
|
"type": "RollTable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "makros-kritische-ereignisse",
|
||||||
|
"label": "Makros Kritische Ereignisse",
|
||||||
|
"path": "./packs/macros/makros-kritische-ereignisse.db",
|
||||||
|
"type": "Macro"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "makros-standardwurfel",
|
||||||
|
"label": "Standardwürfel",
|
||||||
|
"path": "./packs/macros/makros-standardwurfel.db",
|
||||||
|
"type": "Macro"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "scenes-midgard-karten",
|
||||||
|
"label": "Midgard-Karten",
|
||||||
|
"path": "./packs/scenes/scenes-midgard-karten.db",
|
||||||
|
"type": "Scene"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"languages": [
|
||||||
|
{
|
||||||
|
"lang": "de",
|
||||||
|
"name": "Deutsch",
|
||||||
|
"path": "lang/de.json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"gridDistance": 1,
|
||||||
|
"gridUnits": "m",
|
||||||
|
"primaryTokenAttribute": "lp",
|
||||||
|
"secondaryTokenAttribute": "ap",
|
||||||
|
"url": "https://github.com/hjmaier/midgard5",
|
||||||
|
"manifest": "https://raw.githubusercontent.com/hjmaier/midgard5/main/system.json",
|
||||||
|
"download": "https://github.com/hjmaier/midgard5/archive/V0.06h.zip",
|
||||||
|
"initiative": "@gw.value + @gw.bonus",
|
||||||
|
"license": "LICENSE.txt"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,189 @@
|
||||||
|
{
|
||||||
|
"Actor": {
|
||||||
|
"types": ["npc", "character"],
|
||||||
|
"templates": {
|
||||||
|
"characterDescription": {
|
||||||
|
"info": {
|
||||||
|
"description": "",
|
||||||
|
"class": "",
|
||||||
|
"race": "",
|
||||||
|
"magic_using": false,
|
||||||
|
"gender": "",
|
||||||
|
"weight": "",
|
||||||
|
"height": "",
|
||||||
|
"shape": "",
|
||||||
|
"age": "",
|
||||||
|
"caste": "",
|
||||||
|
"occupation": "",
|
||||||
|
"origin": "",
|
||||||
|
"faith": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"characterBars": {
|
||||||
|
"lp": {
|
||||||
|
"value": 15,
|
||||||
|
"min": 0,
|
||||||
|
"max": 15
|
||||||
|
},
|
||||||
|
"ap": {
|
||||||
|
"value": 20,
|
||||||
|
"min": 0,
|
||||||
|
"max": 20
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"characterHeader": {
|
||||||
|
"es": 0,
|
||||||
|
"ep": 0,
|
||||||
|
"gg": 0,
|
||||||
|
"sg": 0,
|
||||||
|
"gp": 2
|
||||||
|
},
|
||||||
|
"attributes": {
|
||||||
|
"attributes": {
|
||||||
|
"st": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"gs": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"gw": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"ko": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"in": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"zt": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"au": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"pa": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
},
|
||||||
|
"wk": {
|
||||||
|
"value": 50,
|
||||||
|
"bonus": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"skills": {
|
||||||
|
"preferredCombatSkill": "",
|
||||||
|
"learned": [],
|
||||||
|
"general": {
|
||||||
|
"akrobatik": { "fw": 0, "attribute": "gw" },
|
||||||
|
"alchimie": { "fw": 0, "attribute": "in" },
|
||||||
|
"anfuehren": { "fw": 0, "attribute": "pa" },
|
||||||
|
"athletik": { "fw": 0, "attribute": "st" },
|
||||||
|
"balancieren": { "fw": 0, "attribute": "gw" },
|
||||||
|
"beidhaendigerKampf": { "fw": 0, "attribute": "gs" },
|
||||||
|
"beredsamkeit": { "fw": 0, "attribute": "pa" },
|
||||||
|
"betaeuben": { "fw": 0, "attribute": "gs" },
|
||||||
|
"bootfahren": { "fw": 0, "attribute": "gs" },
|
||||||
|
"ersteHilfe": { "fw": 0, "attribute": "gs" },
|
||||||
|
"etikette": { "fw": 0, "attribute": "in" },
|
||||||
|
"fallenEntdecken": { "fw": 0, "attribute": "in" },
|
||||||
|
"fallenmechanik": { "fw": 0, "attribute": "gs" },
|
||||||
|
"faelschen": { "fw": 0, "attribute": "gs" },
|
||||||
|
"fechten": { "fw": 0, "attribute": "gs" },
|
||||||
|
"gassenwissen": { "fw": 0, "attribute": "in" },
|
||||||
|
"gaukeln": { "fw": 0, "attribute": "gs" },
|
||||||
|
"gelaendelauf": { "fw": 0, "attribute": "gw" },
|
||||||
|
"geraetekunde": { "fw": 0, "attribute": "in" },
|
||||||
|
"geschaeftssinn": { "fw": 0, "attribute": "in" },
|
||||||
|
"gluecksspiel": { "fw": 0, "attribute": "gs" },
|
||||||
|
"heilkunde": { "fw": 0, "attribute": "in" },
|
||||||
|
"kampfInVollruestung": { "fw": 0, "attribute": "st" },
|
||||||
|
"klettern": { "fw": 0, "attribute": "st" },
|
||||||
|
"landeskunde": { "fw": 0, "attribute": "in" },
|
||||||
|
"laufen": { "fw": 0, "attribute": "ko" },
|
||||||
|
"lesenVonZauberschrift": { "fw": 0, "attribute": "in" },
|
||||||
|
"meditieren": { "fw": 0, "attribute": "wk" },
|
||||||
|
"menschenkenntnis": { "fw": 0, "attribute": "in" },
|
||||||
|
"meucheln": { "fw": 0, "attribute": "gs" },
|
||||||
|
"musizieren": { "fw": 0, "attribute": "gs" },
|
||||||
|
"naturkunde": { "fw": 0, "attribute": "in" },
|
||||||
|
"pflanzenkunde": { "fw": 0, "attribute": "in" },
|
||||||
|
"reiten": { "fw": 0, "attribute": "gw" },
|
||||||
|
"reiterkampf": { "fw": 0, "attribute": "gw" },
|
||||||
|
"scharfschiessen": { "fw": 0, "attribute": "gs" },
|
||||||
|
"schleichen": { "fw": 0, "attribute": "gw" },
|
||||||
|
"schloesserOeffnen": { "fw": 0, "attribute": "gs" },
|
||||||
|
"schwimmen": { "fw": 0, "attribute": "gw" },
|
||||||
|
"seilkunst": { "fw": 0, "attribute": "gs" },
|
||||||
|
"spurensuche": { "fw": 0, "attribute": "in" },
|
||||||
|
"stehlen": { "fw": 0, "attribute": "gs" },
|
||||||
|
"tarnen": { "fw": 0, "attribute": "gw" },
|
||||||
|
"tauchen": { "fw": 0, "attribute": "ko" },
|
||||||
|
"tierkunde": { "fw": 0, "attribute": "in" },
|
||||||
|
"ueberleben": { "fw": 0, "attribute": "in" },
|
||||||
|
"verfuehren": { "fw": 0, "attribute": "pa" },
|
||||||
|
"verhoeren": { "fw": 0, "attribute": "pa" },
|
||||||
|
"verstellen": { "fw": 0, "attribute": "pa" },
|
||||||
|
"wagenlenken": { "fw": 0, "attribute": "gs" },
|
||||||
|
"zauberkunde": { "fw": 0, "attribute": "in" }
|
||||||
|
},
|
||||||
|
"combat": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"character": {
|
||||||
|
"templates": ["characterBars", "attributes", "characterDescription", "characterHeader", "skills"]
|
||||||
|
},
|
||||||
|
"npc": {
|
||||||
|
"templates": ["characterBars", "attributes", "characterDescription"]
|
||||||
|
},
|
||||||
|
"vehicle": {
|
||||||
|
"templates": ["characterBars", "attributes"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Item": {
|
||||||
|
"types": ["item", "weapon", "armor", "spell"],
|
||||||
|
"templates": {
|
||||||
|
"itemDescription": {
|
||||||
|
"description": " "
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"damageBonus": 0,
|
||||||
|
"attackBonus": 0,
|
||||||
|
"defenseBonus": 0,
|
||||||
|
"movementBonus": 0,
|
||||||
|
"resistanceMind": 0,
|
||||||
|
"resistanceBody": 0,
|
||||||
|
"spellBonus": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"item": {
|
||||||
|
"templates": ["itemDescription"],
|
||||||
|
"quantity": 1,
|
||||||
|
"value": 0,
|
||||||
|
"magic": false,
|
||||||
|
"onbody": false,
|
||||||
|
"attributes": {},
|
||||||
|
"groups": {}
|
||||||
|
},
|
||||||
|
"weapon": {
|
||||||
|
"templates": ["itemDescription", "stats"],
|
||||||
|
"skill": ""
|
||||||
|
},
|
||||||
|
"armor": {
|
||||||
|
"templates": ["itemDescription", "stats"],
|
||||||
|
"skill": ""
|
||||||
|
},
|
||||||
|
"spell": {
|
||||||
|
"templates": ["itemDescription"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
import Globals from "../Globals";
|
||||||
|
import Color from "color";
|
||||||
|
|
||||||
|
class Logger {
|
||||||
|
// static class
|
||||||
|
private constructor() {}
|
||||||
|
|
||||||
|
private static GetCurrentTime(): string {
|
||||||
|
return `[${(new Date().toLocaleTimeString())}] `;
|
||||||
|
}
|
||||||
|
|
||||||
|
static log(str: string, colour: Color = Color("white"), bold = false): void {
|
||||||
|
const time = ToConsole(Logger.GetCurrentTime(), Color("gray"), false)
|
||||||
|
const moduleName = ToConsole(Globals.name + " ", Color("cyan"), true);
|
||||||
|
const text = ToConsole(str, colour, bold);
|
||||||
|
console.log(time.str + moduleName.str + text.str, ...time.params.concat(moduleName.params, text.params));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Err(str: string): void {
|
||||||
|
Logger.log(str, Color("orange"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Warn(str: string): void {
|
||||||
|
Logger.log(str, Color("yellow"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Ok(str: string): void {
|
||||||
|
Logger.log(str, Color("green"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ConsoleColour {
|
||||||
|
str: string,
|
||||||
|
params: Array<string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ToConsole = (str: string, col: Color, bold: boolean): ConsoleColour => {
|
||||||
|
return {
|
||||||
|
str: `%c` + str + `%c`,
|
||||||
|
params: [
|
||||||
|
"color: " + col.hex() + ";" + (bold ? "font-weight: bold;" : ""),
|
||||||
|
"color: unset; font-weight: unset;"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Logger;
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
import {ModuleData} from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/packages.mjs";
|
||||||
|
import Globals from "../Globals";
|
||||||
|
|
||||||
|
export const getModuleInformation = async (): Promise<ModuleData> => {
|
||||||
|
const systemOrModule = Globals.isModule ? "module" : "system"
|
||||||
|
const module = await fetch(systemOrModule + "s/" + Globals.name + "/" + systemOrModule + ".json")
|
||||||
|
return await module.json();
|
||||||
|
};
|
||||||
64
system.json
64
system.json
|
|
@ -1,64 +0,0 @@
|
||||||
{
|
|
||||||
"name": "midgard5",
|
|
||||||
"title": "Midgard 5. Edition",
|
|
||||||
"description": "The German RPG Midgard 5. Edition",
|
|
||||||
"version": 0.06,
|
|
||||||
"minimumCoreVersion": "0.7.9",
|
|
||||||
"compatibleCoreVersion": "0.7.9",
|
|
||||||
"templateVersion": 2,
|
|
||||||
"author": "Hans-Joachim Maier",
|
|
||||||
"esmodules": [
|
|
||||||
"midgard5.js"
|
|
||||||
],
|
|
||||||
"styles": [
|
|
||||||
"midgard5.css"
|
|
||||||
],
|
|
||||||
"packs": [
|
|
||||||
{
|
|
||||||
"name": "blaupause-spielfiguren",
|
|
||||||
"label": "Blaupausen für Spielfiguren",
|
|
||||||
"path": "./packs/actors/blaupause-spielfiguren.db",
|
|
||||||
"entity": "Actor"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "tabellen-kritische-ereignisse",
|
|
||||||
"label": "Tabellen Kritische Ereignisse",
|
|
||||||
"path": "./packs/rolltables/tabellen-kritische-ereignisse.db",
|
|
||||||
"entity": "RollTable"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "makros-kritische-ereignisse",
|
|
||||||
"label": "Makros Kritische Ereignisse",
|
|
||||||
"path": "./packs/macros/makros-kritische-ereignisse.db",
|
|
||||||
"entity": "Macro"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "makros-standardwurfel",
|
|
||||||
"label": "Standardwürfel",
|
|
||||||
"path": "./packs/macros/makros-standardwurfel.db",
|
|
||||||
"entity": "Macro"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "scenes-midgard-karten",
|
|
||||||
"label": "Midgard-Karten",
|
|
||||||
"path": "./packs/scenes/scenes-midgard-karten.db",
|
|
||||||
"entity": "Scene"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"languages": [
|
|
||||||
{
|
|
||||||
"lang": "de",
|
|
||||||
"name": "Deutsch",
|
|
||||||
"path": "lang/de.json"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"gridDistance": 1,
|
|
||||||
"gridUnits": "m",
|
|
||||||
"primaryTokenAttribute": "lp",
|
|
||||||
"secondaryTokenAttribute": "ap",
|
|
||||||
"url": "https://github.com/hjmaier/midgard5",
|
|
||||||
"manifest": "https://raw.githubusercontent.com/hjmaier/midgard5/main/system.json",
|
|
||||||
"download": "https://github.com/hjmaier/midgard5/archive/V0.06h.zip",
|
|
||||||
"initiative": "@gw.value + @gw.bonus",
|
|
||||||
"license": "LICENSE.txt"
|
|
||||||
}
|
|
||||||
116
template.json
116
template.json
|
|
@ -1,116 +0,0 @@
|
||||||
{
|
|
||||||
"Actor":{
|
|
||||||
"types":[
|
|
||||||
"npc",
|
|
||||||
"character"
|
|
||||||
],
|
|
||||||
"templates":{
|
|
||||||
"characterDescription": {
|
|
||||||
"description": " "
|
|
||||||
},
|
|
||||||
"characterBars":{
|
|
||||||
"lp":{
|
|
||||||
"value":15,
|
|
||||||
"min":0,
|
|
||||||
"max":15
|
|
||||||
},
|
|
||||||
"ap":{
|
|
||||||
"value":20,
|
|
||||||
"min":0,
|
|
||||||
"max":20
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"characterHeader": {
|
|
||||||
"es":0,
|
|
||||||
"ep":0,
|
|
||||||
"gg":0,
|
|
||||||
"sg":0,
|
|
||||||
"gp":2
|
|
||||||
},
|
|
||||||
"attributes":{
|
|
||||||
"st": {
|
|
||||||
"value": 50,
|
|
||||||
"bonus": 0
|
|
||||||
},
|
|
||||||
"ge": {
|
|
||||||
"value": 50,
|
|
||||||
"bonus": 0
|
|
||||||
},
|
|
||||||
"gw": {
|
|
||||||
"value": 50,
|
|
||||||
"bonus": 0
|
|
||||||
},
|
|
||||||
"ko": {
|
|
||||||
"value": 50,
|
|
||||||
"bonus": 0
|
|
||||||
},
|
|
||||||
"in": {
|
|
||||||
"value": 50,
|
|
||||||
"bonus": 0
|
|
||||||
},
|
|
||||||
"zt": {
|
|
||||||
"value": 50,
|
|
||||||
"bonus": 0
|
|
||||||
},
|
|
||||||
"au": {
|
|
||||||
"value": 50,
|
|
||||||
"bonus": 0
|
|
||||||
},
|
|
||||||
"pa": {
|
|
||||||
"value": 50,
|
|
||||||
"bonus": 0
|
|
||||||
},
|
|
||||||
"wk": {
|
|
||||||
"value": 50,
|
|
||||||
"bonus": 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"character":{
|
|
||||||
"templates": [
|
|
||||||
"characterBars",
|
|
||||||
"attributes",
|
|
||||||
"characterDescription",
|
|
||||||
"characterHeader"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"npc":{
|
|
||||||
"templates": [
|
|
||||||
"characterBars",
|
|
||||||
"attributes",
|
|
||||||
"characterDescription"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"vehicle":{
|
|
||||||
"templates": [
|
|
||||||
"characterBars",
|
|
||||||
"attributes"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Item":{
|
|
||||||
"types":[
|
|
||||||
"item"
|
|
||||||
],
|
|
||||||
"templates":{
|
|
||||||
"itemDescription": {
|
|
||||||
"description": " "
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"item":{
|
|
||||||
"templates":[
|
|
||||||
"itemDescription"
|
|
||||||
],
|
|
||||||
"quantity":1,
|
|
||||||
"value":0,
|
|
||||||
"magic":false,
|
|
||||||
"onbody":false,
|
|
||||||
"attributes":{
|
|
||||||
|
|
||||||
},
|
|
||||||
"groups":{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,142 @@
|
||||||
|
<h3>Eigenschaften</h3>
|
||||||
|
<div class="flexrow">
|
||||||
|
<span class="flex0">{{localize "midgard5.class"}}</span>
|
||||||
|
<input class="flex3" name="data.info.class" type="text" value="{{data.info.class}}" data-dtype="String" />
|
||||||
|
<input id="data.info.magic_using" type="checkbox" name="data.info.magic_using" {{checked data.info.magic_using}}>
|
||||||
|
<label class="flex0" for="data.info.magic_using">{{localize "midgard5.magic_using"}}</label>
|
||||||
|
<span class="level-display">Grad {{data.calc.level}}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.actor-lp"}} {{localize "midgard5.maximum"}}</td>
|
||||||
|
<td><input name="data.lp.max" type="text" value="{{data.lp.max}}" data-dtype="Number" /></td>
|
||||||
|
<td>{{localize "midgard5.grace"}}</td>
|
||||||
|
<td><input name="data.gg" type="text" value="{{data.gg}}" data-dtype="Number" /></td>
|
||||||
|
<td>{{localize "midgard5.exp-overall"}}</td>
|
||||||
|
<td><input name="data.es" type="text" value="{{data.es}}" data-dtype="Number" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.actor-ap"}} {{localize "midgard5.maximum"}}</td>
|
||||||
|
<td><input name="data.ap.max" type="text" value="{{data.ap.max}}" data-dtype="Number" /></td>
|
||||||
|
<td>{{localize "midgard5.destiny"}}</td>
|
||||||
|
<td><input name="data.sg" type="text" value="{{data.sg}}" data-dtype="Number" /></td>
|
||||||
|
<td>{{localize "midgard5.exp-available"}}</td>
|
||||||
|
<td><input name="data.ep" type="text" value="{{data.ep}}" data-dtype="Number" /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h3>Leiteigenschaften</h3>
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.actor-st-long"}}</td>
|
||||||
|
<td><input name="data.attributes.st.value" type="text" value="{{data.attributes.st.value}}" data-dtype="Number" /></td>
|
||||||
|
<td><input name="data.attributes.st.bonus" type="text" value="{{data.attributes.st.bonus}}" data-dtype="Number" placeholder="Bonus" /></td>
|
||||||
|
<td>{{localize "midgard5.actor-gs-long"}}</td>
|
||||||
|
<td><input name="data.attributes.gs.value" type="text" value="{{data.attributes.gs.value}}" data-dtype="Number" /></td>
|
||||||
|
<td><input name="data.attributes.gs.bonus" type="text" value="{{data.attributes.gs.bonus}}" data-dtype="Number" placeholder="Bonus" /></td>
|
||||||
|
<td>{{localize "midgard5.actor-gw-long"}}</td>
|
||||||
|
<td><input name="data.attributes.gw.value" type="text" value="{{data.attributes.gw.value}}" data-dtype="Number" /></td>
|
||||||
|
<td><input name="data.attributes.gw.bonus" type="text" value="{{data.attributes.gw.bonus}}" data-dtype="Number" placeholder="Bonus" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.actor-ko-long"}}</td>
|
||||||
|
<td><input name="data.attributes.ko.value" type="text" value="{{data.attributes.ko.value}}" data-dtype="Number" /></td>
|
||||||
|
<td><input name="data.attributes.ko.bonus" type="text" value="{{data.attributes.ko.bonus}}" data-dtype="Number" placeholder="Bonus" /></td>
|
||||||
|
<td>{{localize "midgard5.actor-in-long"}}</td>
|
||||||
|
<td><input name="data.attributes.in.value" type="text" value="{{data.attributes.in.value}}" data-dtype="Number" /></td>
|
||||||
|
<td><input name="data.attributes.in.bonus" type="text" value="{{data.attributes.in.bonus}}" data-dtype="Number" placeholder="Bonus" /></td>
|
||||||
|
<td>{{localize "midgard5.actor-zt-long"}}</td>
|
||||||
|
<td><input name="data.attributes.zt.value" type="text" value="{{data.attributes.zt.value}}" data-dtype="Number" /></td>
|
||||||
|
<td><input name="data.attributes.zt.bonus" type="text" value="{{data.attributes.zt.bonus}}" data-dtype="Number" placeholder="Bonus" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.actor-au-long"}}</td>
|
||||||
|
<td><input name="data.attributes.au.value" type="text" value="{{data.attributes.au.value}}" data-dtype="Number" /></td>
|
||||||
|
<td><input name="data.attributes.au.bonus" type="text" value="{{data.attributes.au.bonus}}" data-dtype="Number" placeholder="Bonus" /></td>
|
||||||
|
<td>{{localize "midgard5.actor-pa-long"}}</td>
|
||||||
|
<td><input name="data.attributes.pa.value" type="text" value="{{data.attributes.pa.value}}" data-dtype="Number" /></td>
|
||||||
|
<td><input name="data.attributes.pa.bonus" type="text" value="{{data.attributes.pa.bonus}}" data-dtype="Number" placeholder="Bonus" /></td>
|
||||||
|
<td>{{localize "midgard5.actor-wk-long"}}</td>
|
||||||
|
<td><input name="data.attributes.wk.value" type="text" value="{{data.attributes.wk.value}}" data-dtype="Number" /></td>
|
||||||
|
<td><input name="data.attributes.wk.bonus" type="text" value="{{data.attributes.wk.bonus}}" data-dtype="Number" placeholder="Bonus" /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h3>Berechnete Werte</h3>
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.brawl"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.brawl}}" data-dtype="Number" readonly /></td>
|
||||||
|
<td>{{localize "midgard5.enduranceBonus"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.enduranceBonus}}" data-dtype="Number" readonly /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.defense"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.defense}}" data-dtype="Number" readonly /></td>
|
||||||
|
<td>{{localize "midgard5.defenseBonus"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.defenseBonus}}" data-dtype="Number" readonly /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.damageBonus"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.damageBonus}}" data-dtype="Number" readonly /></td>
|
||||||
|
<td>{{localize "midgard5.attackBonus"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.attackBonus}}" data-dtype="Number" readonly /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.spellCasting"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.spellCasting}}" data-dtype="Number" readonly /></td>
|
||||||
|
<td>{{localize "midgard5.poisonResistance"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.poisonResistance}}" data-dtype="Number" readonly /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.resistanceMind"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.resistanceMind}}" data-dtype="Number" readonly /></td>
|
||||||
|
<td>{{localize "midgard5.resistanceBody"}}</td>
|
||||||
|
<td><input type="text" value="{{data.calc.stats.resistanceBody}}" data-dtype="Number" readonly /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h3>Beschreibung</h3>
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.race"}}</td>
|
||||||
|
<td><input name="data.info.race" type="text" value="{{data.info.race}}" data-dtype="String" /></td>
|
||||||
|
<td>{{localize "midgard5.gender"}}</td>
|
||||||
|
<td><input name="data.info.gender" type="text" value="{{data.info.gender}}" data-dtype="String" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.weight"}}</td>
|
||||||
|
<td><input name="data.info.weight" type="text" value="{{data.info.weight}}" data-dtype="String" /></td>
|
||||||
|
<td>{{localize "midgard5.height"}}</td>
|
||||||
|
<td><input name="data.info.height" type="text" value="{{data.info.height}}" data-dtype="String" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.shape"}}</td>
|
||||||
|
<td><input name="data.info.shape" type="text" value="{{data.info.shape}}" data-dtype="String" /></td>
|
||||||
|
<td>{{localize "midgard5.age"}}</td>
|
||||||
|
<td><input name="data.info.age" type="text" value="{{data.info.age}}" data-dtype="String" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.caste"}}</td>
|
||||||
|
<td><input name="data.info.caste" type="text" value="{{data.info.caste}}" data-dtype="String" /></td>
|
||||||
|
<td>{{localize "midgard5.occupation"}}</td>
|
||||||
|
<td><input name="data.info.occupation" type="text" value="{{data.info.occupation}}" data-dtype="String" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{localize "midgard5.origin"}}</td>
|
||||||
|
<td><input name="data.info.origin" type="text" value="{{data.info.origin}}" data-dtype="String" /></td>
|
||||||
|
<td>{{localize "midgard5.faith"}}</td>
|
||||||
|
<td><input name="data.info.faith" type="text" value="{{data.info.faith}}" data-dtype="String" /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
<form class="actor-sheet {{cssClass}}" autocomplete="off">
|
||||||
|
<header class="sheet-header">
|
||||||
|
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
|
||||||
|
<h1 class="charname"><input name="name" type="text" value="{{actor.name}}" placeholder="Name" /></h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{!-- Character Sheet Navigation --}}
|
||||||
|
<nav class="sheet-navigation tabs" data-group="primary">
|
||||||
|
<a class="item active" data-tab="base_values">{{ localize "midgard5.base_values" }}</a>
|
||||||
|
<a class="item" data-tab="skills">{{ localize "midgard5.skills" }}</a>
|
||||||
|
<a class="item" data-tab="gear">{{ localize "midgard5.gear" }}</a>
|
||||||
|
<a class="item" data-tab="spells">{{ localize "midgard5.spells" }}</a>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-content">
|
||||||
|
|
||||||
|
<div class="tab base_values flexcol" data-group="primary" data-tab="base_values">
|
||||||
|
{{> "systems/midgard5/templates/sheets/character/base_values.hbs"}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab base_values flexcol" data-group="primary" data-tab="skills">
|
||||||
|
{{> "systems/midgard5/templates/sheets/character/skills.hbs"}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
</form>
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
<h3>Ungelernte Fertigkeiten</h3>
|
||||||
|
<ol class="attributes-list">
|
||||||
|
{{#each actor.data.skills.general as |skill key|}}
|
||||||
|
<li class="attribute flexrow" data-skill="{{key}}">
|
||||||
|
<div class="roll-button">Roll </div>
|
||||||
|
<span class="attribute-label flexrow" name="data.skills.{{key}}.label">{{localizeMidgard key}}</span>
|
||||||
|
<div class="attribute-editbox flexrow">
|
||||||
|
<input class="attribute-value" type="text" name="data.skills.general.{{key}}.fw" value="{{skill.fw}}" data-dtype="Number" readonly />
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
|
@ -1,77 +0,0 @@
|
||||||
<form class="actor-sheet {{cssClass}}" autocomplete="off">
|
|
||||||
<header class="sheet-header">
|
|
||||||
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
|
|
||||||
<h1 class="charname"><input name="name" type="text" value="{{actor.name}}" placeholder="Name" /></h1>
|
|
||||||
</header>
|
|
||||||
<div class="sheet-content">
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th>{{localize "midgard5.actor-lp"}}</th>
|
|
||||||
<th>{{localize "midgard5.actor-ap"}}</th>
|
|
||||||
<th>{{localize "midgard5.actor-gw-long"}}</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th>{{localize "midgard5.aktuell"}}</th>
|
|
||||||
<th>{{localize "midgard5.maximum"}}</th>
|
|
||||||
</tr>
|
|
||||||
<td>
|
|
||||||
<input name="data.lp.value" type="text" value="{{data.lp.value}}" data-dtype="Number" />
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input name="data.lp.max" type="text" value="{{data.lp.max}}" data-dtype="Number" />
|
|
||||||
</td>
|
|
||||||
</table>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th>{{localize "midgard5.aktuell"}}</th>
|
|
||||||
<th>{{localize "midgard5.maximum"}}</th>
|
|
||||||
</tr>
|
|
||||||
<td>
|
|
||||||
<input name="data.ap.value" type="text" value="{{data.ap.value}}" data-dtype="Number" />
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input name="data.ap.max" type="text" value="{{data.ap.max}}" data-dtype="Number" />
|
|
||||||
</td>
|
|
||||||
</table>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<th>{{localize "midgard5.attrvalue"}}</th>
|
|
||||||
<th>{{localize "midgard5.bonus"}}</th>
|
|
||||||
</tr>
|
|
||||||
<td>
|
|
||||||
<input name="data.gw.value" type="text" value="{{data.gw.value}}" data-dtype="Number" />
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<input name="data.gw.bonus" type="text" value="{{data.gw.bonus}}" data-dtype="Number" />
|
|
||||||
</td>
|
|
||||||
</table>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
|
|
||||||
</div>
|
|
||||||
{{!-- <section class="items">
|
|
||||||
<h3>Owned Items</h3>
|
|
||||||
<ol class="actor-items">
|
|
||||||
{{#each actor.items as |item id|}}
|
|
||||||
<li class="actor-item" data-item-id="{{id}}">
|
|
||||||
<div class="item-name">
|
|
||||||
<img src="{{item.img}}" title="{{item.name}}" width="24" height="24" />
|
|
||||||
<h4>{{item.name}}</h4>
|
|
||||||
</div>
|
|
||||||
<div class="item-controls">
|
|
||||||
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
|
||||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{{/each}}
|
|
||||||
</ol>
|
|
||||||
</section> --}}
|
|
||||||
</form>
|
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
/* Visit https://aka.ms/tsconfig.json to read more about this file */
|
||||||
|
/* Projects */
|
||||||
|
// "incremental": true, /* Enable incremental compilation */
|
||||||
|
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
||||||
|
// "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */
|
||||||
|
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */
|
||||||
|
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
||||||
|
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
|
||||||
|
/* Language and Environment */
|
||||||
|
"target": "ES2017", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
|
||||||
|
"lib": [
|
||||||
|
"DOM",
|
||||||
|
"ES6",
|
||||||
|
"ES2017"
|
||||||
|
], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
|
||||||
|
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
|
||||||
|
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
||||||
|
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
|
||||||
|
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
||||||
|
/* Modules */
|
||||||
|
"module": "commonjs", /* Specify what module code is generated. */
|
||||||
|
"rootDir": "./source", /* Specify the root folder within your source files. */
|
||||||
|
"moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
|
||||||
|
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||||
|
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
|
||||||
|
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
|
||||||
|
// "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */
|
||||||
|
"types": [
|
||||||
|
"@league-of-foundry-developers/foundry-vtt-types"
|
||||||
|
], /* Specify type package names to be included without being referenced in a source file. */
|
||||||
|
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||||
|
"resolveJsonModule": true, /* Enable importing .json files */
|
||||||
|
// "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
|
||||||
|
/* JavaScript Support */
|
||||||
|
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
|
||||||
|
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
||||||
|
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
|
||||||
|
/* Emit */
|
||||||
|
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||||
|
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||||
|
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||||
|
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
|
||||||
|
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
|
||||||
|
// "outDir": "./", /* Specify an output folder for all emitted files. */
|
||||||
|
// "removeComments": true, /* Disable emitting comments. */
|
||||||
|
"noEmit": true, /* Disable emitting files from a compilation. */
|
||||||
|
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||||
|
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */
|
||||||
|
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
|
||||||
|
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
|
||||||
|
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||||
|
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
|
||||||
|
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
|
||||||
|
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
|
||||||
|
// "newLine": "crlf", /* Set the newline character for emitting files. */
|
||||||
|
// "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
|
||||||
|
// "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */
|
||||||
|
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
|
||||||
|
// "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */
|
||||||
|
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
|
||||||
|
/* Interop Constraints */
|
||||||
|
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
||||||
|
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
||||||
|
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */
|
||||||
|
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
|
||||||
|
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
|
||||||
|
/* Type Checking */
|
||||||
|
"strict": true, /* Enable all strict type-checking options. */
|
||||||
|
"noImplicitAny": false, /* Enable error reporting for expressions and declarations with an implied `any` type.. */
|
||||||
|
"strictNullChecks": false, /* When type checking, take into account `null` and `undefined`. */
|
||||||
|
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||||
|
// "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
|
||||||
|
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
|
||||||
|
"noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */
|
||||||
|
// "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */
|
||||||
|
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||||
|
// "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */
|
||||||
|
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */
|
||||||
|
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||||
|
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||||
|
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
||||||
|
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
|
||||||
|
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
|
||||||
|
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */
|
||||||
|
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
||||||
|
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||||
|
/* Completeness */
|
||||||
|
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||||
|
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||||
|
},
|
||||||
|
//"include": [
|
||||||
|
// "./Source/**/*.ts"
|
||||||
|
//]
|
||||||
|
"exclude": [
|
||||||
|
"gulpfile.ts"
|
||||||
|
]
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue