Compare commits

..

No commits in common. "main" and "1.3.1" have entirely different histories.
main ... 1.3.1

23 changed files with 3725 additions and 3583 deletions

View file

@ -4,7 +4,7 @@
name: Bug Report name: Bug Report
about: File a bug report about: File a bug report
labels: ['bug', 'to be confirmed'] labels: ["bug", "to be confirmed"]
body: body:
- type: markdown - type: markdown
attributes: attributes:

View file

@ -4,7 +4,7 @@
name: Feature Request name: Feature Request
description: Submit a feature request description: Submit a feature request
labels: ['feature'] labels: ["feature"]
body: body:
- type: markdown - type: markdown
attributes: attributes:

View file

@ -4,5 +4,5 @@
"**/.pnp.*": true "**/.pnp.*": true
}, },
"eslint.nodePath": ".yarn/sdks", "eslint.nodePath": ".yarn/sdks",
"prettier.prettierPath": ".yarn/sdks/prettier/index.js" "prettier.prettierPath": ".yarn/sdks/prettier/index.js",
} }

View file

@ -77,15 +77,15 @@ steps:
- forge_token - forge_token
publish-to-foundry-admin: publish-to-foundry-admin:
group: publish group: publish
image: johannesloher/foundry-publish:v2.4.1 image: johannesloher/foundry-publish
environment: environment:
FVTT_DELETE_OBSOLETE_VERSIONS: 'true' FVTT_DELETE_OBSOLETE_VERSIONS: 'true'
FVTT_USE_NEW_PACKAGE_ADMINISTRATION_INTERFACE: 'true'
commands: commands:
- export FVTT_MANIFEST_PATH=${CI_REPO_NAME}/module.json - export FVTT_MANIFEST_PATH=${CI_REPO_NAME}/module.json
- export FVTT_MANIFEST_URL=${CI_REPO_URL}/releases/download/${CI_COMMIT_TAG}/module.json - export FVTT_MANIFEST_URL=${CI_REPO_URL}/releases/download/${CI_COMMIT_TAG}/module.json
- foundry-publish - foundry-publish
secrets: secrets:
- fvtt_package_id
- fvtt_username - fvtt_username
- fvtt_password - fvtt_password
when: when:

View file

@ -30,7 +30,6 @@ steps:
- git config user.email woodpecker[bot]@${CI_SYSTEM_HOST} - git config user.email woodpecker[bot]@${CI_SYSTEM_HOST}
- yarn bump-version --release=${RELEASE_TYPE} - yarn bump-version --release=${RELEASE_TYPE}
- export RELEASE_VERSION=$(jq -r '.version' < package.json) - export RELEASE_VERSION=$(jq -r '.version' < package.json)
- yarn prettier --write package.json module.json
- git --no-pager diff - git --no-pager diff
- git add package.json module.json - git add package.json module.json
- 'git commit -m "chore(release): $${RELEASE_VERSION}"' - 'git commit -m "chore(release): $${RELEASE_VERSION}"'

File diff suppressed because one or more lines are too long

874
.yarn/releases/yarn-3.6.0.cjs vendored Executable file

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

View file

@ -1,14 +1,6 @@
{ {
"name": "eslint", "name": "eslint",
"version": "8.52.0-sdk", "version": "8.28.0-sdk",
"main": "./lib/api.js", "main": "./lib/api.js",
"type": "commonjs", "type": "commonjs"
"bin": {
"eslint": "./bin/eslint.js"
},
"exports": {
"./package.json": "./package.json",
".": "./lib/api.js",
"./use-at-your-own-risk": "./lib/unsupported-api.js"
}
} }

View file

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

6
.yarn/sdks/prettier/index.js vendored Normal file → Executable file
View file

@ -11,10 +11,10 @@ const absRequire = createRequire(absPnpApiPath);
if (existsSync(absPnpApiPath)) { if (existsSync(absPnpApiPath)) {
if (!process.versions.pnp) { if (!process.versions.pnp) {
// Setup the environment to be able to require prettier // Setup the environment to be able to require prettier/index.js
require(absPnpApiPath).setup(); require(absPnpApiPath).setup();
} }
} }
// Defer to the real prettier your application uses // Defer to the real prettier/index.js your application uses
module.exports = absRequire(`prettier`); module.exports = absRequire(`prettier/index.js`);

View file

@ -1,7 +1,6 @@
{ {
"name": "prettier", "name": "prettier",
"version": "2.8.8-sdk", "version": "2.8.0-sdk",
"main": "./index.js", "main": "./index.js",
"type": "commonjs", "type": "commonjs"
"bin": "./bin-prettier.js"
} }

