Merge branch '050-basic-active-effects' into 'master'

Implement basic active effects

Closes #50

See merge request dungeonslayers/ds4!68
This commit is contained in:
Johannes Loher 2021-02-18 14:50:29 +01:00
commit 8cff1b505f
14 changed files with 347 additions and 103 deletions

File diff suppressed because one or more lines are too long

View file

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

View file

@ -44,15 +44,15 @@
"format": "prettier --write 'src/**/*.(ts|json|scss)'" "format": "prettier --write 'src/**/*.(ts|json|scss)'"
}, },
"devDependencies": { "devDependencies": {
"@types/fs-extra": "^9.0.6", "@types/fs-extra": "^9.0.7",
"@types/jest": "^26.0.20", "@types/jest": "^26.0.20",
"@typescript-eslint/eslint-plugin": "^4.14.2", "@typescript-eslint/eslint-plugin": "^4.15.1",
"@typescript-eslint/parser": "^4.14.2", "@typescript-eslint/parser": "^4.15.1",
"chalk": "^4.1.0", "chalk": "^4.1.0",
"eslint": "^7.19.0", "eslint": "^7.20.0",
"eslint-config-prettier": "^7.2.0", "eslint-config-prettier": "^7.2.0",
"eslint-plugin-prettier": "^3.3.1", "eslint-plugin-prettier": "^3.3.1",
"foundry-vtt-types": "github:League-of-Foundry-Developers/foundry-vtt-types#foundry-0.7.9", "foundry-vtt-types": "https://github.com/League-of-Foundry-Developers/foundry-vtt-types.git#commit=884d738b51a6cc4801ee2316eb060aafa0aff642",
"fs-extra": "^9.1.0", "fs-extra": "^9.1.0",
"gulp": "^4.0.2", "gulp": "^4.0.2",
"gulp-sass": "^4.1.0", "gulp-sass": "^4.1.0",
@ -63,9 +63,9 @@
"json-stringify-pretty-compact": "^2.0.0", "json-stringify-pretty-compact": "^2.0.0",
"lint-staged": "^10.5.4", "lint-staged": "^10.5.4",
"prettier": "^2.2.1", "prettier": "^2.2.1",
"sass": "^1.32.6", "sass": "^1.32.7",
"ts-jest": "^26.5.1", "ts-jest": "^26.5.1",
"typescript": "^4.1.3", "typescript": "^4.1.5",
"yargs": "^16.2.0" "yargs": "^16.2.0"
}, },
"husky": { "husky": {

View file

@ -211,5 +211,8 @@
"DS4.ChatVisibilityRoll": "Alle", "DS4.ChatVisibilityRoll": "Alle",
"DS4.ChatVisibilityGmRoll": "Selbst & SL", "DS4.ChatVisibilityGmRoll": "Selbst & SL",
"DS4.ChatVisibilityBlindRoll": "Nur SL", "DS4.ChatVisibilityBlindRoll": "Nur SL",
"DS4.ChatVisibilitySelfRoll": "Nur selbst" "DS4.ChatVisibilitySelfRoll": "Nur selbst",
"DS4.TooltipBaseValue": "Basiswert",
"DS4.TooltipModifier": "Modifikator",
"DS4.TooltipEffects": "Effekte"
} }

View file

@ -211,5 +211,8 @@
"DS4.ChatVisibilityRoll": "All", "DS4.ChatVisibilityRoll": "All",
"DS4.ChatVisibilityGmRoll": "Self & GM", "DS4.ChatVisibilityGmRoll": "Self & GM",
"DS4.ChatVisibilityBlindRoll": "GM only", "DS4.ChatVisibilityBlindRoll": "GM only",
"DS4.ChatVisibilitySelfRoll": "Self only" "DS4.ChatVisibilitySelfRoll": "Self only",
"DS4.TooltipBaseValue": "Base Value",
"DS4.TooltipModifier": "Modifier",
"DS4.TooltipEffects": "Effects"
} }

View file

@ -1,4 +1,5 @@
import { ModifiableData } from "../common/common-data"; import { ModifiableData } from "../common/common-data";
import { DS4 } from "../config";
import { DS4Item } from "../item/item"; import { DS4Item } from "../item/item";
import { ItemType } from "../item/item-data"; import { ItemType } from "../item/item-data";
import { DS4ActorData } from "./actor-data"; import { DS4ActorData } from "./actor-data";
@ -8,8 +9,22 @@ import { DS4ActorData } from "./actor-data";
*/ */
export class DS4Actor extends Actor<DS4ActorData, DS4Item> { export class DS4Actor extends Actor<DS4ActorData, DS4Item> {
/** @override */ /** @override */
prepareDerivedData(): void { prepareData(): void {
this.data = duplicate(this._data) as DS4ActorData;
if (!this.data.img) this.data.img = CONST.DEFAULT_TOKEN;
if (!this.data.name) this.data.name = "New " + this.entity;
this.prepareBaseData();
this.prepareEmbeddedEntities();
this.applyActiveEffectsToBaseData();
this.prepareDerivedData();
this.applyActiveEffectsToDerivedData();
this.prepareFinalDerivedData();
}
/** @override */
prepareBaseData(): void {
const data = this.data; const data = this.data;
const attributes = data.data.attributes; const attributes = data.data.attributes;
Object.values(attributes).forEach( Object.values(attributes).forEach(
(attribute: ModifiableData<number>) => (attribute.total = attribute.base + attribute.mod), (attribute: ModifiableData<number>) => (attribute.total = attribute.base + attribute.mod),
@ -17,10 +32,98 @@ export class DS4Actor extends Actor<DS4ActorData, DS4Item> {
const traits = data.data.traits; const traits = data.data.traits;
Object.values(traits).forEach((trait: ModifiableData<number>) => (trait.total = trait.base + trait.mod)); Object.values(traits).forEach((trait: ModifiableData<number>) => (trait.total = trait.base + trait.mod));
}
applyActiveEffectsToBaseData(): void {
// reset overrides because our variant of applying active effects does not set them, it only adds overrides
this.overrides = {};
this.applyActiveEffectsFiltered(
(change) =>
!this.derivedDataProperties.includes(change.key) &&
!this.finalDerivedDataProperties.includes(change.key),
);
}
applyActiveEffectsToDerivedData(): void {
this.applyActiveEffectsFiltered((change) => this.derivedDataProperties.includes(change.key));
}
/**
* Apply ActiveEffectChanges to the Actor data which are caused by ActiveEffects and satisfy the given predicate.
*
* @param predicate - The predicate that ActiveEffectChanges need to satisfy in order to be applied
*/
applyActiveEffectsFiltered(predicate: (change: ActiveEffectChange) => boolean): void {
const overrides: Record<string, unknown> = {};
// Organize non-disabled effects by their application priority
const changes = this.effects.reduce(
(changes: Array<ActiveEffectChange & { effect: ActiveEffect<DS4Actor> }>, e) => {
if (e.data.disabled) return changes;
const item = this._getOriginatingItemOfActiveEffect(e);
if (item?.isNonEquippedEuipable()) return changes;
const factor = item?.activeEffectFactor ?? 1;
return changes.concat(
e.data.changes.filter(predicate).flatMap((c) => {
const duplicatedChange = duplicate(c) as ActiveEffect.Change;
duplicatedChange.priority = duplicatedChange.priority ?? duplicatedChange.mode * 10;
return Array(factor).fill({
...duplicatedChange,
effect: e,
});
}),
);
},
[],
);
changes.sort((a, b) => a.priority - b.priority);
// Apply all changes
for (const change of changes) {
const result = change.effect.apply(this, change);
if (result !== null) overrides[change.key] = result;
}
// Expand the set of final overrides
this.overrides = expandObject({ ...flattenObject(this.overrides), ...overrides });
}
protected _getOriginatingItemOfActiveEffect(effect: ActiveEffect<DS4Actor>): DS4Item | undefined {
return this.items.find((item) => item.uuid === effect.data.origin) ?? undefined;
}
/**
* Apply transformations to the Actor data after effects have been applied to the base data.
* @override
*/
prepareDerivedData(): void {
this._prepareCombatValues(); this._prepareCombatValues();
} }
/**
* The list of properties that are derived from others, given in dot notation.
*/
get derivedDataProperties(): Array<string> {
return Object.keys(DS4.i18n.combatValues).map((combatValue) => `data.combatValues.${combatValue}.total`);
}
/**
* Apply final transformations to the Actor data after all effects have been applied.
*/
prepareFinalDerivedData(): void {
this.data.data.combatValues.hitPoints.max = this.data.data.combatValues.hitPoints.total;
}
/**
* The list of properties that are completely derived (i.e. {@link ActiveEffect}s cannot be applied to them),
* given in dot notation.
*/
get finalDerivedDataProperties(): string[] {
return ["data.combatValues.hitPoints.max"];
}
/** /**
* The list of item types that can be owned by this actor. * The list of item types that can be owned by this actor.
*/ */
@ -57,12 +160,12 @@ export class DS4Actor extends Actor<DS4ActorData, DS4Item> {
/** /**
* Prepares the combat values of the actor. * Prepares the combat values of the actor.
*/ */
private _prepareCombatValues(): void { protected _prepareCombatValues(): void {
const data = this.data.data; const data = this.data.data;
const armorValueOfEquippedItems = this._calculateArmorValueOfEquippedItems(); const armorValueOfEquippedItems = this._calculateArmorValueOfEquippedItems();
data.combatValues.hitPoints.base = data.combatValues.hitPoints.base =
(data.attributes.body.total ?? 0) + (data.traits.constitution.total ?? 0) + 10; (data.attributes.body.total ?? 0) + (data.traits.constitution.total ?? 0) + 10;
data.combatValues.defense.base = data.combatValues.defense.base =
(data.attributes.body.total ?? 0) + (data.traits.constitution.total ?? 0) + armorValueOfEquippedItems; (data.attributes.body.total ?? 0) + (data.traits.constitution.total ?? 0) + armorValueOfEquippedItems;
data.combatValues.initiative.base = (data.attributes.mobility.total ?? 0) + (data.traits.agility.total ?? 0); data.combatValues.initiative.base = (data.attributes.mobility.total ?? 0) + (data.traits.agility.total ?? 0);
@ -78,14 +181,12 @@ export class DS4Actor extends Actor<DS4ActorData, DS4Item> {
Object.values(data.combatValues).forEach( Object.values(data.combatValues).forEach(
(combatValue: ModifiableData<number>) => (combatValue.total = combatValue.base + combatValue.mod), (combatValue: ModifiableData<number>) => (combatValue.total = combatValue.base + combatValue.mod),
); );
data.combatValues.hitPoints.max = data.combatValues.hitPoints.total;
} }
/** /**
* Calculates the total armor value of all equipped items. * Calculates the total armor value of all equipped items.
*/ */
private _calculateArmorValueOfEquippedItems(): number { protected _calculateArmorValueOfEquippedItems(): number {
return this.items return this.items
.map((item) => { .map((item) => {
if (item.data.type === "armor" || item.data.type === "shield") { if (item.data.type === "armor" || item.data.type === "shield") {

View file

@ -1,3 +1,4 @@
import { ModifiableMaybeData } from "../../common/common-data";
import { DS4 } from "../../config"; import { DS4 } from "../../config";
import { DS4Item } from "../../item/item"; import { DS4Item } from "../../item/item";
import { DS4ItemData } from "../../item/item-data"; import { DS4ItemData } from "../../item/item-data";
@ -50,7 +51,7 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Data<DS4Actor>> {
*/ */
async getData(): Promise<ActorSheet.Data<DS4Actor>> { async getData(): Promise<ActorSheet.Data<DS4Actor>> {
const data = { const data = {
...(await super.getData()), ...this._addTooltipsToData(await super.getData()),
// Add the localization config to the data: // Add the localization config to the data:
config: DS4, config: DS4,
// Add the items explicitly sorted by type to the data: // Add the items explicitly sorted by type to the data:
@ -59,6 +60,24 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Data<DS4Actor>> {
return data; return data;
} }
protected _addTooltipsToData(data: ActorSheet.Data<DS4Actor>): ActorSheet.Data<DS4Actor> {
const valueGroups = [data.data.attributes, data.data.traits, data.data.combatValues];
valueGroups.forEach((valueGroup) => {
Object.values(valueGroup).forEach(
(attribute: ModifiableMaybeData<number | null> & { tooltip?: string }) => {
attribute.tooltip = this._getTooltipForValue(attribute);
},
);
});
return data;
}
protected _getTooltipForValue(value: ModifiableMaybeData<number | null>): string {
return `${value.base} (${game.i18n.localize("DS4.TooltipBaseValue")}) + ${value.mod} (${game.i18n.localize(
"DS4.TooltipModifier",
)}) ${game.i18n.localize("DS4.TooltipEffects")} ${value.total}`;
}
/** @override */ /** @override */
activateListeners(html: JQuery): void { activateListeners(html: JQuery): void {
super.activateListeners(html); super.activateListeners(html);
@ -127,7 +146,6 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Data<DS4Actor>> {
*/ */
protected _onItemChange(ev: JQuery.ChangeEvent): void { protected _onItemChange(ev: JQuery.ChangeEvent): void {
ev.preventDefault(); ev.preventDefault();
console.log("Current target:", $(ev.currentTarget).get(0)["name"]);
const el: HTMLFormElement = $(ev.currentTarget).get(0); const el: HTMLFormElement = $(ev.currentTarget).get(0);
const id = $(ev.currentTarget).parents(".item").data("itemId"); const id = $(ev.currentTarget).parents(".item").data("itemId");
const item = duplicate<DS4Item, "lenient">(this.actor.getOwnedItem(id)); const item = duplicate<DS4Item, "lenient">(this.actor.getOwnedItem(id));
@ -224,9 +242,13 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Data<DS4Actor>> {
/** @override */ /** @override */
protected async _onDropItem( protected async _onDropItem(
event: DragEvent, event: DragEvent,
data: { type: "Item" } & (DeepPartial<ActorSheet.OwnedItemData<DS4Actor>> | { pack: string } | { id: string }), data: { type: "Item" } & (
| { data: DeepPartial<ActorSheet.OwnedItemData<DS4Actor>> }
| { pack: string }
| { id: string }
),
): Promise<boolean | undefined | ActorSheet.OwnedItemData<DS4Actor>> { ): Promise<boolean | undefined | ActorSheet.OwnedItemData<DS4Actor>> {
const item = ((await Item.fromDropData(data)) as unknown) as DS4Item; const item = await DS4Item.fromDropData(data);
if (item && !this.actor.canOwnItemType(item.data.type)) { if (item && !this.actor.canOwnItemType(item.data.type)) {
ui.notifications?.warn( ui.notifications?.warn(
game.i18n.format("DS4.WarningActorCannotOwnItem", { game.i18n.format("DS4.WarningActorCannotOwnItem", {

View file

@ -32,8 +32,6 @@ type DS4LanguageData = DS4ItemDataHelper<DS4LanguageDataData, "language">;
type DS4AlphabetData = DS4ItemDataHelper<DS4AlphabetDataData, "alphabet">; type DS4AlphabetData = DS4ItemDataHelper<DS4AlphabetDataData, "alphabet">;
type DS4SpecialCreatureAbilityData = DS4ItemDataHelper<DS4SpecialCreatureAbilityDataData, "specialCreatureAbility">; type DS4SpecialCreatureAbilityData = DS4ItemDataHelper<DS4SpecialCreatureAbilityDataData, "specialCreatureAbility">;
// types
interface DS4WeaponDataData extends DS4ItemDataDataBase, DS4ItemDataDataPhysical, DS4ItemDataDataEquipable { interface DS4WeaponDataData extends DS4ItemDataDataBase, DS4ItemDataDataPhysical, DS4ItemDataDataEquipable {
attackType: "melee" | "ranged" | "meleeRanged"; attackType: "melee" | "ranged" | "meleeRanged";
weaponBonus: number; weaponBonus: number;

View file

@ -49,7 +49,6 @@ export class DS4ItemSheet extends ItemSheet<ItemSheet.Data<DS4Item>> {
actor: this.item.actor, actor: this.item.actor,
isPhysical: isDS4ItemDataTypePhysical(this.item.data.data), isPhysical: isDS4ItemDataTypePhysical(this.item.data.data),
}; };
console.log(data);
return data; return data;
} }

View file

@ -18,4 +18,18 @@ export class DS4Item extends Item<DS4ItemData> {
data.rank.total = data.rank.base + data.rank.mod; data.rank.total = data.rank.base + data.rank.mod;
} }
} }
isNonEquippedEuipable(): boolean {
return "equipped" in this.data.data && !this.data.data.equipped;
}
/**
* The number of times that active effect changes originating from this item should be applied.
*/
get activeEffectFactor(): number | undefined {
if (this.data.type === "talent") {
return this.data.data.rank.total;
}
return 1;
}
} }

View file

@ -18,6 +18,9 @@
grid-column: span 2; grid-column: span 2;
line-height: $default-input-height; line-height: $default-input-height;
} }
.attribute-value-arrow {
padding: 0 5px;
}
} }
} }
.trait { .trait {
@ -41,6 +44,9 @@
grid-column: span 2; grid-column: span 2;
line-height: $default-input-height; line-height: $default-input-height;
} }
.trait-value-arrow {
padding: 0 5px;
}
} }
} }
} }

View file

@ -14,10 +14,13 @@
<div class="attribute flexrow"><label for="data.attributes.body.total" <div class="attribute flexrow"><label for="data.attributes.body.total"
class="attribute-label ">{{attribute-label}}</label> class="attribute-label ">{{attribute-label}}</label>
<div class="attribute-value flex15 grid grid-8col"><input type="number" <div class="attribute-value flex15 grid grid-8col"><input type="number"
name="data.attributes.{{attribute-key}}.base" value='{{attribute-data.base}}' data-dtype="Number" /><span> + name="data.attributes.{{attribute-key}}.base" value='{{attribute-data.base}}' data-dtype="Number"
title="{{attribute-label}} {{localize 'DS4.TooltipBaseValue'}}" /><span> +
</span><input type="number" name="data.attributes.{{attribute-key}}.mod" value='{{attribute-data.mod}}' </span><input type="number" name="data.attributes.{{attribute-key}}.mod" value='{{attribute-data.mod}}'
data-dtype="Number" /><span> = data-dtype="Number" title="{{attribute-label}} {{localize 'DS4.TooltipModifier'}}" /><span
</span><span class="attribute-value-total">{{attribute-data.total}}</span></div> class="attribute-value-arrow">➞</span><span class="attribute-value-total"
title="{{attribute-label}}: {{attribute-data.tooltip}}">{{attribute-data.total}}</span>
</div>
</div> </div>
{{/inline}} {{/inline}}
@ -32,10 +35,11 @@
{{#*inline "trait"}} {{#*inline "trait"}}
<div class="trait flexrow"><label for="data.traits.strength.total" class="trait-label">{{trait-label}}</label> <div class="trait flexrow"><label for="data.traits.strength.total" class="trait-label">{{trait-label}}</label>
<div class="trait-value flex15 grid grid-8col"><input type="number" name="data.traits.{{trait-key}}.base" <div class="trait-value flex15 grid grid-8col"><input type="number" name="data.traits.{{trait-key}}.base"
value='{{trait-data.base}}' data-dtype="Number" /><span> + value='{{trait-data.base}}' data-dtype="Number"
</span><input type="number" name="data.traits.{{trait-key}}.mod" value='{{trait-data.mod}}' title="{{trait-label}} {{localize 'DS4.TooltipBaseValue'}}" /><span> +
data-dtype="Number" /><span> = </span><input type="number" name="data.traits.{{trait-key}}.mod" value='{{trait-data.mod}}' data-dtype="Number"
</span><span class="trait-value-total">{{trait-data.total}}</span></div> title="{{trait-label}} {{localize 'DS4.TooltipModifier'}}" /><span class=" trait-value-arrow">➞</span><span
class="trait-value-total" title="{{trait-label}}: {{trait-data.tooltip}}">{{trait-data.total}}</span></div>
</div> </div>
{{/inline}} {{/inline}}

View file

@ -7,15 +7,18 @@
!-- !--
!-- @param combat-value-key: The key of the combat value !-- @param combat-value-key: The key of the combat value
!-- @param combat-value-data: The data for the attribute !-- @param combat-value-data: The data for the attribute
!-- @param combat-value-label: The label for the attribute
--}} --}}
{{#*inline "combat-value"}} {{#*inline "combat-value"}}
<div class="combat-value-with-formula"> <div class="combat-value-with-formula">
<div class="combat-value {{combat-value-key}}"><span class="combat-value-total">{{combat-value-data.total}}</span> <div class="combat-value {{combat-value-key}}" title="{{combat-value-label}}: {{combat-value-data.tooltip}}"><span
class="combat-value-total">{{combat-value-data.total}}</span>
</div> </div>
<div class="combat-value-formula flexrow"><span class="combat-value-base">{{combat-value-data.base}}</span><span>+</span><input <div class="combat-value-formula flexrow"><span class="combat-value-base"
title="{{combat-value-label}} {{localize 'DS4.TooltipBaseValue'}}">{{combat-value-data.base}}</span><span>+</span><input
type="number" name="data.combatValues.{{combat-value-key}}.mod" value='{{combat-value-data.mod}}' type="number" name="data.combatValues.{{combat-value-key}}.mod" value='{{combat-value-data.mod}}'
data-dtype="Number" /> data-dtype="Number" title="{{combat-value-label}} {{localize 'DS4.TooltipModifier'}}" />
</div> </div>
</div> </div>
{{/inline}} {{/inline}}
@ -25,6 +28,6 @@
<div class="combat-values flexrow flex-between"> <div class="combat-values flexrow flex-between">
{{#each config.i18n.combatValues as |combat-value-label combat-value-key|}} {{#each config.i18n.combatValues as |combat-value-label combat-value-key|}}
{{> combat-value combat-value-key=combat-value-key combat-value-data=(lookup ../data.combatValues {{> combat-value combat-value-key=combat-value-key combat-value-data=(lookup ../data.combatValues
combat-value-key)}} combat-value-key) combat-value-label=combat-value-label}}
{{/each}} {{/each}}
</div> </div>

147
yarn.lock
View file

@ -5,6 +5,15 @@ __metadata:
version: 4 version: 4
cacheKey: 7 cacheKey: 7
"@babel/code-frame@npm:7.12.11":
version: 7.12.11
resolution: "@babel/code-frame@npm:7.12.11"
dependencies:
"@babel/highlight": ^7.10.4
checksum: 033d3fb3bf911929c0d904282ee69d1197c8d8ae9c6492aaab09e530bca8c463b11c190185dfda79866556facb5bb4c8dc0b4b32b553d021987fcc28c8dd9c6c
languageName: node
linkType: hard
"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13": "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13":
version: 7.12.13 version: 7.12.13
resolution: "@babel/code-frame@npm:7.12.13" resolution: "@babel/code-frame@npm:7.12.13"
@ -167,7 +176,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/highlight@npm:^7.12.13": "@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.12.13":
version: 7.12.13 version: 7.12.13
resolution: "@babel/highlight@npm:7.12.13" resolution: "@babel/highlight@npm:7.12.13"
dependencies: dependencies:
@ -1076,12 +1085,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/fs-extra@npm:^9.0.6": "@types/fs-extra@npm:^9.0.7":
version: 9.0.6 version: 9.0.7
resolution: "@types/fs-extra@npm:9.0.6" resolution: "@types/fs-extra@npm:9.0.7"
dependencies: dependencies:
"@types/node": "*" "@types/node": "*"
checksum: 8a5df0d8e4b3590a6c9bc6db050143b1cbd742566a2aaac4ed3679bcb607756fb2d6d4ff896a304f3c4603fd996a6ba085a64310deb13839dfc7663351b5b626 checksum: 079cc17a244d4a11f0553c16595002e859ed7b99d75bdce589bb19b92758dd1baca438d4afdca5d0945ec8edf1e377a5b9f5ad1984532179cc64e011fe4d6f6f
languageName: node languageName: node
linkType: hard linkType: hard
@ -1217,12 +1226,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/eslint-plugin@npm:^4.14.2": "@typescript-eslint/eslint-plugin@npm:^4.15.1":
version: 4.15.0 version: 4.15.1
resolution: "@typescript-eslint/eslint-plugin@npm:4.15.0" resolution: "@typescript-eslint/eslint-plugin@npm:4.15.1"
dependencies: dependencies:
"@typescript-eslint/experimental-utils": 4.15.0 "@typescript-eslint/experimental-utils": 4.15.1
"@typescript-eslint/scope-manager": 4.15.0 "@typescript-eslint/scope-manager": 4.15.1
debug: ^4.1.1 debug: ^4.1.1
functional-red-black-tree: ^1.0.1 functional-red-black-tree: ^1.0.1
lodash: ^4.17.15 lodash: ^4.17.15
@ -1235,66 +1244,66 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: ed02b9b85752c76dcc56dcefc498263f5c777423097cad973da8b08c93e2a471d9babdafc307f8dfd5b3f76c7f918ece758f72b65e48acf62253302e29db26c0 checksum: 89dbb3b0cf5ea36ae7e89e895ebff9a8252e5b50e8dac1deb43b9aa823cfdd81cd6017ae123d0051b06dd3c770987f58396c94dd91b9b4773a6dd752ef276774
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/experimental-utils@npm:4.15.0": "@typescript-eslint/experimental-utils@npm:4.15.1":
version: 4.15.0 version: 4.15.1
resolution: "@typescript-eslint/experimental-utils@npm:4.15.0" resolution: "@typescript-eslint/experimental-utils@npm:4.15.1"
dependencies: dependencies:
"@types/json-schema": ^7.0.3 "@types/json-schema": ^7.0.3
"@typescript-eslint/scope-manager": 4.15.0 "@typescript-eslint/scope-manager": 4.15.1
"@typescript-eslint/types": 4.15.0 "@typescript-eslint/types": 4.15.1
"@typescript-eslint/typescript-estree": 4.15.0 "@typescript-eslint/typescript-estree": 4.15.1
eslint-scope: ^5.0.0 eslint-scope: ^5.0.0
eslint-utils: ^2.0.0 eslint-utils: ^2.0.0
peerDependencies: peerDependencies:
eslint: "*" eslint: "*"
checksum: c918b9f052b4feddea210f225229946ff4061b3e11c415a29c1ed221631c2050016ddd77059f9a9974ba18ba2c4e8cbdc737148bda5ed9690869ec6e16b25735 checksum: 1b5950ce13d0d25d1970651f11df4f066d331f0fee4c56158b10b5df6e41650a8961d5cf4c3abfd75ec061d02ff7678adde7787fee1985fa0007b8e32a6cc22f
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/parser@npm:^4.14.2": "@typescript-eslint/parser@npm:^4.15.1":
version: 4.15.0 version: 4.15.1
resolution: "@typescript-eslint/parser@npm:4.15.0" resolution: "@typescript-eslint/parser@npm:4.15.1"
dependencies: dependencies:
"@typescript-eslint/scope-manager": 4.15.0 "@typescript-eslint/scope-manager": 4.15.1
"@typescript-eslint/types": 4.15.0 "@typescript-eslint/types": 4.15.1
"@typescript-eslint/typescript-estree": 4.15.0 "@typescript-eslint/typescript-estree": 4.15.1
debug: ^4.1.1 debug: ^4.1.1
peerDependencies: peerDependencies:
eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 eslint: ^5.0.0 || ^6.0.0 || ^7.0.0
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 23b879a98cbb34481fcd82cf2320ad65238d0203a31b564fcf019cca80560dcd597292951e5301db75a4e2d6e4c483c5a57d14795feffa74b4bbc5aa4e66da4b checksum: b35272c48600b06ab7b55f9ed1d14ab6ee08bde72813f00b31651f44ea95e9c25b62b34b89cc6415b51ab1e7563dce749f82d43d65078db170e0f2a943fee987
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/scope-manager@npm:4.15.0": "@typescript-eslint/scope-manager@npm:4.15.1":
version: 4.15.0 version: 4.15.1
resolution: "@typescript-eslint/scope-manager@npm:4.15.0" resolution: "@typescript-eslint/scope-manager@npm:4.15.1"
dependencies: dependencies:
"@typescript-eslint/types": 4.15.0 "@typescript-eslint/types": 4.15.1
"@typescript-eslint/visitor-keys": 4.15.0 "@typescript-eslint/visitor-keys": 4.15.1
checksum: 39123983dc626ed503b0251648511424248cb122aa5c5d55583e99c57d0b14552eff333c15ebfd9590628479c935f9db86c299bff9e0ced5c71f7d0bd3235f86 checksum: e0f9a02b74ff683a3b4080275c509717104e7b24cd99e8273cd5148e3258a11e5c8ebaaa56c642914880516bb9fc534f0fbd298132adfabaa96237e835943dbd
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/types@npm:4.15.0": "@typescript-eslint/types@npm:4.15.1":
version: 4.15.0 version: 4.15.1
resolution: "@typescript-eslint/types@npm:4.15.0" resolution: "@typescript-eslint/types@npm:4.15.1"
checksum: e45ff88c0ef96aca42919ffceff1120bac08bf4507d1af4241b5f5ff819d181fcd27e2d788dd8b6fef095e1c23fbce0411a9cce6d6b5aef09b591732fec55d33 checksum: 30f7c157762e16ee5f8626960d1a869021844ac18354cf7b11ec89ba696ac4e3c027d1de485d6237ea04b8c4d055d3990fc0dd05f45ef1b49bcb4d7e80f1294e
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/typescript-estree@npm:4.15.0": "@typescript-eslint/typescript-estree@npm:4.15.1":
version: 4.15.0 version: 4.15.1
resolution: "@typescript-eslint/typescript-estree@npm:4.15.0" resolution: "@typescript-eslint/typescript-estree@npm:4.15.1"
dependencies: dependencies:
"@typescript-eslint/types": 4.15.0 "@typescript-eslint/types": 4.15.1
"@typescript-eslint/visitor-keys": 4.15.0 "@typescript-eslint/visitor-keys": 4.15.1
debug: ^4.1.1 debug: ^4.1.1
globby: ^11.0.1 globby: ^11.0.1
is-glob: ^4.0.1 is-glob: ^4.0.1
@ -1303,17 +1312,17 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 5768e5ee4bed2d79631ad5484576e04b6590aa260c043fbaee4ee4e3dfb93f4b8aaec8d3c1e446e82225603664a2e0b56066cfa0502198fd83c5a1e2af52251a checksum: 61787ac95568c9b21d854de38f15a7a7ec3f073d542266f6eebdb6602d623da7d9242415255b87cfd41df3837db748cc147e64ebed3374c572f61e4e10105cd4
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/visitor-keys@npm:4.15.0": "@typescript-eslint/visitor-keys@npm:4.15.1":
version: 4.15.0 version: 4.15.1
resolution: "@typescript-eslint/visitor-keys@npm:4.15.0" resolution: "@typescript-eslint/visitor-keys@npm:4.15.1"
dependencies: dependencies:
"@typescript-eslint/types": 4.15.0 "@typescript-eslint/types": 4.15.1
eslint-visitor-keys: ^2.0.0 eslint-visitor-keys: ^2.0.0
checksum: 6f7aa6f4c726177e23344155784593b30ae36ff7a9240503b7876174b187ed16447802ccff7d6d70b0a633a2b2e4c54779074a2790ca2263c61717dcccd1d518 checksum: 779711aa95940738507eeb97e18efa0244d8513846284f497fb9b400d0d2e0791cc746829fd6870eb95a6256f4ab30b53b518d59a2e005d050f0cfcf8caa3ea2
languageName: node languageName: node
linkType: hard linkType: hard
@ -2783,15 +2792,15 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "dungeonslayers4@workspace:." resolution: "dungeonslayers4@workspace:."
dependencies: dependencies:
"@types/fs-extra": ^9.0.6 "@types/fs-extra": ^9.0.7
"@types/jest": ^26.0.20 "@types/jest": ^26.0.20
"@typescript-eslint/eslint-plugin": ^4.14.2 "@typescript-eslint/eslint-plugin": ^4.15.1
"@typescript-eslint/parser": ^4.14.2 "@typescript-eslint/parser": ^4.15.1
chalk: ^4.1.0 chalk: ^4.1.0
eslint: ^7.19.0 eslint: ^7.20.0
eslint-config-prettier: ^7.2.0 eslint-config-prettier: ^7.2.0
eslint-plugin-prettier: ^3.3.1 eslint-plugin-prettier: ^3.3.1
foundry-vtt-types: "github:League-of-Foundry-Developers/foundry-vtt-types#foundry-0.7.9" foundry-vtt-types: "https://github.com/League-of-Foundry-Developers/foundry-vtt-types.git#commit=884d738b51a6cc4801ee2316eb060aafa0aff642"
fs-extra: ^9.1.0 fs-extra: ^9.1.0
gulp: ^4.0.2 gulp: ^4.0.2
gulp-sass: ^4.1.0 gulp-sass: ^4.1.0
@ -2802,9 +2811,9 @@ __metadata:
json-stringify-pretty-compact: ^2.0.0 json-stringify-pretty-compact: ^2.0.0
lint-staged: ^10.5.4 lint-staged: ^10.5.4
prettier: ^2.2.1 prettier: ^2.2.1
sass: ^1.32.6 sass: ^1.32.7
ts-jest: ^26.5.1 ts-jest: ^26.5.1
typescript: ^4.1.3 typescript: ^4.1.5
yargs: ^16.2.0 yargs: ^16.2.0
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@ -3053,11 +3062,11 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint@npm:^7.19.0": "eslint@npm:^7.20.0":
version: 7.19.0 version: 7.20.0
resolution: "eslint@npm:7.19.0" resolution: "eslint@npm:7.20.0"
dependencies: dependencies:
"@babel/code-frame": ^7.0.0 "@babel/code-frame": 7.12.11
"@eslint/eslintrc": ^0.3.0 "@eslint/eslintrc": ^0.3.0
ajv: ^6.10.0 ajv: ^6.10.0
chalk: ^4.0.0 chalk: ^4.0.0
@ -3069,7 +3078,7 @@ __metadata:
eslint-utils: ^2.1.0 eslint-utils: ^2.1.0
eslint-visitor-keys: ^2.0.0 eslint-visitor-keys: ^2.0.0
espree: ^7.3.1 espree: ^7.3.1
esquery: ^1.2.0 esquery: ^1.4.0
esutils: ^2.0.2 esutils: ^2.0.2
file-entry-cache: ^6.0.0 file-entry-cache: ^6.0.0
functional-red-black-tree: ^1.0.1 functional-red-black-tree: ^1.0.1
@ -3096,7 +3105,7 @@ __metadata:
v8-compile-cache: ^2.0.3 v8-compile-cache: ^2.0.3
bin: bin:
eslint: bin/eslint.js eslint: bin/eslint.js
checksum: 0461e8b2b53c9097995efe131f659e2df77deda1daf79d7673654e2cbdac90bd2a412758b0ee0db48d29bf58f4b4d99170a70e17df1345782f0c8fa511bb0734 checksum: 1d56cabc7e21f43b8bb6a1934f2488b27d86b018ce2246bc9b89e52931e26b306c5883f5e4ff5c6e0228e0e8673553a460e98eacc4890f9e5984002df0292123
languageName: node languageName: node
linkType: hard linkType: hard
@ -3121,7 +3130,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"esquery@npm:^1.2.0": "esquery@npm:^1.4.0":
version: 1.4.0 version: 1.4.0
resolution: "esquery@npm:1.4.0" resolution: "esquery@npm:1.4.0"
dependencies: dependencies:
@ -3594,9 +3603,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"foundry-vtt-types@github:League-of-Foundry-Developers/foundry-vtt-types#foundry-0.7.9": "foundry-vtt-types@https://github.com/League-of-Foundry-Developers/foundry-vtt-types.git#commit=884d738b51a6cc4801ee2316eb060aafa0aff642":
version: 0.1.0 version: 0.1.0
resolution: "foundry-vtt-types@https://github.com/League-of-Foundry-Developers/foundry-vtt-types.git#commit=095cba6c567b86b11e61fdf6c96892949e5d5ad1" resolution: "foundry-vtt-types@https://github.com/League-of-Foundry-Developers/foundry-vtt-types.git#commit=884d738b51a6cc4801ee2316eb060aafa0aff642"
dependencies: dependencies:
"@types/howler": 2.2.1 "@types/howler": 2.2.1
"@types/jquery": 3.5.1 "@types/jquery": 3.5.1
@ -3605,7 +3614,7 @@ __metadata:
pixi.js: 5.3.4 pixi.js: 5.3.4
tinymce: 5.6.2 tinymce: 5.6.2
typescript: ^4.1.4 typescript: ^4.1.4
checksum: f88c3d3383984eec266c47d7c5f72ad97493921dfb23cbe83d67e5c95583b90d6c4924b7961136f2030aa3493c7710d04d0147f90d75cfb5e663f12c3c2b5d09 checksum: dec3800ff6f8824e59db77356b91fbc99a69ca155893be6c3ae95ee00cd5533710040f5342ca08e17eba27cfd823ba689dcb62bed96166c6f7083fa5e0185581
languageName: node languageName: node
linkType: hard linkType: hard
@ -7445,7 +7454,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"sass@npm:^1.32.6": "sass@npm:^1.32.7":
version: 1.32.7 version: 1.32.7
resolution: "sass@npm:1.32.7" resolution: "sass@npm:1.32.7"
dependencies: dependencies:
@ -8468,7 +8477,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@^4.1.3, typescript@^4.1.4": "typescript@^4.1.4, typescript@^4.1.5":
version: 4.1.5 version: 4.1.5
resolution: "typescript@npm:4.1.5" resolution: "typescript@npm:4.1.5"
bin: bin:
@ -8478,7 +8487,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@patch:typescript@^4.1.3#builtin<compat/typescript>, typescript@patch:typescript@^4.1.4#builtin<compat/typescript>": "typescript@patch:typescript@^4.1.4#builtin<compat/typescript>, typescript@patch:typescript@^4.1.5#builtin<compat/typescript>":
version: 4.1.5 version: 4.1.5
resolution: "typescript@patch:typescript@npm%3A4.1.5#builtin<compat/typescript>::version=4.1.5&hash=cc6730" resolution: "typescript@patch:typescript@npm%3A4.1.5#builtin<compat/typescript>::version=4.1.5&hash=cc6730"
bin: bin:
@ -8489,11 +8498,11 @@ fsevents@^1.2.7:
linkType: hard linkType: hard
"uglify-js@npm:^3.1.4": "uglify-js@npm:^3.1.4":
version: 3.12.7 version: 3.12.8
resolution: "uglify-js@npm:3.12.7" resolution: "uglify-js@npm:3.12.8"
bin: bin:
uglifyjs: bin/uglifyjs uglifyjs: bin/uglifyjs
checksum: 32ec37dcf71990dafdbd56c87948a888cdc162617b173d512ab7746cbdbb4e2b0ee1c59b6c5adabcee85194fbe3c43b07aedbbb0a8df63cb7de74455d8443a4c checksum: d54713d9a5fef62300ea1fc120dcb07f196f86b2974826e3ee11be2235f5add44d08ee857a8325e9d2afcc68d7bda5b59b5b16338a2a588b36245e1849709d76
languageName: node languageName: node
linkType: hard linkType: hard