Compare commits
No commits in common. "main" and "feature/applicationv2" have entirely different histories.
main
...
feature/ap
|
|
@ -7,8 +7,6 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: node-01
|
runs-on: node-01
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
steps:
|
steps:
|
||||||
- name: Print Tag
|
- name: Print Tag
|
||||||
run: |
|
run: |
|
||||||
|
|
@ -40,15 +38,11 @@ jobs:
|
||||||
zip -r release.zip . # Adjust the path to your build output directory
|
zip -r release.zip . # Adjust the path to your build output directory
|
||||||
mv release.zip /tmp/release.zip
|
mv release.zip /tmp/release.zip
|
||||||
|
|
||||||
- name: Auto Commit
|
|
||||||
run: |
|
|
||||||
git add .
|
|
||||||
git commit -m "auto commit"
|
|
||||||
git push origin HEAD:main
|
|
||||||
|
|
||||||
- name: Package Upload
|
- name: Package Upload
|
||||||
uses: akkuman/gitea-release-action@v1
|
uses: akkuman/gitea-release-action@v1
|
||||||
with:
|
with:
|
||||||
server_url: https://git.macniel.online
|
server_url: https://git.macniel.online
|
||||||
files: |
|
files: |
|
||||||
/tmp/release.zip
|
/tmp/release.zip
|
||||||
|
./dist/system.json
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
|
|
||||||
<option name="myValues">
|
|
||||||
<value>
|
|
||||||
<list size="7">
|
|
||||||
<item index="0" class="java.lang.String" itemvalue="nobr" />
|
|
||||||
<item index="1" class="java.lang.String" itemvalue="noembed" />
|
|
||||||
<item index="2" class="java.lang.String" itemvalue="comment" />
|
|
||||||
<item index="3" class="java.lang.String" itemvalue="noscript" />
|
|
||||||
<item index="4" class="java.lang.String" itemvalue="embed" />
|
|
||||||
<item index="5" class="java.lang.String" itemvalue="script" />
|
|
||||||
<item index="6" class="java.lang.String" itemvalue="prose-mirror" />
|
|
||||||
</list>
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="myCustomValuesEnabled" value="true" />
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
||||||
68
README.md
|
|
@ -1,9 +1,6 @@
|
||||||
Modulentwicklung eines Systems was Das Schwarze Auge 4.1 in FoundryVTT abbildet.
|
Modulentwicklung eines Systems was Das Schwarze Auge 4.1 in FoundryVTT abbildet.
|
||||||
----
|
----
|
||||||
|
|
||||||
Manifest des Systems: `https://git.macniel.online/macniel/foundry-dsa41-game/raw/branch/main/src/system.json`
|
|
||||||
|
|
||||||
|
|
||||||
In diesem Repository findet die Codeentwicklung des Moduls statt.
|
In diesem Repository findet die Codeentwicklung des Moduls statt.
|
||||||
|
|
||||||
## Weitere Resourcen
|
## Weitere Resourcen
|
||||||
|
|
@ -20,67 +17,4 @@ API: https://foundryvtt.com/api/classes/foundry.abstract.Document.html
|
||||||
|
|
||||||
Demo: https://github.com/foundryvtt/dnd5e
|
Demo: https://github.com/foundryvtt/dnd5e
|
||||||
|
|
||||||
# Features
|
Flim Flam
|
||||||
|
|
||||||
## Spieler Tools
|
|
||||||
|
|
||||||
### Währungsanzeige
|
|
||||||
|
|
||||||
Mit dieser handlichen Anzeige kann man auf einem Blick sehen, über wieviele Geldmittel man verfügt. Hierzu werden alle Dukaten, Silbertaler, Kreuzer und Heller im Inventar zusammengezählt und ansprechend präsentiert.
|
|
||||||
|
|
||||||
### Teilen und Zusammenlegen von Gegenstands-Stapeln
|
|
||||||
|
|
||||||
Es ist möglich via Kontextmenü Gegenstands-Stapel in zwei Stapel aufzuteilen, dies ist vorallem dann hilfreich, wenn man Loot aufteilen möchte. Gleichermaßen ist es möglich gleichartige Gegenstands-Stapel zusammenzuführen, in dem man einen Stapel auf ein anderen fallen lässt.
|
|
||||||
|
|
||||||
### Attacke Dialog
|
|
||||||
|
|
||||||
Über den Charakterbogen kann eine Attacke gestartet werden. In diesem Dialog kann das Ziel, die Waffe sowie das Manvör und etwaige Erschwernisse und Ansagen eingestellt werden. Je nach Länge des Manövers wird die Attacke direkt ausgeführt oder in die Abklingleiste deponiert.
|
|
||||||
|
|
||||||
### Verteidigungs Dialog
|
|
||||||
|
|
||||||
Über den Charakterbogen kann eine Verteidigung gestartet werden. In diesem Dialog kann die Waffe oder das Manöver ausgewählt werden womit sich der Charakter verteidigen soll. Der Verteidigungswurf wird automatisch durchgeführt.
|
|
||||||
|
|
||||||
### Rasten und Regeneration
|
|
||||||
|
|
||||||
Es ist möglich den Rasten und Regenerations Dialog von dem Charakterbogen eines Charakters aufzurufen worin man die Einstellungen vornehmen kann die die Regeneration während einer Rest von Lebensenergie und Astralenergie sowie der Heilung von Wunden beeinflussen.
|
|
||||||
|
|
||||||
### Mini Charakterbogen
|
|
||||||
|
|
||||||
Wenn der Charakterbogen schmall genug gezogen ist, wird dieser aktiviert und enthält lediglich die Seitenleiste sowie die Attribute auf denen gewürfelt werden können. Daneben allerdings befinden sich die Reiter des großen Charakterbogens welche die jeweiligen Seiten in kleiner Form als separates Fenster öffnen lassen.
|
|
||||||
|
|
||||||
### Item Browser
|
|
||||||
|
|
||||||
Es ist nun möglich auf dem Charakterbogen unter dem Reiter "Inventar" den Item Browser zu öffnen wo alle Gegenstände der aktuellen Welt enthalten sind und mit rudimentären Filtern durchsucht werden können. Ein Spieler kann hierrüber neue Gegenstände kaufen, der Spielleiter hingegen kann per Drag and Drop die gesuchten Gegenstände auf alle Actor Sheets hinzufügen.
|
|
||||||
|
|
||||||
## GM Tools
|
|
||||||
|
|
||||||
### Gruppenmanagement
|
|
||||||
|
|
||||||
Um die Übersicht zu wahren, gibt es mit Gruppen das Werkzeug in die Hände der Spielleitung um wichtige Infos wie
|
|
||||||
Eigenschaften, Vor und Nachteile und andere Statistiken eines Charakters innerhalb einer Gruppe zu haben und diese
|
|
||||||
gleichzeitigt mit denen anderer vergleichen zu können.
|
|
||||||
|
|
||||||
### Kreaturen
|
|
||||||
|
|
||||||
Da die Erstellung eines Charakters sehr komplex ist, gibt es mit Kreaturen eine stark abgespeckte Variante, die leicht
|
|
||||||
während der Sitzung oder in Vorbereitung angelegt werden können. Nur die für kämpfischer Begegnungen relevanten
|
|
||||||
Informationen sind verfügbar.
|
|
||||||
|
|
||||||
### Händler
|
|
||||||
|
|
||||||
Um die Vorbereitung einer Sitzung so komfortabel wie möglich zu gestalten, gibt es mit Händler die Möglichkeit Gebäude
|
|
||||||
oder NSCs vorzubereiten welche Waren und oder (ggf. in Anzahl beschränkte) Dienstleistungen bereitstellen, gegen einen
|
|
||||||
Preis natürlich.
|
|
||||||
|
|
||||||
### Battle
|
|
||||||
|
|
||||||
Um heimlich vergleichend Talentproben von zwei Charakteren und oder Kreaturen durchzuführen gibt es den Battle Dialog. In diesem können Charaktere/Kreaturen ausgewählt werden, deren Talente ausgewählt oder eingegeben (samt Eigenschaften) werden, Erschwernisse eingetragen werden und dann geht es auch schon los.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Acknowledgments
|
|
||||||
|
|
||||||
Icon Theme of Equipment Items (e.g. Weapons, Armory, Adventuring Gear) is made by https://soda-1.itch.io/
|
|
||||||
|
|
||||||
Tanja für den UI UX Support.
|
|
||||||
|
|
||||||
|
|
|
||||||
188
gulpfile.mjs
|
|
@ -1,109 +1,70 @@
|
||||||
import {dest, series, src} from 'gulp';
|
import {dest, series, src} from 'gulp';
|
||||||
import gulp from 'gulp';
|
|
||||||
import process from 'node:process';
|
import process from 'node:process';
|
||||||
import replace from 'gulp-replace';
|
import replace from 'gulp-replace';
|
||||||
import jsonModify from 'gulp-json-modify';
|
import {getRandomValues} from 'node:crypto';
|
||||||
import {subtle} from 'node:crypto';
|
|
||||||
import * as dartSass from 'sass';
|
import * as dartSass from 'sass';
|
||||||
import gulpSass from 'gulp-sass';
|
import gulpSass from 'gulp-sass';
|
||||||
import {deleteAsync} from 'del';
|
import {deleteAsync} from 'del';
|
||||||
import {readdirSync, readFileSync, writeFileSync, rmdirSync, existsSync, mkdirSync, statSync} from "fs";
|
import {readdirSync, readFileSync, writeFileSync, rmdirSync, existsSync, mkdirSync} from "fs";
|
||||||
import {join} from 'node:path';
|
import {join} from 'node:path';
|
||||||
|
|
||||||
import {compilePack} from '@foundryvtt/foundryvtt-cli';
|
import {compilePack} from '@foundryvtt/foundryvtt-cli';
|
||||||
|
|
||||||
const sass = gulpSass(dartSass)
|
const sass = gulpSass(dartSass);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate a random alphanumeric string ID of a given requested length using `crypto.getRandomValues()`.
|
* Generate a random alphanumeric string ID of a given requested length using `crypto.getRandomValues()`.
|
||||||
* @param {string} reference The reference which should be used to generate a semi random ID
|
|
||||||
* @param {number} length The length of the random string to generate, which must be at most 16384.
|
* @param {number} length The length of the random string to generate, which must be at most 16384.
|
||||||
* @returns {string} A string containing random letters (A-Z, a-z) and numbers (0-9).
|
* @returns {string} A string containing random letters (A-Z, a-z) and numbers (0-9).
|
||||||
*/
|
*/
|
||||||
function randomID(reference = "", length = 16) {
|
function randomID(length = 16) {
|
||||||
const encoder = new TextEncoder()
|
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
const data = encoder.encode(reference)
|
const cutoff = 0x100000000 - (0x100000000 % chars.length);
|
||||||
return subtle.digest('SHA-256', data).then(hashBuffer => {
|
const random = new Uint32Array(length);
|
||||||
// Step 2: Convert the hash to a Base62 string
|
do {
|
||||||
const base62Chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
|
getRandomValues(random);
|
||||||
const hashArray = new Uint8Array(hashBuffer)
|
} while (random.some(x => x >= cutoff));
|
||||||
let num = BigInt(0)
|
let id = "";
|
||||||
|
for (let i = 0; i < length; i++) id += chars[random[i] % chars.length];
|
||||||
// Convert hash buffer to a BigInt
|
return id;
|
||||||
for (let byte of hashArray) {
|
|
||||||
num = (num << BigInt(8)) | BigInt(byte)
|
|
||||||
}
|
|
||||||
|
|
||||||
let base62Id = '';
|
|
||||||
while (num > 0) {
|
|
||||||
const remainder = num % BigInt(62)
|
|
||||||
base62Id = base62Chars[Number(remainder)] + base62Id
|
|
||||||
num = num / BigInt(62)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 3: Return the first 16 characters
|
|
||||||
return base62Id.slice(-length)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const convert = function (from, to, ofType, overwrite = true) {
|
const convert = function (from, to, ofType) {
|
||||||
|
|
||||||
const SOURCE = from;
|
const SOURCE = from;
|
||||||
const DEST = to;
|
const DEST = to;
|
||||||
const TYPE = ofType;
|
const TYPE = ofType;
|
||||||
|
|
||||||
if (overwrite) {
|
try {
|
||||||
try {
|
rmdirSync(DEST, {force: true, recursive: true})
|
||||||
rmdirSync(DEST, {force: true, recursive: true})
|
} catch (e) {
|
||||||
} catch (e) {
|
|
||||||
}
|
|
||||||
mkdirSync(DEST)
|
|
||||||
}
|
}
|
||||||
|
mkdirSync(DEST)
|
||||||
|
|
||||||
let promises = []
|
readdirSync(SOURCE).forEach(file => {
|
||||||
|
console.log(file)
|
||||||
|
let originalSource = JSON.parse(readFileSync(join(SOURCE, file), {encoding: "utf8"}));
|
||||||
|
let id = randomID();
|
||||||
|
|
||||||
const filewalker = async (source) => {
|
let targetSource = {
|
||||||
console.debug("entering directory", source)
|
_id: id,
|
||||||
for (let file of readdirSync(source)) {
|
_key: "!items!" + id,
|
||||||
if (statSync(join(source, file)).isDirectory()) {
|
type: TYPE,
|
||||||
await filewalker(join(source, file))
|
img: originalSource.image,
|
||||||
} else {
|
name: originalSource.name.trim(),
|
||||||
if (file.endsWith(".json")) {
|
system: {...originalSource},
|
||||||
console.debug("processing file", join(source, file))
|
|
||||||
let originalSource = JSON.parse(readFileSync(join(source, file), {encoding: "utf8"}))
|
|
||||||
promises.push(new Promise((resolve2) => {
|
|
||||||
randomID("DSA_4-1" + TYPE + originalSource.name.trim()).then(id => {
|
|
||||||
let targetSource = {
|
|
||||||
_id: id,
|
|
||||||
_key: "!items!" + id,
|
|
||||||
type: TYPE,
|
|
||||||
img: originalSource.image,
|
|
||||||
name: originalSource.name.trim(),
|
|
||||||
system: {...originalSource},
|
|
||||||
}
|
|
||||||
delete targetSource.system.image;
|
|
||||||
let target = JSON.stringify(targetSource, null, 2)
|
|
||||||
let newFileName = "./" + join(DEST, id + ".json")
|
|
||||||
if (!existsSync(join("./", DEST))) {
|
|
||||||
mkdirSync(join("./", DEST))
|
|
||||||
}
|
|
||||||
writeFileSync(newFileName, target, {encoding: "utf8"})
|
|
||||||
resolve2()
|
|
||||||
})
|
|
||||||
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
delete targetSource.system.image;
|
||||||
|
let target = JSON.stringify(targetSource, null, 2);
|
||||||
|
let newFileName = "./" + join(DEST, id + ".json");
|
||||||
|
writeFileSync(newFileName, target, {encoding: "utf8"});
|
||||||
|
});
|
||||||
|
|
||||||
filewalker(SOURCE)
|
|
||||||
|
|
||||||
return Promise.allSettled(promises)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function cleanDist() {
|
function cleanDist() {
|
||||||
return deleteAsync(['dist/**'])
|
return deleteAsync(['dist/**']);
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildStyles() {
|
function buildStyles() {
|
||||||
|
|
@ -123,60 +84,38 @@ function copyAssets() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateManifestFile() {
|
function updateManifestFile() {
|
||||||
return src('src/system.json')
|
return src('dist/system.json')
|
||||||
.pipe(
|
.pipe(replace('{{VERSION}}', process.env.VERSION))
|
||||||
jsonModify({
|
.pipe(dest('dist/'))
|
||||||
key: "version",
|
|
||||||
value: process.env.VERSION
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.pipe(
|
|
||||||
jsonModify({
|
|
||||||
key: "download",
|
|
||||||
value: "https://git.macniel.online/macniel/foundry-dsa41-game/releases/download/{{VERSION}}/release.zip".replace("{{VERSION}}", process.env.VERSION)
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.pipe(dest('src/'))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gulp.task('prepareDB', async function (done) {
|
async function prepareDB() {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!existsSync("./src/packs/__source")) {
|
if (!existsSync("./src/packs/__source")) {
|
||||||
mkdirSync("./src/packs/__source");
|
mkdirSync("./src/packs/__source");
|
||||||
}
|
}
|
||||||
|
|
||||||
await convert("./src/packs/_source/talente", "./src/packs/__source/talente", "Skill")
|
convert("./src/packs/_source/talente", "./src/packs/__source/talente", "Skill");
|
||||||
await convert("./src/packs/_source/zauber-brw", "./src/packs/__source/zauber", "Spell")
|
convert("./src/packs/_source/zauber", "./src/packs/__source/zauber", "Spell");
|
||||||
await convert("./src/packs/_source/vorteile", "./src/packs/__source/vorteile", "Advantage")
|
convert("./src/packs/_source/vorteile", "./src/packs/__source/vorteile", "Advantage");
|
||||||
await convert("./src/packs/_source/nachteile", "./src/packs/__source/vorteile", "Advantage", false)
|
convert("./src/packs/_source/waffen", "./src/packs/__source/waffen", "Equipment");
|
||||||
await convert("./src/packs/_source/sonderfertigkeiten", "./src/packs/__source/sonderfertigkeiten", "SpecialAbility")
|
convert("./src/packs/_source/munition", "./src/packs/__source/munition", "Equipment");
|
||||||
await convert("./src/packs/_source/waehrungen", "./src/packs/__source/waehrungen", "Equipment")
|
convert("./src/packs/_source/ruestzeug", "./src/packs/__source/ruestzeug", "Equipment");
|
||||||
await convert("./src/packs/_source/Gegenstaende/Waffen", "./src/packs/__source/waffen", "Equipment")
|
convert("./src/packs/_source/liturgien-und-segnungen", "./src/packs/__source/liturgien", "Liturgy");
|
||||||
await convert("./src/packs/_source/Gegenstaende/Munition", "./src/packs/__source/munition", "Equipment")
|
convert("./src/packs/_source/wunden", "./src/packs/__source/wunden", "ActiveEffect");
|
||||||
await convert("./src/packs/_source/Gegenstaende/Ruestzeug", "./src/packs/__source/ruestzeug", "Equipment")
|
|
||||||
await convert("./src/packs/_source/Gegenstaende/Behaelter", "./src/packs/__source/gegenstaende", "Equipment", false)
|
convert("./src/packs/_source/kulturen", "./src/packs/__source/kulturen", "Culture");
|
||||||
await convert("./src/packs/_source/Gegenstaende/Bekleidung", "./src/packs/__source/gegenstaende", "Equipment", false)
|
convert("./src/packs/_source/spezien", "./src/packs/__source/spezien", "Species");
|
||||||
await convert("./src/packs/_source/Gegenstaende/Beleuchtung", "./src/packs/__source/gegenstaende", "Equipment", false)
|
convert("./src/packs/_source/professionen", "./src/packs/__source/professionen", "Profession");
|
||||||
await convert("./src/packs/_source/Gegenstaende/Buecher", "./src/packs/__source/gegenstaende", "Equipment", false)
|
|
||||||
await convert("./src/packs/_source/Gegenstaende/Essutensilien", "./src/packs/__source/gegenstaende", "Equipment", false)
|
|
||||||
await convert("./src/packs/_source/Gegenstaende/Sonstiges", "./src/packs/__source/gegenstaende", "Equipment", false)
|
|
||||||
await convert("./src/packs/_source/Gegenstaende/Werkzeug", "./src/packs/__source/gegenstaende", "Equipment", false)
|
|
||||||
await convert("./src/packs/_source/Gegenstaende/Seile", "./src/packs/__source/gegenstaende", "Equipment", false)
|
|
||||||
await convert("./src/packs/_source/liturgien-und-segnungen", "./src/packs/__source/liturgien", "Liturgy")
|
|
||||||
await convert("./src/packs/_source/wunden", "./src/packs/__source/wunden", "ActiveEffect")
|
|
||||||
|
|
||||||
await convert("./src/packs/_source/kulturen", "./src/packs/__source/kulturen", "Culture")
|
|
||||||
await convert("./src/packs/_source/spezien", "./src/packs/__source/spezien", "Species")
|
|
||||||
await convert("./src/packs/_source/professionen", "./src/packs/__source/professionen", "Profession")
|
|
||||||
done()
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err)
|
console.error(err);
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
gulp.task('buildDB', function (done) {
|
function buildDB() {
|
||||||
// Determine which source folders to process
|
// Determine which source folders to process
|
||||||
|
|
||||||
const PACK_SRC = "src/packs/__source"
|
const PACK_SRC = "src/packs/__source"
|
||||||
|
|
@ -188,24 +127,23 @@ gulp.task('buildDB', function (done) {
|
||||||
);
|
);
|
||||||
|
|
||||||
for (const folder of folders) {
|
for (const folder of folders) {
|
||||||
const src = join(PACK_SRC, folder.name)
|
const src = join(PACK_SRC, folder.name);
|
||||||
const dest = join(PACK_DEST, folder.name)
|
const dest = join(PACK_DEST, folder.name);
|
||||||
console.info(`Compiling pack ${folder.name}`)
|
console.info(`Compiling pack ${folder.name}`);
|
||||||
await compilePack(src, dest, {recursive: true, nedb: false})
|
await compilePack(src, dest, {recursive: true, nedb: false});
|
||||||
|
|
||||||
}
|
}
|
||||||
resolve()
|
resolve()
|
||||||
done()
|
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
|
|
||||||
|
|
||||||
export default series(
|
export default series(
|
||||||
cleanDist,
|
cleanDist,
|
||||||
updateManifestFile,
|
|
||||||
copySource,
|
copySource,
|
||||||
copyAssets,
|
copyAssets,
|
||||||
buildStyles,
|
buildStyles,
|
||||||
gulp.task('prepareDB'),
|
prepareDB,
|
||||||
gulp.task('buildDB')
|
buildDB,
|
||||||
|
updateManifestFile
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ const DEST = "/home/macniel/.local/share/FoundryVTT/Data/systems/DSA_4-1"
|
||||||
|
|
||||||
if (existsSync(SRC)) {
|
if (existsSync(SRC)) {
|
||||||
cpSync(SRC, resolve(DEST), {recursive: true})
|
cpSync(SRC, resolve(DEST), {recursive: true})
|
||||||
console.debug(`copied ${SRC} to ${DEST}`)
|
console.log(`copied ${SRC} to ${DEST}`)
|
||||||
} else {
|
} else {
|
||||||
console.error(`Source ${SRC} does not exists. Forgot to compile?`)
|
console.error(`Source ${SRC} does not exists. Forgot to compile?`)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,10 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "true",
|
"test": "true",
|
||||||
"build": "gulp",
|
"build": "gulp",
|
||||||
"localBuild": "VERSION=0.0.1 gulp",
|
|
||||||
"installToFoundry": "node installToFoundry.mjs"
|
"installToFoundry": "node installToFoundry.mjs"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@foundryvtt/foundryvtt-cli": "^3.0.2",
|
"@foundryvtt/foundryvtt-cli": "^3.0.0",
|
||||||
"cb": "^0.1.1",
|
"cb": "^0.1.1",
|
||||||
"del": "^8.0.1",
|
"del": "^8.0.1",
|
||||||
"fvtt-types": "npm:@league-of-foundry-developers/foundry-vtt-types@^13.346.0-beta.20250812191140",
|
"fvtt-types": "npm:@league-of-foundry-developers/foundry-vtt-types@^13.346.0-beta.20250812191140",
|
||||||
|
|
@ -27,7 +26,6 @@
|
||||||
"sass-build": "^1.1.6"
|
"sass-build": "^1.1.6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"gulp-cli": "^3.1.0",
|
"gulp-cli": "^3.1.0"
|
||||||
"gulp-json-modify": "^1.0.2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 3.4 MiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1019 B |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1010 B |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 770 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1002 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 731 B |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |