Compare commits

..

No commits in common. "develop" and "v1.2.3" have entirely different histories.

132 changed files with 5277 additions and 5733 deletions

View File

@ -1,15 +0,0 @@
name: Move new issues into To Do
on:
issues:
types: [opened]
jobs:
createCard:
runs-on: ubuntu-latest
steps:
- name: Close Issue
run: >
curl -X PATCH -H "Content-Type: application/xml"
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}
-d '{ "state": "To Do" }'
"${{ gitea.event.issue.url }}"

3
.gitignore vendored
View File

@ -4,5 +4,4 @@ package-lock.json
.idea/
source/packs/
source/generators/
dist
*.zip
dist

View File

@ -1,7 +1,6 @@
MIT License
Copyright (c) 2022 Michael Stein
Copyright (c) 2023 Byroks
Copyright (c) 2022
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512"><path fill="#fff" d="M262.406 17.188c-27.22 8.822-54.017 28.012-72.375 55.53 17.544 47.898 17.544 57.26 0 105.157 19.92 15.463 40.304 24.76 60.782 27.47-2.063-25.563-3.63-51.13 1.125-76.69-13.625-1.483-23.374-5.995-37-13.874V82.563c35.866 19.096 61.84 18.777 98.813 0v32.22c-13.364 6.497-21.886 11.16-35.25 13.218 3.614 25.568 3.48 51.15 1.375 76.72 18.644-3.265 37.236-12.113 55.5-26.845-14.353-47.897-14.355-57.26 0-105.156-16.982-28.008-47.453-46.633-72.97-55.532zm-129.594 8.218c-25.906 110.414-27.35 215.33-27.4 330.922-18.84-1.537-37.582-5.12-56.027-11.12v28.554h69.066c8.715 35.025 6.472 70.052-1.036 105.078h28.13c-7.195-35.026-8.237-70.053-.872-105.078h68.904v-28.555c-18.49 4.942-37.256 8.552-56.097 10.46.082-114.94 2.496-223.068-24.667-330.26zm89.47 202.375c0 117.27 25.517 233.342 120.155 257.97C446.62 464.716 462.72 345.374 462.72 227.78H222.28z"/></svg>

Before

Width:  |  Height:  |  Size: 956 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512"><path fill="#000" d="M256 16C123.5 16 16 123.5 16 256c0 132.6 107.5 240 240 240 132.6 0 240-107.4 240-240S388.6 16 256 16zm0 60c99.4 0 180 80.6 180 180s-80.6 180-180 180S76 355.4 76 256 156.6 76 256 76zm91.3 64.2c-6.5 0-12.5 2.4-16.8 8.2-52 70.1-69 96.5-106 169.8-8.4-11.1-65.6-72.4-93.9-94.1-14.2-10.9-41.3 27.2-31.6 37.1C142.6 306.1 220.1 406 232.7 405c21.4-1.7 75.1-136.8 148.8-233.7 8-10.4-15-31.3-34.2-31.1z"/></svg>

Before

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

BIN
assets/maps/midgard_v1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 MiB

BIN
assets/maps/midgard_v2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 MiB

View File

@ -6,7 +6,7 @@ _**Warnung:** Das System befindet sich noch in der Entwicklung._
Gehe auf die Setup-Seite deiner Foundry VTT Instanz. Klicke im Reiter **Game Systems** auf den Button **Install System**. In dem dann geöffneten Dialog, unten in der Zeile **Manifest URL** den Link zur aktuellen (oder gewünschten) Version der _system.json_ eintragen und auf **Install** klicken:
https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v1.3.0/system.json
https://github.com/michaelstein/foundry-vtt-system-midgard5/releases/download/v1.0.1/system.json
Danach kann eine Spielwelt mit dem System erstellt werden.
@ -32,7 +32,7 @@ Dieser Reiter enthält (mit Ausname von Zaubern) alle zu erlernenden Dinge des C
![Blaupausen für Gegenstände](compendium-items.de.png)
Es kann einfach per Drag'n'Drop die entsprechende Blaupause auf den Charakterbogen gezogen werden, um eine Fertigkeit/Fähigkeit/Sprache zu _lernen._ Alternativ kann auch der **Lernen** Button bei den **ungelernten Fertigkeiten** geklickt werden.
Es kann einfach per Drag'n'Drop die entsprechende Blaupause auf den Charakterbogen gezogen werden, um eine Fertigkeit/Fähigkeit/Sprache zu *lernen.* Alternativ kann auch der **Lernen** Button bei den **ungelernten Fertigkeiten** geklickt werden.
Um den **Fertigkeitswert** und die **Leiteigenschaft** einer Fertigkeit anzupassen, kann man auf die Fertigkeit klicken. Dann geht folgender Dialog auf:

View File

@ -1,4 +1,5 @@
{
"moduleName": "Midgard 5. Edition",
"repository": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5"
"repository": "https://github.com/Byroks/foundry-vtt-system-midgard5",
"rawURL": "https://raw.githubusercontent.com/Byroks/foundry-vtt-system-midgard5"
}

View File