View file

@ -1,5 +1,7 @@
nodeLinker: pnp nodeLinker: pnp
yarnPath: .yarn/releases/yarn-4.6.0.cjs plugins:
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: '@yarnpkg/plugin-interactive-tools'
enableGlobalCache: false yarnPath: .yarn/releases/yarn-3.6.0.cjs

View file

@ -10,7 +10,7 @@ SPDX-License-Identifier: MIT
[![status-badge](https://ci.f3l.de/api/badges/10/status.svg)](https://ci.f3l.de/repos/10) [![status-badge](https://ci.f3l.de/api/badges/10/status.svg)](https://ci.f3l.de/repos/10)
[![REUSE status](https://api.reuse.software/badge/git.f3l.de/dungeonslayers/tickwerk)](https://api.reuse.software/info/git.f3l.de/dungeonslayers/tickwerk) [![REUSE status](https://api.reuse.software/badge/git.f3l.de/dungeonslayers/tickwerk)](https://api.reuse.software/info/git.f3l.de/dungeonslayers/tickwerk)
[![Forge installs](https://img.shields.io/badge/dynamic/json?label=Forge%20Installs&query=package.installs&suffix=%25&url=https%3A%2F%2Fforge-vtt.com%2Fapi%2Fbazaar%2Fpackage%2Ftickwerk&colorB=4aa94a)](https://forge-vtt.com/bazaar#package=tickwerk) [![Forge installs](https://img.shields.io/badge/dynamic/json?label=Forge%20Installs&query=package.installs&suffix=%25&url=https%3A%2F%2Fforge-vtt.com%2Fapi%2Fbazaar%2Fpackage%2Ftickwerk&colorB=4aa94a)](https://forge-vtt.com/bazaar#package=tickwerk)
[![Supported foundry versions](https://img.shields.io/endpoint?url=https://foundryshields.com/version?url=https://git.f3l.de/api/packages/dungeonslayers/generic/tickwerk/latest/module.json)](https://git.f3l.de/dungeonslayers/tickwerk) [![Supported foundry versions](https://img.shields.io/endpoint?url=https://foundryshields.com/version?url=https%3A%2F%2Fgit.f3l.de%2Fapi%2Fpackages%2Fdungeonslayers%2Fgeneric%2Ftickwerk%2Flatest%module.json)](https://git.f3l.de/dungeonslayers/tickwerk)
[![Ko-fi](https://img.shields.io/badge/Ko--fi-ghostfvtt-00B9FE?logo=kofi)](https://ko-fi.com/ghostfvtt) [![Ko-fi](https://img.shields.io/badge/Ko--fi-ghostfvtt-00B9FE?logo=kofi)](https://ko-fi.com/ghostfvtt)
A tick based combat system for [Foundry Virtual Tabletop]. A tick based combat system for [Foundry Virtual Tabletop].

View file

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

View file

@ -10,23 +10,22 @@
"ko-fi": "ghostfvtt" "ko-fi": "ghostfvtt"
} }
], ],
"license": "https://git.f3l.de/dungeonslayers/tickwerk/raw/tag/1.4.4/LICENSE.md", "url": "https://git.f3l.de/dungeonslayers/Tickwerk",
"readme": "https://git.f3l.de/dungeonslayers/tickwerk/raw/tag/1.4.4/README.md", "license": "https://git.f3l.de/dungeonslayers/Tickwerk/raw/tag/1.3.1/LICENSE.md",
"bugs": "https://git.f3l.de/dungeonslayers/tickwerk/issues", "readme": "https://git.f3l.de/dungeonslayers/Tickwerk/raw/tag/1.3.1/README.md",
"changelog": "https://git.f3l.de/dungeonslayers/tickwerk/releases/tag/1.4.4", "bugs": "https://git.f3l.de/dungeonslayers/Tickwerk/issues",
"version": "1.4.4", "changelog": "https://git.f3l.de/dungeonslayers/Tickwerk/releases/tag/1.3.1",
"flags": { "version": "1.3.1",
"hotReload": {
"extensions": ["css", "hbs", "json"],
"paths": ["templates", "styles", "lang"]
}
},
"compatibility": { "compatibility": {
"minimum": "10.290", "minimum": "10.290",
"verified": "11" "verified": "10"
}, },
"esmodules": ["tickwerk.js"], "esmodules": [
"styles": ["styles/tickwerk.css"], "tickwerk.js"
],
"styles": [
"styles/tickwerk.css"
],
"languages": [ "languages": [
{ {
"lang": "en", "lang": "en",
@ -39,8 +38,7 @@
"path": "lang/de.json" "path": "lang/de.json"
} }
], ],
"manifest": "https://git.f3l.de/api/packages/dungeonslayers/generic/tickwerk/latest/module.json", "manifest": "https://git.f3l.de/api/packages/dungeonslayers/generic/Tickwerk/latest/module.json",
"download": "https://git.f3l.de/dungeonslayers/tickwerk/releases/download/1.4.4/tickwerk.zip", "download": "https://git.f3l.de/dungeonslayers/Tickwerk/releases/download/1.3.1/Tickwerk.zip",
"manifestPlusVersion": "1.2.0", "manifestPlusVersion": "1.2.0"
"url": "https://git.f3l.de/dungeonslayers/tickwerk"
} }

View file

@ -2,7 +2,7 @@
"private": true, "private": true,
"name": "tickwerk", "name": "tickwerk",
"description": "A tick based combat system for Foundry Virtual Tabletop", "description": "A tick based combat system for Foundry Virtual Tabletop",
"version": "1.4.4", "version": "1.3.1",
"license": "https://git.f3l.de/dungeonslayers/tickwerk#licensing", "license": "https://git.f3l.de/dungeonslayers/tickwerk#licensing",
"homepage": "https://git.f3l.de/dungeonslayers/tickwerk", "homepage": "https://git.f3l.de/dungeonslayers/tickwerk",
"repository": { "repository": {
@ -29,30 +29,30 @@
"clean:link": "node ./tools/link-package.js --clean", "clean:link": "node ./tools/link-package.js --clean",
"lint": "eslint --ext .js,.cjs,.mjs .", "lint": "eslint --ext .js,.cjs,.mjs .",
"lint:fix": "eslint --ext .js,.cjs,.mjs --fix .", "lint:fix": "eslint --ext .js,.cjs,.mjs --fix .",
"format": "prettier --write \"./**/*.(js|cjs|mjs|json|scss|yml|yaml)\"", "format": "prettier --write \"./**/*.(js|cjs|mjs|json|scss|yml)\"",
"bump-version": "node ./tools/bump-version.js", "bump-version": "node ./tools/bump-version.js",
"changelog": "conventional-changelog -p conventionalcommits -o CHANGELOG.md -r 2" "changelog": "conventional-changelog -p conventionalcommits -o CHANGELOG.md -r 2"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "19.7.1", "@commitlint/cli": "17.6.5",
"@commitlint/config-conventional": "19.7.1", "@commitlint/config-conventional": "17.6.5",
"@guanghechen/rollup-plugin-copy": "6.0.4", "@guanghechen/rollup-plugin-copy": "5.0.1",
"@swc/core": "1.10.18", "@swc/core": "1.3.62",
"conventional-changelog-cli": "5.0.0", "conventional-changelog-cli": "2.2.2",
"conventional-changelog-conventionalcommits": "8.0.0", "conventional-changelog-conventionalcommits": "5.0.0",
"eslint": "8.57.1", "eslint": "8.42.0",
"eslint-config-prettier": "10.0.1", "eslint-config-prettier": "8.8.0",
"eslint-plugin-prettier": "4.2.1", "eslint-plugin-prettier": "4.2.1",
"fs-extra": "11.3.0", "fs-extra": "11.1.1",
"npm-run-all": "4.1.5", "npm-run-all": "4.1.5",
"prettier": "2.8.8", "prettier": "2.8.8",
"rimraf": "6.0.1", "rimraf": "5.0.1",
"rollup": "4.34.8", "rollup": "3.23.0",
"rollup-plugin-styles": "4.0.0", "rollup-plugin-styles": "4.0.0",
"rollup-plugin-swc3": "0.12.1", "rollup-plugin-swc3": "0.8.2",
"sass": "1.62.1", "sass": "1.62.1",
"semver": "7.7.1", "semver": "7.5.1",
"yargs": "17.7.2" "yargs": "17.7.2"
}, },
"packageManager": "yarn@4.6.0" "packageManager": "yarn@3.6.0"
} }

View file

@ -42,7 +42,7 @@ const CombatantMixin = (BaseCombatant) => {
*/ */
toggleWaiting() { toggleWaiting() {
const update = { [`flags.${packageId}.waiting`]: !this.waiting }; const update = { [`flags.${packageId}.waiting`]: !this.waiting };
if (this.parent?.started && this.waiting) update.initiative = this.parent?.tickValue; if (this.parent?.started && this.waiting) update.initiative = this.parent?.round;
return this.update(update); return this.update(update);
} }
@ -66,8 +66,7 @@ const CombatantMixin = (BaseCombatant) => {
} }
await this.update({ initiative: this.initiative + ticks }); await this.update({ initiative: this.initiative + ticks });
const tickTime = CONFIG.tickwerk?.tickTime; const advanceTime = ticks * CONFIG.time.roundTime;
const advanceTime = tickTime !== undefined ? ticks * tickTime : undefined;
if (advanceTime !== 0) { if (advanceTime !== 0) {
await this.combat?.update(undefined, { diff: false, advanceTime }); await this.combat?.update(undefined, { diff: false, advanceTime });
} }
@ -112,16 +111,14 @@ const CombatantMixin = (BaseCombatant) => {
* @param {object} data The data of the creation / update * @param {object} data The data of the creation / update
*/ */
async #updateTiebreakerData(data) { async #updateTiebreakerData(data) {
const waiting = data.flags?.[packageId]?.waiting; if ('initiative' in data) {
if ('initiative' in data || waiting !== undefined) {
const newInitiative = data.initiative ?? this.initiative;
const combatantsWithSameTickValue = const combatantsWithSameTickValue =
this.parent?.combatants.filter((combatant) => { this.parent?.combatants.filter((combatant) => {
const otherInitiative = const otherInitiative =
combatant._newInitiative !== undefined ? combatant._newInitiative : combatant.initiative; combatant._newInitiative !== undefined ? combatant._newInitiative : combatant.initiative;
return otherInitiative === newInitiative && combatant !== this; return otherInitiative === data.initiative;
}) ?? []; }) ?? [];
const tiebreaker = await this.#getTiebreaker(combatantsWithSameTickValue, waiting); const tiebreaker = await this.#getTiebreaker(combatantsWithSameTickValue);
foundry.utils.setProperty(data, `flags.${packageId}.tiebreaker`, tiebreaker); foundry.utils.setProperty(data, `flags.${packageId}.tiebreaker`, tiebreaker);
this._newInitiative = data.initiative; this._newInitiative = data.initiative;
this._newTiebreaker = tiebreaker; this._newTiebreaker = tiebreaker;
@ -131,12 +128,11 @@ const CombatantMixin = (BaseCombatant) => {
/** /**
* Get a tiebreaker between this combatant and the given other combatants. * Get a tiebreaker between this combatant and the given other combatants.
* @param {TickwerkCombatant[]} combatants The other combatants among which to find a tiebreaker * @param {TickwerkCombatant[]} combatants The other combatants among which to find a tiebreaker
* @param {boolean | undefined} waiting The change of the waiting state of the combatanmt
* @returns {Promise<number>} A promise that resolves to the tiebreaker * @returns {Promise<number>} A promise that resolves to the tiebreaker
*/ */
async #getTiebreaker(combatants, waiting) { async #getTiebreaker(combatants) {
const getTiebreaker = CONFIG.tickwerk?.getTiebreaker ?? defaultGetTiebreaker; const getTiebreaker = CONFIG.tickwerk?.getTiebreaker ?? defaultGetTiebreaker;
return getTiebreaker(this, combatants, waiting); return getTiebreaker(this, combatants);
} }
/** @override */ /** @override */
@ -182,14 +178,14 @@ const CombatantMixin = (BaseCombatant) => {
/** /**
* A function to get a tiebreaker for a combatant * A function to get a tiebreaker for a combatant
* @typedef {(combatant: TickwerkCombatant, combatants: TickwerkCombatant[], waiting: boolean | undefined) => Promise<number>} GetTiebreaker * @typedef {(combatant: TickwerkCombatant, combatants: TickwerkCombatant[]) => Promise<number>} GetTiebreaker
*/ */
/** /**
* Default implementation to get a tiebreaker for a combatant. * Default implementation to get a tiebreaker for a combatant.
* @type {GetTiebreaker} * @type {GetTiebreaker}
*/ */
export const defaultGetTiebreaker = async (combatant, combatants) => { const defaultGetTiebreaker = async (combatant, combatants) => {
if (combatants.length === 0) return 0; if (combatants.length === 0) return 0;
const tiebreakers = combatants.map((combatant) => { const tiebreakers = combatants.map((combatant) => {
return ( return (

View file

@ -7,14 +7,14 @@ import { getGame } from '../helpers';
export const registerDS4SpecificFunctionality = () => { export const registerDS4SpecificFunctionality = () => {
if (CONFIG.tickwerk === undefined) CONFIG.tickwerk = {}; if (CONFIG.tickwerk === undefined) CONFIG.tickwerk = {};
foundry.utils.mergeObject(CONFIG.tickwerk, { getTiebreaker, getInitiativeFormula, tickTime: 0.5 }); foundry.utils.mergeObject(CONFIG.tickwerk, { getTiebreaker, getInitiativeFormula });
registerRollItemSetting(); registerRollItemSetting();
Hooks.on('ds4.rollItem', onRollItem); Hooks.on('ds4.rollItem', onRollItem);
}; };
/** @type {import("../data/documents/combatant").GetTiebreaker} */ /** @type {import("../data/documents/combatant").GetTiebreaker} */
const getTiebreaker = async (combatant, combatants, waiting) => { const getTiebreaker = async (combatant, combatants) => {
if (combatants.length === 0) return 0; if (combatants.length === 0) return 0;
/** @type {number[]} */ /** @type {number[]} */
@ -26,7 +26,7 @@ const getTiebreaker = async (combatant, combatants, waiting) => {
for (const other of combatants) { for (const other of combatants) {
const tiebreaker = other._newTiebreaker ?? other.getFlag(packageId, 'tiebreaker') ?? 0; const tiebreaker = other._newTiebreaker ?? other.getFlag(packageId, 'tiebreaker') ?? 0;
if (getInitiative(other) > getInitiative(combatant) || waiting === false) { if (getInitiative(other) > getInitiative(combatant)) {
lowerBounds.push(tiebreaker); lowerBounds.push(tiebreaker);
} else if (getInitiative(other) < getInitiative(combatant)) { } else if (getInitiative(other) < getInitiative(combatant)) {
upperBounds.push(tiebreaker); upperBounds.push(tiebreaker);
@ -71,7 +71,7 @@ const getTiebreaker = async (combatant, combatants, waiting) => {
const getInitiativeFormula = (combatant) => { const getInitiativeFormula = (combatant) => {
const started = combatant.combat?.started ?? false; const started = combatant.combat?.started ?? false;
if (!started) return '-@combatValues.initiative.total'; if (!started) return '-@combatValues.initiative.total';
const tickValue = combatant.combat?.tickValue ?? 0; const tickValue = combatant.combat?.round ?? 0;
return `max(${tickValue} + 10 - @combatValues.initiative.total, ${tickValue})`; return `max(${tickValue} + 10 - @combatValues.initiative.total, ${tickValue})`;
}; };

View file

@ -10,7 +10,7 @@ import { hideBin } from 'yargs/helpers';
const packageType = 'module'; const packageType = 'module';
const repositoryOwner = process.env.CI_REPO_OWNER; const repositoryOwner = process.env.CI_REPO_OWNER;
const repositoryName = process.env.CI_REPO_NAME; const repositoryName = process.env.CI_REPO_NAME;
const repositoryURL = process.env.CI_REPO_URL; const repositoryURL = process.env.CI_REPO_LINK;
const forgeURL = process.env.CI_FORGE_URL; const forgeURL = process.env.CI_FORGE_URL;
const getManifestUrl = (channel) => const getManifestUrl = (channel) =>
@ -81,7 +81,7 @@ function bumpVersion(release) {
console.log(`Bumping version number to '${targetVersion}'`); console.log(`Bumping version number to '${targetVersion}'`);
packageJson.version = targetVersion; packageJson.version = targetVersion;
fs.writeJSONSync('package.json', packageJson, { spaces: 2 }); fs.writeJSONSync('package.json', packageJson, { spaces: 4 });
manifest.version = targetVersion; manifest.version = targetVersion;
manifest.url = repositoryURL; manifest.url = repositoryURL;
manifest.manifest = getManifestUrl(getChannel(targetVersion)); manifest.manifest = getManifestUrl(getChannel(targetVersion));
@ -90,7 +90,7 @@ function bumpVersion(release) {
manifest.changelog = getChangelogURL(targetVersion); manifest.changelog = getChangelogURL(targetVersion);
manifest.readme = getReadmeURL(targetVersion); manifest.readme = getReadmeURL(targetVersion);
manifest.license = getLicenseURL(targetVersion); manifest.license = getLicenseURL(targetVersion);
fs.writeJSONSync(manifestPath, manifest, { spaces: 2 }); fs.writeJSONSync(manifestPath, manifest, { spaces: 4 });
} }
const argv = yargs(hideBin(process.argv)).usage('Usage: $0').option('release', { const argv = yargs(hideBin(process.argv)).usage('Usage: $0').option('release', {

4764
yarn.lock

File diff suppressed because it is too large Load diff