@ -43,7 +43,6 @@ 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";
import { data } from "jquery";
const tsify = require("tsify");
const ts = require("gulp-typescript");
@ -83,8 +82,10 @@ const getManifest = (): Manifest | null => {
} 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";
@ -94,6 +95,7 @@ const getManifest = (): Manifest | null => {
} else {
return null;
}
return json;
};
@ -307,7 +309,7 @@ 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";
const name = getManifest()!.file.name ?? "midgard5e";
distPath = path.join(dp, "Data", "systems", name);
};
@ -328,6 +330,7 @@ const linkUserData = async () => {
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");
@ -376,26 +379,22 @@ async function packageBuild() {
// Initialize the zip file
const zipName = `${manifest.file.name}-v${manifest.file.version}.zip`;
const zipFile = fs.createWriteStream(zipName);
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);
});
zipFile.on("end", function () {
throw "Data has been drained";
});
zip.on("error", (err) => {
throw err;
});
zip.pipe(zipFile);
zip.directory(distPath, manifest.file.name);
zip.directory(path.join(process.cwd(), distPath), false);
return zip.finalize();
} catch (err) {
return reject(err);
@ -423,7 +422,7 @@ const updateManifest = (cb: any) => {
cb(Error("Manifest JSON not found"));
return;
}
if (!repoURL) cb(Error("Repository URLs not configured in foundryconfig.json"));
if (!rawURL || !repoURL) cb(Error("Repository URLs not configured in foundryconfig.json"));
try {
const version = argv.update || argv.u;
@ -470,11 +469,11 @@ const updateManifest = (cb: any) => {
/* Update URLs */
const result = `${repoURL}/releases/download`;
const result = `${rawURL}/v${manifest.file.version}/${distPath}/${manifest.file.name}-v${manifest.file.version}.zip`;
manifest.file.url = repoURL;
manifest.file.manifest = `${result}/latest/${manifest.name}?token=2455375115b92bc8d87c93df7159eec232456f2d`;
manifest.file.download = `${result}/v${manifest.file.version}/${manifest.file.name}-v${manifest.file.version}.zip?token=2455375115b92bc8d87c93df7159eec232456f2d`;
manifest.file.manifest = `${rawURL}/master/${manifestRoot}/${manifest.name}`;
manifest.file.download = result;
const prettyProjectJson = stringify(manifest.file, {
maxLength: 35,
@ -493,8 +492,9 @@ const updateManifest = (cb: any) => {
const gitTaskManifest = (cb: gulp.TaskFunctionCallback) => {
const manifest = getManifest();
if (!manifest) return cb(Error("could not load manifest."));
return gulp
.src([`package.json`, `source/system.json`])
.src([`package.json`, `source/module.json`])
.pipe(git.add({ args: "--no-all -f" }))
.pipe(git.commit(`v${manifest.file.version}`, { args: "-a", disableAppendPaths: true }));
};
@ -504,7 +504,7 @@ const gitTaskBuild = (cb: gulp.TaskFunctionCallback) => {
if (!manifest) return cb(Error("could not load manifest."));
return gulp
.src(`${manifest.file.name}.zip`)
.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 }));
@ -520,4 +520,4 @@ exports.clean = clean;
exports.link = linkUserData;
exports.package = packageBuild;
exports.update = updateManifest;
exports.publish = gulp.series(clean, updateManifest, execBuild, bundleModule, packageBuild, gitTaskManifest);
//exports.publish = gulp.series(clean, updateManifest, execBuild, bundleModule, packageBuild, gitTaskManifest, gitTaskBuild)

View File

@ -1,466 +1,232 @@
{
"TYPES.Actor.character": "Charakter",
"TYPES.Actor.npc": "Kreatur / Nichtspielerfigur",
"ACTOR.TypeCharacter": "Charakter",
"ACTOR.TypeNpc": "Kreatur / Nichtspielerfigur",
"ACTOR.TypeVehicle": "Transportmittel / Pferd etc.",
"TYPES.Item.item": "Gegenstand",
"TYPES.Item.skill": "Fertigkeit",
"TYPES.Item.weapon": "Waffe",
"TYPES.Item.defensiveWeapon": "Verteidigungswaffe",
"TYPES.Item.armor": "Rüstung",
"TYPES.Item.spell": "Zauber",
"TYPES.Item.effect": "Aktiver Effekt",
"TYPES.Item.kampfkunst": "Kampfkunst",
"TYPES.Item.container": "Aufbewahrung",
"TYPES.Item.class": "Klasse",
"ITEM.TypeItem": "Gegenstand",
"ITEM.TypeWeapon": "Waffe",
"ITEM.TypeDefensiveWeapon": "Verteidigungswaffe",
"ITEM.TypeArmor": "Rüstung",
"ITEM.TypeSpell": "Zauber",
"midgard5": {
"phase-action": "Handlungsphase",
"phase-movement": "Bewegungsphase",
"no-encounter": "Kein Kampf",
"encounter-not-started": "Kein aktiver Kampf",
"initiative": "Initiative",
"actionrank": "Handlungsrang",
"midgard5.doRoll": "Würfeln",
"midgard5.learn": "Lernen",
"combat-join": "Kampf Beitreten/Handlungsrang zurücksetzen",
"combat-ranged": "Fernangriff",
"combat-spell": "Zaubern (10 Sec)",
"midgard5.label": "Bezeichnung",
"midgard5.description": "Beschreibung",
"midgard5.attribute": "Leiteigenschaft",
"midgard5.skill": "Fertigkeit",
"midgard5.skill-value": "Fertigkeitswert",
"midgard5.fw": "FW",
"midgard5.bonus": "Bonus",
"midgard5.ew": "EW",
"midgard5.pp-short": "PP",
"midgard5.pp": "Praxispunkte",
"time-duration": "Dauer",
"time-round": "Runde(n)",
"time-minute": "Minute(n)",
"time-hour": "Stunde(n)",
"time-limitless": "Unbegrenzt",
"midgard5.item-value": "Wert",
"midgard5.item-quantity": "Menge",
"midgard5.item-onbody": "Am Körper",
"midgard5.item-ismagic": "Ist Magisch",
"doRoll": "Würfeln",
"learn": "Lernen",
"midgard5.actor-lp": "Lebenspunkte",
"midgard5.actor-lp-short": "LP",
"midgard5.actor-ap": "Ausdauerpunkte",
"midgard5.actor-ap-short": "AP",
"midgard5.actor-st": "St",
"midgard5.actor-st-long": "Stärke",
"midgard5.actor-ko": "Ko",
"midgard5.actor-ko-long": "Konstitution",
"midgard5.actor-au": "Au",
"midgard5.actor-au-long": "Aussehen",
"midgard5.actor-gs": "Gs",
"midgard5.actor-gs-long": "Geschicklichkeit",
"midgard5.actor-in": "In",
"midgard5.actor-in-long": "Intelligenz",
"midgard5.actor-pa": "pA",
"midgard5.actor-pa-long": "persönliche Ausstrahlung",
"midgard5.actor-gw": "Gw",
"midgard5.actor-gw-long": "Gewandtheit",
"midgard5.actor-zt": "Zt",
"midgard5.actor-zt-long": "Zaubertalent",
"midgard5.actor-wk": "Wk",
"midgard5.actor-wk-long": "Willenskraft",
"label": "Bezeichnung",
"description": "Beschreibung",
"Characteristic": "Merkmal",
"characteristics": "Merkmale",
"background": "Hintergrund",
"attribute": "Eigenschaft",
"attributes": "Eigenschaften",
"points": "Punkte",
"calculated-value": "Berechneter Wert",
"calculated-values": "Werte und Boni",
"midgard5.aktuell": "Akt.",
"midgard5.maximum": "Max.",
"midgard5.attrvalue": "Wert",
"midgard5.movementRange": "Bewegungsweite",
"skill": "Fertigkeit",
"skill-value": "Fertigkeitswert",
"fw": "FW",
"bonus": "Bonus",
"bonuses": "Boni",
"ew": "EW",
"pp-short": "PP",
"pp": "Praxispunkte",
"midgard5.base_values": "Grundwerte",
"midgard5.skills": "Fertigkeiten",
"midgard5.gear": "Ausrüstung",
"midgard5.spells": "Zauber",
"item-value": "Wert",
"item-quantity": "Menge",
"item-onbody": "Am Körper",
"item-ismagic": "Ist Magisch",
"item-wealth": "Vermögenswert",
"item-weight": "Gewicht",
"item-abw": "ABW",
"item-abw-long": "Ausbrennwahrscheinlichkeit",
"midgard5.class": "Klasse",
"midgard5.race": "Rasse",
"midgard5.magicUsing": "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",
"actor-lp": "Lebenspunkte",
"actor-lp-short": "LP",
"actor-ap": "Ausdauerpunkte",
"actor-ap-short": "AP",
"actor-st": "St",
"actor-st-long": "Stärke",
"actor-ko": "Ko",
"actor-ko-long": "Konstitution",
"actor-au": "Au",
"actor-au-long": "Aussehen",
"actor-gs": "Gs",
"actor-gs-long": "Geschicklichkeit",
"actor-in": "In",
"actor-in-long": "Intelligenz",
"actor-pa": "pA",
"actor-pa-long": "persönliche Ausstrahlung",
"actor-gw": "Gw",
"actor-gw-long": "Gewandtheit",
"actor-zt": "Zt",
"actor-zt-long": "Zaubertalent",
"actor-wk": "Wk",
"actor-wk-long": "Willenskraft",
"actor-git": "GiT",
"actor-git-long": "Gifttolleranz",
"midgard5.exp-overall": "Erfahrungsschatz",
"midgard5.exp-available": "Erfahrungspunkte",
"midgard5.grace": "Göttliche Gnade",
"midgard5.destiny": "Schicksalsgunst",
"midgard5.luckPoints": "Glückspunkte",
"aktuell": "Akt.",
"maximum": "Max.",
"attrvalue": "Wert",
"movementRange": "Bewegungsweite",
"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",
"base_values": "Grundwerte",
"skills": "Fertigkeiten",
"gear": "Ausrüstung",
"spells": "Zauber",
"effects": "Aktive Effekte",
"kampfkuenste": "Kampfkünste",
"combat": "Kampf",
"midgard5.armor": "Rüstung",
"midgard5.defense": "Abwehr",
"midgard5.damageBonus": "Schadensbonus",
"midgard5.damageBonus-short": "SchB",
"midgard5.attackBonus": "Angriffsbonus",
"midgard5.attackBonus-short": "AnB",
"midgard5.defenseBonus": "Abwehrbonus",
"midgard5.defenseBonus-short": "AbB",
"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",
"actor-name": "Figur",
"level": "Grad",
"class": "Typ",
"race": "Rasse",
"magicUsing": "Zauberkundig",
"gender": "Geschlecht",
"weight": "Gewicht",
"height": "Größe",
"shape": "Gestalt",
"age": "Alter",
"caste": "Stand",
"occupation": "Beruf",
"origin": "Heimat",
"faith": "Glaube",
"midgard5.new-skill": "Neue Fertigkeit",
"midgard5.special": "Spezial",
"midgard5.learned-skill": "Gelernte Fertigkeit",
"midgard5.language": "Sprache",
"midgard5.weapon-skill": "Waffenfertigkeit",
"midgard5.unlearned-skill": "Ungelernte Fertigkeit",
"midgard5.innate-ability": "Angeborene Fähigkeit",
"currency": "Geld",
"currency-gold": "Gold",
"currency-silver": "Silber",
"currency-copper": "Kupfer",
"currency-wealth": "Vermögen in GS",
"currency-available": "verfügbares Vermögen",
"hoard": "aktueller Hort",
"hoardMin": "benötigter Mindesthort",
"hoard-next": "Hort für nächsten Grad",
"hoarded": "Hort",
"midgard5.base-damage": "Grundschaden",
"midgard5.defensive-weapon": "Verteidigungswaffe",
"midgard5.no-skill": "Keine Fertigkeit",
"midgard5.magic": "magisch",
"midgard5.rangedWeapon": "Schusswaffe",
"midgard5.assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um Fähigkeit auwählen zu können",
"no-container": "Ohne",
"midgard5.pw": "Prüfwurf",
"midgard5.attack": "Angriff",
"midgard5.damage": "Schaden",
"encumbrance": "Getragene Last",
"load": "Normallast",
"heavy-load": "Schwere Last",
"thrust-load": "Schublast",
"load-max": "Höchstlast",
"capacity": "Tragkraft",
"midgard5.spell-process-none": "Ohne",
"midgard5.spell-process-beherrschen": "Beherrschen",
"midgard5.spell-process-bewegen": "Bewegen",
"midgard5.spell-process-erkennen": "Erkennen",
"midgard5.spell-process-erschaffen": "Erschaffen",
"midgard5.spell-process-formen": "Formen",
"midgard5.spell-process-veraendern": "Verändern",
"midgard5.spell-process-zerstoeren": "Zerstören",
"midgard5.spell-process-wundertat": "Wundertat",
"midgard5.spell-process-dweomer": "Dweomer",
"midgard5.spell-process-zauberlied": "Zauberlied",
"midgard5.spell-process-salz": "Salz",
"midgard5.spell-process-thaumagraphie": "Thaumagraphie",
"midgard5.spell-process-beschwoeren": "Beschwören",
"midgard5.spell-process-nekromantie": "Nekromantie",
"midgard5.spell-process-thaumatherapie": "Thaumatherapie",
"midgard5.spell-process-zaubermittel": "Zaubermittel",
"midgard5.spell-process-zauberschutz": "Zauberschutz",
"exp-overall": "Erfahrungsschatz",
"exp-available": "Erfahrungspunkte",
"grace": "Göttliche Gnade",
"destiny": "Schicksalsgunst",
"luckPoints": "Glückspunkte",
"midgard5.spell-type-gedanke": "Gedanke",
"midgard5.spell-type-geste": "Geste",
"midgard5.spell-type-wort": "Wort",
"abrichten": "Abrichten",
"akrobatik": "Akrobatik",
"alchimie": "Alchimie",
"anfuehren": "Anführen",
"askese": "Askese",
"astrologie": "Astrologie",
"athletik": "Athletik",
"balancieren": "Balancieren",
"beidhaendigerKampf": "Beidhändiger Kampf",
"bergreiten": "Bergreiten",
"beredsamkeit": "Beredsamkeit",
"betaeuben": "Betäuben",
"betaeubungsgriff": "Betäubungsgriff",
"bildendeKuensteA": "Bildende Künste (Architektur)",
"bildendeKuensteB": "Bildende Künste (Bildhauerei)",
"bildendeKuensteG": "Bildende Künste (Grafik)",
"bildendeKuensteM": "Bildende Künste (Malerei)",
"bootfahren": "Bootfahren",
"dickhaeuterLenken": "Dickhäuter lenken",
"ersteHilfe": "Erste Hilfe",
"etikette": "Etikette",
"fallenEntdecken": "Fallen entdecken",
"fallenmechanik": "Fallenmechanik",
"faelschen": "Fälschen",
"fangen": "Fangen",
"fechten": "Fechten",
"fechtkunst": "Fechtkunst",
"feueralchimie": "Feueralchimie",
"gassenwissen": "Gassenwissen",
"gaukeln": "Gaukeln",
"gelaendelauf": "Geländelauf",
"geraetekunde": "Gerätekunde",
"geschaeftssinn": "Geschäftssinn",
"gluecksspiel": "Glücksspiel",
"heilkunde": "Heilkunde",
"kampfInVollruestung": "Kampf in Vollrüstung",
"kampfInSchlachtreihe": "Kampf in Schlachtreihe",
"kampfkunst": "Kampfkunst",
"kido": "Kido",
"klettern": "Klettern",
"landeskunde": "Landeskunde",
"laufen": "Laufen",
"lesenVonZauberschrift": "Lesen von Zauberschrift",
"lesenVonZauberrunen": "Lesen von Zauberrunen",
"meditieren": "Meditieren",
"menschenkenntnis": "Menschenkenntnis",
"meucheln": "Meucheln",
"musizierenFloete": "Musizieren (Flöten)",
"musizierenBlas": "Musizieren (Blasinstrumente)",
"musizierenRythmus": "Musizieren (Rythmusinstrumente)",
"musizierenStreich": "Musizieren (Streichinstrumente)",
"musizierenZupf": "Musizieren (Zupfinstrumente)",
"naturkunde": "Naturkunde",
"ninjutsu": "NinJutsu",
"orakelkunst": "Orakelkunst",
"pflanzenkunde": "Pflanzenkunde",
"raunen": "Raunen",
"reiten": "Reiten",
"reiterkampf": "Reiterkampf",
"rutengehen": "Rutengehen",
"scharfschiessen": "Scharfschießen",
"schiesskunst": "Schießkunst",
"schleichen": "Schleichen",
"schloesserOeffnen": "Schlösser öffnen",
"schmerzErtragen": "Schmerzen ertragen",
"schwimmen": "Schwimmen",
"seilkunst": "Seilkunst",
"selbstkontrolle": "Selbstkontrolle",
"singen": "Singen",
"skifahren": "Skifahren",
"spinnengang": "Spinnengang",
"speerfechten": "Speerfechten",
"spurensuche": "Spurensuche",
"stehlen": "Stehlen",
"taitschi": "TaiTschi",
"tarnen": "Tarnen",
"tanzen": "Tanzen",
"tauchen": "Tauchen",
"thaumagraphie": "Thaumagraphie",
"thaumalogie": "Thaumalogie",
"tierkunde": "Tierkunde",
"ueberlebenWald": "Überleben (Wald)",
"ueberlebenSteppe": "Überleben (Steppe)",
"ueberlebenGebirge": "Überleben (Gebirge)",
"verfuehren": "Verführen",
"verhoeren": "Verhören",
"verstellen": "Verstellen",
"volkstanz": "Volkstanz",
"wagenlenken": "Wagenlenken",
"wahrsagen": "Wahrsagen",
"wasserkampf": "Wasserkampf",
"zauberkunde": "Zauberkunde",
"midgard5.spell-target-umgebung": "Umgebung",
"midgard5.spell-target-geist": "Geist",
"midgard5.spell-target-koerper": "Körper",
"armor": "Rüstung",
"defense": "Abwehr",
"damageBonus": "Schadensbonus",
"damageBonus-short": "SchB",
"attackBonus": "Angriffsbonus",
"attackBonus-short": "AnB",
"defenseBonus": "Abwehrbonus",
"defenseBonus-short": "AbB",
"movementBonus": "Bewegunsbonus",
"resistanceMind": "Resistenz Geist",
"resistanceBody": "Resistenz Körper",
"spellCasting": "Zaubern",
"spellBonus": "Zauberbonus",
"brawl": "Raufen",
"poisonResistance": "Gifttolleranz",
"enduranceBonus": "Ausdauerbonus",
"lpProtection": "Rüstungsschutz (LP)",
"apProtection": "Rüstungsschutz (AP)",
"deprivation": "Zähigkeit",
"deprivations": "Entbehrungen",
"deprivationCold": "Zähigkeit Kälte",
"deprivationHeat": "Zähigkeit Hitze",
"deprivationFood": "Zähigkeit Durst/Hunger",
"midgard5.spell-type": "Art",
"midgard5.spell-process": "Prozess",
"midgard5.spell-castDuration": "Zauberdauer",
"midgard5.spell-range": "Reichweite",
"midgard5.spell-effectTarget": "Wirkunsziel",
"midgard5.spell-effectArea": "Wirkungsbereich",
"midgard5.spell-effectDuration": "Wirkungsdauer",
"midgard5.spell-origin": "Ursprung",
"new-skill": "Neue Fertigkeit",
"special": "Spezial",
"learned-skill": "Gelernte Fertigkeit",
"learned-skills": "Gelernte Fertigkeiten",
"language": "Sprache",
"languages": "Sprachen",
"writings": "Schriften",
"weapon-skill": "Waffenfertigkeit",
"weapon-skills": "Waffenfertigkeiten",
"unlearned-skill": "Ungelernte Fertigkeit",
"unlearned-skills": "Ungelernte Fertigkeiten",
"innate-ability": "Angeborene/Besondere Fähigkeit",
"innate-abilities": "Angeborene und besondere Fähigkeiten",
"midgard5.mod-operation-add100": "Addieren (max 100)",
"midgard5.mod-operation-add": "Addieren",
"midgard5.mod-operation-set": "Basiswert",
"midgard5.mod-operation-fixed": "Fester Wert",
"base-damage": "Grundschaden",
"weapon": "Waffe",
"weapons": "Waffen",
"defensive-weapon": "Verteidigungswaffe",
"defensive-weapons": "Verteidigungswaffen",
"no-skill": "Keine Fertigkeit",
"magic": "magisch",
"valuable": "Vermögen",
"equipped": "Ausgerüstet",
"active": "Aktiv",
"rangedWeapon": "Schusswaffe",
"assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um hier etwas auswählen zu können",
"showAll": "Alle anzeigen",
"showUnlearned": "Ungelernte Fertigkeiten",
"wealthAndWeight": "Vermögen und Lasten",
"itemsInContainers": "Gegenstände in Aufbewahrung",
"allItems": "Alle Gegenstände",
"midgard5.mod-stat-defenseBonus": "Abwehrbonus",
"midgard5.mod-stat-attackBonus": "Angriffsbonus",
"midgard5.mod-stat-damageBonus": "Schadensbonus",
"midgard5.mod-stat-movement": "Bewegung",
"midgard5.mod-stat-resistanceMind": "Resistenz Geist",
"midgard5.mod-stat-resistanceBody": "Resistenz Körper",
"midgard5.mod-stat-spellCasting": "Zaubern",
"midgard5.mod-stat-brawl": "Raufen",
"midgard5.mod-stat-poisonResistance": "Giftresistenz",
"midgard5.mod-stat-lp": "Lebenspunkte",
"midgard5.mod-stat-ap": "Ausdauerpunkte",
"pw": "Prüfwurf",
"attack": "Angriff",
"damage": "Schaden",
"midgard5.mod-type": "Typ der Modifikation",
"midgard5.mod-id": "Was soll modifiziert werden",
"midgard5.mod-operation": "Wie soll modifiziert werden",
"midgard5.mod-value": "Wert",
"skill-goup-alltag": "Alltag",
"skill-goup-freiland": "Freiland",
"skill-goup-halbwelt": "Halbwelt",
"skill-goup-kampf": "Kampf",
"skill-goup-koerper": "Körper",
"skill-goup-sozial": "Sozial",
"skill-goup-unterwelt": "Unterwelt",
"skill-goup-waffen": "Waffen",
"skill-goup-wissen": "Wissen",
"spell-process-none": "Ohne",
"spell-process-artefakte": "Artefakte",
"spell-process-beherrschen": "Beherrschen",
"spell-process-bewegen": "Bewegen",
"spell-process-beschwoeren": "Beschwören",
"spell-process-blutmagie": "Blutmagie",
"spell-process-chaoswunder": "Chaoswunder",
"spell-process-dweomer": "Dweomer",
"spell-process-erkennen": "Erkennen",
"spell-process-erschaffen": "Erschaffen",
"spell-process-erhaltung": "Erhaltung",
"spell-process-formen": "Formen",
"spell-process-finstere_magie": "Finstere Magie",
"spell-process-kampfverse": "Kampfverse",
"spell-process-namensmagie": "Namensmagie",
"spell-process-nekromantie": "Nekromantie",
"spell-process-runenstaebe": "Runenstäbe",
"spell-process-thaumatherapie": "Thaumatherapie",
"spell-process-thaumagraphie": "Thaumagraphie",
"spell-process-veraendern": "Verändern",
"spell-process-vigilsignien": "Vigilsignien",
"spell-process-wundertat": "Wundertat",
"spell-process-wilder_dweomer": "Wilder Dweomer",
"spell-process-zerstoeren": "Zerstören",
"spell-process-zauberlied": "Zauberlieder",
"spell-process-zaubersalz": "Zaubersalze",
"spell-process-zaubermittel": "Zaubermittel",
"spell-process-zauberschutz": "Zauberschutz",
"spell-process-zauberrunen": "Zauberrunen",
"spell-process-zaubersiegel": "Zaubersiegel",
"spell-process-zaubertaenze": "Zaubertänze",
"spell-process-zauberblaetter": "Zauberblätter",
"spell-type-gedanke": "Gedanke",
"spell-type-geste": "Geste",
"spell-type-wort": "Wort",
"spell-target-umgebung": "Umgebung",
"spell-target-geist": "Geist",
"spell-target-koerper": "Körper",
"spell-type": "Art",
"spell-process": "Prozess",
"spell-castDuration": "Zauberdauer",
"spell-castDuration-short": "Zd",
"spell-range": "Reichweite",
"spell-range-short": "Rw",
"spell-effectTarget": "Wirkunsziel",
"spell-effectTarget-short": "Wz",
"spell-effectArea": "Wirkungsbereich",
"spell-effectArea-short": "Wb",
"spell-effectDuration": "Wirkungsdauer",
"spell-effectDuration-short": "Wd",
"spell-origin": "Ursprung",
"spell-agens": "Agens",
"spell-reagens": "Reagens",
"spell-material": "Zaubermaterial",
"spell-rank": "Stufe",
"kampfkunst-type": "Form",
"kampfkunst-variante": "Variante",
"kampfkunst-variante-short": "Var",
"kampfkunst-ep": "Erfahrungspunkte",
"kampfkunst-rank": "Stufe der Technik",
"kampfkunst-weapon": "Waffengruppe",
"kampfkunst-enemy": "Einschränkungen durch Art der Gegner",
"kampfkunst-type-angriff": "Angriff",
"kampfkunst-type-verteidigung": "Verteidigung",
"kampfkunst-type-finte": "Finte",
"kampfkunst-type-geist": "Geistestechnik",
"kampfkunst-type-schießkunst": "Schießkunst",
"kampfkunst-type-fechtkunst": "Fechtkunst",
"kampfkunst-variante-anstuermen": "Anstürmen",
"kampfkunst-variante-attackieren": "Attackieren",
"kampfkunst-variante-entwaffnen": "Entwaffnen",
"kampfkunst-variante-fechten": "Fechten",
"kampfkunst-variante-schusstechnik": "Schusstechnik",
"kampfkunst-variante-finten": "Finten",
"kampfkunst-variante-geistestechnik": "Geistestechnik",
"kampfkunst-variante-verteidigung": "Verteidigung",
"kido-type": "KiDo Form",
"kido-variante": "KiDo Variante",
"kido-color": "Kampfstilfarbe",
"kido-style": "Art der Technik",
"kido-rank": "Stufe der Technik",
"kido-grade": "Ausbildungsgrad",
"kido-enemy": "Einschränkungen durch Art der Gegner",
"kido-weapon": "Waffengruppe",
"kido-type-angriff": "Kido Angriff",
"kido-type-verteidigung": "Kido Verteidigung",
"kido-type-finte": "Kido Finte",
"kido-type-leib": "Kido Leibestechnik",
"kido-variante-anspringen": "Anspringen",
"kido-variante-attackieren": "Attackieren",
"kido-variante-entwaffnen": "Entwaffnen",
"kido-variante-werfen": "Werfen",
"kido-variante-ausweichen": "Ausweichen",
"kido-variante-blockieren": "Blockieren",
"kido-variante-bewegen": "Bewegen",
"kido-variante-kontrollieren": "Kontrollieren",
"kido-variante-finte": "Finte",
"mod-operation-add100": "Addieren (max 100)",
"mod-operation-roll": "Wurf Modifikation",
"mod-operation-add": "Addieren",
"mod-operation-set": "Basiswert",
"mod-operation-fixed": "Fester Wert",
"mod-operation-subtract": "Subtrahieren",
"mod-operation-multiply": "Multiplizieren",
"mod-operation-division": "Dividieren",
"mod-stat-defenseBonus": "Abwehrbonus",
"mod-stat-attackBonus": "Angriffsbonus",
"mod-stat-damageBonus": "Schadensbonus",
"mod-stat-movement": "Bewegung",
"mod-stat-resistanceMind": "Resistenz Geist",
"mod-stat-resistanceBody": "Resistenz Körper",
"mod-stat-spellCasting": "Zaubern",
"mod-stat-brawl": "Raufen",
"mod-stat-poisonResistance": "Gifttolleranz",
"mod-stat-lp": "Lebenspunkte",
"mod-stat-ap": "Ausdauerpunkte",
"mod-stat-lpProtection": "Rüstungsschutz (LP)",
"mod-stat-apProtection": "Rüstungsschutz (AP)",
"mod-stat-deprivationCold": "Entbehrungen Kälte",
"mod-stat-deprivationHeat": "Entbehrungen Hitze",
"mod-stat-deprivationFood": "Entbehrungen Durst/Hunger",
"mod-type": "Typ der Modifikation",
"mod-id": "Was soll modifiziert werden",
"mod-operation": "Wie soll modifiziert werden",
"mod-value": "Wert",
"type": "Typ",
"formula": "Formel",
"roll": "Wurf",
"chat": {
"luckPoint": "Glückspunkt",
"destiny": "Schicksalsgunst",
"modify": "Nachträglich",
"cancel": "Abbrechen",
"roll": "Würfeln",
"reroll": "Neuwürfeln",
"options": {
"modifier": "Wurfmodifikator",
"difficulty": "Erfolg",
"rollMode": "Würfelmodus"
}
}
}
"midgard5.type": "Typ",
"midgard5.formula": "Formel",
"midgard5.roll": "Wurf"
}

BIN
midgard5e-v1.2.3.zip Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M274.663 63.02L90.792 80.26l154.193 19.273c5.063-13.339 12.952-24.341 22.541-31.828a52.072 52.072 0 0 1 7.137-4.683zm19.832 12.803c-5.092.166-10.492 2.296-15.879 6.502-7.835 6.118-15.009 16.575-18.83 29.688-3.821 13.112-3.477 26.099-.289 35.927 3.188 9.829 8.73 16.071 15.633 18.395 6.903 2.324 14.766.596 22.601-5.522 7.835-6.117 15.01-16.574 18.83-29.687 3.822-13.113 3.48-26.1.292-35.928-3.189-9.828-8.73-16.07-15.633-18.394a19.017 19.017 0 0 0-6.725-.98zm166.85 9.485c-24.113 13.949-46.193 20.298-87.233 17.252L340.48 228.452c-.675 2.682-.318 6 1.922 10.87 2.243 4.876 6.355 10.89 11.836 17.607 9.99 12.242 24.527 27.16 39.573 44.238 14.56-5.5 28.23-12.828 38.972-20.19 11.841-8.113 20.234-16.95 21.965-19.939l42.027-118.22c-16.748-14.613-29.471-33.974-35.43-57.51zm-288.07 51.261L23.652 158.331l89.309 12.988 2.158-5.052zm286.265 2.325l16.941 6.078-39.123 109.037-37.212 19.181-8.247-15.998 30.913-15.933zm-259.842 4.394l-70.586 36.043-29.222 68.422 19.218 8.809 24.905-57.764 59.299-22.973-14.702 75.955-.963 1.477c-32.725 50.18-71.654 93.41-118.464 134.28L42.722 432.98l17.021 7.245 31.875-43.989 1.38-.906c45.476-29.872 75.93-62.333 112.255-94.492l4.533-4.012 5.426 2.686c23.365 11.571 42.934 24.117 62.107 37.705l8.924 6.324-69.006 65.643 24.649 39.794 17.67-10.308-20.078-28.477 8.224-5.004c29.884-18.186 49.986-39.43 71.938-66.039-23.653-35.6-42.006-49.433-71.592-71.267l9.908-7.227c34.703-25.312 38.132-54.476 41.61-79.449-9.203 4.441-19.498 5.772-29.473 2.414-13.488-4.54-22.924-16.472-27.465-30.473-.17-.522-.321-1.054-.479-1.584zm116.62 45.04c-1.355 7.027-3.324 14.17-6.092 21.349l14.056 9.666 5.938-22.223zm-174.243 97.476l-126.85 17.953 99.67 14.105a598.987 598.987 0 0 0 27.18-32.058zm91.781 82.73l-95.892 21.432 59.406 13.277z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M214.475 29.258L161.77 81.96c16.936 20.538 28.36 42.014 27.927 65.403-.452 24.518-14.472 48.98-43.79 73.528l5.99 17.694c71.606-19.315 130.42-50.42 170.478-101.428l-107.9-107.898zm-57.424 77.54L21.24 211.07v51.764l149.748-115.11c.008-.236.02-.472.026-.706.24-13-4.75-26.334-13.96-40.22zm276.18 3.19l-36.34 84.352 70.038-48.074-33.7-36.278zm-97.543 40.48c-42.955 53.685-105.04 86.063-177.787 105.852l14.08 41.59c18.005.184 38.99-3.06 60.754-9.574.94-1.584 1.904-3.157 2.924-4.705 23.146-35.122 66.755-62.113 114.967-66.79 8.404-8.93 16.06-18.51 22.73-28.705l-37.668-37.666zm29.745 84.34c-47.143 0-92.654 26.458-114.168 59.106-10.757 16.324-15.532 33.768-12.805 50.416 2.726 16.648 12.827 33.23 34.772 48.188l6.118 4.168c13.21 6.097 27.513 9.598 40.26 10.794l-38.04 5.555-20.562 43.145c11.34 9.924 24.012 17.9 37.492 23.927l10.53-45.236 18.202 4.24-11.09 47.646c13.566 4.21 27.673 6.614 41.858 7.203v-52.015h18.688v51.74c13.787-.973 27.45-3.665 40.56-8.07l-10.443-46.578 18.236-4.09 9.77 43.57c11.56-5.517 22.482-12.496 32.422-20.94l-21.39-44.884-35.71-5.213c10.606-.995 22.29-3.588 33.524-7.94l12.13-5.782c24.48-15.652 35.938-32.698 39.337-49.32 3.44-16.818-1.263-34.156-12.35-50.5-22.174-32.69-70.172-59.13-117.34-59.13zm-50.62 84.174c19.09 0 34.567 15.475 34.567 34.565 0 19.09-15.48 34.566-34.567 34.566-19.09 0-34.565-15.476-34.565-34.566 0-19.09 15.474-34.565 34.565-34.565zm105.547 0c19.09 0 34.564 15.476 34.564 34.565 0 19.09-15.476 34.566-34.565 34.566-19.09 0-34.565-15.476-34.565-34.566 0-19.09 15.474-34.565 34.564-34.565zm-233.737 3.747l-108.115.26 24.996 43.334 83.12-43.595zm23.623 15.715l-56.36 83.56 44.692 15.724 11.668-99.285zm107.7 9.703c-5.715 0-10.147 4.433-10.147 10.147 0 5.715 4.432 10.146 10.145 10.146 5.714 0 10.147-4.43 10.147-10.145s-4.43-10.147-10.147-10.147zm99.28 0c-5.715 0-10.146 4.432-10.146 10.147 0 5.714 4.433 10.146 10.147 10.146 5.713 0 10.146-4.43 10.146-10.145 0-5.714-4.432-10.147-10.146-10.147zm-49.835 14.297l23.046 53.694c-11.686 7.06-33.125 7.013-44.42 1.95l21.375-55.645z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M45.906 23.625v9.344c0 102.68 10.49 205.087 41.125 288.155 30.637 83.068 82.364 147.415 163.75 169.78l2.22.626 2.22-.5C344.49 472 396.864 407.39 425.593 323.47c28.728-83.92 35.25-187.777 35.25-290.5v-9.345H45.906zM64.72 42.313H442.06c-.413 98.8-7.497 197.342-34.125 275.125-27.21 79.487-73.39 136.637-154.375 154.78-73.28-21.03-119.914-78.696-149-157.562-28.475-77.212-39.206-174.13-39.843-272.344zm18.81 18.75c.807 84.13 12.486 172.823 39.314 244.812 7.825 20.998 16.874 40.495 27.25 58.063l45.844-38.438-40.75-75.063-5.47-10.062 10.97-3.344s38.865-11.786 60.406-18.25l20.437-7.25-94.843-150.468H83.53zm160.25 0l45.782 91.5 132.407-43.157c.69-16.205 1.053-32.366 1.155-48.344H243.78zm177.157 68.343L298.031 169.47l24.908 49.78 25.875 48.72 53.28-1.845c10.245-42.834 16.03-89.664 18.844-136.72zM310.908 236.47l-30.75 10.374 67.25 145.187c17.813-23.2 31.737-51.6 42.624-83.686 2.578-7.595 4.966-15.39 7.19-23.344l-53.626 1.844-5.844.22-2.75-5.158-24.094-45.437zm-99.22 4.686c-13.133 3.972-27.346 8.262-34.625 10.47L216 323.28l3.625 6.72-5.844 4.906-53.56 44.906c24.67 35.91 55.887 61.828 94.655 73.125 30.34-6.91 55.36-21.496 76.03-42.062L211.69 241.155z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M246.8 35.58l25.5 52.5 24.8-22.9-50.3-29.6zm109.1 13.41l-10.3 9.51 52.9 57.3 10.3-9.5-52.9-57.31zm-30.3 14.37l-57.3 52.94 66.5 72 57.3-53-66.5-71.94zM181.8 93.33l-19.5 49.17L196 187l-14.2-93.67zM75.81 127l-32.42 13.8 94.41 52.1L75.81 127zm186.09 8.9l-16.2 15-32 44.1 62.7-18.2-33.6 70.7 32.4-17.8 39.6-36.6-52.9-57.2zm232.1 2.4c-3.1.8-6.1 1.6-9.2 2.3-25.7 5.9-51.9 8.5-74.5 2.3l-69.4 64.2c4.5 23-.2 48.9-8.1 74.1-8.7 27.5-21.6 54.1-32.9 75.4 60.6 17.3 133-11.2 187.1-61.1 2.4-2.2 4.7-4.5 7-6.7V138.3zM76.71 232.6l-18.78 37.6 72.57-21.6-53.79-16zm117.19 48l-24 51.8-21-34.4-47.2 196H182l37.2-154.6-25.7 29.5.4-88.3z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 880 B

View File

@ -0,0 +1 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M279.775 17.137c-18.823-.262-38.412 6.822-51.54 20.02l-5.858 5.89-6.535-5.127c-35.796-28.083-78.147-22.538-98.727 10.39l-3.465 5.547-6.398-1.357c-27.027-5.737-53.6 4.882-69.373 23.047-15.776 18.165-21.16 42.634-5.937 68.43l3.68 6.234-5.12 5.122c-7.12 7.122-9.71 16.235-8.956 26.824.753 10.59 5.242 22.277 12.04 31.98 6.8 9.705 15.853 17.3 24.67 20.634 8.82 3.333 16.93 3.112 25.68-2.877l6.626-4.538 5.48 5.868c18.752 20.07 63.427 19.456 81.504-9.315l4.967-7.906 7.91 4.96c9.652 6.05 21.095 6.628 32.078 3.243 10.983-3.384 21.017-10.924 26.445-19.56l8.34-13.272 7.707 13.648c5.984 10.6 21.754 20.7 39.238 24.517 17.485 3.818 35.716 1.47 46.955-7.793l7.116-5.863 5.96 7.036c13.405 15.834 34.384 19.713 51.292 15.234 8.453-2.24 15.61-6.562 20.1-11.894 4.49-5.332 6.64-11.394 5.548-19.36l-1.412-10.292 10.386-.317c14.28-.435 23.67-5.757 30.195-13.635 6.527-7.877 9.99-18.775 9.966-30.103-.05-22.658-12.994-45.11-39.104-48.66l-9.843-1.34 1.936-9.743c1.49-7.49-1.057-16.514-7.54-25.764-6.485-9.25-16.708-18.272-28.37-24.904-11.662-6.634-24.726-10.866-36.596-11.388-11.87-.522-22.266 2.385-30.62 9.863l-7.743 6.934-6.072-8.437c-10.336-14.36-27.786-21.715-46.61-21.976zm-23.13 207.613c-7.79 7.932-17.737 13.957-28.64 17.316-12.57 3.874-26.675 4.027-39.61-1.3-13.607 16.66-33.646 25.044-53.58 25.658.803 2.694 2.022 5.36 3.65 7.885 4.48 6.947 11.786 12.436 20.377 14.188 8.59 1.752 18.766.2 30.504-8.578l9.133-6.828 4.9 10.295c1.805 3.793 10.955 9.652 22.417 10.94 11.462 1.286 23.836-1.518 30.982-8.206l7.2-6.737 6.34 7.55c7.687 9.153 18.164 11.31 28.223 9.768 10.06-1.54 18.25-8.15 19.394-10.936l4.225-10.297 9.41 5.943c9.343 5.9 17.365 6.48 24.47 4.494 7.103-1.987 13.382-6.983 17.39-13.273 3.672-5.763 5.297-12.387 4.51-18.327-7.83-2.86-15.302-7.21-21.903-13.22-16.45 9.763-37.038 10.807-55.794 6.712-16.836-3.676-32.71-11.465-43.6-23.045zm5.767 80.373c-7.74 4.837-16.592 7.306-25.443 8.002v41.938c-39.484 1.013-74.942 4.618-102.22 10.093-16.214 3.255-29.515 7.07-39.53 11.844-5.01 2.387-9.234 4.994-12.69 8.406-3.454 3.412-6.343 8.197-6.343 13.75 0 5.553 2.866 10.328 6.313 13.75 3.447 3.422 7.682 6.03 12.688 8.438 10.01 4.818 23.314 8.72 39.53 12.03 20.218 4.13 44.93 7.244 72.438 9-15.85 21.005-36.292 38.707-56.937 50.438H364.5c-20.393-12.03-39.75-29.664-54.72-50.312 28.51-1.726 54.114-4.872 74.94-9.125 16.215-3.312 29.52-7.213 39.53-12.03 5.006-2.41 9.24-5.016 12.688-8.44 3.446-3.42 6.28-8.196 6.28-13.75 0-5.55-2.857-10.337-6.312-13.75-3.455-3.41-7.68-6.018-12.687-8.405-10.017-4.773-23.32-8.59-39.533-11.844-27.645-5.55-63.688-9.17-103.812-10.125v-40.776c-6.473-1.61-12.817-4.55-18.463-9.13zm19.12 68.596c38.834.986 73.608 4.558 99.468 9.75 15.31 3.072 27.538 6.774 35.156 10.405 3.81 1.815 6.438 3.64 7.625 4.813.298.293.28.317.408.468-.13.156-.123.188-.438.5-1.196 1.187-3.814 3.04-7.625 4.875-7.622 3.67-19.85 7.406-35.156 10.533-22.08 4.51-50.67 7.833-82.72 9.343-8.816-16.007-14.824-33.213-16.72-50.687zm-45.157.06c-1.88 17.484-8.158 34.644-17.28 50.533-31.217-1.555-59.056-4.838-80.657-9.25-15.308-3.127-27.534-6.863-35.157-10.532-3.81-1.833-6.428-3.686-7.624-4.874-.32-.318-.31-.344-.437-.5.126-.15.134-.17.436-.47 1.188-1.17 3.785-2.996 7.594-4.81 7.62-3.632 19.846-7.334 35.156-10.407 25.525-5.125 59.738-8.648 97.97-9.69z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M375.483 251.243l-109.98 51.138.213 183.381L477.01 266.346l-86.993-21.81zm-12.736 108.626l-5.947 14.699-48.604-8.955 5.007-12.832a141.306 141.306 0 0 0 13.51-11.358 167.184 167.184 0 0 0 16.566-17.517 170.478 170.478 0 0 0 12.606-17.958 115.607 115.607 0 0 0 9.514-17.97l14.068 2.51q-9.37 22.334-30.361 44.43-13.296 13.64-20.645 18.636zM121.603 244.334l-84.71 21.763L246.474 486V302.38l-109.946-51.137zm19.147 50.852a28.72 28.72 0 0 1 24.273 6.802 53.052 53.052 0 0 1 11.226 14.188l-13.081 2.676a28.542 28.542 0 0 0-5.388-7.374q-5.185-4.876-11.262-3.853l-.487.095a6.458 6.458 0 0 0-5.162 4.448c-.856 2.378-.238 5.554 1.796 9.371q4.08 7.6 10.81 9.027a23.785 23.785 0 0 0 8.563-.203l1.867-.344 5.791 10.822q-6.398 1.427-8.23 3.282-3.21 3.14.429 9.93a17.042 17.042 0 0 0 6.089 6.696 10.406 10.406 0 0 0 7.385 1.534l.416-.083q4.757-.964 5.079-4.757c.261-2.57-.655-5.744-2.748-9.514l12.38-2.545a49.247 49.247 0 0 1 4.103 11.226 19.956 19.956 0 0 1-.642 9.383 11.702 11.702 0 0 1-3.96 5.411 19.575 19.575 0 0 1-8.027 3.235l-1.19.214a27.971 27.971 0 0 1-17.494-2.7 32.193 32.193 0 0 1-14.128-14.092q-3.627-6.79-2.604-12.19a8.396 8.396 0 0 1 2.521-4.947h-.071q-1.844.31-7.04-2.497a32.11 32.11 0 0 1-12.916-13.593q-5.245-9.764-3.282-18.398 1.962-8.634 13.676-11zM27.19 248.865l108.78-116.309a7.135 7.135 0 0 1 1.427 0h.154q3.14.345 2.842 3.71a19.36 19.36 0 0 1-3.294 8.1 39.376 39.376 0 0 1-9.728 10.405q-3.912 2.938-15.044 9.514-12.796 7.505-19.55 14.77a92.535 92.535 0 0 0-11.513 14.486l32.907 3.758 8.182-12.963-20.967-2.378a36.415 36.415 0 0 1 4.757-3.83q2.379-1.605 8.444-5.125l6.422-3.747a92.975 92.975 0 0 0 12.903-8.776 61.472 61.472 0 0 0 12.51-14.414q6.84-10.846 6.494-17.957c-.19-3.949-2.105-6.434-5.684-7.505l79.798-85.161-102.097 179.576-5.708 10.06zm367.238-71.974q-3.817-5.458-3.758-8.515c0-2.033 1.19-3.199 3.568-3.448h.57a11.892 11.892 0 0 1 6.91 2.247 29.85 29.85 0 0 1 7.837 8.051q3.687 5.28 3.71 8.397c0 2.093-1.188 3.258-3.496 3.567h-.594a11.75 11.75 0 0 1-6.957-2.378 29.79 29.79 0 0 1-7.79-7.885zm-109.41-141.52l83.948 89.634h-1.189c-.38 0-.975 0-1.463.107q-7.825.892-8.324 6.862-.5 5.97 5.03 13.747a53.778 53.778 0 0 0 6.375 7.374 37.901 37.901 0 0 0 10.144 6.897q-2.117 2.89-.702 7.98a37.283 37.283 0 0 0 5.613 11.096 55.122 55.122 0 0 0 15.223 14.806q8.098 5.268 16.066 4.935.81 0 1.618-.13 8.776-.988 9.228-7.873a16.114 16.114 0 0 0-.463-4.853l58.689 62.686-91.572-22.941-6.1-10.703zm98.22 104.927l2.45 2.617c.451.57.903 1.189 1.355 1.784 1.808 2.592 2.723 4.757 2.723 6.529 0 1.771-1.034 2.782-3.127 3.02h-.512a10.346 10.346 0 0 1-6.077-1.95 22.596 22.596 0 0 1-6.184-6.137c-1.974-2.83-2.937-5.102-2.878-6.814.06-1.713 1.118-2.7 3.187-2.937h.524a10.263 10.263 0 0 1 6.005 1.879 19.147 19.147 0 0 1 2.533 2.01zM255.987 26L137.456 231.026l118.532 55.05 118.604-55.05zm-1.19 208.463q-17.529 0-24.58-12.273-7.053-12.273-7.053-34.988 0-22.714 7.052-35.047 7.052-12.332 24.582-12.344 17.53 0 24.582 12.332 7.052 12.333 7.052 35.047 0 22.715-7.052 34.988-7.053 12.273-24.582 12.285zm10.538-71.807q2.497 7.968 2.497 24.546 0 15.817-2.497 24.201-2.498 8.384-10.537 8.325-8.04 0-10.632-8.325-2.593-8.324-2.593-24.2 0-16.579 2.593-24.547t10.632-7.968q8.015-.012 10.513 7.956z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><polygon points="384,477.7,256,426.67,128,477.7,108.2,341.33,0,256,108.2,170.67,128,34.3,256,85.33,384,34.3,403.8,170.67,512,256,403.8,341.33" fill="#ac2929" fill-opacity="1"></polygon><g class="" style="" transform="translate(0,0)"><path d="M375.483 251.243l-109.98 51.138.213 183.381L477.01 266.346l-86.993-21.81zm-12.736 108.626l-5.947 14.699-48.604-8.955 5.007-12.832a141.306 141.306 0 0 0 13.51-11.358 167.184 167.184 0 0 0 16.566-17.517 170.478 170.478 0 0 0 12.606-17.958 115.607 115.607 0 0 0 9.514-17.97l14.068 2.51q-9.37 22.334-30.361 44.43-13.296 13.64-20.645 18.636zM121.603 244.334l-84.71 21.763L246.474 486V302.38l-109.946-51.137zm19.147 50.852a28.72 28.72 0 0 1 24.273 6.802 53.052 53.052 0 0 1 11.226 14.188l-13.081 2.676a28.542 28.542 0 0 0-5.388-7.374q-5.185-4.876-11.262-3.853l-.487.095a6.458 6.458 0 0 0-5.162 4.448c-.856 2.378-.238 5.554 1.796 9.371q4.08 7.6 10.81 9.027a23.785 23.785 0 0 0 8.563-.203l1.867-.344 5.791 10.822q-6.398 1.427-8.23 3.282-3.21 3.14.429 9.93a17.042 17.042 0 0 0 6.089 6.696 10.406 10.406 0 0 0 7.385 1.534l.416-.083q4.757-.964 5.079-4.757c.261-2.57-.655-5.744-2.748-9.514l12.38-2.545a49.247 49.247 0 0 1 4.103 11.226 19.956 19.956 0 0 1-.642 9.383 11.702 11.702 0 0 1-3.96 5.411 19.575 19.575 0 0 1-8.027 3.235l-1.19.214a27.971 27.971 0 0 1-17.494-2.7 32.193 32.193 0 0 1-14.128-14.092q-3.627-6.79-2.604-12.19a8.396 8.396 0 0 1 2.521-4.947h-.071q-1.844.31-7.04-2.497a32.11 32.11 0 0 1-12.916-13.593q-5.245-9.764-3.282-18.398 1.962-8.634 13.676-11zM27.19 248.865l108.78-116.309a7.135 7.135 0 0 1 1.427 0h.154q3.14.345 2.842 3.71a19.36 19.36 0 0 1-3.294 8.1 39.376 39.376 0 0 1-9.728 10.405q-3.912 2.938-15.044 9.514-12.796 7.505-19.55 14.77a92.535 92.535 0 0 0-11.513 14.486l32.907 3.758 8.182-12.963-20.967-2.378a36.415 36.415 0 0 1 4.757-3.83q2.379-1.605 8.444-5.125l6.422-3.747a92.975 92.975 0 0 0 12.903-8.776 61.472 61.472 0 0 0 12.51-14.414q6.84-10.846 6.494-17.957c-.19-3.949-2.105-6.434-5.684-7.505l79.798-85.161-102.097 179.576-5.708 10.06zm367.238-71.974q-3.817-5.458-3.758-8.515c0-2.033 1.19-3.199 3.568-3.448h.57a11.892 11.892 0 0 1 6.91 2.247 29.85 29.85 0 0 1 7.837 8.051q3.687 5.28 3.71 8.397c0 2.093-1.188 3.258-3.496 3.567h-.594a11.75 11.75 0 0 1-6.957-2.378 29.79 29.79 0 0 1-7.79-7.885zm-109.41-141.52l83.948 89.634h-1.189c-.38 0-.975 0-1.463.107q-7.825.892-8.324 6.862-.5 5.97 5.03 13.747a53.778 53.778 0 0 0 6.375 7.374 37.901 37.901 0 0 0 10.144 6.897q-2.117 2.89-.702 7.98a37.283 37.283 0 0 0 5.613 11.096 55.122 55.122 0 0 0 15.223 14.806q8.098 5.268 16.066 4.935.81 0 1.618-.13 8.776-.988 9.228-7.873a16.114 16.114 0 0 0-.463-4.853l58.689 62.686-91.572-22.941-6.1-10.703zm98.22 104.927l2.45 2.617c.451.57.903 1.189 1.355 1.784 1.808 2.592 2.723 4.757 2.723 6.529 0 1.771-1.034 2.782-3.127 3.02h-.512a10.346 10.346 0 0 1-6.077-1.95 22.596 22.596 0 0 1-6.184-6.137c-1.974-2.83-2.937-5.102-2.878-6.814.06-1.713 1.118-2.7 3.187-2.937h.524a10.263 10.263 0 0 1 6.005 1.879 19.147 19.147 0 0 1 2.533 2.01zM255.987 26L137.456 231.026l118.532 55.05 118.604-55.05zm-1.19 208.463q-17.529 0-24.58-12.273-7.053-12.273-7.053-34.988 0-22.714 7.052-35.047 7.052-12.332 24.582-12.344 17.53 0 24.582 12.332 7.052 12.333 7.052 35.047 0 22.715-7.052 34.988-7.053 12.273-24.582 12.285zm10.538-71.807q2.497 7.968 2.497 24.546 0 15.817-2.497 24.201-2.498 8.384-10.537 8.325-8.04 0-10.632-8.325-2.593-8.324-2.593-24.2 0-16.579 2.593-24.547t10.632-7.968q8.015-.012 10.513 7.956z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M248 20.3L72.33 132.6 248 128.8zm16 0v108.5l175.7 3.8zm51.4 58.9c6.1 3.5 8.2 7.2 15.1 4.2 10.7.8 22.3 5.8 27.6 15.7 4.7 4.5 1.5 12.6-5.2 12.6-9.7.1-19.7-6.1-14.6-8.3 4.7-2 14.7.9 10-5.5-3.6-4.5-11-7.8-16.3-5.9-1.6 6.8-9.4 4-12-.7-2.3-5.8-9.1-8.2-15-7.9-6.1 2.7 1.6 8.8 5.3 9.9 7.9 2.2.2 7.5-4.1 5.1-4.2-2.4-15-9.6-13.5-18.3 5.8-7.39 15.8-4.62 22.7-.9zm-108.5-3.5c5.5.5 12.3 3 10.2 9.9-4.3 7-9.8 13.1-18.1 14.8-6.5 3.4-14.9 4.4-21.6 1.9-3.7-2.3-13.5-9.3-14.9-3.4-2.1 14.8.7 13.1-11.1 17.8V92.3c9.9-3.9 21.1-4.5 30.3 1.3 8 4.2 19.4 1.5 24.2-5.7 1.4-6.5-8.1-4.6-12.2-3.4-2.7-8.2 7.9-7.5 13.2-8.8zm35 69.2L55.39 149l71.21 192.9zm28.2 0l115.3 197L456.6 149zm-14.1 7.5L138.9 352.6h234.2zm133.3 21.1c13.9 8.3 21.5 26.2 22.1 43-1.3 13.6-.7 19.8-15.2 21.4-14.5 1.6-23.9-19.2-29.7-32.6-3.4-9.9-5.8-24 1.7-31.3 6.1-4.8 15-4.1 21.1-.5zm-223.7 16.1c2.1 4-.5 11.4-4.8 12.1-4.9.7-3.8-9.3-9.4-11.6-6.9-2.3-13.6 5.6-15 11.6 10.4-4 20.3 7.1 20.3 17-.4 11.7-7.9 24.8-19.7 28.1h-5.6c-12.7-.7-18.3-15.8-14.2-26.6 4.4-15.8 10.8-33.9 27.2-40.6 8.5-3.9 19 3.2 21.2 10zm213.9-8.4c-7.1-.1-4.4 10-3.3 14.5 3.5 11.5 7.3 26.6 18.9 30 6.8-1.2 4.4-12.8 3.7-16.5-4.7-10.9-7.1-23.3-19.3-28zM52 186v173.2l61.9-5.7zm408 0l-61.9 167.5 61.9 5.7zm-117.9.7l28.5 63.5-10 4.4-20-43.3c-6.1 3-13 8.9-14.6-1.4-1.3-3.9 8.5-5.1 8.1-11.9-.3-6.9 2.2-12.2 8-11.3zm-212 27.4c-2.4 5.1-4.1 10.3-2.7 15.9 1.7 8.8 13.5 6.4 15.6-.8 2.7-5 3.9-11.7-.5-15.7-4.1-3.4-8.9-2.8-12.4.6zm328.4 41.6c-.1 18.6 1.1 39.2-9.7 55.3-.9 1.2-2.2 1.9-3.7 2.5-5.8-4.1-3-11.3 1.2-15.5 1 7.3 5.5-2.9 6.6-5.6 1.3-3.2 3.6-17.7-1-10.2.7 4-6.8 13.1-9.3 8.1-5-14.4 0-30.5 7-43.5 5.7-6.2 9.9 4.4 8.9 8.9zM59.93 245.5c.59.1 1.34 1 2.48 3.6v61.1c-7.3-7-4.47-18-4.45-26.4 0-8.4 1.65-16.3-1.28-23.2-4.62-1.7-5.79-17-3.17-12.7 4.41 4.8 4.66-2.7 6.42-2.4zm178.77 7.6c8.1 4.5 13.8 14.4 10.8 23.6-2.1 15.2-27 21.1-30.4 29.7-1.2 3 25.4 1.6 30.2 1.6.5 4 1.5 10.7-3.8 11.7-14.5-1.2-29.9-.6-45.1-.6.4-11.2 7.4-21.3 17-26.8 6.9-4.9 15.4-9.3 18.1-17.9 1.8-4.5-.6-9.3-4.6-11.5-4.2-2.9-11-2.3-13.2 2.7-2 3.8-4.4 9.1-8.7 9.6-2.9.4-9 .5-7.2-4.9 1.4-5.6 3.4-11.5 8.2-15.2 8.8-6.3 19.9-6.7 28.7-2zm53.3-1.4c6.8 2.2 12 7.9 14.3 14.6 6.1 14.7 5.5 33.1-4.4 45.9-4.5 4.8-10.2 9.1-17 9.1-12.5-.1-22.4-11.1-24.8-22.8-3.1-13.4-1.8-28.7 6.9-39.8 6.8-7.6 16-10.3 25-7zm156.1 8.1c-1.6 5.9-3.3 13.4-.7 19.3 5.1-2 5.4-9.6 6.6-14.5.9-6.1-3.5-12.6-5.9-4.8zm-176.2 21.1c.6 10.5 1.7 22.8 9.7 28.2 4.9 1.8 9.7-2.2 11.1-6.7 1.9-6.3 2.3-12.9 2.4-19.4-.2-7.1-1.5-15-6.7-20.1-12.2-4.4-15.3 10.9-16.5 18zM434 266.8V328l-4.4 6.7v-42.3c-4.6 7.5-9.1 9.1-6.1-.9 6.1-7.1 4.8-17.4 10.5-24.7zM83.85 279c.8 3.6 5.12 17.8 2.04 14.8-1.97-1.3-3.62-4.9-3.41-6.1-1.55-3-2.96-6.1-4.21-9.2-2.95 4-3.96 8.3-3.14 13.4.2-1.6 1.18-2.3 3.39-.7 7.84 12.6 12.17 29.1 7.29 43.5l-2.22 1.1c-10.36-5.8-11.4-19.4-13.43-30-1.55-12.3-.79-24.7 2.3-36.7 5.2-3.8 9.16 5.4 11.39 9.9zm-7.05 20.2c-4.06 4.7-2.26 12.8-.38 18.4 1.11 5.5 6.92 10.2 6.06 1.6.69-11.1-2.33-12.7-5.68-20zm66.4 69.4L256 491.7l112.8-123.1zm-21.4.3l-53.84 4.9 64.24 41.1c-2.6-2.7-4.9-5.7-7.1-8.8-5.2-6.9-10.5-13.6-18.9-16.6-8.75-6.5-4.2-5.3 2.9-2.6-1-1.8-.7-2.6.1-2.6 2.2-.2 8.4 4.2 9.8 6.3l24.7 31.6 65.1 41.7zm268.4 0l-42.4 46.3c6.4-3.1 11.3-8.5 17-12.4 2.4-1.4 3.7-1.9 4.3-1.9 2.1 0-5.4 7.1-7.7 10.3-9.4 9.8-16 23-28.6 29.1l18.9-24.5c-2.3 1.3-6 3.2-8.2 4.1l-40.3 44 74.5-47.6c5.4-6.7 1.9-5.6-5.7-.9l-11.4 6c11.4-13.7 30.8-28.3 40-35.6 9.2-7.3 15.9-9.8 8.2-1.5l-12.6 16c10-7.6.9 3.9-4.5 5.5-.7 1-1.4 2-2.2 2.9l54.5-34.9zM236 385.8v43.4h-13.4v-30c-5-1.4-10.4 1.7-15.3-.3-3.8-2.9 1-6.8 4.5-5.9 3.3-.1 7.6.2 9.3-3.2 4.4-4.5 9.6-4.4 14.9-4zm29 .5c12.1 1.2 24.2.6 36.6.6 1.5 3 .8 7.8-3.3 7.9-7.7.3-21-1.6-25.9.6-8.2 10.5 5.7 3.8 11.4 5.2 7 1.1 15 2.9 19.1 9.2 2.1 3.1 2.7 7.3.7 10.7-5.8 6.8-17 11.5-25.3 10.9-7.3-.6-15.6-1.1-20.6-7.1-6.4-10.6 10.5-6.7 12.2-3.2 6 5.3 20.3 1.9 20.7-4.7.6-4.2-2.1-6.3-6.9-7.8-4.8-1.5-12.6 1-17.3 1.8-4.7.8-9.6.5-9-4.4.8-4.2 2.7-8.1 2.7-12.5.1-3 1.7-7 4.9-7.2zm133.5 5c-.2-.2-7 5.8-9.9 8.1l-15.8 13.1c10.6-6.5 19.3-12 25.7-21.2zm-247 14.2c2.4 0 7.5 4.6 9.4 7l26.1 31.1c-7.7-2.1-13.3-7.1-17.6-13.7-6.5-7.3-11.3-16.6-21.2-19.6-9-5-5.2-6.4 2.1-2.2-.3-1.9.2-2.6 1.2-2.6z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M255.703 44.764c-6.176 0-12.353 1.384-17.137 4.152l-152.752 88.36c-9.57 5.535-9.57 14.29 0 19.826l152.752 88.359c9.57 5.536 24.703 5.536 34.272 0l152.754-88.36c9.57-5.534 9.57-14.289 0-19.824L272.838 48.916c-4.785-2.77-10.96-4.152-17.135-4.152zm-23.39 39.847l23.8 14.875-46.263 27.76 19.427 12.14a38.645 38.645 0 0 1 4.75-4.702c1.743-1.527 3.752-2.974 6.03-4.34 12.953-7.772 26.878-11.423 41.771-10.95 14.838.439 29.095 4.933 42.776 13.483 13.568 8.48 20.256 17.485 20.06 27.012-.148 9.498-7.198 18.43-21.148 26.8-6.026 3.616-12.705 6.767-20.037 9.45-7.23 2.689-15.166 4.908-23.805 6.658l-25.483-15.928c9.714-1.02 18.138-2.469 25.272-4.346 7.182-1.905 13.075-4.238 17.678-7 6.643-3.985 9.956-8.308 9.94-12.968-.026-4.724-3.318-9.137-9.878-13.237-6.616-4.135-13.752-6.24-21.408-6.316-7.609-.105-14.734 1.834-21.377 5.82-3.938 2.363-7.521 5.268-10.748 8.715-3.283 3.412-6.225 7.444-8.826 12.096l-70.645-44.153 68.113-40.869zm203.554 89.203c-1.938.074-4.218.858-6.955 2.413l-146.935 84.847c-9.57 5.527-17.14 18.638-17.14 29.69v157.699c0 11.05 7.57 15.419 17.14 9.89l146.937-84.843c9.57-5.527 17.137-18.636 17.137-29.688v-157.7c-2.497-8.048-5.23-12.495-10.184-12.308zm-359.763.48c-6.227 0-10.033 5.325-10.155 11.825v157.697c0 11.052 7.57 24.163 17.14 29.69l146.93 84.848c9.57 5.526 17.141 1.156 17.141-9.895v-157.7c0-11.051-7.57-24.159-17.14-29.687L83.09 176.225c-2.567-1.338-4.911-1.93-6.986-1.93zM393.4 233.587v24.264c-4.264-.079-8.281.397-12.052 1.43-3.771.973-7.454 2.538-11.045 4.693-7.722 4.633-13.737 11.055-18.047 19.267-4.31 8.154-6.825 17.955-7.543 29.405 2.963-4.65 6.174-8.715 9.63-12.196 3.458-3.54 7.228-6.535 11.313-8.986 10.28-6.168 18.565-7.211 24.85-3.129 6.33 4.055 9.494 12.442 9.494 25.16 0 14.066-3.524 27.462-10.572 40.19-7.049 12.668-16.498 22.558-28.35 29.67-13.064 7.838-23.188 8.17-30.371.992-7.138-7.263-10.707-21.474-10.707-42.631 0-21.685 4.175-41.216 12.525-58.592 8.395-17.462 19.889-30.57 34.479-39.324 4.624-2.775 9.112-5 13.467-6.676 4.354-1.675 8.665-2.854 12.93-3.537zm-242.789 13.582l27.635 16.58v85.809L192 357.809v25.414l-13.754-8.252v24.777l-23.502-14.102V360.87L112 335.223v-30.06l38.611-57.995zm4.133 31.355l-27.248 40.582 27.248 16.35v-56.932zm212.596 35.182c-1.706.057-3.703.773-5.992 2.147-4.535 2.72-7.947 6.701-10.237 11.943-2.244 5.156-3.367 11.572-3.367 19.25 0 7.678 1.123 12.777 3.367 15.299 2.29 2.436 5.702 2.295 10.237-.426 4.579-2.748 7.99-6.701 10.234-11.857 2.29-5.242 3.436-11.702 3.436-19.38 0-7.677-1.146-12.733-3.436-15.17-1.122-1.26-2.536-1.862-4.242-1.806z" fill="#fff" fill-opacity="1"></path></g></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 MiB

259
midgard5e/bundle.css Normal file
View File

@ -0,0 +1,259 @@
.midgard5 .flexrow {
align-items: center;
}
.midgard5 h3 {
margin-top: 1rem;
}
.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;
}
.midgard5 .sheet.character .description {
flex: 0 0 100%;
margin: 0;
}
.midgard5 .level-display {
text-align: right;
font-weight: bold;
}
.midgard5 td,
.midgard5 th {
padding: 0 0.5rem 0 0.5rem;
}
.midgard5 td.center,
.midgard5 th.center {
text-align: center;
}
.midgard5 td.fixed-value,
.midgard5 th.fixed-value {
width: 3rem;
text-align: center;
}
.midgard5 input.skill {
width: 5rem;
}
.midgard5 input.fixed {
width: 5rem;
}
.midgard5 .new-skill {
font-style: italic;
background: rgba(0, 0, 0, 0.3);
color: rgba(255, 255, 255);
}
.midgard5 .new-skill button {
background: rgba(255, 255, 255, 0.5);
}
.midgard5 button.roll-button {
background: url(/icons/svg/d20-black.svg) no-repeat;
background-size: 24px 24px;
width: 26px;
height: 26px;
}
.midgard5 span.spell-process {
color: #5d5d5d;
font-style: italic;
}
.midgard5 .filler {
flex: 1 1 auto;
}
.midgard5 .health-bar {
height: 2rem;
background-color: rgba(0, 0, 0, 0.8);
display: flex;
flex-direction: row;
gap: 1px;
padding: 1px;
}
.midgard5 .health-bar input {
flex: 0 0 3rem;
text-align: center;
height: 100%;
background-color: #6d6c66;
color: #ffffff;
font-weight: bold;
border-radius: 0;
}
.midgard5 .health-bar .lp-bar-item-empty,
.midgard5 .health-bar .ap-bar-item-empty {
flex-grow: 1;
background-color: #c9c9c9;
}
.midgard5 .health-bar .lp-bar-item {
flex-grow: 1;
background-color: #39ea8b;
}
.midgard5 .health-bar .ap-bar-item {
flex-grow: 1;
background-color: #39a3ea;
}
.midgard5 .health-bar .negative-bar-item {
flex-grow: 1;
background-color: #ea3939;
}
.midgard5 .attributes {
display: flex;
flex-direction: row;
margin-bottom: 0.5rem;
}
.midgard5 .attributes .attribute {
flex: 0 0 7rem;
margin: 0;
border: 1px solid rgba(0, 0, 0, 0.5);
border-radius: 10;
display: flex;
flex-direction: column;
}
.midgard5 .attributes .attribute .attribute-header {
display: flex;
align-items: center;
text-align: center;
justify-content: center;
font-weight: bold;
background-color: rgba(0, 0, 0, 0.5);
color: #ffffff;
height: 2.5rem;
}
.midgard5 .attributes .attribute .attribute-main {
padding: 0.2rem;
}
.midgard5 .attributes .attribute .attribute-main .attribute-main-value {
text-align: center;
vertical-align: middle;
font-size: 2rem;
}
.midgard5 .attributes .attribute .attribute-main .attribute-main-bonus {
text-align: center;
vertical-align: middle;
font-size: 1rem;
}
.midgard5 .attributes .attribute .attribute-footer {
display: flex;
flex-direction: row;
gap: 0.3rem;
padding: 0.3rem;
background-color: rgba(0, 0, 0, 0.5);
}
.midgard5 .attributes .attribute .attribute-footer input {
flex-grow: 1;
text-align: center;
background-color: rgba(255, 255, 255, 0.8);
}
.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.item td,
.midgard5.sheet.item th {
padding: 0 0.5rem 0 0.5rem;
}
.midgard5.sheet.item td.center,
.midgard5.sheet.item th.center {
text-align: center;
}
.midgard5.sheet.item td.fixed-value,
.midgard5.sheet.item th.fixed-value {
width: 3rem;
text-align: center;
}
.midgard5.sheet.item table.rolls-table .col-enabled {
width: 3rem;
text-align: center;
}
.midgard5.sheet.item table.rolls-table .col-create {
width: 3rem;
text-align: center;
}
.midgard5.sheet.item table.rolls-table .col-create button {
background: rgba(255, 255, 255, 0.5);
}
.midgard5.sheet.item table.rolls-table .col-delete {
width: 3rem;
text-align: center;
}
.midgard5.sheet.item table.rolls-table .col-label {
width: 6rem;
}
.m5-roll .roll-title {
text-align: center;
vertical-align: middle;
padding: 0.3rem 0 0.1rem 0;
font-weight: bold;
font-size: 1.3rem;
}
.m5-roll .roll-spell-details {
text-align: right;
padding-right: 1rem;
font-weight: bold;
}
.m5-roll .roll-result {
text-align: right;
padding-right: 1rem;
font-weight: bold;
display: flex;
flex-direction: row;
}
.m5-roll .roll-result .roll-total {
width: 100%;
}
.m5-roll .roll-result .roll-detail {
width: 100%;
margin-left: -100%;
}
.m5-roll .roll-row:not( :hover ) .roll-total {
visibility: visible;
}
.m5-roll .roll-row:not( :hover ) .roll-detail {
visibility: hidden;
}
.m5-roll .roll-row:hover .roll-total {
visibility: hidden;
}
.m5-roll .roll-row:hover .roll-detail {
visibility: visible;
}
.m5-roll .roll-ew-result-fumble {
background-color: #ca3636;
color: #ffffff;
}
.m5-roll .roll-ew-result-critical {
background-color: #cac536;
color: #000000;
}
.m5-roll .roll-ew-result-high {
background-color: #368aca;
color: #ffffff;
}
.m5-roll .roll-ew-result-fail {
background-color: #753f83;
color: #ffffff;
}
.m5-roll .roll-ew-result-pass {
background-color: #36ca58;
color: #000000;
}

2
midgard5e/bundle.js Normal file

File diff suppressed because one or more lines are too long

1
midgard5e/bundle.js.map Normal file

File diff suppressed because one or more lines are too long

232
midgard5e/lang/de.json Normal file
View File

@ -0,0 +1,232 @@
{
"ACTOR.TypeCharacter": "Charakter",
"ACTOR.TypeNpc": "Kreatur / Nichtspielerfigur",
"ACTOR.TypeVehicle": "Transportmittel / Pferd etc.",
"ITEM.TypeItem": "Gegenstand",
"ITEM.TypeWeapon": "Waffe",
"ITEM.TypeDefensiveWeapon": "Verteidigungswaffe",
"ITEM.TypeArmor": "Rüstung",
"ITEM.TypeSpell": "Zauber",
"midgard5.doRoll": "Würfeln",
"midgard5.learn": "Lernen",
"midgard5.label": "Bezeichnung",
"midgard5.description": "Beschreibung",
"midgard5.attribute": "Leiteigenschaft",
"midgard5.skill": "Fertigkeit",
"midgard5.skill-value": "Fertigkeitswert",
"midgard5.fw": "FW",
"midgard5.bonus": "Bonus",
"midgard5.ew": "EW",
"midgard5.pp-short": "PP",
"midgard5.pp": "Praxispunkte",
"midgard5.item-value": "Wert",
"midgard5.item-quantity": "Menge",
"midgard5.item-onbody": "Am Körper",
"midgard5.item-ismagic": "Ist Magisch",
"midgard5.actor-lp": "Lebenspunkte",
"midgard5.actor-lp-short": "LP",
"midgard5.actor-ap": "Ausdauerpunkte",
"midgard5.actor-ap-short": "AP",
"midgard5.actor-st": "St",
"midgard5.actor-st-long": "Stärke",
"midgard5.actor-ko": "Ko",
"midgard5.actor-ko-long": "Konstitution",
"midgard5.actor-au": "Au",
"midgard5.actor-au-long": "Aussehen",
"midgard5.actor-gs": "Gs",
"midgard5.actor-gs-long": "Geschicklichkeit",
"midgard5.actor-in": "In",
"midgard5.actor-in-long": "Intelligenz",
"midgard5.actor-pa": "pA",
"midgard5.actor-pa-long": "persönliche Ausstrahlung",
"midgard5.actor-gw": "Gw",
"midgard5.actor-gw-long": "Gewandtheit",
"midgard5.actor-zt": "Zt",
"midgard5.actor-zt-long": "Zaubertalent",
"midgard5.actor-wk": "Wk",
"midgard5.actor-wk-long": "Willenskraft",
"midgard5.aktuell": "Akt.",
"midgard5.maximum": "Max.",
"midgard5.attrvalue": "Wert",
"midgard5.movementRange": "Bewegungsweite",
"midgard5.base_values": "Grundwerte",
"midgard5.skills": "Fertigkeiten",
"midgard5.gear": "Ausrüstung",
"midgard5.spells": "Zauber",
"midgard5.class": "Klasse",
"midgard5.race": "Rasse",
"midgard5.magicUsing": "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.luckPoints": "Glückspunkte",
"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.damageBonus-short": "SchB",
"midgard5.attackBonus": "Angriffsbonus",
"midgard5.attackBonus-short": "AnB",
"midgard5.defenseBonus": "Abwehrbonus",
"midgard5.defenseBonus-short": "AbB",
"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",
"midgard5.new-skill": "Neue Fertigkeit",
"midgard5.special": "Spezial",
"midgard5.learned-skill": "Gelernte Fertigkeit",
"midgard5.language": "Sprache",
"midgard5.weapon-skill": "Waffenfertigkeit",
"midgard5.unlearned-skill": "Ungelernte Fertigkeit",
"midgard5.innate-ability": "Angeborene Fähigkeit",
"midgard5.base-damage": "Grundschaden",
"midgard5.defensive-weapon": "Verteidigungswaffe",
"midgard5.no-skill": "Keine Fertigkeit",
"midgard5.magic": "magisch",
"midgard5.rangedWeapon": "Schusswaffe",
"midgard5.assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um Fähigkeit auwählen zu können",
"midgard5.pw": "Prüfwurf",
"midgard5.attack": "Angriff",
"midgard5.damage": "Schaden",
"midgard5.spell-process-none": "Ohne",
"midgard5.spell-process-beherrschen": "Beherrschen",
"midgard5.spell-process-bewegen": "Bewegen",
"midgard5.spell-process-erkennen": "Erkennen",
"midgard5.spell-process-erschaffen": "Erschaffen",
"midgard5.spell-process-formen": "Formen",
"midgard5.spell-process-veraendern": "Verändern",
"midgard5.spell-process-zerstoeren": "Zerstören",
"midgard5.spell-process-wundertat": "Wundertat",
"midgard5.spell-process-dweomer": "Dweomer",
"midgard5.spell-process-zauberlied": "Zauberlied",
"midgard5.spell-process-salz": "Salz",
"midgard5.spell-process-thaumagraphie": "Thaumagraphie",
"midgard5.spell-process-beschwoeren": "Beschwören",
"midgard5.spell-process-nekromantie": "Nekromantie",
"midgard5.spell-process-thaumatherapie": "Thaumatherapie",
"midgard5.spell-process-zaubermittel": "Zaubermittel",
"midgard5.spell-process-zauberschutz": "Zauberschutz",
"midgard5.spell-type-gedanke": "Gedanke",
"midgard5.spell-type-geste": "Geste",
"midgard5.spell-type-wort": "Wort",
"midgard5.spell-target-umgebung": "Umgebung",
"midgard5.spell-target-geist": "Geist",
"midgard5.spell-target-koerper": "Körper",
"midgard5.spell-type": "Art",
"midgard5.spell-process": "Prozess",
"midgard5.spell-castDuration": "Zauberdauer",
"midgard5.spell-range": "Reichweite",
"midgard5.spell-effectTarget": "Wirkunsziel",
"midgard5.spell-effectArea": "Wirkungsbereich",
"midgard5.spell-effectDuration": "Wirkungsdauer",
"midgard5.spell-origin": "Ursprung",
"midgard5.mod-operation-add100": "Addieren (max 100)",
"midgard5.mod-operation-add": "Addieren",
"midgard5.mod-operation-set": "Basiswert",
"midgard5.mod-operation-fixed": "Fester Wert",
"midgard5.mod-stat-defenseBonus": "Abwehrbonus",
"midgard5.mod-stat-attackBonus": "Angriffsbonus",
"midgard5.mod-stat-damageBonus": "Schadensbonus",
"midgard5.mod-stat-movement": "Bewegung",
"midgard5.mod-stat-resistanceMind": "Resistenz Geist",
"midgard5.mod-stat-resistanceBody": "Resistenz Körper",
"midgard5.mod-stat-spellCasting": "Zaubern",
"midgard5.mod-stat-brawl": "Raufen",
"midgard5.mod-stat-poisonResistance": "Giftresistenz",
"midgard5.mod-stat-lp": "Lebenspunkte",
"midgard5.mod-stat-ap": "Ausdauerpunkte",
"midgard5.mod-type": "Typ der Modifikation",
"midgard5.mod-id": "Was soll modifiziert werden",
"midgard5.mod-operation": "Wie soll modifiziert werden",
"midgard5.mod-value": "Wert",
"midgard5.type": "Typ",
"midgard5.formula": "Formel",
"midgard5.roll": "Wurf"
}

View File

@ -0,0 +1 @@
{"name":"Grad 01","type":"character","img":"icons/svg/mystery-man.svg","system":{"lp":{"value":15,"min":0,"max":15},"ap":{"value":20,"min":0,"max":20},"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}},"info":{"description":"","class":"","race":"","magicUsing":false,"gender":"","weight":"","height":"","shape":"","age":"","caste":"","occupation":"","origin":"","faith":""},"es":0,"ep":0,"gg":0,"sg":0,"gp":2,"skills":{"general":{"akrobatik":{"fw":6,"attribute":"gw","initial":8,"pp":0},"alchimie":{"fw":0,"attribute":"in","initial":8,"pp":0},"anfuehren":{"fw":6,"attribute":"pa","initial":8,"pp":0},"athletik":{"fw":0,"attribute":"st","initial":8,"pp":0},"balancieren":{"fw":6,"attribute":"gw","initial":8,"pp":0},"beidhaendigerKampf":{"fw":0,"attribute":"gs","initial":8,"pp":0},"beredsamkeit":{"fw":3,"attribute":"pa","initial":8,"pp":0},"betaeuben":{"fw":6,"attribute":"gs","initial":8,"pp":0},"bootfahren":{"fw":3,"attribute":"gs","initial":8,"pp":0},"ersteHilfe":{"fw":0,"attribute":"gs","initial":8,"pp":0},"etikette":{"fw":0,"attribute":"in","initial":8,"pp":0},"fallenEntdecken":{"fw":0,"attribute":"in","initial":8,"pp":0},"fallenmechanik":{"fw":0,"attribute":"gs","initial":8,"pp":0},"faelschen":{"fw":0,"attribute":"gs","initial":8,"pp":0},"fechten":{"fw":0,"attribute":"gs","initial":8,"pp":0},"gassenwissen":{"fw":0,"attribute":"in","initial":8,"pp":0},"gaukeln":{"fw":0,"attribute":"gs","initial":8,"pp":0},"gelaendelauf":{"fw":6,"attribute":"gw","initial":8,"pp":0},"geraetekunde":{"fw":0,"attribute":"in","initial":8,"pp":0},"geschaeftssinn":{"fw":0,"attribute":"in","initial":8,"pp":0},"gluecksspiel":{"fw":0,"attribute":"gs","initial":8,"pp":0},"heilkunde":{"fw":0,"attribute":"in","initial":8,"pp":0},"kampfInVollruestung":{"fw":0,"attribute":"st","initial":8,"pp":0},"klettern":{"fw":6,"attribute":"st","initial":8,"pp":0},"landeskunde":{"fw":6,"attribute":"in","initial":8,"pp":0},"laufen":{"fw":0,"attribute":"ko","initial":8,"pp":0},"lesenVonZauberschrift":{"fw":0,"attribute":"in","initial":8,"pp":0},"meditieren":{"fw":0,"attribute":"wk","initial":8,"pp":0},"menschenkenntnis":{"fw":3,"attribute":"in","initial":8,"pp":0},"meucheln":{"fw":0,"attribute":"gs","initial":8,"pp":0},"musizieren":{"fw":0,"attribute":"gs","initial":8,"pp":0},"naturkunde":{"fw":0,"attribute":"in","initial":8,"pp":0},"pflanzenkunde":{"fw":0,"attribute":"in","initial":8,"pp":0},"reiten":{"fw":6,"attribute":"gw","initial":8,"pp":0},"reiterkampf":{"fw":0,"attribute":"gw","initial":8,"pp":0},"scharfschiessen":{"fw":0,"attribute":"gs","initial":8,"pp":0},"schleichen":{"fw":3,"attribute":"gw","initial":8,"pp":0},"schloesserOeffnen":{"fw":0,"attribute":"gs","initial":8,"pp":0},"schwimmen":{"fw":3,"attribute":"gw","initial":8,"pp":0},"seilkunst":{"fw":3,"attribute":"gs","initial":8,"pp":0},"spurensuche":{"fw":0,"attribute":"in","initial":8,"pp":0},"stehlen":{"fw":3,"attribute":"gs","initial":8,"pp":0},"tarnen":{"fw":3,"attribute":"gw","initial":8,"pp":0},"tauchen":{"fw":6,"attribute":"ko","initial":8,"pp":0},"tierkunde":{"fw":0,"attribute":"in","initial":8,"pp":0},"ueberleben":{"fw":6,"attribute":"in","initial":8,"pp":0},"verfuehren":{"fw":3,"attribute":"pa","initial":8,"pp":0},"verhoeren":{"fw":3,"attribute":"pa","initial":8,"pp":0},"verstellen":{"fw":3,"attribute":"pa","initial":8,"pp":0},"wagenlenken":{"fw":3,"attribute":"gs","initial":8,"pp":0},"zauberkunde":{"fw":0,"attribute":"in","initial":8,"pp":0}}},"calc":{}},"prototypeToken":{"name":"Spielfigur","displayName":0,"actorLink":false,"texture":{"src":"icons/svg/mystery-man.svg","scaleX":1,"scaleY":1,"offsetX":0,"offsetY":0,"rotation":0,"tint":null},"width":1,"height":1,"lockRotation":false,"rotation":0,"alpha":1,"disposition":-1,"displayBars":0,"bar1":{"attribute":"lp"},"bar2":{"attribute":"ap"},"light":{"alpha":0.5,"angle":360,"bright":0,"color":null,"coloration":1,"dim":0,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"darkness":{"min":0,"max":1}},"sight":{"enabled":false,"range":null,"angle":360,"visionMode":"basic","color":null,"attenuation":0.1,"brightness":0,"saturation":0,"contrast":0},"detectionModes":[],"flags":{},"randomImg":false},"items":[],"effects":[],"flags":{"core":{"sourceId":"Actor.25UihsoT43jms4Rx"}},"_stats":{"systemId":"midgard5e","systemVersion":"1.1.0","coreVersion":"10.291","createdTime":1681861642287,"modifiedTime":1681862257893,"lastModifiedBy":"Fphp3NQlJ6KWctyq"},"folder":null,"sort":0,"ownership":{"default":0,"Fphp3NQlJ6KWctyq":3},"_id":"k21WA0JziDJ7yJ1U"}

View File

@ -0,0 +1,10 @@
{"name":"Fernkampfwaffe","type":"weapon","img":"icons/svg/item-bag.svg","data":{"description":"","stats":{"damageBonus":0,"attackBonus":0,"defenseBonus":0,"movementBonus":0,"resistanceMind":0,"resistanceBody":0,"spellBonus":0},"equippable":false,"equipped":true,"value":0,"magic":false,"special":false,"ranged":true,"skillId":"","damageBase":"1d6","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus","label":"Angriff","enabled":true},"1":{"formula":"@i.damageBase + @i.stats.damageBonus","label":"Schaden","enabled":true}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"h1inVuRJQI42JTCs"}
{"name":"Gewöhnliche Fertigkeit","type":"skill","img":"icons/svg/item-bag.svg","data":{"description":"","attributes":{"st":{"short":"midgard5.actor-st","long":"midgard5.actor-st-long"},"gs":{"short":"midgard5.actor-gs","long":"midgard5.actor-gs-long"},"gw":{"short":"midgard5.actor-gw","long":"midgard5.actor-gw-long"},"ko":{"short":"midgard5.actor-ko","long":"midgard5.actor-ko-long"},"in":{"short":"midgard5.actor-in","long":"midgard5.actor-in-long"},"zt":{"short":"midgard5.actor-zt","long":"midgard5.actor-zt-long"},"au":{"short":"midgard5.actor-au","long":"midgard5.actor-au-long"},"pa":{"short":"midgard5.actor-pa","long":"midgard5.actor-pa-long"},"wk":{"short":"midgard5.actor-wk","long":"midgard5.actor-wk-long"}},"fw":8,"attribute":"st","skill":"","type":"general","rolls":{"formulas":{"0":{"formula":"1d20 + @i.fw + @i.calc.bonus","enabled":true,"label":"EW"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"4N0IgVDj1eee0hSB"}
{"name":"Angeborene Fähigkeit","type":"skill","img":"icons/svg/item-bag.svg","data":{"description":"","attributes":{"st":{"short":"midgard5.actor-st","long":"midgard5.actor-st-long"},"gs":{"short":"midgard5.actor-gs","long":"midgard5.actor-gs-long"},"gw":{"short":"midgard5.actor-gw","long":"midgard5.actor-gw-long"},"ko":{"short":"midgard5.actor-ko","long":"midgard5.actor-ko-long"},"in":{"short":"midgard5.actor-in","long":"midgard5.actor-in-long"},"zt":{"short":"midgard5.actor-zt","long":"midgard5.actor-zt-long"},"au":{"short":"midgard5.actor-au","long":"midgard5.actor-au-long"},"pa":{"short":"midgard5.actor-pa","long":"midgard5.actor-pa-long"},"wk":{"short":"midgard5.actor-wk","long":"midgard5.actor-wk-long"}},"fw":6,"attribute":"","skill":"","type":"innate","rolls":{"formulas":{"0":{"formula":"1d20 + @i.fw + @i.calc.bonus","type":"ew","label":"EW"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"nkMkMFNDSdvlP1Jt"}
{"name":"Gegenstand","type":"item","img":"icons/svg/item-bag.svg","system":{"description":"","equippable":false,"equipped":true,"value":0,"magic":false,"rolls":{"formulas":{},"output":""},"mods":{},"calc":{}},"effects":[],"flags":{"core":{"sourceId":"Item.8GrWgO1jjysZPnxc"}},"_stats":{"systemId":"midgard5e","systemVersion":"1.1.0","coreVersion":"10.291","createdTime":1681862229001,"modifiedTime":1681862253981,"lastModifiedBy":"Fphp3NQlJ6KWctyq"},"folder":null,"sort":0,"ownership":{"default":0,"Fphp3NQlJ6KWctyq":3},"_id":"ERcxMh7hWiv42rfx"}
{"name":"Rüstung","type":"armor","img":"icons/svg/item-bag.svg","data":{"description":"","stats":{"damageBonus":0,"attackBonus":0,"defenseBonus":0,"movementBonus":0,"resistanceMind":0,"resistanceBody":0,"spellBonus":0},"equippable":false,"equipped":true,"attributeMod":{"st":0,"gs":0,"gw":0,"ko":0,"in":0,"zt":0,"au":0,"pa":0,"wk":0},"magic":false,"lpProtection":0,"apProtection":0,"rolls":{"formulas":{},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"pV1hNavlQGJ9UaEf"}
{"name":"Sprache","type":"skill","img":"icons/svg/item-bag.svg","data":{"description":"","attributes":{"st":{"short":"midgard5.actor-st","long":"midgard5.actor-st-long"},"gs":{"short":"midgard5.actor-gs","long":"midgard5.actor-gs-long"},"gw":{"short":"midgard5.actor-gw","long":"midgard5.actor-gw-long"},"ko":{"short":"midgard5.actor-ko","long":"midgard5.actor-ko-long"},"in":{"short":"midgard5.actor-in","long":"midgard5.actor-in-long"},"zt":{"short":"midgard5.actor-zt","long":"midgard5.actor-zt-long"},"au":{"short":"midgard5.actor-au","long":"midgard5.actor-au-long"},"pa":{"short":"midgard5.actor-pa","long":"midgard5.actor-pa-long"},"wk":{"short":"midgard5.actor-wk","long":"midgard5.actor-wk-long"}},"fw":8,"attribute":"in","skill":"","type":"language","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus","enabled":true,"label":"EW"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"rDN14z3lNJISWTdO"}
{"name":"Verteidigungswaffe","type":"defensiveWeapon","img":"icons/svg/item-bag.svg","data":{"description":"","stats":{"damageBonus":0,"attackBonus":0,"defenseBonus":0,"movementBonus":0,"resistanceMind":0,"resistanceBody":0,"spellBonus":0},"equippable":false,"equipped":true,"special":false,"magic":false,"skillId":"","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.defense.value + @c.calc.stats.defenseBonus.value + @i.stats.defenseBonus","enabled":true,"label":"Abwehr"}},"output":""},"calc":{},"damageBase":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"BNAoHN0vHfcwNUTl"}
{"name":"Waffe","type":"weapon","img":"icons/svg/item-bag.svg","data":{"description":"","stats":{"damageBonus":0,"attackBonus":0,"defenseBonus":0,"movementBonus":0,"resistanceMind":0,"resistanceBody":0,"spellBonus":0},"equippable":false,"equipped":true,"special":false,"magic":false,"ranged":false,"skillId":"","damageBase":"1d6","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus","enabled":true,"label":"Angriff"},"1":{"formula":"@i.damageBase + @i.stats.damageBonus + @c.calc.stats.damageBonus.value","enabled":true,"label":"Schaden"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"uGQJ4VPhh135e79a"}
{"name":"Waffenfertigkeit","type":"skill","img":"icons/svg/item-bag.svg","data":{"description":"","attributes":{"st":{"short":"midgard5.actor-st","long":"midgard5.actor-st-long"},"gs":{"short":"midgard5.actor-gs","long":"midgard5.actor-gs-long"},"gw":{"short":"midgard5.actor-gw","long":"midgard5.actor-gw-long"},"ko":{"short":"midgard5.actor-ko","long":"midgard5.actor-ko-long"},"in":{"short":"midgard5.actor-in","long":"midgard5.actor-in-long"},"zt":{"short":"midgard5.actor-zt","long":"midgard5.actor-zt-long"},"au":{"short":"midgard5.actor-au","long":"midgard5.actor-au-long"},"pa":{"short":"midgard5.actor-pa","long":"midgard5.actor-pa-long"},"wk":{"short":"midgard5.actor-wk","long":"midgard5.actor-wk-long"}},"fw":5,"attribute":"","skill":"","type":"combat","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus","enabled":true,"label":"EW"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"1E4XHTGZlned2ofY"}
{"name":"Zauber","type":"spell","img":"icons/svg/item-bag.svg","data":{"description":"","spellProcessSelection":{"none":"midgard5.spell-process-none","beherrschen":"midgard5.spell-process-beherrschen","bewegen":"midgard5.spell-process-bewegen","erkennen":"midgard5.spell-process-erkennen","erschaffen":"midgard5.spell-process-erschaffen","formen":"midgard5.spell-process-formen","veraendern":"midgard5.spell-process-veraendern","zerstoeren":"midgard5.spell-process-zerstoeren","wundertat":"midgard5.spell-process-wundertat","dweomer":"midgard5.spell-process-dweomer","zauberlied":"midgard5.spell-process-zauberlied","salz":"midgard5.spell-process-salz","thaumagraphie":"midgard5.spell-process-thaumagraphie","beschwoeren":"midgard5.spell-process-beschwoeren","nekromantie":"midgard5.spell-process-nekromantie","thaumatherapie":"midgard5.spell-process-thaumatherapie","zaubermittel":"midgard5.spell-process-zaubermittel","zauberschutz":"midgard5.spell-process-zauberschutz"},"spellTypeSelection":{"gedanke":"midgard5.spell-type-gedanke","geste":"midgard5.spell-type-geste","wort":"midgard5.spell-type-wort"},"spellTargetSelection":{"umgebung":"midgard5.spell-target-umgebung","geist":"midgard5.spell-target-geist","koerper":"midgard5.spell-target-koerper"},"bonus":0,"type":"gedanke","process":"none","ap":0,"castDuration":"","range":"","effectTarget":"umgebung","effectArea":"","effectDuration":"","origin":"","rolls":{"formulas":{"0":{"formula":"1d20 + @c.calc.stats.spellCasting.value + @i.bonus","enabled":true,"label":"Zaubern"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"HQ469FvZkwKfzFfu"}

View File

@ -0,0 +1,5 @@
{"name":"Kritischer Erfolg bei der Abwehr","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.P6jQGko7PdG6Xlhe"}},"scope":"global","command":"await game.tables.getName(\"Kritischer Erfolg bei der Abwehr\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/macro/kriterfolgabwehr.svg","actorIds":[],"_id":"qWyrwvh7g9CbTKg9"}
{"name":"Kritischer Fehler bei Angriffen","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.FZUermrYHSbrEluS"}},"scope":"global","command":"await game.tables.getName(\"Kritischer Fehler bei Angriffen\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/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":"await game.tables.getName(\"Kritischer Fehler bei der Abwehr\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/macro/kritfehlerabwehr.svg","actorIds":[],"_id":"W7rYb00B6rtabV05"}
{"name":"Kritischer Schaden","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.QZlbT0tgD2aYW5YJ"}},"scope":"global","command":"await game.tables.getName(\"Kritischer Schaden\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/macro/kriterfolgangriff.svg","actorIds":[],"_id":"48DUqxdpHDCGKOHp"}
{"name":"Kritische Fehler beim Zaubern","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.e4KLlTBq8Z4Pt7In"}},"scope":"global","command":"await game.tables.getName(\"Kritischer Fehler beim Zaubern\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/macro/kritfehlerzauber.svg","actorIds":[],"_id":"XtzGuyYRyX8wVi1e"}

View File

@ -0,0 +1,4 @@
{"name":"1W10","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.TqmUKpMpY4GhiTML"}},"scope":"global","command":"/r 1d10","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/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/midgard5e/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/midgard5e/assets/icons/wurfel/w20.svg","actorIds":[],"_id":"qBoxslCQXxR22xKc"}
{"name":"1W6","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.QBhV6De80g1wH6ot"}},"scope":"global","command":"/r 1d6","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/wurfel/w6.svg","actorIds":[],"_id":"5tpfRgbM5sTL9gur"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

73
midgard5e/system.json Normal file
View File

@ -0,0 +1,73 @@
{
"id": "midgard5e",
"title": "Midgard 5. Edition",
"description": "The German RPG Midgard 5. Edition",
"version": "1.2.3",
"compatibility": {
"minimum": "10",
"verified": "10"
},
"authors": [{ "name": "Byroks" }],
"scripts": ["bundle.js"],
"styles": ["bundle.css"],
"packs": [
{
"name": "blaupause-spielfiguren",
"label": "Blaupausen für Spielfiguren",
"system": "midgard5e",
"path": "./packs/actors/blaupause-spielfiguren.db",
"type": "Actor"
},
{
"name": "blaupause-gegenstaende",
"label": "Blaupausen für Gegenstände",
"system": "midgard5e",
"path": "./packs/items/blaupause-gegenstaende.db",
"type": "Item"
},
{
"name": "tabellen-kritische-ereignisse",
"label": "Tabellen Kritische Ereignisse",
"system": "midgard5e",
"path": "./packs/rolltables/tabellen-kritische-ereignisse.db",
"type": "RollTable"
},
{
"name": "makros-kritische-ereignisse",
"label": "Makros Kritische Ereignisse",
"system": "midgard5e",
"path": "./packs/macros/makros-kritische-ereignisse.db",
"type": "Macro"
},
{
"name": "makros-standardwurfel",
"label": "Standardwürfel",
"system": "midgard5e",
"path": "./packs/macros/makros-standardwurfel.db",
"type": "Macro"
},
{
"name": "scenes-midgard-karten",
"label": "Midgard-Karten",
"system": "midgard5e",
"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/Byroks/foundry-vtt-system-midgard5",
"manifest": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v1.2.2/system.json",
"download": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v1.2.2/midgard5-v1.2.2.zip",
"initiative": "@calc.attributes.gw.value",
"license": "LICENSE.txt"
}

309
midgard5e/template.json Normal file
View File

@ -0,0 +1,309 @@
{
"Actor": {
"types": ["character"],
"templates": {
"characterDescription": {
"info": {
"description": "",
"class": "",
"race": "",
"magicUsing": 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": {
"general": {
"akrobatik": { "fw": 6, "attribute": "gw", "initial": 8, "pp": 0 },
"alchimie": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"anfuehren": { "fw": 6, "attribute": "pa", "initial": 8, "pp": 0 },
"athletik": { "fw": 0, "attribute": "st", "initial": 8, "pp": 0 },
"balancieren": { "fw": 6, "attribute": "gw", "initial": 8, "pp": 0 },
"beidhaendigerKampf": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"beredsamkeit": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 },
"betaeuben": { "fw": 6, "attribute": "gs", "initial": 8, "pp": 0 },
"bootfahren": { "fw": 3, "attribute": "gs", "initial": 8, "pp": 0 },
"ersteHilfe": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"etikette": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"fallenEntdecken": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"fallenmechanik": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"faelschen": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"fechten": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"gassenwissen": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"gaukeln": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"gelaendelauf": { "fw": 6, "attribute": "gw", "initial": 8, "pp": 0 },
"geraetekunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"geschaeftssinn": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"gluecksspiel": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"heilkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"kampfInVollruestung": { "fw": 0, "attribute": "st", "initial": 8, "pp": 0 },
"klettern": { "fw": 6, "attribute": "st", "initial": 8, "pp": 0 },
"landeskunde": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 },
"laufen": { "fw": 0, "attribute": "ko", "initial": 8, "pp": 0 },
"lesenVonZauberschrift": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"meditieren": { "fw": 0, "attribute": "wk", "initial": 8, "pp": 0 },
"menschenkenntnis": { "fw": 3, "attribute": "in", "initial": 8, "pp": 0 },
"meucheln": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"musizieren": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"naturkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"pflanzenkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"reiten": { "fw": 6, "attribute": "gw", "initial": 8, "pp": 0 },
"reiterkampf": { "fw": 0, "attribute": "gw", "initial": 8, "pp": 0 },
"scharfschiessen": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"schleichen": { "fw": 3, "attribute": "gw", "initial": 8, "pp": 0 },
"schloesserOeffnen": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"schwimmen": { "fw": 3, "attribute": "gw", "initial": 8, "pp": 0 },
"seilkunst": { "fw": 3, "attribute": "gs", "initial": 8, "pp": 0 },
"spurensuche": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"stehlen": { "fw": 3, "attribute": "gs", "initial": 8, "pp": 0 },
"tarnen": { "fw": 3, "attribute": "gw", "initial": 8, "pp": 0 },
"tauchen": { "fw": 6, "attribute": "ko", "initial": 8, "pp": 0 },
"tierkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"ueberleben": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 },
"verfuehren": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 },
"verhoeren": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 },
"verstellen": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 },
"wagenlenken": { "fw": 3, "attribute": "gs", "initial": 8, "pp": 0 },
"zauberkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 }
}
}
}
},
"character": {
"templates": ["characterBars", "attributes", "characterDescription", "characterHeader", "skills"],
"calc": {}
}
},
"Item": {
"types": ["skill", "weapon", "defensiveWeapon", "armor", "spell", "item"],
"templates": {
"itemDescription": {
"description": ""
},
"stats": {
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
}
},
"attributeSelection": {
"attributes": {
"st": { "short": "midgard5.actor-st", "long": "midgard5.actor-st-long" },
"gs": { "short": "midgard5.actor-gs", "long": "midgard5.actor-gs-long" },
"gw": { "short": "midgard5.actor-gw", "long": "midgard5.actor-gw-long" },
"ko": { "short": "midgard5.actor-ko", "long": "midgard5.actor-ko-long" },
"in": { "short": "midgard5.actor-in", "long": "midgard5.actor-in-long" },
"zt": { "short": "midgard5.actor-zt", "long": "midgard5.actor-zt-long" },
"au": { "short": "midgard5.actor-au", "long": "midgard5.actor-au-long" },
"pa": { "short": "midgard5.actor-pa", "long": "midgard5.actor-pa-long" },
"wk": { "short": "midgard5.actor-wk", "long": "midgard5.actor-wk-long" }
}
},
"attributeMod": {
"attributeMod": {
"st": 0,
"gs": 0,
"gw": 0,
"ko": 0,
"in": 0,
"zt": 0,
"au": 0,
"pa": 0,
"wk": 0
}
},
"rollable": {
"rolls": {
"formulas": {},
"output": ""
}
},
"equippable": {
"equippable": false,
"equipped": true
},
"physical": {
"value": 0,
"magic": false
},
"spellSelection": {
"spellProcessSelection": {
"none": "midgard5.spell-process-none",
"beherrschen": "midgard5.spell-process-beherrschen",
"bewegen": "midgard5.spell-process-bewegen",
"erkennen": "midgard5.spell-process-erkennen",
"erschaffen": "midgard5.spell-process-erschaffen",
"formen": "midgard5.spell-process-formen",
"veraendern": "midgard5.spell-process-veraendern",
"zerstoeren": "midgard5.spell-process-zerstoeren",
"wundertat": "midgard5.spell-process-wundertat",
"dweomer": "midgard5.spell-process-dweomer",
"zauberlied": "midgard5.spell-process-zauberlied",
"salz": "midgard5.spell-process-salz",
"thaumagraphie": "midgard5.spell-process-thaumagraphie",
"beschwoeren": "midgard5.spell-process-beschwoeren",
"nekromantie": "midgard5.spell-process-nekromantie",
"thaumatherapie": "midgard5.spell-process-thaumatherapie",
"zaubermittel": "midgard5.spell-process-zaubermittel",
"zauberschutz": "midgard5.spell-process-zauberschutz"
},
"spellTypeSelection": {
"gedanke": "midgard5.spell-type-gedanke",
"geste": "midgard5.spell-type-geste",
"wort": "midgard5.spell-type-wort"
},
"spellTargetSelection": {
"umgebung": "midgard5.spell-target-umgebung",
"geist": "midgard5.spell-target-geist",
"koerper": "midgard5.spell-target-koerper"
}
}
},
"skill": {
"templates": ["itemDescription", "attributeSelection"],
"fw": 0,
"attribute": "st",
"skill": "",
"type": "general",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus",
"label": "EW",
"enabled": true
}
},
"output": ""
},
"pp": 0,
"calc": {}
},
"item": {
"templates": ["itemDescription", "equippable", "physical"],
"rolls": {
"formulas": {},
"output": ""
},
"mods": {},
"calc": {}
},
"weapon": {
"templates": ["itemDescription", "stats", "equippable", "physical"],
"special": false,
"ranged": false,
"skillId": "",
"damageBase": "1d6",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus",
"label": "Angriff",
"enabled": true
},
"1": {
"formula": "@i.damageBase + @i.stats.damageBonus + @c.calc.stats.damageBonus.value",
"label": "Schaden",
"enabled": true
}
},
"output": ""
},
"calc": {}
},
"defensiveWeapon": {
"templates": ["itemDescription", "stats", "equippable", "physical"],
"special": false,
"skillId": "",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.defense.value + @c.calc.stats.defenseBonus.value + @i.stats.defenseBonus",
"label": "Abwehr",
"enabled": true
}
},
"output": ""
},
"calc": {}
},
"armor": {
"templates": ["itemDescription", "stats", "equippable", "attributeMod", "physical"],
"lpProtection": 0,
"apProtection": 0,
"rolls": {
"formulas": {},
"output": ""
},
"calc": {}
},
"spell": {
"templates": ["itemDescription", "spellSelection"],
"bonus": 0,
"type": "",
"process": "",
"ap": "",
"castDuration": "",
"range": "",
"effectTarget": "",
"effectArea": "",
"effectDuration": "",
"origin": "",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @c.calc.stats.spellCasting.value + @i.bonus",
"label": "Zaubern",
"enabled": true
}
},
"output": ""
},
"calc": {}
}
}
}

View File

@ -0,0 +1,60 @@
<div class="dice-roll m5-roll">
<div class="flexcol">
<h3 class="roll-title">{{res.label}}</h3>
<table>
<tbody>
{{#if (eq iType "spell")}}
<tr>
<td>{{localize "midgard5.actor-ap"}}</td>
<td class="roll-spell-details">{{i.ap}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-castDuration"}}</td>
<td class="roll-spell-details">{{i.castDuration}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-range"}}</td>
<td class="roll-spell-details">{{i.range}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectTarget"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.spell-target-" i.effectTarget)}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectArea"}}</td>
<td class="roll-spell-details">{{i.effectArea}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectDuration"}}</td>
<td class="roll-spell-details">{{i.effectDuration}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-origin"}}</td>
<td class="roll-spell-details">{{i.origin}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-type"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.spell-type-" i.type)}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-process"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.spell-process-" i.process)}}</td>
</tr>
{{/if}}
{{#each rolls as |roll index|}}
{{#if roll.enabled}}
<tr class="roll-row {{roll.css}}">
<td>{{roll.label}}</td>
<td class="roll-result">
<span class="roll-total">{{roll.totalStr}}</span>
<span class="roll-detail">{{roll.result}}</span>
</td>
</tr>
{{/if}}
{{/each}}
</tbody>
</table>
</div>
</div>

View File

@ -0,0 +1,13 @@
<div class="attribute" data-attribute="{{attributeId}}" data-value="{{calc.value}}">
<div class="attribute-header">{{localize (m5concat "midgard5.actor-" attributeId "-long")}}</div>
<div class="attribute-main roll-attribute-button">
<div class="attribute-main-value">{{calc.value}}</div>
<div class="attribute-main-bonus">{{calc.bonus}}</div>
</div>
<div class="attribute-footer">
<input class="attribute-footer-value" name="data.attributes.{{attributeId}}.value" value="{{attribute.value}}" type="text" data-dtype="Number" />
<input class="attribute-footer-bonus" name="data.attributes.{{attributeId}}.bonus" value="{{attribute.bonus}}" type="text" data-dtype="Number" />
</div>
</div>

View File

@ -0,0 +1,169 @@
<h3>{{localize "midgard5.actor-lp"}}</h3>
<div>
<div class="health-bar">
<input name="data.lp.value" type="text" value="{{data.lp.value}}" data-dtype="Number" />
{{#times data.lp.max}}
{{#if (lt this ../data.lp.value)}}
<div class="lp-bar-item update-lp" data-value="{{this}}"></div>
{{else}}
<div class="lp-bar-item-empty update-lp" data-value="{{this}}"></div>
{{/if}}
{{/times}}
<input name="data.lp.max" type="text" value="{{data.lp.max}}" data-dtype="Number" />
</div>
</div>
<h3>{{localize "midgard5.actor-ap"}}</h3>
<div>
<div class="health-bar">
<input name="data.ap.value" type="text" value="{{data.ap.value}}" data-dtype="Number" />
{{#times data.ap.max}}
{{#if (lt this ../data.ap.value)}}
<div class="ap-bar-item update-ap" data-value="{{this}}"></div>
{{else}}
<div class="ap-bar-item-empty update-ap" data-value="{{this}}"></div>
{{/if}}
{{/times}}
<input name="data.ap.max" type="text" value="{{data.ap.max}}" data-dtype="Number" />
</div>
</div>
<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.magicUsing" type="checkbox" name="data.info.magicUsing" {{checked data.info.magicUsing}}>
<label class="flex0" for="data.info.magicUsing">{{localize "midgard5.magicUsing"}}</label>
<span class="level-display">Grad {{data.calc.level}}</span>
</div>
<table>
<tbody>
<tr>
<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.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>
<tr>
<td>{{localize "midgard5.luckPoints"}}</td>
<td><input name="data.gp" type="text" value="{{data.gp}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
<h3>Leiteigenschaften</h3>
<div class="attributes">
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="st" attribute=data.attributes.st calc=data.calc.attributes.st}}
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="gs" attribute=data.attributes.gs calc=data.calc.attributes.gs}}
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="gw" attribute=data.attributes.gw calc=data.calc.attributes.gw}}
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="ko" attribute=data.attributes.ko calc=data.calc.attributes.ko}}
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="in" attribute=data.attributes.in calc=data.calc.attributes.in}}
</div>
<div class="attributes">
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="zt" attribute=data.attributes.zt calc=data.calc.attributes.zt}}
<div class="attribute-filler-fixed"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="au" attribute=data.attributes.au calc=data.calc.attributes.au}}
<div class="attribute-filler-fixed"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="pa" attribute=data.attributes.pa calc=data.calc.attributes.pa}}
<div class="attribute-filler-fixed"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="wk" attribute=data.attributes.wk calc=data.calc.attributes.wk}}
<div class="filler"></div>
</div>
<h3>Berechnete Werte</h3>
<table>
<tbody>
<tr>
<td>{{localize "midgard5.brawl"}}</td>
<td class="fixed-value">{{data.calc.stats.brawl.value}}</td>
<td>{{localize "midgard5.enduranceBonus"}}</td>
<td class="fixed-value">{{data.calc.stats.enduranceBonus}}</td>
</tr>
<tr>
<td>{{localize "midgard5.defense"}}</td>
<td class="fixed-value">{{data.calc.stats.defense.value}}</td>
<td>{{localize "midgard5.defenseBonus"}}</td>
<td class="fixed-value">{{data.calc.stats.defenseBonus.value}}</td>
</tr>
<tr>
<td>{{localize "midgard5.damageBonus"}}</td>
<td class="fixed-value">{{data.calc.stats.damageBonus.value}}</td>
<td>{{localize "midgard5.attackBonus"}}</td>
<td class="fixed-value">{{data.calc.stats.attackBonus.value}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spellCasting"}}</td>
<td class="fixed-value">{{data.calc.stats.spellCasting.value}}</td>
<td>{{localize "midgard5.poisonResistance"}}</td>
<td class="fixed-value">{{data.calc.stats.poisonResistance.value}}</td>
</tr>
<tr>
<td>{{localize "midgard5.resistanceMind"}}</td>
<td class="fixed-value">{{data.calc.stats.resistanceMind.value}}</td>
<td>{{localize "midgard5.resistanceBody"}}</td>
<td class="fixed-value">{{data.calc.stats.resistanceBody.value}}</td>
</tr>
</tbody>
</table>
<h3>Beschreibung</h3>
<table>
<tbody>
<tr>
<td>{{localize "midgard5.race"}}</td>
<td>
<input list="races" type="search" name="data.info.race" value="{{data.info.race}}" />
<datalist id="races">
<option value="Mensch">
<option value="Elf">
<option value="Gnom">
<option value="Halbling">
<option value="Zwerg">
</datalist>
</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}}

View File

@ -0,0 +1,115 @@
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeWeapon"}}</th>
<th class="fixed-value">{{localize "midgard5.ew"}}</th>
<th class="fixed-value"></th>
<th class="fixed-value"></th>
</tr>
</thead>
<tbody>
{{#each data.calc.gear.weapons as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{item.label}}</td>
<td class="fixed-value">{{item.calc.ew}}</td>
<td class="fixed-value"><button class="roll-button roll-weapon-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{localize "midgard5.brawl"}}</td>
<td class="center">{{data.calc.stats.brawlEw}}</td>
<td class="fixed-value"><button class="roll-button roll-brawl-button"></button></td>
<td class="fixed-value"></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeDefensiveWeapon"}}</th>
<th class="fixed-value">{{localize "midgard5.ew"}}</th>
<th class="fixed-value"></th>
<th class="fixed-value"></th>
</tr>
</thead>
<tbody>
{{#each data.calc.gear.defensiveWeapons as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{item.label}}</td>
<td class="fixed-value">{{item.calc.ew}}</td>
<td class="fixed-value"><button class="roll-button roll-weapon-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{localize "midgard5.defense"}}</td>
<td class="center">{{add data.calc.stats.defense.value data.calc.stats.defenseBonus.value}}</td>
<td class="fixed-value"><button class="roll-button roll-defense-button"></button></td>
<td class="fixed-value"></td>
</tr>
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{localize "midgard5.resistanceMind"}}</td>
<td class="center">{{data.calc.stats.resistanceMind.value}}</td>
<td class="fixed-value"><button class="roll-button roll-resistanceMind-button"></button></td>
<td class="fixed-value"></td>
</tr>
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{localize "midgard5.resistanceBody"}}</td>
<td class="center">{{data.calc.stats.resistanceBody.value}}</td>
<td class="fixed-value"><button class="roll-button roll-resistanceBody-button"></button></td>
<td class="fixed-value"></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeArmor"}}</th>
<th class="fixed-value">{{localize "midgard5.actor-lp-short"}}</th>
<th class="fixed-value">{{localize "midgard5.actor-ap-short"}}</th>
<th class="fixed-value">{{localize "midgard5.attackBonus-short"}}</th>
<th class="fixed-value">{{localize "midgard5.defenseBonus-short"}}</th>
<th class="fixed-value">B</th>
<th class="fixed-value">Gw</th>
<th class="fixed-value"></th>
</tr>
</thead>
<tbody>
{{#each data.calc.gear.armor as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{item.label}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "lpProtection"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "apProtection"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "stats.attackBonus"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "stats.defenseBonus"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "stats.movementBonus"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "attributeMod.gw"}}</td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeItem"}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.gear.items as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{item.label}}</td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>

View File

@ -0,0 +1,34 @@
<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/midgard5e/templates/sheets/character/base_values.hbs"}}
</div>
<div class="tab base_values flexcol" data-group="primary" data-tab="skills">
{{> "systems/midgard5e/templates/sheets/character/skills.hbs"}}
</div>
<div class="tab base_values flexcol" data-group="primary" data-tab="gear">
{{> "systems/midgard5e/templates/sheets/character/gear.hbs"}}
</div>
<div class="tab base_values flexcol" data-group="primary" data-tab="spells">
{{> "systems/midgard5e/templates/sheets/character/spells.hbs"}}
</div>
</section>
</form>

View File

@ -0,0 +1,136 @@
<table>
<thead>
<tr>
<th>{{localize "midgard5.learned-skill"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th>{{localize "midgard5.pp-short"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.skills.general as |skill skillId|}}
<tr data-item="{{skillId}}">
<td class="padding edit-item">{{skill.label}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skill.calc.bonus}}</td>
<td class="fixed-value">{{skill.calc.ew}}</td>
<td class="fixed-value">{{skill.pp}}</td>
<td class="fixed-value"><button class="roll-button roll-learned-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "midgard5.language"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th>{{localize "midgard5.pp-short"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.skills.language as |skill skillId|}}
<tr data-item="{{skillId}}">
<td class="padding edit-item">{{skill.label}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skill.calc.bonus}}</td>
<td class="fixed-value">{{skill.calc.ew}}</td>
<td class="fixed-value">{{skill.pp}}</td>
<td class="fixed-value"><button class="roll-button roll-learned-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "midgard5.innate-ability"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.skills.innate as |skill skillId|}}
<tr data-item="{{skillId}}">
<td class="padding edit-item">{{skill.label}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skill.calc.bonus}}</td>
<td class="fixed-value">{{skill.calc.ew}}</td>
<td class="fixed-value"><button class="roll-button roll-learned-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "midgard5.weapon-skill"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th>{{localize "midgard5.pp-short"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.skills.combat as |skill skillId|}}
<tr data-item="{{skillId}}">
<td class="padding edit-item">{{skill.label}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skill.calc.bonus}}</td>
<td class="fixed-value">{{skill.calc.ew}}</td>
<td class="fixed-value">{{skill.pp}}</td>
<td class="fixed-value"><button class="roll-button roll-learned-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th></th>
<th>{{localize "midgard5.unlearned-skill"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th>{{localize "midgard5.pp-short"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.skills.general as |skill key|}}
{{#unless (isSkillInList (localizeMidgard key) ../actor.system.calc.skills.general) }}
<tr data-skill="{{key}}">
<td><button class="learn-button">{{localize "midgard5.learn"}}</button></td>
<td class="padding">{{localizeMidgard key}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skillBonus ../actor._id skill}}</td>
<td class="fixed-value">{{skillEw ../actor._id skill}}</td>
<td class="fixed-value"><input name="data.skills.general.{{key}}.pp" type="text" value="{{skill.pp}}" data-dtype="Number" /></td>
<td class="fixed-value"><button class="roll-button roll-general-button"></button></td>
<td class="fixed-value"></td>
</tr>
{{/unless}}
{{/each}}
</tbody>
</table>

View File

@ -0,0 +1,23 @@
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeSpell"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.spells as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">
<span>{{item.label}}</span>
<span class="spell-process">{{localize item.process}}</span>
</td>
<td class="fixed-value">{{item.calc.ew}}</td>
<td class="fixed-value"><button class="roll-button roll-weapon-button" /></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>

View File

@ -0,0 +1,37 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td>{{localize "midgard5.actor-lp"}}</td>
<td><input name="data.lpProtection" type="text" value="{{data.lpProtection}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.actor-ap"}}</td>
<td><input name="data.apProtection" type="text" value="{{data.apProtection}}" data-dtype="Number" /></td>
</tr>
<tr>
<td>{{localize "midgard5.attackBonus"}}</td>
<td><input name="data.stats.attackBonus" type="text" value="{{data.stats.attackBonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.defenseBonus"}}</td>
<td><input name="data.stats.defenseBonus" type="text" value="{{data.stats.defenseBonus}}" data-dtype="Number" /></td>
</tr>
<tr>
<td>{{localize "midgard5.movementRange"}}</td>
<td><input name="data.stats.movementBonus" type="text" value="{{data.stats.movementBonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.actor-gw-long"}}</td>
<td><input name="data.attributeMod.gw" type="text" value="{{data.attributeMod.gw}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -0,0 +1,51 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td colspan=4>
<div class="flexrow">
<span>
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}}>
<label for="data.magic">{{localize "midgard5.magic"}}</label>
</span>
<span>
<input id="data.special" type="checkbox" name="data.special" {{checked data.special}}>
<label for="data.special">{{localize "midgard5.special"}}</label>
</span>
</div>
</td>
</tr>
<tr>
<td>{{localize "midgard5.defenseBonus"}}</td>
<td><input name="data.stats.defenseBonus" type="text" value="{{data.stats.defenseBonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.weapon-skill"}}</td>
<td>
{{#if data.calc.combatSkills}}
<select class="select-skill" name="data.skillId" data-type="String">
{{#select data.skillId}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each data.calc.combatSkills as |skill key|}}
<option value="{{key}}">{{skill.label}}</option>
{{/each}}
{{/select}}
</select>
{{else}}
<span>Assign item to character to select weapon skill</span>
{{/if}}
</td>
</tr>
</tbody>
</table>
{{> "systems/midgard5e/templates/sheets/item/rolls.hbs"}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -0,0 +1,78 @@
<form class="item-sheet {{cssClass}} m5item-item" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tr>
<td>
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}}>
<label for="data.magic">{{localize "midgard5.magic"}}</label>
</td>
<td>
<div class="flexrow">
<span>{{localize "midgard5.item-value"}}</span>
<input name="data.value" type="text" value="{{data.value}}" data-dtype="Number" />
</div>
</td>
</tr>
</table>
<table>
<thead>
<tr>
<th>Mods</th>
<th></th>
<th></th>
<th><button class="add-mod">+</button></th>
</tr>
</thead>
<tbody>
{{#each data.mods as |mod modId|}}
<tr>
<td>
<select class="select-mod-type" name="data.mods.{{modId}}.type" data-type="String">
{{#select mod.type}}
<option value="attribute">{{localize "midgard5.attribute"}}</option>
<option value="stat">{{localize "midgard5.bonus"}}</option>
<option value="skill">{{localize "midgard5.skill"}}</option>
{{/select}}
</select>
</td>
<td>
<select class="select-id" name="data.mods.{{modId}}.id" data-type="String">
{{#select mod.id}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each (lookup ../data.calc.mods modId) as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
</select>
</td>
<td>
<select class="select-mod-operation" name="data.mods.{{modId}}.operation" data-type="String">
{{#select mod.operation}}
{{#if (eq mod.type "attribute")}}
<option value="add100">{{localize "midgard5.mod-operation-add100"}}</option>
{{/if}}
<option value="add">{{localize "midgard5.mod-operation-add"}}</option>
<option value="set">{{localize "midgard5.mod-operation-set"}}</option>
<option value="fixed">{{localize "midgard5.mod-operation-fixed"}}</option>
{{/select}}
</select>
</td>
<td>
<input name="data.mods.{{modId}}.value" type="text" value="{{mod.value}}" data-dtype="Number" />
</td>
</tr>
{{/each}}
</tbody>
</table>
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -0,0 +1,61 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td>{{localize "midgard5.mod-type"}}</td>
<td>
<select class="select-mod-type" name="data.type" data-type="String">
{{#select data.type}}
<option value="attribute">{{localize "midgard5.attribute"}}</option>
<option value="stat">{{localize "midgard5.bonus"}}</option>
<option value="skill">{{localize "midgard5.skill"}}</option>
{{/select}}
</select>
</td>
</tr>
<tr>
<td>{{localize "midgard5.mod-id"}}</td>
<td>
<select class="select-id" name="data.id" data-type="String">
{{#select data.id}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each data.calc.ids as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
</select>
</td>
</tr>
<tr>
<td>{{localize "midgard5.mod-operation"}}</td>
<td>
<select class="select-mod-operation" name="data.operation" data-type="String">
{{#select data.operation}}
{{#if (eq data.type "attribute")}}
<option value="add100">{{localize "midgard5.mod-operation-add100"}}</option>
{{/if}}
<option value="add">{{localize "midgard5.mod-operation-add"}}</option>
<option value="set">{{localize "midgard5.mod-operation-set"}}</option>
<option value="fixed">{{localize "midgard5.mod-operation-fixed"}}</option>
{{/select}}
</select>
</td>
</tr>
<tr>
<td>{{localize "midgard5.mod-value"}}</td>
<td><input name="data.value" type="text" value="{{data.value}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -0,0 +1,22 @@
<table class="rolls-table">
<thead>
<tr>
<th class="col-enabled"></th>
<th class="col-label">{{localize "midgard5.label"}}</th>
<th class="col-formula">{{localize "midgard5.formula"}}</th>
<th class="col-delete"><button class="roll-create">+</button></th>
</tr>
</thead>
<tbody>
{{#each data.rolls.formulas as |roll rollIndex|}}
{{#if roll}}
<tr data-roll="{{rollIndex}}">
<td><input type="checkbox" name="data.rolls.formulas.{{rollIndex}}.enabled" {{checked roll.enabled}} /></td>
<td><input type="text" name="data.rolls.formulas.{{rollIndex}}.label" value="{{roll.label}}" data-dtype="String" /></td>
<td><input type="text" name="data.rolls.formulas.{{rollIndex}}.formula" value="{{roll.formula}}" data-dtype="String" /></td>
<td class="fixed-value"><a class="roll-delete" title="Delete Roll"><i class="fas fa-trash"></i></a></td>
</tr>
{{/if}}
{{/each}}
</tbody>
</table>

View File

@ -0,0 +1,41 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td>{{localize "midgard5.skill-value"}}</td>
<td><input name="data.fw" type="text" value="{{data.fw}}" data-dtype="Number" /></td>
</tr>
{{#unless (eq data.type "combat")}}
<tr>
<td>{{localize "midgard5.attribute"}}</td>
<td>
<select class="select-attribute" name="data.attribute" data-type="String">
{{#select data.attribute}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each data.attributes as |attribute key|}}
<option value="{{key}}">{{localize attribute.long}}</option>
{{/each}}
{{/select}}
</select>
</td>
</tr>
{{/unless}}
<tr>
<td>{{localize "midgard5.pp"}}</td>
<td><input name="data.pp" type="text" value="{{data.pp}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
{{> "systems/midgard5e/templates/sheets/item/rolls.hbs"}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -0,0 +1,70 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td>{{localize "midgard5.bonus"}}</td>
<td><input name="data.bonus" type="text" value="{{data.bonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.actor-ap"}}</td>
<td><input name="data.ap" type="text" value="{{data.ap}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.spell-castDuration"}}</td>
<td><input name="data.castDuration" type="text" value="{{data.castDuration}}" data-dtype="String" /></td>
<td>{{localize "midgard5.spell-range"}}</td>
<td><input name="data.range" type="text" value="{{data.range}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectTarget"}}</td>
<td>
<select class="select-effectTarget" name="data.effectTarget" data-type="String">
{{#select data.effectTarget}}
{{#each data.spellTargetSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
<td>{{localize "midgard5.spell-effectArea"}}</td>
<td><input name="data.effectArea" type="text" value="{{data.effectArea}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectDuration"}}</td>
<td><input name="data.effectDuration" type="text" value="{{data.effectDuration}}" data-dtype="String" /></td>
<td>{{localize "midgard5.spell-origin"}}</td>
<td><input name="data.origin" type="text" value="{{data.origin}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.spell-type"}}</td>
<td>
<select class="select-type" name="data.type" data-type="String">
{{#select data.type}}
{{#each data.spellTypeSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
<td>{{localize "midgard5.spell-process"}}</td>
<td>
<select class="select-process" name="data.process" data-type="String">
{{#select data.process}}
{{#each data.spellProcessSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
</tr>
</tbody>
</table>
{{> "systems/midgard5e/templates/sheets/item/rolls.hbs"}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -0,0 +1,68 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td colspan=4>
<div class="flexrow">
<span>
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}}>
<label for="data.magic">{{localize "midgard5.magic"}}</label>
</span>
<span>
<input id="data.ranged" type="checkbox" name="data.ranged" {{checked data.ranged}}>
<label for="data.ranged">{{localize "midgard5.rangedWeapon"}}</label>
</span>
<span>
<input id="data.special" type="checkbox" name="data.special" {{checked data.special}}>
<label for="data.special">{{localize "midgard5.special"}}</label>
</span>
</div>
</td>
</tr>
<tr>
<td>{{localize "midgard5.base-damage"}}</td>
<td>
{{#if data.defensive}}
<span>Not available for defensive weapons</span>
{{else}}
<input name="data.damageBase" type="text" value="{{data.damageBase}}" data-dtype="String" />
{{/if}}
</td>
<td>{{localize "midgard5.weapon-skill"}}</td>
<td>
{{#if data.calc.combatSkills}}
<select class="select-skill" name="data.skillId" data-type="String">
{{#select data.skillId}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each data.calc.combatSkills as |skill key|}}
<option value="{{key}}">{{skill.label}}</option>
{{/each}}
{{/select}}
</select>
{{else}}
<span>{{localize "midgard5.assignItemToCharacter"}}</span>
{{/if}}
</td>
</tr>
<tr>
<td>{{localize "midgard5.attackBonus"}}</td>
<td><input name="data.stats.attackBonus" type="text" value="{{data.stats.attackBonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.damageBonus"}}</td>
<td><input name="data.stats.damageBonus" type="text" value="{{data.stats.damageBonus}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
{{> "systems/midgard5e/templates/sheets/item/rolls.hbs"}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -1,6 +1,6 @@
{
"name": "foundry-system-midgard5",
"version": "2.7.2",
"version": "1.2.3",
"description": "",
"main": "index.js",
"scripts": {
@ -58,4 +58,4 @@
"dependencies": {
"handlebars-helpers": "^0.10.0"
}
}
}

View File

@ -0,0 +1,472 @@
{
"name": "Grad 01",
"type": "character",
"img": "icons/svg/mystery-man.svg",
"system": {
"lp": {
"value": 15,
"min": 0,
"max": 15
},
"ap": {
"value": 20,
"min": 0,
"max": 20
},
"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
}
},
"info": {
"description": "",
"class": "",
"race": "",
"magicUsing": false,
"gender": "",
"weight": "",
"height": "",
"shape": "",
"age": "",
"caste": "",
"occupation": "",
"origin": "",
"faith": ""
},
"es": 0,
"ep": 0,
"gg": 0,
"sg": 0,
"gp": 2,
"skills": {
"general": {
"akrobatik": {
"fw": 6,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"alchimie": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"anfuehren": {
"fw": 6,
"attribute": "pa",
"initial": 8,
"pp": 0
},
"athletik": {
"fw": 0,
"attribute": "st",
"initial": 8,
"pp": 0
},
"balancieren": {
"fw": 6,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"beidhaendigerKampf": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"beredsamkeit": {
"fw": 3,
"attribute": "pa",
"initial": 8,
"pp": 0
},
"betaeuben": {
"fw": 6,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"bootfahren": {
"fw": 3,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"ersteHilfe": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"etikette": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"fallenEntdecken": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"fallenmechanik": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"faelschen": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"fechten": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"gassenwissen": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"gaukeln": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"gelaendelauf": {
"fw": 6,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"geraetekunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"geschaeftssinn": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"gluecksspiel": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"heilkunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"kampfInVollruestung": {
"fw": 0,
"attribute": "st",
"initial": 8,
"pp": 0
},
"klettern": {
"fw": 6,
"attribute": "st",
"initial": 8,
"pp": 0
},
"landeskunde": {
"fw": 6,
"attribute": "in",
"initial": 8,
"pp": 0
},
"laufen": {
"fw": 0,
"attribute": "ko",
"initial": 8,
"pp": 0
},
"lesenVonZauberschrift": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"meditieren": {
"fw": 0,
"attribute": "wk",
"initial": 8,
"pp": 0
},
"menschenkenntnis": {
"fw": 3,
"attribute": "in",
"initial": 8,
"pp": 0
},
"meucheln": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"musizieren": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"naturkunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"pflanzenkunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"reiten": {
"fw": 6,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"reiterkampf": {
"fw": 0,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"scharfschiessen": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"schleichen": {
"fw": 3,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"schloesserOeffnen": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"schwimmen": {
"fw": 3,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"seilkunst": {
"fw": 3,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"spurensuche": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"stehlen": {
"fw": 3,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"tarnen": {
"fw": 3,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"tauchen": {
"fw": 6,
"attribute": "ko",
"initial": 8,
"pp": 0
},
"tierkunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"ueberleben": {
"fw": 6,
"attribute": "in",
"initial": 8,
"pp": 0
},
"verfuehren": {
"fw": 3,
"attribute": "pa",
"initial": 8,
"pp": 0
},
"verhoeren": {
"fw": 3,
"attribute": "pa",
"initial": 8,
"pp": 0
},
"verstellen": {
"fw": 3,
"attribute": "pa",
"initial": 8,
"pp": 0
},
"wagenlenken": {
"fw": 3,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"zauberkunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
}
}
},
"calc": {}
},
"prototypeToken": {
"name": "Spielfigur",
"displayName": 0,
"actorLink": false,
"texture": {
"src": "icons/svg/mystery-man.svg",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"tint": null
},
"width": 1,
"height": 1,
"lockRotation": false,
"rotation": 0,
"alpha": 1,
"disposition": -1,
"displayBars": 0,
"bar1": {
"attribute": "lp"
},
"bar2": {
"attribute": "ap"
},
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"color": null,
"coloration": 1,
"dim": 0,
"attenuation": 0.5,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"type": null,
"speed": 5,
"intensity": 5,
"reverse": false
},
"darkness": {
"min": 0,
"max": 1
}
},
"sight": {
"enabled": false,
"range": null,
"angle": 360,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"brightness": 0,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"flags": {},
"randomImg": false
},
"items": [],
"effects": [],
"flags": {
"core": {
"sourceId": "Actor.25UihsoT43jms4Rx"
}
},
"_stats": {
"systemId": "midgard5e",
"systemVersion": "1.1.0",
"coreVersion": "10.291",
"createdTime": 1681861642287,
"modifiedTime": 1681862257893,
"lastModifiedBy": "Fphp3NQlJ6KWctyq"
},
"folder": null,
"sort": 0,
"ownership": {
"default": 0,
"Fphp3NQlJ6KWctyq": 3
},
"_id": "k21WA0JziDJ7yJ1U"
}

View File

@ -1 +0,0 @@
JSON files for ompendium packs can be added here

View File

@ -0,0 +1,49 @@
{
"name": "Fernkampfwaffe",
"type": "weapon",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
},
"equippable": false,
"equipped": true,
"value": 0,
"magic": false,
"special": false,
"ranged": true,
"skillId": "",
"damageBase": "1d6",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus",
"label": "Angriff",
"enabled": true
},
"1": {
"formula": "@i.damageBase + @i.stats.damageBonus",
"label": "Schaden",
"enabled": true
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "h1inVuRJQI42JTCs"
}

View File

@ -0,0 +1,69 @@
{
"name": "Gewöhnliche Fertigkeit",
"type": "skill",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"attributes": {
"st": {
"short": "midgard5.actor-st",
"long": "midgard5.actor-st-long"
},
"gs": {
"short": "midgard5.actor-gs",
"long": "midgard5.actor-gs-long"
},
"gw": {
"short": "midgard5.actor-gw",
"long": "midgard5.actor-gw-long"
},
"ko": {
"short": "midgard5.actor-ko",
"long": "midgard5.actor-ko-long"
},
"in": {
"short": "midgard5.actor-in",
"long": "midgard5.actor-in-long"
},
"zt": {
"short": "midgard5.actor-zt",
"long": "midgard5.actor-zt-long"
},
"au": {
"short": "midgard5.actor-au",
"long": "midgard5.actor-au-long"
},
"pa": {
"short": "midgard5.actor-pa",
"long": "midgard5.actor-pa-long"
},
"wk": {
"short": "midgard5.actor-wk",
"long": "midgard5.actor-wk-long"
}
},
"fw": 8,
"attribute": "st",
"skill": "",
"type": "general",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.fw + @i.calc.bonus",
"enabled": true,
"label": "EW"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "4N0IgVDj1eee0hSB"
}

View File

@ -0,0 +1,69 @@
{
"name": "Angeborene Fähigkeit",
"type": "skill",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"attributes": {
"st": {
"short": "midgard5.actor-st",
"long": "midgard5.actor-st-long"
},
"gs": {
"short": "midgard5.actor-gs",
"long": "midgard5.actor-gs-long"
},
"gw": {
"short": "midgard5.actor-gw",
"long": "midgard5.actor-gw-long"
},
"ko": {
"short": "midgard5.actor-ko",
"long": "midgard5.actor-ko-long"
},
"in": {
"short": "midgard5.actor-in",
"long": "midgard5.actor-in-long"
},
"zt": {
"short": "midgard5.actor-zt",
"long": "midgard5.actor-zt-long"
},
"au": {
"short": "midgard5.actor-au",
"long": "midgard5.actor-au-long"
},
"pa": {
"short": "midgard5.actor-pa",
"long": "midgard5.actor-pa-long"
},
"wk": {
"short": "midgard5.actor-wk",
"long": "midgard5.actor-wk-long"
}
},
"fw": 6,
"attribute": "",
"skill": "",
"type": "innate",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.fw + @i.calc.bonus",
"type": "ew",
"label": "EW"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "nkMkMFNDSdvlP1Jt"
}

View File

@ -0,0 +1,39 @@
{
"name": "Gegenstand",
"type": "item",
"img": "icons/svg/item-bag.svg",
"system": {
"description": "",
"equippable": false,
"equipped": true,
"value": 0,
"magic": false,
"rolls": {
"formulas": {},
"output": ""
},
"mods": {},
"calc": {}
},
"effects": [],
"flags": {
"core": {
"sourceId": "Item.8GrWgO1jjysZPnxc"
}
},
"_stats": {
"systemId": "midgard5e",
"systemVersion": "1.1.0",
"coreVersion": "10.291",
"createdTime": 1681862229001,
"modifiedTime": 1681862253981,
"lastModifiedBy": "Fphp3NQlJ6KWctyq"
},
"folder": null,
"sort": 0,
"ownership": {
"default": 0,
"Fphp3NQlJ6KWctyq": 3
},
"_id": "ERcxMh7hWiv42rfx"
}

View File

@ -0,0 +1,46 @@
{
"name": "Rüstung",
"type": "armor",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
},
"equippable": false,
"equipped": true,
"attributeMod": {
"st": 0,
"gs": 0,
"gw": 0,
"ko": 0,
"in": 0,
"zt": 0,
"au": 0,
"pa": 0,
"wk": 0
},
"magic": false,
"lpProtection": 0,
"apProtection": 0,
"rolls": {
"formulas": {},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "pV1hNavlQGJ9UaEf"
}

View File

@ -0,0 +1,69 @@
{
"name": "Sprache",
"type": "skill",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"attributes": {
"st": {
"short": "midgard5.actor-st",
"long": "midgard5.actor-st-long"
},
"gs": {
"short": "midgard5.actor-gs",
"long": "midgard5.actor-gs-long"
},
"gw": {
"short": "midgard5.actor-gw",
"long": "midgard5.actor-gw-long"
},
"ko": {
"short": "midgard5.actor-ko",
"long": "midgard5.actor-ko-long"
},
"in": {
"short": "midgard5.actor-in",
"long": "midgard5.actor-in-long"
},
"zt": {
"short": "midgard5.actor-zt",
"long": "midgard5.actor-zt-long"
},
"au": {
"short": "midgard5.actor-au",
"long": "midgard5.actor-au-long"
},
"pa": {
"short": "midgard5.actor-pa",
"long": "midgard5.actor-pa-long"
},
"wk": {
"short": "midgard5.actor-wk",
"long": "midgard5.actor-wk-long"
}
},
"fw": 8,
"attribute": "in",
"skill": "",
"type": "language",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus",
"enabled": true,
"label": "EW"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "rDN14z3lNJISWTdO"
}

View File

@ -0,0 +1,42 @@
{
"name": "Verteidigungswaffe",
"type": "defensiveWeapon",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
},
"equippable": false,
"equipped": true,
"special": false,
"magic": false,
"skillId": "",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.defense.value + @c.calc.stats.defenseBonus.value + @i.stats.defenseBonus",
"enabled": true,
"label": "Abwehr"
}
},
"output": ""
},
"calc": {},
"damageBase": ""
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "BNAoHN0vHfcwNUTl"
}

View File

@ -0,0 +1,48 @@
{
"name": "Waffe",
"type": "weapon",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
},
"equippable": false,
"equipped": true,
"special": false,
"magic": false,
"ranged": false,
"skillId": "",
"damageBase": "1d6",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus",
"enabled": true,
"label": "Angriff"
},
"1": {
"formula": "@i.damageBase + @i.stats.damageBonus + @c.calc.stats.damageBonus.value",
"enabled": true,
"label": "Schaden"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "uGQJ4VPhh135e79a"
}

View File

@ -0,0 +1,69 @@
{
"name": "Waffenfertigkeit",
"type": "skill",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"attributes": {
"st": {
"short": "midgard5.actor-st",
"long": "midgard5.actor-st-long"
},
"gs": {
"short": "midgard5.actor-gs",
"long": "midgard5.actor-gs-long"
},
"gw": {
"short": "midgard5.actor-gw",
"long": "midgard5.actor-gw-long"
},
"ko": {
"short": "midgard5.actor-ko",
"long": "midgard5.actor-ko-long"
},
"in": {
"short": "midgard5.actor-in",
"long": "midgard5.actor-in-long"
},
"zt": {
"short": "midgard5.actor-zt",
"long": "midgard5.actor-zt-long"
},
"au": {
"short": "midgard5.actor-au",
"long": "midgard5.actor-au-long"
},
"pa": {
"short": "midgard5.actor-pa",
"long": "midgard5.actor-pa-long"
},
"wk": {
"short": "midgard5.actor-wk",
"long": "midgard5.actor-wk-long"
}
},
"fw": 5,
"attribute": "",
"skill": "",
"type": "combat",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus",
"enabled": true,
"label": "EW"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "1E4XHTGZlned2ofY"
}

View File

@ -0,0 +1,67 @@
{
"name": "Zauber",
"type": "spell",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"spellProcessSelection": {
"none": "midgard5.spell-process-none",
"beherrschen": "midgard5.spell-process-beherrschen",
"bewegen": "midgard5.spell-process-bewegen",
"erkennen": "midgard5.spell-process-erkennen",
"erschaffen": "midgard5.spell-process-erschaffen",
"formen": "midgard5.spell-process-formen",
"veraendern": "midgard5.spell-process-veraendern",
"zerstoeren": "midgard5.spell-process-zerstoeren",
"wundertat": "midgard5.spell-process-wundertat",
"dweomer": "midgard5.spell-process-dweomer",
"zauberlied": "midgard5.spell-process-zauberlied",
"salz": "midgard5.spell-process-salz",
"thaumagraphie": "midgard5.spell-process-thaumagraphie",
"beschwoeren": "midgard5.spell-process-beschwoeren",
"nekromantie": "midgard5.spell-process-nekromantie",
"thaumatherapie": "midgard5.spell-process-thaumatherapie",
"zaubermittel": "midgard5.spell-process-zaubermittel",
"zauberschutz": "midgard5.spell-process-zauberschutz"
},
"spellTypeSelection": {
"gedanke": "midgard5.spell-type-gedanke",
"geste": "midgard5.spell-type-geste",
"wort": "midgard5.spell-type-wort"
},
"spellTargetSelection": {
"umgebung": "midgard5.spell-target-umgebung",
"geist": "midgard5.spell-target-geist",
"koerper": "midgard5.spell-target-koerper"
},
"bonus": 0,
"type": "gedanke",
"process": "none",
"ap": 0,
"castDuration": "",
"range": "",
"effectTarget": "umgebung",
"effectArea": "",
"effectDuration": "",
"origin": "",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @c.calc.stats.spellCasting.value + @i.bonus",
"enabled": true,
"label": "Zaubern"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "HQ469FvZkwKfzFfu"
}

View File

@ -0,0 +1,19 @@
{
"name": "Kritische Fehler beim Zaubern",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "script",
"flags": {
"core": {
"sourceId": "Macro.e4KLlTBq8Z4Pt7In"
}
},
"scope": "global",
"command": "await game.tables.getName(\"Kritischer Fehler beim Zaubern\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kritfehlerzauber.svg",
"actorIds": [],
"_id": "XtzGuyYRyX8wVi1e"
}

View File

@ -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": "await game.tables.getName(\"Kritischer Erfolg bei der Abwehr\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kriterfolgabwehr.svg",
"actorIds": [],
"_id": "qWyrwvh7g9CbTKg9"
}

View File

@ -0,0 +1,19 @@
{
"name": "Kritischer Fehler bei Angriffen",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "script",
"flags": {
"core": {
"sourceId": "Macro.FZUermrYHSbrEluS"
}
},
"scope": "global",
"command": "await game.tables.getName(\"Kritischer Fehler bei Angriffen\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kritfehlerangriff.svg",
"actorIds": [],
"_id": "798kmgnTkpfP89Z9"
}

View File

@ -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": "await game.tables.getName(\"Kritischer Fehler bei der Abwehr\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kritfehlerabwehr.svg",
"actorIds": [],
"_id": "W7rYb00B6rtabV05"
}

View File

@ -0,0 +1,19 @@
{
"name": "Kritischer Schaden",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "script",
"flags": {
"core": {
"sourceId": "Macro.QZlbT0tgD2aYW5YJ"
}
},
"scope": "global",
"command": "await game.tables.getName(\"Kritischer Schaden\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kriterfolgangriff.svg",
"actorIds": [],
"_id": "48DUqxdpHDCGKOHp"
}

View File

@ -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/midgard5e/assets/icons/wurfel/w10.svg",
"actorIds": [],
"_id": "YWsPRUpZpgLBKIB3"
}

View File

@ -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/midgard5e/assets/icons/wurfel/w100.svg",
"actorIds": [],
"_id": "pXZIfqDIX9VKYonr"
}

View File

@ -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/midgard5e/assets/icons/wurfel/w20.svg",
"actorIds": [],
"_id": "qBoxslCQXxR22xKc"
}

View File

@ -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/midgard5e/assets/icons/wurfel/w6.svg",
"actorIds": [],
"_id": "5tpfRgbM5sTL9gur"
}

View File

@ -0,0 +1,133 @@
{
"name": "Kritische Fehler beim Zaubern",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"flags": {
"exportSource": {
"world": "midgard-test",
"system": "midgard5e",
"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 [[1d63]] 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"
}

View File

@ -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 [[1d61]] 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"
}

View File

@ -0,0 +1,133 @@
{
"name": "Kritischer Fehler bei Angriffen",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"flags": {
"exportSource": {
"world": "midgard-test",
"system": "midgard5e",
"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 1W61 ([[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 [[1d61]] schweren Schaden. Bei Angriffen mit der bloßen Hand und anderen natürlichen Waffen oder mit Wurfwaffen verliert der Angreifer [[1d61]] 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 ([[1d61]] 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 [[1d61]] 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 [[1d61]] 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 [[1d61]] 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 [[1d61]] 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 [[1d61]] 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"
}

View File

@ -0,0 +1,144 @@
{
"name": "Kritischer Fehler bei der Abwehr",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"flags": {
"exportSource": {
"world": "midgard-test",
"system": "midgard5e",
"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 1W61 ([[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"
}

View File

@ -0,0 +1,210 @@
{
"name": "Kritischer Schaden",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"flags": {
"exportSource": {
"world": "midgard-test",
"system": "midgard5e",
"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>&lt;++&gt;</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

View File

@ -1,9 +1,9 @@
import assert from "assert"
import assert from "assert";
export default {
name: "midgard5",
name: "midgard5e",
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

View File

@ -1,30 +1,20 @@
import Globals from "./Globals";
import Globals from "./Globals"
const preloadTemplates = async (): Promise<Handlebars.TemplateDelegate<any>[]> => {
const rootPath = `${Globals.isModule ? "modules" : "systems"}/${Globals.name}/templates/`;
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/description.hbs",
"sheets/character/attribute.hbs",
"sheets/character/base_values.hbs",
"sheets/character/main.hbs",
"sheets/character/skills.hbs",
"sheets/character/gear.hbs",
"sheets/character/spells.hbs",
"sheets/character/combat.hbs",
"sheets/character/effects.hbs",
"sheets/npc/main.hbs",
"sheets/npc/combat.hbs",
"sheets/npc/properties.hbs",
"sheets/npc/description.hbs",
"sheets/npc/attribute.hbs",
"sheets/partial/mod.hbs",
"sheets/item/rolls.hbs",
"chat/roll-m5.hbs",
];
return loadTemplates(templates.map((s) => rootPath + s));
};
"chat/roll-m5.hbs"
]
return loadTemplates(templates.map(s => rootPath + s))
}
export default preloadTemplates;
export default preloadTemplates

View File

@ -1,114 +0,0 @@
/* global Handlebars, game, TextEditor, WOD5E */
import { M5Skill } from "./module/M5Base";
import { M5Character } from "./module/actors/M5Character";
/**
* Define any helpers necessary for working with Handlebars
* @return {Promise}
*/
export const loadHelpers = async function () {
Handlebars.registerHelper("times", (n: number, block) => {
var accum = "";
for (let i = 0; i < n; ++i) accum += block.fn(i);
return accum;
});
Handlebars.registerHelper("array", (arr: any[], index: number) => {
return arr[index];
});
Handlebars.registerHelper("m5concat", (...values) => {
const options = values.pop();
const join = options.hash?.join || "";
//return new Handlebars.SafeString(values.join(join));
return values.map((val) => val.toString()).join(join);
});
Handlebars.registerHelper("add", (...values) => {
const options = values.pop();
return values.reduce((prev, cur) => prev + cur);
});
Handlebars.registerHelper("localizeMidgard", (str: string) => {
const template = Handlebars.compile("{{localize value}}");
return template({
value: "midgard5." + str,
});
});
Handlebars.registerHelper("skillBonus", (actorId: string, skill: M5Skill) => {
const actor = (game as Game).actors.get(actorId) as M5Character;
return actor.skillBonus(skill).toString();
});
Handlebars.registerHelper("skillEw", (actorId: string, skill: M5Skill) => {
const actor = (game as Game).actors.get(actorId) as M5Character;
return actor.skillEw(skill).toString();
});
Handlebars.registerHelper("skill", (skillId: string) => {
return (game as Game).items.get(skillId);
});
Handlebars.registerHelper("itemValue", (id: string, path: string) => {
let obj = (game as Game).items.get(id);
path.split(".").forEach((p) => (obj = obj[p]));
return `${obj}`;
});
Handlebars.registerHelper("actorItemValue", (actorId: any, itemId: string, path: string, token?: boolean) => {
//console.log("actorItemValue", actorId, itemId, path)
const actor = (game as Game).actors.get(actorId);
let obj = actor.items.get(itemId)?.system;
path.split(".").forEach((p) => {
if (obj) obj = obj[p];
});
return `${obj}`;
});
Handlebars.registerHelper("icon", (relpath: string) => {
return `systems/midgard5/assets/icons/${relpath}`;
});
Handlebars.registerHelper("isSkillInList", (skillName: string, list: any) => {
for (let key in list) {
if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) {
return true;
}
}
return false;
});
Handlebars.registerHelper("skillEwInList", (skillName: string, list: any) => {
for (let key in list) {
if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) {
return list[key].calc.ew;
}
}
return false;
});
Handlebars.registerHelper("stripHtml", function (param) {
var regex = /(<([^>]+)>)/gi;
return param.replace(regex, "");
});
Handlebars.registerHelper("contains", (label: string, contains: string) => {
return label.toLowerCase().includes(contains.toLowerCase());
});
Handlebars.registerHelper("count", (object: any) => {
var length = 0;
for (var key in object) {
if (object.hasOwnProperty(key)) {
++length;
}
}
return length;
});
Handlebars.registerHelper("console", (object: any) => {
console.log(object);
});
};

View File

@ -2,18 +2,84 @@ import Logger from "./utils/Logger";
import M5CharacterSheet from "./module/sheets/M5CharacterSheet";
import preloadTemplates from "./PreloadTemplates";
import { M5Character } from "./module/actors/M5Character";
import { M5ModOperation, M5TimeUnit } from "./module/M5Base";
import { M5Skill } from "./module/M5Base";
import { M5ItemSheet } from "./module/sheets/M5ItemSheet";
import { M5Item } from "./module/items/M5Item";
import { reroll } from "./module/rolls/reroll";
import { loadHelpers } from "./helpers";
import { loadSettings } from "./settings";
Hooks.once("init", async () => {
Logger.log("M5 | Initialisierung Midgard 5");
// Load settings into Foundry
loadSettings();
Handlebars.registerHelper("times", (n: number, block) => {
var accum = "";
for (let i = 0; i < n; ++i) accum += block.fn(i);
return accum;
});
Handlebars.registerHelper("array", (arr: any[], index: number) => {
return arr[index];
});
Handlebars.registerHelper("m5concat", (...values) => {
const options = values.pop();
const join = options.hash?.join || "";
//return new Handlebars.SafeString(values.join(join));
return values.map((val) => val.toString()).join(join);
});
Handlebars.registerHelper("add", (...values) => {
const options = values.pop();
return values.reduce((prev, cur) => prev + cur);
});
Handlebars.registerHelper("localizeMidgard", (str: string) => {
const template = Handlebars.compile("{{localize value}}");
return template({
value: "midgard5." + str,
});
});
Handlebars.registerHelper("skillBonus", (actorId: string, skill: M5Skill) => {
const actor = (game as Game).actors.get(actorId) as M5Character;
return actor.skillBonus(skill).toString();
});
Handlebars.registerHelper("skillEw", (actorId: string, skill: M5Skill) => {
const actor = (game as Game).actors.get(actorId) as M5Character;
return actor.skillEw(skill).toString();
});
Handlebars.registerHelper("skill", (skillId: string) => {
return (game as Game).items.get(skillId);
});
Handlebars.registerHelper("itemValue", (id: string, path: string) => {
let obj = (game as Game).items.get(id);
path.split(".").forEach((p) => (obj = obj[p]));
return `${obj}`;
});
Handlebars.registerHelper("actorItemValue", (actorId: any, itemId: string, path: string) => {
//console.log("actorItemValue", actorId, itemId, path)
const actor = (game as Game).actors.get(actorId);
let obj = actor.items.get(itemId).system;
path.split(".").forEach((p) => {
if (obj) obj = obj[p];
});
return `${obj}`;
});
Handlebars.registerHelper("icon", (relpath: string) => {
return `systems/midgard5e/assets/icons/${relpath}`;
});
Handlebars.registerHelper("isSkillInList", (skillName: string, list: any) => {
for (let key in list) {
if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) {
return true;
}
}
return false;
});
// Default Sheet für Items definieren und das Standardsheet deaktivieren
Items.unregisterSheet("core", ItemSheet);
@ -25,179 +91,15 @@ Hooks.once("init", async () => {
CONFIG.Actor.documentClass = M5Character;
CONFIG.Item.documentClass = M5Item;
//RegisterSettings();
await preloadTemplates();
loadHelpers();
});
Hooks.once("setup", () => {
Logger.log("Template module is being setup.");
});
Hooks.on("getChatLogEntryContext", function (html, options) {
options.push(
{
name: "LP & AP Schaden",
icon: '<i class="fas fa-tint"></i>',
condition: (li) => {
const damageRolls = li.find(".damage").length;
// All must be true to show the reroll dialogue
return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0;
},
callback: (li) => applyDamage(li, 2),
},
{
name: "AP Schaden",
icon: '<i class="fas fa-shield-alt"></i>',
condition: (li) => {
const damageRolls = li.find(".damage").length;
// All must be true to show the reroll dialogue
return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0;
},
callback: (li) => applyDamage(li, 1),
},
{
name: "LP & AP Heilen",
icon: '<i class="fas fa-heart"></i>',
condition: (li) => {
const damageRolls = li.find(".heal").length;
// All must be true to show the reroll dialogue
return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0;
},
callback: (li) => applyDamage(li, -1),
},
{
name: "AP Heilen",
icon: '<i class="far fa-heart"></i>',
condition: (li) => {
const damageRolls = li.find(".heal").length;
// All must be true to show the reroll dialogue
return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0;
},
callback: (li) => applyDamage(li, -2),
},
{
name: "Redo",
icon: '<i class="far fa-arrow-rotate-left"></i>',
condition: (li) => {
const message = (game as Game).messages.get(li.attr("data-message-id"));
// All must be true to show the reroll dialogue
return (game["user"].isGM || game["user"].character?.id === (game as Game).actors.get(message["speaker"].actor)?.id) && !message["flags"].rerolled;
},
callback: (li) => reroll(li),
}
);
});
Hooks.on("updateCombat", function (combat: Combat, updateData: { round: number; turn: number }, updateOptions: { advanceTime: number; direction: number }) {
if (combat.round % 2 === 0 && combat.turn !== null) {
const tokenId = combat.current.tokenId;
const actorId = combat.combatant["actorId"];
let currentToken = game["actors"].tokens[tokenId];
if (!currentToken) {
currentToken = game["actors"].get(actorId);
}
let activeEffects = currentToken.items.filter((x) => x.type === "effect" && x.system.equipped) || [];
activeEffects.forEach((effect) => {
if (effect.system?.duration?.time > 0) {
if (effect.system.duration.unit === M5TimeUnit.ROUND) {
effect.system.duration.time -= 1;
}
}
if (effect.system?.duration.time === 0 && effect.system.duration.unit !== M5TimeUnit.LIMITLESS) {
effect.system.equipped = false;
}
for (const key in effect.system.mods) {
if (effect.system.mods[key].operation === M5ModOperation.SUBTRACT) {
switch (effect.system.mods[key].id) {
case "lp":
currentToken["system"].lp.value -= effect.system.mods[key].value;
break;
case "ap":
currentToken["system"].ap.value -= effect.system.mods[key].value;
break;
}
} else if (effect.system.mods[key].operation === M5ModOperation.ADD) {
switch (effect.system.mods[key].id) {
case "lp":
currentToken["system"].lp.value += limitHeal(effect.system.mods[key].value, currentToken["system"].lp.value, currentToken["system"].lp.max);
break;
case "ap":
currentToken["system"].ap.value += limitHeal(effect.system.mods[key].value, currentToken["system"].ap.value, currentToken["system"].ap.max);
break;
}
}
}
});
currentToken.render();
}
});
Hooks.on("renderCombatTracker", (combatTracker, html, context) => {
if (context.combat === null) {
html.find("h3.encounter-title")[0].innerHTML = game["i18n"].localize("midgard5.no-encounter");
} else if (Math.ceil(context.round / 2) === 0) {
html.find("h3.encounter-title")[0].innerHTML = game["i18n"].localize("midgard5.encounter-not-started");
} else {
html.find("h3.encounter-title")[0].innerHTML =
(context.round % 2 == 1 ? game["i18n"].localize("midgard5.phase-movement") : game["i18n"].localize("midgard5.phase-action")) + " " + Math.ceil(context.round / 2);
}
});
Hooks.once("ready", () => {
Logger.ok("Template module is now ready.");
});
async function applyDamage(roll, direction) {
const damageValue = Array.from(roll.find(".apply") as HTMLElement[])
.map((x) => Math.max(0, Number(x.innerText)))
.reduce((prev, curr) => prev + curr, 0);
const controlledTokens = game["canvas"].tokens.controlled;
const actor = game["user"].character;
if (controlledTokens) {
controlledTokens.forEach((controlledToken) => {
let token = controlledToken.document.delta.syntheticActor;
switch (direction) {
case 2:
token["system"].lp.value -= Math.max(0, damageValue - token["system"].calc.stats.lpProtection.value);
case 1:
token["system"].ap.value -= Math.max(0, damageValue - token["system"].calc.stats.apProtection.value);
break;
case -1:
token["system"].lp.value += limitHeal(damageValue, token["system"].lp.value, token["system"].lp.max);
case -2:
token["system"].ap.value += limitHeal(damageValue, token["system"].ap.value, token["system"].ap.max);
}
token.render();
});
} else {
switch (direction) {
case 2:
actor["system"].lp.value -= Math.max(0, damageValue - actor["system"].calc.stats.lpProtection.value);
case 1:
actor["system"].ap.value -= Math.max(0, damageValue - actor["system"].calc.stats.apProtection.value);
break;
case -1:
actor["system"].lp.value += limitHeal(damageValue, actor["system"].lp.value, actor["system"].lp.max);
case -2:
actor["system"].ap.value += limitHeal(damageValue, actor["system"].ap.value, actor["system"].ap.max);
}
actor.render();
}
}
function limitHeal(heal: number, current: number, max: number): number {
if (current === max) {
return 0;
} else if (heal + current > max) {
return max - current;
}
return heal;
}

View File

@ -1,72 +1,52 @@
import { BooleanField } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/data/fields.mjs";
import { BooleanField } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/data/fields.mjs"
export interface M5Skill {
fw: number;
attribute: string;
pp: number;
fw: number
attribute: string
pp: number
}
export interface M5SkillUnlearned extends M5Skill {
initial: number;
initial: number
}
export interface M5SkillLearned extends M5Skill {
skill: string;
type: string;
skill: string
type: string
}
export interface M5SkillCalculated extends M5Skill {
label: string;
calc: any;
label: string,
calc: any
}
export interface M5Attribute {
value: number;
bonus: number;
value: number
bonus: number
}
export interface M5RollData {
c: any;
i: any;
b: any;
iType: string;
rolls: any;
c: any
i: any
iType: string
rolls: {}
res: {
label: string;
};
label: string
}
}
export interface M5RollTemplate {
formula: string;
label: string;
enabled: boolean;
formula: string
label: string
enabled: boolean
}
export interface M5RollResult extends M5RollTemplate {
total: number;
totalStr: string;
result: string;
dice: {};
css: string;
}
export enum M5ItemType {
SKILL = "skill",
ITEM = "item",
WEAPON = "weapon",
DEFENSIVE_WEAPON = "defensiveWeapon",
ARMOR = "armor",
CONTAINER = "container",
SPELL = "spell",
KAMPFKUNST = "kampfkunst",
EFFECT = "effect",
}
export enum M5SkillType {
INNATE = "innate",
GENERAL = "general",
LANGUAGE = "language",
COMBAT = "combat",
total: number
totalStr: string
result: string
dice: {}
css: string
}
export enum M5EwResult {
@ -75,7 +55,7 @@ export enum M5EwResult {
CRITICAL = "roll-ew-result-critical",
HIGH = "roll-ew-result-high",
FAIL = "roll-ew-result-fail",
PASS = "roll-ew-result-pass",
PASS = "roll-ew-result-pass"
}
export enum M5Attributes {
@ -87,7 +67,7 @@ export enum M5Attributes {
ZT = "zt",
AU = "au",
PA = "pa",
WK = "wk",
WK = "wk"
}
export enum M5Stats {
@ -101,130 +81,96 @@ export enum M5Stats {
BRAWL = "brawl",
POISON_RESISTANCE = "poisonResistance",
LP = "lp",
AP = "ap",
PROTECTION_LP = "lpProtection",
PROTECTION_AP = "apProtection",
DEPRIVATION_COLD = "deprivationCold",
DEPRIVATION_HEAT = "deprivationHeat",
DEPRIVATION_FOOD = "deprivationFood",
AP = "ap"
}
export enum M5ModType {
ATTRIBUTE = "attribute",
STAT = "stat",
SKILL = "skill",
SKILL = "skill"
}
export enum M5ModOperation {
ADD_100 = "add100",
ROLL = "roll",
ADD = "add",
SET = "set",
FIXED = "fixed",
MULTIPLY = "multiply",
SUBTRACT = "subtract",
DIVISION = "division",
}
export enum M5TimeUnit {
ROUND = "round",
MINUTE = "minute",
HOUR = "hour",
LIMITLESS = "limitless",
FIXED = "fixed"
}
export interface M5ItemMod {
type: M5ModType;
id: string;
operation: M5ModOperation;
value: number;
type: M5ModType
id: string
operation: M5ModOperation
value: number
}
export interface M5ModPair {
mod: M5ItemMod;
source: string;
mod: M5ItemMod
source: string
}
export interface M5ModSource {
item: string;
operation: M5ModOperation;
value: number;
item: string
operation: M5ModOperation
value: number
}
export interface M5ModResult {
mods: Array<M5ModSource>;
value: number;
mods: Array<M5ModSource>
value: number
}
export interface M5AttributeCalculated extends M5ModResult {
bonus: number;
bonus: number
}
export interface M5CharacterCalculatedData {
level: number;
movement: number;
level: number
attributes: {
st: M5AttributeCalculated;
gs: M5AttributeCalculated;
gw: M5AttributeCalculated;
ko: M5AttributeCalculated;
in: M5AttributeCalculated;
zt: M5AttributeCalculated;
au: M5AttributeCalculated;
pa: M5AttributeCalculated;
wk: M5AttributeCalculated;
};
st: M5AttributeCalculated
gs: M5AttributeCalculated
gw: M5AttributeCalculated
ko: M5AttributeCalculated
in: M5AttributeCalculated
zt: M5AttributeCalculated
au: M5AttributeCalculated
pa: M5AttributeCalculated
wk: M5AttributeCalculated
}
stats: {
lp: M5ModResult;
ap: M5ModResult;
lpProtection: M5ModResult;
apProtection: M5ModResult;
defense: M5ModResult;
damageBonus: M5ModResult;
attackBonus: M5ModResult;
defenseBonus: M5ModResult;
movement: M5ModResult;
resistanceMind: M5ModResult;
resistanceBody: M5ModResult;
spellCasting: M5ModResult;
brawl: M5ModResult;
brawlFw: number;
poisonResistance: M5ModResult;
enduranceBonus: number;
deprivationCold: M5ModResult;
deprivationHeat: M5ModResult;
deprivationFood: M5ModResult;
hoard: number;
hoardNext: number;
hoardMin: number;
wealth: number;
load: number;
heavyLoad: number;
loadMax: number;
thrustLoad: number;
encumbrance: number;
};
skillMods: {};
lp: M5ModResult
ap: M5ModResult
armor: number
defense: M5ModResult
damageBonus: M5ModResult
attackBonus: M5ModResult
defenseBonus: M5ModResult
movementBonus: M5ModResult
resistanceMind: M5ModResult
resistanceBody: M5ModResult
spellCasting: M5ModResult
brawl: M5ModResult
brawlEw: number
poisonResistance: M5ModResult
enduranceBonus: number
}
skillMods: {}
skills: {
innate: {};
general: {};
combat: {};
language: {};
custom: {};
};
innate: {}
general: {}
combat: {}
language: {}
custom: {}
}
gear: {
weapons: {};
defensiveWeapons: {};
armor: {};
items: {};
containers: {};
effects: {};
};
spells: {};
kampfkuenste: {};
weapons: {}
defensiveWeapons: {}
armor: {}
items: {}
}
spells: {}
}
export function enumKeys<O extends object, K extends keyof O = keyof O>(obj: O): K[] {
return Object.keys(obj).filter((k) => Number.isNaN(+k)) as K[];
return Object.keys(obj).filter(k => Number.isNaN(+k)) as K[]
}

View File

@ -1,6 +1,7 @@
import { M5Item } from "../items/M5Item";
import { M5Attribute, M5CharacterCalculatedData, M5ItemMod, M5ItemType, M5ModOperation, M5ModResult, M5RollData, M5Skill, M5SkillCalculated } from "../M5Base";
import { M5Attribute, M5CharacterCalculatedData, M5ItemMod, M5ModOperation, M5ModResult, M5RollData, M5Skill, M5SkillCalculated, M5SkillLearned } from "../M5Base";
import M5ModAggregate from "./M5ModAggregate";
export class M5Character extends Actor {
// constructor(
// data: ConstructorParameters<typeof foundry.documents.BaseActor>[0],
@ -23,67 +24,7 @@ export class M5Character extends Actor {
return -2;
}
static loadValue(attribute: M5Attribute) {
const value = this.attributeMinMax(attribute);
if (value > 99) return 35;
if (value > 95) return 30;
if (value > 80) return 25;
if (value > 60) return 20;
if (value > 30) return 15;
if (value > 10) return 10;
if (value > 0) return 5;
return 0;
}
static heavyLoadValue(attribute: M5Attribute) {
const value = this.attributeMinMax(attribute);
if (value > 99) return 50;
if (value > 95) return 45;
if (value > 80) return 40;
if (value > 60) return 35;
if (value > 30) return 30;
if (value > 10) return 25;
if (value > 0) return 20;
return 0;
}
static maxLoadValue(attribute: M5Attribute) {
const value = this.attributeMinMax(attribute);
if (value > 99) return 90;
if (value > 95) return 80;
if (value > 80) return 75;
if (value > 60) return 70;
if (value > 30) return 60;
if (value > 10) return 50;
if (value > 0) return 40;
return 0;
}
static thrustLoadValue(attribute: M5Attribute) {
const value = this.attributeMinMax(attribute);
if (value > 99) return 200;
if (value > 95) return 170;
if (value > 80) return 150;
if (value > 60) return 140;
if (value > 30) return 120;
if (value > 10) return 70;
if (value > 0) return 50;
return 0;
}
derivedData(
skip: {
mods?: boolean;
skills?: boolean;
items?: boolean;
spells?: boolean;
effects?: boolean;
containers?: boolean;
kampfkuenste?: boolean;
encumbrance?: boolean;
class?: boolean;
} = {}
): M5CharacterCalculatedData {
derivedData(skip: { mods?: boolean; skills?: boolean; weapons?: boolean; defensiveWeapons?: boolean; armor?: boolean; items?: boolean; spells?: boolean } = {}): M5CharacterCalculatedData {
let ret: M5CharacterCalculatedData = {
level: 0,
attributes: {
@ -100,29 +41,19 @@ export class M5Character extends Actor {
stats: {
lp: { value: 0, mods: [] },
ap: { value: 0, mods: [] },
lpProtection: { value: 0, mods: [] },
apProtection: { value: 0, mods: [] },
armor: 0,
defense: { value: 0, mods: [] },
damageBonus: { value: 0, mods: [] },
attackBonus: { value: 0, mods: [] },
defenseBonus: { value: 0, mods: [] },
movement: { value: 0, mods: [] },
movementBonus: { value: 0, mods: [] },
resistanceMind: { value: 0, mods: [] },
resistanceBody: { value: 0, mods: [] },
spellCasting: { value: 0, mods: [] },
brawl: { value: 0, mods: [] },
brawlFw: 0,
brawlEw: 0,
poisonResistance: { value: 0, mods: [] },
enduranceBonus: 0,
deprivationCold: { value: 0, mods: [] },
deprivationHeat: { value: 0, mods: [] },
deprivationFood: { value: 0, mods: [] },
hoard: 0,
encumbrance: 0,
load: 0,
heavyLoad: 0,
thrustLoad: 0,
loadMax: 0,
},
skillMods: {},
skills: {
@ -137,11 +68,8 @@ export class M5Character extends Actor {
defensiveWeapons: {},
armor: {},
items: {},
containers: {},
effects: {},
},
spells: {},
kampfkuenste: {},
} as M5CharacterCalculatedData;
const context = this as any;
@ -150,9 +78,8 @@ export class M5Character extends Actor {
const data = (this as any).system;
if (!data) return null;
ret.level = M5Character.levelFromExp(data.info.race === "Zwerg" ? Math.min(data.calc.stats?.hoard * 2 || 0, data.es) : data.es);
ret.level = M5Character.levelFromExp(data.es);
//Set all values that are not dependent on another Value
ret.attributes.st.value = M5Character.attributeMinMax(data.attributes.st); // TODO item effects
ret.attributes.gs.value = M5Character.attributeMinMax(data.attributes.gs);
ret.attributes.gw.value = M5Character.attributeMinMax(data.attributes.gw);
@ -175,62 +102,29 @@ export class M5Character extends Actor {
ret.stats.lp = this.modResult(data.lp);
ret.stats.ap = this.modResult(data.ap);
ret.stats.lpProtection = this.modResult(0);
ret.stats.apProtection = this.modResult(0);
ret.stats.movement = this.modResult(data.movement);
ret.stats.hoardMin = M5Character.levelThreshold.at(ret.level - 1) / 2;
ret.stats.hoardNext = M5Character.levelThreshold.at(ret.level) / 2;
ret.stats.wealth = parseFloat((data.info.gold + data.info.silver / 10 + data.info.copper / 100).toPrecision(10));
ret.stats.hoard = 0;
ret.stats.encumbrance = 0;
if (!skip?.mods) {
const aggregate = new M5ModAggregate(data, ret);
context.items
?.filter(
(item) =>
(item.type === "item" || item.type === "skill" || item.type === "effect" || item.type === "armor" || item.type === "container" || item.type === "class") && item.system.equipped
)
.forEach((item) => {
const mods = item.system.mods;
//console.log("Actor item mods", mods)
Object.keys(mods).forEach((modIndex) => {
const mod = mods[modIndex] as M5ItemMod;
aggregate.push(mod, item.name);
});
});
ret.skillMods = aggregate.calculate();
}
ret.stats.armor = 0;
ret.stats.defense = this.modResult(M5Character.defenseFromLevel(ret.level));
ret.stats.damageBonus = this.modResult(Math.floor(ret.attributes.st.value / 20) + Math.floor(ret.attributes.gs.value / 30) - 3);
ret.stats.attackBonus = this.modResult(ret.attributes.gs.bonus);
ret.stats.defenseBonus = this.modResult(ret.attributes.gw.bonus);
ret.stats.resistanceMind = this.modResult(ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.in.bonus : this.raceBonus(data.info.race)));
ret.stats.resistanceBody = this.modResult(ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.ko.bonus : this.raceBonus(data.info.race)));
ret.stats.movementBonus = this.modResult(0);
ret.stats.resistanceMind = this.modResult(
(data.info.magicUsing ? 2 : 0) + ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.in.bonus : this.raceBonus(data.info.race))
);
ret.stats.resistanceBody = this.modResult(
(data.info.magicUsing ? 2 : 1) + ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.ko.bonus : this.raceBonus(data.info.race))
);
ret.stats.spellCasting = this.modResult((data.info.magicUsing ? M5Character.spellCastingFromLevel(ret.level) : 3) + ret.attributes.zt.bonus);
ret.stats.brawl = this.modResult(Math.floor((ret.attributes.st.value + ret.attributes.gw.value) / 20));
ret.stats.brawlFw = ret.stats.brawl.value + ret.stats.attackBonus.value + (data.info.race === "Zwerg" ? 1 : 0);
ret.stats.brawlEw = ret.stats.brawl.value + ret.stats.attackBonus.value;
ret.stats.poisonResistance = this.modResult(30 + Math.floor(ret.attributes.ko.value / 2));
ret.stats.enduranceBonus = Math.floor(ret.attributes.ko.value / 10) + Math.floor(ret.attributes.st.value / 20);
ret.stats.deprivationCold = this.modResult(Math.floor(ret.attributes.ko.value / 2));
ret.stats.deprivationHeat = this.modResult(Math.floor(ret.attributes.ko.value / 2));
ret.stats.deprivationFood = this.modResult(Math.floor(40 + ret.attributes.ko.value / 2));
ret.stats.load = M5Character.loadValue(data.attributes.st);
ret.stats.heavyLoad = M5Character.heavyLoadValue(data.attributes.st);
ret.stats.loadMax = M5Character.maxLoadValue(data.attributes.st);
ret.stats.thrustLoad = M5Character.thrustLoadValue(data.attributes.st);
if (!skip?.mods) {
const aggregate = new M5ModAggregate(data, ret);
context.items
?.filter(
(item) =>
(item.type === "item" || item.type === "skill" || item.type === "effect" || item.type === "armor" || item.type === "container" || item.type === "class") && item.system.equipped
)
?.filter((item) => item.type === "item")
.forEach((item) => {
const mods = item.system.mods;
//console.log("Actor item mods", mods)
@ -243,49 +137,9 @@ export class M5Character extends Actor {
ret.skillMods = aggregate.calculate();
}
if (!skip?.containers) {
context.items
?.filter((item) => item.type === "container")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
let label = item.name;
if (item.system.magic) {
label += "*";
}
let icon = item.img;
let rollable = false;
for (let key in item.system.rolls.formulas) {
rollable = item.system.rolls.formulas[key]?.enabled;
if (rollable) {
break;
}
}
ret.gear.containers[item.id] = {
label: label,
icon: icon,
magic: item.system.magic,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
calc: item.system.calc,
equipped: item.system?.equipped,
weight: item.system.weight || 0,
capacity: item.system.capacity || 0,
value: item.system.value || 0,
currency: item.system.currency || "",
quantity: item.system.quantity || 0,
rollExist: rollable,
};
});
}
if (!skip?.items) {
context.items
?.filter((item) => item.type === "item")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
@ -293,55 +147,34 @@ export class M5Character extends Actor {
if (item.system.magic) {
label += "*";
}
if (item.system.valuable) {
ret.stats.wealth += parseFloat(this.calculateValue(item.system.value * item.system.quantity, item.system.currency).toPrecision(3));
}
if (item.system.hoarded) {
ret.stats.hoard += parseFloat(this.calculateValue(item.system.value * item.system.quantity, item.system.currency).toPrecision(3));
}
if (!!item.system.containerId) {
ret.gear.containers[item.system.containerId].weight += parseFloat((item.system.weight * item.system.quantity).toPrecision(4));
ret.gear.containers[item.system.containerId].value += parseFloat(this.calculateValue(item.system.value * item.system.quantity, item.system.currency).toPrecision(3));
if (ret.gear.containers[item.system.containerId].equipped) {
ret.stats.encumbrance += item.system.weight * item.system.quantity;
}
} else if (item.system.equipped) {
ret.stats.encumbrance += item.system.weight * item.system.quantity;
}
let icon = item.img;
let rollable = false;
// console.log(item.system.rolls.formulas.map((p) => p.enabled));
for (let key in item.system.rolls.formulas) {
rollable = item.system.rolls.formulas[key]?.enabled;
if (rollable) {
break;
}
}
ret.gear.items[item.id] = {
label: label,
icon: icon,
magic: item.system.magic,
abw: item.system.abw || 0,
calc: item.system.calc,
equipped: item.system?.equipped,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
weight: item.system.weight || 0,
containerId: item.system.containerId || "",
value: item.system.value || 0,
currency: item.system.currency || "",
quantity: item.system.quantity || 0,
rollExist: rollable,
};
});
}
if (!skip?.skills) {
context.items
?.filter((item) => item.type === "skill")
.forEach((item) => {
item.prepareDerivedData();
const skillMap = ret.skills[item.system.type];
skillMap[item.id] = {
label: item.name,
fw: item.system.fw,
attribute: item.system.attribute,
pp: item.system.pp,
calc: item.system.calc,
} as M5SkillCalculated;
});
}
if (!skip?.weapons) {
context.items
?.filter((item) => item.type === "weapon")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
@ -356,43 +189,19 @@ export class M5Character extends Actor {
item.system.stats.damageBonus +
")";
}
if (item.system.valuable) {
ret.stats.wealth += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (item.system.hoarded) {
ret.stats.hoard += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (!!item.system.containerId) {
ret.gear.containers[item.system.containerId].weight += item.system.weight;
if (ret.gear.containers[item.system.containerId].equipped) {
ret.stats.encumbrance += item.system.weight;
}
} else if (item.system.equipped) {
ret.stats.encumbrance += item.system.weight || 0;
}
ret.gear.weapons[item.id] = {
label: label,
icon: item.img,
skillId: item.system.skillId,
magic: item.system.magic,
abw: item.system.abw || 0,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
value: item.system.value || 0,
currency: item.system.currency || "",
calc: item.system.calc,
special: item.system.special,
damageBase: item.system.damageBase,
equipped: item.system?.equipped,
weight: item.system.weight || 0,
containerId: item.system.containerId || "",
};
});
}
if (!skip?.defensiveWeapons) {
context.items
?.filter((item) => item.type === "defensiveWeapon")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
@ -400,42 +209,19 @@ export class M5Character extends Actor {
if (item.system.magic) {
label += "*(" + (item.system.stats.defenseBonus < 0 ? "" : "+") + item.system.stats.defenseBonus + ")";
}
if (item.system.valuable) {
ret.stats.wealth += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (item.system.hoarded) {
ret.stats.hoard += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (!!item.system.containerId) {
ret.gear.containers[item.system.containerId].weight += item.system.weight;
if (ret.gear.containers[item.system.containerId].equipped) {
ret.stats.encumbrance += item.system.weight;
}
} else if (item.system.equipped) {
ret.stats.encumbrance += item.system.weight || 0;
}
ret.gear.defensiveWeapons[item.id] = {
label: label,
icon: item.img,
skillId: item.system.skillId,
magic: item.system.magic,
abw: item.system.abw || 0,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
value: item.system.value || 0,
currency: item.system.currency || "",
defenseBonus: item.system.stats.defenseBonus,
calc: item.system.calc,
equipped: item.system?.equipped,
weight: item.system.weight || 0,
containerId: item.system.containerId || "",
};
});
}
if (!skip?.armor) {
context.items
?.filter((item) => item.type === "armor")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
@ -443,140 +229,25 @@ export class M5Character extends Actor {
if (item.system.magic) {
label += "*";
}
if (item.system.valuable) {
ret.stats.wealth += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (item.system.hoarded) {
ret.stats.hoard += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (!!item.system.containerId) {
ret.gear.containers[item.system.containerId].weight += item.system.weight;
if (ret.gear.containers[item.system.containerId].equipped) {
ret.stats.encumbrance += item.system.weight;
}
} else if (item.system.equipped) {
ret.stats.encumbrance += 0;
} else {
ret.stats.encumbrance += item.system.weight || 0;
}
ret.gear.armor[item.id] = {
label: label,
icon: item.img,
magic: item.system.magic,
abw: item.system.abw || 0,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
value: item.system.value || 0,
currency: item.system.currency || "",
lpProtection: item.system.lpProtection,
calc: item.system.calc,
equipped: item.system?.equipped,
weight: item.system.weight || 0,
containerId: item.system.containerId || "",
};
});
}
if (!skip?.class) {
context.items
?.filter((item) => item.type === "class")
.sort((a, b) => b?.system.magicUsing - a?.system.magicUsing)
.forEach((item, index) => {
if (index !== 0) {
item.system.equipped = false;
} else {
item.system.equipped = true;
data.info.magicUsing = item.system.magicUsing;
data.lernKostenZauber = item.system.lernKostenZauber;
}
if (typeof data.info.class === "string") {
data.info.class = {};
}
data.info.class[item.id] = item.name;
});
}
if (!skip?.effects) {
context.items
?.filter((item) => item.type === "effect")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
let label = item.name;
if (item.system.magic) {
label += "*";
}
ret.gear.effects[item.id] = {
label: label,
icon: item.img,
magic: item.system.magic,
calc: item.system.calc,
equipped: item.system?.equipped || false,
duration: item.system?.duration || { time: 0, unit: "" },
};
});
}
if (!skip?.skills) {
context.items
?.filter((item) => item.type === "skill")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
const skillMap = ret.skills[item.system.type];
skillMap[item.id] = {
label: item.name,
icon: item.img,
fw: item.system.fw,
attribute: item.system.attribute,
pp: item.system.pp,
calc: item.system.calc,
} as M5SkillCalculated;
});
}
if (!skip?.spells) {
context.items
?.filter((item) => item.type === "spell")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
ret.spells[item.id] = {
label: item.name,
icon: item.img,
process: "midgard5.spell-process-" + item.system.process,
calc: item.system.calc,
type: item.system.type,
castDuration: item.system.castDuration || 0,
ap: item.system.ap || 0,
range: item.system.range || 0,
effectTarget: item.system.effectTarget,
effectArea: item.system.effectArea,
effectDuration: item.system.effectDuration || 0,
equipped: item.system?.equipped || false,
};
});
}
if (!skip?.kampfkuenste) {
context.items
?.filter((item) => item.type === "kampfkunst")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
ret.kampfkuenste[item.id] = {
label: item.name,
icon: item.img,
isKido: item.system.isKido,
type: item.system.type,
variante: item.system.variante,
calc: item.system.calc,
};
});
}
@ -671,7 +342,7 @@ export class M5Character extends Actor {
return data?.attributes[name];
}
async createSkill(skillName: string): Promise<M5Item> {
createSkill(skillName: string): Promise<M5Item> {
const itemData = {
name: skillName,
type: "skill",
@ -683,57 +354,17 @@ export class M5Character extends Actor {
});
}
createItem(itemName: string, itemType: M5ItemType, options?: any): Promise<M5Item> {
const itemData = {
name: itemName,
type: itemType,
data: options,
};
return (this as any).createEmbeddedDocuments("Item", [itemData]).then((docs) => {
const item = docs[0];
return item;
});
}
async createEffect(itemName: string, mods: M5ItemMod[]): Promise<M5Item> {
const itemData = {
name: itemName,
type: "effect",
system: { mods: mods, equipped: true },
};
return (this as any).createEmbeddedDocuments("Item", [itemData]).then((docs) => {
const item = docs[0];
return item;
});
}
getItem(itemId: string): any {
if (!(this as any).items) return null;
return (this as any).getEmbeddedDocument("Item", itemId);
}
private calculateValue(value: number, currency: string): number {
switch (currency) {
case "gold":
return value;
case "silver":
return parseFloat((value / 10).toPrecision(3));
case "copper":
return parseFloat((value / 100).toPrecision(3));
default:
return 0;
}
}
private modResult(value: number): M5ModResult {
return {
value: value,
mods: [
{
item: (game as Game).i18n.localize("TYPES.Actor.character"),
item: (game as Game).i18n.localize("ACTOR.TypeCharacter"),
operation: M5ModOperation.SET,
value: value,
},

View File

@ -1,173 +1,158 @@
import { M5Attribute, M5AttributeCalculated, M5Attributes, M5CharacterCalculatedData, M5ItemMod, M5ModOperation, M5ModResult, M5ModSource, M5ModType, M5Stats, M5ModPair } from "../M5Base";
import { M5Attribute, M5AttributeCalculated, M5Attributes, M5CharacterCalculatedData, M5ItemMod, M5ModOperation, M5ModResult, M5ModSource, M5ModType, M5Stats, M5ModPair } from "../M5Base"
export default class M5ModAggregate {
private attributes = new Map<string, Array<M5ModPair>>();
private stats = new Map<string, Array<M5ModPair>>();
private skills = new Map<string, Array<M5ModPair>>();
private attributes = new Map<string, Array<M5ModPair>>()
private stats = new Map<string, Array<M5ModPair>>()
private skills = new Map<string, Array<M5ModPair>>()
constructor(public data: any, public calc: M5CharacterCalculatedData) {
const characterString = (game as Game).i18n.localize("TYPES.Actor.character");
const characterString = (game as Game).i18n.localize("ACTOR.TypeCharacter")
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ST, operation: M5ModOperation.SET, value: data.attributes.st.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GS, operation: M5ModOperation.SET, value: data.attributes.gs.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GW, operation: M5ModOperation.SET, value: data.attributes.gw.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.KO, operation: M5ModOperation.SET, value: data.attributes.ko.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.IN, operation: M5ModOperation.SET, value: data.attributes.in.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ZT, operation: M5ModOperation.SET, value: data.attributes.zt.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.AU, operation: M5ModOperation.SET, value: data.attributes.au.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.PA, operation: M5ModOperation.SET, value: data.attributes.pa.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.WK, operation: M5ModOperation.SET, value: data.attributes.wk.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ST, operation: M5ModOperation.SET, value: data.attributes.st.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GS, operation: M5ModOperation.SET, value: data.attributes.gs.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GW, operation: M5ModOperation.SET, value: data.attributes.gw.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.KO, operation: M5ModOperation.SET, value: data.attributes.ko.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.IN, operation: M5ModOperation.SET, value: data.attributes.in.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ZT, operation: M5ModOperation.SET, value: data.attributes.zt.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.AU, operation: M5ModOperation.SET, value: data.attributes.au.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.PA, operation: M5ModOperation.SET, value: data.attributes.pa.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.WK, operation: M5ModOperation.SET, value: data.attributes.wk.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ST, operation: M5ModOperation.ADD_100, value: data.attributes.st.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GS, operation: M5ModOperation.ADD_100, value: data.attributes.gs.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GW, operation: M5ModOperation.ADD_100, value: data.attributes.gw.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.KO, operation: M5ModOperation.ADD_100, value: data.attributes.ko.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.IN, operation: M5ModOperation.ADD_100, value: data.attributes.in.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ZT, operation: M5ModOperation.ADD_100, value: data.attributes.zt.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.AU, operation: M5ModOperation.ADD_100, value: data.attributes.au.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.PA, operation: M5ModOperation.ADD_100, value: data.attributes.pa.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.WK, operation: M5ModOperation.ADD_100, value: data.attributes.wk.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ST, operation: M5ModOperation.ADD_100, value: data.attributes.st.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GS, operation: M5ModOperation.ADD_100, value: data.attributes.gs.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GW, operation: M5ModOperation.ADD_100, value: data.attributes.gw.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.KO, operation: M5ModOperation.ADD_100, value: data.attributes.ko.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.IN, operation: M5ModOperation.ADD_100, value: data.attributes.in.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ZT, operation: M5ModOperation.ADD_100, value: data.attributes.zt.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.AU, operation: M5ModOperation.ADD_100, value: data.attributes.au.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.PA, operation: M5ModOperation.ADD_100, value: data.attributes.pa.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.WK, operation: M5ModOperation.ADD_100, value: data.attributes.wk.bonus }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.DEFENSE, operation: M5ModOperation.SET, value: calc.stats.defenseBonus.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.ATTACK, operation: M5ModOperation.SET, value: calc.stats.attackBonus.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.DAMAGE, operation: M5ModOperation.SET, value: calc.stats.damageBonus.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.MOVEMENT, operation: M5ModOperation.SET, value: calc.stats.movement.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.RESISTANCE_MIND, operation: M5ModOperation.SET, value: calc.stats.resistanceMind.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.RESISTANCE_BODY, operation: M5ModOperation.SET, value: calc.stats.resistanceBody.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.SPELL_CASTING, operation: M5ModOperation.SET, value: calc.stats.spellCasting.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.BRAWL, operation: M5ModOperation.SET, value: calc.stats.brawl.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.POISON_RESISTANCE, operation: M5ModOperation.SET, value: calc.stats.poisonResistance.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.LP, operation: M5ModOperation.SET, value: calc.stats.lp.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.AP, operation: M5ModOperation.SET, value: calc.stats.ap.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.PROTECTION_LP, operation: M5ModOperation.SET, value: calc.stats.lpProtection.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.PROTECTION_AP, operation: M5ModOperation.SET, value: calc.stats.apProtection.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.DEPRIVATION_COLD, operation: M5ModOperation.SET, value: calc.stats.deprivationCold.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.DEPRIVATION_HEAT, operation: M5ModOperation.SET, value: calc.stats.deprivationHeat.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.DEPRIVATION_FOOD, operation: M5ModOperation.SET, value: calc.stats.deprivationFood.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.DEFENSE, operation: M5ModOperation.SET, value: calc.stats.defenseBonus.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.ATTACK, operation: M5ModOperation.SET, value: calc.stats.attackBonus.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.DAMAGE, operation: M5ModOperation.SET, value: calc.stats.damageBonus.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.MOVEMENT, operation: M5ModOperation.SET, value: calc.stats.movementBonus.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.RESISTANCE_MIND, operation: M5ModOperation.SET, value: calc.stats.resistanceMind.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.RESISTANCE_BODY, operation: M5ModOperation.SET, value: calc.stats.resistanceBody.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.SPELL_CASTING, operation: M5ModOperation.SET, value: calc.stats.spellCasting.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.BRAWL, operation: M5ModOperation.SET, value: calc.stats.brawl.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.POISON_RESISTANCE, operation: M5ModOperation.SET, value: calc.stats.poisonResistance.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.LP, operation: M5ModOperation.SET, value: calc.stats.lp.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.AP, operation: M5ModOperation.SET, value: calc.stats.ap.value }, characterString)
}
push(mod: M5ItemMod, source: string) {
if (!mod?.id || mod.id === "") return;
if (!mod?.id || mod.id === "")
return
let map: Map<string, Array<M5ModPair>> = null;
if (mod.type === M5ModType.ATTRIBUTE) map = this.attributes;
else if (mod.type === M5ModType.STAT) map = this.stats;
else if (mod.type === M5ModType.SKILL) map = this.skills;
let map: Map<string, Array<M5ModPair>> = null
if (mod.type === M5ModType.ATTRIBUTE)
map = this.attributes
else if (mod.type === M5ModType.STAT)
map = this.stats
else if (mod.type === M5ModType.SKILL)
map = this.skills
if (map) {
const pair: M5ModPair = {
mod: mod,
source: source,
};
source: source
}
if (map.has(mod.id)) map.get(mod.id).push(pair);
else map.set(mod.id, [pair]);
if (map.has(mod.id))
map.get(mod.id).push(pair)
else
map.set(mod.id, [pair])
}
}
calculate() {
const calc = this.calc;
const calc = this.calc
this.attributes.forEach((pairs, id) => {
const res = M5ModAggregate.processPairs(pairs);
const res = M5ModAggregate.processPairs(pairs)
calc.attributes[id] = {
value: res.value,
bonus: M5ModAggregate.attributeBonus(res.value),
mods: res.mods,
} as M5AttributeCalculated;
mods: res.mods
} as M5AttributeCalculated
//console.log("calc.attributes." + id, calc.attributes[id])
});
})
this.stats.forEach((pairs, id) => {
const res = M5ModAggregate.processPairs(pairs);
calc.stats[id] = res;
});
const res = M5ModAggregate.processPairs(pairs)
calc.stats[id] = res
})
const ret = {};
const ret = {}
this.skills.forEach((pairs, id) => {
ret[id] = pairs;
});
ret[id] = pairs
})
return ret;
return ret
}
static pairAsSource(pair: M5ModPair): M5ModSource {
return {
operation: pair.mod.operation,
value: pair.mod.value,
item: pair.source,
};
item: pair.source
}
}
static processPairs(arr: Array<M5ModPair>): M5ModResult {
let ret: M5ModResult = {
mods: [],
value: 0,
};
value: 0
}
let mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.FIXED).sort((a, b) => b.mod.value - a.mod.value);
let pair = mods.length === 0 ? null : mods[0];
let mods = arr.filter(pair => pair.mod.operation === M5ModOperation.FIXED).sort((a, b) => b.mod.value - a.mod.value)
let pair = mods.length === 0 ? null : mods[0]
if (pair) {
ret.mods.push(this.pairAsSource(pair));
ret.value = pair.mod.value;
ret.mods.push(this.pairAsSource(pair))
ret.value = pair.mod.value
} else {
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.SET).sort((a, b) => b.mod.value - a.mod.value);
mods = arr.filter(pair => pair.mod.operation === M5ModOperation.SET).sort((a, b) => b.mod.value - a.mod.value)
if (mods.length !== 0) {
ret.mods.push(this.pairAsSource(mods[0]));
ret.value = mods[0].mod.value;
ret.mods.push(this.pairAsSource(mods[0]))
ret.value = mods[0].mod.value
}
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.ADD_100);
mods = arr.filter(pair => pair.mod.operation === M5ModOperation.ADD_100)
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a + b, 0);
ret.value = Math.min(100, Math.max(0, ret.value + bonus));
ret.mods = ret.mods.concat(mods.map(this.pairAsSource))
const bonus = mods.map(p => p.mod.value).reduce((a, b) => a + b, 0)
ret.value = Math.min(100, Math.max(0, ret.value + bonus))
}
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.ADD);
mods = arr.filter(pair => pair.mod.operation === M5ModOperation.ADD)
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a + b, 0);
ret.value = Math.max(0, ret.value + bonus);
}
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.SUBTRACT);
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a + b, 0);
ret.value = ret.value - bonus;
}
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.MULTIPLY);
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a * b, 1);
ret.value = Math.max(0, ret.value * bonus);
}
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.DIVISION);
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a * b, 1);
ret.value = Math.max(0, Math.floor(ret.value / bonus));
ret.mods = ret.mods.concat(mods.map(this.pairAsSource))
const bonus = mods.map(p => p.mod.value).reduce((a, b) => a + b, 0)
ret.value = Math.max(0, ret.value + bonus)
}
}
return ret;
return ret
}
static attributeMinMax(attribute: M5Attribute) {
return Math.min(100, Math.max(0, attribute.value + attribute.bonus));
return Math.min(100, Math.max(0, attribute.value + attribute.bonus))
}
static attributeBonus(value: number) {
if (value > 95) return 2;
if (value > 80) return 1;
if (value > 20) return 0;
if (value > 5) return -1;
return -2;
if (value > 95)
return 2
if (value > 80)
return 1
if (value > 20)
return 0
if (value > 5)
return -1
return -2
}
//static modToString(mod: M5ItemMod): string { }
}

View File

@ -13,24 +13,8 @@ export class M5Item extends Item {
const character = actor as M5Character;
const itemData = (this as any).system;
const calc = itemData.calc;
const name = (this as any).name;
if (itemType === "item") {
calc.containers = null;
if (actor) {
const actorCalc = actor.derivedData({ containers: false, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
if (actorCalc) {
calc.containers = actorCalc.gear.containers;
}
const container = character.getItem(itemData.containerId);
//console.log("M5Item.prepareDerivedData:containers", itemData, container?.system)
if (container) {
container.prepareDerivedData();
const containerData = container.system;
}
}
} else if (itemType === "skill") {
if (itemType === "skill") {
calc.fw = itemData.fw;
calc.bonus = 0;
@ -46,40 +30,8 @@ export class M5Item extends Item {
},
];
// Adjust attribute Aussehen based on Athletik skill
if (name === "Athletik") {
itemData.mods[0] = { type: "attribute", id: "au", operation: "add100", value: Math.floor(calc.fw / 3) };
}
// Adjust stat Bewegungsweite based on Laufen skill
if (name === "Laufen") {
itemData.mods[0] = { type: "stat", id: "movement", operation: "add", value: Math.floor(calc.fw / 3) };
}
// Adjust stat Kälte based on Überleben (Gebirge) skill
if (name === "Überleben (Gebirge)") {
itemData.mods[0] = { type: "stat", id: "deprivationCold", operation: "add", value: Math.floor(calc.fw * 5) };
}
// // Adjust stat Kälte based on Überleben (Steppe) skill
if (name === "Überleben (Steppe)") {
itemData.mods[0] = { type: "stat", id: "deprivationHeat", operation: "add", value: Math.floor(calc.fw * 5) };
}
// // Adjust stat Durst & Hunger based on Robustheit skill
if (name === "Robustheit") {
itemData.mods[0] = { type: "stat", id: "deprivationFood", operation: "add", value: Math.floor(calc.fw * 5) };
}
if (character) {
const actorCalc = character.derivedData({
containers: true,
skills: true,
items: true,
spells: true,
effects: true,
kampfkuenste: true,
encumbrance: true,
class: true,
});
const actorCalc = character.derivedData({ skills: true, weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true });
if (actorCalc?.skillMods && Object.keys(actorCalc.skillMods).indexOf(itemId) !== -1) {
pairs = pairs.concat(actorCalc.skillMods[itemId]);
}
@ -100,8 +52,7 @@ export class M5Item extends Item {
const res = M5ModAggregate.processPairs(pairs);
res.mods.forEach((mod) => {
if ([M5ModOperation.SET, M5ModOperation.FIXED].includes(mod.operation)) calc.fw = mod.value;
else if ([M5ModOperation.SUBTRACT].includes(mod.operation)) calc.bonus -= mod.value;
else if ([M5ModOperation.ADD].includes(mod.operation)) calc.bonus += mod.value;
else calc.bonus += mod.value;
});
calc.ew = calc.fw + calc.bonus;
@ -112,20 +63,12 @@ export class M5Item extends Item {
calc.special = itemData.special ? 2 : 0;
calc.ew = calc.special + itemData.stats.attackBonus;
calc.combatSkills = null;
calc.containers = null;
if (actor) {
const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true });
if (actorCalc) {
calc.ew += actorCalc.stats.attackBonus.value;
calc.combatSkills = actorCalc.skills.combat;
calc.containers = actorCalc.gear.containers;
}
const container = character.getItem(itemData.containerId);
//console.log("M5Item.prepareDerivedData:containers", itemData, container?.system)
if (container) {
container.prepareDerivedData();
const containerData = container.system;
}
const skill = character.getItem(itemData.skillId);
@ -136,9 +79,6 @@ export class M5Item extends Item {
calc.ew += skillData.calc.ew;
calc.bonus += skillData.calc.bonus;
calc.fw += skillData.fw;
} else {
calc.ew += 4;
calc.fw += 4;
}
}
} else if (itemType === "defensiveWeapon") {
@ -147,21 +87,12 @@ export class M5Item extends Item {
calc.special = itemData.special ? 2 : 0;
calc.ew = calc.special + itemData.stats.defenseBonus;
calc.combatSkills = null;
calc.containers = null;
if (actor) {
const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true });
if (actorCalc) {
calc.ew += actorCalc.stats.defense.value + actorCalc.stats.defenseBonus.value;
calc.combatSkills = actorCalc.skills.combat;
calc.containers = actorCalc.gear.containers;
}
const container = character.getItem(itemData.containerId);
//console.log("M5Item.prepareDerivedData:containers", itemData, container?.system)
if (container) {
container.prepareDerivedData();
const containerData = container.system;
}
const skill = character.getItem(itemData.skillId);
@ -174,67 +105,16 @@ export class M5Item extends Item {
calc.fw += skillData.fw;
}
}
} else if (itemType === "armor") {
itemData.mods[0] = { type: "stat", id: "defenseBonus", operation: "add", value: itemData.stats.defenseBonus };
itemData.mods[1] = { type: "stat", id: "attackBonus", operation: "add", value: itemData.stats.attackBonus };
itemData.mods[2] = { type: "stat", id: "movement", operation: "add", value: itemData.stats.movementBonus };
itemData.mods[3] = { type: "attribute", id: "gw", operation: "add100", value: itemData.attributeMod.gw };
itemData.mods[4] = { type: "stat", id: "lpProtection", operation: "set", value: itemData.lpProtection };
itemData.mods[5] = { type: "stat", id: "apProtection", operation: "set", value: itemData.apProtection };
calc.containers = null;
if (actor) {
const actorCalc = actor.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
if (actorCalc) {
calc.containers = actorCalc.gear.containers;
}
const container = character.getItem(itemData.containerId);
//console.log("M5Item.prepareDerivedData:containers", itemData, container?.system)
if (container) {
container.prepareDerivedData();
const containerData = container.system;
}
}
} else if (itemType === "spell") {
calc.fw = 0;
if (actor) {
const actorCalc = character.derivedData({ containers: true, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true });
if (actorCalc) {
calc.ew = actorCalc.stats.spellCasting.value;
}
}
} else if (itemType === "kampfkunst") {
calc.fw = 0;
calc.bonus = 0;
calc.ew = 0;
calc.generalSkills = null;
if (actor) {
const actorCalc = character.derivedData({ containers: true, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
if (actorCalc) {
calc.generalSkills = actorCalc.skills.general;
}
const skill = character.getItem(itemData.skillId);
if (skill) {
skill.prepareDerivedData();
const skillData = skill.system;
calc.ew = skillData.calc.ew;
calc.fw = skillData.fw + calc.bonus;
itemData.rolls.formulas[0].label = skill.name;
}
}
} else if (itemType === "class") {
itemData.mods[0] = { type: "stat", id: "resistanceBody", operation: "add", value: itemData.resistanceBody };
itemData.mods[1] = { type: "stat", id: "resistanceMind", operation: "add", value: itemData.resistanceMind };
}
if (itemData?.mods) {
} else if (itemType === "item") {
calc.mods = {};
for (let modKey in itemData.mods) {
if (itemData.mods[modKey].type === M5ModType.SKILL && itemData.mods[modKey].id?.includes("midgard5")) {
itemData.mods[modKey].id = actor?.items.find((x) => x.name === game["i18n"].localize(itemData.mods[modKey].id))?.id;
}
}
Object.keys(itemData?.mods).forEach((key) => {
const mod = itemData.mods[key];
const modCalc = {};
@ -255,13 +135,7 @@ export class M5Item extends Item {
}
case M5ModType.SKILL: {
if (character) {
const actorCalc = character.derivedData({
items: true,
spells: true,
effects: true,
kampfkuenste: true,
encumbrance: true,
});
const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true });
if (actorCalc) {
let category = (game as Game).i18n.localize("midgard5.skill");
Object.keys(actorCalc.skills.general).forEach((skillId) => {
@ -314,7 +188,7 @@ export class M5Item extends Item {
return ret;
}
async roll(toggleAutomatedRoll = false) {
async roll() {
const item = this as any;
// Initialize chat data.
@ -341,20 +215,8 @@ export class M5Item extends Item {
}
});
const roll = new M5Roll(rollData, this.actor, item.name, item.id);
if (await roll.toMessage(toggleAutomatedRoll)) {
if (item.type === "spell" || item.type === "kampfkunst") {
if (this.actor["system"].ap.value >= item.system.ap) {
this.actor["update"]({
data: {
ap: {
value: this.actor["system"].ap.value - item.system.ap,
},
},
});
}
}
}
const roll = new M5Roll(rollData, this.actor, item.name);
return roll.toMessage();
} else {
ChatMessage.create({
speaker: speaker,

View File

@ -1,22 +1,16 @@
import { Evaluated } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/client/dice/roll";
import { M5Character } from "../actors/M5Character";
import { M5EwResult, M5ModOperation, M5ModType, M5RollData, M5RollResult, M5SkillUnlearned, M5Stats } from "../M5Base";
import { stat } from "fs";
import { M5EwResult, M5RollData, M5RollResult, M5SkillUnlearned } from "../M5Base";
export class M5Roll {
// extends Roll<M5RollData>
static readonly TEMPLATE_PATH = "systems/midgard5/templates/chat/roll-m5.hbs";
static readonly TEMPLATE_PATH = "systems/midgard5e/templates/chat/roll-m5.hbs";
public _evaluated: boolean = false;
public _total: number = 0;
public pool: PoolTerm = null;
constructor(
public data: M5RollData,
public actor: any,
public label: string,
public id?: string
) {
constructor(public data: M5RollData, public actor: any, public label: string) {
//super(null)
//this.data = rollData
}
@ -31,10 +25,10 @@ export class M5Roll {
.map((rollName, index) => {
indexMap.set(index, rollName);
const formula = this.data.rolls[rollName];
formula.formula = index === 0 && this.id !== "-1" ? formula.formula + `+ ${this.data.b.modifier}` : formula.formula;
const roll = new Roll(formula.formula, this.data);
return roll;
});
this.pool = PoolTerm.fromRolls(rolls);
console.log("evaluate", this._evaluated, this.pool);
return this.pool.evaluate({ async: true }).then((results) => {
@ -71,7 +65,7 @@ export class M5Roll {
const parseResult = M5Roll.parseDiceSides(rollResult.formula);
//console.log("evaluate roll", parseResult)
if (parseResult?.sides === 20) {
if (roll.total < this.data.b.difficulty) {
if (roll.total < 20) {
if (rowRes === M5EwResult.TBD || rowRes === M5EwResult.HIGH) rowRes = M5EwResult.FAIL;
} else {
if (rowRes === M5EwResult.TBD) rowRes = M5EwResult.PASS;
@ -93,55 +87,6 @@ export class M5Roll {
});
this.data.res.label = this.label;
if ((game as Game).settings.get("midgard5", "automatedPP") && this.data.iType !== null) {
if ((this.data.i.type === "language" || this.data.i.type === "general") && this.data.rolls[0].dice[0] >= 16) {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.actor.items.get(this.id).name}`);
this.actor.items.get(this.id).update({
system: {
pp: this.data.i.pp + 1,
},
});
} else if (this.data.rolls[0].dice[0] === 20) {
if (this.data.i.type === "combat") {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.actor.items.get(this.id).name}`);
// Rolling through skill
this.actor.items.get(this.id).update({
system: {
pp: this.data.i.pp + 1,
},
});
} else if (this.data.iType === "weapon") {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.actor.items.get(this.id).name}`);
// Rolling through Weapon Item
const skill = this.actor.items.get(this.data.i.skillId);
skill.update({
system: {
pp: skill.system.pp + 1,
},
});
} else if (this.data.iType === "defensiveWeapon") {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.actor.items.get(this.id).name}`);
// Rolling through defensiveWeapon Item
const skill = this.actor.items.get(this.data.i.skillId);
skill.update({
system: {
pp: skill.system.pp + 1,
},
});
} else if (this.data.iType === "spell") {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.data.i.process}`);
// Rolling through Spell Item
const klasse = this.actor.items.find((x) => x.type === "class" && x.system.equipped);
klasse.update({
system: {
lernKostenZauber: {
[this.data.i.process]: { pp: klasse.system.lernKostenZauber[this.data.i.process].pp + 1 },
},
},
});
}
}
}
this._evaluated = true;
return this;
@ -152,25 +97,10 @@ export class M5Roll {
return renderTemplate(M5Roll.TEMPLATE_PATH, this.data);
}
async toMessage(toggleAutomatedRoll = false) {
let automatedRoll = (game as Game).settings.get("midgard5", "automatedRoll");
automatedRoll = toggleAutomatedRoll ? !automatedRoll : automatedRoll;
let rMode = (game as Game).settings.get("core", "rollMode");
if (!automatedRoll) {
let checkOptions = await this.popUp({ isPW: this.data.rolls[0].label === (game as Game).i18n.localize("midgard5.pw") });
if (checkOptions["cancelled"]) {
return;
} else {
rMode = checkOptions["rollMode"];
this.data.b = checkOptions;
}
} else {
this.data.b = { difficulty: 20, modifier: 0 };
}
async toMessage() {
if (!this._evaluated) await this.evaluate();
const faces = this.pool.dice.map((x) => x.faces);
const rMode = (game as Game).settings.get("core", "rollMode");
const chatData = {
type: CONST.CHAT_MESSAGE_TYPES.ROLL,
@ -178,27 +108,37 @@ export class M5Roll {
speaker: ChatMessage.getSpeaker({ actor: this.actor }),
sound: CONFIG.sounds.dice,
roll: Roll.fromTerms([this.pool]),
flags: { data: this.data, rerolled: false, faces: faces },
};
let foo = ChatMessage.applyRollMode(chatData, rMode);
return ChatMessage.implementation["create"](foo, { rollMode: rMode });
ChatMessage.applyRollMode(chatData, rMode);
return ChatMessage.create(chatData);
}
static fromAttribute(actor: any, attributeKey: string) {
const character = actor as M5Character;
const attribute = character.attribute(attributeKey);
const rollData = actor.getRollData() as M5RollData;
rollData.i = attribute.value + attribute.bonus;
rollData.rolls["0"] = {
formula: "@i - 1d100",
enabled: true,
label: (game as Game).i18n.localize("midgard5.pw"),
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
return new M5Roll(rollData, actor, (game as Game).i18n.localize(`midgard5.actor-${attributeKey}-long`));
}
static fromAttributeValue(actor: any, attributeKey: string, attributeValue: number) {
const rollData = actor.getRollData() as M5RollData;
const itemData = actor.items.filter((x) => x.type === "effect").map((y) => y.system.mods);
rollData.c = 0;
for (let effectKey in itemData) {
for (let modkey in itemData[effectKey])
if (itemData[effectKey][modkey].type === M5ModType.ATTRIBUTE && itemData[effectKey][modkey].operation === M5ModOperation.ROLL) {
rollData.c += itemData[effectKey][modkey].value;
}
}
rollData.i = attributeValue;
rollData.rolls["0"] = {
formula: "@i - 1d100 - @c",
formula: "@i - 1d100",
enabled: true,
label: (game as Game).i18n.localize("midgard5.pw"),
result: "",
@ -222,7 +162,7 @@ export class M5Roll {
rollData.rolls["0"] = {
formula: "1d20 + @i.fw + @i.bonus",
enabled: true,
label: (game as Game).i18n.localize("midgard5.ew"),
label: (game as Game).i18n.localize("midgard5.pw"),
result: "",
total: 0,
totalStr: "",
@ -241,7 +181,7 @@ export class M5Roll {
};
rollData.rolls["0"] = {
formula: "1d20 + @c.calc.stats.brawlFw",
formula: "1d20 + @c.calc.stats.brawl + @c.calc.stats.attackBonus + @i.attackBonus",
enabled: true,
label: (game as Game).i18n.localize("midgard5.attack"),
result: "",
@ -252,7 +192,7 @@ export class M5Roll {
} as M5RollResult;
rollData.rolls["1"] = {
formula: "1d6 - 4 + @c.calc.stats.damageBonus.value",
formula: "1d6 - 4 + @c.calc.stats.damageBonus + @i.damageBonus",
enabled: true,
label: (game as Game).i18n.localize("midgard5.damage"),
result: "",
@ -265,74 +205,6 @@ export class M5Roll {
return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.brawl"));
}
static deprivationCold(actor: any) {
const rollData = actor.getRollData() as M5RollData;
rollData.rolls["0"] = {
formula: "@c.calc.stats.deprivationCold.value -1D100",
enabled: true,
label: (game as Game).i18n.localize("midgard5.deprivationCold"),
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationCold"));
}
static deprivationHeat(actor: any) {
const rollData = actor.getRollData() as M5RollData;
rollData.rolls["0"] = {
formula: "@c.calc.stats.deprivationHeat.value -1D100",
enabled: true,
label: (game as Game).i18n.localize("midgard5.deprivationHeat"),
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationHeat"));
}
static deprivationFood(actor: any) {
const rollData = actor.getRollData() as M5RollData;
rollData.rolls["0"] = {
formula: "@c.calc.stats.deprivationFood.value -1D100",
enabled: true,
label: (game as Game).i18n.localize("midgard5.deprivationFood"),
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationFood"));
}
static cleanSpell(actor: any) {
const rollData = actor.getRollData() as M5RollData;
rollData.rolls["0"] = {
formula: "1d20 + @c.calc.stats.spellCasting.value",
enabled: true,
label: (game as Game).i18n.localize("midgard5.spellCasting"),
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.spellCasting"));
}
static defense(actor: any) {
const rollData = actor.getRollData() as M5RollData;
rollData.i = {
@ -417,46 +289,6 @@ export class M5Roll {
return null;
}
async popUp({
useFortune = false,
difficulty = 20,
modifier = 0,
rollModes = CONFIG.Dice.rollModes,
rollMode = "",
template = "systems/midgard5/templates/chat/task-check-dialog.hbs",
isPW = false,
} = {}) {
const html = await renderTemplate(template, { useFortune, difficulty, modifier, rollModes, rollMode, isPW });
return new Promise((resolve) => {
const data = {
title: (game as Game).i18n.localize("midgard5.chat.roll"),
content: html,
buttons: {
roll: {
label: (game as Game).i18n.localize("midgard5.chat.roll"),
callback: (html) => resolve(this._processTaskCheckOptions(html[0].querySelector("form"))),
},
cancel: {
label: (game as Game).i18n.localize("midgard5.chat.cancel"),
callback: (html) => resolve({ cancelled: true }),
},
},
default: "roll",
close: () => resolve({ cancelled: true }),
};
new Dialog(data, null).render(true);
});
}
_processTaskCheckOptions(form) {
return {
difficulty: parseInt(form.difficulty?.value),
modifier: parseInt(form.modifier?.value),
rollMode: form.rollMode?.value,
};
}
}
interface FormulaParseResult {

View File

@ -1,108 +0,0 @@
import { M5RollData, M5RollResult } from "../M5Base";
import { M5Roll } from "./M5Roll";
export const reroll = async (roll) => {
const message = (game as Game).messages.get(roll.attr("data-message-id"));
const actor = (game as Game).actors.get(message["speaker"].actor);
const template = "systems/midgard5/templates/chat/reroll-dialog.hbs";
const html = await renderTemplate(template, { sg: actor.system.sg, gp: actor.system.gp });
// Button defining
let buttons = {};
buttons = {
destiny: {
icon: '<i class="fas fa-rotate-left"></i>',
label: (game as Game).i18n.localize("midgard5.chat.destiny"),
callback: () => rerollDie("destiny", "sg"),
},
luckPoints: {
icon: '<i class="fas fa-rotate-left"></i>',
label: (game as Game).i18n.localize("midgard5.chat.luckPoint"),
callback: () => rerollDie("luckPoint", "gp"),
},
modify: {
icon: '<i class="fas fa-plus"></i>',
label: (game as Game).i18n.localize("midgard5.chat.modify") + " +" + (message["flags"].faces[0] === 100 ? 10 : 2),
callback: () => rerollDie("modify", "gp"),
},
cancel: {
icon: '<i class="fas fa-times"></i>',
label: (game as Game).i18n.localize("midgard5.chat.cancel"),
},
};
// Dialog object
new Dialog(
{
title: (game as Game).i18n.localize("midgard5.chat.reroll"),
content: html,
buttons,
render: function () {},
default: "luckPoints",
},
{
classes: ["midgard5"],
}
).render(true);
async function rerollDie(type, target) {
// Update the "content" field
let rollData = actor.getRollData() as M5RollData;
const flagData = message["flags"].data;
rollData.c = flagData.c;
rollData.i = flagData.i;
rollData.b = flagData.b;
rollData.iType = flagData.iType;
rollData.res.label = flagData.res.label + " (" + (game as Game).i18n.localize(`midgard5.chat.${type}`) + ")";
actor.update({
system: {
[target]: actor.system[target] - 1,
},
});
if (type !== "modify") {
for (var key in flagData.rolls) {
if (!!flagData.rolls[key]) {
rollData.rolls[key] = {
formula: flagData.rolls[key]?.formula,
enabled: flagData.rolls[key]?.enabled,
label: flagData.rolls[key]?.label,
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
}
}
} else {
for (var key in flagData.rolls) {
if (!!flagData.rolls[key]) {
rollData.rolls[key] = {
formula: key === "0" ? flagData.rolls[key]?.result + " + " + (message["flags"].faces[0] === 100 ? 10 : 2) : flagData.rolls[key]?.result,
enabled: flagData.rolls[key]?.enabled,
label: flagData.rolls[key]?.label,
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
}
}
}
const newRoll = new M5Roll(rollData, actor, rollData.res.label, "-1");
if (!newRoll._evaluated) await newRoll.evaluate();
const chatData = {
type: CONST.CHAT_MESSAGE_TYPES.ROLL,
content: await newRoll.render(),
speaker: ChatMessage.getSpeaker({ actor: actor }),
sound: CONFIG.sounds.dice,
roll: Roll.fromTerms([newRoll.pool]),
flags: { rerolled: true },
};
message.update(chatData);
}
};

View File

@ -1,34 +1,21 @@
import Logger from "../../utils/Logger";
import { M5Character } from "../actors/M5Character";
import { M5Item } from "../items/M5Item";
import { M5ItemType, M5SkillLearned, M5SkillType, M5SkillUnlearned } from "../M5Base";
import { M5SkillLearned, M5SkillUnlearned } from "../M5Base";
import { M5Roll } from "../rolls/M5Roll";
export default class M5CharacterSheet extends ActorSheet {
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
width: 1000,
template: "systems/midgard5e/templates/sheets/character/main.hbs",
width: 800,
height: 800,
classes: ["midgard5", "sheet", "character"],
tabs: [
{
navSelector: ".sheet-navigation",
contentSelector: ".sheet-content",
initial: "base_values",
},
],
tabs: [{ navSelector: ".sheet-navigation", contentSelector: ".sheet-content", initial: "base_values" }],
});
}
get template() {
//console.log("M5CharacterSheet", this.actor.data.type)
if (this.actor.type === "npc") {
return "systems/midgard5/templates/sheets/npc/main.hbs";
}
else {
return "systems/midgard5/templates/sheets/character/main.hbs";
}
}
// get template() {
// return "systems/midgard5/templates/character_sheet/main.hbs"
// }Options extends ActorSheet.Options = ActorSheet.Options, Data extends object = ActorSheet.Data<Options>
@ -81,17 +68,28 @@ export default class M5CharacterSheet extends ActorSheet {
});
html.find(".roll-attribute-button").on("click", async (event) => {
let target = event.target.closest("[data-attribute]") as HTMLElement;
let attributeValue = target ? parseInt(target.dataset.value) : null;
let attributeStr = target ? target.dataset.attribute : null;
let elem = event.target;
let attributeStr = elem.dataset["attribute"];
while (!attributeStr) {
elem = elem.parentElement;
if (!elem) return;
attributeStr = elem.dataset["attribute"];
}
const attributeValue = parseInt(elem.dataset["value"]);
const roll = M5Roll.fromAttributeValue(this.actor, attributeStr, attributeValue);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
//console.log("roll-attribute-button", parent, attributeStr, attributeValue, roll)
await roll.toMessage();
});
html.find(".edit-item").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
let row = event.target.parentElement;
let itemId = row.dataset["item"];
while (!itemId) {
row = row.parentElement;
if (!row) return;
itemId = row.dataset["item"];
}
const context = this.actor as any;
const item = context.items.get(itemId);
@ -99,61 +97,14 @@ export default class M5CharacterSheet extends ActorSheet {
item.sheet.render(true);
});
html.find(".quantity-increase").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
if (!item.system.quantity) {
item.system.quantity = 0;
}
item.update({
data: {
quantity: item.system.quantity + 1,
},
});
this.render();
});
html.find(".quantity-decrease").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
if (item.system.quantity > 0) {
item.update({
data: {
quantity: item.system.quantity - 1,
},
});
}
this.render();
});
html.find(".roll-consumable-item").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
if (item.system.quantity > 0) {
item.update({
data: {
quantity: item.system.quantity - 1,
},
});
}
let toggleAutomatedRoll = (event.shiftKey)
await item.roll(toggleAutomatedRoll);
this.render();
});
html.find(".item-delete").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
let row = event.target.parentElement;
let itemId = row.dataset["item"];
while (!itemId) {
row = row.parentElement;
if (!row) return;
itemId = row.dataset["item"];
}
const context = this.actor as any;
const item = context.items.get(itemId);
@ -162,30 +113,28 @@ export default class M5CharacterSheet extends ActorSheet {
});
html.find(".roll-learned-button").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let skillId = target ? target.dataset.itemId : null;
const row = event.target.parentElement.parentElement;
let skillId = row.dataset["item"];
const actor = this.actor as any;
const item = actor.items.get(skillId) as M5Item;
let toggleAutomatedRoll = (event.shiftKey)
await item.roll(toggleAutomatedRoll);
await item.roll();
});
html.find(".roll-general-button").on("click", async (event) => {
let target = event.target.closest("[data-skill]") as HTMLElement;
let skillName = target ? target.dataset.skill : null;
const row = event.target.parentElement.parentElement;
let skillName = row.dataset["skill"];
const data = this.actor.system;
const unlearnedSkill = data.skills.general[skillName] as M5SkillUnlearned;
const roll = M5Roll.fromUnlearnedSkill(this.actor, unlearnedSkill, skillName);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
await roll.toMessage();
});
html.find(".learn-button").on("click", async (event) => {
let target = event.target.closest("[data-skill]") as HTMLElement;
let skillName = target ? target.dataset.skill : null;
const row = event.target.parentElement.parentElement;
let skillName = row.dataset["skill"];
const data = this.actor.system;
const unlearnedSkill = data.skills.general[skillName] as M5SkillUnlearned;
@ -204,314 +153,40 @@ export default class M5CharacterSheet extends ActorSheet {
});
});
html.find(".pp-increase").on("click", async (event) => {
let target = event.target.closest("[data-pp-name]") as HTMLElement;
let ppName = target ? target.dataset.ppName : null;
const context = this.actor as any;
const item = context.items.find((x) => x.type === "class" && x.system.equipped);
item.update({
system: {
lernKostenZauber: {
[ppName]: { pp: context.system.lernKostenZauber[ppName].pp + 1 },
},
},
});
this.render();
});
html.find(".pp-decrease").on("click", async (event) => {
let target = event.target.closest("[data-pp-name]") as HTMLElement;
let ppName = target ? target.dataset.ppName : null;
const context = this.actor as any;
const item = context.items.find((x) => x.type === "class" && x.system.equipped);
item.update({
system: {
lernKostenZauber: {
[ppName]: { pp: context.system.lernKostenZauber[ppName].pp - 1 },
},
},
});
this.render();
});
html.find(".fw-increase").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
if (!item.system.fw) {
item.system.fw = 0;
}
if (item.system.fw < 18) {
item.update({
data: {
fw: Math.min(item.system.fw + 1, 18),
},
});
}
this.render();
});
html.find(".fw-decrease").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
if (!item.system.fw) {
item.system.fw = 0;
}
if (item.system.fw > 8) {
item.update({
data: {
fw: Math.max(item.system.fw - 1, 8),
},
});
}
this.render();
});
html.find(".roll-weapon-button").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const row = event.target.parentElement.parentElement;
let itemId = row.dataset["item"];
const context = this.actor as any;
const item = context.items.get(itemId) as M5Item;
let toggleAutomatedRoll = (event.shiftKey)
await item.roll(toggleAutomatedRoll);
this.render();
await item.roll();
});
html.find(".roll-brawl-button").on("click", async (event) => {
const roll = M5Roll.brawl(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-cleanSpell-button").on("click", async (event) => {
const roll = M5Roll.cleanSpell(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-deprivationCold-button").on("click", async (event) => {
const roll = M5Roll.deprivationCold(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-deprivationHeat-button").on("click", async (event) => {
const roll = M5Roll.deprivationHeat(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-deprivationFood-button").on("click", async (event) => {
const roll = M5Roll.deprivationFood(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
await roll.toMessage();
});
html.find(".roll-defense-button").on("click", async (event) => {
const roll = M5Roll.defense(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
await roll.toMessage();
});
html.find(".roll-resistanceMind-button").on("click", async (event) => {
const roll = M5Roll.resistanceMind(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
await roll.toMessage();
});
html.find(".roll-resistanceBody-button").on("click", async (event) => {
const roll = M5Roll.resistanceBody(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
await roll.toMessage();
});
html.find(".change-equipped").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
item.update({
data: {
equipped: !item.system.equipped,
},
});
this.render();
});
html.find(".add-item").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.item"), M5ItemType.ITEM, { quantity: 1 });
});
html.find(".add-weapon").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.weapon"), M5ItemType.WEAPON);
});
html.find(".add-defensiveWeapon").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.defensiveWeapon"), M5ItemType.DEFENSIVE_WEAPON);
});
html.find(".add-armor").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.armor"), M5ItemType.ARMOR);
});
html.find(".add-container").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.container"), M5ItemType.CONTAINER, { quantity: 1 });
});
html.find(".add-innate-skill").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("midgard5.innate-ability"), M5ItemType.SKILL, {
type: M5SkillType.INNATE,
});
});
html.find(".add-general-skill").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.skill"), M5ItemType.SKILL, {
type: M5SkillType.GENERAL,
});
});
html.find(".add-combat-skill").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("midgard5.weapon-skill"), M5ItemType.SKILL, {
type: M5SkillType.COMBAT,
});
});
html.find(".add-language-skill").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("midgard5.language"), M5ItemType.SKILL, {
type: M5SkillType.LANGUAGE,
});
});
html.find(".add-spell").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.spell"), M5ItemType.SPELL, { process: "none" });
});
html.find(".add-kampfkunst").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.kampfkunst"), M5ItemType.KAMPFKUNST, {
type: "angriff",
variante: "anstuermen",
});
});
html.find(".add-effect").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.effect"), M5ItemType.EFFECT);
});
html.find(".join-combat").on("click", async (event) => {
if (!!game["combat"]) {
let combatant = game["combat"].getCombatantByActor(this.actor._id);
if (!combatant) {
await game["combat"].createEmbeddedDocuments("Combatant", [{ actorId: this.actor._id }]);
combatant = game["combat"].getCombatantByActor(this.actor._id);
}
const initiatives = {
_id: combatant._id,
initiative: this.actor.system.calc.attributes.gw.value,
};
await game["combat"].updateEmbeddedDocuments("Combatant", [initiatives]);
}
});
html.find(".ranged-combat").on("click", async (event) => {
if (!!game["combat"]) {
let combatant = game["combat"].getCombatantByActor(this.actor._id);
if (!combatant) {
await game["combat"].createEmbeddedDocuments("Combatant", [{ actorId: this.actor._id }]);
combatant = game["combat"].getCombatantByActor(this.actor._id);
}
const initiatives = {
_id: combatant._id,
initiative: 0.01 * this.actor.system.calc.attributes.gw.value,
};
await game["combat"].updateEmbeddedDocuments("Combatant", [initiatives]);
}
});
html.find(".spell-combat").on("click", async (event) => {
if (!!game["combat"]) {
let combatant = game["combat"].getCombatantByActor(this.actor._id);
if (!combatant) {
await game["combat"].createEmbeddedDocuments("Combatant", [{ actorId: this.actor._id }]);
combatant = game["combat"].getCombatantByActor(this.actor._id);
}
const initiatives = {
_id: combatant._id,
initiative: 0.001 * this.actor.system.calc.attributes.gw.value,
};
await game["combat"].updateEmbeddedDocuments("Combatant", [initiatives]);
}
});
html.find(".class-item-edit").on("click", async (event) => {
this.actor.items.find((x) => x.type === "class").sheet.render(true);
});
html.find(".class-item-delete").on("click", async (event) => {
this.actor.items.find((x) => x.type === "class").delete();
});
// Drag & Drop
const dragDrop = new DragDrop({
dragSelector: ".items-list .item",
dropSelector: null,
permissions: {
dragstart: this._canDragStart.bind(this),
drop: this._canDragDrop.bind(this),
},
callbacks: {
dragstart: this._onTransferItemDragStart.bind(this),
drop: this._onTransferItemDrop.bind(this),
},
dropSelector: ".sheet-body",
permissions: { dragstart: this._canDragStart.bind(this), drop: this._canDragDrop.bind(this) },
callbacks: { dragstart: this._onTransferItemDragStart.bind(this), drop: this._onTransferItemDrop.bind(this) },
});
dragDrop.bind(html[0]);
}
@ -521,24 +196,29 @@ export default class M5CharacterSheet extends ActorSheet {
}
_canDragDrop(selector) {
return this.options.editable;
return true;
}
_onTransferItemDragStart(event) {
const li = event.target;
$(event.target).attr("data-item-actorid", this.actor.id);
const li = event.currentTarget;
$(event.currentTarget).attr("data-item-actorid", this.actor.id);
const item = this.actor.items.get(li.dataset.itemId);
const dragData = {
type: "Transfer",
actorId: this.actor.id,
data: item.toObject(false),
tokenId: null,
};
// limit transfer on personal weapons/armour/gear
if (["skill", "item", "weapon", "defensiveWeapon", "armor", "spell"].includes(item.type)) {
const dragData = {
type: "Transfer",
actorId: this.actor.id,
data: item.toObject(false),
tokenId: null,
};
if (this.actor.isToken) dragData.tokenId = this.actor.token.id;
if (this.actor.isToken) dragData.tokenId = this.actor.token.id;
event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
} else {
return false;
}
}
async _onTransferItemDrop(event) {
@ -546,11 +226,6 @@ export default class M5CharacterSheet extends ActorSheet {
let data = null;
try {
data = JSON.parse(event.dataTransfer.getData("text/plain"));
console.log("Data", data.data);
let target = event.target.closest("[data-container-id]") as HTMLElement;
let containerId = target ? target.dataset.containerId : "";
console.log("Container ID", containerId);
data.data.system.containerId = containerId; //Update containerId
if (data.type !== "Transfer") return false;
} catch (err) {
return false;
@ -558,30 +233,14 @@ export default class M5CharacterSheet extends ActorSheet {
if (!data.data) return false;
if (data.actorId === this.actor.id) {
let itemId=data.data._id;
const context = this.actor as any;
const item = context.items.get(itemId);
item.update({
data: {
containerId: data.data.system.containerId,
},
});
return this._onSortItem(event, data.data);
}
if (data.actorId === this.actor.id) return false;
// limit transfer on personal weapons/armour/gear
if (["item", "weapon", "defensiveWeapon", "armor", "container"].includes(data.data.type)) {
try {
this.actor.createEmbeddedDocuments("Item", [duplicate(data.data)]); // Create a new Item
const actor = (game as any).actors.get(data.actorId);
await actor.items.get(data.data._id)?.delete(); // Delete originating item from other actor
} catch (e) {
console.error("Error transfering item between actors", e);
return false;
}
} else {
ui.notifications.warn("Nur Gegenstände können übertragen werden.");
try {
this.actor.createEmbeddedDocuments("Item", [duplicate(data.data)]); // Create a new Item
const actor = (game as any).actors.get(data.actorId);
await actor.items.get(data.data._id)?.delete(); // Delete originating item from other actor
} catch (e) {
console.error("Error transfering item between actors", e);
return false;
}

View File

@ -7,19 +7,12 @@ export class M5ItemSheet extends ItemSheet {
width: 640,
height: 480,
classes: ["midgard5", "sheet", "item"],
tabs: [
{
navSelector: ".sheet-navigation",
contentSelector: ".sheet-content",
initial: "base_values",
},
],
});
}
get template() {
//console.log("M5ItemSheet", this.item.data.type)
const path = "systems/midgard5/templates/sheets/item";
const path = "systems/midgard5e/templates/sheets/item";
return `${path}/${this.item.type}.hbs`;
}
@ -66,21 +59,42 @@ export class M5ItemSheet extends ItemSheet {
});
});
html.find(".mod-delete").on("click", async (event) => {
let target = event.target.closest("[data-mod-id]") as HTMLElement;
let modId = target ? target.dataset.modId : null;
html.find(".item-delete").on("click", async (event) => {
let row = event.target.parentElement;
let itemId = row.dataset["item"];
while (!itemId) {
row = row.parentElement;
if (!row) return;
itemId = row.dataset["item"];
}
const context = this.item;
delete context.system.mods[modId];
const item = context.items.get(itemId);
item.delete();
this.render(false);
});
html.find(".roll-delete").on("click", async (event) => {
let target = event.target.closest("[data-roll]") as HTMLElement;
let rollIndex = target ? target.dataset.roll : null;
//console.log("roll-delete", this.item.data.data.rolls.formulas)
let row = event.target.parentElement;
let rollIndex = row.dataset["roll"];
while (!rollIndex) {
row = row.parentElement;
if (!row) return;
rollIndex = row.dataset["roll"];
}
const rolls = this.item.system.rolls.formulas;
delete rolls[rollIndex];
rolls[rollIndex] = null;
this.item.update({
data: {
rolls: {
formulas: rolls,
},
},
});
this.render(false);
});
@ -114,11 +128,8 @@ export class M5ItemSheet extends ItemSheet {
if (["item"].includes(this.object.type)) {
const itemToItemAssociation = new DragDrop({
dragSelector: ".item",
dropSelector: ".item-list",
permissions: {
dragstart: this._canDragStart.bind(this),
drop: this._canDragDrop.bind(this),
},
dropSelector: null,
permissions: { dragstart: this._canDragStart.bind(this), drop: this._canDragDrop.bind(this) },
callbacks: { drop: this._onDropItem.bind(this) },
});
itemToItemAssociation.bind(html[0]);

View File

@ -1,25 +0,0 @@
/* global game */
/**
* Define all game settings here
* @return {Promise}
*/
export const loadSettings = async function () {
(game as Game).settings.register("midgard5", "automatedPP", {
name: "Automatische Praxispunkte",
hint: "Falls aktiv, werden Praxispunkte automatisch angerechnet.",
scope: "world",
config: true,
default: true,
type: Boolean,
});
(game as Game).settings.register("midgard5", "automatedRoll", {
name: "Automatische Würfelwürfe",
hint: "Falls aktiv, wird bei Würfelwürfen kein Dialog gezeigt. Das Verhalten kann mit gleichzeitig gedrückter Shift Taste umgekehrt werden.",
scope: "world",
config: true,
default: false,
type: Boolean,
});
};

View File

@ -3,89 +3,12 @@
@attributeBorderColor: rgba(0, 0, 0, 0.5);
.midgard5 {
.flexbox {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.flexcolumn {
flex-wrap: wrap;
flex-direction: column;
}
.flexcolumn-1 {
flex-basis: 100%;
flex-wrap: wrap;
}
.flexcolumn-2 {
flex-basis: 50%;
flex-wrap: wrap;
}
.flexcolumn-3 {
flex-basis: 33%;
flex-wrap: wrap;
}
.flexcolumn-4 {
flex-basis: 25%;
flex-wrap: wrap;
}
.flexcolumn-5 {
flex-basis: 20%;
flex-wrap: wrap;
}
.flexpart {
gap: 0;
padding: 0;
margin: 2px;
background-color: beige;
border-collapse: separate;
border-radius: 10px;
border: 2px solid black;
}
.flexpart-header {
font-weight: bold;
font-size: large;
text-align: center;
color: black;
}
.flexpart-icon {
height: 2rem;
float: left;
border: 0px solid transparent;
}
.flexrow {
align-items: center;
}
h3 {
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
margin-top: 0.5rem;
margin-bottom: 0;
text-align: left;
font-weight: bold;
background-color: #eeede0;
color: black;
border-collapse: separate;
border: 2px solid black;
border-radius: 10px;
}
.profile-img {
display: block;
margin-left: auto;
margin-right: auto;
height: 100%;
width: auto;
border: 0px solid black;
margin-top: 1rem;
}
.sheet.character {
@ -104,51 +27,24 @@
}
}
.profile-img {
height: 64px;
width: 64px;
}
.description {
flex: 0 0 100%;
margin: 0;
}
}
.sheet-navigation {
margin: 4px 0;
background-color: lightgrey;
border-top: 2px solid black;
border-bottom: 2px solid black;
}
.sheet-navigation .item {
padding: 8px 12px 8px 12px;
color: black;
font-weight: bold;
font-size: large;
}
.sheet-navigation .active {
background-color: darkgrey;
}
.level-display {
text-align: right;
font-weight: bold;
}
table {
background-color: beige;
border: 0px solid transparent;
&.bordered {
border-collapse: separate;
border: 2px solid black;
border-radius: 10px;
font-size: larger;
font-weight: bolder;
}
}
td,
th {
td, th {
padding: 0 0.5rem 0 0.5rem;
text-align: left;
&.center {
text-align: center;
@ -158,44 +54,6 @@
width: 3rem;
text-align: center;
}
&.attribute {
text-align: center;
font-weight: bold;
}
&.attribute-value {
background: url(/icons/svg/d20-grey.svg) no-repeat;
background-size: 50px 50px;
background-position: center;
color: black;
text-align: center;
font-weight: bold;
height: 50px;
width: 50px;
}
&.title {
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
text-align: left;
font-weight: bold;
}
&.highlight {
font-weight: bold;
font-style: italic;
}
}
.table-icon {
height: 1rem;
width: 1rem;
float: left;
border: 0px solid transparent;
}
input {
border: 0px solid black;
}
input.skill {
@ -206,42 +64,25 @@
width: 5rem;
}
input.checkbox {
width: 1rem;
height: 1rem;
}
.new-skill {
font-style: italic;
background: rgba(0, 0, 0, 0.3);
color: rgba(255, 255, 255);
color:rgba(255, 255, 255);
button {
background: rgba(255, 255, 255, 0.5);
}
}
.roll-button {
button.roll-button {
background: url(/icons/svg/d20-black.svg) no-repeat;
background-size: 1rem 1rem;
border: #000000 solid 0px;
width: 1rem;
height: 1rem;
}
.wide-button {
margin: 0.25rem 0;
}
.learn-button {
padding: 0;
margin: 0;
height: 1rem;
width: 4rem;
background: rgba(255, 255, 255, 0.5);
font-size: smaller;
text-align: center;
line-height: 0.8rem;
background-size: 24px 24px;
width: 26px;
height: 26px;
}
span.spell-process {
color: rgb(93, 93, 93);
color:rgb(93, 93, 93);
font-style: italic;
}
@ -250,7 +91,7 @@
}
.health-bar {
height: 1rem;
height: 2rem;
background-color: rgba(0, 0, 0, 0.8);
display: flex;
flex-direction: row;
@ -258,9 +99,8 @@
padding: 1px;
//align-items: stretch;
input,
.max-value {
flex: 0 0 2rem;
input {
flex: 0 0 3rem;
text-align: center;
height: 100%;
background-color: rgba(109, 108, 102, 1);
@ -272,51 +112,37 @@
.lp-bar-item-empty,
.ap-bar-item-empty {
flex-grow: 1;
background-color: white;
background-color: rgb(201, 201, 201);
}
.lp-bar-item {
flex-grow: 1;
background-color: lightgreen;
background-color: rgb(57, 234, 139);
}
.ap-bar-item {
flex-grow: 1;
background-color: lightblue;
background-color: rgb(57, 163, 234);
}
.negative-bar-item {
flex-grow: 1;
background-color: red;
}
}
.biography {
margin: 0.5rem 0.5rem 0.5rem 0.5rem;
height: 180px;
background-color: #eaead7;
.editor {
height: 100%;
width: 100%;
background-color: rgb(234, 57, 57);
}
}
.attributes {
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
display: flex;
flex-direction: row;
margin-bottom: 0.5rem;
background-color: beige;
flex-wrap: wrap;
justify-content: center;
.attribute {
flex: 0 0 6rem;
flex: 0 0 7rem;
margin: 0;
border: 1px solid @attributeBorderColor;
//border-bottom: none;
border-radius: 10;
display: flex;
flex-direction: column;
@ -328,7 +154,7 @@
font-weight: bold;
background-color: @attributeBorderColor;
color: rgba(255, 255, 255, 1);
color:rgba(255, 255, 255, 1);
//font-size: 1.0rem;
height: 2.5rem;
@ -365,36 +191,4 @@
}
}
}
.chip {
display: inline-block;
padding: 0 25px;
height: 35px;
font-size: 16px;
line-height: 35px;
border-radius: 25px;
background-color: #f1f1f1;
}
.closebtn {
padding-left: 10px;
color: #888;
font-weight: bold;
float: right;
font-size: 20px;
cursor: pointer;
}
.closebtn:hover {
color: #000;
}
.pp-listing {
margin: 0 2rem;
flex: 1 0 16%;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: baseline;
}
}
}

View File

@ -1,6 +1,6 @@
// main: midgard5.less
.midgard5.sheet.item {
.midgard5.sheet.item {
form {
display: flex;
flex-direction: column;
@ -15,11 +15,10 @@
}
.item-img {
height: 64px;
width: 64px;
width: 64px;
}
td,
th {
td, th {
padding: 0 0.5rem 0 0.5rem;
&.center {
@ -41,7 +40,7 @@
.col-create {
width: 3rem;
text-align: center;
button {
background: rgba(255, 255, 255, 0.5);
}

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